ZGlmZiAtLWdpdCBhLy5naXRhdHRyaWJ1dGVzIGIvLmdpdGF0dHJpYnV0ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1ODZkOQotLS0gL2Rldi9udWxsCisrKyBiLy5naXRhdHRyaWJ1dGVzCkBAIC0wLDAgKzEsMzAgQEAKKyMgU2V0IHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBpbiBjYXNlIHBlb3BsZSBkb24ndCBoYXZlIGNvcmUuYXV0b2NybGYgc2V0LgorKiB0ZXh0PWF1dG8KKworIyBFeHBsaWNpdGx5IGRlY2xhcmUgdGV4dCBmaWxlcyB5b3Ugd2FudCB0byBhbHdheXMgYmUgbm9ybWFsaXplZCBhbmQgY29udmVydGVkCisjIHRvIG5hdGl2ZSBsaW5lIGVuZGluZ3Mgb24gY2hlY2tvdXQuCisqLmNzIHRleHQKKyoucHMxIHRleHQKKyoucHNtMSB0ZXh0CisqLnBzZDEgdGV4dAorKi5jb25maWcgdGV4dAorKi5tZCB0ZXh0CisqLnR4dCB0ZXh0CisqLnhtbCB0ZXh0CisqLnJlc3ggdGV4dAorCisuZ2l0YXR0cmlidXRlcyB0ZXh0CisuZ2l0aWdub3JlIHRleHQKKworIyBEZWNsYXJlIGZpbGVzIHRoYXQgd2lsbCBhbHdheXMgaGF2ZSBDUkxGIGxpbmUgZW5kaW5ncyBvbiBjaGVja291dC4KKyouc2xuIHRleHQgZW9sPWNybGYKKyouY3Nwcm9qIHRleHQgZW9sPWNybGYKKworIyBEZW5vdGUgYWxsIGZpbGVzIHRoYXQgYXJlIHRydWx5IGJpbmFyeSBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4KKyoucG5nIGJpbmFyeQorKi5qcGcgYmluYXJ5CisqLmRvY3ggYmluYXJ5CisqLnhsc3ggYmluYXJ5CisqLnBwdHggYmluYXJ5CisKKwpkaWZmIC0tZ2l0IGEvLmdpdGlnbm9yZSBiLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiMWFlMwotLS0gL2Rldi9udWxsCisrKyBiLy5naXRpZ25vcmUKQEAgLTAsMCArMSwzOCBAQAorKi5leGUKKyoucGRiCisqLmNhY2hlCisqLmRsbAorVGh1bWJzLmRiCisKKyMgb3V0cHV0IGZpbGVzIGZyb20gdGhlIE9wZW5YbWxQb3dlclRvb2xzIGV4YW1wbGVzCisqKi9Eb2N1bWVudEFzc2VtYmxlci9Bc3NlbWJsZWREb2MuZG9jeAorKiovRG9jdW1lbnRBc3NlbWJsZXIwMS9Bc3NlbWJsZWREb2MuZG9jeAorKiovQ2hhcnRVcGRhdGVyMDEvVXBkYXRlZC1DaGFydCoKKyoqL0Zvcm1hdHRpbmdBc3NlbWJsZXIwMS8qb3V0LmRvY3gKKyoqL0h0bWxDb252ZXJ0ZXIwMS8qLmh0bWwKKyoqL0h0bWxDb252ZXJ0ZXIwMS8qX2ZpbGVzCisqKi9UZXh0UmVwbGFjZXIwMS8qb3V0KgorKiovU3ByZWFkc2hlZXRXcml0ZXIwMS9UZXN0MS54bHN4CisqKi9TcHJlYWRzaGVldFdyaXRlcjAyL1Rlc3QyLnhsc3gKKyoqL1Bpdm90VGFibGVzMDEvTmV3UGl2b3QueGxzeAorKiovUGl2b3RUYWJsZXMwMS9RdWFydGVybHlQaXZvdC54bHN4CisqKi9QaXZvdFRhYmxlczAxL1F1YXJ0ZXJseVVuaXRTYWxlc1dpdGhQaXZvdC54bHN4CisKKyouc3VvCisqLnVzZXIKKypjb25mbGljdGVkKgorKkZpbGVMaXN0QWJzb2x1dGUudHh0CisqU2V0dGluZ3Muc2V0dGluZ3MKK1tCYl1pbi8KK1tPb11iai8KK1Rlc3RSZXN1bHRzLworCisjIE51R2V0IFBhY2thZ2VzCisqLm51cGtnCisqKi9wYWNrYWdlcy8qCisqLmxvY2suanNvbgorKi5udWdldC5wcm9wcworKi5udWdldC50YXJnZXRzCisKKyMgVmlzdWFsIFN0dWRpbworLnZzLwpkaWZmIC0tZ2l0IGEvTElDRU5TRSBiL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhNDc5YgotLS0gL2Rldi9udWxsCisrKyBiL0xJQ0VOU0UKQEAgLTAsMCArMSw0MCBAQAorQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24KKworVGhpcyBsaWNlbnNlIGdvdmVybnMgdXNlIG9mIHRoZSBhY2NvbXBhbnlpbmcgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhlIHNvZnR3YXJlLCB5b3UKK2FjY2VwdCB0aGlzIGxpY2Vuc2UuIElmIHlvdSBkbyBub3QgYWNjZXB0IHRoZSBsaWNlbnNlLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKworMS4gRGVmaW5pdGlvbnMKK1RoZSB0ZXJtcyAicmVwcm9kdWNlLCIgInJlcHJvZHVjdGlvbiwiICJkZXJpdmF0aXZlIHdvcmtzLCIgYW5kICJkaXN0cmlidXRpb24iIGhhdmUgdGhlCitzYW1lIG1lYW5pbmcgaGVyZSBhcyB1bmRlciBVLlMuIGNvcHlyaWdodCBsYXcuCitBICJjb250cmlidXRpb24iIGlzIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZSwgb3IgYW55IGFkZGl0aW9ucyBvciBjaGFuZ2VzIHRvIHRoZSBzb2Z0d2FyZS4KK0EgImNvbnRyaWJ1dG9yIiBpcyBhbnkgcGVyc29uIHRoYXQgZGlzdHJpYnV0ZXMgaXRzIGNvbnRyaWJ1dGlvbiB1bmRlciB0aGlzIGxpY2Vuc2UuCisiTGljZW5zZWQgcGF0ZW50cyIgYXJlIGEgY29udHJpYnV0b3IncyBwYXRlbnQgY2xhaW1zIHRoYXQgcmVhZCBkaXJlY3RseSBvbiBpdHMgY29udHJpYnV0aW9uLgorCisyLiBHcmFudCBvZiBSaWdodHMKKyhBKSBDb3B5cmlnaHQgR3JhbnQtIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgbGljZW5zZSwgaW5jbHVkaW5nIHRoZSBsaWNlbnNlIGNvbmRpdGlvbnMKK2FuZCBsaW1pdGF0aW9ucyBpbiBzZWN0aW9uIDMsIGVhY2ggY29udHJpYnV0b3IgZ3JhbnRzIHlvdSBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UgaXRzIGNvbnRyaWJ1dGlvbiwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mCitpdHMgY29udHJpYnV0aW9uLCBhbmQgZGlzdHJpYnV0ZSBpdHMgY29udHJpYnV0aW9uIG9yIGFueSBkZXJpdmF0aXZlIHdvcmtzIHRoYXQgeW91IGNyZWF0ZS4KKyhCKSBQYXRlbnQgR3JhbnQtIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgbGljZW5zZSwgaW5jbHVkaW5nIHRoZSBsaWNlbnNlIGNvbmRpdGlvbnMKK2FuZCBsaW1pdGF0aW9ucyBpbiBzZWN0aW9uIDMsIGVhY2ggY29udHJpYnV0b3IgZ3JhbnRzIHlvdSBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBsaWNlbnNlIHVuZGVyIGl0cyBsaWNlbnNlZCBwYXRlbnRzIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBzZWxsLCBvZmZlciBmb3IKK3NhbGUsIGltcG9ydCwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mIGl0cyBjb250cmlidXRpb24gaW4gdGhlIHNvZnR3YXJlIG9yIGRlcml2YXRpdmUKK3dvcmtzIG9mIHRoZSBjb250cmlidXRpb24gaW4gdGhlIHNvZnR3YXJlLgorCiszLiBDb25kaXRpb25zIGFuZCBMaW1pdGF0aW9ucworKEEpIE5vIFRyYWRlbWFyayBMaWNlbnNlLSBUaGlzIGxpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgeW91IHJpZ2h0cyB0byB1c2UgYW55IGNvbnRyaWJ1dG9ycycKK25hbWUsIGxvZ28sIG9yIHRyYWRlbWFya3MuCisoQikgSWYgeW91IGJyaW5nIGEgcGF0ZW50IGNsYWltIGFnYWluc3QgYW55IGNvbnRyaWJ1dG9yIG92ZXIgcGF0ZW50cyB0aGF0IHlvdSBjbGFpbSBhcmUKK2luZnJpbmdlZCBieSB0aGUgc29mdHdhcmUsIHlvdXIgcGF0ZW50IGxpY2Vuc2UgZnJvbSBzdWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBzb2Z0d2FyZSBlbmRzCithdXRvbWF0aWNhbGx5LgorKEMpIElmIHlvdSBkaXN0cmlidXRlIGFueSBwb3J0aW9uIG9mIHRoZSBzb2Z0d2FyZSwgeW91IG11c3QgcmV0YWluIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwKK3RyYWRlbWFyaywgYW5kIGF0dHJpYnV0aW9uIG5vdGljZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgc29mdHdhcmUuCisoRCkgSWYgeW91IGRpc3RyaWJ1dGUgYW55IHBvcnRpb24gb2YgdGhlIHNvZnR3YXJlIGluIHNvdXJjZSBjb2RlIGZvcm0sIHlvdSBtYXkgZG8gc28gb25seQordW5kZXIgdGhpcyBsaWNlbnNlIGJ5IGluY2x1ZGluZyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhpcyBsaWNlbnNlIHdpdGggeW91ciBkaXN0cmlidXRpb24uCitJZiB5b3UgZGlzdHJpYnV0ZSBhbnkgcG9ydGlvbiBvZiB0aGUgc29mdHdhcmUgaW4gY29tcGlsZWQgb3Igb2JqZWN0IGNvZGUgZm9ybSwgeW91IG1heQorb25seSBkbyBzbyB1bmRlciBhIGxpY2Vuc2UgdGhhdCBjb21wbGllcyB3aXRoIHRoaXMgbGljZW5zZS4KKyhFKSBUaGUgc29mdHdhcmUgaXMgbGljZW5zZWQgImFzLWlzLiIgWW91IGJlYXIgdGhlIHJpc2sgb2YgdXNpbmcgaXQuIFRoZSBjb250cmlidXRvcnMgZ2l2ZQorbm8gZXhwcmVzcyB3YXJyYW50aWVzLCBndWFyYW50ZWVzIG9yIGNvbmRpdGlvbnMuIFlvdSBtYXkgaGF2ZSBhZGRpdGlvbmFsIGNvbnN1bWVyIHJpZ2h0cwordW5kZXIgeW91ciBsb2NhbCBsYXdzIHdoaWNoIHRoaXMgbGljZW5zZSBjYW5ub3QgY2hhbmdlLiBUbyB0aGUgZXh0ZW50IHBlcm1pdHRlZCB1bmRlciB5b3VyCitsb2NhbCBsYXdzLCB0aGUgY29udHJpYnV0b3JzIGV4Y2x1ZGUgdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHksIGZpdG5lc3MKK2ZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhbmQgbm9uLWluZnJpbmdlbWVudC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9NRVRBREFUQSBiL01FVEFEQVRBCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMWFhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9NRVRBREFUQQpAQCAtMCwwICsxLDE1IEBACituYW1lOiAiT3Blbi1YbWwtUG93ZXJUb29scyIKK2Rlc2NyaXB0aW9uOgorICAgICJUaGUgT3BlbiBYTUwgUG93ZXJUb29scyBwcm92aWRlcyBndWlkYW5jZSBhbmQgZXhhbXBsZSBjb2RlIGZvciBwcm9ncmFtbWluZyIKKwkiIHdpdGggT3BlbiBYTUwgRG9jdW1lbnRzIChET0NYLCBYTFNYLCBhbmQgUFBUWCkuIEl0IGlzIGJhc2VkIG9uLCBhbmQgIgorCSJleHRlbmRzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBPcGVuIFhNTCBTREsuIgorCit0aGlyZF9wYXJ0eSB7CisgIHVybCB7CisgICAgdHlwZTogR0lUCisgICAgdmFsdWU6ICJodHRwczovL2dpdGh1Yi5jb20vT2ZmaWNlRGV2L09wZW4tWG1sLVBvd2VyVG9vbHMiCisgIH0KKyAgdmVyc2lvbjogYTQyMzJiOTBjN2YwNGExMmJmOTcyZWE5ZjY1YjJlOWYzYWUxMjQ0OAorICBsYXN0X3VwZ3JhZGVfZGF0ZSB7IHllYXI6IDIwMjAgbW9udGg6IDEwIGRheTogMjEgfQorICBsaWNlbnNlX3R5cGU6IE5PVElDRQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvQm9va21hcmsuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvQm9va21hcmsuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjUyZjUxCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9Cb29rbWFyay5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvQm9va21hcmsudHh0IGIvTmV3RG9jeERvY3VtZW50cy9Cb29rbWFyay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhYTU5NgotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvQm9va21hcmsudHh0CkBAIC0wLDAgKzEgQEAKK++7v0Jvb2ttYXJrIGFuZCBoeXBlcmxpbmsgdG8gdGhlIGJvb2ttYXJrLgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9CdWxsZXRlZFRleHQuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvQnVsbGV0ZWRUZXh0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwNmJlYQotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvQnVsbGV0ZWRUZXh0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9CdWxsZXRlZFRleHQudHh0IGIvTmV3RG9jeERvY3VtZW50cy9CdWxsZXRlZFRleHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNmJjMmEKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0J1bGxldGVkVGV4dC50eHQKQEAgLTAsMCArMSBAQAor77u/QnVsbGV0ZWQgdGV4dC4KZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvQ2hhcnQuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvQ2hhcnQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjU1MGI4Ci0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9DaGFydC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvQ2hhcnQudHh0IGIvTmV3RG9jeERvY3VtZW50cy9DaGFydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhNDcyNgotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvQ2hhcnQudHh0CkBAIC0wLDAgKzEgQEAKK++7v0NoYXJ0LgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9Db21tZW50LmRvY3ggYi9OZXdEb2N4RG9jdW1lbnRzL0NvbW1lbnQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDg1YWVmCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9Db21tZW50LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9Db21tZW50LnR4dCBiL05ld0RvY3hEb2N1bWVudHMvQ29tbWVudC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5Y2RkNAotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvQ29tbWVudC50eHQKQEAgLTAsMCArMSBAQAor77u/UGFyYWdyYXBoIHRoYXQgY29udGFpbnMgYSBjb21tZW50LgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9Db250ZW50Q29udHJvbHMuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvQ29udGVudENvbnRyb2xzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhMDI2ZQotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvQ29udGVudENvbnRyb2xzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9Db250ZW50Q29udHJvbHMudHh0IGIvTmV3RG9jeERvY3VtZW50cy9Db250ZW50Q29udHJvbHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjFlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0NvbnRlbnRDb250cm9scy50eHQKQEAgLTAsMCArMSBAQAor77u/Q29udGVudCBjb250cm9scyBvZiB2YXJpb3VzIHR5cGVzLgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9Db250ZW50Q29udHJvbHNOZXN0ZWQuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvQ29udGVudENvbnRyb2xzTmVzdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwMGVlZAotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvQ29udGVudENvbnRyb2xzTmVzdGVkLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9Db250ZW50Q29udHJvbHNOZXN0ZWQudHh0IGIvTmV3RG9jeERvY3VtZW50cy9Db250ZW50Q29udHJvbHNOZXN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMmQ2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0NvbnRlbnRDb250cm9sc05lc3RlZC50eHQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9Db3ZlclBhZ2UuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvQ292ZXJQYWdlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4MDU4MAotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvQ292ZXJQYWdlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9Db3ZlclBhZ2UudHh0IGIvTmV3RG9jeERvY3VtZW50cy9Db3ZlclBhZ2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOGZlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0NvdmVyUGFnZS50eHQKQEAgLTAsMCArMSBAQAor77u/Q292ZXIgcGFnZS4KZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvRW1iZWRkZWRXb3JrYm9vay5kb2N4IGIvTmV3RG9jeERvY3VtZW50cy9FbWJlZGRlZFdvcmtib29rLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0NWFlZgotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvRW1iZWRkZWRXb3JrYm9vay5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvRW1iZWRkZWRXb3JrYm9vay50eHQgYi9OZXdEb2N4RG9jdW1lbnRzL0VtYmVkZGVkV29ya2Jvb2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYjU1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0VtYmVkZGVkV29ya2Jvb2sudHh0CkBAIC0wLDAgKzEgQEAKK++7v0VtYmVkZGVkIEV4Y2VsIHdvcmtib29rLgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9FbXB0eS5kb2N4IGIvTmV3RG9jeERvY3VtZW50cy9FbXB0eS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNTQwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0VtcHR5LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9FbXB0eS50eHQgYi9OZXdEb2N4RG9jdW1lbnRzL0VtcHR5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2ExOTg4Ci0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9FbXB0eS50eHQKQEAgLTAsMCArMSBAQAor77u/U2luZ2xlIGJsYW5rIHBhcmFncmFwaC4KZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvRW5kTm90ZS5kb2N4IGIvTmV3RG9jeERvY3VtZW50cy9FbmROb3RlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4MDRjMQotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvRW5kTm90ZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvRW5kTm90ZS50eHQgYi9OZXdEb2N4RG9jdW1lbnRzL0VuZE5vdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MWViMGQKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0VuZE5vdGUudHh0CkBAIC0wLDAgKzEgQEAKK++7v0VuZG5vdGUuCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL0VxdWF0aW9uLmRvY3ggYi9OZXdEb2N4RG9jdW1lbnRzL0VxdWF0aW9uLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1NmFmOQotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvRXF1YXRpb24uZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL0VxdWF0aW9uLnR4dCBiL05ld0RvY3hEb2N1bWVudHMvRXF1YXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZmRjMjMKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0VxdWF0aW9uLnR4dApAQCAtMCwwICsxIEBACivvu79NYXRoIGVxdWF0aW9uLgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9GaWVsZHMuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvRmllbGRzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxYTliZgotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvRmllbGRzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9GaWVsZHMudHh0IGIvTmV3RG9jeERvY3VtZW50cy9GaWVsZHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OTgzYzgKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0ZpZWxkcy50eHQKQEAgLTAsMCArMSBAQAor77u/RGF0ZS10aW1lIGZpZWxkCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL0ZvbnRzLmRvY3ggYi9OZXdEb2N4RG9jdW1lbnRzL0ZvbnRzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExNzgyMgotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvRm9udHMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL0ZvbnRzLnR4dCBiL05ld0RvY3hEb2N1bWVudHMvRm9udHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzU4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0ZvbnRzLnR4dApAQCAtMCwwICsxIEBACivvu79WYXJpb3VzIGZvbnRzLgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9Gb290Tm90ZS5kb2N4IGIvTmV3RG9jeERvY3VtZW50cy9Gb290Tm90ZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YmZmZGQKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0Zvb3ROb3RlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9Gb290Tm90ZS50eHQgYi9OZXdEb2N4RG9jdW1lbnRzL0Zvb3ROb3RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzhmNjM2Ci0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9Gb290Tm90ZS50eHQKQEAgLTAsMCArMSBAQAor77u/Rm9vdG5vdGUuCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL0Zvcm1hdHRlZFRleHQuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvRm9ybWF0dGVkVGV4dC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhODllYmEKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0Zvcm1hdHRlZFRleHQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL0Zvcm1hdHRlZFRleHQudHh0IGIvTmV3RG9jeERvY3VtZW50cy9Gb3JtYXR0ZWRUZXh0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGJkMWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9Gb3JtYXR0ZWRUZXh0LnR4dApAQCAtMCwwICsxIEBACivvu79Ud28gcGFyYWdyYXBocyB3aXRoIHRleHQgZm9ybWF0dGluZy4KZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvR2VuZXJhdGVOZXdEb2N4Q21kbGV0LnBzMSBiL05ld0RvY3hEb2N1bWVudHMvR2VuZXJhdGVOZXdEb2N4Q21kbGV0LnBzMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2IwNGIxCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9HZW5lcmF0ZU5ld0RvY3hDbWRsZXQucHMxCkBAIC0wLDAgKzEsMTA3IEBACivvu79bZW52aXJvbm1lbnRdOjpDdXJyZW50RGlyZWN0b3J5ID0gJChHZXQtTG9jYXRpb24pCitpZiAoLW5vdCAkKFRlc3QtUGF0aCAuXEdlbmVyYXRlTmV3RG9jeENtZGxldC5wczEpKQoreworICAgIFRocm93ICJZb3UgbXVzdCBydW4gdGhpcyBzY3JpcHQgZnJvbSB3aXRoaW4gdGhlIE5ld0RvY3hEb2N1bWVudHMgZGlyZWN0b3J5IgorfQorCiskZHggPSAiLi5cQ21kbGV0c1xEb2N4TGliLnBzMSIKK2lmIChUZXN0LVBhdGggJGR4KSB7IGRlbCAkZHggfQorCiskbGluZUJyZWFrID0gW1N5c3RlbS5FbnZpcm9ubWVudF06Ok5ld0xpbmUKKworW1N5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXJdJHNiRHhsID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcgorCiskY29weXJpZ2h0U3RyaW5nID0gQCIKKzwjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiM+CisKKyJACisKK1t2b2lkXSRzYkR4bC5BcHBlbmQoJGNvcHlyaWdodFN0cmluZyArICRsaW5lQnJlYWspCisKK2RpciAqLmRvY3ggfCAlIHsKKyAgICAkZmkgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5GaWxlSW5mbyAkXworICAgIFt2b2lkXSRzYkR4bC5BcHBlbmQoImAkU2FtcGxlRG9jeCQoJF8uQmFzZU5hbWUpID0iICsgJGxpbmVCcmVhaykKKyAgICAkYjY0ID0gJChDb252ZXJ0VG8tQmFzZTY0ICRfIC1Qb3dlclNoZWxsTGl0ZXJhbCkKKyAgICBbdm9pZF0kc2JEeGwuQXBwZW5kKCRiNjQgKyAkbGluZUJyZWFrKQorICAgIFt2b2lkXSRzYkR4bC5BcHBlbmQoIiIgKyAkbGluZUJyZWFrKQorfQorU2V0LUNvbnRlbnQgLVZhbHVlICRzYkR4bC5Ub1N0cmluZygpIC1QYXRoICRkeCAtRW5jb2RpbmcgVVRGOAorCiskdGVtcGxhdGUgPSBbU3lzdGVtLklPLkZpbGVdOjpSZWFkQWxsTGluZXMoIi4uXENtZGxldHNcTmV3LURvY3gtVGVtcGxhdGUucHMxIikKKyRwYXJhbURvY3MgPSAtMTsKKyRwYXJhbURlY2wgPSAtMTsKKyRwYXJhbVVzZSA9IC0xOworZm9yICgkaSA9IDA7ICRpIC1sdCAkdGVtcGxhdGUuTGVuZ3RoOyAkaSsrKQoreworICAgICR0ID0gJHRlbXBsYXRlWyRpXQorICAgIGlmICgkdC5Db250YWlucygiUGFyYW1ldGVyRG9jdW1lbnRhdGlvbiIpKSB7ICRwYXJhbURvY3MgPSAkaSB9CisgICAgaWYgKCR0LkNvbnRhaW5zKCJQYXJhbWV0ZXJEZWNsYXJhdGlvbiIpKSB7ICRwYXJhbURlY2wgPSAkaSB9CisgICAgaWYgKCR0LkNvbnRhaW5zKCJQYXJhbWV0ZXJVc2UiKSkgeyAkcGFyYW1Vc2UgPSAkaSB9Cit9CisKKyRuZHggPSAiLi5cQ21kbGV0c1xOZXctRG9jeC5wczEiCitpZiAoVGVzdC1QYXRoICRuZHgpCit7CisgICAgUmVtb3ZlLUl0ZW0gJG5keAorfQorCiskc2JHZW5OZXdEb2N4ID0gTmV3LU9iamVjdCBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyOworCiskdGVtcGxhdGVbMC4uKCRwYXJhbURvY3MgLSAxKV0gfCAlIHsgW3ZvaWRdJHNiR2VuTmV3RG9jeC5BcHBlbmQoJF8gKyAkbGluZUJyZWFrKSB9CitkaXIgKi5kb2N4IHwgJSB7CisgICAgJGZpID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uRmlsZUluZm8gJF8KKyAgICBbdm9pZF0kc2JHZW5OZXdEb2N4LkFwcGVuZCgiICAgIC5QQVJBTUVURVIgJCgkZmkuQmFzZU5hbWUpIiArICRsaW5lQnJlYWspCisgICAgJGZpRGVzYyA9IE5ldy1PYmplY3QgU3lzdGVtLklPLkZpbGVJbmZvICQoJF8uQmFzZU5hbWUgKyAiLnR4dCIpCisgICAgaWYgKCRmaURlc2MuRXhpc3RzKQorICAgIHsKKyAgICAgICAgR2V0LUNvbnRlbnQgJCgkZmlEZXNjLkZ1bGxOYW1lKSB8ICUgeyBbdm9pZF0kc2JHZW5OZXdEb2N4LkFwcGVuZCgnICAgICcgKyAkXyArICRsaW5lQnJlYWspIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgJGVyck1lc3NhZ2UgPSAiRXJyb3I6ICQoJGZpLkJhc2VOYW1lKS5kb2N4IGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nICQoJGZpLkJhc2VOYW1lKS50eHQiCisgICAgICAgIFdyaXRlLUhvc3QgLUZvcmVncm91bmRDb2xvciBSZWQgJGVyck1lc3NhZ2UKKyAgICAgICAgW3ZvaWRdJHNiR2VuTmV3RG9jeC5BcHBlbmQoJyAgICAnICsgJGVyck1lc3NhZ2UgKyAkbGluZUJyZWFrKQorICAgIH0KK30KKyRzdGFydCA9ICRwYXJhbURvY3MgKyAxCiskZW5kID0gJHBhcmFtRGVjbCAtIDEKKyR0ZW1wbGF0ZVskc3RhcnQuLiRlbmRdIHwgJSB7IFt2b2lkXSRzYkdlbk5ld0RvY3guQXBwZW5kKCRfICsgJGxpbmVCcmVhaykgfQorJGxhc3QgPSAoKCQoZGlyICouZG9jeCkgfCBtZWFzdXJlKS5Db3VudCkgLSAxCiskY291bnQgPSAwCitkaXIgKi5kb2N4IHwgJSB7CisgICAgJGZpID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uRmlsZUluZm8gJF8KKyAgICBbdm9pZF0kc2JHZW5OZXdEb2N4LkFwcGVuZCgnICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kRmFsc2UpXScgKyAkbGluZUJyZWFrKQorICAgIFt2b2lkXSRzYkdlbk5ld0RvY3guQXBwZW5kKCcgICAgICAgIFtTd2l0Y2hdJyArICRsaW5lQnJlYWspCisgICAgaWYgKCRjb3VudCAtbmUgJGxhc3QpCisgICAgeworICAgICAgICBbdm9pZF0kc2JHZW5OZXdEb2N4LkFwcGVuZCgiICAgICAgICBbYm9vbF1gJCQoJF8uQmFzZU5hbWUpLCIgKyAkbGluZUJyZWFrKQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBbdm9pZF0kc2JHZW5OZXdEb2N4LkFwcGVuZCgiICAgICAgICBbYm9vbF1gJCQoJF8uQmFzZU5hbWUpIiArICRsaW5lQnJlYWspCisgICAgfQorICAgIFt2b2lkXSRzYkdlbk5ld0RvY3guQXBwZW5kKCRsaW5lQnJlYWspCisgICAgJGNvdW50KysKK30KKyRzdGFydCA9ICRwYXJhbURlY2wgKyAxCiskZW5kID0gJHBhcmFtVXNlIC0gMQorJHRlbXBsYXRlWyRzdGFydC4uJGVuZF0gfCAlIHsgW3ZvaWRdJHNiR2VuTmV3RG9jeC5BcHBlbmQoJF8gKyAkbGluZUJyZWFrKSB9CitkaXIgKi5kb2N4IHwgJSB7CisgICAgJGZpID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uRmlsZUluZm8gJF8KKyAgICBbdm9pZF0kc2JHZW5OZXdEb2N4LkFwcGVuZCgiICAgIGlmIChgJEFsbCAtb3IgYCQkKCRmaS5CYXNlTmFtZSkpIHsgQXBwZW5kRG9jIGAkc3JjTGlzdCBgJFNhbXBsZURvY3gkKCRmaS5CYXNlTmFtZSkgYCIkKCRmaS5CYXNlTmFtZSlgIiB9IiArICRsaW5lQnJlYWspCit9Ciskc3RhcnQgPSAkcGFyYW1Vc2UgKyAxCiskdGVtcGxhdGVbJHN0YXJ0Li45OTk5OV0gfCAlIHsgW3ZvaWRdJHNiR2VuTmV3RG9jeC5BcHBlbmQoJF8gKyAkbGluZUJyZWFrKSB9CisKK1NldC1Db250ZW50IC1WYWx1ZSAkc2JHZW5OZXdEb2N4LlRvU3RyaW5nKCkgLVBhdGggJG5keCAtRW5jb2RpbmcgVVRGOApkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9IZWFkaW5ncy5kb2N4IGIvTmV3RG9jeERvY3VtZW50cy9IZWFkaW5ncy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTVlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0hlYWRpbmdzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9IZWFkaW5ncy50eHQgYi9OZXdEb2N4RG9jdW1lbnRzL0hlYWRpbmdzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTJlN2FjCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9IZWFkaW5ncy50eHQKQEAgLTAsMCArMSBAQAor77u/SGVhZGluZ3MKZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvSGllcmFyY2hpY2FsTnVtYmVyZWRMaXN0LmRvY3ggYi9OZXdEb2N4RG9jdW1lbnRzL0hpZXJhcmNoaWNhbE51bWJlcmVkTGlzdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOWE4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0hpZXJhcmNoaWNhbE51bWJlcmVkTGlzdC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvSGllcmFyY2hpY2FsTnVtYmVyZWRMaXN0LnR4dCBiL05ld0RvY3hEb2N1bWVudHMvSGllcmFyY2hpY2FsTnVtYmVyZWRMaXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzIwM2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9IaWVyYXJjaGljYWxOdW1iZXJlZExpc3QudHh0CkBAIC0wLDAgKzEgQEAKK++7v0hpZXJhcmNoaWNhbCBudW1iZXJlZCBsaXN0LgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9Ib3Jpem9udGFsV2hpdGVTcGFjZS5kb2N4IGIvTmV3RG9jeERvY3VtZW50cy9Ib3Jpem9udGFsV2hpdGVTcGFjZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NzQ4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0hvcml6b250YWxXaGl0ZVNwYWNlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9Ib3Jpem9udGFsV2hpdGVTcGFjZS50eHQgYi9OZXdEb2N4RG9jdW1lbnRzL0hvcml6b250YWxXaGl0ZVNwYWNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmZlZjFmCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9Ib3Jpem9udGFsV2hpdGVTcGFjZS50eHQKQEAgLTAsMCArMSBAQAor77u/Rmlyc3QgbGluZSBpbmRlbnQsIGhhbmdpbmcgaW5kZW50LCBpbmRlbnRlZCBwYXJhZ3JhcGhzLgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9IeXBlcmxpbmsuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvSHlwZXJsaW5rLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyYjllMgotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvSHlwZXJsaW5rLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9IeXBlcmxpbmsudHh0IGIvTmV3RG9jeERvY3VtZW50cy9IeXBlcmxpbmsudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYWE1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0h5cGVybGluay50eHQKQEAgLTAsMCArMSBAQAor77u/Qm9va21hcmsgYW5kIGh5cGVybGluayB0byB0aGUgYm9va21hcmsuCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL0ltYWdlLmRvY3ggYi9OZXdEb2N4RG9jdW1lbnRzL0ltYWdlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2NTZmYgotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvSW1hZ2UuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL0ltYWdlLnR4dCBiL05ld0RvY3hEb2N1bWVudHMvSW1hZ2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3Nzk2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0ltYWdlLnR4dApAQCAtMCwwICsxIEBACivvu79JbWFnZS4KZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvSnVzdGlmaWVkLmRvY3ggYi9OZXdEb2N4RG9jdW1lbnRzL0p1c3RpZmllZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzhiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL0p1c3RpZmllZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvSnVzdGlmaWVkLnR4dCBiL05ld0RvY3hEb2N1bWVudHMvSnVzdGlmaWVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzYyMzUzCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9KdXN0aWZpZWQudHh0CkBAIC0wLDAgKzEgQEAKK++7v0p1c3RpZmllZCB0ZXh0LgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9OdW1iZXJlZExpc3QuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvTnVtYmVyZWRMaXN0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmY2YxYQotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvTnVtYmVyZWRMaXN0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9OdW1iZXJlZExpc3QudHh0IGIvTmV3RG9jeERvY3VtZW50cy9OdW1iZXJlZExpc3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ODViNTcKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL051bWJlcmVkTGlzdC50eHQKQEAgLTAsMCArMSBAQAor77u/U2ltcGxlIG51bWJlcmVkIGxpc3QuCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL051bWJlcmVkTGlzdFJvbWFuTnVtZXJhbHMuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvTnVtYmVyZWRMaXN0Um9tYW5OdW1lcmFscy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NzA4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL051bWJlcmVkTGlzdFJvbWFuTnVtZXJhbHMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL051bWJlcmVkTGlzdFJvbWFuTnVtZXJhbHMudHh0IGIvTmV3RG9jeERvY3VtZW50cy9OdW1iZXJlZExpc3RSb21hbk51bWVyYWxzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTNjODU0Ci0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9OdW1iZXJlZExpc3RSb21hbk51bWVyYWxzLnR4dApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL1BhcmFncmFwaEJvcmRlci5kb2N4IGIvTmV3RG9jeERvY3VtZW50cy9QYXJhZ3JhcGhCb3JkZXIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWM3ZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9QYXJhZ3JhcGhCb3JkZXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL1BhcmFncmFwaEJvcmRlci50eHQgYi9OZXdEb2N4RG9jdW1lbnRzL1BhcmFncmFwaEJvcmRlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzNjQwNQotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvUGFyYWdyYXBoQm9yZGVyLnR4dApAQCAtMCwwICsxIEBACivvu79QYXJhZ3JhcGggYm9yZGVyLgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9QbGFpbi5kb2N4IGIvTmV3RG9jeERvY3VtZW50cy9QbGFpbi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTNmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL1BsYWluLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9QbGFpbi50eHQgYi9OZXdEb2N4RG9jdW1lbnRzL1BsYWluLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDljMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9QbGFpbi50eHQKQEAgLTAsMCArMSBAQAor77u/UGxhaW4gdGV4dC4KZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvUmV2aXNpb25UcmFja2luZy5kb2N4IGIvTmV3RG9jeERvY3VtZW50cy9SZXZpc2lvblRyYWNraW5nLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzZTBjMAotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvUmV2aXNpb25UcmFja2luZy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvUmV2aXNpb25UcmFja2luZy50eHQgYi9OZXdEb2N4RG9jdW1lbnRzL1JldmlzaW9uVHJhY2tpbmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MjcxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL1JldmlzaW9uVHJhY2tpbmcudHh0CkBAIC0wLDAgKzEgQEAKK++7v1JldmlzaW9uIHRyYWNraW5nLgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9SaWdodEp1c3RpZmllZC5kb2N4IGIvTmV3RG9jeERvY3VtZW50cy9SaWdodEp1c3RpZmllZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNWUwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL1JpZ2h0SnVzdGlmaWVkLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9SaWdodEp1c3RpZmllZC50eHQgYi9OZXdEb2N4RG9jdW1lbnRzL1JpZ2h0SnVzdGlmaWVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTI4YzNkCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9SaWdodEp1c3RpZmllZC50eHQKQEAgLTAsMCArMSBAQAor77u/UmlnaHQganVzdGlmaWVkIHRleHQuCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL1NlY3Rpb24uZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvU2VjdGlvbi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NGIyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL1NlY3Rpb24uZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL1NlY3Rpb24udHh0IGIvTmV3RG9jeERvY3VtZW50cy9TZWN0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTQ0NjBlCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9TZWN0aW9uLnR4dApAQCAtMCwwICsxIEBACivvu79MYW5kc2NhcGUgc2VjdGlvbi4KZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvU2VjdGlvbldpdGhXYXRlcm1hcmsuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvU2VjdGlvbldpdGhXYXRlcm1hcmsuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGM5NzI3Ci0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9TZWN0aW9uV2l0aFdhdGVybWFyay5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvU2VjdGlvbldpdGhXYXRlcm1hcmsudHh0IGIvTmV3RG9jeERvY3VtZW50cy9TZWN0aW9uV2l0aFdhdGVybWFyay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwMWU5NwotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvU2VjdGlvbldpdGhXYXRlcm1hcmsudHh0CkBAIC0wLDAgKzEgQEAKK++7v1NlY3Rpb24gd2l0aCB3YXRlcm1hcmsuCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL1NoYWRpbmcuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvU2hhZGluZy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOThmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL1NoYWRpbmcuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL1NoYWRpbmcudHh0IGIvTmV3RG9jeERvY3VtZW50cy9TaGFkaW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2YzMWFlCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9TaGFkaW5nLnR4dApAQCAtMCwwICsxIEBACivvu79TaGFkZWQgcGFyYWdyYXBoLgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9TaGFwZS5kb2N4IGIvTmV3RG9jeERvY3VtZW50cy9TaGFwZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NDBjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL1NoYXBlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9TaGFwZS50eHQgYi9OZXdEb2N4RG9jdW1lbnRzL1NoYXBlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzFjMmI1Ci0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9TaGFwZS50eHQKQEAgLTAsMCArMSBAQAor77u/U2hhcGVzLgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9TbWFydEFydC5kb2N4IGIvTmV3RG9jeERvY3VtZW50cy9TbWFydEFydC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MTViMzAKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL1NtYXJ0QXJ0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9TbWFydEFydC50eHQgYi9OZXdEb2N4RG9jdW1lbnRzL1NtYXJ0QXJ0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzY1N2EwCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9TbWFydEFydC50eHQKQEAgLTAsMCArMSBAQAor77u/U21hcnRBcnQuCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL1N5bWJvbHMuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvU3ltYm9scy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZjgxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL1N5bWJvbHMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL1N5bWJvbHMudHh0IGIvTmV3RG9jeERvY3VtZW50cy9TeW1ib2xzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWUxNjAxCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9TeW1ib2xzLnR4dApAQCAtMCwwICsxIEBACivvu79TeW1ib2xzLgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9UYWJsZS5kb2N4IGIvTmV3RG9jeERvY3VtZW50cy9UYWJsZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OWNjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL1RhYmxlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9UYWJsZS50eHQgYi9OZXdEb2N4RG9jdW1lbnRzL1RhYmxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNmOGVjCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9UYWJsZS50eHQKQEAgLTAsMCArMSBAQAor77u/VGFibGUgdGhhdCBoYXMgYSB0YWJsZSBzdHlsZSBhcHBsaWVkLgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9UYWJsZU9mQ29udGVudHMuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvVGFibGVPZkNvbnRlbnRzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlZmU5MAotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvVGFibGVPZkNvbnRlbnRzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9UYWJsZU9mQ29udGVudHMudHh0IGIvTmV3RG9jeERvY3VtZW50cy9UYWJsZU9mQ29udGVudHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MDIyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL1RhYmxlT2ZDb250ZW50cy50eHQKQEAgLTAsMCArMSBAQAor77u/VGFibGUgb2YgY29udGVudHMuCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL1RleHRCb3guZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvVGV4dEJveC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMmE5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL1RleHRCb3guZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdEb2N4RG9jdW1lbnRzL1RleHRCb3gudHh0IGIvTmV3RG9jeERvY3VtZW50cy9UZXh0Qm94LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGQ2ZGRmCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9UZXh0Qm94LnR4dApAQCAtMCwwICsxIEBACivvu79UZXh0IGJveC4KZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvVGV4dEVmZmVjdHMuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvVGV4dEVmZmVjdHMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTIzNGViCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9UZXh0RWZmZWN0cy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvVGV4dEVmZmVjdHMudHh0IGIvTmV3RG9jeERvY3VtZW50cy9UZXh0RWZmZWN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjMzg1NAotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvVGV4dEVmZmVjdHMudHh0CkBAIC0wLDAgKzEgQEAKK++7v1RleHQgZWZmZWN0cy4KZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvVGhlbWUuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvVGhlbWUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjVlN2QyCi0tLSAvZGV2L251bGwKKysrIGIvTmV3RG9jeERvY3VtZW50cy9UaGVtZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05ld0RvY3hEb2N1bWVudHMvVGhlbWUudHh0IGIvTmV3RG9jeERvY3VtZW50cy9UaGVtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjNTdhYQotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvVGhlbWUudHh0CkBAIC0wLDAgKzEgQEAKK++7v1RoZW1lLgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9WZXJ0aWNhbFdoaXRlU3BhY2UuZG9jeCBiL05ld0RvY3hEb2N1bWVudHMvVmVydGljYWxXaGl0ZVNwYWNlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1NDc0MgotLS0gL2Rldi9udWxsCisrKyBiL05ld0RvY3hEb2N1bWVudHMvVmVydGljYWxXaGl0ZVNwYWNlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3RG9jeERvY3VtZW50cy9WZXJ0aWNhbFdoaXRlU3BhY2UudHh0IGIvTmV3RG9jeERvY3VtZW50cy9WZXJ0aWNhbFdoaXRlU3BhY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiY2JkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdEb2N4RG9jdW1lbnRzL1ZlcnRpY2FsV2hpdGVTcGFjZS50eHQKQEAgLTAsMCArMSBAQAor77u/VmVydGljYWwgc3BhY2UgYmVmb3JlIGFuZCBhZnRlciBwYXJhZ3JhcGhzLgpkaWZmIC0tZ2l0IGEvTmV3UHB0eFByZXNlbnRhdGlvbnMvQWRqYWNlbmN5VGhlbWUucHB0eCBiL05ld1BwdHhQcmVzZW50YXRpb25zL0FkamFjZW5jeVRoZW1lLnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3OThhYgotLS0gL2Rldi9udWxsCisrKyBiL05ld1BwdHhQcmVzZW50YXRpb25zL0FkamFjZW5jeVRoZW1lLnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3UHB0eFByZXNlbnRhdGlvbnMvQWRqYWNlbmN5VGhlbWUudHh0IGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvQWRqYWNlbmN5VGhlbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YjUxMzkKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9BZGphY2VuY3lUaGVtZS50eHQKQEAgLTAsMCArMSBAQAor77u/QWRqYWNlbmN5IFRoZW1lCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9BbmdsZXNUaGVtZS5wcHR4IGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvQW5nbGVzVGhlbWUucHB0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTgzYmRiCi0tLSAvZGV2L251bGwKKysrIGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvQW5nbGVzVGhlbWUucHB0eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9BbmdsZXNUaGVtZS50eHQgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9BbmdsZXNUaGVtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmODAxNQotLS0gL2Rldi9udWxsCisrKyBiL05ld1BwdHhQcmVzZW50YXRpb25zL0FuZ2xlc1RoZW1lLnR4dApAQCAtMCwwICsxIEBACivvu79BbmdsZXMgVGhlbWUuCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9BcGV4VGhlbWUucHB0eCBiL05ld1BwdHhQcmVzZW50YXRpb25zL0FwZXhUaGVtZS5wcHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NTNjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9BcGV4VGhlbWUucHB0eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9BcGV4VGhlbWUudHh0IGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvQXBleFRoZW1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWU0YjRjCi0tLSAvZGV2L251bGwKKysrIGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvQXBleFRoZW1lLnR4dApAQCAtMCwwICsxIEBACivvu79BcGV4IFRoZW1lLgpkaWZmIC0tZ2l0IGEvTmV3UHB0eFByZXNlbnRhdGlvbnMvQmxhbmtMYXlvdXQucHB0eCBiL05ld1BwdHhQcmVzZW50YXRpb25zL0JsYW5rTGF5b3V0LnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3NjMzYgotLS0gL2Rldi9udWxsCisrKyBiL05ld1BwdHhQcmVzZW50YXRpb25zL0JsYW5rTGF5b3V0LnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3UHB0eFByZXNlbnRhdGlvbnMvQmxhbmtMYXlvdXQudHh0IGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvQmxhbmtMYXlvdXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNjY3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9CbGFua0xheW91dC50eHQKQEAgLTAsMCArMSBAQAor77u/U2xpZGUgd2l0aCBCbGFuayBsYXlvdXQuCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9Db21wYXJpc29uTGF5b3V0LnBwdHggYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9Db21wYXJpc29uTGF5b3V0LnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM0OTQ1MgotLS0gL2Rldi9udWxsCisrKyBiL05ld1BwdHhQcmVzZW50YXRpb25zL0NvbXBhcmlzb25MYXlvdXQucHB0eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9Db21wYXJpc29uTGF5b3V0LnR4dCBiL05ld1BwdHhQcmVzZW50YXRpb25zL0NvbXBhcmlzb25MYXlvdXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMTgxYWYKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9Db21wYXJpc29uTGF5b3V0LnR4dApAQCAtMCwwICsxIEBACivvu79TbGlkZSB3aXRoIENvbXBhcmlzb24gbGF5b3V0LgpkaWZmIC0tZ2l0IGEvTmV3UHB0eFByZXNlbnRhdGlvbnMvQ29udGVudFdpdGhDYXB0aW9uTGF5b3V0LnBwdHggYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9Db250ZW50V2l0aENhcHRpb25MYXlvdXQucHB0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWM1YzVlCi0tLSAvZGV2L251bGwKKysrIGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvQ29udGVudFdpdGhDYXB0aW9uTGF5b3V0LnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3UHB0eFByZXNlbnRhdGlvbnMvQ29udGVudFdpdGhDYXB0aW9uTGF5b3V0LnR4dCBiL05ld1BwdHhQcmVzZW50YXRpb25zL0NvbnRlbnRXaXRoQ2FwdGlvbkxheW91dC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2N2ZjZAotLS0gL2Rldi9udWxsCisrKyBiL05ld1BwdHhQcmVzZW50YXRpb25zL0NvbnRlbnRXaXRoQ2FwdGlvbkxheW91dC50eHQKQEAgLTAsMCArMSBAQAor77u/U2xpZGUgd2l0aCBDb250ZW50IFdpdGggQ2FwdGlvbiBsYXlvdXQuCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9FbXB0eS5wcHR4IGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvRW1wdHkucHB0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmI0MmQwCi0tLSAvZGV2L251bGwKKysrIGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvRW1wdHkucHB0eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9FbXB0eS50eHQgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9FbXB0eS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0MDhhYwotLS0gL2Rldi9udWxsCisrKyBiL05ld1BwdHhQcmVzZW50YXRpb25zL0VtcHR5LnR4dApAQCAtMCwwICsxIEBACivvu79ObyBzbGlkZXMuCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9GaXZlU2xpZGVzLnBwdHggYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9GaXZlU2xpZGVzLnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwNzMyNAotLS0gL2Rldi9udWxsCisrKyBiL05ld1BwdHhQcmVzZW50YXRpb25zL0ZpdmVTbGlkZXMucHB0eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9GaXZlU2xpZGVzLnR4dCBiL05ld1BwdHhQcmVzZW50YXRpb25zL0ZpdmVTbGlkZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNDA4YWMKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9GaXZlU2xpZGVzLnR4dApAQCAtMCwwICsxIEBACivvu79ObyBzbGlkZXMuCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9HZW5lcmF0ZU5ld1BwdHhDbWRsZXQucHMxIGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvR2VuZXJhdGVOZXdQcHR4Q21kbGV0LnBzMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2ViNzMyCi0tLSAvZGV2L251bGwKKysrIGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvR2VuZXJhdGVOZXdQcHR4Q21kbGV0LnBzMQpAQCAtMCwwICsxLDEwNyBAQAor77u/W2Vudmlyb25tZW50XTo6Q3VycmVudERpcmVjdG9yeSA9ICQoR2V0LUxvY2F0aW9uKQoraWYgKC1ub3QgJChUZXN0LVBhdGggLlxHZW5lcmF0ZU5ld1BwdHhDbWRsZXQucHMxKSkKK3sKKyAgICBUaHJvdyAiWW91IG11c3QgcnVuIHRoaXMgc2NyaXB0IGZyb20gd2l0aGluIHRoZSBOZXdQcHR4UHJlc2VudGF0aW9ucyBkaXJlY3RvcnkiCit9CisKKyRkeCA9ICIuLlxDbWRsZXRzXFBwdHhMaWIucHMxIgoraWYgKFRlc3QtUGF0aCAkZHgpIHsgZGVsICRkeH0KKworJGxpbmVCcmVhayA9IFtTeXN0ZW0uRW52aXJvbm1lbnRdOjpOZXdMaW5lCisKK1tTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyXSRzYkR4bCA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXIKKworJGNvcHlyaWdodFN0cmluZyA9IEAiCis8IyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiojPgorCisiQAorCitbdm9pZF0kc2JEeGwuQXBwZW5kKCRjb3B5cmlnaHRTdHJpbmcgKyAkbGluZUJyZWFrKQorCitkaXIgKi5wcHR4IHwgJSB7CisgICAgJGZpID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uRmlsZUluZm8gJF8KKyAgICBbdm9pZF0kc2JEeGwuQXBwZW5kKCJgJFNhbXBsZVBwdHgkKCRfLkJhc2VOYW1lKSA9IiArICRsaW5lQnJlYWspCisgICAgJGI2NCA9ICQoQ29udmVydFRvLUJhc2U2NCAkXyAtUG93ZXJTaGVsbExpdGVyYWwpCisgICAgW3ZvaWRdJHNiRHhsLkFwcGVuZCgkYjY0ICsgJGxpbmVCcmVhaykKKyAgICBbdm9pZF0kc2JEeGwuQXBwZW5kKCIiICsgJGxpbmVCcmVhaykKK30KK1NldC1Db250ZW50IC1WYWx1ZSAkc2JEeGwuVG9TdHJpbmcoKSAtUGF0aCAkZHggLUVuY29kaW5nIFVURjgKKworJHRlbXBsYXRlID0gW1N5c3RlbS5JTy5GaWxlXTo6UmVhZEFsbExpbmVzKCIuLlxDbWRsZXRzXE5ldy1QcHR4LVRlbXBsYXRlLnBzMSIpCiskcGFyYW1Eb2NzID0gLTE7CiskcGFyYW1EZWNsID0gLTE7CiskcGFyYW1Vc2UgPSAtMTsKK2ZvciAoJGkgPSAwOyAkaSAtbHQgJHRlbXBsYXRlLkxlbmd0aDsgJGkrKykKK3sKKyAgICAkdCA9ICR0ZW1wbGF0ZVskaV0KKyAgICBpZiAoJHQuQ29udGFpbnMoIlBhcmFtZXRlckRvY3VtZW50YXRpb24iKSkgeyAkcGFyYW1Eb2NzID0gJGkgfQorICAgIGlmICgkdC5Db250YWlucygiUGFyYW1ldGVyRGVjbGFyYXRpb24iKSkgeyAkcGFyYW1EZWNsID0gJGkgfQorICAgIGlmICgkdC5Db250YWlucygiUGFyYW1ldGVyVXNlIikpIHsgJHBhcmFtVXNlID0gJGkgfQorfQorCiskbnB4ID0gIi4uXENtZGxldHNcTmV3LVBwdHgucHMxIgoraWYgKFRlc3QtUGF0aCAkbnB4KQoreworICAgIFJlbW92ZS1JdGVtICRucHgKK30KKworJHNiR2VuTmV3UHB0eCA9IE5ldy1PYmplY3QgU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKworJHRlbXBsYXRlWzAuLigkcGFyYW1Eb2NzIC0gMSldIHwgJSB7IFt2b2lkXSRzYkdlbk5ld1BwdHguQXBwZW5kKCRfICsgJGxpbmVCcmVhaykgfQorZGlyICoucHB0eCB8ICUgeworICAgICRmaSA9IE5ldy1PYmplY3QgU3lzdGVtLklPLkZpbGVJbmZvICRfCisgICAgW3ZvaWRdJHNiR2VuTmV3UHB0eC5BcHBlbmQoIiAgICAuUEFSQU1FVEVSICQoJGZpLkJhc2VOYW1lKSIgKyAkbGluZUJyZWFrKQorICAgICRmaURlc2MgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5GaWxlSW5mbyAkKCRfLkJhc2VOYW1lICsgIi50eHQiKQorICAgIGlmICgkZmlEZXNjLkV4aXN0cykKKyAgICB7CisgICAgICAgIEdldC1Db250ZW50ICQoJGZpRGVzYy5GdWxsTmFtZSkgfCAlIHsgW3ZvaWRdJHNiR2VuTmV3UHB0eC5BcHBlbmQoJyAgICAnICsgJF8gKyAkbGluZUJyZWFrKSB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICRlcnJNZXNzYWdlID0gIkVycm9yOiAkKCRmaS5CYXNlTmFtZSkucHB0eCBkb2VzIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyAkKCRmaS5CYXNlTmFtZSkudHh0IgorICAgICAgICBXcml0ZS1Ib3N0IC1Gb3JlZ3JvdW5kQ29sb3IgUmVkICRlcnJNZXNzYWdlCisgICAgICAgIFt2b2lkXSRzYkdlbk5ld1BwdHguQXBwZW5kKCcgICAgJyArICRlcnJNZXNzYWdlICsgJGxpbmVCcmVhaykKKyAgICB9Cit9Ciskc3RhcnQgPSAkcGFyYW1Eb2NzICsgMQorJGVuZCA9ICRwYXJhbURlY2wgLSAxCiskdGVtcGxhdGVbJHN0YXJ0Li4kZW5kXSB8ICUgeyBbdm9pZF0kc2JHZW5OZXdQcHR4LkFwcGVuZCgkXyArICRsaW5lQnJlYWspIH0KKyRsYXN0ID0gKCgkKGRpciAqLnBwdHgpIHwgbWVhc3VyZSkuQ291bnQpIC0gMQorJGNvdW50ID0gMAorZGlyICoucHB0eCB8ICUgeworICAgICRmaSA9IE5ldy1PYmplY3QgU3lzdGVtLklPLkZpbGVJbmZvICRfCisgICAgW3ZvaWRdJHNiR2VuTmV3UHB0eC5BcHBlbmQoJyAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JEZhbHNlKV0nICsgJGxpbmVCcmVhaykKKyAgICBbdm9pZF0kc2JHZW5OZXdQcHR4LkFwcGVuZCgnICAgICAgICBbU3dpdGNoXScgKyAkbGluZUJyZWFrKQorICAgIGlmICgkY291bnQgLW5lICRsYXN0KQorICAgIHsKKyAgICAgICAgW3ZvaWRdJHNiR2VuTmV3UHB0eC5BcHBlbmQoIiAgICAgICAgW2Jvb2xdYCQkKCRfLkJhc2VOYW1lKSwiICsgJGxpbmVCcmVhaykKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgW3ZvaWRdJHNiR2VuTmV3UHB0eC5BcHBlbmQoIiAgICAgICAgW2Jvb2xdYCQkKCRfLkJhc2VOYW1lKSIgKyAkbGluZUJyZWFrKQorICAgIH0KKyAgICBbdm9pZF0kc2JHZW5OZXdQcHR4LkFwcGVuZCgkbGluZUJyZWFrKQorICAgICRjb3VudCsrCit9Ciskc3RhcnQgPSAkcGFyYW1EZWNsICsgMQorJGVuZCA9ICRwYXJhbVVzZSAtIDEKKyR0ZW1wbGF0ZVskc3RhcnQuLiRlbmRdIHwgJSB7IFt2b2lkXSRzYkdlbk5ld1BwdHguQXBwZW5kKCRfICsgJGxpbmVCcmVhaykgfQorZGlyICoucHB0eCB8ICUgeworICAgICRmaSA9IE5ldy1PYmplY3QgU3lzdGVtLklPLkZpbGVJbmZvICRfCisgICAgW3ZvaWRdJHNiR2VuTmV3UHB0eC5BcHBlbmQoIiAgICBpZiAoYCRBbGwgLW9yIGAkJCgkZmkuQmFzZU5hbWUpKSB7IEFwcGVuZFByZXNlbnRhdGlvbiBgJHNyY0xpc3QgYCRTYW1wbGVQcHR4JCgkZmkuQmFzZU5hbWUpIGAiJCgkZmkuQmFzZU5hbWUpYCIgfSIgKyAkbGluZUJyZWFrKQorfQorJHN0YXJ0ID0gJHBhcmFtVXNlICsgMQorJHRlbXBsYXRlWyRzdGFydC4uOTk5OTldIHwgJSB7IFt2b2lkXSRzYkdlbk5ld1BwdHguQXBwZW5kKCRfICsgJGxpbmVCcmVhaykgfQorCitTZXQtQ29udGVudCAtVmFsdWUgJHNiR2VuTmV3UHB0eC5Ub1N0cmluZygpIC1QYXRoICRucHggLUVuY29kaW5nIFVURjgKZGlmZiAtLWdpdCBhL05ld1BwdHhQcmVzZW50YXRpb25zL1BpY3R1cmVXaXRoQ2FwdGlvbkxheW91dC5wcHR4IGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvUGljdHVyZVdpdGhDYXB0aW9uTGF5b3V0LnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmN2Y4NgotLS0gL2Rldi9udWxsCisrKyBiL05ld1BwdHhQcmVzZW50YXRpb25zL1BpY3R1cmVXaXRoQ2FwdGlvbkxheW91dC5wcHR4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05ld1BwdHhQcmVzZW50YXRpb25zL1BpY3R1cmVXaXRoQ2FwdGlvbkxheW91dC50eHQgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9QaWN0dXJlV2l0aENhcHRpb25MYXlvdXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMTNjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9QaWN0dXJlV2l0aENhcHRpb25MYXlvdXQudHh0CkBAIC0wLDAgKzEgQEAKK++7v1NsaWRlIHdpdGggUGljdHVyZSBXaXRoIENhcHRpb24gbGF5b3V0LgpkaWZmIC0tZ2l0IGEvTmV3UHB0eFByZXNlbnRhdGlvbnMvU2VjdGlvbkhlYWRlckxheW91dC5wcHR4IGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvU2VjdGlvbkhlYWRlckxheW91dC5wcHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODg2YjAKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9TZWN0aW9uSGVhZGVyTGF5b3V0LnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3UHB0eFByZXNlbnRhdGlvbnMvU2VjdGlvbkhlYWRlckxheW91dC50eHQgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9TZWN0aW9uSGVhZGVyTGF5b3V0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDIyMWE2Ci0tLSAvZGV2L251bGwKKysrIGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvU2VjdGlvbkhlYWRlckxheW91dC50eHQKQEAgLTAsMCArMSBAQAor77u/U2xpZGUgd2l0aCBTZWN0aW9uIEhlYWRlciBsYXlvdXQuCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9TbGlkZVRyYW5zaXRpb25zLnBwdHggYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9TbGlkZVRyYW5zaXRpb25zLnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE5MzMwZQotLS0gL2Rldi9udWxsCisrKyBiL05ld1BwdHhQcmVzZW50YXRpb25zL1NsaWRlVHJhbnNpdGlvbnMucHB0eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9TbGlkZVRyYW5zaXRpb25zLnR4dCBiL05ld1BwdHhQcmVzZW50YXRpb25zL1NsaWRlVHJhbnNpdGlvbnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZDUzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9TbGlkZVRyYW5zaXRpb25zLnR4dApAQCAtMCwwICsxIEBACivvu79TbGlkZSBUcmFuc2l0aW9ucy4KZGlmZiAtLWdpdCBhL05ld1BwdHhQcmVzZW50YXRpb25zL1RlblNsaWRlcy5wcHR4IGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvVGVuU2xpZGVzLnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUxOTNiMAotLS0gL2Rldi9udWxsCisrKyBiL05ld1BwdHhQcmVzZW50YXRpb25zL1RlblNsaWRlcy5wcHR4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05ld1BwdHhQcmVzZW50YXRpb25zL1RlblNsaWRlcy50eHQgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9UZW5TbGlkZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTZjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9UZW5TbGlkZXMudHh0CkBAIC0wLDAgKzEgQEAKK++7v1RlbiBTbGlkZXMuCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9UaXRsZUFuZENvbnRlbnRMYXlvdXQucHB0eCBiL05ld1BwdHhQcmVzZW50YXRpb25zL1RpdGxlQW5kQ29udGVudExheW91dC5wcHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyY2Q4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9UaXRsZUFuZENvbnRlbnRMYXlvdXQucHB0eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9OZXdQcHR4UHJlc2VudGF0aW9ucy9UaXRsZUFuZENvbnRlbnRMYXlvdXQudHh0IGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvVGl0bGVBbmRDb250ZW50TGF5b3V0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDI4ZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvVGl0bGVBbmRDb250ZW50TGF5b3V0LnR4dApAQCAtMCwwICsxIEBACivvu79TbGlkZSB3aXRoIFRpdGxlIGFuZCBDb250ZW50IGxheW91dC4KZGlmZiAtLWdpdCBhL05ld1BwdHhQcmVzZW50YXRpb25zL1RpdGxlTGF5b3V0LnBwdHggYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9UaXRsZUxheW91dC5wcHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NjM1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9UaXRsZUxheW91dC5wcHR4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05ld1BwdHhQcmVzZW50YXRpb25zL1RpdGxlTGF5b3V0LnR4dCBiL05ld1BwdHhQcmVzZW50YXRpb25zL1RpdGxlTGF5b3V0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWExZmQwCi0tLSAvZGV2L251bGwKKysrIGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvVGl0bGVMYXlvdXQudHh0CkBAIC0wLDAgKzEgQEAKK++7v1NsaWRlIHdpdGggVGl0bGUgbGF5b3V0LgpkaWZmIC0tZ2l0IGEvTmV3UHB0eFByZXNlbnRhdGlvbnMvVGl0bGVPbmx5TGF5b3V0LnBwdHggYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9UaXRsZU9ubHlMYXlvdXQucHB0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODI3MGRmCi0tLSAvZGV2L251bGwKKysrIGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvVGl0bGVPbmx5TGF5b3V0LnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3UHB0eFByZXNlbnRhdGlvbnMvVGl0bGVPbmx5TGF5b3V0LnR4dCBiL05ld1BwdHhQcmVzZW50YXRpb25zL1RpdGxlT25seUxheW91dC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxZmE4MwotLS0gL2Rldi9udWxsCisrKyBiL05ld1BwdHhQcmVzZW50YXRpb25zL1RpdGxlT25seUxheW91dC50eHQKQEAgLTAsMCArMSBAQAor77u/U2xpZGUgd2l0aCBUaXRsZSBPbmx5IGxheW91dC4KZGlmZiAtLWdpdCBhL05ld1BwdHhQcmVzZW50YXRpb25zL1R3b0NvbnRlbnRMYXlvdXQucHB0eCBiL05ld1BwdHhQcmVzZW50YXRpb25zL1R3b0NvbnRlbnRMYXlvdXQucHB0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjQzNDA3Ci0tLSAvZGV2L251bGwKKysrIGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvVHdvQ29udGVudExheW91dC5wcHR4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05ld1BwdHhQcmVzZW50YXRpb25zL1R3b0NvbnRlbnRMYXlvdXQudHh0IGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvVHdvQ29udGVudExheW91dC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2NzgxYgotLS0gL2Rldi9udWxsCisrKyBiL05ld1BwdHhQcmVzZW50YXRpb25zL1R3b0NvbnRlbnRMYXlvdXQudHh0CkBAIC0wLDAgKzEgQEAKK++7v1NsaWRlIHdpdGggVHdvIENvbnRlbnQgbGF5b3V0LgpkaWZmIC0tZ2l0IGEvTmV3UHB0eFByZXNlbnRhdGlvbnMvV2F2ZUZvcm1UaGVtZS5wcHR4IGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvV2F2ZUZvcm1UaGVtZS5wcHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOWJkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9XYXZlRm9ybVRoZW1lLnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTmV3UHB0eFByZXNlbnRhdGlvbnMvV2F2ZUZvcm1UaGVtZS50eHQgYi9OZXdQcHR4UHJlc2VudGF0aW9ucy9XYXZlRm9ybVRoZW1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWYzM2FjCi0tLSAvZGV2L251bGwKKysrIGIvTmV3UHB0eFByZXNlbnRhdGlvbnMvV2F2ZUZvcm1UaGVtZS50eHQKQEAgLTAsMCArMSBAQAor77u/V2F2ZSBGb3JtIFRoZW1lLgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMuT0EvSHRtbFRvV21sQ29udmVydGVyVGVzdHMyLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMuT0EvSHRtbFRvV21sQ29udmVydGVyVGVzdHMyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYmNlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy5PQS9IdG1sVG9XbWxDb252ZXJ0ZXJUZXN0czIuY3MKQEAgLTAsMCArMSw1NTggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uRHJhd2luZy5JbWFnaW5nOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlZhbGlkYXRpb247Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKK3VzaW5nIFh1bml0OwordXNpbmcgSHRtbEFnaWxpdHlQYWNrOwordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSHRtbFRvV21sQ29udmVydGVyIGV4cGVjdHMgdGhlIEhUTUwgdG8gYmUgcGFzc2VkIGFzIGFuIFhFbGVtZW50LCBpLmUuIGFzIFhNTC4gIFdoaWxlIHRoZSBIVE1MIHRlc3QgZmlsZXMgdGhhdAorICogYXJlIGluY2x1ZGVkIGluIE9wZW4tWG1sLVBvd2VyVG9vbHMgYXJlIGFibGUgdG8gYmUgcmVhZCBhcyBYTUwsIG1vc3QgSFRNTCBpcyBub3QgYWJsZSB0byBiZSByZWFkIGFzIFhNTC4KKyAqIFRoZSBiZXN0IHNvbHV0aW9uIGlzIHRvIHVzZSB0aGUgSHRtbEFnaWxpdHlQYWNrLCB3aGljaCBjYW4gcGFyc2UgSFRNTCBhbmQgc2F2ZSBhcyBYTUwuICBUaGUgSHRtbEFnaWxpdHlQYWNrCisgKiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTXMtUEwgKHNhbWUgYXMgT3Blbi1YbWwtUG93ZXJUb29scykgc28gaXQgaXMgY29udmVuaWVudCB0byBpbmNsdWRlIGl0IGluIHlvdXIgc29sdXRpb24sCisgKiBhbmQgdGhlcmVieSB5b3UgY2FuIGNvbnZlcnQgSFRNTCB0byBYTUwgdGhhdCBjYW4gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBIdG1sVG9XbWxDb252ZXJ0ZXIuCisgKiAKKyAqIEEgY29udmVuaWVudCB3YXkgdG8gZ2V0IHRoZSBETEwgdGhhdCBoYXMgYmVlbiBjaGVja2VkIG91dCB3aXRoIEh0bWxUb1dtbENvbnZlcnRlciBpcyB0byBjbG9uZSB0aGUgcmVwbyBhdAorICogaHR0cHM6Ly9naXRodWIuY29tL0VyaWNXaGl0ZURldi9IdG1sQWdpbGl0eVBhY2sKKyAqIAorICogVGhhdCByZXBvIGNvbnRhaW5zIG9ubHkgdGhlIERMTCB0aGF0IGhhcyBiZWVuIGNoZWNrZWQgb3V0IHdpdGggSHRtbFRvV21sQ29udmVydGVyLgorICogCisgKiBPZiBjb3Vyc2UsIHlvdSBjYW4gYWxzbyBnZXQgdGhlIEh0bWxBZ2lsaXR5UGFjayBzb3VyY2UgYW5kIGNvbXBpbGUgaXQgdG8gZ2V0IHRoZSBETEwuICBZb3UgY2FuIGZpbmQgaXQgYXQKKyAqIGh0dHA6Ly9jb2RlcGxleC5jb20vSHRtbEFnaWxpdHlQYWNrCisgKiAKKyAqIFdlIGRvbid0IGluY2x1ZGUgdGhlIEh0bWxBZ2lsaXR5UGFjayBpbiBPcGVuLVhtbC1Qb3dlclRvb2xzLCB0byBzaW1wbGlmeSBpbnN0YWxsYXRpb24uICBUaGUgWFVuaXQgdGVzdHMgaW4KKyAqIHRoaXMgbW9kdWxlIGRvIG5vdCByZXF1aXJlIHRoZSBIdG1sQWdpbGl0eVBhY2sgdG8gcnVuLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIERPX0NPTlZFUlNJT05fVklBX1dPUkQKK3VzaW5nIFdvcmQgPSBNaWNyb3NvZnQuT2ZmaWNlLkludGVyb3AuV29yZDsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgWFVuaXQgdGVzdHMgaW4gdGhpcyBtb2R1bGUgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgc3RhbmRhcmQgT3Blbi1YbWwtUG93ZXJUb29scyB0ZXN0cyBiZWNhdXNlCisgKiB0aGV5IHVzZSBlaXRoZXIgV29yZCBhdXRvbWF0aW9uLCB0aGUgSHRtbEFnaWxpdHlQYWNrLCBvciBib3RoLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKKworbmFtZXNwYWNlIE94UHQKK3sKKyAgICBwdWJsaWMgY2xhc3MgSHdUZXN0czIKKyAgICB7CisgICAgICAgIHN0YXRpYyBib29sIHNfUHJvZHVjZUFubm90YXRlZEh0bWwgPSB0cnVlOworCisgICAgICAgIC8vIFBvd2VyU2hlbGwgb25lbGluZXIgdGhhdCBnZW5lcmF0ZXMgSW5saW5lRGF0YSBmb3IgYWxsIGZpbGVzIGluIGEgZGlyZWN0b3J5CisgICAgICAgIC8vIGRpciB8ICUgeyAnW0lubGluZURhdGEoIicgKyAkXy5OYW1lICsgJyIpXScgfSB8IGNsaXAKKworICAgICAgICBbVGhlb3J5XQorICAgICAgICBbSW5saW5lRGF0YSgiSFcwMDItVGFibGUwMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIVzAwMi1UYWJsZTAyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhXMDAyLVRhYmxlMDMuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSFcwMDItVGFibGUwNC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIVzAwMi1UYWJsZTA1LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhXMDAyLVRhYmxlMDYuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSFcwMDItVGFibGUwNy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIVzAwMi1UYWJsZTA4LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhXMDAyLVRhYmxlMDkuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSFcwMDItVGFibGUxMC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIVzAwMi1UYWJsZTExLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhXMDAyLVRhYmxlMTIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSFcwMDItVGFibGUxMy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIVzAwMi1UYWJsZTE0LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhXMDAyLVRhYmxlMTUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSFcwMDItVGFibGUxNi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIVzAwMi1UYWJsZTE3LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhXMDAyLVRhYmxlMTguZG9jeCIpXQorICAgICAgICBwdWJsaWMgdm9pZCBIVzAwMihzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNvdXJjZURvY3hGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lKSk7CisKKyAgICAgICAgICAgIHZhciBzb3VyY2VDb3BpZWRUb0Rlc3REb2N4RmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIG5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLTItU291cmNlLmRvY3giKSkpOworICAgICAgICAgICAgdmFyIHNvdXJjZUNvcGllZFRvRGVzdEh0bWxGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgbmFtZS5SZXBsYWNlKCIuZG9jeCIsICItMi1Tb3VyY2UuaHRtbCIpKSk7CisgICAgICAgICAgICB2YXIgZGVzdENzc0ZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBuYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi0zLmNzcyIpKSk7CisgICAgICAgICAgICB2YXIgZGVzdERvY3hGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgbmFtZS5SZXBsYWNlKCIuZG9jeCIsICItNC1Db252ZXJ0ZWRCeUh0bWxUb1dtbC5kb2N4IikpKTsKKyAgICAgICAgICAgIHZhciBhbm5vdGF0ZWRIdG1sRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIG5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLTUtQW5ub3RhdGVkLnR4dCIpKSk7CisKKyAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2VEb2N4RmkuRnVsbE5hbWUsIHNvdXJjZUNvcGllZFRvRGVzdERvY3hGaS5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIFdvcmRBdXRvbWF0aW9uVXRpbGl0aWVzLlNhdmVBc0h0bWxVc2luZ1dvcmQoc291cmNlRG9jeEZpLCBzb3VyY2VDb3BpZWRUb0Rlc3RIdG1sRmkpOworICAgICAgICAgICAgWEVsZW1lbnQgaHRtbCA9IG51bGw7CisgICAgICAgICAgICBpbnQgY250ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHRtbCA9IEh0bWxUb1dtbFJlYWRBc1hFbGVtZW50LlJlYWRBc1hFbGVtZW50KHNvdXJjZUNvcGllZFRvRGVzdEh0bWxGaSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgrK2NudCA9PSAyMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5UaHJlYWRpbmcuVGhyZWFkLlNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJpbmcgdXNlZEF1dGhvckNzcyA9IEh0bWxUb1dtbENvbnZlcnRlci5DbGVhblVwQ3NzKChzdHJpbmcpaHRtbC5EZXNjZW5kYW50cygpLkZpcnN0T3JEZWZhdWx0KGQgPT4gZC5OYW1lLkxvY2FsTmFtZS5Ub0xvd2VyKCkgPT0gInN0eWxlIikpOworICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoZGVzdENzc0ZpLkZ1bGxOYW1lLCB1c2VkQXV0aG9yQ3NzKTsKKworICAgICAgICAgICAgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MgPSBIdG1sVG9XbWxDb252ZXJ0ZXIuR2V0RGVmYXVsdFNldHRpbmdzKCk7CisgICAgICAgICAgICAvLyBpbWFnZSByZWZlcmVuY2VzIGluIEhUTUwgZmlsZXMgY29udGFpbiB0aGUgcGF0aCB0byB0aGUgc3ViZGlyIHRoYXQgY29udGFpbnMgdGhlIGltYWdlcywgc28gYmFzZSBVUkkgaXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeQorICAgICAgICAgICAgLy8gdGhhdCBjb250YWlucyB0aGUgSFRNTCBmaWxlcworICAgICAgICAgICAgc2V0dGluZ3MuQmFzZVVyaUZvckltYWdlcyA9IFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgV21sRG9jdW1lbnQgZG9jID0gSHRtbFRvV21sQ29udmVydGVyLkNvbnZlcnRIdG1sVG9XbWwoCisgICAgICAgICAgICAgICAgZGVmYXVsdENzcywKKyAgICAgICAgICAgICAgICB1c2VkQXV0aG9yQ3NzLAorICAgICAgICAgICAgICAgIHVzZXJDc3MsCisgICAgICAgICAgICAgICAgaHRtbCwKKyAgICAgICAgICAgICAgICBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICBudWxsLCAgLy8gdXNlIHRoZSBkZWZhdWx0IEVtcHR5RG9jdW1lbnQKKyAgICAgICAgICAgICAgICBzX1Byb2R1Y2VBbm5vdGF0ZWRIdG1sID8gYW5ub3RhdGVkSHRtbEZpLkZ1bGxOYW1lIDogbnVsbCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Ob3ROdWxsKGRvYyk7CisKKyAgICAgICAgICAgIGlmIChkb2MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBTYXZlVmFsaWRhdGVBbmRGb3JtYXRNYWluRG9jUGFydChkZXN0RG9jeEZpLCBkb2MpOworCisjaWYgRE9fQ09OVkVSU0lPTl9WSUFfV09SRAorICAgICAgICAgICAgdmFyIG5ld0FsdENodW5rQmVmb3JlRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIG5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLTUtQWx0Q2h1bmtCZWZvcmUuZG9jeCIpKSk7CisgICAgICAgICAgICB2YXIgbmV3QWx0Q2h1bmtBZnRlckZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBuYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi02LUNvbnZlcnRlZFZpYVdvcmQuZG9jeCIpKSk7CisgICAgICAgICAgICBXb3JkQXV0b21hdGlvblV0aWxpdGllcy5Eb0NvbnZlcnNpb25WaWFXb3JkKG5ld0FsdENodW5rQmVmb3JlRmksIG5ld0FsdENodW5rQWZ0ZXJGaSwgaHRtbCk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIFtUaGVvcnldCisgICAgICAgIFtJbmxpbmVEYXRhKCJUMDAxNS5odG1sIildCisgICAgICAgIHB1YmxpYyB2b2lkIEhXMDAzKHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgdGVzdERvY1ByZWZpeCA9ICJIVzAwM18iOworICAgICAgICAgICAgdmFyIHNvdXJjZUh0bWxGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lKSk7CisKKyAgICAgICAgICAgIHZhciBzb3VyY2VDb3BpZWRUb0Rlc3RIdG1sRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsICh0ZXN0RG9jUHJlZml4ICsgc291cmNlSHRtbEZpLk5hbWUpLlJlcGxhY2UoIi5odG1sIiwgIi0xLVNvdXJjZS5odG1sIikpKTsKKyAgICAgICAgICAgIHZhciBkZXN0Q3NzRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsICh0ZXN0RG9jUHJlZml4ICsgc291cmNlSHRtbEZpLk5hbWUpLlJlcGxhY2UoIi5odG1sIiwgIi0yLmNzcyIpKSk7CisgICAgICAgICAgICB2YXIgZGVzdERvY3hGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgKHRlc3REb2NQcmVmaXggKyBzb3VyY2VIdG1sRmkuTmFtZSkuUmVwbGFjZSgiLmh0bWwiLCAiLTMtQ29udmVydGVkQnlIdG1sVG9XbWwuZG9jeCIpKSk7CisgICAgICAgICAgICB2YXIgYW5ub3RhdGVkSHRtbEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCAodGVzdERvY1ByZWZpeCArIHNvdXJjZUh0bWxGaS5OYW1lKS5SZXBsYWNlKCIuaHRtbCIsICItNC1Bbm5vdGF0ZWQudHh0IikpKTsKKworICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZUh0bWxGaS5GdWxsTmFtZSwgc291cmNlQ29waWVkVG9EZXN0SHRtbEZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGh0bWwgPSBIdG1sVG9XbWxSZWFkQXNYRWxlbWVudC5SZWFkQXNYRWxlbWVudChzb3VyY2VDb3BpZWRUb0Rlc3RIdG1sRmkpOworCisgICAgICAgICAgICBzdHJpbmcgdXNlZEF1dGhvckNzcyA9IEh0bWxUb1dtbENvbnZlcnRlci5DbGVhblVwQ3NzKChzdHJpbmcpaHRtbC5EZXNjZW5kYW50cygpLkZpcnN0T3JEZWZhdWx0KGQgPT4gZC5OYW1lLkxvY2FsTmFtZS5Ub0xvd2VyKCkgPT0gInN0eWxlIikpOworICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoZGVzdENzc0ZpLkZ1bGxOYW1lLCB1c2VkQXV0aG9yQ3NzKTsKKworICAgICAgICAgICAgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MgPSBIdG1sVG9XbWxDb252ZXJ0ZXIuR2V0RGVmYXVsdFNldHRpbmdzKCk7CisgICAgICAgICAgICBzZXR0aW5ncy5CYXNlVXJpRm9ySW1hZ2VzID0gUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUpOworICAgICAgICAgICAgc2V0dGluZ3MuRGVmYXVsdEJsb2NrQ29udGVudE1hcmdpbiA9ICIzNnB0IjsKKworICAgICAgICAgICAgV21sRG9jdW1lbnQgZG9jID0gSHRtbFRvV21sQ29udmVydGVyLkNvbnZlcnRIdG1sVG9XbWwoZGVmYXVsdENzcywgdXNlZEF1dGhvckNzcywgdXNlckNzcywgaHRtbCwgc2V0dGluZ3MsIG51bGwsIHNfUHJvZHVjZUFubm90YXRlZEh0bWwgPyBhbm5vdGF0ZWRIdG1sRmkuRnVsbE5hbWUgOiBudWxsKTsKKyAgICAgICAgICAgIEFzc2VydC5Ob3ROdWxsKGRvYyk7CisgICAgICAgICAgICBpZiAoZG9jICE9IG51bGwpCisgICAgICAgICAgICAgICAgU2F2ZVZhbGlkYXRlQW5kRm9ybWF0TWFpbkRvY1BhcnQoZGVzdERvY3hGaSwgZG9jKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUaGVvcnldCisgICAgICAgIFtJbmxpbmVEYXRhKCJIVzAxMC1TeW1ib2xzMDEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSFcwMTAtU3ltYm9sczAyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhXMDEwLVRhYmxlV2l0aEVtcHR5Um93cy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIVzAxMC1UYWJsZVdpdGhUaHJlZUVtcHR5Um93cy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIVzAxMC1UYWJsZVdpdGhJbWFnZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIVzAxMC1TcGFuV2l0aFNpbmdsZVNwYWNlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhXMDEwLVRhYjAxLmRvY3giKV0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIEhXMDEwKHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc291cmNlRG9jeEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUpKTsKKworICAgICAgICAgICAgdmFyIHNvdXJjZUNvcGllZFRvRGVzdERvY3hGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgbmFtZS5SZXBsYWNlKCIuZG9jeCIsICItMi1Tb3VyY2UuZG9jeCIpKSk7CisgICAgICAgICAgICB2YXIgc291cmNlQ29waWVkVG9EZXN0SHRtbEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBuYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi0yLVNvdXJjZS5odG1sIikpKTsKKyAgICAgICAgICAgIHZhciBkZXN0Q3NzRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIG5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLTMuY3NzIikpKTsKKyAgICAgICAgICAgIHZhciBkZXN0RG9jeEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBuYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi00LUNvbnZlcnRlZEJ5SHRtbFRvV21sLmRvY3giKSkpOworICAgICAgICAgICAgdmFyIGFubm90YXRlZEh0bWxGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgbmFtZS5SZXBsYWNlKCIuZG9jeCIsICItNS1Bbm5vdGF0ZWQudHh0IikpKTsKKworICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZURvY3hGaS5GdWxsTmFtZSwgc291cmNlQ29waWVkVG9EZXN0RG9jeEZpLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgU2F2ZUFzSHRtbFVzaW5nSHRtbENvbnZlcnRlcihzb3VyY2VDb3BpZWRUb0Rlc3REb2N4RmkuRnVsbE5hbWUsIHNvdXJjZUNvcGllZFRvRGVzdERvY3hGaS5EaXJlY3RvcnlOYW1lKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGh0bWwgPSBIdG1sVG9XbWxSZWFkQXNYRWxlbWVudC5SZWFkQXNYRWxlbWVudChzb3VyY2VDb3BpZWRUb0Rlc3RIdG1sRmkpOworCisgICAgICAgICAgICBzdHJpbmcgdXNlZEF1dGhvckNzcyA9IEh0bWxUb1dtbENvbnZlcnRlci5DbGVhblVwQ3NzKChzdHJpbmcpaHRtbC5EZXNjZW5kYW50cygpLkZpcnN0T3JEZWZhdWx0KGQgPT4gZC5OYW1lLkxvY2FsTmFtZS5Ub0xvd2VyKCkgPT0gInN0eWxlIikpOworICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoZGVzdENzc0ZpLkZ1bGxOYW1lLCB1c2VkQXV0aG9yQ3NzKTsKKworICAgICAgICAgICAgdmFyIHNldHRpbmdzV21sRG9jdW1lbnQgPSBuZXcgV21sRG9jdW1lbnQoc291cmNlQ29waWVkVG9EZXN0RG9jeEZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzID0gSHRtbFRvV21sQ29udmVydGVyLkdldERlZmF1bHRTZXR0aW5ncyhzZXR0aW5nc1dtbERvY3VtZW50KTsKKyAgICAgICAgICAgIC8vIGltYWdlIHJlZmVyZW5jZXMgaW4gSFRNTCBmaWxlcyBjb250YWluIHRoZSBwYXRoIHRvIHRoZSBzdWJkaXIgdGhhdCBjb250YWlucyB0aGUgaW1hZ2VzLCBzbyBiYXNlIFVSSSBpcyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisgICAgICAgICAgICAvLyB0aGF0IGNvbnRhaW5zIHRoZSBIVE1MIGZpbGVzCisgICAgICAgICAgICBzZXR0aW5ncy5CYXNlVXJpRm9ySW1hZ2VzID0gUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCBkb2MgPSBIdG1sVG9XbWxDb252ZXJ0ZXIuQ29udmVydEh0bWxUb1dtbCgKKyAgICAgICAgICAgICAgICBkZWZhdWx0Q3NzLAorICAgICAgICAgICAgICAgIHVzZWRBdXRob3JDc3MsCisgICAgICAgICAgICAgICAgdXNlckNzcywKKyAgICAgICAgICAgICAgICBodG1sLAorICAgICAgICAgICAgICAgIHNldHRpbmdzLAorICAgICAgICAgICAgICAgIG51bGwsICAvLyB1c2UgdGhlIGRlZmF1bHQgRW1wdHlEb2N1bWVudAorICAgICAgICAgICAgICAgIHNfUHJvZHVjZUFubm90YXRlZEh0bWwgPyBhbm5vdGF0ZWRIdG1sRmkuRnVsbE5hbWUgOiBudWxsKTsKKworICAgICAgICAgICAgQXNzZXJ0Lk5vdE51bGwoZG9jKTsKKworICAgICAgICAgICAgaWYgKGRvYyAhPSBudWxsKQorICAgICAgICAgICAgICAgIFNhdmVWYWxpZGF0ZUFuZEZvcm1hdE1haW5Eb2NQYXJ0KGRlc3REb2N4RmksIGRvYyk7CisKKyNpZiBET19DT05WRVJTSU9OX1ZJQV9XT1JECisgICAgICAgICAgICB2YXIgbmV3QWx0Q2h1bmtCZWZvcmVGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgbmFtZS5SZXBsYWNlKCIuZG9jeCIsICItNS1BbHRDaHVua0JlZm9yZS5kb2N4IikpKTsKKyAgICAgICAgICAgIHZhciBuZXdBbHRDaHVua0FmdGVyRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIG5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLTYtQ29udmVydGVkVmlhV29yZC5kb2N4IikpKTsKKyAgICAgICAgICAgIFdvcmRBdXRvbWF0aW9uVXRpbGl0aWVzLkRvQ29udmVyc2lvblZpYVdvcmQobmV3QWx0Q2h1bmtCZWZvcmVGaSwgbmV3QWx0Q2h1bmtBZnRlckZpLCBodG1sKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBTYXZlQXNIdG1sVXNpbmdIdG1sQ29udmVydGVyKHN0cmluZyBmaWxlLCBzdHJpbmcgb3V0cHV0RGlyZWN0b3J5KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmkgPSBuZXcgRmlsZUluZm8oZmlsZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShmaS5OYW1lKTsKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlQXJyYXkgPSBGaWxlLlJlYWRBbGxCeXRlcyhmaS5GdWxsTmFtZSk7CisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1lbW9yeVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZW1vcnlTdHJlYW0uV3JpdGUoYnl0ZUFycmF5LCAwLCBieXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1lbW9yeVN0cmVhbSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZGVzdEZpbGVOYW1lID0gbmV3IEZpbGVJbmZvKGZpLk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLmh0bWwiKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXREaXJlY3RvcnkgIT0gbnVsbCAmJiBvdXRwdXREaXJlY3RvcnkgIT0gc3RyaW5nLkVtcHR5KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnlJbmZvIGRpID0gbmV3IERpcmVjdG9yeUluZm8ob3V0cHV0RGlyZWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGkuRXhpc3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiT3V0cHV0IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdEZpbGVOYW1lID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShkaS5GdWxsTmFtZSwgZGVzdEZpbGVOYW1lLk5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgaW1hZ2VEaXJlY3RvcnlOYW1lID0gZGVzdEZpbGVOYW1lLkZ1bGxOYW1lLlN1YnN0cmluZygwLCBkZXN0RmlsZU5hbWUuRnVsbE5hbWUuTGVuZ3RoIC0gNSkgKyAiX2ZpbGVzIjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlQ291bnRlciA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2VUaXRsZSA9IGZpLkZ1bGxOYW1lOworICAgICAgICAgICAgICAgICAgICB2YXIgcGFydCA9IHdEb2MuQ29yZUZpbGVQcm9wZXJ0aWVzUGFydDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlID0gKHN0cmluZylwYXJ0LkdldFhEb2N1bWVudCgpLkRlc2NlbmRhbnRzKERDLnRpdGxlKS5GaXJzdE9yRGVmYXVsdCgpID8/IGZpLkZ1bGxOYW1lOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogRGV0ZXJtaW5lIG1heC13aWR0aCBmcm9tIHNpemUgb2YgY29udGVudCBhcmVhLgorICAgICAgICAgICAgICAgICAgICBIdG1sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgSHRtbENvbnZlcnRlclNldHRpbmdzKCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbENzcyA9ICJib2R5IHsgbWFyZ2luOiAxY20gYXV0bzsgbWF4LXdpZHRoOiAyMGNtOyBwYWRkaW5nOiAwOyB9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VUaXRsZSA9IHBhZ2VUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhYnJpY2F0ZUNzc0NsYXNzZXMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3NQcmVmaXggPSAicHQtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RyaWN0VG9TdXBwb3J0ZWRMYW5ndWFnZXMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RyaWN0VG9TdXBwb3J0ZWROdW1iZXJpbmdGb3JtYXRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUhhbmRsZXIgPSBpbWFnZUluZm8gPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnlJbmZvIGxvY2FsRGlySW5mbyA9IG5ldyBEaXJlY3RvcnlJbmZvKGltYWdlRGlyZWN0b3J5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2NhbERpckluZm8uRXhpc3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERpckluZm8uQ3JlYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpbWFnZUNvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGV4dGVuc2lvbiA9IGltYWdlSW5mby5Db250ZW50VHlwZS5TcGxpdCgnLycpWzFdLlRvTG93ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUZvcm1hdCBpbWFnZUZvcm1hdCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSAicG5nIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGb3JtYXQgPSBJbWFnZUZvcm1hdC5Qbmc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJnaWYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkdpZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gImJtcCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuQm1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dGVuc2lvbiA9PSAianBlZyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuSnBlZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gInRpZmYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCB0aWZmIHRvIGdpZi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gImdpZiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuR2lmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gIngtd21mIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9ICJ3bWYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LldtZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaW1hZ2UgZm9ybWF0IGlzbid0IG9uZSB0aGF0IHdlIGV4cGVjdCwgaWdub3JlIGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkb24ndCByZXR1cm4gbWFya3VwIGZvciB0aGUgbGluay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2VGb3JtYXQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW1hZ2VGaWxlTmFtZSA9IGltYWdlRGlyZWN0b3J5TmFtZSArICIvaW1hZ2UiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb3VudGVyLlRvU3RyaW5nKCkgKyAiLiIgKyBleHRlbnNpb247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uQml0bWFwLlNhdmUoaW1hZ2VGaWxlTmFtZSwgaW1hZ2VGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkV4dGVybmFsRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbWFnZVNvdXJjZSA9IGxvY2FsRGlySW5mby5OYW1lICsgIi9pbWFnZSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUNvdW50ZXIuVG9TdHJpbmcoKSArICIuIiArIGV4dGVuc2lvbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGltZyA9IG5ldyBYRWxlbWVudChYaHRtbC5pbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnNyYywgaW1hZ2VTb3VyY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uSW1nU3R5bGVBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5BbHRUZXh0ICE9IG51bGwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYWx0LCBpbWFnZUluZm8uQWx0VGV4dCkgOiBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1nOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBodG1sRWxlbWVudCA9IEh0bWxDb252ZXJ0ZXIuQ29udmVydFRvSHRtbCh3RG9jLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUHJvZHVjZSBIVE1MIGRvY3VtZW50IHdpdGggPCFET0NUWVBFIGh0bWwgPiBkZWNsYXJhdGlvbiB0byB0ZWxsIHRoZSBicm93c2VyCisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSB1c2luZyBIVE1MNS4KKyAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSBuZXcgWERvY3VtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhEb2N1bWVudFR5cGUoImh0bWwiLCBudWxsLCBudWxsLCBudWxsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxFbGVtZW50KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiB0aGUgeGh0bWwgcmV0dXJuZWQgYnkgQ29udmVydFRvSHRtbFRyYW5zZm9ybSBjb250YWlucyBvYmplY3RzIG9mIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgLy8gWEVudGl0eS4gIFB0T3BlblhtbFV0aWwuY3MgZGVmaW5lIHRoZSBYRW50aXR5IGNsYXNzLiAgU2VlCisgICAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9lcmljd2hpdGUvYXJjaGl2ZS8yMDEwLzAxLzIxL3dyaXRpbmctZW50aXR5LXJlZmVyZW5jZXMtdXNpbmctbGlucS10by14bWwuYXNweAorICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24uCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHlvdSBmdXJ0aGVyIHRyYW5zZm9ybSB0aGUgWE1MIHRyZWUgcmV0dXJuZWQgYnkgQ29udmVydFRvSHRtbFRyYW5zZm9ybSwgeW91CisgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgZG8gaXQgY29ycmVjdGx5LCBvciBlbnRpdGllcyB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHByb3Blcmx5LgorCisgICAgICAgICAgICAgICAgICAgIHZhciBodG1sU3RyaW5nID0gaHRtbC5Ub1N0cmluZyhTYXZlT3B0aW9ucy5EaXNhYmxlRm9ybWF0dGluZyk7CisgICAgICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KGRlc3RGaWxlTmFtZS5GdWxsTmFtZSwgaHRtbFN0cmluZywgRW5jb2RpbmcuVVRGOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBTYXZlVmFsaWRhdGVBbmRGb3JtYXRNYWluRG9jUGFydChGaWxlSW5mbyBkZXN0RG9jeEZpLCBXbWxEb2N1bWVudCBkb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IGZvcm1hdHRlZERvYzsKKworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtcy5Xcml0ZShkb2MuRG9jdW1lbnRCeXRlQXJyYXksIDAsIGRvYy5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvY3VtZW50ID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1zLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhEb2N1bWVudCB4RG9jID0gZG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5QdXRYRG9jdW1lbnRXaXRoRm9ybWF0dGluZygpOworICAgICAgICAgICAgICAgICAgICBPcGVuWG1sVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBPcGVuWG1sVmFsaWRhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBlcnJvcnMgPSB2YWxpZGF0b3IuVmFsaWRhdGUoZG9jdW1lbnQpOworICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JzU3RyaW5nID0gZXJyb3JzCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGUgPT4gZS5EZXNjcmlwdGlvbiArIEVudmlyb25tZW50Lk5ld0xpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBBc3NlcnQgdGhhdCB0aGVyZSB3ZXJlIG5vIGVycm9ycyBpbiB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50LgorICAgICAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoIiIsIGVycm9yc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvcm1hdHRlZERvYyA9IG5ldyBXbWxEb2N1bWVudChkZXN0RG9jeEZpLkZ1bGxOYW1lLCBtcy5Ub0FycmF5KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9ybWF0dGVkRG9jLlNhdmVBcyhkZXN0RG9jeEZpLkZ1bGxOYW1lKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICAgICogZGlzcGxheSBwcm9wZXJ0eToKKyAgICAgICAgICAgICogLSBpbmxpbmUKKyAgICAgICAgICAgICogLSBibG9jaworICAgICAgICAgICAgKiAtIGxpc3QtaXRlbQorICAgICAgICAgICAgKiAtIGlubGluZS1ibG9jaworICAgICAgICAgICAgKiAtIHRhYmxlCisgICAgICAgICAgICAqIC0gaW5saW5lLXRhYmxlCisgICAgICAgICAgICAqIC0gdGFibGUtcm93LWdyb3VwCisgICAgICAgICAgICAqIC0gdGFibGUtaGVhZGVyLWdyb3VwCisgICAgICAgICAgICAqIC0gdGFibGUtZm9vdGVyLWdyb3VwCisgICAgICAgICAgICAqIC0gdGFibGUtcm93CisgICAgICAgICAgICAqIC0gdGFibGUtY29sdW1uLWdyb3VwCisgICAgICAgICAgICAqIC0gdGFibGUtY29sdW1uCisgICAgICAgICAgICAqIC0gdGFibGUtY2VsbAorICAgICAgICAgICAgKiAtIHRhYmxlLWNhcHRpb24KKyAgICAgICAgICAgICogLSBub25lCisgICAgICAgICAgICAqIC0gaW5oZXJpdAorICAgICAgICAgICAgKiAKKyAgICAgICAgICAgICogcG9zaXRpb24gcHJvcGVydHk6CisgICAgICAgICAgICAqIC0gc3RhdGljCisgICAgICAgICAgICAqIC0gcmVsYXRpdmUKKyAgICAgICAgICAgICogLSBhYnNvbHV0ZQorICAgICAgICAgICAgKiAtIGZpeGVkCisgICAgICAgICAgICAqIC0gaW5oZXJpdAorICAgICAgICAgICAgKiAKKyAgICAgICAgICAgICogdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0IHByb3BlcnRpZXM6CisgICAgICAgICAgICAqIChvbmx5IGFwcGx5IGlmIHBvc2l0aW9uIHByb3BlcnR5IGlzIG5vdCBzdGF0aWMpCisgICAgICAgICovCisKKyAgICAgICAgc3RhdGljIHN0cmluZyBkZWZhdWx0Q3NzID0KKyAgICAgICAgICAgIEAiaHRtbCwgYWRkcmVzcywKK2Jsb2NrcXVvdGUsCitib2R5LCBkZCwgZGl2LAorZGwsIGR0LCBmaWVsZHNldCwgZm9ybSwKK2ZyYW1lLCBmcmFtZXNldCwKK2gxLCBoMiwgaDMsIGg0LAoraDUsIGg2LCBub2ZyYW1lcywKK29sLCBwLCB1bCwgY2VudGVyLAorZGlyLCBociwgbWVudSwgcHJlIHsgZGlzcGxheTogYmxvY2s7IHVuaWNvZGUtYmlkaTogZW1iZWQgfQorbGkgeyBkaXNwbGF5OiBsaXN0LWl0ZW0gfQoraGVhZCB7IGRpc3BsYXk6IG5vbmUgfQordGFibGUgeyBkaXNwbGF5OiB0YWJsZSB9Cit0ciB7IGRpc3BsYXk6IHRhYmxlLXJvdyB9Cit0aGVhZCB7IGRpc3BsYXk6IHRhYmxlLWhlYWRlci1ncm91cCB9Cit0Ym9keSB7IGRpc3BsYXk6IHRhYmxlLXJvdy1ncm91cCB9Cit0Zm9vdCB7IGRpc3BsYXk6IHRhYmxlLWZvb3Rlci1ncm91cCB9Citjb2wgeyBkaXNwbGF5OiB0YWJsZS1jb2x1bW4gfQorY29sZ3JvdXAgeyBkaXNwbGF5OiB0YWJsZS1jb2x1bW4tZ3JvdXAgfQordGQsIHRoIHsgZGlzcGxheTogdGFibGUtY2VsbCB9CitjYXB0aW9uIHsgZGlzcGxheTogdGFibGUtY2FwdGlvbiB9Cit0aCB7IGZvbnQtd2VpZ2h0OiBib2xkZXI7IHRleHQtYWxpZ246IGNlbnRlciB9CitjYXB0aW9uIHsgdGV4dC1hbGlnbjogY2VudGVyIH0KK2JvZHkgeyBtYXJnaW46IGF1dG87IH0KK2gxIHsgZm9udC1zaXplOiAyZW07IG1hcmdpbjogYXV0bzsgfQoraDIgeyBmb250LXNpemU6IDEuNWVtOyBtYXJnaW46IGF1dG87IH0KK2gzIHsgZm9udC1zaXplOiAxLjE3ZW07IG1hcmdpbjogYXV0bzsgfQoraDQsIHAsCitibG9ja3F1b3RlLCB1bCwKK2ZpZWxkc2V0LCBmb3JtLAorb2wsIGRsLCBkaXIsCittZW51IHsgbWFyZ2luOiBhdXRvIH0KK2EgeyBjb2xvcjogYmx1ZTsgfQoraDUgeyBmb250LXNpemU6IC44M2VtOyBtYXJnaW46IGF1dG8gfQoraDYgeyBmb250LXNpemU6IC43NWVtOyBtYXJnaW46IGF1dG8gfQoraDEsIGgyLCBoMywgaDQsCitoNSwgaDYsIGIsCitzdHJvbmcgeyBmb250LXdlaWdodDogYm9sZGVyIH0KK2Jsb2NrcXVvdGUgeyBtYXJnaW4tbGVmdDogNDBweDsgbWFyZ2luLXJpZ2h0OiA0MHB4IH0KK2ksIGNpdGUsIGVtLAordmFyLCBhZGRyZXNzIHsgZm9udC1zdHlsZTogaXRhbGljIH0KK3ByZSwgdHQsIGNvZGUsCitrYmQsIHNhbXAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlIH0KK3ByZSB7IHdoaXRlLXNwYWNlOiBwcmUgfQorYnV0dG9uLCB0ZXh0YXJlYSwKK2lucHV0LCBzZWxlY3QgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgfQorYmlnIHsgZm9udC1zaXplOiAxLjE3ZW0gfQorc21hbGwsIHN1Yiwgc3VwIHsgZm9udC1zaXplOiAuODNlbSB9CitzdWIgeyB2ZXJ0aWNhbC1hbGlnbjogc3ViIH0KK3N1cCB7IHZlcnRpY2FsLWFsaWduOiBzdXBlciB9Cit0YWJsZSB7IGJvcmRlci1zcGFjaW5nOiAycHg7IH0KK3RoZWFkLCB0Ym9keSwKK3Rmb290IHsgdmVydGljYWwtYWxpZ246IG1pZGRsZSB9Cit0ZCwgdGgsIHRyIHsgdmVydGljYWwtYWxpZ246IGluaGVyaXQgfQorcywgc3RyaWtlLCBkZWwgeyB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaCB9CitociB7IGJvcmRlcjogMXB4IGluc2V0IH0KK29sLCB1bCwgZGlyLAorbWVudSwgZGQgeyBtYXJnaW4tbGVmdDogNDBweCB9CitvbCB7IGxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbCB9CitvbCB1bCwgdWwgb2wsCit1bCB1bCwgb2wgb2wgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwIH0KK3UsIGlucyB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIH0KK2JyOmJlZm9yZSB7IGNvbnRlbnQ6ICIiXEEiIjsgd2hpdGUtc3BhY2U6IHByZS1saW5lIH0KK2NlbnRlciB7IHRleHQtYWxpZ246IGNlbnRlciB9Cis6bGluaywgOnZpc2l0ZWQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSB9Cis6Zm9jdXMgeyBvdXRsaW5lOiB0aGluIGRvdHRlZCBpbnZlcnQgfQorLyogQmVnaW4gYmlkaXJlY3Rpb25hbGl0eSBzZXR0aW5ncyAoZG8gbm90IGNoYW5nZSkgKi8KK0JET1tESVI9IiJsdHIiIl0geyBkaXJlY3Rpb246IGx0cjsgdW5pY29kZS1iaWRpOiBiaWRpLW92ZXJyaWRlIH0KK0JET1tESVI9IiJydGwiIl0geyBkaXJlY3Rpb246IHJ0bDsgdW5pY29kZS1iaWRpOiBiaWRpLW92ZXJyaWRlIH0KKypbRElSPSIibHRyIiJdIHsgZGlyZWN0aW9uOiBsdHI7IHVuaWNvZGUtYmlkaTogZW1iZWQgfQorKltESVI9IiJydGwiIl0geyBkaXJlY3Rpb246IHJ0bDsgdW5pY29kZS1iaWRpOiBlbWJlZCB9CisKKyI7CisKKyAgICAgICAgLy8gb3JpZ2luYWwgZGVmYXVsdENzcworICAgICAgICAvLyAgICBzdGF0aWMgc3RyaW5nIGRlZmF1bHRDc3MgPQorICAgICAgICAvLyAgICAgICAgQCJodG1sLCBhZGRyZXNzLAorICAgICAgICAvL2Jsb2NrcXVvdGUsCisgICAgICAgIC8vYm9keSwgZGQsIGRpdiwKKyAgICAgICAgLy9kbCwgZHQsIGZpZWxkc2V0LCBmb3JtLAorICAgICAgICAvL2ZyYW1lLCBmcmFtZXNldCwKKyAgICAgICAgLy9oMSwgaDIsIGgzLCBoNCwKKyAgICAgICAgLy9oNSwgaDYsIG5vZnJhbWVzLAorICAgICAgICAvL29sLCBwLCB1bCwgY2VudGVyLAorICAgICAgICAvL2RpciwgaHIsIG1lbnUsIHByZSB7IGRpc3BsYXk6IGJsb2NrOyB1bmljb2RlLWJpZGk6IGVtYmVkIH0KKyAgICAgICAgLy9saSB7IGRpc3BsYXk6IGxpc3QtaXRlbSB9CisgICAgICAgIC8vaGVhZCB7IGRpc3BsYXk6IG5vbmUgfQorICAgICAgICAvL3RhYmxlIHsgZGlzcGxheTogdGFibGUgfQorICAgICAgICAvL3RyIHsgZGlzcGxheTogdGFibGUtcm93IH0KKyAgICAgICAgLy90aGVhZCB7IGRpc3BsYXk6IHRhYmxlLWhlYWRlci1ncm91cCB9CisgICAgICAgIC8vdGJvZHkgeyBkaXNwbGF5OiB0YWJsZS1yb3ctZ3JvdXAgfQorICAgICAgICAvL3Rmb290IHsgZGlzcGxheTogdGFibGUtZm9vdGVyLWdyb3VwIH0KKyAgICAgICAgLy9jb2wgeyBkaXNwbGF5OiB0YWJsZS1jb2x1bW4gfQorICAgICAgICAvL2NvbGdyb3VwIHsgZGlzcGxheTogdGFibGUtY29sdW1uLWdyb3VwIH0KKyAgICAgICAgLy90ZCwgdGggeyBkaXNwbGF5OiB0YWJsZS1jZWxsIH0KKyAgICAgICAgLy9jYXB0aW9uIHsgZGlzcGxheTogdGFibGUtY2FwdGlvbiB9CisgICAgICAgIC8vdGggeyBmb250LXdlaWdodDogYm9sZGVyOyB0ZXh0LWFsaWduOiBjZW50ZXIgfQorICAgICAgICAvL2NhcHRpb24geyB0ZXh0LWFsaWduOiBjZW50ZXIgfQorICAgICAgICAvL2JvZHkgeyBtYXJnaW46IDhweDsgfQorICAgICAgICAvL2gxIHsgZm9udC1zaXplOiAyZW07IG1hcmdpbjogLjY3ZW0gMGVtOyB9CisgICAgICAgIC8vaDIgeyBmb250LXNpemU6IDEuNWVtOyBtYXJnaW46IC43NWVtIDBlbTsgfQorICAgICAgICAvL2gzIHsgZm9udC1zaXplOiAxLjE3ZW07IG1hcmdpbjogLjgzZW0gMGVtOyB9CisgICAgICAgIC8vaDQsIHAsCisgICAgICAgIC8vYmxvY2txdW90ZSwgdWwsCisgICAgICAgIC8vZmllbGRzZXQsIGZvcm0sCisgICAgICAgIC8vb2wsIGRsLCBkaXIsCisgICAgICAgIC8vbWVudSB7IG1hcmdpbjogMS4xMmVtIDAgfQorICAgICAgICAvL2EgeyBjb2xvcjogYmx1ZTsgfQorICAgICAgICAvL2g1IHsgZm9udC1zaXplOiAuODNlbTsgbWFyZ2luOiAxLjVlbSAwIH0KKyAgICAgICAgLy9oNiB7IGZvbnQtc2l6ZTogLjc1ZW07IG1hcmdpbjogMS42N2VtIDAgfQorICAgICAgICAvL2gxLCBoMiwgaDMsIGg0LAorICAgICAgICAvL2g1LCBoNiwgYiwKKyAgICAgICAgLy9zdHJvbmcgeyBmb250LXdlaWdodDogYm9sZGVyIH0KKyAgICAgICAgLy9ibG9ja3F1b3RlIHsgbWFyZ2luLWxlZnQ6IDQwcHg7IG1hcmdpbi1yaWdodDogNDBweCB9CisgICAgICAgIC8vaSwgY2l0ZSwgZW0sCisgICAgICAgIC8vdmFyLCBhZGRyZXNzIHsgZm9udC1zdHlsZTogaXRhbGljIH0KKyAgICAgICAgLy9wcmUsIHR0LCBjb2RlLAorICAgICAgICAvL2tiZCwgc2FtcCB7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2UgfQorICAgICAgICAvL3ByZSB7IHdoaXRlLXNwYWNlOiBwcmUgfQorICAgICAgICAvL2J1dHRvbiwgdGV4dGFyZWEsCisgICAgICAgIC8vaW5wdXQsIHNlbGVjdCB7IGRpc3BsYXk6IGlubGluZS1ibG9jayB9CisgICAgICAgIC8vYmlnIHsgZm9udC1zaXplOiAxLjE3ZW0gfQorICAgICAgICAvL3NtYWxsLCBzdWIsIHN1cCB7IGZvbnQtc2l6ZTogLjgzZW0gfQorICAgICAgICAvL3N1YiB7IHZlcnRpY2FsLWFsaWduOiBzdWIgfQorICAgICAgICAvL3N1cCB7IHZlcnRpY2FsLWFsaWduOiBzdXBlciB9CisgICAgICAgIC8vdGFibGUgeyBib3JkZXItc3BhY2luZzogMnB4OyB9CisgICAgICAgIC8vdGhlYWQsIHRib2R5LAorICAgICAgICAvL3Rmb290IHsgdmVydGljYWwtYWxpZ246IG1pZGRsZSB9CisgICAgICAgIC8vdGQsIHRoLCB0ciB7IHZlcnRpY2FsLWFsaWduOiBpbmhlcml0IH0KKyAgICAgICAgLy9zLCBzdHJpa2UsIGRlbCB7IHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoIH0KKyAgICAgICAgLy9ociB7IGJvcmRlcjogMXB4IGluc2V0IH0KKyAgICAgICAgLy9vbCwgdWwsIGRpciwKKyAgICAgICAgLy9tZW51LCBkZCB7IG1hcmdpbi1sZWZ0OiA0MHB4IH0KKyAgICAgICAgLy9vbCB7IGxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbCB9CisgICAgICAgIC8vb2wgdWwsIHVsIG9sLAorICAgICAgICAvL3VsIHVsLCBvbCBvbCB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDAgfQorICAgICAgICAvL3UsIGlucyB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIH0KKyAgICAgICAgLy9icjpiZWZvcmUgeyBjb250ZW50OiAiIlxBIiI7IHdoaXRlLXNwYWNlOiBwcmUtbGluZSB9CisgICAgICAgIC8vY2VudGVyIHsgdGV4dC1hbGlnbjogY2VudGVyIH0KKyAgICAgICAgLy86bGluaywgOnZpc2l0ZWQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSB9CisgICAgICAgIC8vOmZvY3VzIHsgb3V0bGluZTogdGhpbiBkb3R0ZWQgaW52ZXJ0IH0KKyAgICAgICAgLy8vKiBCZWdpbiBiaWRpcmVjdGlvbmFsaXR5IHNldHRpbmdzIChkbyBub3QgY2hhbmdlKSAqLworICAgICAgICAvL0JET1tESVI9IiJsdHIiIl0geyBkaXJlY3Rpb246IGx0cjsgdW5pY29kZS1iaWRpOiBiaWRpLW92ZXJyaWRlIH0KKyAgICAgICAgLy9CRE9bRElSPSIicnRsIiJdIHsgZGlyZWN0aW9uOiBydGw7IHVuaWNvZGUtYmlkaTogYmlkaS1vdmVycmlkZSB9CisgICAgICAgIC8vKltESVI9IiJsdHIiIl0geyBkaXJlY3Rpb246IGx0cjsgdW5pY29kZS1iaWRpOiBlbWJlZCB9CisgICAgICAgIC8vKltESVI9IiJydGwiIl0geyBkaXJlY3Rpb246IHJ0bDsgdW5pY29kZS1iaWRpOiBlbWJlZCB9IjsKKworICAgICAgICBzdGF0aWMgc3RyaW5nIHVzZXJDc3MgPSBAIiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMuT0EvTGlzdEl0ZW1SZXRyaWV2ZXJUZXN0cy5jcyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzLk9BL0xpc3RJdGVtUmV0cmlldmVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3ZmZmZQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzLk9BL0xpc3RJdGVtUmV0cmlldmVyVGVzdHMuY3MKQEAgLTAsMCArMSwyNzEgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uRHJhd2luZy5JbWFnaW5nOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgSHRtbEFnaWxpdHlQYWNrOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlZhbGlkYXRpb247Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKK3VzaW5nIFh1bml0OworCituYW1lc3BhY2UgT3hQdAoreworICAgIHB1YmxpYyBjbGFzcyBMaVRlc3RzCisgICAgeworCisgICAgICAgIC8vIFBvd2VyU2hlbGwgb25lbGluZXIgdGhhdCBnZW5lcmF0ZXMgSW5saW5lRGF0YSBmb3IgYWxsIGZpbGVzIGluIGEgZGlyZWN0b3J5CisgICAgICAgIC8vIGRpciB8ICUgeyAnW0lubGluZURhdGEoIicgKyAkXy5OYW1lICsgJyIpXScgfSB8IGNsaXAKKworICAgICAgICBbVGhlb3J5XQorICAgICAgICBbSW5saW5lRGF0YSgiTElSMDAxLWVuLVVTLW9yZGluYWwuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiTElSMDAyLWVuLVVTLW9yZGluYWxUZXh0LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkxJUjAwMy1lbi1VUy11cHBlckxldHRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJMSVIwMDQtZW4tVVMtdXBwZXJSb21hbi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJMSVIwMDUtZnItRlItY2FyZGluYWxUZXh0LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkxJUjAwNi1mci1GUi1vcmRpbmFsVGV4dC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJMSVIwMDYtZnItRlItb3JkaW5hbC5kb2N4IildCisgICAgICAgIC8vIFtJbmxpbmVEYXRhKCJMSVIwMDctcnUtUlUtb3JkaW5hbFRleHQuZG9jeCIpXSAgLy8gdG9kbyB0aGlzIGZhaWxzLCB0aGUgY29kZSBuZWVkcyB1cGRhdGVkLgorICAgICAgICBbSW5saW5lRGF0YSgiTElSMDA4LXpoLUNILWNoaW5lc2VDb3VudGluZ1Rob3VzYW5kLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkxJUjAwOS16aC1DTi1jaGluZXNlQ291bnRpbmcuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiTElSMDEwLXpoLUNOLWlkZW9ncmFwaFRyYWRpdGlvbmFsLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkxJUjAxMS1lbi1VUy0wMDAwMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJMSVIwMTItZW4tVVMtMDAwMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJMSVIwMTMtZW4tVVMtMDAxLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkxJUjAxNC1lbi1VUy0wMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJMSVIwMTUtZW4tVVMtY2FyZGluYWxUZXh0LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkxJUjAxNi1lbi1VUy1kZWNpbWFsLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkxJUjAxNy1lbi1VUy1kZWNpbWFsRW5jbG9zZWRDaXJjbGUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiTElSMDE4LWVuLVVTLWRlY2ltYWxaZXJvLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkxJUjAxOS1lbi1VUy1sb3dlckxldHRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJMSVIwMjAtZW4tVVMtbG93ZXJSb21hbi5kb2N4IildCisgICAgICAgIHB1YmxpYyB2b2lkIExJUjAwMShzdHJpbmcgZmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gbGlyRmlsZSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBmaWxlKSk7CisgICAgICAgICAgICBXbWxEb2N1bWVudCB3bWxEb2MgPSBuZXcgV21sRG9jdW1lbnQobGlyRmlsZS5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIHZhciB3b3JkSHRtbEZpbGUgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIGxpckZpbGUuTmFtZS5SZXBsYWNlKCIuZG9jeCIsICItV29yZC5odG1sIikpKTsKKyAgICAgICAgICAgIFdvcmRBdXRvbWF0aW9uVXRpbGl0aWVzLlNhdmVBc0h0bWxVc2luZ1dvcmQobGlyRmlsZSwgd29yZEh0bWxGaWxlKTsKKworICAgICAgICAgICAgdmFyIHB0SHRtbEZpbGUgPSBDb252ZXJ0VG9IdG1sKGxpckZpbGUuRnVsbE5hbWUsIFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUpOworICAgICAgICAgICAgdmFyIGZpUHRYbWwgPSBTYXZlSHRtbEFzWG1sKHB0SHRtbEZpbGUpOworCisgICAgICAgICAgICAvLyByZWFkIGFuZCB3cml0ZSB0byBnZXQgdGhlIEJPTSBvbiB0aGUgZmlsZQorICAgICAgICAgICAgdmFyIHdoID0gRmlsZS5SZWFkQWxsVGV4dCh3b3JkSHRtbEZpbGUuRnVsbE5hbWUsIEVuY29kaW5nLkRlZmF1bHQpOworICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQod29yZEh0bWxGaWxlLkZ1bGxOYW1lLCB3aCwgRW5jb2RpbmcuVVRGOCk7CisKKyAgICAgICAgICAgIHZhciB3b3JkWG1sID0gU2F2ZUh0bWxBc1htbCh3b3JkSHRtbEZpbGUpOworICAgICAgICAgICAgQ29tcGFyZU51bWJlcmluZyhmaVB0WG1sLCB3b3JkWG1sKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29tcGFyZU51bWJlcmluZyhGaWxlSW5mbyBmaVB0WG1sLCBGaWxlSW5mbyB3b3JkWG1sKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIHNwbGl0Q2hhciA9ICd8JzsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNvbXBhcmluZyB7MH0gdG8gezF9IiwgZmlQdFhtbC5OYW1lLCB3b3JkWG1sLk5hbWUpOworICAgICAgICAgICAgdmFyIHhkV29yZCA9IFhEb2N1bWVudC5Mb2FkKHdvcmRYbWwuRnVsbE5hbWUpOworICAgICAgICAgICAgTGlzdDxzdHJpbmc+IHdvcmRSYXdQYXJhZ3JhcGhUZXh0ID0geGRXb3JkLkRlc2NlbmRhbnRzKCJoMiIpLlNlbGVjdChwID0+IHAuRGVzY2VuZGFudE5vZGVzKCkuT2ZUeXBlPFhUZXh0PigpLlNlbGVjdCh0ID0+IHQuVmFsdWUpLkFnZ3JlZ2F0ZSgocywgaSkgPT4gcyArIGkpKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIHZhciB3b3JkVGV4dFRvQ29tcGFyZSA9IHdvcmRSYXdQYXJhZ3JhcGhUZXh0LldoZXJlKHAgPT4gcC5Db250YWlucyhzcGxpdENoYXIuVG9TdHJpbmcoKSkpLlNlbGVjdChwID0+IHAuU3BsaXQoc3BsaXRDaGFyKVswXSkuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIHZhciB4ZFB0ID0gWERvY3VtZW50LkxvYWQoZmlQdFhtbC5GdWxsTmFtZSk7CisgICAgICAgICAgICBYTmFtZXNwYWNlIHhodG1sID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOworICAgICAgICAgICAgTGlzdDxzdHJpbmc+IHB0UmF3UGFyYWdyYXBoVGV4dCA9IHhkUHQuRGVzY2VuZGFudHMoeGh0bWwgKyAiaDIiKS5TZWxlY3QocCA9PiBwLkRlc2NlbmRhbnROb2RlcygpLk9mVHlwZTxYVGV4dD4oKS5TZWxlY3QodCA9PiB0LlZhbHVlKS5BZ2dyZWdhdGUoKHMsIGkpID0+IHMgKyBpKSkuVG9MaXN0KCk7CisgICAgICAgICAgICB2YXIgcHRUZXh0VG9Db21wYXJlID0gcHRSYXdQYXJhZ3JhcGhUZXh0LldoZXJlKHAgPT4gcC5Db250YWlucyhzcGxpdENoYXIuVG9TdHJpbmcoKSkpLlNlbGVjdChwID0+IG5ldworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExpc3RJdGVtID0gcC5TcGxpdChzcGxpdENoYXIpWzBdLAorICAgICAgICAgICAgICAgIFBhcmFUZXh0ID0gcC5TcGxpdChzcGxpdENoYXIpWzFdLAorICAgICAgICAgICAgfSkuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIGlmICghd29yZFRleHRUb0NvbXBhcmUuQW55KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IgLSBubyBpdGVtcyBzZWxlY3RlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdvcmRUZXh0VG9Db21wYXJlLkNvdW50KCkgIT0gcHRUZXh0VG9Db21wYXJlLkNvdW50KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LlRydWUoZmFsc2UpOworICAgICAgICAgICAgICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yLCBkaWZmZXJpbmcgbGluZSBjb3VudHMiKTsKKyAgICAgICAgICAgICAgICAvL0NvbnNvbGUuV3JpdGVMaW5lKCJXb3JkIGxpbmUgY291bnQ6IHswfSIsIHdvcmRUZXh0VG9Db21wYXJlLkNvdW50KCkpOworICAgICAgICAgICAgICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoIlB0IGxpbmUgY291bnQ6IHswfSIsIHB0VGV4dFRvQ29tcGFyZS5Db3VudCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgemlwcGVkID0gd29yZFRleHRUb0NvbXBhcmUuWmlwKHB0VGV4dFRvQ29tcGFyZSwgKHcsIHApID0+IG5ldworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdvcmRUZXh0ID0gdywKKyAgICAgICAgICAgICAgICBQdFRleHQgPSBwLkxpc3RJdGVtLAorICAgICAgICAgICAgICAgIFBhcmFncmFwaFRleHQgPSBwLlBhcmFUZXh0LAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB2YXIgbWlzbWF0Y2hMaXN0ID0gemlwcGVkLldoZXJlKHogPT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdyA9IHouV29yZFRleHQuUmVwbGFjZSgnXG4nLCAnICcpLlRyaW0oKTsKKyAgICAgICAgICAgICAgICB2YXIgcCA9IHouUHRUZXh0LlJlcGxhY2UoJ1xuJywgJyAnKS5UcmltKCk7CisgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gdyA9PSBwOworICAgICAgICAgICAgICAgIGlmIChtYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSkuU2VsZWN0KHogPT4gei5QYXJhZ3JhcGhUZXh0KS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIGlmIChtaXNtYXRjaExpc3QuQW55KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LlRydWUoZmFsc2UpOworICAgICAgICAgICAgICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoIk1pc21hdGNoZXM6IHswfSIsIG1pc21hdGNoTGlzdC5Db3VudCgpKTsKKyAgICAgICAgICAgICAgICAvL2ZvcmVhY2ggKHZhciBpdGVtIGluIG1pc21hdGNoTGlzdC5UYWtlKDIwKSkKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAvLyAgICBDb25zb2xlLldyaXRlTGluZShpdGVtKTsKKyAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRmlsZUluZm8gQ29udmVydFRvSHRtbChzdHJpbmcgZmlsZSwgc3RyaW5nIG91dHB1dERpcmVjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZpID0gbmV3IEZpbGVJbmZvKGZpbGUpOworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVBcnJheSA9IEZpbGUuUmVhZEFsbEJ5dGVzKGZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIGRlc3RGaWxlTmFtZTsKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbWVtb3J5U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbW9yeVN0cmVhbS5Xcml0ZShieXRlQXJyYXksIDAsIGJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obWVtb3J5U3RyZWFtLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RGaWxlTmFtZSA9IG5ldyBGaWxlSW5mbyhmaS5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi5odG1sIikpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGlyZWN0b3J5ICE9IG51bGwgJiYgb3V0cHV0RGlyZWN0b3J5ICE9IHN0cmluZy5FbXB0eSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5SW5mbyBkaSA9IG5ldyBEaXJlY3RvcnlJbmZvKG91dHB1dERpcmVjdG9yeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRpLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIk91dHB1dCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RGaWxlTmFtZSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoZGkuRnVsbE5hbWUsIGRlc3RGaWxlTmFtZS5OYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFyIGltYWdlRGlyZWN0b3J5TmFtZSA9IGRlc3RGaWxlTmFtZS5GdWxsTmFtZS5TdWJzdHJpbmcoMCwgZGVzdEZpbGVOYW1lLkZ1bGxOYW1lLkxlbmd0aCAtIDUpICsgIl9maWxlcyI7CisgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZUNvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICB2YXIgcGFnZVRpdGxlID0gKHN0cmluZyl3RG9jLkNvcmVGaWxlUHJvcGVydGllc1BhcnQuR2V0WERvY3VtZW50KCkuRGVzY2VuZGFudHMoREMudGl0bGUpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlVGl0bGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZSA9IGZpLkZ1bGxOYW1lOworCisgICAgICAgICAgICAgICAgICAgIEh0bWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBIdG1sQ29udmVydGVyU2V0dGluZ3MoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQYWdlVGl0bGUgPSBwYWdlVGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBGYWJyaWNhdGVDc3NDbGFzc2VzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENzc0NsYXNzUHJlZml4ID0gInB0LSIsCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN0cmljdFRvU3VwcG9ydGVkTGFuZ3VhZ2VzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN0cmljdFRvU3VwcG9ydGVkTnVtYmVyaW5nRm9ybWF0cyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VIYW5kbGVyID0gaW1hZ2VJbmZvID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5SW5mbyBsb2NhbERpckluZm8gPSBuZXcgRGlyZWN0b3J5SW5mbyhpbWFnZURpcmVjdG9yeU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxEaXJJbmZvLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEaXJJbmZvLkNyZWF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraW1hZ2VDb3VudGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBleHRlbnNpb24gPSBpbWFnZUluZm8uQ29udGVudFR5cGUuU3BsaXQoJy8nKVsxXS5Ub0xvd2VyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VGb3JtYXQgaW1hZ2VGb3JtYXQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb24gPT0gInBuZyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHBuZyB0byBqcGVnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gPSAiZ2lmIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGb3JtYXQgPSBJbWFnZUZvcm1hdC5HaWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dGVuc2lvbiA9PSAiZ2lmIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGb3JtYXQgPSBJbWFnZUZvcm1hdC5HaWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJibXAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkJtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gImpwZWciKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkpwZWc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJ0aWZmIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdGlmZiB0byBnaWYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9ICJnaWYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkdpZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJ4LXdtZiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gPSAid21mIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGb3JtYXQgPSBJbWFnZUZvcm1hdC5XbWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGltYWdlIGZvcm1hdCBpc24ndCBvbmUgdGhhdCB3ZSBleHBlY3QsIGlnbm9yZSBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgZG9uJ3QgcmV0dXJuIG1hcmt1cCBmb3IgdGhlIGxpbmsuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlRm9ybWF0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGltYWdlRmlsZU5hbWUgPSBpbWFnZURpcmVjdG9yeU5hbWUgKyAiL2ltYWdlIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlQ291bnRlci5Ub1N0cmluZygpICsgIi4iICsgZXh0ZW5zaW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLkJpdG1hcC5TYXZlKGltYWdlRmlsZU5hbWUsIGltYWdlRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5FeHRlcm5hbEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBpbWcgPSBuZXcgWEVsZW1lbnQoWGh0bWwuaW1nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5zcmMsIGltYWdlRmlsZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uSW1nU3R5bGVBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5BbHRUZXh0ICE9IG51bGwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYWx0LCBpbWFnZUluZm8uQWx0VGV4dCkgOiBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1nOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBodG1sID0gSHRtbENvbnZlcnRlci5Db252ZXJ0VG9IdG1sKHdEb2MsIHNldHRpbmdzKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiB0aGUgeGh0bWwgcmV0dXJuZWQgYnkgQ29udmVydFRvSHRtbFRyYW5zZm9ybSBjb250YWlucyBvYmplY3RzIG9mIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgLy8gWEVudGl0eS4gIFB0T3BlblhtbFV0aWwuY3MgZGVmaW5lIHRoZSBYRW50aXR5IGNsYXNzLiAgU2VlCisgICAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9lcmljd2hpdGUvYXJjaGl2ZS8yMDEwLzAxLzIxL3dyaXRpbmctZW50aXR5LXJlZmVyZW5jZXMtdXNpbmctbGlucS10by14bWwuYXNweAorICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24uCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHlvdSBmdXJ0aGVyIHRyYW5zZm9ybSB0aGUgWE1MIHRyZWUgcmV0dXJuZWQgYnkgQ29udmVydFRvSHRtbFRyYW5zZm9ybSwgeW91CisgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgZG8gaXQgY29ycmVjdGx5LCBvciBlbnRpdGllcyB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHByb3Blcmx5LgorCisgICAgICAgICAgICAgICAgICAgIHZhciBodG1sU3RyaW5nID0gaHRtbC5Ub1N0cmluZyhTYXZlT3B0aW9ucy5EaXNhYmxlRm9ybWF0dGluZyk7CisgICAgICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KGRlc3RGaWxlTmFtZS5GdWxsTmFtZSwgaHRtbFN0cmluZywgRW5jb2RpbmcuVVRGOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlc3RGaWxlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRmlsZUluZm8gU2F2ZUh0bWxBc1htbChGaWxlSW5mbyBodG1sRmlsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBiYXNlTmFtZSA9IGh0bWxGaWxlTmFtZS5OYW1lLlN1YnN0cmluZygwLCBodG1sRmlsZU5hbWUuTmFtZS5MZW5ndGggLSBodG1sRmlsZU5hbWUuRXh0ZW5zaW9uLkxlbmd0aCk7CisgICAgICAgICAgICBGaWxlSW5mbyBkZXN0RmlsZSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoaHRtbEZpbGVOYW1lLkRpcmVjdG9yeU5hbWUsIGJhc2VOYW1lICsgIi54bWwiKSk7CisKKyAgICAgICAgICAgIEh0bWxEb2N1bWVudCBoZG9jID0gbmV3IEh0bWxEb2N1bWVudCgpOworICAgICAgICAgICAgaGRvYy5Mb2FkKGh0bWxGaWxlTmFtZS5GdWxsTmFtZSwgRW5jb2RpbmcuVVRGOCk7CisgICAgICAgICAgICBoZG9jLk9wdGlvbk91dHB1dEFzWG1sID0gdHJ1ZTsKKyAgICAgICAgICAgIGhkb2MuU2F2ZShkZXN0RmlsZS5GdWxsTmFtZSwgRW5jb2RpbmcuVVRGOCk7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoRmlsZS5SZWFkQWxsVGV4dChkZXN0RmlsZS5GdWxsTmFtZSwgRW5jb2RpbmcuRGVmYXVsdCkpOworICAgICAgICAgICAgc2IuUmVwbGFjZSgiw6giLCAiJmVncmF2ZTsiKTsKKyAgICAgICAgICAgIHNiLlJlcGxhY2UoIiZhbXA7IiwgIiYiKTsKKyAgICAgICAgICAgIHNiLlJlcGxhY2UoIiZuYnNwOyIsICJceEEwIik7CisgICAgICAgICAgICBzYi5SZXBsYWNlKCImcXVvdDsiLCAiXCIiKTsKKyAgICAgICAgICAgIHNiLlJlcGxhY2UoIiZsdDsiLCAifmx0OyIpOworICAgICAgICAgICAgc2IuUmVwbGFjZSgiJmd0OyIsICJ+Z3Q7Iik7CisgICAgICAgICAgICBzYi5SZXBsYWNlKCImIyIsICJ+IyIpOworICAgICAgICAgICAgc2IuUmVwbGFjZSgiJiIsICImYW1wOyIpOworICAgICAgICAgICAgc2IuUmVwbGFjZSgifmx0OyIsICImbHQ7Iik7CisgICAgICAgICAgICBzYi5SZXBsYWNlKCJ+Z3Q7IiwgIiZndDsiKTsKKyAgICAgICAgICAgIHNiLlJlcGxhY2UoIn4jIiwgIiYjIik7CisgICAgICAgICAgICBGaWxlLldyaXRlQWxsVGV4dChkZXN0RmlsZS5GdWxsTmFtZSwgc2IuVG9TdHJpbmcoKSwgRW5jb2RpbmcuVVRGOCk7CisgICAgICAgICAgICByZXR1cm4gZGVzdEZpbGU7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzLk9BL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzLk9BLmNzcHJvaiBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzLk9BL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzLk9BLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzMwM2E5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMuT0EvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMuT0EuY3Nwcm9qCkBAIC0wLDAgKzEsMTEzIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSIxMi4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SW1wb3J0IFByb2plY3Q9Ii4uXHBhY2thZ2VzXHh1bml0LnJ1bm5lci52aXN1YWxzdHVkaW8uMi4wLjFcYnVpbGRcbmV0MjBceHVuaXQucnVubmVyLnZpc3VhbHN0dWRpby5wcm9wcyIgQ29uZGl0aW9uPSJFeGlzdHMoJy4uXHBhY2thZ2VzXHh1bml0LnJ1bm5lci52aXN1YWxzdHVkaW8uMi4wLjFcYnVpbGRcbmV0MjBceHVuaXQucnVubmVyLnZpc3VhbHN0dWRpby5wcm9wcycpIiAvPgorICA8SW1wb3J0IFByb2plY3Q9Ii4uXHBhY2thZ2VzXHh1bml0LmNvcmUuMi4wLjBcYnVpbGRccG9ydGFibGUtbmV0NDUrd2luK3dwYTgxK3dwODArbW9ub3RvdWNoK21vbm9hbmRyb2lkK1hhbWFyaW4uaU9TXHh1bml0LmNvcmUucHJvcHMiIENvbmRpdGlvbj0iRXhpc3RzKCcuLlxwYWNrYWdlc1x4dW5pdC5jb3JlLjIuMC4wXGJ1aWxkXHBvcnRhYmxlLW5ldDQ1K3dpbit3cGE4MSt3cDgwK21vbm90b3VjaCttb25vYW5kcm9pZCtYYW1hcmluLmlPU1x4dW5pdC5jb3JlLnByb3BzJykiIC8+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXCQoTVNCdWlsZFRvb2xzVmVyc2lvbilcTWljcm9zb2Z0LkNvbW1vbi5wcm9wcyIgQ29uZGl0aW9uPSJFeGlzdHMoJyQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoKVwkKE1TQnVpbGRUb29sc1ZlcnNpb24pXE1pY3Jvc29mdC5Db21tb24ucHJvcHMnKSIgLz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9qZWN0R3VpZD57MkM1MEE1QUYtRTM0Qi00RkM0LTk4M0YtRjMwQkI0OUE1N0FCfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+T3BlblhtbFBvd2VyVG9vbHMuVGVzdHMuT0E8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5PcGVuWG1sUG93ZXJUb29scy5UZXN0cy5PQTwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICAgIDxOdUdldFBhY2thZ2VJbXBvcnRTdGFtcD5mNWQ3NTRlYTwvTnVHZXRQYWNrYWdlSW1wb3J0U3RhbXA+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7REVCVUc7VVNFX0hUTUxBR0lMSVRZUEFDSzwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IkRvY3VtZW50Rm9ybWF0Lk9wZW5YbWwsIFZlcnNpb249Mi41LjU2MzEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+CisgICAgICA8SGludFBhdGg+Li5cLi5cT3Blbi1YbWwtU0RLXERvY3VtZW50Rm9ybWF0Lk9wZW5YbWxcYmluXERlYnVnXERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ikh0bWxBZ2lsaXR5UGFjaywgVmVyc2lvbj0xLjMuOS4xLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWJkMzE5YjE5ZWFmM2I0M2EsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxIdG1sQWdpbGl0eVBhY2tcSHRtbEFnaWxpdHlQYWNrLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuT2ZmaWNlLkludGVyb3AuV29yZCwgVmVyc2lvbj0xNC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj03MWU5YmNlMTExZTk0MjljLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8RW1iZWRJbnRlcm9wVHlwZXM+VHJ1ZTwvRW1iZWRJbnRlcm9wVHlwZXM+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EcmF3aW5nIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLklPLlBhY2thZ2luZyI+CisgICAgICA8SGludFBhdGg+Li5cLi5cT3Blbi1YbWwtU0RLXERvY3VtZW50Rm9ybWF0Lk9wZW5YbWxcYmluXERlYnVnXFN5c3RlbS5JTy5QYWNrYWdpbmcuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkNTaGFycCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Inh1bml0LmFic3RyYWN0aW9ucywgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPThkMDViMWJiN2E2ZmRiNmMsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1x4dW5pdC5hYnN0cmFjdGlvbnMuMi4wLjBcbGliXG5ldDM1XHh1bml0LmFic3RyYWN0aW9ucy5kbGw8L0hpbnRQYXRoPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Inh1bml0LmFzc2VydCwgVmVyc2lvbj0yLjAuMC4yOTI5LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPThkMDViMWJiN2E2ZmRiNmMsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1x4dW5pdC5hc3NlcnQuMi4wLjBcbGliXHBvcnRhYmxlLW5ldDQ1K3dpbit3cGE4MSt3cDgwK21vbm90b3VjaCttb25vYW5kcm9pZCtYYW1hcmluLmlPU1x4dW5pdC5hc3NlcnQuZGxsPC9IaW50UGF0aD4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJ4dW5pdC5jb3JlLCBWZXJzaW9uPTIuMC4wLjI5MjksIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OGQwNWIxYmI3YTZmZGI2YywgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXHh1bml0LmV4dGVuc2liaWxpdHkuY29yZS4yLjAuMFxsaWJccG9ydGFibGUtbmV0NDUrd2luK3dwYTgxK3dwODArbW9ub3RvdWNoK21vbm9hbmRyb2lkK1hhbWFyaW4uaU9TXHh1bml0LmNvcmUuZGxsPC9IaW50UGF0aD4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXE9wZW5YbWxQb3dlclRvb2xzLlRlc3RzXEh0bWxDb252ZXJ0ZXJUZXN0cy5jcyI+CisgICAgICA8TGluaz5IdG1sQ29udmVydGVyVGVzdHMuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXE9wZW5YbWxQb3dlclRvb2xzLlRlc3RzXEh0bWxUb1dtbENvbnZlcnRlclRlc3RzLmNzIj4KKyAgICAgIDxMaW5rPkh0bWxUb1dtbENvbnZlcnRlclRlc3RzLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxPcGVuWG1sUG93ZXJUb29scy5UZXN0c1xIdG1sVG9XbWxSZWFkQXNYRWxlbWVudC5jcyI+CisgICAgICA8TGluaz5IdG1sVG9XbWxSZWFkQXNYRWxlbWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHRtbFRvV21sQ29udmVydGVyVGVzdHMyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ikxpc3RJdGVtUmV0cmlldmVyVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iV29yZEF1dG9tYXRpb25VdGlsaXRpZXMuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9InBhY2thZ2VzLmNvbmZpZyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cT3BlblhtbFBvd2VyVG9vbHNcT3BlblhtbFBvd2VyVG9vbHMuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns2Zjk1N2ZmMy1hZmNjLTRkNjktOGZiYy03MWFlMjFiYzQ1Yzl9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+T3BlblhtbFBvd2VyVG9vbHM8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8U2VydmljZSBJbmNsdWRlPSJ7ODJBN0Y0OEQtM0I1MC00QjFFLUI4MkUtM0FEQTgyMTBDMzU4fSIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDxUYXJnZXQgTmFtZT0iRW5zdXJlTnVHZXRQYWNrYWdlQnVpbGRJbXBvcnRzIiBCZWZvcmVUYXJnZXRzPSJQcmVwYXJlRm9yQnVpbGQiPgorICAgIDxQcm9wZXJ0eUdyb3VwPgorICAgICAgPEVycm9yVGV4dD5UaGlzIHByb2plY3QgcmVmZXJlbmNlcyBOdUdldCBwYWNrYWdlKHMpIHRoYXQgYXJlIG1pc3Npbmcgb24gdGhpcyBjb21wdXRlci4gRW5hYmxlIE51R2V0IFBhY2thZ2UgUmVzdG9yZSB0byBkb3dubG9hZCB0aGVtLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vZ28ubWljcm9zb2Z0LmNvbS9md2xpbmsvP0xpbmtJRD0zMjIxMDUuIFRoZSBtaXNzaW5nIGZpbGUgaXMgezB9LjwvRXJyb3JUZXh0PgorICAgIDwvUHJvcGVydHlHcm91cD4KKyAgICA8RXJyb3IgQ29uZGl0aW9uPSIhRXhpc3RzKCcuLlxwYWNrYWdlc1x4dW5pdC5jb3JlLjIuMC4wXGJ1aWxkXHBvcnRhYmxlLW5ldDQ1K3dpbit3cGE4MSt3cDgwK21vbm90b3VjaCttb25vYW5kcm9pZCtYYW1hcmluLmlPU1x4dW5pdC5jb3JlLnByb3BzJykiIFRleHQ9IiQoW1N5c3RlbS5TdHJpbmddOjpGb3JtYXQoJyQoRXJyb3JUZXh0KScsICcuLlxwYWNrYWdlc1x4dW5pdC5jb3JlLjIuMC4wXGJ1aWxkXHBvcnRhYmxlLW5ldDQ1K3dpbit3cGE4MSt3cDgwK21vbm90b3VjaCttb25vYW5kcm9pZCtYYW1hcmluLmlPU1x4dW5pdC5jb3JlLnByb3BzJykpIiAvPgorICAgIDxFcnJvciBDb25kaXRpb249IiFFeGlzdHMoJy4uXHBhY2thZ2VzXHh1bml0LnJ1bm5lci52aXN1YWxzdHVkaW8uMi4wLjFcYnVpbGRcbmV0MjBceHVuaXQucnVubmVyLnZpc3VhbHN0dWRpby5wcm9wcycpIiBUZXh0PSIkKFtTeXN0ZW0uU3RyaW5nXTo6Rm9ybWF0KCckKEVycm9yVGV4dCknLCAnLi5ccGFja2FnZXNceHVuaXQucnVubmVyLnZpc3VhbHN0dWRpby4yLjAuMVxidWlsZFxuZXQyMFx4dW5pdC5ydW5uZXIudmlzdWFsc3R1ZGlvLnByb3BzJykpIiAvPgorICA8L1RhcmdldD4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy5PQS9Xb3JkQXV0b21hdGlvblV0aWxpdGllcy5jcyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzLk9BL1dvcmRBdXRvbWF0aW9uVXRpbGl0aWVzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTU0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy5PQS9Xb3JkQXV0b21hdGlvblV0aWxpdGllcy5jcwpAQCAtMCwwICsxLDE1OCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7Cit1c2luZyBXb3JkID0gTWljcm9zb2Z0Lk9mZmljZS5JbnRlcm9wLldvcmQ7CisKK25hbWVzcGFjZSBPeFB0Cit7CisgICAgcHVibGljIGNsYXNzIFdvcmRBdXRvbWF0aW9uVXRpbGl0aWVzCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgRG9Db252ZXJzaW9uVmlhV29yZChGaWxlSW5mbyBuZXdBbHRDaHVua0JlZm9yZUZpLCBGaWxlSW5mbyBuZXdBbHRDaHVua0FmdGVyRmksIFhFbGVtZW50IGh0bWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBibGFua0FsdENodW5rRmkgPSBuZXcgRGlyZWN0b3J5SW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCAiQmxhbmstYWx0Y2h1bmsuZG9jeCIpKTsKKyAgICAgICAgICAgIEZpbGUuQ29weShibGFua0FsdENodW5rRmkuRnVsbE5hbWUsIG5ld0FsdENodW5rQmVmb3JlRmkuRnVsbE5hbWUpOworICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgbXlEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obmV3QWx0Q2h1bmtCZWZvcmVGaS5GdWxsTmFtZSwgdHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGFsdENodW5rSWQgPSAiQWx0Q2h1bmtJZDEiOworICAgICAgICAgICAgICAgIE1haW5Eb2N1bWVudFBhcnQgbWFpblBhcnQgPSBteURvYy5NYWluRG9jdW1lbnRQYXJ0OworICAgICAgICAgICAgICAgIEFsdGVybmF0aXZlRm9ybWF0SW1wb3J0UGFydCBjaHVuayA9IG1haW5QYXJ0LkFkZEFsdGVybmF0aXZlRm9ybWF0SW1wb3J0UGFydCgKKyAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsIGFsdENodW5rSWQpOworICAgICAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gY2h1bmtTdHJlYW0gPSBjaHVuay5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSkKKyAgICAgICAgICAgICAgICB1c2luZyAoU3RyZWFtV3JpdGVyIHN0cmluZ1N0cmVhbSA9IG5ldyBTdHJlYW1Xcml0ZXIoY2h1bmtTdHJlYW0pKQorICAgICAgICAgICAgICAgICAgICBzdHJpbmdTdHJlYW0uV3JpdGUoaHRtbC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBhbHRDaHVuayA9IG5ldyBYRWxlbWVudChXLmFsdENodW5rLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShSLmlkLCBhbHRDaHVua0lkKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IG1haW5Eb2N1bWVudFhEb2MgPSBteURvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIG1haW5Eb2N1bWVudFhEb2MuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudChXLmJvZHkpCisgICAgICAgICAgICAgICAgICAgIC5BZGRGaXJzdChhbHRDaHVuayk7CisgICAgICAgICAgICAgICAgbXlEb2MuTWFpbkRvY3VtZW50UGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgV29yZEF1dG9tYXRpb25VdGlsaXRpZXMuT3BlbkFuZFNhdmVBcyhuZXdBbHRDaHVua0JlZm9yZUZpLkZ1bGxOYW1lLCBuZXdBbHRDaHVua0FmdGVyRmkuRnVsbE5hbWUpOworCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obmV3QWx0Q2h1bmtBZnRlckZpLkZ1bGxOYW1lLCB0cnVlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxpZnlNYXJrdXBTZXR0aW5ncyBzZXR0aW5nczIgPSBuZXcgU2ltcGxpZnlNYXJrdXBTZXR0aW5ncworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZU1hcmt1cEZvckRvY3VtZW50Q29tcGFyaXNvbiA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgTWFya3VwU2ltcGxpZmllci5TaW1wbGlmeU1hcmt1cCh3RG9jLCBzZXR0aW5nczIpOworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3Um9vdCA9IChYRWxlbWVudClSZW1vdmVEaXZUcmFuc2Zvcm0od0RvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QpOworICAgICAgICAgICAgICAgICAgICAgICAgd0RvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QuUmVwbGFjZVdpdGgobmV3Um9vdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3RG9jLk1haW5Eb2N1bWVudFBhcnQuUHV0WERvY3VtZW50V2l0aEZvcm1hdHRpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoNTApOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgUmVtb3ZlRGl2VHJhbnNmb3JtKFhOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuZGl2SWQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFJlbW92ZURpdlRyYW5zZm9ybShuKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgU2F2ZUFzSHRtbFVzaW5nV29yZChGaWxlSW5mbyBzcmMsIEZpbGVJbmZvIGRlc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdvcmQuQXBwbGljYXRpb24gYXBwID0gbmV3IFdvcmQuQXBwbGljYXRpb24oKTsKKyAgICAgICAgICAgIGFwcC5WaXNpYmxlID0gZmFsc2U7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXb3JkLkRvY3VtZW50IGRvYyA9IGFwcC5Eb2N1bWVudHMuT3BlbihzcmMuRnVsbE5hbWUpOworICAgICAgICAgICAgICAgIGRvYy5TYXZlQXMyKGRlc3QuRnVsbE5hbWUsIFdvcmQuV2RTYXZlRm9ybWF0LndkRm9ybWF0RmlsdGVyZWRIVE1MKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuQ09NRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDYXVnaHQgdW5leHBlY3RlZCBDT00gZXhjZXB0aW9uLiIpOworICAgICAgICAgICAgICAgICgoTWljcm9zb2Z0Lk9mZmljZS5JbnRlcm9wLldvcmQuX0FwcGxpY2F0aW9uKWFwcCkuUXVpdCgpOworICAgICAgICAgICAgICAgIEVudmlyb25tZW50LkV4aXQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKE1pY3Jvc29mdC5PZmZpY2UuSW50ZXJvcC5Xb3JkLl9BcHBsaWNhdGlvbilhcHApLlF1aXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBPcGVuQW5kU2F2ZUFzKHN0cmluZyBmcm9tRmlsZU5hbWUsIHN0cmluZyB0b0ZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBXb3JkLkFwcGxpY2F0aW9uIGFwcCA9IG5ldyBXb3JkLkFwcGxpY2F0aW9uKCk7CisgICAgICAgICAgICBhcHAuVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgRmlsZUluZm8gZmkgPSBuZXcgRmlsZUluZm8oZnJvbUZpbGVOYW1lKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGVJbmZvIGZmaSA9IG5ldyBGaWxlSW5mbyhmcm9tRmlsZU5hbWUpOworICAgICAgICAgICAgICAgIFdvcmQuRG9jdW1lbnQgZG9jID0gYXBwLkRvY3VtZW50cy5PcGVuKGZmaS5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgb2JqZWN0IEZpbGVGb3JtYXQgPSBXb3JkLldkU2F2ZUZvcm1hdC53ZEZvcm1hdERvY3VtZW50OworICAgICAgICAgICAgICAgIEZpbGVJbmZvIHRmaSA9IG5ldyBGaWxlSW5mbyh0b0ZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICBvYmplY3QgRmlsZU5hbWUgPSB0ZmkuRnVsbE5hbWU7CisKKyAgICAgICAgICAgICAgICBkb2MuU2F2ZUFzKHRmaS5GdWxsTmFtZSwgV29yZC5XZFNhdmVGb3JtYXQud2RGb3JtYXREb2N1bWVudERlZmF1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5DT01FeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNhdWdodCB1bmV4cGVjdGVkIENPTSBleGNlcHRpb24uIik7CisgICAgICAgICAgICAgICAgKChNaWNyb3NvZnQuT2ZmaWNlLkludGVyb3AuV29yZC5fQXBwbGljYXRpb24pYXBwKS5RdWl0KCk7CisgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuRXhpdCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgoTWljcm9zb2Z0Lk9mZmljZS5JbnRlcm9wLldvcmQuX0FwcGxpY2F0aW9uKWFwcCkuUXVpdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE9wZW5BbmRTYXZlQXMoRmlsZUluZm8gc3JjLCBGaWxlSW5mbyBkZXN0KQorICAgICAgICB7CisgICAgICAgICAgICBXb3JkLkFwcGxpY2F0aW9uIGFwcCA9IG5ldyBXb3JkLkFwcGxpY2F0aW9uKCk7CisgICAgICAgICAgICBhcHAuVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV29yZC5Eb2N1bWVudCBkb2MgPSBhcHAuRG9jdW1lbnRzLk9wZW4oc3JjLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICBkb2MuU2F2ZUFzMihkZXN0LkZ1bGxOYW1lLCBXb3JkLldkU2F2ZUZvcm1hdC53ZEZvcm1hdERvY3VtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuQ09NRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDYXVnaHQgdW5leHBlY3RlZCBDT00gZXhjZXB0aW9uLiIpOworICAgICAgICAgICAgICAgICgoTWljcm9zb2Z0Lk9mZmljZS5JbnRlcm9wLldvcmQuX0FwcGxpY2F0aW9uKWFwcCkuUXVpdCgpOworICAgICAgICAgICAgICAgIEVudmlyb25tZW50LkV4aXQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKE1pY3Jvc29mdC5PZmZpY2UuSW50ZXJvcC5Xb3JkLl9BcHBsaWNhdGlvbilhcHApLlF1aXQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL0NoYXJ0VXBkYXRlclRlc3RzLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvQ2hhcnRVcGRhdGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmYTNjMgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL0NoYXJ0VXBkYXRlclRlc3RzLmNzCkBAIC0wLDAgKzEsMjUzIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkRyYXdpbmcuSW1hZ2luZzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKK3VzaW5nIFh1bml0OworCisjaWYgIUVMSURFX1hVTklUX1RFU1RTCisKK25hbWVzcGFjZSBPeFB0Cit7CisgICAgcHVibGljIGNsYXNzIEN1VGVzdHMKKyAgICB7CisgICAgICAgIFtUaGVvcnldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDVTAwMS1DaGFydC1DYWNoZWQtRGF0YS0wMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDVTAwMi1DaGFydC1DYWNoZWQtRGF0YS0wMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDVTAwMy1DaGFydC1DYWNoZWQtRGF0YS0wMy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDVTAwNC1DaGFydC1DYWNoZWQtRGF0YS0wNC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDVTAwNS1DaGFydC1DYWNoZWQtRGF0YS0wNS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDVTAwNi1DaGFydC1DYWNoZWQtRGF0YS0wNi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDVTAwNy1DaGFydC1DYWNoZWQtRGF0YS0wNy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDVTAwOC1DaGFydC1DYWNoZWQtRGF0YS0wOC5kb2N4IildCisKKyAgICAgICAgW0lubGluZURhdGEoIkNVMDA5LUNoYXJ0LUVtYmVkZGVkLVhsc3gtMDEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1UwMTAtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDVTAxMS1DaGFydC1FbWJlZGRlZC1YbHN4LTAzLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNVMDEyLUNoYXJ0LUVtYmVkZGVkLVhsc3gtMDQuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1UwMTMtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDVTAxNC1DaGFydC1FbWJlZGRlZC1YbHN4LTA2LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNVMDE1LUNoYXJ0LUVtYmVkZGVkLVhsc3gtMDcuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1UwMTYtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wOC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDVTAxNy1DaGFydC1FbWJlZGRlZC1YbHN4LTEwLmRvY3giKV0KKworICAgICAgICBbSW5saW5lRGF0YSgiQ1UwMTgtQ2hhcnQtQ2FjaGVkLURhdGEtNDEucHB0eCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1UwMTktQ2hhcnQtRW1iZWRkZWQtWGxzeC00MS5wcHR4IildCisKKyAgICAgICAgcHVibGljIHZvaWQgQ1UwMDEoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHRlbXBsYXRlRmlsZSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lKSk7CisKKyAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUZpbGUuRXh0ZW5zaW9uLlRvTG93ZXIoKSA9PSAiLmRvY3giKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdtbERvY3VtZW50IHdtbFRlbXBsYXRlID0gbmV3IFdtbERvY3VtZW50KHRlbXBsYXRlRmlsZS5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgICAgICB2YXIgYWZ0ZXJVcGRhdGluZ0RvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHRlbXBsYXRlRmlsZS5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi1wcm9jZXNzZWQtYnktQ2hhcnRVcGRhdGVyLmRvY3giKSkpOworICAgICAgICAgICAgICAgIHdtbFRlbXBsYXRlLlNhdmVBcyhhZnRlclVwZGF0aW5nRG9jeC5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oYWZ0ZXJVcGRhdGluZ0RvY3guRnVsbE5hbWUsIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJ0MURhdGEgPSBuZXcgQ2hhcnREYXRhCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcmllc05hbWVzID0gbmV3W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcnVjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJpa2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb2F0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeURhdGFUeXBlID0gQ2hhcnREYXRhVHlwZS5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeU5hbWVzID0gbmV3W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRNCIsCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzID0gbmV3IGRvdWJsZVtdW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgMzEwLCAyMjAsIDQ1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCwgMzAwLCAzNTAsIDQxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwLCAxMjAsIDE0MCwgNjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGRvdWJsZVtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwLCAxMDAsIDE0MCwgNDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGRvdWJsZVtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwLCAyMTAsIDIxMCwgNDgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBDaGFydFVwZGF0ZXIuVXBkYXRlQ2hhcnQod0RvYywgIkNoYXJ0MSIsIGNoYXJ0MURhdGEpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBjaGFydDJEYXRhID0gbmV3IENoYXJ0RGF0YQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXJpZXNOYW1lcyA9IG5ld1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VyaWVzIgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5RGF0YVR5cGUgPSBDaGFydERhdGFUeXBlLlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5TmFtZXMgPSBuZXdbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRydWNrcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYW5zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvYXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzID0gbmV3IGRvdWJsZVtdW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMCwgMTEyLCA2NCwgODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VXBkYXRlci5VcGRhdGVDaGFydCh3RG9jLCAiQ2hhcnQyIiwgY2hhcnQyRGF0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJ0M0RhdGEgPSBuZXcgQ2hhcnREYXRhCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcmllc05hbWVzID0gbmV3W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlgyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlg1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWDYiLAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5RGF0YVR5cGUgPSBDaGFydERhdGFUeXBlLlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5TmFtZXMgPSBuZXdbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlkxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWTIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlk0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZNiIsCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzID0gbmV3IGRvdWJsZVtdW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7ICAgICAgMy4wLCAgICAgIDIuMSwgICAgICAgLjcsICAgICAgLjcsICAgICAgMi4xLCAgICAgIDMuMCwgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7ICAgICAgMy4wLCAgICAgIDIuMSwgICAgICAgLjgsICAgICAgLjgsICAgICAgMi4xLCAgICAgIDMuMCwgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7ICAgICAgMy4wLCAgICAgIDIuNCwgICAgICAxLjIsICAgICAxLjIsICAgICAgMi40LCAgICAgIDMuMCwgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7ICAgICAgMy4wLCAgICAgIDIuNywgICAgICAxLjcsICAgICAxLjcsICAgICAgMi43LCAgICAgIDMuMCwgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7ICAgICAgMy4wLCAgICAgIDIuOSwgICAgICAyLjUsICAgICAyLjUsICAgICAgMi45LCAgICAgIDMuMCwgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7ICAgICAgMy4wLCAgICAgIDMuMCwgICAgICAzLjAsICAgICAzLjAsICAgICAgMy4wLCAgICAgIDMuMCwgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcnRVcGRhdGVyLlVwZGF0ZUNoYXJ0KHdEb2MsICJDaGFydDMiLCBjaGFydDNEYXRhKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcnQ0RGF0YSA9IG5ldyBDaGFydERhdGEKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWVzTmFtZXMgPSBuZXdbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRydWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeURhdGFUeXBlID0gQ2hhcnREYXRhVHlwZS5EYXRlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5Rm9ybWF0Q29kZSA9IDE0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlOYW1lcyA9IG5ld1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvRXhjZWxJbnRlZ2VyKG5ldyBEYXRlVGltZSgyMDEzLCA5LCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgNCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvRXhjZWxJbnRlZ2VyKG5ldyBEYXRlVGltZSgyMDEzLCA5LCA1KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgNykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvRXhjZWxJbnRlZ2VyKG5ldyBEYXRlVGltZSgyMDEzLCA5LCA4KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgMTApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgMTEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgMTIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgMTMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgMTQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgMTUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgMTYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgMTcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgMTgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgMTkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgMjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgPSBuZXcgZG91YmxlW11bXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGRvdWJsZVtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMiwgMywgMiwgMywgNCwgNSwgNCwgNSwgNiwgNSwgNCwgNSwgNiwgNywgOCwgNywgOCwgOCwgOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDMsIDMsIDQsIDQsIDUsIDYsIDcsIDgsIDcsIDgsIDksIDksIDksIDcsIDgsIDksIDksIDEwLCAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDMsIDMsIDMsIDMsIDIsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDQsIDQsIDMsIDQsIDUsIDUsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VXBkYXRlci5VcGRhdGVDaGFydCh3RG9jLCAiQ2hhcnQ0IiwgY2hhcnQ0RGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRlbXBsYXRlRmlsZS5FeHRlbnNpb24uVG9Mb3dlcigpID09ICIucHB0eCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUG1sRG9jdW1lbnQgcG1sVGVtcGxhdGUgPSBuZXcgUG1sRG9jdW1lbnQodGVtcGxhdGVGaWxlLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgICAgIHZhciBhZnRlclVwZGF0aW5nUHB0eCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgdGVtcGxhdGVGaWxlLk5hbWUuUmVwbGFjZSgiLnBwdHgiLCAiLXByb2Nlc3NlZC1ieS1DaGFydFVwZGF0ZXIucHB0eCIpKSk7CisgICAgICAgICAgICAgICAgcG1sVGVtcGxhdGUuU2F2ZUFzKGFmdGVyVXBkYXRpbmdQcHR4LkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgcERvYyA9IFByZXNlbnRhdGlvbkRvY3VtZW50Lk9wZW4oYWZ0ZXJVcGRhdGluZ1BwdHguRnVsbE5hbWUsIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJ0MURhdGEgPSBuZXcgQ2hhcnREYXRhCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcmllc05hbWVzID0gbmV3W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcnVjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlEYXRhVHlwZSA9IENoYXJ0RGF0YVR5cGUuU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlOYW1lcyA9IG5ld1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyA9IG5ldyBkb3VibGVbXVtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZG91YmxlW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAsIDMxMCwgMzIwLCAzMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZG91YmxlW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDEsIDIyNCwgMjMwLCAyMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZG91YmxlW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODAsIDIwMCwgMjIwLCAyMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VXBkYXRlci5VcGRhdGVDaGFydChwRG9jLCAxLCBjaGFydDFEYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgVG9FeGNlbEludGVnZXIoRGF0ZVRpbWUgZGF0ZVRpbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkYXRlVGltZS5Ub09BRGF0ZSgpLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvRG9jdW1lbnRBc3NlbWJsZXJUZXN0cy5jcyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL0RvY3VtZW50QXNzZW1ibGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiZmU4ZQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL0RvY3VtZW50QXNzZW1ibGVyVGVzdHMuY3MKQEAgLTAsMCArMSwyNTYgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uRHJhd2luZy5JbWFnaW5nOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlZhbGlkYXRpb247Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKK3VzaW5nIFh1bml0OworCisjaWYgIUVMSURFX1hVTklUX1RFU1RTCisKK25hbWVzcGFjZSBPeFB0Cit7CisgICAgcHVibGljIGNsYXNzIERhVGVzdHMKKyAgICB7CisgICAgICAgIFtUaGVvcnldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAwMS1UZW1wbGF0ZURvY3VtZW50LmRvY3giLCAiREEtRGF0YS54bWwiLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAwMi1UZW1wbGF0ZURvY3VtZW50LmRvY3giLCAiREEtRGF0YU5vdEhpZ2hWYWx1ZUN1c3QueG1sIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEwMDMtU2VsZWN0LVhQYXRoRmluZHNOb0RhdGEuZG9jeCIsICJEQS1EYXRhLnhtbCIsIHRydWUpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEwMDQtU2VsZWN0LVhQYXRoRmluZHNOb0RhdGFPcHRpb25hbC5kb2N4IiwgIkRBLURhdGEueG1sIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEwMDUtU2VsZWN0Um93RGF0YS1Ob0RhdGEuZG9jeCIsICJEQS1EYXRhLnhtbCIsIHRydWUpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEwMDYtU2VsZWN0VGVzdFZhbHVlLU5vRGF0YS5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAwNy1TZWxlY3RSZXBlYXRpbmdEYXRhLU5vRGF0YS5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAwOC1UYWJsZUVsZW1lbnRXaXRoTm9UYWJsZS5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAwOS1JbnZhbGlkWFBhdGguZG9jeCIsICJEQS1EYXRhLnhtbCIsIHRydWUpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEwMTAtSW52YWxpZFhtbC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAxMS1TY2hlbWFFcnJvci5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAxMi1PdGhlck1hcmt1cFR5cGVzLmRvY3giLCAiREEtRGF0YS54bWwiLCB0cnVlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMDEzLVJ1bnMuZG9jeCIsICJEQS1EYXRhLnhtbCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMDE0LVR3b1J1bnMtTm9WYWx1ZXNTZWxlY3RlZC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAxNS1Ud29SdW5zWG1sRXhjZXB0aW9uSW5GaXJzdC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAxNi1Ud29SdW5zU2NoZW1hRXJyb3JJblNlY29uZC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAxNy1GaXZlUnVucy5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAxOC1TbWFydFF1b3Rlcy5kb2N4IiwgIkRBLURhdGEueG1sIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEwMTktUnVuSXNFbnRpcmVQYXJhZ3JhcGguZG9jeCIsICJEQS1EYXRhLnhtbCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMDIwLVR3b1J1bnNBbmROb090aGVyQ29udGVudC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAyMS1OZXN0ZWRSZXBlYXQuZG9jeCIsICJEQS1EYXRhTmVzdGVkUmVwZWF0LnhtbCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMDIyLUludmFsaWRYUGF0aC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAyMy1SZXBlYXRXT0VuZFJlcGVhdC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAyNi1JbnZhbGlkUm9vdFhtbEVsZW1lbnQuZG9jeCIsICJEQS1EYXRhLnhtbCIsIHRydWUpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEwMjctWFBhdGhFcnJvckluUGFyYS5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAyOC1Ob1Byb3RvdHlwZVJvdy5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAyOS1Ob0RhdGFGb3JDZWxsLmRvY3giLCAiREEtRGF0YS54bWwiLCB0cnVlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMDMwLVRvb011Y2hEYXRhRm9yQ2VsbC5kb2N4IiwgIkRBLVRvb011Y2hEYXRhRm9yQ2VsbC54bWwiLCB0cnVlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMDMxLUNlbGxEYXRhSW5BdHRyaWJ1dGVzLmRvY3giLCAiREEtQ2VsbERhdGFJbkF0dHJpYnV0ZXMueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAzMi1Ub29NdWNoRGF0YUZvckNvbmRpdGlvbmFsLmRvY3giLCAiREEtVG9vTXVjaERhdGFGb3JDb25kaXRpb25hbC54bWwiLCB0cnVlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMDMzLUNvbmRpdGlvbmFsT25BdHRyaWJ1dGUuZG9jeCIsICJEQS1Db25kaXRpb25hbE9uQXR0cmlidXRlLnhtbCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMDM0LUhlYWRlckZvb3Rlci5kb2N4IiwgIkRBLURhdGEueG1sIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEwMzUtU2NoZW1hRXJyb3JJblJlcGVhdC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAzNi1TY2hlbWFFcnJvckluQ29uZGl0aW9uYWwuZG9jeCIsICJEQS1EYXRhLnhtbCIsIHRydWUpXQorCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTEwMC1UZW1wbGF0ZURvY3VtZW50LmRvY3giLCAiREEtRGF0YS54bWwiLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTEwMS1UZW1wbGF0ZURvY3VtZW50LmRvY3giLCAiREEtRGF0YS54bWwiLCB0cnVlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMTAyLVRlbXBsYXRlRG9jdW1lbnQuZG9jeCIsICJEQS1EYXRhLnhtbCIsIHRydWUpXQorCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIwMS1UZW1wbGF0ZURvY3VtZW50LmRvY3giLCAiREEtRGF0YS54bWwiLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIwMi1UZW1wbGF0ZURvY3VtZW50LmRvY3giLCAiREEtRGF0YU5vdEhpZ2hWYWx1ZUN1c3QueG1sIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyMDMtU2VsZWN0LVhQYXRoRmluZHNOb0RhdGEuZG9jeCIsICJEQS1EYXRhLnhtbCIsIHRydWUpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyMDQtU2VsZWN0LVhQYXRoRmluZHNOb0RhdGFPcHRpb25hbC5kb2N4IiwgIkRBLURhdGEueG1sIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyMDUtU2VsZWN0Um93RGF0YS1Ob0RhdGEuZG9jeCIsICJEQS1EYXRhLnhtbCIsIHRydWUpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyMDYtU2VsZWN0VGVzdFZhbHVlLU5vRGF0YS5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIwNy1TZWxlY3RSZXBlYXRpbmdEYXRhLU5vRGF0YS5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIwOS1JbnZhbGlkWFBhdGguZG9jeCIsICJEQS1EYXRhLnhtbCIsIHRydWUpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyMTAtSW52YWxpZFhtbC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIxMS1TY2hlbWFFcnJvci5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIxMi1PdGhlck1hcmt1cFR5cGVzLmRvY3giLCAiREEtRGF0YS54bWwiLCB0cnVlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjEzLVJ1bnMuZG9jeCIsICJEQS1EYXRhLnhtbCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjE0LVR3b1J1bnMtTm9WYWx1ZXNTZWxlY3RlZC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIxNS1Ud29SdW5zWG1sRXhjZXB0aW9uSW5GaXJzdC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIxNi1Ud29SdW5zU2NoZW1hRXJyb3JJblNlY29uZC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIxNy1GaXZlUnVucy5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIxOC1TbWFydFF1b3Rlcy5kb2N4IiwgIkRBLURhdGEueG1sIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyMTktUnVuSXNFbnRpcmVQYXJhZ3JhcGguZG9jeCIsICJEQS1EYXRhLnhtbCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjIwLVR3b1J1bnNBbmROb090aGVyQ29udGVudC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIyMS1OZXN0ZWRSZXBlYXQuZG9jeCIsICJEQS1EYXRhTmVzdGVkUmVwZWF0LnhtbCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjIyLUludmFsaWRYUGF0aC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIyMy1SZXBlYXRXT0VuZFJlcGVhdC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIyNi1JbnZhbGlkUm9vdFhtbEVsZW1lbnQuZG9jeCIsICJEQS1EYXRhLnhtbCIsIHRydWUpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyMjctWFBhdGhFcnJvckluUGFyYS5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIyOC1Ob1Byb3RvdHlwZVJvdy5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIyOS1Ob0RhdGFGb3JDZWxsLmRvY3giLCAiREEtRGF0YS54bWwiLCB0cnVlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjMwLVRvb011Y2hEYXRhRm9yQ2VsbC5kb2N4IiwgIkRBLVRvb011Y2hEYXRhRm9yQ2VsbC54bWwiLCB0cnVlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjMxLUNlbGxEYXRhSW5BdHRyaWJ1dGVzLmRvY3giLCAiREEtQ2VsbERhdGFJbkF0dHJpYnV0ZXMueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIzMi1Ub29NdWNoRGF0YUZvckNvbmRpdGlvbmFsLmRvY3giLCAiREEtVG9vTXVjaERhdGFGb3JDb25kaXRpb25hbC54bWwiLCB0cnVlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjMzLUNvbmRpdGlvbmFsT25BdHRyaWJ1dGUuZG9jeCIsICJEQS1Db25kaXRpb25hbE9uQXR0cmlidXRlLnhtbCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjM0LUhlYWRlckZvb3Rlci5kb2N4IiwgIkRBLURhdGEueG1sIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyMzUtQ3Jhc2hlcy5kb2N4IiwgIkRBLUNvbnRlbnQtTGlzdC54bWwiLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIzNi1QYWdlLU51bS1pbi1Gb290ZXIuZG9jeCIsICJEQS1Db250ZW50LUxpc3QueG1sIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyMzctU2NoZW1hRXJyb3JJblJlcGVhdC5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTIzOC1TY2hlbWFFcnJvckluQ29uZGl0aW9uYWwuZG9jeCIsICJEQS1EYXRhLnhtbCIsIHRydWUpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyMzktUnVuTGV2ZWxDQy1SZXBlYXQuZG9jeCIsICJEQS1EYXRhLnhtbCIsIGZhbHNlKV0KKworICAgICAgICBbSW5saW5lRGF0YSgiREEyNTAtQ29uZGl0aW9uYWxXaXRoUmljaFhQYXRoLmRvY3giLCAiREEyNTAtQWRkcmVzcy54bWwiLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTI1MS1FbmhhbmNlZFRhYmxlcy5kb2N4IiwgIkRBLURhdGEueG1sIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyNTItVGFibGUtV2l0aC1TdW0uZG9jeCIsICJEQS1EYXRhLnhtbCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjUzLVRhYmxlLVdpdGgtU3VtLVJ1bi1MZXZlbC1DQy5kb2N4IiwgIkRBLURhdGEueG1sIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyNTQtVGFibGUtV2l0aC1YUGF0aC1TdW0uZG9jeCIsICJEQS1EYXRhLnhtbCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjU1LVRhYmxlLVdpdGgtWFBhdGgtU3VtLVJ1bi1MZXZlbC1DQy5kb2N4IiwgIkRBLURhdGEueG1sIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyNTYtTm9JbnZhbGlkRG9jT25FcnJvckluUnVuLmRvY3giLCAiREEtRGF0YS54bWwiLCB0cnVlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjU3LU9wdGlvbmFsUmVwZWF0LmRvY3giLCAiREEtRGF0YS54bWwiLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTI1OC1Db250ZW50QWNjZXB0c0NoYXJzQXNYUGF0aFJlc3VsdC5kb2N4IiwgIkRBLURhdGEueG1sIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyNTktTXVsdGlMaW5lQ29udGVudHMuZG9jeCIsICJEQS1EYXRhLnhtbCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjYwLVJ1bkxldmVsUmVwZWF0LmRvY3giLCAiREEtRGF0YS54bWwiLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTI2MS1SdW5MZXZlbENvbmRpdGlvbmFsLmRvY3giLCAiREEtRGF0YS54bWwiLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTI2Mi1Db25kaXRpb25hbE5vdE1hdGNoLmRvY3giLCAiREEtRGF0YS54bWwiLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTI2My1Db25kaXRpb25hbE5vdE1hdGNoLmRvY3giLCAiREEtRGF0YVNtYWxsQ3VzdG9tZXIueG1sIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEyNjQtSW52YWxpZFJ1bkxldmVsUmVwZWF0LmRvY3giLCAiREEtRGF0YS54bWwiLCB0cnVlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjY1LVJ1bkxldmVsUmVwZWF0V2l0aFdoaXRlU3BhY2VCZWZvcmUuZG9jeCIsICJEQS1EYXRhLnhtbCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjY2LVJ1bkxldmVsUmVwZWF0LU5vRGF0YS5kb2N4IiwgIkRBLURhdGEueG1sIiwgdHJ1ZSldCisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBEQTEwMShzdHJpbmcgbmFtZSwgc3RyaW5nIGRhdGEsIGJvb2wgZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyB0ZW1wbGF0ZURvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZSkpOworICAgICAgICAgICAgRmlsZUluZm8gZGF0YUZpbGUgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgZGF0YSkpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCB3bWxUZW1wbGF0ZSA9IG5ldyBXbWxEb2N1bWVudCh0ZW1wbGF0ZURvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgWEVsZW1lbnQgeG1sZGF0YSA9IFhFbGVtZW50LkxvYWQoZGF0YUZpbGUuRnVsbE5hbWUpOworCisgICAgICAgICAgICBib29sIHJldHVybmVkVGVtcGxhdGVFcnJvcjsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IGFmdGVyQXNzZW1ibGluZyA9IERvY3VtZW50QXNzZW1ibGVyLkFzc2VtYmxlRG9jdW1lbnQod21sVGVtcGxhdGUsIHhtbGRhdGEsIG91dCByZXR1cm5lZFRlbXBsYXRlRXJyb3IpOworICAgICAgICAgICAgdmFyIGFzc2VtYmxlZERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHRlbXBsYXRlRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi1wcm9jZXNzZWQtYnktRG9jdW1lbnRBc3NlbWJsZXIuZG9jeCIpKSk7CisgICAgICAgICAgICBhZnRlckFzc2VtYmxpbmcuU2F2ZUFzKGFzc2VtYmxlZERvY3guRnVsbE5hbWUpOworCisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKGFmdGVyQXNzZW1ibGluZy5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgYWZ0ZXJBc3NlbWJsaW5nLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtcywgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPcGVuWG1sVmFsaWRhdG9yIHYgPSBuZXcgT3BlblhtbFZhbGlkYXRvcigpOworICAgICAgICAgICAgICAgICAgICB2YXIgdmFsRXJyb3JzID0gdi5WYWxpZGF0ZSh3RG9jKS5XaGVyZSh2ZSA9PiAhc19FeHBlY3RlZEVycm9ycy5Db250YWlucyh2ZS5EZXNjcmlwdGlvbikpOworCisjaWYgZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIHZhbEVycm9ycy5TZWxlY3QociA9PiByLkRlc2NyaXB0aW9uKS5PcmRlckJ5KHQgPT4gdCkuRGlzdGluY3QoKSkKKwkgICAgICAgICAgICAgICAgeworCQkgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0pLkFwcGVuZChFbnZpcm9ubWVudC5OZXdMaW5lKTsKKwkgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdHJpbmcgeiA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHopOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkVtcHR5KHZhbEVycm9ycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoZXJyLCByZXR1cm5lZFRlbXBsYXRlRXJyb3IpOworICAgICAgICB9CisKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMjU5LU11bHRpTGluZUNvbnRlbnRzLmRvY3giLCAiREEtRGF0YS54bWwiLCBmYWxzZSldCisgICAgICAgIHB1YmxpYyB2b2lkIERBMjU5KHN0cmluZyBuYW1lLCBzdHJpbmcgZGF0YSwgYm9vbCBlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIERBMTAxKG5hbWUsIGRhdGEsIGVycik7CisgICAgICAgICAgICB2YXIgYXNzZW1ibGVkRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgbmFtZS5SZXBsYWNlKCIuZG9jeCIsICItcHJvY2Vzc2VkLWJ5LURvY3VtZW50QXNzZW1ibGVyLmRvY3giKSkpOworICAgICAgICAgICAgV21sRG9jdW1lbnQgYWZ0ZXJBc3NlbWJsaW5nID0gbmV3IFdtbERvY3VtZW50KGFzc2VtYmxlZERvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgaW50IGJyQ291bnQgPSBhZnRlckFzc2VtYmxpbmcuTWFpbkRvY3VtZW50UGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50KFcuYm9keSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5wKS5FbGVtZW50QXQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmJyKS5Db3VudCgpOworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDQsIGJyQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMDI0LVRyYWNrZWRSZXZpc2lvbnMuZG9jeCIsICJEQS1EYXRhLnhtbCIpXQorICAgICAgICBwdWJsaWMgdm9pZCBEQTEwMl9UaHJvd3Moc3RyaW5nIG5hbWUsIHN0cmluZyBkYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyB0ZW1wbGF0ZURvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZSkpOworICAgICAgICAgICAgRmlsZUluZm8gZGF0YUZpbGUgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgZGF0YSkpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCB3bWxUZW1wbGF0ZSA9IG5ldyBXbWxEb2N1bWVudCh0ZW1wbGF0ZURvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgWEVsZW1lbnQgeG1sZGF0YSA9IFhFbGVtZW50LkxvYWQoZGF0YUZpbGUuRnVsbE5hbWUpOworCisgICAgICAgICAgICBib29sIHJldHVybmVkVGVtcGxhdGVFcnJvcjsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IGFmdGVyQXNzZW1ibGluZzsKKyAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8T3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24+KCgpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhZnRlckFzc2VtYmxpbmcgPSBEb2N1bWVudEFzc2VtYmxlci5Bc3NlbWJsZURvY3VtZW50KHdtbFRlbXBsYXRlLCB4bWxkYXRhLCBvdXQgcmV0dXJuZWRUZW1wbGF0ZUVycm9yKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUaGVvcnldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAyNS1UZW1wbGF0ZURvY3VtZW50LmRvY3giLCAiREEtRGF0YS54bWwiLCBmYWxzZSldCisgICAgICAgIHB1YmxpYyB2b2lkIERBMTAzX1VzZVhtbERvY3VtZW50KHN0cmluZyBuYW1lLCBzdHJpbmcgZGF0YSwgYm9vbCBlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHRlbXBsYXRlRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lKSk7CisgICAgICAgICAgICBGaWxlSW5mbyBkYXRhRmlsZSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBkYXRhKSk7CisKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHdtbFRlbXBsYXRlID0gbmV3IFdtbERvY3VtZW50KHRlbXBsYXRlRG9jeC5GdWxsTmFtZSk7CisgICAgICAgICAgICBYbWxEb2N1bWVudCB4bWxkYXRhID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgICAgICB4bWxkYXRhLkxvYWQoZGF0YUZpbGUuRnVsbE5hbWUpOworCisgICAgICAgICAgICBib29sIHJldHVybmVkVGVtcGxhdGVFcnJvcjsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IGFmdGVyQXNzZW1ibGluZyA9IERvY3VtZW50QXNzZW1ibGVyLkFzc2VtYmxlRG9jdW1lbnQod21sVGVtcGxhdGUsIHhtbGRhdGEsIG91dCByZXR1cm5lZFRlbXBsYXRlRXJyb3IpOworICAgICAgICAgICAgdmFyIGFzc2VtYmxlZERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHRlbXBsYXRlRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi1wcm9jZXNzZWQtYnktRG9jdW1lbnRBc3NlbWJsZXIuZG9jeCIpKSk7CisgICAgICAgICAgICBhZnRlckFzc2VtYmxpbmcuU2F2ZUFzKGFzc2VtYmxlZERvY3guRnVsbE5hbWUpOworCisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKGFmdGVyQXNzZW1ibGluZy5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgYWZ0ZXJBc3NlbWJsaW5nLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtcywgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPcGVuWG1sVmFsaWRhdG9yIHYgPSBuZXcgT3BlblhtbFZhbGlkYXRvcigpOworICAgICAgICAgICAgICAgICAgICB2YXIgdmFsRXJyb3JzID0gdi5WYWxpZGF0ZSh3RG9jKS5XaGVyZSh2ZSA9PiAhc19FeHBlY3RlZEVycm9ycy5Db250YWlucyh2ZS5EZXNjcmlwdGlvbikpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuRW1wdHkodmFsRXJyb3JzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbChlcnIsIHJldHVybmVkVGVtcGxhdGVFcnJvcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBMaXN0PHN0cmluZz4gc19FeHBlY3RlZEVycm9ycyA9IG5ldyBMaXN0PHN0cmluZz4oKQorICAgICAgICB7CisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46ZXZlbkhCYW5kJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46ZXZlblZCYW5kJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46Zmlyc3RDb2x1bW4nIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpmaXJzdFJvdycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmZpcnN0Um93Rmlyc3RDb2x1bW4nIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpmaXJzdFJvd0xhc3RDb2x1bW4nIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpsYXN0Q29sdW1uJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46bGFzdFJvdycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmxhc3RSb3dGaXJzdENvbHVtbicgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmxhc3RSb3dMYXN0Q29sdW1uJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46bm9IQmFuZCcgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOm5vVkJhbmQnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpvZGRIQmFuZCcgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOm9kZFZCYW5kJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgIH07CisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL0RvY3VtZW50QnVpbGRlclRlc3RzLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvRG9jdW1lbnRCdWlsZGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5MWUwOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL0RvY3VtZW50QnVpbGRlclRlc3RzLmNzCkBAIC0wLDAgKzEsODA1IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkRyYXdpbmcuSW1hZ2luZzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlZhbGlkYXRpb247Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLldvcmRwcm9jZXNzaW5nOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7Cit1c2luZyBYdW5pdDsKKworI2lmICFFTElERV9YVU5JVF9URVNUUworCituYW1lc3BhY2UgT3hQdAoreworICAgIHB1YmxpYyBjbGFzcyBEYlRlc3RzCisgICAgeworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgREIwMDFfRG9jdW1lbnRCdWlsZGVyS2VlcFNlY3Rpb25zKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSAiREIwMDEtU2VjdGlvbnMuZG9jeCI7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2VEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUpKTsKKworICAgICAgICAgICAgTGlzdDxTb3VyY2U+IHNvdXJjZXMgPSBudWxsOworICAgICAgICAgICAgc291cmNlcyA9IG5ldyBMaXN0PFNvdXJjZT4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KHNvdXJjZURvY3guRnVsbE5hbWUpLCB0cnVlKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgcHJvY2Vzc2VkRGVzdERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZURvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICItcHJvY2Vzc2VkLWJ5LURvY3VtZW50QnVpbGRlci5kb2N4IikpKTsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlci5CdWlsZERvY3VtZW50KHNvdXJjZXMsIHByb2Nlc3NlZERlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIFtGYWN0XQorICAgICAgICBwdWJsaWMgdm9pZCBEQjAwMl9Eb2N1bWVudEJ1aWxkZXJLZWVwU2VjdGlvbnNEaXNjYXJkSGVhZGVycygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTFEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsICJEQjAwMi1TZWN0aW9ucy1XaXRoLUhlYWRlcnMuZG9jeCIpKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTJEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsICJEQjAwMi1MYW5kc2NhcGUtU2VjdGlvbi5kb2N4IikpOworCisgICAgICAgICAgICBMaXN0PFNvdXJjZT4gc291cmNlcyA9IG51bGw7CisgICAgICAgICAgICBzb3VyY2VzID0gbmV3IExpc3Q8U291cmNlPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMURvY3guRnVsbE5hbWUpKSB7IEtlZXBTZWN0aW9ucyA9IHRydWUgfSwKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChzb3VyY2UyRG9jeC5GdWxsTmFtZSkpIHsgS2VlcFNlY3Rpb25zID0gdHJ1ZSwgRGlzY2FyZEhlYWRlcnNBbmRGb290ZXJzSW5LZXB0U2VjdGlvbnMgPSB0cnVlIH0sCisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMURvY3guRnVsbE5hbWUpKSB7IEtlZXBTZWN0aW9ucyA9IHRydWUgfSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgcHJvY2Vzc2VkRGVzdERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsICJEQjAwMi1LZWVwLVNlY3Rpb25zLURpc2NhcmQtSGVhZGVycy1BbmQtRm9vdGVycy5kb2N4IikpOworICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyLkJ1aWxkRG9jdW1lbnQoc291cmNlcywgcHJvY2Vzc2VkRGVzdERvY3guRnVsbE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgW0ZhY3RdCisgICAgICAgIHB1YmxpYyB2b2lkIERCMDAzX0RvY3VtZW50QnVpbGRlck9ubHlEZWZhdWx0SGVhZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMURvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgIkRCMDAzLU9ubHktRGVmYXVsdC1IZWFkZXIuZG9jeCIpKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTJEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsICJEQjAwMi1MYW5kc2NhcGUtU2VjdGlvbi5kb2N4IikpOworCisgICAgICAgICAgICBMaXN0PFNvdXJjZT4gc291cmNlcyA9IG51bGw7CisgICAgICAgICAgICBzb3VyY2VzID0gbmV3IExpc3Q8U291cmNlPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMURvY3guRnVsbE5hbWUpKSB7IEtlZXBTZWN0aW9ucyA9IHRydWUgfSwKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChzb3VyY2UyRG9jeC5GdWxsTmFtZSkpIHsgS2VlcFNlY3Rpb25zID0gdHJ1ZSwgRGlzY2FyZEhlYWRlcnNBbmRGb290ZXJzSW5LZXB0U2VjdGlvbnMgPSB0cnVlIH0sCisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMURvY3guRnVsbE5hbWUpKSB7IEtlZXBTZWN0aW9ucyA9IHRydWUgfSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgcHJvY2Vzc2VkRGVzdERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsICJEQjAwMy1Pbmx5LURlZmF1bHQtSGVhZGVyLmRvY3giKSk7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIuQnVpbGREb2N1bWVudChzb3VyY2VzLCBwcm9jZXNzZWREZXN0RG9jeC5GdWxsTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgREIwMDRfRG9jdW1lbnRCdWlsZGVyTm9IZWFkZXJzKCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMURvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgIkRCMDA0LU5vLUhlYWRlcnMuZG9jeCIpKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTJEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsICJEQjAwMi1MYW5kc2NhcGUtU2VjdGlvbi5kb2N4IikpOworCisgICAgICAgICAgICBMaXN0PFNvdXJjZT4gc291cmNlcyA9IG51bGw7CisgICAgICAgICAgICBzb3VyY2VzID0gbmV3IExpc3Q8U291cmNlPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMURvY3guRnVsbE5hbWUpKSB7IEtlZXBTZWN0aW9ucyA9IHRydWUgfSwKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChzb3VyY2UyRG9jeC5GdWxsTmFtZSkpIHsgS2VlcFNlY3Rpb25zID0gdHJ1ZSwgRGlzY2FyZEhlYWRlcnNBbmRGb290ZXJzSW5LZXB0U2VjdGlvbnMgPSB0cnVlIH0sCisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMURvY3guRnVsbE5hbWUpKSB7IEtlZXBTZWN0aW9ucyA9IHRydWUgfSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgcHJvY2Vzc2VkRGVzdERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsICJEQjAwMy1Pbmx5LURlZmF1bHQtSGVhZGVyLmRvY3giKSk7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIuQnVpbGREb2N1bWVudChzb3VyY2VzLCBwcm9jZXNzZWREZXN0RG9jeC5GdWxsTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgREIwMDVfSGVhZGVyc1dpdGhSZWZzVG9JbWFnZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UxRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCAiREIwMDUtSGVhZGVycy1XaXRoLUltYWdlcy5kb2N4IikpOworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMkRvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgIkRCMDAyLUxhbmRzY2FwZS1TZWN0aW9uLmRvY3giKSk7CisKKyAgICAgICAgICAgIExpc3Q8U291cmNlPiBzb3VyY2VzID0gbnVsbDsKKyAgICAgICAgICAgIHNvdXJjZXMgPSBuZXcgTGlzdDxTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChzb3VyY2UxRG9jeC5GdWxsTmFtZSkpIHsgS2VlcFNlY3Rpb25zID0gdHJ1ZSB9LAorICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KHNvdXJjZTJEb2N4LkZ1bGxOYW1lKSkgeyBLZWVwU2VjdGlvbnMgPSB0cnVlLCBEaXNjYXJkSGVhZGVyc0FuZEZvb3RlcnNJbktlcHRTZWN0aW9ucyA9IHRydWUgfSwKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChzb3VyY2UxRG9jeC5GdWxsTmFtZSkpIHsgS2VlcFNlY3Rpb25zID0gdHJ1ZSB9LAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHZhciBwcm9jZXNzZWREZXN0RG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgIkRCMDA1LmRvY3giKSk7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIuQnVpbGREb2N1bWVudChzb3VyY2VzLCBwcm9jZXNzZWREZXN0RG9jeC5GdWxsTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgREIwMDZfRXhhbXBsZV9Eb2N1bWVudEJ1aWxkZXIwMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTEgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgIkRCMDA2LVNvdXJjZTEuZG9jeCIpKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTIgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgIkRCMDA2LVNvdXJjZTIuZG9jeCIpKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTMgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgIkRCMDA2LVNvdXJjZTMuZG9jeCIpKTsKKyAgICAgICAgICAgIExpc3Q8U291cmNlPiBzb3VyY2VzID0gbnVsbDsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBkb2N1bWVudCBmcm9tIDEwIHBhcmFncmFwaHMgc3RhcnRpbmcgYXQgcGFyYWdyYXBoIDUgb2YgU291cmNlMS5kb2N4CisgICAgICAgICAgICBzb3VyY2VzID0gbmV3IExpc3Q8U291cmNlPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMS5GdWxsTmFtZSksIDUsIDEwLCB0cnVlKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgb3V0MSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgIkRCMDA2LU91dDEuZG9jeCIpKTsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlci5CdWlsZERvY3VtZW50KHNvdXJjZXMsIG91dDEuRnVsbE5hbWUpOworICAgICAgICAgICAgVmFsaWRhdGUob3V0MSk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgZG9jdW1lbnQgZnJvbSBwYXJhZ3JhcGggMSwgYW5kIHBhcmFncmFwaHMgNSB0aHJvdWdoIGVuZCBvZiBTb3VyY2UzLmRvY3guCisgICAgICAgICAgICAvLyBUaGlzIGVmZmVjdGl2ZWx5ICdkZWxldGVzJyBwYXJhZ3JhcGhzIDItNAorICAgICAgICAgICAgc291cmNlcyA9IG5ldyBMaXN0PFNvdXJjZT4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KHNvdXJjZTMuRnVsbE5hbWUpLCAwLCAxLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMy5GdWxsTmFtZSksIDQsIGZhbHNlKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgb3V0MiA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgIkRCMDA2LU91dDIuZG9jeCIpKTsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlci5CdWlsZERvY3VtZW50KHNvdXJjZXMsIG91dDIuRnVsbE5hbWUpOworICAgICAgICAgICAgVmFsaWRhdGUob3V0Mik7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBkb2N1bWVudCB0aGF0IGNvbnNpc3RzIG9mIHRoZSBlbnRpcmV0eSBvZiBTb3VyY2UxLmRvY3ggYW5kIFNvdXJjZTIuZG9jeC4gIFVzZQorICAgICAgICAgICAgLy8gdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24gKGhlYWRpbmdzIGFuZCBmb290ZXJzKSBmcm9tIHNvdXJjZTEuCisgICAgICAgICAgICBzb3VyY2VzID0gbmV3IExpc3Q8U291cmNlPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMS5GdWxsTmFtZSksIHRydWUpLAorICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KHNvdXJjZTIuRnVsbE5hbWUpLCBmYWxzZSksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdmFyIG91dDMgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsICJEQjAwNi1PdXQzLmRvY3giKSk7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIuQnVpbGREb2N1bWVudChzb3VyY2VzLCBvdXQzLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFZhbGlkYXRlKG91dDMpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgZG9jdW1lbnQgdGhhdCBjb25zaXN0cyBvZiB0aGUgZW50aXJldHkgb2YgU291cmNlMS5kb2N4IGFuZCBTb3VyY2UyLmRvY3guICBVc2UKKyAgICAgICAgICAgIC8vIHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uIChoZWFkaW5ncyBhbmQgZm9vdGVycykgZnJvbSBzb3VyY2UyLgorICAgICAgICAgICAgc291cmNlcyA9IG5ldyBMaXN0PFNvdXJjZT4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KHNvdXJjZTEuRnVsbE5hbWUpLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMi5GdWxsTmFtZSksIHRydWUpLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHZhciBvdXQ0ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCAiREIwMDYtT3V0NC5kb2N4IikpOworICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyLkJ1aWxkRG9jdW1lbnQoc291cmNlcywgb3V0NC5GdWxsTmFtZSk7CisgICAgICAgICAgICBWYWxpZGF0ZShvdXQ0KTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRvY3VtZW50IHRoYXQgY29uc2lzdHMgb2YgdGhlIGZpcnN0IDUgcGFyYWdyYXBocyBvZiBTb3VyY2UxLmRvY3ggYW5kIHRoZSBmaXJzdAorICAgICAgICAgICAgLy8gZml2ZSBwYXJhZ3JhcGhzIG9mIFNvdXJjZTIuZG9jeC4gIFRoaXMgZXhhbXBsZSByZXR1cm5zIGEgbmV3IFdtbERvY3VtZW50LCB3aGVuIHlvdSB0aGVuIGNhbgorICAgICAgICAgICAgLy8gc2VyaWFsaXplIHRvIGEgU2hhcmVQb2ludCBkb2N1bWVudCBsaWJyYXJ5LCBvciB1c2UgaW4gc29tZSBvdGhlciBpbnRlcmVzdGluZyBzY2VuYXJpby4KKyAgICAgICAgICAgIHNvdXJjZXMgPSBuZXcgTGlzdDxTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChzb3VyY2UxLkZ1bGxOYW1lKSwgMCwgNSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KHNvdXJjZTIuRnVsbE5hbWUpLCAwLCA1LCB0cnVlKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBXbWxEb2N1bWVudCB3bWxPdXQ1ID0gRG9jdW1lbnRCdWlsZGVyLkJ1aWxkRG9jdW1lbnQoc291cmNlcyk7CisgICAgICAgICAgICB2YXIgb3V0NSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgIkRCMDA2LU91dDUuZG9jeCIpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgd21sT3V0NS5TYXZlQXMob3V0NS5GdWxsTmFtZSk7ICAvLyBzYXZlIGl0IHRvIHRoZSBmaWxlIHN5c3RlbSwgYnV0IHdlIGNvdWxkIGp1c3QgYXMgZWFzaWx5IGRvbmUgc29tZXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2Ugd2l0aCBpdC4KKyAgICAgICAgICAgIFZhbGlkYXRlKG91dDUpOworICAgICAgICB9CisKKyAgICAgICAgW0ZhY3RdCisgICAgICAgIHB1YmxpYyB2b2lkIERCMDA3X0V4YW1wbGVfRG9jdW1lbnRCdWlsZGVyMDJfV2hpdGVQYXBlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNwZWMgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgIkRCMDA3LVNwZWMuZG9jeCIpKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIHdoaXRlUGFwZXIgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgIkRCMDA3LVdoaXRlUGFwZXIuZG9jeCIpKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIHBhcGVyQWJzdHJhY3QgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgIkRCMDA3LUFic3RyYWN0LmRvY3giKSk7CisgICAgICAgICAgICBGaWxlSW5mbyBhdXRob3JCaW8gPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgIkRCMDA3LUF1dGhvckJpb2dyYXBoeS5kb2N4IikpOworCisgICAgICAgICAgICBMaXN0PFNvdXJjZT4gc291cmNlcyA9IG51bGw7CisgICAgICAgICAgICBzb3VyY2VzID0gbmV3IExpc3Q8U291cmNlPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQod2hpdGVQYXBlci5GdWxsTmFtZSksIDAsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KHBhcGVyQWJzdHJhY3QuRnVsbE5hbWUpLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoYXV0aG9yQmlvLkZ1bGxOYW1lKSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KHdoaXRlUGFwZXIuRnVsbE5hbWUpLCAxLCBmYWxzZSksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdmFyIGFzc2VtYmxlZFBhcGVyID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCAiREIwMDctQXNzZW1ibGVkUGFwZXIuZG9jeCIpKTsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlci5CdWlsZERvY3VtZW50KHNvdXJjZXMsIGFzc2VtYmxlZFBhcGVyLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFZhbGlkYXRlKGFzc2VtYmxlZFBhcGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIFtGYWN0XQorICAgICAgICBwdWJsaWMgdm9pZCBEQjAwOF9EZWxldGVQYXJhc1dpdGhHaXZlblN0eWxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gbm90ZXMgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgIkRCMDA3LU5vdGVzLmRvY3giKSk7CisKKyAgICAgICAgICAgIExpc3Q8U291cmNlPiBzb3VyY2VzID0gbnVsbDsKKyAgICAgICAgICAgIC8vIERlbGV0ZSBhbGwgcGFyYWdyYXBocyB3aXRoIGEgc3BlY2lmaWMgc3R5bGUuCisgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obm90ZXMuRnVsbE5hbWUsIGZhbHNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzb3VyY2VzID0gZG9jCisgICAgICAgICAgICAgICAgICAgIC5NYWluRG9jdW1lbnRQYXJ0CisgICAgICAgICAgICAgICAgICAgIC5HZXRYRG9jdW1lbnQoKQorICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudChXLmJvZHkpCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoKHAsIGkpID0+IG5ldworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhZ3JhcGggPSBwLAorICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggPSBpLAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAuR3JvdXBBZGphY2VudChwaSA9PiAoc3RyaW5nKXBpLlBhcmFncmFwaAorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucFByKQorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucFN0eWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy52YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKSAhPSAiTm90ZSIpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShnID0+IGcuS2V5ID09IHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZyA9PiBuZXcgU291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdtbERvY3VtZW50KG5vdGVzLkZ1bGxOYW1lKSwgZy5GaXJzdCgpLkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuTGFzdCgpLkluZGV4IC0gZy5GaXJzdCgpLkluZGV4ICsgMSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBuZXdOb3RlcyA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgIkRCMDA4LU5ld05vdGVzLmRvY3giKSk7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIuQnVpbGREb2N1bWVudChzb3VyY2VzLCBuZXdOb3Rlcy5GdWxsTmFtZSk7CisgICAgICAgICAgICBWYWxpZGF0ZShuZXdOb3Rlcyk7CisgICAgICAgIH0KKworICAgICAgICBbVGhlb3J5XQorICAgICAgICBbSW5saW5lRGF0YSgiREIwMDktMDAwMTAiLCAiREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0NvbnRlbnQtQ29udHJvbHMuZG9jeCIsICJEQi9IZWFkZXJzRm9vdGVycy9EZXN0L0ZheC5kb2N4IiwgIlRlbXBsYWZ5IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjAwOS0wMDAyMCIsICJEQi9IZWFkZXJzRm9vdGVycy9TcmMvTGV0dGVyaGVhZC5kb2N4IiwgIkRCL0hlYWRlcnNGb290ZXJzL0Rlc3QvRmF4LmRvY3giLCAiVGVtcGxhZnkiKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCMDA5LTAwMDMwIiwgIkRCL0hlYWRlcnNGb290ZXJzL1NyYy9MZXR0ZXJoZWFkLXdpdGgtV2F0ZXJtYXJrLmRvY3giLCAiREIvSGVhZGVyc0Zvb3RlcnMvRGVzdC9GYXguZG9jeCIsICJUZW1wbGFmeSIpXQorICAgICAgICBbSW5saW5lRGF0YSgiREIwMDktMDAwNDAiLCAiREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0xvZ28uZG9jeCIsICJEQi9IZWFkZXJzRm9vdGVycy9EZXN0L0ZheC5kb2N4IiwgIlRlbXBsYWZ5IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjAwOS0wMDA1MCIsICJEQi9IZWFkZXJzRm9vdGVycy9TcmMvV2F0ZXJtYXJrLTEuZG9jeCIsICJEQi9IZWFkZXJzRm9vdGVycy9EZXN0L0ZheC5kb2N4IiwgIlRlbXBsYWZ5IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjAwOS0wMDA2MCIsICJEQi9IZWFkZXJzRm9vdGVycy9TcmMvV2F0ZXJtYXJrLTIuZG9jeCIsICJEQi9IZWFkZXJzRm9vdGVycy9EZXN0L0ZheC5kb2N4IiwgIlRlbXBsYWZ5IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjAwOS0wMDA3MCIsICJEQi9IZWFkZXJzRm9vdGVycy9TcmMvRGlzY2xhaW1lci5kb2N4IiwgIkRCL0hlYWRlcnNGb290ZXJzL0Rlc3QvRmF4LmRvY3giLCAiVGVtcGxhZnkiKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCMDA5LTAwMDgwIiwgIkRCL0hlYWRlcnNGb290ZXJzL1NyYy9Gb290ZXIuZG9jeCIsICJEQi9IZWFkZXJzRm9vdGVycy9EZXN0L0ZheC5kb2N4IiwgIlRlbXBsYWZ5IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjAwOS0wMDExMCIsICJEQi9IZWFkZXJzRm9vdGVycy9TcmMvQ29udGVudC1Db250cm9scy5kb2N4IiwgIkRCL0hlYWRlcnNGb290ZXJzL0Rlc3QvTGV0dGVyLmRvY3giLCAiVGVtcGxhZnkiKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCMDA5LTAwMTIwIiwgIkRCL0hlYWRlcnNGb290ZXJzL1NyYy9MZXR0ZXJoZWFkLmRvY3giLCAiREIvSGVhZGVyc0Zvb3RlcnMvRGVzdC9MZXR0ZXIuZG9jeCIsICJUZW1wbGFmeSIpXQorICAgICAgICBbSW5saW5lRGF0YSgiREIwMDktMDAxMzAiLCAiREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0xldHRlcmhlYWQtd2l0aC1XYXRlcm1hcmsuZG9jeCIsICJEQi9IZWFkZXJzRm9vdGVycy9EZXN0L0xldHRlci5kb2N4IiwgIlRlbXBsYWZ5IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjAwOS0wMDE0MCIsICJEQi9IZWFkZXJzRm9vdGVycy9TcmMvTG9nby5kb2N4IiwgIkRCL0hlYWRlcnNGb290ZXJzL0Rlc3QvTGV0dGVyLmRvY3giLCAiVGVtcGxhZnkiKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCMDA5LTAwMTUwIiwgIkRCL0hlYWRlcnNGb290ZXJzL1NyYy9XYXRlcm1hcmstMS5kb2N4IiwgIkRCL0hlYWRlcnNGb290ZXJzL0Rlc3QvTGV0dGVyLmRvY3giLCAiVGVtcGxhZnkiKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCMDA5LTAwMTYwIiwgIkRCL0hlYWRlcnNGb290ZXJzL1NyYy9XYXRlcm1hcmstMi5kb2N4IiwgIkRCL0hlYWRlcnNGb290ZXJzL0Rlc3QvTGV0dGVyLmRvY3giLCAiVGVtcGxhZnkiKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCMDA5LTAwMTcwIiwgIkRCL0hlYWRlcnNGb290ZXJzL1NyYy9EaXNjbGFpbWVyLmRvY3giLCAiREIvSGVhZGVyc0Zvb3RlcnMvRGVzdC9MZXR0ZXIuZG9jeCIsICJUZW1wbGFmeSIpXQorICAgICAgICBbSW5saW5lRGF0YSgiREIwMDktMDAxODAiLCAiREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0Zvb3Rlci5kb2N4IiwgIkRCL0hlYWRlcnNGb290ZXJzL0Rlc3QvTGV0dGVyLmRvY3giLCAiVGVtcGxhZnkiKV0KKworICAgICAgICBwdWJsaWMgdm9pZCBEQjAwOV9JbXBvcnRJbnRvSGVhZGVyc0Zvb3RlcnMoc3RyaW5nIHRlc3RJZCwgc3RyaW5nIHNyYywgc3RyaW5nIGRlc3QsIHN0cmluZyBpbnNlcnRJZCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIC8vIExvYWQgdGhlIHNvdXJjZSBkb2N1bWVudAorICAgICAgICAgICAgRmlsZUluZm8gc291cmNlRG9jeEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIHNyYykpOworICAgICAgICAgICAgV21sRG9jdW1lbnQgd21sU291cmNlRG9jdW1lbnQgPSBuZXcgV21sRG9jdW1lbnQoc291cmNlRG9jeEZpLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIC8vIExvYWQgdGhlIGRlc3QgZG9jdW1lbnQKKyAgICAgICAgICAgIEZpbGVJbmZvIGRlc3REb2N4RmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgZGVzdCkpOworICAgICAgICAgICAgV21sRG9jdW1lbnQgd21sRGVzdERvY3VtZW50ID0gbmV3IFdtbERvY3VtZW50KGRlc3REb2N4RmkuRnVsbE5hbWUpOworCisgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBkaXIgZm9yIHRoZSB0ZXN0CisgICAgICAgICAgICB2YXIgcm9vdFRlbXBEaXIgPSBUZXN0VXRpbC5UZW1wRGlyOworICAgICAgICAgICAgdmFyIHRoaXNUZXN0VGVtcERpciA9IG5ldyBEaXJlY3RvcnlJbmZvKFBhdGguQ29tYmluZShyb290VGVtcERpci5GdWxsTmFtZSwgdGVzdElkKSk7CisgICAgICAgICAgICBpZiAodGhpc1Rlc3RUZW1wRGlyLkV4aXN0cykKKyAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShmYWxzZSwgIkR1cGxpY2F0ZSB0ZXN0IGlkOiAiICsgdGVzdElkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aGlzVGVzdFRlbXBEaXIuQ3JlYXRlKCk7CisgICAgICAgICAgICB2YXIgdGVtcERpckZ1bGxOYW1lID0gdGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lOworCisgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgLy8gQ29weSBzcmMgRE9DWCB0byB0ZW1wIGRpcmVjdG9yeSwgZm9yIGVhc2Ugb2YgcmV2aWV3CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vLyBDT0RFIFRPIFJFUEVBVCBVTlRJTCBTVUNDRVNTIC8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZURvY3hDb3BpZWRUb0Rlc3RGaWxlTmFtZSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGVtcERpckZ1bGxOYW1lLCBzb3VyY2VEb2N4RmkuTmFtZSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZURvY3hDb3BpZWRUb0Rlc3RGaWxlTmFtZS5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgICAgICB3bWxTb3VyY2VEb2N1bWVudC5TYXZlQXMoc291cmNlRG9jeENvcGllZFRvRGVzdEZpbGVOYW1lLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5UaHJlYWRpbmcuVGhyZWFkLlNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAvLyBDb3B5IGRlc3QgRE9DWCB0byB0ZW1wIGRpcmVjdG9yeSwgZm9yIGVhc2Ugb2YgcmV2aWV3CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vLyBDT0RFIFRPIFJFUEVBVCBVTlRJTCBTVUNDRVNTIC8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAgICAgdmFyIGRlc3REb2N4Q29waWVkVG9EZXN0RmlsZU5hbWUgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHRlbXBEaXJGdWxsTmFtZSwgZGVzdERvY3hGaS5OYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZGVzdERvY3hDb3BpZWRUb0Rlc3RGaWxlTmFtZS5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgICAgICB3bWxEZXN0RG9jdW1lbnQuU2F2ZUFzKGRlc3REb2N4Q29waWVkVG9EZXN0RmlsZU5hbWUuRnVsbE5hbWUpOworICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoNTApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTGlzdDxTb3VyY2U+IHNvdXJjZXMgPSBuZXcgTGlzdDxTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKHdtbERlc3REb2N1bWVudCksCisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZSh3bWxTb3VyY2VEb2N1bWVudCwgaW5zZXJ0SWQpLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdmFyIG91dEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0ZW1wRGlyRnVsbE5hbWUsICJPdXRwdXQuZG9jeCIpKTsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlci5CdWlsZERvY3VtZW50KHNvdXJjZXMsIG91dEZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFZhbGlkYXRlKG91dEZpKTsKKyAgICAgICAgfQorCisjaWYgZmFsc2UKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCOTk5LTAwMDEwIiwgIkRCVEVNUC8wM0RFNTczODRCODdBQTZDMkEzQkRFODdEREREN0Y4ODBEQzU1RS5kb2N4IiwgdHJ1ZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjk5OS0wMDAyMCIsICJEQlRFTVAvMEQzREVCMjdFRDAzNjExNjQ2NkJFRDYxNkIyMDU2Q0REMjc4M0EuZG9jeCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCOTk5LTAwMDMwIiwgIkRCVEVNUC80MjE2MjhCM0Y0QjAzQjEyM0NBOEVEREE1MDA5RTQ0OUY1RjQ3RC5kb2N4IiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREI5OTktMDAwNDAiLCAiREJURU1QLzU4RDRFODY2MUM3RjQ0RkUzMzM5MkI4OUIwQTNDQjBBRjE2ODRGLmRvY3giLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjk5OS0wMDA1MCIsICJEQlRFTVAvNjdFQkNBNjI3RDZENTg0Q0FCM0VCMURGMkU0QzM5ODIwMjNERUUuZG9jeCIsIHRydWUpXQorICAgICAgICBbSW5saW5lRGF0YSgiREI5OTktMDAwNjAiLCAiREJURU1QL0E1Mjk2NDNFMkZDM0UyQzY4MkZBODZERUUwQTFCMzA2NERDRUUwLmRvY3giLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjk5OS0wMDA3MCIsICJEQlRFTVAvRTc5NDAzMkYwNDIyQjQ0MEQzQzU2NEYwRTA5RTM5NTUxOTEyN0QuZG9jeCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCOTk5LTAwMDgwIiwgIkRCVEVNUC8xRkYxQURGMzBCMjQ5NzhFOTQ0OTc1NDQ1OUM3NDNEM0JDNjdFRC5kb2N4IiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREI5OTktMDAwOTAiLCAiREJURU1QLzVFNjg1OTI3REEyRkVDQjg4REU5Q0FGMEJFQ0VDODhCQzExOEE3LmRvY3giLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjk5OS0wMDEwMCIsICJEQlRFTVAvNjQyN0JDRjVDMThCNTVENjI3Qjk1RjNFMTQ5MjQwNTA2MjhDNUIuZG9jeCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCOTk5LTAwMTEwIiwgIkRCVEVNUC85MTY5MUUwRDNBQjg5RTk5MjdBMkJBQzVEMzg1QkI2Mjc3NjQ4Ri5kb2N4IiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREI5OTktMDAxMjAiLCAiREJURU1QLzk1MzNCQzU3MTAxOTBFQTAxREE4NkQyOUNEMDY4ODAzOTVDNEFGLmRvY3giLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjk5OS0wMDEzMCIsICJEQlRFTVAvRTlDRDhDNTU2QUE1MkNBN0QzMURBREI1MUEyMDFFRUY1ODBBQTguZG9jeCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCOTk5LTAwMTQwIiwgIkRCVEVNUC8yMUQzQ0UxNDlDMzBCNzkxRjlBOEJFMDkyODI4RTE0NjlBOTA0Ny5kb2N4IiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREI5OTktMDAxNTAiLCAiREJURU1QL0FDMENCOENFNDNBN0VDQUU5OTVCQjU0MkQ0RkIxMDYwRkI4MzVCLmRvY3giLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjk5OS0wMDE2MCIsICJEQlRFTVAvQzYxRjY5QjUyRUM4QjBFMkM3ODRDOTMyQjI2RjNDNjEzQUU2NzEuZG9jeCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCOTk5LTAwMTcwIiwgIkRCVEVNUC8xREYwNEE5MTMwQjNFRjg1OEFDQTY4MzdBNzA2QTQyOTkwNDk3My5kb3RtIiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREI5OTktMDAxODAiLCAiREJURU1QLzZFOUYyNkI3MDhERTYwNzZCMkM3MzFCOTdBQUE1Mjg4RDgzOUFCLmRvY20iLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjk5OS0wMDE5MCIsICJEQlRFTVAvQTY2NDk3MjZFQTBCRDc1NDU5MzJEREQ1MTQwM0Q4M0U0RDU5MTcuZG9jeCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCOTk5LTAwMjAwIiwgIkRCVEVNUC9DOEFFOEFEMEE3M0YyNEI3Q0ZDRkQxMTkxOEIzMzdDRjJCOTBDOS5kb2N4IiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREI5OTktMDAyMTAiLCAiREJURU1QL0JDNDZBN0ZCQjIxMkVGRDEwODc4QTM5RDkxQUUzRUNBQUREQUIwLmRvY3giLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjk5OS0wMDIyMCIsICJEQlRFTVAvQjZGMEU5MzhCNTA4Njc2QjMyMkM0N0YzRTBFMjlDOEQ3ODZEQjIuZG9jbSIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCOTk5LTAwMjMwIiwgIkRCVEVNUC9ENEQ4Njk0QTUxREVDQTI0M0FGNzQ4QjMyMzJCRTU2NUVFRTE5RC5kb2N4IiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREI5OTktMDAyNDAiLCAiREJURU1QL0YyMEIzQ0U3MkJGNjM1NDYyRTIyQkEzQ0E4MUNBOUQ1N0Y2RkVCLmRvY3giLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjk5OS0wMDI1MCIsICJEQlRFTVAvNzRFRDEwNkZGODhDMUIxOTVEOTdDNDY2RTAwQkVDQ0I2MzZBMDMuZG9jeCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCOTk5LTAwMjYwIiwgIkRCVEVNUC80NDIxQTRCN0I2RUNDMjgxMzA3MDMwOUFBMkQ4NkM0QkNBNEFFRi5kb2N4IiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREI5OTktMDAyNzAiLCAiREJURU1QL0JDN0Q5MUI5OTM4MDc1MThGM0Q0MzBCN0M2NTkyQUZENkJEOTFDLmRvY3giLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjk5OS0wMDI4MCIsICJEQlRFTVAvMzAwNkU3NkZFNjVFOEEyNUE5MUVEMjA0RUVCRUU2RDZENjJBNDQuZG9jeCIsIGZhbHNlKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRCOTk5LTAwMjkwIiwgIkRCVEVNUC82MjU0Qjc0Nzc4QkZGQ0QxNzk5RjRGMkIzQjAxQzIwMjVBQUJCMi5kb2N4IiwgZmFsc2UpXQorICAgICAgICBbSW5saW5lRGF0YSgiREI5OTktMDAzMDAiLCAiREJURU1QLzVBRDBBMEJEOTk2NzZCMjY4RDhFN0MxRjY5MjM4RkI5QjYxNDlFLmRvY3giLCBmYWxzZSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQjk5OS0wMDMxMCIsICJEQlRFTVAvMkQ1ODQ5NUVDQ0YzMEVEOTUwN0I3MDdDNjg5Q0E5QzlENEIwNDkuZG9jeCIsIGZhbHNlKV0KKworICAgICAgICBwdWJsaWMgdm9pZCBEQjk5OV9Eb2N1bWVudEJ1aWxkZXIoc3RyaW5nIHRlc3RJZCwgc3RyaW5nIHNyYywgYm9vbCBzaG91bGRUaHJvdykKKyAgICAgICAgeworICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIC8vIExvYWQgdGhlIHNvdXJjZSBkb2N1bWVudAorICAgICAgICAgICAgRmlsZUluZm8gc291cmNlRG9jeEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIHNyYykpOworICAgICAgICAgICAgV21sRG9jdW1lbnQgd21sU291cmNlRG9jdW1lbnQgPSBuZXcgV21sRG9jdW1lbnQoc291cmNlRG9jeEZpLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZGlyIGZvciB0aGUgdGVzdAorICAgICAgICAgICAgdmFyIHJvb3RUZW1wRGlyID0gVGVzdFV0aWwuVGVtcERpcjsKKyAgICAgICAgICAgIHZhciB0aGlzVGVzdFRlbXBEaXIgPSBuZXcgRGlyZWN0b3J5SW5mbyhQYXRoLkNvbWJpbmUocm9vdFRlbXBEaXIuRnVsbE5hbWUsIHRlc3RJZCkpOworICAgICAgICAgICAgaWYgKHRoaXNUZXN0VGVtcERpci5FeGlzdHMpCisgICAgICAgICAgICAgICAgQXNzZXJ0LlRydWUoZmFsc2UsICJEdXBsaWNhdGUgdGVzdCBpZDogIiArIHRlc3RJZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhpc1Rlc3RUZW1wRGlyLkNyZWF0ZSgpOworICAgICAgICAgICAgdmFyIHRlbXBEaXJGdWxsTmFtZSA9IHRoaXNUZXN0VGVtcERpci5GdWxsTmFtZTsKKworICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIC8vIENvcHkgc3JjIERPQ1ggdG8gdGVtcCBkaXJlY3RvcnksIGZvciBlYXNlIG9mIHJldmlldworCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8gQ09ERSBUTyBSRVBFQVQgVU5USUwgU1VDQ0VTUyAvLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgICAgIHZhciBzb3VyY2VEb2N4Q29waWVkVG9EZXN0RmlsZU5hbWUgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHRlbXBEaXJGdWxsTmFtZSwgc291cmNlRG9jeEZpLk5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzb3VyY2VEb2N4Q29waWVkVG9EZXN0RmlsZU5hbWUuRXhpc3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgd21sU291cmNlRG9jdW1lbnQuU2F2ZUFzKHNvdXJjZURvY3hDb3BpZWRUb0Rlc3RGaWxlTmFtZS5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcCg1MCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMaXN0PHN0cmluZz4gZXhwZWN0ZWRFcnJvcnM7CisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKHdtbFNvdXJjZURvY3VtZW50LkRvY3VtZW50Qnl0ZUFycmF5LCAwLCB3bWxTb3VyY2VEb2N1bWVudC5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obXMsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IE9wZW5YbWxWYWxpZGF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRFcnJvcnMgPSB2YWxpZGF0b3IuVmFsaWRhdGUod0RvYykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZSA9PiBlLkRlc2NyaXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgLkRpc3RpbmN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBzX0V4cGVjdGVkRXJyb3JzKQorICAgICAgICAgICAgICAgIGV4cGVjdGVkRXJyb3JzLkFkZChpdGVtKTsKKworICAgICAgICAgICAgTGlzdDxTb3VyY2U+IHNvdXJjZXMgPSBuZXcgTGlzdDxTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKHdtbFNvdXJjZURvY3VtZW50LCB0cnVlKSwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHZhciBvdXRGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGVtcERpckZ1bGxOYW1lLCAiT3V0cHV0LmRvY3giKSk7CisKKyAgICAgICAgICAgIGlmIChzaG91bGRUaHJvdykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuVGhyb3dzPERvY3VtZW50QnVpbGRlckV4Y2VwdGlvbj4oKCkgPT4gRG9jdW1lbnRCdWlsZGVyLkJ1aWxkRG9jdW1lbnQoc291cmNlcywgb3V0RmkuRnVsbE5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgb3V0V21sID0gRG9jdW1lbnRCdWlsZGVyLkJ1aWxkRG9jdW1lbnQoc291cmNlcyk7CisgICAgICAgICAgICAgICAgb3V0V21sLlNhdmVBcyhvdXRGaS5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbXMuV3JpdGUob3V0V21sLkRvY3VtZW50Qnl0ZUFycmF5LCAwLCBvdXRXbWwuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtcywgZmFsc2UpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBPcGVuWG1sVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBPcGVuWG1sVmFsaWRhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gdmFsaWRhdG9yLlZhbGlkYXRlKHdEb2MpLldoZXJlKGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RyID0gZS5EZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZWUgaW4gZXhwZWN0ZWRFcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyLkNvbnRhaW5zKGVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMuQ291bnQoKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gZXJyb3JzLlNlbGVjdChlID0+IGUuRGVzY3JpcHRpb24gKyBFbnZpcm9ubWVudC5OZXdMaW5lKS5TdHJpbmdDb25jYXRlbmF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5UcnVlKGZhbHNlLCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBwcml2YXRlIGNsYXNzIERvY3VtZW50SW5mbworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IERvY3VtZW50TnVtYmVyOworICAgICAgICAgICAgcHVibGljIGludCBTdGFydDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgQ291bnQ7CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgREIwMDlfU2hyZWREb2N1bWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNwZWMgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgIkRCMDA3LVNwZWMuZG9jeCIpKTsKKyAgICAgICAgICAgIC8vIFNocmVkIGEgZG9jdW1lbnQgaW50byBtdWx0aXBsZSBwYXJ0cyBmb3IgZWFjaCBzZWN0aW9uCisgICAgICAgICAgICBMaXN0PERvY3VtZW50SW5mbz4gZG9jdW1lbnRMaXN0OworICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKHNwZWMuRnVsbE5hbWUsIGZhbHNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2VjdGlvbkNvdW50cyA9IGRvYworICAgICAgICAgICAgICAgICAgICAuTWFpbkRvY3VtZW50UGFydAorICAgICAgICAgICAgICAgICAgICAuR2V0WERvY3VtZW50KCkKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQoVy5ib2R5KQorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAuUm9sbHVwKDAsIChwaSwgbGFzdCkgPT4gKHN0cmluZylwaQorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucFByKQorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucFN0eWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy52YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKSA9PSAiSGVhZGluZzEiID8gbGFzdCArIDEgOiBsYXN0KTsKKyAgICAgICAgICAgICAgICB2YXIgYmVmb3JlWmlwcGVkID0gZG9jCisgICAgICAgICAgICAgICAgICAgIC5NYWluRG9jdW1lbnRQYXJ0CisgICAgICAgICAgICAgICAgICAgIC5HZXRYRG9jdW1lbnQoKQorICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudChXLmJvZHkpCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoKHAsIGkpID0+IG5ldworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhZ3JhcGggPSBwLAorICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggPSBpLAorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB2YXIgemlwcGVkID0gUHRFeHRlbnNpb25zLlB0WmlwKGJlZm9yZVppcHBlZCwgc2VjdGlvbkNvdW50cywgKHBpLCBzYykgPT4gbmV3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQYXJhZ3JhcGggPSBwaS5QYXJhZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgIEluZGV4ID0gcGkuSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25JbmRleCA9IHNjLAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGRvY3VtZW50TGlzdCA9IHppcHBlZAorICAgICAgICAgICAgICAgICAgICAuR3JvdXBBZGphY2VudChwID0+IHAuU2VjdGlvbkluZGV4KQorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGcgPT4gbmV3IERvY3VtZW50SW5mbworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudE51bWJlciA9IGcuS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQgPSBnLkZpcnN0KCkuSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCA9IGcuTGFzdCgpLkluZGV4IC0gZy5GaXJzdCgpLkluZGV4ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIGRvYyBpbiBkb2N1bWVudExpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGZpbGVOYW1lID0gU3RyaW5nLkZvcm1hdCgiREIwMDktU2VjdGlvbnswOjAwMH0uZG9jeCIsIGRvYy5Eb2N1bWVudE51bWJlcik7CisgICAgICAgICAgICAgICAgdmFyIGZpU2VjdGlvbiA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgZmlsZU5hbWUpKTsKKyAgICAgICAgICAgICAgICBMaXN0PFNvdXJjZT4gZG9jdW1lbnRTb3VyY2UgPSBuZXcgTGlzdDxTb3VyY2U+IHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc3BlYy5GdWxsTmFtZSksIGRvYy5TdGFydCwgZG9jLkNvdW50LCB0cnVlKQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyLkJ1aWxkRG9jdW1lbnQoZG9jdW1lbnRTb3VyY2UsIGZpU2VjdGlvbi5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgVmFsaWRhdGUoZmlTZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmUtYXNzZW1ibGUgdGhlIHBhcnRzIGludG8gYSBzaW5nbGUgZG9jdW1lbnQuCisgICAgICAgICAgICBMaXN0PFNvdXJjZT4gc291cmNlcyA9IFRlc3RVdGlsLlRlbXBEaXIKKyAgICAgICAgICAgICAgICAuR2V0RmlsZXMoIkRCMDA5LVNlY3Rpb24qLmRvY3giKQorICAgICAgICAgICAgICAgIC5TZWxlY3QoZCA9PiBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChkLkZ1bGxOYW1lKSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgdmFyIGZpUmVhc3NlbWJsZWQgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsICJEQjAwOS1SZWFzc2VtYmxlZC5kb2N4IikpOworCisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIuQnVpbGREb2N1bWVudChzb3VyY2VzLCBmaVJlYXNzZW1ibGVkLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihmaVJlYXNzZW1ibGVkLkZ1bGxOYW1lLCB0cnVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VBZGRlci5BZGRUb2MoZG9jLCAiL3c6ZG9jdW1lbnQvdzpib2R5L3c6cFsxXSIsCisgICAgICAgICAgICAgICAgICAgIEAiVE9DIFxvICcxLTMnIFxoIFx6IFx1IiwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBWYWxpZGF0ZShmaVJlYXNzZW1ibGVkKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgW0ZhY3RdCisgICAgICAgIHB1YmxpYyB2b2lkIERCMDEwX0luc2VydFVzaW5nSW5zZXJ0SWQoKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBmcm9udCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCAiREIwMTAtRnJvbnRNYXR0ZXIuZG9jeCIpKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIGluc2VydDAxID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsICJEQjAxMC1JbnNlcnQtMDEuZG9jeCIpKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIGluc2VydDAyID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsICJEQjAxMC1JbnNlcnQtMDIuZG9jeCIpKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIHRlbXBsYXRlID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsICJEQjAxMC1UZW1wbGF0ZS5kb2N4IikpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCBkb2MxID0gbmV3IFdtbERvY3VtZW50KHRlbXBsYXRlLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbWVtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbS5Xcml0ZShkb2MxLkRvY3VtZW50Qnl0ZUFycmF5LCAwLCBkb2MxLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1lbSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgeERvYyA9IGRvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBmcm9udE1hdHRlclBhcmEgPSB4RG9jLlJvb3QuRGVzY2VuZGFudHMoVy50eGJ4Q29udGVudCkuRWxlbWVudHMoVy5wKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBmcm9udE1hdHRlclBhcmEuUmVwbGFjZVdpdGgoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUHRPcGVuWG1sLkluc2VydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgiSWQiLCAiRnJvbnQiKSkpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCB0YmwgPSB4RG9jLlJvb3QuRWxlbWVudChXLmJvZHkpLkVsZW1lbnRzKFcudGJsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBmaXJzdENlbGwgPSB0YmwuRGVzY2VuZGFudHMoVy50cikuRmlyc3QoKS5EZXNjZW5kYW50cyhXLnApLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2VsbC5SZXBsYWNlV2l0aCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChQdE9wZW5YbWwuSW5zZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJJZCIsICJMaXoiKSkpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBzZWNvbmRDZWxsID0gdGJsLkRlc2NlbmRhbnRzKFcudHIpLlNraXAoMSkuRmlyc3QoKS5EZXNjZW5kYW50cyhXLnApLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgIHNlY29uZENlbGwuUmVwbGFjZVdpdGgoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUHRPcGVuWG1sLkluc2VydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgiSWQiLCAiRXJpYyIpKSk7CisgICAgICAgICAgICAgICAgICAgIGRvYy5NYWluRG9jdW1lbnRQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkb2MxLkRvY3VtZW50Qnl0ZUFycmF5ID0gbWVtLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTGlzdDxTb3VyY2U+IHNvdXJjZXMgPSBuZXcgTGlzdDxTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKGRvYzEsIHRydWUpLAorICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KGluc2VydDAxLkZ1bGxOYW1lKSwgIkxpeiIpLAorICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KGluc2VydDAyLkZ1bGxOYW1lKSwgIkVyaWMiKSwKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChmcm9udC5GdWxsTmFtZSksICJGcm9udCIpLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHZhciBvdXQxID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCAiREIwMTAtSW5zZXJ0ZWQuZG9jeCIpKTsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlci5CdWlsZERvY3VtZW50KHNvdXJjZXMsIG91dDEuRnVsbE5hbWUpOworICAgICAgICAgICAgVmFsaWRhdGUob3V0MSk7CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgREIwMTFfQm9keUFuZEhlYWRlcldpdGhTaGFwZXMoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBCb3RoIG9mIHRoZXNlcyBkb2N1bWVudHMgaGF2ZSBhIHNoYXBlIHdpdGggYSBEb2NQcm9wZXJ0aWVzIElEIG9mIDEuCisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UxID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsICJEQjAxMS1IZWFkZXItV2l0aC1TaGFwZS5kb2N4IikpOworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMiA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCAiREIwMTEtQm9keS1XaXRoLVNoYXBlLmRvY3giKSk7CisgICAgICAgICAgICBMaXN0PFNvdXJjZT4gc291cmNlcyA9IG51bGw7CisKKyAgICAgICAgICAgIHNvdXJjZXMgPSBuZXcgTGlzdDxTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChzb3VyY2UxLkZ1bGxOYW1lKSksCisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMi5GdWxsTmFtZSkpLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHZhciBwcm9jZXNzZWREZXN0RG9jeCA9CisgICAgICAgICAgICAgICAgbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCAiREIwMTEtQm9keS1BbmQtSGVhZGVyLVdpdGgtU2hhcGVzLmRvY3giKSk7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIuQnVpbGREb2N1bWVudChzb3VyY2VzLCBwcm9jZXNzZWREZXN0RG9jeC5GdWxsTmFtZSk7CisgICAgICAgICAgICBWYWxpZGF0ZShwcm9jZXNzZWREZXN0RG9jeCk7CisKKyAgICAgICAgICAgIFZhbGlkYXRlVW5pcXVlRG9jUHJJZHMocHJvY2Vzc2VkRGVzdERvY3gpOworICAgICAgICB9CisKKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgREIwMTJfTnVtYmVyaW5nc1dpdGhTYW1lQWJzdHJhY3ROdW1iZXJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlzIGRvY3VtZW50IGhhcyB0aHJlZSBudW1iZXJpbmcgZGVmaW5pdGlvbnMgdGhhdCB1c2UgdGhlIHNhbWUgYWJzdHJhY3QgbnVtYmVyaW5nIGRlZmluaXRpb24uCisgICAgICAgICAgICBzdHJpbmcgbmFtZSA9ICJEQjAxMi1MaXN0cy1XaXRoLURpZmZlcmVudC1OdW1iZXJpbmdzLmRvY3giOworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lKSk7CisKKyAgICAgICAgICAgIExpc3Q8U291cmNlPiBzb3VyY2VzID0gbnVsbDsKKyAgICAgICAgICAgIHNvdXJjZXMgPSBuZXcgTGlzdDxTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChzb3VyY2VEb2N4LkZ1bGxOYW1lKSksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdmFyIHByb2Nlc3NlZERlc3REb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLAorICAgICAgICAgICAgICAgIHNvdXJjZURvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICItcHJvY2Vzc2VkLWJ5LURvY3VtZW50QnVpbGRlci5kb2N4IikpKTsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlci5CdWlsZERvY3VtZW50KHNvdXJjZXMsIHByb2Nlc3NlZERlc3REb2N4LkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3Blbihwcm9jZXNzZWREZXN0RG9jeC5GdWxsTmFtZSwgZmFsc2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBudW1iZXJpbmdSb290ID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0Lk51bWJlcmluZ0RlZmluaXRpb25zUGFydC5HZXRYRG9jdW1lbnQoKS5Sb290OworICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgzLCBudW1iZXJpbmdSb290LkVsZW1lbnRzKFcubnVtKS5Db3VudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtGYWN0XQorICAgICAgICBwdWJsaWMgdm9pZCBEQjAxM2FfTG9jYWxpemVkU3R5bGVJZHNfSGVhZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEVhY2ggb2YgdGhlc2UgZG9jdW1lbnRzIGhhdmUgY2hhbmdlZCB0aGUgZm9udCBjb2xvciBvZiB0aGUgSGVhZGluZyAxIHN0eWxlLCBvbmUgdG8gcmVkLCB0aGUgb3RoZXIgdG8gZ3JlZW4uCisgICAgICAgICAgICAvLyBPbmUgb2YgdGhlIGRvY3VtZW50cyB3ZXJlIGNyZWF0ZWQgd2l0aCBFbmdsaXNoIGFzIHRoZSBXb3JkIGRpc3BsYXkgbGFuZ3VhZ2UsIHRoZSBvdGhlciB3aXRoIERhbmlzaCBhcyB0aGUgbGFuZ3VhZ2UuCisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UxID0KKyAgICAgICAgICAgICAgICBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgIkRCMDEzYS1SZWQtSGVhZGluZzEtRW5nbGlzaC5kb2N4IikpOworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMiA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLAorICAgICAgICAgICAgICAgICJEQjAxM2EtR3JlZW4tSGVhZGluZzEtRGFuaXNoLmRvY3giKSk7CisgICAgICAgICAgICBMaXN0PFNvdXJjZT4gc291cmNlcyA9IG51bGw7CisKKyAgICAgICAgICAgIHNvdXJjZXMgPSBuZXcgTGlzdDxTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChzb3VyY2UxLkZ1bGxOYW1lKSksCisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMi5GdWxsTmFtZSkpLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHZhciBwcm9jZXNzZWREZXN0RG9jeCA9CisgICAgICAgICAgICAgICAgbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCAiREIwMTNhLUNvbG9yZWQtSGVhZGluZzEuZG9jeCIpKTsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlci5CdWlsZERvY3VtZW50KHNvdXJjZXMsIHByb2Nlc3NlZERlc3REb2N4LkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3Blbihwcm9jZXNzZWREZXN0RG9jeC5GdWxsTmFtZSwgZmFsc2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzdHlsZXMgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCkuUm9vdC5FbGVtZW50cyhXLnN0eWxlKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDEsIHN0eWxlcy5Db3VudChzID0+IHMuRWxlbWVudChXLm5hbWUpLkF0dHJpYnV0ZShXLnZhbCkuVmFsdWUgPT0gImhlYWRpbmcgMSIpKTsKKworICAgICAgICAgICAgICAgIHZhciBzdHlsZUlkcyA9IG5ldyBIYXNoU2V0PHN0cmluZz4oc3R5bGVzLlNlbGVjdChzID0+IHMuQXR0cmlidXRlKFcuc3R5bGVJZCkuVmFsdWUpKTsKKyAgICAgICAgICAgICAgICB2YXIgcGFyYWdyYXBoU3R5bGVzSWRzID0gbmV3IEhhc2hTZXQ8c3RyaW5nPih3RG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCkKKyAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKFcucFN0eWxlKQorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHAgPT4gcC5BdHRyaWJ1dGUoVy52YWwpLlZhbHVlKSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LlN1YnNldChzdHlsZUlkcywgcGFyYWdyYXBoU3R5bGVzSWRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtGYWN0XQorICAgICAgICBwdWJsaWMgdm9pZCBEQjAxM2JfTG9jYWxpemVkU3R5bGVJZHNfTGlzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEVhY2ggb2YgdGhlc2UgZG9jdW1lbnRzIGhhdmUgY2hhbmdlZCB0aGUgZm9udCBjb2xvciBvZiB0aGUgTGlzdCBQYXJhZ3JhcGggc3R5bGUsIG9uZSB0byBvcmFuZ2UsIHRoZSBvdGhlciB0byBibHVlLgorICAgICAgICAgICAgLy8gT25lIG9mIHRoZSBkb2N1bWVudHMgd2VyZSBjcmVhdGVkIHdpdGggRW5nbGlzaCBhcyB0aGUgV29yZCBkaXNwbGF5IGxhbmd1YWdlLCB0aGUgb3RoZXIgd2l0aCBEYW5pc2ggYXMgdGhlIGxhbmd1YWdlLgorICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMSA9CisgICAgICAgICAgICAgICAgbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsICJEQjAxM2ItT3JhbmdlLUxpc3QtRGFuaXNoLmRvY3giKSk7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UyID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsCisgICAgICAgICAgICAgICAgIkRCMDEzYi1CbHVlLUxpc3QtRW5nbGlzaC5kb2N4IikpOworICAgICAgICAgICAgTGlzdDxTb3VyY2U+IHNvdXJjZXMgPSBudWxsOworCisgICAgICAgICAgICBzb3VyY2VzID0gbmV3IExpc3Q8U291cmNlPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMS5GdWxsTmFtZSkpLAorICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KHNvdXJjZTIuRnVsbE5hbWUpKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgcHJvY2Vzc2VkRGVzdERvY3ggPQorICAgICAgICAgICAgICAgIG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgIkRCMDEzYi1Db2xvcmVkLUxpc3QuZG9jeCIpKTsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlci5CdWlsZERvY3VtZW50KHNvdXJjZXMsIHByb2Nlc3NlZERlc3REb2N4LkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3Blbihwcm9jZXNzZWREZXN0RG9jeC5GdWxsTmFtZSwgZmFsc2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzdHlsZXMgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCkuUm9vdC5FbGVtZW50cyhXLnN0eWxlKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDEsIHN0eWxlcy5Db3VudChzID0+IHMuRWxlbWVudChXLm5hbWUpLkF0dHJpYnV0ZShXLnZhbCkuVmFsdWUgPT0gIkxpc3QgUGFyYWdyYXBoIikpOworCisgICAgICAgICAgICAgICAgdmFyIHN0eWxlSWRzID0gbmV3IEhhc2hTZXQ8c3RyaW5nPihzdHlsZXMuU2VsZWN0KHMgPT4gcy5BdHRyaWJ1dGUoVy5zdHlsZUlkKS5WYWx1ZSkpOworICAgICAgICAgICAgICAgIHZhciBwYXJhZ3JhcGhTdHlsZXNJZHMgPSBuZXcgSGFzaFNldDxzdHJpbmc+KHdEb2MuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKQorICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoVy5wU3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QocCA9PiBwLkF0dHJpYnV0ZShXLnZhbCkuVmFsdWUpKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuU3Vic2V0KHN0eWxlSWRzLCBwYXJhZ3JhcGhTdHlsZXNJZHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0ZhY3RdCisgICAgICAgIHB1YmxpYyB2b2lkIERCMDE0X0tlZXBXZWJFeHRlbnNpb25zKCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsICJEQjAxNC1XZWJFeHRlbnNpb25zLmRvY3giKSk7CisgICAgICAgICAgICBMaXN0PFNvdXJjZT4gc291cmNlcyA9IG51bGw7CisKKyAgICAgICAgICAgIHNvdXJjZXMgPSBuZXcgTGlzdDxTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChzb3VyY2UuRnVsbE5hbWUpKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgcHJvY2Vzc2VkRGVzdERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsICJEQjAxNC1XZWJFeHRlbnNpb25zLmRvY3giKSk7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIuQnVpbGREb2N1bWVudChzb3VyY2VzLCBwcm9jZXNzZWREZXN0RG9jeC5GdWxsTmFtZSk7CisgICAgICAgICAgICBWYWxpZGF0ZShwcm9jZXNzZWREZXN0RG9jeCk7CisKKyAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4ocHJvY2Vzc2VkRGVzdERvY3guRnVsbE5hbWUsIGZhbHNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuTm90TnVsbCh3RG9jLldlYkV4VGFza3BhbmVzUGFydCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDIsIHdEb2MuV2ViRXhUYXNrcGFuZXNQYXJ0LlRhc2twYW5lcy5DaGlsZEVsZW1lbnRzLkNvdW50KTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoMiwgd0RvYy5XZWJFeFRhc2twYW5lc1BhcnQuV2ViRXh0ZW5zaW9uUGFydHMuQ291bnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgVmFsaWRhdGUoRmlsZUluZm8gZmkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oZmkuRnVsbE5hbWUsIHRydWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9wZW5YbWxWYWxpZGF0b3IgdiA9IG5ldyBPcGVuWG1sVmFsaWRhdG9yKCk7CisgICAgICAgICAgICAgICAgdmFyIGVycm9ycyA9IHYuVmFsaWRhdGUod0RvYykuV2hlcmUodmUgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBmb3VuZCA9IHNfRXhwZWN0ZWRFcnJvcnMuQW55KHhlID0+IHZlLkRlc2NyaXB0aW9uLkNvbnRhaW5zKHhlKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAhZm91bmQ7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLkNvdW50KCkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBlcnJvcnMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpdGVtLkRlc2NyaXB0aW9uKS5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShmYWxzZSwgcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxzdHJpbmc+IHNfRXhwZWN0ZWRFcnJvcnMgPSBuZXcgTGlzdDxzdHJpbmc+KCkKKyAgICAgICAgeworICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmV2ZW5IQmFuZCcgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmV2ZW5WQmFuZCcgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmZpcnN0Q29sdW1uJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46Zmlyc3RSb3cnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpmaXJzdFJvd0ZpcnN0Q29sdW1uJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46Zmlyc3RSb3dMYXN0Q29sdW1uJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46bGFzdENvbHVtbicgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmxhc3RSb3cnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpsYXN0Um93Rmlyc3RDb2x1bW4nIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpsYXN0Um93TGFzdENvbHVtbicgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOm5vSEJhbmQnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpub1ZCYW5kJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46b2RkSEJhbmQnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpvZGRWQmFuZCcgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSBlbGVtZW50IGhhcyB1bmV4cGVjdGVkIGNoaWxkIGVsZW1lbnQgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjp1cGRhdGVGaWVsZHMnLiIsCisgICAgICAgICAgICAiVGhlIGF0dHJpYnV0ZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOm5hbWUnIGhhcyBpbnZhbGlkIHZhbHVlICd1c2VXb3JkMjAxM1RyYWNrQm90dG9tSHlwaGVuYXRpb24nLiBUaGUgRW51bWVyYXRpb24gY29uc3RyYWludCBmYWlsZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3dvcmQvMjAxMi93b3JkbWw6cmVzdGFydE51bWJlcmluZ0FmdGVyQnJlYWsnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJBdHRyaWJ1dGUgJ2lkJyBzaG91bGQgaGF2ZSB1bmlxdWUgdmFsdWUuIEl0cyBjdXJyZW50IHZhbHVlICciLAorICAgICAgICAgICAgIlRoZSAndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTptYWM6dm1sOmJsdXInIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJBdHRyaWJ1dGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjppZCcgc2hvdWxkIGhhdmUgdW5pcXVlIHZhbHVlLiBJdHMgY3VycmVudCB2YWx1ZSAnIiwKKyAgICAgICAgICAgICJUaGUgZWxlbWVudCBoYXMgdW5leHBlY3RlZCBjaGlsZCBlbGVtZW50ICdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMTIvd29yZG1sOiIsCisgICAgICAgICAgICAiVGhlIGVsZW1lbnQgaGFzIGludmFsaWQgY2hpbGQgZWxlbWVudCAnaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDEyL3dvcmRtbDoiLAorICAgICAgICAgICAgIlRoZSAndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTptYWM6dm1sOmNvbXBsZXh0ZXh0Ym94JyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDEwL3dvcmRtbDoiLAorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3dvcmQvMjAwOC85LzEyL3dvcmRtbDoiLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmFsbFN0eWxlcycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmN1c3RvbVN0eWxlcycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgdm9pZCBWYWxpZGF0ZVVuaXF1ZURvY1BySWRzKEZpbGVJbmZvIGZpKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oZmkuRnVsbE5hbWUsIGZhbHNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZG9jUHJJZHMgPSBuZXcgSGFzaFNldDxzdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gZG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCkuRGVzY2VuZGFudHMoV1AuZG9jUHIpKQorICAgICAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShkb2NQcklkcy5BZGQoaXRlbS5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaWQpLlZhbHVlKSk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGhlYWRlciBpbiBkb2MuTWFpbkRvY3VtZW50UGFydC5IZWFkZXJQYXJ0cykKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBoZWFkZXIuR2V0WERvY3VtZW50KCkuRGVzY2VuZGFudHMoV1AuZG9jUHIpKQorICAgICAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShkb2NQcklkcy5BZGQoaXRlbS5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaWQpLlZhbHVlKSk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZvb3RlciBpbiBkb2MuTWFpbkRvY3VtZW50UGFydC5Gb290ZXJQYXJ0cykKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBmb290ZXIuR2V0WERvY3VtZW50KCkuRGVzY2VuZGFudHMoV1AuZG9jUHIpKQorICAgICAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShkb2NQcklkcy5BZGQoaXRlbS5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaWQpLlZhbHVlKSk7CisgICAgICAgICAgICAgICAgaWYgKGRvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gZG9jLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKS5EZXNjZW5kYW50cyhXUC5kb2NQcikpCisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShkb2NQcklkcy5BZGQoaXRlbS5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaWQpLlZhbHVlKSk7CisgICAgICAgICAgICAgICAgaWYgKGRvYy5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBkb2MuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQuR2V0WERvY3VtZW50KCkuRGVzY2VuZGFudHMoV1AuZG9jUHIpKQorICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LlRydWUoZG9jUHJJZHMuQWRkKGl0ZW0uQXR0cmlidXRlKE5vTmFtZXNwYWNlLmlkKS5WYWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9IdG1sQ29udmVydGVyVGVzdHMuY3MgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9IdG1sQ29udmVydGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2YmMzNwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL0h0bWxDb252ZXJ0ZXJUZXN0cy5jcwpAQCAtMCwwICsxLDQwMCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDT1BZX0ZJTEVTX0ZPUl9ERUJVR0dJTkcKKworLy8gRE9fQ09OVkVSU0lPTl9WSUFfV09SRCBpcyBkZWZpbmVkIGluIHRoZSBwcm9qZWN0IE9wZW5YbWxQb3dlclRvb2xzLlRlc3RzLk9BLmNzcHJvaiwgYnV0IG5vdCBpbiB0aGUgT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMuY3Nwcm9qCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uRHJhd2luZy5JbWFnaW5nOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOwordXNpbmcgWHVuaXQ7CisKKyNpZiBET19DT05WRVJTSU9OX1ZJQV9XT1JECit1c2luZyBXb3JkID0gTWljcm9zb2Z0Lk9mZmljZS5JbnRlcm9wLldvcmQ7CisjZW5kaWYKKworI2lmICFFTElERV9YVU5JVF9URVNUUworCituYW1lc3BhY2UgT3hQdAoreworICAgIHB1YmxpYyBjbGFzcyBIY1Rlc3RzCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgc19Db3B5U291cmNlRmlsZXMgPSB0cnVlOworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgc19Db3B5Rm9ybWF0dGluZ0Fzc2VtYmxlZERvY3ggPSB0cnVlOworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgc19Db252ZXJ0VXNpbmdXb3JkID0gdHJ1ZTsKKworICAgICAgICAvLyBQb3dlclNoZWxsIG9uZWxpbmVyIHRoYXQgZ2VuZXJhdGVzIElubGluZURhdGEgZm9yIGFsbCBmaWxlcyBpbiBhIGRpcmVjdG9yeQorICAgICAgICAvLyBkaXIgfCAlIHsgJ1tJbmxpbmVEYXRhKCInICsgJF8uTmFtZSArICciKV0nIH0gfCBjbGlwCisKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDAxLTVEYXlUb3VyUGxhblRlbXBsYXRlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDAyLUhlYnJldy0wMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzAwMy1IZWJyZXctMDIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwMDQtUmVzdW1lVGVtcGxhdGUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwMDUtVGFza1BsYW5UZW1wbGF0ZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzAwNi1UZXN0LTAxLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDA3LVRlc3QtMDIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwMDgtVGVzdC0wMy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzAwOS1UZXN0LTA0LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDEwLVRlc3QtMDUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwMTEtVGVzdC0wNi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzAxMi1UZXN0LTA3LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDEzLVRlc3QtMDguZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwMTQtUlRMLVRhYmxlLTAxLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDE1LVZlcnRpY2FsLVNwYWNpbmctYXRMZWFzdC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzAxNi1Ib3Jpem9udGFsLVNwYWNpbmctZmlyc3RMaW5lLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDE3LVZlcnRpY2FsLUFsaWdubWVudC1DZWxsLTAxLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDE4LVZlcnRpY2FsLUFsaWdubWVudC1QYXJhLTAxLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDE5LUhpZGRlbi1SdW4uZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwMjAtU21hbGwtQ2Fwcy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzAyMS1TeW1ib2xzLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDIyLVRhYmxlLU9mLUNvbnRlbnRzLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDIzLUh5cGVybGluay5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzAyNC1UYWJzLTAxLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDI1LVRhYnMtMDIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwMjYtVGFicy0wMy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzAyNy1UYWJzLTA0LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDI4LU5vLUJyZWFrLUh5cGhlbi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzAyOS1UYWJsZS1NZXJnZWQtQ2VsbHMuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwMzAtQ29udGVudC1Db250cm9scy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzAzMS1Db21wbGljYXRlZC1Eb2N1bWVudC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzAzMi1OYW1lZC1Db2xvci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzAzMy1SdW4tV2l0aC1Cb3JkZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwMzQtUnVuLVdpdGgtUG9zaXRpb24uZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwMzUtU3RyaWtlLVRocm91Z2guZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwMzYtU3VwZXItU2NyaXB0LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDM3LVN1Yi1TY3JpcHQuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwMzgtQ29uZmxpY3RpbmctQm9yZGVyLVdlaWdodC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzAzOS1Cb2xkLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDQwLUh5cGVybGluay1GaWVsZGNvZGUtMDEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwNDEtSHlwZXJsaW5rLUZpZWxkY29kZS0wMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzA0Mi1JbWFnZS1QbmcuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwNDMtQ2hhcnQuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwNDQtRW1iZWRkZWQtV29ya2Jvb2suZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwNDUtSXRhbGljLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDQ2LUJvbGRBbmRJdGFsaWMuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwNDctTm8tU2VjdGlvbi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJIQzA0OC1FeGNlcnB0LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDQ5LUJvcmRlcnMuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwNTAtU2hhZGVkLVRleHQtMDEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwNTEtU2hhZGVkLVRleHQtMDIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwNjAtSW1hZ2Utd2l0aC1IeXBlcmxpbmsuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiSEMwNjEtSHlwZXJsaW5rLWluLUZpZWxkLmRvY3giKV0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIEhDMDAxKHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2VEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUpKTsKKworI2lmIENPUFlfRklMRVNfRk9SX0RFQlVHR0lORworICAgICAgICAgICAgdmFyIHNvdXJjZUNvcGllZFRvRGVzdERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZURvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICItMS1Tb3VyY2UuZG9jeCIpKSk7CisgICAgICAgICAgICBpZiAoIXNvdXJjZUNvcGllZFRvRGVzdERvY3guRXhpc3RzKQorICAgICAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2VEb2N4LkZ1bGxOYW1lLCBzb3VyY2VDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgdmFyIGFzc2VtYmxlZEZvcm1hdHRpbmdEZXN0RG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi0yLUZvcm1hdHRpbmdBc3NlbWJsZWQuZG9jeCIpKSk7CisgICAgICAgICAgICBpZiAoIWFzc2VtYmxlZEZvcm1hdHRpbmdEZXN0RG9jeC5FeGlzdHMpCisgICAgICAgICAgICAgICAgQ29weUZvcm1hdHRpbmdBc3NlbWJsZWREb2N4KHNvdXJjZURvY3gsIGFzc2VtYmxlZEZvcm1hdHRpbmdEZXN0RG9jeCk7CisjZW5kaWYKKworICAgICAgICAgICAgdmFyIG94UHRDb252ZXJ0ZWREZXN0SHRtbCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi0zLU94UHQuaHRtbCIpKSk7CisgICAgICAgICAgICBDb252ZXJ0VG9IdG1sKHNvdXJjZURvY3gsIG94UHRDb252ZXJ0ZWREZXN0SHRtbCk7CisKKyNpZiBET19DT05WRVJTSU9OX1ZJQV9XT1JECisgICAgICAgICAgICB2YXIgd29yZENvbnZlcnRlZERvY0h0bWwgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZURvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICItNC1Xb3JkLmh0bWwiKSkpOworICAgICAgICAgICAgQ29udmVydFRvSHRtbFVzaW5nV29yZChzb3VyY2VEb2N4LCB3b3JkQ29udmVydGVkRG9jSHRtbCk7CisjZW5kaWYKKworICAgICAgICB9CisKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDA2LVRlc3QtMDEuZG9jeCIpXQorICAgICAgICBwdWJsaWMgdm9pZCBIQzAwMl9Ob0Nzc0NsYXNzZXMoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZURvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZSkpOworCisgICAgICAgICAgICB2YXIgb3hQdENvbnZlcnRlZERlc3RIdG1sID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2VEb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLTUtT3hQdC1Oby1DU1MtQ2xhc3Nlcy5odG1sIikpKTsKKyAgICAgICAgICAgIENvbnZlcnRUb0h0bWxOb0Nzc0NsYXNzZXMoc291cmNlRG9jeCwgb3hQdENvbnZlcnRlZERlc3RIdG1sKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weUZvcm1hdHRpbmdBc3NlbWJsZWREb2N4KEZpbGVJbmZvIHNvdXJjZSwgRmlsZUluZm8gZGVzdCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJhID0gRmlsZS5SZWFkQWxsQnl0ZXMoc291cmNlLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXMuV3JpdGUoYmEsIDAsIGJhLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtcywgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIFJldmlzaW9uQWNjZXB0ZXIuQWNjZXB0UmV2aXNpb25zKHdvcmREb2MpOworICAgICAgICAgICAgICAgICAgICBTaW1wbGlmeU1hcmt1cFNldHRpbmdzIHNpbXBsaWZ5TWFya3VwU2V0dGluZ3MgPSBuZXcgU2ltcGxpZnlNYXJrdXBTZXR0aW5ncworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVDb21tZW50cyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVDb250ZW50Q29udHJvbHMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlRW5kQW5kRm9vdE5vdGVzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZUZpZWxkQ29kZXMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZUxhc3RSZW5kZXJlZFBhZ2VCcmVhayA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVQZXJtaXNzaW9ucyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVQcm9vZiA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVSc2lkSW5mbyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVTbWFydFRhZ3MgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlU29mdEh5cGhlbnMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlR29CYWNrQm9va21hcmsgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZVRhYnNXaXRoU3BhY2VzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIE1hcmt1cFNpbXBsaWZpZXIuU2ltcGxpZnlNYXJrdXAod29yZERvYywgc2ltcGxpZnlNYXJrdXBTZXR0aW5ncyk7CisKKyAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGluZ0Fzc2VtYmxlclNldHRpbmdzIGZvcm1hdHRpbmdBc3NlbWJsZXJTZXR0aW5ncyA9IG5ldyBGb3JtYXR0aW5nQXNzZW1ibGVyU2V0dGluZ3MKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlU3R5bGVOYW1lc0Zyb21QYXJhZ3JhcGhBbmRSdW5Qcm9wZXJ0aWVzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBDbGVhclN0eWxlcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdHJpY3RUb1N1cHBvcnRlZExhbmd1YWdlcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdHJpY3RUb1N1cHBvcnRlZE51bWJlcmluZ0Zvcm1hdHMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUh0bWxDb252ZXJ0ZXJBbm5vdGF0aW9uQXR0cmlidXRlcyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBPcmRlckVsZW1lbnRzUGVyU3RhbmRhcmQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMaXN0SXRlbVJldHJpZXZlclNldHRpbmdzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RJdGVtVGV4dEltcGxlbWVudGF0aW9ucyA9IExpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3MuRGVmYXVsdExpc3RJdGVtVGV4dEltcGxlbWVudGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIEZvcm1hdHRpbmdBc3NlbWJsZXIuQXNzZW1ibGVGb3JtYXR0aW5nKHdvcmREb2MsIGZvcm1hdHRpbmdBc3NlbWJsZXJTZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciBuZXdCYSA9IG1zLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBGaWxlLldyaXRlQWxsQnl0ZXMoZGVzdC5GdWxsTmFtZSwgbmV3QmEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb252ZXJ0VG9IdG1sKEZpbGVJbmZvIHNvdXJjZURvY3gsIEZpbGVJbmZvIGRlc3RGaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVBcnJheSA9IEZpbGUuUmVhZEFsbEJ5dGVzKHNvdXJjZURvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtZW1vcnlTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtb3J5U3RyZWFtLldyaXRlKGJ5dGVBcnJheSwgMCwgYnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtZW1vcnlTdHJlYW0sIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG91dHB1dERpcmVjdG9yeSA9IGRlc3RGaWxlTmFtZS5EaXJlY3Rvcnk7CisgICAgICAgICAgICAgICAgICAgIGRlc3RGaWxlTmFtZSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUob3V0cHV0RGlyZWN0b3J5LkZ1bGxOYW1lLCBkZXN0RmlsZU5hbWUuTmFtZSkpOworICAgICAgICAgICAgICAgICAgICB2YXIgaW1hZ2VEaXJlY3RvcnlOYW1lID0gZGVzdEZpbGVOYW1lLkZ1bGxOYW1lLlN1YnN0cmluZygwLCBkZXN0RmlsZU5hbWUuRnVsbE5hbWUuTGVuZ3RoIC0gNSkgKyAiX2ZpbGVzIjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlQ291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIHZhciBwYWdlVGl0bGUgPSAoc3RyaW5nKXdEb2MuQ29yZUZpbGVQcm9wZXJ0aWVzUGFydC5HZXRYRG9jdW1lbnQoKS5EZXNjZW5kYW50cyhEQy50aXRsZSkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VUaXRsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlID0gc291cmNlRG9jeC5GdWxsTmFtZTsKKworICAgICAgICAgICAgICAgICAgICBXbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBXbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncygpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VUaXRsZSA9IHBhZ2VUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhYnJpY2F0ZUNzc0NsYXNzZXMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3NQcmVmaXggPSAicHQtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RyaWN0VG9TdXBwb3J0ZWRMYW5ndWFnZXMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RyaWN0VG9TdXBwb3J0ZWROdW1iZXJpbmdGb3JtYXRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUhhbmRsZXIgPSBpbWFnZUluZm8gPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnlJbmZvIGxvY2FsRGlySW5mbyA9IG5ldyBEaXJlY3RvcnlJbmZvKGltYWdlRGlyZWN0b3J5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2NhbERpckluZm8uRXhpc3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERpckluZm8uQ3JlYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpbWFnZUNvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGV4dGVuc2lvbiA9IGltYWdlSW5mby5Db250ZW50VHlwZS5TcGxpdCgnLycpWzFdLlRvTG93ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUZvcm1hdCBpbWFnZUZvcm1hdCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSAicG5nIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgcG5nIHRvIGpwZWcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9ICJnaWYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkdpZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJnaWYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkdpZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gImJtcCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuQm1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dGVuc2lvbiA9PSAianBlZyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuSnBlZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gInRpZmYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCB0aWZmIHRvIGdpZi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gImdpZiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuR2lmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gIngtd21mIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9ICJ3bWYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LldtZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaW1hZ2UgZm9ybWF0IGlzbid0IG9uZSB0aGF0IHdlIGV4cGVjdCwgaWdub3JlIGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkb24ndCByZXR1cm4gbWFya3VwIGZvciB0aGUgbGluay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2VGb3JtYXQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW1hZ2VGaWxlTmFtZSA9IGltYWdlRGlyZWN0b3J5TmFtZSArICIvaW1hZ2UiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb3VudGVyLlRvU3RyaW5nKCkgKyAiLiIgKyBleHRlbnNpb247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uQml0bWFwLlNhdmUoaW1hZ2VGaWxlTmFtZSwgaW1hZ2VGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkV4dGVybmFsRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGltZyA9IG5ldyBYRWxlbWVudChYaHRtbC5pbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnNyYywgaW1hZ2VGaWxlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5JbWdTdHlsZUF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLkFsdFRleHQgIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5hbHQsIGltYWdlSW5mby5BbHRUZXh0KSA6IG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbWc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGh0bWwgPSBXbWxUb0h0bWxDb252ZXJ0ZXIuQ29udmVydFRvSHRtbCh3RG9jLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogdGhlIHhodG1sIHJldHVybmVkIGJ5IENvbnZlcnRUb0h0bWxUcmFuc2Zvcm0gY29udGFpbnMgb2JqZWN0cyBvZiB0eXBlCisgICAgICAgICAgICAgICAgICAgIC8vIFhFbnRpdHkuICBQdE9wZW5YbWxVdGlsLmNzIGRlZmluZSB0aGUgWEVudGl0eSBjbGFzcy4gIFNlZQorICAgICAgICAgICAgICAgICAgICAvLyBodHRwOi8vYmxvZ3MubXNkbi5jb20vZXJpY3doaXRlL2FyY2hpdmUvMjAxMC8wMS8yMS93cml0aW5nLWVudGl0eS1yZWZlcmVuY2VzLXVzaW5nLWxpbnEtdG8teG1sLmFzcHgKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBJZiB5b3UgZnVydGhlciB0cmFuc2Zvcm0gdGhlIFhNTCB0cmVlIHJldHVybmVkIGJ5IENvbnZlcnRUb0h0bWxUcmFuc2Zvcm0sIHlvdQorICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGRvIGl0IGNvcnJlY3RseSwgb3IgZW50aXRpZXMgd2lsbCBub3QgYmUgc2VyaWFsaXplZCBwcm9wZXJseS4KKworICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbFN0cmluZyA9IGh0bWwuVG9TdHJpbmcoU2F2ZU9wdGlvbnMuRGlzYWJsZUZvcm1hdHRpbmcpOworICAgICAgICAgICAgICAgICAgICBGaWxlLldyaXRlQWxsVGV4dChkZXN0RmlsZU5hbWUuRnVsbE5hbWUsIGh0bWxTdHJpbmcsIEVuY29kaW5nLlVURjgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29udmVydFRvSHRtbE5vQ3NzQ2xhc3NlcyhGaWxlSW5mbyBzb3VyY2VEb2N4LCBGaWxlSW5mbyBkZXN0RmlsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlQXJyYXkgPSBGaWxlLlJlYWRBbGxCeXRlcyhzb3VyY2VEb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbWVtb3J5U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbW9yeVN0cmVhbS5Xcml0ZShieXRlQXJyYXksIDAsIGJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obWVtb3J5U3RyZWFtLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBvdXRwdXREaXJlY3RvcnkgPSBkZXN0RmlsZU5hbWUuRGlyZWN0b3J5OworICAgICAgICAgICAgICAgICAgICBkZXN0RmlsZU5hbWUgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKG91dHB1dERpcmVjdG9yeS5GdWxsTmFtZSwgZGVzdEZpbGVOYW1lLk5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGltYWdlRGlyZWN0b3J5TmFtZSA9IGRlc3RGaWxlTmFtZS5GdWxsTmFtZS5TdWJzdHJpbmcoMCwgZGVzdEZpbGVOYW1lLkZ1bGxOYW1lLkxlbmd0aCAtIDUpICsgIl9maWxlcyI7CisgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZUNvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICB2YXIgcGFnZVRpdGxlID0gKHN0cmluZyl3RG9jLkNvcmVGaWxlUHJvcGVydGllc1BhcnQuR2V0WERvY3VtZW50KCkuRGVzY2VuZGFudHMoREMudGl0bGUpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlVGl0bGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZSA9IHNvdXJjZURvY3guRnVsbE5hbWU7CisKKyAgICAgICAgICAgICAgICAgICAgV21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgV21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3MoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQYWdlVGl0bGUgPSBwYWdlVGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBGYWJyaWNhdGVDc3NDbGFzc2VzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN0cmljdFRvU3VwcG9ydGVkTGFuZ3VhZ2VzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN0cmljdFRvU3VwcG9ydGVkTnVtYmVyaW5nRm9ybWF0cyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VIYW5kbGVyID0gaW1hZ2VJbmZvID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5SW5mbyBsb2NhbERpckluZm8gPSBuZXcgRGlyZWN0b3J5SW5mbyhpbWFnZURpcmVjdG9yeU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxEaXJJbmZvLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEaXJJbmZvLkNyZWF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraW1hZ2VDb3VudGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBleHRlbnNpb24gPSBpbWFnZUluZm8uQ29udGVudFR5cGUuU3BsaXQoJy8nKVsxXS5Ub0xvd2VyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VGb3JtYXQgaW1hZ2VGb3JtYXQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb24gPT0gInBuZyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHBuZyB0byBqcGVnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gPSAiZ2lmIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGb3JtYXQgPSBJbWFnZUZvcm1hdC5HaWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dGVuc2lvbiA9PSAiZ2lmIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGb3JtYXQgPSBJbWFnZUZvcm1hdC5HaWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJibXAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkJtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gImpwZWciKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkpwZWc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJ0aWZmIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdGlmZiB0byBnaWYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9ICJnaWYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkdpZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJ4LXdtZiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gPSAid21mIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGb3JtYXQgPSBJbWFnZUZvcm1hdC5XbWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGltYWdlIGZvcm1hdCBpc24ndCBvbmUgdGhhdCB3ZSBleHBlY3QsIGlnbm9yZSBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgZG9uJ3QgcmV0dXJuIG1hcmt1cCBmb3IgdGhlIGxpbmsuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlRm9ybWF0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGltYWdlRmlsZU5hbWUgPSBpbWFnZURpcmVjdG9yeU5hbWUgKyAiL2ltYWdlIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlQ291bnRlci5Ub1N0cmluZygpICsgIi4iICsgZXh0ZW5zaW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLkJpdG1hcC5TYXZlKGltYWdlRmlsZU5hbWUsIGltYWdlRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5FeHRlcm5hbEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBpbWcgPSBuZXcgWEVsZW1lbnQoWGh0bWwuaW1nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5zcmMsIGltYWdlRmlsZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uSW1nU3R5bGVBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5BbHRUZXh0ICE9IG51bGwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYWx0LCBpbWFnZUluZm8uQWx0VGV4dCkgOiBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1nOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBodG1sID0gV21sVG9IdG1sQ29udmVydGVyLkNvbnZlcnRUb0h0bWwod0RvYywgc2V0dGluZ3MpOworCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHRoZSB4aHRtbCByZXR1cm5lZCBieSBDb252ZXJ0VG9IdG1sVHJhbnNmb3JtIGNvbnRhaW5zIG9iamVjdHMgb2YgdHlwZQorICAgICAgICAgICAgICAgICAgICAvLyBYRW50aXR5LiAgUHRPcGVuWG1sVXRpbC5jcyBkZWZpbmUgdGhlIFhFbnRpdHkgY2xhc3MuICBTZWUKKyAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL2Jsb2dzLm1zZG4uY29tL2VyaWN3aGl0ZS9hcmNoaXZlLzIwMTAvMDEvMjEvd3JpdGluZy1lbnRpdHktcmVmZXJlbmNlcy11c2luZy1saW5xLXRvLXhtbC5hc3B4CisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBkZXRhaWxlZCBleHBsYW5hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgeW91IGZ1cnRoZXIgdHJhbnNmb3JtIHRoZSBYTUwgdHJlZSByZXR1cm5lZCBieSBDb252ZXJ0VG9IdG1sVHJhbnNmb3JtLCB5b3UKKyAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBkbyBpdCBjb3JyZWN0bHksIG9yIGVudGl0aWVzIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgcHJvcGVybHkuCisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWxTdHJpbmcgPSBodG1sLlRvU3RyaW5nKFNhdmVPcHRpb25zLkRpc2FibGVGb3JtYXR0aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoZGVzdEZpbGVOYW1lLkZ1bGxOYW1lLCBodG1sU3RyaW5nLCBFbmNvZGluZy5VVEY4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIERPX0NPTlZFUlNJT05fVklBX1dPUkQKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIENvbnZlcnRUb0h0bWxVc2luZ1dvcmQoRmlsZUluZm8gc291cmNlRmlsZU5hbWUsIEZpbGVJbmZvIGRlc3RGaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgV29yZC5BcHBsaWNhdGlvbiBhcHAgPSBuZXcgV29yZC5BcHBsaWNhdGlvbigpOworICAgICAgICAgICAgYXBwLlZpc2libGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdvcmQuRG9jdW1lbnQgZG9jID0gYXBwLkRvY3VtZW50cy5PcGVuKHNvdXJjZUZpbGVOYW1lLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICBkb2MuU2F2ZUFzMihkZXN0RmlsZU5hbWUuRnVsbE5hbWUsIFdvcmQuV2RTYXZlRm9ybWF0LndkRm9ybWF0RmlsdGVyZWRIVE1MKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuQ09NRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDYXVnaHQgdW5leHBlY3RlZCBDT00gZXhjZXB0aW9uLiIpOworICAgICAgICAgICAgICAgICgoTWljcm9zb2Z0Lk9mZmljZS5JbnRlcm9wLldvcmQuX0FwcGxpY2F0aW9uKWFwcCkuUXVpdCgpOworICAgICAgICAgICAgICAgIEVudmlyb25tZW50LkV4aXQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKE1pY3Jvc29mdC5PZmZpY2UuSW50ZXJvcC5Xb3JkLl9BcHBsaWNhdGlvbilhcHApLlF1aXQoKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL0h0bWxUb1dtbENvbnZlcnRlclRlc3RzLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvSHRtbFRvV21sQ29udmVydGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4NjM4OQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL0h0bWxUb1dtbENvbnZlcnRlclRlc3RzLmNzCkBAIC0wLDAgKzEsNTM0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkRyYXdpbmcuSW1hZ2luZzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5WYWxpZGF0aW9uOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7Cit1c2luZyBYdW5pdDsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEh0bWxUb1dtbENvbnZlcnRlciBleHBlY3RzIHRoZSBIVE1MIHRvIGJlIHBhc3NlZCBhcyBhbiBYRWxlbWVudCwgaS5lLiBhcyBYTUwuICBXaGlsZSB0aGUgSFRNTCB0ZXN0IGZpbGVzIHRoYXQKKyAqIGFyZSBpbmNsdWRlZCBpbiBPcGVuLVhtbC1Qb3dlclRvb2xzIGFyZSBhYmxlIHRvIGJlIHJlYWQgYXMgWE1MLCBtb3N0IEhUTUwgaXMgbm90IGFibGUgdG8gYmUgcmVhZCBhcyBYTUwuCisgKiBUaGUgYmVzdCBzb2x1dGlvbiBpcyB0byB1c2UgdGhlIEh0bWxBZ2lsaXR5UGFjaywgd2hpY2ggY2FuIHBhcnNlIEhUTUwgYW5kIHNhdmUgYXMgWE1MLiAgVGhlIEh0bWxBZ2lsaXR5UGFjaworICogaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1zLVBMIChzYW1lIGFzIE9wZW4tWG1sLVBvd2VyVG9vbHMpIHNvIGl0IGlzIGNvbnZlbmllbnQgdG8gaW5jbHVkZSBpdCBpbiB5b3VyIHNvbHV0aW9uLAorICogYW5kIHRoZXJlYnkgeW91IGNhbiBjb252ZXJ0IEhUTUwgdG8gWE1MIHRoYXQgY2FuIGJlIHByb2Nlc3NlZCBieSB0aGUgSHRtbFRvV21sQ29udmVydGVyLgorICogCisgKiBBIGNvbnZlbmllbnQgd2F5IHRvIGdldCB0aGUgRExMIHRoYXQgaGFzIGJlZW4gY2hlY2tlZCBvdXQgd2l0aCBIdG1sVG9XbWxDb252ZXJ0ZXIgaXMgdG8gY2xvbmUgdGhlIHJlcG8gYXQKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9FcmljV2hpdGVEZXYvSHRtbEFnaWxpdHlQYWNrCisgKiAKKyAqIFRoYXQgcmVwbyBjb250YWlucyBvbmx5IHRoZSBETEwgdGhhdCBoYXMgYmVlbiBjaGVja2VkIG91dCB3aXRoIEh0bWxUb1dtbENvbnZlcnRlci4KKyAqIAorICogT2YgY291cnNlLCB5b3UgY2FuIGFsc28gZ2V0IHRoZSBIdG1sQWdpbGl0eVBhY2sgc291cmNlIGFuZCBjb21waWxlIGl0IHRvIGdldCB0aGUgRExMLiAgWW91IGNhbiBmaW5kIGl0IGF0CisgKiBodHRwOi8vY29kZXBsZXguY29tL0h0bWxBZ2lsaXR5UGFjaworICogCisgKiBXZSBkb24ndCBpbmNsdWRlIHRoZSBIdG1sQWdpbGl0eVBhY2sgaW4gT3Blbi1YbWwtUG93ZXJUb29scywgdG8gc2ltcGxpZnkgaW5zdGFsbGF0aW9uLiAgVGhlIFhVbml0IHRlc3RzIGluCisgKiB0aGlzIG1vZHVsZSBkbyBub3QgcmVxdWlyZSB0aGUgSHRtbEFnaWxpdHlQYWNrIHRvIHJ1bi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBET19DT05WRVJTSU9OX1ZJQV9XT1JECit1c2luZyBXb3JkID0gTWljcm9zb2Z0Lk9mZmljZS5JbnRlcm9wLldvcmQ7CisjZW5kaWYKKworI2lmICFFTElERV9YVU5JVF9URVNUUworCituYW1lc3BhY2UgT3hQdAoreworICAgIHB1YmxpYyBjbGFzcyBId1Rlc3RzCisgICAgeworICAgICAgICBzdGF0aWMgYm9vbCBzX1Byb2R1Y2VBbm5vdGF0ZWRIdG1sID0gdHJ1ZTsKKworICAgICAgICAvLyBQb3dlclNoZWxsIG9uZWxpbmVyIHRoYXQgZ2VuZXJhdGVzIElubGluZURhdGEgZm9yIGFsbCBmaWxlcyBpbiBhIGRpcmVjdG9yeQorICAgICAgICAvLyBkaXIgfCAlIHsgJ1tJbmxpbmVEYXRhKCInICsgJF8uTmFtZSArICciKV0nIH0gfCBjbGlwCisKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMDEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMDExLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMDEyLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMDEzLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMDE0Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMDE1Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMDIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMDMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMDQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMDUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMDYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMDcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMDgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMDkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMTAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMTEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMTExLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMTEyLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMTIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMTMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMTQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMTUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMTYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMTcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMTgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMTkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMjAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMjEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMjIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMjMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMjQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMjUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMjUxLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMjYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMjcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMjgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMjkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMzAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMzEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMzIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMzMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMzQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMzUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMzYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMzcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMzgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwMzkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNDAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNDEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNDIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNDMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNDMxLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNDMyLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNDQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNDUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNDYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNDcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNDgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNDkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNTAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNTEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNTIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNTMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNTQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNTUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNTYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNTcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNTgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNTkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNjAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNjEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNjIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNjIyLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNjMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNjQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNjUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNjUxLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNjYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNjcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNjgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNjkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNjkxLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNjkyLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzQyLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzQ1Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzkxLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzkyLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzkzLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzk0Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwNzk1Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODAyLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODA0Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODA1Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODEyLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODE0Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODIxLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODUxLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwODkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTIxLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTIyLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTIzLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTI0Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTI1Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTI2Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTI3Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTI4Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTI5Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTMxLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTMyLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTMzLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTM0Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTM1Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTM2Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTQ1Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTQ4Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTU1Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTY4Lmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQwOTkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMDAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMDEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMDIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMDMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMDQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMDUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMDYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMDcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMDgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMTAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMTEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMTExLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMTEyLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMTIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMTMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMTMxLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMTMyLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMTQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMTUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMTYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMTcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMTgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMTkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMjAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMjAxLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMjEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMjIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMjMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMjQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMjQxLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMjQyLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMjUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMjUxLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMjYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMjcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMjgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMjkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMzAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMzEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMzIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMzMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMzQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMzUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMzYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMzcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMzgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxMzkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNDAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNDEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNDIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNDMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNDQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNDUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNDYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNDcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNDgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNDkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNTAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNTEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNTIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNTMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNTQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNTUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNTYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNTcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNTgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNTkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNTkxLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNjEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNjIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNjMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNjQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNjUwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNjYwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNjcwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNjgwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNjkwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNzAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxNzEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxODAwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxODEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxODIwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxODMwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxODQwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlQxODUwLmh0bWwiKV0KKworICAgICAgICBwdWJsaWMgdm9pZCBIVzAwMShzdHJpbmcgbmFtZSkKKyAgICAgICAgeworI2lmIGZhbHNlCisgICAgICAgICAgICBzdHJpbmdbXSBjc3NGaWx0ZXIgPSBuZXdbXSB7CisgICAgICAgICAgICAgICAgInRleHQtaW5kZW50IiwKKyAgICAgICAgICAgICAgICAibWFyZ2luLWxlZnQiLAorICAgICAgICAgICAgICAgICJtYXJnaW4tcmlnaHQiLAorICAgICAgICAgICAgICAgICJwYWRkaW5nLWxlZnQiLAorICAgICAgICAgICAgICAgICJwYWRkaW5nLXJpZ2h0IiwKKyAgICAgICAgICAgIH07CisjZWxzZQorICAgICAgICAgICAgc3RyaW5nW10gY3NzRmlsdGVyID0gbnVsbDsKKyNlbmRpZgorCisjaWYgZmFsc2UKKyAgICAgICAgICAgIHN0cmluZ1tdIGh0bWxGaWx0ZXIgPSBuZXdbXSB7CisgICAgICAgICAgICAgICAgImltZyIsCisgICAgICAgICAgICB9OworI2Vsc2UKKyAgICAgICAgICAgIHN0cmluZ1tdIGh0bWxGaWx0ZXIgPSBudWxsOworI2VuZGlmCisKKyAgICAgICAgICAgIHZhciBzb3VyY2VIdG1sRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZSkpOworICAgICAgICAgICAgdmFyIHNvdXJjZUltYWdlRGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBzb3VyY2VIdG1sRmkuTmFtZS5SZXBsYWNlKCIuaHRtbCIsICJfZmlsZXMiKSkpOworCisgICAgICAgICAgICB2YXIgZGVzdEltYWdlRGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlSW1hZ2VEaS5OYW1lKSk7CisgICAgICAgICAgICB2YXIgc291cmNlQ29waWVkVG9EZXN0SHRtbEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2VIdG1sRmkuTmFtZS5SZXBsYWNlKCIuaHRtbCIsICItMS1Tb3VyY2UuaHRtbCIpKSk7CisgICAgICAgICAgICB2YXIgZGVzdENzc0ZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2VIdG1sRmkuTmFtZS5SZXBsYWNlKCIuaHRtbCIsICItMi5jc3MiKSkpOworICAgICAgICAgICAgdmFyIGRlc3REb2N4RmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZUh0bWxGaS5OYW1lLlJlcGxhY2UoIi5odG1sIiwgIi0zLUNvbnZlcnRlZEJ5SHRtbFRvV21sLmRvY3giKSkpOworICAgICAgICAgICAgdmFyIGFubm90YXRlZEh0bWxGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlSHRtbEZpLk5hbWUuUmVwbGFjZSgiLmh0bWwiLCAiLTQtQW5ub3RhdGVkLnR4dCIpKSk7CisKKyAgICAgICAgICAgIGlmICghc291cmNlQ29waWVkVG9EZXN0SHRtbEZpLkV4aXN0cykKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlSHRtbEZpLkZ1bGxOYW1lLCBzb3VyY2VDb3BpZWRUb0Rlc3RIdG1sRmkuRnVsbE5hbWUpOworICAgICAgICAgICAgWEVsZW1lbnQgaHRtbCA9IEh0bWxUb1dtbFJlYWRBc1hFbGVtZW50LlJlYWRBc1hFbGVtZW50KHNvdXJjZUNvcGllZFRvRGVzdEh0bWxGaSk7CisKKyAgICAgICAgICAgIHN0cmluZyBodG1sU3RyaW5nID0gaHRtbC5Ub1N0cmluZygpOworICAgICAgICAgICAgaWYgKGh0bWxGaWx0ZXIgIT0gbnVsbCAmJiBodG1sRmlsdGVyLkFueSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBodG1sRmlsdGVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxTdHJpbmcuQ29udGFpbnMoaXRlbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzb3VyY2VDb3BpZWRUb0Rlc3RIdG1sRmkuRGVsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cmluZyB1c2VkQXV0aG9yQ3NzID0gSHRtbFRvV21sQ29udmVydGVyLkNsZWFuVXBDc3MoKHN0cmluZylodG1sLkRlc2NlbmRhbnRzKCkuRmlyc3RPckRlZmF1bHQoZCA9PiBkLk5hbWUuTG9jYWxOYW1lLlRvTG93ZXIoKSA9PSAic3R5bGUiKSk7CisgICAgICAgICAgICBGaWxlLldyaXRlQWxsVGV4dChkZXN0Q3NzRmkuRnVsbE5hbWUsIHVzZWRBdXRob3JDc3MpOworCisgICAgICAgICAgICBpZiAoY3NzRmlsdGVyICE9IG51bGwgJiYgY3NzRmlsdGVyLkFueSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBjc3NGaWx0ZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodXNlZEF1dGhvckNzcy5Db250YWlucyhpdGVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvcGllZFRvRGVzdEh0bWxGaS5EZWxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgZGVzdENzc0ZpLkRlbGV0ZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc291cmNlSW1hZ2VEaS5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVzdEltYWdlRGkuQ3JlYXRlKCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZpbGUgaW4gc291cmNlSW1hZ2VEaS5HZXRGaWxlcygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5Db3B5KGZpbGUuRnVsbE5hbWUsIGRlc3RJbWFnZURpLkZ1bGxOYW1lICsgIi8iICsgZmlsZS5OYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzID0gSHRtbFRvV21sQ29udmVydGVyLkdldERlZmF1bHRTZXR0aW5ncygpOworICAgICAgICAgICAgLy8gaW1hZ2UgcmVmZXJlbmNlcyBpbiBIVE1MIGZpbGVzIGNvbnRhaW4gdGhlIHBhdGggdG8gdGhlIHN1YmRpciB0aGF0IGNvbnRhaW5zIHRoZSBpbWFnZXMsIHNvIGJhc2UgVVJJIGlzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICAgIC8vIHRoYXQgY29udGFpbnMgdGhlIEhUTUwgZmlsZXMKKyAgICAgICAgICAgIHNldHRpbmdzLkJhc2VVcmlGb3JJbWFnZXMgPSBQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIFdtbERvY3VtZW50IGRvYyA9IEh0bWxUb1dtbENvbnZlcnRlci5Db252ZXJ0SHRtbFRvV21sKGRlZmF1bHRDc3MsIHVzZWRBdXRob3JDc3MsIHVzZXJDc3MsIGh0bWwsIHNldHRpbmdzLCBudWxsLCBzX1Byb2R1Y2VBbm5vdGF0ZWRIdG1sID8gYW5ub3RhdGVkSHRtbEZpLkZ1bGxOYW1lIDogbnVsbCk7CisgICAgICAgICAgICBBc3NlcnQuTm90TnVsbChkb2MpOworICAgICAgICAgICAgaWYgKGRvYyAhPSBudWxsKQorICAgICAgICAgICAgICAgIFNhdmVWYWxpZGF0ZUFuZEZvcm1hdE1haW5Eb2NQYXJ0KGRlc3REb2N4RmksIGRvYyk7CisKKyNpZiBET19DT05WRVJTSU9OX1ZJQV9XT1JECisgICAgICAgICAgICB2YXIgbmV3QWx0Q2h1bmtCZWZvcmVGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgbmFtZS5SZXBsYWNlKCIuaHRtbCIsICItNS1BbHRDaHVua0JlZm9yZS5kb2N4IikpKTsKKyAgICAgICAgICAgIHZhciBuZXdBbHRDaHVua0FmdGVyRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIG5hbWUuUmVwbGFjZSgiLmh0bWwiLCAiLTYtQ29udmVydGVkVmlhV29yZC5kb2N4IikpKTsKKyAgICAgICAgICAgIFdvcmRBdXRvbWF0aW9uVXRpbGl0aWVzLkRvQ29udmVyc2lvblZpYVdvcmQobmV3QWx0Q2h1bmtCZWZvcmVGaSwgbmV3QWx0Q2h1bmtBZnRlckZpLCBodG1sKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgW0lubGluZURhdGEoIkUwMDEwLmh0bWwiKV0KKyAgICAgICAgW0lubGluZURhdGEoIkUwMDIwLmh0bWwiKV0KKyAgICAgICAgcHVibGljIHZvaWQgSFcwMDQoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKworICAgICAgICAgICAgdmFyIHNvdXJjZUh0bWxGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lKSk7CisgICAgICAgICAgICB2YXIgc291cmNlSW1hZ2VEaSA9IG5ldyBEaXJlY3RvcnlJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIHNvdXJjZUh0bWxGaS5OYW1lLlJlcGxhY2UoIi5odG1sIiwgIl9maWxlcyIpKSk7CisKKyAgICAgICAgICAgIHZhciBkZXN0SW1hZ2VEaSA9IG5ldyBEaXJlY3RvcnlJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2VJbWFnZURpLk5hbWUpKTsKKyAgICAgICAgICAgIHZhciBzb3VyY2VDb3BpZWRUb0Rlc3RIdG1sRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZUh0bWxGaS5OYW1lLlJlcGxhY2UoIi5odG1sIiwgIi0xLVNvdXJjZS5odG1sIikpKTsKKyAgICAgICAgICAgIHZhciBkZXN0Q3NzRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZUh0bWxGaS5OYW1lLlJlcGxhY2UoIi5odG1sIiwgIi0yLmNzcyIpKSk7CisgICAgICAgICAgICB2YXIgZGVzdERvY3hGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlSHRtbEZpLk5hbWUuUmVwbGFjZSgiLmh0bWwiLCAiLTMtQ29udmVydGVkQnlIdG1sVG9XbWwuZG9jeCIpKSk7CisgICAgICAgICAgICB2YXIgYW5ub3RhdGVkSHRtbEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2VIdG1sRmkuTmFtZS5SZXBsYWNlKCIuaHRtbCIsICItNC1Bbm5vdGF0ZWQudHh0IikpKTsKKworICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZUh0bWxGaS5GdWxsTmFtZSwgc291cmNlQ29waWVkVG9EZXN0SHRtbEZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGh0bWwgPSBIdG1sVG9XbWxSZWFkQXNYRWxlbWVudC5SZWFkQXNYRWxlbWVudChzb3VyY2VDb3BpZWRUb0Rlc3RIdG1sRmkpOworCisgICAgICAgICAgICBzdHJpbmcgdXNlZEF1dGhvckNzcyA9IEh0bWxUb1dtbENvbnZlcnRlci5DbGVhblVwQ3NzKChzdHJpbmcpaHRtbC5EZXNjZW5kYW50cygpLkZpcnN0T3JEZWZhdWx0KGQgPT4gZC5OYW1lLkxvY2FsTmFtZS5Ub0xvd2VyKCkgPT0gInN0eWxlIikpOworICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoZGVzdENzc0ZpLkZ1bGxOYW1lLCB1c2VkQXV0aG9yQ3NzKTsKKworICAgICAgICAgICAgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MgPSBIdG1sVG9XbWxDb252ZXJ0ZXIuR2V0RGVmYXVsdFNldHRpbmdzKCk7CisgICAgICAgICAgICBzZXR0aW5ncy5CYXNlVXJpRm9ySW1hZ2VzID0gUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUpOworCisgICAgICAgICAgICBBc3NlcnQuVGhyb3dzPE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uPigoKSA9PiBIdG1sVG9XbWxDb252ZXJ0ZXIuQ29udmVydEh0bWxUb1dtbChkZWZhdWx0Q3NzLCB1c2VkQXV0aG9yQ3NzLCB1c2VyQ3NzLCBodG1sLCBzZXR0aW5ncywgbnVsbCwgc19Qcm9kdWNlQW5ub3RhdGVkSHRtbCA/IGFubm90YXRlZEh0bWxGaS5GdWxsTmFtZSA6IG51bGwpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgU2F2ZVZhbGlkYXRlQW5kRm9ybWF0TWFpbkRvY1BhcnQoRmlsZUluZm8gZGVzdERvY3hGaSwgV21sRG9jdW1lbnQgZG9jKQorICAgICAgICB7CisgICAgICAgICAgICBXbWxEb2N1bWVudCBmb3JtYXR0ZWREb2M7CisKKyAgICAgICAgICAgIGRvYy5TYXZlQXMoZGVzdERvY3hGaS5GdWxsTmFtZSk7CisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKGRvYy5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgZG9jLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jdW1lbnQgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obXMsIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWERvY3VtZW50IHhEb2MgPSBkb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LlB1dFhEb2N1bWVudFdpdGhGb3JtYXR0aW5nKCk7CisgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IE9wZW5YbWxWYWxpZGF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9ycyA9IHZhbGlkYXRvci5WYWxpZGF0ZShkb2N1bWVudCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBlcnJvcnNTdHJpbmcgPSBlcnJvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZSA9PiBlLkRlc2NyaXB0aW9uICsgRW52aXJvbm1lbnQuTmV3TGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZSgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZXJlIHdlcmUgbm8gZXJyb3JzIGluIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnQuCisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgiIiwgZXJyb3JzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9ybWF0dGVkRG9jID0gbmV3IFdtbERvY3VtZW50KGRlc3REb2N4RmkuRnVsbE5hbWUsIG1zLlRvQXJyYXkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXR0ZWREb2MuU2F2ZUFzKGRlc3REb2N4RmkuRnVsbE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHN0cmluZyBkZWZhdWx0Q3NzID0KKyAgICAgICAgICAgIEAiaHRtbCwgYWRkcmVzcywKK2Jsb2NrcXVvdGUsCitib2R5LCBkZCwgZGl2LAorZGwsIGR0LCBmaWVsZHNldCwgZm9ybSwKK2ZyYW1lLCBmcmFtZXNldCwKK2gxLCBoMiwgaDMsIGg0LAoraDUsIGg2LCBub2ZyYW1lcywKK29sLCBwLCB1bCwgY2VudGVyLAorZGlyLCBociwgbWVudSwgcHJlIHsgZGlzcGxheTogYmxvY2s7IHVuaWNvZGUtYmlkaTogZW1iZWQgfQorbGkgeyBkaXNwbGF5OiBsaXN0LWl0ZW0gfQoraGVhZCB7IGRpc3BsYXk6IG5vbmUgfQordGFibGUgeyBkaXNwbGF5OiB0YWJsZSB9Cit0ciB7IGRpc3BsYXk6IHRhYmxlLXJvdyB9Cit0aGVhZCB7IGRpc3BsYXk6IHRhYmxlLWhlYWRlci1ncm91cCB9Cit0Ym9keSB7IGRpc3BsYXk6IHRhYmxlLXJvdy1ncm91cCB9Cit0Zm9vdCB7IGRpc3BsYXk6IHRhYmxlLWZvb3Rlci1ncm91cCB9Citjb2wgeyBkaXNwbGF5OiB0YWJsZS1jb2x1bW4gfQorY29sZ3JvdXAgeyBkaXNwbGF5OiB0YWJsZS1jb2x1bW4tZ3JvdXAgfQordGQsIHRoIHsgZGlzcGxheTogdGFibGUtY2VsbCB9CitjYXB0aW9uIHsgZGlzcGxheTogdGFibGUtY2FwdGlvbiB9Cit0aCB7IGZvbnQtd2VpZ2h0OiBib2xkZXI7IHRleHQtYWxpZ246IGNlbnRlciB9CitjYXB0aW9uIHsgdGV4dC1hbGlnbjogY2VudGVyIH0KK2JvZHkgeyBtYXJnaW46IGF1dG87IH0KK2gxIHsgZm9udC1zaXplOiAyZW07IG1hcmdpbjogYXV0bzsgfQoraDIgeyBmb250LXNpemU6IDEuNWVtOyBtYXJnaW46IGF1dG87IH0KK2gzIHsgZm9udC1zaXplOiAxLjE3ZW07IG1hcmdpbjogYXV0bzsgfQoraDQsIHAsCitibG9ja3F1b3RlLCB1bCwKK2ZpZWxkc2V0LCBmb3JtLAorb2wsIGRsLCBkaXIsCittZW51IHsgbWFyZ2luOiBhdXRvIH0KK2EgeyBjb2xvcjogYmx1ZTsgfQoraDUgeyBmb250LXNpemU6IC44M2VtOyBtYXJnaW46IGF1dG8gfQoraDYgeyBmb250LXNpemU6IC43NWVtOyBtYXJnaW46IGF1dG8gfQoraDEsIGgyLCBoMywgaDQsCitoNSwgaDYsIGIsCitzdHJvbmcgeyBmb250LXdlaWdodDogYm9sZGVyIH0KK2Jsb2NrcXVvdGUgeyBtYXJnaW4tbGVmdDogNDBweDsgbWFyZ2luLXJpZ2h0OiA0MHB4IH0KK2ksIGNpdGUsIGVtLAordmFyLCBhZGRyZXNzIHsgZm9udC1zdHlsZTogaXRhbGljIH0KK3ByZSwgdHQsIGNvZGUsCitrYmQsIHNhbXAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlIH0KK3ByZSB7IHdoaXRlLXNwYWNlOiBwcmUgfQorYnV0dG9uLCB0ZXh0YXJlYSwKK2lucHV0LCBzZWxlY3QgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgfQorYmlnIHsgZm9udC1zaXplOiAxLjE3ZW0gfQorc21hbGwsIHN1Yiwgc3VwIHsgZm9udC1zaXplOiAuODNlbSB9CitzdWIgeyB2ZXJ0aWNhbC1hbGlnbjogc3ViIH0KK3N1cCB7IHZlcnRpY2FsLWFsaWduOiBzdXBlciB9Cit0YWJsZSB7IGJvcmRlci1zcGFjaW5nOiAycHg7IH0KK3RoZWFkLCB0Ym9keSwKK3Rmb290IHsgdmVydGljYWwtYWxpZ246IG1pZGRsZSB9Cit0ZCwgdGgsIHRyIHsgdmVydGljYWwtYWxpZ246IGluaGVyaXQgfQorcywgc3RyaWtlLCBkZWwgeyB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaCB9CitociB7IGJvcmRlcjogMXB4IGluc2V0IH0KK29sLCB1bCwgZGlyLAorbWVudSwgZGQgeyBtYXJnaW4tbGVmdDogNDBweCB9CitvbCB7IGxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbCB9CitvbCB1bCwgdWwgb2wsCit1bCB1bCwgb2wgb2wgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwIH0KK3UsIGlucyB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIH0KK2JyOmJlZm9yZSB7IGNvbnRlbnQ6ICIiXEEiIjsgd2hpdGUtc3BhY2U6IHByZS1saW5lIH0KK2NlbnRlciB7IHRleHQtYWxpZ246IGNlbnRlciB9Cis6bGluaywgOnZpc2l0ZWQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSB9Cis6Zm9jdXMgeyBvdXRsaW5lOiB0aGluIGRvdHRlZCBpbnZlcnQgfQorLyogQmVnaW4gYmlkaXJlY3Rpb25hbGl0eSBzZXR0aW5ncyAoZG8gbm90IGNoYW5nZSkgKi8KK0JET1tESVI9IiJsdHIiIl0geyBkaXJlY3Rpb246IGx0cjsgdW5pY29kZS1iaWRpOiBiaWRpLW92ZXJyaWRlIH0KK0JET1tESVI9IiJydGwiIl0geyBkaXJlY3Rpb246IHJ0bDsgdW5pY29kZS1iaWRpOiBiaWRpLW92ZXJyaWRlIH0KKypbRElSPSIibHRyIiJdIHsgZGlyZWN0aW9uOiBsdHI7IHVuaWNvZGUtYmlkaTogZW1iZWQgfQorKltESVI9IiJydGwiIl0geyBkaXJlY3Rpb246IHJ0bDsgdW5pY29kZS1iaWRpOiBlbWJlZCB9CisKKyI7CisKKyAgICAgICAgc3RhdGljIHN0cmluZyB1c2VyQ3NzID0gQCIiOworICAgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9IdG1sVG9XbWxSZWFkQXNYRWxlbWVudC5jcyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL0h0bWxUb1dtbFJlYWRBc1hFbGVtZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2Mzg3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9IdG1sVG9XbWxSZWFkQXNYRWxlbWVudC5jcwpAQCAtMCwwICsxLDEwNyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEh0bWxUb1dtbENvbnZlcnRlciBleHBlY3RzIHRoZSBIVE1MIHRvIGJlIHBhc3NlZCBhcyBhbiBYRWxlbWVudCwgaS5lLiBhcyBYTUwuICBXaGlsZSB0aGUgSFRNTCB0ZXN0IGZpbGVzIHRoYXQKKyAqIGFyZSBpbmNsdWRlZCBpbiBPcGVuLVhtbC1Qb3dlclRvb2xzIGFyZSBhYmxlIHRvIGJlIHJlYWQgYXMgWE1MLCBtb3N0IEhUTUwgaXMgbm90IGFibGUgdG8gYmUgcmVhZCBhcyBYTUwuCisgKiBUaGUgYmVzdCBzb2x1dGlvbiBpcyB0byB1c2UgdGhlIEh0bWxBZ2lsaXR5UGFjaywgd2hpY2ggY2FuIHBhcnNlIEhUTUwgYW5kIHNhdmUgYXMgWE1MLiAgVGhlIEh0bWxBZ2lsaXR5UGFjaworICogaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1zLVBMIChzYW1lIGFzIE9wZW4tWG1sLVBvd2VyVG9vbHMpIHNvIGl0IGlzIGNvbnZlbmllbnQgdG8gaW5jbHVkZSBpdCBpbiB5b3VyIHNvbHV0aW9uLAorICogYW5kIHRoZXJlYnkgeW91IGNhbiBjb252ZXJ0IEhUTUwgdG8gWE1MIHRoYXQgY2FuIGJlIHByb2Nlc3NlZCBieSB0aGUgSHRtbFRvV21sQ29udmVydGVyLgorICogCisgKiBBIGNvbnZlbmllbnQgd2F5IHRvIGdldCB0aGUgRExMIHRoYXQgaGFzIGJlZW4gY2hlY2tlZCBvdXQgd2l0aCBIdG1sVG9XbWxDb252ZXJ0ZXIgaXMgdG8gY2xvbmUgdGhlIHJlcG8gYXQKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9FcmljV2hpdGVEZXYvSHRtbEFnaWxpdHlQYWNrCisgKiAKKyAqIFRoYXQgcmVwbyBjb250YWlucyBvbmx5IHRoZSBETEwgdGhhdCBoYXMgYmVlbiBjaGVja2VkIG91dCB3aXRoIEh0bWxUb1dtbENvbnZlcnRlci4KKyAqIAorICogT2YgY291cnNlLCB5b3UgY2FuIGFsc28gZ2V0IHRoZSBIdG1sQWdpbGl0eVBhY2sgc291cmNlIGFuZCBjb21waWxlIGl0IHRvIGdldCB0aGUgRExMLiAgWW91IGNhbiBmaW5kIGl0IGF0CisgKiBodHRwOi8vY29kZXBsZXguY29tL0h0bWxBZ2lsaXR5UGFjaworICogCisgKiBXZSBkb24ndCBpbmNsdWRlIHRoZSBIdG1sQWdpbGl0eVBhY2sgaW4gT3Blbi1YbWwtUG93ZXJUb29scywgdG8gc2ltcGxpZnkgaW5zdGFsbGF0aW9uLiAgVGhlIFhVbml0IHRlc3RzIGluCisgKiB0aGlzIG1vZHVsZSBkbyBub3QgcmVxdWlyZSB0aGUgSHRtbEFnaWxpdHlQYWNrIHRvIHJ1bi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAorCisjaWYgVVNFX0hUTUxBR0lMSVRZUEFDSwordXNpbmcgSHRtbEFnaWxpdHlQYWNrOworI2VuZGlmCisKK25hbWVzcGFjZSBPcGVuWG1sUG93ZXJUb29scworeworICAgIHB1YmxpYyBjbGFzcyBIdG1sVG9XbWxSZWFkQXNYRWxlbWVudAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRWxlbWVudCBSZWFkQXNYRWxlbWVudChGaWxlSW5mbyBzb3VyY2VIdG1sRmkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBodG1sU3RyaW5nID0gRmlsZS5SZWFkQWxsVGV4dChzb3VyY2VIdG1sRmkuRnVsbE5hbWUpOworICAgICAgICAgICAgWEVsZW1lbnQgaHRtbCA9IG51bGw7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBodG1sID0gWEVsZW1lbnQuUGFyc2UoaHRtbFN0cmluZyk7CisgICAgICAgICAgICB9CisjaWYgVVNFX0hUTUxBR0lMSVRZUEFDSworICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBIdG1sRG9jdW1lbnQgaGRvYyA9IG5ldyBIdG1sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBoZG9jLkxvYWQoc291cmNlSHRtbEZpLkZ1bGxOYW1lLCBFbmNvZGluZy5EZWZhdWx0KTsKKyAgICAgICAgICAgICAgICBoZG9jLk9wdGlvbk91dHB1dEFzWG1sID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBoZG9jLlNhdmUoc291cmNlSHRtbEZpLkZ1bGxOYW1lLCBFbmNvZGluZy5EZWZhdWx0KTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoRmlsZS5SZWFkQWxsVGV4dChzb3VyY2VIdG1sRmkuRnVsbE5hbWUsIEVuY29kaW5nLkRlZmF1bHQpKTsKKyAgICAgICAgICAgICAgICBzYi5SZXBsYWNlKCImYW1wOyIsICImIik7CisgICAgICAgICAgICAgICAgc2IuUmVwbGFjZSgiJm5ic3A7IiwgIlx4QTAiKTsKKyAgICAgICAgICAgICAgICBzYi5SZXBsYWNlKCImcXVvdDsiLCAiXCIiKTsKKyAgICAgICAgICAgICAgICBzYi5SZXBsYWNlKCImbHQ7IiwgIn5sdDsiKTsKKyAgICAgICAgICAgICAgICBzYi5SZXBsYWNlKCImZ3Q7IiwgIn5ndDsiKTsKKyAgICAgICAgICAgICAgICBzYi5SZXBsYWNlKCImIyIsICJ+IyIpOworICAgICAgICAgICAgICAgIHNiLlJlcGxhY2UoIiYiLCAiJmFtcDsiKTsKKyAgICAgICAgICAgICAgICBzYi5SZXBsYWNlKCJ+bHQ7IiwgIiZsdDsiKTsKKyAgICAgICAgICAgICAgICBzYi5SZXBsYWNlKCJ+Z3Q7IiwgIiZndDsiKTsKKyAgICAgICAgICAgICAgICBzYi5SZXBsYWNlKCJ+IyIsICImIyIpOworICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KHNvdXJjZUh0bWxGaS5GdWxsTmFtZSwgc2IuVG9TdHJpbmcoKSwgRW5jb2RpbmcuRGVmYXVsdCk7CisgICAgICAgICAgICAgICAgaHRtbCA9IFhFbGVtZW50LlBhcnNlKHNiLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBodG1sID0gKFhFbGVtZW50KUNvbnZlcnRUb05vTmFtZXNwYWNlKGh0bWwpOworICAgICAgICAgICAgcmV0dXJuIGh0bWw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQ29udmVydFRvTm9OYW1lc3BhY2UoWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLkxvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCkuV2hlcmUoYSA9PiAhYS5Jc05hbWVzcGFjZURlY2xhcmF0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IENvbnZlcnRUb05vTmFtZXNwYWNlKG4pKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL01hcmt1cFNpbXBsaWZpZXJUZXN0cy5jcyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL01hcmt1cFNpbXBsaWZpZXJUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTZmY2ZjCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvTWFya3VwU2ltcGxpZmllclRlc3RzLmNzCkBAIC0wLDAgKzEsMTYwIEBACivvu791c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWw7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIFh1bml0OworCisjaWYgIUVMSURFX1hVTklUX1RFU1RTCisKK25hbWVzcGFjZSBPcGVuWG1sUG93ZXJUb29scy5UZXN0cworeworICAgIHB1YmxpYyBjbGFzcyBNYXJrdXBTaW1wbGlmaWVyVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgV29yZHByb2Nlc3NpbmdEb2N1bWVudFR5cGUgRG9jdW1lbnRUeXBlID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudFR5cGUuRG9jdW1lbnQ7CisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgU21hcnRUYWdEb2N1bWVudFRleHRWYWx1ZSA9ICJUaGUgY291bnRyaWVzIGluY2x1ZGUgQWxnZXJpYSwgQm90c3dhbmEsIGFuZCBTcmkgTGFua2EuIjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgU21hcnRUYWdEb2N1bWVudFhtbFN0cmluZyA9CitAIjx3OmRvY3VtZW50IHhtbG5zOnc9IiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4iIj4KKyAgPHc6Ym9keT4KKyAgICA8dzpwID4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnQgeG1sOnNwYWNlPSIicHJlc2VydmUiIj5UaGUgY291bnRyaWVzIGluY2x1ZGUgPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICAgIDx3OnNtYXJ0VGFnIHc6dXJpPSIidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6c21hcnR0YWdzIiIgdzplbGVtZW50PSIiY291bnRyeS1yZWdpb24iIj4KKyAgICAgICAgPHc6cj4KKyAgICAgICAgICA8dzp0PkFsZ2VyaWE8L3c6dD4KKyAgICAgICAgPC93OnI+CisgICAgICA8L3c6c21hcnRUYWc+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0IHhtbDpzcGFjZT0iInByZXNlcnZlIiI+LCA8L3c6dD4KKyAgICAgIDwvdzpyPgorICAgICAgPHc6c21hcnRUYWcgdzp1cmk9IiJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpzbWFydHRhZ3MiIiB3OmVsZW1lbnQ9IiJjb3VudHJ5LXJlZ2lvbiIiPgorICAgICAgICA8dzpyPgorICAgICAgICAgIDx3OnQ+Qm90c3dhbmE8L3c6dD4KKyAgICAgICAgPC93OnI+CisgICAgICA8L3c6c21hcnRUYWc+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0IHhtbDpzcGFjZT0iInByZXNlcnZlIiI+LCBhbmQgPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICAgIDx3OnNtYXJ0VGFnIHc6dXJpPSIidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6c21hcnR0YWdzIiIgdzplbGVtZW50PSIiY291bnRyeS1yZWdpb24iIj4KKyAgICAgICAgPHc6c21hcnRUYWcgdzp1cmk9IiJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpzbWFydHRhZ3MiIiB3OmVsZW1lbnQ9IiJwbGFjZSIiPgorICAgICAgICAgIDx3OnI+CisgICAgICAgICAgICA8dzp0PlNyaSBMYW5rYTwvdzp0PgorICAgICAgICAgIDwvdzpyPgorICAgICAgICA8L3c6c21hcnRUYWc+CisgICAgICA8L3c6c21hcnRUYWc+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0Pi48L3c6dD4KKyAgICAgIDwvdzpyPgorICAgIDwvdzpwPgorICA8L3c6Ym9keT4KKzwvdzpkb2N1bWVudD4KKyI7CisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgU2R0RG9jdW1lbnRYbWxTdHJpbmcgPQorQCI8dzpkb2N1bWVudCB4bWxuczp3PSIiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluIiI+CisgIDx3OmJvZHk+CisgICAgPHc6c2R0PgorICAgICAgPHc6c2R0UHI+CisgICAgICAgIDx3OnRleHQvPgorICAgICAgPC93OnNkdFByPgorICAgICAgPHc6c2R0Q29udGVudD4KKyAgICAgICAgPHc6cD4KKyAgICAgICAgICA8dzpyPgorICAgICAgICAgICAgPHc6dD5IZWxsbyBXb3JsZCE8L3c6dD4KKyAgICAgICAgICA8L3c6cj4KKyAgICAgICAgPC93OnA+CisgICAgICA8L3c6c2R0Q29udGVudD4KKyAgICA8L3c6c2R0PgorICA8L3c6Ym9keT4KKzwvdzpkb2N1bWVudD4iOworCisgICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIEdvQmFja0Jvb2ttYXJrRG9jdW1lbnRYbWxTdHJpbmcgPQorQCI8dzpkb2N1bWVudCB4bWxuczp3PSIiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluIiI+CisgIDx3OmJvZHk+CisgICAgPHc6cD4KKyAgICAgIDx3OmJvb2ttYXJrU3RhcnQgdzppZD0iIjAiIiB3Om5hbWU9IiJfR29CYWNrIiIvPgorICAgICAgPHc6Ym9va21hcmtFbmQgdzppZD0iIjAiIi8+CisgICAgPC93OnA+CisgIDwvdzpib2R5PgorPC93OmRvY3VtZW50PiI7CisKKyAgICAgICAgW0ZhY3RdCisgICAgICAgIHB1YmxpYyB2b2lkIENhblJlbW92ZVNtYXJ0VGFncygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCBwYXJ0RG9jdW1lbnQgPSBYRG9jdW1lbnQuUGFyc2UoU21hcnRUYWdEb2N1bWVudFhtbFN0cmluZyk7CisgICAgICAgICAgICBBc3NlcnQuVHJ1ZShwYXJ0RG9jdW1lbnQuRGVzY2VuZGFudHMoVy5zbWFydFRhZykuQW55KCkpOworCisgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdvcmREb2N1bWVudCA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuQ3JlYXRlKHN0cmVhbSwgRG9jdW1lbnRUeXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNYWluRG9jdW1lbnRQYXJ0IHBhcnQgPSB3b3JkRG9jdW1lbnQuQWRkTWFpbkRvY3VtZW50UGFydCgpOworICAgICAgICAgICAgICAgIHBhcnQuUHV0WERvY3VtZW50KHBhcnREb2N1bWVudCk7CisKKyAgICAgICAgICAgICAgICB2YXIgc2V0dGluZ3MgPSBuZXcgU2ltcGxpZnlNYXJrdXBTZXR0aW5ncyB7IFJlbW92ZVNtYXJ0VGFncyA9IHRydWUgfTsKKyAgICAgICAgICAgICAgICBNYXJrdXBTaW1wbGlmaWVyLlNpbXBsaWZ5TWFya3VwKHdvcmREb2N1bWVudCwgc2V0dGluZ3MpOworCisgICAgICAgICAgICAgICAgcGFydERvY3VtZW50ID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCB0ID0gcGFydERvY3VtZW50LkRlc2NlbmRhbnRzKFcudCkuRmlyc3QoKTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5GYWxzZShwYXJ0RG9jdW1lbnQuRGVzY2VuZGFudHMoVy5zbWFydFRhZykuQW55KCkpOworICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbChTbWFydFRhZ0RvY3VtZW50VGV4dFZhbHVlLCB0LlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtGYWN0XQorICAgICAgICBwdWJsaWMgdm9pZCBDYW5SZW1vdmVDb250ZW50Q29udHJvbHMoKQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgcGFydERvY3VtZW50ID0gWERvY3VtZW50LlBhcnNlKFNkdERvY3VtZW50WG1sU3RyaW5nKTsKKyAgICAgICAgICAgIEFzc2VydC5UcnVlKHBhcnREb2N1bWVudC5EZXNjZW5kYW50cyhXLnNkdCkuQW55KCkpOworCisgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdvcmREb2N1bWVudCA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuQ3JlYXRlKHN0cmVhbSwgRG9jdW1lbnRUeXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNYWluRG9jdW1lbnRQYXJ0IHBhcnQgPSB3b3JkRG9jdW1lbnQuQWRkTWFpbkRvY3VtZW50UGFydCgpOworICAgICAgICAgICAgICAgIHBhcnQuUHV0WERvY3VtZW50KHBhcnREb2N1bWVudCk7CisKKyAgICAgICAgICAgICAgICB2YXIgc2V0dGluZ3MgPSBuZXcgU2ltcGxpZnlNYXJrdXBTZXR0aW5ncyB7IFJlbW92ZUNvbnRlbnRDb250cm9scyA9IHRydWUgfTsKKyAgICAgICAgICAgICAgICBNYXJrdXBTaW1wbGlmaWVyLlNpbXBsaWZ5TWFya3VwKHdvcmREb2N1bWVudCwgc2V0dGluZ3MpOworCisgICAgICAgICAgICAgICAgcGFydERvY3VtZW50ID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gcGFydERvY3VtZW50CisgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cyhXLmJvZHkpCisgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cygpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdCgpOworCisgICAgICAgICAgICAgICAgQXNzZXJ0LkZhbHNlKHBhcnREb2N1bWVudC5EZXNjZW5kYW50cyhXLnNkdCkuQW55KCkpOworICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbChXLnAsIGVsZW1lbnQuTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2FuUmVtb3ZlR29CYWNrQm9va21hcmtzKCkKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IHBhcnREb2N1bWVudCA9IFhEb2N1bWVudC5QYXJzZShHb0JhY2tCb29rbWFya0RvY3VtZW50WG1sU3RyaW5nKTsKKyAgICAgICAgICAgIEFzc2VydC5Db250YWlucyhwYXJ0RG9jdW1lbnQKKyAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoVy5ib29rbWFya1N0YXJ0KQorLCBlID0+IGUuQXR0cmlidXRlKFcubmFtZSkuVmFsdWUgPT0gIl9Hb0JhY2siICYmIGUuQXR0cmlidXRlKFcuaWQpLlZhbHVlID09ICIwIik7CisgICAgICAgICAgICBBc3NlcnQuQ29udGFpbnMocGFydERvY3VtZW50CisgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKFcuYm9va21hcmtFbmQpCissIGUgPT4gZS5BdHRyaWJ1dGUoVy5pZCkuVmFsdWUgPT0gIjAiKTsKKworICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jdW1lbnQgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50LkNyZWF0ZShzdHJlYW0sIERvY3VtZW50VHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWFpbkRvY3VtZW50UGFydCBwYXJ0ID0gd29yZERvY3VtZW50LkFkZE1haW5Eb2N1bWVudFBhcnQoKTsKKyAgICAgICAgICAgICAgICBwYXJ0LlB1dFhEb2N1bWVudChwYXJ0RG9jdW1lbnQpOworCisgICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gbmV3IFNpbXBsaWZ5TWFya3VwU2V0dGluZ3MgeyBSZW1vdmVHb0JhY2tCb29rbWFyayA9IHRydWUgfTsKKyAgICAgICAgICAgICAgICBNYXJrdXBTaW1wbGlmaWVyLlNpbXBsaWZ5TWFya3VwKHdvcmREb2N1bWVudCwgc2V0dGluZ3MpOworCisgICAgICAgICAgICAgICAgcGFydERvY3VtZW50ID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuRmFsc2UocGFydERvY3VtZW50LkRlc2NlbmRhbnRzKFcuYm9va21hcmtTdGFydCkuQW55KCkpOworICAgICAgICAgICAgICAgIEFzc2VydC5GYWxzZShwYXJ0RG9jdW1lbnQuRGVzY2VuZGFudHMoVy5ib29rbWFya0VuZCkuQW55KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL01ldHJpY3NHZXR0ZXJUZXN0cy5jcyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL01ldHJpY3NHZXR0ZXJUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjExNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvTWV0cmljc0dldHRlclRlc3RzLmNzCkBAIC0wLDAgKzEsNzkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKK3VzaW5nIFh1bml0OworCisjaWYgIUVMSURFX1hVTklUX1RFU1RTCisKK25hbWVzcGFjZSBPeFB0Cit7CisgICAgcHVibGljIGNsYXNzIE1nVGVzdHMKKyAgICB7CisgICAgICAgIFtUaGVvcnldCisgICAgICAgIFtJbmxpbmVEYXRhKCJQcmVzZW50YXRpb24ucHB0eCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU3ByZWFkc2hlZXQueGxzeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEwMDEtVGVtcGxhdGVEb2N1bWVudC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJEQTAwMi1UZW1wbGF0ZURvY3VtZW50LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMDAzLVNlbGVjdC1YUGF0aEZpbmRzTm9EYXRhLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIkRBMDA0LVNlbGVjdC1YUGF0aEZpbmRzTm9EYXRhT3B0aW9uYWwuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEwMDUtU2VsZWN0Um93RGF0YS1Ob0RhdGEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiREEwMDYtU2VsZWN0VGVzdFZhbHVlLU5vRGF0YS5kb2N4IildCisgICAgICAgIHB1YmxpYyB2b2lkIE1HMDAxKHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBmaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lKSk7CisKKyAgICAgICAgICAgIE1ldHJpY3NHZXR0ZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBNZXRyaWNzR2V0dGVyU2V0dGluZ3MoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluY2x1ZGVUZXh0SW5Db250ZW50Q29udHJvbHMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICBJbmNsdWRlWGxzeFRhYmxlQ2VsbERhdGEgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICBSZXRyaWV2ZU5hbWVzcGFjZUxpc3QgPSB0cnVlLAorICAgICAgICAgICAgICAgIFJldHJpZXZlQ29udGVudFR5cGVMaXN0ID0gdHJ1ZSwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHZhciBleHRlbnNpb24gPSBmaS5FeHRlbnNpb24uVG9Mb3dlcigpOworICAgICAgICAgICAgWEVsZW1lbnQgbWV0cmljcyA9IG51bGw7CisgICAgICAgICAgICBpZiAoVXRpbC5Jc1dvcmRwcm9jZXNzaW5nTUwoZXh0ZW5zaW9uKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXbWxEb2N1bWVudCB3bWxEb2N1bWVudCA9IG5ldyBXbWxEb2N1bWVudChmaS5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgbWV0cmljcyA9IE1ldHJpY3NHZXR0ZXIuR2V0RG9jeE1ldHJpY3Mod21sRG9jdW1lbnQsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFV0aWwuSXNTcHJlYWRzaGVldE1MKGV4dGVuc2lvbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU21sRG9jdW1lbnQgc21sRG9jdW1lbnQgPSBuZXcgU21sRG9jdW1lbnQoZmkuRnVsbE5hbWUpOworICAgICAgICAgICAgICAgIG1ldHJpY3MgPSBNZXRyaWNzR2V0dGVyLkdldFhsc3hNZXRyaWNzKHNtbERvY3VtZW50LCBzZXR0aW5ncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChVdGlsLklzUHJlc2VudGF0aW9uTUwoZXh0ZW5zaW9uKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQbWxEb2N1bWVudCBwbWxEb2N1bWVudCA9IG5ldyBQbWxEb2N1bWVudChmaS5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgbWV0cmljcyA9IE1ldHJpY3NHZXR0ZXIuR2V0UHB0eE1ldHJpY3MocG1sRG9jdW1lbnQsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXNzZXJ0Lk5vdE51bGwobWV0cmljcyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMuY3Nwcm9qIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmVlMjcKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy5jc3Byb2oKQEAgLTAsMCArMSwzMCBAQAor77u/PFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisKKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29ya3M+bmV0NDUyO25ldDQ2PC9UYXJnZXRGcmFtZXdvcmtzPgorICAgIDxBdXRvR2VuZXJhdGVCaW5kaW5nUmVkaXJlY3RzPnRydWU8L0F1dG9HZW5lcmF0ZUJpbmRpbmdSZWRpcmVjdHM+CisgICAgPEdlbmVyYXRlQmluZGluZ1JlZGlyZWN0c091dHB1dFR5cGU+dHJ1ZTwvR2VuZXJhdGVCaW5kaW5nUmVkaXJlY3RzT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVSdW50aW1lQ29uZmlndXJhdGlvbkZpbGVzPnRydWU8L0dlbmVyYXRlUnVudGltZUNvbmZpZ3VyYXRpb25GaWxlcz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5FVC5UZXN0LlNkayIgVmVyc2lvbj0iMTUuNi4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Inh1bml0IiBWZXJzaW9uPSIyLjMuMSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJ4dW5pdC5ydW5uZXIudmlzdWFsc3R1ZGlvIiBWZXJzaW9uPSIyLjMuMSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJ4dW5pdC5ydW5uZXIuY29uc29sZSIgVmVyc2lvbj0iMi4zLjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cT3BlblhtbFBvd2VyVG9vbHNcT3BlblhtbFBvd2VyVG9vbHMuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKFRhcmdldEZyYW1ld29yayknID09ICduZXQ0NScgIj4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IldpbmRvd3NCYXNlIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxTZXJ2aWNlIEluY2x1ZGU9Ins4MmE3ZjQ4ZC0zYjUwLTRiMWUtYjgyZS0zYWRhODIxMGMzNTh9IiAvPgorICA8L0l0ZW1Hcm91cD4KKworPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMuY3Nwcm9qLkRvdFNldHRpbmdzIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMuY3Nwcm9qLkRvdFNldHRpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NGQzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy5jc3Byb2ouRG90U2V0dGluZ3MKQEAgLTAsMCArMSwyIEBACivvu788d3BmOlJlc291cmNlRGljdGlvbmFyeSB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczp4PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dpbmZ4LzIwMDYveGFtbCIgeG1sbnM6cz0iY2xyLW5hbWVzcGFjZTpTeXN0ZW07YXNzZW1ibHk9bXNjb3JsaWIiIHhtbG5zOnNzPSJ1cm46c2hlbWFzLWpldGJyYWlucy1jb206c2V0dGluZ3Mtc3RvcmFnZS14YW1sIiB4bWxuczp3cGY9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2luZngvMjAwNi94YW1sL3ByZXNlbnRhdGlvbiI+CisJPHM6U3RyaW5nIHg6S2V5PSIvRGVmYXVsdC9Db2RlSW5zcGVjdGlvbi9DU2hhcnBMYW5ndWFnZVByb2plY3QvTGFuZ3VhZ2VMZXZlbC9ARW50cnlWYWx1ZSI+Q1NoYXJwNDA8L3M6U3RyaW5nPjwvd3BmOlJlc291cmNlRGljdGlvbmFyeT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9PcGVuWG1sUmVnZXhUZXN0cy5jcyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL09wZW5YbWxSZWdleFRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxN2FlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9PcGVuWG1sUmVnZXhUZXN0cy5jcwpAQCAtMCwwICsxLDM4MyBAQAor77u/dXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWw7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIFh1bml0OworCisjaWYgIUVMSURFX1hVTklUX1RFU1RTCisKK25hbWVzcGFjZSBPcGVuWG1sUG93ZXJUb29scy5UZXN0cworeworICAgIHB1YmxpYyBjbGFzcyBPcGVuWG1sUmVnZXhUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50VHlwZSBEb2N1bWVudFR5cGUgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50VHlwZS5Eb2N1bWVudDsKKworICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBMZWZ0RG91YmxlUXVvdGF0aW9uTWFya3MgPSBAIltcdTAwMjLigJzigJ7Cq8K74oCdXSI7CisgICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIFdvcmRzID0gQCJbXHdcLSYvXSsoPzpcc1tcd1wtJi9dKykqIjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgUmlnaHREb3VibGVRdW90YXRpb25NYXJrcyA9IEAiW1x1MDAyMuKAneKAn8K7wqvigJxdIjsKKworICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBRdW90YXRpb25NYXJrc0RvY3VtZW50WG1sU3RyaW5nID0KK0AiPHc6ZG9jdW1lbnQgeG1sbnM6dz0iImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbiIiPgorICA8dzpib2R5PgorICAgIDx3OnA+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0IHhtbDpzcGFjZT0iInByZXNlcnZlIiI+VGV4dCBjYW4gYmUgZW5jbG9zZWQgaW4g4oCcbm9ybWFsIGRvdWJsZSBxdW90ZXPigJ0gYW5kIGluIDwvdzp0PgorICAgICAgPC93OnI+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0PsKrPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnQ+ZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrczwvdzp0PgorICAgICAgPC93OnI+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0PsK7PC93OnQ+CisgICAgICA8L3c6cj4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnQ+Ljwvdzp0PgorICAgICAgPC93OnI+CisgICAgPC93OnA+CisgIDwvdzpib2R5PgorPC93OmRvY3VtZW50PiI7CisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgUXVvdGF0aW9uTWFya3NBbmRUcmFja2VkQ2hhbmdlc0RvY3VtZW50WG1sU3RyaW5nID0KK0AiPHc6ZG9jdW1lbnQgeG1sbnM6dz0iImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbiIiPgorICA8dzpib2R5PgorICAgIDx3OnA+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0IHhtbDpzcGFjZT0iInByZXNlcnZlIiI+VGV4dCBjYW4gYmUgZW5jbG9zZWQgaW4g4oCcbm9ybWFsIDwvdzp0PgorICAgICAgPC93OnI+CisgICAgICA8dzppbnMgdzppZD0iIjgiIiB3OmF1dGhvcj0iIlRob21hcyBCYXJuZWtvdyIiIHc6ZGF0ZT0iIjIwMTYtMTItMDNUMTU6NTQ6MDBaIiI+CisgICAgICAgIDx3OnI+CisgICAgICAgICAgPHc6dCB4bWw6c3BhY2U9IiJwcmVzZXJ2ZSIiPmRvdWJsZSA8L3c6dD4KKyAgICAgICAgPC93OnI+CisgICAgICA8L3c6aW5zPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6dCB4bWw6c3BhY2U9IiJwcmVzZXJ2ZSIiPnF1b3Rlc+KAnSA8L3c6dD4KKyAgICAgIDwvdzpyPgorICAgICAgPHc6ZGVsIHc6aWQ9IiI5IiIgdzphdXRob3I9IiJUaG9tYXMgQmFybmVrb3ciIiB3OmRhdGU9IiIyMDE2LTEyLTAzVDE1OjU1OjAwWiIiPgorICAgICAgICA8dzpyPgorICAgICAgICAgIDx3OmRlbFRleHQgeG1sOnNwYWNlPSIicHJlc2VydmUiIj5vciA8L3c6ZGVsVGV4dD4KKyAgICAgICAgPC93OnI+CisgICAgICA8L3c6ZGVsPgorICAgICAgPHc6aW5zIHc6aWQ9IiIxMCIiIHc6YXV0aG9yPSIiVGhvbWFzIEJhcm5la293IiIgdzpkYXRlPSIiMjAxNi0xMi0wM1QxNTo1NTowMFoiIj4KKyAgICAgICAgPHc6cj4KKyAgICAgICAgICA8dzp0IHhtbDpzcGFjZT0iInByZXNlcnZlIiI+YW5kIDwvdzp0PgorICAgICAgICA8L3c6cj4KKyAgICAgIDwvdzppbnM+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0IHhtbDpzcGFjZT0iInByZXNlcnZlIiI+aW4gPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnQ+wqs8L3c6dD4KKyAgICAgIDwvdzpyPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6dCB4bWw6c3BhY2U9IiJwcmVzZXJ2ZSIiPmRvdWJsZSA8L3c6dD4KKyAgICAgIDwvdzpyPgorICAgICAgPHc6aW5zIHc6aWQ9IiIxMSIiIHc6YXV0aG9yPSIiVGhvbWFzIEJhcm5la293IiIgdzpkYXRlPSIiMjAxNi0xMi0wM1QxNTo1NDowMFoiIj4KKyAgICAgICAgPHc6cj4KKyAgICAgICAgICA8dzp0IHhtbDpzcGFjZT0iInByZXNlcnZlIiI+YW5nbGUgPC93OnQ+CisgICAgICAgIDwvdzpyPgorICAgICAgPC93Omlucz4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnQ+cXVvdGF0aW9uIG1hcmtzPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnQ+wrs8L3c6dD4KKyAgICAgIDwvdzpyPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6dD4uPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICA8L3c6cD4KKyAgPC93OmJvZHk+Cis8L3c6ZG9jdW1lbnQ+IjsKKworICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBTeW1ib2xzQW5kVHJhY2tlZENoYW5nZXNEb2N1bWVudFhtbFN0cmluZyA9CitAIjx3OmRvY3VtZW50IHhtbG5zOnc9IiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4iIj4KKyAgPHc6Ym9keT4KKyAgICA8dzpwPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6dCB4bWw6c3BhY2U9IiJwcmVzZXJ2ZSIiPldlIGNhbiBhbHNvIHVzZSBzeW1ib2xzIHN1Y2ggYXMgPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICAgIDx3OmRlbCB3OmlkPSIiNCIiIHc6YXV0aG9yPSIiVGhvbWFzIEJhcm5la293IiIgdzpkYXRlPSIiMjAxNy0wNC0xNlQxMjozMTowMFoiIj4KKyAgICAgICAgPHc6cj4KKyAgICAgICAgICA8dzpzeW0gdzpmb250PSIiV2luZ2RpbmdzIiIgdzpjaGFyPSIiRjAyOCIiLz4KKyAgICAgICAgPC93OnI+CisgICAgICAgIDx3OnI+CisgICAgICAgICAgPHc6ZGVsVGV4dCB4bWw6c3BhY2U9IiJwcmVzZXJ2ZSIiPiwgPC93OmRlbFRleHQ+CisgICAgICAgIDwvdzpyPgorICAgICAgPC93OmRlbD4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnN5bSB3OmZvbnQ9IiJXaW5nZGluZ3MiIiB3OmNoYXI9IiJGMDIxIiIvPgorICAgICAgPC93OnI+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0IHhtbDpzcGFjZT0iInByZXNlcnZlIiI+IG9yIDwvdzp0PgorICAgICAgPC93OnI+CisgICAgICA8dzpyPgorICAgICAgICA8dzpzeW0gdzpmb250PSIiV2luZ2RpbmdzIiIgdzpjaGFyPSIiRjAyOCIiLz4KKyAgICAgIDwvdzpyPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6dD4uPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICA8L3c6cD4KKyAgPC93OmJvZHk+Cis8L3c6ZG9jdW1lbnQ+IjsKKworICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBGaWVsZHNEb2N1bWVudFhtbFN0cmluZyA9CitAIjx3OmRvY3VtZW50IHhtbG5zOnc9IiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4iIj4KKyAgPHc6Ym9keT4KKyAgICA8dzpwPgorICAgICAgPHc6cFByPgorICAgICAgICA8dzpwU3R5bGUgdzp2YWw9IiJIZWFkaW5nMSIiLz4KKyAgICAgIDwvdzpwUHI+CisgICAgICA8dzpib29rbWFya1N0YXJ0IHc6aWQ9IiIwIiIgdzpuYW1lPSIiX1JlZjQ5MTcxNjA2NCIiLz4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnQ+QXJ0aWNsZTwvdzp0PgorICAgICAgPC93OnI+CisgICAgICA8dzpib29rbWFya0VuZCB3OmlkPSIiMCIiLz4KKyAgICA8L3c6cD4KKyAgICA8dzpwPgorICAgICAgPHc6cFByPgorICAgICAgICA8dzpwU3R5bGUgdzp2YWw9IiJIZWFkaW5nMiIiLz4KKyAgICAgIDwvdzpwUHI+CisgICAgICA8dzpib29rbWFya1N0YXJ0IHc6aWQ9IiIxIiIgdzpuYW1lPSIiX1JlZjQ5MTcxNjA4MiIiLz4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnQ+U2VjdGlvbjwvdzp0PgorICAgICAgPC93OnI+CisgICAgICA8dzpib29rbWFya0VuZCB3OmlkPSIiMSIiLz4KKyAgICA8L3c6cD4KKyAgICA8dzpwPgorICAgICAgPHc6cFByPgorICAgICAgICA8dzpwU3R5bGUgdzp2YWw9IiJIZWFkaW5nQm9keTIiIi8+CisgICAgICA8L3c6cFByPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6dCB4bWw6c3BhY2U9IiJwcmVzZXJ2ZSIiPkFzIHN0YXRlZCBpbiBBcnRpY2xlIDwvdzp0PgorICAgICAgPC93OnI+CisgICAgICA8dzpyPgorICAgICAgICA8dzpmbGRDaGFyIHc6ZmxkQ2hhclR5cGU9IiJiZWdpbiIiLz4KKyAgICAgIDwvdzpyPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6aW5zdHJUZXh0IHhtbDpzcGFjZT0iInByZXNlcnZlIiI+IFJFRiBfUmVmNDkxNzE2MDY0IFxyIFxoIDwvdzppbnN0clRleHQ+CisgICAgICA8L3c6cj4KKyAgICAgIDx3OnI+CisgICAgICA8L3c6cj4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OmZsZENoYXIgdzpmbGRDaGFyVHlwZT0iInNlcGFyYXRlIiIvPgorICAgICAgPC93OnI+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0PjE8L3c6dD4KKyAgICAgIDwvdzpyPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6ZmxkQ2hhciB3OmZsZENoYXJUeXBlPSIiZW5kIiIvPgorICAgICAgPC93OnI+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0IHhtbDpzcGFjZT0iInByZXNlcnZlIiI+IGFuZCB0aGlzIFNlY3Rpb24gPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OmZsZENoYXIgdzpmbGRDaGFyVHlwZT0iImJlZ2luIiIvPgorICAgICAgPC93OnI+CisgICAgICA8dzpyPgorICAgICAgICA8dzppbnN0clRleHQgeG1sOnNwYWNlPSIicHJlc2VydmUiIj4gUkVGIF9SZWY0OTE3MTYwODIgXHIgXGggPC93Omluc3RyVGV4dD4KKyAgICAgIDwvdzpyPgorICAgICAgPHc6cj4KKyAgICAgIDwvdzpyPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6ZmxkQ2hhciB3OmZsZENoYXJUeXBlPSIic2VwYXJhdGUiIi8+CisgICAgICA8L3c6cj4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnQ+MS4xPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OmZsZENoYXIgdzpmbGRDaGFyVHlwZT0iImVuZCIiLz4KKyAgICAgIDwvdzpyPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6dD4sIHRoaXMgaXMgZGVzY3JpYmVkIGluIFNjaGVkdWxlIEMgKFBlcmZvcm1hbmNlIEZyYW1ld29yaykuPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICA8L3c6cD4KKyAgPC93OmJvZHk+Cis8L3c6ZG9jdW1lbnQ+IjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgSW5uZXJUZXh0KFhDb250YWluZXIgZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGUuRGVzY2VuZGFudHMoVy5yKQorICAgICAgICAgICAgICAgIC5XaGVyZShyID0+IHIuUGFyZW50Lk5hbWUgIT0gVy5kZWwpCisgICAgICAgICAgICAgICAgLlNlbGVjdChVbmljb2RlTWFwcGVyLlJ1blRvU3RyaW5nKQorICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIElubmVyRGVsVGV4dChYQ29udGFpbmVyIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlLkRlc2NlbmRhbnRzKFcuZGVsVGV4dCkKKyAgICAgICAgICAgICAgICAuU2VsZWN0KGRlbFRleHQgPT4gZGVsVGV4dC5WYWx1ZSkKKyAgICAgICAgICAgICAgICAuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtGYWN0XQorICAgICAgICBwdWJsaWMgdm9pZCBDYW5SZXBsYWNlVGV4dFdpdGhRdW90YXRpb25NYXJrcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCBwYXJ0RG9jdW1lbnQgPSBYRG9jdW1lbnQuUGFyc2UoUXVvdGF0aW9uTWFya3NEb2N1bWVudFhtbFN0cmluZyk7CisgICAgICAgICAgICBYRWxlbWVudCBwID0gcGFydERvY3VtZW50LkRlc2NlbmRhbnRzKFcucCkuRmlyc3QoKTsKKyAgICAgICAgICAgIHN0cmluZyBpbm5lclRleHQgPSBJbm5lclRleHQocCk7CisKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbCgKKyAgICAgICAgICAgICAgICAiVGV4dCBjYW4gYmUgZW5jbG9zZWQgaW4g4oCcbm9ybWFsIGRvdWJsZSBxdW90ZXPigJ0gYW5kIGluIMKrZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrc8K7LiIsCisgICAgICAgICAgICAgICAgaW5uZXJUZXh0KTsKKworICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jdW1lbnQgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50LkNyZWF0ZShzdHJlYW0sIERvY3VtZW50VHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWFpbkRvY3VtZW50UGFydCBwYXJ0ID0gd29yZERvY3VtZW50LkFkZE1haW5Eb2N1bWVudFBhcnQoKTsKKyAgICAgICAgICAgICAgICBwYXJ0LlB1dFhEb2N1bWVudChwYXJ0RG9jdW1lbnQpOworCisgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8WEVsZW1lbnQ+IGNvbnRlbnQgPSBwYXJ0RG9jdW1lbnQuRGVzY2VuZGFudHMoVy5wKTsKKyAgICAgICAgICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnZXgoc3RyaW5nLkZvcm1hdCgiezB9KD88d29yZHM+ezF9KXsyfSIsIExlZnREb3VibGVRdW90YXRpb25NYXJrcywgV29yZHMsCisgICAgICAgICAgICAgICAgICAgIFJpZ2h0RG91YmxlUXVvdGF0aW9uTWFya3MpKTsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBPcGVuWG1sUmVnZXguUmVwbGFjZShjb250ZW50LCByZWdleCwgIuKAmGNoYW5nZWQgJHt3b3Jkc33igJkiLCBudWxsKTsKKworICAgICAgICAgICAgICAgIHAgPSBwYXJ0RG9jdW1lbnQuRGVzY2VuZGFudHMoVy5wKS5GaXJzdCgpOworICAgICAgICAgICAgICAgIGlubmVyVGV4dCA9IElubmVyVGV4dChwKTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgyLCBjb3VudCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKAorICAgICAgICAgICAgICAgICAgICAiVGV4dCBjYW4gYmUgZW5jbG9zZWQgaW4g4oCYY2hhbmdlZCBub3JtYWwgZG91YmxlIHF1b3Rlc+KAmSBhbmQgaW4g4oCYY2hhbmdlZCBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmtz4oCZLiIsCisgICAgICAgICAgICAgICAgICAgIGlubmVyVGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2FuUmVwbGFjZVRleHRXaXRoUXVvdGF0aW9uTWFya3NBbmRBZGRUcmFja2VkQ2hhbmdlc1doZW5SZXBsYWNpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgcGFydERvY3VtZW50ID0gWERvY3VtZW50LlBhcnNlKFF1b3RhdGlvbk1hcmtzRG9jdW1lbnRYbWxTdHJpbmcpOworICAgICAgICAgICAgWEVsZW1lbnQgcCA9IHBhcnREb2N1bWVudC5EZXNjZW5kYW50cyhXLnApLkZpcnN0KCk7CisgICAgICAgICAgICBzdHJpbmcgaW5uZXJUZXh0ID0gSW5uZXJUZXh0KHApOworCisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoCisgICAgICAgICAgICAgICAgIlRleHQgY2FuIGJlIGVuY2xvc2VkIGluIOKAnG5vcm1hbCBkb3VibGUgcXVvdGVz4oCdIGFuZCBpbiDCq2RvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFya3PCuy4iLAorICAgICAgICAgICAgICAgIGlubmVyVGV4dCk7CisKKyAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvY3VtZW50ID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5DcmVhdGUoc3RyZWFtLCBEb2N1bWVudFR5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1haW5Eb2N1bWVudFBhcnQgcGFydCA9IHdvcmREb2N1bWVudC5BZGRNYWluRG9jdW1lbnRQYXJ0KCk7CisgICAgICAgICAgICAgICAgcGFydC5QdXRYRG9jdW1lbnQocGFydERvY3VtZW50KTsKKworICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlPFhFbGVtZW50PiBjb250ZW50ID0gcGFydERvY3VtZW50LkRlc2NlbmRhbnRzKFcucCk7CisgICAgICAgICAgICAgICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ2V4KHN0cmluZy5Gb3JtYXQoInswfSg/PHdvcmRzPnsxfSl7Mn0iLCBMZWZ0RG91YmxlUXVvdGF0aW9uTWFya3MsIFdvcmRzLAorICAgICAgICAgICAgICAgICAgICBSaWdodERvdWJsZVF1b3RhdGlvbk1hcmtzKSk7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gT3BlblhtbFJlZ2V4LlJlcGxhY2UoY29udGVudCwgcmVnZXgsICLigJhjaGFuZ2VkICR7d29yZHN94oCZIiwgbnVsbCwgdHJ1ZSwgIkpvaG4gRG9lIik7CisKKyAgICAgICAgICAgICAgICBwID0gcGFydERvY3VtZW50LkRlc2NlbmRhbnRzKFcucCkuRmlyc3QoKTsKKyAgICAgICAgICAgICAgICBpbm5lclRleHQgPSBJbm5lclRleHQocCk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoMiwgY291bnQpOworICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgIlRleHQgY2FuIGJlIGVuY2xvc2VkIGluIOKAmGNoYW5nZWQgbm9ybWFsIGRvdWJsZSBxdW90ZXPigJkgYW5kIGluIOKAmGNoYW5nZWQgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrc+KAmS4iLAorICAgICAgICAgICAgICAgICAgICBpbm5lclRleHQpOworCisgICAgICAgICAgICAgICAgQXNzZXJ0LkNvbnRhaW5zKHAuRWxlbWVudHMoVy5pbnMpLCBlID0+IElubmVyVGV4dChlKSA9PSAi4oCYY2hhbmdlZCBub3JtYWwgZG91YmxlIHF1b3Rlc+KAmSIpOworICAgICAgICAgICAgICAgIEFzc2VydC5Db250YWlucyhwLkVsZW1lbnRzKFcuaW5zKSwgZSA9PiBJbm5lclRleHQoZSkgPT0gIuKAmGNoYW5nZWQgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrc+KAmSIpOworCisgICAgICAgICAgICAgICAgQXNzZXJ0LkNvbnRhaW5zKHAuRWxlbWVudHMoVy5kZWwpLCBlID0+IElubmVyRGVsVGV4dChlKSA9PSAi4oCcbm9ybWFsIGRvdWJsZSBxdW90ZXPigJ0iKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQ29udGFpbnMocC5FbGVtZW50cyhXLmRlbCksIGUgPT4gSW5uZXJEZWxUZXh0KGUpID09ICLCq2RvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFya3PCuyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0ZhY3RdCisgICAgICAgIHB1YmxpYyB2b2lkIENhblJlcGxhY2VUZXh0V2l0aFF1b3RhdGlvbk1hcmtzQW5kVHJhY2tlZENoYW5nZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgcGFydERvY3VtZW50ID0gWERvY3VtZW50LlBhcnNlKFF1b3RhdGlvbk1hcmtzQW5kVHJhY2tlZENoYW5nZXNEb2N1bWVudFhtbFN0cmluZyk7CisgICAgICAgICAgICBYRWxlbWVudCBwID0gcGFydERvY3VtZW50LkRlc2NlbmRhbnRzKFcucCkuRmlyc3QoKTsKKyAgICAgICAgICAgIHN0cmluZyBpbm5lclRleHQgPSBJbm5lclRleHQocCk7CisKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbCgKKyAgICAgICAgICAgICAgICAiVGV4dCBjYW4gYmUgZW5jbG9zZWQgaW4g4oCcbm9ybWFsIGRvdWJsZSBxdW90ZXPigJ0gYW5kIGluIMKrZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrc8K7LiIsCisgICAgICAgICAgICAgICAgaW5uZXJUZXh0KTsKKworICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jdW1lbnQgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50LkNyZWF0ZShzdHJlYW0sIERvY3VtZW50VHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWFpbkRvY3VtZW50UGFydCBwYXJ0ID0gd29yZERvY3VtZW50LkFkZE1haW5Eb2N1bWVudFBhcnQoKTsKKyAgICAgICAgICAgICAgICBwYXJ0LlB1dFhEb2N1bWVudChwYXJ0RG9jdW1lbnQpOworCisgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8WEVsZW1lbnQ+IGNvbnRlbnQgPSBwYXJ0RG9jdW1lbnQuRGVzY2VuZGFudHMoVy5wKTsKKyAgICAgICAgICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnZXgoc3RyaW5nLkZvcm1hdCgiezB9KD88d29yZHM+ezF9KXsyfSIsIExlZnREb3VibGVRdW90YXRpb25NYXJrcywgV29yZHMsCisgICAgICAgICAgICAgICAgICAgIFJpZ2h0RG91YmxlUXVvdGF0aW9uTWFya3MpKTsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBPcGVuWG1sUmVnZXguUmVwbGFjZShjb250ZW50LCByZWdleCwgIuKAmGNoYW5nZWQgJHt3b3Jkc33igJkiLCBudWxsLCB0cnVlLCAiSm9obiBEb2UiKTsKKworICAgICAgICAgICAgICAgIHAgPSBwYXJ0RG9jdW1lbnQuRGVzY2VuZGFudHMoVy5wKS5GaXJzdCgpOworICAgICAgICAgICAgICAgIGlubmVyVGV4dCA9IElubmVyVGV4dChwKTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgyLCBjb3VudCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKAorICAgICAgICAgICAgICAgICAgICAiVGV4dCBjYW4gYmUgZW5jbG9zZWQgaW4g4oCYY2hhbmdlZCBub3JtYWwgZG91YmxlIHF1b3Rlc+KAmSBhbmQgaW4g4oCYY2hhbmdlZCBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmtz4oCZLiIsCisgICAgICAgICAgICAgICAgICAgIGlubmVyVGV4dCk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuQ29udGFpbnMocC5FbGVtZW50cyhXLmlucyksIGUgPT4gSW5uZXJUZXh0KGUpID09ICLigJhjaGFuZ2VkIG5vcm1hbCBkb3VibGUgcXVvdGVz4oCZIik7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkNvbnRhaW5zKHAuRWxlbWVudHMoVy5pbnMpLCBlID0+IElubmVyVGV4dChlKSA9PSAi4oCYY2hhbmdlZCBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmtz4oCZIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2FuUmVwbGFjZVRleHRXaXRoU3ltYm9sc0FuZFRyYWNrZWRDaGFuZ2VzKCkKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IHBhcnREb2N1bWVudCA9IFhEb2N1bWVudC5QYXJzZShTeW1ib2xzQW5kVHJhY2tlZENoYW5nZXNEb2N1bWVudFhtbFN0cmluZyk7CisgICAgICAgICAgICBYRWxlbWVudCBwID0gcGFydERvY3VtZW50LkRlc2NlbmRhbnRzKFcucCkuRmlyc3QoKTsKKyAgICAgICAgICAgIHN0cmluZyBpbm5lclRleHQgPSBJbm5lclRleHQocCk7CisKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbCgiV2UgY2FuIGFsc28gdXNlIHN5bWJvbHMgc3VjaCBhcyBcdUYwMjEgb3IgXHVGMDI4LiIsIGlubmVyVGV4dCk7CisKKyAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvY3VtZW50ID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5DcmVhdGUoc3RyZWFtLCBEb2N1bWVudFR5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1haW5Eb2N1bWVudFBhcnQgcGFydCA9IHdvcmREb2N1bWVudC5BZGRNYWluRG9jdW1lbnRQYXJ0KCk7CisgICAgICAgICAgICAgICAgcGFydC5QdXRYRG9jdW1lbnQocGFydERvY3VtZW50KTsKKworICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlPFhFbGVtZW50PiBjb250ZW50ID0gcGFydERvY3VtZW50LkRlc2NlbmRhbnRzKFcucCk7CisgICAgICAgICAgICAgICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ2V4KEAiW1x1RjAyMV0iKTsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBPcGVuWG1sUmVnZXguUmVwbGFjZShjb250ZW50LCByZWdleCwgIlx1RjAyOCIsIG51bGwsIHRydWUsICJKb2huIERvZSIpOworCisgICAgICAgICAgICAgICAgcCA9IHBhcnREb2N1bWVudC5EZXNjZW5kYW50cyhXLnApLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgaW5uZXJUZXh0ID0gSW5uZXJUZXh0KHApOworCisgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDEsIGNvdW50KTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoIldlIGNhbiBhbHNvIHVzZSBzeW1ib2xzIHN1Y2ggYXMgXHVGMDI4IG9yIFx1RjAyOC4iLCBpbm5lclRleHQpOworCisgICAgICAgICAgICAgICAgQXNzZXJ0LkNvbnRhaW5zKHAuRGVzY2VuZGFudHMoVy5pbnMpLCBpbnMgPT4gaW5zLkRlc2NlbmRhbnRzKFcuc3ltKS5BbnkoCisgICAgICAgICAgICAgICAgICAgICAgICBzeW0gPT4gc3ltLkF0dHJpYnV0ZShXLmZvbnQpLlZhbHVlID09ICJXaW5nZGluZ3MiICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5BdHRyaWJ1dGUoVy5fY2hhcikuVmFsdWUgPT0gIkYwMjgiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2FuUmVwbGFjZVRleHRXaXRoRmllbGRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IHBhcnREb2N1bWVudCA9IFhEb2N1bWVudC5QYXJzZShGaWVsZHNEb2N1bWVudFhtbFN0cmluZyk7CisgICAgICAgICAgICBYRWxlbWVudCBwID0gcGFydERvY3VtZW50LkRlc2NlbmRhbnRzKFcucCkuTGFzdCgpOworICAgICAgICAgICAgc3RyaW5nIGlubmVyVGV4dCA9IElubmVyVGV4dChwKTsKKworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJBcyBzdGF0ZWQgaW4gQXJ0aWNsZSB7X18xfSBhbmQgdGhpcyBTZWN0aW9uIHtfXzEuMX0sIHRoaXMgaXMgZGVzY3JpYmVkIGluIFNjaGVkdWxlIEMgKFBlcmZvcm1hbmNlIEZyYW1ld29yaykuIiwKKyAgICAgICAgICAgICAgICBpbm5lclRleHQpOworCisgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdvcmREb2N1bWVudCA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuQ3JlYXRlKHN0cmVhbSwgRG9jdW1lbnRUeXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNYWluRG9jdW1lbnRQYXJ0IHBhcnQgPSB3b3JkRG9jdW1lbnQuQWRkTWFpbkRvY3VtZW50UGFydCgpOworICAgICAgICAgICAgICAgIHBhcnQuUHV0WERvY3VtZW50KHBhcnREb2N1bWVudCk7CisKKyAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gY29udGVudCA9IHBhcnREb2N1bWVudC5EZXNjZW5kYW50cyhXLnApOworICAgICAgICAgICAgICAgIHZhciByZWdleCA9IG5ldyBSZWdleChAIlNjaGVkdWxlIEMgXChQZXJmb3JtYW5jZSBGcmFtZXdvcmtcKSIpOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IE9wZW5YbWxSZWdleC5SZXBsYWNlKGNvbnRlbnQsIHJlZ2V4LCAiRXhoaWJpdCA0IiwgbnVsbCwgdHJ1ZSwgIkpvaG4gRG9lIik7CisKKyAgICAgICAgICAgICAgICBwID0gcGFydERvY3VtZW50LkRlc2NlbmRhbnRzKFcucCkuTGFzdCgpOworICAgICAgICAgICAgICAgIGlubmVyVGV4dCA9IElubmVyVGV4dChwKTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgxLCBjb3VudCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJBcyBzdGF0ZWQgaW4gQXJ0aWNsZSB7X18xfSBhbmQgdGhpcyBTZWN0aW9uIHtfXzEuMX0sIHRoaXMgaXMgZGVzY3JpYmVkIGluIEV4aGliaXQgNC4iLCBpbm5lclRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL1Bvd2VyVG9vbHNCbG9ja0V4dGVuc2lvbnNUZXN0cy5jcyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL1Bvd2VyVG9vbHNCbG9ja0V4dGVuc2lvbnNUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGZmYjQyCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvUG93ZXJUb29sc0Jsb2NrRXh0ZW5zaW9uc1Rlc3RzLmNzCkBAIC0wLDAgKzEsMTQ1IEBACisvLworLy8gQ29weXJpZ2h0IDIwMTcgVGhvbWFzIEJhcm5la293CisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gVGhlIHRleHQgb2YgdGhlCisvLyBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorLy8KKy8vIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKy8vCisvLyBEZXZlbG9wZXI6IFRob21hcyBCYXJuZWtvdworLy8gRW1haWw6IHRob21hc0BiYXJuZWtvdy5pbmZvCisvLworCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLldvcmRwcm9jZXNzaW5nOwordXNpbmcgWHVuaXQ7CisKKyNpZiAhRUxJREVfWFVOSVRfVEVTVFMKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzLlRlc3RzCit7CisgICAgcHVibGljIGNsYXNzIFBvd2VyVG9vbHNCbG9ja0V4dGVuc2lvbnNUZXN0cyA6IFRlc3RzQmFzZQorICAgIHsKKyAgICAgICAgW0ZhY3RdCisgICAgICAgIHB1YmxpYyB2b2lkIE11c3RCZWdpblBvd2VyVG9vbHNCbG9ja1RvVXNlUG93ZXJUb29scygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyZWF0ZUVtcHR5V29yZHByb2Nlc3NpbmdEb2N1bWVudChzdHJlYW0pOworCisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvY3VtZW50ID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKHN0cmVhbSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNYWluRG9jdW1lbnRQYXJ0IHBhcnQgPSB3b3JkRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydDsKKworICAgICAgICAgICAgICAgICAgICAvLyBBZGQgYSBmaXJzdCBwYXJhZ3JhcGggdGhyb3VnaCB0aGUgU0RLLgorICAgICAgICAgICAgICAgICAgICBCb2R5IGJvZHkgPSBwYXJ0LkRvY3VtZW50LkJvZHk7CisgICAgICAgICAgICAgICAgICAgIGJvZHkuQXBwZW5kQ2hpbGQobmV3IFBhcmFncmFwaChuZXcgUnVuKG5ldyBUZXh0KCJGaXJzdCIpKSkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZGVtb25zdHJhdGVzIHRoZSB1c2FnZSBvZiB0aGUgQmVnaW5Qb3dlclRvb2xzQmxvY2sgbWV0aG9kIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGRlbWFyY2F0ZSBibG9ja3Mgb3IgcmVnaW9ucyBvZiBjb2RlIHdoZXJlIHRoZSBQb3dlclRvb2xzIGFyZSB1c2VkCisgICAgICAgICAgICAgICAgICAgIC8vIGluIGJldHdlZW4gdXNhZ2VzIG9mIHRoZSBzdHJvbmdseSB0eXBlZCBjbGFzc2VzLgorICAgICAgICAgICAgICAgICAgICB3b3JkRG9jdW1lbnQuQmVnaW5Qb3dlclRvb2xzQmxvY2soKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBHZXQgY29udGVudCB0aHJvdWdoIHRoZSBQb3dlclRvb2xzLiBXZSB3aWxsIHNlZSB0aGUgb25lIHBhcmFncmFwaCBhZGRlZAorICAgICAgICAgICAgICAgICAgICAvLyBieSB1c2luZyB0aGUgc3Ryb25nbHkgdHlwZWQgU0RLIGNsYXNzZXMuCisgICAgICAgICAgICAgICAgICAgIFhEb2N1bWVudCBjb250ZW50ID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxYRWxlbWVudD4gcGFyYWdyYXBoRWxlbWVudHMgPSBjb250ZW50LkRlc2NlbmRhbnRzKFcucCkuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5TaW5nbGUocGFyYWdyYXBoRWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoIkZpcnN0IiwgcGFyYWdyYXBoRWxlbWVudHNbMF0uVmFsdWUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZGVtb25zdHJhdGVzIHRoZSB1c2FnZSBvZiB0aGUgRW5kUG93ZXJUb29sc0Jsb2NrIG1ldGhvZCB0bworICAgICAgICAgICAgICAgICAgICAvLyBkZW1hcmNhdGUgYmxvY2tzIG9yIHJlZ2lvbnMgb2YgY29kZSB3aGVyZSB0aGUgUG93ZXJUb29scyBhcmUgdXNlZAorICAgICAgICAgICAgICAgICAgICAvLyBpbiBiZXR3ZWVuIHVzYWdlcyBvZiB0aGUgc3Ryb25nbHkgdHlwZWQgY2xhc3Nlcy4KKyAgICAgICAgICAgICAgICAgICAgd29yZERvY3VtZW50LkVuZFBvd2VyVG9vbHNCbG9jaygpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBhIHNlY29uZCBwYXJhZ3JhcGggdGhyb3VnaCB0aGUgU0RLIGluIHRoZSBleGFjdCBzYW1lIHdheSBhcyBhYm92ZS4KKyAgICAgICAgICAgICAgICAgICAgYm9keSA9IHBhcnQuRG9jdW1lbnQuQm9keTsKKyAgICAgICAgICAgICAgICAgICAgYm9keS5BcHBlbmRDaGlsZChuZXcgUGFyYWdyYXBoKG5ldyBSdW4obmV3IFRleHQoIlNlY29uZCIpKSkpOworICAgICAgICAgICAgICAgICAgICBwYXJ0LkRvY3VtZW50LlNhdmUoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBHZXQgY29udGVudCB0aHJvdWdoIHRoZSBQb3dlclRvb2xzIGluIHRoZSBleGFjdCBzYW1lIHdheSBhcyBhYm92ZSwKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aW5nIHRoYXQgd2UgaGF2ZSBub3QgdXNlZCB0aGUgQmVnaW5Qb3dlclRvb2xzQmxvY2sgbWV0aG9kIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBQb3dlclRvb2xzIEJsb2NrLgorICAgICAgICAgICAgICAgICAgICAvLyBXaGF0IHdlIHdpbGwgc2VlIGluIHRoaXMgY2FzZSBpcyB0aGF0IHdlIHN0aWxsIG9ubHkgZ2V0IHRoZSBmaXJzdCAKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyYWdyYXBoLiBUaGlzIGlzIGNhdXNlZCBieSB0aGUgR2V0WERvY3VtZW50IG1ldGhvZCB1c2luZyB0aGUgY2FjaGVkCisgICAgICAgICAgICAgICAgICAgIC8vIFhEb2N1bWVudCwgaS5lLiwgdGhlIGFubm90YXRpb24sIHJhdGhlciByZWFkaW5nIHRoZSBwYXJ0J3Mgc3RyZWFtIGFnYWluLgorICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoRWxlbWVudHMgPSBjb250ZW50LkRlc2NlbmRhbnRzKFcucCkuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5TaW5nbGUocGFyYWdyYXBoRWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoIkZpcnN0IiwgcGFyYWdyYXBoRWxlbWVudHNbMF0uVmFsdWUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRvIG1ha2UgdGhlIEdldFhEb2N1bWVudCByZWFkIHRoZSBwYXJ0cycgc3RyZWFtcywgd2UgbmVlZCB0byBiZWdpbgorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV4dCBQb3dlclRvb2xzIEJsb2NrLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBhbm5vdGF0aW9ucyBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0cyBhbmQgbWFrZSB0aGUgUG93ZXJUb29scyByZWFkIHRoZSBwYXJ0J3Mgc3RyZWFtIGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gdXNpbmcgdGhlIG91dGRhdGVkIGFubm90YXRpb24uCisgICAgICAgICAgICAgICAgICAgIHdvcmREb2N1bWVudC5CZWdpblBvd2VyVG9vbHNCbG9jaygpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEdldCBjb250ZW50IHRocm91Z2ggdGhlIFBvd2VyVG9vbHMgaW4gdGhlIGV4YWN0IHNhbWUgd2F5IGFzIGFib3ZlLgorICAgICAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbm93IHNlZSBib3RoIHBhcmFncmFwaHMuCisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBwYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGhFbGVtZW50cyA9IGNvbnRlbnQuRGVzY2VuZGFudHMoVy5wKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDIsIHBhcmFncmFwaEVsZW1lbnRzLkNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJGaXJzdCIsIHBhcmFncmFwaEVsZW1lbnRzWzBdLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJTZWNvbmQiLCBwYXJhZ3JhcGhFbGVtZW50c1sxXS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0ZhY3RdCisgICAgICAgIHB1YmxpYyB2b2lkIE11c3RFbmRQb3dlclRvb2xzQmxvY2tUb1VzZVN0cm9uZ2x5VHlwZWRDbGFzc2VzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JlYXRlRW1wdHlXb3JkcHJvY2Vzc2luZ0RvY3VtZW50KHN0cmVhbSk7CisKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jdW1lbnQgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oc3RyZWFtLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1haW5Eb2N1bWVudFBhcnQgcGFydCA9IHdvcmREb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0OworCisgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBhIHBhcmFncmFwaCB0aHJvdWdoIHRoZSBTREsuCisgICAgICAgICAgICAgICAgICAgIEJvZHkgYm9keSA9IHBhcnQuRG9jdW1lbnQuQm9keTsKKyAgICAgICAgICAgICAgICAgICAgYm9keS5BcHBlbmRDaGlsZChuZXcgUGFyYWdyYXBoKG5ldyBSdW4obmV3IFRleHQoIkFkZGVkIHRocm91Z2ggU0RLIikpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQmVnaW4gdGhlIFBvd2VyVG9vbHMgQmxvY2ssIHdoaWNoIHNhdmVzIGFueSBjaGFuZ2VzIG1hZGUgdGhyb3VnaCB0aGUgc3Ryb25nbHkKKyAgICAgICAgICAgICAgICAgICAgLy8gdHlwZWQgU0RLIGNsYXNzZXMgdG8gdGhlIHBhcnRzIG9mIHRoZSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50LiAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGlzIGNvdWxkIGFsc28gYmUgZG9uZSBieSBpbnZva2luZyB0aGUgU2F2ZSBtZXRob2Qgb24gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQsIHdoaWNoIHdpbGwgc2F2ZSBhbGwgcGFydHMgdGhhdCBoYWQgY2hhbmdlcywgb3IgYnkKKyAgICAgICAgICAgICAgICAgICAgLy8gaW52b2tpbmcgcGFydC5Sb290RWxlbWVudC5TYXZlKCkgZm9yIHRoZSBvbmUgcGFydCB0aGF0IHdhcyBjaGFuZ2VkLgorICAgICAgICAgICAgICAgICAgICB3b3JkRG9jdW1lbnQuQmVnaW5Qb3dlclRvb2xzQmxvY2soKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBBZGQgYSBwYXJhZ3JhcGggdGhyb3VnaCB0aGUgUG93ZXJUb29scy4KKyAgICAgICAgICAgICAgICAgICAgWERvY3VtZW50IGNvbnRlbnQgPSBwYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBib2R5RWxlbWVudCA9IGNvbnRlbnQuRGVzY2VuZGFudHMoVy5ib2R5KS5GaXJzdCgpOworICAgICAgICAgICAgICAgICAgICBib2R5RWxlbWVudC5BZGQobmV3IFhFbGVtZW50KFcucCwgbmV3IFhFbGVtZW50KFcuciwgbmV3IFhFbGVtZW50KFcudCwgIkFkZGVkIHRocm91Z2ggUG93ZXJUb29scyIpKSkpOworICAgICAgICAgICAgICAgICAgICBwYXJ0LlB1dFhEb2N1bWVudCgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGFydCdzIGNvbnRlbnQgdGhyb3VnaCB0aGUgU0RLLiBIb3dldmVyLCB3ZSB3aWxsIG9ubHkgc2VlIHdoYXQgd2UKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRkZWQgdGhyb3VnaCB0aGUgU0RLLCBub3Qgd2hhdCB3ZSBhZGRlZCB0aHJvdWdoIHRoZSBQb3dlclRvb2xzIGZ1bmN0aW9uYWxpdHkuCisgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBwYXJ0LkRvY3VtZW50LkJvZHk7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8UGFyYWdyYXBoPiBwYXJhZ3JhcGhzID0gYm9keS5FbGVtZW50czxQYXJhZ3JhcGg+KCkuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5TaW5nbGUocGFyYWdyYXBocyk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgiQWRkZWQgdGhyb3VnaCBTREsiLCBwYXJhZ3JhcGhzWzBdLklubmVyVGV4dCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm93LCBsZXQncyBlbmQgdGhlIFBvd2VyVG9vbHMgQmxvY2ssIHdoaWNoIHJlbG9hZHMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIG9uZSBwYXJ0LiBSZWxvYWRpbmcgdGhvc2Ugcm9vdCBlbGVtZW50cyB0aGlzIHdheSBpcyBmaW5lIGlmIHlvdSBrbm93IGV4YWN0bHkKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggcGFydHMgaGFkIHRoZWlyIGNvbnRlbnQgY2hhbmdlZCBieSB0aGUgT3BlbiBYTUwgUG93ZXJUb29scy4KKyAgICAgICAgICAgICAgICAgICAgd29yZERvY3VtZW50LkVuZFBvd2VyVG9vbHNCbG9jaygpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGFydCdzIGNvbnRlbnQgdGhyb3VnaCB0aGUgU0RLLiBIYXZpbmcgcmVsb2FkZWQgdGhlIHJvb3QgZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIG5vdyBzZWUgYm90aCBwYXJhZ3JhcGhzLgorICAgICAgICAgICAgICAgICAgICBib2R5ID0gcGFydC5Eb2N1bWVudC5Cb2R5OworICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGhzID0gYm9keS5FbGVtZW50czxQYXJhZ3JhcGg+KCkuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgyLCBwYXJhZ3JhcGhzLkNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJBZGRlZCB0aHJvdWdoIFNESyIsIHBhcmFncmFwaHNbMF0uSW5uZXJUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJBZGRlZCB0aHJvdWdoIFBvd2VyVG9vbHMiLCBwYXJhZ3JhcGhzWzFdLklubmVyVGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL1Bvd2VyVG9vbHNCbG9ja1Rlc3RzLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvUG93ZXJUb29sc0Jsb2NrVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4MDQxZgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL1Bvd2VyVG9vbHNCbG9ja1Rlc3RzLmNzCkBAIC0wLDAgKzEsNzggQEAKK++7vy8vCisvLyBDb3B5cmlnaHQgMjAxNyBUaG9tYXMgQmFybmVrb3cKKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiBUaGUgdGV4dCBvZiB0aGUKKy8vIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisvLworLy8gaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorLy8KKy8vIERldmVsb3BlcjogVGhvbWFzIEJhcm5la293CisvLyBFbWFpbDogdGhvbWFzQGJhcm5la293LmluZm8KKy8vCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuV29yZHByb2Nlc3Npbmc7Cit1c2luZyBYdW5pdDsKKworI2lmICFFTElERV9YVU5JVF9URVNUUworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMKK3sKKyAgICBwdWJsaWMgY2xhc3MgUG93ZXJUb29sc0Jsb2NrVGVzdHMgOiBUZXN0c0Jhc2UKKyAgICB7CisgICAgICAgIFtGYWN0XQorICAgICAgICBwdWJsaWMgdm9pZCBDYW5Vc2VQb3dlclRvb2xzQmxvY2tUb0RlbWFyY2F0ZUFwaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDcmVhdGVFbXB0eVdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoc3RyZWFtKTsKKworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdvcmREb2N1bWVudCA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihzdHJlYW0sIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWFpbkRvY3VtZW50UGFydCBwYXJ0ID0gd29yZERvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQ7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGEgcGFyYWdyYXBoIHRocm91Z2ggdGhlIFNESy4KKyAgICAgICAgICAgICAgICAgICAgQm9keSBib2R5ID0gcGFydC5Eb2N1bWVudC5Cb2R5OworICAgICAgICAgICAgICAgICAgICBib2R5LkFwcGVuZENoaWxkKG5ldyBQYXJhZ3JhcGgobmV3IFJ1bihuZXcgVGV4dCgiQWRkZWQgdGhyb3VnaCBTREsiKSkpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBQb3dlclRvb2xzQmxvY2sgaW4gYSB1c2luZyBzdGF0ZW1lbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gZGVtYXJjYXRlIHRoZSBpbnRlcm1pdHRlbnQgdXNlIG9mIHRoZSBQb3dlclRvb2xzLgorICAgICAgICAgICAgICAgICAgICB1c2luZyAobmV3IFBvd2VyVG9vbHNCbG9jayh3b3JkRG9jdW1lbnQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NlcnQgdGhhdCB3ZSBjYW4gc2VlIHRoZSBwYXJhZ3JhcGggYWRkZWQgdGhyb3VnaCB0aGUgc3Ryb25nbHkgdHlwZWQgY2xhc3Nlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIFhEb2N1bWVudCBjb250ZW50ID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IHBhcmFncmFwaEVsZW1lbnRzID0gY29udGVudC5EZXNjZW5kYW50cyhXLnApLlRvTGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LlNpbmdsZShwYXJhZ3JhcGhFbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoIkFkZGVkIHRocm91Z2ggU0RLIiwgcGFyYWdyYXBoRWxlbWVudHNbMF0uVmFsdWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgYSBwYXJhZ3JhcGggdGhyb3VnaCB0aGUgUG93ZXJUb29scy4KKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGJvZHlFbGVtZW50ID0gY29udGVudC5EZXNjZW5kYW50cyhXLmJvZHkpLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBib2R5RWxlbWVudC5BZGQobmV3IFhFbGVtZW50KFcucCwgbmV3IFhFbGVtZW50KFcuciwgbmV3IFhFbGVtZW50KFcudCwgIkFkZGVkIHRocm91Z2ggUG93ZXJUb29scyIpKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGFydCdzIGNvbnRlbnQgdGhyb3VnaCB0aGUgU0RLLiBIYXZpbmcgdXNlZCB0aGUgUG93ZXJUb29sc0Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgc2VlIGJvdGggcGFyYWdyYXBocy4KKyAgICAgICAgICAgICAgICAgICAgYm9keSA9IHBhcnQuRG9jdW1lbnQuQm9keTsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxQYXJhZ3JhcGg+IHBhcmFncmFwaHMgPSBib2R5LkVsZW1lbnRzPFBhcmFncmFwaD4oKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDIsIHBhcmFncmFwaHMuQ291bnQpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoIkFkZGVkIHRocm91Z2ggU0RLIiwgcGFyYWdyYXBoc1swXS5Jbm5lclRleHQpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoIkFkZGVkIHRocm91Z2ggUG93ZXJUb29scyIsIHBhcmFncmFwaHNbMV0uSW5uZXJUZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29uc3RydWN0b3JUaHJvd3NXaGVuUGFzc2luZ051bGwoKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oKCkgPT4gbmV3IFBvd2VyVG9vbHNCbG9jayhudWxsKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvUHJlc2VudGF0aW9uQnVpbGRlclRlc3RzLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvUHJlc2VudGF0aW9uQnVpbGRlclRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMGUzMWYKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9QcmVzZW50YXRpb25CdWlsZGVyVGVzdHMuY3MKQEAgLTAsMCArMSwxNjIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uRHJhd2luZy5JbWFnaW5nOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuVmFsaWRhdGlvbjsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOwordXNpbmcgWHVuaXQ7CisKKyNpZiAhRUxJREVfWFVOSVRfVEVTVFMKKworbmFtZXNwYWNlIE94UHQKK3sKKyAgICBwdWJsaWMgY2xhc3MgUGJUZXN0cworICAgIHsKKyAgICAgICAgW0ZhY3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFBCMDAxX0Zvcm1hdHRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgbmFtZTEgPSAiUEIwMDEtSW5wdXQxLnBwdHgiOworICAgICAgICAgICAgc3RyaW5nIG5hbWUyID0gIlBCMDAxLUlucHV0Mi5wcHR4IjsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTFQcHR4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUxKSk7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UyUHB0eCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lMikpOworCisgICAgICAgICAgICBMaXN0PFNsaWRlU291cmNlPiBzb3VyY2VzID0gbnVsbDsKKyAgICAgICAgICAgIHNvdXJjZXMgPSBuZXcgTGlzdDxTbGlkZVNvdXJjZT4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBTbGlkZVNvdXJjZShuZXcgUG1sRG9jdW1lbnQoc291cmNlMVBwdHguRnVsbE5hbWUpLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGVTb3VyY2UobmV3IFBtbERvY3VtZW50KHNvdXJjZTJQcHR4LkZ1bGxOYW1lKSwgMCwgdHJ1ZSksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdmFyIHByb2Nlc3NlZERlc3RQcHR4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCAiUEIwMDEtRm9ybWF0dGluZy5wcHR4IikpOworICAgICAgICAgICAgUHJlc2VudGF0aW9uQnVpbGRlci5CdWlsZFByZXNlbnRhdGlvbihzb3VyY2VzLCBwcm9jZXNzZWREZXN0UHB0eC5GdWxsTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgUEIwMDJfRm9ybWF0dGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBuYW1lMiA9ICJQQjAwMS1JbnB1dDIucHB0eCI7CisgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTJQcHR4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUyKSk7CisKKyAgICAgICAgICAgIExpc3Q8U2xpZGVTb3VyY2U+IHNvdXJjZXMgPSBudWxsOworICAgICAgICAgICAgc291cmNlcyA9IG5ldyBMaXN0PFNsaWRlU291cmNlPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFNsaWRlU291cmNlKG5ldyBQbWxEb2N1bWVudChzb3VyY2UyUHB0eC5GdWxsTmFtZSksIDAsIHRydWUpLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHZhciBwcm9jZXNzZWREZXN0UHB0eCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgIlBCMDAyLUZvcm1hdHRpbmcucHB0eCIpKTsKKyAgICAgICAgICAgIFByZXNlbnRhdGlvbkJ1aWxkZXIuQnVpbGRQcmVzZW50YXRpb24oc291cmNlcywgcHJvY2Vzc2VkRGVzdFBwdHguRnVsbE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgW0ZhY3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFBCMDAzX0Zvcm1hdHRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgbmFtZTEgPSAiUEIwMDEtSW5wdXQxLnBwdHgiOworICAgICAgICAgICAgc3RyaW5nIG5hbWUyID0gIlBCMDAxLUlucHV0My5wcHR4IjsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTFQcHR4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUxKSk7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UyUHB0eCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lMikpOworCisgICAgICAgICAgICBMaXN0PFNsaWRlU291cmNlPiBzb3VyY2VzID0gbnVsbDsKKyAgICAgICAgICAgIHNvdXJjZXMgPSBuZXcgTGlzdDxTbGlkZVNvdXJjZT4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBTbGlkZVNvdXJjZShuZXcgUG1sRG9jdW1lbnQoc291cmNlMVBwdHguRnVsbE5hbWUpLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGVTb3VyY2UobmV3IFBtbERvY3VtZW50KHNvdXJjZTJQcHR4LkZ1bGxOYW1lKSwgMCwgdHJ1ZSksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdmFyIHByb2Nlc3NlZERlc3RQcHR4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCAiUEIwMDMtRm9ybWF0dGluZy5wcHR4IikpOworICAgICAgICAgICAgUHJlc2VudGF0aW9uQnVpbGRlci5CdWlsZFByZXNlbnRhdGlvbihzb3VyY2VzLCBwcm9jZXNzZWREZXN0UHB0eC5GdWxsTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgUEIwMDRfRm9ybWF0dGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBuYW1lMSA9ICJQQjAwMS1JbnB1dDEucHB0eCI7CisgICAgICAgICAgICBzdHJpbmcgbmFtZTIgPSAiUEIwMDEtSW5wdXQzLnBwdHgiOworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMVBwdHggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTEpKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTJQcHR4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUyKSk7CisKKyAgICAgICAgICAgIExpc3Q8U2xpZGVTb3VyY2U+IHNvdXJjZXMgPSBudWxsOworICAgICAgICAgICAgc291cmNlcyA9IG5ldyBMaXN0PFNsaWRlU291cmNlPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFNsaWRlU291cmNlKG5ldyBQbWxEb2N1bWVudChzb3VyY2UyUHB0eC5GdWxsTmFtZSksIDAsIHRydWUpLAorICAgICAgICAgICAgICAgIG5ldyBTbGlkZVNvdXJjZShuZXcgUG1sRG9jdW1lbnQoc291cmNlMVBwdHguRnVsbE5hbWUpLCAxLCB0cnVlKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgcHJvY2Vzc2VkRGVzdFBwdHggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsICJQQjAwNC1Gb3JtYXR0aW5nLnBwdHgiKSk7CisgICAgICAgICAgICBQcmVzZW50YXRpb25CdWlsZGVyLkJ1aWxkUHJlc2VudGF0aW9uKHNvdXJjZXMsIHByb2Nlc3NlZERlc3RQcHR4LkZ1bGxOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIFtGYWN0XQorICAgICAgICBwdWJsaWMgdm9pZCBQQjAwNV9Gb3JtYXR0aW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIG5hbWUxID0gIlBCMDAxLUlucHV0MS5wcHR4IjsKKyAgICAgICAgICAgIHN0cmluZyBuYW1lMiA9ICJQQjAwMS1JbnB1dDMucHB0eCI7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UxUHB0eCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lMSkpOworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMlBwdHggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTIpKTsKKworICAgICAgICAgICAgTGlzdDxTbGlkZVNvdXJjZT4gc291cmNlcyA9IG51bGw7CisgICAgICAgICAgICBzb3VyY2VzID0gbmV3IExpc3Q8U2xpZGVTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGVTb3VyY2UobmV3IFBtbERvY3VtZW50KHNvdXJjZTJQcHR4LkZ1bGxOYW1lKSwgMCwgMCwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbmV3IFNsaWRlU291cmNlKG5ldyBQbWxEb2N1bWVudChzb3VyY2UxUHB0eC5GdWxsTmFtZSksIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG5ldyBTbGlkZVNvdXJjZShuZXcgUG1sRG9jdW1lbnQoc291cmNlMlBwdHguRnVsbE5hbWUpLCAwLCB0cnVlKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgcHJvY2Vzc2VkRGVzdFBwdHggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsICJQQjAwNS1Gb3JtYXR0aW5nLnBwdHgiKSk7CisgICAgICAgICAgICBQcmVzZW50YXRpb25CdWlsZGVyLkJ1aWxkUHJlc2VudGF0aW9uKHNvdXJjZXMsIHByb2Nlc3NlZERlc3RQcHR4LkZ1bGxOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIFtGYWN0XQorICAgICAgICBwdWJsaWMgdm9pZCBQQjAwNl9WaWRlb0Zvcm1hdHMoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlzIHByZXNlbnRhdGlvbiBjb250YWlucyB2aWRlb3Mgd2l0aCBjb250ZW50IHR5cGVzIHZpZGVvL21wNCwgdmlkZW8vcXVpY2t0aW1lLCB2aWRlby91bmtub3duLCB2aWRlby94LW1zLWFzZiwgYW5kIHZpZGVvL3gtbXN2aWRlby4KKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZVBwdHggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgIlBQMDA2LVZpZGVvcy5wcHR4IikpOworCisgICAgICAgICAgICB2YXIgb2xkTWVkaWFEYXRhQ29udGVudFR5cGVzID0gR2V0TWVkaWFEYXRhQ29udGVudFR5cGVzKHNvdXJjZVBwdHgpOworCisgICAgICAgICAgICBMaXN0PFNsaWRlU291cmNlPiBzb3VyY2VzID0gbnVsbDsKKyAgICAgICAgICAgIHNvdXJjZXMgPSBuZXcgTGlzdDxTbGlkZVNvdXJjZT4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBTbGlkZVNvdXJjZShuZXcgUG1sRG9jdW1lbnQoc291cmNlUHB0eC5GdWxsTmFtZSksIHRydWUpLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHZhciBwcm9jZXNzZWREZXN0UHB0eCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgIlBCMDA2LVZpZGVvcy5wcHR4IikpOworICAgICAgICAgICAgUHJlc2VudGF0aW9uQnVpbGRlci5CdWlsZFByZXNlbnRhdGlvbihzb3VyY2VzLCBwcm9jZXNzZWREZXN0UHB0eC5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIHZhciBuZXdNZWRpYURhdGFDb250ZW50VHlwZXMgPSBHZXRNZWRpYURhdGFDb250ZW50VHlwZXMocHJvY2Vzc2VkRGVzdFBwdHgpOworCisgICAgICAgICAgICBBc3NlcnQuRXF1YWwob2xkTWVkaWFEYXRhQ29udGVudFR5cGVzLCBuZXdNZWRpYURhdGFDb250ZW50VHlwZXMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gR2V0TWVkaWFEYXRhQ29udGVudFR5cGVzKEZpbGVJbmZvIGZpKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoUHJlc2VudGF0aW9uRG9jdW1lbnQgcHREb2MgPSBQcmVzZW50YXRpb25Eb2N1bWVudC5PcGVuKGZpLkZ1bGxOYW1lLCBmYWxzZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHB0RG9jLlByZXNlbnRhdGlvblBhcnQuU2xpZGVQYXJ0cy5TZWxlY3RNYW55KAorICAgICAgICAgICAgICAgICAgICAgICAgcCA9PiBwLkRhdGFQYXJ0UmVmZXJlbmNlUmVsYXRpb25zaGlwcy5TZWxlY3QoZCA9PiBkLkRhdGFQYXJ0LkNvbnRlbnRUeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgLkRpc3RpbmN0KCkKKyAgICAgICAgICAgICAgICAgICAgLk9yZGVyQnkobSA9PiBtKQorICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL1B0VXRpbFRlc3RzLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvUHRVdGlsVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzZjg0ZgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL1B0VXRpbFRlc3RzLmNzCkBAIC0wLDAgKzEsNTQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBFcmljIFdoaXRlIDIwMTguCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nLkltYWdpbmc7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7Cit1c2luZyBYdW5pdDsKKworI2lmICFFTElERV9YVU5JVF9URVNUUworCituYW1lc3BhY2UgT3hQdAoreworICAgIHB1YmxpYyBjbGFzcyBQdFV0aWxUZXN0cworICAgIHsKKyAgICAgICAgW1RoZW9yeShTa2lwID0gIlRoaXMgaXMgZmFpbGluZyBvbiBBcHBWZXlvciIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUFUvUFUwMDEtVGVzdDAwMS5taHQiKV0KKyAgICAgICAgcHVibGljIHZvaWQgUFUwMDEoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZU1odCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lKSk7CisgICAgICAgICAgICB2YXIgc3JjID0gRmlsZS5SZWFkQWxsVGV4dChzb3VyY2VNaHQuRnVsbE5hbWUpOworICAgICAgICAgICAgdmFyIHAgPSBNaHRQYXJzZXIuUGFyc2Uoc3JjKTsKKyAgICAgICAgICAgIEFzc2VydC5UcnVlKHAuQ29udGVudFR5cGUgIT0gbnVsbCk7CisgICAgICAgICAgICBBc3NlcnQuVHJ1ZShwLk1pbWVWZXJzaW9uICE9IG51bGwpOworICAgICAgICAgICAgQXNzZXJ0LlRydWUocC5QYXJ0cy5MZW5ndGggIT0gMCk7CisgICAgICAgICAgICBBc3NlcnQuRG9lc05vdENvbnRhaW4ocC5QYXJ0cywgcGFydCA9PiBwYXJ0LkNvbnRlbnRUeXBlID09IG51bGwgfHwgcGFydC5Db250ZW50TG9jYXRpb24gPT0gbnVsbCk7CisgICAgICAgIH0KKworICAgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9SZXZpc2lvbkFjY2VwdGVyVGVzdHMuY3MgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9SZXZpc2lvbkFjY2VwdGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzYWUxMwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL1JldmlzaW9uQWNjZXB0ZXJUZXN0cy5jcwpAQCAtMCwwICsxLDU1IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkRyYXdpbmcuSW1hZ2luZzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKK3VzaW5nIFh1bml0OworCisjaWYgIUVMSURFX1hVTklUX1RFU1RTCisKK25hbWVzcGFjZSBPeFB0Cit7CisgICAgcHVibGljIGNsYXNzIFJhVGVzdHMKKyAgICB7CisgICAgICAgIFtUaGVvcnldCisgICAgICAgIFtJbmxpbmVEYXRhKCJSQTAwMS1UcmFja2VkLVJldmlzaW9ucy0wMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSQTAwMS1UcmFja2VkLVJldmlzaW9ucy0wMi5kb2N4IildCisKKyAgICAgICAgcHVibGljIHZvaWQgUkEwMDEoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZURvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZSkpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCBub3RBY2NlcHRlZCA9IG5ldyBXbWxEb2N1bWVudChzb3VyY2VEb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IGFmdGVyQWNjZXB0aW5nID0gUmV2aXNpb25BY2NlcHRlci5BY2NlcHRSZXZpc2lvbnMobm90QWNjZXB0ZWQpOworICAgICAgICAgICAgdmFyIHByb2Nlc3NlZERlc3REb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2VEb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLXByb2Nlc3NlZC1ieS1SZXZpc2lvbkFjY2VwdGVyLmRvY3giKSkpOworICAgICAgICAgICAgYWZ0ZXJBY2NlcHRpbmcuU2F2ZUFzKHByb2Nlc3NlZERlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgfQorCisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL1JldmlzaW9uUHJvY2Vzc29yVGVzdHMuY3MgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9SZXZpc2lvblByb2Nlc3NvclRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MzUzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9SZXZpc2lvblByb2Nlc3NvclRlc3RzLmNzCkBAIC0wLDAgKzEsMjI0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkRyYXdpbmcuSW1hZ2luZzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKK3VzaW5nIFh1bml0OworCisjaWYgIUVMSURFX1hVTklUX1RFU1RTCisKK25hbWVzcGFjZSBPeFB0Cit7CisgICAgcHVibGljIGNsYXNzIFJwVGVzdHMKKyAgICB7CisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIHBlcmYgc2V0dGluZ3MKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIG1fQ29weVNvdXJjZUZpbGVzVG9UZW1wRGlyID0gdHJ1ZTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIG1fT3BlblRlbXBEaXJJbkV4cGxvcmVyID0gZmFsc2U7CisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiUlAvUlAwMDEtVHJhY2tlZC1SZXZpc2lvbnMtMDEuZG9jeCIpXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCJSUC9SUDAwMS1UcmFja2VkLVJldmlzaW9ucy0wMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDAwMi1EZWxldGVkLVRleHQuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwMDMtSW5zZXJ0ZWQtVGV4dC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDAwNC1EZWxldGVkLVRleHQtaW4tQ0MuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwMDUtRGVsZXRlZC1QYXJhZ3JhcGgtTWFyay5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDAwNi1JbnNlcnRlZC1QYXJhZ3JhcGgtTWFyay5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDAwNy1NdWx0aXBsZS1EZWxldGVkLVBhcmEtTWFyay5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDAwOC1NdWx0aXBsZS1JbnNlcnRlZC1QYXJhLU1hcmsuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwMDktRGVsZXRlZC1UYWJsZS1Sb3cuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwMTAtSW5zZXJ0ZWQtVGFibGUtUm93LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDExLU11bHRpcGxlLURlbGV0ZWQtUm93cy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDAxMi1NdWx0aXBsZS1JbnNlcnRlZC1Sb3dzLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDEzLURlbGV0ZWQtTWF0aC1Db250cm9sLUNoYXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwMTQtSW5zZXJ0ZWQtTWF0aC1Db250cm9sLUNoYXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwMTUtTW92ZUZyb20tTW92ZVRvLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDE2LURlbGV0ZWQtQ0MuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwMTctSW5zZXJ0ZWQtQ0MuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwMTgtTW92ZUZyb20tTW92ZVRvLUNDLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDE5LURlbGV0ZWQtRmllbGQtQ29kZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDAyMC1JbnNlcnRlZC1GaWVsZC1Db2RlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDIxLUluc2VydGVkLU51bWJlcmluZy1Qcm9wZXJ0aWVzLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDIyLU51bWJlcmluZ0NoYW5nZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDAyMy1OdW1iZXJpbmdDaGFuZ2UuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwMjQtUGFyYWdyYXBoTWFyay1yUHItQ2hhbmdlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDI1LVBhcmFncmFwaC1Qcm9wcy1DaGFuZ2UuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwMjYtTnVtYmVyaW5nQ2hhbmdlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDI3LUNoYW5nZS1TZWN0aW9uLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDI4LVRhYmxlLUdyaWQtQ2hhbmdlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDI5LVRhYmxlLVJvdy1Qcm9wcy1DaGFuZ2UuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwMzAtVGFibGUtUm93LVByb3BzLUNoYW5nZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDAzMS1UYWJsZS1Qcm9wLUNoYW5nZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDAzMi1UYWJsZS1Qcm9wLUNoYW5nZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDAzMy1UYWJsZS1Qcm9wLUV4LUNoYW5nZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDAzNC1EZWxldGVkLUNlbGxzLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDM1LUluc2VydGVkLUNlbGxzLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDM2LVZlcnQtTWVyZ2VkLUNlbGxzLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDM3LUNoYW5nZWQtU3R5bGUtUGFyYS1Qcm9wcy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDAzOC1JbnNlcnRlZC1QYXJhcy1hdC1FbmQuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwMzktSW5zZXJ0ZWQtUGFyYXMtYXQtRW5kLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDQwLURlbGV0ZWQtUGFyYXMtYXQtRW5kLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDQxLUNlbGwtV2l0aC1FbXB0eS1QYXJhcy1hdC1FbmQuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwNDItRGVsZXRlZC1QYXJhLU1hcmstYXQtRW5kLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDQzLU1FUkdFRk9STUFULUZpZWxkLUNvZGUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwNDQtTUVSR0VGT1JNQVQtRmllbGQtQ29kZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDA0NS1PbmUtYW5kLUhhbGYtRGVsZXRlZC1MaW5lcy1hdC1FbmQuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwNDYtQ29uc2VjdXRpdmUtRGVsZXRlZC1SYW5nZXMuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwNDctSW5zZXJ0ZWQtYW5kLURlbGV0ZWQtUGFyYWdyYXBoLU1hcmsuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwNDgtRGVsZXRlZC1JbnNlcnRlZC1QYXJhLU1hcmsuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUlAvUlAwNDktRGVsZXRlZC1QYXJhLUJlZm9yZS1UYWJsZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSUC9SUDA1MC1EZWxldGVkLUZvb3Rub3RlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJQL1JQMDUyLURlbGV0ZWQtUGFyYS1NYXJrLmRvY3giKV0KKyAgICAgICAgcHVibGljIHZvaWQgUlAwMDEoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzb3VyY2VGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lKSk7CisgICAgICAgICAgICB2YXIgYmFzZWxpbmVBY2NlcHRlZEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLUFjY2VwdGVkLmRvY3giKSkpOworICAgICAgICAgICAgdmFyIGJhc2VsaW5lUmVqZWN0ZWRGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi1SZWplY3RlZC5kb2N4IikpKTsKKworICAgICAgICAgICAgV21sRG9jdW1lbnQgc291cmNlV21sID0gbmV3IFdtbERvY3VtZW50KHNvdXJjZUZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IGFmdGVyUmVqZWN0aW5nV21sID0gUmV2aXNpb25Qcm9jZXNzb3IuUmVqZWN0UmV2aXNpb25zKHNvdXJjZVdtbCk7CisgICAgICAgICAgICBXbWxEb2N1bWVudCBhZnRlckFjY2VwdGluZ1dtbCA9IFJldmlzaW9uUHJvY2Vzc29yLkFjY2VwdFJldmlzaW9ucyhzb3VyY2VXbWwpOworCisgICAgICAgICAgICB2YXIgcHJvY2Vzc2VkQWNjZXB0ZWRGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlRmkuTmFtZS5SZXBsYWNlKCIuZG9jeCIsICItQWNjZXB0ZWQuZG9jeCIpKSk7CisgICAgICAgICAgICBhZnRlckFjY2VwdGluZ1dtbC5TYXZlQXMocHJvY2Vzc2VkQWNjZXB0ZWRGaS5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIHZhciBwcm9jZXNzZWRSZWplY3RlZEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2VGaS5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi1SZWplY3RlZC5kb2N4IikpKTsKKyAgICAgICAgICAgIGFmdGVyUmVqZWN0aW5nV21sLlNhdmVBcyhwcm9jZXNzZWRSZWplY3RlZEZpLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIC8vIENvcHkgc291cmNlIGZpbGVzIHRvIHRlbXAgZGlyCisgICAgICAgICAgICBpZiAobV9Db3B5U291cmNlRmlsZXNUb1RlbXBEaXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vLyBDT0RFIFRPIFJFUEVBVCBVTlRJTCBTVUNDRVNTIC8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzb3VyY2VEb2N4Q29waWVkVG9EZXN0RmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZUZpLk5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc291cmNlRG9jeENvcGllZFRvRGVzdEZpLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VXbWwuU2F2ZUFzKHNvdXJjZURvY3hDb3BpZWRUb0Rlc3RGaS5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcCg1MCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAvLyBjcmVhdGUgYmF0Y2ggZmlsZSB0byBjb3B5IHByb3Blcmx5IHByb2Nlc3NlZCBkb2N1bWVudHMgdG8gdGhlIFRlc3RGaWxlcyBkaXJlY3RvcnkuCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8gQ09ERSBUTyBSRVBFQVQgVU5USUwgU1VDQ0VTUyAvLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgICAgIHZhciBiYXRjaEZpbGVOYW1lID0gIkNvcHktR2VuLUZpbGVzLVRvLVRlc3RGaWxlcy5iYXQiOworICAgICAgICAgICAgICAgICAgICB2YXIgYmF0Y2hGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgYmF0Y2hGaWxlTmFtZSkpOworICAgICAgICAgICAgICAgICAgICB2YXIgYmF0Y2ggPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgYmF0Y2ggKz0gImNvcHkgIiArIHByb2Nlc3NlZEFjY2VwdGVkRmkuRnVsbE5hbWUgKyAiICIgKyBiYXNlbGluZUFjY2VwdGVkRmkuRnVsbE5hbWUgKyBFbnZpcm9ubWVudC5OZXdMaW5lOworICAgICAgICAgICAgICAgICAgICBiYXRjaCArPSAiY29weSAiICsgcHJvY2Vzc2VkUmVqZWN0ZWRGaS5GdWxsTmFtZSArICIgIiArIGJhc2VsaW5lUmVqZWN0ZWRGaS5GdWxsTmFtZSArIEVudmlyb25tZW50Lk5ld0xpbmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChiYXRjaEZpLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuQXBwZW5kQWxsVGV4dChiYXRjaEZpLkZ1bGxOYW1lLCBiYXRjaCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KGJhdGNoRmkuRnVsbE5hbWUsIGJhdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5UaHJlYWRpbmcuVGhyZWFkLlNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAvLyBPcGVuIFdpbmRvd3MgRXhwbG9yZXIKKyAgICAgICAgICAgIGlmIChtX09wZW5UZW1wRGlySW5FeHBsb3JlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vIENPREUgVE8gUkVQRUFUIFVOVElMIFNVQ0NFU1MgLy8vLy8vLy8vLworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbWFwaG9yRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsICJ6X0V4cGxvcmVyT3BlbmVkU2VtYXBob3JlLnR4dCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VtYXBob3JGaS5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoc2VtYXBob3JGaS5GdWxsTmFtZSwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLkV4cGxvcmVyKFRlc3RVdGlsLlRlbXBEaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoNTApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgLy8gVXNlIFdtbENvbXBhcmVyIHRvIHNlZSBpZiBhY2NlcHRlZCBiYXNlbGluZSBpcyBzYW1lIGFzIHByb2Nlc3NlZAorICAgICAgICAgICAgaWYgKGJhc2VsaW5lQWNjZXB0ZWRGaS5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGJhc2VsaW5lQWNjZXB0ZWRXbWwgPSBuZXcgV21sRG9jdW1lbnQoYmFzZWxpbmVBY2NlcHRlZEZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICBXbWxDb21wYXJlclNldHRpbmdzIHdtbENvbXBhcmVyU2V0dGluZ3MgPSBuZXcgV21sQ29tcGFyZXJTZXR0aW5ncygpOworICAgICAgICAgICAgICAgIFdtbERvY3VtZW50IHJlc3VsdCA9IFdtbENvbXBhcmVyLkNvbXBhcmUoYmFzZWxpbmVBY2NlcHRlZFdtbCwgYWZ0ZXJBY2NlcHRpbmdXbWwsIHdtbENvbXBhcmVyU2V0dGluZ3MpOworICAgICAgICAgICAgICAgIHZhciByZXZpc2lvbnMgPSBXbWxDb21wYXJlci5HZXRSZXZpc2lvbnMocmVzdWx0LCB3bWxDb21wYXJlclNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAocmV2aXNpb25zLkFueSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LlRydWUoZmFsc2UsICJSZWdyZXNzaW9uIEVycm9yOiBBY2NlcHRlZCBiYXNlbGluZSBkb2N1bWVudCBkaWQgbm90IG1hdGNoIHByb2Nlc3NlZCBkb2N1bWVudCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShmYWxzZSwgIk5vIEFjY2VwdGVkIGJhc2VsaW5lIGRvY3VtZW50Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAvLyBVc2UgV21sQ29tcGFyZXIgdG8gc2VlIGlmIHJlamVjdGVkIGJhc2VsaW5lIGlzIHNhbWUgYXMgcHJvY2Vzc2VkCisgICAgICAgICAgICBpZiAoYmFzZWxpbmVSZWplY3RlZEZpLkV4aXN0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYmFzZWxpbmVSZWplY3RlZFdtbCA9IG5ldyBXbWxEb2N1bWVudChiYXNlbGluZVJlamVjdGVkRmkuRnVsbE5hbWUpOworICAgICAgICAgICAgICAgIFdtbENvbXBhcmVyU2V0dGluZ3Mgd21sQ29tcGFyZXJTZXR0aW5ncyA9IG5ldyBXbWxDb21wYXJlclNldHRpbmdzKCk7CisgICAgICAgICAgICAgICAgV21sRG9jdW1lbnQgcmVzdWx0ID0gV21sQ29tcGFyZXIuQ29tcGFyZShiYXNlbGluZVJlamVjdGVkV21sLCBhZnRlclJlamVjdGluZ1dtbCwgd21sQ29tcGFyZXJTZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgdmFyIHJldmlzaW9ucyA9IFdtbENvbXBhcmVyLkdldFJldmlzaW9ucyhyZXN1bHQsIHdtbENvbXBhcmVyU2V0dGluZ3MpOworICAgICAgICAgICAgICAgIGlmIChyZXZpc2lvbnMuQW55KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShmYWxzZSwgIlJlZ3Jlc3Npb24gRXJyb3I6IFJlamVjdGVkIGJhc2VsaW5lIGRvY3VtZW50IGRpZCBub3QgbWF0Y2ggcHJvY2Vzc2VkIGRvY3VtZW50Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5UcnVlKGZhbHNlLCAiTm8gUmVqZWN0ZWQgYmFzZWxpbmUgZG9jdW1lbnQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9TbWxDZWxsRm9ybWF0dGVyVGVzdHMuY3MgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9TbWxDZWxsRm9ybWF0dGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5YWUxOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL1NtbENlbGxGb3JtYXR0ZXJUZXN0cy5jcwpAQCAtMCwwICsxLDE2NyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nLkltYWdpbmc7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7Cit1c2luZyBYdW5pdDsKKworI2lmICFFTElERV9YVU5JVF9URVNUUworCituYW1lc3BhY2UgT3hQdAoreworICAgIHB1YmxpYyBjbGFzcyBDZlRlc3RzCisgICAgeworICAgICAgICBbVGhlb3J5XQorICAgICAgICBbSW5saW5lRGF0YSgiR2VuZXJhbCIsICIwIiwgIjAiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIjAiLCAiMS4xMDAwMDAwMDAwMDAwMDAxIiwgIjEiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIjAiLCAiMTAuMSIsICIxMCIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiMCIsICIxMDAuMSIsICIxMDAiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIjAiLCAiMTAwMDAwMDAwLjA5OTk5OTk5IiwgIjEwMDAwMDAwMCIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiMC4wMCIsICIxLjEwMDAwMDAwMDAwMDAwMDEiLCAiMS4xMCIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiMC4wMCIsICIxMC4xIiwgIjEwLjEwIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIwLjAwIiwgIjEwMDAwMDAwMC4wOTk5OTk5OSIsICIxMDAwMDAwMDAuMTAiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIiMsIyMwIiwgIjEuMTAwMDAwMDAwMDAwMDAwMSIsICIxIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIjLCMjMCIsICIxMC4xIiwgIjEwIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIjLCMjMCIsICIxMDAwMDAwMDAuMDk5OTk5OTkiLCAiMTAwLDAwMCwwMDAiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIiMsIyMwIiwgIjEwMDAwMDAwMDAuMSIsICIxLDAwMCwwMDAsMDAwIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIjLCMjMC4wMCIsICIxLjEwMDAwMDAwMDAwMDAwMDEiLCAiMS4xMCIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiIywjIzAuMDAiLCAiMTAuMSIsICIxMC4xMCIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiIywjIzAuMDAiLCAiMTAwMC4xIiwgIjEsMDAwLjEwIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIjLCMjMC4wMCIsICIxMDAwMDAwMDAuMDk5OTk5OTkiLCAiMTAwLDAwMCwwMDAuMTAiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIjAlIiwgIjAuMDEiLCAiMSUiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIjAlIiwgIjAuMjUiLCAiMjUlIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIwJSIsICIxIiwgIjEwMCUiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIjAlIiwgIjIiLCAiMjAwJSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiMCUiLCAiMC4xIiwgIjEwJSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiMC4wMCUiLCAiMC4wMSIsICIxLjAwJSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiMC4wMCUiLCAiMC4yNSIsICIyNS4wMCUiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIjAuMDAlIiwgIjEiLCAiMTAwLjAwJSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiMC4wMCUiLCAiMiIsICIyMDAuMDAlIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIwLjAwJSIsICIwLjEiLCAiMTAuMDAlIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIwLjAwJSIsICIwLjEwMjUiLCAiMTAuMjUlIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIwLjAwRSswMCIsICIwLjAxIiwgIjEuMDBFLTAyIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIwLjAwRSswMCIsICIwLjI1IiwgIjIuNTBFLTAxIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIwLjAwRSswMCIsICIxIiwgIjEuMDBFKzAwIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIwLjAwRSswMCIsICIxMDAiLCAiMS4wMEUrMDIiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIjAuMDBFKzAwIiwgIjEwMDAiLCAiMS4wMEUrMDMiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIjAuMDBFKzAwIiwgIjEwMDAwLjEiLCAiMS4wMEUrMDQiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIjAuMDBFKzAwIiwgIjEwMDAwMC41IiwgIjEuMDBFKzA1IiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIwLjAwRSswMCIsICIwLjEiLCAiMS4wMEUtMDEiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIiMgPy8/IiwgIjAuMTI1IiwgIjAuMTMiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIiMgPy8/IiwgIjAuMjUiLCAiMC4yNSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiIyA/Py8/PyIsICIwLjEyNSIsICIwLjEzIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIjID8/Lz8/IiwgIjAuMjUiLCAiMC4yNSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgibW0tZGQteXkiLCAiNDIzNDQiLCAiMTItMDYtMTUiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoImQtbW1tLXl5IiwgIjQyMzQ0IiwgIjYtRGVjLTE1IiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJkLW1tbSIsICI0MjM0NCIsICI2LURlYyIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgibW1tLXl5IiwgIjQyMzQ0IiwgIkRlYy0xNSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiaDptbSBBTS9QTSIsICI0MjM0NC4yOTUxMzg4ODg4OTEiLCAiNzowNSBBTSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiaDptbTpzcyBBTS9QTSIsICI0MjM0NC4yOTU0MDUwOTI1OTEiLCAiNzowNToyMyBBTSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiaDptbSIsICI0MjM0NC4yOTU0MDUwOTI1OTEiLCAiNzowNSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiaDptbTpzcyIsICI0MjM0NC4yOTU0MDUwOTI1OTEiLCAiNzowNToyMyIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgibS9kL3l5IGg6bW0iLCAiNDIzNDQuMjk1NDA1MDkyNTkxIiwgIjEyLzYvMTUgNzowNSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiIywjIzAgOygjLCMjMCkiLCAiMTAwIiwgIjEwMCIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiIywjIzAgOygjLCMjMCkiLCAiLTEwMCIsICIoMTAwKSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiIywjIzAgO1tSZWRdKCMsIyMwKSIsICIxMDAiLCAiMTAwIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCIjLCMjMCA7W1JlZF0oIywjIzApIiwgIi0xMDAiLCAiKDEwMCkiLCAiUmVkIildCisgICAgICAgIFtJbmxpbmVEYXRhKCIjLCMjMC4wMDsoIywjIzAuMDApIiwgIjEwMC4wMCIsICIxMDAuMDAiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIiMsIyMwLjAwOygjLCMjMC4wMCkiLCAiLTEwMC4wMCIsICIoMTAwLjAwKSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiIywjIzAuMDA7W1JlZF0oIywjIzAuMDApIiwgIjEwMC4wMCIsICIxMDAuMDAiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIiMsIyMwLjAwO1tSZWRdKCMsIyMwLjAwKSIsICItMTAwLjAwIiwgIigxMDAuMDApIiwgIlJlZCIpXQorICAgICAgICBbSW5saW5lRGF0YSgibW06c3MiLCAiNDIzNDQuMjk1NDA1MDkyNTkxIiwgIjA1OjIzIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJbaF06bW06c3MiLCAiNDIzNDQuMjk1NDA1MDkyNTkxIiwgIjEwMTYyNjM6MDU6MjMiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIm1tOnNzLjAiLCAiNDIzNDQuMjk1NDQ1MDkyNTkxIiwgIjA1OjI2OjQ1NiIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiIyMwLjBFKzAiLCAiMTAwLjAiLCAiMTAwLjBFKzAiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIiMjMC4wRSswIiwgIjU0My4yMTAiLCAiNTQzLjJFKzAiLCBudWxsKV0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIENGMDAxKHN0cmluZyBmb3JtYXRDb2RlLCBzdHJpbmcgdmFsdWUsIHN0cmluZyBleHBlY3RlZCwgc3RyaW5nIGV4cGVjdGVkQ29sb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBjb2xvcjsKKyAgICAgICAgICAgIHN0cmluZyByID0gU21sQ2VsbEZvcm1hdHRlci5Gb3JtYXRDZWxsKGZvcm1hdENvZGUsIHZhbHVlLCBvdXQgY29sb3IpOworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKGV4cGVjdGVkLCByKTsKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbChleHBlY3RlZENvbG9yLCBjb2xvcik7CisgICAgICAgIH0KKworICAgICAgICBbVGhlb3J5XQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxNTEtQ3VzdG9tLUNlbGwtRm9ybWF0LUN1cnJlbmN5Lnhsc3giLCAiU2hlZXQxIiwgIkExOkExIiwgIiQxMjMuNDUiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTUxLUN1c3RvbS1DZWxsLUZvcm1hdC1DdXJyZW5jeS54bHN4IiwgIlNoZWV0MSIsICJBMjpBMiIsICItJDEyMy40NSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxNTEtQ3VzdG9tLUNlbGwtRm9ybWF0LUN1cnJlbmN5Lnhsc3giLCAiU2hlZXQxIiwgIkEzOkEzIiwgIiQwLjAwIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDE1MS1DdXN0b20tQ2VsbC1Gb3JtYXQtQ3VycmVuY3kueGxzeCIsICJTaGVldDEiLCAiQjE6QjEiLCAiJCAxMjMuNDUiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTUxLUN1c3RvbS1DZWxsLUZvcm1hdC1DdXJyZW5jeS54bHN4IiwgIlNoZWV0MSIsICJCMjpCMiIsICIkICgxMjMuNDUpIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDE1MS1DdXN0b20tQ2VsbC1Gb3JtYXQtQ3VycmVuY3kueGxzeCIsICJTaGVldDEiLCAiQjM6QjMiLCAiJCAtIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDE1MS1DdXN0b20tQ2VsbC1Gb3JtYXQtQ3VycmVuY3kueGxzeCIsICJTaGVldDEiLCAiQzE6QzEiLCAiwqMgMTIzLjQ1IiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDE1MS1DdXN0b20tQ2VsbC1Gb3JtYXQtQ3VycmVuY3kueGxzeCIsICJTaGVldDEiLCAiQzI6QzIiLCAiLcKjIDEyMy40NSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxNTEtQ3VzdG9tLUNlbGwtRm9ybWF0LUN1cnJlbmN5Lnhsc3giLCAiU2hlZXQxIiwgIkMzOkMzIiwgIsKjIC0iLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTUxLUN1c3RvbS1DZWxsLUZvcm1hdC1DdXJyZW5jeS54bHN4IiwgIlNoZWV0MSIsICJEMTpEMSIsICLigqwgIDEyMy40NSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxNTEtQ3VzdG9tLUNlbGwtRm9ybWF0LUN1cnJlbmN5Lnhsc3giLCAiU2hlZXQxIiwgIkQyOkQyIiwgIuKCrCAgKDEyMy40NSkiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTUxLUN1c3RvbS1DZWxsLUZvcm1hdC1DdXJyZW5jeS54bHN4IiwgIlNoZWV0MSIsICJEMzpEMyIsICLigqwgIC0iLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTUxLUN1c3RvbS1DZWxsLUZvcm1hdC1DdXJyZW5jeS54bHN4IiwgIlNoZWV0MSIsICJFMTpFMSIsICLCpSAxMjMuNDUiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTUxLUN1c3RvbS1DZWxsLUZvcm1hdC1DdXJyZW5jeS54bHN4IiwgIlNoZWV0MSIsICJFMjpFMiIsICLCpSAtMTIzLjQ1IiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDE1MS1DdXN0b20tQ2VsbC1Gb3JtYXQtQ3VycmVuY3kueGxzeCIsICJTaGVldDEiLCAiRTM6RTMiLCAiwqUgLSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxNTEtQ3VzdG9tLUNlbGwtRm9ybWF0LUN1cnJlbmN5Lnhsc3giLCAiU2hlZXQxIiwgIkYxOkYxIiwgIkNIRiAgMTIzLjQ1IiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDE1MS1DdXN0b20tQ2VsbC1Gb3JtYXQtQ3VycmVuY3kueGxzeCIsICJTaGVldDEiLCAiRjI6RjIiLCAiQ0hGICAtMTIzLjQ1IiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDE1MS1DdXN0b20tQ2VsbC1Gb3JtYXQtQ3VycmVuY3kueGxzeCIsICJTaGVldDEiLCAiRjM6RjMiLCAiQ0hGICAtIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDE1MS1DdXN0b20tQ2VsbC1Gb3JtYXQtQ3VycmVuY3kueGxzeCIsICJTaGVldDEiLCAiRzE6RzEiLCAi4oKpIDEyMy40NSIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxNTEtQ3VzdG9tLUNlbGwtRm9ybWF0LUN1cnJlbmN5Lnhsc3giLCAiU2hlZXQxIiwgIkcyOkcyIiwgIi3igqkgMTIzLjQ1IiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDE1MS1DdXN0b20tQ2VsbC1Gb3JtYXQtQ3VycmVuY3kueGxzeCIsICJTaGVldDEiLCAiRzM6RzMiLCAi4oKpIC0iLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTUxLUN1c3RvbS1DZWxsLUZvcm1hdC1DdXJyZW5jeS54bHN4IiwgIlNoZWV0MSIsICJIMTpIMSIsICLCoyAxMjMuNDUiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTUxLUN1c3RvbS1DZWxsLUZvcm1hdC1DdXJyZW5jeS54bHN4IiwgIlNoZWV0MSIsICJIMjpIMiIsICItwqMgMTIzLjQ1IiwgIlJlZCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxNTEtQ3VzdG9tLUNlbGwtRm9ybWF0LUN1cnJlbmN5Lnhsc3giLCAiU2hlZXQxIiwgIkgzOkgzIiwgIsKjIC0iLCBudWxsKV0KKworICAgICAgICBbSW5saW5lRGF0YSgiU0gxNTItQ3VzdG9tLUNlbGwtRm9ybWF0Lnhsc3giLCAiU2hlZXQxIiwgIkExOkExIiwgIjEsMjM0LDU2Ny4wMDAwIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDE1Mi1DdXN0b20tQ2VsbC1Gb3JtYXQueGxzeCIsICJTaGVldDEiLCAiQjE6QjEiLCAiVGhpcyBpcyB0aGUgdmFsdWU6IGFiYyIsIG51bGwpXQorCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDIwMS1DZWxsLUMxLVdpdGhvdXQtUi1BdHRyLnhsc3giLCAiU2hlZXQxIiwgIkMxOkMxIiwgIjMiLCBudWxsKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMjAyLUNlbGwtQzEtRDEtV2l0aG91dC1SLUF0dHIueGxzeCIsICJTaGVldDEiLCAiQzE6QzEiLCAiMyIsIG51bGwpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gyMDMtQ2VsbC1DMS1EMS1FMS1XaXRob3V0LVItQXR0ci54bHN4IiwgIlNoZWV0MSIsICJDMTpDMSIsICIzIiwgbnVsbCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDIwNC1DZWxsLUExLUIxLUMxLVdpdGhvdXQtUi1BdHRyLnhsc3giLCAiU2hlZXQxIiwgIkExOkExIiwgIjEiLCBudWxsKV0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIENGMDAyKHN0cmluZyBuYW1lLCBzdHJpbmcgc2hlZXROYW1lLCBzdHJpbmcgcmFuZ2UsIHN0cmluZyBleHBlY3RlZCwgc3RyaW5nIGV4cGVjdGVkQ29sb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZVhsc3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZSkpOworCisgICAgICAgICAgICB2YXIgc291cmNlQ29waWVkVG9EZXN0WGxzeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlWGxzeC5OYW1lLlJlcGxhY2UoIi54bHN4IiwgIi0xLVNvdXJjZS54bHN4IikpKTsKKyAgICAgICAgICAgIGlmICghc291cmNlQ29waWVkVG9EZXN0WGxzeC5FeGlzdHMpCisgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZVhsc3guRnVsbE5hbWUsIHNvdXJjZUNvcGllZFRvRGVzdFhsc3guRnVsbE5hbWUpOworCisgICAgICAgICAgICB2YXIgZGF0YVRlbXBsYXRlRmlsZU5hbWVTdWZmaXggPSBzdHJpbmcuRm9ybWF0KCItMi1HZW5lcmF0ZWQtWG1sRGF0YS17MH0ueG1sIiwgcmFuZ2UuUmVwbGFjZSgiOiIsICIiKSk7CisgICAgICAgICAgICB2YXIgZGF0YVhtbEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2VYbHN4Lk5hbWUuUmVwbGFjZSgiLnhsc3giLCBkYXRhVGVtcGxhdGVGaWxlTmFtZVN1ZmZpeCkpKTsKKyAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4oc291cmNlWGxzeC5GdWxsTmFtZSwgdHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJhbmdlWG1sID0gU21sRGF0YVJldHJpZXZlci5SZXRyaWV2ZVJhbmdlKHNEb2MsIHNoZWV0TmFtZSwgcmFuZ2UpOworICAgICAgICAgICAgICAgIHN0cmluZyBkaXNwbGF5VmFsdWUgPSAoc3RyaW5nKXJhbmdlWG1sLkRlc2NlbmRhbnRzKCJEaXNwbGF5VmFsdWUiKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIHN0cmluZyBkaXNwbGF5Q29sb3IgPSAoc3RyaW5nKXJhbmdlWG1sLkRlc2NlbmRhbnRzKCJEaXNwbGF5Q29sb3IiKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbChleHBlY3RlZCwgZGlzcGxheVZhbHVlKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoZXhwZWN0ZWRDb2xvciwgZGlzcGxheUNvbG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvU21sVG9IdG1sQ29udmVydGVyVGVzdHMuY3MgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9TbWxUb0h0bWxDb252ZXJ0ZXJUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGQ0YjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvU21sVG9IdG1sQ29udmVydGVyVGVzdHMuY3MKQEAgLTAsMCArMSwyMDUgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uRHJhd2luZy5JbWFnaW5nOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOwordXNpbmcgWHVuaXQ7CisKKyNpZiAhRUxJREVfWFVOSVRfVEVTVFMKKworbmFtZXNwYWNlIE94UHQKK3sKKyAgICBwdWJsaWMgY2xhc3MgU2hUZXN0cworICAgIHsKKyAgICAgICAgLy8gUG93ZXJTaGVsbCBvbmVsaW5lciB0aGF0IGdlbmVyYXRlcyBJbmxpbmVEYXRhIGZvciBhbGwgZmlsZXMgaW4gYSBkaXJlY3RvcnkKKyAgICAgICAgLy8gZGlyIHwgJSB7ICdbSW5saW5lRGF0YSgiJyArICRfLk5hbWUgKyAnIildJyB9IHwgY2xpcAorCisgICAgICAgIFtUaGVvcnldCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEwMS1TaW1wbGVGb3JtYXRzLnhsc3giLCAiU2hlZXQxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEwMi05LXgtOS54bHN4IiwgIlNoZWV0MSIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMDMtTm8tU2hhcmVkU3RyaW5nLnhsc3giLCAiU2hlZXQxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEwNC1XaXRoLVNoYXJlZFN0cmluZy54bHN4IiwgIlNoZWV0MSIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMDUtTm8tU2hhcmVkU3RyaW5nLnhsc3giLCAiU2hlZXQxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEwNi05LXgtOS1Gb3JtYXR0ZWQueGxzeCIsICJTaGVldDEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTA4LVNpbXBsZUZvcm1hdHRlZENlbGwueGxzeCIsICJTaGVldDEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTA5LUNlbGxXaXRoQm9yZGVyLnhsc3giLCAiU2hlZXQxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDExMC1DZWxsV2l0aE1hc3RlclN0eWxlLnhsc3giLCAiU2hlZXQxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDExMS1DaGFuZ2VkRGVmYXVsdENvbHVtbldpZHRoLnhsc3giLCAiU2hlZXQxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDExMi1Ob3RWZXJ0TWVyZ2VkQ2VsbC54bHN4IiwgIlNoZWV0MSIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMTMtVmVydE1lcmdlZENlbGwueGxzeCIsICJTaGVldDEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTE0LUNlbnRlcmVkLUNlbGwueGxzeCIsICJTaGVldDEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTE1LURpZ2l0c1RvUmlnaHQueGxzeCIsICJTaGVldDEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTE2LUZtdE51bUlkLTEueGxzeCIsICJTaGVldDEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTE3LUZtdE51bUlkLTIueGxzeCIsICJTaGVldDEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTE4LUZtdE51bUlkLTMueGxzeCIsICJTaGVldDEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTE5LUZtdE51bUlkLTQueGxzeCIsICJTaGVldDEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTIwLUZtdE51bUlkLTkueGxzeCIsICJTaGVldDEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTIxLUZtdE51bUlkLTExLnhsc3giLCAiU2hlZXQxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEyMi1GbXROdW1JZC0xMi54bHN4IiwgIlNoZWV0MSIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMjMtRm10TnVtSWQtMTQueGxzeCIsICJTaGVldDEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTI0LUZtdE51bUlkLTE1Lnhsc3giLCAiU2hlZXQxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEyNS1GbXROdW1JZC0xNi54bHN4IiwgIlNoZWV0MSIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMjYtRm10TnVtSWQtMTcueGxzeCIsICJTaGVldDEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTI3LUZtdE51bUlkLTE4Lnhsc3giLCAiU2hlZXQxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEyOC1GbXROdW1JZC0xOS54bHN4IiwgIlNoZWV0MSIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMjktRm10TnVtSWQtMjAueGxzeCIsICJTaGVldDEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTMwLUZtdE51bUlkLTIxLnhsc3giLCAiU2hlZXQxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEzMS1GbXROdW1JZC0yMi54bHN4IiwgIlNoZWV0MSIpXQorCisgICAgICAgIHB1YmxpYyB2b2lkIFNIMDA1X0NvbnZlcnRTaGVldChzdHJpbmcgbmFtZSwgc3RyaW5nIHNoZWV0TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlWGxzeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lKSk7CisKKyAgICAgICAgICAgIHZhciBzb3VyY2VDb3BpZWRUb0Rlc3RYbHN4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2VYbHN4Lk5hbWUuUmVwbGFjZSgiLnhsc3giLCAiLTEtU291cmNlLnhsc3giKSkpOworICAgICAgICAgICAgaWYgKCFzb3VyY2VDb3BpZWRUb0Rlc3RYbHN4LkV4aXN0cykKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlWGxzeC5GdWxsTmFtZSwgc291cmNlQ29waWVkVG9EZXN0WGxzeC5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIHZhciBkYXRhVGVtcGxhdGVGaWxlTmFtZVN1ZmZpeCA9ICItMi1HZW5lcmF0ZWQtWG1sRGF0YS1FbnRpcmUtU2hlZXQueG1sIjsKKyAgICAgICAgICAgIHZhciBkYXRhWG1sRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZVhsc3guTmFtZS5SZXBsYWNlKCIueGxzeCIsIGRhdGFUZW1wbGF0ZUZpbGVOYW1lU3VmZml4KSkpOworICAgICAgICAgICAgdXNpbmcgKFNwcmVhZHNoZWV0RG9jdW1lbnQgc0RvYyA9IFNwcmVhZHNoZWV0RG9jdW1lbnQuT3Blbihzb3VyY2VYbHN4LkZ1bGxOYW1lLCB0cnVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2V0dGluZ3MgPSBuZXcgU21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3MoKTsKKyAgICAgICAgICAgICAgICB2YXIgcmFuZ2VYbWwgPSBTbWxEYXRhUmV0cmlldmVyLlJldHJpZXZlU2hlZXQoc0RvYywgc2hlZXROYW1lKTsKKyAgICAgICAgICAgICAgICByYW5nZVhtbC5TYXZlKGRhdGFYbWxGaS5GdWxsTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGhlb3J5XQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMDEtU2ltcGxlRm9ybWF0cy54bHN4IiwgIlNoZWV0MSIsICJBMTpCMTAiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTAxLVNpbXBsZUZvcm1hdHMueGxzeCIsICJTaGVldDEiLCAiQTQ6QjgiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTAyLTkteC05Lnhsc3giLCAiU2hlZXQxIiwgIkExOkExIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEwMi05LXgtOS54bHN4IiwgIlNoZWV0MSIsICJDMjpDMiIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMDItOS14LTkueGxzeCIsICJTaGVldDEiLCAiQTk6QTkiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTAyLTkteC05Lnhsc3giLCAiU2hlZXQxIiwgIkkxOkkxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEwMi05LXgtOS54bHN4IiwgIlNoZWV0MSIsICJJOTpJOSIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMDItOS14LTkueGxzeCIsICJTaGVldDEiLCAiQTE6STkiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTAyLTkteC05Lnhsc3giLCAiU2hlZXQxIiwgIkEyOkQ0IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEwMi05LXgtOS54bHN4IiwgIlNoZWV0MSIsICJDNTpHNyIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMDMtTm8tU2hhcmVkU3RyaW5nLnhsc3giLCAiU2hlZXQxIiwgIkExOkExIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEwNC1XaXRoLVNoYXJlZFN0cmluZy54bHN4IiwgIlNoZWV0MSIsICJBNDpBNyIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMDUtTm8tU2hhcmVkU3RyaW5nLnhsc3giLCAiU2hlZXQxIiwgIkE0OkE3IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEwNi05LXgtOS1Gb3JtYXR0ZWQueGxzeCIsICJTaGVldDEiLCAiQTE6STkiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTA4LVNpbXBsZUZvcm1hdHRlZENlbGwueGxzeCIsICJTaGVldDEiLCAiQTE6QTEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTA5LUNlbGxXaXRoQm9yZGVyLnhsc3giLCAiU2hlZXQxIiwgIkExOkExIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDExMC1DZWxsV2l0aE1hc3RlclN0eWxlLnhsc3giLCAiU2hlZXQxIiwgIkExOkExIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDExMS1DaGFuZ2VkRGVmYXVsdENvbHVtbldpZHRoLnhsc3giLCAiU2hlZXQxIiwgIkExOkExIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDExMi1Ob3RWZXJ0TWVyZ2VkQ2VsbC54bHN4IiwgIlNoZWV0MSIsICJBMTpBMSIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMTMtVmVydE1lcmdlZENlbGwueGxzeCIsICJTaGVldDEiLCAiQTE6QTEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTE0LUNlbnRlcmVkLUNlbGwueGxzeCIsICJTaGVldDEiLCAiQTE6QTEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTE1LURpZ2l0c1RvUmlnaHQueGxzeCIsICJTaGVldDEiLCAiQTE6QTEwIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDExNi1GbXROdW1JZC0xLnhsc3giLCAiU2hlZXQxIiwgIkExOkExMCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMTctRm10TnVtSWQtMi54bHN4IiwgIlNoZWV0MSIsICJBMTpBMTAiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTE4LUZtdE51bUlkLTMueGxzeCIsICJTaGVldDEiLCAiQTE6QTEwIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDExOS1GbXROdW1JZC00Lnhsc3giLCAiU2hlZXQxIiwgIkExOkExMCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMjAtRm10TnVtSWQtOS54bHN4IiwgIlNoZWV0MSIsICJBMTpBMTAiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTIxLUZtdE51bUlkLTExLnhsc3giLCAiU2hlZXQxIiwgIkExOkExMCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMjItRm10TnVtSWQtMTIueGxzeCIsICJTaGVldDEiLCAiQTE6QTEwIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEyMy1GbXROdW1JZC0xNC54bHN4IiwgIlNoZWV0MSIsICJBMTpBMTAiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTI0LUZtdE51bUlkLTE1Lnhsc3giLCAiU2hlZXQxIiwgIkExOkExMCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMjUtRm10TnVtSWQtMTYueGxzeCIsICJTaGVldDEiLCAiQTE6QTEwIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEyNi1GbXROdW1JZC0xNy54bHN4IiwgIlNoZWV0MSIsICJBMTpBMTAiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTI3LUZtdE51bUlkLTE4Lnhsc3giLCAiU2hlZXQxIiwgIkExOkExMCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMjgtRm10TnVtSWQtMTkueGxzeCIsICJTaGVldDEiLCAiQTE6QTEwIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEyOS1GbXROdW1JZC0yMC54bHN4IiwgIlNoZWV0MSIsICJBMTpBMTAiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMTMwLUZtdE51bUlkLTIxLnhsc3giLCAiU2hlZXQxIiwgIkExOkExMCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gxMzEtRm10TnVtSWQtMjIueGxzeCIsICJTaGVldDEiLCAiQTE6QTEwIildCisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBTSDAwNF9Db252ZXJ0UmFuZ2Uoc3RyaW5nIG5hbWUsIHN0cmluZyBzaGVldE5hbWUsIHN0cmluZyByYW5nZSkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlWGxzeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lKSk7CisKKyAgICAgICAgICAgIHZhciBzb3VyY2VDb3BpZWRUb0Rlc3RYbHN4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2VYbHN4Lk5hbWUuUmVwbGFjZSgiLnhsc3giLCAiLTEtU291cmNlLnhsc3giKSkpOworICAgICAgICAgICAgaWYgKCFzb3VyY2VDb3BpZWRUb0Rlc3RYbHN4LkV4aXN0cykKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlWGxzeC5GdWxsTmFtZSwgc291cmNlQ29waWVkVG9EZXN0WGxzeC5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIHZhciBkYXRhVGVtcGxhdGVGaWxlTmFtZVN1ZmZpeCA9IHN0cmluZy5Gb3JtYXQoIi0yLUdlbmVyYXRlZC1YbWxEYXRhLXswfS54bWwiLCByYW5nZS5SZXBsYWNlKCI6IiwgIiIpKTsKKyAgICAgICAgICAgIHZhciBkYXRhWG1sRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZVhsc3guTmFtZS5SZXBsYWNlKCIueGxzeCIsIGRhdGFUZW1wbGF0ZUZpbGVOYW1lU3VmZml4KSkpOworICAgICAgICAgICAgdXNpbmcgKFNwcmVhZHNoZWV0RG9jdW1lbnQgc0RvYyA9IFNwcmVhZHNoZWV0RG9jdW1lbnQuT3Blbihzb3VyY2VYbHN4LkZ1bGxOYW1lLCB0cnVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2V0dGluZ3MgPSBuZXcgU21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3MoKTsKKyAgICAgICAgICAgICAgICB2YXIgcmFuZ2VYbWwgPSBTbWxEYXRhUmV0cmlldmVyLlJldHJpZXZlUmFuZ2Uoc0RvYywgc2hlZXROYW1lLCByYW5nZSk7CisgICAgICAgICAgICAgICAgcmFuZ2VYbWwuU2F2ZShkYXRhWG1sRmkuRnVsbE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorCisgICAgICAgIFtUaGVvcnldCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDAwMS1UYWJsZS54bHN4IiwgIk15VGFibGUiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMDAzLVRhYmxlV2l0aERhdGVJbkZpcnN0Q29sdW1uLnhsc3giLCAiTXlUYWJsZSIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gwMDQtVGFibGVBdE9mZnNldExvY2F0aW9uLnhsc3giLCAiTXlUYWJsZSIpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gwMDUtVGFibGUtV2l0aC1TaGFyZWRTdHJpbmdzLnhsc3giLCAiVGFibGUxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDAwNi1UYWJsZS1Oby1TaGFyZWRTdHJpbmdzLnhsc3giLCAiVGFibGUxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDEwNy05LXgtOS1Gb3JtYXR0ZWQtVGFibGUueGxzeCIsICJUYWJsZTEiKV0KKyAgICAgICAgW0lubGluZURhdGEoIlNIMDA3LU9uZS1DZWxsLVRhYmxlLnhsc3giLCAiVGFibGUxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDAwOC1UYWJsZS1XaXRoLVRhbGwtUm93Lnhsc3giLCAiVGFibGUxIildCisgICAgICAgIFtJbmxpbmVEYXRhKCJTSDAwOS1UYWJsZS1XaXRoLVdpZGUtQ29sdW1uLnhsc3giLCAiVGFibGUxIildCisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBTSDAwM19Db252ZXJ0VGFibGUoc3RyaW5nIG5hbWUsIHN0cmluZyB0YWJsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZVhsc3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZSkpOworCisgICAgICAgICAgICB2YXIgc291cmNlQ29waWVkVG9EZXN0WGxzeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlWGxzeC5OYW1lLlJlcGxhY2UoIi54bHN4IiwgIi0xLVNvdXJjZS54bHN4IikpKTsKKyAgICAgICAgICAgIGlmICghc291cmNlQ29waWVkVG9EZXN0WGxzeC5FeGlzdHMpCisgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZVhsc3guRnVsbE5hbWUsIHNvdXJjZUNvcGllZFRvRGVzdFhsc3guRnVsbE5hbWUpOworCisgICAgICAgICAgICB2YXIgZGF0YVhtbEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2VYbHN4Lk5hbWUuUmVwbGFjZSgiLnhsc3giLCAiLTItR2VuZXJhdGVkLVhtbERhdGEueG1sIikpKTsKKyAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4oc291cmNlWGxzeC5GdWxsTmFtZSwgdHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gbmV3IFNtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzKCk7CisgICAgICAgICAgICAgICAgdmFyIHJhbmdlWG1sID0gU21sRGF0YVJldHJpZXZlci5SZXRyaWV2ZVRhYmxlKHNEb2MsIHRhYmxlTmFtZSk7CisgICAgICAgICAgICAgICAgcmFuZ2VYbWwuU2F2ZShkYXRhWG1sRmkuRnVsbE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgW0lubGluZURhdGEoIlNwcmVhZHNoZWV0Lnhsc3giLCAyKV0KKyAgICAgICAgcHVibGljIHZvaWQgU0gwMDJfU2hlZXROYW1lcyhzdHJpbmcgbmFtZSwgaW50IG51bWJlck9mU2hlZXRzKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2VYbHN4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUpKTsKKyAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4oc291cmNlWGxzeC5GdWxsTmFtZSwgdHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0TmFtZXMgPSBTbWxEYXRhUmV0cmlldmVyLlNoZWV0TmFtZXMoc0RvYyk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKG51bWJlck9mU2hlZXRzLCBzaGVldE5hbWVzLkxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGhlb3J5XQorICAgICAgICBbSW5saW5lRGF0YSgiU0gwMDEtVGFibGUueGxzeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiU0gwMDItVHdvVGFibGVzVHdvU2hlZXRzLnhsc3giLCAyKV0KKyAgICAgICAgcHVibGljIHZvaWQgU0gwMDFfVGFibGVOYW1lcyhzdHJpbmcgbmFtZSwgaW50IG51bWJlck9mVGFibGVzKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2VYbHN4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUpKTsKKyAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4oc291cmNlWGxzeC5GdWxsTmFtZSwgdHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gU21sRGF0YVJldHJpZXZlci5UYWJsZU5hbWVzKHNEb2MpOworICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbChudW1iZXJPZlRhYmxlcywgdGFibGUuTGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9TcHJlYWRzaGVldFdyaXRlclRlc3RzLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvU3ByZWFkc2hlZXRXcml0ZXJUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTExODBlCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvU3ByZWFkc2hlZXRXcml0ZXJUZXN0cy5jcwpAQCAtMCwwICsxLDM2MSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nLkltYWdpbmc7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5WYWxpZGF0aW9uOwordXNpbmcgU3cgPSBPcGVuWG1sUG93ZXJUb29sczsKK3VzaW5nIFh1bml0OworCisjaWYgIUVMSURFX1hVTklUX1RFU1RTCisKK25hbWVzcGFjZSBPeFB0Cit7CisgICAgcHVibGljIGNsYXNzIFN3VGVzdHMKKyAgICB7CisgICAgICAgIFtGYWN0XQorICAgICAgICBwdWJsaWMgdm9pZCBTVzAwMV9TaW1wbGUoKQorICAgICAgICB7CisgICAgICAgICAgICBTdy5Xb3JrYm9va0RmbiB3YiA9IG5ldyBTdy5Xb3JrYm9va0RmbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdvcmtzaGVldHMgPSBuZXcgU3cuV29ya3NoZWV0RGZuW10KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5Xb3Jrc2hlZXREZm4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJNeUZpcnN0U2hlZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVOYW1lID0gIk5hbWVzQW5kUmF0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uSGVhZGluZ3MgPSBuZXcgU3cuQ2VsbERmbltdCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LkNlbGxEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gIk5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5DZWxsRGZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJBZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9yaXpvbnRhbENlbGxBbGlnbm1lbnQgPSBTdy5Ib3Jpem9udGFsQ2VsbEFsaWdubWVudC5MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LkNlbGxEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gIlJhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9yaXpvbnRhbENlbGxBbGlnbm1lbnQgPSBTdy5Ib3Jpem9udGFsQ2VsbEFsaWdubWVudC5MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBSb3dzID0gbmV3IFN3LlJvd0RmbltdCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LlJvd0RmbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHMgPSBuZXcgU3cuQ2VsbERmbltdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5DZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBTdy5DZWxsRGF0YVR5cGUuU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gIkVyaWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5DZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBTdy5DZWxsRGF0YVR5cGUuTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LkNlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IFN3LkNlbGxEYXRhVHlwZS5OdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAoZGVjaW1hbCk0NS4wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXRDb2RlID0gIjAuMDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LlJvd0RmbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHMgPSBuZXcgU3cuQ2VsbERmbltdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5DZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBTdy5DZWxsRGF0YVR5cGUuU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gIkJvYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LkNlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IFN3LkNlbGxEYXRhVHlwZS5OdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSA0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gU3cuQ2VsbERhdGFUeXBlLk51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IChkZWNpbWFsKTc4LjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdENvZGUgPSAiMC4wMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgb3V0WGxzeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoU3cuVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgIlNXMDAxLVNpbXBsZS54bHN4IikpOworICAgICAgICAgICAgU3cuU3ByZWFkc2hlZXRXcml0ZXIuV3JpdGUob3V0WGxzeC5GdWxsTmFtZSwgd2IpOworICAgICAgICAgICAgVmFsaWRhdGUob3V0WGxzeCk7CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgU1cwMDJfQWxsRGF0YVR5cGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3cuV29ya2Jvb2tEZm4gd2IgPSBuZXcgU3cuV29ya2Jvb2tEZm4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXb3Jrc2hlZXRzID0gbmV3IFN3LldvcmtzaGVldERmbltdCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXcgU3cuV29ya3NoZWV0RGZuCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiTXlGaXJzdFNoZWV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkhlYWRpbmdzID0gbmV3IFN3LkNlbGxEZm5bXQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5DZWxsRGZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJEYXRhVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbGQgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LkNlbGxEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gIlZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9sZCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvcml6b250YWxDZWxsQWxpZ25tZW50ID0gU3cuSG9yaXpvbnRhbENlbGxBbGlnbm1lbnQuUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBSb3dzID0gbmV3IFN3LlJvd0RmbltdCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LlJvd0RmbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHMgPSBuZXcgU3cuQ2VsbERmbltdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5DZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBTdy5DZWxsRGF0YVR5cGUuU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gIkJvb2xlYW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5DZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBTdy5DZWxsRGF0YVR5cGUuQm9vbGVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuUm93RGZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxscyA9IG5ldyBTdy5DZWxsRGZuW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LkNlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IFN3LkNlbGxEYXRhVHlwZS5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiQm9vbGVhbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LkNlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IFN3LkNlbGxEYXRhVHlwZS5Cb29sZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuUm93RGZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxscyA9IG5ldyBTdy5DZWxsRGZuW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LkNlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IFN3LkNlbGxEYXRhVHlwZS5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiU3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gU3cuQ2VsbERhdGFUeXBlLlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJBIFN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9yaXpvbnRhbENlbGxBbGlnbm1lbnQgPSBTdy5Ib3Jpem9udGFsQ2VsbEFsaWdubWVudC5SaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5Sb3dEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxzID0gbmV3IFN3LkNlbGxEZm5bXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gU3cuQ2VsbERhdGFUeXBlLlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJpbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5DZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBTdy5DZWxsRGF0YVR5cGUuTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gKGludCkxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuUm93RGZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxscyA9IG5ldyBTdy5DZWxsRGZuW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LkNlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IFN3LkNlbGxEYXRhVHlwZS5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiaW50PyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LkNlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IFN3LkNlbGxEYXRhVHlwZS5OdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAoaW50PykxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuUm93RGZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxscyA9IG5ldyBTdy5DZWxsRGZuW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LkNlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IFN3LkNlbGxEYXRhVHlwZS5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiaW50PyAoaXMgbnVsbCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5DZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBTdy5DZWxsRGF0YVR5cGUuTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5Sb3dEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxzID0gbmV3IFN3LkNlbGxEZm5bXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gU3cuQ2VsbERhdGFUeXBlLlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJ1aW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gU3cuQ2VsbERhdGFUeXBlLk51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICh1aW50KTEwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5Sb3dEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxzID0gbmV3IFN3LkNlbGxEZm5bXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gU3cuQ2VsbERhdGFUeXBlLlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJsb25nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gU3cuQ2VsbERhdGFUeXBlLk51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IEludDY0Lk1heFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LlJvd0RmbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHMgPSBuZXcgU3cuQ2VsbERmbltdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5DZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBTdy5DZWxsRGF0YVR5cGUuU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gImZsb2F0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gU3cuQ2VsbERhdGFUeXBlLk51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IChmbG9hdCkxMjMuNDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuUm93RGZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxscyA9IG5ldyBTdy5DZWxsRGZuW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LkNlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IFN3LkNlbGxEYXRhVHlwZS5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiZG91YmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gU3cuQ2VsbERhdGFUeXBlLk51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IChkb3VibGUpMTIzLjQ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LlJvd0RmbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHMgPSBuZXcgU3cuQ2VsbERmbltdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5DZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBTdy5DZWxsRGF0YVR5cGUuU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gImRlY2ltYWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5DZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBTdy5DZWxsRGF0YVR5cGUuTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gKGRlY2ltYWwpMTIzLjQ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3LlJvd0RmbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHMgPSBuZXcgU3cuQ2VsbERmbltdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdy5DZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBTdy5DZWxsRGF0YVR5cGUuRGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEyLCAxLCA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXRDb2RlID0gIm1tLWRkLXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3cuQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gU3cuQ2VsbERhdGFUeXBlLkRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMiwgMSwgOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0Q29kZSA9ICJtbS1kZC15eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9sZCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9yaXpvbnRhbENlbGxBbGlnbm1lbnQgPSBTdy5Ib3Jpem9udGFsQ2VsbEFsaWdubWVudC5DZW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgb3V0WGxzeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoU3cuVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgIlNXMDAyLURhdGFUeXBlcy54bHN4IikpOworICAgICAgICAgICAgU3cuU3ByZWFkc2hlZXRXcml0ZXIuV3JpdGUob3V0WGxzeC5GdWxsTmFtZSwgd2IpOworICAgICAgICAgICAgVmFsaWRhdGUob3V0WGxzeCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgVmFsaWRhdGUoRmlsZUluZm8gZmkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4oZmkuRnVsbE5hbWUsIHRydWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9wZW5YbWxWYWxpZGF0b3IgdiA9IG5ldyBPcGVuWG1sVmFsaWRhdG9yKCk7CisgICAgICAgICAgICAgICAgdmFyIGVycm9ycyA9IHYuVmFsaWRhdGUoc0RvYykuV2hlcmUodmUgPT4gIXNfRXhwZWN0ZWRFcnJvcnMuQ29udGFpbnModmUuRGVzY3JpcHRpb24pKTsKKworI2lmIGZhbHNlCisgICAgICAgICAgICAgICAgLy8gaWYgYSB0ZXN0IGZhaWxzIHZhbGlkYXRpb24gcG9zdC1wcm9jZXNzaW5nLCB0aGVuIGNhbiB1c2UgdGhpcyBjb2RlIHRvIGRldGVybWluZSB0aGUgU0RLCisgICAgICAgICAgICAgICAgLy8gdmFsaWRhdGlvbiBlcnJvcihzKS4KKworICAgICAgICAgICAgICAgIGlmIChlcnJvcnMuQ291bnQoKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0uRGVzY3JpcHRpb24pLkFwcGVuZChFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHMpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgQXNzZXJ0LkVtcHR5KGVycm9ycyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBMaXN0PHN0cmluZz4gc19FeHBlY3RlZEVycm9ycyA9IG5ldyBMaXN0PHN0cmluZz4oKQorICAgICAgICB7CisgICAgICAgICAgICAiVGhlIGF0dHJpYnV0ZSAndCcgaGFzIGludmFsaWQgdmFsdWUgJ2QnLiBUaGUgRW51bWVyYXRpb24gY29uc3RyYWludCBmYWlsZWQuIiwKKyAgICAgICAgfTsKKyAgICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvU3Ryb25nbHlUeXBlZEJsb2NrVGVzdHMuY3MgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9TdHJvbmdseVR5cGVkQmxvY2tUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWEzOWRlCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvU3Ryb25nbHlUeXBlZEJsb2NrVGVzdHMuY3MKQEAgLTAsMCArMSw3NyBAQAorLy8KKy8vIENvcHlyaWdodCAyMDE3IFRob21hcyBCYXJuZWtvdworLy8KKy8vIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuIFRoZSB0ZXh0IG9mIHRoZQorLy8gbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKy8vCisvLyBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisvLworLy8gRGV2ZWxvcGVyOiBUaG9tYXMgQmFybmVrb3cKKy8vIEVtYWlsOiB0aG9tYXNAYmFybmVrb3cuaW5mbworLy8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5Xb3JkcHJvY2Vzc2luZzsKK3VzaW5nIFh1bml0OworCisjaWYgIUVMSURFX1hVTklUX1RFU1RTCisKK25hbWVzcGFjZSBPcGVuWG1sUG93ZXJUb29scy5UZXN0cworeworICAgIHB1YmxpYyBjbGFzcyBTdHJvbmdseVR5cGVkQmxvY2tUZXN0cyA6IFRlc3RzQmFzZQorICAgIHsKKyAgICAgICAgW0ZhY3RdCisgICAgICAgIHB1YmxpYyB2b2lkIENhblVzZVN0cm9uZ2x5VHlwZWRCbG9ja1RvRGVtYXJjYXRlQXBpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyZWF0ZUVtcHR5V29yZHByb2Nlc3NpbmdEb2N1bWVudChzdHJlYW0pOworCisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvY3VtZW50ID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKHN0cmVhbSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNYWluRG9jdW1lbnRQYXJ0IHBhcnQgPSB3b3JkRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydDsKKworICAgICAgICAgICAgICAgICAgICAvLyBBZGQgYSBwYXJhZ3JhcGggdGhyb3VnaCB0aGUgUG93ZXJUb29scy4KKyAgICAgICAgICAgICAgICAgICAgWERvY3VtZW50IGNvbnRlbnQgPSBwYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBib2R5RWxlbWVudCA9IGNvbnRlbnQuRGVzY2VuZGFudHMoVy5ib2R5KS5GaXJzdCgpOworICAgICAgICAgICAgICAgICAgICBib2R5RWxlbWVudC5BZGQobmV3IFhFbGVtZW50KFcucCwgbmV3IFhFbGVtZW50KFcuciwgbmV3IFhFbGVtZW50KFcudCwgIkFkZGVkIHRocm91Z2ggUG93ZXJUb29scyIpKSkpOworICAgICAgICAgICAgICAgICAgICBwYXJ0LlB1dFhEb2N1bWVudCgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIFN0cm9uZ2x5VHlwZWRCbG9jayBpbiBhIHVzaW5nIHN0YXRlbWVudCB0bworICAgICAgICAgICAgICAgICAgICAvLyBkZW1hcmNhdGUgdGhlIGludGVybWl0dGVudCB1c2Ugb2YgdGhlIHN0cm9uZ2x5IHR5cGVkIGNsYXNzZXMuCisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChuZXcgU3Ryb25nbHlUeXBlZEJsb2NrKHdvcmREb2N1bWVudCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2VydCB0aGF0IHdlIGNhbiBzZWUgdGhlIHBhcmFncmFwaCBhZGRlZCB0aHJvdWdoIHRoZSBQb3dlclRvb2xzLgorICAgICAgICAgICAgICAgICAgICAgICAgQm9keSBib2R5ID0gcGFydC5Eb2N1bWVudC5Cb2R5OworICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxQYXJhZ3JhcGg+IHBhcmFncmFwaHMgPSBib2R5LkVsZW1lbnRzPFBhcmFncmFwaD4oKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5TaW5nbGUocGFyYWdyYXBocyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoIkFkZGVkIHRocm91Z2ggUG93ZXJUb29scyIsIHBhcmFncmFwaHNbMF0uSW5uZXJUZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGEgcGFyYWdyYXBoIHRocm91Z2ggdGhlIFNESy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkuQXBwZW5kQ2hpbGQobmV3IFBhcmFncmFwaChuZXcgUnVuKG5ldyBUZXh0KCJBZGRlZCB0aHJvdWdoIFNESyIpKSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQXNzZXJ0IHRoYXQgd2UgY2FuIHNlZSB0aGUgcGFyYWdyYXBocyBhZGRlZCB0aHJvdWdoIHRoZSBQb3dlclRvb2xzIGFuZCB0aGUgU0RLLgorICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxYRWxlbWVudD4gcGFyYWdyYXBoRWxlbWVudHMgPSBjb250ZW50LkRlc2NlbmRhbnRzKFcucCkuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgyLCBwYXJhZ3JhcGhFbGVtZW50cy5Db3VudCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgiQWRkZWQgdGhyb3VnaCBQb3dlclRvb2xzIiwgcGFyYWdyYXBoRWxlbWVudHNbMF0uVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoIkFkZGVkIHRocm91Z2ggU0RLIiwgcGFyYWdyYXBoRWxlbWVudHNbMV0uVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtGYWN0XQorICAgICAgICBwdWJsaWMgdm9pZCBDb25zdHJ1Y3RvclRocm93c1doZW5QYXNzaW5nTnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnROdWxsRXhjZXB0aW9uPigoKSA9PiBuZXcgU3Ryb25nbHlUeXBlZEJsb2NrKG51bGwpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9UZXN0c0Jhc2UuY3MgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9UZXN0c0Jhc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiNDliMwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL1Rlc3RzQmFzZS5jcwpAQCAtMCwwICsxLDM2IEBACisvLworLy8gQ29weXJpZ2h0IDIwMTcgVGhvbWFzIEJhcm5la293CisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gVGhlIHRleHQgb2YgdGhlCisvLyBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorLy8KKy8vIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKy8vCisvLyBEZXZlbG9wZXI6IFRob21hcyBCYXJuZWtvdworLy8gRW1haWw6IHRob21hc0BiYXJuZWtvdy5pbmZvCisvLworCit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLldvcmRwcm9jZXNzaW5nOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEJhc2UgY2xhc3MgZm9yIHVuaXQgdGVzdHMgcHJvdmlkaW5nIHV0aWxpdHkgbWV0aG9kcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUZXN0c0Jhc2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgV29yZHByb2Nlc3NpbmdEb2N1bWVudFR5cGUgRG9jdW1lbnRUeXBlID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudFR5cGUuRG9jdW1lbnQ7CisKKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIENyZWF0ZUVtcHR5V29yZHByb2Nlc3NpbmdEb2N1bWVudChTdHJlYW0gc3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jdW1lbnQgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50LkNyZWF0ZShzdHJlYW0sIERvY3VtZW50VHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWFpbkRvY3VtZW50UGFydCBwYXJ0ID0gd29yZERvY3VtZW50LkFkZE1haW5Eb2N1bWVudFBhcnQoKTsKKyAgICAgICAgICAgICAgICBwYXJ0LkRvY3VtZW50ID0gbmV3IERvY3VtZW50KG5ldyBCb2R5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvVW5pY29kZU1hcHBlclRlc3RzLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvVW5pY29kZU1hcHBlclRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYjNiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9Vbmljb2RlTWFwcGVyVGVzdHMuY3MKQEAgLTAsMCArMSwxNDUgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxNi4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK0RldmVsb3BlcjogVGhvbWFzIEJhcm5la293CitFbWFpbDogdGhvbWFzQGJhcm5la293LmluZm8KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgWHVuaXQ7CisKKyNpZiAhRUxJREVfWFVOSVRfVEVTVFMKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzLlRlc3RzCit7CisgICAgcHVibGljIGNsYXNzIFVuaWNvZGVNYXBwZXJUZXN0cworICAgIHsKKyAgICAgICAgW0ZhY3RdCisgICAgICAgIHB1YmxpYyB2b2lkIENhblN0cmluZ2lmeVJ1bkFuZFRleHRFbGVtZW50cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyB0ZXh0VmFsdWUgPSAiSGVsbG8gV29ybGQhIjsKKyAgICAgICAgICAgIHZhciB0ZXh0RWxlbWVudCA9IG5ldyBYRWxlbWVudChXLnQsIHRleHRWYWx1ZSk7CisgICAgICAgICAgICB2YXIgcnVuRWxlbWVudCA9IG5ldyBYRWxlbWVudChXLnIsIHRleHRFbGVtZW50KTsKKyAgICAgICAgICAgIHZhciBmb3JtYXR0ZWRSdW5FbGVtZW50ID0gbmV3IFhFbGVtZW50KFcuciwgbmV3IFhFbGVtZW50KFcuclByLCBuZXcgWEVsZW1lbnQoVy5iKSksIHRleHRFbGVtZW50KTsKKworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKHRleHRWYWx1ZSwgVW5pY29kZU1hcHBlci5SdW5Ub1N0cmluZyh0ZXh0RWxlbWVudCkpOworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKHRleHRWYWx1ZSwgVW5pY29kZU1hcHBlci5SdW5Ub1N0cmluZyhydW5FbGVtZW50KSk7CisgICAgICAgICAgICBBc3NlcnQuRXF1YWwodGV4dFZhbHVlLCBVbmljb2RlTWFwcGVyLlJ1blRvU3RyaW5nKGZvcm1hdHRlZFJ1bkVsZW1lbnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtGYWN0XQorICAgICAgICBwdWJsaWMgdm9pZCBDYW5TdHJpbmdpZnlTcGVjaWFsRWxlbWVudHMoKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoVW5pY29kZU1hcHBlci5DYXJyaWFnZVJldHVybiwKKyAgICAgICAgICAgICAgICBVbmljb2RlTWFwcGVyLlJ1blRvU3RyaW5nKG5ldyBYRWxlbWVudChXLmNyKSkuRmlyc3QoKSk7CisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoVW5pY29kZU1hcHBlci5DYXJyaWFnZVJldHVybiwKKyAgICAgICAgICAgICAgICBVbmljb2RlTWFwcGVyLlJ1blRvU3RyaW5nKG5ldyBYRWxlbWVudChXLmJyKSkuRmlyc3QoKSk7CisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoVW5pY29kZU1hcHBlci5Gb3JtRmVlZCwKKyAgICAgICAgICAgICAgICBVbmljb2RlTWFwcGVyLlJ1blRvU3RyaW5nKG5ldyBYRWxlbWVudChXLmJyLCBuZXcgWEF0dHJpYnV0ZShXLnR5cGUsICJwYWdlIikpKS5GaXJzdCgpKTsKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbChVbmljb2RlTWFwcGVyLk5vbkJyZWFraW5nSHlwaGVuLAorICAgICAgICAgICAgICAgIFVuaWNvZGVNYXBwZXIuUnVuVG9TdHJpbmcobmV3IFhFbGVtZW50KFcubm9CcmVha0h5cGhlbikpLkZpcnN0KCkpOworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKFVuaWNvZGVNYXBwZXIuU29mdEh5cGhlbiwKKyAgICAgICAgICAgICAgICBVbmljb2RlTWFwcGVyLlJ1blRvU3RyaW5nKG5ldyBYRWxlbWVudChXLnNvZnRIeXBoZW4pKS5GaXJzdCgpKTsKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbChVbmljb2RlTWFwcGVyLkhvcml6b250YWxUYWJ1bGF0aW9uLAorICAgICAgICAgICAgICAgIFVuaWNvZGVNYXBwZXIuUnVuVG9TdHJpbmcobmV3IFhFbGVtZW50KFcudGFiKSkuRmlyc3QoKSk7CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2FuQ3JlYXRlUnVuQ2hpbGRFbGVtZW50c0Zyb21TcGVjaWFsQ2hhcmFjdGVycygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbChXLmJyLCBVbmljb2RlTWFwcGVyLkNoYXJUb1J1bkNoaWxkKFVuaWNvZGVNYXBwZXIuQ2FycmlhZ2VSZXR1cm4pLk5hbWUpOworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKFcubm9CcmVha0h5cGhlbiwgVW5pY29kZU1hcHBlci5DaGFyVG9SdW5DaGlsZChVbmljb2RlTWFwcGVyLk5vbkJyZWFraW5nSHlwaGVuKS5OYW1lKTsKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbChXLnNvZnRIeXBoZW4sIFVuaWNvZGVNYXBwZXIuQ2hhclRvUnVuQ2hpbGQoVW5pY29kZU1hcHBlci5Tb2Z0SHlwaGVuKS5OYW1lKTsKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbChXLnRhYiwgVW5pY29kZU1hcHBlci5DaGFyVG9SdW5DaGlsZChVbmljb2RlTWFwcGVyLkhvcml6b250YWxUYWJ1bGF0aW9uKS5OYW1lKTsKKworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IFVuaWNvZGVNYXBwZXIuQ2hhclRvUnVuQ2hpbGQoVW5pY29kZU1hcHBlci5Gb3JtRmVlZCk7CisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoVy5iciwgZWxlbWVudC5OYW1lKTsKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbCgicGFnZSIsIGVsZW1lbnQuQXR0cmlidXRlKFcudHlwZSkuVmFsdWUpOworCisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoVy5iciwgVW5pY29kZU1hcHBlci5DaGFyVG9SdW5DaGlsZCgnXHInKS5OYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIFtGYWN0XQorICAgICAgICBwdWJsaWMgdm9pZCBDYW5DcmVhdGVDb2FsZXNjZWRSdW5zKCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHRleHRTdHJpbmcgPSAiVGhpcyBpcyBvbmx5IHRleHQuIjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBtaXhlZFN0cmluZyA9ICJGaXJzdFx0U2Vjb25kXHRUaGlyZCI7CisKKyAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IHRleHRSdW5zID0gVW5pY29kZU1hcHBlci5TdHJpbmdUb0NvYWxlc2NlZFJ1bkxpc3QodGV4dFN0cmluZywgbnVsbCk7CisgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBtaXhlZFJ1bnMgPSBVbmljb2RlTWFwcGVyLlN0cmluZ1RvQ29hbGVzY2VkUnVuTGlzdChtaXhlZFN0cmluZywgbnVsbCk7CisKKyAgICAgICAgICAgIEFzc2VydC5TaW5nbGUodGV4dFJ1bnMpOworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDUsIG1peGVkUnVucy5Db3VudCk7CisKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbCgiRmlyc3QiLCBtaXhlZFJ1bnMuRWxlbWVudHMoVy50KS5Ta2lwKDApLkZpcnN0KCkuVmFsdWUpOworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJTZWNvbmQiLCBtaXhlZFJ1bnMuRWxlbWVudHMoVy50KS5Ta2lwKDEpLkZpcnN0KCkuVmFsdWUpOworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJUaGlyZCIsIG1peGVkUnVucy5FbGVtZW50cyhXLnQpLlNraXAoMikuRmlyc3QoKS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2FuTWFwU3ltYm9scygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzeW0xID0gbmV3IFhFbGVtZW50KFcuc3ltLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuZm9udCwgIldpbmdkaW5ncyIpLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuX2NoYXIsICJGMDI4IikpOworICAgICAgICAgICAgY2hhciBjaGFyRnJvbVN5bTEgPSBVbmljb2RlTWFwcGVyLlN5bVRvQ2hhcihzeW0xKTsKKyAgICAgICAgICAgIFhFbGVtZW50IHN5bUZyb21DaGFyMSA9IFVuaWNvZGVNYXBwZXIuQ2hhclRvUnVuQ2hpbGQoY2hhckZyb21TeW0xKTsKKworICAgICAgICAgICAgdmFyIHN5bTIgPSBuZXcgWEVsZW1lbnQoVy5zeW0sCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5fY2hhciwgIkYwMjgiKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmZvbnQsICJXaW5nZGluZ3MiKSk7CisgICAgICAgICAgICBjaGFyIGNoYXJGcm9tU3ltMiA9IFVuaWNvZGVNYXBwZXIuU3ltVG9DaGFyKHN5bTIpOworCisgICAgICAgICAgICB2YXIgc3ltMyA9IG5ldyBYRWxlbWVudChXLnN5bSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInciLCBXLncpLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuZm9udCwgIldpbmdkaW5ncyIpLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuX2NoYXIsICJGMDI4IikpOworICAgICAgICAgICAgY2hhciBjaGFyRnJvbVN5bTMgPSBVbmljb2RlTWFwcGVyLlN5bVRvQ2hhcihzeW0zKTsKKworICAgICAgICAgICAgdmFyIHN5bTQgPSBuZXcgWEVsZW1lbnQoVy5zeW0sCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3IiwgVy53KSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmZvbnQsICJXZWJkaW5ncyIpLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuX2NoYXIsICJGMDI4IikpOworICAgICAgICAgICAgY2hhciBjaGFyRnJvbVN5bTQgPSBVbmljb2RlTWFwcGVyLlN5bVRvQ2hhcihzeW00KTsKKyAgICAgICAgICAgIFhFbGVtZW50IHN5bUZyb21DaGFyNCA9IFVuaWNvZGVNYXBwZXIuQ2hhclRvUnVuQ2hpbGQoY2hhckZyb21TeW00KTsKKworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKGNoYXJGcm9tU3ltMSwgY2hhckZyb21TeW0yKTsKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbChjaGFyRnJvbVN5bTEsIGNoYXJGcm9tU3ltMyk7CisgICAgICAgICAgICBBc3NlcnQuTm90RXF1YWwoY2hhckZyb21TeW0xLCBjaGFyRnJvbVN5bTQpOworCisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoIkYwMjgiLCBzeW1Gcm9tQ2hhcjEuQXR0cmlidXRlKFcuX2NoYXIpLlZhbHVlKTsKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbCgiV2luZ2RpbmdzIiwgc3ltRnJvbUNoYXIxLkF0dHJpYnV0ZShXLmZvbnQpLlZhbHVlKTsKKworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJGMDI4Iiwgc3ltRnJvbUNoYXI0LkF0dHJpYnV0ZShXLl9jaGFyKS5WYWx1ZSk7CisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoIldlYmRpbmdzIiwgc3ltRnJvbUNoYXI0LkF0dHJpYnV0ZShXLmZvbnQpLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtGYWN0XQorICAgICAgICBwdWJsaWMgdm9pZCBDYW5TdHJpbmdpZnlTeW1ib2xzKCkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBjaGFyRnJvbVN5bTEgPSBVbmljb2RlTWFwcGVyLlN5bVRvQ2hhcigiV2luZ2RpbmdzIiwgJ1x1RjAyOCcpOworICAgICAgICAgICAgY2hhciBjaGFyRnJvbVN5bTIgPSBVbmljb2RlTWFwcGVyLlN5bVRvQ2hhcigiV2luZ2RpbmdzIiwgMHhGMDI4KTsKKyAgICAgICAgICAgIGNoYXIgY2hhckZyb21TeW0zID0gVW5pY29kZU1hcHBlci5TeW1Ub0NoYXIoIldpbmdkaW5ncyIsICJGMDI4Iik7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHN5bUZyb21DaGFyMSA9IFVuaWNvZGVNYXBwZXIuQ2hhclRvUnVuQ2hpbGQoY2hhckZyb21TeW0xKTsKKyAgICAgICAgICAgIFhFbGVtZW50IHN5bUZyb21DaGFyMiA9IFVuaWNvZGVNYXBwZXIuQ2hhclRvUnVuQ2hpbGQoY2hhckZyb21TeW0yKTsKKyAgICAgICAgICAgIFhFbGVtZW50IHN5bUZyb21DaGFyMyA9IFVuaWNvZGVNYXBwZXIuQ2hhclRvUnVuQ2hpbGQoY2hhckZyb21TeW0zKTsKKworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKGNoYXJGcm9tU3ltMSwgY2hhckZyb21TeW0yKTsKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbChjaGFyRnJvbVN5bTEsIGNoYXJGcm9tU3ltMyk7CisKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbChzeW1Gcm9tQ2hhcjEuVG9TdHJpbmcoU2F2ZU9wdGlvbnMuTm9uZSksIHN5bUZyb21DaGFyMi5Ub1N0cmluZyhTYXZlT3B0aW9ucy5Ob25lKSk7CisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoc3ltRnJvbUNoYXIxLlRvU3RyaW5nKFNhdmVPcHRpb25zLk5vbmUpLCBzeW1Gcm9tQ2hhcjMuVG9TdHJpbmcoU2F2ZU9wdGlvbnMuTm9uZSkpOworICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL1dtbENvbXBhcmVyVGVzdHMuY3MgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9XbWxDb21wYXJlclRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyY2E4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9XbWxDb21wYXJlclRlc3RzLmNzCkBAIC0wLDAgKzEsMTEyNCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIEVyaWMgV2hpdGUgMjAxNi4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vRXJpY1doaXRlLmNvbQorUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vZXJpY3doaXRlLmNvbS9ibG9nL2Jsb2cvb3Blbi14bWwtcG93ZXJ0b29scy1kZXZlbG9wZXItY2VudGVyLworCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uRHJhd2luZy5JbWFnaW5nOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuVmFsaWRhdGlvbjsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOwordXNpbmcgWHVuaXQ7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gTGFyZ2UgdGVzdHMgaGF2ZSBiZWVuIGNvbW1lbnRlZCBvdXQgYmVsb3cuICBJZiBhbmQgd2hlbiB0aGVyZSBpcyBhbiBlZmZvcnQgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBmb3IgV21sQ29tcGFyZXIsCisvLyB0aGVuIHVuY29tbWVudC4gIFBlcmZvcm1hbmNlIGlzbid0IGJhZCwgYnV0IGNlcnRhaW5seSBpcyBwb3NzaWJsZSB0byBpbXByb3ZlLgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhRUxJREVfWFVOSVRfVEVTVFMKKworbmFtZXNwYWNlIE94UHQKK3sKKyAgICBwdWJsaWMgY2xhc3MgV2NUZXN0cworICAgIHsKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIHNfT3BlbldvcmQgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIG1fT3BlblRlbXBEaXJJbkV4cGxvcmVyID0gZmFsc2U7CisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgW0lubGluZURhdGEoIlJDLTAwMTAiLCAiUkMvUkMwMDEtQmVmb3JlLmRvY3giLAorICAgICAgICAgICAgQCI8Um9vdD4KKyAgICAgICAgICAgICAgPFJjSW5mbz4KKyAgICAgICAgICAgICAgICA8RG9jTmFtZT5SQy9SQzAwMS1BZnRlcjEuZG9jeDwvRG9jTmFtZT4KKyAgICAgICAgICAgICAgICA8Q29sb3I+TGlnaHRZZWxsb3c8L0NvbG9yPgorICAgICAgICAgICAgICAgIDxSZXZpc29yPkZyb20gQm9iPC9SZXZpc29yPgorICAgICAgICAgICAgICA8L1JjSW5mbz4KKyAgICAgICAgICAgICAgPFJjSW5mbz4KKyAgICAgICAgICAgICAgICA8RG9jTmFtZT5SQy9SQzAwMS1BZnRlcjIuZG9jeDwvRG9jTmFtZT4KKyAgICAgICAgICAgICAgICA8Q29sb3I+TGlnaHRQaW5rPC9Db2xvcj4KKyAgICAgICAgICAgICAgICA8UmV2aXNvcj5Gcm9tIEZyZWQ8L1Jldmlzb3I+CisgICAgICAgICAgICAgIDwvUmNJbmZvPgorICAgICAgICAgICAgPC9Sb290PiIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUkMtMDAyMCIsICJSQy9SQzAwMi1JbWFnZS5kb2N4IiwKKyAgICAgICAgICAgIEAiPFJvb3Q+CisgICAgICAgICAgICAgIDxSY0luZm8+CisgICAgICAgICAgICAgICAgPERvY05hbWU+UkMvUkMwMDItSW1hZ2UtQWZ0ZXIxLmRvY3g8L0RvY05hbWU+CisgICAgICAgICAgICAgICAgPENvbG9yPkxpZ2h0Qmx1ZTwvQ29sb3I+CisgICAgICAgICAgICAgICAgPFJldmlzb3I+RnJvbSBCb2I8L1Jldmlzb3I+CisgICAgICAgICAgICAgIDwvUmNJbmZvPgorICAgICAgICAgICAgPC9Sb290PiIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUkMtMDAzMCIsICJSQy9SQzAwMi1JbWFnZS1BZnRlcjEuZG9jeCIsCisgICAgICAgICAgICBAIjxSb290PgorICAgICAgICAgICAgICA8UmNJbmZvPgorICAgICAgICAgICAgICAgIDxEb2NOYW1lPlJDL1JDMDAyLUltYWdlLmRvY3g8L0RvY05hbWU+CisgICAgICAgICAgICAgICAgPENvbG9yPkxpZ2h0Qmx1ZTwvQ29sb3I+CisgICAgICAgICAgICAgICAgPFJldmlzb3I+RnJvbSBCb2I8L1Jldmlzb3I+CisgICAgICAgICAgICAgIDwvUmNJbmZvPgorICAgICAgICAgICAgPC9Sb290PiIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUkMtMDA0MCIsICJXQy9XQzAyNy1Ud2VudHktUGFyYXMtQmVmb3JlLmRvY3giLAorICAgICAgICAgICAgQCI8Um9vdD4KKyAgICAgICAgICAgICAgPFJjSW5mbz4KKyAgICAgICAgICAgICAgICA8RG9jTmFtZT5XQy9XQzAyNy1Ud2VudHktUGFyYXMtQWZ0ZXItMS5kb2N4PC9Eb2NOYW1lPgorICAgICAgICAgICAgICAgIDxDb2xvcj5MaWdodEJsdWU8L0NvbG9yPgorICAgICAgICAgICAgICAgIDxSZXZpc29yPkZyb20gQm9iPC9SZXZpc29yPgorICAgICAgICAgICAgICA8L1JjSW5mbz4KKyAgICAgICAgICAgIDwvUm9vdD4iKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJDLTAwNTAiLCAiV0MvV0MwMjctVHdlbnR5LVBhcmFzLUJlZm9yZS5kb2N4IiwKKyAgICAgICAgICAgIEAiPFJvb3Q+CisgICAgICAgICAgICAgIDxSY0luZm8+CisgICAgICAgICAgICAgICAgPERvY05hbWU+V0MvV0MwMjctVHdlbnR5LVBhcmFzLUFmdGVyLTMuZG9jeDwvRG9jTmFtZT4KKyAgICAgICAgICAgICAgICA8Q29sb3I+TGlnaHRCbHVlPC9Db2xvcj4KKyAgICAgICAgICAgICAgICA8UmV2aXNvcj5Gcm9tIEJvYjwvUmV2aXNvcj4KKyAgICAgICAgICAgICAgPC9SY0luZm8+CisgICAgICAgICAgICA8L1Jvb3Q+IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSQy0wMDYwIiwgIlJDL1JDMDAzLU11bHRpLVBhcmFzLmRvY3giLAorICAgICAgICAgICAgQCI8Um9vdD4KKyAgICAgICAgICAgICAgPFJjSW5mbz4KKyAgICAgICAgICAgICAgICA8RG9jTmFtZT5SQy9SQzAwMy1NdWx0aS1QYXJhcy1BZnRlci5kb2N4PC9Eb2NOYW1lPgorICAgICAgICAgICAgICAgIDxDb2xvcj5MaWdodEJsdWU8L0NvbG9yPgorICAgICAgICAgICAgICAgIDxSZXZpc29yPkZyb20gQm9iPC9SZXZpc29yPgorICAgICAgICAgICAgICA8L1JjSW5mbz4KKyAgICAgICAgICAgIDwvUm9vdD4iKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJDLTAwNzAiLCAiUkMvUkMwMDQtQmVmb3JlLmRvY3giLAorICAgICAgICAgICAgQCI8Um9vdD4KKyAgICAgICAgICAgICAgPFJjSW5mbz4KKyAgICAgICAgICAgICAgICA8RG9jTmFtZT5SQy9SQzAwNC1BZnRlcjEuZG9jeDwvRG9jTmFtZT4KKyAgICAgICAgICAgICAgICA8Q29sb3I+TGlnaHRZZWxsb3c8L0NvbG9yPgorICAgICAgICAgICAgICAgIDxSZXZpc29yPkZyb20gQm9iPC9SZXZpc29yPgorICAgICAgICAgICAgICA8L1JjSW5mbz4KKyAgICAgICAgICAgICAgPFJjSW5mbz4KKyAgICAgICAgICAgICAgICA8RG9jTmFtZT5SQy9SQzAwNC1BZnRlcjIuZG9jeDwvRG9jTmFtZT4KKyAgICAgICAgICAgICAgICA8Q29sb3I+TGlnaHRQaW5rPC9Db2xvcj4KKyAgICAgICAgICAgICAgICA8UmV2aXNvcj5Gcm9tIEZyZWQ8L1Jldmlzb3I+CisgICAgICAgICAgICAgIDwvUmNJbmZvPgorICAgICAgICAgICAgPC9Sb290PiIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUkMtMDA4MCIsICJSQy9SQzAwNS1CZWZvcmUuZG9jeCIsCisgICAgICAgICAgICBAIjxSb290PgorICAgICAgICAgICAgICA8UmNJbmZvPgorICAgICAgICAgICAgICAgIDxEb2NOYW1lPlJDL1JDMDA1LUFmdGVyMS5kb2N4PC9Eb2NOYW1lPgorICAgICAgICAgICAgICAgIDxDb2xvcj5MaWdodFllbGxvdzwvQ29sb3I+CisgICAgICAgICAgICAgICAgPFJldmlzb3I+RnJvbSBCb2I8L1Jldmlzb3I+CisgICAgICAgICAgICAgIDwvUmNJbmZvPgorICAgICAgICAgICAgPC9Sb290PiIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUkMtMDA5MCIsICJSQy9SQzAwNi1CZWZvcmUuZG9jeCIsCisgICAgICAgICAgICBAIjxSb290PgorICAgICAgICAgICAgICA8UmNJbmZvPgorICAgICAgICAgICAgICAgIDxEb2NOYW1lPlJDL1JDMDA2LUFmdGVyMS5kb2N4PC9Eb2NOYW1lPgorICAgICAgICAgICAgICAgIDxDb2xvcj5MaWdodFllbGxvdzwvQ29sb3I+CisgICAgICAgICAgICAgICAgPFJldmlzb3I+RnJvbSBCb2I8L1Jldmlzb3I+CisgICAgICAgICAgICAgIDwvUmNJbmZvPgorICAgICAgICAgICAgPC9Sb290PiIpXQorICAgICAgICBbSW5saW5lRGF0YSgiUkMtMDEwMCIsICJSQy9SQzAwNy1FbmRub3Rlcy1CZWZvcmUuZG9jeCIsCisgICAgICAgICAgICBAIjxSb290PgorICAgICAgICAgICAgICA8UmNJbmZvPgorICAgICAgICAgICAgICAgIDxEb2NOYW1lPlJDL1JDMDA3LUVuZG5vdGVzLUFmdGVyLmRvY3g8L0RvY05hbWU+CisgICAgICAgICAgICAgICAgPENvbG9yPkxpZ2h0WWVsbG93PC9Db2xvcj4KKyAgICAgICAgICAgICAgICA8UmV2aXNvcj5Gcm9tIEJvYjwvUmV2aXNvcj4KKyAgICAgICAgICAgICAgPC9SY0luZm8+CisgICAgICAgICAgICA8L1Jvb3Q+IildCisKKyAgICAgICAgcHVibGljIHZvaWQgV0MwMDFfQ29uc29saWRhdGUoc3RyaW5nIHRlc3RJZCwgc3RyaW5nIG9yaWdpbmFsTmFtZSwgc3RyaW5nIHJldmlzZWREb2N1bWVudHNYbWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIG9yaWdpbmFsRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBvcmlnaW5hbE5hbWUpKTsKKworICAgICAgICAgICAgdmFyIHJvb3RUZW1wRGlyID0gVGVzdFV0aWwuVGVtcERpcjsKKyAgICAgICAgICAgIHZhciB0aGlzVGVzdFRlbXBEaXIgPSBuZXcgRGlyZWN0b3J5SW5mbyhQYXRoLkNvbWJpbmUocm9vdFRlbXBEaXIuRnVsbE5hbWUsIHRlc3RJZCkpOworICAgICAgICAgICAgaWYgKHRoaXNUZXN0VGVtcERpci5FeGlzdHMpCisgICAgICAgICAgICAgICAgQXNzZXJ0LlRydWUoZmFsc2UsICJEdXBsaWNhdGUgdGVzdCBpZDogIiArIHRlc3RJZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhpc1Rlc3RUZW1wRGlyLkNyZWF0ZSgpOworCisgICAgICAgICAgICB2YXIgb3JpZ2luYWxDb3BpZWRUb0Rlc3REb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0aGlzVGVzdFRlbXBEaXIuRnVsbE5hbWUsIG9yaWdpbmFsRG9jeC5OYW1lKSk7CisgICAgICAgICAgICBpZiAoIW9yaWdpbmFsQ29waWVkVG9EZXN0RG9jeC5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHdtbDEgPSBuZXcgV21sRG9jdW1lbnQob3JpZ2luYWxEb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICB2YXIgd21sMiA9IFdvcmRwcm9jZXNzaW5nTUxVdGlsLkJyZWFrTGlua1RvVGVtcGxhdGUod21sMSk7CisgICAgICAgICAgICAgICAgd21sMi5TYXZlQXMob3JpZ2luYWxDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJldmlzZWREb2N1bWVudHNYRWxlbWVudCA9IFhFbGVtZW50LlBhcnNlKHJldmlzZWREb2N1bWVudHNYbWwpOworICAgICAgICAgICAgdmFyIHJldmlzZWREb2N1bWVudHNBcnJheSA9IHJldmlzZWREb2N1bWVudHNYRWxlbWVudAorICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgLlNlbGVjdCh6ID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGaWxlSW5mbyByZXZpc2VkRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCB6LkVsZW1lbnQoIkRvY05hbWUiKS5WYWx1ZSkpOworICAgICAgICAgICAgICAgICAgICB2YXIgcmV2aXNlZENvcGllZFRvRGVzdERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHRoaXNUZXN0VGVtcERpci5GdWxsTmFtZSwgcmV2aXNlZERvY3guTmFtZSkpOworICAgICAgICAgICAgICAgICAgICB2YXIgd21sMSA9IG5ldyBXbWxEb2N1bWVudChyZXZpc2VkRG9jeC5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHZhciB3bWwyID0gV29yZHByb2Nlc3NpbmdNTFV0aWwuQnJlYWtMaW5rVG9UZW1wbGF0ZSh3bWwxKTsKKyAgICAgICAgICAgICAgICAgICAgd21sMi5TYXZlQXMocmV2aXNlZENvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdtbFJldmlzZWREb2N1bWVudEluZm8oKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXZpc2VkRG9jdW1lbnQgPSBuZXcgV21sRG9jdW1lbnQocmV2aXNlZENvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IgPSBDb2xvci5Gcm9tTmFtZSh6LkVsZW1lbnQoIkNvbG9yIikuVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgUmV2aXNvciA9IHouRWxlbWVudCgiUmV2aXNvciIpLlZhbHVlLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICB2YXIgY29uc29saWRhdGVkRG9jeE5hbWUgPSBvcmlnaW5hbENvcGllZFRvRGVzdERvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICItQ29uc29saWRhdGVkLmRvY3giKTsKKyAgICAgICAgICAgIHZhciBjb25zb2xpZGF0ZWREb2N1bWVudEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0aGlzVGVzdFRlbXBEaXIuRnVsbE5hbWUsIGNvbnNvbGlkYXRlZERvY3hOYW1lKSk7CisKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHNvdXJjZTFXbWwgPSBuZXcgV21sRG9jdW1lbnQob3JpZ2luYWxDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgV21sQ29tcGFyZXJTZXR0aW5ncygpOworICAgICAgICAgICAgc2V0dGluZ3MuRGVidWdUZW1wRmlsZURpID0gdGhpc1Rlc3RUZW1wRGlyOworICAgICAgICAgICAgV21sRG9jdW1lbnQgY29uc29saWRhdGVkV21sID0gV21sQ29tcGFyZXIuQ29uc29saWRhdGUoCisgICAgICAgICAgICAgICAgc291cmNlMVdtbCwKKyAgICAgICAgICAgICAgICByZXZpc2VkRG9jdW1lbnRzQXJyYXksCisgICAgICAgICAgICAgICAgc2V0dGluZ3MpOworICAgICAgICAgICAgdmFyIHdtbDMgPSBXb3JkcHJvY2Vzc2luZ01MVXRpbC5CcmVha0xpbmtUb1RlbXBsYXRlKGNvbnNvbGlkYXRlZFdtbCk7CisgICAgICAgICAgICB3bWwzLlNhdmVBcyhjb25zb2xpZGF0ZWREb2N1bWVudEZpLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgdmFyIHZhbGlkYXRpb25FcnJvcnMgPSAiIjsKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXMuV3JpdGUoY29uc29saWRhdGVkV21sLkRvY3VtZW50Qnl0ZUFycmF5LCAwLCBjb25zb2xpZGF0ZWRXbWwuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1zLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IE9wZW5YbWxWYWxpZGF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9ycyA9IHZhbGlkYXRvci5WYWxpZGF0ZSh3RG9jKS5XaGVyZShlID0+ICFFeHBlY3RlZEVycm9ycy5Db250YWlucyhlLkRlc2NyaXB0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMuQ291bnQoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZCA9ICIgICI7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVyciBpbiBlcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisjaWYgdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiRXJyb3IiICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJFcnJvclR5cGU6ICIgKyBlcnIuRXJyb3JUeXBlLlRvU3RyaW5nKCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kICsgIkRlc2NyaXB0aW9uOiAiICsgZXJyLkRlc2NyaXB0aW9uICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJQYXJ0OiAiICsgZXJyLlBhcnQuVXJpLlRvU3RyaW5nKCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kICsgIlhQYXRoOiAiICsgZXJyLlBhdGguWFBhdGggKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiAgICAgICAgICAgIFwiIiArIGVyci5EZXNjcmlwdGlvbiArICJcIiwiICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICBpZiAoc19PcGVuV29yZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyB3b3JkRXhlID0gbmV3IEZpbGVJbmZvKEAiQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgT2ZmaWNlXHJvb3RcT2ZmaWNlMTZcV0lOV09SRC5FWEUiKTsKKyAgICAgICAgICAgICAgICBXb3JkUnVubmVyLlJ1bldvcmQod29yZEV4ZSwgY29uc29saWRhdGVkRG9jdW1lbnRGaSk7CisgICAgICAgICAgICAgICAgV29yZFJ1bm5lci5SdW5Xb3JkKHdvcmRFeGUsIG9yaWdpbmFsQ29waWVkVG9EZXN0RG9jeCk7CisKKyAgICAgICAgICAgICAgICB2YXIgcmV2aXNlZExpc3QgPSByZXZpc2VkRG9jdW1lbnRzWEVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgLlNlbGVjdCh6ID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJbmZvIHJldmlzZWREb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIHouRWxlbWVudCgiRG9jTmFtZSIpLlZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV2aXNlZENvcGllZFRvRGVzdERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHRoaXNUZXN0VGVtcERpci5GdWxsTmFtZSwgcmV2aXNlZERvY3guTmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldmlzZWRDb3BpZWRUb0Rlc3REb2N4OworICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gcmV2aXNlZExpc3QpCisgICAgICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBpdGVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIC8vIE9wZW4gV2luZG93cyBFeHBsb3JlcgorICAgICAgICAgICAgaWYgKG1fT3BlblRlbXBEaXJJbkV4cGxvcmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8gQ09ERSBUTyBSRVBFQVQgVU5USUwgU1VDQ0VTUyAvLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VtYXBob3JGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgInpfRXhwbG9yZXJPcGVuZWRTZW1hcGhvcmUudHh0IikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZW1hcGhvckZpLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLldyaXRlQWxsVGV4dChzZW1hcGhvckZpLkZ1bGxOYW1lLCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuRXhwbG9yZXIodGhpc1Rlc3RUZW1wRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5UaHJlYWRpbmcuVGhyZWFkLlNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcnMgIT0gIiIpCisgICAgICAgICAgICAgICAgQXNzZXJ0LlRydWUoZmFsc2UsIHZhbGlkYXRpb25FcnJvcnMpOworICAgICAgICB9CisKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMDAwIiwgIkNBL0NBMDAxLVBsYWluLmRvY3giLCAiQ0EvQ0EwMDEtUGxhaW4tTW9kLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMDEwIiwgIldDL1dDMDAxLURpZ2l0cy5kb2N4IiwgIldDL1dDMDAxLURpZ2l0cy1Nb2QuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTEwMjAiLCAiV0MvV0MwMDEtRGlnaXRzLmRvY3giLCAiV0MvV0MwMDEtRGlnaXRzLURlbGV0ZWQtUGFyYWdyYXBoLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMDMwIiwgIldDL1dDMDAxLURpZ2l0cy1EZWxldGVkLVBhcmFncmFwaC5kb2N4IiwgIldDL1dDMDAxLURpZ2l0cy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTA0MCIsICJXQy9XQzAwMi1Vbm1vZGlmaWVkLmRvY3giLCAiV0MvV0MwMDItRGlmZkluTWlkZGxlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMDUwIiwgIldDL1dDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQy9XQzAwMi1EaWZmQXRCZWdpbm5pbmcuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTEwNjAiLCAiV0MvV0MwMDItVW5tb2RpZmllZC5kb2N4IiwgIldDL1dDMDAyLURlbGV0ZUF0QmVnaW5uaW5nLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMDcwIiwgIldDL1dDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQy9XQzAwMi1JbnNlcnRBdEJlZ2lubmluZy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTA4MCIsICJXQy9XQzAwMi1Vbm1vZGlmaWVkLmRvY3giLCAiV0MvV0MwMDItSW5zZXJ0QXRFbmQuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTEwOTAiLCAiV0MvV0MwMDItVW5tb2RpZmllZC5kb2N4IiwgIldDL1dDMDAyLURlbGV0ZUF0RW5kLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMTAwIiwgIldDL1dDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQy9XQzAwMi1EZWxldGVJbk1pZGRsZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTExMCIsICJXQy9XQzAwMi1Vbm1vZGlmaWVkLmRvY3giLCAiV0MvV0MwMDItSW5zZXJ0SW5NaWRkbGUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTExMjAiLCAiV0MvV0MwMDItRGVsZXRlSW5NaWRkbGUuZG9jeCIsICJXQy9XQzAwMi1Vbm1vZGlmaWVkLmRvY3giKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiV0NCLTExMzAiLCAiV0MvV0MwMDQtTGFyZ2UuZG9jeCIsICJXQy9XQzAwNC1MYXJnZS1Nb2QuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTExNDAiLCAiV0MvV0MwMDYtVGFibGUuZG9jeCIsICJXQy9XQzAwNi1UYWJsZS1EZWxldGUtUm93LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMTUwIiwgIldDL1dDMDA2LVRhYmxlLURlbGV0ZS1Sb3cuZG9jeCIsICJXQy9XQzAwNi1UYWJsZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTE2MCIsICJXQy9XQzAwNi1UYWJsZS5kb2N4IiwgIldDL1dDMDA2LVRhYmxlLURlbGV0ZS1Db250ZXN0cy1vZi1Sb3cuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTExNzAiLCAiV0MvV0MwMDctVW5tb2RpZmllZC5kb2N4IiwgIldDL1dDMDA3LUxvbmdlc3QtQXQtRW5kLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMTgwIiwgIldDL1dDMDA3LVVubW9kaWZpZWQuZG9jeCIsICJXQy9XQzAwNy1EZWxldGVkLWF0LUJlZ2lubmluZy1vZi1QYXJhLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMTkwIiwgIldDL1dDMDA3LVVubW9kaWZpZWQuZG9jeCIsICJXQy9XQzAwNy1Nb3ZlZC1pbnRvLVRhYmxlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMjAwIiwgIldDL1dDMDA5LVRhYmxlLVVubW9kaWZpZWQuZG9jeCIsICJXQy9XQzAwOS1UYWJsZS1DZWxsLTEtMS1Nb2QuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTEyMTAiLCAiV0MvV0MwMTAtUGFyYS1CZWZvcmUtVGFibGUtVW5tb2RpZmllZC5kb2N4IiwgIldDL1dDMDEwLVBhcmEtQmVmb3JlLVRhYmxlLU1vZC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTIyMCIsICJXQy9XQzAxMS1CZWZvcmUuZG9jeCIsICJXQy9XQzAxMS1BZnRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTIzMCIsICJXQy9XQzAxMi1NYXRoLUJlZm9yZS5kb2N4IiwgIldDL1dDMDEyLU1hdGgtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTEyNDAiLCAiV0MvV0MwMTMtSW1hZ2UtQmVmb3JlLmRvY3giLCAiV0MvV0MwMTMtSW1hZ2UtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTEyNTAiLCAiV0MvV0MwMTMtSW1hZ2UtQmVmb3JlLmRvY3giLCAiV0MvV0MwMTMtSW1hZ2UtQWZ0ZXIyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMjYwIiwgIldDL1dDMDEzLUltYWdlLUJlZm9yZTIuZG9jeCIsICJXQy9XQzAxMy1JbWFnZS1BZnRlcjIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTEyNzAiLCAiV0MvV0MwMTQtU21hcnRBcnQtQmVmb3JlLmRvY3giLCAiV0MvV0MwMTQtU21hcnRBcnQtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTEyODAiLCAiV0MvV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1CZWZvcmUuZG9jeCIsICJXQy9XQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMjkwIiwgIldDL1dDMDE0LVNtYXJ0QXJ0LVdpdGgtSW1hZ2UtQmVmb3JlLmRvY3giLCAiV0MvV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1EZWxldGVkLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMzAwIiwgIldDL1dDMDE0LVNtYXJ0QXJ0LVdpdGgtSW1hZ2UtQmVmb3JlLmRvY3giLCAiV0MvV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1EZWxldGVkLUFmdGVyMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTMxMCIsICJXQy9XQzAxNS1UaHJlZS1QYXJhZ3JhcGhzLmRvY3giLCAiV0MvV0MwMTUtVGhyZWUtUGFyYWdyYXBocy1BZnRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTMyMCIsICJXQy9XQzAxNi1QYXJhLUltYWdlLVBhcmEuZG9jeCIsICJXQy9XQzAxNi1QYXJhLUltYWdlLVBhcmEtdy1EZWxldGVkLUltYWdlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMzMwIiwgIldDL1dDMDE3LUltYWdlLmRvY3giLCAiV0MvV0MwMTctSW1hZ2UtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTEzNDAiLCAiV0MvV0MwMTgtRmllbGQtU2ltcGxlLUJlZm9yZS5kb2N4IiwgIldDL1dDMDE4LUZpZWxkLVNpbXBsZS1BZnRlci0xLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMzUwIiwgIldDL1dDMDE4LUZpZWxkLVNpbXBsZS1CZWZvcmUuZG9jeCIsICJXQy9XQzAxOC1GaWVsZC1TaW1wbGUtQWZ0ZXItMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTM2MCIsICJXQy9XQzAxOS1IeXBlcmxpbmstQmVmb3JlLmRvY3giLCAiV0MvV0MwMTktSHlwZXJsaW5rLUFmdGVyLTEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTEzNzAiLCAiV0MvV0MwMTktSHlwZXJsaW5rLUJlZm9yZS5kb2N4IiwgIldDL1dDMDE5LUh5cGVybGluay1BZnRlci0yLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xMzgwIiwgIldDL1dDMDIwLUZvb3ROb3RlLUJlZm9yZS5kb2N4IiwgIldDL1dDMDIwLUZvb3ROb3RlLUFmdGVyLTEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTEzOTAiLCAiV0MvV0MwMjAtRm9vdE5vdGUtQmVmb3JlLmRvY3giLCAiV0MvV0MwMjAtRm9vdE5vdGUtQWZ0ZXItMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTQwMCIsICJXQy9XQzAyMS1NYXRoLUJlZm9yZS0xLmRvY3giLCAiV0MvV0MwMjEtTWF0aC1BZnRlci0xLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xNDEwIiwgIldDL1dDMDIxLU1hdGgtQmVmb3JlLTIuZG9jeCIsICJXQy9XQzAyMS1NYXRoLUFmdGVyLTIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTE0MjAiLCAiV0MvV0MwMjItSW1hZ2UtTWF0aC1QYXJhLUJlZm9yZS5kb2N4IiwgIldDL1dDMDIyLUltYWdlLU1hdGgtUGFyYS1BZnRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTQzMCIsICJXQy9XQzAyMy1UYWJsZS00LVJvdy1JbWFnZS1CZWZvcmUuZG9jeCIsICJXQy9XQzAyMy1UYWJsZS00LVJvdy1JbWFnZS1BZnRlci1EZWxldGUtMS1Sb3cuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTE0NDAiLCAiV0MvV0MwMjQtVGFibGUtQmVmb3JlLmRvY3giLCAiV0MvV0MwMjQtVGFibGUtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTE0NTAiLCAiV0MvV0MwMjQtVGFibGUtQmVmb3JlLmRvY3giLCAiV0MvV0MwMjQtVGFibGUtQWZ0ZXIyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xNDYwIiwgIldDL1dDMDI1LVNpbXBsZS1UYWJsZS1CZWZvcmUuZG9jeCIsICJXQy9XQzAyNS1TaW1wbGUtVGFibGUtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTE0NzAiLCAiV0MvV0MwMjYtTG9uZy1UYWJsZS1CZWZvcmUuZG9jeCIsICJXQy9XQzAyNi1Mb25nLVRhYmxlLUFmdGVyLTEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTE0ODAiLCAiV0MvV0MwMjctVHdlbnR5LVBhcmFzLUJlZm9yZS5kb2N4IiwgIldDL1dDMDI3LVR3ZW50eS1QYXJhcy1BZnRlci0xLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xNDkwIiwgIldDL1dDMDI3LVR3ZW50eS1QYXJhcy1BZnRlci0xLmRvY3giLCAiV0MvV0MwMjctVHdlbnR5LVBhcmFzLUJlZm9yZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTUwMCIsICJXQy9XQzAyNy1Ud2VudHktUGFyYXMtQmVmb3JlLmRvY3giLCAiV0MvV0MwMjctVHdlbnR5LVBhcmFzLUFmdGVyLTIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTE1MTAiLCAiV0MvV0MwMzAtSW1hZ2UtTWF0aC1CZWZvcmUuZG9jeCIsICJXQy9XQzAzMC1JbWFnZS1NYXRoLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xNTIwIiwgIldDL1dDMDMxLVR3by1NYXRocy1CZWZvcmUuZG9jeCIsICJXQy9XQzAzMS1Ud28tTWF0aHMtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTE1MzAiLCAiV0MvV0MwMzItUGFyYS13aXRoLVBhcmEtUHJvcHMuZG9jeCIsICJXQy9XQzAzMi1QYXJhLXdpdGgtUGFyYS1Qcm9wcy1BZnRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTU0MCIsICJXQy9XQzAzMy1NZXJnZWQtQ2VsbHMtQmVmb3JlLmRvY3giLCAiV0MvV0MwMzMtTWVyZ2VkLUNlbGxzLUFmdGVyMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTU1MCIsICJXQy9XQzAzMy1NZXJnZWQtQ2VsbHMtQmVmb3JlLmRvY3giLCAiV0MvV0MwMzMtTWVyZ2VkLUNlbGxzLUFmdGVyMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTU2MCIsICJXQy9XQzAzNC1Gb290bm90ZXMtQmVmb3JlLmRvY3giLCAiV0MvV0MwMzQtRm9vdG5vdGVzLUFmdGVyMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTU3MCIsICJXQy9XQzAzNC1Gb290bm90ZXMtQmVmb3JlLmRvY3giLCAiV0MvV0MwMzQtRm9vdG5vdGVzLUFmdGVyMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTU4MCIsICJXQy9XQzAzNC1Gb290bm90ZXMtQmVmb3JlLmRvY3giLCAiV0MvV0MwMzQtRm9vdG5vdGVzLUFmdGVyMy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTU5MCIsICJXQy9XQzAzNC1Gb290bm90ZXMtQWZ0ZXIzLmRvY3giLCAiV0MvV0MwMzQtRm9vdG5vdGVzLUJlZm9yZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTYwMCIsICJXQy9XQzAzNS1Gb290bm90ZS1CZWZvcmUuZG9jeCIsICJXQy9XQzAzNS1Gb290bm90ZS1BZnRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTYxMCIsICJXQy9XQzAzNS1Gb290bm90ZS1BZnRlci5kb2N4IiwgIldDL1dDMDM1LUZvb3Rub3RlLUJlZm9yZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTYyMCIsICJXQy9XQzAzNi1Gb290bm90ZS1XaXRoLVRhYmxlLUJlZm9yZS5kb2N4IiwgIldDL1dDMDM2LUZvb3Rub3RlLVdpdGgtVGFibGUtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTE2MzAiLCAiV0MvV0MwMzYtRm9vdG5vdGUtV2l0aC1UYWJsZS1BZnRlci5kb2N4IiwgIldDL1dDMDM2LUZvb3Rub3RlLVdpdGgtVGFibGUtQmVmb3JlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xNjQwIiwgIldDL1dDMDM0LUVuZG5vdGVzLUJlZm9yZS5kb2N4IiwgIldDL1dDMDM0LUVuZG5vdGVzLUFmdGVyMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTY1MCIsICJXQy9XQzAzNC1FbmRub3Rlcy1CZWZvcmUuZG9jeCIsICJXQy9XQzAzNC1FbmRub3Rlcy1BZnRlcjIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTE2NjAiLCAiV0MvV0MwMzQtRW5kbm90ZXMtQmVmb3JlLmRvY3giLCAiV0MvV0MwMzQtRW5kbm90ZXMtQWZ0ZXIzLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xNjcwIiwgIldDL1dDMDM0LUVuZG5vdGVzLUFmdGVyMy5kb2N4IiwgIldDL1dDMDM0LUVuZG5vdGVzLUJlZm9yZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTY4MCIsICJXQy9XQzAzNS1FbmRub3RlLUJlZm9yZS5kb2N4IiwgIldDL1dDMDM1LUVuZG5vdGUtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTE2OTAiLCAiV0MvV0MwMzUtRW5kbm90ZS1BZnRlci5kb2N4IiwgIldDL1dDMDM1LUVuZG5vdGUtQmVmb3JlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xNzAwIiwgIldDL1dDMDM2LUVuZG5vdGUtV2l0aC1UYWJsZS1CZWZvcmUuZG9jeCIsICJXQy9XQzAzNi1FbmRub3RlLVdpdGgtVGFibGUtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTE3MTAiLCAiV0MvV0MwMzYtRW5kbm90ZS1XaXRoLVRhYmxlLUFmdGVyLmRvY3giLCAiV0MvV0MwMzYtRW5kbm90ZS1XaXRoLVRhYmxlLUJlZm9yZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ0ItMTcyMCIsICJXQy9XQzAzOC1Eb2N1bWVudC1XaXRoLUJSLUJlZm9yZS5kb2N4IiwgIldDL1dDMDM4LURvY3VtZW50LVdpdGgtQlItQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NCLTE3MzAiLCAiUkMvUkMwMDEtQmVmb3JlLmRvY3giLCAiUkMvUkMwMDEtQWZ0ZXIxLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDQi0xNzQwIiwgIlJDL1JDMDAyLUltYWdlLmRvY3giLCAiUkMvUkMwMDItSW1hZ2UtQWZ0ZXIxLmRvY3giKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiV0NCLTEwMDAiLCAiIiwgIiIpXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCJXQ0ItMTAwMCIsICIiLCAiIildCisgICAgICAgIC8vW0lubGluZURhdGEoIldDQi0xMDAwIiwgIiIsICIiKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiV0NCLTEwMDAiLCAiIiwgIiIpXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCJXQ0ItMTAwMCIsICIiLCAiIildCisgICAgICAgIC8vW0lubGluZURhdGEoIldDQi0xMDAwIiwgIiIsICIiKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiV0NCLTEwMDAiLCAiIiwgIiIpXQorCisKKyAgICAgICAgcHVibGljIHZvaWQgV0MwMDJfQ29uc29saWRhdGVfQnVsa19UZXN0KHN0cmluZyB0ZXN0SWQsIHN0cmluZyBuYW1lMSwgc3RyaW5nIG5hbWUyKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UxRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lMSkpOworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMkRvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTIpKTsKKworICAgICAgICAgICAgdmFyIHJvb3RUZW1wRGlyID0gVGVzdFV0aWwuVGVtcERpcjsKKyAgICAgICAgICAgIHZhciB0aGlzVGVzdFRlbXBEaXIgPSBuZXcgRGlyZWN0b3J5SW5mbyhQYXRoLkNvbWJpbmUocm9vdFRlbXBEaXIuRnVsbE5hbWUsIHRlc3RJZCkpOworICAgICAgICAgICAgaWYgKHRoaXNUZXN0VGVtcERpci5FeGlzdHMpCisgICAgICAgICAgICAgICAgQXNzZXJ0LlRydWUoZmFsc2UsICJEdXBsaWNhdGUgdGVzdCBpZDogIiArIHRlc3RJZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhpc1Rlc3RUZW1wRGlyLkNyZWF0ZSgpOworCisgICAgICAgICAgICB2YXIgc291cmNlMUNvcGllZFRvRGVzdERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHRoaXNUZXN0VGVtcERpci5GdWxsTmFtZSwgc291cmNlMURvY3guTmFtZSkpOworICAgICAgICAgICAgdmFyIHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0aGlzVGVzdFRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZTJEb2N4Lk5hbWUpKTsKKyAgICAgICAgICAgIGlmICghc291cmNlMUNvcGllZFRvRGVzdERvY3guRXhpc3RzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB3bWwxID0gbmV3IFdtbERvY3VtZW50KHNvdXJjZTFEb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICB2YXIgd21sMiA9IFdvcmRwcm9jZXNzaW5nTUxVdGlsLkJyZWFrTGlua1RvVGVtcGxhdGUod21sMSk7CisgICAgICAgICAgICAgICAgd21sMi5TYXZlQXMoc291cmNlMUNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzb3VyY2UyQ29waWVkVG9EZXN0RG9jeC5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHdtbDEgPSBuZXcgV21sRG9jdW1lbnQoc291cmNlMkRvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgICAgIHZhciB3bWwyID0gV29yZHByb2Nlc3NpbmdNTFV0aWwuQnJlYWtMaW5rVG9UZW1wbGF0ZSh3bWwxKTsKKyAgICAgICAgICAgICAgICB3bWwyLlNhdmVBcyhzb3VyY2UyQ29waWVkVG9EZXN0RG9jeC5GdWxsTmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIGlmIChzX09wZW5Xb3JkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTFEb2N4Rm9yV29yZCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lMSkpOworICAgICAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTJEb2N4Rm9yV29yZCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lMikpOworCisgICAgICAgICAgICAgICAgdmFyIHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4Rm9yV29yZCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2UxRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi1Gb3ItV29yZC5kb2N4IikpKTsKKyAgICAgICAgICAgICAgICB2YXIgc291cmNlMkNvcGllZFRvRGVzdERvY3hGb3JXb3JkID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0aGlzVGVzdFRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZTJEb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLUZvci1Xb3JkLmRvY3giKSkpOworICAgICAgICAgICAgICAgIGlmICghc291cmNlMUNvcGllZFRvRGVzdERvY3hGb3JXb3JkLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZTFEb2N4LkZ1bGxOYW1lLCBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeEZvcldvcmQuRnVsbE5hbWUpOworICAgICAgICAgICAgICAgIGlmICghc291cmNlMkNvcGllZFRvRGVzdERvY3hGb3JXb3JkLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZTJEb2N4LkZ1bGxOYW1lLCBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeEZvcldvcmQuRnVsbE5hbWUpOworCisgICAgICAgICAgICAgICAgRmlsZUluZm8gd29yZEV4ZSA9IG5ldyBGaWxlSW5mbyhAIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IE9mZmljZVxyb290XE9mZmljZTE2XFdJTldPUkQuRVhFIik7CisgICAgICAgICAgICAgICAgdmFyIHBhdGggPSBuZXcgRGlyZWN0b3J5SW5mbyhAIkM6XFVzZXJzXEVyaWNcRG9jdW1lbnRzXFdpbmRvd3NQb3dlclNoZWxsTW9kdWxlc1xPcGVuLVhtbC1Qb3dlclRvb2xzXFRlc3RGaWxlcyIpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeEZvcldvcmQpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeEZvcldvcmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICB2YXIgYmVmb3JlID0gc291cmNlMUNvcGllZFRvRGVzdERvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICIiKTsKKyAgICAgICAgICAgIHZhciBhZnRlciA9IHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiIik7CisgICAgICAgICAgICB2YXIgZG9jeFdpdGhSZXZpc2lvbnNGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBiZWZvcmUgKyAiLUNPTVBBUkUtIiArIGFmdGVyICsgIi5kb2N4IikpOworICAgICAgICAgICAgdmFyIGRvY3hDb25zb2xpZGF0ZWRGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBiZWZvcmUgKyAiLUNPTlNPTElEQVRFRC0iICsgYWZ0ZXIgKyAiLmRvY3giKSk7CisKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHNvdXJjZTFXbWwgPSBuZXcgV21sRG9jdW1lbnQoc291cmNlMUNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgV21sRG9jdW1lbnQgc291cmNlMldtbCA9IG5ldyBXbWxEb2N1bWVudChzb3VyY2UyQ29waWVkVG9EZXN0RG9jeC5GdWxsTmFtZSk7CisgICAgICAgICAgICBXbWxDb21wYXJlclNldHRpbmdzIHNldHRpbmdzID0gbmV3IFdtbENvbXBhcmVyU2V0dGluZ3MoKTsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IGNvbXBhcmVkV21sID0gV21sQ29tcGFyZXIuQ29tcGFyZShzb3VyY2UxV21sLCBzb3VyY2UyV21sLCBzZXR0aW5ncyk7CisgICAgICAgICAgICBXb3JkcHJvY2Vzc2luZ01MVXRpbC5CcmVha0xpbmtUb1RlbXBsYXRlKGNvbXBhcmVkV21sKS5TYXZlQXMoZG9jeFdpdGhSZXZpc2lvbnNGaS5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIExpc3Q8V21sUmV2aXNlZERvY3VtZW50SW5mbz4gcmV2aXNlZERvY0luZm8gPSBuZXcgTGlzdDxXbWxSZXZpc2VkRG9jdW1lbnRJbmZvPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFdtbFJldmlzZWREb2N1bWVudEluZm8oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmV2aXNlZERvY3VtZW50ID0gc291cmNlMldtbCwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IgPSBDb2xvci5MaWdodEJsdWUsCisgICAgICAgICAgICAgICAgICAgIFJldmlzb3IgPSAiUmV2aXNlZCBieSBFcmljIFdoaXRlIiwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgV21sRG9jdW1lbnQgY29uc29saWRhdGVkV21sID0gV21sQ29tcGFyZXIuQ29uc29saWRhdGUoCisgICAgICAgICAgICAgICAgc291cmNlMVdtbCwKKyAgICAgICAgICAgICAgICByZXZpc2VkRG9jSW5mbywKKyAgICAgICAgICAgICAgICBzZXR0aW5ncyk7CisgICAgICAgICAgICBXb3JkcHJvY2Vzc2luZ01MVXRpbC5CcmVha0xpbmtUb1RlbXBsYXRlKGNvbnNvbGlkYXRlZFdtbCkuU2F2ZUFzKGRvY3hDb25zb2xpZGF0ZWRGaS5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIHN0cmluZyB2YWxpZGF0aW9uRXJyb3JzID0gIiI7CisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKGNvbnNvbGlkYXRlZFdtbC5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgY29uc29saWRhdGVkV21sLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtcywgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPcGVuWG1sVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBPcGVuWG1sVmFsaWRhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBlcnJvcnMgPSB2YWxpZGF0b3IuVmFsaWRhdGUod0RvYykuV2hlcmUoZSA9PiAhRXhwZWN0ZWRFcnJvcnMuQ29udGFpbnMoZS5EZXNjcmlwdGlvbikpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLkNvdW50KCkgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmQgPSAiICAiOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlcnIgaW4gZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworI2lmIHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIkVycm9yIiArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpbmQgKyAiRXJyb3JUeXBlOiAiICsgZXJyLkVycm9yVHlwZS5Ub1N0cmluZygpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJEZXNjcmlwdGlvbjogIiArIGVyci5EZXNjcmlwdGlvbiArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpbmQgKyAiUGFydDogIiArIGVyci5QYXJ0LlVyaS5Ub1N0cmluZygpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJYUGF0aDogIiArIGVyci5QYXRoLlhQYXRoICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIgICAgICAgICAgICBcIiIgKyBlcnIuRGVzY3JpcHRpb24gKyAiXCIsIiArIEVudmlyb25tZW50Lk5ld0xpbmUpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgaWYgKHNfT3BlbldvcmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZUluZm8gd29yZEV4ZSA9IG5ldyBGaWxlSW5mbyhAIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IE9mZmljZVxyb290XE9mZmljZTE2XFdJTldPUkQuRVhFIik7CisgICAgICAgICAgICAgICAgV29yZFJ1bm5lci5SdW5Xb3JkKHdvcmRFeGUsIGRvY3hDb25zb2xpZGF0ZWRGaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAvLyBPcGVuIFdpbmRvd3MgRXhwbG9yZXIKKyAgICAgICAgICAgIGlmIChtX09wZW5UZW1wRGlySW5FeHBsb3JlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vIENPREUgVE8gUkVQRUFUIFVOVElMIFNVQ0NFU1MgLy8vLy8vLy8vLworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbWFwaG9yRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsICJ6X0V4cGxvcmVyT3BlbmVkU2VtYXBob3JlLnR4dCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VtYXBob3JGaS5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoc2VtYXBob3JGaS5GdWxsTmFtZSwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLkV4cGxvcmVyKHRoaXNUZXN0VGVtcERpcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcCg1MCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICBpZiAodmFsaWRhdGlvbkVycm9ycyAhPSAiIikKKyAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShmYWxzZSwgdmFsaWRhdGlvbkVycm9ycyk7CisgICAgICAgIH0KKworICAgICAgICBbVGhlb3J5XQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTAwMCIsICJDQS9DQTAwMS1QbGFpbi5kb2N4IiwgIkNBL0NBMDAxLVBsYWluLU1vZC5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xMDEwIiwgIldDL1dDMDAxLURpZ2l0cy5kb2N4IiwgIldDL1dDMDAxLURpZ2l0cy1Nb2QuZG9jeCIsIDQpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTAyMCIsICJXQy9XQzAwMS1EaWdpdHMuZG9jeCIsICJXQy9XQzAwMS1EaWdpdHMtRGVsZXRlZC1QYXJhZ3JhcGguZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTAzMCIsICJXQy9XQzAwMS1EaWdpdHMtRGVsZXRlZC1QYXJhZ3JhcGguZG9jeCIsICJXQy9XQzAwMS1EaWdpdHMuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTA0MCIsICJXQy9XQzAwMi1Vbm1vZGlmaWVkLmRvY3giLCAiV0MvV0MwMDItRGlmZkluTWlkZGxlLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTEwNTAiLCAiV0MvV0MwMDItVW5tb2RpZmllZC5kb2N4IiwgIldDL1dDMDAyLURpZmZBdEJlZ2lubmluZy5kb2N4IiwgMildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xMDYwIiwgIldDL1dDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQy9XQzAwMi1EZWxldGVBdEJlZ2lubmluZy5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xMDcwIiwgIldDL1dDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQy9XQzAwMi1JbnNlcnRBdEJlZ2lubmluZy5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xMDgwIiwgIldDL1dDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQy9XQzAwMi1JbnNlcnRBdEVuZC5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xMDkwIiwgIldDL1dDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQy9XQzAwMi1EZWxldGVBdEVuZC5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xMTAwIiwgIldDL1dDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQy9XQzAwMi1EZWxldGVJbk1pZGRsZS5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xMTEwIiwgIldDL1dDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQy9XQzAwMi1JbnNlcnRJbk1pZGRsZS5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xMTIwIiwgIldDL1dDMDAyLURlbGV0ZUluTWlkZGxlLmRvY3giLCAiV0MvV0MwMDItVW5tb2RpZmllZC5kb2N4IiwgMSldCisgICAgICAgIC8vW0lubGluZURhdGEoIldDLTExMzAiLCAiV0MvV0MwMDQtTGFyZ2UuZG9jeCIsICJXQy9XQzAwNC1MYXJnZS1Nb2QuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTE0MCIsICJXQy9XQzAwNi1UYWJsZS5kb2N4IiwgIldDL1dDMDA2LVRhYmxlLURlbGV0ZS1Sb3cuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTE1MCIsICJXQy9XQzAwNi1UYWJsZS1EZWxldGUtUm93LmRvY3giLCAiV0MvV0MwMDYtVGFibGUuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTE2MCIsICJXQy9XQzAwNi1UYWJsZS5kb2N4IiwgIldDL1dDMDA2LVRhYmxlLURlbGV0ZS1Db250ZXN0cy1vZi1Sb3cuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTE3MCIsICJXQy9XQzAwNy1Vbm1vZGlmaWVkLmRvY3giLCAiV0MvV0MwMDctTG9uZ2VzdC1BdC1FbmQuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTE4MCIsICJXQy9XQzAwNy1Vbm1vZGlmaWVkLmRvY3giLCAiV0MvV0MwMDctRGVsZXRlZC1hdC1CZWdpbm5pbmctb2YtUGFyYS5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xMTkwIiwgIldDL1dDMDA3LVVubW9kaWZpZWQuZG9jeCIsICJXQy9XQzAwNy1Nb3ZlZC1pbnRvLVRhYmxlLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTEyMDAiLCAiV0MvV0MwMDktVGFibGUtVW5tb2RpZmllZC5kb2N4IiwgIldDL1dDMDA5LVRhYmxlLUNlbGwtMS0xLU1vZC5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xMjEwIiwgIldDL1dDMDEwLVBhcmEtQmVmb3JlLVRhYmxlLVVubW9kaWZpZWQuZG9jeCIsICJXQy9XQzAxMC1QYXJhLUJlZm9yZS1UYWJsZS1Nb2QuZG9jeCIsIDMpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTIyMCIsICJXQy9XQzAxMS1CZWZvcmUuZG9jeCIsICJXQy9XQzAxMS1BZnRlci5kb2N4IiwgMildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xMjMwIiwgIldDL1dDMDEyLU1hdGgtQmVmb3JlLmRvY3giLCAiV0MvV0MwMTItTWF0aC1BZnRlci5kb2N4IiwgMildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xMjQwIiwgIldDL1dDMDEzLUltYWdlLUJlZm9yZS5kb2N4IiwgIldDL1dDMDEzLUltYWdlLUFmdGVyLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTEyNTAiLCAiV0MvV0MwMTMtSW1hZ2UtQmVmb3JlLmRvY3giLCAiV0MvV0MwMTMtSW1hZ2UtQWZ0ZXIyLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTEyNjAiLCAiV0MvV0MwMTMtSW1hZ2UtQmVmb3JlMi5kb2N4IiwgIldDL1dDMDEzLUltYWdlLUFmdGVyMi5kb2N4IiwgMildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xMjcwIiwgIldDL1dDMDE0LVNtYXJ0QXJ0LUJlZm9yZS5kb2N4IiwgIldDL1dDMDE0LVNtYXJ0QXJ0LUFmdGVyLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTEyODAiLCAiV0MvV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1CZWZvcmUuZG9jeCIsICJXQy9XQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLUFmdGVyLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTEzMTAiLCAiV0MvV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1CZWZvcmUuZG9jeCIsICJXQy9XQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLURlbGV0ZWQtQWZ0ZXIuZG9jeCIsIDMpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTMyMCIsICJXQy9XQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLUJlZm9yZS5kb2N4IiwgIldDL1dDMDE0LVNtYXJ0QXJ0LVdpdGgtSW1hZ2UtRGVsZXRlZC1BZnRlcjIuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTMzMCIsICJXQy9XQzAxNS1UaHJlZS1QYXJhZ3JhcGhzLmRvY3giLCAiV0MvV0MwMTUtVGhyZWUtUGFyYWdyYXBocy1BZnRlci5kb2N4IiwgMyldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xMzQwIiwgIldDL1dDMDE2LVBhcmEtSW1hZ2UtUGFyYS5kb2N4IiwgIldDL1dDMDE2LVBhcmEtSW1hZ2UtUGFyYS13LURlbGV0ZWQtSW1hZ2UuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTM1MCIsICJXQy9XQzAxNy1JbWFnZS5kb2N4IiwgIldDL1dDMDE3LUltYWdlLUFmdGVyLmRvY3giLCAzKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTEzNjAiLCAiV0MvV0MwMTgtRmllbGQtU2ltcGxlLUJlZm9yZS5kb2N4IiwgIldDL1dDMDE4LUZpZWxkLVNpbXBsZS1BZnRlci0xLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTEzNzAiLCAiV0MvV0MwMTgtRmllbGQtU2ltcGxlLUJlZm9yZS5kb2N4IiwgIldDL1dDMDE4LUZpZWxkLVNpbXBsZS1BZnRlci0yLmRvY3giLCAzKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTEzODAiLCAiV0MvV0MwMTktSHlwZXJsaW5rLUJlZm9yZS5kb2N4IiwgIldDL1dDMDE5LUh5cGVybGluay1BZnRlci0xLmRvY3giLCAzKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTEzOTAiLCAiV0MvV0MwMTktSHlwZXJsaW5rLUJlZm9yZS5kb2N4IiwgIldDL1dDMDE5LUh5cGVybGluay1BZnRlci0yLmRvY3giLCA1KV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE0MDAiLCAiV0MvV0MwMjAtRm9vdE5vdGUtQmVmb3JlLmRvY3giLCAiV0MvV0MwMjAtRm9vdE5vdGUtQWZ0ZXItMS5kb2N4IiwgMyldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xNDEwIiwgIldDL1dDMDIwLUZvb3ROb3RlLUJlZm9yZS5kb2N4IiwgIldDL1dDMDIwLUZvb3ROb3RlLUFmdGVyLTIuZG9jeCIsIDUpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTQyMCIsICJXQy9XQzAyMS1NYXRoLUJlZm9yZS0xLmRvY3giLCAiV0MvV0MwMjEtTWF0aC1BZnRlci0xLmRvY3giLCA5KV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE0MzAiLCAiV0MvV0MwMjEtTWF0aC1CZWZvcmUtMi5kb2N4IiwgIldDL1dDMDIxLU1hdGgtQWZ0ZXItMi5kb2N4IiwgNildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xNDQwIiwgIldDL1dDMDIyLUltYWdlLU1hdGgtUGFyYS1CZWZvcmUuZG9jeCIsICJXQy9XQzAyMi1JbWFnZS1NYXRoLVBhcmEtQWZ0ZXIuZG9jeCIsIDEwKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE0NTAiLCAiV0MvV0MwMjMtVGFibGUtNC1Sb3ctSW1hZ2UtQmVmb3JlLmRvY3giLCAiV0MvV0MwMjMtVGFibGUtNC1Sb3ctSW1hZ2UtQWZ0ZXItRGVsZXRlLTEtUm93LmRvY3giLCA3KV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE0NjAiLCAiV0MvV0MwMjQtVGFibGUtQmVmb3JlLmRvY3giLCAiV0MvV0MwMjQtVGFibGUtQWZ0ZXIuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTQ3MCIsICJXQy9XQzAyNC1UYWJsZS1CZWZvcmUuZG9jeCIsICJXQy9XQzAyNC1UYWJsZS1BZnRlcjIuZG9jeCIsIDcpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTQ4MCIsICJXQy9XQzAyNS1TaW1wbGUtVGFibGUtQmVmb3JlLmRvY3giLCAiV0MvV0MwMjUtU2ltcGxlLVRhYmxlLUFmdGVyLmRvY3giLCA0KV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE1MDAiLCAiV0MvV0MwMjYtTG9uZy1UYWJsZS1CZWZvcmUuZG9jeCIsICJXQy9XQzAyNi1Mb25nLVRhYmxlLUFmdGVyLTEuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTUxMCIsICJXQy9XQzAyNy1Ud2VudHktUGFyYXMtQmVmb3JlLmRvY3giLCAiV0MvV0MwMjctVHdlbnR5LVBhcmFzLUFmdGVyLTEuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTUyMCIsICJXQy9XQzAyNy1Ud2VudHktUGFyYXMtQWZ0ZXItMS5kb2N4IiwgIldDL1dDMDI3LVR3ZW50eS1QYXJhcy1CZWZvcmUuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTUzMCIsICJXQy9XQzAyNy1Ud2VudHktUGFyYXMtQmVmb3JlLmRvY3giLCAiV0MvV0MwMjctVHdlbnR5LVBhcmFzLUFmdGVyLTIuZG9jeCIsIDQpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTU0MCIsICJXQy9XQzAzMC1JbWFnZS1NYXRoLUJlZm9yZS5kb2N4IiwgIldDL1dDMDMwLUltYWdlLU1hdGgtQWZ0ZXIuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTU1MCIsICJXQy9XQzAzMS1Ud28tTWF0aHMtQmVmb3JlLmRvY3giLCAiV0MvV0MwMzEtVHdvLU1hdGhzLUFmdGVyLmRvY3giLCA0KV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE1NjAiLCAiV0MvV0MwMzItUGFyYS13aXRoLVBhcmEtUHJvcHMuZG9jeCIsICJXQy9XQzAzMi1QYXJhLXdpdGgtUGFyYS1Qcm9wcy1BZnRlci5kb2N4IiwgMyldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xNTcwIiwgIldDL1dDMDMzLU1lcmdlZC1DZWxscy1CZWZvcmUuZG9jeCIsICJXQy9XQzAzMy1NZXJnZWQtQ2VsbHMtQWZ0ZXIxLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE1ODAiLCAiV0MvV0MwMzMtTWVyZ2VkLUNlbGxzLUJlZm9yZS5kb2N4IiwgIldDL1dDMDMzLU1lcmdlZC1DZWxscy1BZnRlcjIuZG9jeCIsIDQpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTYwMCIsICJXQy9XQzAzNC1Gb290bm90ZXMtQmVmb3JlLmRvY3giLCAiV0MvV0MwMzQtRm9vdG5vdGVzLUFmdGVyMS5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xNjEwIiwgIldDL1dDMDM0LUZvb3Rub3Rlcy1CZWZvcmUuZG9jeCIsICJXQy9XQzAzNC1Gb290bm90ZXMtQWZ0ZXIyLmRvY3giLCA0KV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE2MjAiLCAiV0MvV0MwMzQtRm9vdG5vdGVzLUJlZm9yZS5kb2N4IiwgIldDL1dDMDM0LUZvb3Rub3Rlcy1BZnRlcjMuZG9jeCIsIDMpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTYzMCIsICJXQy9XQzAzNC1Gb290bm90ZXMtQWZ0ZXIzLmRvY3giLCAiV0MvV0MwMzQtRm9vdG5vdGVzLUJlZm9yZS5kb2N4IiwgMyldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xNjQwIiwgIldDL1dDMDM1LUZvb3Rub3RlLUJlZm9yZS5kb2N4IiwgIldDL1dDMDM1LUZvb3Rub3RlLUFmdGVyLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE2NTAiLCAiV0MvV0MwMzUtRm9vdG5vdGUtQWZ0ZXIuZG9jeCIsICJXQy9XQzAzNS1Gb290bm90ZS1CZWZvcmUuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTY2MCIsICJXQy9XQzAzNi1Gb290bm90ZS1XaXRoLVRhYmxlLUJlZm9yZS5kb2N4IiwgIldDL1dDMDM2LUZvb3Rub3RlLVdpdGgtVGFibGUtQWZ0ZXIuZG9jeCIsIDUpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTY3MCIsICJXQy9XQzAzNi1Gb290bm90ZS1XaXRoLVRhYmxlLUFmdGVyLmRvY3giLCAiV0MvV0MwMzYtRm9vdG5vdGUtV2l0aC1UYWJsZS1CZWZvcmUuZG9jeCIsIDUpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTY4MCIsICJXQy9XQzAzNC1FbmRub3Rlcy1CZWZvcmUuZG9jeCIsICJXQy9XQzAzNC1FbmRub3Rlcy1BZnRlcjEuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTcwMCIsICJXQy9XQzAzNC1FbmRub3Rlcy1CZWZvcmUuZG9jeCIsICJXQy9XQzAzNC1FbmRub3Rlcy1BZnRlcjIuZG9jeCIsIDQpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTcxMCIsICJXQy9XQzAzNC1FbmRub3Rlcy1CZWZvcmUuZG9jeCIsICJXQy9XQzAzNC1FbmRub3Rlcy1BZnRlcjMuZG9jeCIsIDcpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTcyMCIsICJXQy9XQzAzNC1FbmRub3Rlcy1BZnRlcjMuZG9jeCIsICJXQy9XQzAzNC1FbmRub3Rlcy1CZWZvcmUuZG9jeCIsIDcpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTczMCIsICJXQy9XQzAzNS1FbmRub3RlLUJlZm9yZS5kb2N4IiwgIldDL1dDMDM1LUVuZG5vdGUtQWZ0ZXIuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTc0MCIsICJXQy9XQzAzNS1FbmRub3RlLUFmdGVyLmRvY3giLCAiV0MvV0MwMzUtRW5kbm90ZS1CZWZvcmUuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTc1MCIsICJXQy9XQzAzNi1FbmRub3RlLVdpdGgtVGFibGUtQmVmb3JlLmRvY3giLCAiV0MvV0MwMzYtRW5kbm90ZS1XaXRoLVRhYmxlLUFmdGVyLmRvY3giLCA2KV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE3NjAiLCAiV0MvV0MwMzYtRW5kbm90ZS1XaXRoLVRhYmxlLUFmdGVyLmRvY3giLCAiV0MvV0MwMzYtRW5kbm90ZS1XaXRoLVRhYmxlLUJlZm9yZS5kb2N4IiwgNildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xNzcwIiwgIldDL1dDMDM3LVRleHRib3gtQmVmb3JlLmRvY3giLCAiV0MvV0MwMzctVGV4dGJveC1BZnRlcjEuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTc4MCIsICJXQy9XQzAzOC1Eb2N1bWVudC1XaXRoLUJSLUJlZm9yZS5kb2N4IiwgIldDL1dDMDM4LURvY3VtZW50LVdpdGgtQlItQWZ0ZXIuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTgwMCIsICJSQy9SQzAwMS1CZWZvcmUuZG9jeCIsICJSQy9SQzAwMS1BZnRlcjEuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTgxMCIsICJSQy9SQzAwMi1JbWFnZS5kb2N4IiwgIlJDL1JDMDAyLUltYWdlLUFmdGVyMS5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xODIwIiwgIldDL1dDMDM5LUJyZWFrLUluLVJvdy5kb2N4IiwgIldDL1dDMDM5LUJyZWFrLUluLVJvdy1BZnRlcjEuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTgzMCIsICJXQy9XQzA0MS1UYWJsZS01LmRvY3giLCAiV0MvV0MwNDEtVGFibGUtNS1Nb2QuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTg0MCIsICJXQy9XQzA0Mi1UYWJsZS01LmRvY3giLCAiV0MvV0MwNDItVGFibGUtNS1Nb2QuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTg1MCIsICJXQy9XQzA0My1OZXN0ZWQtVGFibGUuZG9jeCIsICJXQy9XQzA0My1OZXN0ZWQtVGFibGUtTW9kLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE4NjAiLCAiV0MvV0MwNDQtVGV4dC1Cb3guZG9jeCIsICJXQy9XQzA0NC1UZXh0LUJveC1Nb2QuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTg3MCIsICJXQy9XQzA0NS1UZXh0LUJveC5kb2N4IiwgIldDL1dDMDQ1LVRleHQtQm94LU1vZC5kb2N4IiwgMildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xODgwIiwgIldDL1dDMDQ2LVR3by1UZXh0LUJveC5kb2N4IiwgIldDL1dDMDQ2LVR3by1UZXh0LUJveC1Nb2QuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTg5MCIsICJXQy9XQzA0Ny1Ud28tVGV4dC1Cb3guZG9jeCIsICJXQy9XQzA0Ny1Ud28tVGV4dC1Cb3gtTW9kLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE5MDAiLCAiV0MvV0MwNDgtVGV4dC1Cb3gtaW4tQ2VsbC5kb2N4IiwgIldDL1dDMDQ4LVRleHQtQm94LWluLUNlbGwtTW9kLmRvY3giLCA2KV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE5MTAiLCAiV0MvV0MwNDktVGV4dC1Cb3gtaW4tQ2VsbC5kb2N4IiwgIldDL1dDMDQ5LVRleHQtQm94LWluLUNlbGwtTW9kLmRvY3giLCA1KV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE5MjAiLCAiV0MvV0MwNTAtVGFibGUtaW4tVGV4dC1Cb3guZG9jeCIsICJXQy9XQzA1MC1UYWJsZS1pbi1UZXh0LUJveC1Nb2QuZG9jeCIsIDgpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTkzMCIsICJXQy9XQzA1MS1UYWJsZS1pbi1UZXh0LUJveC5kb2N4IiwgIldDL1dDMDUxLVRhYmxlLWluLVRleHQtQm94LU1vZC5kb2N4IiwgOSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xOTQwIiwgIldDL1dDMDUyLVNtYXJ0QXJ0LVNhbWUuZG9jeCIsICJXQy9XQzA1Mi1TbWFydEFydC1TYW1lLU1vZC5kb2N4IiwgMildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xOTUwIiwgIldDL1dDMDUzLVRleHQtaW4tQ2VsbC5kb2N4IiwgIldDL1dDMDUzLVRleHQtaW4tQ2VsbC1Nb2QuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTk2MCIsICJXQy9XQzA1NC1UZXh0LWluLUNlbGwuZG9jeCIsICJXQy9XQzA1NC1UZXh0LWluLUNlbGwtTW9kLmRvY3giLCAwKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTE5NzAiLCAiV0MvV0MwNTUtRnJlbmNoLmRvY3giLCAiV0MvV0MwNTUtRnJlbmNoLU1vZC5kb2N4IiwgMildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0xOTgwIiwgIldDL1dDMDU2LUZyZW5jaC5kb2N4IiwgIldDL1dDMDU2LUZyZW5jaC1Nb2QuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMTk5MCIsICJXQy9XQzA1Ny1UYWJsZS1NZXJnZWQtQ2VsbC5kb2N4IiwgIldDL1dDMDU3LVRhYmxlLU1lcmdlZC1DZWxsLU1vZC5kb2N4IiwgNCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0yMDAwIiwgIldDL1dDMDU4LVRhYmxlLU1lcmdlZC1DZWxsLmRvY3giLCAiV0MvV0MwNTgtVGFibGUtTWVyZ2VkLUNlbGwtTW9kLmRvY3giLCA2KV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTIwMTAiLCAiV0MvV0MwNTktRm9vdG5vdGUuZG9jeCIsICJXQy9XQzA1OS1Gb290bm90ZS1Nb2QuZG9jeCIsIDUpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMjAyMCIsICJXQy9XQzA2MC1FbmRub3RlLmRvY3giLCAiV0MvV0MwNjAtRW5kbm90ZS1Nb2QuZG9jeCIsIDMpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMjAzMCIsICJXQy9XQzA2MS1TdHlsZS1BZGRlZC5kb2N4IiwgIldDL1dDMDYxLVN0eWxlLUFkZGVkLU1vZC5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0yMDQwIiwgIldDL1dDMDYyLU5ldy1DaGFyLVN0eWxlLUFkZGVkLmRvY3giLCAiV0MvV0MwNjItTmV3LUNoYXItU3R5bGUtQWRkZWQtTW9kLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTIwNTAiLCAiV0MvV0MwNjMtRm9vdG5vdGUuZG9jeCIsICJXQy9XQzA2My1Gb290bm90ZS1Nb2QuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMjA2MCIsICJXQy9XQzA2My1Gb290bm90ZS1Nb2QuZG9jeCIsICJXQy9XQzA2My1Gb290bm90ZS5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0yMDcwIiwgIldDL1dDMDY0LUZvb3Rub3RlLmRvY3giLCAiV0MvV0MwNjQtRm9vdG5vdGUtTW9kLmRvY3giLCAwKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTIwODAiLCAiV0MvV0MwNjUtVGV4dGJveC5kb2N4IiwgIldDL1dDMDY1LVRleHRib3gtTW9kLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDLTIwOTAiLCAiV0MvV0MwNjYtVGV4dGJveC1CZWZvcmUtSW5zLmRvY3giLCAiV0MvV0MwNjYtVGV4dGJveC1CZWZvcmUtSW5zLU1vZC5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy0yMDkyIiwgIldDL1dDMDY2LVRleHRib3gtQmVmb3JlLUlucy1Nb2QuZG9jeCIsICJXQy9XQzA2Ni1UZXh0Ym94LUJlZm9yZS1JbnMuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MtMjEwMCIsICJXQy9XQzA2Ny1UZXh0Ym94LUltYWdlLmRvY3giLCAiV0MvV0MwNjctVGV4dGJveC1JbWFnZS1Nb2QuZG9jeCIsIDIpXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCJXQy0xMDAwIiwgIiIsICIiLCAwKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiV0MtMTAwMCIsICIiLCAiIiwgMCldCisgICAgICAgIC8vW0lubGluZURhdGEoIldDLTEwMDAiLCAiIiwgIiIsIDApXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCJXQy0xMDAwIiwgIiIsICIiLCAwKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiV0MtMTAwMCIsICIiLCAiIiwgMCldCisgICAgICAgIC8vW0lubGluZURhdGEoIldDLTEwMDAiLCAiIiwgIiIsIDApXQorCisgICAgICAgIHB1YmxpYyB2b2lkIFdDMDAzX0NvbXBhcmUoc3RyaW5nIHRlc3RJZCwgc3RyaW5nIG5hbWUxLCBzdHJpbmcgbmFtZTIsIGludCByZXZpc2lvbkNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UxRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lMSkpOworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMkRvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTIpKTsKKworICAgICAgICAgICAgdmFyIHJvb3RUZW1wRGlyID0gVGVzdFV0aWwuVGVtcERpcjsKKyAgICAgICAgICAgIHZhciB0aGlzVGVzdFRlbXBEaXIgPSBuZXcgRGlyZWN0b3J5SW5mbyhQYXRoLkNvbWJpbmUocm9vdFRlbXBEaXIuRnVsbE5hbWUsIHRlc3RJZCkpOworICAgICAgICAgICAgaWYgKHRoaXNUZXN0VGVtcERpci5FeGlzdHMpCisgICAgICAgICAgICAgICAgQXNzZXJ0LlRydWUoZmFsc2UsICJEdXBsaWNhdGUgdGVzdCBpZD8/PyIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRoaXNUZXN0VGVtcERpci5DcmVhdGUoKTsKKworICAgICAgICAgICAgdmFyIHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0aGlzVGVzdFRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZTFEb2N4Lk5hbWUpKTsKKyAgICAgICAgICAgIHZhciBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2UyRG9jeC5OYW1lKSk7CisgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlMURvY3guRnVsbE5hbWUsIHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2UyRG9jeC5GdWxsTmFtZSwgc291cmNlMkNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworCisgICAgICAgICAgICB2YXIgYmVmb3JlID0gc291cmNlMUNvcGllZFRvRGVzdERvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICIiKTsKKyAgICAgICAgICAgIHZhciBhZnRlciA9IHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiIik7CisgICAgICAgICAgICAvL3ZhciBiYXNlbGluZURvY3hXaXRoUmV2aXNpb25zRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHNvdXJjZTFEb2N4LkRpcmVjdG9yeU5hbWUsIGJlZm9yZSArICItQ09NUEFSRS0iICsgYWZ0ZXIgKyAiLmRvY3giKSk7CisgICAgICAgICAgICB2YXIgZG9jeFdpdGhSZXZpc2lvbnNGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBiZWZvcmUgKyAiLUNPTVBBUkUtIiArIGFmdGVyICsgIi5kb2N4IikpOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICBpZiAoc19PcGVuV29yZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UxRG9jeEZvcldvcmQgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTEpKTsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UyRG9jeEZvcldvcmQgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTIpKTsKKworICAgICAgICAgICAgICAgIHZhciBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeEZvcldvcmQgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHRoaXNUZXN0VGVtcERpci5GdWxsTmFtZSwgc291cmNlMURvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICItRm9yLVdvcmQuZG9jeCIpKSk7CisgICAgICAgICAgICAgICAgdmFyIHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4Rm9yV29yZCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2UyRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi1Gb3ItV29yZC5kb2N4IikpKTsKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlMURvY3guRnVsbE5hbWUsIHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4Rm9yV29yZC5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZTJEb2N4LkZ1bGxOYW1lLCBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeEZvcldvcmQuRnVsbE5hbWUpOworCisgICAgICAgICAgICAgICAgRmlsZUluZm8gd29yZEV4ZSA9IG5ldyBGaWxlSW5mbyhAIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IE9mZmljZVxyb290XE9mZmljZTE2XFdJTldPUkQuRVhFIik7CisgICAgICAgICAgICAgICAgdmFyIHBhdGggPSBuZXcgRGlyZWN0b3J5SW5mbyhAIkM6XFVzZXJzXEVyaWNcRG9jdW1lbnRzXFdpbmRvd3NQb3dlclNoZWxsTW9kdWxlc1xPcGVuLVhtbC1Qb3dlclRvb2xzXFRlc3RGaWxlcyIpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeEZvcldvcmQpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeEZvcldvcmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICBXbWxEb2N1bWVudCBzb3VyY2UxV21sID0gbmV3IFdtbERvY3VtZW50KHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHNvdXJjZTJXbWwgPSBuZXcgV21sRG9jdW1lbnQoc291cmNlMkNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBXbWxDb21wYXJlclNldHRpbmdzKCk7CisgICAgICAgICAgICBzZXR0aW5ncy5EZWJ1Z1RlbXBGaWxlRGkgPSB0aGlzVGVzdFRlbXBEaXI7CisgICAgICAgICAgICBXbWxEb2N1bWVudCBjb21wYXJlZFdtbCA9IFdtbENvbXBhcmVyLkNvbXBhcmUoc291cmNlMVdtbCwgc291cmNlMldtbCwgc2V0dGluZ3MpOworICAgICAgICAgICAgY29tcGFyZWRXbWwuU2F2ZUFzKGRvY3hXaXRoUmV2aXNpb25zRmkuRnVsbE5hbWUpOworCisjaWYgZmFsc2UKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAvLyBjcmVhdGUgYmF0Y2ggZmlsZSB0byBjb3B5IG5ld2x5IGdlbmVyYXRlZCBDb250ZW50VHlwZVhtbCBhbmQgTmFyckRvYyB0byB0aGUgVGVzdEZpbGVzIGRpcmVjdG9yeS4KKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vLyBDT0RFIFRPIFJFUEVBVCBVTlRJTCBTVUNDRVNTIC8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAgICAgdmFyIGJhdGNoRmlsZU5hbWUgPSAiQ29weS1HZW4tRmlsZXMtVG8tVGVzdEZpbGVzLmJhdCI7CisgICAgICAgICAgICAgICAgICAgIHZhciBiYXRjaEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBiYXRjaEZpbGVOYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIHZhciBiYXRjaCA9ICIiOworICAgICAgICAgICAgICAgICAgICBiYXRjaCArPSAiY29weSAiICsgZG9jeFdpdGhSZXZpc2lvbnNGaS5GdWxsTmFtZSArICIgIiArIHNvdXJjZTFEb2N4LkRpcmVjdG9yeU5hbWUgKyBFbnZpcm9ubWVudC5OZXdMaW5lOworICAgICAgICAgICAgICAgICAgICBpZiAoYmF0Y2hGaS5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLkFwcGVuZEFsbFRleHQoYmF0Y2hGaS5GdWxsTmFtZSwgYmF0Y2gpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLldyaXRlQWxsVGV4dChiYXRjaEZpLkZ1bGxOYW1lLCBiYXRjaCk7CisgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcCg1MCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAvLyB2YWxpZGF0ZSBnZW5lcmF0ZWQgZG9jdW1lbnQKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uRXJyb3JzID0gIiI7CisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKGNvbXBhcmVkV21sLkRvY3VtZW50Qnl0ZUFycmF5LCAwLCBjb21wYXJlZFdtbC5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obXMsIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT3BlblhtbFZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgT3BlblhtbFZhbGlkYXRvcigpOworICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gdmFsaWRhdG9yLlZhbGlkYXRlKHdEb2MpLldoZXJlKGUgPT4gIUV4cGVjdGVkRXJyb3JzLkNvbnRhaW5zKGUuRGVzY3JpcHRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9ycy5Db3VudCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kID0gIiAgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZXJyIGluIGVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyNpZiB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJFcnJvciIgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kICsgIkVycm9yVHlwZTogIiArIGVyci5FcnJvclR5cGUuVG9TdHJpbmcoKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpbmQgKyAiRGVzY3JpcHRpb246ICIgKyBlcnIuRGVzY3JpcHRpb24gKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kICsgIlBhcnQ6ICIgKyBlcnIuUGFydC5VcmkuVG9TdHJpbmcoKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpbmQgKyAiWFBhdGg6ICIgKyBlcnIuUGF0aC5YUGF0aCArIEVudmlyb25tZW50Lk5ld0xpbmUpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiICAgICAgICAgICAgXCIiICsgZXJyLkRlc2NyaXB0aW9uICsgIlwiLCIgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkVycm9ycyA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIGlmIChzX09wZW5Xb3JkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGVJbmZvIHdvcmRFeGUgPSBuZXcgRmlsZUluZm8oQCJDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBPZmZpY2Vccm9vdFxPZmZpY2UxNlxXSU5XT1JELkVYRSIpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBkb2N4V2l0aFJldmlzaW9uc0ZpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgLy8gT3BlbiBXaW5kb3dzIEV4cGxvcmVyCisgICAgICAgICAgICBpZiAobV9PcGVuVGVtcERpckluRXhwbG9yZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vLyBDT0RFIFRPIFJFUEVBVCBVTlRJTCBTVUNDRVNTIC8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZW1hcGhvckZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCAiel9FeHBsb3Jlck9wZW5lZFNlbWFwaG9yZS50eHQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbWFwaG9yRmkuRXhpc3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KHNlbWFwaG9yRmkuRnVsbE5hbWUsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbC5FeHBsb3Jlcih0aGlzVGVzdFRlbXBEaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoNTApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmFsaWRhdGlvbkVycm9ycyAhPSAiIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShmYWxzZSwgdmFsaWRhdGlvbkVycm9ycyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MyID0gbmV3IFdtbENvbXBhcmVyU2V0dGluZ3MoKTsKKworICAgICAgICAgICAgV21sRG9jdW1lbnQgcmV2aXNpb25XbWwgPSBuZXcgV21sRG9jdW1lbnQoZG9jeFdpdGhSZXZpc2lvbnNGaS5GdWxsTmFtZSk7CisgICAgICAgICAgICB2YXIgcmV2aXNpb25zID0gV21sQ29tcGFyZXIuR2V0UmV2aXNpb25zKHJldmlzaW9uV21sLCBzZXR0aW5ncyk7CisgICAgICAgICAgICBBc3NlcnQuRXF1YWwocmV2aXNpb25Db3VudCwgcmV2aXNpb25zLkNvdW50KCkpOworCisgICAgICAgICAgICB2YXIgYWZ0ZXJSZWplY3RpbmdXbWwgPSBSZXZpc2lvblByb2Nlc3Nvci5SZWplY3RSZXZpc2lvbnMocmV2aXNpb25XbWwpOworCisgICAgICAgICAgICB2YXIgV1JJVEVfVEVNUF9GSUxFUyA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChXUklURV9URU1QX0ZJTEVTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBhZnRlclJlamVjdGluZ0ZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0aGlzVGVzdFRlbXBEaXIuRnVsbE5hbWUsICJBZnRlclJlamVjdGluZy5kb2N4IikpOworICAgICAgICAgICAgICAgIGFmdGVyUmVqZWN0aW5nV21sLlNhdmVBcyhhZnRlclJlamVjdGluZ0ZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgV21sRG9jdW1lbnQgYWZ0ZXJSZWplY3RpbmdDb21wYXJlZFdtbCA9IFdtbENvbXBhcmVyLkNvbXBhcmUoc291cmNlMVdtbCwgYWZ0ZXJSZWplY3RpbmdXbWwsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIHZhciBzYW5pdHlDaGVjazEgPSBXbWxDb21wYXJlci5HZXRSZXZpc2lvbnMoYWZ0ZXJSZWplY3RpbmdDb21wYXJlZFdtbCwgc2V0dGluZ3MpOworCisgICAgICAgICAgICBpZiAoV1JJVEVfVEVNUF9GSUxFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYWZ0ZXJSZWplY3RpbmdDb21wYXJlZEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0aGlzVGVzdFRlbXBEaXIuRnVsbE5hbWUsICJBZnRlclJlamVjdGluZ0NvbXBhcmVkLmRvY3giKSk7CisgICAgICAgICAgICAgICAgYWZ0ZXJSZWplY3RpbmdDb21wYXJlZFdtbC5TYXZlQXMoYWZ0ZXJSZWplY3RpbmdDb21wYXJlZEZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGFmdGVyQWNjZXB0aW5nV21sID0gUmV2aXNpb25Qcm9jZXNzb3IuQWNjZXB0UmV2aXNpb25zKHJldmlzaW9uV21sKTsKKworICAgICAgICAgICAgaWYgKFdSSVRFX1RFTVBfRklMRVMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGFmdGVyQWNjZXB0aW5nRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHRoaXNUZXN0VGVtcERpci5GdWxsTmFtZSwgIkFmdGVyQWNjZXB0aW5nLmRvY3giKSk7CisgICAgICAgICAgICAgICAgYWZ0ZXJBY2NlcHRpbmdXbWwuU2F2ZUFzKGFmdGVyQWNjZXB0aW5nRmkuRnVsbE5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBXbWxEb2N1bWVudCBhZnRlckFjY2VwdGluZ0NvbXBhcmVkV21sID0gV21sQ29tcGFyZXIuQ29tcGFyZShzb3VyY2UyV21sLCBhZnRlckFjY2VwdGluZ1dtbCwgc2V0dGluZ3MpOworICAgICAgICAgICAgdmFyIHNhbml0eUNoZWNrMiA9IFdtbENvbXBhcmVyLkdldFJldmlzaW9ucyhhZnRlckFjY2VwdGluZ0NvbXBhcmVkV21sLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgIGlmIChXUklURV9URU1QX0ZJTEVTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBhZnRlckFjY2VwdGluZ0NvbXBhcmVkRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHRoaXNUZXN0VGVtcERpci5GdWxsTmFtZSwgIkFmdGVyQWNjZXB0aW5nQ29tcGFyZWQuZG9jeCIpKTsKKyAgICAgICAgICAgICAgICBhZnRlckFjY2VwdGluZ0NvbXBhcmVkV21sLlNhdmVBcyhhZnRlckFjY2VwdGluZ0NvbXBhcmVkRmkuRnVsbE5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2FuaXR5Q2hlY2sxLkNvdW50KCkgIT0gMCkKKyAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShmYWxzZSwgIlNhbml0eSBDaGVjayAjMSBmYWlsZWQiKTsKKyAgICAgICAgICAgIGlmIChzYW5pdHlDaGVjazIuQ291bnQoKSAhPSAwKQorICAgICAgICAgICAgICAgIEFzc2VydC5UcnVlKGZhbHNlLCAiU2FuaXR5IENoZWNrICMyIGZhaWxlZCIpOworICAgICAgICB9CisKKyNpZiBmYWxzZQorICAgICAgICBbVGhlb3J5XQorICAgICAgICBbSW5saW5lRGF0YSgiV0MvV0MwMzctVGV4dGJveC1CZWZvcmUuZG9jeCIsICJXQy9XQzAzNy1UZXh0Ym94LUFmdGVyMS5kb2N4IiwgMildCisKKyAgICAgICAgcHVibGljIHZvaWQgV0MwMDNfVGhyb3dzKHN0cmluZyBuYW1lMSwgc3RyaW5nIG5hbWUyLCBpbnQgcmV2aXNpb25Db3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMURvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTEpKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTJEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUyKSk7CisKKyAgICAgICAgICAgIHZhciBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlMURvY3guTmFtZSkpOworICAgICAgICAgICAgdmFyIHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2UyRG9jeC5OYW1lKSk7CisgICAgICAgICAgICBpZiAoIXNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkV4aXN0cykKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlMURvY3guRnVsbE5hbWUsIHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIGlmICghc291cmNlMkNvcGllZFRvRGVzdERvY3guRXhpc3RzKQorICAgICAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2UyRG9jeC5GdWxsTmFtZSwgc291cmNlMkNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCBzb3VyY2UxV21sID0gbmV3IFdtbERvY3VtZW50KHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHNvdXJjZTJXbWwgPSBuZXcgV21sRG9jdW1lbnQoc291cmNlMkNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBXbWxDb21wYXJlclNldHRpbmdzKCk7CisgICAgICAgICAgICBBc3NlcnQuVGhyb3dzPE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uPigoKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgV21sRG9jdW1lbnQgY29tcGFyZWRXbWwgPSBXbWxDb21wYXJlci5Db21wYXJlKHNvdXJjZTFXbWwsIHNvdXJjZTJXbWwsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xMDAwIiwgIldDL1dDMDAxLURpZ2l0cy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTAxMCIsICJXQy9XQzAwMS1EaWdpdHMtRGVsZXRlZC1QYXJhZ3JhcGguZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTEwMjAiLCAiV0MvV0MwMDEtRGlnaXRzLU1vZC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTAzMCIsICJXQy9XQzAwMi1EZWxldGVBdEJlZ2lubmluZy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTA0MCIsICJXQy9XQzAwMi1EZWxldGVBdEVuZC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTA1MCIsICJXQy9XQzAwMi1EZWxldGVJbk1pZGRsZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTA2MCIsICJXQy9XQzAwMi1EaWZmQXRCZWdpbm5pbmcuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTEwNzAiLCAiV0MvV0MwMDItRGlmZkluTWlkZGxlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xMDgwIiwgIldDL1dDMDAyLUluc2VydEF0QmVnaW5uaW5nLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xMDkwIiwgIldDL1dDMDAyLUluc2VydEF0RW5kLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xMTAwIiwgIldDL1dDMDAyLUluc2VydEluTWlkZGxlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xMTEwIiwgIldDL1dDMDAyLVVubW9kaWZpZWQuZG9jeCIpXQorICAgICAgLy9bSW5saW5lRGF0YSgiV0NTLTExMjAiLCAiV0MvV0MwMDQtTGFyZ2UuZG9jeCIpXQorICAgICAgLy9bSW5saW5lRGF0YSgiV0NTLTExMzAiLCAiV0MvV0MwMDQtTGFyZ2UtTW9kLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xMTQwIiwgIldDL1dDMDA2LVRhYmxlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xMTUwIiwgIldDL1dDMDA2LVRhYmxlLURlbGV0ZS1Db250ZXN0cy1vZi1Sb3cuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTExNjAiLCAiV0MvV0MwMDYtVGFibGUtRGVsZXRlLVJvdy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTE3MCIsICJXQy9XQzAwNy1EZWxldGVkLWF0LUJlZ2lubmluZy1vZi1QYXJhLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xMTgwIiwgIldDL1dDMDA3LUxvbmdlc3QtQXQtRW5kLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xMTkwIiwgIldDL1dDMDA3LU1vdmVkLWludG8tVGFibGUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTEyMDAiLCAiV0MvV0MwMDctVW5tb2RpZmllZC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTIxMCIsICJXQy9XQzAwOS1UYWJsZS1DZWxsLTEtMS1Nb2QuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTEyMjAiLCAiV0MvV0MwMDktVGFibGUtVW5tb2RpZmllZC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTIzMCIsICJXQy9XQzAxMC1QYXJhLUJlZm9yZS1UYWJsZS1Nb2QuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTEyNDAiLCAiV0MvV0MwMTAtUGFyYS1CZWZvcmUtVGFibGUtVW5tb2RpZmllZC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTI1MCIsICJXQy9XQzAxMS1BZnRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTI2MCIsICJXQy9XQzAxMS1CZWZvcmUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTEyNzAiLCAiV0MvV0MwMTItTWF0aC1BZnRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTI4MCIsICJXQy9XQzAxMi1NYXRoLUJlZm9yZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTI5MCIsICJXQy9XQzAxMy1JbWFnZS1BZnRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTMwMCIsICJXQy9XQzAxMy1JbWFnZS1BZnRlcjIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTEzMTAiLCAiV0MvV0MwMTMtSW1hZ2UtQmVmb3JlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xMzIwIiwgIldDL1dDMDEzLUltYWdlLUJlZm9yZTIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTEzMzAiLCAiV0MvV0MwMTQtU21hcnRBcnQtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTEzNDAiLCAiV0MvV0MwMTQtU21hcnRBcnQtQmVmb3JlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xMzUwIiwgIldDL1dDMDE0LVNtYXJ0QXJ0LVdpdGgtSW1hZ2UtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTEzNjAiLCAiV0MvV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1CZWZvcmUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTEzNzAiLCAiV0MvV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1EZWxldGVkLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xMzgwIiwgIldDL1dDMDE0LVNtYXJ0QXJ0LVdpdGgtSW1hZ2UtRGVsZXRlZC1BZnRlcjIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTEzOTAiLCAiV0MvV0MwMTUtVGhyZWUtUGFyYWdyYXBocy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTQwMCIsICJXQy9XQzAxNS1UaHJlZS1QYXJhZ3JhcGhzLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xNDEwIiwgIldDL1dDMDE2LVBhcmEtSW1hZ2UtUGFyYS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTQyMCIsICJXQy9XQzAxNi1QYXJhLUltYWdlLVBhcmEtdy1EZWxldGVkLUltYWdlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xNDMwIiwgIldDL1dDMDE3LUltYWdlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xNDQwIiwgIldDL1dDMDE3LUltYWdlLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xNDUwIiwgIldDL1dDMDE4LUZpZWxkLVNpbXBsZS1BZnRlci0xLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xNDYwIiwgIldDL1dDMDE4LUZpZWxkLVNpbXBsZS1BZnRlci0yLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xNDcwIiwgIldDL1dDMDE4LUZpZWxkLVNpbXBsZS1CZWZvcmUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTE0ODAiLCAiV0MvV0MwMTktSHlwZXJsaW5rLUFmdGVyLTEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTE0OTAiLCAiV0MvV0MwMTktSHlwZXJsaW5rLUFmdGVyLTIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTE1MDAiLCAiV0MvV0MwMTktSHlwZXJsaW5rLUJlZm9yZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTUxMCIsICJXQy9XQzAyMC1Gb290Tm90ZS1BZnRlci0xLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xNTIwIiwgIldDL1dDMDIwLUZvb3ROb3RlLUFmdGVyLTIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0NTLTE1MzAiLCAiV0MvV0MwMjAtRm9vdE5vdGUtQmVmb3JlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xNTQwIiwgIldDL1dDMDIxLU1hdGgtQWZ0ZXItMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTU1MCIsICJXQy9XQzAyMS1NYXRoLUJlZm9yZS0xLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDUy0xNTYwIiwgIldDL1dDMDIyLUltYWdlLU1hdGgtUGFyYS1BZnRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQ1MtMTU3MCIsICJXQy9XQzAyMi1JbWFnZS1NYXRoLVBhcmEtQmVmb3JlLmRvY3giKV0KKyAgICAgIC8vW0lubGluZURhdGEoIldDUy0xNTgwIiwgIiIsICIiKV0KKyAgICAgIC8vW0lubGluZURhdGEoIldDUy0xNTkwIiwgIiIsICIiKV0KKyAgICAgIC8vW0lubGluZURhdGEoIldDUy0xNjAwIiwgIiIsICIiKV0KKyAgICAgIC8vW0lubGluZURhdGEoIldDUy0xNjEwIiwgIiIsICIiKV0KKworICAgICAgICBwdWJsaWMgdm9pZCBXQzAwNF9Db21wYXJlX1RvX1NlbGYoc3RyaW5nIHRlc3RJZCwgc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZURvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZSkpOworCisgICAgICAgICAgICB2YXIgcm9vdFRlbXBEaXIgPSBUZXN0VXRpbC5UZW1wRGlyOworICAgICAgICAgICAgdmFyIHRoaXNUZXN0VGVtcERpciA9IG5ldyBEaXJlY3RvcnlJbmZvKFBhdGguQ29tYmluZShyb290VGVtcERpci5GdWxsTmFtZSwgdGVzdElkKSk7CisgICAgICAgICAgICBpZiAodGhpc1Rlc3RUZW1wRGlyLkV4aXN0cykKKyAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShmYWxzZSwgIkR1cGxpY2F0ZSB0ZXN0IGlkPz8/Iik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhpc1Rlc3RUZW1wRGlyLkNyZWF0ZSgpOworCisgICAgICAgICAgICB2YXIgc291cmNlQ29waWVkVG9EZXN0RG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2VEb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLVNvdXJjZS5kb2N4IikpKTsKKyAgICAgICAgICAgIGlmICghc291cmNlQ29waWVkVG9EZXN0RG9jeC5FeGlzdHMpCisgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZURvY3guRnVsbE5hbWUsIHNvdXJjZUNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworCisgICAgICAgICAgICB2YXIgYmVmb3JlID0gc291cmNlQ29waWVkVG9EZXN0RG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIiIpOworICAgICAgICAgICAgdmFyIGRvY3hDb21wYXJlZEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0aGlzVGVzdFRlbXBEaXIuRnVsbE5hbWUsIGJlZm9yZSArICItQ09NUEFSRSIgKyAiLmRvY3giKSk7CisgICAgICAgICAgICB2YXIgZG9jeENvbXBhcmVkMkZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0aGlzVGVzdFRlbXBEaXIuRnVsbE5hbWUsIGJlZm9yZSArICItQ09NUEFSRTIiICsgIi5kb2N4IikpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCBzb3VyY2UxV21sID0gbmV3IFdtbERvY3VtZW50KHNvdXJjZUNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgV21sRG9jdW1lbnQgc291cmNlMldtbCA9IG5ldyBXbWxEb2N1bWVudChzb3VyY2VDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgV21sQ29tcGFyZXJTZXR0aW5ncygpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCBjb21wYXJlZFdtbCA9IFdtbENvbXBhcmVyLkNvbXBhcmUoc291cmNlMVdtbCwgc291cmNlMldtbCwgc2V0dGluZ3MpOworICAgICAgICAgICAgY29tcGFyZWRXbWwuU2F2ZUFzKGRvY3hDb21wYXJlZEZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFZhbGlkYXRlRG9jdW1lbnQoY29tcGFyZWRXbWwpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCBjb21wYXJlZFdtbDIgPSBXbWxDb21wYXJlci5Db21wYXJlKGNvbXBhcmVkV21sLCBzb3VyY2UxV21sLCBzZXR0aW5ncyk7CisgICAgICAgICAgICBjb21wYXJlZFdtbDIuU2F2ZUFzKGRvY3hDb21wYXJlZDJGaS5GdWxsTmFtZSk7CisgICAgICAgICAgICBWYWxpZGF0ZURvY3VtZW50KGNvbXBhcmVkV21sMik7CisgICAgICAgIH0KKworICAgICAgICBbVGhlb3J5XQorICAgICAgICBbSW5saW5lRGF0YSgiV0NJLTEwMDAiLCAiV0MvV0MwNDAtQ2FzZS1CZWZvcmUuZG9jeCIsICJXQy9XQzA0MC1DYXNlLUFmdGVyLmRvY3giLCAyKV0KKworICAgICAgICBwdWJsaWMgdm9pZCBXQzAwNV9Db21wYXJlX0Nhc2VJbnNlbnNpdGl2ZShzdHJpbmcgdGVzdElkLCBzdHJpbmcgbmFtZTEsIHN0cmluZyBuYW1lMiwgaW50IHJldmlzaW9uQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTFEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUxKSk7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UyRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lMikpOworCisgICAgICAgICAgICB2YXIgcm9vdFRlbXBEaXIgPSBUZXN0VXRpbC5UZW1wRGlyOworICAgICAgICAgICAgdmFyIHRoaXNUZXN0VGVtcERpciA9IG5ldyBEaXJlY3RvcnlJbmZvKFBhdGguQ29tYmluZShyb290VGVtcERpci5GdWxsTmFtZSwgdGVzdElkKSk7CisgICAgICAgICAgICBpZiAodGhpc1Rlc3RUZW1wRGlyLkV4aXN0cykKKyAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShmYWxzZSwgIkR1cGxpY2F0ZSB0ZXN0IGlkPz8/Iik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhpc1Rlc3RUZW1wRGlyLkNyZWF0ZSgpOworCisgICAgICAgICAgICB2YXIgc291cmNlMUNvcGllZFRvRGVzdERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHRoaXNUZXN0VGVtcERpci5GdWxsTmFtZSwgc291cmNlMURvY3guTmFtZSkpOworICAgICAgICAgICAgdmFyIHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0aGlzVGVzdFRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZTJEb2N4Lk5hbWUpKTsKKyAgICAgICAgICAgIGlmICghc291cmNlMUNvcGllZFRvRGVzdERvY3guRXhpc3RzKQorICAgICAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2UxRG9jeC5GdWxsTmFtZSwgc291cmNlMUNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgaWYgKCFzb3VyY2UyQ29waWVkVG9EZXN0RG9jeC5FeGlzdHMpCisgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZTJEb2N4LkZ1bGxOYW1lLCBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeC5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIGlmIChzX09wZW5Xb3JkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTFEb2N4Rm9yV29yZCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lMSkpOworICAgICAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTJEb2N4Rm9yV29yZCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lMikpOworCisgICAgICAgICAgICAgICAgdmFyIHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4Rm9yV29yZCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2UxRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi1Gb3ItV29yZC5kb2N4IikpKTsKKyAgICAgICAgICAgICAgICB2YXIgc291cmNlMkNvcGllZFRvRGVzdERvY3hGb3JXb3JkID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0aGlzVGVzdFRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZTJEb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLUZvci1Xb3JkLmRvY3giKSkpOworICAgICAgICAgICAgICAgIGlmICghc291cmNlMUNvcGllZFRvRGVzdERvY3hGb3JXb3JkLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZTFEb2N4LkZ1bGxOYW1lLCBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeEZvcldvcmQuRnVsbE5hbWUpOworICAgICAgICAgICAgICAgIGlmICghc291cmNlMkNvcGllZFRvRGVzdERvY3hGb3JXb3JkLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZTJEb2N4LkZ1bGxOYW1lLCBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeEZvcldvcmQuRnVsbE5hbWUpOworCisgICAgICAgICAgICAgICAgRmlsZUluZm8gd29yZEV4ZSA9IG5ldyBGaWxlSW5mbyhAIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IE9mZmljZVxyb290XE9mZmljZTE2XFdJTldPUkQuRVhFIik7CisgICAgICAgICAgICAgICAgdmFyIHBhdGggPSBuZXcgRGlyZWN0b3J5SW5mbyhAIkM6XFVzZXJzXEVyaWNcRG9jdW1lbnRzXFdpbmRvd3NQb3dlclNoZWxsTW9kdWxlc1xPcGVuLVhtbC1Qb3dlclRvb2xzXFRlc3RGaWxlcyIpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeEZvcldvcmQpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeEZvcldvcmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICB2YXIgYmVmb3JlID0gc291cmNlMUNvcGllZFRvRGVzdERvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICIiKTsKKyAgICAgICAgICAgIHZhciBhZnRlciA9IHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiIik7CisgICAgICAgICAgICB2YXIgZG9jeFdpdGhSZXZpc2lvbnNGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBiZWZvcmUgKyAiLUNPTVBBUkUtIiArIGFmdGVyICsgIi5kb2N4IikpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCBzb3VyY2UxV21sID0gbmV3IFdtbERvY3VtZW50KHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHNvdXJjZTJXbWwgPSBuZXcgV21sRG9jdW1lbnQoc291cmNlMkNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBXbWxDb21wYXJlclNldHRpbmdzKCk7CisgICAgICAgICAgICBzZXR0aW5ncy5DYXNlSW5zZW5zaXRpdmUgPSB0cnVlOworICAgICAgICAgICAgc2V0dGluZ3MuQ3VsdHVyZUluZm8gPSBTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZTsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IGNvbXBhcmVkV21sID0gV21sQ29tcGFyZXIuQ29tcGFyZShzb3VyY2UxV21sLCBzb3VyY2UyV21sLCBzZXR0aW5ncyk7CisgICAgICAgICAgICBjb21wYXJlZFdtbC5TYXZlQXMoZG9jeFdpdGhSZXZpc2lvbnNGaS5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXMuV3JpdGUoY29tcGFyZWRXbWwuRG9jdW1lbnRCeXRlQXJyYXksIDAsIGNvbXBhcmVkV21sLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtcywgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPcGVuWG1sVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBPcGVuWG1sVmFsaWRhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBlcnJvcnMgPSB2YWxpZGF0b3IuVmFsaWRhdGUod0RvYykuV2hlcmUoZSA9PiAhRXhwZWN0ZWRFcnJvcnMuQ29udGFpbnMoZS5EZXNjcmlwdGlvbikpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLkNvdW50KCkgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmQgPSAiICAiOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlcnIgaW4gZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworI2lmIHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIkVycm9yIiArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpbmQgKyAiRXJyb3JUeXBlOiAiICsgZXJyLkVycm9yVHlwZS5Ub1N0cmluZygpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJEZXNjcmlwdGlvbjogIiArIGVyci5EZXNjcmlwdGlvbiArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpbmQgKyAiUGFydDogIiArIGVyci5QYXJ0LlVyaS5Ub1N0cmluZygpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJYUGF0aDogIiArIGVyci5QYXRoLlhQYXRoICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIgICAgICAgICAgICBcIiIgKyBlcnIuRGVzY3JpcHRpb24gKyAiXCIsIiArIEVudmlyb25tZW50Lk5ld0xpbmUpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgiIiwgc2JzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgaWYgKHNfT3BlbldvcmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZUluZm8gd29yZEV4ZSA9IG5ldyBGaWxlSW5mbyhAIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IE9mZmljZVxyb290XE9mZmljZTE2XFdJTldPUkQuRVhFIik7CisgICAgICAgICAgICAgICAgV29yZFJ1bm5lci5SdW5Xb3JkKHdvcmRFeGUsIGRvY3hXaXRoUmV2aXNpb25zRmkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICBXbWxEb2N1bWVudCByZXZpc2lvbldtbCA9IG5ldyBXbWxEb2N1bWVudChkb2N4V2l0aFJldmlzaW9uc0ZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIHZhciByZXZpc2lvbnMgPSBXbWxDb21wYXJlci5HZXRSZXZpc2lvbnMocmV2aXNpb25XbWwsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbChyZXZpc2lvbkNvdW50LCByZXZpc2lvbnMuQ291bnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFZhbGlkYXRlRG9jdW1lbnQoV21sRG9jdW1lbnQgd21sVG9WYWxpZGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtcy5Xcml0ZSh3bWxUb1ZhbGlkYXRlLkRvY3VtZW50Qnl0ZUFycmF5LCAwLCB3bWxUb1ZhbGlkYXRlLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtcywgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPcGVuWG1sVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBPcGVuWG1sVmFsaWRhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBlcnJvcnMgPSB2YWxpZGF0b3IuVmFsaWRhdGUod0RvYykuV2hlcmUoZSA9PiAhRXhwZWN0ZWRFcnJvcnMuQ29udGFpbnMoZS5EZXNjcmlwdGlvbikpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLkNvdW50KCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZCA9ICIgICI7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVyciBpbiBlcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisjaWYgdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiRXJyb3IiICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJFcnJvclR5cGU6ICIgKyBlcnIuRXJyb3JUeXBlLlRvU3RyaW5nKCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kICsgIkRlc2NyaXB0aW9uOiAiICsgZXJyLkRlc2NyaXB0aW9uICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJQYXJ0OiAiICsgZXJyLlBhcnQuVXJpLlRvU3RyaW5nKCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kICsgIlhQYXRoOiAiICsgZXJyLlBhdGguWFBhdGggKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiAgICAgICAgICAgIFwiIiArIGVyci5EZXNjcmlwdGlvbiArICJcIiwiICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNicyA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoIiIsIHNicyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZ1tdIEV4cGVjdGVkRXJyb3JzID0gbmV3IHN0cmluZ1tdIHsKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpmaXJzdFJvdycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmxhc3RSb3cnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpmaXJzdENvbHVtbicgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmxhc3RDb2x1bW4nIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpub0hCYW5kJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46bm9WQmFuZCcgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmFsbFN0eWxlcycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmN1c3RvbVN0eWxlcycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmxhdGVudFN0eWxlcycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOnN0eWxlc0luVXNlJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46aGVhZGluZ1N0eWxlcycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOm51bWJlcmluZ1N0eWxlcycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOnRhYmxlU3R5bGVzJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46ZGlyZWN0Rm9ybWF0dGluZ09uUnVucycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmRpcmVjdEZvcm1hdHRpbmdPblBhcmFncmFwaHMnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpkaXJlY3RGb3JtYXR0aW5nT25OdW1iZXJpbmcnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpkaXJlY3RGb3JtYXR0aW5nT25UYWJsZXMnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpjbGVhckZvcm1hdHRpbmcnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjp0b3AzSGVhZGluZ1N0eWxlcycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOnZpc2libGVTdHlsZXMnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjphbHRlcm5hdGVTdHlsZU5hbWVzJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlIGF0dHJpYnV0ZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOnZhbCcgaGFzIGludmFsaWQgdmFsdWUgJzAnLiBUaGUgTWluSW5jbHVzaXZlIGNvbnN0cmFpbnQgZmFpbGVkLiBUaGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4iLAorICAgICAgICAgICAgIlRoZSBhdHRyaWJ1dGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjp2YWwnIGhhcyBpbnZhbGlkIHZhbHVlICcwJy4gVGhlIE1pbkluY2x1c2l2ZSBjb25zdHJhaW50IGZhaWxlZC4gVGhlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDIuIiwKKyAgICAgICAgICAgICJUaGUgJ3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZTpnZnhkYXRhJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46ZmlsbCcgYXR0cmlidXRlIGlzIGludmFsaWQgLSBUaGUgdmFsdWUgJzAnIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8gYW55IG9mIHRoZSBtZW1iZXJUeXBlcyBvZiB0aGUgdW5pb24uIiwKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBXb3JkUnVubmVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUnVuV29yZChGaWxlSW5mbyBleGVjdXRhYmxlUGF0aCwgRmlsZUluZm8gZG9jeFBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChleGVjdXRhYmxlUGF0aC5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFByb2Nlc3MgcHJvYyA9IG5ldyBQcm9jZXNzKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm9jLlN0YXJ0SW5mby5GaWxlTmFtZSA9IGV4ZWN1dGFibGVQYXRoLkZ1bGxOYW1lOworICAgICAgICAgICAgICAgICAgICBwcm9jLlN0YXJ0SW5mby5Bcmd1bWVudHMgPSBkb2N4UGF0aC5GdWxsTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgcHJvYy5TdGFydEluZm8uV29ya2luZ0RpcmVjdG9yeSA9IGRvY3hQYXRoLkRpcmVjdG9yeU5hbWU7CisgICAgICAgICAgICAgICAgICAgIHByb2MuU3RhcnRJbmZvLlVzZVNoZWxsRXhlY3V0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBwcm9jLlN0YXJ0SW5mby5SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcHJvYy5TdGFydEluZm8uUmVkaXJlY3RTdGFuZGFyZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcHJvYy5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZXhlY3V0YWJsZSBwYXRoLiIsICJleGVjdXRhYmxlUGF0aCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL1dtbENvbXBhcmVyVGVzdHMyLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMuVGVzdHMvV21sQ29tcGFyZXJUZXN0czIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzOGQ3YwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL1dtbENvbXBhcmVyVGVzdHMyLmNzCkBAIC0wLDAgKzEsMTAwMiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIEVyaWMgV2hpdGUgMjAxNi4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vRXJpY1doaXRlLmNvbQorUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vZXJpY3doaXRlLmNvbS9ibG9nL2Jsb2cvb3Blbi14bWwtcG93ZXJ0b29scy1kZXZlbG9wZXItY2VudGVyLworCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uRHJhd2luZy5JbWFnaW5nOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuVmFsaWRhdGlvbjsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOwordXNpbmcgWHVuaXQ7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CisKKyNpZiAhRUxJREVfWFVOSVRfVEVTVFMKKworbmFtZXNwYWNlIE94UHQKK3sKKyAgICBwdWJsaWMgY2xhc3MgV2NUZXN0czIKKyAgICB7CisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBtX09wZW5Xb3JkID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBtX09wZW5UZW1wRGlySW5FeHBsb3JlciA9IGZhbHNlOworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIFtUaGVvcnldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0xMDAwIiwgIkNaL0NaMDAxLVBsYWluLmRvY3giLCAiQ1ovQ1owMDEtUGxhaW4tTW9kLmRvY3giLCAxKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTEwMTAiLCAiQ1ovQ1owMDItTXVsdGktUGFyYWdyYXBocy5kb2N4IiwgIkNaL0NaMDAyLU11bHRpLVBhcmFncmFwaHMtTW9kLmRvY3giLCAxKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTEwMjAiLCAiQ1ovQ1owMDMtTXVsdGktUGFyYWdyYXBocy5kb2N4IiwgIkNaL0NaMDAzLU11bHRpLVBhcmFncmFwaHMtTW9kLmRvY3giLCAxKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTEwMzAiLCAiQ1ovQ1owMDQtTXVsdGktUGFyYWdyYXBocy1pbi1DZWxsLmRvY3giLCAiQ1ovQ1owMDQtTXVsdGktUGFyYWdyYXBocy1pbi1DZWxsLU1vZC5kb2N4IiwgMSldCisgICAgICAgIHB1YmxpYyB2b2lkIENaMDAxX0NvbXBhcmVUcmFja2VkSW5QcmV2KHN0cmluZyB0ZXN0SWQsIHN0cmluZyBuYW1lMSwgc3RyaW5nIG5hbWUyLCBpbnQgcmV2aXNpb25Db3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byBrZWVwIHRoZSByZXZpc2lvbiBjb3VudCBwYXJhbWV0ZXI/CisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoMSwgcmV2aXNpb25Db3VudCk7CisKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTFEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUxKSk7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UyRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lMikpOworCisgICAgICAgICAgICB2YXIgcm9vdFRlbXBEaXIgPSBUZXN0VXRpbC5UZW1wRGlyOworICAgICAgICAgICAgdmFyIHRoaXNUZXN0VGVtcERpciA9IG5ldyBEaXJlY3RvcnlJbmZvKFBhdGguQ29tYmluZShyb290VGVtcERpci5GdWxsTmFtZSwgdGVzdElkKSk7CisgICAgICAgICAgICBpZiAodGhpc1Rlc3RUZW1wRGlyLkV4aXN0cykKKyAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShmYWxzZSwgIkR1cGxpY2F0ZSB0ZXN0IGlkPz8/Iik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhpc1Rlc3RUZW1wRGlyLkNyZWF0ZSgpOworICAgICAgICAgICAgdmFyIHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0aGlzVGVzdFRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZTFEb2N4Lk5hbWUpKTsKKyAgICAgICAgICAgIHZhciBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2UyRG9jeC5OYW1lKSk7CisgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlMURvY3guRnVsbE5hbWUsIHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2UyRG9jeC5GdWxsTmFtZSwgc291cmNlMkNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworCisgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgICAgICBpZiAobV9PcGVuV29yZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UxRG9jeEZvcldvcmQgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTEpKTsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UyRG9jeEZvcldvcmQgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTIpKTsKKworICAgICAgICAgICAgICAgIHZhciBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeEZvcldvcmQgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHRoaXNUZXN0VGVtcERpci5GdWxsTmFtZSwgc291cmNlMURvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICItRm9yLVdvcmQuZG9jeCIpKSk7CisgICAgICAgICAgICAgICAgdmFyIHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4Rm9yV29yZCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2UyRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi1Gb3ItV29yZC5kb2N4IikpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4Rm9yV29yZC5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2UxRG9jeC5GdWxsTmFtZSwgc291cmNlMUNvcGllZFRvRGVzdERvY3hGb3JXb3JkLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4Rm9yV29yZC5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2UyRG9jeC5GdWxsTmFtZSwgc291cmNlMkNvcGllZFRvRGVzdERvY3hGb3JXb3JkLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgICAgIEZpbGVJbmZvIHdvcmRFeGUgPSBuZXcgRmlsZUluZm8oQCJDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBPZmZpY2Vccm9vdFxPZmZpY2UxNlxXSU5XT1JELkVYRSIpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeEZvcldvcmQpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeEZvcldvcmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgICAgICB2YXIgYmVmb3JlID0gc291cmNlMUNvcGllZFRvRGVzdERvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICIiKTsKKyAgICAgICAgICAgIHZhciBhZnRlciA9IHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiIik7CisgICAgICAgICAgICB2YXIgZG9jeFdpdGhSZXZpc2lvbnNGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBiZWZvcmUgKyAiLUNPTVBBUkUtIiArIGFmdGVyICsgIi5kb2N4IikpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCBzb3VyY2UxV21sID0gbmV3IFdtbERvY3VtZW50KHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHNvdXJjZTJXbWwgPSBuZXcgV21sRG9jdW1lbnQoc291cmNlMkNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBXbWxDb21wYXJlclNldHRpbmdzKCk7CisgICAgICAgICAgICBzZXR0aW5ncy5EZWJ1Z1RlbXBGaWxlRGkgPSB0aGlzVGVzdFRlbXBEaXI7CisgICAgICAgICAgICBXbWxEb2N1bWVudCBjb21wYXJlZFdtbCA9IFdtbENvbXBhcmVyLkNvbXBhcmUoc291cmNlMVdtbCwgc291cmNlMldtbCwgc2V0dGluZ3MpOworCisgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIGNvbXBhcmVkV21sLlNhdmVBcyhkb2N4V2l0aFJldmlzaW9uc0ZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXMuV3JpdGUoY29tcGFyZWRXbWwuRG9jdW1lbnRCeXRlQXJyYXksIDAsIGNvbXBhcmVkV21sLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtcywgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPcGVuWG1sVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBPcGVuWG1sVmFsaWRhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBlcnJvcnMgPSB2YWxpZGF0b3IuVmFsaWRhdGUod0RvYykuV2hlcmUoZSA9PiAhRXhwZWN0ZWRFcnJvcnMuQ29udGFpbnMoZS5EZXNjcmlwdGlvbikpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLkNvdW50KCkgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmQgPSAiICAiOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlcnIgaW4gZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiRXJyb3IiICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJFcnJvclR5cGU6ICIgKyBlcnIuRXJyb3JUeXBlLlRvU3RyaW5nKCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kICsgIkRlc2NyaXB0aW9uOiAiICsgZXJyLkRlc2NyaXB0aW9uICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJQYXJ0OiAiICsgZXJyLlBhcnQuVXJpLlRvU3RyaW5nKCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kICsgIlhQYXRoOiAiICsgZXJyLlBhdGguWFBhdGggKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYnMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNicyAhPSAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShmYWxzZSwgc2JzLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgICAgICBpZiAobV9PcGVuV29yZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyB3b3JkRXhlID0gbmV3IEZpbGVJbmZvKEAiQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgT2ZmaWNlXHJvb3RcT2ZmaWNlMTZcV0lOV09SRC5FWEUiKTsKKyAgICAgICAgICAgICAgICBXb3JkUnVubmVyLlJ1bldvcmQod29yZEV4ZSwgZG9jeFdpdGhSZXZpc2lvbnNGaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAvLyBPcGVuIFdpbmRvd3MgRXhwbG9yZXIKKyAgICAgICAgICAgIGlmIChtX09wZW5UZW1wRGlySW5FeHBsb3JlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vIENPREUgVE8gUkVQRUFUIFVOVElMIFNVQ0NFU1MgLy8vLy8vLy8vLworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbWFwaG9yRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsICJ6X0V4cGxvcmVyT3BlbmVkU2VtYXBob3JlLnR4dCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VtYXBob3JGaS5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoc2VtYXBob3JGaS5GdWxsTmFtZSwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLkV4cGxvcmVyKHRoaXNUZXN0VGVtcERpcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcCg1MCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjaWYgZmFsc2UKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHJldmlzaW9uV21sID0gbmV3IFdtbERvY3VtZW50KGRvY3hXaXRoUmV2aXNpb25zRmkuRnVsbE5hbWUpOworICAgICAgICAgICAgdmFyIHJldmlzaW9ucyA9IFdtbENvbXBhcmVyLkdldFJldmlzaW9ucyhyZXZpc2lvbldtbCwgc2V0dGluZ3MpOworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKHJldmlzaW9uQ291bnQsIHJldmlzaW9ucy5Db3VudCgpKTsKKyNlbmRpZgorICAgICAgICB9CisKKyNpZiBmYWxzZQorICAgICAgICBbVGhlb3J5XQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjAwMCIsICJDQTAwMS1QbGFpbi5kb2N4IiwgIkNBMDAxLVBsYWluLU1vZC5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yMDEwIiwgIldDMDAxLURpZ2l0cy5kb2N4IiwgIldDMDAxLURpZ2l0cy1Nb2QuZG9jeCIsIDQpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjAyMCIsICJXQzAwMS1EaWdpdHMuZG9jeCIsICJXQzAwMS1EaWdpdHMtRGVsZXRlZC1QYXJhZ3JhcGguZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjAzMCIsICJXQzAwMS1EaWdpdHMtRGVsZXRlZC1QYXJhZ3JhcGguZG9jeCIsICJXQzAwMS1EaWdpdHMuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjA0MCIsICJXQzAwMi1Vbm1vZGlmaWVkLmRvY3giLCAiV0MwMDItRGlmZkluTWlkZGxlLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTIwNTAiLCAiV0MwMDItVW5tb2RpZmllZC5kb2N4IiwgIldDMDAyLURpZmZBdEJlZ2lubmluZy5kb2N4IiwgMildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yMDYwIiwgIldDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQzAwMi1EZWxldGVBdEJlZ2lubmluZy5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yMDcwIiwgIldDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQzAwMi1JbnNlcnRBdEJlZ2lubmluZy5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yMDgwIiwgIldDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQzAwMi1JbnNlcnRBdEVuZC5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yMDgwIiwgIldDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQzAwMi1EZWxldGVBdEVuZC5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yMTAwIiwgIldDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQzAwMi1EZWxldGVJbk1pZGRsZS5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yMTEwIiwgIldDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQzAwMi1JbnNlcnRJbk1pZGRsZS5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yMTIwIiwgIldDMDAyLURlbGV0ZUluTWlkZGxlLmRvY3giLCAiV0MwMDItVW5tb2RpZmllZC5kb2N4IiwgMSldCisgICAgICAgIC8vW0lubGluZURhdGEoIkNaLTIxMzAiLCAiV0MwMDQtTGFyZ2UuZG9jeCIsICJXQzAwNC1MYXJnZS1Nb2QuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjE0MCIsICJXQzAwNi1UYWJsZS5kb2N4IiwgIldDMDA2LVRhYmxlLURlbGV0ZS1Sb3cuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjE1MCIsICJXQzAwNi1UYWJsZS1EZWxldGUtUm93LmRvY3giLCAiV0MwMDYtVGFibGUuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjE2MCIsICJXQzAwNi1UYWJsZS5kb2N4IiwgIldDMDA2LVRhYmxlLURlbGV0ZS1Db250ZXN0cy1vZi1Sb3cuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjE3MCIsICJXQzAwNy1Vbm1vZGlmaWVkLmRvY3giLCAiV0MwMDctTG9uZ2VzdC1BdC1FbmQuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjE4MCIsICJXQzAwNy1Vbm1vZGlmaWVkLmRvY3giLCAiV0MwMDctRGVsZXRlZC1hdC1CZWdpbm5pbmctb2YtUGFyYS5kb2N4IiwgMildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yMjAwIiwgIldDMDA3LVVubW9kaWZpZWQuZG9jeCIsICJXQzAwNy1Nb3ZlZC1pbnRvLVRhYmxlLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTIyMTAiLCAiV0MwMDktVGFibGUtVW5tb2RpZmllZC5kb2N4IiwgIldDMDA5LVRhYmxlLUNlbGwtMS0xLU1vZC5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yMjIwIiwgIldDMDEwLVBhcmEtQmVmb3JlLVRhYmxlLVVubW9kaWZpZWQuZG9jeCIsICJXQzAxMC1QYXJhLUJlZm9yZS1UYWJsZS1Nb2QuZG9jeCIsIDMpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjIzMCIsICJXQzAxMS1CZWZvcmUuZG9jeCIsICJXQzAxMS1BZnRlci5kb2N4IiwgMildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yMjQwIiwgIldDMDEyLU1hdGgtQmVmb3JlLmRvY3giLCAiV0MwMTItTWF0aC1BZnRlci5kb2N4IiwgMildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yMjUwIiwgIldDMDEzLUltYWdlLUJlZm9yZS5kb2N4IiwgIldDMDEzLUltYWdlLUFmdGVyLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTIyNjAiLCAiV0MwMTMtSW1hZ2UtQmVmb3JlLmRvY3giLCAiV0MwMTMtSW1hZ2UtQWZ0ZXIyLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTIyNzAiLCAiV0MwMTMtSW1hZ2UtQmVmb3JlMi5kb2N4IiwgIldDMDEzLUltYWdlLUFmdGVyMi5kb2N4IiwgMildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yMjgwIiwgIldDMDE0LVNtYXJ0QXJ0LUJlZm9yZS5kb2N4IiwgIldDMDE0LVNtYXJ0QXJ0LUFmdGVyLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTIzMDAiLCAiV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1CZWZvcmUuZG9jeCIsICJXQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLUFmdGVyLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTIzMTAiLCAiV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1CZWZvcmUuZG9jeCIsICJXQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLURlbGV0ZWQtQWZ0ZXIuZG9jeCIsIDMpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjMyMCIsICJXQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLUJlZm9yZS5kb2N4IiwgIldDMDE0LVNtYXJ0QXJ0LVdpdGgtSW1hZ2UtRGVsZXRlZC1BZnRlcjIuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjMzMCIsICJXQzAxNS1UaHJlZS1QYXJhZ3JhcGhzLmRvY3giLCAiV0MwMTUtVGhyZWUtUGFyYWdyYXBocy1BZnRlci5kb2N4IiwgMyldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yMzQwIiwgIldDMDE2LVBhcmEtSW1hZ2UtUGFyYS5kb2N4IiwgIldDMDE2LVBhcmEtSW1hZ2UtUGFyYS13LURlbGV0ZWQtSW1hZ2UuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjM1MCIsICJXQzAxNy1JbWFnZS5kb2N4IiwgIldDMDE3LUltYWdlLUFmdGVyLmRvY3giLCAzKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTIzNjAiLCAiV0MwMTgtRmllbGQtU2ltcGxlLUJlZm9yZS5kb2N4IiwgIldDMDE4LUZpZWxkLVNpbXBsZS1BZnRlci0xLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTIzNzAiLCAiV0MwMTgtRmllbGQtU2ltcGxlLUJlZm9yZS5kb2N4IiwgIldDMDE4LUZpZWxkLVNpbXBsZS1BZnRlci0yLmRvY3giLCAzKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTIzODAiLCAiV0MwMTktSHlwZXJsaW5rLUJlZm9yZS5kb2N4IiwgIldDMDE5LUh5cGVybGluay1BZnRlci0xLmRvY3giLCAzKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTI0MDAiLCAiV0MwMTktSHlwZXJsaW5rLUJlZm9yZS5kb2N4IiwgIldDMDE5LUh5cGVybGluay1BZnRlci0yLmRvY3giLCA1KV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTI0MTAiLCAiV0MwMjAtRm9vdE5vdGUtQmVmb3JlLmRvY3giLCAiV0MwMjAtRm9vdE5vdGUtQWZ0ZXItMS5kb2N4IiwgMyldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yNDIwIiwgIldDMDIwLUZvb3ROb3RlLUJlZm9yZS5kb2N4IiwgIldDMDIwLUZvb3ROb3RlLUFmdGVyLTIuZG9jeCIsIDUpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjQzMCIsICJXQzAyMS1NYXRoLUJlZm9yZS0xLmRvY3giLCAiV0MwMjEtTWF0aC1BZnRlci0xLmRvY3giLCA5KV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTI0NDAiLCAiV0MwMjEtTWF0aC1CZWZvcmUtMi5kb2N4IiwgIldDMDIxLU1hdGgtQWZ0ZXItMi5kb2N4IiwgNildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yNDUwIiwgIldDMDIyLUltYWdlLU1hdGgtUGFyYS1CZWZvcmUuZG9jeCIsICJXQzAyMi1JbWFnZS1NYXRoLVBhcmEtQWZ0ZXIuZG9jeCIsIDIyKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTI0NjAiLCAiV0MwMjMtVGFibGUtNC1Sb3ctSW1hZ2UtQmVmb3JlLmRvY3giLCAiV0MwMjMtVGFibGUtNC1Sb3ctSW1hZ2UtQWZ0ZXItRGVsZXRlLTEtUm93LmRvY3giLCA5KV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTI0NzAiLCAiV0MwMjQtVGFibGUtQmVmb3JlLmRvY3giLCAiV0MwMjQtVGFibGUtQWZ0ZXIuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjQ4MCIsICJXQzAyNC1UYWJsZS1CZWZvcmUuZG9jeCIsICJXQzAyNC1UYWJsZS1BZnRlcjIuZG9jeCIsIDcpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjUwMCIsICJXQzAyNS1TaW1wbGUtVGFibGUtQmVmb3JlLmRvY3giLCAiV0MwMjUtU2ltcGxlLVRhYmxlLUFmdGVyLmRvY3giLCA0KV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTI1MTAiLCAiV0MwMjYtTG9uZy1UYWJsZS1CZWZvcmUuZG9jeCIsICJXQzAyNi1Mb25nLVRhYmxlLUFmdGVyLTEuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjUyMCIsICJXQzAyNy1Ud2VudHktUGFyYXMtQmVmb3JlLmRvY3giLCAiV0MwMjctVHdlbnR5LVBhcmFzLUFmdGVyLTEuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjUzMCIsICJXQzAyNy1Ud2VudHktUGFyYXMtQWZ0ZXItMS5kb2N4IiwgIldDMDI3LVR3ZW50eS1QYXJhcy1CZWZvcmUuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjU0MCIsICJXQzAyNy1Ud2VudHktUGFyYXMtQmVmb3JlLmRvY3giLCAiV0MwMjctVHdlbnR5LVBhcmFzLUFmdGVyLTIuZG9jeCIsIDQpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjU1MCIsICJXQzAzMC1JbWFnZS1NYXRoLUJlZm9yZS5kb2N4IiwgIldDMDMwLUltYWdlLU1hdGgtQWZ0ZXIuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjU2MCIsICJXQzAzMS1Ud28tTWF0aHMtQmVmb3JlLmRvY3giLCAiV0MwMzEtVHdvLU1hdGhzLUFmdGVyLmRvY3giLCA0KV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTI1NzAiLCAiV0MwMzItUGFyYS13aXRoLVBhcmEtUHJvcHMuZG9jeCIsICJXQzAzMi1QYXJhLXdpdGgtUGFyYS1Qcm9wcy1BZnRlci5kb2N4IiwgMyldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yNTgwIiwgIldDMDMzLU1lcmdlZC1DZWxscy1CZWZvcmUuZG9jeCIsICJXQzAzMy1NZXJnZWQtQ2VsbHMtQWZ0ZXIxLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTI2MDAiLCAiV0MwMzMtTWVyZ2VkLUNlbGxzLUJlZm9yZS5kb2N4IiwgIldDMDMzLU1lcmdlZC1DZWxscy1BZnRlcjIuZG9jeCIsIDQpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjYxMCIsICJXQzAzNC1Gb290bm90ZXMtQmVmb3JlLmRvY3giLCAiV0MwMzQtRm9vdG5vdGVzLUFmdGVyMS5kb2N4IiwgMSldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yNjIwIiwgIldDMDM0LUZvb3Rub3Rlcy1CZWZvcmUuZG9jeCIsICJXQzAzNC1Gb290bm90ZXMtQWZ0ZXIyLmRvY3giLCA2KV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTI2MzAiLCAiV0MwMzQtRm9vdG5vdGVzLUJlZm9yZS5kb2N4IiwgIldDMDM0LUZvb3Rub3Rlcy1BZnRlcjMuZG9jeCIsIDMpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjY0MCIsICJXQzAzNC1Gb290bm90ZXMtQWZ0ZXIzLmRvY3giLCAiV0MwMzQtRm9vdG5vdGVzLUJlZm9yZS5kb2N4IiwgMyldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yNjUwIiwgIldDMDM1LUZvb3Rub3RlLUJlZm9yZS5kb2N4IiwgIldDMDM1LUZvb3Rub3RlLUFmdGVyLmRvY3giLCAyKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTI2NjAiLCAiV0MwMzUtRm9vdG5vdGUtQWZ0ZXIuZG9jeCIsICJXQzAzNS1Gb290bm90ZS1CZWZvcmUuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjY3MCIsICJXQzAzNi1Gb290bm90ZS1XaXRoLVRhYmxlLUJlZm9yZS5kb2N4IiwgIldDMDM2LUZvb3Rub3RlLVdpdGgtVGFibGUtQWZ0ZXIuZG9jeCIsIDUpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjY4MCIsICJXQzAzNi1Gb290bm90ZS1XaXRoLVRhYmxlLUFmdGVyLmRvY3giLCAiV0MwMzYtRm9vdG5vdGUtV2l0aC1UYWJsZS1CZWZvcmUuZG9jeCIsIDUpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjcwMCIsICJXQzAzNC1FbmRub3Rlcy1CZWZvcmUuZG9jeCIsICJXQzAzNC1FbmRub3Rlcy1BZnRlcjEuZG9jeCIsIDEpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjcxMCIsICJXQzAzNC1FbmRub3Rlcy1CZWZvcmUuZG9jeCIsICJXQzAzNC1FbmRub3Rlcy1BZnRlcjIuZG9jeCIsIDYpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjcyMCIsICJXQzAzNC1FbmRub3Rlcy1CZWZvcmUuZG9jeCIsICJXQzAzNC1FbmRub3Rlcy1BZnRlcjMuZG9jeCIsIDgpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjczMCIsICJXQzAzNC1FbmRub3Rlcy1BZnRlcjMuZG9jeCIsICJXQzAzNC1FbmRub3Rlcy1CZWZvcmUuZG9jeCIsIDgpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjc0MCIsICJXQzAzNS1FbmRub3RlLUJlZm9yZS5kb2N4IiwgIldDMDM1LUVuZG5vdGUtQWZ0ZXIuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjc1MCIsICJXQzAzNS1FbmRub3RlLUFmdGVyLmRvY3giLCAiV0MwMzUtRW5kbm90ZS1CZWZvcmUuZG9jeCIsIDIpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ1otMjc2MCIsICJXQzAzNi1FbmRub3RlLVdpdGgtVGFibGUtQmVmb3JlLmRvY3giLCAiV0MwMzYtRW5kbm90ZS1XaXRoLVRhYmxlLUFmdGVyLmRvY3giLCA2KV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTI3NzAiLCAiV0MwMzYtRW5kbm90ZS1XaXRoLVRhYmxlLUFmdGVyLmRvY3giLCAiV0MwMzYtRW5kbm90ZS1XaXRoLVRhYmxlLUJlZm9yZS5kb2N4IiwgNildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yNzgwIiwgIldDMDM4LURvY3VtZW50LVdpdGgtQlItQmVmb3JlLmRvY3giLCAiV0MwMzgtRG9jdW1lbnQtV2l0aC1CUi1BZnRlci5kb2N4IiwgMildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yNzkwIiwgIlJDMDAxLUJlZm9yZS5kb2N4IiwgIlJDMDAxLUFmdGVyMS5kb2N4IiwgMildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDWi0yODAwIiwgIlJDMDAyLUltYWdlLmRvY3giLCAiUkMwMDItSW1hZ2UtQWZ0ZXIxLmRvY3giLCAxKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNaLTI4MTAiLCAiV0MwMzktQnJlYWstSW4tUm93LmRvY3giLCAiV0MwMzktQnJlYWstSW4tUm93LUFmdGVyMS5kb2N4IiwgMSldCisgICAgICAgIC8vW0lubGluZURhdGEoIkNaLTI4MjAiLCAiIiwgIiIsIDApXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCJDWi0yODMwIiwgIiIsICIiLCAwKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiQ1otMjg0MCIsICIiLCAiIiwgMCldCisgICAgICAgIC8vW0lubGluZURhdGEoIkNaLTI4NTAiLCAiIiwgIiIsIDApXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCJDWi0yODYwIiwgIiIsICIiLCAwKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiQ1otMjg3MCIsICIiLCAiIiwgMCldCisgICAgICAgIC8vW0lubGluZURhdGEoIkNaLTI4ODAiLCAiIiwgIiIsIDApXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCJDWi0yODkwIiwgIiIsICIiLCAwKV0KKyAgICAgICAgcHVibGljIHZvaWQgQ1owMDJfQ29tcGFyZShzdHJpbmcgdGVzdElkLCBzdHJpbmcgbmFtZTEsIHN0cmluZyBuYW1lMiwgaW50IHJldmlzaW9uQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTFEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUxKSk7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UyRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lMikpOworCisgICAgICAgICAgICB2YXIgcm9vdFRlbXBEaXIgPSBUZXN0VXRpbC5UZW1wRGlyOworICAgICAgICAgICAgdmFyIHRoaXNUZXN0VGVtcERpciA9IG5ldyBEaXJlY3RvcnlJbmZvKFBhdGguQ29tYmluZShyb290VGVtcERpci5GdWxsTmFtZSwgdGVzdElkKSk7CisgICAgICAgICAgICBpZiAoIXRoaXNUZXN0VGVtcERpci5FeGlzdHMpCisgICAgICAgICAgICAgICAgdGhpc1Rlc3RUZW1wRGlyLkNyZWF0ZSgpOworICAgICAgICAgICAgdmFyIHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0aGlzVGVzdFRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZTFEb2N4Lk5hbWUpKTsKKyAgICAgICAgICAgIHZhciBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2UyRG9jeC5OYW1lKSk7CisgICAgICAgICAgICBpZiAoIXNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkV4aXN0cykKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlMURvY3guRnVsbE5hbWUsIHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIGlmICghc291cmNlMkNvcGllZFRvRGVzdERvY3guRXhpc3RzKQorICAgICAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2UyRG9jeC5GdWxsTmFtZSwgc291cmNlMkNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICBpZiAobV9PcGVuV29yZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UxRG9jeEZvcldvcmQgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTEpKTsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UyRG9jeEZvcldvcmQgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTIpKTsKKworICAgICAgICAgICAgICAgIHZhciBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeEZvcldvcmQgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHRoaXNUZXN0VGVtcERpci5GdWxsTmFtZSwgc291cmNlMURvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICItRm9yLVdvcmQuZG9jeCIpKSk7CisgICAgICAgICAgICAgICAgdmFyIHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4Rm9yV29yZCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2UyRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi1Gb3ItV29yZC5kb2N4IikpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4Rm9yV29yZC5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2UxRG9jeC5GdWxsTmFtZSwgc291cmNlMUNvcGllZFRvRGVzdERvY3hGb3JXb3JkLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4Rm9yV29yZC5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2UyRG9jeC5GdWxsTmFtZSwgc291cmNlMkNvcGllZFRvRGVzdERvY3hGb3JXb3JkLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgICAgIEZpbGVJbmZvIHdvcmRFeGUgPSBuZXcgRmlsZUluZm8oQCJDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBPZmZpY2Vccm9vdFxPZmZpY2UxNlxXSU5XT1JELkVYRSIpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeEZvcldvcmQpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeEZvcldvcmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICB2YXIgYmVmb3JlID0gc291cmNlMUNvcGllZFRvRGVzdERvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICIiKTsKKyAgICAgICAgICAgIHZhciBhZnRlciA9IHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiIik7CisgICAgICAgICAgICB2YXIgZG9jeFdpdGhSZXZpc2lvbnNGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGhpc1Rlc3RUZW1wRGlyLkZ1bGxOYW1lLCBiZWZvcmUgKyAiLUNPTVBBUkUtIiArIGFmdGVyICsgIi5kb2N4IikpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCBzb3VyY2UxV21sID0gbmV3IFdtbERvY3VtZW50KHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHNvdXJjZTJXbWwgPSBuZXcgV21sRG9jdW1lbnQoc291cmNlMkNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBXbWxDb21wYXJlclNldHRpbmdzKCk7CisgICAgICAgICAgICBzZXR0aW5ncy5EZWJ1Z1RlbXBGaWxlRGkgPSBUZXN0VXRpbC5UZW1wRGlyOworICAgICAgICAgICAgV21sRG9jdW1lbnQgY29tcGFyZWRXbWwgPSBXbWxDb21wYXJlci5Db21wYXJlKHNvdXJjZTFXbWwsIHNvdXJjZTJXbWwsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIGNvbXBhcmVkV21sLlNhdmVBcyhkb2N4V2l0aFJldmlzaW9uc0ZpLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtcy5Xcml0ZShjb21wYXJlZFdtbC5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgY29tcGFyZWRXbWwuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1zLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IE9wZW5YbWxWYWxpZGF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9ycyA9IHZhbGlkYXRvci5WYWxpZGF0ZSh3RG9jKS5XaGVyZShlID0+ICFFeHBlY3RlZEVycm9ycy5Db250YWlucyhlLkRlc2NyaXB0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMuQ291bnQoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZCA9ICIgICI7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVyciBpbiBlcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJFcnJvciIgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kICsgIkVycm9yVHlwZTogIiArIGVyci5FcnJvclR5cGUuVG9TdHJpbmcoKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpbmQgKyAiRGVzY3JpcHRpb246ICIgKyBlcnIuRGVzY3JpcHRpb24gKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kICsgIlBhcnQ6ICIgKyBlcnIuUGFydC5VcmkuVG9TdHJpbmcoKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpbmQgKyAiWFBhdGg6ICIgKyBlcnIuUGF0aC5YUGF0aCArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNicyA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2JzICE9ICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5UcnVlKGZhbHNlLCBzYnMuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIGlmIChtX09wZW5Xb3JkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGVJbmZvIHdvcmRFeGUgPSBuZXcgRmlsZUluZm8oQCJDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBPZmZpY2Vccm9vdFxPZmZpY2UxNlxXSU5XT1JELkVYRSIpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBkb2N4V2l0aFJldmlzaW9uc0ZpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIC8vIE9wZW4gV2luZG93cyBFeHBsb3JlcgorICAgICAgICAgICAgaWYgKG1fT3BlblRlbXBEaXJJbkV4cGxvcmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8gQ09ERSBUTyBSRVBFQVQgVU5USUwgU1VDQ0VTUyAvLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VtYXBob3JGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgInpfRXhwbG9yZXJPcGVuZWRTZW1hcGhvcmUudHh0IikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZW1hcGhvckZpLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLldyaXRlQWxsVGV4dChzZW1hcGhvckZpLkZ1bGxOYW1lLCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuRXhwbG9yZXIodGhpc1Rlc3RUZW1wRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5UaHJlYWRpbmcuVGhyZWFkLlNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNpZiBmYWxzZQorICAgICAgICAgICAgV21sRG9jdW1lbnQgcmV2aXNpb25XbWwgPSBuZXcgV21sRG9jdW1lbnQoZG9jeFdpdGhSZXZpc2lvbnNGaS5GdWxsTmFtZSk7CisgICAgICAgICAgICB2YXIgcmV2aXNpb25zID0gV21sQ29tcGFyZXIuR2V0UmV2aXNpb25zKHJldmlzaW9uV21sLCBzZXR0aW5ncyk7CisgICAgICAgICAgICBBc3NlcnQuRXF1YWwocmV2aXNpb25Db3VudCwgcmV2aXNpb25zLkNvdW50KCkpOworI2VuZGlmCisgICAgICAgIH0KKyNlbmRpZgorCisjaWYgZmFsc2UKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgW0lubGluZURhdGEoIlJDMDAxLUJlZm9yZS5kb2N4IiwKKyAgICAgICAgICAgIEAiPFJvb3Q+CisgICAgICAgICAgICAgIDxSY0luZm8+CisgICAgICAgICAgICAgICAgPERvY05hbWU+UkMwMDEtQWZ0ZXIxLmRvY3g8L0RvY05hbWU+CisgICAgICAgICAgICAgICAgPENvbG9yPkxpZ2h0WWVsbG93PC9Db2xvcj4KKyAgICAgICAgICAgICAgICA8UmV2aXNvcj5Gcm9tIEJvYjwvUmV2aXNvcj4KKyAgICAgICAgICAgICAgPC9SY0luZm8+CisgICAgICAgICAgICAgIDxSY0luZm8+CisgICAgICAgICAgICAgICAgPERvY05hbWU+UkMwMDEtQWZ0ZXIyLmRvY3g8L0RvY05hbWU+CisgICAgICAgICAgICAgICAgPENvbG9yPkxpZ2h0UGluazwvQ29sb3I+CisgICAgICAgICAgICAgICAgPFJldmlzb3I+RnJvbSBGcmVkPC9SZXZpc29yPgorICAgICAgICAgICAgICA8L1JjSW5mbz4KKyAgICAgICAgICAgIDwvUm9vdD4iKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJDMDAyLUltYWdlLmRvY3giLAorICAgICAgICAgICAgQCI8Um9vdD4KKyAgICAgICAgICAgICAgPFJjSW5mbz4KKyAgICAgICAgICAgICAgICA8RG9jTmFtZT5SQzAwMi1JbWFnZS1BZnRlcjEuZG9jeDwvRG9jTmFtZT4KKyAgICAgICAgICAgICAgICA8Q29sb3I+TGlnaHRCbHVlPC9Db2xvcj4KKyAgICAgICAgICAgICAgICA8UmV2aXNvcj5Gcm9tIEJvYjwvUmV2aXNvcj4KKyAgICAgICAgICAgICAgPC9SY0luZm8+CisgICAgICAgICAgICA8L1Jvb3Q+IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSQzAwMi1JbWFnZS1BZnRlcjEuZG9jeCIsCisgICAgICAgICAgICBAIjxSb290PgorICAgICAgICAgICAgICA8UmNJbmZvPgorICAgICAgICAgICAgICAgIDxEb2NOYW1lPlJDMDAyLUltYWdlLmRvY3g8L0RvY05hbWU+CisgICAgICAgICAgICAgICAgPENvbG9yPkxpZ2h0Qmx1ZTwvQ29sb3I+CisgICAgICAgICAgICAgICAgPFJldmlzb3I+RnJvbSBCb2I8L1Jldmlzb3I+CisgICAgICAgICAgICAgIDwvUmNJbmZvPgorICAgICAgICAgICAgPC9Sb290PiIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMjctVHdlbnR5LVBhcmFzLUJlZm9yZS5kb2N4IiwKKyAgICAgICAgICAgIEAiPFJvb3Q+CisgICAgICAgICAgICAgIDxSY0luZm8+CisgICAgICAgICAgICAgICAgPERvY05hbWU+V0MwMjctVHdlbnR5LVBhcmFzLUFmdGVyLTEuZG9jeDwvRG9jTmFtZT4KKyAgICAgICAgICAgICAgICA8Q29sb3I+TGlnaHRCbHVlPC9Db2xvcj4KKyAgICAgICAgICAgICAgICA8UmV2aXNvcj5Gcm9tIEJvYjwvUmV2aXNvcj4KKyAgICAgICAgICAgICAgPC9SY0luZm8+CisgICAgICAgICAgICA8L1Jvb3Q+IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAyNy1Ud2VudHktUGFyYXMtQmVmb3JlLmRvY3giLAorICAgICAgICAgICAgQCI8Um9vdD4KKyAgICAgICAgICAgICAgPFJjSW5mbz4KKyAgICAgICAgICAgICAgICA8RG9jTmFtZT5XQzAyNy1Ud2VudHktUGFyYXMtQWZ0ZXItMy5kb2N4PC9Eb2NOYW1lPgorICAgICAgICAgICAgICAgIDxDb2xvcj5MaWdodEJsdWU8L0NvbG9yPgorICAgICAgICAgICAgICAgIDxSZXZpc29yPkZyb20gQm9iPC9SZXZpc29yPgorICAgICAgICAgICAgICA8L1JjSW5mbz4KKyAgICAgICAgICAgIDwvUm9vdD4iKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJDMDAzLU11bHRpLVBhcmFzLmRvY3giLAorICAgICAgICAgICAgQCI8Um9vdD4KKyAgICAgICAgICAgICAgPFJjSW5mbz4KKyAgICAgICAgICAgICAgICA8RG9jTmFtZT5SQzAwMy1NdWx0aS1QYXJhcy1BZnRlci5kb2N4PC9Eb2NOYW1lPgorICAgICAgICAgICAgICAgIDxDb2xvcj5MaWdodEJsdWU8L0NvbG9yPgorICAgICAgICAgICAgICAgIDxSZXZpc29yPkZyb20gQm9iPC9SZXZpc29yPgorICAgICAgICAgICAgICA8L1JjSW5mbz4KKyAgICAgICAgICAgIDwvUm9vdD4iKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJDMDA0LUJlZm9yZS5kb2N4IiwKKyAgICAgICAgICAgIEAiPFJvb3Q+CisgICAgICAgICAgICAgIDxSY0luZm8+CisgICAgICAgICAgICAgICAgPERvY05hbWU+UkMwMDQtQWZ0ZXIxLmRvY3g8L0RvY05hbWU+CisgICAgICAgICAgICAgICAgPENvbG9yPkxpZ2h0WWVsbG93PC9Db2xvcj4KKyAgICAgICAgICAgICAgICA8UmV2aXNvcj5Gcm9tIEJvYjwvUmV2aXNvcj4KKyAgICAgICAgICAgICAgPC9SY0luZm8+CisgICAgICAgICAgICAgIDxSY0luZm8+CisgICAgICAgICAgICAgICAgPERvY05hbWU+UkMwMDQtQWZ0ZXIyLmRvY3g8L0RvY05hbWU+CisgICAgICAgICAgICAgICAgPENvbG9yPkxpZ2h0UGluazwvQ29sb3I+CisgICAgICAgICAgICAgICAgPFJldmlzb3I+RnJvbSBGcmVkPC9SZXZpc29yPgorICAgICAgICAgICAgICA8L1JjSW5mbz4KKyAgICAgICAgICAgIDwvUm9vdD4iKV0KKworICAgICAgICBwdWJsaWMgdm9pZCBXQzAwMV9Db25zb2xpZGF0ZShzdHJpbmcgb3JpZ2luYWxOYW1lLCBzdHJpbmcgcmV2aXNlZERvY3VtZW50c1htbCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gb3JpZ2luYWxEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG9yaWdpbmFsTmFtZSkpOworCisgICAgICAgICAgICB2YXIgb3JpZ2luYWxDb3BpZWRUb0Rlc3REb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBvcmlnaW5hbERvY3guTmFtZSkpOworICAgICAgICAgICAgaWYgKCFvcmlnaW5hbENvcGllZFRvRGVzdERvY3guRXhpc3RzKQorICAgICAgICAgICAgICAgIEZpbGUuQ29weShvcmlnaW5hbERvY3guRnVsbE5hbWUsIG9yaWdpbmFsQ29waWVkVG9EZXN0RG9jeC5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIHZhciByZXZpc2VkRG9jdW1lbnRzWEVsZW1lbnQgPSBYRWxlbWVudC5QYXJzZShyZXZpc2VkRG9jdW1lbnRzWG1sKTsKKyAgICAgICAgICAgIHZhciByZXZpc2VkRG9jdW1lbnRzQXJyYXkgPSByZXZpc2VkRG9jdW1lbnRzWEVsZW1lbnQKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgIC5TZWxlY3QoeiA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZUluZm8gcmV2aXNlZERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgei5FbGVtZW50KCJEb2NOYW1lIikuVmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJldmlzZWRDb3BpZWRUb0Rlc3REb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCByZXZpc2VkRG9jeC5OYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmV2aXNlZENvcGllZFRvRGVzdERvY3guRXhpc3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHJldmlzZWREb2N4LkZ1bGxOYW1lLCByZXZpc2VkQ29waWVkVG9EZXN0RG9jeC5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV21sUmV2aXNlZERvY3VtZW50SW5mbygpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldmlzZWREb2N1bWVudCA9IG5ldyBXbWxEb2N1bWVudChyZXZpc2VkQ29waWVkVG9EZXN0RG9jeC5GdWxsTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvciA9IENvbG9yLkZyb21OYW1lKHouRWxlbWVudCgiQ29sb3IiKS5WYWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBSZXZpc29yID0gei5FbGVtZW50KCJSZXZpc29yIikuVmFsdWUsCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIHZhciBjb25zb2xpZGF0ZWREb2N4TmFtZSA9IG9yaWdpbmFsQ29waWVkVG9EZXN0RG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi1Db25zb2xpZGF0ZWQuZG9jeCIpOworICAgICAgICAgICAgdmFyIGNvbnNvbGlkYXRlZERvY3VtZW50RmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIGNvbnNvbGlkYXRlZERvY3hOYW1lKSk7CisKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHNvdXJjZTFXbWwgPSBuZXcgV21sRG9jdW1lbnQob3JpZ2luYWxDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgV21sQ29tcGFyZXJTZXR0aW5ncygpOworICAgICAgICAgICAgV21sRG9jdW1lbnQgY29uc29saWRhdGVkV21sID0gV21sQ29tcGFyZXIuQ29uc29saWRhdGUoCisgICAgICAgICAgICAgICAgc291cmNlMVdtbCwKKyAgICAgICAgICAgICAgICByZXZpc2VkRG9jdW1lbnRzQXJyYXksCisgICAgICAgICAgICAgICAgc2V0dGluZ3MpOworICAgICAgICAgICAgY29uc29saWRhdGVkV21sLlNhdmVBcyhjb25zb2xpZGF0ZWREb2N1bWVudEZpLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtcy5Xcml0ZShjb25zb2xpZGF0ZWRXbWwuRG9jdW1lbnRCeXRlQXJyYXksIDAsIGNvbnNvbGlkYXRlZFdtbC5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obXMsIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT3BlblhtbFZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgT3BlblhtbFZhbGlkYXRvcigpOworICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gdmFsaWRhdG9yLlZhbGlkYXRlKHdEb2MpLldoZXJlKGUgPT4gIUV4cGVjdGVkRXJyb3JzLkNvbnRhaW5zKGUuRGVzY3JpcHRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9ycy5Db3VudCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kID0gIiAgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZXJyIGluIGVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyNpZiB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJFcnJvciIgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kICsgIkVycm9yVHlwZTogIiArIGVyci5FcnJvclR5cGUuVG9TdHJpbmcoKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpbmQgKyAiRGVzY3JpcHRpb246ICIgKyBlcnIuRGVzY3JpcHRpb24gKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kICsgIlBhcnQ6ICIgKyBlcnIuUGFydC5VcmkuVG9TdHJpbmcoKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpbmQgKyAiWFBhdGg6ICIgKyBlcnIuUGF0aC5YUGF0aCArIEVudmlyb25tZW50Lk5ld0xpbmUpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiICAgICAgICAgICAgXCIiICsgZXJyLkRlc2NyaXB0aW9uICsgIlwiLCIgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNicyA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoIiIsIHNicyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIGlmIChzX09wZW5Xb3JkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGVJbmZvIHdvcmRFeGUgPSBuZXcgRmlsZUluZm8oQCJDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBPZmZpY2Vccm9vdFxPZmZpY2UxNlxXSU5XT1JELkVYRSIpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBjb25zb2xpZGF0ZWREb2N1bWVudEZpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgfQorCisgICAgICAgIFtUaGVvcnldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDQTAwMS1QbGFpbi5kb2N4IiwgIkNBMDAxLVBsYWluLU1vZC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwMS1EaWdpdHMuZG9jeCIsICJXQzAwMS1EaWdpdHMtTW9kLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDAxLURpZ2l0cy5kb2N4IiwgIldDMDAxLURpZ2l0cy1EZWxldGVkLVBhcmFncmFwaC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwMS1EaWdpdHMtRGVsZXRlZC1QYXJhZ3JhcGguZG9jeCIsICJXQzAwMS1EaWdpdHMuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMDItVW5tb2RpZmllZC5kb2N4IiwgIldDMDAyLURpZmZJbk1pZGRsZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwMi1Vbm1vZGlmaWVkLmRvY3giLCAiV0MwMDItRGlmZkF0QmVnaW5uaW5nLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQzAwMi1EZWxldGVBdEJlZ2lubmluZy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwMi1Vbm1vZGlmaWVkLmRvY3giLCAiV0MwMDItSW5zZXJ0QXRCZWdpbm5pbmcuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMDItVW5tb2RpZmllZC5kb2N4IiwgIldDMDAyLUluc2VydEF0RW5kLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDAyLVVubW9kaWZpZWQuZG9jeCIsICJXQzAwMi1EZWxldGVBdEVuZC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwMi1Vbm1vZGlmaWVkLmRvY3giLCAiV0MwMDItRGVsZXRlSW5NaWRkbGUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMDItVW5tb2RpZmllZC5kb2N4IiwgIldDMDAyLUluc2VydEluTWlkZGxlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDAyLURlbGV0ZUluTWlkZGxlLmRvY3giLCAiV0MwMDItVW5tb2RpZmllZC5kb2N4IildCisgICAgICAgIC8vW0lubGluZURhdGEoIldDMDA0LUxhcmdlLmRvY3giLCAiV0MwMDQtTGFyZ2UtTW9kLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDA2LVRhYmxlLmRvY3giLCAiV0MwMDYtVGFibGUtRGVsZXRlLVJvdy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwNi1UYWJsZS1EZWxldGUtUm93LmRvY3giLCAiV0MwMDYtVGFibGUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMDYtVGFibGUuZG9jeCIsICJXQzAwNi1UYWJsZS1EZWxldGUtQ29udGVzdHMtb2YtUm93LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDA3LVVubW9kaWZpZWQuZG9jeCIsICJXQzAwNy1Mb25nZXN0LUF0LUVuZC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwNy1Vbm1vZGlmaWVkLmRvY3giLCAiV0MwMDctRGVsZXRlZC1hdC1CZWdpbm5pbmctb2YtUGFyYS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwNy1Vbm1vZGlmaWVkLmRvY3giLCAiV0MwMDctTW92ZWQtaW50by1UYWJsZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwOS1UYWJsZS1Vbm1vZGlmaWVkLmRvY3giLCAiV0MwMDktVGFibGUtQ2VsbC0xLTEtTW9kLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDEwLVBhcmEtQmVmb3JlLVRhYmxlLVVubW9kaWZpZWQuZG9jeCIsICJXQzAxMC1QYXJhLUJlZm9yZS1UYWJsZS1Nb2QuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMTEtQmVmb3JlLmRvY3giLCAiV0MwMTEtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMTItTWF0aC1CZWZvcmUuZG9jeCIsICJXQzAxMi1NYXRoLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDEzLUltYWdlLUJlZm9yZS5kb2N4IiwgIldDMDEzLUltYWdlLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDEzLUltYWdlLUJlZm9yZS5kb2N4IiwgIldDMDEzLUltYWdlLUFmdGVyMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxMy1JbWFnZS1CZWZvcmUyLmRvY3giLCAiV0MwMTMtSW1hZ2UtQWZ0ZXIyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDE0LVNtYXJ0QXJ0LUJlZm9yZS5kb2N4IiwgIldDMDE0LVNtYXJ0QXJ0LUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDE0LVNtYXJ0QXJ0LVdpdGgtSW1hZ2UtQmVmb3JlLmRvY3giLCAiV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1BZnRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLUJlZm9yZS5kb2N4IiwgIldDMDE0LVNtYXJ0QXJ0LVdpdGgtSW1hZ2UtRGVsZXRlZC1BZnRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLUJlZm9yZS5kb2N4IiwgIldDMDE0LVNtYXJ0QXJ0LVdpdGgtSW1hZ2UtRGVsZXRlZC1BZnRlcjIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMTUtVGhyZWUtUGFyYWdyYXBocy5kb2N4IiwgIldDMDE1LVRocmVlLVBhcmFncmFwaHMtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMTYtUGFyYS1JbWFnZS1QYXJhLmRvY3giLCAiV0MwMTYtUGFyYS1JbWFnZS1QYXJhLXctRGVsZXRlZC1JbWFnZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxNy1JbWFnZS5kb2N4IiwgIldDMDE3LUltYWdlLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDE4LUZpZWxkLVNpbXBsZS1CZWZvcmUuZG9jeCIsICJXQzAxOC1GaWVsZC1TaW1wbGUtQWZ0ZXItMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxOC1GaWVsZC1TaW1wbGUtQmVmb3JlLmRvY3giLCAiV0MwMTgtRmllbGQtU2ltcGxlLUFmdGVyLTIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMTktSHlwZXJsaW5rLUJlZm9yZS5kb2N4IiwgIldDMDE5LUh5cGVybGluay1BZnRlci0xLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDE5LUh5cGVybGluay1CZWZvcmUuZG9jeCIsICJXQzAxOS1IeXBlcmxpbmstQWZ0ZXItMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAyMC1Gb290Tm90ZS1CZWZvcmUuZG9jeCIsICJXQzAyMC1Gb290Tm90ZS1BZnRlci0xLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDIwLUZvb3ROb3RlLUJlZm9yZS5kb2N4IiwgIldDMDIwLUZvb3ROb3RlLUFmdGVyLTIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMjEtTWF0aC1CZWZvcmUtMS5kb2N4IiwgIldDMDIxLU1hdGgtQWZ0ZXItMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAyMS1NYXRoLUJlZm9yZS0yLmRvY3giLCAiV0MwMjEtTWF0aC1BZnRlci0yLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDIyLUltYWdlLU1hdGgtUGFyYS1CZWZvcmUuZG9jeCIsICJXQzAyMi1JbWFnZS1NYXRoLVBhcmEtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMjMtVGFibGUtNC1Sb3ctSW1hZ2UtQmVmb3JlLmRvY3giLCAiV0MwMjMtVGFibGUtNC1Sb3ctSW1hZ2UtQWZ0ZXItRGVsZXRlLTEtUm93LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDI0LVRhYmxlLUJlZm9yZS5kb2N4IiwgIldDMDI0LVRhYmxlLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDI0LVRhYmxlLUJlZm9yZS5kb2N4IiwgIldDMDI0LVRhYmxlLUFmdGVyMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAyNS1TaW1wbGUtVGFibGUtQmVmb3JlLmRvY3giLCAiV0MwMjUtU2ltcGxlLVRhYmxlLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDI2LUxvbmctVGFibGUtQmVmb3JlLmRvY3giLCAiV0MwMjYtTG9uZy1UYWJsZS1BZnRlci0xLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDI3LVR3ZW50eS1QYXJhcy1CZWZvcmUuZG9jeCIsICJXQzAyNy1Ud2VudHktUGFyYXMtQWZ0ZXItMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAyNy1Ud2VudHktUGFyYXMtQWZ0ZXItMS5kb2N4IiwgIldDMDI3LVR3ZW50eS1QYXJhcy1CZWZvcmUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMjctVHdlbnR5LVBhcmFzLUJlZm9yZS5kb2N4IiwgIldDMDI3LVR3ZW50eS1QYXJhcy1BZnRlci0yLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDMwLUltYWdlLU1hdGgtQmVmb3JlLmRvY3giLCAiV0MwMzAtSW1hZ2UtTWF0aC1BZnRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAzMS1Ud28tTWF0aHMtQmVmb3JlLmRvY3giLCAiV0MwMzEtVHdvLU1hdGhzLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDMyLVBhcmEtd2l0aC1QYXJhLVByb3BzLmRvY3giLCAiV0MwMzItUGFyYS13aXRoLVBhcmEtUHJvcHMtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMzMtTWVyZ2VkLUNlbGxzLUJlZm9yZS5kb2N4IiwgIldDMDMzLU1lcmdlZC1DZWxscy1BZnRlcjEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMzMtTWVyZ2VkLUNlbGxzLUJlZm9yZS5kb2N4IiwgIldDMDMzLU1lcmdlZC1DZWxscy1BZnRlcjIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMzQtRm9vdG5vdGVzLUJlZm9yZS5kb2N4IiwgIldDMDM0LUZvb3Rub3Rlcy1BZnRlcjEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMzQtRm9vdG5vdGVzLUJlZm9yZS5kb2N4IiwgIldDMDM0LUZvb3Rub3Rlcy1BZnRlcjIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMzQtRm9vdG5vdGVzLUJlZm9yZS5kb2N4IiwgIldDMDM0LUZvb3Rub3Rlcy1BZnRlcjMuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMzQtRm9vdG5vdGVzLUFmdGVyMy5kb2N4IiwgIldDMDM0LUZvb3Rub3Rlcy1CZWZvcmUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMzUtRm9vdG5vdGUtQmVmb3JlLmRvY3giLCAiV0MwMzUtRm9vdG5vdGUtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMzUtRm9vdG5vdGUtQWZ0ZXIuZG9jeCIsICJXQzAzNS1Gb290bm90ZS1CZWZvcmUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMzYtRm9vdG5vdGUtV2l0aC1UYWJsZS1CZWZvcmUuZG9jeCIsICJXQzAzNi1Gb290bm90ZS1XaXRoLVRhYmxlLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDM2LUZvb3Rub3RlLVdpdGgtVGFibGUtQWZ0ZXIuZG9jeCIsICJXQzAzNi1Gb290bm90ZS1XaXRoLVRhYmxlLUJlZm9yZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAzNC1FbmRub3Rlcy1CZWZvcmUuZG9jeCIsICJXQzAzNC1FbmRub3Rlcy1BZnRlcjEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMzQtRW5kbm90ZXMtQmVmb3JlLmRvY3giLCAiV0MwMzQtRW5kbm90ZXMtQWZ0ZXIyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDM0LUVuZG5vdGVzLUJlZm9yZS5kb2N4IiwgIldDMDM0LUVuZG5vdGVzLUFmdGVyMy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAzNC1FbmRub3Rlcy1BZnRlcjMuZG9jeCIsICJXQzAzNC1FbmRub3Rlcy1CZWZvcmUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMzUtRW5kbm90ZS1CZWZvcmUuZG9jeCIsICJXQzAzNS1FbmRub3RlLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDM1LUVuZG5vdGUtQWZ0ZXIuZG9jeCIsICJXQzAzNS1FbmRub3RlLUJlZm9yZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAzNi1FbmRub3RlLVdpdGgtVGFibGUtQmVmb3JlLmRvY3giLCAiV0MwMzYtRW5kbm90ZS1XaXRoLVRhYmxlLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDM2LUVuZG5vdGUtV2l0aC1UYWJsZS1BZnRlci5kb2N4IiwgIldDMDM2LUVuZG5vdGUtV2l0aC1UYWJsZS1CZWZvcmUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMzgtRG9jdW1lbnQtV2l0aC1CUi1CZWZvcmUuZG9jeCIsICJXQzAzOC1Eb2N1bWVudC1XaXRoLUJSLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIlJDMDAxLUJlZm9yZS5kb2N4IiwgIlJDMDAxLUFmdGVyMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJSQzAwMi1JbWFnZS5kb2N4IiwgIlJDMDAyLUltYWdlLUFmdGVyMS5kb2N4IildCisgICAgICAgIC8vW0lubGluZURhdGEoIiIsICIiKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiIiwgIiIpXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCIiLCAiIildCisgICAgICAgIC8vW0lubGluZURhdGEoIiIsICIiKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiIiwgIiIpXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCIiLCAiIildCisgICAgICAgIC8vW0lubGluZURhdGEoIiIsICIiKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiIiwgIiIpXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCIiLCAiIildCisKKworICAgICAgICBwdWJsaWMgdm9pZCBXQzAwMl9Db25zb2xpZGF0ZV9CdWxrX1Rlc3Qoc3RyaW5nIG5hbWUxLCBzdHJpbmcgbmFtZTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTFEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUxKSk7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UyRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lMikpOworCisgICAgICAgICAgICB2YXIgc291cmNlMUNvcGllZFRvRGVzdERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZTFEb2N4Lk5hbWUpKTsKKyAgICAgICAgICAgIHZhciBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlMkRvY3guTmFtZSkpOworICAgICAgICAgICAgaWYgKCFzb3VyY2UxQ29waWVkVG9EZXN0RG9jeC5FeGlzdHMpCisgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZTFEb2N4LkZ1bGxOYW1lLCBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeC5GdWxsTmFtZSk7CisgICAgICAgICAgICBpZiAoIXNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4LkV4aXN0cykKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlMkRvY3guRnVsbE5hbWUsIHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgaWYgKHNfT3BlbldvcmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMURvY3hGb3JXb3JkID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUxKSk7CisgICAgICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMkRvY3hGb3JXb3JkID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUyKSk7CisKKyAgICAgICAgICAgICAgICB2YXIgc291cmNlMUNvcGllZFRvRGVzdERvY3hGb3JXb3JkID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2UxRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi1Gb3ItV29yZC5kb2N4IikpKTsKKyAgICAgICAgICAgICAgICB2YXIgc291cmNlMkNvcGllZFRvRGVzdERvY3hGb3JXb3JkID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2UyRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi1Gb3ItV29yZC5kb2N4IikpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4Rm9yV29yZC5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2UxRG9jeC5GdWxsTmFtZSwgc291cmNlMUNvcGllZFRvRGVzdERvY3hGb3JXb3JkLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4Rm9yV29yZC5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2UyRG9jeC5GdWxsTmFtZSwgc291cmNlMkNvcGllZFRvRGVzdERvY3hGb3JXb3JkLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgICAgIEZpbGVJbmZvIHdvcmRFeGUgPSBuZXcgRmlsZUluZm8oQCJDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBPZmZpY2Vccm9vdFxPZmZpY2UxNlxXSU5XT1JELkVYRSIpOworICAgICAgICAgICAgICAgIHZhciBwYXRoID0gbmV3IERpcmVjdG9yeUluZm8oQCJDOlxVc2Vyc1xFcmljXERvY3VtZW50c1xXaW5kb3dzUG93ZXJTaGVsbE1vZHVsZXNcT3Blbi1YbWwtUG93ZXJUb29sc1xUZXN0RmlsZXMiKTsKKyAgICAgICAgICAgICAgICBXb3JkUnVubmVyLlJ1bldvcmQod29yZEV4ZSwgc291cmNlMkNvcGllZFRvRGVzdERvY3hGb3JXb3JkKTsKKyAgICAgICAgICAgICAgICBXb3JkUnVubmVyLlJ1bldvcmQod29yZEV4ZSwgc291cmNlMUNvcGllZFRvRGVzdERvY3hGb3JXb3JkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgdmFyIGJlZm9yZSA9IHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiIik7CisgICAgICAgICAgICB2YXIgYWZ0ZXIgPSBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIiIpOworICAgICAgICAgICAgdmFyIGRvY3hXaXRoUmV2aXNpb25zRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIGJlZm9yZSArICItQ09NUEFSRS0iICsgYWZ0ZXIgKyAiLmRvY3giKSk7CisgICAgICAgICAgICB2YXIgZG9jeENvbnNvbGlkYXRlZEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBiZWZvcmUgKyAiLUNPTlNPTElEQVRFRC0iICsgYWZ0ZXIgKyAiLmRvY3giKSk7CisKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHNvdXJjZTFXbWwgPSBuZXcgV21sRG9jdW1lbnQoc291cmNlMUNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgV21sRG9jdW1lbnQgc291cmNlMldtbCA9IG5ldyBXbWxEb2N1bWVudChzb3VyY2UyQ29waWVkVG9EZXN0RG9jeC5GdWxsTmFtZSk7CisgICAgICAgICAgICBXbWxDb21wYXJlclNldHRpbmdzIHNldHRpbmdzID0gbmV3IFdtbENvbXBhcmVyU2V0dGluZ3MoKTsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IGNvbXBhcmVkV21sID0gV21sQ29tcGFyZXIuQ29tcGFyZShzb3VyY2UxV21sLCBzb3VyY2UyV21sLCBzZXR0aW5ncyk7CisgICAgICAgICAgICBjb21wYXJlZFdtbC5TYXZlQXMoZG9jeFdpdGhSZXZpc2lvbnNGaS5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIExpc3Q8V21sUmV2aXNlZERvY3VtZW50SW5mbz4gcmV2aXNlZERvY0luZm8gPSBuZXcgTGlzdDxXbWxSZXZpc2VkRG9jdW1lbnRJbmZvPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFdtbFJldmlzZWREb2N1bWVudEluZm8oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmV2aXNlZERvY3VtZW50ID0gc291cmNlMldtbCwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IgPSBDb2xvci5MaWdodEJsdWUsCisgICAgICAgICAgICAgICAgICAgIFJldmlzb3IgPSAiUmV2aXNlZCBieSBFcmljIFdoaXRlIiwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgV21sRG9jdW1lbnQgY29uc29saWRhdGVkV21sID0gV21sQ29tcGFyZXIuQ29uc29saWRhdGUoCisgICAgICAgICAgICAgICAgc291cmNlMVdtbCwKKyAgICAgICAgICAgICAgICByZXZpc2VkRG9jSW5mbywKKyAgICAgICAgICAgICAgICBzZXR0aW5ncyk7CisgICAgICAgICAgICBjb25zb2xpZGF0ZWRXbWwuU2F2ZUFzKGRvY3hDb25zb2xpZGF0ZWRGaS5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXMuV3JpdGUoY29uc29saWRhdGVkV21sLkRvY3VtZW50Qnl0ZUFycmF5LCAwLCBjb25zb2xpZGF0ZWRXbWwuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1zLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IE9wZW5YbWxWYWxpZGF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9ycyA9IHZhbGlkYXRvci5WYWxpZGF0ZSh3RG9jKS5XaGVyZShlID0+ICFFeHBlY3RlZEVycm9ycy5Db250YWlucyhlLkRlc2NyaXB0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMuQ291bnQoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZCA9ICIgICI7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVyciBpbiBlcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisjaWYgdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiRXJyb3IiICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJFcnJvclR5cGU6ICIgKyBlcnIuRXJyb3JUeXBlLlRvU3RyaW5nKCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kICsgIkRlc2NyaXB0aW9uOiAiICsgZXJyLkRlc2NyaXB0aW9uICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJQYXJ0OiAiICsgZXJyLlBhcnQuVXJpLlRvU3RyaW5nKCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kICsgIlhQYXRoOiAiICsgZXJyLlBhdGguWFBhdGggKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiAgICAgICAgICAgIFwiIiArIGVyci5EZXNjcmlwdGlvbiArICJcIiwiICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYnMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCIiLCBzYnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICBpZiAoc19PcGVuV29yZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyB3b3JkRXhlID0gbmV3IEZpbGVJbmZvKEAiQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgT2ZmaWNlXHJvb3RcT2ZmaWNlMTZcV0lOV09SRC5FWEUiKTsKKyAgICAgICAgICAgICAgICBXb3JkUnVubmVyLlJ1bldvcmQod29yZEV4ZSwgZG9jeENvbnNvbGlkYXRlZEZpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgfQorI2VuZGlmCisKKyNpZiBmYWxzZQorICAgICAgICBbVGhlb3J5XQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMzctVGV4dGJveC1CZWZvcmUuZG9jeCIsICJXQzAzNy1UZXh0Ym94LUFmdGVyMS5kb2N4IiwgMildCisKKyAgICAgICAgcHVibGljIHZvaWQgV0MwMDNfVGhyb3dzKHN0cmluZyBuYW1lMSwgc3RyaW5nIG5hbWUyLCBpbnQgcmV2aXNpb25Db3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMURvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTEpKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTJEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUyKSk7CisKKyAgICAgICAgICAgIHZhciBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlMURvY3guTmFtZSkpOworICAgICAgICAgICAgdmFyIHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2UyRG9jeC5OYW1lKSk7CisgICAgICAgICAgICBpZiAoIXNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkV4aXN0cykKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlMURvY3guRnVsbE5hbWUsIHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIGlmICghc291cmNlMkNvcGllZFRvRGVzdERvY3guRXhpc3RzKQorICAgICAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2UyRG9jeC5GdWxsTmFtZSwgc291cmNlMkNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCBzb3VyY2UxV21sID0gbmV3IFdtbERvY3VtZW50KHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHNvdXJjZTJXbWwgPSBuZXcgV21sRG9jdW1lbnQoc291cmNlMkNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworICAgICAgICAgICAgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBXbWxDb21wYXJlclNldHRpbmdzKCk7CisgICAgICAgICAgICBBc3NlcnQuVGhyb3dzPE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uPigoKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgV21sRG9jdW1lbnQgY29tcGFyZWRXbWwgPSBXbWxDb21wYXJlci5Db21wYXJlKHNvdXJjZTFXbWwsIHNvdXJjZTJXbWwsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUaGVvcnldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwMS1EaWdpdHMuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMDEtRGlnaXRzLURlbGV0ZWQtUGFyYWdyYXBoLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDAxLURpZ2l0cy1Nb2QuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMDItRGVsZXRlQXRCZWdpbm5pbmcuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMDItRGVsZXRlQXRFbmQuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMDItRGVsZXRlSW5NaWRkbGUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMDItRGlmZkF0QmVnaW5uaW5nLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDAyLURpZmZJbk1pZGRsZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwMi1JbnNlcnRBdEJlZ2lubmluZy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwMi1JbnNlcnRBdEVuZC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwMi1JbnNlcnRJbk1pZGRsZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwMi1Vbm1vZGlmaWVkLmRvY3giKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiV0MwMDQtTGFyZ2UuZG9jeCIpXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCJXQzAwNC1MYXJnZS1Nb2QuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMDYtVGFibGUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMDYtVGFibGUtRGVsZXRlLUNvbnRlc3RzLW9mLVJvdy5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwNi1UYWJsZS1EZWxldGUtUm93LmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDA3LURlbGV0ZWQtYXQtQmVnaW5uaW5nLW9mLVBhcmEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMDctTG9uZ2VzdC1BdC1FbmQuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMDctTW92ZWQtaW50by1UYWJsZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwNy1Vbm1vZGlmaWVkLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDA5LVRhYmxlLUNlbGwtMS0xLU1vZC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAwOS1UYWJsZS1Vbm1vZGlmaWVkLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDEwLVBhcmEtQmVmb3JlLVRhYmxlLU1vZC5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxMC1QYXJhLUJlZm9yZS1UYWJsZS1Vbm1vZGlmaWVkLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDExLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDExLUJlZm9yZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxMi1NYXRoLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDEyLU1hdGgtQmVmb3JlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDEzLUltYWdlLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDEzLUltYWdlLUFmdGVyMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxMy1JbWFnZS1CZWZvcmUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMTMtSW1hZ2UtQmVmb3JlMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxNC1TbWFydEFydC1BZnRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxNC1TbWFydEFydC1CZWZvcmUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1BZnRlci5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLUJlZm9yZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLURlbGV0ZWQtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1EZWxldGVkLUFmdGVyMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxNS1UaHJlZS1QYXJhZ3JhcGhzLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDE1LVRocmVlLVBhcmFncmFwaHMtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMTYtUGFyYS1JbWFnZS1QYXJhLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDE2LVBhcmEtSW1hZ2UtUGFyYS13LURlbGV0ZWQtSW1hZ2UuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMTctSW1hZ2UuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMTctSW1hZ2UtQWZ0ZXIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMTgtRmllbGQtU2ltcGxlLUFmdGVyLTEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMTgtRmllbGQtU2ltcGxlLUFmdGVyLTIuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMTgtRmllbGQtU2ltcGxlLUJlZm9yZS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxOS1IeXBlcmxpbmstQWZ0ZXItMS5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxOS1IeXBlcmxpbmstQWZ0ZXItMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAxOS1IeXBlcmxpbmstQmVmb3JlLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDIwLUZvb3ROb3RlLUFmdGVyLTEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMjAtRm9vdE5vdGUtQWZ0ZXItMi5kb2N4IildCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQzAyMC1Gb290Tm90ZS1CZWZvcmUuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMjEtTWF0aC1BZnRlci0xLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDIxLU1hdGgtQmVmb3JlLTEuZG9jeCIpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MwMjItSW1hZ2UtTWF0aC1QYXJhLUFmdGVyLmRvY3giKV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDIyLUltYWdlLU1hdGgtUGFyYS1CZWZvcmUuZG9jeCIpXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCIiLCAiIildCisgICAgICAgIC8vW0lubGluZURhdGEoIiIsICIiKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiIiwgIiIpXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCIiLCAiIildCisKKyAgICAgICAgcHVibGljIHZvaWQgV0MwMDRfQ29tcGFyZV9Ub19TZWxmKHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2VEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUpKTsKKworICAgICAgICAgICAgdmFyIHNvdXJjZUNvcGllZFRvRGVzdERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZURvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICItU291cmNlLmRvY3giKSkpOworICAgICAgICAgICAgaWYgKCFzb3VyY2VDb3BpZWRUb0Rlc3REb2N4LkV4aXN0cykKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlRG9jeC5GdWxsTmFtZSwgc291cmNlQ29waWVkVG9EZXN0RG9jeC5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIHZhciBiZWZvcmUgPSBzb3VyY2VDb3BpZWRUb0Rlc3REb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiIik7CisgICAgICAgICAgICB2YXIgZG9jeENvbXBhcmVkRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIGJlZm9yZSArICItQ09NUEFSRSIgKyAiLmRvY3giKSk7CisgICAgICAgICAgICB2YXIgZG9jeENvbXBhcmVkMkZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBiZWZvcmUgKyAiLUNPTVBBUkUyIiArICIuZG9jeCIpKTsKKworICAgICAgICAgICAgV21sRG9jdW1lbnQgc291cmNlMVdtbCA9IG5ldyBXbWxEb2N1bWVudChzb3VyY2VDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHNvdXJjZTJXbWwgPSBuZXcgV21sRG9jdW1lbnQoc291cmNlQ29waWVkVG9EZXN0RG9jeC5GdWxsTmFtZSk7CisgICAgICAgICAgICBXbWxDb21wYXJlclNldHRpbmdzIHNldHRpbmdzID0gbmV3IFdtbENvbXBhcmVyU2V0dGluZ3MoKTsKKworICAgICAgICAgICAgV21sRG9jdW1lbnQgY29tcGFyZWRXbWwgPSBXbWxDb21wYXJlci5Db21wYXJlKHNvdXJjZTFXbWwsIHNvdXJjZTJXbWwsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIGNvbXBhcmVkV21sLlNhdmVBcyhkb2N4Q29tcGFyZWRGaS5GdWxsTmFtZSk7CisgICAgICAgICAgICBWYWxpZGF0ZURvY3VtZW50KGNvbXBhcmVkV21sKTsKKworICAgICAgICAgICAgV21sRG9jdW1lbnQgY29tcGFyZWRXbWwyID0gV21sQ29tcGFyZXIuQ29tcGFyZShjb21wYXJlZFdtbCwgc291cmNlMVdtbCwgc2V0dGluZ3MpOworICAgICAgICAgICAgY29tcGFyZWRXbWwyLlNhdmVBcyhkb2N4Q29tcGFyZWQyRmkuRnVsbE5hbWUpOworICAgICAgICAgICAgVmFsaWRhdGVEb2N1bWVudChjb21wYXJlZFdtbDIpOworICAgICAgICB9CisKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgW0lubGluZURhdGEoIldDMDQwLUNhc2UtQmVmb3JlLmRvY3giLCAiV0MwNDAtQ2FzZS1BZnRlci5kb2N4IiwgMildCisgICAgICAgIC8vW0lubGluZURhdGEoIiIsICIiLCAwKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiIiwgIiIsIDApXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCIiLCAiIiwgMCldCisgICAgICAgIC8vW0lubGluZURhdGEoIiIsICIiLCAwKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiIiwgIiIsIDApXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCIiLCAiIiwgMCldCisgICAgICAgIC8vW0lubGluZURhdGEoIiIsICIiLCAwKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiIiwgIiIsIDApXQorCisgICAgICAgIHB1YmxpYyB2b2lkIFdDMDA1X0NvbXBhcmVfQ2FzZUluc2Vuc2l0aXZlKHN0cmluZyBuYW1lMSwgc3RyaW5nIG5hbWUyLCBpbnQgcmV2aXNpb25Db3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlMURvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTEpKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZTJEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUyKSk7CisKKyAgICAgICAgICAgIHZhciBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlMURvY3guTmFtZSkpOworICAgICAgICAgICAgdmFyIHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2UyRG9jeC5OYW1lKSk7CisgICAgICAgICAgICBpZiAoIXNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkV4aXN0cykKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlMURvY3guRnVsbE5hbWUsIHNvdXJjZTFDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIGlmICghc291cmNlMkNvcGllZFRvRGVzdERvY3guRXhpc3RzKQorICAgICAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2UyRG9jeC5GdWxsTmFtZSwgc291cmNlMkNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICBpZiAoc19PcGVuV29yZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UxRG9jeEZvcldvcmQgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTEpKTsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2UyRG9jeEZvcldvcmQgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZTIpKTsKKworICAgICAgICAgICAgICAgIHZhciBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeEZvcldvcmQgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZTFEb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLUZvci1Xb3JkLmRvY3giKSkpOworICAgICAgICAgICAgICAgIHZhciBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeEZvcldvcmQgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZTJEb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLUZvci1Xb3JkLmRvY3giKSkpOworICAgICAgICAgICAgICAgIGlmICghc291cmNlMUNvcGllZFRvRGVzdERvY3hGb3JXb3JkLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZTFEb2N4LkZ1bGxOYW1lLCBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeEZvcldvcmQuRnVsbE5hbWUpOworICAgICAgICAgICAgICAgIGlmICghc291cmNlMkNvcGllZFRvRGVzdERvY3hGb3JXb3JkLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZTJEb2N4LkZ1bGxOYW1lLCBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeEZvcldvcmQuRnVsbE5hbWUpOworCisgICAgICAgICAgICAgICAgRmlsZUluZm8gd29yZEV4ZSA9IG5ldyBGaWxlSW5mbyhAIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IE9mZmljZVxyb290XE9mZmljZTE2XFdJTldPUkQuRVhFIik7CisgICAgICAgICAgICAgICAgdmFyIHBhdGggPSBuZXcgRGlyZWN0b3J5SW5mbyhAIkM6XFVzZXJzXEVyaWNcRG9jdW1lbnRzXFdpbmRvd3NQb3dlclNoZWxsTW9kdWxlc1xPcGVuLVhtbC1Qb3dlclRvb2xzXFRlc3RGaWxlcyIpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBzb3VyY2UyQ29waWVkVG9EZXN0RG9jeEZvcldvcmQpOworICAgICAgICAgICAgICAgIFdvcmRSdW5uZXIuUnVuV29yZCh3b3JkRXhlLCBzb3VyY2UxQ29waWVkVG9EZXN0RG9jeEZvcldvcmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICB2YXIgYmVmb3JlID0gc291cmNlMUNvcGllZFRvRGVzdERvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsICIiKTsKKyAgICAgICAgICAgIHZhciBhZnRlciA9IHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiIik7CisgICAgICAgICAgICB2YXIgZG9jeFdpdGhSZXZpc2lvbnNGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgYmVmb3JlICsgIi1DT01QQVJFLSIgKyBhZnRlciArICIuZG9jeCIpKTsKKworICAgICAgICAgICAgV21sRG9jdW1lbnQgc291cmNlMVdtbCA9IG5ldyBXbWxEb2N1bWVudChzb3VyY2UxQ29waWVkVG9EZXN0RG9jeC5GdWxsTmFtZSk7CisgICAgICAgICAgICBXbWxEb2N1bWVudCBzb3VyY2UyV21sID0gbmV3IFdtbERvY3VtZW50KHNvdXJjZTJDb3BpZWRUb0Rlc3REb2N4LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgV21sQ29tcGFyZXJTZXR0aW5ncygpOworICAgICAgICAgICAgc2V0dGluZ3MuQ2FzZUluc2Vuc2l0aXZlID0gdHJ1ZTsKKyAgICAgICAgICAgIHNldHRpbmdzLkN1bHR1cmVJbmZvID0gU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmU7CisgICAgICAgICAgICBXbWxEb2N1bWVudCBjb21wYXJlZFdtbCA9IFdtbENvbXBhcmVyLkNvbXBhcmUoc291cmNlMVdtbCwgc291cmNlMldtbCwgc2V0dGluZ3MpOworICAgICAgICAgICAgY29tcGFyZWRXbWwuU2F2ZUFzKGRvY3hXaXRoUmV2aXNpb25zRmkuRnVsbE5hbWUpOworCisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKGNvbXBhcmVkV21sLkRvY3VtZW50Qnl0ZUFycmF5LCAwLCBjb21wYXJlZFdtbC5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obXMsIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT3BlblhtbFZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgT3BlblhtbFZhbGlkYXRvcigpOworICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gdmFsaWRhdG9yLlZhbGlkYXRlKHdEb2MpLldoZXJlKGUgPT4gIUV4cGVjdGVkRXJyb3JzLkNvbnRhaW5zKGUuRGVzY3JpcHRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9ycy5Db3VudCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kID0gIiAgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZXJyIGluIGVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIkVycm9yIiArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpbmQgKyAiRXJyb3JUeXBlOiAiICsgZXJyLkVycm9yVHlwZS5Ub1N0cmluZygpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJEZXNjcmlwdGlvbjogIiArIGVyci5EZXNjcmlwdGlvbiArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpbmQgKyAiUGFydDogIiArIGVyci5QYXJ0LlVyaS5Ub1N0cmluZygpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJYUGF0aDogIiArIGVyci5QYXRoLlhQYXRoICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgiIiwgc2JzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgaWYgKHNfT3BlbldvcmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZUluZm8gd29yZEV4ZSA9IG5ldyBGaWxlSW5mbyhAIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IE9mZmljZVxyb290XE9mZmljZTE2XFdJTldPUkQuRVhFIik7CisgICAgICAgICAgICAgICAgV29yZFJ1bm5lci5SdW5Xb3JkKHdvcmRFeGUsIGRvY3hXaXRoUmV2aXNpb25zRmkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICBXbWxEb2N1bWVudCByZXZpc2lvbldtbCA9IG5ldyBXbWxEb2N1bWVudChkb2N4V2l0aFJldmlzaW9uc0ZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIHZhciByZXZpc2lvbnMgPSBXbWxDb21wYXJlci5HZXRSZXZpc2lvbnMocmV2aXNpb25XbWwsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbChyZXZpc2lvbkNvdW50LCByZXZpc2lvbnMuQ291bnQoKSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVmFsaWRhdGVEb2N1bWVudChXbWxEb2N1bWVudCB3bWxUb1ZhbGlkYXRlKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKHdtbFRvVmFsaWRhdGUuRG9jdW1lbnRCeXRlQXJyYXksIDAsIHdtbFRvVmFsaWRhdGUuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1zLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IE9wZW5YbWxWYWxpZGF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9ycyA9IHZhbGlkYXRvci5WYWxpZGF0ZSh3RG9jKS5XaGVyZShlID0+ICFFeHBlY3RlZEVycm9ycy5Db250YWlucyhlLkRlc2NyaXB0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMuQ291bnQoKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kID0gIiAgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZXJyIGluIGVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIkVycm9yIiArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpbmQgKyAiRXJyb3JUeXBlOiAiICsgZXJyLkVycm9yVHlwZS5Ub1N0cmluZygpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJEZXNjcmlwdGlvbjogIiArIGVyci5EZXNjcmlwdGlvbiArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpbmQgKyAiUGFydDogIiArIGVyci5QYXJ0LlVyaS5Ub1N0cmluZygpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZCArICJYUGF0aDogIiArIGVyci5QYXRoLlhQYXRoICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgiIiwgc2JzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nW10gRXhwZWN0ZWRFcnJvcnMgPSBuZXcgc3RyaW5nW10geworICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmZpcnN0Um93JyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46bGFzdFJvdycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmZpcnN0Q29sdW1uJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46bGFzdENvbHVtbicgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOm5vSEJhbmQnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpub1ZCYW5kJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46YWxsU3R5bGVzJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46Y3VzdG9tU3R5bGVzJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46bGF0ZW50U3R5bGVzJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46c3R5bGVzSW5Vc2UnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpoZWFkaW5nU3R5bGVzJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46bnVtYmVyaW5nU3R5bGVzJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46dGFibGVTdHlsZXMnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbjpkaXJlY3RGb3JtYXR0aW5nT25SdW5zJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46ZGlyZWN0Rm9ybWF0dGluZ09uUGFyYWdyYXBocycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmRpcmVjdEZvcm1hdHRpbmdPbk51bWJlcmluZycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmRpcmVjdEZvcm1hdHRpbmdPblRhYmxlcycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmNsZWFyRm9ybWF0dGluZycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOnRvcDNIZWFkaW5nU3R5bGVzJyBhdHRyaWJ1dGUgaXMgbm90IGRlY2xhcmVkLiIsCisgICAgICAgICAgICAiVGhlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46dmlzaWJsZVN0eWxlcycgYXR0cmlidXRlIGlzIG5vdCBkZWNsYXJlZC4iLAorICAgICAgICAgICAgIlRoZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOmFsdGVybmF0ZVN0eWxlTmFtZXMnIGF0dHJpYnV0ZSBpcyBub3QgZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICJUaGUgYXR0cmlidXRlICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW46dmFsJyBoYXMgaW52YWxpZCB2YWx1ZSAnMCcuIFRoZSBNaW5JbmNsdXNpdmUgY29uc3RyYWludCBmYWlsZWQuIFRoZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLiIsCisgICAgICAgICAgICAiVGhlIGF0dHJpYnV0ZSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluOnZhbCcgaGFzIGludmFsaWQgdmFsdWUgJzAnLiBUaGUgTWluSW5jbHVzaXZlIGNvbnN0cmFpbnQgZmFpbGVkLiBUaGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMi4iLAorICAgICAgICB9OworCisgICAgfQorI2lmIGZhbHNlCisgICAgcHVibGljIGNsYXNzIFdvcmRSdW5uZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSdW5Xb3JkKEZpbGVJbmZvIGV4ZWN1dGFibGVQYXRoLCBGaWxlSW5mbyBkb2N4UGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGV4ZWN1dGFibGVQYXRoLkV4aXN0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoUHJvY2VzcyBwcm9jID0gbmV3IFByb2Nlc3MoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb2MuU3RhcnRJbmZvLkZpbGVOYW1lID0gZXhlY3V0YWJsZVBhdGguRnVsbE5hbWU7CisgICAgICAgICAgICAgICAgICAgIHByb2MuU3RhcnRJbmZvLkFyZ3VtZW50cyA9IGRvY3hQYXRoLkZ1bGxOYW1lOworICAgICAgICAgICAgICAgICAgICBwcm9jLlN0YXJ0SW5mby5Xb3JraW5nRGlyZWN0b3J5ID0gZG9jeFBhdGguRGlyZWN0b3J5TmFtZTsKKyAgICAgICAgICAgICAgICAgICAgcHJvYy5TdGFydEluZm8uVXNlU2hlbGxFeGVjdXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHByb2MuU3RhcnRJbmZvLlJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBwcm9jLlN0YXJ0SW5mby5SZWRpcmVjdFN0YW5kYXJkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBwcm9jLlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBleGVjdXRhYmxlIHBhdGguIiwgImV4ZWN1dGFibGVQYXRoIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9XbWxDb250ZW50QXRvbUxpc3RUZXN0cy5jcyBiL09wZW5YbWxQb3dlclRvb2xzLlRlc3RzL1dtbENvbnRlbnRBdG9tTGlzdFRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Njg0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy5UZXN0cy9XbWxDb250ZW50QXRvbUxpc3RUZXN0cy5jcwpAQCAtMCwwICsxLDE1NyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDT1BZX0ZJTEVTX0ZPUl9ERUJVR0dJTkcKKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nLkltYWdpbmc7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7Cit1c2luZyBYdW5pdDsKKworI2lmICFFTElERV9YVU5JVF9URVNUUworCituYW1lc3BhY2UgT3hQdAoreworICAgIHB1YmxpYyBjbGFzcyBDYVRlc3RzCisgICAgeworICAgICAgICBbVGhlb3J5XQorICAgICAgICBbSW5saW5lRGF0YSgiQ0EvQ0EwMDEtUGxhaW4uZG9jeCIsIDYwKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNBL0NBMDAyLUJvb2ttYXJrLmRvY3giLCA3KV0KKyAgICAgICAgW0lubGluZURhdGEoIkNBL0NBMDAzLU51bWJlcmVkLUxpc3QuZG9jeCIsIDgpXQorICAgICAgICBbSW5saW5lRGF0YSgiQ0EvQ0EwMDQtVHdvUGFyYXMuZG9jeCIsIDg4KV0KKyAgICAgICAgW0lubGluZURhdGEoIkNBL0NBMDA1LVRhYmxlLmRvY3giLCAyNyldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDQS9DQTAwNi1Db250ZW50Q29udHJvbC5kb2N4IiwgNjApXQorICAgICAgICBbSW5saW5lRGF0YSgiQ0EvQ0EwMDctRGF5TG9uZy5kb2N4IiwgMTApXQorICAgICAgICBbSW5saW5lRGF0YSgiQ0EvQ0EwMDgtRm9vdG5vdGUtUmVmZXJlbmNlLmRvY3giLCAyMyldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDQS9DQTAxMC1EZWxldGUtUnVuLmRvY3giLCAxNildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDQS9DQTAxMS1JbnNlcnQtUnVuLmRvY3giLCAxNildCisgICAgICAgIFtJbmxpbmVEYXRhKCJDQS9DQTAxMi1mbGRTaW1wbGUuZG9jeCIsIDEwKV0KKyAgICAgICAgW0lubGluZURhdGEoIkNBL0NBMDEzLUxvdHMtb2YtU3R1ZmYuZG9jeCIsIDE2OCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJDQS9DQTAxNC1Db21wbGV4LVRhYmxlLmRvY3giLCAxOTMpXQorICAgICAgICBbSW5saW5lRGF0YSgiV0MvV0MwMjQtVGFibGUtQmVmb3JlLmRvY3giLCAyNCldCisgICAgICAgIFtJbmxpbmVEYXRhKCJXQy9XQzAyNC1UYWJsZS1BZnRlcjIuZG9jeCIsIDE4KV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiIiwgMCldCisgICAgICAgIC8vW0lubGluZURhdGEoIiIsIDApXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCIiLCAwKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiIiwgMCldCisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBDQTAwMV9Db250ZW50QXRvbXMoc3RyaW5nIG5hbWUsIGludCBjb250ZW50QXRvbUNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBzb3VyY2VEb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5Tb3VyY2VEaXIuRnVsbE5hbWUsIG5hbWUpKTsKKworICAgICAgICAgICAgdmFyIHRoaXNHdWlkID0gR3VpZC5OZXdHdWlkKCkuVG9TdHJpbmcoKS5SZXBsYWNlKCItIiwgIiIpOworICAgICAgICAgICAgdmFyIHNvdXJjZUNvcGllZFRvRGVzdERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZURvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsIHN0cmluZy5Gb3JtYXQoIi17MH0tMS1Tb3VyY2UuZG9jeCIsIHRoaXNHdWlkKSkpKTsKKyAgICAgICAgICAgIGlmICghc291cmNlQ29waWVkVG9EZXN0RG9jeC5FeGlzdHMpCisgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZURvY3guRnVsbE5hbWUsIHNvdXJjZUNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworCisgICAgICAgICAgICB2YXIgY29hbGVzY2VkRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4Iiwgc3RyaW5nLkZvcm1hdCgiLXswfS0yLUNvYWxlc2NlZC5kb2N4IiwgdGhpc0d1aWQpKSkpOworICAgICAgICAgICAgaWYgKCFjb2FsZXNjZWREb2N4LkV4aXN0cykKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlRG9jeC5GdWxsTmFtZSwgY29hbGVzY2VkRG9jeC5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIHZhciBjb250ZW50QXRvbURhdGFGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4Iiwgc3RyaW5nLkZvcm1hdCgiLXswfS0zLUNvbnRlbnRBdG9tRGF0YS50eHQiLCB0aGlzR3VpZCkpKSk7CisKKyAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oY29hbGVzY2VkRG9jeC5GdWxsTmFtZSwgdHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNvbnRlbnRQYXJlbnQgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCkuUm9vdC5FbGVtZW50KFcuYm9keSk7CisgICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gbmV3IFdtbENvbXBhcmVyU2V0dGluZ3MoKTsKKyAgICAgICAgICAgICAgICBDb21wYXJpc29uVW5pdEF0b21bXSBjb250ZW50QXRvbUxpc3QgPSBXbWxDb21wYXJlci5DcmVhdGVDb21wYXJpc29uVW5pdEF0b21MaXN0KHdEb2MuTWFpbkRvY3VtZW50UGFydCwgY29udGVudFBhcmVudCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIHZhciBwYXJ0ID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0OworCisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJQYXJ0OiB7MH0iLCBwYXJ0LlVyaS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKENvbXBhcmlzb25Vbml0LkNvbXBhcmlzb25Vbml0TGlzdFRvU3RyaW5nKGNvbnRlbnRBdG9tTGlzdC5Ub0FycmF5KCkpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKEVudmlyb25tZW50Lk5ld0xpbmUpOworCisgICAgICAgICAgICAgICAgWERvY3VtZW50IG5ld01haW5YRG9jID0gV21sQ29tcGFyZXIuQ29hbGVzY2UoY29udGVudEF0b21MaXN0KTsKKyAgICAgICAgICAgICAgICB2YXIgcGFydFhEb2MgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgcGFydFhEb2MuUm9vdC5SZXBsYWNlV2l0aChuZXdNYWluWERvYy5Sb290KTsKKyAgICAgICAgICAgICAgICB3RG9jLk1haW5Eb2N1bWVudFBhcnQuUHV0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgICAgICBGaWxlLldyaXRlQWxsVGV4dChjb250ZW50QXRvbURhdGFGaS5GdWxsTmFtZSwgc2IuVG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoY29udGVudEF0b21Db3VudCwgY29udGVudEF0b21MaXN0LkNvdW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1RoZW9yeV0KKyAgICAgICAgW0lubGluZURhdGEoIkhDMDA5LVRlc3QtMDQuZG9jeCIpXQorICAgICAgICBwdWJsaWMgdm9pZCBDQTAwMl9Bbm5vdGF0aW9ucyhzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gc291cmNlRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuU291cmNlRGlyLkZ1bGxOYW1lLCBuYW1lKSk7CisKKyNpZiBDT1BZX0ZJTEVTX0ZPUl9ERUJVR0dJTkcKKyAgICAgICAgICAgIHZhciBzb3VyY2VDb3BpZWRUb0Rlc3REb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2VEb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLTEtU291cmNlLmRvY3giKSkpOworICAgICAgICAgICAgaWYgKCFzb3VyY2VDb3BpZWRUb0Rlc3REb2N4LkV4aXN0cykKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlRG9jeC5GdWxsTmFtZSwgc291cmNlQ29waWVkVG9EZXN0RG9jeC5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIHZhciBhbm5vdGF0ZWREb2N4ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZXN0VXRpbC5UZW1wRGlyLkZ1bGxOYW1lLCBzb3VyY2VEb2N4Lk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLTItQW5ub3RhdGVkLmRvY3giKSkpOworICAgICAgICAgICAgaWYgKCFhbm5vdGF0ZWREb2N4LkV4aXN0cykKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlRG9jeC5GdWxsTmFtZSwgYW5ub3RhdGVkRG9jeC5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oYW5ub3RhdGVkRG9jeC5GdWxsTmFtZSwgdHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNvbnRlbnRQYXJlbnQgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCkuUm9vdC5FbGVtZW50KFcuYm9keSk7CisgICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gbmV3IFdtbENvbXBhcmVyU2V0dGluZ3MoKTsKKyAgICAgICAgICAgICAgICBXbWxDb21wYXJlci5DcmVhdGVDb21wYXJpc29uVW5pdEF0b21MaXN0KHdEb2MuTWFpbkRvY3VtZW50UGFydCwgY29udGVudFBhcmVudCwgc2V0dGluZ3MpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBbVGhlb3J5XQorICAgICAgICBbSW5saW5lRGF0YSgiQ0EvQ0EwMDktYWx0Q2h1bmsuZG9jeCIpXQorICAgICAgICAvL1tJbmxpbmVEYXRhKCIiKV0KKyAgICAgICAgLy9bSW5saW5lRGF0YSgiIildCisgICAgICAgIC8vW0lubGluZURhdGEoIiIpXQorCisgICAgICAgIHB1YmxpYyB2b2lkIENBMDAzX0NvbnRlbnRBdG9tc19UaHJvd3Moc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIHNvdXJjZURvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlNvdXJjZURpci5GdWxsTmFtZSwgbmFtZSkpOworICAgICAgICAgICAgdmFyIHRoaXNHdWlkID0gR3VpZC5OZXdHdWlkKCkuVG9TdHJpbmcoKS5SZXBsYWNlKCItIiwgIiIpOworICAgICAgICAgICAgdmFyIHNvdXJjZUNvcGllZFRvRGVzdERvY3ggPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKFRlc3RVdGlsLlRlbXBEaXIuRnVsbE5hbWUsIHNvdXJjZURvY3guTmFtZS5SZXBsYWNlKCIuZG9jeCIsIHN0cmluZy5Gb3JtYXQoIi17MH0tMS1Tb3VyY2UuZG9jeCIsIHRoaXNHdWlkKSkpKTsKKyAgICAgICAgICAgIGlmICghc291cmNlQ29waWVkVG9EZXN0RG9jeC5FeGlzdHMpCisgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZURvY3guRnVsbE5hbWUsIHNvdXJjZUNvcGllZFRvRGVzdERvY3guRnVsbE5hbWUpOworCisgICAgICAgICAgICB2YXIgY29hbGVzY2VkRG9jeCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4Iiwgc3RyaW5nLkZvcm1hdCgiLXswfS0yLUNvYWxlc2NlZC5kb2N4IiwgdGhpc0d1aWQpKSkpOworICAgICAgICAgICAgaWYgKCFjb2FsZXNjZWREb2N4LkV4aXN0cykKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoc291cmNlRG9jeC5GdWxsTmFtZSwgY29hbGVzY2VkRG9jeC5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgIHZhciBjb250ZW50QXRvbURhdGFGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoVGVzdFV0aWwuVGVtcERpci5GdWxsTmFtZSwgc291cmNlRG9jeC5OYW1lLlJlcGxhY2UoIi5kb2N4Iiwgc3RyaW5nLkZvcm1hdCgiLXswfS0zLUNvbnRlbnRBdG9tRGF0YS50eHQiLCB0aGlzR3VpZCkpKSk7CisKKyAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oY29hbGVzY2VkRG9jeC5GdWxsTmFtZSwgdHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LlRocm93czxOb3RTdXBwb3J0ZWRFeGNlcHRpb24+KCgpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudFBhcmVudCA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKS5Sb290LkVsZW1lbnQoVy5ib2R5KTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gbmV3IFdtbENvbXBhcmVyU2V0dGluZ3MoKTsKKyAgICAgICAgICAgICAgICAgICAgV21sQ29tcGFyZXIuQ3JlYXRlQ29tcGFyaXNvblVuaXRBdG9tTGlzdCh3RG9jLk1haW5Eb2N1bWVudFBhcnQsIGNvbnRlbnRQYXJlbnQsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy5zbG4gYi9PcGVuWG1sUG93ZXJUb29scy5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwODJmOAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzLnNsbgpAQCAtMCwwICsxLDI3MiBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDE1CitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTUuMC4yNzEzMC4yMDM2CitNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEwLjAuNDAyMTkuMQorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJPcGVuWG1sUG93ZXJUb29scyIsICJPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiLCAiezZGOTU3RkYzLUFGQ0MtNEQ2OS04RkJDLTcxQUUyMUJDNDVDOX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIkNoYXJ0VXBkYXRlcjAxIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcQ2hhcnRVcGRhdGVyMDFcQ2hhcnRVcGRhdGVyMDEuY3Nwcm9qIiwgInsxQjAzRDI0Ri1GQjA4LTQyRTEtQkIyNS0yRDFCQjkwNzk5MUJ9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJEb2N1bWVudEJ1aWxkZXIwMSIsICJPcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzXERvY3VtZW50QnVpbGRlcjAxXERvY3VtZW50QnVpbGRlcjAxLmNzcHJvaiIsICJ7QThBNkZDRjAtQ0E0Ri00NjM3LThFNjYtRDg2NjAzQjkyMjA0fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiRG9jdW1lbnRCdWlsZGVyMDIiLCAiT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlc1xEb2N1bWVudEJ1aWxkZXIwMlxEb2N1bWVudEJ1aWxkZXIwMi5jc3Byb2oiLCAie0JGODE1M0FBLUMzOTAtNEQwMC05OEYyLTA4M0RFRkVDNzA5NH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIkRvY3VtZW50QnVpbGRlcjAzIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcRG9jdW1lbnRCdWlsZGVyMDNcRG9jdW1lbnRCdWlsZGVyMDMuY3Nwcm9qIiwgIntCRTYzNTY3Mi1EM0ZELTQyQzUtOTZFMy1FREU1MEUwNUNFMjl9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJEb2N1bWVudEJ1aWxkZXIwNCIsICJPcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzXERvY3VtZW50QnVpbGRlcjA0XERvY3VtZW50QnVpbGRlcjA0LmNzcHJvaiIsICJ7Q0UwRUNBQkItMDNBRC00MkNFLUE1QkQtRDBDQzREQ0UzNUFCfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiRmllbGRSZXRyaWV2ZXIwMSIsICJPcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzXEZpZWxkUmV0cmlldmVyMDFcRmllbGRSZXRyaWV2ZXIwMS5jc3Byb2oiLCAie0UxRkQ3QjE1LUZBMDktNEY3Ri1BMzBFLTlGQkQ5Rjc2NUQwMn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIkZvcm1hdHRpbmdBc3NlbWJsZXIwMSIsICJPcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzXEZvcm1hdHRpbmdBc3NlbWJsZXIwMVxGb3JtYXR0aW5nQXNzZW1ibGVyMDEuY3Nwcm9qIiwgIns2RUFGMTVCNi05OEJFLTQyOEItQTAxOC1BNTI2NjUyMTU1MUV9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJGb3JtdWxhczAxIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcRm9ybXVsYXMwMVxGb3JtdWxhczAxLmNzcHJvaiIsICJ7NjE4Qjk1REItM0E3MC00REM4LUJEODctMDBGNjM2RjcyNDUzfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiSHRtbENvbnZlcnRlcjAxIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcSHRtbENvbnZlcnRlcjAxXEh0bWxDb252ZXJ0ZXIwMS5jc3Byb2oiLCAie0JDOUU3NDA4LTUwOEQtNDgyRC04NjAyLTk2RTc2QUNCQjVFQX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIkxpc3RJdGVtUmV0cmlldmVyMDEiLCAiT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlc1xMaXN0SXRlbVJldHJpZXZlcjAxXExpc3RJdGVtUmV0cmlldmVyMDEuY3Nwcm9qIiwgInswNDkzNUZBNi1FNDhCLTQ5NkYtOEQ2QS00MUE1OTIzMjMwM0R9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJNYXJrdXBTaW1wbGlmaWVyQXBwIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcTWFya3VwU2ltcGxpZmllckFwcFxNYXJrdXBTaW1wbGlmaWVyQXBwLmNzcHJvaiIsICJ7MENDRTgzQkEtOEI4Qi00Qjk4LTg4NDYtQjYyQTYxRkRGMTcwfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiTWV0cmljc0dldHRlcjAxIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcTWV0cmljc0dldHRlcjAxXE1ldHJpY3NHZXR0ZXIwMS5jc3Byb2oiLCAie0VEMzczNzJDLURGQkYtNDcyMC1CRDRCLUNFMTQxNTk2MTAzOH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIk9wZW5YbWxSZWdleDAxIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcT3BlblhtbFJlZ2V4MDFcT3BlblhtbFJlZ2V4MDEuY3Nwcm9qIiwgIns0MzMwRDQ2Ri02NzAzLTRCQTItODQ0RC0xNzdGNzIyQzA4MjB9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJQaXZvdFRhYmxlczAxIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcUGl2b3RUYWJsZXMwMVxQaXZvdFRhYmxlczAxLmNzcHJvaiIsICJ7Njc4NUE1NTQtQkJCQi00ODBDLThFNEQtOUZFOTBERDkxQTQ2fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiUHJlc2VudGF0aW9uQnVpbGRlcjAxIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcUHJlc2VudGF0aW9uQnVpbGRlcjAxXFByZXNlbnRhdGlvbkJ1aWxkZXIwMS5jc3Byb2oiLCAie0E0MTI4OTM1LUI3MDctNEQ1Ni1COTI0LTI3OTEwRUM5MjY2NH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlByZXNlbnRhdGlvbkJ1aWxkZXIwMiIsICJPcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzXFByZXNlbnRhdGlvbkJ1aWxkZXIwMlxQcmVzZW50YXRpb25CdWlsZGVyMDIuY3Nwcm9qIiwgIns0OTUwNjBCNC1CRDgwLTRCMTgtQUM0NC00NjgwRjBENkQ1REJ9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJSZWZlcmVuY2VBZGRlcjAxIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcUmVmZXJlbmNlQWRkZXIwMVxSZWZlcmVuY2VBZGRlcjAxLmNzcHJvaiIsICJ7MjExRjA1RDMtRjhFRS00OTdGLTlERTktQUZGQTBBNzIxNDBEfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiUmV2aXNpb25BY2NlcHRlcjAxIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcUmV2aXNpb25BY2NlcHRlcjAxXFJldmlzaW9uQWNjZXB0ZXIwMS5jc3Byb2oiLCAiezg0ODIzQkE1LUI4NjAtNENBRi04ODVFLTk4MUQ3RjEyMTgzMH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRleHRSZXBsYWNlcjAxIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcVGV4dFJlcGxhY2VyMDFcVGV4dFJlcGxhY2VyMDEuY3Nwcm9qIiwgIns1Q0EyOUI0NC1DNEE1LTQzMTAtOTQyOS01NTNGMEJDOUZDMUR9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUZXh0UmVwbGFjZXIwMiIsICJPcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzXFRleHRSZXBsYWNlcjAyXFRleHRSZXBsYWNlcjAyLmNzcHJvaiIsICJ7MTUzRTUyMTgtRTlDMC00RUQ4LTkwNzMtMDgwMjIwNEM4QjkwfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiRG9jdW1lbnRBc3NlbWJsZXIwMSIsICJPcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzXERvY3VtZW50QXNzZW1ibGVyMDFcRG9jdW1lbnRBc3NlbWJsZXIwMS5jc3Byb2oiLCAie0VGRTc3NjU4LUVERDctNDU5Ny04MDE2LUNCRTRBMTg5NTFCMH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIkRvY3VtZW50QXNzZW1ibGVyIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcRG9jdW1lbnRBc3NlbWJsZXJcRG9jdW1lbnRBc3NlbWJsZXIuY3Nwcm9qIiwgInsyRDA4MUEzNi00OEY5LTRBMDktODI0Ny00MjA2ODI1NDU0OTJ9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJTcHJlYWRzaGVldFdyaXRlcjAxIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcU3ByZWFkc2hlZXRXcml0ZXIwMVxTcHJlYWRzaGVldFdyaXRlcjAxLmNzcHJvaiIsICJ7MDkxMUY5OTYtREY4Ni00RkIxLUExQ0UtMDUzOTU5OUVDMEUwfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiU3ByZWFkc2hlZXRXcml0ZXIwMiIsICJPcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzXFNwcmVhZHNoZWV0V3JpdGVyMDJcU3ByZWFkc2hlZXRXcml0ZXIwMi5jc3Byb2oiLCAie0RGMUQ4NEFGLTI3QjgtNEY4Ny1BNjczLUNDRkFEQzNBQUYwMn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIk9wZW5YbWxQb3dlclRvb2xzLlRlc3RzIiwgIk9wZW5YbWxQb3dlclRvb2xzLlRlc3RzXE9wZW5YbWxQb3dlclRvb2xzLlRlc3RzLmNzcHJvaiIsICJ7QjEzMjhCNzAtMzNCOC00MEUwLUE3MjktMzhDMzRENjU5QjVDfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiRG9jdW1lbnRBc3NlbWJsZXIwMiIsICJPcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzXERvY3VtZW50QXNzZW1ibGVyMDJcRG9jdW1lbnRBc3NlbWJsZXIwMi5jc3Byb2oiLCAie0Q2REZBQzdDLTgyRjQtNDMxOC1BOUYwLTY0NTBEMjk0NUQ5Nn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIkh0bWxUb1dtbENvbnZlcnRlcjAxIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcSHRtbFRvV21sQ29udmVydGVyMDFcSHRtbFRvV21sQ29udmVydGVyMDEuY3Nwcm9qIiwgIns5RTE5NEQxMy1GNUEwLTQ0MzAtOEY4Ny1ENzQzMjY0NTczODV9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJEb2N1bWVudEFzc2VtYmxlcjAzIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcRG9jdW1lbnRBc3NlbWJsZXIwM1xEb2N1bWVudEFzc2VtYmxlcjAzLmNzcHJvaiIsICJ7MjE0RjBFODAtRDJFMy00RTE5LUEzRkMtMkJFMTVCMzkwNkIwfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiSHRtbFRvV21sQ29udmVydGVyMDIiLCAiT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlc1xIdG1sVG9XbWxDb252ZXJ0ZXIwMlxIdG1sVG9XbWxDb252ZXJ0ZXIwMi5jc3Byb2oiLCAiezFFNzVDQjdELTJBNEEtNEIwMy04MEE5LTdCN0Q1OUIxOEJCNH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIldtbFRvSHRtbENvbnZlcnRlcjAxIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcV21sVG9IdG1sQ29udmVydGVyMDFcV21sVG9IdG1sQ29udmVydGVyMDEuY3Nwcm9qIiwgInszOTZEOTIwOS0wRDlBLTRFNjEtOTQ3MS0wNEM3MUY2Q0E2Qjl9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJXbWxUb0h0bWxDb252ZXJ0ZXIwMiIsICJPcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzXFdtbFRvSHRtbENvbnZlcnRlcjAyXFdtbFRvSHRtbENvbnZlcnRlcjAyLmNzcHJvaiIsICJ7RDQwNzgwMTEtMjYxMS00NkE3LThBMzAtNTVFNEFCOEZBNzg2fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiU21sRGF0YVJldHJpZXZlcjAxIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcU21sRGF0YVJldHJpZXZlcjAxXFNtbERhdGFSZXRyaWV2ZXIwMS5jc3Byb2oiLCAie0RDRThFQzUxLTFFNTgtNDlBMC04MkNGLTVCRTI2OUZBMEE5RH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIldtbENvbXBhcmVyMDEiLCAiT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlc1xXbWxDb21wYXJlcjAxXFdtbENvbXBhcmVyMDEuY3Nwcm9qIiwgIntDOUNBQTY5Qy01NzVBLTQ0MkUtOUQ4QS02OUM1M0IzOUQ3MkN9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJXbWxDb21wYXJlcjAyIiwgIk9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcV21sQ29tcGFyZXIwMlxXbWxDb21wYXJlcjAyLmNzcHJvaiIsICJ7M0QxQzQ2RTEtN0E5RS00QTRCLThEOTUtNjg2MTM2MDNERURGfSIKK0VuZFByb2plY3QKK1Byb2plY3QoInsyMTUwRTMzMy04RkRDLTQyQTMtOTQ3NC0xQTM5NTZENDZERTh9IikgPSAiZXhhbXBsZXMiLCAiZXhhbXBsZXMiLCAie0E4M0Q2QjU4LTZEMzgtNDZBRi04QzIwLTVDRkMxNzBBMTA2M30iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7MjE1MEUzMzMtOEZEQy00MkEzLTk0NzQtMUEzOTU2RDQ2REU4fSIpID0gIlNvbHV0aW9uIEl0ZW1zIiwgIlNvbHV0aW9uIEl0ZW1zIiwgIns5QUZCOEM5Ni0xRTZFLTQ4M0UtOTg4Mi03NUQyNDgzRTcwNzZ9IgorCVByb2plY3RTZWN0aW9uKFNvbHV0aW9uSXRlbXMpID0gcHJlUHJvamVjdAorCQlMSUNFTlNFLnR4dCA9IExJQ0VOU0UudHh0CisJCVJFQURNRS5tZCA9IFJFQURNRS5tZAorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezZGOTU3RkYzLUFGQ0MtNEQ2OS04RkJDLTcxQUUyMUJDNDVDOX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs2Rjk1N0ZGMy1BRkNDLTRENjktOEZCQy03MUFFMjFCQzQ1Qzl9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezZGOTU3RkYzLUFGQ0MtNEQ2OS04RkJDLTcxQUUyMUJDNDVDOX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NkY5NTdGRjMtQUZDQy00RDY5LThGQkMtNzFBRTIxQkM0NUM5fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MUIwM0QyNEYtRkIwOC00MkUxLUJCMjUtMkQxQkI5MDc5OTFCfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezFCMDNEMjRGLUZCMDgtNDJFMS1CQjI1LTJEMUJCOTA3OTkxQn0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MUIwM0QyNEYtRkIwOC00MkUxLUJCMjUtMkQxQkI5MDc5OTFCfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsxQjAzRDI0Ri1GQjA4LTQyRTEtQkIyNS0yRDFCQjkwNzk5MUJ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBOEE2RkNGMC1DQTRGLTQ2MzctOEU2Ni1EODY2MDNCOTIyMDR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QThBNkZDRjAtQ0E0Ri00NjM3LThFNjYtRDg2NjAzQjkyMjA0fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBOEE2RkNGMC1DQTRGLTQ2MzctOEU2Ni1EODY2MDNCOTIyMDR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E4QTZGQ0YwLUNBNEYtNDYzNy04RTY2LUQ4NjYwM0I5MjIwNH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0JGODE1M0FBLUMzOTAtNEQwMC05OEYyLTA4M0RFRkVDNzA5NH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCRjgxNTNBQS1DMzkwLTREMDAtOThGMi0wODNERUZFQzcwOTR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0JGODE1M0FBLUMzOTAtNEQwMC05OEYyLTA4M0RFRkVDNzA5NH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QkY4MTUzQUEtQzM5MC00RDAwLTk4RjItMDgzREVGRUM3MDk0fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QkU2MzU2NzItRDNGRC00MkM1LTk2RTMtRURFNTBFMDVDRTI5fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0JFNjM1NjcyLUQzRkQtNDJDNS05NkUzLUVERTUwRTA1Q0UyOX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QkU2MzU2NzItRDNGRC00MkM1LTk2RTMtRURFNTBFMDVDRTI5fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCRTYzNTY3Mi1EM0ZELTQyQzUtOTZFMy1FREU1MEUwNUNFMjl9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDRTBFQ0FCQi0wM0FELTQyQ0UtQTVCRC1EMENDNERDRTM1QUJ9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7Q0UwRUNBQkItMDNBRC00MkNFLUE1QkQtRDBDQzREQ0UzNUFCfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDRTBFQ0FCQi0wM0FELTQyQ0UtQTVCRC1EMENDNERDRTM1QUJ9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0NFMEVDQUJCLTAzQUQtNDJDRS1BNUJELUQwQ0M0RENFMzVBQn0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UxRkQ3QjE1LUZBMDktNEY3Ri1BMzBFLTlGQkQ5Rjc2NUQwMn0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMUZEN0IxNS1GQTA5LTRGN0YtQTMwRS05RkJEOUY3NjVEMDJ9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0UxRkQ3QjE1LUZBMDktNEY3Ri1BMzBFLTlGQkQ5Rjc2NUQwMn0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTFGRDdCMTUtRkEwOS00RjdGLUEzMEUtOUZCRDlGNzY1RDAyfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NkVBRjE1QjYtOThCRS00MjhCLUEwMTgtQTUyNjY1MjE1NTFFfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezZFQUYxNUI2LTk4QkUtNDI4Qi1BMDE4LUE1MjY2NTIxNTUxRX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NkVBRjE1QjYtOThCRS00MjhCLUEwMTgtQTUyNjY1MjE1NTFFfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs2RUFGMTVCNi05OEJFLTQyOEItQTAxOC1BNTI2NjUyMTU1MUV9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs2MThCOTVEQi0zQTcwLTREQzgtQkQ4Ny0wMEY2MzZGNzI0NTN9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NjE4Qjk1REItM0E3MC00REM4LUJEODctMDBGNjM2RjcyNDUzfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs2MThCOTVEQi0zQTcwLTREQzgtQkQ4Ny0wMEY2MzZGNzI0NTN9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezYxOEI5NURCLTNBNzAtNERDOC1CRDg3LTAwRjYzNkY3MjQ1M30uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0JDOUU3NDA4LTUwOEQtNDgyRC04NjAyLTk2RTc2QUNCQjVFQX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCQzlFNzQwOC01MDhELTQ4MkQtODYwMi05NkU3NkFDQkI1RUF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0JDOUU3NDA4LTUwOEQtNDgyRC04NjAyLTk2RTc2QUNCQjVFQX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QkM5RTc0MDgtNTA4RC00ODJELTg2MDItOTZFNzZBQ0JCNUVBfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MDQ5MzVGQTYtRTQ4Qi00OTZGLThENkEtNDFBNTkyMzIzMDNEfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezA0OTM1RkE2LUU0OEItNDk2Ri04RDZBLTQxQTU5MjMyMzAzRH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MDQ5MzVGQTYtRTQ4Qi00OTZGLThENkEtNDFBNTkyMzIzMDNEfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswNDkzNUZBNi1FNDhCLTQ5NkYtOEQ2QS00MUE1OTIzMjMwM0R9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQ0NFODNCQS04QjhCLTRCOTgtODg0Ni1CNjJBNjFGREYxNzB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MENDRTgzQkEtOEI4Qi00Qjk4LTg4NDYtQjYyQTYxRkRGMTcwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQ0NFODNCQS04QjhCLTRCOTgtODg0Ni1CNjJBNjFGREYxNzB9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDQ0U4M0JBLThCOEItNEI5OC04ODQ2LUI2MkE2MUZERjE3MH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0VEMzczNzJDLURGQkYtNDcyMC1CRDRCLUNFMTQxNTk2MTAzOH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFRDM3MzcyQy1ERkJGLTQ3MjAtQkQ0Qi1DRTE0MTU5NjEwMzh9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0VEMzczNzJDLURGQkYtNDcyMC1CRDRCLUNFMTQxNTk2MTAzOH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RUQzNzM3MkMtREZCRi00NzIwLUJENEItQ0UxNDE1OTYxMDM4fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NDMzMEQ0NkYtNjcwMy00QkEyLTg0NEQtMTc3RjcyMkMwODIwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQzMzBENDZGLTY3MDMtNEJBMi04NDRELTE3N0Y3MjJDMDgyMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NDMzMEQ0NkYtNjcwMy00QkEyLTg0NEQtMTc3RjcyMkMwODIwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0MzMwRDQ2Ri02NzAzLTRCQTItODQ0RC0xNzdGNzIyQzA4MjB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs2Nzg1QTU1NC1CQkJCLTQ4MEMtOEU0RC05RkU5MEREOTFBNDZ9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7Njc4NUE1NTQtQkJCQi00ODBDLThFNEQtOUZFOTBERDkxQTQ2fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs2Nzg1QTU1NC1CQkJCLTQ4MEMtOEU0RC05RkU5MEREOTFBNDZ9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezY3ODVBNTU0LUJCQkItNDgwQy04RTRELTlGRTkwREQ5MUE0Nn0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MTI4OTM1LUI3MDctNEQ1Ni1COTI0LTI3OTEwRUM5MjY2NH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBNDEyODkzNS1CNzA3LTRENTYtQjkyNC0yNzkxMEVDOTI2NjR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0E0MTI4OTM1LUI3MDctNEQ1Ni1COTI0LTI3OTEwRUM5MjY2NH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QTQxMjg5MzUtQjcwNy00RDU2LUI5MjQtMjc5MTBFQzkyNjY0fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NDk1MDYwQjQtQkQ4MC00QjE4LUFDNDQtNDY4MEYwRDZENURCfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ5NTA2MEI0LUJEODAtNEIxOC1BQzQ0LTQ2ODBGMEQ2RDVEQn0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NDk1MDYwQjQtQkQ4MC00QjE4LUFDNDQtNDY4MEYwRDZENURCfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTUwNjBCNC1CRDgwLTRCMTgtQUM0NC00NjgwRjBENkQ1REJ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTFGMDVEMy1GOEVFLTQ5N0YtOURFOS1BRkZBMEE3MjE0MER9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MjExRjA1RDMtRjhFRS00OTdGLTlERTktQUZGQTBBNzIxNDBEfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTFGMDVEMy1GOEVFLTQ5N0YtOURFOS1BRkZBMEE3MjE0MER9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMUYwNUQzLUY4RUUtNDk3Ri05REU5LUFGRkEwQTcyMTQwRH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezg0ODIzQkE1LUI4NjAtNENBRi04ODVFLTk4MUQ3RjEyMTgzMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs4NDgyM0JBNS1CODYwLTRDQUYtODg1RS05ODFEN0YxMjE4MzB9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezg0ODIzQkE1LUI4NjAtNENBRi04ODVFLTk4MUQ3RjEyMTgzMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7ODQ4MjNCQTUtQjg2MC00Q0FGLTg4NUUtOTgxRDdGMTIxODMwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NUNBMjlCNDQtQzRBNS00MzEwLTk0MjktNTUzRjBCQzlGQzFEfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezVDQTI5QjQ0LUM0QTUtNDMxMC05NDI5LTU1M0YwQkM5RkMxRH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NUNBMjlCNDQtQzRBNS00MzEwLTk0MjktNTUzRjBCQzlGQzFEfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs1Q0EyOUI0NC1DNEE1LTQzMTAtOTQyOS01NTNGMEJDOUZDMUR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsxNTNFNTIxOC1FOUMwLTRFRDgtOTA3My0wODAyMjA0QzhCOTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MTUzRTUyMTgtRTlDMC00RUQ4LTkwNzMtMDgwMjIwNEM4QjkwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsxNTNFNTIxOC1FOUMwLTRFRDgtOTA3My0wODAyMjA0QzhCOTB9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezE1M0U1MjE4LUU5QzAtNEVEOC05MDczLTA4MDIyMDRDOEI5MH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0VGRTc3NjU4LUVERDctNDU5Ny04MDE2LUNCRTRBMTg5NTFCMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFRkU3NzY1OC1FREQ3LTQ1OTctODAxNi1DQkU0QTE4OTUxQjB9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0VGRTc3NjU4LUVERDctNDU5Ny04MDE2LUNCRTRBMTg5NTFCMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RUZFNzc2NTgtRURENy00NTk3LTgwMTYtQ0JFNEExODk1MUIwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MkQwODFBMzYtNDhGOS00QTA5LTgyNDctNDIwNjgyNTQ1NDkyfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezJEMDgxQTM2LTQ4RjktNEEwOS04MjQ3LTQyMDY4MjU0NTQ5Mn0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MkQwODFBMzYtNDhGOS00QTA5LTgyNDctNDIwNjgyNTQ1NDkyfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyRDA4MUEzNi00OEY5LTRBMDktODI0Ny00MjA2ODI1NDU0OTJ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswOTExRjk5Ni1ERjg2LTRGQjEtQTFDRS0wNTM5NTk5RUMwRTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MDkxMUY5OTYtREY4Ni00RkIxLUExQ0UtMDUzOTU5OUVDMEUwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswOTExRjk5Ni1ERjg2LTRGQjEtQTFDRS0wNTM5NTk5RUMwRTB9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezA5MTFGOTk2LURGODYtNEZCMS1BMUNFLTA1Mzk1OTlFQzBFMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0RGMUQ4NEFGLTI3QjgtNEY4Ny1BNjczLUNDRkFEQzNBQUYwMn0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtERjFEODRBRi0yN0I4LTRGODctQTY3My1DQ0ZBREMzQUFGMDJ9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0RGMUQ4NEFGLTI3QjgtNEY4Ny1BNjczLUNDRkFEQzNBQUYwMn0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7REYxRDg0QUYtMjdCOC00Rjg3LUE2NzMtQ0NGQURDM0FBRjAyfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QjEzMjhCNzAtMzNCOC00MEUwLUE3MjktMzhDMzRENjU5QjVDfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0IxMzI4QjcwLTMzQjgtNDBFMC1BNzI5LTM4QzM0RDY1OUI1Q30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QjEzMjhCNzAtMzNCOC00MEUwLUE3MjktMzhDMzRENjU5QjVDfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCMTMyOEI3MC0zM0I4LTQwRTAtQTcyOS0zOEMzNEQ2NTlCNUN9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtENkRGQUM3Qy04MkY0LTQzMTgtQTlGMC02NDUwRDI5NDVEOTZ9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RDZERkFDN0MtODJGNC00MzE4LUE5RjAtNjQ1MEQyOTQ1RDk2fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtENkRGQUM3Qy04MkY0LTQzMTgtQTlGMC02NDUwRDI5NDVEOTZ9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q2REZBQzdDLTgyRjQtNDMxOC1BOUYwLTY0NTBEMjk0NUQ5Nn0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezlFMTk0RDEzLUY1QTAtNDQzMC04Rjg3LUQ3NDMyNjQ1NzM4NX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RTE5NEQxMy1GNUEwLTQ0MzAtOEY4Ny1ENzQzMjY0NTczODV9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezlFMTk0RDEzLUY1QTAtNDQzMC04Rjg3LUQ3NDMyNjQ1NzM4NX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7OUUxOTREMTMtRjVBMC00NDMwLThGODctRDc0MzI2NDU3Mzg1fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MjE0RjBFODAtRDJFMy00RTE5LUEzRkMtMkJFMTVCMzkwNkIwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezIxNEYwRTgwLUQyRTMtNEUxOS1BM0ZDLTJCRTE1QjM5MDZCMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MjE0RjBFODAtRDJFMy00RTE5LUEzRkMtMkJFMTVCMzkwNkIwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTRGMEU4MC1EMkUzLTRFMTktQTNGQy0yQkUxNUIzOTA2QjB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsxRTc1Q0I3RC0yQTRBLTRCMDMtODBBOS03QjdENTlCMThCQjR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MUU3NUNCN0QtMkE0QS00QjAzLTgwQTktN0I3RDU5QjE4QkI0fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsxRTc1Q0I3RC0yQTRBLTRCMDMtODBBOS03QjdENTlCMThCQjR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezFFNzVDQjdELTJBNEEtNEIwMy04MEE5LTdCN0Q1OUIxOEJCNH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezM5NkQ5MjA5LTBEOUEtNEU2MS05NDcxLTA0QzcxRjZDQTZCOX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXszOTZEOTIwOS0wRDlBLTRFNjEtOTQ3MS0wNEM3MUY2Q0E2Qjl9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezM5NkQ5MjA5LTBEOUEtNEU2MS05NDcxLTA0QzcxRjZDQTZCOX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7Mzk2RDkyMDktMEQ5QS00RTYxLTk0NzEtMDRDNzFGNkNBNkI5fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RDQwNzgwMTEtMjYxMS00NkE3LThBMzAtNTVFNEFCOEZBNzg2fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0Q0MDc4MDExLTI2MTEtNDZBNy04QTMwLTU1RTRBQjhGQTc4Nn0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RDQwNzgwMTEtMjYxMS00NkE3LThBMzAtNTVFNEFCOEZBNzg2fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtENDA3ODAxMS0yNjExLTQ2QTctOEEzMC01NUU0QUI4RkE3ODZ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtEQ0U4RUM1MS0xRTU4LTQ5QTAtODJDRi01QkUyNjlGQTBBOUR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RENFOEVDNTEtMUU1OC00OUEwLTgyQ0YtNUJFMjY5RkEwQTlEfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtEQ0U4RUM1MS0xRTU4LTQ5QTAtODJDRi01QkUyNjlGQTBBOUR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0RDRThFQzUxLTFFNTgtNDlBMC04MkNGLTVCRTI2OUZBMEE5RH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0M5Q0FBNjlDLTU3NUEtNDQyRS05RDhBLTY5QzUzQjM5RDcyQ30uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDOUNBQTY5Qy01NzVBLTQ0MkUtOUQ4QS02OUM1M0IzOUQ3MkN9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0M5Q0FBNjlDLTU3NUEtNDQyRS05RDhBLTY5QzUzQjM5RDcyQ30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QzlDQUE2OUMtNTc1QS00NDJFLTlEOEEtNjlDNTNCMzlENzJDfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7M0QxQzQ2RTEtN0E5RS00QTRCLThEOTUtNjg2MTM2MDNERURGfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezNEMUM0NkUxLTdBOUUtNEE0Qi04RDk1LTY4NjEzNjAzREVERn0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7M0QxQzQ2RTEtN0E5RS00QTRCLThEOTUtNjg2MTM2MDNERURGfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXszRDFDNDZFMS03QTlFLTRBNEItOEQ5NS02ODYxMzYwM0RFREZ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKE5lc3RlZFByb2plY3RzKSA9IHByZVNvbHV0aW9uCisJCXsxQjAzRDI0Ri1GQjA4LTQyRTEtQkIyNS0yRDFCQjkwNzk5MUJ9ID0ge0E4M0Q2QjU4LTZEMzgtNDZBRi04QzIwLTVDRkMxNzBBMTA2M30KKwkJe0E4QTZGQ0YwLUNBNEYtNDYzNy04RTY2LUQ4NjYwM0I5MjIwNH0gPSB7QTgzRDZCNTgtNkQzOC00NkFGLThDMjAtNUNGQzE3MEExMDYzfQorCQl7QkY4MTUzQUEtQzM5MC00RDAwLTk4RjItMDgzREVGRUM3MDk0fSA9IHtBODNENkI1OC02RDM4LTQ2QUYtOEMyMC01Q0ZDMTcwQTEwNjN9CisJCXtCRTYzNTY3Mi1EM0ZELTQyQzUtOTZFMy1FREU1MEUwNUNFMjl9ID0ge0E4M0Q2QjU4LTZEMzgtNDZBRi04QzIwLTVDRkMxNzBBMTA2M30KKwkJe0NFMEVDQUJCLTAzQUQtNDJDRS1BNUJELUQwQ0M0RENFMzVBQn0gPSB7QTgzRDZCNTgtNkQzOC00NkFGLThDMjAtNUNGQzE3MEExMDYzfQorCQl7RTFGRDdCMTUtRkEwOS00RjdGLUEzMEUtOUZCRDlGNzY1RDAyfSA9IHtBODNENkI1OC02RDM4LTQ2QUYtOEMyMC01Q0ZDMTcwQTEwNjN9CisJCXs2RUFGMTVCNi05OEJFLTQyOEItQTAxOC1BNTI2NjUyMTU1MUV9ID0ge0E4M0Q2QjU4LTZEMzgtNDZBRi04QzIwLTVDRkMxNzBBMTA2M30KKwkJezYxOEI5NURCLTNBNzAtNERDOC1CRDg3LTAwRjYzNkY3MjQ1M30gPSB7QTgzRDZCNTgtNkQzOC00NkFGLThDMjAtNUNGQzE3MEExMDYzfQorCQl7QkM5RTc0MDgtNTA4RC00ODJELTg2MDItOTZFNzZBQ0JCNUVBfSA9IHtBODNENkI1OC02RDM4LTQ2QUYtOEMyMC01Q0ZDMTcwQTEwNjN9CisJCXswNDkzNUZBNi1FNDhCLTQ5NkYtOEQ2QS00MUE1OTIzMjMwM0R9ID0ge0E4M0Q2QjU4LTZEMzgtNDZBRi04QzIwLTVDRkMxNzBBMTA2M30KKwkJezBDQ0U4M0JBLThCOEItNEI5OC04ODQ2LUI2MkE2MUZERjE3MH0gPSB7QTgzRDZCNTgtNkQzOC00NkFGLThDMjAtNUNGQzE3MEExMDYzfQorCQl7RUQzNzM3MkMtREZCRi00NzIwLUJENEItQ0UxNDE1OTYxMDM4fSA9IHtBODNENkI1OC02RDM4LTQ2QUYtOEMyMC01Q0ZDMTcwQTEwNjN9CisJCXs0MzMwRDQ2Ri02NzAzLTRCQTItODQ0RC0xNzdGNzIyQzA4MjB9ID0ge0E4M0Q2QjU4LTZEMzgtNDZBRi04QzIwLTVDRkMxNzBBMTA2M30KKwkJezY3ODVBNTU0LUJCQkItNDgwQy04RTRELTlGRTkwREQ5MUE0Nn0gPSB7QTgzRDZCNTgtNkQzOC00NkFGLThDMjAtNUNGQzE3MEExMDYzfQorCQl7QTQxMjg5MzUtQjcwNy00RDU2LUI5MjQtMjc5MTBFQzkyNjY0fSA9IHtBODNENkI1OC02RDM4LTQ2QUYtOEMyMC01Q0ZDMTcwQTEwNjN9CisJCXs0OTUwNjBCNC1CRDgwLTRCMTgtQUM0NC00NjgwRjBENkQ1REJ9ID0ge0E4M0Q2QjU4LTZEMzgtNDZBRi04QzIwLTVDRkMxNzBBMTA2M30KKwkJezIxMUYwNUQzLUY4RUUtNDk3Ri05REU5LUFGRkEwQTcyMTQwRH0gPSB7QTgzRDZCNTgtNkQzOC00NkFGLThDMjAtNUNGQzE3MEExMDYzfQorCQl7ODQ4MjNCQTUtQjg2MC00Q0FGLTg4NUUtOTgxRDdGMTIxODMwfSA9IHtBODNENkI1OC02RDM4LTQ2QUYtOEMyMC01Q0ZDMTcwQTEwNjN9CisJCXs1Q0EyOUI0NC1DNEE1LTQzMTAtOTQyOS01NTNGMEJDOUZDMUR9ID0ge0E4M0Q2QjU4LTZEMzgtNDZBRi04QzIwLTVDRkMxNzBBMTA2M30KKwkJezE1M0U1MjE4LUU5QzAtNEVEOC05MDczLTA4MDIyMDRDOEI5MH0gPSB7QTgzRDZCNTgtNkQzOC00NkFGLThDMjAtNUNGQzE3MEExMDYzfQorCQl7RUZFNzc2NTgtRURENy00NTk3LTgwMTYtQ0JFNEExODk1MUIwfSA9IHtBODNENkI1OC02RDM4LTQ2QUYtOEMyMC01Q0ZDMTcwQTEwNjN9CisJCXsyRDA4MUEzNi00OEY5LTRBMDktODI0Ny00MjA2ODI1NDU0OTJ9ID0ge0E4M0Q2QjU4LTZEMzgtNDZBRi04QzIwLTVDRkMxNzBBMTA2M30KKwkJezA5MTFGOTk2LURGODYtNEZCMS1BMUNFLTA1Mzk1OTlFQzBFMH0gPSB7QTgzRDZCNTgtNkQzOC00NkFGLThDMjAtNUNGQzE3MEExMDYzfQorCQl7REYxRDg0QUYtMjdCOC00Rjg3LUE2NzMtQ0NGQURDM0FBRjAyfSA9IHtBODNENkI1OC02RDM4LTQ2QUYtOEMyMC01Q0ZDMTcwQTEwNjN9CisJCXtENkRGQUM3Qy04MkY0LTQzMTgtQTlGMC02NDUwRDI5NDVEOTZ9ID0ge0E4M0Q2QjU4LTZEMzgtNDZBRi04QzIwLTVDRkMxNzBBMTA2M30KKwkJezlFMTk0RDEzLUY1QTAtNDQzMC04Rjg3LUQ3NDMyNjQ1NzM4NX0gPSB7QTgzRDZCNTgtNkQzOC00NkFGLThDMjAtNUNGQzE3MEExMDYzfQorCQl7MjE0RjBFODAtRDJFMy00RTE5LUEzRkMtMkJFMTVCMzkwNkIwfSA9IHtBODNENkI1OC02RDM4LTQ2QUYtOEMyMC01Q0ZDMTcwQTEwNjN9CisJCXsxRTc1Q0I3RC0yQTRBLTRCMDMtODBBOS03QjdENTlCMThCQjR9ID0ge0E4M0Q2QjU4LTZEMzgtNDZBRi04QzIwLTVDRkMxNzBBMTA2M30KKwkJezM5NkQ5MjA5LTBEOUEtNEU2MS05NDcxLTA0QzcxRjZDQTZCOX0gPSB7QTgzRDZCNTgtNkQzOC00NkFGLThDMjAtNUNGQzE3MEExMDYzfQorCQl7RDQwNzgwMTEtMjYxMS00NkE3LThBMzAtNTVFNEFCOEZBNzg2fSA9IHtBODNENkI1OC02RDM4LTQ2QUYtOEMyMC01Q0ZDMTcwQTEwNjN9CisJCXtEQ0U4RUM1MS0xRTU4LTQ5QTAtODJDRi01QkUyNjlGQTBBOUR9ID0ge0E4M0Q2QjU4LTZEMzgtNDZBRi04QzIwLTVDRkMxNzBBMTA2M30KKwkJe0M5Q0FBNjlDLTU3NUEtNDQyRS05RDhBLTY5QzUzQjM5RDcyQ30gPSB7QTgzRDZCNTgtNkQzOC00NkFGLThDMjAtNUNGQzE3MEExMDYzfQorCQl7M0QxQzQ2RTEtN0E5RS00QTRCLThEOTUtNjg2MTM2MDNERURGfSA9IHtBODNENkI1OC02RDM4LTQ2QUYtOEMyMC01Q0ZDMTcwQTEwNjN9CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUdsb2JhbHMpID0gcG9zdFNvbHV0aW9uCisJCVNvbHV0aW9uR3VpZCA9IHtFNjIzRUZGNS0yQ0E0LTRGQTAtQjNBQi01M0Y5MjFEQTIxMkV9CisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9DaGFydFVwZGF0ZXIuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9DaGFydFVwZGF0ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiMjE4MQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzL0NoYXJ0VXBkYXRlci5jcwpAQCAtMCwwICsxLDYxNyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgcHVibGljIGVudW0gQ2hhcnREYXRhVHlwZQorICAgIHsKKyAgICAgICAgTnVtYmVyLAorICAgICAgICBTdHJpbmcsCisgICAgICAgIERhdGVUaW1lLAorICAgIH0KKworICAgIC8vIEZvcm1hdCBDb2RlcworICAgIC8vIDAgLSBnZW5lcmFsCisgICAgLy8gMSAtIDAKKyAgICAvLyAyIC0gMC4wMAorICAgIC8vIDMgLSAjLCMjMAorICAgIC8vIDQgLSAjLCMjMC4wMAorICAgIC8vIDkgLSAwJQorICAgIC8vIDEwIC0gMC4wMCUKKyAgICAvLyAxMSAtIDAuMDBFKzAwCisgICAgLy8gMTIgLSAjID8vPworICAgIC8vIDEzIC0gIyA/Py8/PworICAgIC8vIDE0IC0gbW0tZGQteXkKKyAgICAvLyAxNSAtIGQtbW1tLXl5CisgICAgLy8gMTYgLSBkLW1tbQorICAgIC8vIDE3IC0gbW1tLXl5CisgICAgLy8gMTggLSBoOm1tIEFNL1BNCisgICAgLy8gMTkgLSBoOm1tOnNzIEFNL1BNCisgICAgLy8gMjAgLSBoOm1tCisgICAgLy8gMjEgLSBoOm1tOnNzCisgICAgLy8gMjIgLSBtL2QveXkgaDptbQorICAgIC8vIDM3IC0gIywjIzAgOygjLCMjMCkKKyAgICAvLyAzOCAtICMsIyMwIDtbUmVkXSgjLCMjMCkKKyAgICAvLyAzOSAtICMsIyMwLjAwOygjLCMjMC4wMCkKKyAgICAvLyA0MCAtICMsIyMwLjAwO1tSZWRdKCMsIyMwLjAwKQorICAgIC8vIDQ1IC0gbW06c3MKKyAgICAvLyA0NiAtIFtoXTptbTpzcworICAgIC8vIDQ3IC0gbW1zcy4wCisgICAgLy8gNDggLSAjIzAuMEUrMAorICAgIC8vIDQ5IC0gQAorCisgICAgcHVibGljIGNsYXNzIENoYXJ0RGF0YQorICAgIHsKKyAgICAgICAgcHVibGljIHN0cmluZ1tdIFNlcmllc05hbWVzOworCisgICAgICAgIHB1YmxpYyBDaGFydERhdGFUeXBlIENhdGVnb3J5RGF0YVR5cGU7CisgICAgICAgIHB1YmxpYyBpbnQgQ2F0ZWdvcnlGb3JtYXRDb2RlOworICAgICAgICBwdWJsaWMgc3RyaW5nW10gQ2F0ZWdvcnlOYW1lczsKKworICAgICAgICBwdWJsaWMgZG91YmxlW11bXSBWYWx1ZXM7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIENoYXJ0VXBkYXRlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIFVwZGF0ZUNoYXJ0KFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYywgc3RyaW5nIGNvbnRlbnRDb250cm9sVGFnLCBDaGFydERhdGEgY2hhcnREYXRhKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbWFpbkRvY3VtZW50UGFydCA9IHdEb2MuTWFpbkRvY3VtZW50UGFydDsKKyAgICAgICAgICAgIHZhciBtZFhEb2MgPSBtYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgdmFyIGNjID0gbWRYRG9jLkRlc2NlbmRhbnRzKFcuc2R0KQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChzZHQgPT4gKHN0cmluZylzZHQuRWxlbWVudHMoVy5zZHRQcikuRWxlbWVudHMoVy50YWcpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCkgPT0gY29udGVudENvbnRyb2xUYWcpOworICAgICAgICAgICAgaWYgKGNjICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNoYXJ0UmlkID0gKHN0cmluZyljYy5EZXNjZW5kYW50cyhDLmNoYXJ0KS5BdHRyaWJ1dGVzKFIuaWQpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJ0UmlkICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDaGFydFBhcnQgY2hhcnRQYXJ0ID0gKENoYXJ0UGFydCltYWluRG9jdW1lbnRQYXJ0LkdldFBhcnRCeUlkKGNoYXJ0UmlkKTsKKyAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ2hhcnQoY2hhcnRQYXJ0LCBjaGFydERhdGEpOworICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q29udGVudCA9IGNjLkVsZW1lbnRzKFcuc2R0Q29udGVudCkuRWxlbWVudHMoKS5TZWxlY3QoZSA9PiBuZXcgWEVsZW1lbnQoZSkpOworICAgICAgICAgICAgICAgICAgICBjYy5SZXBsYWNlV2l0aChuZXdDb250ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgbWFpbkRvY3VtZW50UGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFVwZGF0ZUNoYXJ0KENoYXJ0UGFydCBjaGFydFBhcnQsIENoYXJ0RGF0YSBjaGFydERhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaGFydERhdGEuVmFsdWVzLkxlbmd0aCAhPSBjaGFydERhdGEuU2VyaWVzTmFtZXMuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBjaGFydCBkYXRhIik7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgc2VyIGluIGNoYXJ0RGF0YS5WYWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNlci5MZW5ndGggIT0gY2hhcnREYXRhLkNhdGVnb3J5TmFtZXMuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgY2hhcnQgZGF0YSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBVcGRhdGVTZXJpZXMoY2hhcnRQYXJ0LCBjaGFydERhdGEpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxpbnQsIHN0cmluZz4gRm9ybWF0Q29kZXMgPSBuZXcgRGljdGlvbmFyeTxpbnQsIHN0cmluZz4oKQorICAgICAgICB7CisgICAgICAgICAgICB7IDAsICJnZW5lcmFsIiB9LAorICAgICAgICAgICAgeyAxLCAiMCIgfSwKKyAgICAgICAgICAgIHsgMiwgIjAuMDAiIH0sCisgICAgICAgICAgICB7IDMsICIjLCMjMCIgfSwKKyAgICAgICAgICAgIHsgNCwgIiMsIyMwLjAwIiB9LAorICAgICAgICAgICAgeyA5LCAiMCUiIH0sCisgICAgICAgICAgICB7IDEwLCAiMC4wMCUiIH0sCisgICAgICAgICAgICB7IDExLCAiMC4wMEUrMDAiIH0sCisgICAgICAgICAgICB7IDEyLCAiIyA/Lz8iIH0sCisgICAgICAgICAgICB7IDEzLCAiIyA/Py8/PyIgfSwKKyAgICAgICAgICAgIHsgMTQsICJtbS1kZC15eSIgfSwKKyAgICAgICAgICAgIHsgMTUsICJkLW1tbS15eSIgfSwKKyAgICAgICAgICAgIHsgMTYsICJkLW1tbSIgfSwKKyAgICAgICAgICAgIHsgMTcsICJtbW0teXkiIH0sCisgICAgICAgICAgICB7IDE4LCAiaDptbSBBTS9QTSIgfSwKKyAgICAgICAgICAgIHsgMTksICJoOm1tOnNzIEFNL1BNIiB9LAorICAgICAgICAgICAgeyAyMCwgImg6bW0iIH0sCisgICAgICAgICAgICB7IDIxLCAiaDptbTpzcyIgfSwKKyAgICAgICAgICAgIHsgMjIsICJtL2QveXkgaDptbSIgfSwKKyAgICAgICAgICAgIHsgMzcsICIjLCMjMCA7KCMsIyMwKSIgfSwKKyAgICAgICAgICAgIHsgMzgsICIjLCMjMCA7W1JlZF0oIywjIzApIiB9LAorICAgICAgICAgICAgeyAzOSwgIiMsIyMwLjAwOygjLCMjMC4wMCkiIH0sCisgICAgICAgICAgICB7IDQwLCAiIywjIzAuMDA7W1JlZF0oIywjIzAuMDApIiB9LAorICAgICAgICAgICAgeyA0NSwgIm1tOnNzIiB9LAorICAgICAgICAgICAgeyA0NiwgIltoXTptbTpzcyIgfSwKKyAgICAgICAgICAgIHsgNDcsICJtbXNzLjAiIH0sCisgICAgICAgICAgICB7IDQ4LCAiIyMwLjBFKzAiIH0sCisgICAgICAgICAgICB7IDQ5LCAiQCIgfSwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFVwZGF0ZVNlcmllcyhDaGFydFBhcnQgY2hhcnRQYXJ0LCBDaGFydERhdGEgY2hhcnREYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBVcGRhdGVFbWJlZGRlZFdvcmtib29rKGNoYXJ0UGFydCwgY2hhcnREYXRhKTsKKworICAgICAgICAgICAgWERvY3VtZW50IGNwWERvYyA9IGNoYXJ0UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFhFbGVtZW50IHJvb3QgPSBjcFhEb2MuUm9vdDsKKyAgICAgICAgICAgIHZhciBmaXJzdFNlcmllcyA9IHJvb3QuRGVzY2VuZGFudHMoQy5zZXIpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICB2YXIgbnVtUmVmID0gZmlyc3RTZXJpZXMuRWxlbWVudHMoQy52YWwpLkVsZW1lbnRzKEMubnVtUmVmKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgc3RyaW5nIHNoZWV0TmFtZSA9IG51bGw7CisgICAgICAgICAgICB2YXIgZiA9IChzdHJpbmcpZmlyc3RTZXJpZXMuRGVzY2VuZGFudHMoQy5mKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzaGVldE5hbWUgPSBmLlNwbGl0KCchJylbMF07CisKKyAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgYnV0IGZpcnN0IHNlcmllcworICAgICAgICAgICAgWE5hbWUgY2hhcnRUeXBlID0gZmlyc3RTZXJpZXMuUGFyZW50Lk5hbWU7CisgICAgICAgICAgICBmaXJzdFNlcmllcy5QYXJlbnQuRWxlbWVudHMoQy5zZXIpLlNraXAoMSkuUmVtb3ZlKCk7CisKKyAgICAgICAgICAgIHZhciBuZXdTZXRPZlNlcmllcyA9IGNoYXJ0RGF0YS5TZXJpZXNOYW1lcworICAgICAgICAgICAgICAgIC5TZWxlY3QoKHN0cmluZyBzbiwgaW50IHNpKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgY2F0ID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICB2YXIgb2xkQ2F0ID0gZmlyc3RTZXJpZXMuRWxlbWVudHMoQy5jYXQpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbGRDYXQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW52YWxpZCBjaGFydCBtYXJrdXAiKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgY2F0SGFzRm9ybXVsYSA9IG9sZENhdC5EZXNjZW5kYW50cyhDLmYpLkFueSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2F0SGFzRm9ybXVsYSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3Rm9ybXVsYSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXROYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybXVsYSA9IG5ldyBYRWxlbWVudChDLmYsIHN0cmluZy5Gb3JtYXQoInswfSEkQSQyOiRBJHsxfSIsIHNoZWV0TmFtZSwgY2hhcnREYXRhLkNhdGVnb3J5TmFtZXMuTGVuZ3RoICsgMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJ0RGF0YS5DYXRlZ29yeURhdGFUeXBlID09IENoYXJ0RGF0YVR5cGUuU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdCA9IG5ldyBYRWxlbWVudChDLmNhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMuc3RyUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybXVsYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChDLnN0ckNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChDLnB0Q291bnQsIG5ldyBYQXR0cmlidXRlKCJ2YWwiLCBjaGFydERhdGEuQ2F0ZWdvcnlOYW1lcy5MZW5ndGgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydERhdGEuQ2F0ZWdvcnlOYW1lcy5TZWxlY3QoKHN0cmluZyBjbiwgaW50IGNpKSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1B0ID0gbmV3IFhFbGVtZW50KEMucHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgiaWR4IiwgY2kpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMudiwgY2hhcnREYXRhLkNhdGVnb3J5TmFtZXNbY2ldKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdQdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXQgPSBuZXcgWEVsZW1lbnQoQy5jYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChDLm51bVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm11bGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQy5udW1DYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQy5mb3JtYXRDb2RlLCBGb3JtYXRDb2Rlc1tjaGFydERhdGEuQ2F0ZWdvcnlGb3JtYXRDb2RlXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMucHRDb3VudCwgbmV3IFhBdHRyaWJ1dGUoInZhbCIsIGNoYXJ0RGF0YS5DYXRlZ29yeU5hbWVzLkxlbmd0aCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0RGF0YS5DYXRlZ29yeU5hbWVzLlNlbGVjdCgoc3RyaW5nIGNuLCBpbnQgY2kpID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UHQgPSBuZXcgWEVsZW1lbnQoQy5wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJpZHgiLCBjaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQy52LCBjaGFydERhdGEuQ2F0ZWdvcnlOYW1lc1tjaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1B0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJ0RGF0YS5DYXRlZ29yeURhdGFUeXBlID09IENoYXJ0RGF0YVR5cGUuU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdCA9IG5ldyBYRWxlbWVudChDLmNhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMuc3RyTGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMucHRDb3VudCwgbmV3IFhBdHRyaWJ1dGUoInZhbCIsIGNoYXJ0RGF0YS5DYXRlZ29yeU5hbWVzLkxlbmd0aCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnREYXRhLkNhdGVnb3J5TmFtZXMuU2VsZWN0KChzdHJpbmcgY24sIGludCBjaSkgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UHQgPSBuZXcgWEVsZW1lbnQoQy5wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoImlkeCIsIGNpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMudiwgY2hhcnREYXRhLkNhdGVnb3J5TmFtZXNbY2ldKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1B0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXQgPSBuZXcgWEVsZW1lbnQoQy5jYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChDLm51bUxpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChDLnB0Q291bnQsIG5ldyBYQXR0cmlidXRlKCJ2YWwiLCBjaGFydERhdGEuQ2F0ZWdvcnlOYW1lcy5MZW5ndGgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0RGF0YS5DYXRlZ29yeU5hbWVzLlNlbGVjdCgoc3RyaW5nIGNuLCBpbnQgY2kpID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1B0ID0gbmV3IFhFbGVtZW50KEMucHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJpZHgiLCBjaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChDLnYsIGNoYXJ0RGF0YS5DYXRlZ29yeU5hbWVzW2NpXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdQdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdDdmFsID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXROYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0N2YWwgPSBuZXcgWEVsZW1lbnQoQy52YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChDLm51bUxpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChDLnB0Q291bnQsIG5ldyBYQXR0cmlidXRlKCJ2YWwiLCBjaGFydERhdGEuQ2F0ZWdvcnlOYW1lcy5MZW5ndGgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0RGF0YS5DYXRlZ29yeU5hbWVzLlNlbGVjdCgoc3RyaW5nIGNuLCBpbnQgY2kpID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1B0ID0gbmV3IFhFbGVtZW50KEMucHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJpZHgiLCBjaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChDLnYsIGNoYXJ0RGF0YS5WYWx1ZXNbc2ldW2NpXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdQdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDdmFsID0gbmV3IFhFbGVtZW50KEMudmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQy5udW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldE5hbWUgIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMuZiwgc3RyaW5nLkZvcm1hdCgiezB9ISR7Mn0kMjokezJ9JHsxfSIsIHNoZWV0TmFtZSwgY2hhcnREYXRhLkNhdGVnb3J5TmFtZXMuTGVuZ3RoICsgMSwgU3ByZWFkc2hlZXRNTFV0aWwuSW50VG9Db2x1bW5JZChzaSArIDEpKSkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMubnVtQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXROYW1lICE9IG51bGwgPyBudW1SZWYuRGVzY2VuZGFudHMoQy5mb3JtYXRDb2RlKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMucHRDb3VudCwgbmV3IFhBdHRyaWJ1dGUoInZhbCIsIGNoYXJ0RGF0YS5DYXRlZ29yeU5hbWVzLkxlbmd0aCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0RGF0YS5DYXRlZ29yeU5hbWVzLlNlbGVjdCgoc3RyaW5nIGNuLCBpbnQgY2kpID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UHQgPSBuZXcgWEVsZW1lbnQoQy5wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJpZHgiLCBjaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQy52LCBjaGFydERhdGEuVmFsdWVzW3NpXVtjaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1B0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNlckhhc0Zvcm11bGEgPSBmaXJzdFNlcmllcy5EZXNjZW5kYW50cyhDLmYpLkFueSgpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCB0eCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXJIYXNGb3JtdWxhKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdGb3JtdWxhID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGVldE5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtdWxhID0gbmV3IFhFbGVtZW50KEMuZiwgc3RyaW5nLkZvcm1hdCgiezB9ISR7MX0kMSIsIHNoZWV0TmFtZSwgU3ByZWFkc2hlZXRNTFV0aWwuSW50VG9Db2x1bW5JZChzaSArIDEpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0eCA9IG5ldyBYRWxlbWVudChDLnR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChDLnN0clJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybXVsYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMuc3RyQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQy5wdENvdW50LCBuZXcgWEF0dHJpYnV0ZSgidmFsIiwgMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMucHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoImlkeCIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChDLnYsIGNoYXJ0RGF0YS5TZXJpZXNOYW1lc1tzaV0pKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4ID0gbmV3IFhFbGVtZW50KEMudHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMudiwgY2hhcnREYXRhLlNlcmllc05hbWVzW3NpXSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3U2VyID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcnRUeXBlID09IEMuYXJlYTNEQ2hhcnQgfHwgY2hhcnRUeXBlID09IEMuYXJlYUNoYXJ0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdTZXIgPSBuZXcgWEVsZW1lbnQoQy5zZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMuaWR4LCBuZXcgWEF0dHJpYnV0ZSgidmFsIiwgc2kpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQy5vcmRlciwgbmV3IFhBdHRyaWJ1dGUoInZhbCIsIHNpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXJpZXMuRWxlbWVudHMoQy5zcFByKSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENUX0FyZWFTZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNlcmllcy5FbGVtZW50cyhDLnBpY3R1cmVPcHRpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNlcmllcy5FbGVtZW50cyhDLmRQdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXJpZXMuRWxlbWVudHMoQy5kTGJscyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXJpZXMuRWxlbWVudHMoQy50cmVuZGxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2VyaWVzLkVsZW1lbnRzKEMuZXJyQmFycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0N2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXJpZXMuRWxlbWVudHMoQy5leHRMc3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGFydFR5cGUgPT0gQy5iYXIzRENoYXJ0IHx8IGNoYXJ0VHlwZSA9PSBDLmJhckNoYXJ0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdTZXIgPSBuZXcgWEVsZW1lbnQoQy5zZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMuaWR4LCBuZXcgWEF0dHJpYnV0ZSgidmFsIiwgc2kpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQy5vcmRlciwgbmV3IFhBdHRyaWJ1dGUoInZhbCIsIHNpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXJpZXMuRWxlbWVudHMoQy5zcFByKSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENUX0JhclNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2VyaWVzLkVsZW1lbnRzKEMuaW52ZXJ0SWZOZWdhdGl2ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXJpZXMuRWxlbWVudHMoQy5waWN0dXJlT3B0aW9ucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXJpZXMuRWxlbWVudHMoQy5kUHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2VyaWVzLkVsZW1lbnRzKEMuZExibHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2VyaWVzLkVsZW1lbnRzKEMudHJlbmRsaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNlcmllcy5FbGVtZW50cyhDLmVyckJhcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2VyaWVzLkVsZW1lbnRzKEMuc2hhcGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2VyaWVzLkVsZW1lbnRzKEMuZXh0THN0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hhcnRUeXBlID09IEMubGluZTNEQ2hhcnQgfHwgY2hhcnRUeXBlID09IEMubGluZUNoYXJ0IHx8IGNoYXJ0VHlwZSA9PSBDLnN0b2NrQ2hhcnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NlciA9IG5ldyBYRWxlbWVudChDLnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQy5pZHgsIG5ldyBYQXR0cmlidXRlKCJ2YWwiLCBzaSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChDLm9yZGVyLCBuZXcgWEF0dHJpYnV0ZSgidmFsIiwgc2kpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNlcmllcy5FbGVtZW50cyhDLnNwUHIpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ1RfTGluZVNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2VyaWVzLkVsZW1lbnRzKEMubWFya2VyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNlcmllcy5FbGVtZW50cyhDLmRQdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXJpZXMuRWxlbWVudHMoQy5kTGJscyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXJpZXMuRWxlbWVudHMoQy50cmVuZGxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2VyaWVzLkVsZW1lbnRzKEMuZXJyQmFycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0N2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXJpZXMuRWxlbWVudHMoQy5zbW9vdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2VyaWVzLkVsZW1lbnRzKEMuZXh0THN0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hhcnRUeXBlID09IEMuZG91Z2hudXRDaGFydCB8fCBjaGFydFR5cGUgPT0gQy5vZlBpZUNoYXJ0IHx8IGNoYXJ0VHlwZSA9PSBDLnBpZTNEQ2hhcnQgfHwgY2hhcnRUeXBlID09IEMucGllQ2hhcnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NlciA9IG5ldyBYRWxlbWVudChDLnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQy5pZHgsIG5ldyBYQXR0cmlidXRlKCJ2YWwiLCBzaSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChDLm9yZGVyLCBuZXcgWEF0dHJpYnV0ZSgidmFsIiwgc2kpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNlcmllcy5FbGVtZW50cyhDLnNwUHIpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ1RfUGllU2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXJpZXMuRWxlbWVudHMoQy5leHBsb3Npb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2VyaWVzLkVsZW1lbnRzKEMuZFB0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNlcmllcy5FbGVtZW50cyhDLmRMYmxzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNlcmllcy5FbGVtZW50cyhDLmV4dExzdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJ0VHlwZSA9PSBDLnN1cmZhY2UzRENoYXJ0IHx8IGNoYXJ0VHlwZSA9PSBDLnN1cmZhY2VDaGFydCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2VyID0gbmV3IFhFbGVtZW50KEMuc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1vbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChDLmlkeCwgbmV3IFhBdHRyaWJ1dGUoInZhbCIsIHNpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEMub3JkZXIsIG5ldyBYQXR0cmlidXRlKCJ2YWwiLCBzaSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2VyaWVzLkVsZW1lbnRzKEMuc3BQciksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDVF9TdXJmYWNlU2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0N2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXJpZXMuRWxlbWVudHMoQy5leHRMc3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgY2hhcnQgdHlwZSIpOworCisgICAgICAgICAgICAgICAgICAgIGludCBhY2NlbnROdW1iZXIgPSAoc2kgJSA2KSArIDE7CisgICAgICAgICAgICAgICAgICAgIG5ld1NlciA9IChYRWxlbWVudClVcGRhdGVBY2NlbnRUcmFuc2Zvcm0obmV3U2VyLCBhY2NlbnROdW1iZXIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3U2VyOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZmlyc3RTZXJpZXMuUmVwbGFjZVdpdGgobmV3U2V0T2ZTZXJpZXMpOworICAgICAgICAgICAgY2hhcnRQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBVcGRhdGVFbWJlZGRlZFdvcmtib29rKENoYXJ0UGFydCBjaGFydFBhcnQsIENoYXJ0RGF0YSBjaGFydERhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCBjcFhEb2MgPSBjaGFydFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBYRWxlbWVudCByb290ID0gY3BYRG9jLlJvb3Q7CisgICAgICAgICAgICB2YXIgZmlyc3RTZXJpZXMgPSByb290LkRlc2NlbmRhbnRzKEMuc2VyKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGZpcnN0U2VyaWVzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgdmFyIGZpcnN0Rm9ybXVsYSA9IChzdHJpbmcpZmlyc3RTZXJpZXMuRGVzY2VuZGFudHMoQy5mKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGZpcnN0Rm9ybXVsYSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHZhciBzaGVldCA9IGZpcnN0Rm9ybXVsYS5TcGxpdCgnIScpWzBdOworICAgICAgICAgICAgdmFyIGVtYmVkZGVkU3ByZWFkc2hlZXRSaWQgPSAoc3RyaW5nKXJvb3QuRGVzY2VuZGFudHMoQy5leHRlcm5hbERhdGEpLkF0dHJpYnV0ZXMoUi5pZCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChlbWJlZGRlZFNwcmVhZHNoZWV0UmlkID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgdmFyIGVtYmVkZGVkU3ByZWFkc2hlZXQgPSBjaGFydFBhcnQuR2V0UGFydEJ5SWQoZW1iZWRkZWRTcHJlYWRzaGVldFJpZCk7CisgICAgICAgICAgICBpZiAoZW1iZWRkZWRTcHJlYWRzaGVldCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4oZW1iZWRkZWRTcHJlYWRzaGVldC5HZXRTdHJlYW0oKSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgd29ya2Jvb2tQYXJ0ID0gc0RvYy5Xb3JrYm9va1BhcnQ7CisgICAgICAgICAgICAgICAgICAgIHZhciB3YlJvb3QgPSB3b3JrYm9va1BhcnQuR2V0WERvY3VtZW50KCkuUm9vdDsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNoZWV0UmlkID0gKHN0cmluZyl3YlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnNoZWV0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnNoZWV0KQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKHMgPT4gKHN0cmluZylzLkF0dHJpYnV0ZSgibmFtZSIpID09IHNoZWV0KQorICAgICAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoUi5pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXRSaWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoZWV0UGFydCA9IHdvcmtib29rUGFydC5HZXRQYXJ0QnlJZChzaGVldFJpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeGRTaGVldCA9IHNoZWV0UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaGVldERhdGEgPSB4ZFNoZWV0LkRlc2NlbmRhbnRzKFMuc2hlZXREYXRhKS5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVQYXJ0ID0gd29ya2Jvb2tQYXJ0Lldvcmtib29rU3R5bGVzUGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ZFN0eWxlID0gc3R5bGVQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2F0ZWdvcnlTdHlsZUlkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFydERhdGEuQ2F0ZWdvcnlGb3JtYXRDb2RlICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlTdHlsZUlkID0gQWRkRHhmVG9EeGZzKHhkU2hlZXQsIHhkU3R5bGUsIGNoYXJ0RGF0YS5DYXRlZ29yeUZvcm1hdENvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVQYXJ0LlB1dFhEb2N1bWVudCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RSb3cgPSBuZXcgWEVsZW1lbnQoUy5yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoInIiLCAiMSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJzcGFucyIsIHN0cmluZy5Gb3JtYXQoIjE6ezB9IiwgY2hhcnREYXRhLlNlcmllc05hbWVzLkxlbmd0aCArIDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgW10geyBuZXcgWEVsZW1lbnQoUy5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgiciIsICJBMSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgidCIsICJzdHIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFMudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sICsgInNwYWNlIiwgInByZXNlcnZlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICIpKX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0RGF0YS5TZXJpZXNOYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoKHNuLCBpKSA9PiBuZXcgWEVsZW1lbnQoUy5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgiciIsIFJvd0NvbFRvU3RyaW5nKDAsIGkgKyAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJ0IiwgInN0ciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUy52LCBzbikpKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG90aGVyUm93cyA9IGNoYXJ0RGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5DYXRlZ29yeU5hbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdCgoY24sIHIpID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm93ID0gbmV3IFhFbGVtZW50KFMucm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoInIiLCByICsgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgic3BhbnMiLCBzdHJpbmcuRm9ybWF0KCIxOnswfSIsIGNoYXJ0RGF0YS5TZXJpZXNOYW1lcy5MZW5ndGggKyAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFMuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoInIiLCBSb3dDb2xUb1N0cmluZyhyICsgMSwgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeVN0eWxlSWQgIT0gMCA/IG5ldyBYQXR0cmlidXRlKCJzIiwgY2F0ZWdvcnlTdHlsZUlkKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0RGF0YS5DYXRlZ29yeURhdGFUeXBlID09IENoYXJ0RGF0YVR5cGUuU3RyaW5nID8gbmV3IFhBdHRyaWJ1dGUoInQiLCAic3RyIikgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUy52LCBjbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LkNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtZXJhYmxlLlJhbmdlKDAsIGNoYXJ0RGF0YS5WYWx1ZXMuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KChjLCBjaSkgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGwgPSBuZXcgWEVsZW1lbnQoUy5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJyIiwgUm93Q29sVG9TdHJpbmcociArIDEsIGNpICsgMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChTLnYsIGNoYXJ0RGF0YS5WYWx1ZXNbY2ldW3JdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2VsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbGxSb3dzID0gbmV3W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Um93CisgICAgICAgICAgICAgICAgICAgICAgICB9LkNvbmNhdChvdGhlclJvd3MpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1NoZWV0RGF0YSA9IG5ldyBYRWxlbWVudChTLnNoZWV0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxSb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0RGF0YS5SZXBsYWNlV2l0aChuZXdTaGVldERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXRQYXJ0LlB1dFhEb2N1bWVudCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGVQYXJ0UmlkID0gKHN0cmluZyl4ZFNoZWV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy50YWJsZVBhcnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnRhYmxlUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhSLmlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlUGFydFJpZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJ0VGFibGUgPSBzaGVldFBhcnQuR2V0UGFydEJ5SWQodGFibGVQYXJ0UmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeGRUYWJsZVBhcnQgPSBwYXJ0VGFibGUuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhhUmVmID0geGRUYWJsZVBhcnQuUm9vdC5BdHRyaWJ1dGUoInJlZiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhhUmVmLlZhbHVlID0gc3RyaW5nLkZvcm1hdCgiQTE6ezB9IiwgUm93Q29sVG9TdHJpbmcoY2hhcnREYXRhLkNhdGVnb3J5TmFtZXMuTGVuZ3RoIC0gMSwgY2hhcnREYXRhLlNlcmllc05hbWVzLkxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ZU5ld1RhYmxlQ29sdW1ucyA9IG5ldyBYRWxlbWVudChTLnRhYmxlQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoImNvdW50IiwgY2hhcnREYXRhLlNlcmllc05hbWVzLkNvdW50KCkgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFMudGFibGVDb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoImlkIiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIm5hbWUiLCAiICIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LkNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0RGF0YS5TZXJpZXNOYW1lcy5TZWxlY3QoKGNuLCBjaSkgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUy50YWJsZUNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoImlkIiwgY2kgKyAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIm5hbWUiLCBjbikpKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ZUV4aXN0aW5nVGFibGVDb2x1bW5zID0geGRUYWJsZVBhcnQuUm9vdC5FbGVtZW50KFMudGFibGVDb2x1bW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGVFeGlzdGluZ1RhYmxlQ29sdW1ucyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZUV4aXN0aW5nVGFibGVDb2x1bW5zLlJlcGxhY2VXaXRoKHhlTmV3VGFibGVDb2x1bW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0VGFibGUuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgQWRkRHhmVG9EeGZzKFhEb2N1bWVudCB4ZFNoZWV0LCBYRG9jdW1lbnQgeGRTdHlsZSwgaW50IGZvcm1hdENvZGVUb0FkZCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gYWRkIHhmIHRvIGNlbGxYZnMKKyAgICAgICAgICAgIHZhciBjZWxsWGZzID0geGRTdHlsZQorICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnQoUy5jZWxsWGZzKTsKKyAgICAgICAgICAgIGlmIChjZWxsWGZzID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNlbGxTdHlsZVhmcyA9IHhkU3R5bGUKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQoUy5jZWxsU3R5bGVYZnMpOworICAgICAgICAgICAgICAgIGlmIChjZWxsU3R5bGVYZnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNlbGxTdHlsZVhmcy5BZGRBZnRlclNlbGYoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUy5jZWxsWGZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJjb3VudCIsIDApKSk7CisgICAgICAgICAgICAgICAgICAgIGNlbGxYZnMgPSB4ZFNoZWV0CisgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQoUy5jZWxsWGZzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2VsbFhmcyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBib3JkZXJzID0geGRTdHlsZQorICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudChTLmJvcmRlcnMpOworICAgICAgICAgICAgICAgIGlmIChib3JkZXJzICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib3JkZXJzLkFkZEFmdGVyU2VsZigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChTLmNlbGxYZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoImNvdW50IiwgMCkpKTsKKyAgICAgICAgICAgICAgICAgICAgY2VsbFhmcyA9IHhkU2hlZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudChTLmNlbGxYZnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjZWxsWGZzID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworCisgICAgICAgICAgICB2YXIgY250ID0gKGludCljZWxsWGZzLkF0dHJpYnV0ZSgiY291bnQiKTsKKyAgICAgICAgICAgIGNudCsrOworICAgICAgICAgICAgY2VsbFhmcy5BdHRyaWJ1dGUoImNvdW50IikuVmFsdWUgPSBjbnQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGNlbGxYZnMuQWRkKAorICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChTLnhmLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgibnVtRm10SWQiLCBmb3JtYXRDb2RlVG9BZGQpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgiZm9udElkIiwgMCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJmaWxsSWQiLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoImJvcmRlcklkIiwgMCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJhcHBseU51bWJlckZvcm1hdCIsIDEpKSk7CisgICAgICAgICAgICByZXR1cm4gY250IC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBSb3dDb2xUb1N0cmluZyhpbnQgcm93LCBpbnQgY29sKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc3RyID0gU3ByZWFkc2hlZXRNTFV0aWwuSW50VG9Db2x1bW5JZChjb2wpICsgKHJvdyArIDEpLlRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gc3RyOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFVwZGF0ZUFjY2VudFRyYW5zZm9ybShYTm9kZSBub2RlLCBpbnQgYWNjZW50TnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBBLnNjaGVtZUNsciAmJiAoc3RyaW5nKWVsZW1lbnQuQXR0cmlidXRlKCJ2YWwiKSA9PSAiYWNjZW50MSIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoQS5zY2hlbWVDbHIsIG5ldyBYQXR0cmlidXRlKCJ2YWwiLCAiYWNjZW50IiArIGFjY2VudE51bWJlcikpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVXBkYXRlQWNjZW50VHJhbnNmb3JtKG4sIGFjY2VudE51bWJlcikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIFVwZGF0ZUNoYXJ0KFByZXNlbnRhdGlvbkRvY3VtZW50IHBEb2MsIGludCBzbGlkZU51bWJlciwgQ2hhcnREYXRhIGNoYXJ0RGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHByZXNlbnRhdGlvblBhcnQgPSBwRG9jLlByZXNlbnRhdGlvblBhcnQ7CisgICAgICAgICAgICB2YXIgcFhEb2MgPSBwcmVzZW50YXRpb25QYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgdmFyIHNsZElkRWxlbWVudCA9IHBYRG9jLlJvb3QuRWxlbWVudHMoUC5zbGRJZExzdCkuRWxlbWVudHMoUC5zbGRJZCkuU2tpcChzbGlkZU51bWJlciAtIDEpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoc2xkSWRFbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJJZCA9IChzdHJpbmcpc2xkSWRFbGVtZW50LkF0dHJpYnV0ZShSLmlkKTsKKyAgICAgICAgICAgICAgICB2YXIgc2xpZGVQYXJ0ID0gcHJlc2VudGF0aW9uUGFydC5HZXRQYXJ0QnlJZChySWQpOworICAgICAgICAgICAgICAgIHZhciBzWERvYyA9IHNsaWRlUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICB2YXIgY2hhcnRSaWQgPSAoc3RyaW5nKXNYRG9jLkRlc2NlbmRhbnRzKEMuY2hhcnQpLkF0dHJpYnV0ZXMoUi5pZCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhcnRSaWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENoYXJ0UGFydCBjaGFydFBhcnQgPSAoQ2hhcnRQYXJ0KXNsaWRlUGFydC5HZXRQYXJ0QnlJZChjaGFydFJpZCk7CisgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUNoYXJ0KGNoYXJ0UGFydCwgY2hhcnREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzL0RvY3VtZW50QXNzZW1ibGVyLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvRG9jdW1lbnRBc3NlbWJsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1MDVjOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzL0RvY3VtZW50QXNzZW1ibGVyLmNzCkBAIC0wLDAgKzEsODcyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgU3lzdGVtLlhtbC5YUGF0aDsKK3VzaW5nIFN5c3RlbS5YbWwuU2NoZW1hOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5PZmZpY2UuQ3VzdG9tVUk7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgY2xhc3MgRG9jdW1lbnRBc3NlbWJsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgV21sRG9jdW1lbnQgQXNzZW1ibGVEb2N1bWVudChXbWxEb2N1bWVudCB0ZW1wbGF0ZURvYywgWG1sRG9jdW1lbnQgZGF0YSwgb3V0IGJvb2wgdGVtcGxhdGVFcnJvcikKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IHhEb2MgPSBkYXRhLkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIEFzc2VtYmxlRG9jdW1lbnQodGVtcGxhdGVEb2MsIHhEb2MuUm9vdCwgb3V0IHRlbXBsYXRlRXJyb3IpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBXbWxEb2N1bWVudCBBc3NlbWJsZURvY3VtZW50KFdtbERvY3VtZW50IHRlbXBsYXRlRG9jLCBYRWxlbWVudCBkYXRhLCBvdXQgYm9vbCB0ZW1wbGF0ZUVycm9yKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0gdGVtcGxhdGVEb2MuRG9jdW1lbnRCeXRlQXJyYXk7CisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1lbSA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZW0uV3JpdGUoYnl0ZUFycmF5LCAwLCAoaW50KWJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdvcmREb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obWVtLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChSZXZpc2lvbkFjY2VwdGVyLkhhc1RyYWNrZWRSZXZpc2lvbnMod29yZERvYykpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludmFsaWQgRG9jdW1lbnRBc3NlbWJsZXIgdGVtcGxhdGUgLSBjb250YWlucyB0cmFja2VkIHJldmlzaW9ucyIpOworCisgICAgICAgICAgICAgICAgICAgIHZhciB0ZSA9IG5ldyBUZW1wbGF0ZUVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYXJ0IGluIHdvcmREb2MuQ29udGVudFBhcnRzKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NUZW1wbGF0ZVBhcnQoZGF0YSwgdGUsIHBhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRXJyb3IgPSB0ZS5IYXNFcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgV21sRG9jdW1lbnQgYXNzZW1ibGVkRG9jdW1lbnQgPSBuZXcgV21sRG9jdW1lbnQoIlRlbXBGaWxlTmFtZS5kb2N4IiwgbWVtLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFzc2VtYmxlZERvY3VtZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBQcm9jZXNzVGVtcGxhdGVQYXJ0KFhFbGVtZW50IGRhdGEsIFRlbXBsYXRlRXJyb3IgdGUsIE9wZW5YbWxQYXJ0IHBhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCB4RG9jID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgdmFyIHhEb2NSb290ID0gUmVtb3ZlR29CYWNrQm9va21hcmtzKHhEb2MuUm9vdCk7CisKKyAgICAgICAgICAgIC8vIGNvbnRlbnQgY29udHJvbHMgaW4gY2VsbHMgY2FuIHN1cnJvdW5kIHRoZSBXLnRjIGVsZW1lbnQsIHNvIHRyYW5zZm9ybSBzbyB0aGF0IHN1Y2ggY29udGVudCBjb250cm9scyBhcmUgd2l0aGluIHRoZSBjZWxsIGNvbnRlbnQKKyAgICAgICAgICAgIHhEb2NSb290ID0gKFhFbGVtZW50KU5vcm1hbGl6ZUNvbnRlbnRDb250cm9sc0luQ2VsbHMoeERvY1Jvb3QpOworCisgICAgICAgICAgICB4RG9jUm9vdCA9IChYRWxlbWVudClUcmFuc2Zvcm1Ub01ldGFkYXRhKHhEb2NSb290LCBkYXRhLCB0ZSk7CisKKyAgICAgICAgICAgIC8vIFRhYmxlIG1pZ2h0IGhhdmUgYmVlbiBwbGFjZWQgYXQgcnVuLWxldmVsLCB3aGVuIGl0IHNob3VsZCBiZSBhdCBibG9jay1sZXZlbCwgc28gZml4IHRoaXMuCisgICAgICAgICAgICAvLyBSZXBlYXQsIEVuZFJlcGVhdCwgQ29uZGl0aW9uYWwsIEVuZENvbmRpdGlvbmFsIGFyZSBhbGxvd2VkIGF0IHJ1biBsZXZlbCwgYnV0IG9ubHkgaWYgdGhlcmUgaXMgYSBtYXRjaGluZyBwYWlyCisgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBSZXBlYXQsIEVuZFJlcGVhdCwgQ29uZGl0aW9uYWwsIEVuZENvbmRpdGlvbmFsLCB0aGVuIG1vdmUgdG8gYmxvY2sgbGV2ZWwuCisgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIG1hdGNoaW5nIHBhaXIsIHRoZW4gaXMgT0suCisgICAgICAgICAgICB4RG9jUm9vdCA9IChYRWxlbWVudClGb3JjZUJsb2NrTGV2ZWxBc0FwcHJvcHJpYXRlKHhEb2NSb290LCB0ZSk7CisKKyAgICAgICAgICAgIE5vcm1hbGl6ZVRhYmxlc1JlcGVhdEFuZENvbmRpdGlvbmFsKHhEb2NSb290LCB0ZSk7CisKKyAgICAgICAgICAgIC8vIGFueSBFbmRSZXBlYXQsIEVuZENvbmRpdGlvbmFsIHRoYXQgcmVtYWluIGFyZSBvcnBoYW5zLCBzbyByZXBsYWNlIHdpdGggYW4gZXJyb3IKKyAgICAgICAgICAgIFByb2Nlc3NPcnBoYW5FbmRSZXBlYXRFbmRDb25kaXRpb25hbCh4RG9jUm9vdCwgdGUpOworCisgICAgICAgICAgICAvLyBkbyB0aGUgYWN0dWFsIGNvbnRlbnQgcmVwbGFjZW1lbnQKKyAgICAgICAgICAgIHhEb2NSb290ID0gKFhFbGVtZW50KUNvbnRlbnRSZXBsYWNlbWVudFRyYW5zZm9ybSh4RG9jUm9vdCwgZGF0YSwgdGUpOworCisgICAgICAgICAgICB4RG9jLkVsZW1lbnRzKCkuRmlyc3QoKS5SZXBsYWNlV2l0aCh4RG9jUm9vdCk7CisgICAgICAgICAgICBwYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWE5hbWVbXSBzX01ldGFUb0ZvcmNlVG9CbG9jayA9IG5ldyBYTmFtZVtdIHsKKyAgICAgICAgICAgIFBBLkNvbmRpdGlvbmFsLAorICAgICAgICAgICAgUEEuRW5kQ29uZGl0aW9uYWwsCisgICAgICAgICAgICBQQS5SZXBlYXQsCisgICAgICAgICAgICBQQS5FbmRSZXBlYXQsCisgICAgICAgICAgICBQQS5UYWJsZSwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgRm9yY2VCbG9ja0xldmVsQXNBcHByb3ByaWF0ZShYTm9kZSBub2RlLCBUZW1wbGF0ZUVycm9yIHRlKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRNZXRhID0gZWxlbWVudC5FbGVtZW50cygpLldoZXJlKG4gPT4gc19NZXRhVG9Gb3JjZVRvQmxvY2suQ29udGFpbnMobi5OYW1lKSkuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZE1ldGEuQ291bnQoKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZE1ldGEuRmlyc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvdGhlclRleHRJblBhcmFncmFwaCA9IGVsZW1lbnQuRWxlbWVudHMoVy5yKS5FbGVtZW50cyhXLnQpLlNlbGVjdCh0ID0+IChzdHJpbmcpdCkuU3RyaW5nQ29uY2F0ZW5hdGUoKS5UcmltKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXJUZXh0SW5QYXJhZ3JhcGggIT0gIiIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1BhcmEgPSBuZXcgWEVsZW1lbnQoZWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld01ldGEgPSBuZXdQYXJhLkVsZW1lbnRzKCkuV2hlcmUobiA9PiBzX01ldGFUb0ZvcmNlVG9CbG9jay5Db250YWlucyhuLk5hbWUpKS5GaXJzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01ldGEuUmVwbGFjZVdpdGgoQ3JlYXRlUnVuRXJyb3JNZXNzYWdlKCJFcnJvcjogVW5tYXRjaGVkIG1ldGFkYXRhIGNhbid0IGJlIGluIHBhcmFncmFwaCB3aXRoIG90aGVyIHRleHQiLCB0ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdQYXJhOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGEgPSBuZXcgWEVsZW1lbnQoY2hpbGQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcucCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoVy5wUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5FbGVtZW50cygpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0YTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBjaGlsZE1ldGEuQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ICUgMiA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRNZXRhLldoZXJlKGMgPT4gYy5OYW1lID09IFBBLlJlcGVhdCkuQ291bnQoKSAhPSBjaGlsZE1ldGEuV2hlcmUoYyA9PiBjLk5hbWUgPT0gUEEuRW5kUmVwZWF0KS5Db3VudCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVDb250ZXh0RXJyb3JNZXNzYWdlKGVsZW1lbnQsICJFcnJvcjogTWlzbWF0Y2ggUmVwZWF0IC8gRW5kUmVwZWF0IGF0IHJ1biBsZXZlbCIsIHRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZE1ldGEuV2hlcmUoYyA9PiBjLk5hbWUgPT0gUEEuQ29uZGl0aW9uYWwpLkNvdW50KCkgIT0gY2hpbGRNZXRhLldoZXJlKGMgPT4gYy5OYW1lID09IFBBLkVuZENvbmRpdGlvbmFsKS5Db3VudCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVDb250ZXh0RXJyb3JNZXNzYWdlKGVsZW1lbnQsICJFcnJvcjogTWlzbWF0Y2ggQ29uZGl0aW9uYWwgLyBFbmRDb25kaXRpb25hbCBhdCBydW4gbGV2ZWwiLCB0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gRm9yY2VCbG9ja0xldmVsQXNBcHByb3ByaWF0ZShuLCB0ZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVDb250ZXh0RXJyb3JNZXNzYWdlKGVsZW1lbnQsICJFcnJvcjogSW52YWxpZCBtZXRhZGF0YSBhdCBydW4gbGV2ZWwiLCB0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gRm9yY2VCbG9ja0xldmVsQXNBcHByb3ByaWF0ZShuLCB0ZSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBQcm9jZXNzT3JwaGFuRW5kUmVwZWF0RW5kQ29uZGl0aW9uYWwoWEVsZW1lbnQgeERvY1Jvb3QsIFRlbXBsYXRlRXJyb3IgdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlbGVtZW50IGluIHhEb2NSb290LkRlc2NlbmRhbnRzKFBBLkVuZFJlcGVhdCkuVG9MaXN0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gQ3JlYXRlQ29udGV4dEVycm9yTWVzc2FnZShlbGVtZW50LCAiRXJyb3I6IEVuZFJlcGVhdCB3aXRob3V0IG1hdGNoaW5nIFJlcGVhdCIsIHRlKTsKKyAgICAgICAgICAgICAgICBlbGVtZW50LlJlcGxhY2VXaXRoKGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlbGVtZW50IGluIHhEb2NSb290LkRlc2NlbmRhbnRzKFBBLkVuZENvbmRpdGlvbmFsKS5Ub0xpc3QoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBDcmVhdGVDb250ZXh0RXJyb3JNZXNzYWdlKGVsZW1lbnQsICJFcnJvcjogRW5kQ29uZGl0aW9uYWwgd2l0aG91dCBtYXRjaGluZyBDb25kaXRpb25hbCIsIHRlKTsKKyAgICAgICAgICAgICAgICBlbGVtZW50LlJlcGxhY2VXaXRoKGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IFJlbW92ZUdvQmFja0Jvb2ttYXJrcyhYRWxlbWVudCB4RWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNsb25lWERvYyA9IG5ldyBYRWxlbWVudCh4RWxlbWVudCk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYm0gPSBjbG9uZVhEb2MuRGVzY2VuZGFudHNBbmRTZWxmKFcuYm9va21hcmtTdGFydCkuRmlyc3RPckRlZmF1bHQoYiA9PiAoc3RyaW5nKWIuQXR0cmlidXRlKFcubmFtZSkgPT0gIl9Hb0JhY2siKTsKKyAgICAgICAgICAgICAgICBpZiAoYm0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgdmFyIGlkID0gKHN0cmluZylibS5BdHRyaWJ1dGUoVy5pZCk7CisgICAgICAgICAgICAgICAgdmFyIGVuZEJtID0gY2xvbmVYRG9jLkRlc2NlbmRhbnRzQW5kU2VsZihXLmJvb2ttYXJrRW5kKS5GaXJzdE9yRGVmYXVsdChiID0+IChzdHJpbmcpYi5BdHRyaWJ1dGUoVy5pZCkgPT0gaWQpOworICAgICAgICAgICAgICAgIGJtLlJlbW92ZSgpOworICAgICAgICAgICAgICAgIGVuZEJtLlJlbW92ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNsb25lWERvYzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgdHJhbnNmb3JtIGludmVydHMgY29udGVudCBjb250cm9scyB0aGF0IHN1cnJvdW5kIFcudGMgZWxlbWVudHMuICBBZnRlciB0cmFuc2Zvcm1pbmcsIHRoZSBXLnRjIHdpbGwgY29udGFpbgorICAgICAgICAvLyB0aGUgY29udGVudCBjb250cm9sLCB3aGljaCBjb250YWlucyB0aGUgcGFyYWdyYXBoIGNvbnRlbnQgb2YgdGhlIGNlbGwuCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBOb3JtYWxpemVDb250ZW50Q29udHJvbHNJbkNlbGxzKFhOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuc2R0ICYmIGVsZW1lbnQuUGFyZW50Lk5hbWUgPT0gVy50cikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDZWxsID0gbmV3IFhFbGVtZW50KFcudGMsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKFcudGMpLkVsZW1lbnRzKFcudGNQciksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5zZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cyhXLnNkdFByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKFcuc2R0RW5kUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnNkdENvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoVy5zZHRDb250ZW50KS5FbGVtZW50cyhXLnRjKS5FbGVtZW50cygpLldoZXJlKGUgPT4gZS5OYW1lICE9IFcudGNQcikpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdDZWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBOb3JtYWxpemVDb250ZW50Q29udHJvbHNJbkNlbGxzKG4pKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kIGlzIHdyaXR0ZW4gdXNpbmcgdHJlZSBtb2RpZmljYXRpb24sIG5vdCBSUEZULCBiZWNhdXNlIGl0IGlzIGVhc2llciB0byB3cml0ZSBpbiB0aGlzIGZhc2hpb24uCisgICAgICAgIC8vIFRoZXNlIHR5cGVzIG9mIG9wZXJhdGlvbnMgYXJlIG5vdCBhcyBlYXN5IHRvIHdyaXRlIHVzaW5nIFJQRlQuCisgICAgICAgIC8vIFVubGVzcyB5b3UgYXJlIGNvbXBsZXRlbHkgY2xlYXIgb24gdGhlIHNlbWFudGljcyBvZiBMSU5RIHRvIFhNTCBETUwsIGRvIG5vdCBtYWtlIG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBtZXRob2QuCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgTm9ybWFsaXplVGFibGVzUmVwZWF0QW5kQ29uZGl0aW9uYWwoWEVsZW1lbnQgeERvYywgVGVtcGxhdGVFcnJvciB0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRhYmxlcyA9IHhEb2MuRGVzY2VuZGFudHMoUEEuVGFibGUpLlRvTGlzdCgpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRhYmxlIGluIHRhYmxlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZm9sbG93aW5nRWxlbWVudCA9IHRhYmxlLkVsZW1lbnRzQWZ0ZXJTZWxmKCkuV2hlcmUoZSA9PiBlLk5hbWUgPT0gVy50YmwgfHwgZS5OYW1lID09IFcucCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZm9sbG93aW5nRWxlbWVudCA9PSBudWxsIHx8IGZvbGxvd2luZ0VsZW1lbnQuTmFtZSAhPSBXLnRibCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlLlJlcGxhY2VXaXRoKENyZWF0ZVBhcmFFcnJvck1lc3NhZ2UoIlRhYmxlIG1ldGFkYXRhIGlzIG5vdCBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHRhYmxlIiwgdGUpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzdXBlcmZsb3VzIHBhcmFncmFwaCBmcm9tIFRhYmxlIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgdGFibGUuUmVtb3ZlTm9kZXMoKTsKKyAgICAgICAgICAgICAgICAvLyBkZXRhY2ggdzp0YmwgZnJvbSBwYXJlbnQsIGFuZCBhZGQgdG8gVGFibGUgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICBmb2xsb3dpbmdFbGVtZW50LlJlbW92ZSgpOworICAgICAgICAgICAgICAgIHRhYmxlLkFkZChmb2xsb3dpbmdFbGVtZW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHJlcGVhdERlcHRoID0gMDsKKyAgICAgICAgICAgIGludCBjb25kaXRpb25hbERlcHRoID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBtZXRhZGF0YSBpbiB4RG9jLkRlc2NlbmRhbnRzKCkuV2hlcmUoZCA9PgorICAgICAgICAgICAgICAgICAgICBkLk5hbWUgPT0gUEEuUmVwZWF0IHx8CisgICAgICAgICAgICAgICAgICAgIGQuTmFtZSA9PSBQQS5Db25kaXRpb25hbCB8fAorICAgICAgICAgICAgICAgICAgICBkLk5hbWUgPT0gUEEuRW5kUmVwZWF0IHx8CisgICAgICAgICAgICAgICAgICAgIGQuTmFtZSA9PSBQQS5FbmRDb25kaXRpb25hbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLk5hbWUgPT0gUEEuUmVwZWF0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytyZXBlYXREZXB0aDsKKyAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuQWRkKG5ldyBYQXR0cmlidXRlKFBBLkRlcHRoLCByZXBlYXREZXB0aCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLk5hbWUgPT0gUEEuRW5kUmVwZWF0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuQWRkKG5ldyBYQXR0cmlidXRlKFBBLkRlcHRoLCByZXBlYXREZXB0aCkpOworICAgICAgICAgICAgICAgICAgICAtLXJlcGVhdERlcHRoOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLk5hbWUgPT0gUEEuQ29uZGl0aW9uYWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK2NvbmRpdGlvbmFsRGVwdGg7CisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLkFkZChuZXcgWEF0dHJpYnV0ZShQQS5EZXB0aCwgY29uZGl0aW9uYWxEZXB0aCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLk5hbWUgPT0gUEEuRW5kQ29uZGl0aW9uYWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5BZGQobmV3IFhBdHRyaWJ1dGUoUEEuRGVwdGgsIGNvbmRpdGlvbmFsRGVwdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgLS1jb25kaXRpb25hbERlcHRoOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgZGlkUmVwbGFjZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBtZXRhZGF0YSBpbiB4RG9jLkRlc2NlbmRhbnRzKCkuV2hlcmUoZCA9PiAoZC5OYW1lID09IFBBLlJlcGVhdCB8fCBkLk5hbWUgPT0gUEEuQ29uZGl0aW9uYWwpICYmIGQuQXR0cmlidXRlKFBBLkRlcHRoKSAhPSBudWxsKS5Ub0xpc3QoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBkZXB0aCA9IChpbnQpbWV0YWRhdGEuQXR0cmlidXRlKFBBLkRlcHRoKTsKKyAgICAgICAgICAgICAgICAgICAgWE5hbWUgbWF0Y2hpbmdFbmROYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLk5hbWUgPT0gUEEuUmVwZWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdFbmROYW1lID0gUEEuRW5kUmVwZWF0OworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtZXRhZGF0YS5OYW1lID09IFBBLkNvbmRpdGlvbmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdFbmROYW1lID0gUEEuRW5kQ29uZGl0aW9uYWw7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ0VuZE5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nRW5kID0gbWV0YWRhdGEuRWxlbWVudHNBZnRlclNlbGYobWF0Y2hpbmdFbmROYW1lKS5GaXJzdE9yRGVmYXVsdChlbmQgPT4geyByZXR1cm4gKGludCllbmQuQXR0cmlidXRlKFBBLkRlcHRoKSA9PSBkZXB0aDsgfSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ0VuZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5SZXBsYWNlV2l0aChDcmVhdGVQYXJhRXJyb3JNZXNzYWdlKHN0cmluZy5Gb3JtYXQoInswfSBkb2VzIG5vdCBoYXZlIG1hdGNoaW5nIHsxfSIsIG1ldGFkYXRhLk5hbWUuTG9jYWxOYW1lLCBtYXRjaGluZ0VuZE5hbWUuTG9jYWxOYW1lKSwgdGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLlJlbW92ZU5vZGVzKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50QmV0d2VlbiA9IG1ldGFkYXRhLkVsZW1lbnRzQWZ0ZXJTZWxmKCkuVGFrZVdoaWxlKGFmdGVyID0+IGFmdGVyICE9IG1hdGNoaW5nRW5kKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gY29udGVudEJldHdlZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLlJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICBjb250ZW50QmV0d2VlbiA9IGNvbnRlbnRCZXR3ZWVuLldoZXJlKG4gPT4gbi5OYW1lICE9IFcuYm9va21hcmtTdGFydCAmJiBuLk5hbWUgIT0gVy5ib29rbWFya0VuZCkuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLkFkZChjb250ZW50QmV0d2Vlbik7CisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLkF0dHJpYnV0ZXMoUEEuRGVwdGgpLlJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICBtYXRjaGluZ0VuZC5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgZGlkUmVwbGFjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWRpZFJlcGxhY2UpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxzdHJpbmc+IHNfQWxpYXNMaXN0ID0gbmV3IExpc3Q8c3RyaW5nPigpCisgICAgICAgIHsKKyAgICAgICAgICAgICJDb250ZW50IiwKKyAgICAgICAgICAgICJUYWJsZSIsCisgICAgICAgICAgICAiUmVwZWF0IiwKKyAgICAgICAgICAgICJFbmRSZXBlYXQiLAorICAgICAgICAgICAgIkNvbmRpdGlvbmFsIiwKKyAgICAgICAgICAgICJFbmRDb25kaXRpb25hbCIsCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFRyYW5zZm9ybVRvTWV0YWRhdGEoWE5vZGUgbm9kZSwgWEVsZW1lbnQgZGF0YSwgVGVtcGxhdGVFcnJvciB0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5zZHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYWxpYXMgPSAoc3RyaW5nKWVsZW1lbnQuRWxlbWVudHMoVy5zZHRQcikuRWxlbWVudHMoVy5hbGlhcykuQXR0cmlidXRlcyhXLnZhbCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsaWFzID09IG51bGwgfHwgYWxpYXMgPT0gIiIgfHwgc19BbGlhc0xpc3QuQ29udGFpbnMoYWxpYXMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2NDb250ZW50cyA9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNUcmltbWVkKFcudHhieENvbnRlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gZS5OYW1lID09IFcudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHQgPT4gKHN0cmluZyl0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRyaW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5SZXBsYWNlKCfigJwnLCAnIicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJlcGxhY2UoJ+KAnScsICciJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2NDb250ZW50cy5TdGFydHNXaXRoKCI8IikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgeG1sID0gVHJhbnNmb3JtWG1sVGV4dFRvTWV0YWRhdGEodGUsIGNjQ29udGVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWwuTmFtZSA9PSBXLnAgfHwgeG1sLk5hbWUgPT0gVy5yKSAgLy8gdGhpcyBtZWFucyB0aGVyZSB3YXMgYW4gZXJyb3IgcHJvY2Vzc2luZyB0aGUgWE1MLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuUGFyZW50Lk5hbWUgPT0gVy5wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhtbC5FbGVtZW50cyhXLnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geG1sOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxpYXMgIT0gbnVsbCAmJiB4bWwuTmFtZS5Mb2NhbE5hbWUgIT0gYWxpYXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5QYXJlbnQuTmFtZSA9PSBXLnApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUnVuRXJyb3JNZXNzYWdlKCJFcnJvcjogQ29udGVudCBjb250cm9sIGFsaWFzIGRvZXMgbm90IG1hdGNoIG1ldGFkYXRhIGVsZW1lbnQgbmFtZSIsIHRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVBhcmFFcnJvck1lc3NhZ2UoIkVycm9yOiBDb250ZW50IGNvbnRyb2wgYWxpYXMgZG9lcyBub3QgbWF0Y2ggbWV0YWRhdGEgZWxlbWVudCBuYW1lIiwgdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWwuQWRkKGVsZW1lbnQuRWxlbWVudHMoVy5zZHRDb250ZW50KS5FbGVtZW50cygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geG1sOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybVRvTWV0YWRhdGEobiwgZGF0YSwgdGUpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBUcmFuc2Zvcm1Ub01ldGFkYXRhKG4sIGRhdGEsIHRlKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcucCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhQ29udGVudHMgPSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNUcmltbWVkKFcudHhieENvbnRlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgPT0gVy50KQorICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdCh0ID0+IChzdHJpbmcpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuVHJpbSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgb2NjdXJhbmNlcyA9IHBhcmFDb250ZW50cy5TZWxlY3QoKGMsIGkpID0+IHBhcmFDb250ZW50cy5TdWJzdHJpbmcoaSkpLkNvdW50KHN1YiA9PiBzdWIuU3RhcnRzV2l0aCgiPCMiKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhQ29udGVudHMuU3RhcnRzV2l0aCgiPCMiKSAmJiBwYXJhQ29udGVudHMuRW5kc1dpdGgoIiM+IikgJiYgb2NjdXJhbmNlcyA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeG1sVGV4dCA9IHBhcmFDb250ZW50cy5TdWJzdHJpbmcoMiwgcGFyYUNvbnRlbnRzLkxlbmd0aCAtIDQpLlRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHhtbCA9IFRyYW5zZm9ybVhtbFRleHRUb01ldGFkYXRhKHRlLCB4bWxUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWwuTmFtZSA9PSBXLnAgfHwgeG1sLk5hbWUgPT0gVy5yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4bWw7CisgICAgICAgICAgICAgICAgICAgICAgICB4bWwuQWRkKGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhtbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGFyYUNvbnRlbnRzLkNvbnRhaW5zKCI8IyIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFJ1blJlcGxhY2VtZW50SW5mbz4gcnVuUmVwbGFjZW1lbnRJbmZvID0gbmV3IExpc3Q8UnVuUmVwbGFjZW1lbnRJbmZvPigpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRoaXNHdWlkID0gR3VpZC5OZXdHdWlkKCkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbmV3IFJlZ2V4KCI8Iy4qPyM+Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCB4bWwgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgT3BlblhtbFJlZ2V4LlJlcGxhY2UobmV3W10geyBlbGVtZW50IH0sIHIsIHRoaXNHdWlkLCAocGFyYSwgbWF0Y2gpID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoU3RyaW5nID0gbWF0Y2guVmFsdWUuVHJpbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4bWxUZXh0ID0gbWF0Y2hTdHJpbmcuU3Vic3RyaW5nKDIsIG1hdGNoU3RyaW5nLkxlbmd0aCAtIDQpLlRyaW0oKS5SZXBsYWNlKCfigJwnLCAnIicpLlJlcGxhY2UoJ+KAnScsICciJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWwgPSBYRWxlbWVudC5QYXJzZSh4bWxUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuUmVwbGFjZW1lbnRJbmZvIHJyaSA9IG5ldyBSdW5SZXBsYWNlbWVudEluZm8oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWwgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXhjZXB0aW9uTWVzc2FnZSA9ICJYbWxFeGNlcHRpb246ICIgKyBlLk1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFWYWxpZGF0aW9uTWVzc2FnZSA9IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlcGxhY2VtZW50SW5mby5BZGQocnJpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzY2hlbWFFcnJvciA9IFZhbGlkYXRlUGVyU2NoZW1hKHhtbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYUVycm9yICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5SZXBsYWNlbWVudEluZm8gcnJpID0gbmV3IFJ1blJlcGxhY2VtZW50SW5mbygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbCA9IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFeGNlcHRpb25NZXNzYWdlID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVZhbGlkYXRpb25NZXNzYWdlID0gIlNjaGVtYSBWYWxpZGF0aW9uIEVycm9yOiAiICsgc2NoZW1hRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlcGxhY2VtZW50SW5mby5BZGQocnJpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1blJlcGxhY2VtZW50SW5mbyBycmkyID0gbmV3IFJ1blJlcGxhY2VtZW50SW5mbygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWwgPSB4bWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEV4Y2VwdGlvbk1lc3NhZ2UgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFWYWxpZGF0aW9uTWVzc2FnZSA9IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZXBsYWNlbWVudEluZm8uQWRkKHJyaTIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UGFyYSA9IG5ldyBYRWxlbWVudChlbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBycmkgaW4gcnVuUmVwbGFjZW1lbnRJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydW5Ub1JlcGxhY2UgPSBuZXdQYXJhLkRlc2NlbmRhbnRzKFcucikuRmlyc3RPckRlZmF1bHQocm4gPT4gcm4uVmFsdWUgPT0gdGhpc0d1aWQgJiYgcm4uUGFyZW50Lk5hbWUgIT0gUEEuQ29udGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1blRvUmVwbGFjZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJyaS5YbWxFeGNlcHRpb25NZXNzYWdlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blRvUmVwbGFjZS5SZXBsYWNlV2l0aChDcmVhdGVSdW5FcnJvck1lc3NhZ2UocnJpLlhtbEV4Y2VwdGlvbk1lc3NhZ2UsIHRlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocnJpLlNjaGVtYVZhbGlkYXRpb25NZXNzYWdlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blRvUmVwbGFjZS5SZXBsYWNlV2l0aChDcmVhdGVSdW5FcnJvck1lc3NhZ2UocnJpLlNjaGVtYVZhbGlkYXRpb25NZXNzYWdlLCB0ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdYbWwgPSBuZXcgWEVsZW1lbnQocnJpLlhtbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1htbC5BZGQocnVuVG9SZXBsYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuVG9SZXBsYWNlLlJlcGxhY2VXaXRoKG5ld1htbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvYWxlc2NlZFBhcmFncmFwaCA9IFdvcmRwcm9jZXNzaW5nTUxVdGlsLkNvYWxlc2NlQWRqYWNlbnRSdW5zV2l0aElkZW50aWNhbEZvcm1hdHRpbmcobmV3UGFyYSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29hbGVzY2VkUGFyYWdyYXBoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtVG9NZXRhZGF0YShuLCBkYXRhLCB0ZSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgVHJhbnNmb3JtWG1sVGV4dFRvTWV0YWRhdGEoVGVtcGxhdGVFcnJvciB0ZSwgc3RyaW5nIHhtbFRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IHhtbDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhtbCA9IFhFbGVtZW50LlBhcnNlKHhtbFRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVQYXJhRXJyb3JNZXNzYWdlKCJYbWxFeGNlcHRpb246ICIgKyBlLk1lc3NhZ2UsIHRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmluZyBzY2hlbWFFcnJvciA9IFZhbGlkYXRlUGVyU2NoZW1hKHhtbCk7CisgICAgICAgICAgICBpZiAoc2NoZW1hRXJyb3IgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUGFyYUVycm9yTWVzc2FnZSgiU2NoZW1hIFZhbGlkYXRpb24gRXJyb3I6ICIgKyBzY2hlbWFFcnJvciwgdGUpOworICAgICAgICAgICAgcmV0dXJuIHhtbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgUnVuUmVwbGFjZW1lbnRJbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBYRWxlbWVudCBYbWw7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIFhtbEV4Y2VwdGlvbk1lc3NhZ2U7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIFNjaGVtYVZhbGlkYXRpb25NZXNzYWdlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIFZhbGlkYXRlUGVyU2NoZW1hKFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzX1BBU2NoZW1hU2V0cyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNfUEFTY2hlbWFTZXRzID0gbmV3IERpY3Rpb25hcnk8WE5hbWUsIFBBU2NoZW1hU2V0PigpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQQS5Db250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBBU2NoZW1hU2V0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhzZE1hcmt1cCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIjx4czpzY2hlbWEgYXR0cmlidXRlRm9ybURlZmF1bHQ9J3VucXVhbGlmaWVkJyBlbGVtZW50Rm9ybURlZmF1bHQ9J3F1YWxpZmllZCcgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdDb250ZW50Jz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSdTZWxlY3QnIHR5cGU9J3hzOnN0cmluZycgdXNlPSdyZXF1aXJlZCcgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSdPcHRpb25hbCcgdHlwZT0neHM6Ym9vbGVhbicgdXNlPSdvcHRpb25hbCcgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNjaGVtYT4iLAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQQS5UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQQVNjaGVtYVNldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYc2RNYXJrdXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCI8eHM6c2NoZW1hIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSd1bnF1YWxpZmllZCcgZWxlbWVudEZvcm1EZWZhdWx0PSdxdWFsaWZpZWQnIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nVGFibGUnPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9J1NlbGVjdCcgdHlwZT0neHM6c3RyaW5nJyB1c2U9J3JlcXVpcmVkJyAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2NoZW1hPiIsCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBBLlJlcGVhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQQVNjaGVtYVNldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYc2RNYXJrdXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCI8eHM6c2NoZW1hIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSd1bnF1YWxpZmllZCcgZWxlbWVudEZvcm1EZWZhdWx0PSdxdWFsaWZpZWQnIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nUmVwZWF0Jz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSdTZWxlY3QnIHR5cGU9J3hzOnN0cmluZycgdXNlPSdyZXF1aXJlZCcgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSdPcHRpb25hbCcgdHlwZT0neHM6Ym9vbGVhbicgdXNlPSdvcHRpb25hbCcgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNjaGVtYT4iLAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQQS5FbmRSZXBlYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUEFTY2hlbWFTZXQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWHNkTWFya3VwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiPHhzOnNjaGVtYSBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0ndW5xdWFsaWZpZWQnIGVsZW1lbnRGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJyB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J0VuZFJlcGVhdCcgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzY2hlbWE+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUEEuQ29uZGl0aW9uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUEFTY2hlbWFTZXQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWHNkTWFya3VwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiPHhzOnNjaGVtYSBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0ndW5xdWFsaWZpZWQnIGVsZW1lbnRGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJyB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J0NvbmRpdGlvbmFsJz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSdTZWxlY3QnIHR5cGU9J3hzOnN0cmluZycgdXNlPSdyZXF1aXJlZCcgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSdNYXRjaCcgdHlwZT0neHM6c3RyaW5nJyB1c2U9J29wdGlvbmFsJyAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9J05vdE1hdGNoJyB0eXBlPSd4czpzdHJpbmcnIHVzZT0nb3B0aW9uYWwnIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzY2hlbWE+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUEEuRW5kQ29uZGl0aW9uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUEFTY2hlbWFTZXQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWHNkTWFya3VwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiPHhzOnNjaGVtYSBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0ndW5xdWFsaWZpZWQnIGVsZW1lbnRGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJyB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J0VuZENvbmRpdGlvbmFsJyAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNjaGVtYT4iLAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gc19QQVNjaGVtYVNldHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbVBBc3MgPSBpdGVtLlZhbHVlOworICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXQgc2NoZW1hcyA9IG5ldyBYbWxTY2hlbWFTZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgc2NoZW1hcy5BZGQoIiIsIFhtbFJlYWRlci5DcmVhdGUobmV3IFN0cmluZ1JlYWRlcihpdGVtUEFzcy5Yc2RNYXJrdXApKSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1QQXNzLlNjaGVtYVNldCA9IHNjaGVtYXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzX1BBU2NoZW1hU2V0cy5Db250YWluc0tleShlbGVtZW50Lk5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KCJJbnZhbGlkIFhNTDogezB9IGlzIG5vdCBhIHZhbGlkIGVsZW1lbnQiLCBlbGVtZW50Lk5hbWUuTG9jYWxOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBwYVNjaGVtYVNldCA9IHNfUEFTY2hlbWFTZXRzW2VsZW1lbnQuTmFtZV07CisgICAgICAgICAgICBYRG9jdW1lbnQgZCA9IG5ldyBYRG9jdW1lbnQoZWxlbWVudCk7CisgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZSA9IG51bGw7CisgICAgICAgICAgICBkLlZhbGlkYXRlKHBhU2NoZW1hU2V0LlNjaGVtYVNldCwgKHNlbmRlciwgZSkgPT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gZS5NZXNzYWdlOworICAgICAgICAgICAgfSwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIFBBCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQ29udGVudCA9ICJDb250ZW50IjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgVGFibGUgPSAiVGFibGUiOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBSZXBlYXQgPSAiUmVwZWF0IjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgRW5kUmVwZWF0ID0gIkVuZFJlcGVhdCI7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIENvbmRpdGlvbmFsID0gIkNvbmRpdGlvbmFsIjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgRW5kQ29uZGl0aW9uYWwgPSAiRW5kQ29uZGl0aW9uYWwiOworCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFNlbGVjdCA9ICJTZWxlY3QiOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBPcHRpb25hbCA9ICJPcHRpb25hbCI7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIE1hdGNoID0gIk1hdGNoIjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgTm90TWF0Y2ggPSAiTm90TWF0Y2giOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBEZXB0aCA9ICJEZXB0aCI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIFBBU2NoZW1hU2V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgWHNkTWFya3VwOworICAgICAgICAgICAgcHVibGljIFhtbFNjaGVtYVNldCBTY2hlbWFTZXQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBEaWN0aW9uYXJ5PFhOYW1lLCBQQVNjaGVtYVNldD4gc19QQVNjaGVtYVNldHMgPSBudWxsOworCisgICAgICAgIHByaXZhdGUgY2xhc3MgVGVtcGxhdGVFcnJvcgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNFcnJvciA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIG9iamVjdCBDb250ZW50UmVwbGFjZW1lbnRUcmFuc2Zvcm0oWE5vZGUgbm9kZSwgWEVsZW1lbnQgZGF0YSwgVGVtcGxhdGVFcnJvciB0ZW1wbGF0ZUVycm9yKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBQQS5Db250ZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgcGFyYSA9IGVsZW1lbnQuRGVzY2VuZGFudHMoVy5wKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBydW4gPSBlbGVtZW50LkRlc2NlbmRhbnRzKFcucikuRmlyc3RPckRlZmF1bHQoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgeFBhdGggPSAoc3RyaW5nKSBlbGVtZW50LkF0dHJpYnV0ZShQQS5TZWxlY3QpOworICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9uYWxTdHJpbmcgPSAoc3RyaW5nKSBlbGVtZW50LkF0dHJpYnV0ZShQQS5PcHRpb25hbCk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWwgPSAob3B0aW9uYWxTdHJpbmcgIT0gbnVsbCAmJiBvcHRpb25hbFN0cmluZy5Ub0xvd2VyKCkgPT0gInRydWUiKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmV3VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IEV2YWx1YXRlWFBhdGhUb1N0cmluZyhkYXRhLCB4UGF0aCwgb3B0aW9uYWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChYUGF0aEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlQ29udGV4dEVycm9yTWVzc2FnZShlbGVtZW50LCAiWFBhdGhFeGNlcHRpb246ICIgKyBlLk1lc3NhZ2UsIHRlbXBsYXRlRXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBwID0gbmV3IFhFbGVtZW50KFcucCwgcGFyYS5FbGVtZW50cyhXLnBQcikpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaChzdHJpbmcgbGluZSBpbiBuZXdWYWx1ZS5TcGxpdCgnXG4nKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLkFkZChuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYS5FbGVtZW50cyhXLnIpLkVsZW1lbnRzKFcuclByKS5GaXJzdE9yRGVmYXVsdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocC5FbGVtZW50cygpLkNvdW50KCkgPiAxKSA/IG5ldyBYRWxlbWVudChXLmJyKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnQsIGxpbmUpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IGxpc3QgPSBuZXcgTGlzdDxYRWxlbWVudD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goc3RyaW5nIGxpbmUgaW4gbmV3VmFsdWUuU3BsaXQoJ1xuJykpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQobmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLkVsZW1lbnRzKCkuV2hlcmUoZSA9PiBlLk5hbWUgIT0gVy50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QuQ291bnQgPiAwKSA/IG5ldyBYRWxlbWVudChXLmJyKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnQsIGxpbmUpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFBBLlJlcGVhdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzZWxlY3RvciA9IChzdHJpbmcpZWxlbWVudC5BdHRyaWJ1dGUoUEEuU2VsZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbmFsU3RyaW5nID0gKHN0cmluZyllbGVtZW50LkF0dHJpYnV0ZShQQS5PcHRpb25hbCk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWwgPSAob3B0aW9uYWxTdHJpbmcgIT0gbnVsbCAmJiBvcHRpb25hbFN0cmluZy5Ub0xvd2VyKCkgPT0gInRydWUiKTsKKworICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gcmVwZWF0aW5nRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGluZ0RhdGEgPSBkYXRhLlhQYXRoU2VsZWN0RWxlbWVudHMoc2VsZWN0b3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChYUGF0aEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlQ29udGV4dEVycm9yTWVzc2FnZShlbGVtZW50LCAiWFBhdGhFeGNlcHRpb246ICIgKyBlLk1lc3NhZ2UsIHRlbXBsYXRlRXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVwZWF0aW5nRGF0YS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vWEVsZW1lbnQgcGFyYSA9IGVsZW1lbnQuRGVzY2VuZGFudHMoVy5wKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKHBhcmEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcucCwgbmV3IFhFbGVtZW50KFcucikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVDb250ZXh0RXJyb3JNZXNzYWdlKGVsZW1lbnQsICJSZXBlYXQ6IFNlbGVjdCByZXR1cm5lZCBubyBkYXRhIiwgdGVtcGxhdGVFcnJvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NvbnRlbnQgPSByZXBlYXRpbmdEYXRhLlNlbGVjdChkID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZSA9PiBDb250ZW50UmVwbGFjZW1lbnRUcmFuc2Zvcm0oZSwgZCwgdGVtcGxhdGVFcnJvcikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdDb250ZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFBBLlRhYmxlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8WEVsZW1lbnQ+IHRhYmxlRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlRGF0YSA9IGRhdGEuWFBhdGhTZWxlY3RFbGVtZW50cygoc3RyaW5nKWVsZW1lbnQuQXR0cmlidXRlKFBBLlNlbGVjdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChYUGF0aEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlQ29udGV4dEVycm9yTWVzc2FnZShlbGVtZW50LCAiWFBhdGhFeGNlcHRpb246ICIgKyBlLk1lc3NhZ2UsIHRlbXBsYXRlRXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZURhdGEuQ291bnQoKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUNvbnRleHRFcnJvck1lc3NhZ2UoZWxlbWVudCwgIlRhYmxlIFNlbGVjdCByZXR1cm5lZCBubyBkYXRhIiwgdGVtcGxhdGVFcnJvcik7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHRhYmxlID0gZWxlbWVudC5FbGVtZW50KFcudGJsKTsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgcHJvdG9Sb3cgPSB0YWJsZS5FbGVtZW50cyhXLnRyKS5Ta2lwKDEpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBmb290ZXJSb3dzQmVmb3JlVHJhbnNmb3JtID0gdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnRyKQorICAgICAgICAgICAgICAgICAgICAgICAgLlNraXAoMikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZvb3RlclJvd3MgPSBmb290ZXJSb3dzQmVmb3JlVHJhbnNmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHggPT4gQ29udGVudFJlcGxhY2VtZW50VHJhbnNmb3JtKHgsIGRhdGEsIHRlbXBsYXRlRXJyb3IpKQorICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJvdG9Sb3cgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVDb250ZXh0RXJyb3JNZXNzYWdlKGVsZW1lbnQsIHN0cmluZy5Gb3JtYXQoIlRhYmxlIGRvZXMgbm90IGNvbnRhaW4gYSBwcm90b3R5cGUgcm93IiksIHRlbXBsYXRlRXJyb3IpOworICAgICAgICAgICAgICAgICAgICBwcm90b1Jvdy5EZXNjZW5kYW50cyhXLmJvb2ttYXJrU3RhcnQpLlJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICBwcm90b1Jvdy5EZXNjZW5kYW50cyhXLmJvb2ttYXJrRW5kKS5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3VGFibGUgPSBuZXcgWEVsZW1lbnQoVy50YmwsCisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5FbGVtZW50cygpLldoZXJlKGUgPT4gZS5OYW1lICE9IFcudHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuRWxlbWVudHMoVy50cikuRmlyc3RPckRlZmF1bHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlRGF0YS5TZWxlY3QoZCA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b1Jvdy5FbGVtZW50cygpLldoZXJlKHIgPT4gci5OYW1lICE9IFcudGMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b1Jvdy5FbGVtZW50cyhXLnRjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdCh0YyA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHBhcmFncmFwaCA9IHRjLkVsZW1lbnRzKFcucCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBjZWxsUnVuID0gcGFyYWdyYXBoLkVsZW1lbnRzKFcucikuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgeFBhdGggPSBwYXJhZ3JhcGguVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5ld1ZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gRXZhbHVhdGVYUGF0aFRvU3RyaW5nKGQsIHhQYXRoLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChYUGF0aEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgZXJyb3JDZWxsID0gbmV3IFhFbGVtZW50KFcudGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yy5FbGVtZW50cygpLldoZXJlKHogPT4gei5OYW1lICE9IFcucCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaC5FbGVtZW50KFcucFByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVSdW5FcnJvck1lc3NhZ2UoZS5NZXNzYWdlLCB0ZW1wbGF0ZUVycm9yKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JDZWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld0NlbGwgPSBuZXcgWEVsZW1lbnQoVy50YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjLkVsZW1lbnRzKCkuV2hlcmUoeiA9PiB6Lk5hbWUgIT0gVy5wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoLkVsZW1lbnQoVy5wUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxSdW4gIT0gbnVsbCA/IGNlbGxSdW4uRWxlbWVudChXLnJQcikgOiBuZXcgWEVsZW1lbnQoVy5yUHIpLCAgLy9pZiB0aGUgY2VsbCB3YXMgZW1wdHkgdGhlcmUgaXMgbm8gY2VsbHJ1bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50LCBuZXdWYWx1ZSkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0NlbGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vdGVyUm93cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1RhYmxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFBBLkNvbmRpdGlvbmFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHhQYXRoID0gKHN0cmluZyllbGVtZW50LkF0dHJpYnV0ZShQQS5TZWxlY3QpOworICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSAoc3RyaW5nKWVsZW1lbnQuQXR0cmlidXRlKFBBLk1hdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5vdE1hdGNoID0gKHN0cmluZyllbGVtZW50LkF0dHJpYnV0ZShQQS5Ob3RNYXRjaCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID09IG51bGwgJiYgbm90TWF0Y2ggPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVDb250ZXh0RXJyb3JNZXNzYWdlKGVsZW1lbnQsICJDb25kaXRpb25hbDogTXVzdCBzcGVjaWZ5IGVpdGhlciBNYXRjaCBvciBOb3RNYXRjaCIsIHRlbXBsYXRlRXJyb3IpOworICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggIT0gbnVsbCAmJiBub3RNYXRjaCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUNvbnRleHRFcnJvck1lc3NhZ2UoZWxlbWVudCwgIkNvbmRpdGlvbmFsOiBDYW5ub3Qgc3BlY2lmeSBib3RoIE1hdGNoIGFuZCBOb3RNYXRjaCIsIHRlbXBsYXRlRXJyb3IpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0ZXN0VmFsdWUgPSBudWxsOyAKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RWYWx1ZSA9IEV2YWx1YXRlWFBhdGhUb1N0cmluZyhkYXRhLCB4UGF0aCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgICAgIGNhdGNoIChYUGF0aEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlQ29udGV4dEVycm9yTWVzc2FnZShlbGVtZW50LCBlLk1lc3NhZ2UsIHRlbXBsYXRlRXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtYXRjaCAhPSBudWxsICYmIHRlc3RWYWx1ZSA9PSBtYXRjaCkgfHwgKG5vdE1hdGNoICE9IG51bGwgJiYgdGVzdFZhbHVlICE9IG5vdE1hdGNoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBlbGVtZW50LkVsZW1lbnRzKCkuU2VsZWN0KGUgPT4gQ29udGVudFJlcGxhY2VtZW50VHJhbnNmb3JtKGUsIGRhdGEsIHRlbXBsYXRlRXJyb3IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBDb250ZW50UmVwbGFjZW1lbnRUcmFuc2Zvcm0obiwgZGF0YSwgdGVtcGxhdGVFcnJvcikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IENyZWF0ZUNvbnRleHRFcnJvck1lc3NhZ2UoWEVsZW1lbnQgZWxlbWVudCwgc3RyaW5nIGVycm9yTWVzc2FnZSwgVGVtcGxhdGVFcnJvciB0ZW1wbGF0ZUVycm9yKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBwYXJhID0gZWxlbWVudC5EZXNjZW5kYW50cyhXLnApLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBYRWxlbWVudCBydW4gPSBlbGVtZW50LkRlc2NlbmRhbnRzKFcucikuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIHZhciBlcnJvclJ1biA9IENyZWF0ZVJ1bkVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UsIHRlbXBsYXRlRXJyb3IpOworICAgICAgICAgICAgaWYgKHBhcmEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcucCwgZXJyb3JSdW4pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvclJ1bjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IENyZWF0ZVJ1bkVycm9yTWVzc2FnZShzdHJpbmcgZXJyb3JNZXNzYWdlLCBUZW1wbGF0ZUVycm9yIHRlbXBsYXRlRXJyb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXBsYXRlRXJyb3IuSGFzRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgdmFyIGVycm9yUnVuID0gbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yUHIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLmNvbG9yLCBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgIkZGMDAwMCIpKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuaGlnaGxpZ2h0LCBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgInllbGxvdyIpKSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnQsIGVycm9yTWVzc2FnZSkpOworICAgICAgICAgICAgcmV0dXJuIGVycm9yUnVuOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgQ3JlYXRlUGFyYUVycm9yTWVzc2FnZShzdHJpbmcgZXJyb3JNZXNzYWdlLCBUZW1wbGF0ZUVycm9yIHRlbXBsYXRlRXJyb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXBsYXRlRXJyb3IuSGFzRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgdmFyIGVycm9yUGFyYSA9IG5ldyBYRWxlbWVudChXLnAsCisgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuclByLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuY29sb3IsIG5ldyBYQXR0cmlidXRlKFcudmFsLCAiRkYwMDAwIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuaGlnaGxpZ2h0LCBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgInllbGxvdyIpKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50LCBlcnJvck1lc3NhZ2UpKSk7CisgICAgICAgICAgICByZXR1cm4gZXJyb3JQYXJhOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEV2YWx1YXRlWFBhdGhUb1N0cmluZyhYRWxlbWVudCBlbGVtZW50LCBzdHJpbmcgeFBhdGgsIGJvb2wgb3B0aW9uYWwgKQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3QgeFBhdGhTZWxlY3RSZXN1bHQ7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3N1cHBvcnQgc29tZSBjZWxscyBpbiB0aGUgdGFibGUgbWF5IG5vdCBoYXZlIGFuIHhwYXRoIGV4cHJlc3Npb24uCisgICAgICAgICAgICAgICAgaWYgKFN0cmluZy5Jc051bGxPcldoaXRlU3BhY2UoeFBhdGgpKSByZXR1cm4gU3RyaW5nLkVtcHR5OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHhQYXRoU2VsZWN0UmVzdWx0ID0gZWxlbWVudC5YUGF0aEV2YWx1YXRlKHhQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYUGF0aEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYUGF0aEV4Y2VwdGlvbigiWFBhdGhFeGNlcHRpb246ICIgKyBlLk1lc3NhZ2UsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHhQYXRoU2VsZWN0UmVzdWx0IGlzIElFbnVtZXJhYmxlKSAmJiAhKHhQYXRoU2VsZWN0UmVzdWx0IGlzIHN0cmluZykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkRGF0YSA9ICgoSUVudW1lcmFibGUpIHhQYXRoU2VsZWN0UmVzdWx0KS5DYXN0PFhPYmplY3Q+KCk7CisgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuQW55KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWwpIHJldHVybiBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYUGF0aEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJYUGF0aCBleHByZXNzaW9uICh7MH0pIHJldHVybmVkIG5vIHJlc3VsdHMiLCB4UGF0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLkNvdW50KCkgPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhQYXRoRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIlhQYXRoIGV4cHJlc3Npb24gKHswfSkgcmV0dXJuZWQgbW9yZSB0aGFuIG9uZSBub2RlIiwgeFBhdGgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBYT2JqZWN0IHNlbGVjdGVkRGF0dW0gPSBzZWxlY3RlZERhdGEuRmlyc3QoKTsgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkRGF0dW0gaXMgWEVsZW1lbnQpIHJldHVybiAoKFhFbGVtZW50KSBzZWxlY3RlZERhdHVtKS5WYWx1ZTsKKworICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZERhdHVtIGlzIFhBdHRyaWJ1dGUpIHJldHVybiAoKFhBdHRyaWJ1dGUpIHNlbGVjdGVkRGF0dW0pLlZhbHVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4geFBhdGhTZWxlY3RSZXN1bHQuVG9TdHJpbmcoKTsKKworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvRG9jdW1lbnRCdWlsZGVyLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvRG9jdW1lbnRCdWlsZGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZjUyNTQKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9Eb2N1bWVudEJ1aWxkZXIuY3MKQEAgLTAsMCArMSwyODg2IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworVmVyc2lvbjogMi42LjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUZXN0Rm9yVW5zdXBwb3J0ZWREb2N1bWVudHMKKyNkZWZpbmUgTWVyZ2VTdHlsZXNXaXRoU2FtZU5hbWVzCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgcHVibGljIHBhcnRpYWwgY2xhc3MgV21sRG9jdW1lbnQgOiBPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50CisgICAgeworICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8V21sRG9jdW1lbnQ+IFNwbGl0T25TZWN0aW9ucygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBEb2N1bWVudEJ1aWxkZXIuU3BsaXRPblNlY3Rpb25zKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFNvdXJjZQorICAgIHsKKyAgICAgICAgcHVibGljIFdtbERvY3VtZW50IFdtbERvY3VtZW50IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIGludCBTdGFydCB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgYm9vbCBLZWVwU2VjdGlvbnMgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgYm9vbCBEaXNjYXJkSGVhZGVyc0FuZEZvb3RlcnNJbktlcHRTZWN0aW9ucyB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBzdHJpbmcgSW5zZXJ0SWQgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBTb3VyY2Uoc3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBXbWxEb2N1bWVudCA9IG5ldyBXbWxEb2N1bWVudChmaWxlTmFtZSk7CisgICAgICAgICAgICBTdGFydCA9IDA7CisgICAgICAgICAgICBDb3VudCA9IEludDMyLk1heFZhbHVlOworICAgICAgICAgICAgS2VlcFNlY3Rpb25zID0gZmFsc2U7CisgICAgICAgICAgICBJbnNlcnRJZCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU291cmNlKFdtbERvY3VtZW50IHNvdXJjZSkKKyAgICAgICAgeworICAgICAgICAgICAgV21sRG9jdW1lbnQgPSBzb3VyY2U7CisgICAgICAgICAgICBTdGFydCA9IDA7CisgICAgICAgICAgICBDb3VudCA9IEludDMyLk1heFZhbHVlOworICAgICAgICAgICAgS2VlcFNlY3Rpb25zID0gZmFsc2U7CisgICAgICAgICAgICBJbnNlcnRJZCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU291cmNlKHN0cmluZyBmaWxlTmFtZSwgYm9vbCBrZWVwU2VjdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdtbERvY3VtZW50ID0gbmV3IFdtbERvY3VtZW50KGZpbGVOYW1lKTsKKyAgICAgICAgICAgIFN0YXJ0ID0gMDsKKyAgICAgICAgICAgIENvdW50ID0gSW50MzIuTWF4VmFsdWU7CisgICAgICAgICAgICBLZWVwU2VjdGlvbnMgPSBrZWVwU2VjdGlvbnM7CisgICAgICAgICAgICBJbnNlcnRJZCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU291cmNlKFdtbERvY3VtZW50IHNvdXJjZSwgYm9vbCBrZWVwU2VjdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdtbERvY3VtZW50ID0gc291cmNlOworICAgICAgICAgICAgU3RhcnQgPSAwOworICAgICAgICAgICAgQ291bnQgPSBJbnQzMi5NYXhWYWx1ZTsKKyAgICAgICAgICAgIEtlZXBTZWN0aW9ucyA9IGtlZXBTZWN0aW9uczsKKyAgICAgICAgICAgIEluc2VydElkID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTb3VyY2Uoc3RyaW5nIGZpbGVOYW1lLCBzdHJpbmcgaW5zZXJ0SWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdtbERvY3VtZW50ID0gbmV3IFdtbERvY3VtZW50KGZpbGVOYW1lKTsKKyAgICAgICAgICAgIFN0YXJ0ID0gMDsKKyAgICAgICAgICAgIENvdW50ID0gSW50MzIuTWF4VmFsdWU7CisgICAgICAgICAgICBLZWVwU2VjdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgICAgIEluc2VydElkID0gaW5zZXJ0SWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU291cmNlKFdtbERvY3VtZW50IHNvdXJjZSwgc3RyaW5nIGluc2VydElkKQorICAgICAgICB7CisgICAgICAgICAgICBXbWxEb2N1bWVudCA9IHNvdXJjZTsKKyAgICAgICAgICAgIFN0YXJ0ID0gMDsKKyAgICAgICAgICAgIENvdW50ID0gSW50MzIuTWF4VmFsdWU7CisgICAgICAgICAgICBLZWVwU2VjdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgICAgIEluc2VydElkID0gaW5zZXJ0SWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU291cmNlKHN0cmluZyBmaWxlTmFtZSwgaW50IHN0YXJ0LCBib29sIGtlZXBTZWN0aW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgV21sRG9jdW1lbnQgPSBuZXcgV21sRG9jdW1lbnQoZmlsZU5hbWUpOworICAgICAgICAgICAgU3RhcnQgPSBzdGFydDsKKyAgICAgICAgICAgIENvdW50ID0gSW50MzIuTWF4VmFsdWU7CisgICAgICAgICAgICBLZWVwU2VjdGlvbnMgPSBrZWVwU2VjdGlvbnM7CisgICAgICAgICAgICBJbnNlcnRJZCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU291cmNlKFdtbERvY3VtZW50IHNvdXJjZSwgaW50IHN0YXJ0LCBib29sIGtlZXBTZWN0aW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgV21sRG9jdW1lbnQgPSBzb3VyY2U7CisgICAgICAgICAgICBTdGFydCA9IHN0YXJ0OworICAgICAgICAgICAgQ291bnQgPSBJbnQzMi5NYXhWYWx1ZTsKKyAgICAgICAgICAgIEtlZXBTZWN0aW9ucyA9IGtlZXBTZWN0aW9uczsKKyAgICAgICAgICAgIEluc2VydElkID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTb3VyY2Uoc3RyaW5nIGZpbGVOYW1lLCBpbnQgc3RhcnQsIHN0cmluZyBpbnNlcnRJZCkKKyAgICAgICAgeworICAgICAgICAgICAgV21sRG9jdW1lbnQgPSBuZXcgV21sRG9jdW1lbnQoZmlsZU5hbWUpOworICAgICAgICAgICAgU3RhcnQgPSBzdGFydDsKKyAgICAgICAgICAgIENvdW50ID0gSW50MzIuTWF4VmFsdWU7CisgICAgICAgICAgICBLZWVwU2VjdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgICAgIEluc2VydElkID0gaW5zZXJ0SWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU291cmNlKFdtbERvY3VtZW50IHNvdXJjZSwgaW50IHN0YXJ0LCBzdHJpbmcgaW5zZXJ0SWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdtbERvY3VtZW50ID0gc291cmNlOworICAgICAgICAgICAgU3RhcnQgPSBzdGFydDsKKyAgICAgICAgICAgIENvdW50ID0gSW50MzIuTWF4VmFsdWU7CisgICAgICAgICAgICBLZWVwU2VjdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgICAgIEluc2VydElkID0gaW5zZXJ0SWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU291cmNlKHN0cmluZyBmaWxlTmFtZSwgaW50IHN0YXJ0LCBpbnQgY291bnQsIGJvb2wga2VlcFNlY3Rpb25zKQorICAgICAgICB7CisgICAgICAgICAgICBXbWxEb2N1bWVudCA9IG5ldyBXbWxEb2N1bWVudChmaWxlTmFtZSk7CisgICAgICAgICAgICBTdGFydCA9IHN0YXJ0OworICAgICAgICAgICAgQ291bnQgPSBjb3VudDsKKyAgICAgICAgICAgIEtlZXBTZWN0aW9ucyA9IGtlZXBTZWN0aW9uczsKKyAgICAgICAgICAgIEluc2VydElkID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTb3VyY2UoV21sRG9jdW1lbnQgc291cmNlLCBpbnQgc3RhcnQsIGludCBjb3VudCwgYm9vbCBrZWVwU2VjdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdtbERvY3VtZW50ID0gc291cmNlOworICAgICAgICAgICAgU3RhcnQgPSBzdGFydDsKKyAgICAgICAgICAgIENvdW50ID0gY291bnQ7CisgICAgICAgICAgICBLZWVwU2VjdGlvbnMgPSBrZWVwU2VjdGlvbnM7CisgICAgICAgICAgICBJbnNlcnRJZCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU291cmNlKHN0cmluZyBmaWxlTmFtZSwgaW50IHN0YXJ0LCBpbnQgY291bnQsIHN0cmluZyBpbnNlcnRJZCkKKyAgICAgICAgeworICAgICAgICAgICAgV21sRG9jdW1lbnQgPSBuZXcgV21sRG9jdW1lbnQoZmlsZU5hbWUpOworICAgICAgICAgICAgU3RhcnQgPSBzdGFydDsKKyAgICAgICAgICAgIENvdW50ID0gY291bnQ7CisgICAgICAgICAgICBLZWVwU2VjdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgICAgIEluc2VydElkID0gaW5zZXJ0SWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU291cmNlKFdtbERvY3VtZW50IHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgY291bnQsIHN0cmluZyBpbnNlcnRJZCkKKyAgICAgICAgeworICAgICAgICAgICAgV21sRG9jdW1lbnQgPSBzb3VyY2U7CisgICAgICAgICAgICBTdGFydCA9IHN0YXJ0OworICAgICAgICAgICAgQ291bnQgPSBjb3VudDsKKyAgICAgICAgICAgIEtlZXBTZWN0aW9ucyA9IGZhbHNlOworICAgICAgICAgICAgSW5zZXJ0SWQgPSBpbnNlcnRJZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRG9jdW1lbnRCdWlsZGVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQnVpbGREb2N1bWVudChMaXN0PFNvdXJjZT4gc291cmNlcywgc3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudC5DcmVhdGVXb3JkcHJvY2Vzc2luZ0RvY3VtZW50KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgb3V0cHV0ID0gc3RyZWFtRG9jLkdldFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ1aWxkRG9jdW1lbnQoc291cmNlcywgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmVhbURvYy5HZXRNb2RpZmllZERvY3VtZW50KCkuU2F2ZUFzKGZpbGVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgV21sRG9jdW1lbnQgQnVpbGREb2N1bWVudChMaXN0PFNvdXJjZT4gc291cmNlcykKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCBzdHJlYW1Eb2MgPSBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQuQ3JlYXRlV29yZHByb2Nlc3NpbmdEb2N1bWVudCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IG91dHB1dCA9IHN0cmVhbURvYy5HZXRXb3JkcHJvY2Vzc2luZ0RvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCdWlsZERvY3VtZW50KHNvdXJjZXMsIG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtRG9jLkdldE1vZGlmaWVkV21sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RydWN0IFRlbXBTb3VyY2UKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBTdGFydDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgQ291bnQ7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBBdGJpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBYRWxlbWVudCBCbG9ja0xldmVsQ29udGVudDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIEF0YmlkCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBYRWxlbWVudCBCbG9ja0xldmVsQ29udGVudDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgSW5kZXg7CisgICAgICAgICAgICBwdWJsaWMgaW50IERpdjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8V21sRG9jdW1lbnQ+IFNwbGl0T25TZWN0aW9ucyhXbWxEb2N1bWVudCBkb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8VGVtcFNvdXJjZT4gdGVtcFNvdXJjZUxpc3Q7CisgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoZG9jKSkKKyAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvY3VtZW50ID0gc3RyZWFtRG9jLkdldFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRG9jdW1lbnQgbWFpbkRvY3VtZW50ID0gZG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICB2YXIgZGl2cyA9IG1haW5Eb2N1bWVudAorICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudChXLmJvZHkpCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoKHAsIGkpID0+IG5ldyBBdGJpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrTGV2ZWxDb250ZW50ID0gcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4ID0gaSwKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgLlJvbGx1cChuZXcgQXRiaWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0xldmVsQ29udGVudCA9IChYRWxlbWVudCludWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4ID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGl2ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAoYiwgcCkgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50QmVmb3JlID0gYi5CbG9ja0xldmVsQ29udGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2libGluZ3NCZWZvcmVTZWxmUmV2ZXJzZURvY3VtZW50T3JkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEJlZm9yZSAhPSBudWxsICYmIGVsZW1lbnRCZWZvcmUuRGVzY2VuZGFudHMoVy5zZWN0UHIpLkFueSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF0YmlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrTGV2ZWxDb250ZW50ID0gYi5CbG9ja0xldmVsQ29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4ID0gYi5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpdiA9IHAuRGl2ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF0YmlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0xldmVsQ29udGVudCA9IGIuQmxvY2tMZXZlbENvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4ID0gYi5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGl2ID0gcC5EaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHZhciBncm91cHMgPSBkaXZzCisgICAgICAgICAgICAgICAgICAgIC5Hcm91cEFkamFjZW50KGIgPT4gYi5EaXYpOworICAgICAgICAgICAgICAgIHRlbXBTb3VyY2VMaXN0ID0gZ3JvdXBzCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZyA9PiBuZXcgVGVtcFNvdXJjZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdGFydCA9IGcuRmlyc3QoKS5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ID0gZy5Db3VudCgpLAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRzIGluIHRlbXBTb3VyY2VMaXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxTb3VyY2U+IHNvdXJjZXMgPSBuZXcgTGlzdDxTb3VyY2U+KCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShkb2MsIHRzLlN0YXJ0LCB0cy5Db3VudCwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgV21sRG9jdW1lbnQgbmV3RG9jID0gRG9jdW1lbnRCdWlsZGVyLkJ1aWxkRG9jdW1lbnQoc291cmNlcyk7CisgICAgICAgICAgICAgICAgICAgIG5ld0RvYyA9IEFkanVzdFNlY3Rpb25CcmVhayhuZXdEb2MpOworICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gbmV3RG9jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFdtbERvY3VtZW50IEFkanVzdFNlY3Rpb25CcmVhayhXbWxEb2N1bWVudCBkb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgc3RyZWFtRG9jID0gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudChkb2MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvY3VtZW50ID0gc3RyZWFtRG9jLkdldFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhEb2N1bWVudCBtYWluWERvYyA9IGRvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGxhc3RFbGVtZW50ID0gbWFpblhEb2MuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQoVy5ib2R5KQorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5MYXN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0RWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEVsZW1lbnQuTmFtZSAhPSBXLnNlY3RQciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFbGVtZW50LkRlc2NlbmRhbnRzKFcuc2VjdFByKS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluWERvYy5Sb290LkVsZW1lbnQoVy5ib2R5KS5BZGQobGFzdEVsZW1lbnQuRGVzY2VuZGFudHMoVy5zZWN0UHIpLkZpcnN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFbGVtZW50LkRlc2NlbmRhbnRzKFcuc2VjdFByKS5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3RFbGVtZW50LkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gZS5OYW1lICE9IFcucFByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFbGVtZW50LlJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbURvYy5HZXRNb2RpZmllZFdtbERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEJ1aWxkRG9jdW1lbnQoTGlzdDxTb3VyY2U+IHNvdXJjZXMsIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgb3V0cHV0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUmVsYXRpb25zaGlwTWFya3VwID09IG51bGwpCisgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwTWFya3VwID0gbmV3IERpY3Rpb25hcnk8WE5hbWUsIFhOYW1lW10+KCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8veyBidXR0b24sICAgICAgICAgICBuZXcgW10geyBpbWFnZSB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBBLmJsaXAsICAgICAgICAgICAgIG5ldyBbXSB7IFIuZW1iZWQsIFIubGluayB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBBLmhsaW5rQ2xpY2ssICAgICAgIG5ldyBbXSB7IFIuaWQgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgQS5yZWxJZHMsICAgICAgICAgICBuZXcgW10geyBSLmNzLCBSLmRtLCBSLmxvLCBSLnFzIH19LAorICAgICAgICAgICAgICAgICAgICAvL3sgYTE0OmltZ0xheWVyLCAgICAgbmV3IFtdIHsgUi5lbWJlZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgLy97IGF4Om9jeCwgICAgICAgICAgIG5ldyBbXSB7IFIuaWQgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgQy5jaGFydCwgICAgICAgICAgICBuZXcgW10geyBSLmlkIH19LAorICAgICAgICAgICAgICAgICAgICB7IEMuZXh0ZXJuYWxEYXRhLCAgICAgbmV3IFtdIHsgUi5pZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBDLnVzZXJTaGFwZXMsICAgICAgIG5ldyBbXSB7IFIuaWQgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgREdNLnJlbElkcywgICAgICAgICBuZXcgW10geyBSLmNzLCBSLmRtLCBSLmxvLCBSLnFzIH19LAorICAgICAgICAgICAgICAgICAgICB7IE8uT0xFT2JqZWN0LCAgICAgICAgbmV3IFtdIHsgUi5pZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBWTUwuZmlsbCwgICAgICAgICAgIG5ldyBbXSB7IFIuaWQgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgVk1MLmltYWdlZGF0YSwgICAgICBuZXcgW10geyBSLmhyZWYsIFIuaWQsIFIucGljdCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBWTUwuc3Ryb2tlLCAgICAgICAgIG5ldyBbXSB7IFIuaWQgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgVy5hbHRDaHVuaywgICAgICAgICBuZXcgW10geyBSLmlkIH19LAorICAgICAgICAgICAgICAgICAgICB7IFcuYXR0YWNoZWRUZW1wbGF0ZSwgbmV3IFtdIHsgUi5pZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBXLmNvbnRyb2wsICAgICAgICAgIG5ldyBbXSB7IFIuaWQgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgVy5kYXRhU291cmNlLCAgICAgICBuZXcgW10geyBSLmlkIH19LAorICAgICAgICAgICAgICAgICAgICB7IFcuZW1iZWRCb2xkLCAgICAgICAgbmV3IFtdIHsgUi5pZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBXLmVtYmVkQm9sZEl0YWxpYywgIG5ldyBbXSB7IFIuaWQgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgVy5lbWJlZEl0YWxpYywgICAgICBuZXcgW10geyBSLmlkIH19LAorICAgICAgICAgICAgICAgICAgICB7IFcuZW1iZWRSZWd1bGFyLCAgICAgbmV3IFtdIHsgUi5pZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBXLmZvb3RlclJlZmVyZW5jZSwgIG5ldyBbXSB7IFIuaWQgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgVy5oZWFkZXJSZWZlcmVuY2UsICBuZXcgW10geyBSLmlkIH19LAorICAgICAgICAgICAgICAgICAgICB7IFcuaGVhZGVyU291cmNlLCAgICAgbmV3IFtdIHsgUi5pZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBXLmh5cGVybGluaywgICAgICAgIG5ldyBbXSB7IFIuaWQgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgVy5wcmludGVyU2V0dGluZ3MsICBuZXcgW10geyBSLmlkIH19LAorICAgICAgICAgICAgICAgICAgICB7IFcucmVjaXBpZW50RGF0YSwgICAgbmV3IFtdIHsgUi5pZCB9fSwgIC8vIE1haWwgbWVyZ2UsIG5vdCByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICB7IFcuc2F2ZVRocm91Z2hYc2x0LCAgbmV3IFtdIHsgUi5pZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBXLnNvdXJjZUZpbGVOYW1lLCAgIG5ldyBbXSB7IFIuaWQgfX0sICAvLyBGcmFtZXNldHMsIG5vdCByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICB7IFcuc3JjLCAgICAgICAgICAgICAgbmV3IFtdIHsgUi5pZCB9fSwgIC8vIE1haWwgbWVyZ2UsIG5vdCByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICB7IFcuc3ViRG9jLCAgICAgICAgICAgbmV3IFtdIHsgUi5pZCB9fSwgIC8vIFN1YiBkb2N1bWVudHMsIG5vdCByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAvL3sgdzE0OmNvbnRlbnRQYXJ0LCAgbmV3IFtdIHsgUi5pZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBXTkUudG9vbGJhckRhdGEsICAgIG5ldyBbXSB7IFIuaWQgfX0sCisgICAgICAgICAgICAgICAgfTsKKworCisgICAgICAgICAgICAvLyBUaGlzIGxpc3QgaXMgdXNlZCB0byBlbGltaW5hdGUgZHVwbGljYXRlIGltYWdlcworICAgICAgICAgICAgTGlzdDxJbWFnZURhdGE+IGltYWdlcyA9IG5ldyBMaXN0PEltYWdlRGF0YT4oKTsKKyAgICAgICAgICAgIFhEb2N1bWVudCBtYWluUGFydCA9IG91dHB1dC5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgbWFpblBhcnQuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgbWFpblBhcnQuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgbWFpblBhcnQuUm9vdC5SZXBsYWNlV2l0aCgKKyAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5kb2N1bWVudCwgTmFtZXNwYWNlQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuYm9keSkpKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2VzLkNvdW50ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoc291cmNlc1swXS5XbWxEb2N1bWVudCkpCisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jID0gc3RyZWFtRG9jLkdldFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvcHlTdGFydGluZ1BhcnRzKGRvYywgb3V0cHV0LCBpbWFnZXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBzb3VyY2VOdW0yID0gMDsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChTb3VyY2Ugc291cmNlIGluIHNvdXJjZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLkluc2VydElkICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworI2lmIGZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZ5IEFwcGVuZERvY3VtZW50IHNvIHRoYXQgaXQgY2FuIHRha2UgYSBwYXJ0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBlYWNoIGluIG1haW4gZG9jdW1lbnQgcGFydCwgaGVhZGVyIHBhcnRzLCBmb290ZXIgcGFydHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHRoZXJlIGFueSBQdE9wZW5YbWwuSW5zZXJ0IGVsZW1lbnRzIGluIGFueSBvZiB0aGVtPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNvLCB0aGVuIG9wZW4gYW5kIHByb2Nlc3MgYWxsLgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3VuZEluTWFpbkRvY1BhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgbWFpblhEb2MgPSBvdXRwdXQuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFpblhEb2MuRGVzY2VuZGFudHMoUHRPcGVuWG1sLkluc2VydCkuQW55KGQgPT4gKHN0cmluZylkLkF0dHJpYnV0ZShQdE9wZW5YbWwuSWQpID09IHNvdXJjZS5JbnNlcnRJZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5NYWluRG9jUGFydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kSW5NYWluRG9jUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgc3RyZWFtRG9jID0gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudChzb3VyY2UuV21sRG9jdW1lbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MgPSBzdHJlYW1Eb2MuR2V0V29yZHByb2Nlc3NpbmdEb2N1bWVudCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisjaWYgVGVzdEZvclVuc3VwcG9ydGVkRG9jdW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvd3MgZXhjZXB0aW9ucyBpZiBhIGRvY3VtZW50IGNvbnRhaW5zIHVuc3VwcG9ydGVkIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RGb3JVbnN1cHBvcnRlZERvY3VtZW50KGRvYywgc291cmNlcy5JbmRleE9mKHNvdXJjZSkpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRJbk1haW5Eb2NQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuS2VlcFNlY3Rpb25zICYmIHNvdXJjZS5EaXNjYXJkSGVhZGVyc0FuZEZvb3RlcnNJbktlcHRTZWN0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlSGVhZGVyc0FuZEZvb3RlcnNGcm9tU2VjdGlvbnMoZG9jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzb3VyY2UuS2VlcFNlY3Rpb25zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzU2VjdGlvbnNGb3JMaW5rVG9QcmV2aW91c0hlYWRlcnNBbmRGb290ZXJzKGRvYyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBjb250ZW50cyA9IGRvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50KFcuYm9keSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNraXAoc291cmNlLlN0YXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVGFrZShzb3VyY2UuQ291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVuZERvY3VtZW50KGRvYywgb3V0cHV0LCBjb250ZW50cywgc291cmNlLktlZXBTZWN0aW9ucywgc291cmNlLkluc2VydElkLCBpbWFnZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRG9jdW1lbnRCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24gZGJpZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYmllLk1lc3NhZ2UuQ29udGFpbnMoInswfSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50QnVpbGRlckV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KGRiaWUuTWVzc2FnZSwgc291cmNlTnVtMikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBkYmllOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCBzdHJlYW1Eb2MgPSBuZXcgT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50KHNvdXJjZS5XbWxEb2N1bWVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MgPSBzdHJlYW1Eb2MuR2V0V29yZHByb2Nlc3NpbmdEb2N1bWVudCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworI2lmIFRlc3RGb3JVbnN1cHBvcnRlZERvY3VtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm93cyBleGNlcHRpb25zIGlmIGEgZG9jdW1lbnQgY29udGFpbnMgdW5zdXBwb3J0ZWQgY29udGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RGb3JVbnN1cHBvcnRlZERvY3VtZW50KGRvYywgc291cmNlcy5JbmRleE9mKHNvdXJjZSkpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5LZWVwU2VjdGlvbnMgJiYgc291cmNlLkRpc2NhcmRIZWFkZXJzQW5kRm9vdGVyc0luS2VwdFNlY3Rpb25zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVIZWFkZXJzQW5kRm9vdGVyc0Zyb21TZWN0aW9ucyhkb2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNvdXJjZS5LZWVwU2VjdGlvbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NTZWN0aW9uc0ZvckxpbmtUb1ByZXZpb3VzSGVhZGVyc0FuZEZvb3RlcnMoZG9jKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IGNvbnRlbnRzID0gZG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQoVy5ib2R5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcChzb3VyY2UuU3RhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UYWtlKHNvdXJjZS5Db3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwZW5kRG9jdW1lbnQoZG9jLCBvdXRwdXQsIGNvbnRlbnRzLCBzb3VyY2UuS2VlcFNlY3Rpb25zLCBudWxsLCBpbWFnZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRG9jdW1lbnRCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24gZGJpZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYmllLk1lc3NhZ2UuQ29udGFpbnMoInswfSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50QnVpbGRlckV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KGRiaWUuTWVzc2FnZSwgc291cmNlTnVtMikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBkYmllOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK3NvdXJjZU51bTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghc291cmNlcy5BbnkocyA9PiBzLktlZXBTZWN0aW9ucykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoc291cmNlc1swXS5XbWxEb2N1bWVudCkpCisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYyA9IHN0cmVhbURvYy5HZXRXb3JkcHJvY2Vzc2luZ0RvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWN0UHIgPSBkb2MuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKS5Sb290LkVsZW1lbnQoVy5ib2R5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpLkxhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWN0UHIuTmFtZSA9PSBXLnNlY3RQcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRTZWN0aW9uQW5kRGVwZW5kZW5jaWVzKGRvYywgb3V0cHV0LCBzZWN0UHIsIGltYWdlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Lk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCkuUm9vdC5FbGVtZW50KFcuYm9keSkuQWRkKHNlY3RQcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRml4VXBTZWN0aW9uUHJvcGVydGllcyhvdXRwdXQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEFueSBzZWN0UHIgZWxlbWVudHMgdGhhdCBkbyBub3QgaGF2ZSBoZWFkZXJzIGFuZCBmb290ZXJzIHNob3VsZCB0YWtlIHRoZWlyIGhlYWRlcnMgYW5kIGZvb3RlcnMgZnJvbSB0aGUgKm5leHQqIHNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIC8vIGkuZS4gZnJvbSB0aGUgcnVubmluZyBzZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICB2YXIgbXhkID0gb3V0cHV0Lk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBzZWN0aW9ucyA9IG14ZC5EZXNjZW5kYW50cyhXLnNlY3RQcikuUmV2ZXJzZSgpLlRvTGlzdCgpOworCisgICAgICAgICAgICAgICAgICAgIENhY2hlZEhlYWRlckZvb3RlcltdIGNhY2hlZEhlYWRlckZvb3RlciA9IG5ld1tdCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYWNoZWRIZWFkZXJGb290ZXIoKSB7IFJlZiA9IFcuaGVhZGVyUmVmZXJlbmNlLCBUeXBlID0gImZpcnN0IiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENhY2hlZEhlYWRlckZvb3RlcigpIHsgUmVmID0gVy5oZWFkZXJSZWZlcmVuY2UsIFR5cGUgPSAiZXZlbiIgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYWNoZWRIZWFkZXJGb290ZXIoKSB7IFJlZiA9IFcuaGVhZGVyUmVmZXJlbmNlLCBUeXBlID0gImRlZmF1bHQiIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2FjaGVkSGVhZGVyRm9vdGVyKCkgeyBSZWYgPSBXLmZvb3RlclJlZmVyZW5jZSwgVHlwZSA9ICJmaXJzdCIgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYWNoZWRIZWFkZXJGb290ZXIoKSB7IFJlZiA9IFcuZm9vdGVyUmVmZXJlbmNlLCBUeXBlID0gImV2ZW4iIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2FjaGVkSGVhZGVyRm9vdGVyKCkgeyBSZWYgPSBXLmZvb3RlclJlZmVyZW5jZSwgVHlwZSA9ICJkZWZhdWx0IiB9LAorICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIGJvb2wgZmlyc3RTZWN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHNlY3QgaW4gc2VjdGlvbnMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFNlY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGhmIGluIGNhY2hlZEhlYWRlckZvb3RlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VFbGVtZW50ID0gc2VjdC5FbGVtZW50cyhoZi5SZWYpLkZpcnN0T3JEZWZhdWx0KHogPT4gKHN0cmluZyl6LkF0dHJpYnV0ZShXLnR5cGUpID09IGhmLlR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlRWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGYuQ2FjaGVkUGFydFJpZCA9IChzdHJpbmcpcmVmZXJlbmNlRWxlbWVudC5BdHRyaWJ1dGUoUi5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2VjdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcHlPckNhY2hlSGVhZGVyT3JGb290ZXIob3V0cHV0LCBjYWNoZWRIZWFkZXJGb290ZXIsIHNlY3QsIFcuaGVhZGVyUmVmZXJlbmNlLCAiZmlyc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5T3JDYWNoZUhlYWRlck9yRm9vdGVyKG91dHB1dCwgY2FjaGVkSGVhZGVyRm9vdGVyLCBzZWN0LCBXLmhlYWRlclJlZmVyZW5jZSwgImV2ZW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5T3JDYWNoZUhlYWRlck9yRm9vdGVyKG91dHB1dCwgY2FjaGVkSGVhZGVyRm9vdGVyLCBzZWN0LCBXLmhlYWRlclJlZmVyZW5jZSwgImRlZmF1bHQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5T3JDYWNoZUhlYWRlck9yRm9vdGVyKG91dHB1dCwgY2FjaGVkSGVhZGVyRm9vdGVyLCBzZWN0LCBXLmZvb3RlclJlZmVyZW5jZSwgImZpcnN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weU9yQ2FjaGVIZWFkZXJPckZvb3RlcihvdXRwdXQsIGNhY2hlZEhlYWRlckZvb3Rlciwgc2VjdCwgVy5mb290ZXJSZWZlcmVuY2UsICJldmVuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weU9yQ2FjaGVIZWFkZXJPckZvb3RlcihvdXRwdXQsIGNhY2hlZEhlYWRlckZvb3Rlciwgc2VjdCwgVy5mb290ZXJSZWZlcmVuY2UsICJkZWZhdWx0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE5vdyBjYW4gcHJvY2VzcyBQdE9wZW5YbWw6SW5zZXJ0IGVsZW1lbnRzIGluIGhlYWRlcnMgLyBmb290ZXJzCisgICAgICAgICAgICAgICAgaW50IHNvdXJjZU51bSA9IDA7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoU291cmNlIHNvdXJjZSBpbiBzb3VyY2VzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5JbnNlcnRJZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyNpZiBmYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdXNlcyBhbiBvdmVybG9hZCBvZiBBcHBlbmREb2N1bWVudCB0aGF0IHRha2VzIGEgcGFydC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZWFjaCBpbiBtYWluIGRvY3VtZW50IHBhcnQsIGhlYWRlciBwYXJ0cywgZm9vdGVyIHBhcnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSB0aGVyZSBhbnkgUHRPcGVuWG1sLkluc2VydCBlbGVtZW50cyBpbiBhbnkgb2YgdGhlbT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzbywgdGhlbiBvcGVuIGFuZCBwcm9jZXNzIGFsbC4KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm91bmRJbkhlYWRlcnNGb290ZXJzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC5NYWluRG9jdW1lbnRQYXJ0LkhlYWRlclBhcnRzLkFueShocCA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhwWERvYyA9IGhwLkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHBYRG9jLkRlc2NlbmRhbnRzKFB0T3BlblhtbC5JbnNlcnQpLkFueShkID0+IChzdHJpbmcpZC5BdHRyaWJ1dGUoUHRPcGVuWG1sLklkKSA9PSBzb3VyY2UuSW5zZXJ0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluSGVhZGVyc0Zvb3RlcnMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQuTWFpbkRvY3VtZW50UGFydC5Gb290ZXJQYXJ0cy5BbnkoZnAgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBocFhEb2MgPSBmcC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhwWERvYy5EZXNjZW5kYW50cyhQdE9wZW5YbWwuSW5zZXJ0KS5BbnkoZCA9PiAoc3RyaW5nKWQuQXR0cmlidXRlKFB0T3BlblhtbC5JZCkgPT0gc291cmNlLkluc2VydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJbkhlYWRlcnNGb290ZXJzID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZEluSGVhZGVyc0Zvb3RlcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoc291cmNlLldtbERvY3VtZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jID0gc3RyZWFtRG9jLkdldFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworI2lmIFRlc3RGb3JVbnN1cHBvcnRlZERvY3VtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3dzIGV4Y2VwdGlvbnMgaWYgYSBkb2N1bWVudCBjb250YWlucyB1bnN1cHBvcnRlZCBjb250ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0Rm9yVW5zdXBwb3J0ZWREb2N1bWVudChkb2MsIHNvdXJjZXMuSW5kZXhPZihzb3VyY2UpKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRMaXN0ID0gb3V0cHV0Lk1haW5Eb2N1bWVudFBhcnQuSGVhZGVyUGFydHMuQ2FzdDxPcGVuWG1sUGFydD4oKS5Db25jYXQob3V0cHV0Lk1haW5Eb2N1bWVudFBhcnQuRm9vdGVyUGFydHMuQ2FzdDxPcGVuWG1sUGFydD4oKSkuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFydCBpbiBwYXJ0TGlzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFydFhEb2MgPSBwYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFydFhEb2MuRGVzY2VuZGFudHMoUHRPcGVuWG1sLkluc2VydCkuQW55KGQgPT4gKHN0cmluZylkLkF0dHJpYnV0ZShQdE9wZW5YbWwuSWQpID09IHNvdXJjZS5JbnNlcnRJZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IGNvbnRlbnRzID0gZG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQoVy5ib2R5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcChzb3VyY2UuU3RhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UYWtlKHNvdXJjZS5Db3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwZW5kRG9jdW1lbnQoZG9jLCBvdXRwdXQsIHBhcnQsIGNvbnRlbnRzLCBzb3VyY2UuS2VlcFNlY3Rpb25zLCBzb3VyY2UuSW5zZXJ0SWQsIGltYWdlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChEb2N1bWVudEJ1aWxkZXJJbnRlcm5hbEV4Y2VwdGlvbiBkYmllKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRiaWUuTWVzc2FnZS5Db250YWlucygiezB9IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRCdWlsZGVyRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoZGJpZS5NZXNzYWdlLCBzb3VyY2VOdW0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZGJpZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK3NvdXJjZU51bTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQWRqdXN0RG9jUHJJZHMob3V0cHV0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gb3V0cHV0LkdldEFsbFBhcnRzKCkpCisgICAgICAgICAgICAgICAgaWYgKHBhcnQuQW5ub3RhdGlvbjxYRG9jdW1lbnQ+KCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUmVtb3ZlSGVhZGVyc0FuZEZvb3RlcnNGcm9tU2VjdGlvbnMoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtZFhEb2MgPSBkb2MuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciBzZWN0aW9ucyA9IG1kWERvYy5EZXNjZW5kYW50cyhXLnNlY3RQcikuVG9MaXN0KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgc2VjdCBpbiBzZWN0aW9ucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWN0LkVsZW1lbnRzKFcuaGVhZGVyUmVmZXJlbmNlKS5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBzZWN0LkVsZW1lbnRzKFcuZm9vdGVyUmVmZXJlbmNlKS5SZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRvYy5NYWluRG9jdW1lbnRQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBDYWNoZWRIZWFkZXJGb290ZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFhOYW1lIFJlZjsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgVHlwZTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgQ2FjaGVkUGFydFJpZDsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFByb2Nlc3NTZWN0aW9uc0ZvckxpbmtUb1ByZXZpb3VzSGVhZGVyc0FuZEZvb3RlcnMoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIENhY2hlZEhlYWRlckZvb3RlcltdIGNhY2hlZEhlYWRlckZvb3RlciA9IG5ld1tdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IENhY2hlZEhlYWRlckZvb3RlcigpIHsgUmVmID0gVy5oZWFkZXJSZWZlcmVuY2UsIFR5cGUgPSAiZmlyc3QiIH0sCisgICAgICAgICAgICAgICAgbmV3IENhY2hlZEhlYWRlckZvb3RlcigpIHsgUmVmID0gVy5oZWFkZXJSZWZlcmVuY2UsIFR5cGUgPSAiZXZlbiIgfSwKKyAgICAgICAgICAgICAgICBuZXcgQ2FjaGVkSGVhZGVyRm9vdGVyKCkgeyBSZWYgPSBXLmhlYWRlclJlZmVyZW5jZSwgVHlwZSA9ICJkZWZhdWx0IiB9LAorICAgICAgICAgICAgICAgIG5ldyBDYWNoZWRIZWFkZXJGb290ZXIoKSB7IFJlZiA9IFcuZm9vdGVyUmVmZXJlbmNlLCBUeXBlID0gImZpcnN0IiB9LAorICAgICAgICAgICAgICAgIG5ldyBDYWNoZWRIZWFkZXJGb290ZXIoKSB7IFJlZiA9IFcuZm9vdGVyUmVmZXJlbmNlLCBUeXBlID0gImV2ZW4iIH0sCisgICAgICAgICAgICAgICAgbmV3IENhY2hlZEhlYWRlckZvb3RlcigpIHsgUmVmID0gVy5mb290ZXJSZWZlcmVuY2UsIFR5cGUgPSAiZGVmYXVsdCIgfSwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHZhciBtZFhEb2MgPSBkb2MuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciBzZWN0aW9ucyA9IG1kWERvYy5EZXNjZW5kYW50cyhXLnNlY3RQcikuVG9MaXN0KCk7CisgICAgICAgICAgICB2YXIgZmlyc3RTZWN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzZWN0IGluIHNlY3Rpb25zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdFNlY3Rpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVyRmlyc3QgPSBGaW5kUmVmZXJlbmNlKHNlY3QsIFcuaGVhZGVyUmVmZXJlbmNlLCAiZmlyc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGhlYWRlckRlZmF1bHQgPSBGaW5kUmVmZXJlbmNlKHNlY3QsIFcuaGVhZGVyUmVmZXJlbmNlLCAiZGVmYXVsdCIpOworICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVyRXZlbiA9IEZpbmRSZWZlcmVuY2Uoc2VjdCwgVy5oZWFkZXJSZWZlcmVuY2UsICJldmVuIik7CisgICAgICAgICAgICAgICAgICAgIHZhciBmb290ZXJGaXJzdCA9IEZpbmRSZWZlcmVuY2Uoc2VjdCwgVy5mb290ZXJSZWZlcmVuY2UsICJmaXJzdCIpOworICAgICAgICAgICAgICAgICAgICB2YXIgZm9vdGVyRGVmYXVsdCA9IEZpbmRSZWZlcmVuY2Uoc2VjdCwgVy5mb290ZXJSZWZlcmVuY2UsICJkZWZhdWx0Iik7CisgICAgICAgICAgICAgICAgICAgIHZhciBmb290ZXJFdmVuID0gRmluZFJlZmVyZW5jZShzZWN0LCBXLmZvb3RlclJlZmVyZW5jZSwgImV2ZW4iKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyRXZlbiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyRGVmYXVsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFJlZmVyZW5jZVRvRXhpc3RpbmdIZWFkZXJPckZvb3Rlcihkb2MuTWFpbkRvY3VtZW50UGFydCwgc2VjdCwgKHN0cmluZyloZWFkZXJEZWZhdWx0LkF0dHJpYnV0ZShSLmlkKSwgVy5oZWFkZXJSZWZlcmVuY2UsICJldmVuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdEVtcHR5SGVhZGVyT3JGb290ZXIoZG9jLk1haW5Eb2N1bWVudFBhcnQsIHNlY3QsIFcuaGVhZGVyUmVmZXJlbmNlLCAiZXZlbiIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlckZpcnN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXJEZWZhdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUmVmZXJlbmNlVG9FeGlzdGluZ0hlYWRlck9yRm9vdGVyKGRvYy5NYWluRG9jdW1lbnRQYXJ0LCBzZWN0LCAoc3RyaW5nKWhlYWRlckRlZmF1bHQuQXR0cmlidXRlKFIuaWQpLCBXLmhlYWRlclJlZmVyZW5jZSwgImZpcnN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdEVtcHR5SGVhZGVyT3JGb290ZXIoZG9jLk1haW5Eb2N1bWVudFBhcnQsIHNlY3QsIFcuaGVhZGVyUmVmZXJlbmNlLCAiZmlyc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChmb290ZXJFdmVuID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb290ZXJEZWZhdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUmVmZXJlbmNlVG9FeGlzdGluZ0hlYWRlck9yRm9vdGVyKGRvYy5NYWluRG9jdW1lbnRQYXJ0LCBzZWN0LCAoc3RyaW5nKWZvb3RlckRlZmF1bHQuQXR0cmlidXRlKFIuaWQpLCBXLmZvb3RlclJlZmVyZW5jZSwgImV2ZW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0RW1wdHlIZWFkZXJPckZvb3Rlcihkb2MuTWFpbkRvY3VtZW50UGFydCwgc2VjdCwgVy5mb290ZXJSZWZlcmVuY2UsICJldmVuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZm9vdGVyRmlyc3QgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvb3RlckRlZmF1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRSZWZlcmVuY2VUb0V4aXN0aW5nSGVhZGVyT3JGb290ZXIoZG9jLk1haW5Eb2N1bWVudFBhcnQsIHNlY3QsIChzdHJpbmcpZm9vdGVyRGVmYXVsdC5BdHRyaWJ1dGUoUi5pZCksIFcuZm9vdGVyUmVmZXJlbmNlLCAiZmlyc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0RW1wdHlIZWFkZXJPckZvb3Rlcihkb2MuTWFpbkRvY3VtZW50UGFydCwgc2VjdCwgVy5mb290ZXJSZWZlcmVuY2UsICJmaXJzdCIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGhmIGluIGNhY2hlZEhlYWRlckZvb3RlcikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3QuRWxlbWVudHMoaGYuUmVmKS5GaXJzdE9yRGVmYXVsdCh6ID0+IChzdHJpbmcpei5BdHRyaWJ1dGUoVy50eXBlKSA9PSBoZi5UeXBlKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRFbXB0eUhlYWRlck9yRm9vdGVyKGRvYy5NYWluRG9jdW1lbnRQYXJ0LCBzZWN0LCBoZi5SZWYsIGhmLlR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZSA9IHNlY3QuRWxlbWVudHMoaGYuUmVmKS5GaXJzdE9yRGVmYXVsdCh6ID0+IChzdHJpbmcpei5BdHRyaWJ1dGUoVy50eXBlKSA9PSBoZi5UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICBoZi5DYWNoZWRQYXJ0UmlkID0gKHN0cmluZylyZWZlcmVuY2UuQXR0cmlidXRlKFIuaWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpcnN0U2VjdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29weU9yQ2FjaGVIZWFkZXJPckZvb3Rlcihkb2MsIGNhY2hlZEhlYWRlckZvb3Rlciwgc2VjdCwgVy5oZWFkZXJSZWZlcmVuY2UsICJmaXJzdCIpOworICAgICAgICAgICAgICAgICAgICBDb3B5T3JDYWNoZUhlYWRlck9yRm9vdGVyKGRvYywgY2FjaGVkSGVhZGVyRm9vdGVyLCBzZWN0LCBXLmhlYWRlclJlZmVyZW5jZSwgImV2ZW4iKTsKKyAgICAgICAgICAgICAgICAgICAgQ29weU9yQ2FjaGVIZWFkZXJPckZvb3Rlcihkb2MsIGNhY2hlZEhlYWRlckZvb3Rlciwgc2VjdCwgVy5oZWFkZXJSZWZlcmVuY2UsICJkZWZhdWx0Iik7CisgICAgICAgICAgICAgICAgICAgIENvcHlPckNhY2hlSGVhZGVyT3JGb290ZXIoZG9jLCBjYWNoZWRIZWFkZXJGb290ZXIsIHNlY3QsIFcuZm9vdGVyUmVmZXJlbmNlLCAiZmlyc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29weU9yQ2FjaGVIZWFkZXJPckZvb3Rlcihkb2MsIGNhY2hlZEhlYWRlckZvb3Rlciwgc2VjdCwgVy5mb290ZXJSZWZlcmVuY2UsICJldmVuIik7CisgICAgICAgICAgICAgICAgICAgIENvcHlPckNhY2hlSGVhZGVyT3JGb290ZXIoZG9jLCBjYWNoZWRIZWFkZXJGb290ZXIsIHNlY3QsIFcuZm9vdGVyUmVmZXJlbmNlLCAiZGVmYXVsdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRvYy5NYWluRG9jdW1lbnRQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb3B5T3JDYWNoZUhlYWRlck9yRm9vdGVyKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jLCBDYWNoZWRIZWFkZXJGb290ZXJbXSBjYWNoZWRIZWFkZXJGb290ZXIsIFhFbGVtZW50IHNlY3QsIFhOYW1lIHJlZmVyZW5jZVhOYW1lLCBzdHJpbmcgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlZmVyZW5jZUVsZW1lbnQgPSBGaW5kUmVmZXJlbmNlKHNlY3QsIHJlZmVyZW5jZVhOYW1lLCB0eXBlKTsKKyAgICAgICAgICAgIGlmIChyZWZlcmVuY2VFbGVtZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNhY2hlZFBhcnRSaWQgPSBjYWNoZWRIZWFkZXJGb290ZXIuRmlyc3RPckRlZmF1bHQoeiA9PiB6LlJlZiA9PSByZWZlcmVuY2VYTmFtZSAmJiB6LlR5cGUgPT0gdHlwZSkuQ2FjaGVkUGFydFJpZDsKKyAgICAgICAgICAgICAgICBBZGRSZWZlcmVuY2VUb0V4aXN0aW5nSGVhZGVyT3JGb290ZXIoZG9jLk1haW5Eb2N1bWVudFBhcnQsIHNlY3QsIGNhY2hlZFBhcnRSaWQsIHJlZmVyZW5jZVhOYW1lLCB0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY2FjaGVkUGFydCA9IGNhY2hlZEhlYWRlckZvb3Rlci5GaXJzdE9yRGVmYXVsdCh6ID0+IHouUmVmID09IHJlZmVyZW5jZVhOYW1lICYmIHouVHlwZSA9PSB0eXBlKTsKKyAgICAgICAgICAgICAgICBjYWNoZWRQYXJ0LkNhY2hlZFBhcnRSaWQgPSAoc3RyaW5nKXJlZmVyZW5jZUVsZW1lbnQuQXR0cmlidXRlKFIuaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgRmluZFJlZmVyZW5jZShYRWxlbWVudCBzZWN0LCBYTmFtZSByZWZlcmVuY2UsIHN0cmluZyB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2VjdC5FbGVtZW50cyhyZWZlcmVuY2UpLkZpcnN0T3JEZWZhdWx0KHogPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc3RyaW5nKXouQXR0cmlidXRlKFcudHlwZSkgPT0gdHlwZTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkUmVmZXJlbmNlVG9FeGlzdGluZ0hlYWRlck9yRm9vdGVyKE1haW5Eb2N1bWVudFBhcnQgbWFpbkRvY1BhcnQsIFhFbGVtZW50IHNlY3QsIHN0cmluZyBySWQsIFhOYW1lIHJlZmVyZW5jZSwgc3RyaW5nIHRvVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJlZmVyZW5jZSA9PSBXLmhlYWRlclJlZmVyZW5jZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmVmZXJlbmNlVG9BZGQgPSBuZXcgWEVsZW1lbnQoVy5oZWFkZXJSZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcudHlwZSwgdG9UeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoUi5pZCwgcklkKSk7CisgICAgICAgICAgICAgICAgc2VjdC5BZGRGaXJzdChyZWZlcmVuY2VUb0FkZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZVRvQWRkID0gbmV3IFhFbGVtZW50KFcuZm9vdGVyUmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnR5cGUsIHRvVHlwZSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFIuaWQsIHJJZCkpOworICAgICAgICAgICAgICAgIHNlY3QuQWRkRmlyc3QocmVmZXJlbmNlVG9BZGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBJbml0RW1wdHlIZWFkZXJPckZvb3RlcihNYWluRG9jdW1lbnRQYXJ0IG1haW5Eb2NQYXJ0LCBYRWxlbWVudCBzZWN0LCBYTmFtZSByZWZlcmVuY2VYTmFtZSwgc3RyaW5nIHRvVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IHhEb2MgPSBudWxsOworICAgICAgICAgICAgaWYgKHJlZmVyZW5jZVhOYW1lID09IFcuaGVhZGVyUmVmZXJlbmNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhEb2MgPSBYRG9jdW1lbnQuUGFyc2UoCisgICAgICAgICAgICAgICAgICAgIEAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnIHN0YW5kYWxvbmU9J3llcyc/PgorICAgICAgICAgICAgICAgICAgICA8dzpoZHIgeG1sbnM6d3BjPSdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMTAvd29yZHByb2Nlc3NpbmdDYW52YXMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxuczptYz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL21hcmt1cC1jb21wYXRpYmlsaXR5LzIwMDYnCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxuczpvPSd1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UnCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxuczpyPSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6bT0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvbWF0aCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOnY9J3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sJworICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6d3AxND0naHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDEwL3dvcmRwcm9jZXNzaW5nRHJhd2luZycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOndwPSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvd29yZHByb2Nlc3NpbmdEcmF3aW5nJworICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6dzEwPSd1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkJworICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6dz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluJworICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6dzE0PSdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMTAvd29yZG1sJworICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6dzE1PSdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMTIvd29yZG1sJworICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6d3BnPSdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMTAvd29yZHByb2Nlc3NpbmdHcm91cCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOndwaT0naHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDEwL3dvcmRwcm9jZXNzaW5nSW5rJworICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6d25lPSdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMDYvd29yZG1sJworICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6d3BzPSdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMTAvd29yZHByb2Nlc3NpbmdTaGFwZScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jOklnbm9yYWJsZT0ndzE0IHcxNSB3cDE0Jz4KKyAgICAgICAgICAgICAgICAgICAgICA8dzpwPgorICAgICAgICAgICAgICAgICAgICAgICAgPHc6cFByPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dzpwU3R5bGUgdzp2YWw9J0hlYWRlcicgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdzpwUHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dzpyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dzp0Pjwvdzp0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC93OnI+CisgICAgICAgICAgICAgICAgICAgICAgPC93OnA+CisgICAgICAgICAgICAgICAgICAgIDwvdzpoZHI+Iik7CisgICAgICAgICAgICAgICAgdmFyIG5ld0hlYWRlclBhcnQgPSBtYWluRG9jUGFydC5BZGROZXdQYXJ0PEhlYWRlclBhcnQ+KCk7CisgICAgICAgICAgICAgICAgbmV3SGVhZGVyUGFydC5QdXRYRG9jdW1lbnQoeERvYyk7CisgICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZVRvQWRkID0gbmV3IFhFbGVtZW50KFcuaGVhZGVyUmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnR5cGUsIHRvVHlwZSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFIuaWQsIG1haW5Eb2NQYXJ0LkdldElkT2ZQYXJ0KG5ld0hlYWRlclBhcnQpKSk7CisgICAgICAgICAgICAgICAgc2VjdC5BZGRGaXJzdChyZWZlcmVuY2VUb0FkZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeERvYyA9IFhEb2N1bWVudC5QYXJzZShAIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04JyBzdGFuZGFsb25lPSd5ZXMnPz4KKyAgICAgICAgICAgICAgICAgICAgPHc6ZnRyIHhtbG5zOndwYz0naHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDEwL3dvcmRwcm9jZXNzaW5nQ2FudmFzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6bWM9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9tYXJrdXAtY29tcGF0aWJpbGl0eS8yMDA2JworICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6bz0ndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlJworICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6cj0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOm09J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L21hdGgnCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxuczp2PSd1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOndwMTQ9J2h0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3dvcmQvMjAxMC93b3JkcHJvY2Vzc2luZ0RyYXdpbmcnCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxuczp3cD0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L3dvcmRwcm9jZXNzaW5nRHJhd2luZycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOncxMD0ndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOncxND0naHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDEwL3dvcmRtbCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOncxNT0naHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDEyL3dvcmRtbCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOndwZz0naHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDEwL3dvcmRwcm9jZXNzaW5nR3JvdXAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxuczp3cGk9J2h0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3dvcmQvMjAxMC93b3JkcHJvY2Vzc2luZ0luaycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOnduZT0naHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDA2L3dvcmRtbCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOndwcz0naHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDEwL3dvcmRwcm9jZXNzaW5nU2hhcGUnCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYzpJZ25vcmFibGU9J3cxNCB3MTUgd3AxNCc+CisgICAgICAgICAgICAgICAgICAgICAgPHc6cD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx3OnBQcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHc6cFN0eWxlIHc6dmFsPSdGb290ZXInIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3c6cFByPgorICAgICAgICAgICAgICAgICAgICAgICAgPHc6cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHc6dD48L3c6dD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdzpyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdzpwPgorICAgICAgICAgICAgICAgICAgICA8L3c6ZnRyPiIpOworICAgICAgICAgICAgICAgIHZhciBuZXdGb290ZXJQYXJ0ID0gbWFpbkRvY1BhcnQuQWRkTmV3UGFydDxGb290ZXJQYXJ0PigpOworICAgICAgICAgICAgICAgIG5ld0Zvb3RlclBhcnQuUHV0WERvY3VtZW50KHhEb2MpOworICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VUb0FkZCA9IG5ldyBYRWxlbWVudChXLmZvb3RlclJlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy50eXBlLCB0b1R5cGUpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShSLmlkLCBtYWluRG9jUGFydC5HZXRJZE9mUGFydChuZXdGb290ZXJQYXJ0KSkpOworICAgICAgICAgICAgICAgIHNlY3QuQWRkRmlyc3QocmVmZXJlbmNlVG9BZGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBUZXN0UGFydEZvclVuc3VwcG9ydGVkQ29udGVudChPcGVuWG1sUGFydCBwYXJ0LCBpbnQgc291cmNlTnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBYTmFtZXNwYWNlW10gb2Jzb2xldGVOYW1lc3BhY2VzID0gbmV3W10KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhOYW1lc3BhY2UuR2V0KCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMDcvNS8zMC93b3JkbWwiKSwKKyAgICAgICAgICAgICAgICAgICAgWE5hbWVzcGFjZS5HZXQoImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3dvcmQvMjAwOC85LzE2L3dvcmRwcm9jZXNzaW5nRHJhd2luZyIpLAorICAgICAgICAgICAgICAgICAgICBYTmFtZXNwYWNlLkdldCgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDA5LzIvd29yZG1sIiksCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIFhEb2N1bWVudCB4RG9jID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGludmFsaWRFbGVtZW50ID0geERvYy5EZXNjZW5kYW50cygpCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGQgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiID0gZC5OYW1lID09IFcuc3ViRG9jIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5OYW1lID09IFcuY29udHJvbCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuTmFtZSA9PSBXLmFsdENodW5rIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5OYW1lLkxvY2FsTmFtZSA9PSAiY29udGVudFBhcnQiIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Jzb2xldGVOYW1lc3BhY2VzLkNvbnRhaW5zKGQuTmFtZS5OYW1lc3BhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiMiA9IGIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLkF0dHJpYnV0ZXMoKS5BbnkoYSA9PiBvYnNvbGV0ZU5hbWVzcGFjZXMuQ29udGFpbnMoYS5OYW1lLk5hbWVzcGFjZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIyOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChpbnZhbGlkRWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpbnZhbGlkRWxlbWVudC5OYW1lID09IFcuc3ViRG9jKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRCdWlsZGVyRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIlNvdXJjZSB7MH0gaXMgdW5zdXBwb3J0ZWQgZG9jdW1lbnQgLSBjb250YWlucyBzdWIgZG9jdW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTnVtYmVyKSk7CisgICAgICAgICAgICAgICAgaWYgKGludmFsaWRFbGVtZW50Lk5hbWUgPT0gVy5jb250cm9sKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRCdWlsZGVyRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIlNvdXJjZSB7MH0gaXMgdW5zdXBwb3J0ZWQgZG9jdW1lbnQgLSBjb250YWlucyBBY3RpdmVYIGNvbnRyb2xzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU51bWJlcikpOworICAgICAgICAgICAgICAgIGlmIChpbnZhbGlkRWxlbWVudC5OYW1lID09IFcuYWx0Q2h1bmspCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudEJ1aWxkZXJFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiU291cmNlIHswfSBpcyB1bnN1cHBvcnRlZCBkb2N1bWVudCAtIGNvbnRhaW5zIGFsdENodW5rIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU51bWJlcikpOworICAgICAgICAgICAgICAgIGlmIChpbnZhbGlkRWxlbWVudC5OYW1lLkxvY2FsTmFtZSA9PSAiY29udGVudFBhcnQiKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRCdWlsZGVyRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIlNvdXJjZSB7MH0gaXMgdW5zdXBwb3J0ZWQgZG9jdW1lbnQgLSBjb250YWlucyBjb250ZW50UGFydCBjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU51bWJlcikpOworICAgICAgICAgICAgICAgIGlmIChvYnNvbGV0ZU5hbWVzcGFjZXMuQ29udGFpbnMoaW52YWxpZEVsZW1lbnQuTmFtZS5OYW1lc3BhY2UpIHx8CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRFbGVtZW50LkF0dHJpYnV0ZXMoKS5BbnkoYSA9PiBvYnNvbGV0ZU5hbWVzcGFjZXMuQ29udGFpbnMoYS5OYW1lLk5hbWVzcGFjZSkpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRCdWlsZGVyRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIlNvdXJjZSB7MH0gaXMgdW5zdXBwb3J0ZWQgZG9jdW1lbnQgLSBjb250YWlucyBvYnNvbGV0ZSBuYW1lc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTnVtYmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL1doYXQgZG9lcyBub3Qgd29yazoKKyAgICAgICAgLy8tIHN1YiBkb2NzCisgICAgICAgIC8vLSBiaWRpIHRleHQgYXBwZWFycyB0byB3b3JrIGJ1dCBoYXMgbm90IGJlZW4gdGVzdGVkCisgICAgICAgIC8vLSBsYW5ndWFnZXMgb3RoZXIgdGhhbiBlbi11cyBhcHBlYXIgdG8gd29yayBidXQgaGF2ZSBub3QgYmVlbiB0ZXN0ZWQKKyAgICAgICAgLy8tIGRvY3VtZW50cyB3aXRoIGFjdGl2ZXggY29udHJvbHMKKyAgICAgICAgLy8tIG1haWwgbWVyZ2Ugc291cmNlIGRvY3VtZW50cyAobG9vayBmb3IgZGF0YVNvdXJjZSBpbiBzZXR0aW5ncykKKyAgICAgICAgLy8tIGRvY3VtZW50cyB3aXRoIGluaworICAgICAgICAvLy0gZG9jdW1lbnRzIHdpdGggZnJhbWUgc2V0cyBhbmQgZnJhbWVzCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVGVzdEZvclVuc3VwcG9ydGVkRG9jdW1lbnQoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MsIGludCBzb3VyY2VOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoc3RyaW5nKWRvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QuTmFtZS5OYW1lc3BhY2VOYW1lID09ICJodHRwOi8vcHVybC5vY2xjLm9yZy9vb3htbC93b3JkcHJvY2Vzc2luZ21sL21haW4iKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudEJ1aWxkZXJFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiU291cmNlIHswfSBpcyBzYXZlZCBpbiBzdHJpY3QgbW9kZSwgbm90IHN1cHBvcnRlZCIsIHNvdXJjZU51bWJlcikpOworCisgICAgICAgICAgICAvLyBub3RlOiBpZiBldmVyIHdhbnQgdG8gc3VwcG9ydCBzZWN0aW9uIGNoYW5nZXMsIG5lZWQgdG8gYWRkcmVzcyB0aGUgY29kZSB0aGF0IHJhdGlvbmFsaXplcyBoZWFkZXJzIGFuZCBmb290ZXJzLCBwcm9wYWdhdGluZyB0byBzZWN0aW9ucyB0aGF0IGluaGVyaXQgaGVhZGVycy9mb290ZXJzIGZyb20gcHJldiBzZWN0aW9uCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZCBpbiBkb2MuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKS5EZXNjZW5kYW50cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkLk5hbWUgPT0gVy5zZWN0UHJDaGFuZ2UpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudEJ1aWxkZXJFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiU291cmNlIHswfSBjb250YWlucyBzZWN0aW9uIGNoYW5nZXMgKHc6c2VjdFByQ2hhbmdlKSwgbm90IHN1cHBvcnRlZCIsIHNvdXJjZU51bWJlcikpOworCisgICAgICAgICAgICAgICAgLy8gbm90ZTogaWYgZXZlciB3YW50IHRvIHN1cHBvcnQgT3Blbi1YbWwtUG93ZXJUb29scyBhdHRyaWJ1dGVzLCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBhdHRyaWJ1dGVzIGFyZSBwcm9wYWdhdGVkIGluIGFsbCBjYXNlcworICAgICAgICAgICAgICAgIC8vaWYgKGQuTmFtZS5OYW1lc3BhY2UgPT0gUHRPcGVuWG1sLnB0T3BlblhtbCB8fAorICAgICAgICAgICAgICAgIC8vICAgIGQuTmFtZS5OYW1lc3BhY2UgPT0gUHRPcGVuWG1sLnB0KQorICAgICAgICAgICAgICAgIC8vICAgIHRocm93IG5ldyBEb2N1bWVudEJ1aWxkZXJFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiU291cmNlIHswfSBjb250YWlucyBPcGVuLVhtbC1Qb3dlclRvb2xzIG1hcmt1cCwgbm90IHN1cHBvcnRlZCIsIHNvdXJjZU51bWJlcikpOworICAgICAgICAgICAgICAgIC8vaWYgKGQuQXR0cmlidXRlcygpLkFueShhID0+IGEuTmFtZS5OYW1lc3BhY2UgPT0gUHRPcGVuWG1sLnB0T3BlblhtbCB8fCBhLk5hbWUuTmFtZXNwYWNlID09IFB0T3BlblhtbC5wdCkpCisgICAgICAgICAgICAgICAgLy8gICAgdGhyb3cgbmV3IERvY3VtZW50QnVpbGRlckV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJTb3VyY2UgezB9IGNvbnRhaW5zIE9wZW4tWG1sLVBvd2VyVG9vbHMgbWFya3VwLCBub3Qgc3VwcG9ydGVkIiwgc291cmNlTnVtYmVyKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRlc3RQYXJ0Rm9yVW5zdXBwb3J0ZWRDb250ZW50KGRvYy5NYWluRG9jdW1lbnRQYXJ0LCBzb3VyY2VOdW1iZXIpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGhkciBpbiBkb2MuTWFpbkRvY3VtZW50UGFydC5IZWFkZXJQYXJ0cykKKyAgICAgICAgICAgICAgICBUZXN0UGFydEZvclVuc3VwcG9ydGVkQ29udGVudChoZHIsIHNvdXJjZU51bWJlcik7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZnRyIGluIGRvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3RlclBhcnRzKQorICAgICAgICAgICAgICAgIFRlc3RQYXJ0Rm9yVW5zdXBwb3J0ZWRDb250ZW50KGZ0ciwgc291cmNlTnVtYmVyKTsKKyAgICAgICAgICAgIGlmIChkb2MuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgVGVzdFBhcnRGb3JVbnN1cHBvcnRlZENvbnRlbnQoZG9jLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydCwgc291cmNlTnVtYmVyKTsKKyAgICAgICAgICAgIGlmIChkb2MuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBUZXN0UGFydEZvclVuc3VwcG9ydGVkQ29udGVudChkb2MuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQsIHNvdXJjZU51bWJlcik7CisKKyAgICAgICAgICAgIGlmIChkb2MuTWFpbkRvY3VtZW50UGFydC5Eb2N1bWVudFNldHRpbmdzUGFydCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgZG9jLk1haW5Eb2N1bWVudFBhcnQuRG9jdW1lbnRTZXR0aW5nc1BhcnQuR2V0WERvY3VtZW50KCkuRGVzY2VuZGFudHMoKS5BbnkoZCA9PiBkLk5hbWUgPT0gVy5zcmMgfHwKKyAgICAgICAgICAgICAgICBkLk5hbWUgPT0gVy5yZWNpcGllbnREYXRhIHx8IGQuTmFtZSA9PSBXLm1haWxNZXJnZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50QnVpbGRlckV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJTb3VyY2UgezB9IGlzIHVuc3VwcG9ydGVkIGRvY3VtZW50IC0gY29udGFpbnMgTWFpbCBNZXJnZSBjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgc291cmNlTnVtYmVyKSk7CisgICAgICAgICAgICBpZiAoZG9jLk1haW5Eb2N1bWVudFBhcnQuV2ViU2V0dGluZ3NQYXJ0ICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICBkb2MuTWFpbkRvY3VtZW50UGFydC5XZWJTZXR0aW5nc1BhcnQuR2V0WERvY3VtZW50KCkuRGVzY2VuZGFudHMoKS5BbnkoZCA9PiBkLk5hbWUgPT0gVy5mcmFtZXNldCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50QnVpbGRlckV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJTb3VyY2UgezB9IGlzIHVuc3VwcG9ydGVkIGRvY3VtZW50IC0gY29udGFpbnMgYSBmcmFtZXNldCIsIHNvdXJjZU51bWJlcikpOworICAgICAgICAgICAgdmFyIG51bWJlcmluZ0VsZW1lbnRzID0gZG9jLk1haW5Eb2N1bWVudFBhcnQKKyAgICAgICAgICAgICAgICAuR2V0WERvY3VtZW50KCkKKyAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoVy5udW1QcikKKyAgICAgICAgICAgICAgICAuV2hlcmUobiA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHplcm9JZCA9IChpbnQ/KW4uQXR0cmlidXRlKFcuaWQpID09IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc0NoaWxkSW5zSWQgPSBuLkVsZW1lbnRzKFcuaW5zKS5BbnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ZXJvSWQgfHwgaGFzQ2hpbGRJbnNJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICBpZiAobnVtYmVyaW5nRWxlbWVudHMuQW55KCkgJiYKKyAgICAgICAgICAgICAgICBkb2MuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRCdWlsZGVyRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJTb3VyY2UgezB9IGlzIGludmFsaWQgZG9jdW1lbnQgLSBjb250YWlucyBudW1iZXJpbmcgbWFya3VwIGJ1dCBubyBudW1iZXJpbmcgcGFydCIsIHNvdXJjZU51bWJlcikpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBGaXhVcFNlY3Rpb25Qcm9wZXJ0aWVzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgbmV3RG9jdW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCBtYWluRG9jdW1lbnRYRG9jID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIG1haW5Eb2N1bWVudFhEb2MuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgbWFpbkRvY3VtZW50WERvYy5EZWNsYXJhdGlvbi5FbmNvZGluZyA9ICJVVEYtOCI7CisgICAgICAgICAgICBYRWxlbWVudCBib2R5ID0gbWFpbkRvY3VtZW50WERvYy5Sb290LkVsZW1lbnQoVy5ib2R5KTsKKyAgICAgICAgICAgIHZhciBzZWN0aW9uUHJvcGVydGllc1RvTW92ZSA9IGJvZHkKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgIC5UYWtlKGJvZHkuRWxlbWVudHMoKS5Db3VudCgpIC0gMSkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgPT0gVy5zZWN0UHIpCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHMgaW4gc2VjdGlvblByb3BlcnRpZXNUb01vdmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHAgPSBzLlNpYmxpbmdzQmVmb3JlU2VsZlJldmVyc2VEb2N1bWVudE9yZGVyKCkuRmlyc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAocC5FbGVtZW50KFcucFByKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBwLkFkZEZpcnN0KG5ldyBYRWxlbWVudChXLnBQcikpOworICAgICAgICAgICAgICAgIHAuRWxlbWVudChXLnBQcikuQWRkKHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIHMgaW4gc2VjdGlvblByb3BlcnRpZXNUb01vdmUpCisgICAgICAgICAgICAgICAgcy5SZW1vdmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkU2VjdGlvbkFuZERlcGVuZGVuY2llcyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHNvdXJjZURvY3VtZW50LCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IG5ld0RvY3VtZW50LAorICAgICAgICAgICAgWEVsZW1lbnQgc2VjdGlvbk1hcmt1cCwgTGlzdDxJbWFnZURhdGE+IGltYWdlcykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGhlYWRlclJlZmVyZW5jZXMgPSBzZWN0aW9uTWFya3VwLkVsZW1lbnRzKFcuaGVhZGVyUmVmZXJlbmNlKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBoZWFkZXJSZWZlcmVuY2UgaW4gaGVhZGVyUmVmZXJlbmNlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgb2xkUmlkID0gaGVhZGVyUmVmZXJlbmNlLkF0dHJpYnV0ZShSLmlkKS5WYWx1ZTsKKyAgICAgICAgICAgICAgICBIZWFkZXJQYXJ0IG9sZEhlYWRlclBhcnQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkSGVhZGVyUGFydCA9IChIZWFkZXJQYXJ0KXNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuR2V0UGFydEJ5SWQob2xkUmlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gc3RyaW5nLkZvcm1hdCgiQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uLCBhdHRlbXB0aW5nIHRvIGdldCBoZWFkZXIgcklkPXswfSIsIG9sZFJpZCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgWERvY3VtZW50IG9sZEhlYWRlclhEb2MgPSBvbGRIZWFkZXJQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIGlmIChvbGRIZWFkZXJYRG9jICE9IG51bGwgJiYgb2xkSGVhZGVyWERvYy5Sb290ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIENvcHlOdW1iZXJpbmcoc291cmNlRG9jdW1lbnQsIG5ld0RvY3VtZW50LCBuZXdbXSB7IG9sZEhlYWRlclhEb2MuUm9vdCB9LCBpbWFnZXMpOworICAgICAgICAgICAgICAgIEhlYWRlclBhcnQgbmV3SGVhZGVyUGFydCA9IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuQWRkTmV3UGFydDxIZWFkZXJQYXJ0PigpOworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBuZXdIZWFkZXJYRG9jID0gbmV3SGVhZGVyUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBuZXdIZWFkZXJYRG9jLkRlY2xhcmF0aW9uLlN0YW5kYWxvbmUgPSAieWVzIjsKKyAgICAgICAgICAgICAgICBuZXdIZWFkZXJYRG9jLkRlY2xhcmF0aW9uLkVuY29kaW5nID0gIlVURi04IjsKKyAgICAgICAgICAgICAgICBuZXdIZWFkZXJYRG9jLkFkZChvbGRIZWFkZXJYRG9jLlJvb3QpOworICAgICAgICAgICAgICAgIGhlYWRlclJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5pZCkuVmFsdWUgPSBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkdldElkT2ZQYXJ0KG5ld0hlYWRlclBhcnQpOworICAgICAgICAgICAgICAgIEFkZFJlbGF0aW9uc2hpcHMob2xkSGVhZGVyUGFydCwgbmV3SGVhZGVyUGFydCwgbmV3W10geyBuZXdIZWFkZXJYRG9jLlJvb3QgfSk7CisgICAgICAgICAgICAgICAgQ29weVJlbGF0ZWRQYXJ0c0ZvckNvbnRlbnRQYXJ0cyhvbGRIZWFkZXJQYXJ0LCBuZXdIZWFkZXJQYXJ0LCBuZXdbXSB7IG5ld0hlYWRlclhEb2MuUm9vdCB9LCBpbWFnZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZm9vdGVyUmVmZXJlbmNlcyA9IHNlY3Rpb25NYXJrdXAuRWxlbWVudHMoVy5mb290ZXJSZWZlcmVuY2UpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZvb3RlclJlZmVyZW5jZSBpbiBmb290ZXJSZWZlcmVuY2VzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBvbGRSaWQgPSBmb290ZXJSZWZlcmVuY2UuQXR0cmlidXRlKFIuaWQpLlZhbHVlOworICAgICAgICAgICAgICAgIEZvb3RlclBhcnQgb2xkRm9vdGVyUGFydCA9IChGb290ZXJQYXJ0KXNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuR2V0UGFydEJ5SWQob2xkUmlkKTsKKyAgICAgICAgICAgICAgICBYRG9jdW1lbnQgb2xkRm9vdGVyWERvYyA9IG9sZEZvb3RlclBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKG9sZEZvb3RlclhEb2MgIT0gbnVsbCAmJiBvbGRGb290ZXJYRG9jLlJvb3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgQ29weU51bWJlcmluZyhzb3VyY2VEb2N1bWVudCwgbmV3RG9jdW1lbnQsIG5ld1tdIHsgb2xkRm9vdGVyWERvYy5Sb290IH0sIGltYWdlcyk7CisgICAgICAgICAgICAgICAgRm9vdGVyUGFydCBuZXdGb290ZXJQYXJ0ID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5BZGROZXdQYXJ0PEZvb3RlclBhcnQ+KCk7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IG5ld0Zvb3RlclhEb2MgPSBuZXdGb290ZXJQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIG5ld0Zvb3RlclhEb2MuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgIG5ld0Zvb3RlclhEb2MuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgIG5ld0Zvb3RlclhEb2MuQWRkKG9sZEZvb3RlclhEb2MuUm9vdCk7CisgICAgICAgICAgICAgICAgZm9vdGVyUmVmZXJlbmNlLkF0dHJpYnV0ZShSLmlkKS5WYWx1ZSA9IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuR2V0SWRPZlBhcnQobmV3Rm9vdGVyUGFydCk7CisgICAgICAgICAgICAgICAgQWRkUmVsYXRpb25zaGlwcyhvbGRGb290ZXJQYXJ0LCBuZXdGb290ZXJQYXJ0LCBuZXdbXSB7IG5ld0Zvb3RlclhEb2MuUm9vdCB9KTsKKyAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKG9sZEZvb3RlclBhcnQsIG5ld0Zvb3RlclBhcnQsIG5ld1tdIHsgbmV3Rm9vdGVyWERvYy5Sb290IH0sIGltYWdlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIE1lcmdlU3R5bGVzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgbmV3RG9jdW1lbnQsIFhEb2N1bWVudCBmcm9tU3R5bGVzLCBYRG9jdW1lbnQgdG9TdHlsZXMsIElFbnVtZXJhYmxlPFhFbGVtZW50PiBuZXdDb250ZW50KQorICAgICAgICB7CisjaWYgTWVyZ2VTdHlsZXNXaXRoU2FtZU5hbWVzCisgICAgICAgICAgICB2YXIgbmV3SWRzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CisjZW5kaWYKKworICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgc3R5bGUgaW4gZnJvbVN0eWxlcy5Sb290LkVsZW1lbnRzKFcuc3R5bGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmcm9tSWQgPSAoc3RyaW5nKXN0eWxlLkF0dHJpYnV0ZShXLnN0eWxlSWQpOworICAgICAgICAgICAgICAgIHZhciBmcm9tTmFtZSA9IChzdHJpbmcpc3R5bGUuRWxlbWVudHMoVy5uYW1lKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgdmFyIHRvU3R5bGUgPSB0b1N0eWxlcworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KHN0ID0+IChzdHJpbmcpc3QuRWxlbWVudHMoVy5uYW1lKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpID09IGZyb21OYW1lKTsKKworICAgICAgICAgICAgICAgIGlmICh0b1N0eWxlID09IG51bGwpCisgICAgICAgICAgICAgICAgeworI2lmIE1lcmdlU3R5bGVzV2l0aFNhbWVOYW1lcworICAgICAgICAgICAgICAgICAgICB2YXIgbGlua0VsZW1lbnQgPSBzdHlsZS5FbGVtZW50KFcubGluayk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaW5rZWRJZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmtFbGVtZW50ICE9IG51bGwgJiYgbmV3SWRzLlRyeUdldFZhbHVlKGxpbmtFbGVtZW50LkF0dHJpYnV0ZShXLnZhbCkuVmFsdWUsIG91dCBsaW5rZWRJZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaW5rZWRTdHlsZSA9IHRvU3R5bGVzLlJvb3QuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3QobyA9PiBvLkF0dHJpYnV0ZShXLnN0eWxlSWQpLlZhbHVlID09IGxpbmtlZElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5rZWRTdHlsZS5FbGVtZW50KFcubGluaykgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJZHMuQWRkKGZyb21JZCwgbGlua2VkU3R5bGUuRWxlbWVudChXLmxpbmspLkF0dHJpYnV0ZShXLnZhbCkuVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL3N0cmluZyBuYW1lID0gKHN0cmluZylzdHlsZS5FbGVtZW50cyhXLm5hbWUpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIC8vdmFyIG5hbWVkU3R5bGUgPSB0b1N0eWxlcworICAgICAgICAgICAgICAgICAgICAvLyAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAvLyAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgLldoZXJlKHN0ID0+IHN0LkVsZW1lbnQoVy5uYW1lKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAvLyAgICAuRmlyc3RPckRlZmF1bHQobyA9PiAoc3RyaW5nKW8uRWxlbWVudChXLm5hbWUpLkF0dHJpYnV0ZShXLnZhbCkgPT0gbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIC8vaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgICAgIC8vICAgIGlmICghIG5ld0lkcy5Db250YWluc0tleShmcm9tSWQpKQorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgbmV3SWRzLkFkZChmcm9tSWQsIG5hbWVkU3R5bGUuQXR0cmlidXRlKFcuc3R5bGVJZCkuVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAvLyAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgLy99CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFic3RyYWN0TnVtYmVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgWERvY3VtZW50IG9sZE51bWJlcmluZyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIFhEb2N1bWVudCBuZXdOdW1iZXJpbmcgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBudW1SZWZlcmVuY2UgaW4gc3R5bGUuRGVzY2VuZGFudHMoVy5udW1QcikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGlkRWxlbWVudCA9IG51bVJlZmVyZW5jZS5EZXNjZW5kYW50cyhXLm51bUlkKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkRWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGROdW1iZXJpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0Lk51bWJlcmluZ0RlZmluaXRpb25zUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTnVtYmVyaW5nID0gc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTnVtYmVyaW5nID0gbmV3IFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTnVtYmVyaW5nLkRlY2xhcmF0aW9uID0gbmV3IFhEZWNsYXJhdGlvbigiMS4wIiwgIlVURi04IiwgInllcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTnVtYmVyaW5nLkFkZChuZXcgWEVsZW1lbnQoVy5udW1iZXJpbmcsIE5hbWVzcGFjZUF0dHJpYnV0ZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3TnVtYmVyaW5nID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TnVtYmVyaW5nID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOdW1iZXJpbmcuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TnVtYmVyaW5nLkRlY2xhcmF0aW9uLkVuY29kaW5nID0gIlVURi04IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBudW1JZHMgPSBuZXdOdW1iZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLm51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGYgPT4gKGludClmLkF0dHJpYnV0ZShXLm51bUlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtSWRzLkFueSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciA9IG51bUlkcy5NYXgoKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1JZHMgPSBuZXdOdW1iZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmFic3RyYWN0TnVtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZiA9PiAoaW50KWYuQXR0cmlidXRlKFcuYWJzdHJhY3ROdW1JZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bUlkcy5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnN0cmFjdE51bWJlciA9IG51bUlkcy5NYXgoKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkFkZE5ld1BhcnQ8TnVtYmVyaW5nRGVmaW5pdGlvbnNQYXJ0PigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TnVtYmVyaW5nID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOdW1iZXJpbmcuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TnVtYmVyaW5nLkRlY2xhcmF0aW9uLkVuY29kaW5nID0gIlVURi04IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld051bWJlcmluZy5BZGQobmV3IFhFbGVtZW50KFcubnVtYmVyaW5nLCBOYW1lc3BhY2VBdHRyaWJ1dGVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG51bUlkID0gaWRFbGVtZW50LkF0dHJpYnV0ZShXLnZhbCkuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bUlkICE9ICIwIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBvbGROdW1iZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5udW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUocCA9PiAoKHN0cmluZylwLkF0dHJpYnV0ZShXLm51bUlkKSkgPT0gbnVtSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IGFic3RyYWN0IG51bWJlcmluZyBlbGVtZW50LCBpZiBuZWNlc3NhcnkgKHVzZSBtYXRjaGluZyBOU0lEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYWJzdHJhY3ROdW1JZCA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3ROdW1JZCA9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmFic3RyYWN0TnVtSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZShXLnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5WYWx1ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgYWJzdHJhY3RFbGVtZW50ID0gb2xkTnVtYmVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5hYnN0cmFjdE51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUocCA9PiAoKHN0cmluZylwLkF0dHJpYnV0ZShXLmFic3RyYWN0TnVtSWQpKSA9PSBhYnN0cmFjdE51bUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFic3RyYWN0TlNJRCA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYnN0cmFjdEVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuc2lkRWxlbWVudCA9IGFic3RyYWN0RWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudChXLm5zaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic3RyYWN0TlNJRCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5zaWRFbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic3RyYWN0TlNJRCA9IChzdHJpbmcpbnNpZEVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGUoVy52YWwpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3QWJzdHJhY3RFbGVtZW50ID0gbmV3TnVtYmVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmFic3RyYWN0TnVtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLkFubm90YXRpb248RnJvbVByZXZpb3VzU291cmNlU2VtYXBob3JlPigpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShwID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aGlzTnNpZEVsZW1lbnQgPSBwLkVsZW1lbnQoVy5uc2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzTnNpZEVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHN0cmluZyl0aGlzTnNpZEVsZW1lbnQuQXR0cmlidXRlKFcudmFsKSA9PSBhYnN0cmFjdE5TSUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdBYnN0cmFjdEVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Fic3RyYWN0RWxlbWVudCA9IG5ldyBYRWxlbWVudChhYnN0cmFjdEVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBYnN0cmFjdEVsZW1lbnQuQXR0cmlidXRlKFcuYWJzdHJhY3ROdW1JZCkuVmFsdWUgPSBhYnN0cmFjdE51bWJlci5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnN0cmFjdE51bWJlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3TnVtYmVyaW5nLlJvb3QuRWxlbWVudHMoVy5hYnN0cmFjdE51bSkuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOdW1iZXJpbmcuUm9vdC5FbGVtZW50cyhXLmFic3RyYWN0TnVtKS5MYXN0KCkuQWRkQWZ0ZXJTZWxmKG5ld0Fic3RyYWN0RWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld051bWJlcmluZy5Sb290LkFkZChuZXdBYnN0cmFjdEVsZW1lbnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IHBpY3RJZCBpbiBuZXdBYnN0cmFjdEVsZW1lbnQuRGVzY2VuZGFudHMoVy5sdmxQaWNCdWxsZXRJZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBidWxsZXRJZCA9IChzdHJpbmcpcGljdElkLkF0dHJpYnV0ZShXLnZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBudW1QaWNCdWxsZXQgPSBvbGROdW1iZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoVy5udW1QaWNCdWxsZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGQgPT4gKHN0cmluZylkLkF0dHJpYnV0ZShXLm51bVBpY0J1bGxldElkKSA9PSBidWxsZXRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4TnVtUGljQnVsbGV0SWQgPSBuZXcgaW50W10geyAtMSB9LkNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOdW1iZXJpbmcuRGVzY2VuZGFudHMoVy5udW1QaWNCdWxsZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy5udW1QaWNCdWxsZXRJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGEgPT4gKGludClhKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuTWF4KCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3TnVtUGljQnVsbGV0ID0gbmV3IFhFbGVtZW50KG51bVBpY0J1bGxldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOdW1QaWNCdWxsZXQuQXR0cmlidXRlKFcubnVtUGljQnVsbGV0SWQpLlZhbHVlID0gbWF4TnVtUGljQnVsbGV0SWQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3RJZC5BdHRyaWJ1dGUoVy52YWwpLlZhbHVlID0gbWF4TnVtUGljQnVsbGV0SWQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld051bWJlcmluZy5Sb290LkFkZEZpcnN0KG5ld051bVBpY0J1bGxldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5ld0Fic3RyYWN0SWQgPSBuZXdBYnN0cmFjdEVsZW1lbnQuQXR0cmlidXRlKFcuYWJzdHJhY3ROdW1JZCkuVmFsdWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IG51bWJlcmluZyBlbGVtZW50LCBpZiBuZWNlc3NhcnkgKHVzZSBtYXRjaGluZyBlbGVtZW50IHdpdGggbm8gb3ZlcnJpZGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld0VsZW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5FbGVtZW50cyhXLmx2bE92ZXJyaWRlKS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudCA9IG5ld051bWJlcmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLm51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShwID0+ICFwLkVsZW1lbnRzKFcubHZsT3ZlcnJpZGUpLkFueSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJpbmcpcC5FbGVtZW50cyhXLmFic3RyYWN0TnVtSWQpLkZpcnN0KCkuQXR0cmlidXRlKFcudmFsKSkgPT0gbmV3QWJzdHJhY3RJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdFbGVtZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50ID0gbmV3IFhFbGVtZW50KGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5hYnN0cmFjdE51bUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGUoVy52YWwpLlZhbHVlID0gbmV3QWJzdHJhY3RJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5BdHRyaWJ1dGUoVy5udW1JZCkuVmFsdWUgPSBudW1iZXIuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld051bWJlcmluZy5Sb290LkFkZChuZXdFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRFbGVtZW50LkF0dHJpYnV0ZShXLnZhbCkuVmFsdWUgPSBuZXdFbGVtZW50LkF0dHJpYnV0ZShXLm51bUlkKS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdTdHlsZSA9IG5ldyBYRWxlbWVudChzdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGdldCByaWQgb2YgYW55dGhpbmcgbm90IGluIHRoZSB3OiBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUuRGVzY2VuZGFudHMoKS5XaGVyZShkID0+IGQuTmFtZS5OYW1lc3BhY2VOYW1lICE9IFcudykuUmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlLkRlc2NlbmRhbnRzKCkuQXR0cmlidXRlcygpLldoZXJlKGQgPT4gZC5OYW1lLk5hbWVzcGFjZU5hbWUgIT0gVy53KS5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgdG9TdHlsZXMuUm9vdC5BZGQobmV3U3R5bGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgdG9JZCA9IChzdHJpbmcpdG9TdHlsZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21JZCAhPSB0b0lkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuZXdJZHMuQ29udGFpbnNLZXkoZnJvbUlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJZHMuQWRkKGZyb21JZCwgdG9JZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyNpZiBNZXJnZVN0eWxlc1dpdGhTYW1lTmFtZXMKKyAgICAgICAgICAgIGlmIChuZXdJZHMuQ291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzdHlsZSBpbiB0b1N0eWxlcworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb252ZXJ0VG9OZXdJZChzdHlsZS5FbGVtZW50KFcuYmFzZWRPbiksIG5ld0lkcyk7CisgICAgICAgICAgICAgICAgICAgIENvbnZlcnRUb05ld0lkKHN0eWxlLkVsZW1lbnQoVy5uZXh0KSwgbmV3SWRzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBuZXdDb250ZW50LkRlc2NlbmRhbnRzQW5kU2VsZigpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShkID0+IGQuTmFtZSA9PSBXLnBTdHlsZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLk5hbWUgPT0gVy5yU3R5bGUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5OYW1lID09IFcudGJsU3R5bGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29udmVydFRvTmV3SWQoaXRlbSwgbmV3SWRzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdOdW1iZXJpbmcgPSBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0Lk51bWJlcmluZ0RlZmluaXRpb25zUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgQ29udmVydE51bWJlcmluZ1BhcnRUb05ld0lkcyhuZXdOdW1iZXJpbmcsIG5ld0lkcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ29udmVydCBzb3VyY2UgZG9jdW1lbnQsIHNpbmNlIG51bWJlcmluZ3Mgd2lsbCBiZSBjb3BpZWQgb3ZlciBhZnRlciBzdHlsZXMuCisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuTnVtYmVyaW5nRGVmaW5pdGlvbnNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgc291cmNlTnVtYmVyaW5nID0gc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIENvbnZlcnROdW1iZXJpbmdQYXJ0VG9OZXdJZHMoc291cmNlTnVtYmVyaW5nLCBuZXdJZHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisKKyNpZiBNZXJnZVN0eWxlc1dpdGhTYW1lTmFtZXMKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb252ZXJ0VG9OZXdJZChYRWxlbWVudCBlbGVtZW50LCBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBuZXdJZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB2YXIgdmFsdWVBdHRyaWJ1dGUgPSBlbGVtZW50LkF0dHJpYnV0ZShXLnZhbCk7CisgICAgICAgICAgICBzdHJpbmcgbmV3SWQ7CisgICAgICAgICAgICBpZiAobmV3SWRzLlRyeUdldFZhbHVlKHZhbHVlQXR0cmlidXRlLlZhbHVlLCBvdXQgbmV3SWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbHVlQXR0cmlidXRlLlZhbHVlID0gbmV3SWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvbnZlcnROdW1iZXJpbmdQYXJ0VG9OZXdJZHMoWERvY3VtZW50IG5ld051bWJlcmluZywgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gbmV3SWRzKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgYWJzdHJhY3ROdW0gaW4gbmV3TnVtYmVyaW5nCisgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5hYnN0cmFjdE51bSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29udmVydFRvTmV3SWQoYWJzdHJhY3ROdW0uRWxlbWVudChXLnN0eWxlTGluayksIG5ld0lkcyk7CisgICAgICAgICAgICAgICAgQ29udmVydFRvTmV3SWQoYWJzdHJhY3ROdW0uRWxlbWVudChXLm51bVN0eWxlTGluayksIG5ld0lkcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIG5ld051bWJlcmluZworICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cygpCisgICAgICAgICAgICAgICAgLldoZXJlKGQgPT4gZC5OYW1lID09IFcucFN0eWxlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5OYW1lID09IFcuclN0eWxlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5OYW1lID09IFcudGJsU3R5bGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnZlcnRUb05ld0lkKGl0ZW0sIG5ld0lkcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgTWVyZ2VGb250VGFibGVzKFhEb2N1bWVudCBmcm9tRm9udFRhYmxlLCBYRG9jdW1lbnQgdG9Gb250VGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGZvbnQgaW4gZnJvbUZvbnRUYWJsZS5Sb290LkVsZW1lbnRzKFcuZm9udCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSBmb250LkF0dHJpYnV0ZShXLm5hbWUpLlZhbHVlOworICAgICAgICAgICAgICAgIGlmICh0b0ZvbnRUYWJsZQorICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5mb250KQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUobyA9PiBvLkF0dHJpYnV0ZShXLm5hbWUpLlZhbHVlID09IG5hbWUpCisgICAgICAgICAgICAgICAgICAgIC5Db3VudCgpID09IDApCisgICAgICAgICAgICAgICAgICAgIHRvRm9udFRhYmxlLlJvb3QuQWRkKG5ldyBYRWxlbWVudChmb250KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvcHlTdHlsZXNBbmRGb250cyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHNvdXJjZURvY3VtZW50LCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IG5ld0RvY3VtZW50LAorICAgICAgICAgICAgSUVudW1lcmFibGU8WEVsZW1lbnQ+IG5ld0NvbnRlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENvcHkgYWxsIHN0eWxlcyB0byB0aGUgbmV3IGRvY3VtZW50CisgICAgICAgICAgICBpZiAoc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5TdHlsZURlZmluaXRpb25zUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBvbGRTdHlsZXMgPSBzb3VyY2VEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIGlmIChuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkFkZE5ld1BhcnQ8U3R5bGVEZWZpbml0aW9uc1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgICAgIFhEb2N1bWVudCBuZXdTdHlsZXMgPSBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZXMuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZXMuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZXMuQWRkKG9sZFN0eWxlcy5Sb290KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWERvY3VtZW50IG5ld1N0eWxlcyA9IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIE1lcmdlU3R5bGVzKHNvdXJjZURvY3VtZW50LCBuZXdEb2N1bWVudCwgb2xkU3R5bGVzLCBuZXdTdHlsZXMsIG5ld0NvbnRlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ29weSBhbGwgc3R5bGVzIHdpdGggZWZmZWN0cyB0byB0aGUgbmV3IGRvY3VtZW50CisgICAgICAgICAgICBpZiAoc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5TdHlsZXNXaXRoRWZmZWN0c1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRG9jdW1lbnQgb2xkU3R5bGVzID0gc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5TdHlsZXNXaXRoRWZmZWN0c1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuU3R5bGVzV2l0aEVmZmVjdHNQYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkFkZE5ld1BhcnQ8U3R5bGVzV2l0aEVmZmVjdHNQYXJ0PigpOworICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgbmV3U3R5bGVzID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5TdHlsZXNXaXRoRWZmZWN0c1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlcy5EZWNsYXJhdGlvbi5TdGFuZGFsb25lID0gInllcyI7CisgICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlcy5EZWNsYXJhdGlvbi5FbmNvZGluZyA9ICJVVEYtOCI7CisgICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlcy5BZGQob2xkU3R5bGVzLlJvb3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgbmV3U3R5bGVzID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5TdHlsZXNXaXRoRWZmZWN0c1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIE1lcmdlU3R5bGVzKHNvdXJjZURvY3VtZW50LCBuZXdEb2N1bWVudCwgb2xkU3R5bGVzLCBuZXdTdHlsZXMsIG5ld0NvbnRlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ29weSBmb250VGFibGUgdG8gdGhlIG5ldyBkb2N1bWVudAorICAgICAgICAgICAgaWYgKHNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRm9udFRhYmxlUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBvbGRGb250VGFibGUgPSBzb3VyY2VEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkZvbnRUYWJsZVBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRm9udFRhYmxlUGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5BZGROZXdQYXJ0PEZvbnRUYWJsZVBhcnQ+KCk7CisgICAgICAgICAgICAgICAgICAgIFhEb2N1bWVudCBuZXdGb250VGFibGUgPSBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkZvbnRUYWJsZVBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIG5ld0ZvbnRUYWJsZS5EZWNsYXJhdGlvbi5TdGFuZGFsb25lID0gInllcyI7CisgICAgICAgICAgICAgICAgICAgIG5ld0ZvbnRUYWJsZS5EZWNsYXJhdGlvbi5FbmNvZGluZyA9ICJVVEYtOCI7CisgICAgICAgICAgICAgICAgICAgIG5ld0ZvbnRUYWJsZS5BZGQob2xkRm9udFRhYmxlLlJvb3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgbmV3Rm9udFRhYmxlID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Gb250VGFibGVQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBNZXJnZUZvbnRUYWJsZXMob2xkRm9udFRhYmxlLCBuZXdGb250VGFibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weUNvbW1lbnRzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgbmV3RG9jdW1lbnQsCisgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gbmV3Q29udGVudCwgTGlzdDxJbWFnZURhdGE+IGltYWdlcykKKyAgICAgICAgeworICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gY29tbWVudElkTWFwID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CisgICAgICAgICAgICBpbnQgbnVtYmVyID0gMDsKKyAgICAgICAgICAgIFhEb2N1bWVudCBvbGRDb21tZW50cyA9IG51bGw7CisgICAgICAgICAgICBYRG9jdW1lbnQgbmV3Q29tbWVudHMgPSBudWxsOworICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgY29tbWVudCBpbiBuZXdDb250ZW50LkRlc2NlbmRhbnRzQW5kU2VsZihXLmNvbW1lbnRSZWZlcmVuY2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChvbGRDb21tZW50cyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBvbGRDb21tZW50cyA9IHNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuV29yZHByb2Nlc3NpbmdDb21tZW50c1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKG5ld0NvbW1lbnRzID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Xb3JkcHJvY2Vzc2luZ0NvbW1lbnRzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21tZW50cyA9IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuV29yZHByb2Nlc3NpbmdDb21tZW50c1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21tZW50cy5EZWNsYXJhdGlvbi5TdGFuZGFsb25lID0gInllcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21tZW50cy5EZWNsYXJhdGlvbi5FbmNvZGluZyA9ICJVVEYtOCI7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWRzID0gbmV3Q29tbWVudHMuUm9vdC5FbGVtZW50cyhXLmNvbW1lbnQpLlNlbGVjdChmID0+IChpbnQpZi5BdHRyaWJ1dGUoVy5pZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkcy5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgPSBpZHMuTWF4KCkgKyAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5BZGROZXdQYXJ0PFdvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0PigpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tbWVudHMgPSBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LldvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tbWVudHMuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tbWVudHMuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tbWVudHMuQWRkKG5ldyBYRWxlbWVudChXLmNvbW1lbnRzLCBOYW1lc3BhY2VBdHRyaWJ1dGVzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGlkID0gKGludCljb21tZW50LkF0dHJpYnV0ZShXLmlkKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gb2xkQ29tbWVudHMKKyAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuY29tbWVudCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKHAgPT4gKChpbnQpcC5BdHRyaWJ1dGUoVy5pZCkpID09IGlkKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3QoKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdFbGVtZW50ID0gbmV3IFhFbGVtZW50KGVsZW1lbnQpOworICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuQXR0cmlidXRlKFcuaWQpLlZhbHVlID0gbnVtYmVyLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgbmV3Q29tbWVudHMuUm9vdC5BZGQobmV3RWxlbWVudCk7CisgICAgICAgICAgICAgICAgaWYgKCEgY29tbWVudElkTWFwLkNvbnRhaW5zS2V5KGlkKSkKKyAgICAgICAgICAgICAgICAgICAgY29tbWVudElkTWFwLkFkZChpZCwgbnVtYmVyKTsKKyAgICAgICAgICAgICAgICBudW1iZXIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIG5ld0NvbnRlbnQuRGVzY2VuZGFudHNBbmRTZWxmKCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBkLk5hbWUgPT0gVy5jb21tZW50UmVmZXJlbmNlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5OYW1lID09IFcuY29tbWVudFJhbmdlU3RhcnQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLk5hbWUgPT0gVy5jb21tZW50UmFuZ2VFbmQpCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjb21tZW50SWRNYXAuQ29udGFpbnNLZXkoKGludClpdGVtLkF0dHJpYnV0ZShXLmlkKSkpCisgICAgICAgICAgICAgICAgICAgIGl0ZW0uQXR0cmlidXRlKFcuaWQpLlZhbHVlID0gY29tbWVudElkTWFwWyhpbnQpaXRlbS5BdHRyaWJ1dGUoVy5pZCldLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Xb3JkcHJvY2Vzc2luZ0NvbW1lbnRzUGFydCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Xb3JkcHJvY2Vzc2luZ0NvbW1lbnRzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFkZFJlbGF0aW9uc2hpcHMoc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Xb3JkcHJvY2Vzc2luZ0NvbW1lbnRzUGFydCwKKyAgICAgICAgICAgICAgICAgICAgbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Xb3JkcHJvY2Vzc2luZ0NvbW1lbnRzUGFydCwKKyAgICAgICAgICAgICAgICAgICAgbmV3W10geyBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LldvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSk7CisgICAgICAgICAgICAgICAgQ29weVJlbGF0ZWRQYXJ0c0ZvckNvbnRlbnRQYXJ0cyhzb3VyY2VEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LldvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0LAorICAgICAgICAgICAgICAgICAgICBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LldvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0LAorICAgICAgICAgICAgICAgICAgICBuZXdbXSB7IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuV29yZHByb2Nlc3NpbmdDb21tZW50c1BhcnQuR2V0WERvY3VtZW50KCkuUm9vdCB9LAorICAgICAgICAgICAgICAgICAgICBpbWFnZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGp1c3RVbmlxdWVJZHMoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBzb3VyY2VEb2N1bWVudCwKKyAgICAgICAgICAgIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgbmV3RG9jdW1lbnQsIElFbnVtZXJhYmxlPFhFbGVtZW50PiBuZXdDb250ZW50KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBhZGp1c3QgYm9va21hcmsgdW5pcXVlIGlkcworICAgICAgICAgICAgaW50IG1heElkID0gMDsKKyAgICAgICAgICAgIGlmIChuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpLkRlc2NlbmRhbnRzKFcuYm9va21hcmtTdGFydCkuQW55KCkpCisgICAgICAgICAgICAgICAgbWF4SWQgPSBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpLkRlc2NlbmRhbnRzKFcuYm9va21hcmtTdGFydCkKKyAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChkID0+IChpbnQpZC5BdHRyaWJ1dGUoVy5pZCkpLk1heCgpOworICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gYm9va21hcmtJZE1hcCA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gbmV3Q29udGVudC5EZXNjZW5kYW50c0FuZFNlbGYoKS5XaGVyZShibSA9PiBibS5OYW1lID09IFcuYm9va21hcmtTdGFydCB8fAorICAgICAgICAgICAgICAgIGJtLk5hbWUgPT0gVy5ib29rbWFya0VuZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlkID0gKGludClpdGVtLkF0dHJpYnV0ZShXLmlkKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJvb2ttYXJrSWRNYXAuQ29udGFpbnNLZXkoaWQpKQorICAgICAgICAgICAgICAgICAgICBib29rbWFya0lkTWFwLkFkZChpZCwgKyttYXhJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgYm9va21hcmtFbGVtZW50IGluIG5ld0NvbnRlbnQuRGVzY2VuZGFudHNBbmRTZWxmKCkuV2hlcmUoZSA9PiBlLk5hbWUgPT0gVy5ib29rbWFya1N0YXJ0IHx8CisgICAgICAgICAgICAgICAgZS5OYW1lID09IFcuYm9va21hcmtFbmQpKQorICAgICAgICAgICAgICAgIGJvb2ttYXJrRWxlbWVudC5BdHRyaWJ1dGUoVy5pZCkuVmFsdWUgPSBib29rbWFya0lkTWFwWyhpbnQpYm9va21hcmtFbGVtZW50LkF0dHJpYnV0ZShXLmlkKV0uVG9TdHJpbmcoKTsKKworICAgICAgICAgICAgLy8gYWRqdXN0IHNoYXBlIHVuaXF1ZSBpZHMKKyAgICAgICAgICAgIC8vIFRoaXMgZG9lc24ndCB3b3JrIGJlY2F1c2UgT0xFT2JqZWN0cyByZWZlciB0byBzaGFwZXMgYnkgSUQuCisgICAgICAgICAgICAvLyBQdW50aW5nIG9uIHRoaXMsIGJlY2F1c2Ugc29vbmVyIG9yIGxhdGVyLCB0aGlzIHdpbGwgYmUgYSBub24taXNzdWUuCisgICAgICAgICAgICAvL2ZvcmVhY2ggKHZhciBpdGVtIGluIG5ld0NvbnRlbnQuRGVzY2VuZGFudHNBbmRTZWxmKFZNTC5zaGFwZSkpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIEd1aWQgZyA9IEd1aWQuTmV3R3VpZCgpOworICAgICAgICAgICAgLy8gICAgc3RyaW5nIHMgPSAiUiIgKyBnLlRvU3RyaW5nKCkuUmVwbGFjZSgiLSIsICIiKTsKKyAgICAgICAgICAgIC8vICAgIGl0ZW0uQXR0cmlidXRlKE5vTmFtZXNwYWNlLmlkKS5WYWx1ZSA9IHM7CisgICAgICAgICAgICAvL30KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRqdXN0RG9jUHJJZHMoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBuZXdEb2N1bWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGRvY1BySWQgPSAwOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKS5EZXNjZW5kYW50cyhXUC5kb2NQcikpCisgICAgICAgICAgICAgICAgaXRlbS5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaWQpLlZhbHVlID0gKCsrZG9jUHJJZCkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBoZWFkZXIgaW4gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5IZWFkZXJQYXJ0cykKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBoZWFkZXIuR2V0WERvY3VtZW50KCkuRGVzY2VuZGFudHMoV1AuZG9jUHIpKQorICAgICAgICAgICAgICAgICAgICBpdGVtLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5pZCkuVmFsdWUgPSAoKytkb2NQcklkKS5Ub1N0cmluZygpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZvb3RlciBpbiBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkZvb3RlclBhcnRzKQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGZvb3Rlci5HZXRYRG9jdW1lbnQoKS5EZXNjZW5kYW50cyhXUC5kb2NQcikpCisgICAgICAgICAgICAgICAgICAgIGl0ZW0uQXR0cmlidXRlKE5vTmFtZXNwYWNlLmlkKS5WYWx1ZSA9ICgrK2RvY1BySWQpLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAobmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpLkRlc2NlbmRhbnRzKFdQLmRvY1ByKSkKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaWQpLlZhbHVlID0gKCsrZG9jUHJJZCkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpLkRlc2NlbmRhbnRzKFdQLmRvY1ByKSkKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaWQpLlZhbHVlID0gKCsrZG9jUHJJZCkuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgcHJvYmFibHkgZG9lc24ndCBuZWVkIHRvIGJlIGRvbmUsIGV4Y2VwdCB0aGF0IHRoZSBPcGVuIFhNTCBTREsgd2lsbCBub3QgdmFsaWRhdGUKKyAgICAgICAgLy8gZG9jdW1lbnRzIHRoYXQgY29udGFpbiB0aGUgbzpnZnhkYXRhIGF0dHJpYnV0ZS4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZW1vdmVHZnhkYXRhKElFbnVtZXJhYmxlPFhFbGVtZW50PiBuZXdDb250ZW50KQorICAgICAgICB7CisgICAgICAgICAgICBuZXdDb250ZW50LkRlc2NlbmRhbnRzQW5kU2VsZigpLkF0dHJpYnV0ZXMoTy5nZnhkYXRhKS5SZW1vdmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBJbnNlcnRUcmFuc2Zvcm0oWE5vZGUgbm9kZSwgTGlzdDxYRWxlbWVudD4gbmV3Q29udGVudCkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LkFubm90YXRpb248UmVwbGFjZVNlbWFwaG9yZT4oKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q29udGVudDsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBJbnNlcnRUcmFuc2Zvcm0obiwgbmV3Q29udGVudCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBSZXBsYWNlU2VtYXBob3JlIHsgfQorCisgICAgICAgIC8vIFJ1bGVzIGZvciBzZWN0aW9ucworICAgICAgICAvLyAtIGlmIEtlZXBTZWN0aW9ucyBmb3IgYWxsIGRvY3VtZW50cyBpbiB0aGUgc291cmNlIGNvbGxlY3Rpb24gYXJlIGZhbHNlLCB0aGVuIGl0IHRha2VzIHRoZSBzZWN0aW9uCisgICAgICAgIC8vICAgZnJvbSB0aGUgZmlyc3QgZG9jdW1lbnQuCisgICAgICAgIC8vIC0gaWYgeW91IHNwZWNpZnkgdHJ1ZSBmb3IgYW55IGRvY3VtZW50LCBhbmQgaWYgdGhlIGxhc3Qgc2VjdGlvbiBpcyBwYXJ0IG9mIHRoZSBzcGVjaWZpZWQgY29udGVudCwKKyAgICAgICAgLy8gICB0aGVuIHRoYXQgc2VjdGlvbiBpcyBjb3BpZWQuICBJZiBhbnkgcGFyYWdyYXBoIGluIHRoZSBjb250ZW50IGhhcyBhIHNlY3Rpb24sIHRoZW4gdGhhdCBzZWN0aW9uCisgICAgICAgIC8vICAgaXMgY29waWVkLgorICAgICAgICAvLyAtIGlmIHlvdSBzcGVjaWZ5IHRydWUgZm9yIGFueSBkb2N1bWVudCwgYW5kIHRoZXJlIGFyZSBubyBzZWN0aW9ucyBmb3IgYW55IHBhcmFncmFwaHMsIHRoZW4gbm8KKyAgICAgICAgLy8gICBzZWN0aW9ucyBhcmUgY29waWVkLgorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFwcGVuZERvY3VtZW50KFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgbmV3RG9jdW1lbnQsCisgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBuZXdDb250ZW50LCBib29sIGtlZXBTZWN0aW9uLCBzdHJpbmcgaW5zZXJ0SWQsIExpc3Q8SW1hZ2VEYXRhPiBpbWFnZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpeFJhbmdlcyhzb3VyY2VEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpLCBuZXdDb250ZW50KTsKKyAgICAgICAgICAgIEFkZFJlbGF0aW9uc2hpcHMoc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydCwgbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydCwgbmV3Q29udGVudCk7CisgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKHNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQsIG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQsCisgICAgICAgICAgICAgICAgbmV3Q29udGVudCwgaW1hZ2VzKTsKKworICAgICAgICAgICAgLy8gQXBwZW5kIGNvbnRlbnRzCisgICAgICAgICAgICBYRG9jdW1lbnQgbmV3TWFpblhEb2MgPSBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgbmV3TWFpblhEb2MuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgbmV3TWFpblhEb2MuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgaWYgKGtlZXBTZWN0aW9uID09IGZhbHNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IGFkanVzdGVkQ29udGVudHMgPSBuZXdDb250ZW50LldoZXJlKGUgPT4gZS5OYW1lICE9IFcuc2VjdFByKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICBhZGp1c3RlZENvbnRlbnRzLkRlc2NlbmRhbnRzQW5kU2VsZihXLnNlY3RQcikuUmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgbmV3Q29udGVudCA9IGFkanVzdGVkQ29udGVudHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgbGlzdE9mU2VjdGlvblByb3BzID0gbmV3Q29udGVudC5EZXNjZW5kYW50c0FuZFNlbGYoVy5zZWN0UHIpLlRvTGlzdCgpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHNlY3RQciBpbiBsaXN0T2ZTZWN0aW9uUHJvcHMpCisgICAgICAgICAgICAgICAgQWRkU2VjdGlvbkFuZERlcGVuZGVuY2llcyhzb3VyY2VEb2N1bWVudCwgbmV3RG9jdW1lbnQsIHNlY3RQciwgaW1hZ2VzKTsKKyAgICAgICAgICAgIENvcHlTdHlsZXNBbmRGb250cyhzb3VyY2VEb2N1bWVudCwgbmV3RG9jdW1lbnQsIG5ld0NvbnRlbnQpOworICAgICAgICAgICAgQ29weU51bWJlcmluZyhzb3VyY2VEb2N1bWVudCwgbmV3RG9jdW1lbnQsIG5ld0NvbnRlbnQsIGltYWdlcyk7CisgICAgICAgICAgICBDb3B5Q29tbWVudHMoc291cmNlRG9jdW1lbnQsIG5ld0RvY3VtZW50LCBuZXdDb250ZW50LCBpbWFnZXMpOworICAgICAgICAgICAgQ29weUZvb3Rub3Rlcyhzb3VyY2VEb2N1bWVudCwgbmV3RG9jdW1lbnQsIG5ld0NvbnRlbnQsIGltYWdlcyk7CisgICAgICAgICAgICBDb3B5RW5kbm90ZXMoc291cmNlRG9jdW1lbnQsIG5ld0RvY3VtZW50LCBuZXdDb250ZW50LCBpbWFnZXMpOworICAgICAgICAgICAgQWRqdXN0VW5pcXVlSWRzKHNvdXJjZURvY3VtZW50LCBuZXdEb2N1bWVudCwgbmV3Q29udGVudCk7CisgICAgICAgICAgICBSZW1vdmVHZnhkYXRhKG5ld0NvbnRlbnQpOworICAgICAgICAgICAgQ29weUN1c3RvbVhtbChzb3VyY2VEb2N1bWVudCwgbmV3RG9jdW1lbnQsIG5ld0NvbnRlbnQpOworICAgICAgICAgICAgQ29weVdlYkV4dGVuc2lvbnMoc291cmNlRG9jdW1lbnQsIG5ld0RvY3VtZW50KTsKKyAgICAgICAgICAgIGlmIChpbnNlcnRJZCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IGluc2VydEVsZW1lbnRUb1JlcGxhY2UgPSBuZXdNYWluWERvYworICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoUHRPcGVuWG1sLkluc2VydCkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGkgPT4gKHN0cmluZylpLkF0dHJpYnV0ZShQdE9wZW5YbWwuSWQpID09IGluc2VydElkKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0RWxlbWVudFRvUmVwbGFjZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBpbnNlcnRFbGVtZW50VG9SZXBsYWNlLkFkZEFubm90YXRpb24obmV3IFJlcGxhY2VTZW1hcGhvcmUoKSk7CisgICAgICAgICAgICAgICAgbmV3TWFpblhEb2MuRWxlbWVudChXLmRvY3VtZW50KS5SZXBsYWNlV2l0aCgoWEVsZW1lbnQpSW5zZXJ0VHJhbnNmb3JtKG5ld01haW5YRG9jLlJvb3QsIG5ld0NvbnRlbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuZXdNYWluWERvYy5Sb290LkVsZW1lbnQoVy5ib2R5KS5BZGQobmV3Q29udGVudCk7CisKKyAgICAgICAgICAgIGlmIChuZXdNYWluWERvYy5EZXNjZW5kYW50cygpLkFueShkID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGQuTmFtZS5OYW1lc3BhY2UgPT0gUHRPcGVuWG1sLnB0IHx8IGQuTmFtZS5OYW1lc3BhY2UgPT0gUHRPcGVuWG1sLnB0T3BlblhtbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgaWYgKGQuQXR0cmlidXRlcygpLkFueShhdHQgPT4gYXR0Lk5hbWUuTmFtZXNwYWNlID09IFB0T3BlblhtbC5wdCB8fCBhdHQuTmFtZS5OYW1lc3BhY2UgPT0gUHRPcGVuWG1sLnB0T3BlblhtbCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByb290ID0gbmV3TWFpblhEb2MuUm9vdDsKKyAgICAgICAgICAgICAgICBpZiAoIXJvb3QuQXR0cmlidXRlcygpLkFueShuYSA9PiBuYS5WYWx1ZSA9PSBQdE9wZW5YbWwucHQuTmFtZXNwYWNlTmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByb290LkFkZChuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInB0IiwgUHRPcGVuWG1sLnB0Lk5hbWVzcGFjZU5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgQWRkVG9JZ25vcmFibGUocm9vdCwgInB0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghcm9vdC5BdHRyaWJ1dGVzKCkuQW55KG5hID0+IG5hLlZhbHVlID09IFB0T3BlblhtbC5wdE9wZW5YbWwuTmFtZXNwYWNlTmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByb290LkFkZChuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInB0MTQiLCBQdE9wZW5YbWwucHRPcGVuWG1sLk5hbWVzcGFjZU5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgQWRkVG9JZ25vcmFibGUocm9vdCwgInB0MTQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvcHlXZWJFeHRlbnNpb25zKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgbmV3RG9jdW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzb3VyY2VEb2N1bWVudC5XZWJFeFRhc2twYW5lc1BhcnQgIT0gbnVsbCAmJiBuZXdEb2N1bWVudC5XZWJFeFRhc2twYW5lc1BhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXdEb2N1bWVudC5BZGRXZWJFeFRhc2twYW5lc1BhcnQoKTsKKyAgICAgICAgICAgICAgICBuZXdEb2N1bWVudC5XZWJFeFRhc2twYW5lc1BhcnQuR2V0WERvY3VtZW50KCkuQWRkKHNvdXJjZURvY3VtZW50LldlYkV4VGFza3BhbmVzUGFydC5HZXRYRG9jdW1lbnQoKS5Sb290KTsKKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzb3VyY2VXZWJFeHRlbnNpb25QYXJ0IGluIHNvdXJjZURvY3VtZW50LldlYkV4VGFza3BhbmVzUGFydC5XZWJFeHRlbnNpb25QYXJ0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdXZWJFeHRlbnNpb25wYXJ0ID0gbmV3RG9jdW1lbnQuV2ViRXhUYXNrcGFuZXNQYXJ0LkFkZE5ld1BhcnQ8V2ViRXh0ZW5zaW9uUGFydD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VEb2N1bWVudC5XZWJFeFRhc2twYW5lc1BhcnQuR2V0SWRPZlBhcnQoc291cmNlV2ViRXh0ZW5zaW9uUGFydCkpOworICAgICAgICAgICAgICAgICAgICBuZXdXZWJFeHRlbnNpb25wYXJ0LkdldFhEb2N1bWVudCgpLkFkZChzb3VyY2VXZWJFeHRlbnNpb25QYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkVG9JZ25vcmFibGUoWEVsZW1lbnQgcm9vdCwgc3RyaW5nIHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpZ25vcmFibGUgPSByb290LkF0dHJpYnV0ZShNQy5JZ25vcmFibGUpOworICAgICAgICAgICAgaWYgKGlnbm9yYWJsZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2YWwgPSAoc3RyaW5nKWlnbm9yYWJsZTsKKyAgICAgICAgICAgICAgICB2YWwgPSB2YWwgKyAiICIgKyB2OworICAgICAgICAgICAgICAgIGlnbm9yYWJsZS5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICByb290LlNldEF0dHJpYnV0ZVZhbHVlKE1DLklnbm9yYWJsZSwgdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vLyBOZXcgbWV0aG9kIHRvIHN1cHBvcnQgbmV3IGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBcHBlbmREb2N1bWVudChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHNvdXJjZURvY3VtZW50LCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IG5ld0RvY3VtZW50LCBPcGVuWG1sUGFydCBwYXJ0LAorICAgICAgICAgICAgTGlzdDxYRWxlbWVudD4gbmV3Q29udGVudCwgYm9vbCBrZWVwU2VjdGlvbiwgc3RyaW5nIGluc2VydElkLCBMaXN0PEltYWdlRGF0YT4gaW1hZ2VzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcHBlbmQgY29udGVudHMKKyAgICAgICAgICAgIFhEb2N1bWVudCBwYXJ0WERvYyA9IHBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBwYXJ0WERvYy5EZWNsYXJhdGlvbi5TdGFuZGFsb25lID0gInllcyI7CisgICAgICAgICAgICBwYXJ0WERvYy5EZWNsYXJhdGlvbi5FbmNvZGluZyA9ICJVVEYtOCI7CisKKyAgICAgICAgICAgIEZpeFJhbmdlcyhwYXJ0LkdldFhEb2N1bWVudCgpLCBuZXdDb250ZW50KTsKKyAgICAgICAgICAgIEFkZFJlbGF0aW9uc2hpcHMoc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydCwgcGFydCwgbmV3Q29udGVudCk7CisgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKHNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQsIHBhcnQsCisgICAgICAgICAgICAgICAgbmV3Q29udGVudCwgaW1hZ2VzKTsKKworICAgICAgICAgICAgLy8gbmV2ZXIga2VlcCBzZWN0aW9ucyBmb3IgY29udGVudCB0byBiZSBpbnNlcnRlZCBpbnRvIGEgaGVhZGVyL2Zvb3RlcgorICAgICAgICAgICAgTGlzdDxYRWxlbWVudD4gYWRqdXN0ZWRDb250ZW50cyA9IG5ld0NvbnRlbnQuV2hlcmUoZSA9PiBlLk5hbWUgIT0gVy5zZWN0UHIpLlRvTGlzdCgpOworICAgICAgICAgICAgYWRqdXN0ZWRDb250ZW50cy5EZXNjZW5kYW50c0FuZFNlbGYoVy5zZWN0UHIpLlJlbW92ZSgpOworICAgICAgICAgICAgbmV3Q29udGVudCA9IGFkanVzdGVkQ29udGVudHM7CisKKyAgICAgICAgICAgIENvcHlOdW1iZXJpbmcoc291cmNlRG9jdW1lbnQsIG5ld0RvY3VtZW50LCBuZXdDb250ZW50LCBpbWFnZXMpOworICAgICAgICAgICAgQ29weUNvbW1lbnRzKHNvdXJjZURvY3VtZW50LCBuZXdEb2N1bWVudCwgbmV3Q29udGVudCwgaW1hZ2VzKTsKKyAgICAgICAgICAgIEFkanVzdFVuaXF1ZUlkcyhzb3VyY2VEb2N1bWVudCwgbmV3RG9jdW1lbnQsIG5ld0NvbnRlbnQpOworICAgICAgICAgICAgUmVtb3ZlR2Z4ZGF0YShuZXdDb250ZW50KTsKKworICAgICAgICAgICAgaWYgKGluc2VydElkID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworCisgICAgICAgICAgICBYRWxlbWVudCBpbnNlcnRFbGVtZW50VG9SZXBsYWNlID0gcGFydFhEb2MKKyAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoUHRPcGVuWG1sLkluc2VydCkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoaSA9PiAoc3RyaW5nKWkuQXR0cmlidXRlKFB0T3BlblhtbC5JZCkgPT0gaW5zZXJ0SWQpOworICAgICAgICAgICAgaWYgKGluc2VydEVsZW1lbnRUb1JlcGxhY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpbnNlcnRFbGVtZW50VG9SZXBsYWNlLkFkZEFubm90YXRpb24obmV3IFJlcGxhY2VTZW1hcGhvcmUoKSk7CisgICAgICAgICAgICBwYXJ0WERvYy5FbGVtZW50cygpLkZpcnN0KCkuUmVwbGFjZVdpdGgoKFhFbGVtZW50KUluc2VydFRyYW5zZm9ybShwYXJ0WERvYy5Sb290LCBuZXdDb250ZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvcHlDdXN0b21YbWwoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBzb3VyY2VEb2N1bWVudCwgV29yZHByb2Nlc3NpbmdEb2N1bWVudCBuZXdEb2N1bWVudCwKKyAgICAgICAgICAgIElFbnVtZXJhYmxlPFhFbGVtZW50PiBuZXdDb250ZW50KQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0PHN0cmluZz4gaXRlbUxpc3QgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgaXRlbUlkIGluIG5ld0NvbnRlbnQKKyAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoVy5kYXRhQmluZGluZykKKyAgICAgICAgICAgICAgICAuU2VsZWN0KGUgPT4gKHN0cmluZyllLkF0dHJpYnV0ZShXLnN0b3JlSXRlbUlEKSkpCisgICAgICAgICAgICAgICAgaWYgKCFpdGVtTGlzdC5Db250YWlucyhpdGVtSWQpKQorICAgICAgICAgICAgICAgICAgICBpdGVtTGlzdC5BZGQoaXRlbUlkKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKEN1c3RvbVhtbFBhcnQgY3VzdG9tWG1sUGFydCBpbiBzb3VyY2VEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkN1c3RvbVhtbFBhcnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9wZW5YbWxQYXJ0IHByb3BlcnR5UGFydCA9IGN1c3RvbVhtbFBhcnQKKyAgICAgICAgICAgICAgICAgICAgLlBhcnRzCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QocCA9PiBwLk9wZW5YbWxQYXJ0KQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUocCA9PiBwLkNvbnRlbnRUeXBlID09ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuY3VzdG9tWG1sUHJvcGVydGllcyt4bWwiKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgcHJvcGVydHlQYXJ0RG9jID0gcHJvcGVydHlQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUxpc3QuQ29udGFpbnMocHJvcGVydHlQYXJ0RG9jLlJvb3QuQXR0cmlidXRlKERTLml0ZW1JRCkuVmFsdWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21YbWxQYXJ0IG5ld1BhcnQgPSBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkFkZEN1c3RvbVhtbFBhcnQoY3VzdG9tWG1sUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0LkdldFhEb2N1bWVudCgpLkFkZChjdXN0b21YbWxQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoT3BlblhtbFBhcnQgcHJvcFBhcnQgaW4gY3VzdG9tWG1sUGFydC5QYXJ0cy5TZWxlY3QocCA9PiBwLk9wZW5YbWxQYXJ0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21YbWxQcm9wZXJ0aWVzUGFydCBuZXdQcm9wUGFydCA9IG5ld1BhcnQuQWRkTmV3UGFydDxDdXN0b21YbWxQcm9wZXJ0aWVzUGFydD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wUGFydC5HZXRYRG9jdW1lbnQoKS5BZGQocHJvcFBhcnQuR2V0WERvY3VtZW50KCkuUm9vdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBEaWN0aW9uYXJ5PFhOYW1lLCBYTmFtZVtdPiBSZWxhdGlvbnNoaXBNYXJrdXAgPSBudWxsOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVXBkYXRlQ29udGVudChJRW51bWVyYWJsZTxYRWxlbWVudD4gbmV3Q29udGVudCwgWE5hbWUgZWxlbWVudFRvTW9kaWZ5LCBzdHJpbmcgb2xkUmlkLCBzdHJpbmcgbmV3UmlkKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgYXR0cmlidXRlTmFtZSBpbiBSZWxhdGlvbnNoaXBNYXJrdXBbZWxlbWVudFRvTW9kaWZ5XSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZWxlbWVudHNUb1VwZGF0ZSA9IG5ld0NvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKGVsZW1lbnRUb01vZGlmeSkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gKHN0cmluZyllLkF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA9PSBvbGRSaWQpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlbGVtZW50IGluIGVsZW1lbnRzVG9VcGRhdGUpCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpLlZhbHVlID0gbmV3UmlkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRSZWxhdGlvbnNoaXBzKE9wZW5YbWxQYXJ0IG9sZFBhcnQsIE9wZW5YbWxQYXJ0IG5ld1BhcnQsIElFbnVtZXJhYmxlPFhFbGVtZW50PiBuZXdDb250ZW50KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVsZXZhbnRFbGVtZW50cyA9IG5ld0NvbnRlbnQuRGVzY2VuZGFudHNBbmRTZWxmKCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBSZWxhdGlvbnNoaXBNYXJrdXAuQ29udGFpbnNLZXkoZC5OYW1lKSAmJgorICAgICAgICAgICAgICAgICAgICBkLkF0dHJpYnV0ZXMoKS5BbnkoYSA9PiBSZWxhdGlvbnNoaXBNYXJrdXBbZC5OYW1lXS5Db250YWlucyhhLk5hbWUpKSkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZSBpbiByZWxldmFudEVsZW1lbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlLk5hbWUgPT0gVy5oeXBlcmxpbmspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmVsSWQgPSAoc3RyaW5nKWUuQXR0cmlidXRlKFIuaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkocmVsSWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wSHlwZXJsaW5rID0gbmV3UGFydC5IeXBlcmxpbmtSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KGggPT4gaC5JZCA9PSByZWxJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wSHlwZXJsaW5rICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgR3VpZCBnID0gR3VpZC5OZXdHdWlkKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuZXdSaWQgPSAiUiIgKyBnLlRvU3RyaW5nKCkuUmVwbGFjZSgiLSIsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG9sZEh5cGVybGluayA9IG9sZFBhcnQuSHlwZXJsaW5rUmVsYXRpb25zaGlwcy5GaXJzdE9yRGVmYXVsdChoID0+IGguSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkSHlwZXJsaW5rID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRG9jdW1lbnRCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24oIkludGVybmFsIEVycm9yIDAwMDIiKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydC5BZGRIeXBlcmxpbmtSZWxhdGlvbnNoaXAob2xkSHlwZXJsaW5rLlVyaSwgb2xkSHlwZXJsaW5rLklzRXh0ZXJuYWwsIG5ld1JpZCk7CisgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUNvbnRlbnQobmV3Q29udGVudCwgZS5OYW1lLCByZWxJZCwgbmV3UmlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGUuTmFtZSA9PSBXLmF0dGFjaGVkVGVtcGxhdGUgfHwgZS5OYW1lID09IFcuc2F2ZVRocm91Z2hYc2x0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJlbElkID0gKHN0cmluZyllLkF0dHJpYnV0ZShSLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHJlbElkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEV4dGVybmFsUmVsYXRpb25zaGlwID0gbmV3UGFydC5FeHRlcm5hbFJlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoaCA9PiBoLklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBFeHRlcm5hbFJlbGF0aW9uc2hpcCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIEd1aWQgZyA9IEd1aWQuTmV3R3VpZCgpOworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmV3UmlkID0gIlIiICsgZy5Ub1N0cmluZygpLlJlcGxhY2UoIi0iLCAiIik7CisgICAgICAgICAgICAgICAgICAgIHZhciBvbGRSZWwgPSBvbGRQYXJ0LkV4dGVybmFsUmVsYXRpb25zaGlwcy5GaXJzdE9yRGVmYXVsdChoID0+IGguSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkUmVsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24oIlNvdXJjZSB7MH0gaXMgaW52YWxpZCBkb2N1bWVudCAtIGh5cGVybGluayBjb250YWlucyBpbnZhbGlkIHJlZmVyZW5jZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydC5BZGRFeHRlcm5hbFJlbGF0aW9uc2hpcChvbGRSZWwuUmVsYXRpb25zaGlwVHlwZSwgb2xkUmVsLlVyaSwgbmV3UmlkKTsKKyAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ29udGVudChuZXdDb250ZW50LCBlLk5hbWUsIHJlbElkLCBuZXdSaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZS5OYW1lID09IEEuaGxpbmtDbGljayB8fCBlLk5hbWUgPT0gQS5obGlua0hvdmVyIHx8IGUuTmFtZSA9PSBBLmhsaW5rTW91c2VPdmVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJlbElkID0gKHN0cmluZyllLkF0dHJpYnV0ZShSLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHJlbElkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEh5cGVybGluayA9IG5ld1BhcnQuSHlwZXJsaW5rUmVsYXRpb25zaGlwcy5GaXJzdE9yRGVmYXVsdChoID0+IGguSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcEh5cGVybGluayAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIEd1aWQgZyA9IEd1aWQuTmV3R3VpZCgpOworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmV3UmlkID0gIlIiICsgZy5Ub1N0cmluZygpLlJlcGxhY2UoIi0iLCAiIik7CisgICAgICAgICAgICAgICAgICAgIHZhciBvbGRIeXBlcmxpbmsgPSBvbGRQYXJ0Lkh5cGVybGlua1JlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoaCA9PiBoLklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZEh5cGVybGluayA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQuQWRkSHlwZXJsaW5rUmVsYXRpb25zaGlwKG9sZEh5cGVybGluay5VcmksIG9sZEh5cGVybGluay5Jc0V4dGVybmFsLCBuZXdSaWQpOworICAgICAgICAgICAgICAgICAgICBVcGRhdGVDb250ZW50KG5ld0NvbnRlbnQsIGUuTmFtZSwgcmVsSWQsIG5ld1JpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlLk5hbWUgPT0gVk1MLmltYWdlZGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IChzdHJpbmcpZS5BdHRyaWJ1dGUoUi5ocmVmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHJlbElkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEV4dGVybmFsUmVsYXRpb25zaGlwID0gbmV3UGFydC5FeHRlcm5hbFJlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoaCA9PiBoLklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBFeHRlcm5hbFJlbGF0aW9uc2hpcCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIEd1aWQgZyA9IEd1aWQuTmV3R3VpZCgpOworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmV3UmlkID0gIlIiICsgZy5Ub1N0cmluZygpLlJlcGxhY2UoIi0iLCAiIik7CisgICAgICAgICAgICAgICAgICAgIHZhciBvbGRSZWwgPSBvbGRQYXJ0LkV4dGVybmFsUmVsYXRpb25zaGlwcy5GaXJzdE9yRGVmYXVsdChoID0+IGguSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkUmVsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24oIkludGVybmFsIEVycm9yIDAwMDYiKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydC5BZGRFeHRlcm5hbFJlbGF0aW9uc2hpcChvbGRSZWwuUmVsYXRpb25zaGlwVHlwZSwgb2xkUmVsLlVyaSwgbmV3UmlkKTsKKyAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ29udGVudChuZXdDb250ZW50LCBlLk5hbWUsIHJlbElkLCBuZXdSaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZS5OYW1lID09IEEuYmxpcCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIDxhOmJsaXAgcjplbWJlZD0icklkNiIgeG1sbnM6cj0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcyIgeG1sbnM6YT0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L21haW4iIC8+CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IChzdHJpbmcpZS5BdHRyaWJ1dGUoUi5saW5rKTsKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAocmVsSWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVsSWQgPSAoc3RyaW5nKWUuQXR0cmlidXRlKFIuZW1iZWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkocmVsSWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wRXh0ZXJuYWxSZWxhdGlvbnNoaXAgPSBuZXdQYXJ0LkV4dGVybmFsUmVsYXRpb25zaGlwcy5GaXJzdE9yRGVmYXVsdChoID0+IGguSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcEV4dGVybmFsUmVsYXRpb25zaGlwICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgR3VpZCBnID0gR3VpZC5OZXdHdWlkKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuZXdSaWQgPSAiUiIgKyBnLlRvU3RyaW5nKCkuUmVwbGFjZSgiLSIsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG9sZFJlbCA9IG9sZFBhcnQuRXh0ZXJuYWxSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KGggPT4gaC5JZCA9PSByZWxJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbGRSZWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0LkFkZEV4dGVybmFsUmVsYXRpb25zaGlwKG9sZFJlbC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRSZWwuVXJpLCBuZXdSaWQpOworICAgICAgICAgICAgICAgICAgICBVcGRhdGVDb250ZW50KG5ld0NvbnRlbnQsIGUuTmFtZSwgcmVsSWQsIG5ld1JpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBGcm9tUHJldmlvdXNTb3VyY2VTZW1hcGhvcmUgeyB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weU51bWJlcmluZyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHNvdXJjZURvY3VtZW50LCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IG5ld0RvY3VtZW50LAorICAgICAgICAgICAgSUVudW1lcmFibGU8WEVsZW1lbnQ+IG5ld0NvbnRlbnQsIExpc3Q8SW1hZ2VEYXRhPiBpbWFnZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IG51bUlkTWFwID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CisgICAgICAgICAgICBpbnQgbnVtYmVyID0gMTsKKyAgICAgICAgICAgIGludCBhYnN0cmFjdE51bWJlciA9IDA7CisgICAgICAgICAgICBYRG9jdW1lbnQgb2xkTnVtYmVyaW5nID0gbnVsbDsKKyAgICAgICAgICAgIFhEb2N1bWVudCBuZXdOdW1iZXJpbmcgPSBudWxsOworCisgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBudW1SZWZlcmVuY2UgaW4gbmV3Q29udGVudC5EZXNjZW5kYW50c0FuZFNlbGYoVy5udW1QcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgaWRFbGVtZW50ID0gbnVtUmVmZXJlbmNlLkRlc2NlbmRhbnRzKFcubnVtSWQpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKGlkRWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZE51bWJlcmluZyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb2xkTnVtYmVyaW5nID0gc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdOdW1iZXJpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuTnVtYmVyaW5nRGVmaW5pdGlvbnNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TnVtYmVyaW5nID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG51bUlkcyA9IG5ld051bWJlcmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5udW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZiA9PiAoaW50KWYuQXR0cmlidXRlKFcubnVtSWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtSWRzLkFueSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgPSBudW1JZHMuTWF4KCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUlkcyA9IG5ld051bWJlcmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5hYnN0cmFjdE51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChmID0+IChpbnQpZi5BdHRyaWJ1dGUoVy5hYnN0cmFjdE51bUlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bUlkcy5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3ROdW1iZXIgPSBudW1JZHMuTWF4KCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuQWRkTmV3UGFydDxOdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TnVtYmVyaW5nID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TnVtYmVyaW5nLkRlY2xhcmF0aW9uLlN0YW5kYWxvbmUgPSAieWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOdW1iZXJpbmcuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld051bWJlcmluZy5BZGQobmV3IFhFbGVtZW50KFcubnVtYmVyaW5nLCBOYW1lc3BhY2VBdHRyaWJ1dGVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IG51bUlkID0gKGludClpZEVsZW1lbnQuQXR0cmlidXRlKFcudmFsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bUlkICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBvbGROdW1iZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoVy5udW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKHAgPT4gKChpbnQpcC5BdHRyaWJ1dGUoVy5udW1JZCkpID09IG51bUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weSBhYnN0cmFjdCBudW1iZXJpbmcgZWxlbWVudCwgaWYgbmVjZXNzYXJ5ICh1c2UgbWF0Y2hpbmcgTlNJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhYnN0cmFjdE51bUlkID0gKGludCllbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuYWJzdHJhY3ROdW1JZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGUoVy52YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgYWJzdHJhY3RFbGVtZW50ID0gb2xkTnVtYmVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5hYnN0cmFjdE51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUocCA9PiAoKGludClwLkF0dHJpYnV0ZShXLmFic3RyYWN0TnVtSWQpKSA9PSBhYnN0cmFjdE51bUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbnNpZEVsZW1lbnQgPSBhYnN0cmFjdEVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudChXLm5zaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFic3RyYWN0TlNJRCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnNpZEVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnN0cmFjdE5TSUQgPSAoc3RyaW5nKW5zaWRFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGUoVy52YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3QWJzdHJhY3RFbGVtZW50ID0gbmV3TnVtYmVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5hYnN0cmFjdE51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLkFubm90YXRpb248RnJvbVByZXZpb3VzU291cmNlU2VtYXBob3JlPigpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKHAgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aGlzTnNpZEVsZW1lbnQgPSBwLkVsZW1lbnQoVy5uc2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNOc2lkRWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHN0cmluZyl0aGlzTnNpZEVsZW1lbnQuQXR0cmlidXRlKFcudmFsKSA9PSBhYnN0cmFjdE5TSUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdBYnN0cmFjdEVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBYnN0cmFjdEVsZW1lbnQgPSBuZXcgWEVsZW1lbnQoYWJzdHJhY3RFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBYnN0cmFjdEVsZW1lbnQuQXR0cmlidXRlKFcuYWJzdHJhY3ROdW1JZCkuVmFsdWUgPSBhYnN0cmFjdE51bWJlci5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic3RyYWN0TnVtYmVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld051bWJlcmluZy5Sb290LkVsZW1lbnRzKFcuYWJzdHJhY3ROdW0pLkFueSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOdW1iZXJpbmcuUm9vdC5FbGVtZW50cyhXLmFic3RyYWN0TnVtKS5MYXN0KCkuQWRkQWZ0ZXJTZWxmKG5ld0Fic3RyYWN0RWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOdW1iZXJpbmcuUm9vdC5BZGQobmV3QWJzdHJhY3RFbGVtZW50KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IHBpY3RJZCBpbiBuZXdBYnN0cmFjdEVsZW1lbnQuRGVzY2VuZGFudHMoVy5sdmxQaWNCdWxsZXRJZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYnVsbGV0SWQgPSAoc3RyaW5nKXBpY3RJZC5BdHRyaWJ1dGUoVy52YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBudW1QaWNCdWxsZXQgPSBvbGROdW1iZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cyhXLm51bVBpY0J1bGxldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChkID0+IChzdHJpbmcpZC5BdHRyaWJ1dGUoVy5udW1QaWNCdWxsZXRJZCkgPT0gYnVsbGV0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4TnVtUGljQnVsbGV0SWQgPSBuZXcgaW50W10geyAtMSB9LkNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld051bWJlcmluZy5EZXNjZW5kYW50cyhXLm51bVBpY0J1bGxldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKFcubnVtUGljQnVsbGV0SWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGEgPT4gKGludClhKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5NYXgoKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld051bVBpY0J1bGxldCA9IG5ldyBYRWxlbWVudChudW1QaWNCdWxsZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOdW1QaWNCdWxsZXQuQXR0cmlidXRlKFcubnVtUGljQnVsbGV0SWQpLlZhbHVlID0gbWF4TnVtUGljQnVsbGV0SWQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdElkLkF0dHJpYnV0ZShXLnZhbCkuVmFsdWUgPSBtYXhOdW1QaWNCdWxsZXRJZC5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOdW1iZXJpbmcuUm9vdC5BZGRGaXJzdChuZXdOdW1QaWNCdWxsZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuZXdBYnN0cmFjdElkID0gbmV3QWJzdHJhY3RFbGVtZW50LkF0dHJpYnV0ZShXLmFic3RyYWN0TnVtSWQpLlZhbHVlOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IG51bWJlcmluZyBlbGVtZW50LCBpZiBuZWNlc3NhcnkgKHVzZSBtYXRjaGluZyBlbGVtZW50IHdpdGggbm8gb3ZlcnJpZGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3RWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1JZE1hcC5Db250YWluc0tleShudW1JZCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudCA9IG5ld051bWJlcmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5udW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IGUuQW5ub3RhdGlvbjxGcm9tUHJldmlvdXNTb3VyY2VTZW1hcGhvcmU+KCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKHAgPT4gKChpbnQpcC5BdHRyaWJ1dGUoVy5udW1JZCkpID09IG51bUlkTWFwW251bUlkXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudCA9IG5ldyBYRWxlbWVudChlbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmFic3RyYWN0TnVtSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGUoVy52YWwpLlZhbHVlID0gbmV3QWJzdHJhY3RJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LkF0dHJpYnV0ZShXLm51bUlkKS5WYWx1ZSA9IG51bWJlci5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUlkTWFwLkFkZChudW1JZCwgbnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOdW1iZXJpbmcuUm9vdC5BZGQobmV3RWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZEVsZW1lbnQuQXR0cmlidXRlKFcudmFsKS5WYWx1ZSA9IG5ld0VsZW1lbnQuQXR0cmlidXRlKFcubnVtSWQpLlZhbHVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld051bWJlcmluZyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhYnN0cmFjdE51bSBpbiBuZXdOdW1iZXJpbmcuRGVzY2VuZGFudHMoVy5hYnN0cmFjdE51bSkpCisgICAgICAgICAgICAgICAgICAgIGFic3RyYWN0TnVtLkFkZEFubm90YXRpb24obmV3IEZyb21QcmV2aW91c1NvdXJjZVNlbWFwaG9yZSgpKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgbnVtIGluIG5ld051bWJlcmluZy5EZXNjZW5kYW50cyhXLm51bSkpCisgICAgICAgICAgICAgICAgICAgIG51bS5BZGRBbm5vdGF0aW9uKG5ldyBGcm9tUHJldmlvdXNTb3VyY2VTZW1hcGhvcmUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0Lk51bWJlcmluZ0RlZmluaXRpb25zUGFydCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZGRSZWxhdGlvbnNoaXBzKHNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuTnVtYmVyaW5nRGVmaW5pdGlvbnNQYXJ0LAorICAgICAgICAgICAgICAgICAgICBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0Lk51bWJlcmluZ0RlZmluaXRpb25zUGFydCwKKyAgICAgICAgICAgICAgICAgICAgbmV3W10geyBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0Lk51bWJlcmluZ0RlZmluaXRpb25zUGFydC5HZXRYRG9jdW1lbnQoKS5Sb290IH0pOworICAgICAgICAgICAgICAgIENvcHlSZWxhdGVkUGFydHNGb3JDb250ZW50UGFydHMoc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQsCisgICAgICAgICAgICAgICAgICAgIG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuTnVtYmVyaW5nRGVmaW5pdGlvbnNQYXJ0LAorICAgICAgICAgICAgICAgICAgICBuZXdbXSB7IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuTnVtYmVyaW5nRGVmaW5pdGlvbnNQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weVJlbGF0ZWRJbWFnZShPcGVuWG1sUGFydCBvbGRDb250ZW50UGFydCwgT3BlblhtbFBhcnQgbmV3Q29udGVudFBhcnQsIFhFbGVtZW50IGltYWdlUmVmZXJlbmNlLCBYTmFtZSBhdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgTGlzdDxJbWFnZURhdGE+IGltYWdlcykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHJlbElkID0gKHN0cmluZylpbWFnZVJlZmVyZW5jZS5BdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7CisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkocmVsSWQpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gRmlyc3QgbG9vayB0byBzZWUgaWYgdGhpcyByZWxJZCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBuZXcgZG9jdW1lbnQuCisgICAgICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhvc2UgcGFydHMgdGhhdCBnZXQgcHJvY2Vzc2VkIHdpdGggYm90aCBvbGQgYW5kIG5ldyBpZHMsIHN1Y2ggYXMgdGhlIGNvbW1lbnRzCisgICAgICAgICAgICAvLyBwYXJ0LiAgVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGZvciBwYXJ0cyBzdWNoIGFzIHRoZSBtYWluIGRvY3VtZW50IHBhcnQsIGJ1dCB0aGlzIGNvZGUgd29uJ3QgbWFsZnVuY3Rpb24KKyAgICAgICAgICAgIC8vIGluIHRoYXQgY2FzZS4KKyAgICAgICAgICAgIHZhciB0ZW1wUGFydElkUGFpcjUgPSBuZXdDb250ZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdChwID0+IHAuUmVsYXRpb25zaGlwSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgaWYgKHRlbXBQYXJ0SWRQYWlyNSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgRXh0ZXJuYWxSZWxhdGlvbnNoaXAgdGVtcEVyNSA9IG5ld0NvbnRlbnRQYXJ0LkV4dGVybmFsUmVsYXRpb25zaGlwcy5GaXJzdE9yRGVmYXVsdChlciA9PiBlci5JZCA9PSByZWxJZCk7CisgICAgICAgICAgICBpZiAodGVtcEVyNSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgdmFyIGlwcDIgPSBvbGRDb250ZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdChpcHAgPT4gaXBwLlJlbGF0aW9uc2hpcElkID09IHJlbElkKTsKKyAgICAgICAgICAgIGlmIChpcHAyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW1hZ2VQYXJ0IG9sZFBhcnQgPSAoSW1hZ2VQYXJ0KWlwcDIuT3BlblhtbFBhcnQ7CisgICAgICAgICAgICAgICAgSW1hZ2VEYXRhIHRlbXAgPSBNYW5hZ2VJbWFnZUNvcHkob2xkUGFydCwgbmV3Q29udGVudFBhcnQsIGltYWdlcyk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXAuSW1hZ2VQYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJbWFnZVBhcnQgbmV3UGFydCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBNYWluRG9jdW1lbnRQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoTWFpbkRvY3VtZW50UGFydCluZXdDb250ZW50UGFydCkuQWRkSW1hZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgSGVhZGVyUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKEhlYWRlclBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEltYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIEZvb3RlclBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChGb290ZXJQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRJbWFnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBFbmRub3Rlc1BhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChFbmRub3Rlc1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEltYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIEZvb3Rub3Rlc1BhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChGb290bm90ZXNQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRJbWFnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBUaGVtZVBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChUaGVtZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEltYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFdvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoV29yZHByb2Nlc3NpbmdDb21tZW50c1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEltYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIERvY3VtZW50U2V0dGluZ3NQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoRG9jdW1lbnRTZXR0aW5nc1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEltYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIENoYXJ0UGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKENoYXJ0UGFydCluZXdDb250ZW50UGFydCkuQWRkSW1hZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgTnVtYmVyaW5nRGVmaW5pdGlvbnNQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoTnVtYmVyaW5nRGVmaW5pdGlvbnNQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRJbWFnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBEaWFncmFtRGF0YVBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChEaWFncmFtRGF0YVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEltYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIENoYXJ0RHJhd2luZ1BhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChDaGFydERyYXdpbmdQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRJbWFnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXAuSW1hZ2VQYXJ0ID0gbmV3UGFydDsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gbmV3Q29udGVudFBhcnQuR2V0SWRPZlBhcnQobmV3UGFydCk7CisgICAgICAgICAgICAgICAgICAgIHRlbXAuQWRkQ29udGVudFBhcnRSZWxUeXBlUmVzb3VyY2VJZFR1cHBsZShuZXdDb250ZW50UGFydCwgbmV3UGFydC5SZWxhdGlvbnNoaXBUeXBlLCBpZCk7CisgICAgICAgICAgICAgICAgICAgIGltYWdlUmVmZXJlbmNlLkF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKS5WYWx1ZSA9IGlkOworICAgICAgICAgICAgICAgICAgICB0ZW1wLldyaXRlSW1hZ2UobmV3UGFydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciByZWZSZWwgPSBuZXdDb250ZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdChwaXAgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbCA9IHRlbXAuQ29udGVudFBhcnRSZWxUeXBlSWRMaXN0LkZpcnN0T3JEZWZhdWx0KGNwciA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb3VuZCA9IGNwci5Db250ZW50UGFydCA9PSBuZXdDb250ZW50UGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWwgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWZSZWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VSZWZlcmVuY2UuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpLlZhbHVlID0gdGVtcC5Db250ZW50UGFydFJlbFR5cGVJZExpc3QuRmlyc3QoY3ByID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvdW5kID0gY3ByLkNvbnRlbnRQYXJ0ID09IG5ld0NvbnRlbnRQYXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pLlJlbGF0aW9uc2hpcElkOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdJZCA9ICJSIiArIEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCkuUmVwbGFjZSgiLSIsICIiKS5TdWJzdHJpbmcoMCwgMTYpOworICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50UGFydC5DcmVhdGVSZWxhdGlvbnNoaXBUb1BhcnQodGVtcC5JbWFnZVBhcnQsIG5ld0lkKTsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VSZWZlcmVuY2UuQXR0cmlidXRlKFIuaWQpLlZhbHVlID0gbmV3SWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4dGVybmFsUmVsYXRpb25zaGlwIGVyID0gb2xkQ29udGVudFBhcnQuRXh0ZXJuYWxSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KGVyMSA9PiBlcjEuSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmIChlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxSZWxhdGlvbnNoaXAgbmV3RXIgPSBuZXdDb250ZW50UGFydC5BZGRFeHRlcm5hbFJlbGF0aW9uc2hpcChlci5SZWxhdGlvbnNoaXBUeXBlLCBlci5VcmkpOworICAgICAgICAgICAgICAgICAgICBpbWFnZVJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5pZCkuVmFsdWUgPSBuZXdFci5JZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50QnVpbGRlckludGVybmFsRXhjZXB0aW9uKCJTb3VyY2UgezB9IGlzIHVuc3VwcG9ydGVkIGRvY3VtZW50IC0gY29udGFpbnMgcmVmZXJlbmNlIHRvIE5VTEwgaW1hZ2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weVJlbGF0ZWRQYXJ0c0ZvckNvbnRlbnRQYXJ0cyhPcGVuWG1sUGFydCBvbGRDb250ZW50UGFydCwgT3BlblhtbFBhcnQgbmV3Q29udGVudFBhcnQsCisgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gbmV3Q29udGVudCwgTGlzdDxJbWFnZURhdGE+IGltYWdlcykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlbGV2YW50RWxlbWVudHMgPSBuZXdDb250ZW50LkRlc2NlbmRhbnRzQW5kU2VsZigpCisgICAgICAgICAgICAgICAgLldoZXJlKGQgPT4gZC5OYW1lID09IFZNTC5pbWFnZWRhdGEgfHwgZC5OYW1lID09IFZNTC5maWxsIHx8IGQuTmFtZSA9PSBWTUwuc3Ryb2tlIHx8IGQuTmFtZSA9PSBBLmJsaXApCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgaW1hZ2VSZWZlcmVuY2UgaW4gcmVsZXZhbnRFbGVtZW50cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZEltYWdlKG9sZENvbnRlbnRQYXJ0LCBuZXdDb250ZW50UGFydCwgaW1hZ2VSZWZlcmVuY2UsIFIuZW1iZWQsIGltYWdlcyk7CisgICAgICAgICAgICAgICAgQ29weVJlbGF0ZWRJbWFnZShvbGRDb250ZW50UGFydCwgbmV3Q29udGVudFBhcnQsIGltYWdlUmVmZXJlbmNlLCBSLnBpY3QsIGltYWdlcyk7CisgICAgICAgICAgICAgICAgQ29weVJlbGF0ZWRJbWFnZShvbGRDb250ZW50UGFydCwgbmV3Q29udGVudFBhcnQsIGltYWdlUmVmZXJlbmNlLCBSLmlkLCBpbWFnZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBkaWFncmFtUmVmZXJlbmNlIGluIG5ld0NvbnRlbnQuRGVzY2VuZGFudHNBbmRTZWxmKCkuV2hlcmUoZCA9PiBkLk5hbWUgPT0gREdNLnJlbElkcyB8fCBkLk5hbWUgPT0gQS5yZWxJZHMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGRtIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IGRpYWdyYW1SZWZlcmVuY2UuQXR0cmlidXRlKFIuZG0pLlZhbHVlOworICAgICAgICAgICAgICAgIHZhciBpcHAgPSBuZXdDb250ZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdChwID0+IHAuUmVsYXRpb25zaGlwSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmIChpcHAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxQYXJ0IHRlbXBQYXJ0ID0gaXBwLk9wZW5YbWxQYXJ0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCB0ZW1wRXIgPSBuZXdDb250ZW50UGFydC5FeHRlcm5hbFJlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoZXIyID0+IGVyMi5JZCA9PSByZWxJZCk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBFciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIE9wZW5YbWxQYXJ0IG9sZFBhcnQgPSBvbGRDb250ZW50UGFydC5HZXRQYXJ0QnlJZChyZWxJZCk7CisgICAgICAgICAgICAgICAgT3BlblhtbFBhcnQgbmV3UGFydCA9IG5ld0NvbnRlbnRQYXJ0LkFkZE5ld1BhcnQ8RGlhZ3JhbURhdGFQYXJ0PigpOworICAgICAgICAgICAgICAgIG5ld1BhcnQuR2V0WERvY3VtZW50KCkuQWRkKG9sZFBhcnQuR2V0WERvY3VtZW50KCkuUm9vdCk7CisgICAgICAgICAgICAgICAgZGlhZ3JhbVJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5kbSkuVmFsdWUgPSBuZXdDb250ZW50UGFydC5HZXRJZE9mUGFydChuZXdQYXJ0KTsKKyAgICAgICAgICAgICAgICBBZGRSZWxhdGlvbnNoaXBzKG9sZFBhcnQsIG5ld1BhcnQsIG5ld1tdIHsgbmV3UGFydC5HZXRYRG9jdW1lbnQoKS5Sb290IH0pOworICAgICAgICAgICAgICAgIENvcHlSZWxhdGVkUGFydHNGb3JDb250ZW50UGFydHMob2xkUGFydCwgbmV3UGFydCwgbmV3W10geyBuZXdQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzKTsKKworICAgICAgICAgICAgICAgIC8vIGxvIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIHJlbElkID0gZGlhZ3JhbVJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5sbykuVmFsdWU7CisgICAgICAgICAgICAgICAgdmFyIGlwcDIgPSBuZXdDb250ZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdCh6ID0+IHouUmVsYXRpb25zaGlwSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmIChpcHAyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPcGVuWG1sUGFydCB0ZW1wUGFydCA9IGlwcDIuT3BlblhtbFBhcnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgRXh0ZXJuYWxSZWxhdGlvbnNoaXAgdGVtcEVyNCA9IG5ld0NvbnRlbnRQYXJ0LkV4dGVybmFsUmVsYXRpb25zaGlwcy5GaXJzdE9yRGVmYXVsdChlcjMgPT4gZXIzLklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcEVyNCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIG9sZFBhcnQgPSBvbGRDb250ZW50UGFydC5HZXRQYXJ0QnlJZChyZWxJZCk7CisgICAgICAgICAgICAgICAgbmV3UGFydCA9IG5ld0NvbnRlbnRQYXJ0LkFkZE5ld1BhcnQ8RGlhZ3JhbUxheW91dERlZmluaXRpb25QYXJ0PigpOworICAgICAgICAgICAgICAgIG5ld1BhcnQuR2V0WERvY3VtZW50KCkuQWRkKG9sZFBhcnQuR2V0WERvY3VtZW50KCkuUm9vdCk7CisgICAgICAgICAgICAgICAgZGlhZ3JhbVJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5sbykuVmFsdWUgPSBuZXdDb250ZW50UGFydC5HZXRJZE9mUGFydChuZXdQYXJ0KTsKKyAgICAgICAgICAgICAgICBBZGRSZWxhdGlvbnNoaXBzKG9sZFBhcnQsIG5ld1BhcnQsIG5ld1tdIHsgbmV3UGFydC5HZXRYRG9jdW1lbnQoKS5Sb290IH0pOworICAgICAgICAgICAgICAgIENvcHlSZWxhdGVkUGFydHNGb3JDb250ZW50UGFydHMob2xkUGFydCwgbmV3UGFydCwgbmV3W10geyBuZXdQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzKTsKKworICAgICAgICAgICAgICAgIC8vIHFzIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIHJlbElkID0gZGlhZ3JhbVJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5xcykuVmFsdWU7CisgICAgICAgICAgICAgICAgdmFyIGlwcDUgPSBuZXdDb250ZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdCh6ID0+IHouUmVsYXRpb25zaGlwSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmIChpcHA1ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPcGVuWG1sUGFydCB0ZW1wUGFydCA9IGlwcDUuT3BlblhtbFBhcnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEV4dGVybmFsUmVsYXRpb25zaGlwIHRlbXBFcjUgPSBuZXdDb250ZW50UGFydC5FeHRlcm5hbFJlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoeiA9PiB6LklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcEVyNSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIG9sZFBhcnQgPSBvbGRDb250ZW50UGFydC5HZXRQYXJ0QnlJZChyZWxJZCk7CisgICAgICAgICAgICAgICAgbmV3UGFydCA9IG5ld0NvbnRlbnRQYXJ0LkFkZE5ld1BhcnQ8RGlhZ3JhbVN0eWxlUGFydD4oKTsKKyAgICAgICAgICAgICAgICBuZXdQYXJ0LkdldFhEb2N1bWVudCgpLkFkZChvbGRQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QpOworICAgICAgICAgICAgICAgIGRpYWdyYW1SZWZlcmVuY2UuQXR0cmlidXRlKFIucXMpLlZhbHVlID0gbmV3Q29udGVudFBhcnQuR2V0SWRPZlBhcnQobmV3UGFydCk7CisgICAgICAgICAgICAgICAgQWRkUmVsYXRpb25zaGlwcyhvbGRQYXJ0LCBuZXdQYXJ0LCBuZXdbXSB7IG5ld1BhcnQuR2V0WERvY3VtZW50KCkuUm9vdCB9KTsKKyAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKG9sZFBhcnQsIG5ld1BhcnQsIG5ld1tdIHsgbmV3UGFydC5HZXRYRG9jdW1lbnQoKS5Sb290IH0sIGltYWdlcyk7CisKKyAgICAgICAgICAgICAgICAvLyBjcyBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICByZWxJZCA9IGRpYWdyYW1SZWZlcmVuY2UuQXR0cmlidXRlKFIuY3MpLlZhbHVlOworICAgICAgICAgICAgICAgIHZhciBpcHA2ID0gbmV3Q29udGVudFBhcnQuUGFydHMuRmlyc3RPckRlZmF1bHQoeiA9PiB6LlJlbGF0aW9uc2hpcElkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAoaXBwNiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT3BlblhtbFBhcnQgdGVtcFBhcnQgPSBpcHA2Lk9wZW5YbWxQYXJ0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCB0ZW1wRXI2ID0gbmV3Q29udGVudFBhcnQuRXh0ZXJuYWxSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KHogPT4gei5JZCA9PSByZWxJZCk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBFcjYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBvbGRQYXJ0ID0gb2xkQ29udGVudFBhcnQuR2V0UGFydEJ5SWQocmVsSWQpOworICAgICAgICAgICAgICAgIG5ld1BhcnQgPSBuZXdDb250ZW50UGFydC5BZGROZXdQYXJ0PERpYWdyYW1Db2xvcnNQYXJ0PigpOworICAgICAgICAgICAgICAgIG5ld1BhcnQuR2V0WERvY3VtZW50KCkuQWRkKG9sZFBhcnQuR2V0WERvY3VtZW50KCkuUm9vdCk7CisgICAgICAgICAgICAgICAgZGlhZ3JhbVJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5jcykuVmFsdWUgPSBuZXdDb250ZW50UGFydC5HZXRJZE9mUGFydChuZXdQYXJ0KTsKKyAgICAgICAgICAgICAgICBBZGRSZWxhdGlvbnNoaXBzKG9sZFBhcnQsIG5ld1BhcnQsIG5ld1tdIHsgbmV3UGFydC5HZXRYRG9jdW1lbnQoKS5Sb290IH0pOworICAgICAgICAgICAgICAgIENvcHlSZWxhdGVkUGFydHNGb3JDb250ZW50UGFydHMob2xkUGFydCwgbmV3UGFydCwgbmV3W10geyBuZXdQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgb2xlUmVmZXJlbmNlIGluIG5ld0NvbnRlbnQuRGVzY2VuZGFudHNBbmRTZWxmKE8uT0xFT2JqZWN0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcmVsSWQgPSAoc3RyaW5nKW9sZVJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5pZCk7CisKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBsb29rIHRvIHNlZSBpZiB0aGlzIHJlbElkIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIG5ldyBkb2N1bWVudC4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhvc2UgcGFydHMgdGhhdCBnZXQgcHJvY2Vzc2VkIHdpdGggYm90aCBvbGQgYW5kIG5ldyBpZHMsIHN1Y2ggYXMgdGhlIGNvbW1lbnRzCisgICAgICAgICAgICAgICAgLy8gcGFydC4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgcGFydHMgc3VjaCBhcyB0aGUgbWFpbiBkb2N1bWVudCBwYXJ0LCBidXQgdGhpcyBjb2RlIHdvbid0IG1hbGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgLy8gaW4gdGhhdCBjYXNlLgorICAgICAgICAgICAgICAgIHZhciBpcHAxID0gbmV3Q29udGVudFBhcnQuUGFydHMuRmlyc3RPckRlZmF1bHQocCA9PiBwLlJlbGF0aW9uc2hpcElkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAoaXBwMSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT3BlblhtbFBhcnQgdGVtcFBhcnQgPSBpcHAxLk9wZW5YbWxQYXJ0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCB0ZW1wRXIxID0gbmV3Q29udGVudFBhcnQuRXh0ZXJuYWxSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KHogPT4gei5JZCA9PSByZWxJZCk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBFcjEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICB2YXIgaXBwNCA9IG9sZENvbnRlbnRQYXJ0LlBhcnRzLkZpcnN0T3JEZWZhdWx0KHogPT4gei5SZWxhdGlvbnNoaXBJZCA9PSByZWxJZCk7CisgICAgICAgICAgICAgICAgaWYgKGlwcDQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxQYXJ0IG9sZFBhcnQgPSBvbGRDb250ZW50UGFydC5HZXRQYXJ0QnlJZChyZWxJZCk7CisgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxQYXJ0IG5ld1BhcnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkUGFydCBpcyBFbWJlZGRlZE9iamVjdFBhcnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBIZWFkZXJQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKEhlYWRlclBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEVtYmVkZGVkT2JqZWN0UGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBGb290ZXJQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKEZvb3RlclBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEVtYmVkZGVkT2JqZWN0UGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBNYWluRG9jdW1lbnRQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKE1haW5Eb2N1bWVudFBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEVtYmVkZGVkT2JqZWN0UGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBGb290bm90ZXNQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKEZvb3Rub3Rlc1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEVtYmVkZGVkT2JqZWN0UGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBFbmRub3Rlc1BhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoRW5kbm90ZXNQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFbWJlZGRlZE9iamVjdFBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgV29yZHByb2Nlc3NpbmdDb21tZW50c1BhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoV29yZHByb2Nlc3NpbmdDb21tZW50c1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEVtYmVkZGVkT2JqZWN0UGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvbGRQYXJ0IGlzIEVtYmVkZGVkUGFja2FnZVBhcnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBIZWFkZXJQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKEhlYWRlclBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEVtYmVkZGVkUGFja2FnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgRm9vdGVyUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChGb290ZXJQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFbWJlZGRlZFBhY2thZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIE1haW5Eb2N1bWVudFBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoTWFpbkRvY3VtZW50UGFydCluZXdDb250ZW50UGFydCkuQWRkRW1iZWRkZWRQYWNrYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBGb290bm90ZXNQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKEZvb3Rub3Rlc1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEVtYmVkZGVkUGFja2FnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgRW5kbm90ZXNQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKEVuZG5vdGVzUGFydCluZXdDb250ZW50UGFydCkuQWRkRW1iZWRkZWRQYWNrYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBXb3JkcHJvY2Vzc2luZ0NvbW1lbnRzUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChXb3JkcHJvY2Vzc2luZ0NvbW1lbnRzUGFydCluZXdDb250ZW50UGFydCkuQWRkRW1iZWRkZWRQYWNrYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBDaGFydFBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoQ2hhcnRQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFbWJlZGRlZFBhY2thZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gb2xkT2JqZWN0ID0gb2xkUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkKSkKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBuZXdPYmplY3QgPSBuZXdQYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs2NTUzNl07CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGJ5dGVDb3VudCA9IG9sZE9iamVjdC5SZWFkKGJ1ZmZlciwgMCwgNjU1MzYpKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09iamVjdC5Xcml0ZShidWZmZXIsIDAsIGJ5dGVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb2xlUmVmZXJlbmNlLkF0dHJpYnV0ZShSLmlkKS5WYWx1ZSA9IG5ld0NvbnRlbnRQYXJ0LkdldElkT2ZQYXJ0KG5ld1BhcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVsSWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxSZWxhdGlvbnNoaXAgZXIgPSBvbGRDb250ZW50UGFydC5HZXRFeHRlcm5hbFJlbGF0aW9uc2hpcChyZWxJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCBuZXdFciA9IG5ld0NvbnRlbnRQYXJ0LkFkZEV4dGVybmFsUmVsYXRpb25zaGlwKGVyLlJlbGF0aW9uc2hpcFR5cGUsIGVyLlVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvbGVSZWZlcmVuY2UuQXR0cmlidXRlKFIuaWQpLlZhbHVlID0gbmV3RXIuSWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGNoYXJ0UmVmZXJlbmNlIGluIG5ld0NvbnRlbnQuRGVzY2VuZGFudHNBbmRTZWxmKEMuY2hhcnQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IChzdHJpbmcpY2hhcnRSZWZlcmVuY2UuQXR0cmlidXRlKFIuaWQpOworICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShyZWxJZCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHZhciBpcHAyID0gbmV3Q29udGVudFBhcnQuUGFydHMuRmlyc3RPckRlZmF1bHQoeiA9PiB6LlJlbGF0aW9uc2hpcElkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAoaXBwMiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT3BlblhtbFBhcnQgdGVtcFBhcnQgPSBpcHAyLk9wZW5YbWxQYXJ0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCB0ZW1wRXIyID0gbmV3Q29udGVudFBhcnQuRXh0ZXJuYWxSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KHogPT4gei5JZCA9PSByZWxJZCk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBFcjIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICB2YXIgaXBwMyA9IG9sZENvbnRlbnRQYXJ0LlBhcnRzLkZpcnN0T3JEZWZhdWx0KHAgPT4gcC5SZWxhdGlvbnNoaXBJZCA9PSByZWxJZCk7CisgICAgICAgICAgICAgICAgaWYgKGlwcDMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgQ2hhcnRQYXJ0IG9sZFBhcnQgPSAoQ2hhcnRQYXJ0KWlwcDMuT3BlblhtbFBhcnQ7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IG9sZENoYXJ0ID0gb2xkUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBDaGFydFBhcnQgbmV3UGFydCA9IG5ld0NvbnRlbnRQYXJ0LkFkZE5ld1BhcnQ8Q2hhcnRQYXJ0PigpOworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBuZXdDaGFydCA9IG5ld1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgbmV3Q2hhcnQuQWRkKG9sZENoYXJ0LlJvb3QpOworICAgICAgICAgICAgICAgIGNoYXJ0UmVmZXJlbmNlLkF0dHJpYnV0ZShSLmlkKS5WYWx1ZSA9IG5ld0NvbnRlbnRQYXJ0LkdldElkT2ZQYXJ0KG5ld1BhcnQpOworICAgICAgICAgICAgICAgIENvcHlDaGFydE9iamVjdHMob2xkUGFydCwgbmV3UGFydCk7CisgICAgICAgICAgICAgICAgQ29weVJlbGF0ZWRQYXJ0c0ZvckNvbnRlbnRQYXJ0cyhvbGRQYXJ0LCBuZXdQYXJ0LCBuZXdbXSB7IG5ld0NoYXJ0LlJvb3QgfSwgaW1hZ2VzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgdXNlclNoYXBlIGluIG5ld0NvbnRlbnQuRGVzY2VuZGFudHNBbmRTZWxmKEMudXNlclNoYXBlcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHJlbElkID0gKHN0cmluZyl1c2VyU2hhcGUuQXR0cmlidXRlKFIuaWQpOworICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShyZWxJZCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgdmFyIGlwcDQgPSBuZXdDb250ZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdChwID0+IHAuUmVsYXRpb25zaGlwSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmIChpcHA0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPcGVuWG1sUGFydCB0ZW1wUGFydCA9IGlwcDQuT3BlblhtbFBhcnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEV4dGVybmFsUmVsYXRpb25zaGlwIHRlbXBFcjQgPSBuZXdDb250ZW50UGFydC5FeHRlcm5hbFJlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoeiA9PiB6LklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcEVyNCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIHZhciBpcHA1ID0gb2xkQ29udGVudFBhcnQuUGFydHMuRmlyc3RPckRlZmF1bHQocCA9PiBwLlJlbGF0aW9uc2hpcElkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAoaXBwNSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcnREcmF3aW5nUGFydCBvbGRQYXJ0ID0gKENoYXJ0RHJhd2luZ1BhcnQpaXBwNS5PcGVuWG1sUGFydDsKKyAgICAgICAgICAgICAgICAgICAgWERvY3VtZW50IG9sZFhEb2MgPSBvbGRQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBDaGFydERyYXdpbmdQYXJ0IG5ld1BhcnQgPSBuZXdDb250ZW50UGFydC5BZGROZXdQYXJ0PENoYXJ0RHJhd2luZ1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgICAgIFhEb2N1bWVudCBuZXdYRG9jID0gbmV3UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3WERvYy5BZGQob2xkWERvYy5Sb290KTsKKyAgICAgICAgICAgICAgICAgICAgdXNlclNoYXBlLkF0dHJpYnV0ZShSLmlkKS5WYWx1ZSA9IG5ld0NvbnRlbnRQYXJ0LkdldElkT2ZQYXJ0KG5ld1BhcnQpOworICAgICAgICAgICAgICAgICAgICBBZGRSZWxhdGlvbnNoaXBzKG9sZFBhcnQsIG5ld1BhcnQsIG5ld0NvbnRlbnQpOworICAgICAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKG9sZFBhcnQsIG5ld1BhcnQsIG5ld1tdIHsgbmV3WERvYy5Sb290IH0sIGltYWdlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb3B5Rm9udFRhYmxlKEZvbnRUYWJsZVBhcnQgb2xkRm9udFRhYmxlUGFydCwgRm9udFRhYmxlUGFydCBuZXdGb250VGFibGVQYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVsZXZhbnRFbGVtZW50cyA9IG9sZEZvbnRUYWJsZVBhcnQuR2V0WERvY3VtZW50KCkuRGVzY2VuZGFudHMoKS5XaGVyZShkID0+IGQuTmFtZSA9PSBXLmVtYmVkUmVndWxhciB8fAorICAgICAgICAgICAgICAgIGQuTmFtZSA9PSBXLmVtYmVkQm9sZCB8fCBkLk5hbWUgPT0gVy5lbWJlZEl0YWxpYyB8fCBkLk5hbWUgPT0gVy5lbWJlZEJvbGRJdGFsaWMpLlRvTGlzdCgpOworICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgZm9udFJlZmVyZW5jZSBpbiByZWxldmFudEVsZW1lbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IChzdHJpbmcpZm9udFJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5pZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHJlbElkKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICB2YXIgaXBwMSA9IG5ld0ZvbnRUYWJsZVBhcnQuUGFydHMuRmlyc3RPckRlZmF1bHQoeiA9PiB6LlJlbGF0aW9uc2hpcElkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAoaXBwMSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT3BlblhtbFBhcnQgdGVtcFBhcnQgPSBpcHAxLk9wZW5YbWxQYXJ0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCB0ZW1wRXIxID0gbmV3Rm9udFRhYmxlUGFydC5FeHRlcm5hbFJlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoeiA9PiB6LklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcEVyMSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIEZvbnRQYXJ0IG9sZFBhcnQgPSAoRm9udFBhcnQpb2xkRm9udFRhYmxlUGFydC5HZXRQYXJ0QnlJZChyZWxJZCk7CisgICAgICAgICAgICAgICAgRm9udFBhcnQgbmV3UGFydCA9IG5ld0ZvbnRUYWJsZVBhcnQuQWRkRm9udFBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgdmFyIFJlc291cmNlSUQgPSBuZXdGb250VGFibGVQYXJ0LkdldElkT2ZQYXJ0KG5ld1BhcnQpOworICAgICAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gb2xkRm9udCA9IG9sZFBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZCkpCisgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBuZXdGb250ID0gbmV3UGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLlJlYWRXcml0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZUNvdW50OworICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNjU1MzZdOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGJ5dGVDb3VudCA9IG9sZEZvbnQuUmVhZChidWZmZXIsIDAsIDY1NTM2KSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0ZvbnQuV3JpdGUoYnVmZmVyLCAwLCBieXRlQ291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb250UmVmZXJlbmNlLkF0dHJpYnV0ZShSLmlkKS5WYWx1ZSA9IFJlc291cmNlSUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvcHlDaGFydE9iamVjdHMoQ2hhcnRQYXJ0IG9sZENoYXJ0LCBDaGFydFBhcnQgbmV3Q2hhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGRhdGFSZWZlcmVuY2UgaW4gbmV3Q2hhcnQuR2V0WERvY3VtZW50KCkuRGVzY2VuZGFudHMoQy5leHRlcm5hbERhdGEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IGRhdGFSZWZlcmVuY2UuQXR0cmlidXRlKFIuaWQpLlZhbHVlOworCisgICAgICAgICAgICAgICAgdmFyIGlwcDEgPSBvbGRDaGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdCh6ID0+IHouUmVsYXRpb25zaGlwSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmIChpcHAxICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgb2xkUmVsYXRlZFBhcnQgPSBpcHAxLk9wZW5YbWxQYXJ0OworICAgICAgICAgICAgICAgICAgICBpZiAob2xkUmVsYXRlZFBhcnQgaXMgRW1iZWRkZWRQYWNrYWdlUGFydCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRW1iZWRkZWRQYWNrYWdlUGFydCBvbGRQYXJ0ID0gKEVtYmVkZGVkUGFja2FnZVBhcnQpaXBwMS5PcGVuWG1sUGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkZGVkUGFja2FnZVBhcnQgbmV3UGFydCA9IG5ld0NoYXJ0LkFkZEVtYmVkZGVkUGFja2FnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoU3RyZWFtIG9sZE9iamVjdCA9IG9sZFBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZCkpCisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoU3RyZWFtIG5ld09iamVjdCA9IG5ld1BhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5SZWFkV3JpdGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzY1NTM2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGJ5dGVDb3VudCA9IG9sZE9iamVjdC5SZWFkKGJ1ZmZlciwgMCwgNjU1MzYpKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPYmplY3QuV3JpdGUoYnVmZmVyLCAwLCBieXRlQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5pZCkuVmFsdWUgPSBuZXdDaGFydC5HZXRJZE9mUGFydChuZXdQYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvbGRSZWxhdGVkUGFydCBpcyBFbWJlZGRlZE9iamVjdFBhcnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkZGVkT2JqZWN0UGFydCBvbGRQYXJ0ID0gKEVtYmVkZGVkT2JqZWN0UGFydClpcHAxLk9wZW5YbWxQYXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbFR5cGUgPSBvbGRSZWxhdGVkUGFydC5SZWxhdGlvbnNoaXBUeXBlOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvblR5cGUgPSBvbGRSZWxhdGVkUGFydC5Db250ZW50VHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZCA9ICJSIiArIEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCkuUmVwbGFjZSgiLSIsICIiKS5TdWJzdHJpbmcoMCwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UGFydCA9IG5ld0NoYXJ0LkFkZEV4dGVuZGVkUGFydChyZWxUeXBlLCBjb25UeXBlLCAiLmJpbiIsIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gb2xkT2JqZWN0ID0gb2xkUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gbmV3T2JqZWN0ID0gbmV3UGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLlJlYWRXcml0ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNjU1MzZdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYnl0ZUNvdW50ID0gb2xkT2JqZWN0LlJlYWQoYnVmZmVyLCAwLCA2NTUzNikpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09iamVjdC5Xcml0ZShidWZmZXIsIDAsIGJ5dGVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmZXJlbmNlLkF0dHJpYnV0ZShSLmlkKS5WYWx1ZSA9IG5ld0NoYXJ0LkdldElkT2ZQYXJ0KG5ld1BhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsUmVsYXRpb25zaGlwIG9sZFJlbGF0aW9uc2hpcCA9IG9sZENoYXJ0LkdldEV4dGVybmFsUmVsYXRpb25zaGlwKHJlbElkKTsKKyAgICAgICAgICAgICAgICAgICAgR3VpZCBnID0gR3VpZC5OZXdHdWlkKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuZXdSaWQgPSAiUiIgKyBnLlRvU3RyaW5nKCkuUmVwbGFjZSgiLSIsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG9sZFJlbCA9IG9sZENoYXJ0LkV4dGVybmFsUmVsYXRpb25zaGlwcy5GaXJzdE9yRGVmYXVsdChoID0+IGguSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkUmVsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24oIkludGVybmFsIEVycm9yIDAwMDciKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q2hhcnQuQWRkRXh0ZXJuYWxSZWxhdGlvbnNoaXAob2xkUmVsLlJlbGF0aW9uc2hpcFR5cGUsIG9sZFJlbC5VcmksIG5ld1JpZCk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZlcmVuY2UuQXR0cmlidXRlKFIuaWQpLlZhbHVlID0gbmV3UmlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weVN0YXJ0aW5nUGFydHMoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBzb3VyY2VEb2N1bWVudCwgV29yZHByb2Nlc3NpbmdEb2N1bWVudCBuZXdEb2N1bWVudCwKKyAgICAgICAgICAgIExpc3Q8SW1hZ2VEYXRhPiBpbWFnZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEEgQ29yZSBGaWxlIFByb3BlcnRpZXMgcGFydCBkb2VzIG5vdCBoYXZlIGltcGxpY2l0IG9yIGV4cGxpY2l0IHJlbGF0aW9uc2hpcHMgdG8gb3RoZXIgcGFydHMuCisgICAgICAgICAgICBDb3JlRmlsZVByb3BlcnRpZXNQYXJ0IGNvcmVQYXJ0ID0gc291cmNlRG9jdW1lbnQuQ29yZUZpbGVQcm9wZXJ0aWVzUGFydDsKKyAgICAgICAgICAgIGlmIChjb3JlUGFydCAhPSBudWxsICYmIGNvcmVQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXdEb2N1bWVudC5BZGRDb3JlRmlsZVByb3BlcnRpZXNQYXJ0KCk7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IG5ld1hEb2MgPSBuZXdEb2N1bWVudC5Db3JlRmlsZVByb3BlcnRpZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIG5ld1hEb2MuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgIG5ld1hEb2MuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBzb3VyY2VYRG9jID0gY29yZVBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgbmV3WERvYy5BZGQoc291cmNlWERvYy5Sb290KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQW4gYXBwbGljYXRpb24gYXR0cmlidXRlcyBwYXJ0IGRvZXMgbm90IGhhdmUgaW1wbGljaXQgb3IgZXhwbGljaXQgcmVsYXRpb25zaGlwcyB0byBvdGhlciBwYXJ0cy4KKyAgICAgICAgICAgIEV4dGVuZGVkRmlsZVByb3BlcnRpZXNQYXJ0IGV4dFBhcnQgPSBzb3VyY2VEb2N1bWVudC5FeHRlbmRlZEZpbGVQcm9wZXJ0aWVzUGFydDsKKyAgICAgICAgICAgIGlmIChleHRQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT3BlblhtbFBhcnQgbmV3UGFydCA9IG5ld0RvY3VtZW50LkFkZEV4dGVuZGVkRmlsZVByb3BlcnRpZXNQYXJ0KCk7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IG5ld1hEb2MgPSBuZXdEb2N1bWVudC5FeHRlbmRlZEZpbGVQcm9wZXJ0aWVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBuZXdYRG9jLkRlY2xhcmF0aW9uLlN0YW5kYWxvbmUgPSAieWVzIjsKKyAgICAgICAgICAgICAgICBuZXdYRG9jLkRlY2xhcmF0aW9uLkVuY29kaW5nID0gIlVURi04IjsKKyAgICAgICAgICAgICAgICBuZXdYRG9jLkFkZChleHRQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBbiBjdXN0b20gZmlsZSBwcm9wZXJ0aWVzIHBhcnQgZG9lcyBub3QgaGF2ZSBpbXBsaWNpdCBvciBleHBsaWNpdCByZWxhdGlvbnNoaXBzIHRvIG90aGVyIHBhcnRzLgorICAgICAgICAgICAgQ3VzdG9tRmlsZVByb3BlcnRpZXNQYXJ0IGN1c3RvbVBhcnQgPSBzb3VyY2VEb2N1bWVudC5DdXN0b21GaWxlUHJvcGVydGllc1BhcnQ7CisgICAgICAgICAgICBpZiAoY3VzdG9tUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ld0RvY3VtZW50LkFkZEN1c3RvbUZpbGVQcm9wZXJ0aWVzUGFydCgpOworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBuZXdYRG9jID0gbmV3RG9jdW1lbnQuQ3VzdG9tRmlsZVByb3BlcnRpZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIG5ld1hEb2MuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgIG5ld1hEb2MuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgIG5ld1hEb2MuQWRkKGN1c3RvbVBhcnQuR2V0WERvY3VtZW50KCkuUm9vdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIERvY3VtZW50U2V0dGluZ3NQYXJ0IG9sZFNldHRpbmdzUGFydCA9IHNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRG9jdW1lbnRTZXR0aW5nc1BhcnQ7CisgICAgICAgICAgICBpZiAob2xkU2V0dGluZ3NQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRG9jdW1lbnRTZXR0aW5nc1BhcnQgbmV3U2V0dGluZ3NQYXJ0ID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5BZGROZXdQYXJ0PERvY3VtZW50U2V0dGluZ3NQYXJ0PigpOworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBzZXR0aW5nc1hEb2MgPSBvbGRTZXR0aW5nc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgQWRkUmVsYXRpb25zaGlwcyhvbGRTZXR0aW5nc1BhcnQsIG5ld1NldHRpbmdzUGFydCwgbmV3W10geyBzZXR0aW5nc1hEb2MuUm9vdCB9KTsKKyAgICAgICAgICAgICAgICBDb3B5Rm9vdG5vdGVzUGFydChzb3VyY2VEb2N1bWVudCwgbmV3RG9jdW1lbnQsIHNldHRpbmdzWERvYywgaW1hZ2VzKTsKKyAgICAgICAgICAgICAgICBDb3B5RW5kbm90ZXNQYXJ0KHNvdXJjZURvY3VtZW50LCBuZXdEb2N1bWVudCwgc2V0dGluZ3NYRG9jLCBpbWFnZXMpOworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBuZXdYRG9jID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Eb2N1bWVudFNldHRpbmdzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBuZXdYRG9jLkRlY2xhcmF0aW9uLlN0YW5kYWxvbmUgPSAieWVzIjsKKyAgICAgICAgICAgICAgICBuZXdYRG9jLkRlY2xhcmF0aW9uLkVuY29kaW5nID0gIlVURi04IjsKKyAgICAgICAgICAgICAgICBuZXdYRG9jLkFkZChzZXR0aW5nc1hEb2MuUm9vdCk7CisgICAgICAgICAgICAgICAgQ29weVJlbGF0ZWRQYXJ0c0ZvckNvbnRlbnRQYXJ0cyhvbGRTZXR0aW5nc1BhcnQsIG5ld1NldHRpbmdzUGFydCwgbmV3W10geyBuZXdYRG9jLlJvb3QgfSwgaW1hZ2VzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgV2ViU2V0dGluZ3NQYXJ0IG9sZFdlYlNldHRpbmdzUGFydCA9IHNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuV2ViU2V0dGluZ3NQYXJ0OworICAgICAgICAgICAgaWYgKG9sZFdlYlNldHRpbmdzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdlYlNldHRpbmdzUGFydCBuZXdXZWJTZXR0aW5nc1BhcnQgPSBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkFkZE5ld1BhcnQ8V2ViU2V0dGluZ3NQYXJ0PigpOworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBzZXR0aW5nc1hEb2MgPSBvbGRXZWJTZXR0aW5nc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgQWRkUmVsYXRpb25zaGlwcyhvbGRXZWJTZXR0aW5nc1BhcnQsIG5ld1dlYlNldHRpbmdzUGFydCwgbmV3W10geyBzZXR0aW5nc1hEb2MuUm9vdCB9KTsKKyAgICAgICAgICAgICAgICBYRG9jdW1lbnQgbmV3WERvYyA9IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuV2ViU2V0dGluZ3NQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIG5ld1hEb2MuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgIG5ld1hEb2MuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgIG5ld1hEb2MuQWRkKHNldHRpbmdzWERvYy5Sb290KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVGhlbWVQYXJ0IHRoZW1lUGFydCA9IHNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuVGhlbWVQYXJ0OworICAgICAgICAgICAgaWYgKHRoZW1lUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRoZW1lUGFydCBuZXdUaGVtZVBhcnQgPSBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkFkZE5ld1BhcnQ8VGhlbWVQYXJ0PigpOworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBuZXdYRG9jID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5UaGVtZVBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgbmV3WERvYy5EZWNsYXJhdGlvbi5TdGFuZGFsb25lID0gInllcyI7CisgICAgICAgICAgICAgICAgbmV3WERvYy5EZWNsYXJhdGlvbi5FbmNvZGluZyA9ICJVVEYtOCI7CisgICAgICAgICAgICAgICAgbmV3WERvYy5BZGQodGhlbWVQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QpOworICAgICAgICAgICAgICAgIENvcHlSZWxhdGVkUGFydHNGb3JDb250ZW50UGFydHModGhlbWVQYXJ0LCBuZXdUaGVtZVBhcnQsIG5ld1tdIHsgbmV3VGhlbWVQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgbmVlZGVkIHRvIGhhbmRsZSBHbG9zc2FyeURvY3VtZW50UGFydCBpbiB0aGUgZnV0dXJlLCB0aGVuCisgICAgICAgICAgICAvLyB0aGlzIGNvZGUgc2hvdWxkIGhhbmRsZSB0aGUgZm9sbG93aW5nIHBhcnRzOgorICAgICAgICAgICAgLy8gICBNYWluRG9jdW1lbnRQYXJ0Lkdsb3NzYXJ5RG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0CisgICAgICAgICAgICAvLyAgIE1haW5Eb2N1bWVudFBhcnQuR2xvc3NhcnlEb2N1bWVudFBhcnQuU3R5bGVzV2l0aEVmZmVjdHNQYXJ0CisKKyAgICAgICAgICAgIC8vIEEgU3R5bGUgRGVmaW5pdGlvbnMgcGFydCBzaGFsbCBub3QgaGF2ZSBpbXBsaWNpdCBvciBleHBsaWNpdCByZWxhdGlvbnNoaXBzIHRvIGFueSBvdGhlciBwYXJ0LgorICAgICAgICAgICAgU3R5bGVEZWZpbml0aW9uc1BhcnQgc3R5bGVzUGFydCA9IHNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQ7CisgICAgICAgICAgICBpZiAoc3R5bGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuQWRkTmV3UGFydDxTdHlsZURlZmluaXRpb25zUGFydD4oKTsKKyAgICAgICAgICAgICAgICBYRG9jdW1lbnQgbmV3WERvYyA9IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgbmV3WERvYy5EZWNsYXJhdGlvbi5TdGFuZGFsb25lID0gInllcyI7CisgICAgICAgICAgICAgICAgbmV3WERvYy5EZWNsYXJhdGlvbi5FbmNvZGluZyA9ICJVVEYtOCI7CisgICAgICAgICAgICAgICAgbmV3WERvYy5BZGQobmV3IFhFbGVtZW50KFcuc3R5bGVzLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInciLCBXLncpLAorICAgICAgICAgICAgICAgICAgICBzdHlsZXNQYXJ0LkdldFhEb2N1bWVudCgpLkRlc2NlbmRhbnRzKFcuZG9jRGVmYXVsdHMpKSk7CisgICAgICAgICAgICAgICAgTWVyZ2VTdHlsZXMoc291cmNlRG9jdW1lbnQsIG5ld0RvY3VtZW50LCBzdHlsZXNQYXJ0LkdldFhEb2N1bWVudCgpLCBuZXdYRG9jLCBFbnVtZXJhYmxlLkVtcHR5PFhFbGVtZW50PigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vLyBBIFN0eWxlc1dpdGhFZmZlY3RzIHBhcnQgc2hhbGwgbm90IGhhdmUgaW1wbGljaXQgb3IgZXhwbGljaXQgcmVsYXRpb25zaGlwcyB0byBhbnkgb3RoZXIgcGFydC4KKyAgICAgICAgICAgIC8vU3R5bGVzV2l0aEVmZmVjdHNQYXJ0IHN0eWxlc1dpdGhFZmZlY3RzUGFydCA9IHNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuU3R5bGVzV2l0aEVmZmVjdHNQYXJ0OworICAgICAgICAgICAgLy9pZiAoc3R5bGVzV2l0aEVmZmVjdHNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuQWRkTmV3UGFydDxTdHlsZXNXaXRoRWZmZWN0c1BhcnQ+KCk7CisgICAgICAgICAgICAvLyAgICBYRG9jdW1lbnQgbmV3WERvYyA9IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuU3R5bGVzV2l0aEVmZmVjdHNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgLy8gICAgbmV3WERvYy5EZWNsYXJhdGlvbi5TdGFuZGFsb25lID0gInllcyI7CisgICAgICAgICAgICAvLyAgICBuZXdYRG9jLkRlY2xhcmF0aW9uLkVuY29kaW5nID0gIlVURi04IjsKKyAgICAgICAgICAgIC8vICAgIG5ld1hEb2MuQWRkKHN0eWxlc1dpdGhFZmZlY3RzUGFydC5HZXRYRG9jdW1lbnQoKS5Sb290KTsKKyAgICAgICAgICAgIC8vfQorCisKKworICAgICAgICAgICAgLy8gTm90ZTogRG8gbm90IGNvcHkgdGhlIG51bWJlcmluZyBwYXJ0LiAgRm9yIGV2ZXJ5IHNvdXJjZSwgY3JlYXRlIG5ldyBudW1iZXJpbmcgZGVmaW5pdGlvbnMgZnJvbQorICAgICAgICAgICAgLy8gc2NyYXRjaC4KKyAgICAgICAgICAgIC8vTnVtYmVyaW5nRGVmaW5pdGlvbnNQYXJ0IG51bWJlcmluZ1BhcnQgPSBzb3VyY2VEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0Lk51bWJlcmluZ0RlZmluaXRpb25zUGFydDsKKyAgICAgICAgICAgIC8vaWYgKG51bWJlcmluZ1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5BZGROZXdQYXJ0PE51bWJlcmluZ0RlZmluaXRpb25zUGFydD4oKTsKKyAgICAgICAgICAgIC8vICAgIFhEb2N1bWVudCBuZXdYRG9jID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAvLyAgICBuZXdYRG9jLkRlY2xhcmF0aW9uLlN0YW5kYWxvbmUgPSAieWVzIjsKKyAgICAgICAgICAgIC8vICAgIG5ld1hEb2MuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgLy8gICAgbmV3WERvYy5BZGQobnVtYmVyaW5nUGFydC5HZXRYRG9jdW1lbnQoKS5Sb290KTsKKyAgICAgICAgICAgIC8vICAgIG5ld1hEb2MuRGVzY2VuZGFudHMoVy5udW1JZE1hY0F0Q2xlYW51cCkuUmVtb3ZlKCk7CisgICAgICAgICAgICAvL30KKworICAgICAgICAgICAgLy8gQSBGb250IFRhYmxlIHBhcnQgc2hhbGwgbm90IGhhdmUgYW55IGltcGxpY2l0IG9yIGV4cGxpY2l0IHJlbGF0aW9uc2hpcHMgdG8gYW55IG90aGVyIHBhcnQuCisgICAgICAgICAgICBGb250VGFibGVQYXJ0IGZvbnRUYWJsZVBhcnQgPSBzb3VyY2VEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkZvbnRUYWJsZVBhcnQ7CisgICAgICAgICAgICBpZiAoZm9udFRhYmxlUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuQWRkTmV3UGFydDxGb250VGFibGVQYXJ0PigpOworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBuZXdYRG9jID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Gb250VGFibGVQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIG5ld1hEb2MuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgIG5ld1hEb2MuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgIENvcHlGb250VGFibGUoc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Gb250VGFibGVQYXJ0LCBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkZvbnRUYWJsZVBhcnQpOworICAgICAgICAgICAgICAgIG5ld1hEb2MuQWRkKGZvbnRUYWJsZVBhcnQuR2V0WERvY3VtZW50KCkuUm9vdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvcHlGb290bm90ZXNQYXJ0KFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgbmV3RG9jdW1lbnQsCisgICAgICAgICAgICBYRG9jdW1lbnQgc2V0dGluZ3NYRG9jLCBMaXN0PEltYWdlRGF0YT4gaW1hZ2VzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbnVtYmVyID0gMDsKKyAgICAgICAgICAgIFhEb2N1bWVudCBvbGRGb290bm90ZXMgPSBudWxsOworICAgICAgICAgICAgWERvY3VtZW50IG5ld0Zvb3Rub3RlcyA9IG51bGw7CisgICAgICAgICAgICBYRWxlbWVudCBmb290bm90ZVByID0gc2V0dGluZ3NYRG9jLlJvb3QuRWxlbWVudChXLmZvb3Rub3RlUHIpOworICAgICAgICAgICAgaWYgKGZvb3Rub3RlUHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBmb290bm90ZSBpbiBmb290bm90ZVByLkVsZW1lbnRzKFcuZm9vdG5vdGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChvbGRGb290bm90ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgb2xkRm9vdG5vdGVzID0gc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIGlmIChuZXdGb290bm90ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9vdG5vdGVzID0gbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9vdG5vdGVzLkRlY2xhcmF0aW9uLlN0YW5kYWxvbmUgPSAieWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvb3Rub3Rlcy5EZWNsYXJhdGlvbi5FbmNvZGluZyA9ICJVVEYtOCI7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWRzID0gbmV3Rm9vdG5vdGVzLlJvb3QuRWxlbWVudHMoVy5mb290bm90ZSkuU2VsZWN0KGYgPT4gKGludClmLkF0dHJpYnV0ZShXLmlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRzLkFueSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciA9IGlkcy5NYXgoKSArIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkFkZE5ld1BhcnQ8Rm9vdG5vdGVzUGFydD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvb3Rub3RlcyA9IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvb3Rub3Rlcy5EZWNsYXJhdGlvbi5TdGFuZGFsb25lID0gInllcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb290bm90ZXMuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9vdG5vdGVzLkFkZChuZXcgWEVsZW1lbnQoVy5mb290bm90ZXMsIE5hbWVzcGFjZUF0dHJpYnV0ZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJpbmcgaWQgPSAoc3RyaW5nKWZvb3Rub3RlLkF0dHJpYnV0ZShXLmlkKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gb2xkRm9vdG5vdGVzLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuZm9vdG5vdGUpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShwID0+ICgoc3RyaW5nKXAuQXR0cmlidXRlKFcuaWQpKSA9PSBpZCkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld0VsZW1lbnQgPSBuZXcgWEVsZW1lbnQoZWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgYWRkcyB0aGUgZm9vdG5vdGUgaW50byB0aGUgbmV3IHNldHRpbmdzIHBhcnQKKyAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5BdHRyaWJ1dGUoVy5pZCkuVmFsdWUgPSBudW1iZXIuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Rm9vdG5vdGVzLlJvb3QuQWRkKG5ld0VsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBmb290bm90ZS5BdHRyaWJ1dGUoVy5pZCkuVmFsdWUgPSBudW1iZXIuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb3B5RW5kbm90ZXNQYXJ0KFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgbmV3RG9jdW1lbnQsCisgICAgICAgICAgICBYRG9jdW1lbnQgc2V0dGluZ3NYRG9jLCBMaXN0PEltYWdlRGF0YT4gaW1hZ2VzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbnVtYmVyID0gMDsKKyAgICAgICAgICAgIFhEb2N1bWVudCBvbGRFbmRub3RlcyA9IG51bGw7CisgICAgICAgICAgICBYRG9jdW1lbnQgbmV3RW5kbm90ZXMgPSBudWxsOworICAgICAgICAgICAgWEVsZW1lbnQgZW5kbm90ZVByID0gc2V0dGluZ3NYRG9jLlJvb3QuRWxlbWVudChXLmVuZG5vdGVQcik7CisgICAgICAgICAgICBpZiAoZW5kbm90ZVByID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgZW5kbm90ZSBpbiBlbmRub3RlUHIuRWxlbWVudHMoVy5lbmRub3RlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAob2xkRW5kbm90ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgb2xkRW5kbm90ZXMgPSBzb3VyY2VEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3RW5kbm90ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbmRub3RlcyA9IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW5kbm90ZXMuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW5kbm90ZXMuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IG5ld0VuZG5vdGVzLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5lbmRub3RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZiA9PiAoaW50KWYuQXR0cmlidXRlKFcuaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHMuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyID0gaWRzLk1heCgpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuQWRkTmV3UGFydDxFbmRub3Rlc1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbmRub3RlcyA9IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW5kbm90ZXMuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW5kbm90ZXMuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW5kbm90ZXMuQWRkKG5ldyBYRWxlbWVudChXLmVuZG5vdGVzLCBOYW1lc3BhY2VBdHRyaWJ1dGVzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyaW5nIGlkID0gKHN0cmluZyllbmRub3RlLkF0dHJpYnV0ZShXLmlkKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gb2xkRW5kbm90ZXMuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5lbmRub3RlKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUocCA9PiAoKHN0cmluZylwLkF0dHJpYnV0ZShXLmlkKSkgPT0gaWQpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdFbGVtZW50ID0gbmV3IFhFbGVtZW50KGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LkF0dHJpYnV0ZShXLmlkKS5WYWx1ZSA9IG51bWJlci5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBuZXdFbmRub3Rlcy5Sb290LkFkZChuZXdFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgZW5kbm90ZS5BdHRyaWJ1dGUoVy5pZCkuVmFsdWUgPSBudW1iZXIuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEZpeFJhbmdlcyhYRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIElFbnVtZXJhYmxlPFhFbGVtZW50PiBuZXdDb250ZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGaXhSYW5nZShzb3VyY2VEb2N1bWVudCwKKyAgICAgICAgICAgICAgICBuZXdDb250ZW50LAorICAgICAgICAgICAgICAgIFcuY29tbWVudFJhbmdlU3RhcnQsCisgICAgICAgICAgICAgICAgVy5jb21tZW50UmFuZ2VFbmQsCisgICAgICAgICAgICAgICAgVy5pZCwKKyAgICAgICAgICAgICAgICBXLmNvbW1lbnRSZWZlcmVuY2UpOworICAgICAgICAgICAgRml4UmFuZ2Uoc291cmNlRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgbmV3Q29udGVudCwKKyAgICAgICAgICAgICAgICBXLmJvb2ttYXJrU3RhcnQsCisgICAgICAgICAgICAgICAgVy5ib29rbWFya0VuZCwKKyAgICAgICAgICAgICAgICBXLmlkLAorICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgRml4UmFuZ2Uoc291cmNlRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgbmV3Q29udGVudCwKKyAgICAgICAgICAgICAgICBXLnBlcm1TdGFydCwKKyAgICAgICAgICAgICAgICBXLnBlcm1FbmQsCisgICAgICAgICAgICAgICAgVy5pZCwKKyAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIEZpeFJhbmdlKHNvdXJjZURvY3VtZW50LAorICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQsCisgICAgICAgICAgICAgICAgVy5tb3ZlRnJvbVJhbmdlU3RhcnQsCisgICAgICAgICAgICAgICAgVy5tb3ZlRnJvbVJhbmdlRW5kLAorICAgICAgICAgICAgICAgIFcuaWQsCisgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICBGaXhSYW5nZShzb3VyY2VEb2N1bWVudCwKKyAgICAgICAgICAgICAgICBuZXdDb250ZW50LAorICAgICAgICAgICAgICAgIFcubW92ZVRvUmFuZ2VTdGFydCwKKyAgICAgICAgICAgICAgICBXLm1vdmVUb1JhbmdlRW5kLAorICAgICAgICAgICAgICAgIFcuaWQsCisgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICBEZWxldGVVbm1hdGNoZWRSYW5nZShzb3VyY2VEb2N1bWVudCwKKyAgICAgICAgICAgICAgICBuZXdDb250ZW50LAorICAgICAgICAgICAgICAgIFcubW92ZUZyb21SYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgIFcubW92ZUZyb21SYW5nZUVuZCwKKyAgICAgICAgICAgICAgICBXLm1vdmVUb1JhbmdlU3RhcnQsCisgICAgICAgICAgICAgICAgVy5uYW1lLAorICAgICAgICAgICAgICAgIFcuaWQpOworICAgICAgICAgICAgRGVsZXRlVW5tYXRjaGVkUmFuZ2Uoc291cmNlRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgbmV3Q29udGVudCwKKyAgICAgICAgICAgICAgICBXLm1vdmVUb1JhbmdlU3RhcnQsCisgICAgICAgICAgICAgICAgVy5tb3ZlVG9SYW5nZUVuZCwKKyAgICAgICAgICAgICAgICBXLm1vdmVGcm9tUmFuZ2VTdGFydCwKKyAgICAgICAgICAgICAgICBXLm5hbWUsCisgICAgICAgICAgICAgICAgVy5pZCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZEF0QmVnaW5uaW5nKElFbnVtZXJhYmxlPFhFbGVtZW50PiBuZXdDb250ZW50LCBYRWxlbWVudCBjb250ZW50VG9BZGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChuZXdDb250ZW50LkZpcnN0KCkuRWxlbWVudChXLnBQcikgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBuZXdDb250ZW50LkZpcnN0KCkuRWxlbWVudChXLnBQcikuQWRkQWZ0ZXJTZWxmKGNvbnRlbnRUb0FkZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmV3Q29udGVudC5GaXJzdCgpLkFkZEZpcnN0KG5ldyBYRWxlbWVudChjb250ZW50VG9BZGQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkQXRFbmQoSUVudW1lcmFibGU8WEVsZW1lbnQ+IG5ld0NvbnRlbnQsIFhFbGVtZW50IGNvbnRlbnRUb0FkZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnQuTGFzdCgpLkVsZW1lbnQoVy5wUHIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgbmV3Q29udGVudC5MYXN0KCkuRWxlbWVudChXLnBQcikuQWRkQWZ0ZXJTZWxmKG5ldyBYRWxlbWVudChjb250ZW50VG9BZGQpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuZXdDb250ZW50Lkxhc3QoKS5BZGQobmV3IFhFbGVtZW50KGNvbnRlbnRUb0FkZCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIHNldCBvZiBwYXJhZ3JhcGhzIGZyb20gc291cmNlRG9jdW1lbnQgZG9uJ3QgaGF2ZSBhIGNvbXBsZXRlIHN0YXJ0L2VuZCBmb3IgYm9va21hcmtzLAorICAgICAgICAvLyBjb21tZW50cywgZXRjLiwgdGhlbiB0aGlzIGFkZHMgdGhlbSB0byB0aGUgcGFyYWdyYXBoLiAgTm90ZSB0aGF0IHRoaXMgYWRkcyB0aGVtIHRvCisgICAgICAgIC8vIHNvdXJjZURvY3VtZW50LCBhbmQgaXMgaW1wdXJlLgorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEZpeFJhbmdlKFhEb2N1bWVudCBzb3VyY2VEb2N1bWVudCwgSUVudW1lcmFibGU8WEVsZW1lbnQ+IG5ld0NvbnRlbnQsCisgICAgICAgICAgICBYTmFtZSBzdGFydEVsZW1lbnQsIFhOYW1lIGVuZEVsZW1lbnQsIFhOYW1lIGlkQXR0cmlidXRlLCBYTmFtZSByZWZFbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBzdGFydCBpbiBuZXdDb250ZW50LkRlc2NlbmRhbnRzQW5kU2VsZihzdGFydEVsZW1lbnQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyByYW5nZUlkID0gc3RhcnQuQXR0cmlidXRlKGlkQXR0cmlidXRlKS5WYWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudAorICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNBbmRTZWxmKGVuZEVsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IGUuQXR0cmlidXRlKGlkQXR0cmlidXRlKS5WYWx1ZSA9PSByYW5nZUlkKQorICAgICAgICAgICAgICAgICAgICAuQ291bnQoKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgZW5kID0gc291cmNlRG9jdW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cyhlbmRFbGVtZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKG8gPT4gby5BdHRyaWJ1dGUoaWRBdHRyaWJ1dGUpLlZhbHVlID09IHJhbmdlSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBZGRBdEVuZChuZXdDb250ZW50LCBuZXcgWEVsZW1lbnQoZW5kKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmRWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld1JlZiA9IG5ldyBYRWxlbWVudChyZWZFbGVtZW50LCBuZXcgWEF0dHJpYnV0ZShpZEF0dHJpYnV0ZSwgcmFuZ2VJZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEF0RW5kKG5ld0NvbnRlbnQsIG5ldyBYRWxlbWVudChuZXdSZWYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGVuZCBpbiBuZXdDb250ZW50LkVsZW1lbnRzKGVuZEVsZW1lbnQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyByYW5nZUlkID0gZW5kLkF0dHJpYnV0ZShpZEF0dHJpYnV0ZSkuVmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzQW5kU2VsZihzdGFydEVsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShzID0+IHMuQXR0cmlidXRlKGlkQXR0cmlidXRlKS5WYWx1ZSA9PSByYW5nZUlkKQorICAgICAgICAgICAgICAgICAgICAuQ291bnQoKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgc3RhcnQgPSBzb3VyY2VEb2N1bWVudAorICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKHN0YXJ0RWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShvID0+IG8uQXR0cmlidXRlKGlkQXR0cmlidXRlKS5WYWx1ZSA9PSByYW5nZUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgQWRkQXRCZWdpbm5pbmcobmV3Q29udGVudCwgbmV3IFhFbGVtZW50KHN0YXJ0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBEZWxldGVVbm1hdGNoZWRSYW5nZShYRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIElFbnVtZXJhYmxlPFhFbGVtZW50PiBuZXdDb250ZW50LAorICAgICAgICAgICAgWE5hbWUgc3RhcnRFbGVtZW50LCBYTmFtZSBlbmRFbGVtZW50LCBYTmFtZSBtYXRjaFRvLCBYTmFtZSBtYXRjaEF0dHIsIFhOYW1lIGlkQXR0cikKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxzdHJpbmc+IGRlbGV0ZUxpc3QgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBzdGFydCBpbiBuZXdDb250ZW50LkVsZW1lbnRzKHN0YXJ0RWxlbWVudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGlkID0gc3RhcnQuQXR0cmlidXRlKG1hdGNoQXR0cikuVmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKCFuZXdDb250ZW50LkVsZW1lbnRzKG1hdGNoVG8pLldoZXJlKG4gPT4gbi5BdHRyaWJ1dGUobWF0Y2hBdHRyKS5WYWx1ZSA9PSBpZCkuQW55KCkpCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUxpc3QuQWRkKHN0YXJ0LkF0dHJpYnV0ZShpZEF0dHIpLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBpdGVtIGluIGRlbGV0ZUxpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3Q29udGVudC5FbGVtZW50cyhzdGFydEVsZW1lbnQpLldoZXJlKG4gPT4gbi5BdHRyaWJ1dGUoaWRBdHRyKS5WYWx1ZSA9PSBpdGVtKS5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBuZXdDb250ZW50LkVsZW1lbnRzKGVuZEVsZW1lbnQpLldoZXJlKG4gPT4gbi5BdHRyaWJ1dGUoaWRBdHRyKS5WYWx1ZSA9PSBpdGVtKS5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBuZXdDb250ZW50LldoZXJlKHAgPT4gcC5OYW1lID09IHN0YXJ0RWxlbWVudCAmJiBwLkF0dHJpYnV0ZShpZEF0dHIpLlZhbHVlID09IGl0ZW0pLlJlbW92ZSgpOworICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQuV2hlcmUocCA9PiBwLk5hbWUgPT0gZW5kRWxlbWVudCAmJiBwLkF0dHJpYnV0ZShpZEF0dHIpLlZhbHVlID09IGl0ZW0pLlJlbW92ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb3B5Rm9vdG5vdGVzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgbmV3RG9jdW1lbnQsCisgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gbmV3Q29udGVudCwgTGlzdDxJbWFnZURhdGE+IGltYWdlcykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG51bWJlciA9IDA7CisgICAgICAgICAgICBYRG9jdW1lbnQgb2xkRm9vdG5vdGVzID0gbnVsbDsKKyAgICAgICAgICAgIFhEb2N1bWVudCBuZXdGb290bm90ZXMgPSBudWxsOworICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgZm9vdG5vdGUgaW4gbmV3Q29udGVudC5EZXNjZW5kYW50c0FuZFNlbGYoVy5mb290bm90ZVJlZmVyZW5jZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG9sZEZvb3Rub3RlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBvbGRGb290bm90ZXMgPSBzb3VyY2VEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKG5ld0Zvb3Rub3RlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb290bm90ZXMgPSBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWRzID0gbmV3Rm9vdG5vdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5mb290bm90ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGYgPT4gKGludClmLkF0dHJpYnV0ZShXLmlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRzLkFueSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciA9IGlkcy5NYXgoKSArIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkFkZE5ld1BhcnQ8Rm9vdG5vdGVzUGFydD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvb3Rub3RlcyA9IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvb3Rub3Rlcy5EZWNsYXJhdGlvbi5TdGFuZGFsb25lID0gInllcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb290bm90ZXMuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9vdG5vdGVzLkFkZChuZXcgWEVsZW1lbnQoVy5mb290bm90ZXMsIE5hbWVzcGFjZUF0dHJpYnV0ZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJpbmcgaWQgPSAoc3RyaW5nKWZvb3Rub3RlLkF0dHJpYnV0ZShXLmlkKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gb2xkRm9vdG5vdGVzCisgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cygpCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmZvb3Rub3RlKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUocCA9PiAoKHN0cmluZylwLkF0dHJpYnV0ZShXLmlkKSkgPT0gaWQpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdFbGVtZW50ID0gbmV3IFhFbGVtZW50KGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LkF0dHJpYnV0ZShXLmlkKS5WYWx1ZSA9IG51bWJlci5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBuZXdGb290bm90ZXMuUm9vdC5BZGQobmV3RWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIGZvb3Rub3RlLkF0dHJpYnV0ZShXLmlkKS5WYWx1ZSA9IG51bWJlci5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBudW1iZXIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0ICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZGRSZWxhdGlvbnNoaXBzKHNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydCwKKyAgICAgICAgICAgICAgICAgICAgbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LAorICAgICAgICAgICAgICAgICAgICBuZXdbXSB7IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKS5Sb290IH0pOworICAgICAgICAgICAgICAgIENvcHlSZWxhdGVkUGFydHNGb3JDb250ZW50UGFydHMoc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LAorICAgICAgICAgICAgICAgICAgICBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQsCisgICAgICAgICAgICAgICAgICAgIG5ld1tdIHsgbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weUVuZG5vdGVzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgbmV3RG9jdW1lbnQsCisgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gbmV3Q29udGVudCwgTGlzdDxJbWFnZURhdGE+IGltYWdlcykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG51bWJlciA9IDA7CisgICAgICAgICAgICBYRG9jdW1lbnQgb2xkRW5kbm90ZXMgPSBudWxsOworICAgICAgICAgICAgWERvY3VtZW50IG5ld0VuZG5vdGVzID0gbnVsbDsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGVuZG5vdGUgaW4gbmV3Q29udGVudC5EZXNjZW5kYW50c0FuZFNlbGYoVy5lbmRub3RlUmVmZXJlbmNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAob2xkRW5kbm90ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgb2xkRW5kbm90ZXMgPSBzb3VyY2VEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3RW5kbm90ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbmRub3RlcyA9IG5ld0RvY3VtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk1haW5Eb2N1bWVudFBhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRW5kbm90ZXNQYXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IG5ld0VuZG5vdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5lbmRub3RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZiA9PiAoaW50KWYuQXR0cmlidXRlKFcuaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHMuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyID0gaWRzLk1heCgpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuQWRkTmV3UGFydDxFbmRub3Rlc1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbmRub3RlcyA9IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW5kbm90ZXMuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW5kbm90ZXMuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW5kbm90ZXMuQWRkKG5ldyBYRWxlbWVudChXLmVuZG5vdGVzLCBOYW1lc3BhY2VBdHRyaWJ1dGVzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyaW5nIGlkID0gKHN0cmluZyllbmRub3RlLkF0dHJpYnV0ZShXLmlkKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gb2xkRW5kbm90ZXMKKyAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuZW5kbm90ZSkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKHAgPT4gKChzdHJpbmcpcC5BdHRyaWJ1dGUoVy5pZCkpID09IGlkKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3QoKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdFbGVtZW50ID0gbmV3IFhFbGVtZW50KGVsZW1lbnQpOworICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuQXR0cmlidXRlKFcuaWQpLlZhbHVlID0gbnVtYmVyLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgbmV3RW5kbm90ZXMuUm9vdC5BZGQobmV3RWxlbWVudCk7CisgICAgICAgICAgICAgICAgZW5kbm90ZS5BdHRyaWJ1dGUoVy5pZCkuVmFsdWUgPSBudW1iZXIuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBudW1iZXIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzb3VyY2VEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgbmV3RG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZGRSZWxhdGlvbnNoaXBzKHNvdXJjZURvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LAorICAgICAgICAgICAgICAgICAgICBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCwKKyAgICAgICAgICAgICAgICAgICAgbmV3W10geyBuZXdEb2N1bWVudC5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKS5Sb290IH0pOworICAgICAgICAgICAgICAgIENvcHlSZWxhdGVkUGFydHNGb3JDb250ZW50UGFydHMoc291cmNlRG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQsCisgICAgICAgICAgICAgICAgICAgIG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LAorICAgICAgICAgICAgICAgICAgICBuZXdbXSB7IG5ld0RvY3VtZW50Lk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEdlbmVyYWwgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIGltYWdlcyB0aGF0IHRyaWVzIHRvIHVzZSBhbiBleGlzdGluZyBpbWFnZSBpZiB0aGV5IGFyZSB0aGUgc2FtZQorICAgICAgICBwcml2YXRlIHN0YXRpYyBJbWFnZURhdGEgTWFuYWdlSW1hZ2VDb3B5KEltYWdlUGFydCBvbGRJbWFnZSwgT3BlblhtbFBhcnQgbmV3Q29udGVudFBhcnQsIExpc3Q8SW1hZ2VEYXRhPiBpbWFnZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEltYWdlRGF0YSBvbGRJbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKG9sZEltYWdlKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKEltYWdlRGF0YSBpdGVtIGluIGltYWdlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgIT0gaXRlbS5JbWFnZVBhcnQpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChpdGVtLkNvbXBhcmUob2xkSW1hZ2VEYXRhKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbWFnZXMuQWRkKG9sZEltYWdlRGF0YSk7CisgICAgICAgICAgICByZXR1cm4gb2xkSW1hZ2VEYXRhOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEF0dHJpYnV0ZVtdIE5hbWVzcGFjZUF0dHJpYnV0ZXMgPQorICAgICAgICB7CisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgIndwYyIsIFdQQy53cGMpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJtYyIsIE1DLm1jKSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAibyIsIE8ubyksCisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInIiLCBSLnIpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJtIiwgTS5tKSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidiIsIFZNTC52bWwpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3cDE0IiwgV1AxNC53cDE0KSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAid3AiLCBXUC53cCksCisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgIncxMCIsIFcxMC53MTApLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3IiwgVy53KSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidzE0IiwgVzE0LncxNCksCisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgIndwZyIsIFdQRy53cGcpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3cGkiLCBXUEkud3BpKSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAid25lIiwgV05FLnduZSksCisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgIndwcyIsIFdQUy53cHMpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTUMuSWdub3JhYmxlLCAidzE0IHdwMTQiKSwKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgRG9jdW1lbnRCdWlsZGVyRXhjZXB0aW9uIDogRXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgRG9jdW1lbnRCdWlsZGVyRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKSA6IGJhc2UobWVzc2FnZSkgeyB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIERvY3VtZW50QnVpbGRlckludGVybmFsRXhjZXB0aW9uIDogRXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgRG9jdW1lbnRCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpIDogYmFzZShtZXNzYWdlKSB7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9FeGNlbEZvcm11bGEuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9FeGNlbEZvcm11bGEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1NzA1ZQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzL0V4Y2VsRm9ybXVsYS5jcwpAQCAtMCwwICsxLDgzMCBAQAor77u/LyogY3JlYXRlZCBvbiA5LzgvMjAxMiA5OjI4OjE0IEFNIGZyb20gcGVnIGdlbmVyYXRvciBWMS4wIHVzaW5nICdFeGNlbEZvcm11bGEudHh0JyBhcyBpbnB1dCovCisKK3VzaW5nIFBlZy5CYXNlOwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRleHQ7CituYW1lc3BhY2UgRXhjZWxGb3JtdWxhCit7CisgICAgICAKKyAgICAgIGVudW0gRUV4Y2VsRm9ybXVsYXtGb3JtdWxhPSAxLCBFeHByZXNzaW9uPSAyLCBJbmZpeFRlcm1zPSAzLCBQcmVBbmRQb3N0VGVybT0gNCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRlcm09IDUsIFJlZkluZml4VGVybXM9IDYsIFJlZlRlcm09IDcsIENvbnN0YW50PSA4LCBSZWZDb25zdGFudD0gOSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29uc3RhbnQ9IDEwLCBMb2dpY2FsQ29uc3RhbnQ9IDExLCBOdW1lcmljYWxDb25zdGFudD0gMTIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduaWZpY2FuZFBhcnQ9IDEzLCBXaG9sZU51bWJlclBhcnQ9IDE0LCBGcmFjdGlvbmFsUGFydD0gMTUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBvbmVudFBhcnQ9IDE2LCBTdHJpbmdDb25zdGFudD0gMTcsIFN0cmluZ0NoYXJhY3Rlcj0gMTgsIEhpZ2hDaGFyYWN0ZXI9IDE5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlDb25zdGFudD0gMjAsIENvbnN0YW50TGlzdFJvd3M9IDIxLCBDb25zdGFudExpc3RSb3c9IDIyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW5maXhPcGVyYXRvcj0gMjMsIFZhbHVlSW5maXhPcGVyYXRvcj0gMjQsIFJlZkluZml4T3BlcmF0b3I9IDI1LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pb25PcGVyYXRvcj0gMjYsIEludGVyc2VjdGlvbk9wZXJhdG9yPSAyNywgUmFuZ2VPcGVyYXRvcj0gMjgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBQb3N0Zml4T3BlcmF0b3I9IDI5LCBQcmVmaXhPcGVyYXRvcj0gMzAsIENlbGxSZWZlcmVuY2U9IDMxLCBMb2NhbENlbGxSZWZlcmVuY2U9IDMyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxDZWxsUmVmZXJlbmNlPSAzMywgQm9va1ByZWZpeD0gMzQsIEJhbmdSZWZlcmVuY2U9IDM1LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlZXRSYW5nZVJlZmVyZW5jZT0gMzYsIFNpbmdsZVNoZWV0UHJlZml4PSAzNywgU2luZ2xlU2hlZXRSZWZlcmVuY2U9IDM4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlU2hlZXRBcmVhPSAzOSwgU2luZ2xlU2hlZXQ9IDQwLCBTaGVldFJhbmdlPSA0MSwgV29ya2Jvb2tJbmRleD0gNDIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBTaGVldE5hbWU9IDQzLCBTaGVldE5hbWVDaGFyYWN0ZXI9IDQ0LCBTaGVldE5hbWVTcGVjaWFsPSA0NSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNoZWV0TmFtZUJhc2VDaGFyYWN0ZXI9IDQ2LCBBMVJlZmVyZW5jZT0gNDcsIEExQ2VsbD0gNDgsIEExQXJlYT0gNDksIAorICAgICAgICAgICAgICAgICAgICAgICAgICBBMUNvbHVtbj0gNTAsIEExQWJzb2x1dGVDb2x1bW49IDUxLCBBMVJlbGF0aXZlQ29sdW1uPSA1MiwgQTFSb3c9IDUzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQTFBYnNvbHV0ZVJvdz0gNTQsIEExUmVsYXRpdmVSb3c9IDU1LCBDZWxsRnVuY3Rpb25DYWxsPSA1NiwgVXNlckRlZmluZWRGdW5jdGlvbkNhbGw9IDU3LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRlZmluZWRGdW5jdGlvbk5hbWU9IDU4LCBBcmd1bWVudExpc3Q9IDU5LCBBcmd1bWVudD0gNjAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcmd1bWVudEV4cHJlc3Npb249IDYxLCBBcmd1bWVudEluZml4VGVybXM9IDYyLCBBcmd1bWVudFByZUFuZFBvc3RUZXJtPSA2MywgCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50VGVybT0gNjQsIEFyZ3VtZW50UmVmSW5maXhUZXJtcz0gNjUsIEFyZ3VtZW50UmVmVGVybT0gNjYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcmd1bWVudEluZml4T3BlcmF0b3I9IDY3LCBSZWZBcmd1bWVudEluZml4T3BlcmF0b3I9IDY4LCBOYW1lUmVmZXJlbmNlPSA2OSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsTmFtZT0gNzAsIEJhbmdOYW1lPSA3MSwgTmFtZT0gNzIsIE5hbWVTdGFydENoYXJhY3Rlcj0gNzMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lQ2hhcmFjdGVyPSA3NCwgU3RydWN0dXJlUmVmZXJlbmNlPSA3NSwgVGFibGVJZGVudGlmaWVyPSA3NiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTmFtZT0gNzcsIEludHJhVGFibGVSZWZlcmVuY2U9IDc4LCBJbm5lclJlZmVyZW5jZT0gNzksIEtleXdvcmQ9IDgwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5d29yZExpc3Q9IDgxLCBDb2x1bW5SYW5nZT0gODIsIENvbHVtbj0gODMsIFNpbXBsZUNvbHVtbk5hbWU9IDg0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXNjYXBlQ29sdW1uQ2hhcmFjdGVyPSA4NSwgVW5lc2NhcGVkQ29sdW1uQ2hhcmFjdGVyPSA4NiwgQW55Tm9TcGFjZUNvbHVtbkNoYXJhY3Rlcj0gODcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFjZWRDb21tYT0gODgsIFNwYWNlZExCcmFja2V0PSA4OSwgU3BhY2VkUkJyYWNrZXQ9IDkwLCB3cz0gOTF9OworICAgICAgY2xhc3MgRXhjZWxGb3JtdWxhIDogUGVnQ2hhclBhcnNlciAKKyAgICAgIHsKKyAgICAgICAgCisgICAgICAgICAjcmVnaW9uIElucHV0IFByb3BlcnRpZXMKKyAgICAgICAgcHVibGljIHN0YXRpYyBFbmNvZGluZ0NsYXNzIGVuY29kaW5nQ2xhc3MgPSBFbmNvZGluZ0NsYXNzLmFzY2lpOworICAgICAgICBwdWJsaWMgc3RhdGljIFVuaWNvZGVEZXRlY3Rpb24gdW5pY29kZURldGVjdGlvbiA9IFVuaWNvZGVEZXRlY3Rpb24ubm90QXBwbGljYWJsZTsKKyAgICAgICAgI2VuZHJlZ2lvbiBJbnB1dCBQcm9wZXJ0aWVzCisgICAgICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgICAgIHB1YmxpYyBFeGNlbEZvcm11bGEoKQorICAgICAgICAgICAgOiBiYXNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEV4Y2VsRm9ybXVsYShzdHJpbmcgc3JjLFRleHRXcml0ZXIgRmVyck91dCkKKwkJCTogYmFzZShzcmMsRmVyck91dCkKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAgICAgI3JlZ2lvbiBPdmVycmlkZXMKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBHZXRSdWxlTmFtZUZyb21JZChpbnQgaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIEVFeGNlbEZvcm11bGEgcnVsZUVudW0gPSAoRUV4Y2VsRm9ybXVsYSlpZDsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHM9IHJ1bGVFbnVtLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGludCB2YWw7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpbnQuVHJ5UGFyc2UocyxvdXQgdmFsKSApeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuR2V0UnVsZU5hbWVGcm9tSWQoaWQpOworICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLkdldFJ1bGVOYW1lRnJvbUlkKGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBHZXRQcm9wZXJ0aWVzKG91dCBFbmNvZGluZ0NsYXNzIGVuY29kaW5nLCBvdXQgVW5pY29kZURldGVjdGlvbiBkZXRlY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY29kaW5nID0gZW5jb2RpbmdDbGFzczsKKyAgICAgICAgICAgIGRldGVjdGlvbiA9IHVuaWNvZGVEZXRlY3Rpb247CisgICAgICAgIH0gCisgICAgICAgICNlbmRyZWdpb24gT3ZlcnJpZGVzCisJCSNyZWdpb24gR3JhbW1hciBSdWxlcworICAgICAgICBwdWJsaWMgYm9vbCBGb3JtdWxhKCkgICAgLypGb3JtdWxhOiBFeHByZXNzaW9uICghLi9GQVRBTDwiZW5kIG9mIGxpbmUgZXhwZWN0ZWQiPik7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBBbmQoKCk9PiAgCisgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uKCkKKyAgICAgICAgICAgICAgICAgICYmICggICAgTm90KCgpPT4gQW55KCkgKSB8fCBGYXRhbCgiZW5kIG9mIGxpbmUgZXhwZWN0ZWQiKSkgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBFeHByZXNzaW9uKCkgICAgLypFeHByZXNzaW9uOiB3cyBJbmZpeFRlcm1zOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gICAgd3MoKSAmJiBJbmZpeFRlcm1zKCkgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBJbmZpeFRlcm1zKCkgICAgLypJbmZpeFRlcm1zOiBQcmVBbmRQb3N0VGVybSAoSW5maXhPcGVyYXRvciB3cyBQcmVBbmRQb3N0VGVybSkqOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gIAorICAgICAgICAgICAgICAgICAgICAgUHJlQW5kUG9zdFRlcm0oKQorICAgICAgICAgICAgICAgICAgJiYgT3B0UmVwZWF0KCgpPT4gICAgCisgICAgICAgICAgICAgICAgICAgICAgQW5kKCgpPT4gICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZpeE9wZXJhdG9yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB3cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgUHJlQW5kUG9zdFRlcm0oKSApICkgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBQcmVBbmRQb3N0VGVybSgpICAgIC8qUHJlQW5kUG9zdFRlcm06IChQcmVmaXhPcGVyYXRvciB3cykqIFRlcm0gKFBvc3RmaXhPcGVyYXRvciB3cykqOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gIAorICAgICAgICAgICAgICAgICAgICAgT3B0UmVwZWF0KCgpPT4gQW5kKCgpPT4gICAgUHJlZml4T3BlcmF0b3IoKSAmJiB3cygpICkgKQorICAgICAgICAgICAgICAgICAgJiYgVGVybSgpCisgICAgICAgICAgICAgICAgICAmJiBPcHRSZXBlYXQoKCk9PiBBbmQoKCk9PiAgICBQb3N0Zml4T3BlcmF0b3IoKSAmJiB3cygpICkgKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFRlcm0oKSAgICAvKlRlcm06IChSZWZJbmZpeFRlcm1zIC8gJygnIEV4cHJlc3Npb24gJyknIC8gQ29uc3RhbnQpIHdzOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gIAorICAgICAgICAgICAgICAgICAgICAgKCAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZWZJbmZpeFRlcm1zKCkKKyAgICAgICAgICAgICAgICAgICAgICB8fCBBbmQoKCk9PiAgICBDaGFyKCcoJykgJiYgRXhwcmVzc2lvbigpICYmIENoYXIoJyknKSApCisgICAgICAgICAgICAgICAgICAgICAgfHwgQ29uc3RhbnQoKSkKKyAgICAgICAgICAgICAgICAgICYmIHdzKCkgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBSZWZJbmZpeFRlcm1zKCkgICAgLypSZWZJbmZpeFRlcm1zOiBSZWZUZXJtIChSZWZJbmZpeE9wZXJhdG9yIHdzIFJlZlRlcm0pKjsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIEFuZCgoKT0+ICAKKyAgICAgICAgICAgICAgICAgICAgIFJlZlRlcm0oKQorICAgICAgICAgICAgICAgICAgJiYgT3B0UmVwZWF0KCgpPT4gICAgCisgICAgICAgICAgICAgICAgICAgICAgQW5kKCgpPT4gICAgUmVmSW5maXhPcGVyYXRvcigpICYmIHdzKCkgJiYgUmVmVGVybSgpICkgKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFJlZlRlcm0oKSAgICAvKlJlZlRlcm06ICcoJyB3cyBSZWZJbmZpeFRlcm1zICcpJyAvIFJlZkNvbnN0YW50IC8gQ2VsbEZ1bmN0aW9uQ2FsbCAvIENlbGxSZWZlcmVuY2UgLyBVc2VyRGVmaW5lZEZ1bmN0aW9uQ2FsbAorCS8gTmFtZVJlZmVyZW5jZSAvIFN0cnVjdHVyZVJlZmVyZW5jZTsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuICAgCisgICAgICAgICAgICAgICAgICAgICBBbmQoKCk9PiAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyKCcoJykKKyAgICAgICAgICAgICAgICAgICAgICAmJiB3cygpCisgICAgICAgICAgICAgICAgICAgICAgJiYgUmVmSW5maXhUZXJtcygpCisgICAgICAgICAgICAgICAgICAgICAgJiYgQ2hhcignKScpICkKKyAgICAgICAgICAgICAgICAgIHx8IFJlZkNvbnN0YW50KCkKKyAgICAgICAgICAgICAgICAgIHx8IENlbGxGdW5jdGlvbkNhbGwoKQorICAgICAgICAgICAgICAgICAgfHwgQ2VsbFJlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgICB8fCBVc2VyRGVmaW5lZEZ1bmN0aW9uQ2FsbCgpCisgICAgICAgICAgICAgICAgICB8fCBOYW1lUmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICAgIHx8IFN0cnVjdHVyZVJlZmVyZW5jZSgpOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIENvbnN0YW50KCkgICAgLypeXkNvbnN0YW50OiBFcnJvckNvbnN0YW50IC8gTG9naWNhbENvbnN0YW50IC8gTnVtZXJpY2FsQ29uc3RhbnQgLyBTdHJpbmdDb25zdGFudCAvIEFycmF5Q29uc3RhbnQ7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBUcmVlTlQoKGludClFRXhjZWxGb3JtdWxhLkNvbnN0YW50LCgpPT4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb25zdGFudCgpCisgICAgICAgICAgICAgICAgICB8fCBMb2dpY2FsQ29uc3RhbnQoKQorICAgICAgICAgICAgICAgICAgfHwgTnVtZXJpY2FsQ29uc3RhbnQoKQorICAgICAgICAgICAgICAgICAgfHwgU3RyaW5nQ29uc3RhbnQoKQorICAgICAgICAgICAgICAgICAgfHwgQXJyYXlDb25zdGFudCgpICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgUmVmQ29uc3RhbnQoKSAgICAvKlJlZkNvbnN0YW50OiAnI1JFRiEnOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQ2hhcignIycsJ1InLCdFJywnRicsJyEnKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBFcnJvckNvbnN0YW50KCkgICAgLypFcnJvckNvbnN0YW50OiBSZWZDb25zdGFudCAvICcjRElWLzAhJyAvICcjTi9BJyAvICcjTkFNRT8nIC8gJyNOVUxMIScgLyAnI05VTSEnIC8gJyNWQUxVRSEnIC8gJyNHRVRUSU5HX0RBVEEnOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gICAKKyAgICAgICAgICAgICAgICAgICAgIFJlZkNvbnN0YW50KCkKKyAgICAgICAgICAgICAgICAgIHx8IENoYXIoJyMnLCdEJywnSScsJ1YnLCcvJywnMCcsJyEnKQorICAgICAgICAgICAgICAgICAgfHwgQ2hhcignIycsJ04nLCcvJywnQScpCisgICAgICAgICAgICAgICAgICB8fCBDaGFyKCcjJywnTicsJ0EnLCdNJywnRScsJz8nKQorICAgICAgICAgICAgICAgICAgfHwgQ2hhcignIycsJ04nLCdVJywnTCcsJ0wnLCchJykKKyAgICAgICAgICAgICAgICAgIHx8IENoYXIoJyMnLCdOJywnVScsJ00nLCchJykKKyAgICAgICAgICAgICAgICAgIHx8IENoYXIoJyMnLCdWJywnQScsJ0wnLCdVJywnRScsJyEnKQorICAgICAgICAgICAgICAgICAgfHwgQ2hhcigiI0dFVFRJTkdfREFUQSIpOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIExvZ2ljYWxDb25zdGFudCgpICAgIC8qTG9naWNhbENvbnN0YW50OiAnRkFMU0UnIC8gJ1RSVUUnOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gICAgIENoYXIoJ0YnLCdBJywnTCcsJ1MnLCdFJykgfHwgQ2hhcignVCcsJ1InLCdVJywnRScpOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIE51bWVyaWNhbENvbnN0YW50KCkgICAgLypOdW1lcmljYWxDb25zdGFudDogJy0nPyBTaWduaWZpY2FuZFBhcnQgRXhwb25lbnRQYXJ0PzsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIEFuZCgoKT0+ICAKKyAgICAgICAgICAgICAgICAgICAgIE9wdGlvbigoKT0+IENoYXIoJy0nKSApCisgICAgICAgICAgICAgICAgICAmJiBTaWduaWZpY2FuZFBhcnQoKQorICAgICAgICAgICAgICAgICAgJiYgT3B0aW9uKCgpPT4gRXhwb25lbnRQYXJ0KCkgKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFNpZ25pZmljYW5kUGFydCgpICAgIC8qU2lnbmlmaWNhbmRQYXJ0OiBXaG9sZU51bWJlclBhcnQgRnJhY3Rpb25hbFBhcnQ/IC8gRnJhY3Rpb25hbFBhcnQ7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiAgIAorICAgICAgICAgICAgICAgICAgICAgQW5kKCgpPT4gICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgV2hvbGVOdW1iZXJQYXJ0KCkKKyAgICAgICAgICAgICAgICAgICAgICAmJiBPcHRpb24oKCk9PiBGcmFjdGlvbmFsUGFydCgpICkgKQorICAgICAgICAgICAgICAgICAgfHwgRnJhY3Rpb25hbFBhcnQoKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBXaG9sZU51bWJlclBhcnQoKSAgICAvKldob2xlTnVtYmVyUGFydDogWzAtOV0rOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gUGx1c1JlcGVhdCgoKT0+IEluKCcwJywnOScpICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgRnJhY3Rpb25hbFBhcnQoKSAgICAvKkZyYWN0aW9uYWxQYXJ0OiAnLicgWzAtOV0qOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gICAgQ2hhcignLicpICYmIE9wdFJlcGVhdCgoKT0+IEluKCcwJywnOScpICkgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBFeHBvbmVudFBhcnQoKSAgICAvKkV4cG9uZW50UGFydDogJ0UnICgnKycgLyAnLScpPyBbMC05XSo7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBBbmQoKCk9PiAgCisgICAgICAgICAgICAgICAgICAgICBDaGFyKCdFJykKKyAgICAgICAgICAgICAgICAgICYmIE9wdGlvbigoKT0+ICAgICBDaGFyKCcrJykgfHwgQ2hhcignLScpICkKKyAgICAgICAgICAgICAgICAgICYmIE9wdFJlcGVhdCgoKT0+IEluKCcwJywnOScpICkgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBTdHJpbmdDb25zdGFudCgpICAgIC8qU3RyaW5nQ29uc3RhbnQ6ICciJyAoJyIiJy9TdHJpbmdDaGFyYWN0ZXIpKiAnIic7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBBbmQoKCk9PiAgCisgICAgICAgICAgICAgICAgICAgICBDaGFyKCciJykKKyAgICAgICAgICAgICAgICAgICYmIE9wdFJlcGVhdCgoKT0+ICAgICBDaGFyKCciJywnIicpIHx8IFN0cmluZ0NoYXJhY3RlcigpICkKKyAgICAgICAgICAgICAgICAgICYmIENoYXIoJyInKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFN0cmluZ0NoYXJhY3RlcigpICAgIC8qU3RyaW5nQ2hhcmFjdGVyOiBbIy1+XSAvICchJyAvICcgJyAvIEhpZ2hDaGFyYWN0ZXI7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiAgIAorICAgICAgICAgICAgICAgICAgICAgSW4oJyMnLCd+JykKKyAgICAgICAgICAgICAgICAgIHx8IENoYXIoJyEnKQorICAgICAgICAgICAgICAgICAgfHwgQ2hhcignICcpCisgICAgICAgICAgICAgICAgICB8fCBIaWdoQ2hhcmFjdGVyKCk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgSGlnaENoYXJhY3RlcigpICAgIC8qSGlnaENoYXJhY3RlcjogWyN4ODAtI3hGRkZGXTsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIEluKCdcdTAwODAnLCdcdWZmZmYnKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBBcnJheUNvbnN0YW50KCkgICAgLypeXkFycmF5Q29uc3RhbnQ6ICd7JyBDb25zdGFudExpc3RSb3dzICd9JzsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIFRyZWVOVCgoaW50KUVFeGNlbEZvcm11bGEuQXJyYXlDb25zdGFudCwoKT0+CisgICAgICAgICAgICAgICAgQW5kKCgpPT4gICAgQ2hhcigneycpICYmIENvbnN0YW50TGlzdFJvd3MoKSAmJiBDaGFyKCd9JykgKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIENvbnN0YW50TGlzdFJvd3MoKSAgICAvKkNvbnN0YW50TGlzdFJvd3M6IENvbnN0YW50TGlzdFJvdyAoJzsnIENvbnN0YW50TGlzdFJvdykqOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gIAorICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRMaXN0Um93KCkKKyAgICAgICAgICAgICAgICAgICYmIE9wdFJlcGVhdCgoKT0+ICAgIAorICAgICAgICAgICAgICAgICAgICAgIEFuZCgoKT0+ICAgIENoYXIoJzsnKSAmJiBDb25zdGFudExpc3RSb3coKSApICkgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBDb25zdGFudExpc3RSb3coKSAgICAvKl5eQ29uc3RhbnRMaXN0Um93OiBDb25zdGFudCAoJywnIENvbnN0YW50KSo7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBUcmVlTlQoKGludClFRXhjZWxGb3JtdWxhLkNvbnN0YW50TGlzdFJvdywoKT0+CisgICAgICAgICAgICAgICAgQW5kKCgpPT4gIAorICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQoKQorICAgICAgICAgICAgICAgICAgJiYgT3B0UmVwZWF0KCgpPT4gQW5kKCgpPT4gICAgQ2hhcignLCcpICYmIENvbnN0YW50KCkgKSApICkgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBJbmZpeE9wZXJhdG9yKCkgICAgLypJbmZpeE9wZXJhdG9yOiBSZWZJbmZpeE9wZXJhdG9yIC8gVmFsdWVJbmZpeE9wZXJhdG9yOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gICAgIFJlZkluZml4T3BlcmF0b3IoKSB8fCBWYWx1ZUluZml4T3BlcmF0b3IoKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBWYWx1ZUluZml4T3BlcmF0b3IoKSAgICAvKl5eVmFsdWVJbmZpeE9wZXJhdG9yOiAnPD4nIC8gJz49JyAvICc8PScgLyAnXicgLyAnKicgLyAnLycgLyAnKycgLyAnLScgLyAnJicgLyAnPScgLyAnPCcgLyAnPic7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBUcmVlTlQoKGludClFRXhjZWxGb3JtdWxhLlZhbHVlSW5maXhPcGVyYXRvciwoKT0+CisgICAgICAgICAgICAgICAgT25lT2ZMaXRlcmFscyhvcHRpbWl6ZWRMaXRlcmFsczApICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgUmVmSW5maXhPcGVyYXRvcigpICAgIC8qUmVmSW5maXhPcGVyYXRvcjogUmFuZ2VPcGVyYXRvciAvIFVuaW9uT3BlcmF0b3IgLyBJbnRlcnNlY3Rpb25PcGVyYXRvcjsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuICAgCisgICAgICAgICAgICAgICAgICAgICBSYW5nZU9wZXJhdG9yKCkKKyAgICAgICAgICAgICAgICAgIHx8IFVuaW9uT3BlcmF0b3IoKQorICAgICAgICAgICAgICAgICAgfHwgSW50ZXJzZWN0aW9uT3BlcmF0b3IoKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBVbmlvbk9wZXJhdG9yKCkgICAgLypeXlVuaW9uT3BlcmF0b3I6ICcsJzsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIFRyZWVOVCgoaW50KUVFeGNlbEZvcm11bGEuVW5pb25PcGVyYXRvciwoKT0+CisgICAgICAgICAgICAgICAgQ2hhcignLCcpICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgSW50ZXJzZWN0aW9uT3BlcmF0b3IoKSAgICAvKl5eSW50ZXJzZWN0aW9uT3BlcmF0b3I6ICcgJzsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIFRyZWVOVCgoaW50KUVFeGNlbEZvcm11bGEuSW50ZXJzZWN0aW9uT3BlcmF0b3IsKCk9PgorICAgICAgICAgICAgICAgIENoYXIoJyAnKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFJhbmdlT3BlcmF0b3IoKSAgICAvKl5eUmFuZ2VPcGVyYXRvcjogJzonOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gVHJlZU5UKChpbnQpRUV4Y2VsRm9ybXVsYS5SYW5nZU9wZXJhdG9yLCgpPT4KKyAgICAgICAgICAgICAgICBDaGFyKCc6JykgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBQb3N0Zml4T3BlcmF0b3IoKSAgICAvKl5eUG9zdGZpeE9wZXJhdG9yOiAnJSc7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBUcmVlTlQoKGludClFRXhjZWxGb3JtdWxhLlBvc3RmaXhPcGVyYXRvciwoKT0+CisgICAgICAgICAgICAgICAgQ2hhcignJScpICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgUHJlZml4T3BlcmF0b3IoKSAgICAvKl5eUHJlZml4T3BlcmF0b3I6ICcrJyAvICctJzsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIFRyZWVOVCgoaW50KUVFeGNlbEZvcm11bGEuUHJlZml4T3BlcmF0b3IsKCk9PgorICAgICAgICAgICAgICAgICAgICBDaGFyKCcrJykgfHwgQ2hhcignLScpICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgQ2VsbFJlZmVyZW5jZSgpICAgIC8qQ2VsbFJlZmVyZW5jZTogRXh0ZXJuYWxDZWxsUmVmZXJlbmNlIC8gTG9jYWxDZWxsUmVmZXJlbmNlOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gICAgIEV4dGVybmFsQ2VsbFJlZmVyZW5jZSgpIHx8IExvY2FsQ2VsbFJlZmVyZW5jZSgpOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIExvY2FsQ2VsbFJlZmVyZW5jZSgpICAgIC8qTG9jYWxDZWxsUmVmZXJlbmNlOiBBMVJlZmVyZW5jZTsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIEExUmVmZXJlbmNlKCk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgRXh0ZXJuYWxDZWxsUmVmZXJlbmNlKCkgICAgLypFeHRlcm5hbENlbGxSZWZlcmVuY2U6IEJhbmdSZWZlcmVuY2UgLyBTaGVldFJhbmdlUmVmZXJlbmNlIC8gU2luZ2xlU2hlZXRSZWZlcmVuY2U7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiAgIAorICAgICAgICAgICAgICAgICAgICAgQmFuZ1JlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgICB8fCBTaGVldFJhbmdlUmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICAgIHx8IFNpbmdsZVNoZWV0UmVmZXJlbmNlKCk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgQm9va1ByZWZpeCgpICAgIC8qQm9va1ByZWZpeDogV29ya2Jvb2tJbmRleCAnISc7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBBbmQoKCk9PiAgICBXb3JrYm9va0luZGV4KCkgJiYgQ2hhcignIScpICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgQmFuZ1JlZmVyZW5jZSgpICAgIC8qQmFuZ1JlZmVyZW5jZTogJyEnIChBMVJlZmVyZW5jZSAvICcjUkVGIScpOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gIAorICAgICAgICAgICAgICAgICAgICAgQ2hhcignIScpCisgICAgICAgICAgICAgICAgICAmJiAoICAgIEExUmVmZXJlbmNlKCkgfHwgQ2hhcignIycsJ1InLCdFJywnRicsJyEnKSkgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBTaGVldFJhbmdlUmVmZXJlbmNlKCkgICAgLypTaGVldFJhbmdlUmVmZXJlbmNlOiBTaGVldFJhbmdlICchJyBBMVJlZmVyZW5jZTsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIEFuZCgoKT0+ICAgIFNoZWV0UmFuZ2UoKSAmJiBDaGFyKCchJykgJiYgQTFSZWZlcmVuY2UoKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFNpbmdsZVNoZWV0UHJlZml4KCkgICAgLypTaW5nbGVTaGVldFByZWZpeDogU2luZ2xlU2hlZXQgJyEnOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gICAgU2luZ2xlU2hlZXQoKSAmJiBDaGFyKCchJykgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBTaW5nbGVTaGVldFJlZmVyZW5jZSgpICAgIC8qU2luZ2xlU2hlZXRSZWZlcmVuY2U6IFNpbmdsZVNoZWV0UHJlZml4IChBMVJlZmVyZW5jZSAvICcjUkVGIScpOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gIAorICAgICAgICAgICAgICAgICAgICAgU2luZ2xlU2hlZXRQcmVmaXgoKQorICAgICAgICAgICAgICAgICAgJiYgKCAgICBBMVJlZmVyZW5jZSgpIHx8IENoYXIoJyMnLCdSJywnRScsJ0YnLCchJykpICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgU2luZ2xlU2hlZXRBcmVhKCkgICAgLypTaW5nbGVTaGVldEFyZWE6IFNpbmdsZVNoZWV0UHJlZml4IEExQXJlYTsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIEFuZCgoKT0+ICAgIFNpbmdsZVNoZWV0UHJlZml4KCkgJiYgQTFBcmVhKCkgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBTaW5nbGVTaGVldCgpICAgIC8qU2luZ2xlU2hlZXQ6IFdvcmtib29rSW5kZXg/IFNoZWV0TmFtZSAvICdcJycgV29ya2Jvb2tJbmRleD8gU2hlZXROYW1lU3BlY2lhbCAnXCcnOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gICAKKyAgICAgICAgICAgICAgICAgICAgIEFuZCgoKT0+ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbigoKT0+IFdvcmtib29rSW5kZXgoKSApCisgICAgICAgICAgICAgICAgICAgICAgJiYgU2hlZXROYW1lKCkgKQorICAgICAgICAgICAgICAgICAgfHwgQW5kKCgpPT4gICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcignXCcnKQorICAgICAgICAgICAgICAgICAgICAgICYmIE9wdGlvbigoKT0+IFdvcmtib29rSW5kZXgoKSApCisgICAgICAgICAgICAgICAgICAgICAgJiYgU2hlZXROYW1lU3BlY2lhbCgpCisgICAgICAgICAgICAgICAgICAgICAgJiYgQ2hhcignXCcnKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFNoZWV0UmFuZ2UoKSAgICAvKlNoZWV0UmFuZ2U6IFdvcmtib29rSW5kZXg/IFNoZWV0TmFtZSAnOicgU2hlZXROYW1lIC8gJ1wnJyBXb3JrYm9va0luZGV4PyBTaGVldE5hbWVTcGVjaWFsICc6JyBTaGVldE5hbWVTcGVjaWFsICdcJyc7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiAgIAorICAgICAgICAgICAgICAgICAgICAgQW5kKCgpPT4gICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uKCgpPT4gV29ya2Jvb2tJbmRleCgpICkKKyAgICAgICAgICAgICAgICAgICAgICAmJiBTaGVldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICYmIENoYXIoJzonKQorICAgICAgICAgICAgICAgICAgICAgICYmIFNoZWV0TmFtZSgpICkKKyAgICAgICAgICAgICAgICAgIHx8IEFuZCgoKT0+ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgIENoYXIoJ1wnJykKKyAgICAgICAgICAgICAgICAgICAgICAmJiBPcHRpb24oKCk9PiBXb3JrYm9va0luZGV4KCkgKQorICAgICAgICAgICAgICAgICAgICAgICYmIFNoZWV0TmFtZVNwZWNpYWwoKQorICAgICAgICAgICAgICAgICAgICAgICYmIENoYXIoJzonKQorICAgICAgICAgICAgICAgICAgICAgICYmIFNoZWV0TmFtZVNwZWNpYWwoKQorICAgICAgICAgICAgICAgICAgICAgICYmIENoYXIoJ1wnJykgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBXb3JrYm9va0luZGV4KCkgICAgLypeXldvcmtib29rSW5kZXg6ICdbJyBXaG9sZU51bWJlclBhcnQgJ10nOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gVHJlZU5UKChpbnQpRUV4Y2VsRm9ybXVsYS5Xb3JrYm9va0luZGV4LCgpPT4KKyAgICAgICAgICAgICAgICBBbmQoKCk9PiAgICBDaGFyKCdbJykgJiYgV2hvbGVOdW1iZXJQYXJ0KCkgJiYgQ2hhcignXScpICkgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBTaGVldE5hbWUoKSAgICAvKl5eU2hlZXROYW1lOiBTaGVldE5hbWVDaGFyYWN0ZXIrOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gVHJlZU5UKChpbnQpRUV4Y2VsRm9ybXVsYS5TaGVldE5hbWUsKCk9PgorICAgICAgICAgICAgICAgIFBsdXNSZXBlYXQoKCk9PiBTaGVldE5hbWVDaGFyYWN0ZXIoKSApICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgU2hlZXROYW1lQ2hhcmFjdGVyKCkgICAgLypTaGVldE5hbWVDaGFyYWN0ZXI6IFtBLVphLXowLTkuX10gLyBIaWdoQ2hhcmFjdGVyOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gICAKKyAgICAgICAgICAgICAgICAgICAgIChJbignQScsJ1onLCAnYScsJ3onLCAnMCcsJzknKXx8T25lT2YoIi5fIikpCisgICAgICAgICAgICAgICAgICB8fCBIaWdoQ2hhcmFjdGVyKCk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgU2hlZXROYW1lU3BlY2lhbCgpICAgIC8qXl5TaGVldE5hbWVTcGVjaWFsOiBTaGVldE5hbWVCYXNlQ2hhcmFjdGVyICgnXCdcJycqIFNoZWV0TmFtZUJhc2VDaGFyYWN0ZXIpKjsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIFRyZWVOVCgoaW50KUVFeGNlbEZvcm11bGEuU2hlZXROYW1lU3BlY2lhbCwoKT0+CisgICAgICAgICAgICAgICAgQW5kKCgpPT4gIAorICAgICAgICAgICAgICAgICAgICAgU2hlZXROYW1lQmFzZUNoYXJhY3RlcigpCisgICAgICAgICAgICAgICAgICAmJiBPcHRSZXBlYXQoKCk9PiAgICAKKyAgICAgICAgICAgICAgICAgICAgICBBbmQoKCk9PiAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlcGVhdCgoKT0+IENoYXIoJ1wnJywnXCcnKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgU2hlZXROYW1lQmFzZUNoYXJhY3RlcigpICkgKSApICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgU2hlZXROYW1lQmFzZUNoYXJhY3RlcigpICAgIC8qU2hlZXROYW1lQmFzZUNoYXJhY3RlcjogW0EtWmEtejAtOSEiIyQlJigpKywtLjs8PT5AXl9ge3x9fiBdIC8gSGlnaENoYXJhY3RlcjsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuICAgICBPbmVPZihvcHRpbWl6ZWRDaGFyc2V0MCkgfHwgSGlnaENoYXJhY3RlcigpOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIEExUmVmZXJlbmNlKCkgICAgLypeXkExUmVmZXJlbmNlOiAoQTFDb2x1bW4gJzonIEExQ29sdW1uKSAvIChBMVJvdyAnOicgQTFSb3cpIC8gQTFBcmVhIC8gQTFDZWxsOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gVHJlZU5UKChpbnQpRUV4Y2VsRm9ybXVsYS5BMVJlZmVyZW5jZSwoKT0+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgIEFuZCgoKT0+ICAgIEExQ29sdW1uKCkgJiYgQ2hhcignOicpICYmIEExQ29sdW1uKCkgKQorICAgICAgICAgICAgICAgICAgfHwgQW5kKCgpPT4gICAgQTFSb3coKSAmJiBDaGFyKCc6JykgJiYgQTFSb3coKSApCisgICAgICAgICAgICAgICAgICB8fCBBMUFyZWEoKQorICAgICAgICAgICAgICAgICAgfHwgQTFDZWxsKCkgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBBMUNlbGwoKSAgICAvKkExQ2VsbDogQTFDb2x1bW4gQTFSb3cgIU5hbWVDaGFyYWN0ZXI7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBBbmQoKCk9PiAgCisgICAgICAgICAgICAgICAgICAgICBBMUNvbHVtbigpCisgICAgICAgICAgICAgICAgICAmJiBBMVJvdygpCisgICAgICAgICAgICAgICAgICAmJiBOb3QoKCk9PiBOYW1lQ2hhcmFjdGVyKCkgKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIEExQXJlYSgpICAgIC8qQTFBcmVhOiBBMUNlbGwgJzonIEExQ2VsbDsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIEFuZCgoKT0+ICAgIEExQ2VsbCgpICYmIENoYXIoJzonKSAmJiBBMUNlbGwoKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIEExQ29sdW1uKCkgICAgLypeXkExQ29sdW1uOiBBMUFic29sdXRlQ29sdW1uIC8gQTFSZWxhdGl2ZUNvbHVtbjsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIFRyZWVOVCgoaW50KUVFeGNlbEZvcm11bGEuQTFDb2x1bW4sKCk9PgorICAgICAgICAgICAgICAgICAgICBBMUFic29sdXRlQ29sdW1uKCkgfHwgQTFSZWxhdGl2ZUNvbHVtbigpICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgQTFBYnNvbHV0ZUNvbHVtbigpICAgIC8qQTFBYnNvbHV0ZUNvbHVtbjogJyQnIEExUmVsYXRpdmVDb2x1bW47Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBBbmQoKCk9PiAgICBDaGFyKCckJykgJiYgQTFSZWxhdGl2ZUNvbHVtbigpICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgQTFSZWxhdGl2ZUNvbHVtbigpICAgIC8qQTFSZWxhdGl2ZUNvbHVtbjogJ1hGJyBbQS1EXSAvICdYJyBbQS1FXSBbQS1aXSAvIFtBLVddW0EtWl1bQS1aXSAvIFtBLVpdW0EtWl0gLyBbQS1aXTsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuICAgCisgICAgICAgICAgICAgICAgICAgICBBbmQoKCk9PiAgICBDaGFyKCdYJywnRicpICYmIEluKCdBJywnRCcpICkKKyAgICAgICAgICAgICAgICAgIHx8IEFuZCgoKT0+ICAgIENoYXIoJ1gnKSAmJiBJbignQScsJ0UnKSAmJiBJbignQScsJ1onKSApCisgICAgICAgICAgICAgICAgICB8fCBBbmQoKCk9PiAgICBJbignQScsJ1cnKSAmJiBJbignQScsJ1onKSAmJiBJbignQScsJ1onKSApCisgICAgICAgICAgICAgICAgICB8fCBBbmQoKCk9PiAgICBJbignQScsJ1onKSAmJiBJbignQScsJ1onKSApCisgICAgICAgICAgICAgICAgICB8fCBJbignQScsJ1onKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBBMVJvdygpICAgIC8qXl5BMVJvdzogQTFBYnNvbHV0ZVJvdyAvIEExUmVsYXRpdmVSb3c7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBUcmVlTlQoKGludClFRXhjZWxGb3JtdWxhLkExUm93LCgpPT4KKyAgICAgICAgICAgICAgICAgICAgQTFBYnNvbHV0ZVJvdygpIHx8IEExUmVsYXRpdmVSb3coKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIEExQWJzb2x1dGVSb3coKSAgICAvKkExQWJzb2x1dGVSb3c6ICckJyBBMVJlbGF0aXZlUm93OyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gICAgQ2hhcignJCcpICYmIEExUmVsYXRpdmVSb3coKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIEExUmVsYXRpdmVSb3coKSAgICAvKkExUmVsYXRpdmVSb3c6IFsxLTldWzAtOV0qOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gICAgSW4oJzEnLCc5JykgJiYgT3B0UmVwZWF0KCgpPT4gSW4oJzAnLCc5JykgKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIENlbGxGdW5jdGlvbkNhbGwoKSAgICAvKl5eQ2VsbEZ1bmN0aW9uQ2FsbDogQTFDZWxsICcoJyBBcmd1bWVudExpc3QgJyknOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gVHJlZU5UKChpbnQpRUV4Y2VsRm9ybXVsYS5DZWxsRnVuY3Rpb25DYWxsLCgpPT4KKyAgICAgICAgICAgICAgICBBbmQoKCk9PiAgCisgICAgICAgICAgICAgICAgICAgICBBMUNlbGwoKQorICAgICAgICAgICAgICAgICAgJiYgQ2hhcignKCcpCisgICAgICAgICAgICAgICAgICAmJiBBcmd1bWVudExpc3QoKQorICAgICAgICAgICAgICAgICAgJiYgQ2hhcignKScpICkgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBVc2VyRGVmaW5lZEZ1bmN0aW9uQ2FsbCgpICAgIC8qXl5Vc2VyRGVmaW5lZEZ1bmN0aW9uQ2FsbDogVXNlckRlZmluZWRGdW5jdGlvbk5hbWUgJygnIEFyZ3VtZW50TGlzdCAnKSc7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBUcmVlTlQoKGludClFRXhjZWxGb3JtdWxhLlVzZXJEZWZpbmVkRnVuY3Rpb25DYWxsLCgpPT4KKyAgICAgICAgICAgICAgICBBbmQoKCk9PiAgCisgICAgICAgICAgICAgICAgICAgICBVc2VyRGVmaW5lZEZ1bmN0aW9uTmFtZSgpCisgICAgICAgICAgICAgICAgICAmJiBDaGFyKCcoJykKKyAgICAgICAgICAgICAgICAgICYmIEFyZ3VtZW50TGlzdCgpCisgICAgICAgICAgICAgICAgICAmJiBDaGFyKCcpJykgKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFVzZXJEZWZpbmVkRnVuY3Rpb25OYW1lKCkgICAgLypVc2VyRGVmaW5lZEZ1bmN0aW9uTmFtZTogTmFtZVJlZmVyZW5jZTsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIE5hbWVSZWZlcmVuY2UoKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBBcmd1bWVudExpc3QoKSAgICAvKkFyZ3VtZW50TGlzdDogQXJndW1lbnQgKCcsJyBBcmd1bWVudCkqOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gIAorICAgICAgICAgICAgICAgICAgICAgQXJndW1lbnQoKQorICAgICAgICAgICAgICAgICAgJiYgT3B0UmVwZWF0KCgpPT4gQW5kKCgpPT4gICAgQ2hhcignLCcpICYmIEFyZ3VtZW50KCkgKSApICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgQXJndW1lbnQoKSAgICAvKkFyZ3VtZW50OiBBcmd1bWVudEV4cHJlc3Npb24gLyB3czsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuICAgICBBcmd1bWVudEV4cHJlc3Npb24oKSB8fCB3cygpOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIEFyZ3VtZW50RXhwcmVzc2lvbigpICAgIC8qXl5Bcmd1bWVudEV4cHJlc3Npb246IHdzIEFyZ3VtZW50SW5maXhUZXJtczsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIFRyZWVOVCgoaW50KUVFeGNlbEZvcm11bGEuQXJndW1lbnRFeHByZXNzaW9uLCgpPT4KKyAgICAgICAgICAgICAgICBBbmQoKCk9PiAgICB3cygpICYmIEFyZ3VtZW50SW5maXhUZXJtcygpICkgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBBcmd1bWVudEluZml4VGVybXMoKSAgICAvKkFyZ3VtZW50SW5maXhUZXJtczogQXJndW1lbnRQcmVBbmRQb3N0VGVybSAoQXJndW1lbnRJbmZpeE9wZXJhdG9yIHdzIEFyZ3VtZW50UHJlQW5kUG9zdFRlcm0pKjsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIEFuZCgoKT0+ICAKKyAgICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50UHJlQW5kUG9zdFRlcm0oKQorICAgICAgICAgICAgICAgICAgJiYgT3B0UmVwZWF0KCgpPT4gICAgCisgICAgICAgICAgICAgICAgICAgICAgQW5kKCgpPT4gICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmd1bWVudEluZml4T3BlcmF0b3IoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHdzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBBcmd1bWVudFByZUFuZFBvc3RUZXJtKCkgKSApICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgQXJndW1lbnRQcmVBbmRQb3N0VGVybSgpICAgIC8qQXJndW1lbnRQcmVBbmRQb3N0VGVybTogKFByZWZpeE9wZXJhdG9yIHdzKSogQXJndW1lbnRUZXJtIChQb3N0Zml4T3BlcmF0b3Igd3MpKjsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIEFuZCgoKT0+ICAKKyAgICAgICAgICAgICAgICAgICAgIE9wdFJlcGVhdCgoKT0+IEFuZCgoKT0+ICAgIFByZWZpeE9wZXJhdG9yKCkgJiYgd3MoKSApICkKKyAgICAgICAgICAgICAgICAgICYmIEFyZ3VtZW50VGVybSgpCisgICAgICAgICAgICAgICAgICAmJiBPcHRSZXBlYXQoKCk9PiBBbmQoKCk9PiAgICBQb3N0Zml4T3BlcmF0b3IoKSAmJiB3cygpICkgKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIEFyZ3VtZW50VGVybSgpICAgIC8qQXJndW1lbnRUZXJtOiAoQXJndW1lbnRSZWZJbmZpeFRlcm1zIC8gJygnIEV4cHJlc3Npb24gJyknIC8gQ29uc3RhbnQpIHdzOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gIAorICAgICAgICAgICAgICAgICAgICAgKCAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICBBcmd1bWVudFJlZkluZml4VGVybXMoKQorICAgICAgICAgICAgICAgICAgICAgIHx8IEFuZCgoKT0+ICAgIENoYXIoJygnKSAmJiBFeHByZXNzaW9uKCkgJiYgQ2hhcignKScpICkKKyAgICAgICAgICAgICAgICAgICAgICB8fCBDb25zdGFudCgpKQorICAgICAgICAgICAgICAgICAgJiYgd3MoKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIEFyZ3VtZW50UmVmSW5maXhUZXJtcygpICAgIC8qQXJndW1lbnRSZWZJbmZpeFRlcm1zOiBBcmd1bWVudFJlZlRlcm0gKFJlZkFyZ3VtZW50SW5maXhPcGVyYXRvciB3cyBBcmd1bWVudFJlZlRlcm0pKjsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIEFuZCgoKT0+ICAKKyAgICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50UmVmVGVybSgpCisgICAgICAgICAgICAgICAgICAmJiBPcHRSZXBlYXQoKCk9PiAgICAKKyAgICAgICAgICAgICAgICAgICAgICBBbmQoKCk9PiAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZkFyZ3VtZW50SW5maXhPcGVyYXRvcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgd3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEFyZ3VtZW50UmVmVGVybSgpICkgKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIEFyZ3VtZW50UmVmVGVybSgpICAgIC8qQXJndW1lbnRSZWZUZXJtOiAnKCcgd3MgUmVmSW5maXhUZXJtcyAnKScgLyBSZWZDb25zdGFudCAvIENlbGxGdW5jdGlvbkNhbGwgLyBDZWxsUmVmZXJlbmNlIC8gVXNlckRlZmluZWRGdW5jdGlvbkNhbGwKKwkvIE5hbWVSZWZlcmVuY2UgLyBTdHJ1Y3R1cmVSZWZlcmVuY2U7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiAgIAorICAgICAgICAgICAgICAgICAgICAgQW5kKCgpPT4gICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcignKCcpCisgICAgICAgICAgICAgICAgICAgICAgJiYgd3MoKQorICAgICAgICAgICAgICAgICAgICAgICYmIFJlZkluZml4VGVybXMoKQorICAgICAgICAgICAgICAgICAgICAgICYmIENoYXIoJyknKSApCisgICAgICAgICAgICAgICAgICB8fCBSZWZDb25zdGFudCgpCisgICAgICAgICAgICAgICAgICB8fCBDZWxsRnVuY3Rpb25DYWxsKCkKKyAgICAgICAgICAgICAgICAgIHx8IENlbGxSZWZlcmVuY2UoKQorICAgICAgICAgICAgICAgICAgfHwgVXNlckRlZmluZWRGdW5jdGlvbkNhbGwoKQorICAgICAgICAgICAgICAgICAgfHwgTmFtZVJlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgICB8fCBTdHJ1Y3R1cmVSZWZlcmVuY2UoKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBBcmd1bWVudEluZml4T3BlcmF0b3IoKSAgICAvKkFyZ3VtZW50SW5maXhPcGVyYXRvcjogUmVmQXJndW1lbnRJbmZpeE9wZXJhdG9yIC8gVmFsdWVJbmZpeE9wZXJhdG9yOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gICAgIFJlZkFyZ3VtZW50SW5maXhPcGVyYXRvcigpIHx8IFZhbHVlSW5maXhPcGVyYXRvcigpOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFJlZkFyZ3VtZW50SW5maXhPcGVyYXRvcigpICAgIC8qUmVmQXJndW1lbnRJbmZpeE9wZXJhdG9yOiBSYW5nZU9wZXJhdG9yIC8gSW50ZXJzZWN0aW9uT3BlcmF0b3I7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiAgICAgUmFuZ2VPcGVyYXRvcigpIHx8IEludGVyc2VjdGlvbk9wZXJhdG9yKCk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgTmFtZVJlZmVyZW5jZSgpICAgIC8qXl5OYW1lUmVmZXJlbmNlOiAoRXh0ZXJuYWxOYW1lIC8gTmFtZSkgISdbJzsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIFRyZWVOVCgoaW50KUVFeGNlbEZvcm11bGEuTmFtZVJlZmVyZW5jZSwoKT0+CisgICAgICAgICAgICAgICAgQW5kKCgpPT4gIAorICAgICAgICAgICAgICAgICAgICAgKCAgICBFeHRlcm5hbE5hbWUoKSB8fCBOYW1lKCkpCisgICAgICAgICAgICAgICAgICAmJiBOb3QoKCk9PiBDaGFyKCdbJykgKSApICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgRXh0ZXJuYWxOYW1lKCkgICAgLypFeHRlcm5hbE5hbWU6IEJhbmdOYW1lIC8gKFNpbmdsZVNoZWV0UHJlZml4IC8gQm9va1ByZWZpeCkgTmFtZTsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuICAgCisgICAgICAgICAgICAgICAgICAgICBCYW5nTmFtZSgpCisgICAgICAgICAgICAgICAgICB8fCBBbmQoKCk9PiAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAoICAgIFNpbmdsZVNoZWV0UHJlZml4KCkgfHwgQm9va1ByZWZpeCgpKQorICAgICAgICAgICAgICAgICAgICAgICYmIE5hbWUoKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIEJhbmdOYW1lKCkgICAgLypCYW5nTmFtZTogJyEnIE5hbWU7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBBbmQoKCk9PiAgICBDaGFyKCchJykgJiYgTmFtZSgpICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgTmFtZSgpICAgIC8qTmFtZTogTmFtZVN0YXJ0Q2hhcmFjdGVyIE5hbWVDaGFyYWN0ZXIqOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gIAorICAgICAgICAgICAgICAgICAgICAgTmFtZVN0YXJ0Q2hhcmFjdGVyKCkKKyAgICAgICAgICAgICAgICAgICYmIE9wdFJlcGVhdCgoKT0+IE5hbWVDaGFyYWN0ZXIoKSApICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgTmFtZVN0YXJ0Q2hhcmFjdGVyKCkgICAgLypOYW1lU3RhcnRDaGFyYWN0ZXI6IFtfXFxBLVphLXpdIC8gSGlnaENoYXJhY3RlcjsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuICAgCisgICAgICAgICAgICAgICAgICAgICAoSW4oJ0EnLCdaJywgJ2EnLCd6Jyl8fE9uZU9mKCJfXFwiKSkKKyAgICAgICAgICAgICAgICAgIHx8IEhpZ2hDaGFyYWN0ZXIoKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBOYW1lQ2hhcmFjdGVyKCkgICAgLypOYW1lQ2hhcmFjdGVyOiBOYW1lU3RhcnRDaGFyYWN0ZXIgLyBbMC05XSAvICcuJyAvICc/JyAvIEhpZ2hDaGFyYWN0ZXI7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiAgIAorICAgICAgICAgICAgICAgICAgICAgTmFtZVN0YXJ0Q2hhcmFjdGVyKCkKKyAgICAgICAgICAgICAgICAgIHx8IEluKCcwJywnOScpCisgICAgICAgICAgICAgICAgICB8fCBDaGFyKCcuJykKKyAgICAgICAgICAgICAgICAgIHx8IENoYXIoJz8nKQorICAgICAgICAgICAgICAgICAgfHwgSGlnaENoYXJhY3RlcigpOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFN0cnVjdHVyZVJlZmVyZW5jZSgpICAgIC8qXl5TdHJ1Y3R1cmVSZWZlcmVuY2U6IFRhYmxlSWRlbnRpZmllcj8gSW50cmFUYWJsZVJlZmVyZW5jZTsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIFRyZWVOVCgoaW50KUVFeGNlbEZvcm11bGEuU3RydWN0dXJlUmVmZXJlbmNlLCgpPT4KKyAgICAgICAgICAgICAgICBBbmQoKCk9PiAgCisgICAgICAgICAgICAgICAgICAgICBPcHRpb24oKCk9PiBUYWJsZUlkZW50aWZpZXIoKSApCisgICAgICAgICAgICAgICAgICAmJiBJbnRyYVRhYmxlUmVmZXJlbmNlKCkgKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFRhYmxlSWRlbnRpZmllcigpICAgIC8qVGFibGVJZGVudGlmaWVyOiBCb29rUHJlZml4PyBUYWJsZU5hbWU7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBBbmQoKCk9PiAgICBPcHRpb24oKCk9PiBCb29rUHJlZml4KCkgKSAmJiBUYWJsZU5hbWUoKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFRhYmxlTmFtZSgpICAgIC8qVGFibGVOYW1lOiBOYW1lOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gTmFtZSgpOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIEludHJhVGFibGVSZWZlcmVuY2UoKSAgICAvKkludHJhVGFibGVSZWZlcmVuY2U6IFNwYWNlZExCcmFja2V0IElubmVyUmVmZXJlbmNlIFNwYWNlZFJCcmFja2V0IC8gS2V5d29yZCAvICdbJyBTaW1wbGVDb2x1bW5OYW1lICddJzsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuICAgCisgICAgICAgICAgICAgICAgICAgICBBbmQoKCk9PiAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICBTcGFjZWRMQnJhY2tldCgpCisgICAgICAgICAgICAgICAgICAgICAgJiYgSW5uZXJSZWZlcmVuY2UoKQorICAgICAgICAgICAgICAgICAgICAgICYmIFNwYWNlZFJCcmFja2V0KCkgKQorICAgICAgICAgICAgICAgICAgfHwgS2V5d29yZCgpCisgICAgICAgICAgICAgICAgICB8fCBBbmQoKCk9PiAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyKCdbJykKKyAgICAgICAgICAgICAgICAgICAgICAmJiBTaW1wbGVDb2x1bW5OYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAmJiBDaGFyKCddJykgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBJbm5lclJlZmVyZW5jZSgpICAgIC8qSW5uZXJSZWZlcmVuY2U6IChLZXl3b3JkTGlzdCBTcGFjZWRDb21tYSk/IENvbHVtblJhbmdlIC8gS2V5d29yZExpc3Q7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiAgIAorICAgICAgICAgICAgICAgICAgICAgQW5kKCgpPT4gICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uKCgpPT4gICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmQoKCk9PiAgICBLZXl3b3JkTGlzdCgpICYmIFNwYWNlZENvbW1hKCkgKSApCisgICAgICAgICAgICAgICAgICAgICAgJiYgQ29sdW1uUmFuZ2UoKSApCisgICAgICAgICAgICAgICAgICB8fCBLZXl3b3JkTGlzdCgpOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIEtleXdvcmQoKSAgICAvKktleXdvcmQ6ICdbI0FsbF0nIC8gJ1sjRGF0YV0nIC8gJ1sjSGVhZGVyc10nIC8gJ1sjVG90YWxzXScgLyAnWyNUaGlzIFJvd10nOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gICAKKyAgICAgICAgICAgICAgICAgICAgIENoYXIoJ1snLCcjJywnQScsJ2wnLCdsJywnXScpCisgICAgICAgICAgICAgICAgICB8fCBDaGFyKCdbJywnIycsJ0QnLCdhJywndCcsJ2EnLCddJykKKyAgICAgICAgICAgICAgICAgIHx8IENoYXIoIlsjSGVhZGVyc10iKQorICAgICAgICAgICAgICAgICAgfHwgQ2hhcigiWyNUb3RhbHNdIikKKyAgICAgICAgICAgICAgICAgIHx8IENoYXIoIlsjVGhpcyBSb3ddIik7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgS2V5d29yZExpc3QoKSAgICAvKktleXdvcmRMaXN0OiAnWyNIZWFkZXJzXScgU3BhY2VkQ29tbWEgJ1sjRGF0YV0nIC8gJ1sjRGF0YV0nIFNwYWNlZENvbW1hICdbI1RvdGFsc10nIC8gS2V5d29yZDsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuICAgCisgICAgICAgICAgICAgICAgICAgICBBbmQoKCk9PiAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyKCJbI0hlYWRlcnNdIikKKyAgICAgICAgICAgICAgICAgICAgICAmJiBTcGFjZWRDb21tYSgpCisgICAgICAgICAgICAgICAgICAgICAgJiYgQ2hhcignWycsJyMnLCdEJywnYScsJ3QnLCdhJywnXScpICkKKyAgICAgICAgICAgICAgICAgIHx8IEFuZCgoKT0+ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgIENoYXIoJ1snLCcjJywnRCcsJ2EnLCd0JywnYScsJ10nKQorICAgICAgICAgICAgICAgICAgICAgICYmIFNwYWNlZENvbW1hKCkKKyAgICAgICAgICAgICAgICAgICAgICAmJiBDaGFyKCJbI1RvdGFsc10iKSApCisgICAgICAgICAgICAgICAgICB8fCBLZXl3b3JkKCk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgQ29sdW1uUmFuZ2UoKSAgICAvKkNvbHVtblJhbmdlOiBDb2x1bW4gKCc6JyBDb2x1bW4pPzsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIEFuZCgoKT0+ICAKKyAgICAgICAgICAgICAgICAgICAgIENvbHVtbigpCisgICAgICAgICAgICAgICAgICAmJiBPcHRpb24oKCk9PiBBbmQoKCk9PiAgICBDaGFyKCc6JykgJiYgQ29sdW1uKCkgKSApICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgQ29sdW1uKCkgICAgLypDb2x1bW46ICdbJyB3cyBTaW1wbGVDb2x1bW5OYW1lIHdzICddJyAvIFNpbXBsZUNvbHVtbk5hbWU7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiAgIAorICAgICAgICAgICAgICAgICAgICAgQW5kKCgpPT4gICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcignWycpCisgICAgICAgICAgICAgICAgICAgICAgJiYgd3MoKQorICAgICAgICAgICAgICAgICAgICAgICYmIFNpbXBsZUNvbHVtbk5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICYmIHdzKCkKKyAgICAgICAgICAgICAgICAgICAgICAmJiBDaGFyKCddJykgKQorICAgICAgICAgICAgICAgICAgfHwgU2ltcGxlQ29sdW1uTmFtZSgpOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFNpbXBsZUNvbHVtbk5hbWUoKSAgICAvKlNpbXBsZUNvbHVtbk5hbWU6IEFueU5vU3BhY2VDb2x1bW5DaGFyYWN0ZXIrICh3cyBBbnlOb1NwYWNlQ29sdW1uQ2hhcmFjdGVyKykqOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gQW5kKCgpPT4gIAorICAgICAgICAgICAgICAgICAgICAgUGx1c1JlcGVhdCgoKT0+IEFueU5vU3BhY2VDb2x1bW5DaGFyYWN0ZXIoKSApCisgICAgICAgICAgICAgICAgICAmJiBPcHRSZXBlYXQoKCk9PiAgICAKKyAgICAgICAgICAgICAgICAgICAgICBBbmQoKCk9PiAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBQbHVzUmVwZWF0KCgpPT4gQW55Tm9TcGFjZUNvbHVtbkNoYXJhY3RlcigpICkgKSApICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgRXNjYXBlQ29sdW1uQ2hhcmFjdGVyKCkgICAgLypFc2NhcGVDb2x1bW5DaGFyYWN0ZXI6ICdcJycgLyAnIycgLyAnWycgLyAnXSc7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiAgICAgQ2hhcignXCcnKSB8fCBDaGFyKCcjJykgfHwgQ2hhcignWycpIHx8IENoYXIoJ10nKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCBVbmVzY2FwZWRDb2x1bW5DaGFyYWN0ZXIoKSAgICAvKlVuZXNjYXBlZENvbHVtbkNoYXJhY3RlcjogW0EtWmEtejAtOSEiIyQlJigpKissLS4vOjs8PT4/QFxcXl9ge3x9fl0gLyBIaWdoQ2hhcmFjdGVyOyovCisgICAgICAgIHsKKworICAgICAgICAgICByZXR1cm4gICAgIE9uZU9mKG9wdGltaXplZENoYXJzZXQxKSB8fCBIaWdoQ2hhcmFjdGVyKCk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgQW55Tm9TcGFjZUNvbHVtbkNoYXJhY3RlcigpICAgIC8qQW55Tm9TcGFjZUNvbHVtbkNoYXJhY3RlcjogKCdcJycgRXNjYXBlQ29sdW1uQ2hhcmFjdGVyKSAvIFVuZXNjYXBlZENvbHVtbkNoYXJhY3RlcjsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuICAgCisgICAgICAgICAgICAgICAgICAgICBBbmQoKCk9PiAgICBDaGFyKCdcJycpICYmIEVzY2FwZUNvbHVtbkNoYXJhY3RlcigpICkKKyAgICAgICAgICAgICAgICAgIHx8IFVuZXNjYXBlZENvbHVtbkNoYXJhY3RlcigpOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFNwYWNlZENvbW1hKCkgICAgLypTcGFjZWRDb21tYTogJyAnPyAnLCcgJyAnPzsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIEFuZCgoKT0+ICAKKyAgICAgICAgICAgICAgICAgICAgIE9wdGlvbigoKT0+IENoYXIoJyAnKSApCisgICAgICAgICAgICAgICAgICAmJiBDaGFyKCcsJykKKyAgICAgICAgICAgICAgICAgICYmIE9wdGlvbigoKT0+IENoYXIoJyAnKSApICk7CisJCX0KKyAgICAgICAgcHVibGljIGJvb2wgU3BhY2VkTEJyYWNrZXQoKSAgICAvKlNwYWNlZExCcmFja2V0OiAnWycgJyAnPzsqLworICAgICAgICB7CisKKyAgICAgICAgICAgcmV0dXJuIEFuZCgoKT0+ICAgIENoYXIoJ1snKSAmJiBPcHRpb24oKCk9PiBDaGFyKCcgJykgKSApOworCQl9CisgICAgICAgIHB1YmxpYyBib29sIFNwYWNlZFJCcmFja2V0KCkgICAgLypTcGFjZWRSQnJhY2tldDogJyAnPyAnXSc7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBBbmQoKCk9PiAgICBPcHRpb24oKCk9PiBDaGFyKCcgJykgKSAmJiBDaGFyKCddJykgKTsKKwkJfQorICAgICAgICBwdWJsaWMgYm9vbCB3cygpICAgIC8qd3M6ICcgJyo7Ki8KKyAgICAgICAgeworCisgICAgICAgICAgIHJldHVybiBPcHRSZXBlYXQoKCk9PiBDaGFyKCcgJykgKTsKKwkJfQorCQkjZW5kcmVnaW9uIEdyYW1tYXIgUnVsZXMKKworICAgICAgICAjcmVnaW9uIE9wdGltaXphdGlvbiBEYXRhIAorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgT3B0aW1pemVkQ2hhcnNldCBvcHRpbWl6ZWRDaGFyc2V0MDsKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIE9wdGltaXplZENoYXJzZXQgb3B0aW1pemVkQ2hhcnNldDE7CisgICAgICAgIAorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgT3B0aW1pemVkTGl0ZXJhbHMgb3B0aW1pemVkTGl0ZXJhbHMwOworICAgICAgICAKKyAgICAgICAgc3RhdGljIEV4Y2VsRm9ybXVsYSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIE9wdGltaXplZENoYXJzZXQuUmFuZ2VbXSByYW5nZXMgPSBuZXcgT3B0aW1pemVkQ2hhcnNldC5SYW5nZVtdCisgICAgICAgICAgICAgICAgICB7bmV3IE9wdGltaXplZENoYXJzZXQuUmFuZ2UoJ0EnLCdaJyksCisgICAgICAgICAgICAgICAgICAgbmV3IE9wdGltaXplZENoYXJzZXQuUmFuZ2UoJ2EnLCd6JyksCisgICAgICAgICAgICAgICAgICAgbmV3IE9wdGltaXplZENoYXJzZXQuUmFuZ2UoJzAnLCc5JyksCisgICAgICAgICAgICAgICAgICAgbmV3IE9wdGltaXplZENoYXJzZXQuUmFuZ2UoJywnLCcuJyksCisgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgIGNoYXJbXSBvbmVPZkNoYXJzID0gbmV3IGNoYXJbXSAgICB7JyEnLCciJywnIycsJyQnLCclJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsJyYnLCcoJywnKScsJysnLCc7JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsJzwnLCc9JywnPicsJ0AnLCdeJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsJ18nLCdgJywneycsJ3wnLCd9JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsJ34nLCcgJ307CisgICAgICAgICAgICAgICBvcHRpbWl6ZWRDaGFyc2V0MD0gbmV3IE9wdGltaXplZENoYXJzZXQocmFuZ2VzLG9uZU9mQ2hhcnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBPcHRpbWl6ZWRDaGFyc2V0LlJhbmdlW10gcmFuZ2VzID0gbmV3IE9wdGltaXplZENoYXJzZXQuUmFuZ2VbXQorICAgICAgICAgICAgICAgICAge25ldyBPcHRpbWl6ZWRDaGFyc2V0LlJhbmdlKCdBJywnWicpLAorICAgICAgICAgICAgICAgICAgIG5ldyBPcHRpbWl6ZWRDaGFyc2V0LlJhbmdlKCdhJywneicpLAorICAgICAgICAgICAgICAgICAgIG5ldyBPcHRpbWl6ZWRDaGFyc2V0LlJhbmdlKCcwJywnOScpLAorICAgICAgICAgICAgICAgICAgIG5ldyBPcHRpbWl6ZWRDaGFyc2V0LlJhbmdlKCcsJywnLicpLAorICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICBjaGFyW10gb25lT2ZDaGFycyA9IG5ldyBjaGFyW10gICAgeychJywnIicsJyMnLCckJywnJScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCcmJywnKCcsJyknLCcqJywnKycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCcvJywnOicsJzsnLCc8JywnPScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCc+JywnPycsJ0AnLCdcXCcsJ14nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwnXycsJ2AnLCd7JywnfCcsJ30nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwnfid9OworICAgICAgICAgICAgICAgb3B0aW1pemVkQ2hhcnNldDE9IG5ldyBPcHRpbWl6ZWRDaGFyc2V0KHJhbmdlcyxvbmVPZkNoYXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzdHJpbmdbXSBsaXRlcmFscz0KKyAgICAgICAgICAgICAgIHsgIjw+IiwiPj0iLCI8PSIsIl4iLCIqIiwiLyIsIisiLCItIiwKKyAgICAgICAgICAgICAgICAgICImIiwiPSIsIjwiLCI+IiB9OworICAgICAgICAgICAgICAgb3B0aW1pemVkTGl0ZXJhbHMwPSBuZXcgT3B0aW1pemVkTGl0ZXJhbHMobGl0ZXJhbHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uIE9wdGltaXphdGlvbiBEYXRhIAorICAgICAgICAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9GaWVsZFJldHJpZXZlci5jcyBiL09wZW5YbWxQb3dlclRvb2xzL0ZpZWxkUmV0cmlldmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTJiZDYKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9GaWVsZFJldHJpZXZlci5jcwpAQCAtMCwwICsxLDQzMSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7CisKK25hbWVzcGFjZSBPcGVuWG1sUG93ZXJUb29scworeworICAgIHB1YmxpYyBjbGFzcyBGaWVsZFJldHJpZXZlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgSW5zdHJUZXh0KFhFbGVtZW50IHJvb3QsIGludCBpZCkKKyAgICAgICAgeworCisgICAgICAgICAgICBYTmFtZXNwYWNlIHcgPSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluIjsKKworI2lmIGZhbHNlCisgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBvbGQgY29kZS4gIEJvdGggdmVyc2lvbnMgd29yayAtIHRoZSBjYWNoaW5nIHZlcnNpb24gaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIuCisgICAgICAgICAgICB2YXIgcmVsZXZhbnRFbGVtZW50cyA9IHJvb3QuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgIC5XaGVyZShlID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGFjazxGaWVsZEVsZW1lbnRUeXBlSW5mbz4gcyA9IGUuQW5ub3RhdGlvbjxTdGFjazxGaWVsZEVsZW1lbnRUeXBlSW5mbz4+KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5BbnkoeiA9PiB6LklkID09IGlkICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgei5GaWVsZEVsZW1lbnRUeXBlID09IEZpZWxkRWxlbWVudFR5cGVFbnVtLkluc3RyVGV4dCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyNlbHNlCisgICAgICAgICAgICB2YXIgY2FjaGVkQW5ub3RhdGlvbkluZm9ybWF0aW9uID0gcm9vdC5Bbm5vdGF0aW9uPERpY3Rpb25hcnk8aW50LCBMaXN0PFhFbGVtZW50Pj4+KCk7CisgICAgICAgICAgICBpZiAoY2FjaGVkQW5ub3RhdGlvbkluZm9ybWF0aW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworCisgICAgICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IGEgZmllbGQgY29kZSBjb250YWlucyBubyBpbnN0ciB0ZXh0CisgICAgICAgICAgICBpZiAoIWNhY2hlZEFubm90YXRpb25JbmZvcm1hdGlvbi5Db250YWluc0tleShpZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgdmFyIHJlbGV2YW50RWxlbWVudHMgPSBjYWNoZWRBbm5vdGF0aW9uSW5mb3JtYXRpb25baWRdOworI2VuZGlmCisKKyAgICAgICAgICAgIHZhciBncm91cGVkU3ViRmllbGRzID0gcmVsZXZhbnRFbGVtZW50cworICAgICAgICAgICAgICAgIC5Hcm91cEFkamFjZW50KGUgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YWNrPEZpZWxkRWxlbWVudFR5cGVJbmZvPiBzID0gZS5Bbm5vdGF0aW9uPFN0YWNrPEZpZWxkRWxlbWVudFR5cGVJbmZvPj4oKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHN0YWNrRWxlbWVudCA9IHMuRmlyc3RPckRlZmF1bHQoeiA9PiB6LklkID09IGlkKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRzQmVmb3JlID0gcy5UYWtlV2hpbGUoeiA9PiB6ICE9IHN0YWNrRWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50c0JlZm9yZS5BbnkoKTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKworICAgICAgICAgICAgdmFyIGluc3RyVGV4dCA9IGdyb3VwZWRTdWJGaWVsZHMKKyAgICAgICAgICAgICAgICAuU2VsZWN0KGcgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChnLktleSA9PSBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcuU2VsZWN0KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFjazxGaWVsZEVsZW1lbnRUeXBlSW5mbz4gcyA9IGUuQW5ub3RhdGlvbjxTdGFjazxGaWVsZEVsZW1lbnRUeXBlSW5mbz4+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YWNrRWxlbWVudCA9IHMuRmlyc3RPckRlZmF1bHQoeiA9PiB6LklkID09IGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tFbGVtZW50LkZpZWxkRWxlbWVudFR5cGUgPT0gRmllbGRFbGVtZW50VHlwZUVudW0uSW5zdHJUZXh0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSB3ICsgImluc3RyVGV4dCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLlZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdGFjazxGaWVsZEVsZW1lbnRUeXBlSW5mbz4gcyA9IGcuRmlyc3QoKS5Bbm5vdGF0aW9uPFN0YWNrPEZpZWxkRWxlbWVudFR5cGVJbmZvPj4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFja0VsZW1lbnQgPSBzLkZpcnN0T3JEZWZhdWx0KHogPT4gei5JZCA9PSBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudEJlZm9yZSA9IHMuVGFrZVdoaWxlKHogPT4geiAhPSBzdGFja0VsZW1lbnQpLkxhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJGaWVsZElkID0gZWxlbWVudEJlZm9yZS5JZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnN0clRleHQocm9vdCwgc3ViRmllbGRJZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZSgpOworCisgICAgICAgICAgICByZXR1cm4gInsiICsgaW5zdHJUZXh0ICsgIn0iOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEFubm90YXRlV2l0aEZpZWxkSW5mbyhPcGVuWG1sUGFydCBwYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICBYTmFtZXNwYWNlIHcgPSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluIjsKKworICAgICAgICAgICAgWEVsZW1lbnQgcm9vdCA9IHBhcnQuR2V0WERvY3VtZW50KCkuUm9vdDsKKyAgICAgICAgICAgIHZhciByID0gcm9vdC5EZXNjZW5kYW50c0FuZFNlbGYoKQorICAgICAgICAgICAgICAgIC5Sb2xsdXAoCisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZEVsZW1lbnRUeXBlU3RhY2sKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSWQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgRmlTdGFjayA9IG51bGwsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIChlLCBzKSA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5OYW1lID09IHcgKyAiZmxkQ2hhciIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuQXR0cmlidXRlKHcgKyAiZmxkQ2hhclR5cGUiKS5WYWx1ZSA9PSAiYmVnaW4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhY2s8RmllbGRFbGVtZW50VHlwZUluZm8+IGZpczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuRmlTdGFjayA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlzID0gbmV3IFN0YWNrPEZpZWxkRWxlbWVudFR5cGVJbmZvPigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXMgPSBuZXcgU3RhY2s8RmllbGRFbGVtZW50VHlwZUluZm8+KHMuRmlTdGFjay5SZXZlcnNlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXMuUHVzaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZEVsZW1lbnRUeXBlSW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkID0gcy5JZCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRFbGVtZW50VHlwZSA9IEZpZWxkRWxlbWVudFR5cGVFbnVtLkJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRFbGVtZW50VHlwZVN0YWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkID0gcy5JZCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaVN0YWNrID0gZmlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuQXR0cmlidXRlKHcgKyAiZmxkQ2hhclR5cGUiKS5WYWx1ZSA9PSAic2VwYXJhdGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhY2s8RmllbGRFbGVtZW50VHlwZUluZm8+IGZpcyA9IG5ldyBTdGFjazxGaWVsZEVsZW1lbnRUeXBlSW5mbz4ocy5GaVN0YWNrLlJldmVyc2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRWxlbWVudFR5cGVJbmZvIHdmaSA9IGZpcy5Qb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlzLlB1c2goCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGRFbGVtZW50VHlwZUluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZCA9IHdmaS5JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEVsZW1lbnRUeXBlID0gRmllbGRFbGVtZW50VHlwZUVudW0uU2VwYXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWVsZEVsZW1lbnRUeXBlU3RhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWQgPSBzLklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlTdGFjayA9IGZpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuQXR0cmlidXRlKHcgKyAiZmxkQ2hhclR5cGUiKS5WYWx1ZSA9PSAiZW5kIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrPEZpZWxkRWxlbWVudFR5cGVJbmZvPiBmaXMgPSBuZXcgU3RhY2s8RmllbGRFbGVtZW50VHlwZUluZm8+KHMuRmlTdGFjay5SZXZlcnNlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEVsZW1lbnRUeXBlSW5mbyB3ZmkgPSBmaXMuUG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRFbGVtZW50VHlwZVN0YWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkID0gcy5JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpU3RhY2sgPSBmaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuRmlTdGFjayA9PSBudWxsIHx8IHMuRmlTdGFjay5Db3VudCgpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEVsZW1lbnRUeXBlSW5mbyB3ZmkzID0gcy5GaVN0YWNrLlBlZWsoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZmkzLkZpZWxkRWxlbWVudFR5cGUgPT0gRmllbGRFbGVtZW50VHlwZUVudW0uQmVnaW4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhY2s8RmllbGRFbGVtZW50VHlwZUluZm8+IGZpcyA9IG5ldyBTdGFjazxGaWVsZEVsZW1lbnRUeXBlSW5mbz4ocy5GaVN0YWNrLlJldmVyc2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRFbGVtZW50VHlwZUluZm8gd2ZpMiA9IGZpcy5Qb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXMuUHVzaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpZWxkRWxlbWVudFR5cGVJbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkID0gd2ZpMi5JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRWxlbWVudFR5cGUgPSBGaWVsZEVsZW1lbnRUeXBlRW51bS5JbnN0clRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRFbGVtZW50VHlwZVN0YWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZCA9IHMuSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpU3RhY2sgPSBmaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZmkzLkZpZWxkRWxlbWVudFR5cGUgPT0gRmllbGRFbGVtZW50VHlwZUVudW0uU2VwYXJhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhY2s8RmllbGRFbGVtZW50VHlwZUluZm8+IGZpcyA9IG5ldyBTdGFjazxGaWVsZEVsZW1lbnRUeXBlSW5mbz4ocy5GaVN0YWNrLlJldmVyc2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRFbGVtZW50VHlwZUluZm8gd2ZpMiA9IGZpcy5Qb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXMuUHVzaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpZWxkRWxlbWVudFR5cGVJbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkID0gd2ZpMi5JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRWxlbWVudFR5cGUgPSBGaWVsZEVsZW1lbnRUeXBlRW51bS5SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRFbGVtZW50VHlwZVN0YWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZCA9IHMuSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpU3RhY2sgPSBmaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZmkzLkZpZWxkRWxlbWVudFR5cGUgPT0gRmllbGRFbGVtZW50VHlwZUVudW0uRW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrPEZpZWxkRWxlbWVudFR5cGVJbmZvPiBmaXMgPSBuZXcgU3RhY2s8RmllbGRFbGVtZW50VHlwZUluZm8+KHMuRmlTdGFjay5SZXZlcnNlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcy5Qb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcy5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpZWxkRWxlbWVudFR5cGVTdGFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWQgPSBzLklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaVN0YWNrID0gZmlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB2YXIgZWxlbWVudFBsdXNJbmZvID0gcm9vdC5EZXNjZW5kYW50c0FuZFNlbGYoKS5QdFppcChyLCAodDEsIHQyKSA9PgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgPSB0MSwKKyAgICAgICAgICAgICAgICAgICAgSWQgPSB0Mi5JZCwKKyAgICAgICAgICAgICAgICAgICAgV21sRmllbGRJbmZvU3RhY2sgPSB0Mi5GaVN0YWNrLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGVsZW1lbnRQbHVzSW5mbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS5XbWxGaWVsZEluZm9TdGFjayAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBpdGVtLkVsZW1lbnQuQWRkQW5ub3RhdGlvbihpdGVtLldtbEZpZWxkSW5mb1N0YWNrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9UaGlzIGNvZGUgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGFubm90YXRpb25zLCBtYWtpbmcgc3VyZSB0aGF0IHRoZXkgYXJlIG1hZGUgY29ycmVjdGx5LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vZm9yZWFjaCAodmFyIGRlc2MgaW4gcm9vdC5EZXNjZW5kYW50c0FuZFNlbGYoKSkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgU3RhY2s8RmllbGRFbGVtZW50VHlwZUluZm8+IHMgPSBkZXNjLkFubm90YXRpb248U3RhY2s8RmllbGRFbGVtZW50VHlwZUluZm8+PigpOworICAgICAgICAgICAgLy8gICAgaWYgKHMgIT0gbnVsbCkKKyAgICAgICAgICAgIC8vICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICBDb25zb2xlLldyaXRlTGluZShkZXNjLk5hbWUuTG9jYWxOYW1lLlBhZFJpZ2h0KDIwKSk7CisgICAgICAgICAgICAvLyAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gcykKKyAgICAgICAgICAgIC8vICAgICAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgICAgezA6MDAwMH0gezF9IiwgaXRlbS5JZCwgaXRlbS5GaWVsZEVsZW1lbnRUeXBlLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgLy8gICAgICAgICAgICBDb25zb2xlLlJlYWRLZXkoKTsKKyAgICAgICAgICAgIC8vICAgICAgICB9CisgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAvL30KKworICAgICAgICAgICAgdmFyIGNhY2hlZEFubm90YXRpb25JbmZvcm1hdGlvbiA9IG5ldyBEaWN0aW9uYXJ5PGludCwgTGlzdDxYRWxlbWVudD4+KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZGVzYyBpbiByb290LkRlc2NlbmRhbnRzVHJpbW1lZChkID0+IGQuTmFtZSA9PSBXLnJQciB8fCBkLk5hbWUgPT0gVy5wUHIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YWNrPEZpZWxkRWxlbWVudFR5cGVJbmZvPiBzID0gZGVzYy5Bbm5vdGF0aW9uPFN0YWNrPEZpZWxkRWxlbWVudFR5cGVJbmZvPj4oKTsKKworICAgICAgICAgICAgICAgIGlmIChzICE9IG51bGwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uRmllbGRFbGVtZW50VHlwZSA9PSBGaWVsZEVsZW1lbnRUeXBlRW51bS5JbnN0clRleHQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZEFubm90YXRpb25JbmZvcm1hdGlvbi5Db250YWluc0tleShpdGVtLklkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEFubm90YXRpb25JbmZvcm1hdGlvbltpdGVtLklkXS5BZGQoZGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEFubm90YXRpb25JbmZvcm1hdGlvbi5BZGQoaXRlbS5JZCwgbmV3IExpc3Q8WEVsZW1lbnQ+KCkgeyBkZXNjIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJvb3QuQWRkQW5ub3RhdGlvbihjYWNoZWRBbm5vdGF0aW9uSW5mb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIFN0YXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIEluVG9rZW4sCisgICAgICAgICAgICBJbldoaXRlU3BhY2UsCisgICAgICAgICAgICBJblF1b3RlZFRva2VuLAorICAgICAgICAgICAgT25PcGVuaW5nUXVvdGUsCisgICAgICAgICAgICBPbkNsb3NpbmdRdW90ZSwKKyAgICAgICAgICAgIE9uQmFja3NsYXNoLAorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gR2V0VG9rZW5zKHN0cmluZyBmaWVsZCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdGUgc3RhdGUgPSBTdGF0ZS5JbldoaXRlU3BhY2U7CisgICAgICAgICAgICBpbnQgdG9rZW5TdGFydCA9IDA7CisgICAgICAgICAgICBjaGFyIHF1b3RlU3RhcnQgPSBjaGFyLk1pblZhbHVlOworICAgICAgICAgICAgTGlzdDxzdHJpbmc+IHRva2VucyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgZmllbGQuTGVuZ3RoOyBjKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKENoYXIuSXNXaGl0ZVNwYWNlKGZpZWxkW2NdKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5JblRva2VuKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMuQWRkKGZpZWxkLlN1YnN0cmluZyh0b2tlblN0YXJ0LCBjIC0gdG9rZW5TdGFydCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5JbldoaXRlU3BhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuT25PcGVuaW5nUXVvdGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuU3RhcnQgPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5JblF1b3RlZFRva2VuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5PbkNsb3NpbmdRdW90ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuSW5XaGl0ZVNwYWNlOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkW2NdID09ICdcXCcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuSW5RdW90ZWRUb2tlbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5PbkJhY2tzbGFzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5PbkJhY2tzbGFzaCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuSW5RdW90ZWRUb2tlbjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmaWVsZFtjXSA9PSAnIicgfHwgZmllbGRbY10gPT0gJ1wnJyB8fCBmaWVsZFtjXSA9PSAweDIwMWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuSW5XaGl0ZVNwYWNlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZVN0YXJ0ID0gZmllbGRbY107CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLk9uT3BlbmluZ1F1b3RlOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkluUXVvdGVkVG9rZW4pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZFtjXSA9PSBxdW90ZVN0YXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5BZGQoZmllbGQuU3Vic3RyaW5nKHRva2VuU3RhcnQsIGMgLSB0b2tlblN0YXJ0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5PbkNsb3NpbmdRdW90ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5Pbk9wZW5pbmdRdW90ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkW2NdID09IHF1b3RlU3RhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5PbkNsb3NpbmdRdW90ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblN0YXJ0ID0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkluUXVvdGVkVG9rZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5JbldoaXRlU3BhY2UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0b2tlblN0YXJ0ID0gYzsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5JblRva2VuOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLk9uT3BlbmluZ1F1b3RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5TdGFydCA9IGM7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuSW5RdW90ZWRUb2tlbjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5PbkNsb3NpbmdRdW90ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRva2VuU3RhcnQgPSBjOworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkluVG9rZW47CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5JblRva2VuKQorICAgICAgICAgICAgICAgIHRva2Vucy5BZGQoZmllbGQuU3Vic3RyaW5nKHRva2VuU3RhcnQsIGZpZWxkLkxlbmd0aCAtIHRva2VuU3RhcnQpKTsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbnMuVG9BcnJheSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBGaWVsZEluZm8gUGFyc2VGaWVsZChzdHJpbmcgZmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpZWxkSW5mbyBlbXB0eUZpZWxkID0gbmV3IEZpZWxkSW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpZWxkVHlwZSA9ICIiLAorICAgICAgICAgICAgICAgIEFyZ3VtZW50cyA9IG5ldyBzdHJpbmdbXSB7IH0sCisgICAgICAgICAgICAgICAgU3dpdGNoZXMgPSBuZXcgc3RyaW5nW10geyB9LAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaWYgKGZpZWxkLkxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlbXB0eUZpZWxkOworICAgICAgICAgICAgc3RyaW5nIGZpZWxkVHlwZSA9IGZpZWxkLlRyaW1TdGFydCgpLlNwbGl0KCcgJykuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChmaWVsZFR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHlGaWVsZDsKKyAgICAgICAgICAgIGlmIChmaWVsZFR5cGUuVG9VcHBlcigpICE9ICJIWVBFUkxJTksiICYmCisgICAgICAgICAgICAgICAgZmllbGRUeXBlLlRvVXBwZXIoKSAhPSAiUkVGIiAmJgorICAgICAgICAgICAgICAgIGZpZWxkVHlwZS5Ub1VwcGVyKCkgIT0gIlNFUSIgJiYKKyAgICAgICAgICAgICAgICBmaWVsZFR5cGUuVG9VcHBlcigpICE9ICJTVFlMRVJFRiIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVtcHR5RmllbGQ7CisgICAgICAgICAgICBzdHJpbmdbXSB0b2tlbnMgPSBHZXRUb2tlbnMoZmllbGQpOworICAgICAgICAgICAgaWYgKHRva2Vucy5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHlGaWVsZDsKKyAgICAgICAgICAgIEZpZWxkSW5mbyBmaWVsZEluZm8gPSBuZXcgRmllbGRJbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWVsZFR5cGUgPSB0b2tlbnNbMF0sCisgICAgICAgICAgICAgICAgU3dpdGNoZXMgPSB0b2tlbnMuV2hlcmUodCA9PiB0WzBdID09ICdcXCcpLlRvQXJyYXkoKSwKKyAgICAgICAgICAgICAgICBBcmd1bWVudHMgPSB0b2tlbnMuU2tpcCgxKS5XaGVyZSh0ID0+IHRbMF0gIT0gJ1xcJykuVG9BcnJheSgpLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZEluZm87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgRmllbGRJbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGRUeXBlOworICAgICAgICAgICAgcHVibGljIHN0cmluZ1tdIFN3aXRjaGVzOworICAgICAgICAgICAgcHVibGljIHN0cmluZ1tdIEFyZ3VtZW50czsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBlbnVtIEZpZWxkRWxlbWVudFR5cGVFbnVtCisgICAgICAgIHsKKyAgICAgICAgICAgIEJlZ2luLAorICAgICAgICAgICAgSW5zdHJUZXh0LAorICAgICAgICAgICAgU2VwYXJhdGUsCisgICAgICAgICAgICBSZXN1bHQsCisgICAgICAgICAgICBFbmQsCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGNsYXNzIEZpZWxkRWxlbWVudFR5cGVJbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgSWQ7CisgICAgICAgICAgICBwdWJsaWMgRmllbGRFbGVtZW50VHlwZUVudW0gRmllbGRFbGVtZW50VHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBGaWVsZEVsZW1lbnRUeXBlU3RhY2sKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBJZDsKKyAgICAgICAgICAgIHB1YmxpYyBTdGFjazxGaWVsZEVsZW1lbnRUeXBlSW5mbz4gRmlTdGFjazsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzL0Zvcm1hdHRpbmdBc3NlbWJsZXIuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9Gb3JtYXR0aW5nQXNzZW1ibGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MzhlNDMKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9Gb3JtYXR0aW5nQXNzZW1ibGVyLmNzCkBAIC0wLDAgKzEsMzUyNSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgcHVibGljIGNsYXNzIEZvcm1hdHRpbmdBc3NlbWJsZXJTZXR0aW5ncworICAgIHsKKyAgICAgICAgcHVibGljIGJvb2wgUmVtb3ZlU3R5bGVOYW1lc0Zyb21QYXJhZ3JhcGhBbmRSdW5Qcm9wZXJ0aWVzOworICAgICAgICBwdWJsaWMgYm9vbCBDbGVhclN0eWxlczsKKyAgICAgICAgcHVibGljIGJvb2wgT3JkZXJFbGVtZW50c1BlclN0YW5kYXJkOworICAgICAgICBwdWJsaWMgYm9vbCBDcmVhdGVIdG1sQ29udmVydGVyQW5ub3RhdGlvbkF0dHJpYnV0ZXM7CisgICAgICAgIHB1YmxpYyBib29sIFJlc3RyaWN0VG9TdXBwb3J0ZWROdW1iZXJpbmdGb3JtYXRzOworICAgICAgICBwdWJsaWMgYm9vbCBSZXN0cmljdFRvU3VwcG9ydGVkTGFuZ3VhZ2VzOworICAgICAgICBwdWJsaWMgTGlzdEl0ZW1SZXRyaWV2ZXJTZXR0aW5ncyBMaXN0SXRlbVJldHJpZXZlclNldHRpbmdzOworCisgICAgICAgIHB1YmxpYyBGb3JtYXR0aW5nQXNzZW1ibGVyU2V0dGluZ3MoKQorICAgICAgICB7CisgICAgICAgICAgICBSZW1vdmVTdHlsZU5hbWVzRnJvbVBhcmFncmFwaEFuZFJ1blByb3BlcnRpZXMgPSB0cnVlOworICAgICAgICAgICAgQ2xlYXJTdHlsZXMgPSB0cnVlOworICAgICAgICAgICAgT3JkZXJFbGVtZW50c1BlclN0YW5kYXJkID0gdHJ1ZTsKKyAgICAgICAgICAgIENyZWF0ZUh0bWxDb252ZXJ0ZXJBbm5vdGF0aW9uQXR0cmlidXRlcyA9IHRydWU7CisgICAgICAgICAgICBSZXN0cmljdFRvU3VwcG9ydGVkTnVtYmVyaW5nRm9ybWF0cyA9IGZhbHNlOworICAgICAgICAgICAgUmVzdHJpY3RUb1N1cHBvcnRlZExhbmd1YWdlcyA9IGZhbHNlOworICAgICAgICAgICAgTGlzdEl0ZW1SZXRyaWV2ZXJTZXR0aW5ncyA9IG5ldyBMaXN0SXRlbVJldHJpZXZlclNldHRpbmdzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1hdHRpbmdBc3NlbWJsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgV21sRG9jdW1lbnQgQXNzZW1ibGVGb3JtYXR0aW5nKFdtbERvY3VtZW50IGRvY3VtZW50LCBGb3JtYXR0aW5nQXNzZW1ibGVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgc3RyZWFtRG9jID0gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudChkb2N1bWVudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jID0gc3RyZWFtRG9jLkdldFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFzc2VtYmxlRm9ybWF0dGluZyhkb2MsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbURvYy5HZXRNb2RpZmllZFdtbERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQXNzZW1ibGVGb3JtYXR0aW5nKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYywgRm9ybWF0dGluZ0Fzc2VtYmxlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBGb3JtYXR0aW5nQXNzZW1ibGVySW5mbyBmYWkgPSBuZXcgRm9ybWF0dGluZ0Fzc2VtYmxlckluZm8oKTsKKyAgICAgICAgICAgIFhEb2N1bWVudCBzWERvYyA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5TdHlsZURlZmluaXRpb25zUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGRlZmF1bHRQYXJhZ3JhcGhTdHlsZSA9IHNYRG9jCisgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoc3QgPT4gc3QuQXR0cmlidXRlKFcuX2RlZmF1bHQpLlRvQm9vbGVhbigpID09IHRydWUgJiYKKyAgICAgICAgICAgICAgICAgICAgKHN0cmluZylzdC5BdHRyaWJ1dGUoVy50eXBlKSA9PSAicGFyYWdyYXBoIik7CisgICAgICAgICAgICBpZiAoZGVmYXVsdFBhcmFncmFwaFN0eWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmFpLkRlZmF1bHRQYXJhZ3JhcGhTdHlsZU5hbWUgPSAoc3RyaW5nKWRlZmF1bHRQYXJhZ3JhcGhTdHlsZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGRlZmF1bHRDaGFyYWN0ZXJTdHlsZSA9IHNYRG9jCisgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoc3QgPT4gc3QuQXR0cmlidXRlKFcuX2RlZmF1bHQpLlRvQm9vbGVhbigpID09IHRydWUgJiYKKyAgICAgICAgICAgICAgICAgICAgKHN0cmluZylzdC5BdHRyaWJ1dGUoVy50eXBlKSA9PSAiY2hhcmFjdGVyIik7CisgICAgICAgICAgICBpZiAoZGVmYXVsdENoYXJhY3RlclN0eWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmFpLkRlZmF1bHRDaGFyYWN0ZXJTdHlsZU5hbWUgPSAoc3RyaW5nKWRlZmF1bHRDaGFyYWN0ZXJTdHlsZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGRlZmF1bHRUYWJsZVN0eWxlID0gc1hEb2MKKyAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChzdCA9PiBzdC5BdHRyaWJ1dGUoVy5fZGVmYXVsdCkuVG9Cb29sZWFuKCkgPT0gdHJ1ZSAmJgorICAgICAgICAgICAgICAgICAgICAoc3RyaW5nKXN0LkF0dHJpYnV0ZShXLnR5cGUpID09ICJ0YWJsZSIpOworICAgICAgICAgICAgaWYgKGRlZmF1bHRUYWJsZVN0eWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmFpLkRlZmF1bHRUYWJsZVN0eWxlTmFtZSA9IChzdHJpbmcpZGVmYXVsdFRhYmxlU3R5bGUuQXR0cmlidXRlKFcuc3R5bGVJZCk7CisgICAgICAgICAgICBMaXN0SXRlbVJldHJpZXZlclNldHRpbmdzIGxpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3MgPSBuZXcgTGlzdEl0ZW1SZXRyaWV2ZXJTZXR0aW5ncygpOworICAgICAgICAgICAgQXNzZW1ibGVMaXN0SXRlbUluZm9ybWF0aW9uKHdEb2MsIHNldHRpbmdzLkxpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3MpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gd0RvYy5Db250ZW50UGFydHMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcHhkID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBGaXhOb25jb25mb3JtYW50SGV4VmFsdWVzKHB4ZC5Sb290KTsKKyAgICAgICAgICAgICAgICBBbm5vdGF0ZVdpdGhHbG9iYWxEZWZhdWx0cyh3RG9jLCBweGQuUm9vdCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIEFubm90YXRlVGFibGVzV2l0aFRhYmxlU3R5bGVzKHdEb2MsIHB4ZC5Sb290KTsKKyAgICAgICAgICAgICAgICBBbm5vdGF0ZVBhcmFncmFwaHMoZmFpLCB3RG9jLCBweGQuUm9vdCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIEFubm90YXRlUnVucyhmYWksIHdEb2MsIHB4ZC5Sb290LCBzZXR0aW5ncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb3JtYWxpemVMaXN0SXRlbXMoZmFpLCB3RG9jLCBzZXR0aW5ncyk7CisgICAgICAgICAgICBpZiAoc2V0dGluZ3MuQ2xlYXJTdHlsZXMpCisgICAgICAgICAgICAgICAgQ2xlYXJTdHlsZXMod0RvYyk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFydCBpbiB3RG9jLkNvbnRlbnRQYXJ0cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBweGQgPSBwYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIHB4ZC5Sb290LkRlc2NlbmRhbnRzKCkuQXR0cmlidXRlcygpLldoZXJlKGEgPT4gYS5Jc05hbWVzcGFjZURlY2xhcmF0aW9uKS5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBGb3JtYXR0aW5nQXNzZW1ibGVyLk5vcm1hbGl6ZVByb3BzRm9yUGFydChweGQsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICB2YXIgbmV3Um9vdCA9IChYRWxlbWVudClDbGVhbnVwVHJhbnNmb3JtKHB4ZC5Sb290KTsKKyAgICAgICAgICAgICAgICBweGQuUm9vdC5SZXBsYWNlV2l0aChuZXdSb290KTsKKyAgICAgICAgICAgICAgICBwYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBGaXhOb25jb25mb3JtYW50SGV4VmFsdWVzKFhFbGVtZW50IHJvb3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0YmxMb29rIGluIHJvb3QuRGVzY2VuZGFudHMoVy50YmxMb29rKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodGJsTG9vay5BdHRyaWJ1dGVzKCkuQW55KGEgPT4gYS5OYW1lICE9IFcudmFsKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKHRibExvb2suQXR0cmlidXRlKFcudmFsKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgaGV4VmFsdWUgPSB0YmxMb29rLkF0dHJpYnV0ZShXLnZhbCkuVmFsdWU7CisgICAgICAgICAgICAgICAgaW50IHZhbCA9IGludC5QYXJzZShoZXhWYWx1ZSwgU3lzdGVtLkdsb2JhbGl6YXRpb24uTnVtYmVyU3R5bGVzLkhleE51bWJlcik7CisgICAgICAgICAgICAgICAgdGJsTG9vay5BZGQobmV3IFhBdHRyaWJ1dGUoVy5maXJzdFJvdywgKHZhbCAmIDB4MDAyMCkgIT0gMCA/ICIxIiA6ICIwIikpOworICAgICAgICAgICAgICAgIHRibExvb2suQWRkKG5ldyBYQXR0cmlidXRlKFcubGFzdFJvdywgKHZhbCAmIDB4MDA0MCkgIT0gMCA/ICIxIiA6ICIwIikpOworICAgICAgICAgICAgICAgIHRibExvb2suQWRkKG5ldyBYQXR0cmlidXRlKFcuZmlyc3RDb2x1bW4sICh2YWwgJiAweDAwODApICE9IDAgPyAiMSIgOiAiMCIpKTsKKyAgICAgICAgICAgICAgICB0YmxMb29rLkFkZChuZXcgWEF0dHJpYnV0ZShXLmxhc3RDb2x1bW4sICh2YWwgJiAweDAxMDApICE9IDAgPyAiMSIgOiAiMCIpKTsKKyAgICAgICAgICAgICAgICB0YmxMb29rLkFkZChuZXcgWEF0dHJpYnV0ZShXLm5vSEJhbmQsICh2YWwgJiAweDAyMDApICE9IDAgPyAiMSIgOiAiMCIpKTsKKyAgICAgICAgICAgICAgICB0YmxMb29rLkFkZChuZXcgWEF0dHJpYnV0ZShXLm5vVkJhbmQsICh2YWwgJiAweDA0MDApICE9IDAgPyAiMSIgOiAiMCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjbmZTdHlsZSBpbiByb290LkRlc2NlbmRhbnRzKFcuY25mU3R5bGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbmZTdHlsZS5BdHRyaWJ1dGVzKCkuQW55KGEgPT4gYS5OYW1lICE9IFcudmFsKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGNuZlN0eWxlLkF0dHJpYnV0ZShXLnZhbCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgdmFyIHZhID0gY25mU3R5bGUuQXR0cmlidXRlKFcudmFsKS5WYWx1ZS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgY25mU3R5bGUuQWRkKG5ldyBYQXR0cmlidXRlKFcuZmlyc3RSb3csIHZhWzBdKSk7CisgICAgICAgICAgICAgICAgY25mU3R5bGUuQWRkKG5ldyBYQXR0cmlidXRlKFcubGFzdFJvdywgdmFbMV0pKTsKKyAgICAgICAgICAgICAgICBjbmZTdHlsZS5BZGQobmV3IFhBdHRyaWJ1dGUoVy5maXJzdENvbHVtbiwgdmFbMl0pKTsKKyAgICAgICAgICAgICAgICBjbmZTdHlsZS5BZGQobmV3IFhBdHRyaWJ1dGUoVy5sYXN0Q29sdW1uLCB2YVszXSkpOworICAgICAgICAgICAgICAgIGNuZlN0eWxlLkFkZChuZXcgWEF0dHJpYnV0ZShXLm9kZFZCYW5kLCB2YVs0XSkpOworICAgICAgICAgICAgICAgIGNuZlN0eWxlLkFkZChuZXcgWEF0dHJpYnV0ZShXLmV2ZW5WQmFuZCwgdmFbNV0pKTsKKyAgICAgICAgICAgICAgICBjbmZTdHlsZS5BZGQobmV3IFhBdHRyaWJ1dGUoVy5vZGRIQmFuZCwgdmFbNl0pKTsKKyAgICAgICAgICAgICAgICBjbmZTdHlsZS5BZGQobmV3IFhBdHRyaWJ1dGUoVy5ldmVuSEJhbmQsIHZhWzddKSk7CisgICAgICAgICAgICAgICAgY25mU3R5bGUuQWRkKG5ldyBYQXR0cmlidXRlKFcuZmlyc3RSb3dMYXN0Q29sdW1uLCB2YVs4XSkpOworICAgICAgICAgICAgICAgIGNuZlN0eWxlLkFkZChuZXcgWEF0dHJpYnV0ZShXLmZpcnN0Um93Rmlyc3RDb2x1bW4sIHZhWzldKSk7CisgICAgICAgICAgICAgICAgY25mU3R5bGUuQWRkKG5ldyBYQXR0cmlidXRlKFcubGFzdFJvd0xhc3RDb2x1bW4sIHZhWzEwXSkpOworICAgICAgICAgICAgICAgIGNuZlN0eWxlLkFkZChuZXcgWEF0dHJpYnV0ZShXLmxhc3RSb3dGaXJzdENvbHVtbiwgdmFbMTFdKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQ2xlYW51cFRyYW5zZm9ybShYTm9kZSBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRhYnMgJiYgZWxlbWVudC5FbGVtZW50KFcudGFiKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy50YmxTdHlsZVJvd0JhbmRTaXplIHx8IGVsZW1lbnQuTmFtZSA9PSBXLnRibFN0eWxlQ29sQmFuZFNpemUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgLy8gYSBjbGVhbmVyIHNvbHV0aW9uIHdvdWxkIGJlIHRvIG5vdCBpbmNsdWRlIHRoZSB3OmlucyBhbmQgdzpkZWwgZWxlbWVudHMgd2hlbiByb2xsaW5nIHVwIHRoZSBwYXJhZ3JhcGggcnVuIHByb3BlcnRpZXMgaW50bworICAgICAgICAgICAgICAgIC8vIHRoZSBydW4gcHJvcGVydGllcy4KKyAgICAgICAgICAgICAgICBpZiAoKGVsZW1lbnQuTmFtZSA9PSBXLmlucyB8fCBlbGVtZW50Lk5hbWUgPT0gVy5kZWwpICYmIGVsZW1lbnQuUGFyZW50Lk5hbWUgPT0gVy5yUHIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5QYXJlbnQuUGFyZW50Lk5hbWUgPT0gVy5yIHx8IGVsZW1lbnQuUGFyZW50LlBhcmVudC5OYW1lID09IFcuclByQ2hhbmdlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gQ2xlYW51cFRyYW5zZm9ybShuKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENsZWFyU3R5bGVzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0eWxlUGFydCA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5TdHlsZURlZmluaXRpb25zUGFydDsKKyAgICAgICAgICAgIHZhciBzWERvYyA9IHN0eWxlUGFydC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgdmFyIG5ld1Jvb3QgPSBuZXcgWEVsZW1lbnQoc1hEb2MuUm9vdC5OYW1lLAorICAgICAgICAgICAgICAgIHNYRG9jLlJvb3QuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgIHNYRG9jLlJvb3QuRWxlbWVudHMoKS5TZWxlY3QoZSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUuTmFtZSAhPSBXLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZS5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZS5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlLkVsZW1lbnQoVy5uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnBQciksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yUHIpKTsKKyAgICAgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgICAgIHZhciBnbG9iYWxyUHIgPSBuZXdSb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuZG9jRGVmYXVsdHMpCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuclByRGVmYXVsdCkKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5yUHIpCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoZ2xvYmFsclByICE9IG51bGwpCisgICAgICAgICAgICAgICAgZ2xvYmFsclByLlJlcGxhY2VXaXRoKG5ldyBYRWxlbWVudChXLnJQcikpOworCisgICAgICAgICAgICB2YXIgZ2xvYmFscFByID0gbmV3Um9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmRvY0RlZmF1bHRzKQorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnBQckRlZmF1bHQpCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucFByKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGdsb2JhbHBQciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGdsb2JhbHBQci5SZXBsYWNlV2l0aChuZXcgWEVsZW1lbnQoVy5wUHIpKTsKKworICAgICAgICAgICAgc1hEb2MuUm9vdC5SZXBsYWNlV2l0aChuZXdSb290KTsKKworICAgICAgICAgICAgc3R5bGVQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBOb3JtYWxpemVMaXN0SXRlbXMoRm9ybWF0dGluZ0Fzc2VtYmxlckluZm8gZmFpLCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIEZvcm1hdHRpbmdBc3NlbWJsZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gd0RvYy5Db250ZW50UGFydHMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcHhkID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdSb290ID0gKFhFbGVtZW50KU5vcm1hbGl6ZUxpc3RJdGVtc1RyYW5zZm9ybShmYWksIHdEb2MsIHB4ZC5Sb290LCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgaWYgKG5ld1Jvb3QuQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAicHQxNCIpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIG5ld1Jvb3QuQWRkKG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAicHQxNCIsIFB0T3BlblhtbC5wdC5OYW1lc3BhY2VOYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKG5ld1Jvb3QuQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAibWMiKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBuZXdSb290LkFkZChuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgIm1jIiwgTUMubWMuTmFtZXNwYWNlTmFtZSkpOworICAgICAgICAgICAgICAgIHB4ZC5Sb290LlJlcGxhY2VXaXRoKG5ld1Jvb3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IE5vcm1hbGl6ZUxpc3RJdGVtc1RyYW5zZm9ybShGb3JtYXR0aW5nQXNzZW1ibGVySW5mbyBmYWksIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYywgWE5vZGUgbm9kZSwgRm9ybWF0dGluZ0Fzc2VtYmxlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxpID0gTGlzdEl0ZW1SZXRyaWV2ZXIuUmV0cmlldmVMaXN0SXRlbSh3RG9jLCBlbGVtZW50LCBzZXR0aW5ncy5MaXN0SXRlbVJldHJpZXZlclNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3RJdGVtUmV0cmlldmVyLkxpc3RJdGVtSW5mbyBsaXN0SXRlbUluZm8gPSBlbGVtZW50LkFubm90YXRpb248TGlzdEl0ZW1SZXRyaWV2ZXIuTGlzdEl0ZW1JbmZvPigpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UGFyYVByb3BzID0gbmV3IFhFbGVtZW50KFcucFByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoVy5wUHIpLkVsZW1lbnRzKCkuV2hlcmUoZSA9PiBlLk5hbWUgIT0gVy5udW1QcikKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGxpc3RJdGVtUnVuUHJvcHMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaW50PyBhYnN0cmFjdE51bUlkID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0SXRlbUluZm8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnN0cmFjdE51bUlkID0gbGlzdEl0ZW1JbmZvLkFic3RyYWN0TnVtSWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYVN0eWxlUnVuUHJvcHMgPSBDaGFyU3R5bGVSb2xsdXAoZmFpLCB3RG9jLCBlbGVtZW50KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhZ3JhcGhTdHlsZU5hbWUgPSAoc3RyaW5nKWVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucFByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5wU3R5bGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKFcudmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBkZWZhdWx0U3R5bGVOYW1lID0gKHN0cmluZyl3RG9jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuTWFpbkRvY3VtZW50UGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlN0eWxlRGVmaW5pdGlvbnNQYXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR2V0WERvY3VtZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShzID0+IChzdHJpbmcpcy5BdHRyaWJ1dGUoVy50eXBlKSA9PSAicGFyYWdyYXBoIiAmJiBzLkF0dHJpYnV0ZShXLl9kZWZhdWx0KS5Ub0Jvb2xlYW4oKSA9PSB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy5zdHlsZUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYWdyYXBoU3R5bGVOYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaFN0eWxlTmFtZSA9IGRlZmF1bHRTdHlsZU5hbWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgc3R5bGVzWERvYyA9IHdEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk1haW5Eb2N1bWVudFBhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlN0eWxlRGVmaW5pdGlvbnNQYXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1dCB0b2dldGhlciBydW4gcHJvcHMgZm9yIGxpc3QgaXRlbS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGx2bFN0eWxlUnByID0gUGFyYVN0eWxlUnVuUHJvcHNTdGFjayh3RG9jLCBwYXJhZ3JhcGhTdHlsZU5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZ2dyZWdhdGUobmV3IFhFbGVtZW50KFcuclByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyLCBzKSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDaGFyU3R5bGVSdW5Qcm9wcyA9IE1lcmdlU3R5bGVFbGVtZW50KHMsIHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdDaGFyU3R5bGVSdW5Qcm9wczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lcmdlZFJ1blByb3BzID0gTWVyZ2VTdHlsZUVsZW1lbnQobHZsU3R5bGVScHIsIHBhcmFTdHlsZVJ1blByb3BzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY2N1bXVsYXRlZFJ1blByb3BzID0gZWxlbWVudC5FbGVtZW50cyhQdE9wZW5YbWwucFByKS5FbGVtZW50cyhXLnJQcikuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWNjdW11bGF0ZWRSdW5Qcm9wcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRSdW5Qcm9wcyA9IE1lcmdlU3R5bGVFbGVtZW50KGFjY3VtdWxhdGVkUnVuUHJvcHMsIG1lcmdlZFJ1blByb3BzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0SXRlbUx2bCA9IGxpc3RJdGVtSW5mby5MdmwoTGlzdEl0ZW1SZXRyaWV2ZXIuR2V0UGFyYWdyYXBoTGV2ZWwoZWxlbWVudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0SXRlbUx2bFJ1blByb3BzID0gbGlzdEl0ZW1MdmwuRWxlbWVudHMoVy5yUHIpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW1SdW5Qcm9wcyA9IE1lcmdlU3R5bGVFbGVtZW50KGxpc3RJdGVtTHZsUnVuUHJvcHMsIG1lcmdlZFJ1blByb3BzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyaW5nKWxpc3RJdGVtTHZsLkVsZW1lbnRzKFcubnVtRm10KS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpID09ICJidWxsZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW1SdW5Qcm9wcy5FbGVtZW50cyhXLnJ0bCkuUmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwUHIgPSBlbGVtZW50LkVsZW1lbnQoUHRPcGVuWG1sLnBQcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgYmlkaWVsID0gcFByLkVsZW1lbnQoVy5iaWRpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmlkaSA9IGJpZGllbCAhPSBudWxsICYmIChiaWRpZWwuQXR0cmlidXRlKFcudmFsKSA9PSBudWxsIHx8IGJpZGllbC5BdHRyaWJ1dGUoVy52YWwpLlRvQm9vbGVhbigpID09IHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpZGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW1SdW5Qcm9wcyA9IE1lcmdlU3R5bGVFbGVtZW50KG5ldyBYRWxlbWVudChXLnJQciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcucnRsKSksIGxpc3RJdGVtUnVuUHJvcHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYWdyYXBoTGV2ZWwgPSBMaXN0SXRlbVJldHJpZXZlci5HZXRQYXJhZ3JhcGhMZXZlbChlbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3RJdGVtUmV0cmlldmVyLkxldmVsTnVtYmVycyBsZXZlbE51bXMgPSBlbGVtZW50LkFubm90YXRpb248TGlzdEl0ZW1SZXRyaWV2ZXIuTGV2ZWxOdW1iZXJzPigpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxldmVsTnVtc1N0cmluZyA9IGxldmVsTnVtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5MZXZlbE51bWJlcnNBcnJheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UYWtlKHBhcmFncmFwaExldmVsICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGkgPT4gaS5Ub1N0cmluZygpICsgIi4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRyaW1FbmQoJy4nKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RJdGVtUnVuID0gbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuTGlzdEl0ZW1SdW4sIGxldmVsTnVtc1N0cmluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGUoUHRPcGVuWG1sLkZvbnROYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZShQdE9wZW5YbWwuTGFuZ3VhZ2VUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0SXRlbVJ1blByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sICsgInNwYWNlIiwgInByZXNlcnZlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkanVzdEZvbnRBdHRyaWJ1dGVzKHdEb2MsIGxpc3RJdGVtUnVuLCBudWxsLCBsaXN0SXRlbVJ1blByb3BzLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsdmwgPSBsaXN0SXRlbUluZm8uTHZsKExpc3RJdGVtUmV0cmlldmVyLkdldFBhcmFncmFwaExldmVsKGVsZW1lbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHN1ZmZpeCA9IG5ldyBYRWxlbWVudChXLnRhYik7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3UgPSAoc3RyaW5nKWx2bC5FbGVtZW50cyhXLnN1ZmYpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3UgPT0gInNwYWNlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBuZXcgWEVsZW1lbnQoVy50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbCArICJzcGFjZSIsICJwcmVzZXJ2ZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3UgPT0gIm5vdGhpbmciKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqYyA9IChzdHJpbmcpbHZsLkVsZW1lbnRzKFcubHZsSmMpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoamMgPT0gInJpZ2h0IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWNjdW11bGF0ZWRQYXJhUHJvcHMgPSBlbGVtZW50LkVsZW1lbnQoUHRPcGVuWG1sLnBQcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZ2luZ0F0dCA9IGFjY3VtdWxhdGVkUGFyYVByb3BzLkVsZW1lbnRzKFcuaW5kKS5BdHRyaWJ1dGVzKFcuaGFuZ2luZykuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZ2luZ0F0dCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RJdGVtUnVuTGVuZ3RoID0gV29yZHByb2Nlc3NpbmdNTFV0aWwuQ2FsY1dpZHRoT2ZSdW5JblR3aXBzKGxpc3RJdGVtUnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZCA9IGFjY3VtdWxhdGVkUGFyYVByb3BzLkVsZW1lbnQoVy5pbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZCA9IG5ldyBYRWxlbWVudChXLmluZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZFBhcmFQcm9wcy5BZGQoaW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmQuQWRkKG5ldyBYQXR0cmlidXRlKFcuaGFuZ2luZywgbGlzdEl0ZW1SdW5MZW5ndGguVG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZ2luZyA9IChpbnQpaGFuZ2luZ0F0dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RJdGVtUnVuTGVuZ3RoID0gV29yZHByb2Nlc3NpbmdNTFV0aWwuQ2FsY1dpZHRoT2ZSdW5JblR3aXBzKGxpc3RJdGVtUnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ2luZyArPSBsaXN0SXRlbVJ1bkxlbmd0aDsgLy8gc2hvdWxkIGJlIHdpZHRoIG9mIGxpc3QgaXRlbSwgaW4gdHdpcHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ2luZ0F0dC5WYWx1ZSA9IGhhbmdpbmcuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqYyA9PSAiY2VudGVyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWNjdW11bGF0ZWRQYXJhUHJvcHMgPSBlbGVtZW50LkVsZW1lbnQoUHRPcGVuWG1sLnBQcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZ2luZ0F0dCA9IGFjY3VtdWxhdGVkUGFyYVByb3BzLkVsZW1lbnRzKFcuaW5kKS5BdHRyaWJ1dGVzKFcuaGFuZ2luZykuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZ2luZ0F0dCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RJdGVtUnVuTGVuZ3RoID0gV29yZHByb2Nlc3NpbmdNTFV0aWwuQ2FsY1dpZHRoT2ZSdW5JblR3aXBzKGxpc3RJdGVtUnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZCA9IGFjY3VtdWxhdGVkUGFyYVByb3BzLkVsZW1lbnQoVy5pbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZCA9IG5ldyBYRWxlbWVudChXLmluZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZFBhcmFQcm9wcy5BZGQoaW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmQuQWRkKG5ldyBYQXR0cmlidXRlKFcuaGFuZ2luZywgKGxpc3RJdGVtUnVuTGVuZ3RoIC8gMikuVG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZ2luZyA9IChpbnQpaGFuZ2luZ0F0dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RJdGVtUnVuTGVuZ3RoID0gV29yZHByb2Nlc3NpbmdNTFV0aWwuQ2FsY1dpZHRoT2ZSdW5JblR3aXBzKGxpc3RJdGVtUnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ2luZyArPSAobGlzdEl0ZW1SdW5MZW5ndGggLyAyKTsgLy8gc2hvdWxkIGJlIGhhbGYgb2Ygd2lkdGggb2YgbGlzdCBpdGVtLCBpbiB0d2lwcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5naW5nQXR0LlZhbHVlID0gaGFuZ2luZy5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZFRhYkF0TGVmdEluZGVudChlbGVtZW50LkVsZW1lbnQoUHRPcGVuWG1sLnBQcikpOworCisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdQYXJhID0gbmV3IFhFbGVtZW50KFcucCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZShQdE9wZW5YbWwuRm9udE5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlKFB0T3BlblhtbC5MYW5ndWFnZVR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlKFB0T3BlblhtbC5VbmlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuQWJzdHJhY3ROdW1JZCwgYWJzdHJhY3ROdW1JZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyYVByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtUnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCAhPSBudWxsID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFB0T3BlblhtbC5MaXN0SXRlbVJ1biwgbGV2ZWxOdW1zU3RyaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtUnVuUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXgpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKCkuV2hlcmUoZSA9PiBlLk5hbWUgIT0gVy5wUHIpLlNlbGVjdChuID0+IE5vcm1hbGl6ZUxpc3RJdGVtc1RyYW5zZm9ybShmYWksIHdEb2MsIG4sIHNldHRpbmdzKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1BhcmE7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IE5vcm1hbGl6ZUxpc3RJdGVtc1RyYW5zZm9ybShmYWksIHdEb2MsIG4sIHNldHRpbmdzKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZFRhYkF0TGVmdEluZGVudChYRWxlbWVudCBwUHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZWZ0ID0gMDsKKyAgICAgICAgICAgIHZhciBpbmQgPSBwUHIuRWxlbWVudChXLmluZCk7CisKKyAgICAgICAgICAgIC8vIHRvZG8gbmVlZCB0byBoYW5kbGUgVy5zdGFydAorICAgICAgICAgICAgaWYgKHBQci5BdHRyaWJ1dGUoVy5sZWZ0KSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGxlZnQgPSAoaW50KXBQci5BdHRyaWJ1dGUoVy5sZWZ0KTsKKyAgICAgICAgICAgIHZhciB0YWJzID0gcFByLkVsZW1lbnQoVy50YWJzKTsKKyAgICAgICAgICAgIGlmICh0YWJzID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGFicyA9IG5ldyBYRWxlbWVudChXLnRhYnMpOworICAgICAgICAgICAgICAgIHBQci5BZGQodGFicyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgdGFiQXRMZWZ0ID0gdGFicy5FbGVtZW50cyhXLnRhYikuRmlyc3RPckRlZmF1bHQodCA9PiAoaW50KXQuQXR0cmlidXRlKFcucG9zKSA9PSBsZWZ0KTsKKyAgICAgICAgICAgIGlmICh0YWJBdExlZnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YWJzLkFkZCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJsZWZ0IiksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnBvcywgbGVmdCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWVbXSBQdE5hbWVzVG9LZWVwID0gbmV3W10geworICAgICAgICAgICAgUHRPcGVuWG1sLkZvbnROYW1lLAorICAgICAgICAgICAgUHRPcGVuWG1sLkFic3RyYWN0TnVtSWQsCisgICAgICAgICAgICBQdE9wZW5YbWwuU3R5bGVOYW1lLAorICAgICAgICAgICAgUHRPcGVuWG1sLkxhbmd1YWdlVHlwZSwKKyAgICAgICAgICAgIFB0T3BlblhtbC5MaXN0SXRlbVJ1biwKKyAgICAgICAgICAgIFB0T3BlblhtbC5VbmlkLAorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBOb3JtYWxpemVQcm9wc0ZvclBhcnQoWERvY3VtZW50IHB4ZCwgRm9ybWF0dGluZ0Fzc2VtYmxlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2V0dGluZ3MuQ3JlYXRlSHRtbENvbnZlcnRlckFubm90YXRpb25BdHRyaWJ1dGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB4ZC5Sb290LkRlc2NlbmRhbnRzKCkuQXR0cmlidXRlcygpLldoZXJlKGQgPT4gZC5OYW1lLk5hbWVzcGFjZSA9PSBQdE9wZW5YbWwucHQgJiYKKyAgICAgICAgICAgICAgICAgICAgIVB0TmFtZXNUb0tlZXAuQ29udGFpbnMoZC5OYW1lKSkuUmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgaWYgKHB4ZC5Sb290LkF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInB0MTQiKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBweGQuUm9vdC5BZGQobmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJwdDE0IiwgUHRPcGVuWG1sLnB0Lk5hbWVzcGFjZU5hbWUpKTsKKyAgICAgICAgICAgICAgICBpZiAocHhkLlJvb3QuQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAibWMiKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBweGQuUm9vdC5BZGQobmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJtYyIsIE1DLm1jLk5hbWVzcGFjZU5hbWUpKTsKKyAgICAgICAgICAgICAgICBYQXR0cmlidXRlIG1jaSA9IHB4ZC5Sb290LkF0dHJpYnV0ZShNQy5JZ25vcmFibGUpOworICAgICAgICAgICAgICAgIGlmIChtY2kgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcHhkLlJvb3QuQXR0cmlidXRlKE1DLklnbm9yYWJsZSkuVmFsdWUuQ29udGFpbnMoInB0MTQiKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlnID0gcHhkLlJvb3QuQXR0cmlidXRlKE1DLklnbm9yYWJsZSkuVmFsdWUgKyAiIHB0MTQiOworICAgICAgICAgICAgICAgICAgICAgICAgbWNpLlZhbHVlID0gaWc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHhkLlJvb3QuQWRkKG5ldyBYQXR0cmlidXRlKE1DLklnbm9yYWJsZSwgInB0MTQiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB4ZC5Sb290LkRlc2NlbmRhbnRzKCkuQXR0cmlidXRlcygpLldoZXJlKGQgPT4gZC5OYW1lLk5hbWVzcGFjZSA9PSBQdE9wZW5YbWwucHQpLlJlbW92ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHJ1blByb3BzID0gcHhkLlJvb3QuRGVzY2VuZGFudHMoUHRPcGVuWG1sLnJQcikuVG9MaXN0KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBydW5Qcm9wcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdSdW5Qcm9wcyA9IG5ldyBYRWxlbWVudChXLnJQciwKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGl0ZW0uRWxlbWVudHMoKSk7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgcGFyZW50ID0gaXRlbS5QYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5OYW1lID09IFcucCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGV4aXN0aW5nUGFyYVByb3BzID0gcGFyZW50LkVsZW1lbnQoVy5wUHIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdQYXJhUHJvcHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdQYXJhUHJvcHMgPSBuZXcgWEVsZW1lbnQoVy5wUHIpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LkFkZChleGlzdGluZ1BhcmFQcm9wcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgZXhpc3RpbmdSdW5Qcm9wcyA9IGV4aXN0aW5nUGFyYVByb3BzLkVsZW1lbnQoVy5yUHIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdSdW5Qcm9wcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLlJlbW92ZVN0eWxlTmFtZXNGcm9tUGFyYWdyYXBoQW5kUnVuUHJvcGVydGllcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3UnVuUHJvcHMuRWxlbWVudChXLnJTdHlsZSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UnVuUHJvcHMuQWRkKGV4aXN0aW5nUnVuUHJvcHMuRWxlbWVudChXLnJTdHlsZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdSdW5Qcm9wcy5SZXBsYWNlV2l0aChuZXdSdW5Qcm9wcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdQYXJhUHJvcHMuQWRkKG5ld1J1blByb3BzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgZXhpc3RpbmdSdW5Qcm9wcyA9IHBhcmVudC5FbGVtZW50KFcuclByKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nUnVuUHJvcHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5SZW1vdmVTdHlsZU5hbWVzRnJvbVBhcmFncmFwaEFuZFJ1blByb3BlcnRpZXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1J1blByb3BzLkVsZW1lbnQoVy5yU3R5bGUpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1J1blByb3BzLkFkZChleGlzdGluZ1J1blByb3BzLkVsZW1lbnQoVy5yU3R5bGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUnVuUHJvcHMuUmVwbGFjZVdpdGgobmV3UnVuUHJvcHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5BZGQobmV3UnVuUHJvcHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBwYXJhUHJvcHMgPSBweGQuUm9vdC5EZXNjZW5kYW50cyhQdE9wZW5YbWwucFByKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIHBhcmFQcm9wcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcGFyYVJ1blByb3BzID0gaXRlbS5QYXJlbnQuRWxlbWVudHMoVy5wUHIpLkVsZW1lbnRzKFcuclByKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIHZhciBtZXJnZWQgPSBNZXJnZVN0eWxlRWxlbWVudChpdGVtLkVsZW1lbnQoVy5yUHIpLCBwYXJhUnVuUHJvcHMpOworICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3MuUmVtb3ZlU3R5bGVOYW1lc0Zyb21QYXJhZ3JhcGhBbmRSdW5Qcm9wZXJ0aWVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lcmdlZC5FbGVtZW50KFcuclN0eWxlKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWQuQWRkKHBhcmFSdW5Qcm9wcy5FbGVtZW50KFcuclN0eWxlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdQYXJhUHJvcHMgPSBuZXcgWEVsZW1lbnQoVy5wUHIsCisgICAgICAgICAgICAgICAgICAgIGl0ZW0uQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICBpdGVtLkVsZW1lbnRzKCkuV2hlcmUoZSA9PiBlLk5hbWUgIT0gVy5yUHIpLAorICAgICAgICAgICAgICAgICAgICBtZXJnZWQpOworICAgICAgICAgICAgICAgIFhFbGVtZW50IHBhcmEgPSBpdGVtLlBhcmVudDsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBleGlzdGluZ1BhcmFQcm9wcyA9IHBhcmEuRWxlbWVudChXLnBQcik7CisgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nUGFyYVByb3BzICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLlJlbW92ZVN0eWxlTmFtZXNGcm9tUGFyYWdyYXBoQW5kUnVuUHJvcGVydGllcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhcmFQcm9wcy5FbGVtZW50KFcucFN0eWxlKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcmFQcm9wcy5BZGQoZXhpc3RpbmdQYXJhUHJvcHMuRWxlbWVudChXLnBTdHlsZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUGFyYVByb3BzLlJlcGxhY2VXaXRoKG5ld1BhcmFQcm9wcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcGFyYS5BZGQobmV3UGFyYVByb3BzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciB0YmxQcm9wcyA9IHB4ZC5Sb290LkRlc2NlbmRhbnRzKFB0T3BlblhtbC50YmxQcikuVG9MaXN0KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiB0YmxQcm9wcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdUYmxQcm9wcyA9IG5ldyBYRWxlbWVudChpdGVtKTsKKyAgICAgICAgICAgICAgICBuZXdUYmxQcm9wcy5OYW1lID0gVy50YmxQcjsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCB0YWJsZSA9IGl0ZW0uUGFyZW50OworICAgICAgICAgICAgICAgIFhFbGVtZW50IGV4aXN0aW5nVGFibGVQcm9wcyA9IHRhYmxlLkVsZW1lbnQoVy50YmxQcik7CisgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFibGVQcm9wcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1RhYmxlUHJvcHMuUmVwbGFjZVdpdGgobmV3VGJsUHJvcHMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuQWRkRmlyc3QobmV3VGJsUHJvcHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHRyUHJvcHMgPSBweGQuUm9vdC5EZXNjZW5kYW50cyhQdE9wZW5YbWwudHJQcikuVG9MaXN0KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiB0clByb3BzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld1RyUHJvcHMgPSBuZXcgWEVsZW1lbnQoaXRlbSk7CisgICAgICAgICAgICAgICAgbmV3VHJQcm9wcy5OYW1lID0gVy50clByOworICAgICAgICAgICAgICAgIFhFbGVtZW50IHJvdyA9IGl0ZW0uUGFyZW50OworICAgICAgICAgICAgICAgIFhFbGVtZW50IGV4aXN0aW5nUm93UHJvcHMgPSByb3cuRWxlbWVudChXLnRyUHIpOworICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Jvd1Byb3BzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUm93UHJvcHMuUmVwbGFjZVdpdGgobmV3VHJQcm9wcyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByb3cuQWRkRmlyc3QobmV3VHJQcm9wcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgdGNQcm9wcyA9IHB4ZC5Sb290LkRlc2NlbmRhbnRzKFB0T3BlblhtbC50Y1ByKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIHRjUHJvcHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3VGNQcm9wcyA9IG5ldyBYRWxlbWVudChpdGVtKTsKKyAgICAgICAgICAgICAgICBuZXdUY1Byb3BzLk5hbWUgPSBXLnRjUHI7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgcm93ID0gaXRlbS5QYXJlbnQ7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgZXhpc3RpbmdSb3dQcm9wcyA9IHJvdy5FbGVtZW50KFcudGNQcik7CisgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nUm93UHJvcHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdSb3dQcm9wcy5SZXBsYWNlV2l0aChuZXdUY1Byb3BzKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJvdy5BZGRGaXJzdChuZXdUY1Byb3BzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB4ZC5Sb290LkRlc2NlbmRhbnRzKFcubnVtUHIpLlJlbW92ZSgpOworICAgICAgICAgICAgaWYgKHNldHRpbmdzLlJlbW92ZVN0eWxlTmFtZXNGcm9tUGFyYWdyYXBoQW5kUnVuUHJvcGVydGllcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBweGQuUm9vdC5EZXNjZW5kYW50cyhXLnBTdHlsZSkuV2hlcmUocHMgPT4gcHMuUGFyZW50Lk5hbWUgPT0gVy5wUHIpLlJlbW92ZSgpOworICAgICAgICAgICAgICAgIHB4ZC5Sb290LkRlc2NlbmRhbnRzKFcuclN0eWxlKS5XaGVyZShwcyA9PiBwcy5QYXJlbnQuTmFtZSA9PSBXLnJQcikuUmVtb3ZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBweGQuUm9vdC5EZXNjZW5kYW50cyhXLnRibFN0eWxlKS5XaGVyZShwcyA9PiBwcy5QYXJlbnQuTmFtZSA9PSBXLnRibFByKS5SZW1vdmUoKTsKKyAgICAgICAgICAgIHB4ZC5Sb290LkRlc2NlbmRhbnRzKCkuV2hlcmUoZCA9PiBkLk5hbWUuTmFtZXNwYWNlID09IFB0T3BlblhtbC5wdCkuUmVtb3ZlKCk7CisgICAgICAgICAgICBpZiAoc2V0dGluZ3MuT3JkZXJFbGVtZW50c1BlclN0YW5kYXJkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld1Jvb3QgPSAoWEVsZW1lbnQpV29yZHByb2Nlc3NpbmdNTFV0aWwuV21sT3JkZXJFbGVtZW50c1BlclN0YW5kYXJkKHB4ZC5Sb290KTsKKyAgICAgICAgICAgICAgICBweGQuUm9vdC5SZXBsYWNlV2l0aChuZXdSb290KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXNzZW1ibGVMaXN0SXRlbUluZm9ybWF0aW9uKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYywgTGlzdEl0ZW1SZXRyaWV2ZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gd29yZERvYy5Db250ZW50UGFydHMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRG9jdW1lbnQgeERvYyA9IHBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcmEgaW4geERvYy5EZXNjZW5kYW50cyhXLnApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTGlzdEl0ZW1SZXRyaWV2ZXIuUmV0cmlldmVMaXN0SXRlbSh3b3JkRG9jLCBwYXJhLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBbm5vdGF0ZVdpdGhHbG9iYWxEZWZhdWx0cyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIFhFbGVtZW50IHJvb3RFbGVtZW50LCBGb3JtYXR0aW5nQXNzZW1ibGVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGdsb2JhbERlZmF1bHRQYXJhUHJvcHMgPSBudWxsOworICAgICAgICAgICAgWEVsZW1lbnQgZ2xvYmFsRGVmYXVsdFBhcmFQcm9wc0FzRGVmaW5lZCA9IG51bGw7CisgICAgICAgICAgICBYRWxlbWVudCBnbG9iYWxEZWZhdWx0UnVuUHJvcHMgPSBudWxsOworICAgICAgICAgICAgWEVsZW1lbnQgZ2xvYmFsRGVmYXVsdFJ1blByb3BzQXNEZWZpbmVkID0gbnVsbDsKKyAgICAgICAgICAgIFhEb2N1bWVudCBzWERvYyA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5TdHlsZURlZmluaXRpb25zUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciBkZWZhdWx0UGFyYVN0eWxlTmFtZSA9IChzdHJpbmcpc1hEb2MKKyAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgIC5XaGVyZShzdCA9PiAoc3RyaW5nKXN0LkF0dHJpYnV0ZShXLnR5cGUpID09ICJwYXJhZ3JhcGgiICYmIHN0LkF0dHJpYnV0ZShXLl9kZWZhdWx0KS5Ub0Jvb2xlYW4oKSA9PSB0cnVlKQorICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKFcuc3R5bGVJZCkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIHZhciBkZWZhdWx0Q2hhclN0eWxlTmFtZSA9IChzdHJpbmcpc1hEb2MKKyAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgIC5XaGVyZShzdCA9PiAoc3RyaW5nKXN0LkF0dHJpYnV0ZShXLnR5cGUpID09ICJjaGFyYWN0ZXIiICYmIHN0LkF0dHJpYnV0ZShXLl9kZWZhdWx0KS5Ub0Jvb2xlYW4oKSA9PSB0cnVlKQorICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKFcuc3R5bGVJZCkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGRvY0RlZmF1bHRzID0gc1hEb2MuUm9vdC5FbGVtZW50KFcuZG9jRGVmYXVsdHMpOworICAgICAgICAgICAgaWYgKGRvY0RlZmF1bHRzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2xvYmFsRGVmYXVsdFBhcmFQcm9wc0FzRGVmaW5lZCA9IGRvY0RlZmF1bHRzLkVsZW1lbnRzKFcucFByRGVmYXVsdCkuRWxlbWVudHMoVy5wUHIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmIChnbG9iYWxEZWZhdWx0UGFyYVByb3BzQXNEZWZpbmVkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGdsb2JhbERlZmF1bHRQYXJhUHJvcHNBc0RlZmluZWQgPSBuZXcgWEVsZW1lbnQoVy5wUHIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yUHIpKTsKKyAgICAgICAgICAgICAgICBnbG9iYWxEZWZhdWx0UnVuUHJvcHNBc0RlZmluZWQgPSBkb2NEZWZhdWx0cy5FbGVtZW50cyhXLnJQckRlZmF1bHQpLkVsZW1lbnRzKFcuclByKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsRGVmYXVsdFJ1blByb3BzQXNEZWZpbmVkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGdsb2JhbERlZmF1bHRSdW5Qcm9wc0FzRGVmaW5lZCA9IG5ldyBYRWxlbWVudChXLnJQcik7CisgICAgICAgICAgICAgICAgaWYgKGdsb2JhbERlZmF1bHRSdW5Qcm9wc0FzRGVmaW5lZC5FbGVtZW50KFcuckZvbnRzKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBnbG9iYWxEZWZhdWx0UnVuUHJvcHNBc0RlZmluZWQuQWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuckZvbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuYXNjaWksICJUaW1lcyBOZXcgUm9tYW4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmhBbnNpLCAiVGltZXMgTmV3IFJvbWFuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5jcywgIlRpbWVzIE5ldyBSb21hbiIpKSk7CisgICAgICAgICAgICAgICAgaWYgKGdsb2JhbERlZmF1bHRSdW5Qcm9wc0FzRGVmaW5lZC5FbGVtZW50KFcuc3opID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGdsb2JhbERlZmF1bHRSdW5Qcm9wc0FzRGVmaW5lZC5BZGQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5zeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgIjIwIikpKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsRGVmYXVsdFJ1blByb3BzQXNEZWZpbmVkLkVsZW1lbnQoVy5zekNzKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBnbG9iYWxEZWZhdWx0UnVuUHJvcHNBc0RlZmluZWQuQWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuc3pDcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgIjIwIikpKTsKKworICAgICAgICAgICAgICAgIHZhciBydW5Qcm9wc0Zvckdsb2JhbERlZmF1bHRQYXJhUHJvcHMgPSBNZXJnZVN0eWxlRWxlbWVudChnbG9iYWxEZWZhdWx0UnVuUHJvcHNBc0RlZmluZWQsIGdsb2JhbERlZmF1bHRQYXJhUHJvcHNBc0RlZmluZWQuRWxlbWVudChXLnJQcikpOworICAgICAgICAgICAgICAgIGdsb2JhbERlZmF1bHRQYXJhUHJvcHMgPSBuZXcgWEVsZW1lbnQoZ2xvYmFsRGVmYXVsdFBhcmFQcm9wc0FzRGVmaW5lZC5OYW1lLAorICAgICAgICAgICAgICAgICAgICBnbG9iYWxEZWZhdWx0UGFyYVByb3BzQXNEZWZpbmVkLkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRGVmYXVsdFBhcmFQcm9wc0FzRGVmaW5lZC5FbGVtZW50cygpLldoZXJlKGUgPT4gZS5OYW1lICE9IFcuclByKSwKKyAgICAgICAgICAgICAgICAgICAgcnVuUHJvcHNGb3JHbG9iYWxEZWZhdWx0UGFyYVByb3BzKTsKKyAgICAgICAgICAgICAgICBnbG9iYWxEZWZhdWx0UnVuUHJvcHMgPSBNZXJnZVN0eWxlRWxlbWVudChnbG9iYWxEZWZhdWx0UGFyYVByb3BzQXNEZWZpbmVkLkVsZW1lbnQoVy5yUHIpLCBnbG9iYWxEZWZhdWx0UnVuUHJvcHNBc0RlZmluZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHJQciA9IG5ldyBYRWxlbWVudChXLnJQciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnJGb250cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5hc2NpaSwgIlRpbWVzIE5ldyBSb21hbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmhBbnNpLCAiVGltZXMgTmV3IFJvbWFuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuY3MsICJUaW1lcyBOZXcgUm9tYW4iKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcudmFsLCAiMjAiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuc3pDcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICIyMCIpKSk7CisKKyAgICAgICAgICAgIGlmIChnbG9iYWxEZWZhdWx0UGFyYVByb3BzID09IG51bGwpCisgICAgICAgICAgICAgICAgZ2xvYmFsRGVmYXVsdFBhcmFQcm9wcyA9IG5ldyBYRWxlbWVudChXLnBQciwgclByKTsKKworICAgICAgICAgICAgaWYgKGdsb2JhbERlZmF1bHRSdW5Qcm9wcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGdsb2JhbERlZmF1bHRSdW5Qcm9wcyA9IHJQcjsKKworICAgICAgICAgICAgWEVsZW1lbnQgcHRHbG9iYWxEZWZhdWx0UGFyYVByb3BzID0gbmV3IFhFbGVtZW50KGdsb2JhbERlZmF1bHRQYXJhUHJvcHMpOworICAgICAgICAgICAgWEVsZW1lbnQgcHRHbG9iYWxEZWZhdWx0UnVuUHJvcHMgPSBuZXcgWEVsZW1lbnQoZ2xvYmFsRGVmYXVsdFJ1blByb3BzKTsKKyAgICAgICAgICAgIHB0R2xvYmFsRGVmYXVsdFBhcmFQcm9wcy5OYW1lID0gUHRPcGVuWG1sLnBQcjsKKyAgICAgICAgICAgIHB0R2xvYmFsRGVmYXVsdFJ1blByb3BzLk5hbWUgPSBQdE9wZW5YbWwuclByOworICAgICAgICAgICAgdmFyIHBhcmFzQW5kUnVucyA9IHJvb3RFbGVtZW50LkRlc2NlbmRhbnRzKCkuV2hlcmUoZCA9PgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkLk5hbWUgPT0gVy5wIHx8IGQuTmFtZSA9PSBXLnI7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChzZXR0aW5ncy5DcmVhdGVIdG1sQ29udmVydGVyQW5ub3RhdGlvbkF0dHJpYnV0ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGQgaW4gcGFyYXNBbmRSdW5zKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQuTmFtZSA9PSBXLnApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwU3R5bGUgPSAoc3RyaW5nKWQuRWxlbWVudHMoVy5wUHIpLkVsZW1lbnRzKFcucFN0eWxlKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBTdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHlsZSA9IGRlZmF1bHRQYXJhU3R5bGVOYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBTdHlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLkF0dHJpYnV0ZShQdE9wZW5YbWwuU3R5bGVOYW1lKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLkF0dHJpYnV0ZShQdE9wZW5YbWwuU3R5bGVOYW1lKS5WYWx1ZSA9IHBTdHlsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuQWRkKG5ldyBYQXR0cmlidXRlKFB0T3BlblhtbC5TdHlsZU5hbWUsIHBTdHlsZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZC5BZGQocHRHbG9iYWxEZWZhdWx0UGFyYVByb3BzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByU3R5bGUgPSAoc3RyaW5nKWQuRWxlbWVudHMoVy5yUHIpLkVsZW1lbnRzKFcuclN0eWxlKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJTdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJTdHlsZSA9IGRlZmF1bHRDaGFyU3R5bGVOYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJTdHlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLkF0dHJpYnV0ZShQdE9wZW5YbWwuU3R5bGVOYW1lKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLkF0dHJpYnV0ZShQdE9wZW5YbWwuU3R5bGVOYW1lKS5WYWx1ZSA9IHJTdHlsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuQWRkKG5ldyBYQXR0cmlidXRlKFB0T3BlblhtbC5TdHlsZU5hbWUsIHJTdHlsZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZC5BZGQocHRHbG9iYWxEZWZhdWx0UnVuUHJvcHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkIGluIHBhcmFzQW5kUnVucykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkLk5hbWUgPT0gVy5wKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkLkFkZChwdEdsb2JhbERlZmF1bHRQYXJhUHJvcHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZC5BZGQocHRHbG9iYWxEZWZhdWx0UnVuUHJvcHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgQmxhbmtUY0JvcmRlcnMgPSBuZXcgWEVsZW1lbnQoVy50Y0JvcmRlcnMsCisgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50b3AsIG5ldyBYQXR0cmlidXRlKFcudmFsLCAibmlsIikpLAorICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcubGVmdCwgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJuaWwiKSksCisgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5ib3R0b20sIG5ldyBYQXR0cmlidXRlKFcudmFsLCAibmlsIikpLAorICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcucmlnaHQsIG5ldyBYQXR0cmlidXRlKFcudmFsLCAibmlsIikpKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFubm90YXRlVGFibGVzV2l0aFRhYmxlU3R5bGVzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYywgWEVsZW1lbnQgcm9vdEVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCBzWERvYyA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5TdHlsZURlZmluaXRpb25zUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0YmwgaW4gcm9vdEVsZW1lbnQuRGVzY2VuZGFudHMoVy50YmwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB0YmxTdHlsZU5hbWUgPSAoc3RyaW5nKXRibC5FbGVtZW50cyhXLnRibFByKS5FbGVtZW50cyhXLnRibFN0eWxlKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmICh0YmxTdHlsZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHN0eWxlID0gVGFibGVTdHlsZVJvbGx1cCh3RG9jLCB0YmxTdHlsZU5hbWUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGFubm90YXRlIHRhYmxlIHdpdGggdGFibGUgc3R5bGUsIGluIFBvd2VyVG9vbHMgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIHN0eWxlLk5hbWUgPSBQdE9wZW5YbWwuc3R5bGU7CisgICAgICAgICAgICAgICAgICAgIHRibC5BZGQoc3R5bGUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIHRibFByIGluIHRhYmxlIHN0eWxlIHdpdGggdGJsUHIgb2YgdGhlIHRhYmxlCisgICAgICAgICAgICAgICAgICAgIC8vIGFubm5vdGF0ZSBpbiBQb3dlclRvb2xzIG5hbWVzcGFjZQorICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCB0YmxQcjIgPSBzdHlsZS5FbGVtZW50KFcudGJsUHIpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCB0YmxQcjMgPSBNZXJnZVN0eWxlRWxlbWVudCh0YmwuRWxlbWVudChXLnRibFByKSwgdGJsUHIyLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRibFByMyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdUYmxQciA9IG5ldyBYRWxlbWVudCh0YmxQcjMpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGJsUHIuTmFtZSA9IFB0T3BlblhtbC5wdCArICJ0YmxQciI7CisgICAgICAgICAgICAgICAgICAgICAgICB0YmwuQWRkKG5ld1RibFByKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEFkZFRjUHJQdFRvRXZlcnlDZWxsKHRibCk7CisgICAgICAgICAgICAgICAgICAgIEFkZE91dGVyQm9yZGVycyh0YmwsIHN0eWxlKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGVUY1ByID0gc3R5bGUuRWxlbWVudChXLnRjUHIpOworICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVUY1ByICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciByb3cgaW4gdGJsLkVsZW1lbnRzKFcudHIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHJvdy5FbGVtZW50cyhXLnRjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGNQclB0RXhpc3RzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0Y1ByUHQgPSBjZWxsLkVsZW1lbnQoUHRPcGVuWG1sLnB0ICsgInRjUHIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRjUHJQdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNQclB0RXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNQclB0ID0gbmV3IFhFbGVtZW50KFcudGNQcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjUHJQdCA9IE1lcmdlU3R5bGVFbGVtZW50KHRhYmxlVGNQciwgdGNQclB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1RjUHJQdCA9IG5ldyBYRWxlbWVudCh0Y1ByUHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUY1ByUHQuTmFtZSA9IFB0T3BlblhtbC50Y1ByOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGNQclB0RXhpc3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5FbGVtZW50KFB0T3BlblhtbC50Y1ByKS5SZXBsYWNlV2l0aChuZXdUY1ByUHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLkFkZChuZXdUY1ByUHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBldmVyeSByb3cgYW5kIGNlbGwgaW4gdGhlIHRhYmxlLCByb2xsaW5nIHVwIHJvdyBwcm9wZXJ0aWVzIGFuZCBjZWxsIHByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gYXMgYXBwcm9wcmlhdGUgcGVyIHRoZSBjbmZTdHlsZSBlbGVtZW50LCB0aGVuIHJlcGxhY2luZyB0aGUgcm93IGFuZCBjZWxsIHByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJvdyBpbiB0YmwuRWxlbWVudHMoVy50cikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHRyUHIyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyUHIyID0gc3R5bGUuRWxlbWVudChXLnRyUHIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyUHIyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJQcjIgPSBuZXcgWEVsZW1lbnQoVy50clByKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHJvd0NuZiA9IHJvdy5FbGVtZW50cyhXLnRyUHIpLkVsZW1lbnRzKFcuY25mU3R5bGUpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93Q25mICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIG90IGluIFRhYmxlU3R5bGVPdmVycmlkZVR5cGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE5hbWUgYXR0TmFtZSA9IFRhYmxlU3R5bGVPdmVycmlkZVhOYW1lTWFwW290XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvd0NuZiAhPSBudWxsICYmIHJvd0NuZi5BdHRyaWJ1dGUoYXR0TmFtZSkuVG9Cb29sZWFuKCkgPT0gdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbyA9IHN0eWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcudGJsU3R5bGVQcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUodHNwID0+IChzdHJpbmcpdHNwLkF0dHJpYnV0ZShXLnR5cGUpID09IG90KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBvdHRyUHIgPSBvLkVsZW1lbnQoVy50clByKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0clByMiA9IE1lcmdlU3R5bGVFbGVtZW50KG90dHJQciwgdHJQcjIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdHJQcjIgPSBNZXJnZVN0eWxlRWxlbWVudChyb3cuRWxlbWVudChXLnRyUHIpLCB0clByMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJQcjIuSGFzRWxlbWVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJQcjIuTmFtZSA9IFB0T3BlblhtbC5wdCArICJ0clByIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cuQWRkKHRyUHIyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBvdCBpbiBUYWJsZVN0eWxlT3ZlcnJpZGVUeXBlcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWE5hbWUgYXR0TmFtZSA9IFRhYmxlU3R5bGVPdmVycmlkZVhOYW1lTWFwW290XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHROYW1lID09IFcub2RkSEJhbmQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHROYW1lID09IFcuZXZlbkhCYW5kIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0TmFtZSA9PSBXLmZpcnN0Um93IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0TmFtZSA9PSBXLmxhc3RSb3cpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJvdyBpbiB0YmwuRWxlbWVudHMoVy50cikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCByb3dDbmYgPSByb3cuRWxlbWVudHMoVy50clByKS5FbGVtZW50cyhXLmNuZlN0eWxlKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93Q25mICE9IG51bGwgJiYgcm93Q25mLkF0dHJpYnV0ZShhdHROYW1lKS5Ub0Jvb2xlYW4oKSA9PSB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBvID0gc3R5bGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy50YmxTdHlsZVByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZSh0c3AgPT4gKHN0cmluZyl0c3AuQXR0cmlidXRlKFcudHlwZSkgPT0gb3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHJvdy5FbGVtZW50cyhXLnRjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGNQclB0RXhpc3RzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0Y1ByUHQgPSBjZWxsLkVsZW1lbnQoUHRPcGVuWG1sLnB0ICsgInRjUHIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRjUHJQdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNQclB0RXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNQclB0ID0gbmV3IFhFbGVtZW50KFcudGNQcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjUHJQdCA9IE1lcmdlU3R5bGVFbGVtZW50KG8uRWxlbWVudChXLnRjUHIpLCB0Y1ByUHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VGNQclB0ID0gbmV3IFhFbGVtZW50KHRjUHJQdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RjUHJQdC5OYW1lID0gUHRPcGVuWG1sLnB0ICsgInRjUHIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGNQclB0RXhpc3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5FbGVtZW50KFB0T3BlblhtbC5wdCArICJ0Y1ByIikuUmVwbGFjZVdpdGgobmV3VGNQclB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5BZGQobmV3VGNQclB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHROYW1lID09IFcuZmlyc3RDb2x1bW4gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHROYW1lID09IFcubGFzdENvbHVtbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dE5hbWUgPT0gVy5vZGRWQmFuZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dE5hbWUgPT0gVy5ldmVuVkJhbmQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJvdyBpbiB0YmwuRWxlbWVudHMoVy50cikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiByb3cuRWxlbWVudHMoVy50YykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGx5Q25kRm10VG9DZWxsKHN0eWxlLCBvdCwgYXR0TmFtZSwgY2VsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHROYW1lID09IFcuZmlyc3RSb3dMYXN0Q29sdW1uKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSB0YmwuRWxlbWVudHMoVy50cikuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbCA9IHJvdy5FbGVtZW50cyhXLnRjKS5MYXN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBseUNuZEZtdFRvQ2VsbChzdHlsZSwgb3QsIGF0dE5hbWUsIGNlbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF0dE5hbWUgPT0gVy5maXJzdFJvd0ZpcnN0Q29sdW1uKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSB0YmwuRWxlbWVudHMoVy50cikuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbCA9IHJvdy5FbGVtZW50cyhXLnRjKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwbHlDbmRGbXRUb0NlbGwoc3R5bGUsIG90LCBhdHROYW1lLCBjZWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHROYW1lID09IFcubGFzdFJvd0xhc3RDb2x1bW4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IHRibC5FbGVtZW50cyhXLnRyKS5MYXN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGwgPSByb3cuRWxlbWVudHMoVy50YykuTGFzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwbHlDbmRGbXRUb0NlbGwoc3R5bGUsIG90LCBhdHROYW1lLCBjZWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHROYW1lID09IFcubGFzdFJvd0ZpcnN0Q29sdW1uKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSB0YmwuRWxlbWVudHMoVy50cikuTGFzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3cgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZWxsID0gcm93LkVsZW1lbnRzKFcudGMpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBseUNuZEZtdFRvQ2VsbChzdHlsZSwgb3QsIGF0dE5hbWUsIGNlbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQcm9jZXNzSW5uZXJCb3JkZXJzKHRibCwgc3R5bGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgdGJsUHIgPSBuZXcgWEVsZW1lbnQoVy50YmxQcik7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHRibFByMyA9IE1lcmdlU3R5bGVFbGVtZW50KHRibC5FbGVtZW50KFcudGJsUHIpLCB0YmxQciwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YmxQcjMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3VGJsUHIgPSBuZXcgWEVsZW1lbnQodGJsUHIzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RibFByLk5hbWUgPSBQdE9wZW5YbWwucHQgKyAidGJsUHIiOworICAgICAgICAgICAgICAgICAgICAgICAgdGJsLkFkZChuZXdUYmxQcik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBBZGRUY1ByUHRUb0V2ZXJ5Q2VsbCh0YmwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBSb2xsSW5EaXJlY3RGb3JtYXR0aW5nKHRibCk7IC8vIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgaXMgbGFzdC4gIFRoaXMgbWVyZ2VzIGluIGRpcmVjdCBmb3JtYXR0aW5nLgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRUY1ByUHRUb0V2ZXJ5Q2VsbChYRWxlbWVudCB0YmwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciByb3cgaW4gdGJsLkVsZW1lbnRzKFcudHIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHJvdy5FbGVtZW50cyhXLnRjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB0Y1ByUHQgPSBjZWxsLkVsZW1lbnQoUHRPcGVuWG1sLnB0ICsgInRjUHIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRjUHJQdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIHRjUHJQdCA9IG5ldyBYRWxlbWVudChQdE9wZW5YbWwucHQgKyAidGNQciIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50Y0JvcmRlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgY2VsbC5BZGQodGNQclB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFwcGx5Q25kRm10VG9DZWxsKFhFbGVtZW50IHN0eWxlLCBzdHJpbmcgb3QsIFhOYW1lIGF0dE5hbWUsIFhFbGVtZW50IGNlbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGNlbGxDbmYgPSBjZWxsLkVsZW1lbnRzKFcudGNQcikuRWxlbWVudHMoVy5jbmZTdHlsZSkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChjZWxsQ25mICE9IG51bGwgJiYgY2VsbENuZi5BdHRyaWJ1dGUoYXR0TmFtZSkuVG9Cb29sZWFuKCkgPT0gdHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBvID0gc3R5bGUKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcudGJsU3R5bGVQcikKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKHRzcCA9PiAoc3RyaW5nKXRzcC5BdHRyaWJ1dGUoVy50eXBlKSA9PSBvdCkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgdGNQclB0RXhpc3RzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHZhciB0Y1ByUHQgPSBjZWxsLkVsZW1lbnQoUHRPcGVuWG1sLnB0ICsgInRjUHIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRjUHJQdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGNQclB0RXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdGNQclB0ID0gbmV3IFhFbGVtZW50KFcudGNQcik7CisgICAgICAgICAgICAgICAgICAgIHRjUHJQdCA9IE1lcmdlU3R5bGVFbGVtZW50KG8uRWxlbWVudChXLnRjUHIpLCB0Y1ByUHQpOworICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VGNQclB0ID0gbmV3IFhFbGVtZW50KHRjUHJQdCk7CisgICAgICAgICAgICAgICAgICAgIG5ld1RjUHJQdC5OYW1lID0gUHRPcGVuWG1sLnB0ICsgInRjUHIiOworICAgICAgICAgICAgICAgICAgICBpZiAodGNQclB0RXhpc3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5FbGVtZW50KFB0T3BlblhtbC5wdCArICJ0Y1ByIikuUmVwbGFjZVdpdGgobmV3VGNQclB0KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5BZGQobmV3VGNQclB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFJvbGxJbkRpcmVjdEZvcm1hdHRpbmcoWEVsZW1lbnQgdGJsKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcm93IGluIHRibC5FbGVtZW50cyhXLnRyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiByb3cuRWxlbWVudHMoVy50YykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHRUY1ByID0gY2VsbC5FbGVtZW50KFB0T3BlblhtbC5wdCArICJ0Y1ByIik7CisgICAgICAgICAgICAgICAgICAgIHZhciB0Y1ByID0gY2VsbC5FbGVtZW50KFcudGNQcik7CisgICAgICAgICAgICAgICAgICAgIHZhciBtVGNQciA9IE1lcmdlU3R5bGVFbGVtZW50KHRjUHIsIHB0VGNQcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVGNQciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGNQciA9IG5ldyBYRWxlbWVudChQdE9wZW5YbWwucHQgKyAidGNQciIpOworICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5BZGQodGNQcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1RjUHIgPSBuZXcgWEVsZW1lbnQobVRjUHIpOworICAgICAgICAgICAgICAgICAgICBuZXdUY1ByLk5hbWUgPSBQdE9wZW5YbWwucHQgKyAidGNQciI7CisgICAgICAgICAgICAgICAgICAgIHZhciBleGlzdGluZyA9IGNlbGwuRWxlbWVudChQdE9wZW5YbWwucHQgKyAidGNQciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLlJlcGxhY2VXaXRoKG5ld1RjUHIpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLkFkZChuZXdUY1ByKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgdGJsQm9yZGVycyA9IHRibC5FbGVtZW50cyhQdE9wZW5YbWwucHQgKyAidGJsUHIiKS5FbGVtZW50cyhXLnRibEJvcmRlcnMpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAodGJsQm9yZGVycyAhPSBudWxsICYmIHRibEJvcmRlcnMuQXR0cmlidXRlKFB0T3BlblhtbC5wdCArICJmcm9tRGlyZWN0IikgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBcHBseVRibEJvcmRlcnNUb1RhYmxlKHRibCwgdGJsQm9yZGVycyk7CisgICAgICAgICAgICAgICAgUHJvY2Vzc0lubmVyQm9yZGVyc1BlclRibEJvcmRlcnModGJsLCB0YmxCb3JkZXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXBwbHlUYmxCb3JkZXJzVG9UYWJsZShYRWxlbWVudCB0YmwsIFhFbGVtZW50IHRibEJvcmRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b3AgPSB0YmxCb3JkZXJzLkVsZW1lbnQoVy50b3ApOworICAgICAgICAgICAgaWYgKHRvcCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmaXJzdFJvdyA9IHRibC5FbGVtZW50cyhXLnRyKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmIChmaXJzdFJvdyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gZmlyc3RSb3cuRWxlbWVudHMoVy50YykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZWxsVGNCb3JkZXJzID0gY2VsbC5FbGVtZW50cyhQdE9wZW5YbWwucHQgKyAidGNQciIpLkVsZW1lbnRzKFcudGNCb3JkZXJzKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGxUY0JvcmRlcnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbFRvcCA9IGNlbGxUY0JvcmRlcnMuRWxlbWVudChXLnRvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGxUb3AgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFRjQm9yZGVycy5BZGQodG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxUb3AuUmVwbGFjZUF0dHJpYnV0ZXModG9wLkF0dHJpYnV0ZXMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgYm90dG9tID0gdGJsQm9yZGVycy5FbGVtZW50KFcuYm90dG9tKTsKKyAgICAgICAgICAgIGlmIChib3R0b20gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbGFzdFJvdyA9IHRibC5FbGVtZW50cyhXLnRyKS5MYXN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RSb3cgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIGxhc3RSb3cuRWxlbWVudHMoVy50YykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZWxsVGNCb3JkZXJzID0gY2VsbC5FbGVtZW50cyhQdE9wZW5YbWwucHQgKyAidGNQciIpLkVsZW1lbnRzKFcudGNCb3JkZXJzKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGxUY0JvcmRlcnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbEJvdHRvbSA9IGNlbGxUY0JvcmRlcnMuRWxlbWVudChXLmJvdHRvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGxCb3R0b20gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFRjQm9yZGVycy5BZGQoYm90dG9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxCb3R0b20uUmVwbGFjZUF0dHJpYnV0ZXMoYm90dG9tLkF0dHJpYnV0ZXMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcm93IGluIHRibC5FbGVtZW50cyhXLnRyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IHRibEJvcmRlcnMuRWxlbWVudChXLmxlZnQpOworICAgICAgICAgICAgICAgIGlmIChsZWZ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RDZWxsID0gcm93LkVsZW1lbnRzKFcudGMpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENlbGwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGxUY0JvcmRlcnMgPSBmaXJzdENlbGwuRWxlbWVudHMoUHRPcGVuWG1sLnB0ICsgInRjUHIiKS5FbGVtZW50cyhXLnRjQm9yZGVycykuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsVGNCb3JkZXJzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0Q2VsbExlZnQgPSBjZWxsVGNCb3JkZXJzLkVsZW1lbnQoVy5sZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RDZWxsTGVmdCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsVGNCb3JkZXJzLkFkZChsZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2VsbExlZnQuUmVwbGFjZUF0dHJpYnV0ZXMobGVmdC5BdHRyaWJ1dGVzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciByaWdodCA9IHRibEJvcmRlcnMuRWxlbWVudChXLnJpZ2h0KTsKKyAgICAgICAgICAgICAgICBpZiAocmlnaHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBsYXN0Q2VsbCA9IHJvdy5FbGVtZW50cyhXLnRjKS5MYXN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Q2VsbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbFRjQm9yZGVycyA9IGxhc3RDZWxsLkVsZW1lbnRzKFB0T3BlblhtbC5wdCArICJ0Y1ByIikuRWxlbWVudHMoVy50Y0JvcmRlcnMpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbFRjQm9yZGVycyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYXN0Q2VsbFJpZ2h0ID0gY2VsbFRjQm9yZGVycy5FbGVtZW50KFcucmlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Q2VsbFJpZ2h0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxUY0JvcmRlcnMuQWRkKHJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDZWxsUmlnaHQuUmVwbGFjZUF0dHJpYnV0ZXMocmlnaHQuQXR0cmlidXRlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkT3V0ZXJCb3JkZXJzKFhFbGVtZW50IHRibCwgWEVsZW1lbnQgc3R5bGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0YmxCb3JkZXJzID0gdGJsLkVsZW1lbnRzKFB0T3BlblhtbC5wdCArICJ0YmxQciIpLkVsZW1lbnRzKFcudGJsQm9yZGVycykuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmICh0YmxCb3JkZXJzICE9IG51bGwpCisgICAgICAgICAgICAgICAgQXBwbHlUYmxCb3JkZXJzVG9UYWJsZSh0YmwsIHRibEJvcmRlcnMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBQcm9jZXNzSW5uZXJCb3JkZXJzKFhFbGVtZW50IHRibCwgWEVsZW1lbnQgc3R5bGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0YmxCb3JkZXJzID0gdGJsLkVsZW1lbnRzKFB0T3BlblhtbC5wdCArICJ0YmxQciIpLkVsZW1lbnRzKFcudGJsQm9yZGVycykuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmICh0YmxCb3JkZXJzICE9IG51bGwpCisgICAgICAgICAgICAgICAgUHJvY2Vzc0lubmVyQm9yZGVyc1BlclRibEJvcmRlcnModGJsLCB0YmxCb3JkZXJzKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGF0dE5hbWUgaW4gbmV3W10geyBXLm9kZEhCYW5kLCBXLmV2ZW5IQmFuZCwgVy5maXJzdFJvdywgVy5sYXN0Um93IH0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHJvd0NvdW50ID0gdGJsLkVsZW1lbnRzKFcudHIpLkNvdW50KCk7CisgICAgICAgICAgICAgICAgaW50IGxhc3RSb3cgPSByb3dDb3VudCAtIDE7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgaW5zaWRlViA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJvdyBpbiB0YmwuRWxlbWVudHMoVy50cikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcm93Q25mU3R5bGUgPSByb3cuRWxlbWVudHMoVy50clByKS5FbGVtZW50cyhXLmNuZlN0eWxlKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocm93Q25mU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNob3VsZEFwcGx5ID0gcm93Q25mU3R5bGUuQXR0cmlidXRlKGF0dE5hbWUpLlRvQm9vbGVhbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZEFwcGx5ID09IHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNuZFR5cGUgPSBUYWJsZVN0eWxlT3ZlcnJpZGVYTmFtZVJldk1hcFthdHROYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY25kU3R5bGUgPSBzdHlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy50YmxTdHlsZVByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQodHNwID0+IChzdHJpbmcpdHNwLkF0dHJpYnV0ZShXLnR5cGUpID09IGNuZFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbmRTdHlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlVGNCb3JkZXJzID0gY25kU3R5bGUuRWxlbWVudHMoVy50Y1ByKS5FbGVtZW50cyhXLnRjQm9yZGVycykuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlVGNCb3JkZXJzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b3AgPSBzdHlsZVRjQm9yZGVycy5FbGVtZW50KFcudG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZWZ0ID0gc3R5bGVUY0JvcmRlcnMuRWxlbWVudChXLmxlZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJvdHRvbSA9IHN0eWxlVGNCb3JkZXJzLkVsZW1lbnQoVy5ib3R0b20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0ID0gc3R5bGVUY0JvcmRlcnMuRWxlbWVudChXLnJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZVYgPSBjbmRTdHlsZS5FbGVtZW50cyhXLnRjUHIpLkVsZW1lbnRzKFcudGNCb3JkZXJzKS5FbGVtZW50cyhXLmluc2lkZVYpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zaWRlViAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXN0Q29sID0gcm93LkVsZW1lbnRzKFcudGMpLkNvdW50KCkgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xJZHggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHJvdy5FbGVtZW50cyhXLnRjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0Y0JvcmRlcnMgPSBjZWxsLkVsZW1lbnRzKFB0T3BlblhtbC5wdCArICJ0Y1ByIikuRWxlbWVudHMoVy50Y0JvcmRlcnMpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xJZHggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZUluc2lkZVdpdGhFeGlzdGluZyh0Y0JvcmRlcnMsIGluc2lkZVYsIFcucmlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbElkeCA9PSBsYXN0Q29sKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlSW5zaWRlV2l0aEV4aXN0aW5nKHRjQm9yZGVycywgaW5zaWRlViwgVy5sZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVJbnNpZGVXaXRoRXhpc3RpbmcodGNCb3JkZXJzLCBpbnNpZGVWLCBXLmxlZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZUluc2lkZVdpdGhFeGlzdGluZyh0Y0JvcmRlcnMsIGluc2lkZVYsIFcucmlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbElkeCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGF0dE5hbWUgaW4gbmV3W10geyBXLm9kZFZCYW5kLCBXLmV2ZW5WQmFuZCwgVy5maXJzdENvbHVtbiwgVy5sYXN0Q29sdW1uIH0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHJvd0lkeCA9IDA7CisgICAgICAgICAgICAgICAgaW50IGxhc3RSb3cgPSB0YmwuRWxlbWVudHMoVy50cikuQ291bnQoKSAtIDE7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJvdyBpbiB0YmwuRWxlbWVudHMoVy50cikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiByb3cuRWxlbWVudHMoVy50YykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZWxsQ25mU3R5bGUgPSBjZWxsLkVsZW1lbnRzKFcudGNQcikuRWxlbWVudHMoVy5jbmZTdHlsZSkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsQ25mU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hvdWxkQXBwbHkgPSBjZWxsQ25mU3R5bGUuQXR0cmlidXRlKGF0dE5hbWUpLlRvQm9vbGVhbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRBcHBseSA9PSB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNuZFR5cGUgPSBUYWJsZVN0eWxlT3ZlcnJpZGVYTmFtZVJldk1hcFthdHROYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNuZFN0eWxlID0gc3R5bGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnRibFN0eWxlUHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQodHNwID0+IChzdHJpbmcpdHNwLkF0dHJpYnV0ZShXLnR5cGUpID09IGNuZFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY25kU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluc2lkZUggPSBjbmRTdHlsZS5FbGVtZW50cyhXLnRjUHIpLkVsZW1lbnRzKFcudGNCb3JkZXJzKS5FbGVtZW50cyhXLmluc2lkZUgpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zaWRlSCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0Y0JvcmRlcnMgPSBjZWxsLkVsZW1lbnRzKFB0T3BlblhtbC5wdCArICJ0Y1ByIikuRWxlbWVudHMoVy50Y0JvcmRlcnMpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvd0lkeCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZUluc2lkZVdpdGhFeGlzdGluZyh0Y0JvcmRlcnMsIGluc2lkZUgsIFcuYm90dG9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocm93SWR4ID09IGxhc3RSb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlSW5zaWRlV2l0aEV4aXN0aW5nKHRjQm9yZGVycywgaW5zaWRlSCwgVy50b3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlSW5zaWRlV2l0aEV4aXN0aW5nKHRjQm9yZGVycywgaW5zaWRlSCwgVy5ib3R0b20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlSW5zaWRlV2l0aEV4aXN0aW5nKHRjQm9yZGVycywgaW5zaWRlSCwgVy50b3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByb3dJZHgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFByb2Nlc3NJbm5lckJvcmRlcnNQZXJUYmxCb3JkZXJzKFhFbGVtZW50IHRibCwgWEVsZW1lbnQgdGJsQm9yZGVycykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRibEluc2lkZVYgPSB0YmxCb3JkZXJzLkVsZW1lbnRzKFcuaW5zaWRlVikuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmICh0YmxJbnNpZGVWICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJvdyBpbiB0YmwuRWxlbWVudHMoVy50cikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdENlbGwgPSByb3cuRWxlbWVudHMoVy50YykuQ291bnQoKSAtIDE7CisgICAgICAgICAgICAgICAgICAgIGludCBjZWxsSWR4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gcm93LkVsZW1lbnRzKFcudGMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGNQciA9IGNlbGwuRWxlbWVudChQdE9wZW5YbWwucHQgKyAidGNQciIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRjUHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y1ByID0gbmV3IFhFbGVtZW50KFB0T3BlblhtbC5wdCArICJ0Y1ByIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5BZGQodGNQcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGNCb3JkZXJzID0gdGNQci5FbGVtZW50KFcudGNCb3JkZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Y0JvcmRlcnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y0JvcmRlcnMgPSBuZXcgWEVsZW1lbnQoVy50Y0JvcmRlcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjUHIuQWRkKHRjQm9yZGVycyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbElkeCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVJbnNpZGVXaXRoRXhpc3RpbmcodGNCb3JkZXJzLCB0YmxJbnNpZGVWLCBXLnJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNlbGxJZHggPT0gbGFzdENlbGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZUluc2lkZVdpdGhFeGlzdGluZyh0Y0JvcmRlcnMsIHRibEluc2lkZVYsIFcubGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZUluc2lkZVdpdGhFeGlzdGluZyh0Y0JvcmRlcnMsIHRibEluc2lkZVYsIFcubGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZUluc2lkZVdpdGhFeGlzdGluZyh0Y0JvcmRlcnMsIHRibEluc2lkZVYsIFcucmlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2VsbElkeCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHRibEluc2lkZUggPSB0YmxCb3JkZXJzLkVsZW1lbnRzKFcuaW5zaWRlSCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmICh0YmxJbnNpZGVIICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHJvd0lkeDEgPSAwOworICAgICAgICAgICAgICAgIGludCBsYXN0Um93MSA9IHRibC5FbGVtZW50cyhXLnRyKS5Db3VudCgpIC0gMTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcm93IGluIHRibC5FbGVtZW50cyhXLnRyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyb3dJZHgxID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHJvdy5FbGVtZW50cyhXLnRjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGNCb3JkZXJzID0gY2VsbC5FbGVtZW50cyhQdE9wZW5YbWwucHQgKyAidGNQciIpLkVsZW1lbnRzKFcudGNCb3JkZXJzKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVJbnNpZGVXaXRoRXhpc3RpbmcodGNCb3JkZXJzLCB0YmxJbnNpZGVILCBXLmJvdHRvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocm93SWR4MSA9PSBsYXN0Um93MSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gcm93LkVsZW1lbnRzKFcudGMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0Y0JvcmRlcnMgPSBjZWxsLkVsZW1lbnRzKFB0T3BlblhtbC5wdCArICJ0Y1ByIikuRWxlbWVudHMoVy50Y0JvcmRlcnMpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZUluc2lkZVdpdGhFeGlzdGluZyh0Y0JvcmRlcnMsIHRibEluc2lkZUgsIFcudG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHJvdy5FbGVtZW50cyhXLnRjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGNCb3JkZXJzID0gY2VsbC5FbGVtZW50cyhQdE9wZW5YbWwucHQgKyAidGNQciIpLkVsZW1lbnRzKFcudGNCb3JkZXJzKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVJbnNpZGVXaXRoRXhpc3RpbmcodGNCb3JkZXJzLCB0YmxJbnNpZGVILCBXLnRvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZUluc2lkZVdpdGhFeGlzdGluZyh0Y0JvcmRlcnMsIHRibEluc2lkZUgsIFcuYm90dG9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByb3dJZHgxKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZXNvbHZlSW5zaWRlV2l0aEV4aXN0aW5nKFhFbGVtZW50IHRjQm9yZGVycywgWEVsZW1lbnQgaW5zaWRlLCBYTmFtZSB3aGljaFNpZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0Y0JvcmRlcnMuRWxlbWVudCh3aGljaFNpZGUpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG5ld0luc2lkZUggPSBSZXNvbHZlSW5zaWRlQm9yZGVyKGluc2lkZSwgdGNCb3JkZXJzLkVsZW1lbnQod2hpY2hTaWRlKSk7CisgICAgICAgICAgICAgICAgdGNCb3JkZXJzLkVsZW1lbnQod2hpY2hTaWRlKS5SZXBsYWNlQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICAgICAgbmV3SW5zaWRlSC5BdHRyaWJ1dGVzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRjQm9yZGVycy5BZGQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudCh3aGljaFNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUuQXR0cmlidXRlcygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBEaWN0aW9uYXJ5PHN0cmluZywgaW50PiBCb3JkZXJUeXBlUHJpb3JpdHkgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIGludD4oKQorICAgICAgICB7CisgICAgICAgICAgICB7ICJzaW5nbGUiLCAxIH0sCisgICAgICAgICAgICB7ICJ0aGljayIsIDIgfSwKKyAgICAgICAgICAgIHsgImRvdWJsZSIsIDMgfSwKKyAgICAgICAgICAgIHsgImRvdHRlZCIsIDQgfSwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBEaWN0aW9uYXJ5PHN0cmluZywgaW50PiBCb3JkZXJOdW1iZXIgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIGludD4oKQorICAgICAgICB7CisgICAgICAgICAgICB7InNpbmdsZSIsIDEgfSwKKyAgICAgICAgICAgIHsidGhpY2siLCAyIH0sCisgICAgICAgICAgICB7ImRvdWJsZSIsIDMgfSwKKyAgICAgICAgICAgIHsiZG90dGVkIiwgNCB9LAorICAgICAgICAgICAgeyJkYXNoZWQiLCA1IH0sCisgICAgICAgICAgICB7ImRvdERhc2giLCA2IH0sCisgICAgICAgICAgICB7ImRvdERvdERhc2giLCA3IH0sCisgICAgICAgICAgICB7InRyaXBsZSIsIDggfSwKKyAgICAgICAgICAgIHsidGhpblRoaWNrU21hbGxHYXAiLCA5IH0sCisgICAgICAgICAgICB7InRoaWNrVGhpblNtYWxsR2FwIiwgMTAgfSwKKyAgICAgICAgICAgIHsidGhpblRoaWNrVGhpblNtYWxsR2FwIiwgMTEgfSwKKyAgICAgICAgICAgIHsidGhpblRoaWNrTWVkaXVtR2FwIiwgMTIgfSwKKyAgICAgICAgICAgIHsidGhpY2tUaGluTWVkaXVtR2FwIiwgMTMgfSwKKyAgICAgICAgICAgIHsidGhpblRoaWNrVGhpbk1lZGl1bUdhcCIsIDE0IH0sCisgICAgICAgICAgICB7InRoaW5UaGlja0xhcmdlR2FwIiwgMTUgfSwKKyAgICAgICAgICAgIHsidGhpY2tUaGluTGFyZ2VHYXAiLCAxNiB9LAorICAgICAgICAgICAgeyJ0aGluVGhpY2tUaGluTGFyZ2VHYXAiLCAxNyB9LAorICAgICAgICAgICAgeyJ3YXZlIiwgMTggfSwKKyAgICAgICAgICAgIHsiZG91YmxlV2F2ZSIsIDE5IH0sCisgICAgICAgICAgICB7ImRhc2hTbWFsbEdhcCIsIDIwIH0sCisgICAgICAgICAgICB7ImRhc2hEb3RTdHJva2VkIiwgMjEgfSwKKyAgICAgICAgICAgIHsidGhyZWVERW1ib3NzIiwgMjIgfSwKKyAgICAgICAgICAgIHsidGhyZWVERW5ncmF2ZSIsIDIzIH0sCisgICAgICAgICAgICB7Im91dHNldCIsIDI0IH0sCisgICAgICAgICAgICB7Imluc2V0IiwgMjUgfSwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBSZXNvbHZlSW5zaWRlQm9yZGVyKFhFbGVtZW50IGluc2lkZTEsIFhFbGVtZW50IHNpZGVUb1JlcGxhY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbnNpZGUxID09IG51bGwgJiYgc2lkZVRvUmVwbGFjZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKGluc2lkZTEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2lkZVRvUmVwbGFjZTsKKyAgICAgICAgICAgIGlmIChzaWRlVG9SZXBsYWNlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGluc2lkZTE7CisKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFuZGxlcyB0aGUgc2l0dWF0aW9uIHdoZXJlCisgICAgICAgICAgICAvLyBpZiB0YWJsZSBpbm5lclYgaXMgc2V0LCBhbmQgY25kIGZvcm1hdCBmb3IgZmlyc3Qgcm93IHNwZWNpZmllcyBuaWxsIGJvcmRlciwgdGhlbiBuaWwgYm9yZGVyIHdpbnMuCisgICAgICAgICAgICAvLyBpZiB0YWJsZSBpbm5lckggaXMgc2V0LCBhbmQgY25kIGZvcm1hdCBmb3IgZmlyc3QgY29sdW1ucyBzcGVjaWZpZXMgbmlsIGJvcmRlciwgdGhlbiB0YWJsZSBpbm5lckggd2lucy4KKyAgICAgICAgICAgIGlmIChzaWRlVG9SZXBsYWNlLk5hbWUgPT0gVy5sZWZ0IHx8CisgICAgICAgICAgICAgICAgc2lkZVRvUmVwbGFjZS5OYW1lID09IFcucmlnaHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChzdHJpbmcpaW5zaWRlMS5BdHRyaWJ1dGUoVy52YWwpID09ICJuaWwiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zaWRlMTsKKyAgICAgICAgICAgICAgICBpZiAoKHN0cmluZylzaWRlVG9SZXBsYWNlLkF0dHJpYnV0ZShXLnZhbCkgPT0gIm5pbCIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWRlVG9SZXBsYWNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoc3RyaW5nKWluc2lkZTEuQXR0cmlidXRlKFcudmFsKSA9PSAibmlsIikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZGVUb1JlcGxhY2U7CisgICAgICAgICAgICAgICAgaWYgKChzdHJpbmcpc2lkZVRvUmVwbGFjZS5BdHRyaWJ1dGUoVy52YWwpID09ICJuaWwiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zaWRlMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGluc2lkZTFWYWwgPSAoc3RyaW5nKWluc2lkZTEuQXR0cmlidXRlKFcudmFsKTsKKyAgICAgICAgICAgIHZhciBib3JkZXIxV2VpZ2h0ID0gMTsKKyAgICAgICAgICAgIGlmIChCb3JkZXJOdW1iZXIuQ29udGFpbnNLZXkoaW5zaWRlMVZhbCkpCisgICAgICAgICAgICAgICAgYm9yZGVyMVdlaWdodCA9IEJvcmRlck51bWJlcltpbnNpZGUxVmFsXTsKKworICAgICAgICAgICAgdmFyIHNpZGVUb1JlcGxhY2VWYWwgPSAoc3RyaW5nKXNpZGVUb1JlcGxhY2UuQXR0cmlidXRlKFcudmFsKTsKKyAgICAgICAgICAgIHZhciBzaWRlVG9SZXBsYWNlV2VpZ2h0ID0gMTsKKyAgICAgICAgICAgIGlmIChCb3JkZXJOdW1iZXIuQ29udGFpbnNLZXkoc2lkZVRvUmVwbGFjZVZhbCkpCisgICAgICAgICAgICAgICAgc2lkZVRvUmVwbGFjZVdlaWdodCA9IEJvcmRlck51bWJlcltzaWRlVG9SZXBsYWNlVmFsXTsKKworICAgICAgICAgICAgaWYgKGJvcmRlcjFXZWlnaHQgIT0gc2lkZVRvUmVwbGFjZVdlaWdodCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYm9yZGVyMVdlaWdodCA8IHNpZGVUb1JlcGxhY2VXZWlnaHQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWRlVG9SZXBsYWNlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc2lkZTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoaW50KWluc2lkZTEuQXR0cmlidXRlKFcuc3opID4gKGludClzaWRlVG9SZXBsYWNlLkF0dHJpYnV0ZShXLnN6KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zaWRlMTsKKworICAgICAgICAgICAgaWYgKChpbnQpc2lkZVRvUmVwbGFjZS5BdHRyaWJ1dGUoVy5zeikgPiAoaW50KWluc2lkZTEuQXR0cmlidXRlKFcuc3opKQorICAgICAgICAgICAgICAgIHJldHVybiBzaWRlVG9SZXBsYWNlOworCisgICAgICAgICAgICBpZiAoQm9yZGVyVHlwZVByaW9yaXR5LkNvbnRhaW5zS2V5KGluc2lkZTFWYWwpICYmCisgICAgICAgICAgICAgICAgQm9yZGVyVHlwZVByaW9yaXR5LkNvbnRhaW5zS2V5KHNpZGVUb1JlcGxhY2VWYWwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBpbnNpZGUxUHJpID0gQm9yZGVyVHlwZVByaW9yaXR5W2luc2lkZTFWYWxdOworICAgICAgICAgICAgICAgIHZhciBpbnNpZGUyUHJpID0gQm9yZGVyVHlwZVByaW9yaXR5W3NpZGVUb1JlcGxhY2VWYWxdOworICAgICAgICAgICAgICAgIGlmIChpbnNpZGUxUHJpID4gaW5zaWRlMlByaSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc2lkZTE7CisgICAgICAgICAgICAgICAgaWYgKGluc2lkZTJQcmkgPiBpbnNpZGUxUHJpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lkZVRvUmVwbGFjZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChpbnQpaW5zaWRlMS5BdHRyaWJ1dGUoVy5zeikgPiAoaW50KXNpZGVUb1JlcGxhY2UuQXR0cmlidXRlKFcuc3opKQorICAgICAgICAgICAgICAgIHJldHVybiBpbnNpZGUxOworCisgICAgICAgICAgICBpZiAoKGludClzaWRlVG9SZXBsYWNlLkF0dHJpYnV0ZShXLnN6KSA+IChpbnQpaW5zaWRlMS5BdHRyaWJ1dGUoVy5zeikpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpZGVUb1JlcGxhY2U7CisKKyAgICAgICAgICAgIHZhciBjb2xvcjFzdHIgPSAoc3RyaW5nKWluc2lkZTEuQXR0cmlidXRlKFcuY29sb3IpOworICAgICAgICAgICAgaWYgKGNvbG9yMXN0ciA9PSAiYXV0byIpCisgICAgICAgICAgICAgICAgY29sb3Ixc3RyID0gIjAwMDAwMCI7CisgICAgICAgICAgICB2YXIgY29sb3Iyc3RyID0gKHN0cmluZylzaWRlVG9SZXBsYWNlLkF0dHJpYnV0ZShXLmNvbG9yKTsKKyAgICAgICAgICAgIGlmIChjb2xvcjJzdHIgPT0gImF1dG8iKQorICAgICAgICAgICAgICAgIGNvbG9yMnN0ciA9ICIwMDAwMDAiOworICAgICAgICAgICAgaWYgKGNvbG9yMXN0ciAhPSBudWxsICYmIGNvbG9yMnN0ciAhPSBudWxsICYmIGNvbG9yMXN0ciAhPSBjb2xvcjJzdHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW50MzIgY29sb3IxOworICAgICAgICAgICAgICAgIEludDMyIGNvbG9yMjsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbG9yMSA9IENvbnZlcnQuVG9JbnQzMihjb2xvcjFzdHIsIDE2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGFib3ZlIHRocm93cyBBcmd1bWVudEV4Y2VwdGlvbiwgRm9ybWF0RXhjZXB0aW9uLCBvciBPdmVyZmxvd0V4Y2VwdGlvbiwgdGhlbiBhYm9ydAorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZGVUb1JlcGxhY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29sb3IyID0gQ29udmVydC5Ub0ludDMyKGNvbG9yMnN0ciwgMTYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYWJvdmUgdGhyb3dzIEFyZ3VtZW50RXhjZXB0aW9uLCBGb3JtYXRFeGNlcHRpb24sIG9yIE92ZXJmbG93RXhjZXB0aW9uLCB0aGVuIGFib3J0CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnNpZGUxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29sb3IxIDwgY29sb3IyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zaWRlMTsKKyAgICAgICAgICAgICAgICBpZiAoY29sb3IyIDwgY29sb3IxKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lkZVRvUmVwbGFjZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zaWRlMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbnNpZGUxOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgVGFibGVTdHlsZVJvbGx1cChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIHN0cmluZyB0YmxTdHlsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0YmxTdHlsZUNoYWluID0gVGFibGVTdHlsZVN0YWNrKHdEb2MsIHRibFN0eWxlTmFtZSkKKyAgICAgICAgICAgICAgICAuUmV2ZXJzZSgpOworICAgICAgICAgICAgWEVsZW1lbnQgcm9sbGVkU3R5bGUgPSBuZXcgWEVsZW1lbnQoVy5zdHlsZSk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgc3R5bGUgaW4gdGJsU3R5bGVDaGFpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb2xsZWRTdHlsZSA9IE1lcmdlU3R5bGVFbGVtZW50KHN0eWxlLCByb2xsZWRTdHlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcm9sbGVkU3R5bGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYTmFtZVtdIFNwZWNpYWxDYXNlQ2hpbGRQcm9wZXJ0aWVzID0KKyAgICAgICAgeworICAgICAgICAgICAgVy50YmxQciwKKyAgICAgICAgICAgIFcudHJQciwKKyAgICAgICAgICAgIFcudGNQciwKKyAgICAgICAgICAgIFcucFByLAorICAgICAgICAgICAgVy5yUHIsCisgICAgICAgICAgICBXLnBCZHIsCisgICAgICAgICAgICBXLnRhYnMsCisgICAgICAgICAgICBXLnJGb250cywKKyAgICAgICAgICAgIFcuaW5kLAorICAgICAgICAgICAgVy5zcGFjaW5nLAorICAgICAgICAgICAgVy50YmxTdHlsZVByLAorICAgICAgICAgICAgVy50Y0JvcmRlcnMsCisgICAgICAgICAgICBXLnRibEJvcmRlcnMsCisgICAgICAgICAgICBXLmxhbmcsCisgICAgICAgICAgICBXLm51bVByLAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhOYW1lW10gTWVyZ2VDaGlsZFByb3BlcnRpZXMgPQorICAgICAgICB7CisgICAgICAgICAgICBXLnRibFByLAorICAgICAgICAgICAgVy50clByLAorICAgICAgICAgICAgVy50Y1ByLAorICAgICAgICAgICAgVy5wUHIsCisgICAgICAgICAgICBXLnJQciwKKyAgICAgICAgICAgIFcucEJkciwKKyAgICAgICAgICAgIFcudGNCb3JkZXJzLAorICAgICAgICAgICAgVy50YmxCb3JkZXJzLAorICAgICAgICAgICAgVy5udW1QciwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBUYWJsZVN0eWxlT3ZlcnJpZGVUeXBlcyA9CisgICAgICAgIHsKKyAgICAgICAgICAgICJiYW5kMVZlcnQiLAorICAgICAgICAgICAgImJhbmQyVmVydCIsCisgICAgICAgICAgICAiYmFuZDFIb3J6IiwKKyAgICAgICAgICAgICJiYW5kMkhvcnoiLAorICAgICAgICAgICAgImZpcnN0Q29sIiwKKyAgICAgICAgICAgICJsYXN0Q29sIiwKKyAgICAgICAgICAgICJmaXJzdFJvdyIsCisgICAgICAgICAgICAibGFzdFJvdyIsCisgICAgICAgICAgICAibmVDZWxsIiwKKyAgICAgICAgICAgICJud0NlbGwiLAorICAgICAgICAgICAgInNlQ2VsbCIsCisgICAgICAgICAgICAic3dDZWxsIiwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBEaWN0aW9uYXJ5PHN0cmluZywgWE5hbWU+IFRhYmxlU3R5bGVPdmVycmlkZVhOYW1lTWFwID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBYTmFtZT4KKyAgICAgICAgeworICAgICAgICAgICAgeyJiYW5kMVZlcnQiLCBXLm9kZFZCYW5kfSwKKyAgICAgICAgICAgIHsiYmFuZDJWZXJ0IiwgVy5ldmVuVkJhbmR9LAorICAgICAgICAgICAgeyJiYW5kMUhvcnoiLCBXLm9kZEhCYW5kfSwKKyAgICAgICAgICAgIHsiYmFuZDJIb3J6IiwgVy5ldmVuSEJhbmR9LAorICAgICAgICAgICAgeyJmaXJzdENvbCIsIFcuZmlyc3RDb2x1bW59LAorICAgICAgICAgICAgeyJsYXN0Q29sIiwgVy5sYXN0Q29sdW1ufSwKKyAgICAgICAgICAgIHsiZmlyc3RSb3ciLCBXLmZpcnN0Um93fSwKKyAgICAgICAgICAgIHsibGFzdFJvdyIsIFcubGFzdFJvd30sCisgICAgICAgICAgICB7Im5lQ2VsbCIsIFcuZmlyc3RSb3dMYXN0Q29sdW1ufSwKKyAgICAgICAgICAgIHsibndDZWxsIiwgVy5maXJzdFJvd0ZpcnN0Q29sdW1ufSwKKyAgICAgICAgICAgIHsic2VDZWxsIiwgVy5sYXN0Um93TGFzdENvbHVtbn0sCisgICAgICAgICAgICB7InN3Q2VsbCIsIFcubGFzdFJvd0ZpcnN0Q29sdW1ufSwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBEaWN0aW9uYXJ5PFhOYW1lLCBzdHJpbmc+IFRhYmxlU3R5bGVPdmVycmlkZVhOYW1lUmV2TWFwID0gbmV3IERpY3Rpb25hcnk8WE5hbWUsIHN0cmluZz4KKyAgICAgICAgeworICAgICAgICAgICAge1cub2RkVkJhbmQsICJiYW5kMVZlcnQifSwKKyAgICAgICAgICAgIHtXLmV2ZW5WQmFuZCwgImJhbmQyVmVydCJ9LAorICAgICAgICAgICAge1cub2RkSEJhbmQsICJiYW5kMUhvcnoifSwKKyAgICAgICAgICAgIHtXLmV2ZW5IQmFuZCwgImJhbmQySG9yeiJ9LAorICAgICAgICAgICAge1cuZmlyc3RDb2x1bW4sICJmaXJzdENvbCJ9LAorICAgICAgICAgICAge1cubGFzdENvbHVtbiwgImxhc3RDb2wifSwKKyAgICAgICAgICAgIHtXLmZpcnN0Um93LCAiZmlyc3RSb3cifSwKKyAgICAgICAgICAgIHtXLmxhc3RSb3csICJsYXN0Um93In0sCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgTWVyZ2VTdHlsZUVsZW1lbnQoWEVsZW1lbnQgaGlnaGVyUHJpb3JpdHlFbGVtZW50LCBYRWxlbWVudCBsb3dlclByaW9yaXR5RWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE1lcmdlU3R5bGVFbGVtZW50KGhpZ2hlclByaW9yaXR5RWxlbWVudCwgbG93ZXJQcmlvcml0eUVsZW1lbnQsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgTWVyZ2VTdHlsZUVsZW1lbnQoWEVsZW1lbnQgaGlnaGVyUHJpb3JpdHlFbGVtZW50LCBYRWxlbWVudCBsb3dlclByaW9yaXR5RWxlbWVudCwgYm9vbD8gaGlnaFByaUlzRGlyZWN0Rm9ybWF0dGluZykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWYsIHdoZW4gaW4gdGhlIHByb2Nlc3Mgb2YgbWVyZ2luZywgdGhlIHNvdXJjZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhCisgICAgICAgICAgICAvLyBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gdGhlIG1lcmdlZCBlbGVtZW50LCB0aGVuIGluY2x1ZGUgdGhlIHNvdXJjZSBlbGVtZW50CisgICAgICAgICAgICAvLyBpbiB0aGUgbWVyZ2VkIGVsZW1lbnQuCisgICAgICAgICAgICBpZiAobG93ZXJQcmlvcml0eUVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaGlnaGVyUHJpb3JpdHlFbGVtZW50OworICAgICAgICAgICAgaWYgKGhpZ2hlclByaW9yaXR5RWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBsb3dlclByaW9yaXR5RWxlbWVudDsKKworICAgICAgICAgICAgdmFyIGhwZSA9IGhpZ2hlclByaW9yaXR5RWxlbWVudAorICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gIVNwZWNpYWxDYXNlQ2hpbGRQcm9wZXJ0aWVzLkNvbnRhaW5zKGUuTmFtZSkpCisgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIGlmIChoaWdoUHJpSXNEaXJlY3RGb3JtYXR0aW5nID09IHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHBlID0gaHBlCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KGUuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwucHQgKyAiZnJvbURpcmVjdCIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuRWxlbWVudHMoKSkpCisgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgbHBlID0gbG93ZXJQcmlvcml0eUVsZW1lbnQKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgIC5XaGVyZShlID0+ICFTcGVjaWFsQ2FzZUNoaWxkUHJvcGVydGllcy5Db250YWlucyhlLk5hbWUpICYmICFocGUuU2VsZWN0KHogPT4gei5OYW1lKS5Db250YWlucyhlLk5hbWUpKQorICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisgICAgICAgICAgICB2YXIgbWEgPSBTcGFjaW5nTWVyZ2UoaGlnaGVyUHJpb3JpdHlFbGVtZW50LkVsZW1lbnQoVy5zcGFjaW5nKSwgbG93ZXJQcmlvcml0eUVsZW1lbnQuRWxlbWVudChXLnNwYWNpbmcpKTsKKyAgICAgICAgICAgIHZhciByRm9udHMgPSBGb250TWVyZ2UoaGlnaGVyUHJpb3JpdHlFbGVtZW50LkVsZW1lbnQoVy5yRm9udHMpLCBsb3dlclByaW9yaXR5RWxlbWVudC5FbGVtZW50KFcuckZvbnRzKSk7CisgICAgICAgICAgICB2YXIgdGFicyA9IFRhYnNNZXJnZShoaWdoZXJQcmlvcml0eUVsZW1lbnQuRWxlbWVudChXLnRhYnMpLCBsb3dlclByaW9yaXR5RWxlbWVudC5FbGVtZW50KFcudGFicykpOworICAgICAgICAgICAgdmFyIGluZCA9IEluZE1lcmdlKGhpZ2hlclByaW9yaXR5RWxlbWVudC5FbGVtZW50KFcuaW5kKSwgbG93ZXJQcmlvcml0eUVsZW1lbnQuRWxlbWVudChXLmluZCkpOworICAgICAgICAgICAgdmFyIGxhbmcgPSBMYW5nTWVyZ2UoaGlnaGVyUHJpb3JpdHlFbGVtZW50LkVsZW1lbnQoVy5sYW5nKSwgbG93ZXJQcmlvcml0eUVsZW1lbnQuRWxlbWVudChXLmxhbmcpKTsKKyAgICAgICAgICAgIHZhciBtY3AgPSBNZXJnZUNoaWxkUHJvcGVydGllcworICAgICAgICAgICAgICAgIC5TZWxlY3QoZSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGVzdCBpcyBoZXJlIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmVjdXJzaW9uIHRvIG1ha2UgZGVidWdnaW5nIGVhc2llcgorICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGhpZ2hlclByaW9yaXR5RWxlbWVudC5FbGVtZW50KGUpOworICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IGxvd2VyUHJpb3JpdHlFbGVtZW50LkVsZW1lbnQoZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoID09IG51bGwgJiYgbCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChoID09IG51bGwgJiYgbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChoICE9IG51bGwgJiYgbCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3SCA9IG5ldyBYRWxlbWVudChoLk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaFByaUlzRGlyZWN0Rm9ybWF0dGluZyA9PSB0cnVlID8gbmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLnB0ICsgImZyb21EaXJlY3QiLCB0cnVlKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5FbGVtZW50cygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdIOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNZXJnZVN0eWxlRWxlbWVudChoLCBsLCBoaWdoUHJpSXNEaXJlY3RGb3JtYXR0aW5nKTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5XaGVyZShtID0+IG0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgdmFyIHRzb3IgPSBUYWJsZVN0eWxlT3ZlcnJpZGVUeXBlcworICAgICAgICAgICAgICAgIC5TZWxlY3QoZSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGVzdCBpcyBoZXJlIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmVjdXJzaW9uIHRvIG1ha2UgZGVidWdnaW5nIGVhc2llcgorICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGhpZ2hlclByaW9yaXR5RWxlbWVudC5FbGVtZW50cyhXLnRibFN0eWxlUHIpLkZpcnN0T3JEZWZhdWx0KHRzcCA9PiAoc3RyaW5nKXRzcC5BdHRyaWJ1dGUoVy50eXBlKSA9PSBlKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBsb3dlclByaW9yaXR5RWxlbWVudC5FbGVtZW50cyhXLnRibFN0eWxlUHIpLkZpcnN0T3JEZWZhdWx0KHRzcCA9PiAoc3RyaW5nKXRzcC5BdHRyaWJ1dGUoVy50eXBlKSA9PSBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGggPT0gbnVsbCAmJiBsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGggPT0gbnVsbCAmJiBsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGggIT0gbnVsbCAmJiBsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlU3R5bGVFbGVtZW50KGgsIGwpOworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLldoZXJlKG0gPT4gbSAhPSBudWxsKQorICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIFhFbGVtZW50IG5ld01lcmdlZEVsZW1lbnQgPSBuZXcgWEVsZW1lbnQoaGlnaGVyUHJpb3JpdHlFbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3IiwgVy53KSwKKyAgICAgICAgICAgICAgICBoaWdoZXJQcmlvcml0eUVsZW1lbnQuQXR0cmlidXRlcygpLldoZXJlKGEgPT4gIWEuSXNOYW1lc3BhY2VEZWNsYXJhdGlvbiksCisgICAgICAgICAgICAgICAgaHBlLCAgLy8gaGlnaGVyIHByaW9yaXR5IGVsZW1lbnRzCisgICAgICAgICAgICAgICAgbHBlLCAgLy8gbG93ZXIgcHJpb3JpdHkgZWxlbWVudHMgd2hlcmUgdGhlcmUgaXMgbm90IGEgaGlnaGVyIHByaW9yaXR5IGVsZW1lbnQgb2Ygc2FtZSBuYW1lCisgICAgICAgICAgICAgICAgaW5kLCAgLy8gdzppbmQgaGFzIHZlcnkgc3BlY2lhbCBydWxlcworICAgICAgICAgICAgICAgIG1hLCAgIC8vIGVsZW1lbnRzIHRoYXQgcmVxdWlyZSBtZXJnZWQgYXR0cmlidXRlcworICAgICAgICAgICAgICAgIGxhbmcsCisgICAgICAgICAgICAgICAgckZvbnRzLCAgLy8gZm9udCBtZXJnZSBpcyBzcGVjaWFsIGNhc2UKKyAgICAgICAgICAgICAgICB0YWJzLCAgICAvLyB0YWJzIG1lcmdlIGlzIHNwZWNpYWwgY2FzZQorICAgICAgICAgICAgICAgIG1jcCwgIC8vIGVsZW1lbnRzIHRoYXQgbmVlZCBjaGlsZCBwcm9wZXJ0aWVzIHRvIGJlIG1lcmdlZAorICAgICAgICAgICAgICAgIHRzb3IgLy8gbWVyZ2VkIHRhYmxlIHN0eWxlIG92ZXJyaWRlIGVsZW1lbnRzCisgICAgICAgICAgICApOworCisgICAgICAgICAgICByZXR1cm4gbmV3TWVyZ2VkRWxlbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IExhbmdNZXJnZShYRWxlbWVudCBoTGFuZywgWEVsZW1lbnQgbExhbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChoTGFuZyA9PSBudWxsICYmIGxMYW5nID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBpZiAoaExhbmcgIT0gbnVsbCAmJiBsTGFuZyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBoTGFuZzsKKyAgICAgICAgICAgIGlmIChsTGFuZyAhPSBudWxsICYmIGhMYW5nID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGxMYW5nOworICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLmxhbmcsCisgICAgICAgICAgICAgICAgaExhbmcuQXR0cmlidXRlKFcudmFsKSAhPSBudWxsID8gaExhbmcuQXR0cmlidXRlKFcudmFsKSA6IGxMYW5nLkF0dHJpYnV0ZShXLnZhbCksCisgICAgICAgICAgICAgICAgaExhbmcuQXR0cmlidXRlKFcuYmlkaSkgIT0gbnVsbCA/IGhMYW5nLkF0dHJpYnV0ZShXLmJpZGkpIDogbExhbmcuQXR0cmlidXRlKFcuYmlkaSksCisgICAgICAgICAgICAgICAgaExhbmcuQXR0cmlidXRlKFcuZWFzdEFzaWEpICE9IG51bGwgPyBoTGFuZy5BdHRyaWJ1dGUoVy5lYXN0QXNpYSkgOiBsTGFuZy5BdHRyaWJ1dGUoVy5lYXN0QXNpYSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIEluZEF0dFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgRW5kLAorICAgICAgICAgICAgRmlyc3RMaW5lT3JIYW5naW5nLAorICAgICAgICAgICAgU3RhcnQsCisgICAgICAgICAgICBMZWZ0LAorICAgICAgICAgICAgUmlnaHQsCisgICAgICAgICAgICBOb25lLAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEluZE1lcmdlKFhFbGVtZW50IGhpZ2hlclByaW9yaXR5RWxlbWVudCwgWEVsZW1lbnQgbG93ZXJQcmlvcml0eUVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChoaWdoZXJQcmlvcml0eUVsZW1lbnQgPT0gbnVsbCAmJiBsb3dlclByaW9yaXR5RWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKGhpZ2hlclByaW9yaXR5RWxlbWVudCAhPSBudWxsICYmIGxvd2VyUHJpb3JpdHlFbGVtZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGhpZ2hlclByaW9yaXR5RWxlbWVudDsKKyAgICAgICAgICAgIGlmIChsb3dlclByaW9yaXR5RWxlbWVudCAhPSBudWxsICYmIGhpZ2hlclByaW9yaXR5RWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBsb3dlclByaW9yaXR5RWxlbWVudDsKKworICAgICAgICAgICAgWEVsZW1lbnQgaHBlID0gbmV3IFhFbGVtZW50KGhpZ2hlclByaW9yaXR5RWxlbWVudCk7CisgICAgICAgICAgICBYRWxlbWVudCBscGUgPSBuZXcgWEVsZW1lbnQobG93ZXJQcmlvcml0eUVsZW1lbnQpOworCisgICAgICAgICAgICBpZiAoaHBlLkF0dHJpYnV0ZShXLmZpcnN0TGluZSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBscGUuQXR0cmlidXRlcyhXLmhhbmdpbmcpLlJlbW92ZSgpOworCisgICAgICAgICAgICBpZiAoaHBlLkF0dHJpYnV0ZShXLmZpcnN0TGluZUNoYXJzKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGxwZS5BdHRyaWJ1dGVzKFcuaGFuZ2luZ0NoYXJzKS5SZW1vdmUoKTsKKworICAgICAgICAgICAgaWYgKGhwZS5BdHRyaWJ1dGUoVy5oYW5naW5nKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGxwZS5BdHRyaWJ1dGVzKFcuZmlyc3RMaW5lKS5SZW1vdmUoKTsKKworICAgICAgICAgICAgaWYgKGhwZS5BdHRyaWJ1dGUoVy5oYW5naW5nQ2hhcnMpICE9IG51bGwpCisgICAgICAgICAgICAgICAgbHBlLkF0dHJpYnV0ZXMoVy5maXJzdExpbmVDaGFycykuUmVtb3ZlKCk7CisKKyAgICAgICAgICAgIHZhciBoaWdoUHJpQXR0cyA9IGhwZQorICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoYSA9PiAhYS5Jc05hbWVzcGFjZURlY2xhcmF0aW9uKQorICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKworICAgICAgICAgICAgdmFyIGhpZ2hQcmlBdHROYW1lcyA9IGhpZ2hQcmlBdHRzCisgICAgICAgICAgICAgICAgLlNlbGVjdChhID0+IGEuTmFtZSk7CisKKyAgICAgICAgICAgIHZhciBsb3dQcmlBdHRzID0gbHBlCisgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgIC5XaGVyZShhID0+ICFhLklzTmFtZXNwYWNlRGVjbGFyYXRpb24pCisgICAgICAgICAgICAgICAgLldoZXJlKGEgPT4gIWhpZ2hQcmlBdHROYW1lcy5Db250YWlucyhhLk5hbWUpKQorICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKworICAgICAgICAgICAgdmFyIG1lcmdlZEVsZW1lbnQgPSBuZXcgWEVsZW1lbnQoaGlnaGVyUHJpb3JpdHlFbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgaGlnaFByaUF0dHMsCisgICAgICAgICAgICAgICAgbG93UHJpQXR0cyk7CisKKyAgICAgICAgICAgIHJldHVybiBtZXJnZWRFbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgLy8gbWVyZ2UgY2hpbGQgdGFiIGVsZW1lbnRzCisgICAgICAgIC8vIHRoZXkgYXJlIGFkZGl0aXZlLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBpZiB0aGVyZSBhcmUgdHdvIGVsZW1lbnRzIGF0IHRoZSBzYW1lIGxvY2F0aW9uLAorICAgICAgICAvLyB3ZSBuZWVkIHRvIHRha2UgdGhlIGhpZ2hlciwgYW5kIG5vdCB0YWtlIHRoZSBsb3dlci4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgVGFic01lcmdlKFhFbGVtZW50IGhpZ2hlclByaW9yaXR5RWxlbWVudCwgWEVsZW1lbnQgbG93ZXJQcmlvcml0eUVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChoaWdoZXJQcmlvcml0eUVsZW1lbnQgIT0gbnVsbCAmJiBsb3dlclByaW9yaXR5RWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBoaWdoZXJQcmlvcml0eUVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoaGlnaGVyUHJpb3JpdHlFbGVtZW50ID09IG51bGwgJiYgbG93ZXJQcmlvcml0eUVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbG93ZXJQcmlvcml0eUVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoaGlnaGVyUHJpb3JpdHlFbGVtZW50ID09IG51bGwgJiYgbG93ZXJQcmlvcml0eUVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHZhciBocHMgPSBoaWdoZXJQcmlvcml0eUVsZW1lbnQuRWxlbWVudHMoKS5TZWxlY3QoZSA9PgorICAgICAgICAgICAgICAgIG5ldworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUG9zID0gKGludCllLkF0dHJpYnV0ZShXLnBvcyksCisgICAgICAgICAgICAgICAgICAgIFByaSA9IDEsCisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgPSBlLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisgICAgICAgICAgICB2YXIgbHBzID0gbG93ZXJQcmlvcml0eUVsZW1lbnQuRWxlbWVudHMoKS5TZWxlY3QoZSA9PgorICAgICAgICAgICAgICAgIG5ldworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUG9zID0gKGludCllLkF0dHJpYnV0ZShXLnBvcyksCisgICAgICAgICAgICAgICAgICAgIFByaSA9IDIsCisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgPSBlLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisgICAgICAgICAgICB2YXIgbmV3VGFiRWxlbWVudHMgPSBocHMuQ29uY2F0KGxwcykKKyAgICAgICAgICAgICAgICAuR3JvdXBCeShzID0+IHMuUG9zKQorICAgICAgICAgICAgICAgIC5TZWxlY3QoZyA9PiBnLk9yZGVyQnkocyA9PiBzLlByaSkuRmlyc3QoKS5FbGVtZW50KQorICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy52YWwpICE9ICJjbGVhciIpCisgICAgICAgICAgICAgICAgLk9yZGVyQnkoZSA9PiAoaW50KWUuQXR0cmlidXRlKFcucG9zKSk7CisgICAgICAgICAgICB2YXIgbmV3VGFicyA9IG5ldyBYRWxlbWVudChXLnRhYnMsIG5ld1RhYkVsZW1lbnRzKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdUYWJzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgU3BhY2luZ01lcmdlKFhFbGVtZW50IGhuLCBYRWxlbWVudCBsbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhuID09IG51bGwgJiYgbG4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGlmIChobiAhPSBudWxsICYmIGxuID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGhuOworICAgICAgICAgICAgaWYgKGhuID09IG51bGwgJiYgbG4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbG47CisgICAgICAgICAgICB2YXIgbW4xID0gbmV3IFhFbGVtZW50KFcuc3BhY2luZywKKyAgICAgICAgICAgICAgICBobi5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgbG4uQXR0cmlidXRlcygpLldoZXJlKGEgPT4gaG4uQXR0cmlidXRlKGEuTmFtZSkgPT0gbnVsbCkpOworICAgICAgICAgICAgcmV0dXJuIG1uMTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIElFbnVtZXJhYmxlPFhFbGVtZW50PiBUYWJsZVN0eWxlU3RhY2soV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jLCBzdHJpbmcgdGJsU3R5bGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgc1hEb2MgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBzdHJpbmcgY3VycmVudFN0eWxlID0gdGJsU3R5bGVOYW1lOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgc3R5bGUgPSBzWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkuV2hlcmUocyA9PiAoc3RyaW5nKXMuQXR0cmlidXRlKFcudHlwZSkgPT0gInRhYmxlIiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZylzLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09IGN1cnJlbnRTdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKHN0eWxlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGJyZWFrOworICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBzdHlsZTsKKyAgICAgICAgICAgICAgICBjdXJyZW50U3R5bGUgPSAoc3RyaW5nKXN0eWxlLkVsZW1lbnRzKFcuYmFzZWRPbikuQXR0cmlidXRlcyhXLnZhbCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN0eWxlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgRm9udE1lcmdlKFhFbGVtZW50IGhpZ2hlclByaW9yaXR5Rm9udCwgWEVsZW1lbnQgbG93ZXJQcmlvcml0eUZvbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IHJGb250czsKKworICAgICAgICAgICAgaWYgKGhpZ2hlclByaW9yaXR5Rm9udCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBsb3dlclByaW9yaXR5Rm9udDsKKyAgICAgICAgICAgIGlmIChsb3dlclByaW9yaXR5Rm9udCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBoaWdoZXJQcmlvcml0eUZvbnQ7CisgICAgICAgICAgICBpZiAoaGlnaGVyUHJpb3JpdHlGb250ID09IG51bGwgJiYgbG93ZXJQcmlvcml0eUZvbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgckZvbnRzID0gbmV3IFhFbGVtZW50KFcuckZvbnRzLAorICAgICAgICAgICAgICAgIChoaWdoZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuYXNjaWkpICE9IG51bGwgfHwgaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmFzY2lpVGhlbWUpICE9IG51bGwpID8KKyAgICAgICAgICAgICAgICAgICAgbmV3W10geyBoaWdoZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuYXNjaWkpLCBoaWdoZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuYXNjaWlUaGVtZSkgfSA6CisgICAgICAgICAgICAgICAgICAgIG5ld1tdIHsgbG93ZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuYXNjaWkpLCBsb3dlclByaW9yaXR5Rm9udC5BdHRyaWJ1dGUoVy5hc2NpaVRoZW1lKSB9LAorICAgICAgICAgICAgICAgIChoaWdoZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuaEFuc2kpICE9IG51bGwgfHwgaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmhBbnNpVGhlbWUpICE9IG51bGwpID8KKyAgICAgICAgICAgICAgICAgICAgbmV3W10geyBoaWdoZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuaEFuc2kpLCBoaWdoZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuaEFuc2lUaGVtZSkgfSA6CisgICAgICAgICAgICAgICAgICAgIG5ld1tdIHsgbG93ZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuaEFuc2kpLCBsb3dlclByaW9yaXR5Rm9udC5BdHRyaWJ1dGUoVy5oQW5zaVRoZW1lKSB9LAorICAgICAgICAgICAgICAgIChoaWdoZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuZWFzdEFzaWEpICE9IG51bGwgfHwgaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmVhc3RBc2lhVGhlbWUpICE9IG51bGwpID8KKyAgICAgICAgICAgICAgICAgICAgbmV3W10geyBoaWdoZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuZWFzdEFzaWEpLCBoaWdoZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuZWFzdEFzaWFUaGVtZSkgfSA6CisgICAgICAgICAgICAgICAgICAgIG5ld1tdIHsgbG93ZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuZWFzdEFzaWEpLCBsb3dlclByaW9yaXR5Rm9udC5BdHRyaWJ1dGUoVy5lYXN0QXNpYVRoZW1lKSB9LAorICAgICAgICAgICAgICAgIChoaWdoZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuY3MpICE9IG51bGwgfHwgaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmNzdGhlbWUpICE9IG51bGwpID8KKyAgICAgICAgICAgICAgICAgICAgbmV3W10geyBoaWdoZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuY3MpLCBoaWdoZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuY3N0aGVtZSkgfSA6CisgICAgICAgICAgICAgICAgICAgIG5ld1tdIHsgbG93ZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuY3MpLCBsb3dlclByaW9yaXR5Rm9udC5BdHRyaWJ1dGUoVy5jc3RoZW1lKSB9LAorICAgICAgICAgICAgICAgIChoaWdoZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuaGludCkgIT0gbnVsbCA/IGhpZ2hlclByaW9yaXR5Rm9udC5BdHRyaWJ1dGUoVy5oaW50KSA6CisgICAgICAgICAgICAgICAgICAgIGxvd2VyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmhpbnQpKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgcmV0dXJuIHJGb250czsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQW5ub3RhdGVQYXJhZ3JhcGhzKEZvcm1hdHRpbmdBc3NlbWJsZXJJbmZvIGZhaSwgV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jLCBYRWxlbWVudCByb290LCBGb3JtYXR0aW5nQXNzZW1ibGVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYXJhIGluIHJvb3QuRGVzY2VuZGFudHMoVy5wKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBbm5vdGF0ZVBhcmFncmFwaChmYWksIHdEb2MsIHBhcmEsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQW5ub3RhdGVQYXJhZ3JhcGgoRm9ybWF0dGluZ0Fzc2VtYmxlckluZm8gZmFpLCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIFhFbGVtZW50IHBhcmEsIEZvcm1hdHRpbmdBc3NlbWJsZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgbG9jYWxQYXJhUHJvcHMgPSBwYXJhLkVsZW1lbnQoVy5wUHIpOworICAgICAgICAgICAgaWYgKGxvY2FsUGFyYVByb3BzID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jYWxQYXJhUHJvcHMgPSBuZXcgWEVsZW1lbnQoVy5wUHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBnZXQgcGFyYSB0YWJsZSBwcm9wcywgdG8gYmUgbWVyZ2VkLgorICAgICAgICAgICAgWEVsZW1lbnQgdGFibGVwUHIgPSBudWxsOworCisgICAgICAgICAgICB2YXIgYmxvY2tMZXZlbENvbnRlbnRDb250YWluZXIgPSBwYXJhCisgICAgICAgICAgICAgICAgLkFuY2VzdG9ycygpCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGEgPT4gYS5OYW1lID09IFcuYm9keSB8fAorICAgICAgICAgICAgICAgICAgICBhLk5hbWUgPT0gVy50YmwgfHwKKyAgICAgICAgICAgICAgICAgICAgYS5OYW1lID09IFcudHhieENvbnRlbnQgfHwKKyAgICAgICAgICAgICAgICAgICAgYS5OYW1lID09IFcuZnRyIHx8CisgICAgICAgICAgICAgICAgICAgIGEuTmFtZSA9PSBXLmhkciB8fAorICAgICAgICAgICAgICAgICAgICBhLk5hbWUgPT0gVy5mb290bm90ZSB8fAorICAgICAgICAgICAgICAgICAgICBhLk5hbWUgPT0gVy5lbmRub3RlKTsKKyAgICAgICAgICAgIGlmIChibG9ja0xldmVsQ29udGVudENvbnRhaW5lci5OYW1lID09IFcudGJsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IHRibCA9IGJsb2NrTGV2ZWxDb250ZW50Q29udGFpbmVyOworICAgICAgICAgICAgICAgIFhFbGVtZW50IHN0eWxlID0gdGJsLkVsZW1lbnQoUHRPcGVuWG1sLnB0ICsgInN0eWxlIik7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgY2VsbENuZiA9IHBhcmEuQW5jZXN0b3JzKFcudGMpLlRha2UoMSkuRWxlbWVudHMoVy50Y1ByKS5FbGVtZW50cyhXLmNuZlN0eWxlKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIFhFbGVtZW50IHJvd0NuZiA9IHBhcmEuQW5jZXN0b3JzKFcudHIpLlRha2UoMSkuRWxlbWVudHMoVy50clByKS5FbGVtZW50cyhXLmNuZlN0eWxlKS5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgaWYgKHN0eWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyByb2xsIHVwIHRibFByLCB0clByLCBhbmQgdGNQciBmcm9tIHdpdGhpbiBhIHNwZWNpZmljIHN0eWxlLgorICAgICAgICAgICAgICAgICAgICAvLyBhZGQgZWFjaCBvZiB0aGVzZSB0byB0aGUgdGFibGUsIGluIFBvd2VyVG9vbHMgbmFtZXNwYWNlLgorICAgICAgICAgICAgICAgICAgICB0YWJsZXBQciA9IHN0eWxlLkVsZW1lbnQoVy5wUHIpOworICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVwUHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlcFByID0gbmV3IFhFbGVtZW50KFcucFByKTsKKworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgb3QgaW4gVGFibGVTdHlsZU92ZXJyaWRlVHlwZXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhOYW1lIGF0dE5hbWUgPSBUYWJsZVN0eWxlT3ZlcnJpZGVYTmFtZU1hcFtvdF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNlbGxDbmYgIT0gbnVsbCAmJiBjZWxsQ25mLkF0dHJpYnV0ZShhdHROYW1lKS5Ub0Jvb2xlYW4oKSA9PSB0cnVlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb3dDbmYgIT0gbnVsbCAmJiByb3dDbmYuQXR0cmlidXRlKGF0dE5hbWUpLlRvQm9vbGVhbigpID09IHRydWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG8gPSBzdHlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy50YmxTdHlsZVByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUodHNwID0+IChzdHJpbmcpdHNwLkF0dHJpYnV0ZShXLnR5cGUpID09IG90KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgb3RwUHIgPSBvLkVsZW1lbnQoVy5wUHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXBQciA9IE1lcmdlU3R5bGVFbGVtZW50KG90cFByLCB0YWJsZXBQcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHN0eWxlc1BhcnQgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQ7CisgICAgICAgICAgICBYRG9jdW1lbnQgc1hEb2MgPSBudWxsOworICAgICAgICAgICAgaWYgKHN0eWxlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzWERvYyA9IHN0eWxlc1BhcnQuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIExpc3RJdGVtUmV0cmlldmVyLkxpc3RJdGVtSW5mbyBsaWYgPSBwYXJhLkFubm90YXRpb248TGlzdEl0ZW1SZXRyaWV2ZXIuTGlzdEl0ZW1JbmZvPigpOworCisgICAgICAgICAgICBYRWxlbWVudCByb2xsZWRQYXJhUHJvcHMgPSBQYXJhZ3JhcGhTdHlsZVJvbGx1cChwYXJhLCBzWERvYywgZmFpLkRlZmF1bHRQYXJhZ3JhcGhTdHlsZU5hbWUpOworICAgICAgICAgICAgaWYgKGxpZiAhPSBudWxsICYmIGxpZi5Jc1plcm9OdW1JZCkKKyAgICAgICAgICAgICAgICByb2xsZWRQYXJhUHJvcHMuRWxlbWVudHMoVy5pbmQpLlJlbW92ZSgpOworICAgICAgICAgICAgWEVsZW1lbnQgdG9nZ2xlZFBhcmFQcm9wcyA9IE1lcmdlU3R5bGVFbGVtZW50KHJvbGxlZFBhcmFQcm9wcywgdGFibGVwUHIpOworICAgICAgICAgICAgWEVsZW1lbnQgbWVyZ2VkUGFyYVByb3BzID0gTWVyZ2VTdHlsZUVsZW1lbnQobG9jYWxQYXJhUHJvcHMsIHRvZ2dsZWRQYXJhUHJvcHMpOworCisgICAgICAgICAgICBzdHJpbmcgbGkgPSBMaXN0SXRlbVJldHJpZXZlci5SZXRyaWV2ZUxpc3RJdGVtKHdEb2MsIHBhcmEsIHNldHRpbmdzLkxpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3MpOworICAgICAgICAgICAgaWYgKGxpZiAhPSBudWxsICYmIGxpZi5Jc0xpc3RJdGVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5SZXN0cmljdFRvU3VwcG9ydGVkTnVtYmVyaW5nRm9ybWF0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBudW1GbXRGb3JMZXZlbCA9IChzdHJpbmcpbGlmLkx2bChMaXN0SXRlbVJldHJpZXZlci5HZXRQYXJhZ3JhcGhMZXZlbChwYXJhKSkuRWxlbWVudHMoVy5udW1GbXQpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1GbXRGb3JMZXZlbCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnVtRm10RWxlbWVudCA9IGxpZi5MdmwoTGlzdEl0ZW1SZXRyaWV2ZXIuR2V0UGFyYWdyYXBoTGV2ZWwocGFyYSkpLkVsZW1lbnRzKE1DLkFsdGVybmF0ZUNvbnRlbnQpLkVsZW1lbnRzKE1DLkNob2ljZSkuRWxlbWVudHMoVy5udW1GbXQpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtRm10RWxlbWVudCAhPSBudWxsICYmIChzdHJpbmcpbnVtRm10RWxlbWVudC5BdHRyaWJ1dGUoVy52YWwpID09ICJjdXN0b20iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZtdEZvckxldmVsID0gKHN0cmluZyludW1GbXRFbGVtZW50LkF0dHJpYnV0ZShXLmZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0xnbCA9IGxpZi5MdmwoTGlzdEl0ZW1SZXRyaWV2ZXIuR2V0UGFyYWdyYXBoTGV2ZWwocGFyYSkpLkVsZW1lbnRzKFcuaXNMZ2wpLkFueSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNMZ2wgJiYgbnVtRm10Rm9yTGV2ZWwgIT0gImRlY2ltYWxaZXJvIikKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUZtdEZvckxldmVsID0gImRlY2ltYWwiOworICAgICAgICAgICAgICAgICAgICBpZiAoIUFjY2VwdGFibGVOdW1Gb3JtYXRzLkNvbnRhaW5zKG51bUZtdEZvckxldmVsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE51bWJlcmluZ0Zvcm1hdEV4Y2VwdGlvbihudW1GbXRGb3JMZXZlbCArICIgaXMgbm90IGEgc3VwcG9ydGVkIG51bWJlcmluZyBmb3JtYXQiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgcGFyYWdyYXBoTGV2ZWwgPSBMaXN0SXRlbVJldHJpZXZlci5HZXRQYXJhZ3JhcGhMZXZlbChwYXJhKTsKKyAgICAgICAgICAgICAgICB2YXIgbnVtYmVyaW5nUGFyYVByb3BzID0gbGlmCisgICAgICAgICAgICAgICAgICAgIC5MdmwocGFyYWdyYXBoTGV2ZWwpCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnBQcikKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKG51bWJlcmluZ1BhcmFQcm9wcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVyaW5nUGFyYVByb3BzID0gbmV3IFhFbGVtZW50KFcucFByKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVyaW5nUGFyYVByb3BzCisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gZS5OYW1lICE9IFcuaW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgLlJlbW92ZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGhhdmU6CisgICAgICAgICAgICAgICAgLy8gLSBsb2NhbFBhcmFQcm9wcworICAgICAgICAgICAgICAgIC8vIC0gdG9nZ2xlZFBhcmFQcm9wcworICAgICAgICAgICAgICAgIC8vIC0gbnVtYmVyaW5nUGFyYVByb3BzCisKKyAgICAgICAgICAgICAgICAvLyBpZiBhIHBhcmFncmFwaCBjb250YWlucyBhIG51bVByIHdpdGggYSBudW1JZD0wLCBpbiBvdGhlciB3b3JkcywgaXQgaXMgTk9UIGEgbnVtYmVyZWQgaXRlbSwgdGhlbiB0aGUgaW5kZW50YXRpb24gZnJvbSB0aGUgc3R5bGUKKyAgICAgICAgICAgICAgICAvLyBoaWVyYXJjaHkgaXMgaWdub3JlZC4KKworICAgICAgICAgICAgICAgIExpc3RJdGVtUmV0cmlldmVyLkxpc3RJdGVtSW5mbyBsaWkgPSBwYXJhLkFubm90YXRpb248TGlzdEl0ZW1SZXRyaWV2ZXIuTGlzdEl0ZW1JbmZvPigpOworICAgICAgICAgICAgICAgIGlmIChsaWkuRnJvbVBhcmFncmFwaCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gLSB0b2dnbGVkUGFyYVByb3BzCisgICAgICAgICAgICAgICAgICAgIC8vIC0gbnVtYmVyaW5nUGFyYVByb3BzCisgICAgICAgICAgICAgICAgICAgIC8vIC0gbG9jYWxQYXJhUHJvcHMKKworICAgICAgICAgICAgICAgICAgICBtZXJnZWRQYXJhUHJvcHMgPSBNZXJnZVN0eWxlRWxlbWVudChudW1iZXJpbmdQYXJhUHJvcHMsIHRvZ2dsZWRQYXJhUHJvcHMpOworICAgICAgICAgICAgICAgICAgICBtZXJnZWRQYXJhUHJvcHMgPSBNZXJnZVN0eWxlRWxlbWVudChsb2NhbFBhcmFQcm9wcywgbWVyZ2VkUGFyYVByb3BzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobGlpLkZyb21TdHlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gLSBudW1iZXJpbmdQYXJhUHJvcHMKKyAgICAgICAgICAgICAgICAgICAgLy8gLSB0b2dnbGVkUGFyYVByb3BzCisgICAgICAgICAgICAgICAgICAgIC8vIC0gbG9jYWxQYXJhUHJvcHMKKyAgICAgICAgICAgICAgICAgICAgbWVyZ2VkUGFyYVByb3BzID0gTWVyZ2VTdHlsZUVsZW1lbnQodG9nZ2xlZFBhcmFQcm9wcywgbnVtYmVyaW5nUGFyYVByb3BzKTsKKyAgICAgICAgICAgICAgICAgICAgbWVyZ2VkUGFyYVByb3BzID0gTWVyZ2VTdHlsZUVsZW1lbnQobG9jYWxQYXJhUHJvcHMsIG1lcmdlZFBhcmFQcm9wcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lcmdlZFBhcmFQcm9wcyA9IE1lcmdlU3R5bGVFbGVtZW50KGxvY2FsUGFyYVByb3BzLCB0b2dnbGVkUGFyYVByb3BzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbWVyZ2UgbWVyZ2VkUGFyYVByb3BzIHdpdGggZXhpc3RpbmcgYWNjdW11bGF0ZWRQYXJhUHJvcHMsIHdpdGggbWVyZ2VkUGFyYVByb3BzIGFzIGhpZ2ggcHJpCisgICAgICAgICAgICAvLyByZXBsYWNlIGFjY3VtdWxhdGVkUGFyYVByb3BzIHdpdGggbmV3bHkgbWVyZ2VkCisKKyAgICAgICAgICAgIFhFbGVtZW50IGFjY3VtdWxhdGVkUGFyYVByb3BzID0gcGFyYS5FbGVtZW50KFB0T3BlblhtbC5wdCArICJwUHIiKTsKKyAgICAgICAgICAgIFhFbGVtZW50IG5ld0FjY3VtdWxhdGVkUGFyYVByb3BzID0gTWVyZ2VTdHlsZUVsZW1lbnQobWVyZ2VkUGFyYVByb3BzLCBhY2N1bXVsYXRlZFBhcmFQcm9wcyk7CisKKyAgICAgICAgICAgIEFkanVzdEZvbnRBdHRyaWJ1dGVzKHdEb2MsIHBhcmEsIG5ld0FjY3VtdWxhdGVkUGFyYVByb3BzLCBuZXdBY2N1bXVsYXRlZFBhcmFQcm9wcy5FbGVtZW50KFcuclByKSwgc2V0dGluZ3MpOworICAgICAgICAgICAgbmV3QWNjdW11bGF0ZWRQYXJhUHJvcHMuTmFtZSA9IFB0T3BlblhtbC5wdCArICJwUHIiOworICAgICAgICAgICAgaWYgKGFjY3VtdWxhdGVkUGFyYVByb3BzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRQYXJhUHJvcHMuUmVwbGFjZVdpdGgobmV3QWNjdW11bGF0ZWRQYXJhUHJvcHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcmEuQWRkKG5ld0FjY3VtdWxhdGVkUGFyYVByb3BzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ1tdIEFjY2VwdGFibGVOdW1Gb3JtYXRzID0gbmV3W10geworICAgICAgICAgICAgImRlY2ltYWwiLAorICAgICAgICAgICAgImRlY2ltYWxaZXJvIiwKKyAgICAgICAgICAgICJ1cHBlclJvbWFuIiwKKyAgICAgICAgICAgICJsb3dlclJvbWFuIiwKKyAgICAgICAgICAgICJ1cHBlckxldHRlciIsCisgICAgICAgICAgICAibG93ZXJMZXR0ZXIiLAorICAgICAgICAgICAgIm9yZGluYWwiLAorICAgICAgICAgICAgImNhcmRpbmFsVGV4dCIsCisgICAgICAgICAgICAib3JkaW5hbFRleHQiLAorICAgICAgICAgICAgImJ1bGxldCIsCisgICAgICAgICAgICAiMDAwMSwgMDAwMiwgMDAwMywgLi4uIiwKKyAgICAgICAgICAgICJub25lIiwKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IFBhcmFncmFwaFN0eWxlUm9sbHVwKFhFbGVtZW50IHBhcmFncmFwaCwgWERvY3VtZW50IHN0eWxlc1hEb2MsIHN0cmluZyBkZWZhdWx0UGFyYWdyYXBoU3R5bGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyYVN0eWxlID0gKHN0cmluZylwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5wUHIpCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucFN0eWxlKQorICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKFcudmFsKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKHBhcmFTdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHBhcmFTdHlsZSA9IGRlZmF1bHRQYXJhZ3JhcGhTdHlsZU5hbWU7CisgICAgICAgICAgICB2YXIgcm9sbGVkVXBQYXJhU3R5bGVQYXJhUHJvcHMgPSBuZXcgWEVsZW1lbnQoVy5wUHIpOworICAgICAgICAgICAgaWYgKHN0eWxlc1hEb2MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcm9sbGVkVXBQYXJhU3R5bGVQYXJhUHJvcHM7CisgICAgICAgICAgICBpZiAocGFyYVN0eWxlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm9sbGVkVXBQYXJhU3R5bGVQYXJhUHJvcHMgPSBQYXJhU3R5bGVQYXJhUHJvcHNTdGFjayhzdHlsZXNYRG9jLCBwYXJhU3R5bGUsIHBhcmFncmFwaCkKKyAgICAgICAgICAgICAgICAgICAgLlJldmVyc2UoKQorICAgICAgICAgICAgICAgICAgICAuQWdncmVnYXRlKG5ldyBYRWxlbWVudChXLnBQciksCisgICAgICAgICAgICAgICAgICAgICAgICAociwgcykgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UGFyYVByb3BzID0gTWVyZ2VTdHlsZUVsZW1lbnQocywgcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1BhcmFQcm9wczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJvbGxlZFVwUGFyYVN0eWxlUGFyYVByb3BzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSUVudW1lcmFibGU8WEVsZW1lbnQ+IFBhcmFTdHlsZVBhcmFQcm9wc1N0YWNrKFhEb2N1bWVudCBzdHlsZXNYRG9jLCBzdHJpbmcgcGFyYVN0eWxlTmFtZSwgWEVsZW1lbnQgcGFyYSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0eWxlc1hEb2MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB5aWVsZCBicmVhazsKKyAgICAgICAgICAgIHZhciBsb2NhbFBhcmFTdHlsZU5hbWUgPSBwYXJhU3R5bGVOYW1lOworICAgICAgICAgICAgd2hpbGUgKGxvY2FsUGFyYVN0eWxlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IHBhcmFTdHlsZSA9IHN0eWxlc1hEb2MuUm9vdC5FbGVtZW50cyhXLnN0eWxlKS5GaXJzdE9yRGVmYXVsdChzID0+CisgICAgICAgICAgICAgICAgICAgIHMuQXR0cmlidXRlKFcudHlwZSkuVmFsdWUgPT0gInBhcmFncmFwaCIgJiYKKyAgICAgICAgICAgICAgICAgICAgcy5BdHRyaWJ1dGUoVy5zdHlsZUlkKS5WYWx1ZSA9PSBsb2NhbFBhcmFTdHlsZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChwYXJhU3R5bGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGFyYVN0eWxlLkVsZW1lbnQoVy5wUHIpID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYVN0eWxlLkVsZW1lbnQoVy5yUHIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50VG9ZaWVsZDIgPSBuZXcgWEVsZW1lbnQoVy5wUHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYVN0eWxlLkVsZW1lbnQoVy5yUHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBlbGVtZW50VG9ZaWVsZDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbG9jYWxQYXJhU3R5bGVOYW1lID0gKHN0cmluZykocGFyYVN0eWxlCisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5iYXNlZE9uKQorICAgICAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy52YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBlbGVtZW50VG9ZaWVsZCA9IG5ldyBYRWxlbWVudChXLnBQciwKKyAgICAgICAgICAgICAgICAgICAgcGFyYVN0eWxlLkVsZW1lbnQoVy5wUHIpLkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgcGFyYVN0eWxlLkVsZW1lbnQoVy5wUHIpLkVsZW1lbnRzKCksCisgICAgICAgICAgICAgICAgICAgIHBhcmFTdHlsZS5FbGVtZW50KFcuclByKSk7CisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIChlbGVtZW50VG9ZaWVsZCk7CisKKyAgICAgICAgICAgICAgICB2YXIgbGlzdEl0ZW1JbmZvID0gcGFyYS5Bbm5vdGF0aW9uPExpc3RJdGVtUmV0cmlldmVyLkxpc3RJdGVtSW5mbz4oKTsKKyAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW1JbmZvICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW1JbmZvLklzTGlzdEl0ZW0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGxpcFByID0gbGlzdEl0ZW1JbmZvLkx2bChMaXN0SXRlbVJldHJpZXZlci5HZXRQYXJhZ3JhcGhMZXZlbChwYXJhKSkuRWxlbWVudChXLnBQcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlwUHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXBQciA9IG5ldyBYRWxlbWVudChXLnBQcik7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBsaXJQciA9IGxpc3RJdGVtSW5mby5MdmwoTGlzdEl0ZW1SZXRyaWV2ZXIuR2V0UGFyYWdyYXBoTGV2ZWwocGFyYSkpLkVsZW1lbnQoVy5yUHIpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRUb1lpZWxkMiA9IG5ldyBYRWxlbWVudChXLnBQciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXBQci5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlwUHIuRWxlbWVudHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXJQcik7CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gKGVsZW1lbnRUb1lpZWxkMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsb2NhbFBhcmFTdHlsZU5hbWUgPSAoc3RyaW5nKXBhcmFTdHlsZQorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5iYXNlZE9uKQorICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLnZhbCkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5aWVsZCBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQW5ub3RhdGVSdW5zKEZvcm1hdHRpbmdBc3NlbWJsZXJJbmZvIGZhaSwgV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jLCBYRWxlbWVudCByb290LCBGb3JtYXR0aW5nQXNzZW1ibGVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBydW5zT3JQYXJhcyA9IHJvb3QuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgIC5XaGVyZShycCA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJwLk5hbWUgPT0gVy5yIHx8IHJwLk5hbWUgPT0gVy5wOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJ1bk9yUGFyYSBpbiBydW5zT3JQYXJhcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBbm5vdGF0ZVJ1blByb3BlcnRpZXMoZmFpLCB3RG9jLCBydW5PclBhcmEsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQW5ub3RhdGVSdW5Qcm9wZXJ0aWVzKEZvcm1hdHRpbmdBc3NlbWJsZXJJbmZvIGZhaSwgV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jLCBYRWxlbWVudCBydW5PclBhcmEsIEZvcm1hdHRpbmdBc3NlbWJsZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgbG9jYWxSdW5Qcm9wcyA9IG51bGw7CisgICAgICAgICAgICBpZiAocnVuT3JQYXJhLk5hbWUgPT0gVy5wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByUHIgPSBydW5PclBhcmEuRWxlbWVudHMoVy5wUHIpLkVsZW1lbnRzKFcuclByKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmIChyUHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsUnVuUHJvcHMgPSByUHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsUnVuUHJvcHMgPSBydW5PclBhcmEuRWxlbWVudChXLnJQcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9jYWxSdW5Qcm9wcyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsUnVuUHJvcHMgPSBuZXcgWEVsZW1lbnQoVy5yUHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBnZXQgcnVuIHRhYmxlIHByb3BzLCB0byBiZSBtZXJnZWQuCisgICAgICAgICAgICBYRWxlbWVudCB0YWJsZXJQciA9IG51bGw7CisgICAgICAgICAgICB2YXIgYmxvY2tMZXZlbENvbnRlbnRDb250YWluZXIgPSBydW5PclBhcmEKKyAgICAgICAgICAgICAgICAuQW5jZXN0b3JzKCkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoYSA9PiBhLk5hbWUgPT0gVy5ib2R5IHx8CisgICAgICAgICAgICAgICAgICAgIGEuTmFtZSA9PSBXLnRibCB8fAorICAgICAgICAgICAgICAgICAgICBhLk5hbWUgPT0gVy50eGJ4Q29udGVudCB8fAorICAgICAgICAgICAgICAgICAgICBhLk5hbWUgPT0gVy5mdHIgfHwKKyAgICAgICAgICAgICAgICAgICAgYS5OYW1lID09IFcuaGRyIHx8CisgICAgICAgICAgICAgICAgICAgIGEuTmFtZSA9PSBXLmZvb3Rub3RlIHx8CisgICAgICAgICAgICAgICAgICAgIGEuTmFtZSA9PSBXLmVuZG5vdGUpOworICAgICAgICAgICAgaWYgKGJsb2NrTGV2ZWxDb250ZW50Q29udGFpbmVyLk5hbWUgPT0gVy50YmwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgdGJsID0gYmxvY2tMZXZlbENvbnRlbnRDb250YWluZXI7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgc3R5bGUgPSB0YmwuRWxlbWVudChQdE9wZW5YbWwucHQgKyAic3R5bGUiKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBjZWxsQ25mID0gcnVuT3JQYXJhLkFuY2VzdG9ycyhXLnRjKS5UYWtlKDEpLkVsZW1lbnRzKFcudGNQcikuRWxlbWVudHMoVy5jbmZTdHlsZSkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCByb3dDbmYgPSBydW5PclBhcmEuQW5jZXN0b3JzKFcudHIpLlRha2UoMSkuRWxlbWVudHMoVy50clByKS5FbGVtZW50cyhXLmNuZlN0eWxlKS5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgaWYgKHN0eWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0YWJsZXJQciA9IHN0eWxlLkVsZW1lbnQoVy5yUHIpOworICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVyUHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlclByID0gbmV3IFhFbGVtZW50KFcuclByKTsKKworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgb3QgaW4gVGFibGVTdHlsZU92ZXJyaWRlVHlwZXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhOYW1lIGF0dE5hbWUgPSBUYWJsZVN0eWxlT3ZlcnJpZGVYTmFtZU1hcFtvdF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNlbGxDbmYgIT0gbnVsbCAmJiBjZWxsQ25mLkF0dHJpYnV0ZShhdHROYW1lKS5Ub0Jvb2xlYW4oKSA9PSB0cnVlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb3dDbmYgIT0gbnVsbCAmJiByb3dDbmYuQXR0cmlidXRlKGF0dE5hbWUpLlRvQm9vbGVhbigpID09IHRydWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG8gPSBzdHlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy50YmxTdHlsZVByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUodHNwID0+IChzdHJpbmcpdHNwLkF0dHJpYnV0ZShXLnR5cGUpID09IG90KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgb3RyUHIgPSBvLkVsZW1lbnQoVy5yUHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXJQciA9IE1lcmdlU3R5bGVFbGVtZW50KG90clByLCB0YWJsZXJQcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgWEVsZW1lbnQgcm9sbGVkUnVuUHJvcHMgPSBDaGFyU3R5bGVSb2xsdXAoZmFpLCB3RG9jLCBydW5PclBhcmEpOworICAgICAgICAgICAgdmFyIHRvZ2dsZWRSdW5Qcm9wcyA9IFRvZ2dsZU1lcmdlUnVuUHJvcHMocm9sbGVkUnVuUHJvcHMsIHRhYmxlclByKTsKKyAgICAgICAgICAgIHZhciBjdXJyZW50UnVuUHJvcHMgPSBydW5PclBhcmEuRWxlbWVudChQdE9wZW5YbWwuclByKTsgLy8gdGhpcyBpcyBhbHJlYWR5IHN0b3JlZCBvbiB0aGUgcnVuIGZyb20gcHJldmlvdXMgYWdncmVnYXRpb24gb2YgcHJvcHMKKyAgICAgICAgICAgIHZhciBtZXJnZWRSdW5Qcm9wcyA9IE1lcmdlU3R5bGVFbGVtZW50KHRvZ2dsZWRSdW5Qcm9wcywgY3VycmVudFJ1blByb3BzKTsKKyAgICAgICAgICAgIHZhciBuZXdNZXJnZWRSdW5Qcm9wcyA9IE1lcmdlU3R5bGVFbGVtZW50KGxvY2FsUnVuUHJvcHMsIG1lcmdlZFJ1blByb3BzKTsKKyAgICAgICAgICAgIFhFbGVtZW50IHBQciA9IG51bGw7CisgICAgICAgICAgICBpZiAocnVuT3JQYXJhLk5hbWUgPT0gVy5wKQorICAgICAgICAgICAgICAgIHBQciA9IHJ1bk9yUGFyYS5FbGVtZW50KFB0T3BlblhtbC5wUHIpOworICAgICAgICAgICAgQWRqdXN0Rm9udEF0dHJpYnV0ZXMod0RvYywgcnVuT3JQYXJhLCBwUHIsIG5ld01lcmdlZFJ1blByb3BzLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgIG5ld01lcmdlZFJ1blByb3BzLk5hbWUgPSBQdE9wZW5YbWwuclByOworICAgICAgICAgICAgaWYgKGN1cnJlbnRSdW5Qcm9wcyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJlbnRSdW5Qcm9wcy5SZXBsYWNlV2l0aChuZXdNZXJnZWRSdW5Qcm9wcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcnVuT3JQYXJhLkFkZChuZXdNZXJnZWRSdW5Qcm9wcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBDaGFyU3R5bGVSb2xsdXAoRm9ybWF0dGluZ0Fzc2VtYmxlckluZm8gZmFpLCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIFhFbGVtZW50IHJ1bk9yUGFyYSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNYRG9jID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICBzdHJpbmcgY2hhclN0eWxlID0gbnVsbDsKKyAgICAgICAgICAgIHN0cmluZyBwYXJhU3R5bGUgPSBudWxsOworICAgICAgICAgICAgWEVsZW1lbnQgclByID0gbnVsbDsKKyAgICAgICAgICAgIFhFbGVtZW50IHBQciA9IG51bGw7CisgICAgICAgICAgICBYRWxlbWVudCBwU3R5bGUgPSBudWxsOworICAgICAgICAgICAgWEVsZW1lbnQgclN0eWxlID0gbnVsbDsKKyAgICAgICAgICAgIENhY2hlZFBhcmFJbmZvIGNwaSA9IG51bGw7IC8vIENhY2hlZFBhcmFJbmZvIGlzIGFuIG9wdGltaXphdGlvbiBmb3IgdGhlIGNhc2Ugd2hlcmUgYSBwYXJhZ3JhcGggY29udGFpbnMgdGhvdXNhbmRzIG9mIHJ1bnMuCisKKyAgICAgICAgICAgIGlmIChydW5PclBhcmEuTmFtZSA9PSBXLnApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3BpID0gcnVuT3JQYXJhLkFubm90YXRpb248Q2FjaGVkUGFyYUluZm8+KCk7CisgICAgICAgICAgICAgICAgaWYgKGNwaSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBwUHIgPSBjcGkuUGFyYWdyYXBoUHJvcGVydGllczsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwUHIgPSBydW5PclBhcmEuRWxlbWVudChXLnBQcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwUHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYVN0eWxlID0gKHN0cmluZylwUHIuRWxlbWVudHMoVy5wU3R5bGUpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhU3R5bGUgPSBmYWkuRGVmYXVsdFBhcmFncmFwaFN0eWxlTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjcGkgPSBuZXcgQ2FjaGVkUGFyYUluZm8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUGFyYWdyYXBoUHJvcGVydGllcyA9IHBQciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFncmFwaFN0eWxlTmFtZSA9IHBhcmFTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgcnVuT3JQYXJhLkFkZEFubm90YXRpb24oY3BpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBQciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgclByID0gcFByLkVsZW1lbnQoVy5yUHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByUHIgPSBydW5PclBhcmEuRWxlbWVudChXLnJQcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoclByICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgclN0eWxlID0gclByLkVsZW1lbnQoVy5yU3R5bGUpOworICAgICAgICAgICAgICAgIGlmIChyU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYXJTdHlsZSA9IChzdHJpbmcpclN0eWxlLkF0dHJpYnV0ZShXLnZhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChydW5PclBhcmEuTmFtZSA9PSBXLnIpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyU3R5bGUgPSAoc3RyaW5nKXJ1bk9yUGFyYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BbmNlc3RvcnMoVy5wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UYWtlKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucFByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnBTdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY2hhclN0eWxlID0gKHN0cmluZylydW5PclBhcmEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5wUHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucFN0eWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKFcudmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNoYXJTdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChydW5PclBhcmEuTmFtZSA9PSBXLnIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYW5jZXN0b3JQYXJhID0gcnVuT3JQYXJhLkFuY2VzdG9ycyhXLnApLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgIGNwaSA9IGFuY2VzdG9yUGFyYS5Bbm5vdGF0aW9uPENhY2hlZFBhcmFJbmZvPigpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3BpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyU3R5bGUgPSBjcGkuUGFyYWdyYXBoU3R5bGVOYW1lOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyU3R5bGUgPSAoc3RyaW5nKXJ1bk9yUGFyYS5BbmNlc3RvcnMoVy5wKS5GaXJzdCgpLkVsZW1lbnRzKFcucFByKS5FbGVtZW50cyhXLnBTdHlsZSkuQXR0cmlidXRlcyhXLnZhbCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNoYXJTdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhclN0eWxlID0gZmFpLkRlZmF1bHRQYXJhZ3JhcGhTdHlsZU5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBIHJ1biBhbHdheXMgbXVzdCBoYXZlIGFuIGFuY2VzdG9yIHBhcmFncmFwaC4KKyAgICAgICAgICAgIFhFbGVtZW50IHBhcmEgPSBudWxsOworICAgICAgICAgICAgdmFyIHJvbGxlZFVwUGFyYVN0eWxlUnVuUHJvcHMgPSBuZXcgWEVsZW1lbnQoVy5yUHIpOworICAgICAgICAgICAgaWYgKHJ1bk9yUGFyYS5OYW1lID09IFcucikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXJhID0gcnVuT3JQYXJhLkFuY2VzdG9ycyhXLnApLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyYSA9IHJ1bk9yUGFyYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3BpID0gcGFyYS5Bbm5vdGF0aW9uPENhY2hlZFBhcmFJbmZvPigpOworICAgICAgICAgICAgaWYgKGNwaSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQciA9IGNwaS5QYXJhZ3JhcGhQcm9wZXJ0aWVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQciA9IHBhcmEuRWxlbWVudChXLnBQcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocFByICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFN0eWxlID0gcFByLkVsZW1lbnQoVy5wU3R5bGUpOworICAgICAgICAgICAgICAgIGlmIChwU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFTdHlsZSA9IChzdHJpbmcpcFN0eWxlLkF0dHJpYnV0ZShXLnZhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFTdHlsZSA9IGZhaS5EZWZhdWx0UGFyYWdyYXBoU3R5bGVOYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwYXJhU3R5bGUgPSBmYWkuRGVmYXVsdFBhcmFncmFwaFN0eWxlTmFtZTsKKworICAgICAgICAgICAgc3RyaW5nIGtleSA9IChwYXJhU3R5bGUgPT0gbnVsbCA/ICJbbnVsbF0iIDogcGFyYVN0eWxlKSArICJ+fH4iICsKKyAgICAgICAgICAgICAgICAoY2hhclN0eWxlID09IG51bGwgPyAiW251bGxdIiA6IGNoYXJTdHlsZSk7CisgICAgICAgICAgICBYRWxlbWVudCByb2xsZWRSdW5Qcm9wcyA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChmYWkuUm9sbGVkQ2hhcmFjdGVyU3R5bGVzLkNvbnRhaW5zS2V5KGtleSkpCisgICAgICAgICAgICAgICAgcm9sbGVkUnVuUHJvcHMgPSBmYWkuUm9sbGVkQ2hhcmFjdGVyU3R5bGVzW2tleV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgcm9sbGVkVXBDaGFyU3R5bGVSdW5Qcm9wcyA9IG5ldyBYRWxlbWVudChXLnJQcik7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJTdHlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcm9sbGVkVXBDaGFyU3R5bGVSdW5Qcm9wcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU3R5bGVTdGFjayh3RG9jLCBjaGFyU3R5bGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFnZ3JlZ2F0ZShuZXcgWEVsZW1lbnQoVy5yUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAociwgcykgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1J1blByb3BzID0gTWVyZ2VTdHlsZUVsZW1lbnQocywgcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3UnVuUHJvcHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwYXJhU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJvbGxlZFVwUGFyYVN0eWxlUnVuUHJvcHMgPSBQYXJhU3R5bGVSdW5Qcm9wc1N0YWNrKHdEb2MsIHBhcmFTdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5BZ2dyZWdhdGUobmV3IFhFbGVtZW50KFcuclByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAociwgcykgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDaGFyU3R5bGVSdW5Qcm9wcyA9IE1lcmdlU3R5bGVFbGVtZW50KHMsIHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q2hhclN0eWxlUnVuUHJvcHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJvbGxlZFJ1blByb3BzID0gTWVyZ2VTdHlsZUVsZW1lbnQocm9sbGVkVXBDaGFyU3R5bGVSdW5Qcm9wcywgcm9sbGVkVXBQYXJhU3R5bGVSdW5Qcm9wcyk7CisgICAgICAgICAgICAgICAgZmFpLlJvbGxlZENoYXJhY3RlclN0eWxlcy5BZGQoa2V5LCByb2xsZWRSdW5Qcm9wcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByb2xsZWRSdW5Qcm9wczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIElFbnVtZXJhYmxlPFhFbGVtZW50PiBQYXJhU3R5bGVSdW5Qcm9wc1N0YWNrKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYywgc3RyaW5nIHBhcmFTdHlsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsb2NhbFBhcmFTdHlsZU5hbWUgPSBwYXJhU3R5bGVOYW1lOworICAgICAgICAgICAgdmFyIHNYRG9jID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgdmFyIHJWYWx1ZSA9IG5ldyBTdGFjazxYRWxlbWVudD4oKTsKKyAgICAgICAgICAgIHdoaWxlIChsb2NhbFBhcmFTdHlsZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcGFyYVN0eWxlID0gc1hEb2MuUm9vdC5FbGVtZW50cyhXLnN0eWxlKS5GaXJzdE9yRGVmYXVsdChzID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHN0cmluZylzLkF0dHJpYnV0ZShXLnR5cGUpID09ICJwYXJhZ3JhcGgiICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nKXMuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gbG9jYWxQYXJhU3R5bGVOYW1lOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGlmIChwYXJhU3R5bGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByVmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwYXJhU3R5bGUuRWxlbWVudChXLnJQcikgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJWYWx1ZS5QdXNoKHBhcmFTdHlsZS5FbGVtZW50KFcuclByKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvY2FsUGFyYVN0eWxlTmFtZSA9IChzdHJpbmcpcGFyYVN0eWxlCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmJhc2VkT24pCisgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKFcudmFsKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm5zIGNvbGxlY3Rpb24gb2YgcnVuIHByb3BlcnRpZXMKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSUVudW1lcmFibGU8WEVsZW1lbnQ+IENoYXJTdHlsZVN0YWNrKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYywgc3RyaW5nIGNoYXJTdHlsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsb2NhbENoYXJTdHlsZU5hbWUgPSBjaGFyU3R5bGVOYW1lOworICAgICAgICAgICAgdmFyIHNYRG9jID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgdmFyIHJWYWx1ZSA9IG5ldyBTdGFjazxYRWxlbWVudD4oKTsKKyAgICAgICAgICAgIHdoaWxlIChsb2NhbENoYXJTdHlsZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBiYXNlZE9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICAvLyBmaXJzdCBsb29rIGZvciBjaGFyYWN0ZXIgc3R5bGUKKyAgICAgICAgICAgICAgICB2YXIgY2hhclN0eWxlID0gc1hEb2MuUm9vdC5FbGVtZW50cyhXLnN0eWxlKS5GaXJzdE9yRGVmYXVsdChzID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHN0cmluZylzLkF0dHJpYnV0ZShXLnR5cGUpID09ICJjaGFyYWN0ZXIiICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nKXMuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gbG9jYWxDaGFyU3R5bGVOYW1lOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgbG9vayBmb3IgcGFyYWdyYXBoIHN0eWxlCisgICAgICAgICAgICAgICAgaWYgKGNoYXJTdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhclN0eWxlID0gc1hEb2MuUm9vdC5FbGVtZW50cyhXLnN0eWxlKS5GaXJzdE9yRGVmYXVsdChzID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc3RyaW5nKXMuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gbG9jYWxDaGFyU3R5bGVOYW1lOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNoYXJTdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJWYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNoYXJTdHlsZS5FbGVtZW50KFcuclByKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmFzZWRPbiA9IGNoYXJTdHlsZS5FbGVtZW50KFcuYmFzZWRPbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlZE9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsQ2hhclN0eWxlTmFtZSA9IChzdHJpbmcpYmFzZWRPbi5BdHRyaWJ1dGUoVy52YWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByVmFsdWUuUHVzaChjaGFyU3R5bGUuRWxlbWVudChXLnJQcikpOworICAgICAgICAgICAgICAgIGxvY2FsQ2hhclN0eWxlTmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgYmFzZWRPbiA9IGNoYXJTdHlsZS5FbGVtZW50KFcuYmFzZWRPbik7CisgICAgICAgICAgICAgICAgaWYgKGJhc2VkT24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsQ2hhclN0eWxlTmFtZSA9IChzdHJpbmcpYmFzZWRPbi5BdHRyaWJ1dGUoVy52YWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBUb2dnbGVNZXJnZVJ1blByb3BzKFhFbGVtZW50IGhpZ2hlclByaW9yaXR5RWxlbWVudCwgWEVsZW1lbnQgbG93ZXJQcmlvcml0eUVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsb3dlclByaW9yaXR5RWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBoaWdoZXJQcmlvcml0eUVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoaGlnaGVyUHJpb3JpdHlFbGVtZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGxvd2VyUHJpb3JpdHlFbGVtZW50OworCisgICAgICAgICAgICB2YXIgaHBlID0gaGlnaGVyUHJpb3JpdHlFbGVtZW50LkVsZW1lbnRzKCkuU2VsZWN0KGUgPT4gZS5OYW1lKS5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIHZhciBuZXdNZXJnZWRFbGVtZW50ID0gbmV3IFhFbGVtZW50KGhpZ2hlclByaW9yaXR5RWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgIGhpZ2hlclByaW9yaXR5RWxlbWVudC5BdHRyaWJ1dGVzKCksCisKKyAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIHRvZ2dsZSBwcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgaGlnaGVyUHJpb3JpdHlFbGVtZW50LkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4geyByZXR1cm4gZS5OYW1lICE9IFcuckZvbnRzOyB9KQorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGhpZ2hlckNoaWxkRWxlbWVudCA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVG9nZ2xlUHJvcGVydHlOYW1lcy5Db250YWlucyhoaWdoZXJDaGlsZEVsZW1lbnQuTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvd2VyQ2hpbGRFbGVtZW50ID0gbG93ZXJQcmlvcml0eUVsZW1lbnQuRWxlbWVudChoaWdoZXJDaGlsZEVsZW1lbnQuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvd2VyQ2hpbGRFbGVtZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGlnaGVyQ2hpbGRFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiSGlnaGVyID0gaGlnaGVyQ2hpbGRFbGVtZW50LkF0dHJpYnV0ZShXLnZhbCkgPT0gbnVsbCB8fCBoaWdoZXJDaGlsZEVsZW1lbnQuQXR0cmlidXRlKFcudmFsKS5Ub0Jvb2xlYW4oKSA9PSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJMb3dlciA9IGxvd2VyQ2hpbGRFbGVtZW50LkF0dHJpYnV0ZShXLnZhbCkgPT0gbnVsbCB8fCBsb3dlckNoaWxkRWxlbWVudC5BdHRyaWJ1dGUoVy52YWwpLlRvQm9vbGVhbigpID09IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBoaWdoZXIgaXMgdHJ1ZSBhbmQgbG93ZXIgaXMgZmFsc2UsIHRoZW4gcmV0dXJuIHRydWUgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiSGlnaGVyICYmICFiTG93ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGlnaGVyQ2hpbGRFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGhpZ2hlciBpcyBmYWxzZSBhbmQgbG93ZXIgaXMgdHJ1ZSwgdGhlbiByZXR1cm4gZmFsc2UgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYkhpZ2hlciAmJiBiTG93ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGlnaGVyQ2hpbGRFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGhpZ2hlciBhbmQgbG93ZXIgYXJlIGJvdGggdHJ1ZSwgdGhlbiByZXR1cm4gZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkhpZ2hlciAmJiBiTG93ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGhpZ2hlckNoaWxkRWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICIwIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgYm90aCBoaWdoZXIgYW5kIGxvd2VyIGFyZSBmYWxzZSBzbyBjYW4gcmV0dXJuIGhpZ2hlciBlbGVtZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoaWdoZXJDaGlsZEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGlnaGVyQ2hpbGRFbGVtZW50OworICAgICAgICAgICAgICAgICAgICB9KSwKKworICAgICAgICAgICAgICAgICAgICBGb250TWVyZ2UoaGlnaGVyUHJpb3JpdHlFbGVtZW50LkVsZW1lbnQoVy5yRm9udHMpLCBsb3dlclByaW9yaXR5RWxlbWVudC5FbGVtZW50KFcuckZvbnRzKSksCisKKyAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBsb3dlciBwcmlvcml0eSBlbGVtZW50cyB3aGVyZSB0aGVyZSBpcyBub3QgYSBoaWdoZXIgcHJpb3JpdHkgZWxlbWVudCBvZiBzYW1lIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgbG93ZXJQcmlvcml0eUVsZW1lbnQuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5OYW1lICE9IFcuckZvbnRzICYmICFocGUuQ29udGFpbnMoZS5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ld01lcmdlZEVsZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYTmFtZVtdIFRvZ2dsZVByb3BlcnR5TmFtZXMgPSBuZXdbXSB7CisgICAgICAgICAgICBXLmIsCisgICAgICAgICAgICBXLmJDcywKKyAgICAgICAgICAgIFcuY2FwcywKKyAgICAgICAgICAgIFcuZW1ib3NzLAorICAgICAgICAgICAgVy5pLAorICAgICAgICAgICAgVy5pQ3MsCisgICAgICAgICAgICBXLmltcHJpbnQsCisgICAgICAgICAgICBXLm91dGxpbmUsCisgICAgICAgICAgICBXLnNoYWRvdywKKyAgICAgICAgICAgIFcuc21hbGxDYXBzLAorICAgICAgICAgICAgVy5zdHJpa2UsCisgICAgICAgICAgICBXLnZhbmlzaAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhOYW1lW10gUHJvcGVydHlOYW1lcyA9IG5ld1tdIHsKKyAgICAgICAgICAgIFcuY3MsCisgICAgICAgICAgICBXLnJ0bCwKKyAgICAgICAgICAgIFcudSwKKyAgICAgICAgICAgIFcuY29sb3IsCisgICAgICAgICAgICBXLmhpZ2hsaWdodCwKKyAgICAgICAgICAgIFcuc2hkCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGNsYXNzIENoYXJTdHlsZUF0dHJpYnV0ZXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHN0cmluZyBBc2NpaUZvbnQ7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIEhBbnNpRm9udDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRWFzdEFzaWFGb250OworICAgICAgICAgICAgcHVibGljIHN0cmluZyBDc0ZvbnQ7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIEhpbnQ7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBSdGw7CisKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgTGF0aW5MYW5nOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBCaWRpTGFuZzsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRWFzdEFzaWFMYW5nOworCisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxYTmFtZSwgYm9vbD8+IFRvZ2dsZVByb3BlcnRpZXM7CisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxYTmFtZSwgWEVsZW1lbnQ+IFByb3BlcnRpZXM7CisKKyAgICAgICAgICAgIHB1YmxpYyBDaGFyU3R5bGVBdHRyaWJ1dGVzKFhFbGVtZW50IHBQciwgWEVsZW1lbnQgclByKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRvZ2dsZVByb3BlcnRpZXMgPSBuZXcgRGljdGlvbmFyeTxYTmFtZSwgYm9vbD8+KCk7CisgICAgICAgICAgICAgICAgUHJvcGVydGllcyA9IG5ldyBEaWN0aW9uYXJ5PFhOYW1lLCBYRWxlbWVudD4oKTsKKworICAgICAgICAgICAgICAgIGlmIChyUHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhOYW1lIHhuIGluIFRvZ2dsZVByb3BlcnR5TmFtZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUb2dnbGVQcm9wZXJ0aWVzW3huXSA9IEdldEJvb2xQcm9wZXJ0eShyUHIsIHhuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoWE5hbWUgeG4gaW4gUHJvcGVydHlOYW1lcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXNbeG5dID0gR2V0WG1sUHJvcGVydHkoclByLCB4bik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciByRm9udHMgPSByUHIuRWxlbWVudChXLnJGb250cyk7CisgICAgICAgICAgICAgICAgaWYgKHJGb250cyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5Bc2NpaUZvbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0aGlzLkhBbnNpRm9udCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuRWFzdEFzaWFGb250ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5Dc0ZvbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0aGlzLkhpbnQgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aGlzLkFzY2lpRm9udCA9IChzdHJpbmcpKHJGb250cy5BdHRyaWJ1dGUoVy5hc2NpaSkpOworICAgICAgICAgICAgICAgICAgICB0aGlzLkhBbnNpRm9udCA9IChzdHJpbmcpKHJGb250cy5BdHRyaWJ1dGUoVy5oQW5zaSkpOworICAgICAgICAgICAgICAgICAgICB0aGlzLkVhc3RBc2lhRm9udCA9IChzdHJpbmcpKHJGb250cy5BdHRyaWJ1dGUoVy5lYXN0QXNpYSkpOworICAgICAgICAgICAgICAgICAgICB0aGlzLkNzRm9udCA9IChzdHJpbmcpKHJGb250cy5BdHRyaWJ1dGUoVy5jcykpOworICAgICAgICAgICAgICAgICAgICB0aGlzLkhpbnQgPSAoc3RyaW5nKShyRm9udHMuQXR0cmlidXRlKFcuaGludCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBYRWxlbWVudCBjc2VsID0gdGhpcy5Qcm9wZXJ0aWVzW1cuY3NdOworICAgICAgICAgICAgICAgIGJvb2wgY3MgPSBjc2VsICE9IG51bGwgJiYgKGNzZWwuQXR0cmlidXRlKFcudmFsKSA9PSBudWxsIHx8IGNzZWwuQXR0cmlidXRlKFcudmFsKS5Ub0Jvb2xlYW4oKSA9PSB0cnVlKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBydGxlbCA9IHRoaXMuUHJvcGVydGllc1tXLnJ0bF07CisgICAgICAgICAgICAgICAgYm9vbCBydGwgPSBydGxlbCAhPSBudWxsICYmIChydGxlbC5BdHRyaWJ1dGUoVy52YWwpID09IG51bGwgfHwgcnRsZWwuQXR0cmlidXRlKFcudmFsKS5Ub0Jvb2xlYW4oKSA9PSB0cnVlKTsKKyAgICAgICAgICAgICAgICB2YXIgYmlkaSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChwUHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGJpZGllbCA9IHBQci5FbGVtZW50KFcuYmlkaSk7CisgICAgICAgICAgICAgICAgICAgIGJpZGkgPSBiaWRpZWwgIT0gbnVsbCAmJiAoYmlkaWVsLkF0dHJpYnV0ZShXLnZhbCkgPT0gbnVsbCB8fCBiaWRpZWwuQXR0cmlidXRlKFcudmFsKS5Ub0Jvb2xlYW4oKSA9PSB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUnRsID0gY3MgfHwgcnRsIHx8IGJpZGk7CisgICAgICAgICAgICAgICAgdmFyIGxhbmcgPSByUHIuRWxlbWVudChXLmxhbmcpOworICAgICAgICAgICAgICAgIGlmIChsYW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMYXRpbkxhbmcgPSAoc3RyaW5nKWxhbmcuQXR0cmlidXRlKFcudmFsKTsKKyAgICAgICAgICAgICAgICAgICAgQmlkaUxhbmcgPSAoc3RyaW5nKWxhbmcuQXR0cmlidXRlKFcuYmlkaSk7CisgICAgICAgICAgICAgICAgICAgIEVhc3RBc2lhTGFuZyA9IChzdHJpbmcpbGFuZy5BdHRyaWJ1dGUoVy5lYXN0QXNpYSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sPyBHZXRCb29sUHJvcGVydHkoWEVsZW1lbnQgclByLCBYTmFtZSBwcm9wZXJ0eU5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJQci5FbGVtZW50KHByb3BlcnR5TmFtZSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgdmFyIHMgPSAoc3RyaW5nKXJQci5FbGVtZW50KHByb3BlcnR5TmFtZSkuQXR0cmlidXRlKFcudmFsKTsKKyAgICAgICAgICAgICAgICBpZiAocyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAocyA9PSAiMSIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGlmIChzID09ICIwIikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChzID09ICJ0cnVlIikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgaWYgKHMgPT0gImZhbHNlIikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChzID09ICJvbiIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGlmIChzID09ICJvZmYiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIChib29sKShyUHIuRWxlbWVudChwcm9wZXJ0eU5hbWUpLkF0dHJpYnV0ZShXLnZhbCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRYbWxQcm9wZXJ0eShYRWxlbWVudCByUHIsIFhOYW1lIHByb3BlcnR5TmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gclByLkVsZW1lbnQocHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWE5hbWVbXSBUb2dnbGVQcm9wZXJ0eU5hbWVzID0gbmV3W10geworICAgICAgICAgICAgICAgIFcuYiwKKyAgICAgICAgICAgICAgICBXLmJDcywKKyAgICAgICAgICAgICAgICBXLmNhcHMsCisgICAgICAgICAgICAgICAgVy5lbWJvc3MsCisgICAgICAgICAgICAgICAgVy5pLAorICAgICAgICAgICAgICAgIFcuaUNzLAorICAgICAgICAgICAgICAgIFcuaW1wcmludCwKKyAgICAgICAgICAgICAgICBXLm91dGxpbmUsCisgICAgICAgICAgICAgICAgVy5zaGFkb3csCisgICAgICAgICAgICAgICAgVy5zbWFsbENhcHMsCisgICAgICAgICAgICAgICAgVy5zdHJpa2UsCisgICAgICAgICAgICAgICAgVy52YW5pc2gKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIFhOYW1lW10gUHJvcGVydHlOYW1lcyA9IG5ld1tdIHsKKyAgICAgICAgICAgICAgICBXLmNzLAorICAgICAgICAgICAgICAgIFcucnRsLAorICAgICAgICAgICAgICAgIFcudSwKKyAgICAgICAgICAgICAgICBXLmNvbG9yLAorICAgICAgICAgICAgICAgIFcuaGlnaGxpZ2h0LAorICAgICAgICAgICAgICAgIFcuc2hkCisgICAgICAgICAgICB9OworCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBIYXNoU2V0PGNoYXI+IFdlYWtBbmROZXV0cmFsRGlyZWN0aW9uYWxDaGFyYWN0ZXJzID0gbmV3IEhhc2hTZXQ8Y2hhcj4oKSB7CisgICAgICAgICAgICAnMCcsCisgICAgICAgICAgICAnMScsCisgICAgICAgICAgICAnMicsCisgICAgICAgICAgICAnMycsCisgICAgICAgICAgICAnNCcsCisgICAgICAgICAgICAnNScsCisgICAgICAgICAgICAnNicsCisgICAgICAgICAgICAnNycsCisgICAgICAgICAgICAnOCcsCisgICAgICAgICAgICAnOScsCisgICAgICAgICAgICAnKycsCisgICAgICAgICAgICAnLScsCisgICAgICAgICAgICAnOicsCisgICAgICAgICAgICAnLCcsCisgICAgICAgICAgICAnLicsCisgICAgICAgICAgICAnfCcsCisgICAgICAgICAgICAnXHQnLAorICAgICAgICAgICAgJ1xyJywKKyAgICAgICAgICAgICdcbicsCisgICAgICAgICAgICAnICcsCisgICAgICAgICAgICAnXHgwMEEwJywgLy8gbm9uIGJyZWFraW5nIHNwYWNlCisKKyAgICAgICAgICAgICdceDAwQjAnLCAvLyBkZWdyZWUgc2lnbgorICAgICAgICAgICAgJ1x4MDY2QicsIC8vIGFyYWJpYyBkZWNpbWFsIHNlcGFyYXRvcgorICAgICAgICAgICAgJ1x4MDY2QycsIC8vIGFyYWJpYyB0aG91c2FuZHMgc2VwYXJhdG9yCisKKyAgICAgICAgICAgICdceDA2MjcnLCAvLyBhcmFiaWMgcGlwZSAKKworICAgICAgICAgICAgJ1x4MjBBMCcsIC8vIHN0YXJ0IGN1cnJlbmN5IHN5bWJvbHMKKyAgICAgICAgICAgICdceDIwQTEnLAorICAgICAgICAgICAgJ1x4MjBBMicsCisgICAgICAgICAgICAnXHgyMEEzJywKKyAgICAgICAgICAgICdceDIwQTQnLAorICAgICAgICAgICAgJ1x4MjBBNScsCisgICAgICAgICAgICAnXHgyMEE2JywKKyAgICAgICAgICAgICdceDIwQTcnLAorICAgICAgICAgICAgJ1x4MjBBOCcsCisgICAgICAgICAgICAnXHgyMEE5JywKKyAgICAgICAgICAgICdceDIwQUEnLAorICAgICAgICAgICAgJ1x4MjBBQicsCisgICAgICAgICAgICAnXHgyMEFDJywKKyAgICAgICAgICAgICdceDIwQUQnLAorICAgICAgICAgICAgJ1x4MjBBRScsCisgICAgICAgICAgICAnXHgyMEFGJywKKyAgICAgICAgICAgICdceDIwQjAnLAorICAgICAgICAgICAgJ1x4MjBCMScsCisgICAgICAgICAgICAnXHgyMEIyJywKKyAgICAgICAgICAgICdceDIwQjMnLAorICAgICAgICAgICAgJ1x4MjBCNCcsCisgICAgICAgICAgICAnXHgyMEI1JywKKyAgICAgICAgICAgICdceDIwQjYnLAorICAgICAgICAgICAgJ1x4MjBCNycsCisgICAgICAgICAgICAnXHgyMEI4JywKKyAgICAgICAgICAgICdceDIwQjknLAorICAgICAgICAgICAgJ1x4MjBCQScsCisgICAgICAgICAgICAnXHgyMEJCJywKKyAgICAgICAgICAgICdceDIwQkMnLAorICAgICAgICAgICAgJ1x4MjBCRCcsCisgICAgICAgICAgICAnXHgyMEJFJywKKyAgICAgICAgICAgICdceDIwQkYnLAorICAgICAgICAgICAgJ1x4MjBDMCcsCisgICAgICAgICAgICAnXHgyMEMxJywKKyAgICAgICAgICAgICdceDIwQzInLAorICAgICAgICAgICAgJ1x4MjBDMycsCisgICAgICAgICAgICAnXHgyMEM0JywKKyAgICAgICAgICAgICdceDIwQzUnLAorICAgICAgICAgICAgJ1x4MjBDNicsCisgICAgICAgICAgICAnXHgyMEM3JywKKyAgICAgICAgICAgICdceDIwQzgnLAorICAgICAgICAgICAgJ1x4MjBDOScsCisgICAgICAgICAgICAnXHgyMENBJywKKyAgICAgICAgICAgICdceDIwQ0InLAorICAgICAgICAgICAgJ1x4MjBDQycsCisgICAgICAgICAgICAnXHgyMENEJywKKyAgICAgICAgICAgICdceDIwQ0UnLAorICAgICAgICAgICAgJ1x4MjBDRicsICAvLyBlbmQgY3VycmVuY3kgc3ltYm9scworCisgICAgICAgICAgICAnXHgwNjYwJywgLy8gIkFyYWJpYyIgSW5kaWMgTnVtZXJhbCBGb3JtcyBJcmFxIGFuZCBXZXN0CisgICAgICAgICAgICAnXHgwNjYxJywKKyAgICAgICAgICAgICdceDA2NjInLAorICAgICAgICAgICAgJ1x4MDY2MycsCisgICAgICAgICAgICAnXHgwNjY0JywKKyAgICAgICAgICAgICdceDA2NjUnLAorICAgICAgICAgICAgJ1x4MDY2NicsCisgICAgICAgICAgICAnXHgwNjY3JywKKyAgICAgICAgICAgICdceDA2NjgnLAorICAgICAgICAgICAgJ1x4MDY2OScsCisKKyAgICAgICAgICAgICdceDA2RjAnLCAvLyAiQXJhYmljIiBJbmRpYyBOdW1iZXJhbCBGb3JtcyBJcmFuIGFuZCBFYXN0CisgICAgICAgICAgICAnXHgwNkYxJywKKyAgICAgICAgICAgICdceDA2RjInLAorICAgICAgICAgICAgJ1x4MDZGMycsCisgICAgICAgICAgICAnXHgwNkY0JywKKyAgICAgICAgICAgICdceDA2RjUnLAorICAgICAgICAgICAgJ1x4MDZGNicsCisgICAgICAgICAgICAnXHgwNkY3JywKKyAgICAgICAgICAgICdceDA2RjgnLAorICAgICAgICAgICAgJ1x4MDZGOScsCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGp1c3RGb250QXR0cmlidXRlcyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIFhFbGVtZW50IHBhcmFPclJ1biwgWEVsZW1lbnQgcFByLAorICAgICAgICAgICAgWEVsZW1lbnQgclByLCBGb3JtYXR0aW5nQXNzZW1ibGVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCB0aGVtZVhEb2MgPSBudWxsOworICAgICAgICAgICAgaWYgKHdEb2MuTWFpbkRvY3VtZW50UGFydC5UaGVtZVBhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aGVtZVhEb2MgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuVGhlbWVQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICBYRWxlbWVudCBmb250U2NoZW1lID0gbnVsbDsKKyAgICAgICAgICAgIFhFbGVtZW50IG1ham9yRm9udCA9IG51bGw7CisgICAgICAgICAgICBYRWxlbWVudCBtaW5vckZvbnQgPSBudWxsOworICAgICAgICAgICAgaWYgKHRoZW1lWERvYyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvbnRTY2hlbWUgPSB0aGVtZVhEb2MuUm9vdC5FbGVtZW50KEEudGhlbWVFbGVtZW50cykuRWxlbWVudChBLmZvbnRTY2hlbWUpOworICAgICAgICAgICAgICAgIG1ham9yRm9udCA9IGZvbnRTY2hlbWUuRWxlbWVudChBLm1ham9yRm9udCk7CisgICAgICAgICAgICAgICAgbWlub3JGb250ID0gZm9udFNjaGVtZS5FbGVtZW50KEEubWlub3JGb250KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciByRm9udHMgPSByUHIuRWxlbWVudChXLnJGb250cyk7CisgICAgICAgICAgICBpZiAockZvbnRzID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGFzY2lpVGhlbWUgPSAoc3RyaW5nKXJGb250cy5BdHRyaWJ1dGUoVy5hc2NpaVRoZW1lKTsKKyAgICAgICAgICAgIHZhciBoQW5zaVRoZW1lID0gKHN0cmluZylyRm9udHMuQXR0cmlidXRlKFcuaEFuc2lUaGVtZSk7CisgICAgICAgICAgICB2YXIgZWFzdEFzaWFUaGVtZSA9IChzdHJpbmcpckZvbnRzLkF0dHJpYnV0ZShXLmVhc3RBc2lhVGhlbWUpOworICAgICAgICAgICAgdmFyIGNzdGhlbWUgPSAoc3RyaW5nKXJGb250cy5BdHRyaWJ1dGUoVy5jc3RoZW1lKTsKKyAgICAgICAgICAgIHN0cmluZyBhc2NpaSA9IG51bGw7CisgICAgICAgICAgICBzdHJpbmcgaEFuc2kgPSBudWxsOworICAgICAgICAgICAgc3RyaW5nIGVhc3RBc2lhID0gbnVsbDsKKyAgICAgICAgICAgIHN0cmluZyBjcyA9IG51bGw7CisKKyAgICAgICAgICAgIFhFbGVtZW50IG1pbm9yTGF0aW4gPSBudWxsOworICAgICAgICAgICAgc3RyaW5nIG1pbm9yTGF0aW5UeXBlZmFjZSA9IG51bGw7CisgICAgICAgICAgICBYRWxlbWVudCBtYWpvckxhdGluID0gbnVsbDsKKyAgICAgICAgICAgIHN0cmluZyBtYWpvckxhdGluVHlwZWZhY2UgPSBudWxsOworCisgICAgICAgICAgICBpZiAobWlub3JGb250ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWlub3JMYXRpbiA9IG1pbm9yRm9udC5FbGVtZW50KEEubGF0aW4pOworICAgICAgICAgICAgICAgIG1pbm9yTGF0aW5UeXBlZmFjZSA9IChzdHJpbmcpbWlub3JMYXRpbi5BdHRyaWJ1dGUoInR5cGVmYWNlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtYWpvckZvbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYWpvckxhdGluID0gbWFqb3JGb250LkVsZW1lbnQoQS5sYXRpbik7CisgICAgICAgICAgICAgICAgbWFqb3JMYXRpblR5cGVmYWNlID0gKHN0cmluZyltYWpvckxhdGluLkF0dHJpYnV0ZSgidHlwZWZhY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhc2NpaVRoZW1lICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFzY2lpVGhlbWUuU3RhcnRzV2l0aCgibWlub3IiKSAmJiBtaW5vckxhdGluVHlwZWZhY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFzY2lpID0gbWlub3JMYXRpblR5cGVmYWNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhc2NpaVRoZW1lLlN0YXJ0c1dpdGgoIm1ham9yIikgJiYgbWFqb3JMYXRpblR5cGVmYWNlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc2NpaSA9IG1ham9yTGF0aW5UeXBlZmFjZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaEFuc2lUaGVtZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChoQW5zaVRoZW1lLlN0YXJ0c1dpdGgoIm1pbm9yIikgJiYgbWlub3JMYXRpblR5cGVmYWNlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoQW5zaSA9IG1pbm9yTGF0aW5UeXBlZmFjZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaEFuc2lUaGVtZS5TdGFydHNXaXRoKCJtYWpvciIpICYmIG1ham9yTGF0aW5UeXBlZmFjZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaEFuc2kgPSBtYWpvckxhdGluVHlwZWZhY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVhc3RBc2lhVGhlbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWFzdEFzaWFUaGVtZS5TdGFydHNXaXRoKCJtaW5vciIpICYmIG1pbm9yTGF0aW5UeXBlZmFjZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZWFzdEFzaWEgPSBtaW5vckxhdGluVHlwZWZhY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVhc3RBc2lhVGhlbWUuU3RhcnRzV2l0aCgibWFqb3IiKSAmJiBtYWpvckxhdGluVHlwZWZhY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVhc3RBc2lhID0gbWFqb3JMYXRpblR5cGVmYWNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjc3RoZW1lICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzdGhlbWUuU3RhcnRzV2l0aCgibWlub3IiKSAmJiBtaW5vckZvbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNzID0gKHN0cmluZyltaW5vckZvbnQuRWxlbWVudChBLmNzKS5BdHRyaWJ1dGUoInR5cGVmYWNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNzdGhlbWUuU3RhcnRzV2l0aCgibWFqb3IiKSAmJiBtYWpvckZvbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNzID0gKHN0cmluZyltYWpvckZvbnQuRWxlbWVudChBLmNzKS5BdHRyaWJ1dGUoInR5cGVmYWNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXNjaWkgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByRm9udHMuU2V0QXR0cmlidXRlVmFsdWUoVy5hc2NpaSwgYXNjaWkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhBbnNpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgckZvbnRzLlNldEF0dHJpYnV0ZVZhbHVlKFcuaEFuc2ksIGhBbnNpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlYXN0QXNpYSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJGb250cy5TZXRBdHRyaWJ1dGVWYWx1ZShXLmVhc3RBc2lhLCBlYXN0QXNpYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3MgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByRm9udHMuU2V0QXR0cmlidXRlVmFsdWUoVy5jcywgY3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZmlyc3RUZXh0Tm9kZSA9IHBhcmFPclJ1bi5EZXNjZW5kYW50cyhXLnQpLkZpcnN0T3JEZWZhdWx0KHQgPT4gdC5WYWx1ZS5MZW5ndGggPiAwKTsKKyAgICAgICAgICAgIHN0cmluZyBzdHIgPSAiICI7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgcnVuIHdpdGggbm8gdGV4dCBpbiBpdCwgdGhlbiBubyBuZWVkIHRvIGRvIGFueSBvZiB0aGUgcmVzdCBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgICAgIGlmIChmaXJzdFRleHROb2RlID09IG51bGwgJiYgcGFyYU9yUnVuLk5hbWUgPT0gVy5yKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaWYgKGZpcnN0VGV4dE5vZGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdHIgPSBmaXJzdFRleHROb2RlLlZhbHVlOworCisgICAgICAgICAgICB2YXIgY3NhID0gbmV3IENoYXJTdHlsZUF0dHJpYnV0ZXMocFByLCByUHIpOworCisgICAgICAgICAgICAvLyBUaGlzIG1vZHVsZSBkZXRlcm1pbmVzIHRoZSBmb250IGJhc2VkIG9uIGp1c3QgdGhlIGZpcnN0IGNoYXJhY3Rlci4KKyAgICAgICAgICAgIC8vIFRlY2huaWNhbGx5LCBhIHJ1biBjYW4gY29udGFpbiBjaGFyYWN0ZXJzIGZyb20gZGlmZmVyZW50IFVuaWNvZGUgY29kZSBibG9ja3MsIGFuZCBoZW5jZSBzaG91bGQgYmUgcmVuZGVyZWQgd2l0aCBkaWZmZXJlbnQgZm9udHMuCisgICAgICAgICAgICAvLyBIb3dldmVyLCBXb3JkIGJyZWFrcyB1cCBydW5zIHRoYXQgdXNlIG1vcmUgdGhhbiBvbmUgZm9udCBpbnRvIG11bHRpcGxlIHJ1bnMuICBPdGhlciBwcm9kdWNlcnMgb2YgV29yZHByb2Nlc3NpbmdNTCBtYXkgbm90LCBzbyBpbgorICAgICAgICAgICAgLy8gdGhhdCBjYXNlLCB0aGlzIHJvdXRpbmUgbWF5IG5lZWQgdG8gYmUgYXVnbWVudGVkIHRvIGxvb2sgYXQgYWxsIGNoYXJhY3RlcnMgaW4gYSBydW4uCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBvbGQgY29kZQorICAgICAgICAgICAgdmFyIGZvbnRGYW1pbGllcyA9IHN0ci5zZWxlY3QoZnVuY3Rpb24gKGMpIHsKKyAgICAgICAgICAgICAgICB2YXIgZnQgPSBQYXYuRGV0ZXJtaW5lRm9udFR5cGVGcm9tQ2hhcmFjdGVyKGMsIGNzYSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChmdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdi5Gb250VHlwZS5Bc2NpaToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXN0KHJGb250cy5hdHRyaWJ1dGUoVy5hc2NpaSkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdi5Gb250VHlwZS5IQW5zaToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXN0KHJGb250cy5hdHRyaWJ1dGUoVy5oQW5zaSkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdi5Gb250VHlwZS5FYXN0QXNpYToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXN0KHJGb250cy5hdHRyaWJ1dGUoVy5lYXN0QXNpYSkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdi5Gb250VHlwZS5DUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXN0KHJGb250cy5hdHRyaWJ1dGUoVy5jcykpOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2hlcmUoZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGYgIT0gbnVsbCAmJiBmICE9ICIiOyB9KQorICAgICAgICAgICAgICAgIC5kaXN0aW5jdCgpCisgICAgICAgICAgICAgICAgLnNlbGVjdChmdW5jdGlvbiAoZikgeyByZXR1cm4gbmV3IFBhdi5Gb250RmFtaWx5KGYpOyB9KQorICAgICAgICAgICAgICAgIC50b0FycmF5KCk7CisgICAgICAgICAgICAqLworCisgICAgICAgICAgICB2YXIgY2hhclRvRXhhbWluZSA9IHN0ci5GaXJzdE9yRGVmYXVsdChjID0+ICEgV2Vha0FuZE5ldXRyYWxEaXJlY3Rpb25hbENoYXJhY3RlcnMuQ29udGFpbnMoYykpOworICAgICAgICAgICAgaWYgKGNoYXJUb0V4YW1pbmUgPT0gJ1wwJykKKyAgICAgICAgICAgICAgICBjaGFyVG9FeGFtaW5lID0gc3RyWzBdOworCisgICAgICAgICAgICB2YXIgZnQgPSBEZXRlcm1pbmVGb250VHlwZUZyb21DaGFyYWN0ZXIoY2hhclRvRXhhbWluZSwgY3NhKTsKKyAgICAgICAgICAgIHN0cmluZyBmb250VHlwZSA9IG51bGw7CisgICAgICAgICAgICBzdHJpbmcgbGFuZ3VhZ2VUeXBlID0gbnVsbDsKKyAgICAgICAgICAgIHN3aXRjaCAoZnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBGb250VHlwZS5Bc2NpaToKKyAgICAgICAgICAgICAgICAgICAgZm9udFR5cGUgPSAoc3RyaW5nKXJGb250cy5BdHRyaWJ1dGUoVy5hc2NpaSk7CisgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlVHlwZSA9ICJ3ZXN0ZXJuIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGb250VHlwZS5IQW5zaToKKyAgICAgICAgICAgICAgICAgICAgZm9udFR5cGUgPSAoc3RyaW5nKXJGb250cy5BdHRyaWJ1dGUoVy5oQW5zaSk7CisgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlVHlwZSA9ICJ3ZXN0ZXJuIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGb250VHlwZS5FYXN0QXNpYToKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLlJlc3RyaWN0VG9TdXBwb3J0ZWRMYW5ndWFnZXMpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRMYW5ndWFnZUV4Y2VwdGlvbigiRWFzdEFzaWEgbGFuZ3VhZ2VzIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgICAgIGZvbnRUeXBlID0gKHN0cmluZylyRm9udHMuQXR0cmlidXRlKFcuZWFzdEFzaWEpOworICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVR5cGUgPSAiZWFzdEFzaWEiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZvbnRUeXBlLkNTOgorICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuUmVzdHJpY3RUb1N1cHBvcnRlZExhbmd1YWdlcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZExhbmd1YWdlRXhjZXB0aW9uKCJDb21wbGV4IHNjcmlwdCAoUlRMKSBsYW5ndWFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgZm9udFR5cGUgPSAoc3RyaW5nKXJGb250cy5BdHRyaWJ1dGUoVy5jcyk7CisgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlVHlwZSA9ICJiaWRpIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb250VHlwZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwYXJhT3JSdW4uQXR0cmlidXRlKFB0T3BlblhtbC5Gb250TmFtZSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhBdHRyaWJ1dGUgZnRhID0gbmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLkZvbnROYW1lLCBmb250VHlwZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYU9yUnVuLkFkZChmdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYXJhT3JSdW4uQXR0cmlidXRlKFB0T3BlblhtbC5Gb250TmFtZSkuVmFsdWUgPSBmb250VHlwZS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYW5ndWFnZVR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyYU9yUnVuLkF0dHJpYnV0ZShQdE9wZW5YbWwuTGFuZ3VhZ2VUeXBlKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWEF0dHJpYnV0ZSBsdGEgPSBuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuTGFuZ3VhZ2VUeXBlLCBsYW5ndWFnZVR5cGUpOworICAgICAgICAgICAgICAgICAgICBwYXJhT3JSdW4uQWRkKGx0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFPclJ1bi5BdHRyaWJ1dGUoUHRPcGVuWG1sLkxhbmd1YWdlVHlwZSkuVmFsdWUgPSBsYW5ndWFnZVR5cGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGVudW0gRm9udFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgQXNjaWksCisgICAgICAgICAgICBIQW5zaSwKKyAgICAgICAgICAgIEVhc3RBc2lhLAorICAgICAgICAgICAgQ1MKKyAgICAgICAgfTsKKworICAgICAgICAvLyBUaGUgYWxnb3JpdGhtIGZvciB0aGlzIG1ldGhvZCBjb21lcyBmcm9tIHRoZSBpbXBsZW1lbnRlciBub3RlcyBpbiBbTVMtT0kyOTUwMF0ucGRmCisgICAgICAgIC8vIHNlY3Rpb24gMi4xLjg3CisKKyAgICAgICAgLy8gVGhlIGltcGxlbWVudGVyIG5vdGVzIGFyZSBhdDoKKyAgICAgICAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2VlOTA4NjUyLmFzcHgKKworICAgICAgICBwdWJsaWMgc3RhdGljIEZvbnRUeXBlIERldGVybWluZUZvbnRUeXBlRnJvbUNoYXJhY3RlcihjaGFyIGNoLCBDaGFyU3R5bGVBdHRyaWJ1dGVzIGNzYSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWYgdGhlIHJ1biBoYXMgdGhlIGNzIGVsZW1lbnQgKCJbSVNPL0lFQy0yOTUwMC0xXSDCpzE3LjMuMi43OyBjcyIpIG9yIHRoZSBydGwgZWxlbWVudCAoIltJU08vSUVDLTI5NTAwLTFdIMKnMTcuMy4yLjMwOyBydGwiKSwKKyAgICAgICAgICAgIC8vIHRoZW4gdGhlIGNzIChvciBjc3RoZW1lIGlmIGRlZmluZWQpIGZvbnQgaXMgdXNlZCwgcmVnYXJkbGVzcyBvZiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgdmFsdWVzIG9mIHRoZSBydW7igJlzIGNvbnRlbnQuCisgICAgICAgICAgICBpZiAoY3NhLlJ0bCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuQ1M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEEgbGFyZ2UgcGVyY2VudGFnZSBvZiBjaGFyYWN0ZXJzIHdpbGwgZmFsbCBpbiB0aGUgZm9sbG93aW5nIHJ1bGUuCisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEJhc2ljIExhdGluCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgwMCAmJiBjaCA8PSAweDdmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5Bc2NpaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdGhlIGVhc3RBc2lhIChvciBlYXN0QXNpYVRoZW1lIGlmIGRlZmluZWQpIGF0dHJpYnV0ZeKAmXMgdmFsdWUgaXMg4oCcVGltZXMgTmV3IFJvbWFu4oCdIGFuZCB0aGUgYXNjaWkgKG9yIGFzY2lpVGhlbWUgaWYgZGVmaW5lZCkKKyAgICAgICAgICAgIC8vIGFuZCBoQW5zaSAob3IgaEFuc2lUaGVtZSBpZiBkZWZpbmVkKSBhdHRyaWJ1dGVzIGFyZSBlcXVhbCwgdGhlbiB0aGUgYXNjaWkgKG9yIGFzY2lpVGhlbWUgaWYgZGVmaW5lZCkgZm9udCBpcyB1c2VkLgorICAgICAgICAgICAgaWYgKGNzYS5FYXN0QXNpYUZvbnQgPT0gIlRpbWVzIE5ldyBSb21hbiIgJiYKKyAgICAgICAgICAgICAgICBjc2EuQXNjaWlGb250ID09IGNzYS5IQW5zaUZvbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkFzY2lpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJMb2NrOiBMYXRpbi0xIFN1cHBsZW1lbnQKKyAgICAgICAgICAgIGlmIChjaCA+PSAweEEwICYmIGNoIDw9IDB4RkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gMHhBMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhBNCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhBNyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhBOCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhBQSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhBRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhBRiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGNoID49IDB4QjAgJiYgY2ggPD0gMHhCNCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjaCA+PSAweEI2ICYmIGNoIDw9IDB4QkEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoY2ggPj0gMHhCQyAmJiBjaCA8PSAweEJGKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhENyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhGNykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjc2EuRWFzdEFzaWFMYW5nID09ICJ6aC1oYW50IiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY3NhLkVhc3RBc2lhTGFuZyA9PSAiemgtaGFucyIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAweEUwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhFMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaCA+PSAweEU4ICYmIGNoIDw9IDB4RUEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoID49IDB4RUMgJiYgY2ggPD0gMHhFRCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2ggPj0gMHhGMiAmJiBjaCA8PSAweEYzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaCA+PSAweEY5ICYmIGNoIDw9IDB4RkEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhGQykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBMYXRpbiBFeHRlbmRlZC1BCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgwMTAwICYmIGNoIDw9IDB4MDE3RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjc2EuRWFzdEFzaWFMYW5nID09ICJ6aC1oYW50IiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY3NhLkVhc3RBc2lhTGFuZyA9PSAiemgtaGFucyIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHx8IHRoZSBjaGFyYWN0ZXIgc2V0IG9mIHRoZSBlYXN0IEFzaWEgKG9yIGVhc3QgQXNpYSB0aGVtZSkgZm9udCBpcyBDaGluZXNlNSB8fCBHQjIzMTIgdG9kbyAqLykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogTGF0aW4gRXh0ZW5kZWQtQgorICAgICAgICAgICAgaWYgKGNoID49IDB4MDE4MCAmJiBjaCA8PSAweDAyNEYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3NhLkVhc3RBc2lhTGFuZyA9PSAiemgtaGFudCIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzYS5FYXN0QXNpYUxhbmcgPT0gInpoLWhhbnMiCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB8fCB0aGUgY2hhcmFjdGVyIHNldCBvZiB0aGUgZWFzdCBBc2lhIChvciBlYXN0IEFzaWEgdGhlbWUpIGZvbnQgaXMgQ2hpbmVzZTUgfHwgR0IyMzEyIHRvZG8gKi8pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IElQQSBFeHRlbnNpb25zCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgwMjUwICYmIGNoIDw9IDB4MDJBRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjc2EuRWFzdEFzaWFMYW5nID09ICJ6aC1oYW50IiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY3NhLkVhc3RBc2lhTGFuZyA9PSAiemgtaGFucyIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHx8IHRoZSBjaGFyYWN0ZXIgc2V0IG9mIHRoZSBlYXN0IEFzaWEgKG9yIGVhc3QgQXNpYSB0aGVtZSkgZm9udCBpcyBDaGluZXNlNSB8fCBHQjIzMTIgdG9kbyAqLykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgwMkIwICYmIGNoIDw9IDB4MDJGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBDb21iaW5pbmcgRGlhY3JpdGljIE1hcmtzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgwMzAwICYmIGNoIDw9IDB4MDM2RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBHcmVlaworICAgICAgICAgICAgaWYgKGNoID49IDB4MDM3MCAmJiBjaCA8PSAweDAzQ0YpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogQ3lyaWxsaWMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDA0MDAgJiYgY2ggPD0gMHgwNEZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEhlYnJldworICAgICAgICAgICAgaWYgKGNoID49IDB4MDU5MCAmJiBjaCA8PSAweDA1RkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkFzY2lpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBBcmFiaWMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDA2MDAgJiYgY2ggPD0gMHgwNkZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5Bc2NpaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogU3lyaWFjCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgwNzAwICYmIGNoIDw9IDB4MDc0RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuQXNjaWk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEFyYWJpYyBTdXBwbGVtZW50CisgICAgICAgICAgICBpZiAoY2ggPj0gMHgwNzUwICYmIGNoIDw9IDB4MDc3RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuQXNjaWk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IFRoYW5uYQorICAgICAgICAgICAgaWYgKGNoID49IDB4MDc4MCAmJiBjaCA8PSAweDA3QkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkFzY2lpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBIYW5ndWwgSmFtbworICAgICAgICAgICAgaWYgKGNoID49IDB4MTEwMCAmJiBjaCA8PSAweDExRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgxRTAwICYmIGNoIDw9IDB4MUVGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIiAmJgorICAgICAgICAgICAgICAgICAgICAoY3NhLkVhc3RBc2lhTGFuZyA9PSAiemgtaGFudCIgfHwKKyAgICAgICAgICAgICAgICAgICAgY3NhLkVhc3RBc2lhTGFuZyA9PSAiemgtaGFucyIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEdlbmVyYWwgUHVuY3R1YXRpb24KKyAgICAgICAgICAgIGlmIChjaCA+PSAweDIwMDAgJiYgY2ggPD0gMHgyMDZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IFN1cGVyc2NyaXB0cyBhbmQgU3Vic2NyaXB0cworICAgICAgICAgICAgaWYgKGNoID49IDB4MjA3MCAmJiBjaCA8PSAweDIwOUYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogQ3VycmVuY3kgU3ltYm9scworICAgICAgICAgICAgaWYgKGNoID49IDB4MjBBMCAmJiBjaCA8PSAweDIwQ0YpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIGZvciBTeW1ib2xzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgyMEQwICYmIGNoIDw9IDB4MjBGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBMZXR0ZXItbGlrZSBTeW1ib2xzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgyMTAwICYmIGNoIDw9IDB4MjE0RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBOdW1iZXIgRm9ybXMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDIxNTAgJiYgY2ggPD0gMHgyMThGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEFycm93cworICAgICAgICAgICAgaWYgKGNoID49IDB4MjE5MCAmJiBjaCA8PSAweDIxRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogTWF0aGVtYXRpY2FsIE9wZXJhdG9ycworICAgICAgICAgICAgaWYgKGNoID49IDB4MjIwMCAmJiBjaCA8PSAweDIyRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogTWlzY2VsbGFuZW91cyBUZWNobmljYWwKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDIzMDAgJiYgY2ggPD0gMHgyM0ZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IENvbnRyb2wgUGljdHVyZXMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDI0MDAgJiYgY2ggPD0gMHgyNDNGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IE9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgyNDQwICYmIGNoIDw9IDB4MjQ1RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBFbmNsb3NlZCBBbHBoYW51bWVyaWNzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgyNDYwICYmIGNoIDw9IDB4MjRGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBCb3ggRHJhd2luZworICAgICAgICAgICAgaWYgKGNoID49IDB4MjUwMCAmJiBjaCA8PSAweDI1N0YpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogQmxvY2sgRWxlbWVudHMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDI1ODAgJiYgY2ggPD0gMHgyNTlGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEdlb21ldHJpYyBTaGFwZXMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDI1QTAgJiYgY2ggPD0gMHgyNUZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IE1pc2NlbGxhbmVvdXMgU3ltYm9scworICAgICAgICAgICAgaWYgKGNoID49IDB4MjYwMCAmJiBjaCA8PSAweDI2RkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogRGluZ2JhdHMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDI3MDAgJiYgY2ggPD0gMHgyN0JGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IENKSyBSYWRpY2FscyBTdXBwbGVtZW50CisgICAgICAgICAgICBpZiAoY2ggPj0gMHgyRTgwICYmIGNoIDw9IDB4MkVGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBLYW5neGkgUmFkaWNhbHMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDJGMDAgJiYgY2ggPD0gMHgyRkRGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycworICAgICAgICAgICAgaWYgKGNoID49IDB4MkZGMCAmJiBjaCA8PSAweDJGRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24KKyAgICAgICAgICAgIGlmIChjaCA+PSAweDMwMDAgJiYgY2ggPD0gMHgzMDNGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogSGlyYWdhbmEKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDMwNDAgJiYgY2ggPD0gMHgzMDlGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogS2F0YWthbmEKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDMwQTAgJiYgY2ggPD0gMHgzMEZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogQm9wb21vZm8KKyAgICAgICAgICAgIGlmIChjaCA+PSAweDMxMDAgJiYgY2ggPD0gMHgzMTJGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbworICAgICAgICAgICAgaWYgKGNoID49IDB4MzEzMCAmJiBjaCA8PSAweDMxOEYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBLYW5idW4KKyAgICAgICAgICAgIGlmIChjaCA+PSAweDMxOTAgJiYgY2ggPD0gMHgzMTlGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocworICAgICAgICAgICAgaWYgKGNoID49IDB4MzIwMCAmJiBjaCA8PSAweDMyRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBDSksgQ29tcGF0aWJpbGl0eQorICAgICAgICAgICAgaWYgKGNoID49IDB4MzMwMCAmJiBjaCA8PSAweDMzRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBBCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgzNDAwICYmIGNoIDw9IDB4NERCRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IENKSyBVbmlmaWVkIElkZW9ncmFwaHMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDRFMDAgJiYgY2ggPD0gMHg5RkFGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogWWkgU3lsbGFibGVzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHhBMDAwICYmIGNoIDw9IDB4QTQ4RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IFlpIFJhZGljYWxzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHhBNDkwICYmIGNoIDw9IDB4QTRDRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEhhbmd1bCBTeWxsYWJsZXMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweEFDMDAgJiYgY2ggPD0gMHhEN0FGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogSGlnaCBTdXJyb2dhdGVzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHhEODAwICYmIGNoIDw9IDB4REI3RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEhpZ2ggUHJpdmF0ZSBVc2UgU3Vycm9nYXRlcworICAgICAgICAgICAgaWYgKGNoID49IDB4REI4MCAmJiBjaCA8PSAweERCRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBMb3cgU3Vycm9nYXRlcworICAgICAgICAgICAgaWYgKGNoID49IDB4REMwMCAmJiBjaCA8PSAweERGRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBQcml2YXRlIFVzZSBBcmVhCisgICAgICAgICAgICBpZiAoY2ggPj0gMHhFMDAwICYmIGNoIDw9IDB4RjhGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHhGOTAwICYmIGNoIDw9IDB4RkFGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEFscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zCisgICAgICAgICAgICBpZiAoY2ggPj0gMHhGQjAwICYmIGNoIDw9IDB4RkI0RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweEZCMDAgJiYgY2ggPD0gMHhGQjFDKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHhGQjFEICYmIGNoIDw9IDB4RkI0RikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5Bc2NpaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUEKKyAgICAgICAgICAgIGlmIChjaCA+PSAweEZCNTAgJiYgY2ggPD0gMHhGREZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5Bc2NpaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweEZFMzAgJiYgY2ggPD0gMHhGRTRGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogU21hbGwgRm9ybSBWYXJpYW50cworICAgICAgICAgICAgaWYgKGNoID49IDB4RkU1MCAmJiBjaCA8PSAweEZFNkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUIKKyAgICAgICAgICAgIGlmIChjaCA+PSAweEZFNzAgJiYgY2ggPD0gMHhGRUZFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5Bc2NpaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweEZGMDAgJiYgY2ggPD0gMHhGRkVGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgRm9ybWF0dGluZ0Fzc2VtYmxlckluZm8KKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHN0cmluZyBEZWZhdWx0UGFyYWdyYXBoU3R5bGVOYW1lOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBEZWZhdWx0Q2hhcmFjdGVyU3R5bGVOYW1lOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBEZWZhdWx0VGFibGVTdHlsZU5hbWU7CisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxzdHJpbmcsIFhFbGVtZW50PiBSb2xsZWRDaGFyYWN0ZXJTdHlsZXM7CisgICAgICAgICAgICBwdWJsaWMgRm9ybWF0dGluZ0Fzc2VtYmxlckluZm8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJvbGxlZENoYXJhY3RlclN0eWxlcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgWEVsZW1lbnQ+KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDYWNoZWRQYXJhSW5mbyBpcyBhbiBvcHRpbWl6YXRpb24gZm9yIHRoZSBjYXNlIHdoZXJlIGEgcGFyYWdyYXBoIGNvbnRhaW5zIHRob3VzYW5kcyBvZiBydW5zLgorICAgICAgICBwcml2YXRlIGNsYXNzIENhY2hlZFBhcmFJbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgUGFyYWdyYXBoU3R5bGVOYW1lOworICAgICAgICAgICAgcHVibGljIFhFbGVtZW50IFBhcmFncmFwaFByb3BlcnRpZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWROdW1iZXJpbmdGb3JtYXRFeGNlcHRpb24gOiBFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFVuc3VwcG9ydGVkTnVtYmVyaW5nRm9ybWF0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKSA6IGJhc2UobWVzc2FnZSkgeyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRMYW5ndWFnZUV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVW5zdXBwb3J0ZWRMYW5ndWFnZUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkgOiBiYXNlKG1lc3NhZ2UpIHsgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvR2V0TGlzdEl0ZW1UZXh0X0RlZmF1bHQuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9HZXRMaXN0SXRlbVRleHRfRGVmYXVsdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDc1N2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvR2V0TGlzdEl0ZW1UZXh0X0RlZmF1bHQuY3MKQEAgLTAsMCArMSwyNTUgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgY2xhc3MgTGlzdEl0ZW1UZXh0R2V0dGVyX0RlZmF1bHQKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ1tdIFJvbWFuT25lcyA9CisgICAgICAgIHsKKyAgICAgICAgICAgICIiLCAiSSIsICJJSSIsICJJSUkiLCAiSVYiLCAiViIsICJWSSIsICJWSUkiLCAiVklJSSIsICJJWCIKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBSb21hblRlbnMgPQorICAgICAgICB7CisgICAgICAgICAgICAiIiwgIlgiLCAiWFgiLCAiWFhYIiwgIlhMIiwgIkwiLCAiTFgiLCAiTFhYIiwgIkxYWFgiLCAiWEMiCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gUm9tYW5IdW5kcmVkcyA9CisgICAgICAgIHsKKyAgICAgICAgICAgICIiLCAiQyIsICJDQyIsICJDQ0MiLCAiQ0QiLCAiRCIsICJEQyIsICJEQ0MiLCAiRENDQyIsICJDTSIsICJNIgorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ1tdIFJvbWFuVGhvdXNhbmRzID0KKyAgICAgICAgeworICAgICAgICAgICAgIiIsICJNIiwgIk1NIiwgIk1NTSIsICJNTU1NIiwgIk1NTU1NIiwgIk1NTU1NTSIsICJNTU1NTU1NIiwgIk1NTU1NTU1NIiwKKyAgICAgICAgICAgICJNTU1NTU1NTU0iLCAiTU1NTU1NTU1NTSIKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBPbmVUaHJvdWdoTmluZXRlZW4gPSB7CisgICAgICAgICAgICAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwKKyAgICAgICAgICAgICJuaW5lIiwgInRlbiIsICJlbGV2ZW4iLCAidHdlbHZlIiwgInRoaXJ0ZWVuIiwgImZvdXJ0ZWVuIiwKKyAgICAgICAgICAgICJmaWZ0ZWVuIiwgInNpeHRlZW4iLCAic2V2ZW50ZWVuIiwgImVpZ2h0ZWVuIiwgIm5pbmV0ZWVuIgorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ1tdIFRlbnMgPSB7CisgICAgICAgICAgICAidGVuIiwgInR3ZW50eSIsICJ0aGlydHkiLCAiZm9ydHkiLCAiZmlmdHkiLCAic2l4dHkiLCAic2V2ZW50eSIsCisgICAgICAgICAgICAiZWlnaHR5IiwgIm5pbmV0eSIKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBPcmRpbmFsT25lVGhyb3VnaE5pbmV0ZWVuID0geworICAgICAgICAgICAgImZpcnN0IiwgInNlY29uZCIsICJ0aGlyZCIsICJmb3VydGgiLCAiZmlmdGgiLCAic2l4dGgiLAorICAgICAgICAgICAgInNldmVudGgiLCAiZWlnaHRoIiwgIm5pbnRoIiwgInRlbnRoIiwgImVsZXZlbnRoIiwgInR3ZWxmdGgiLAorICAgICAgICAgICAgInRoaXJ0ZWVudGgiLCAiZm91cnRlZW50aCIsICJmaWZ0ZWVudGgiLCAic2l4dGVlbnRoIiwKKyAgICAgICAgICAgICJzZXZlbnRlZW50aCIsICJlaWdodGVlbnRoIiwgIm5pbmV0ZWVudGgiCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gT3JkaW5hbFRlbnRocyA9IHsKKyAgICAgICAgICAgICJ0ZW50aCIsICJ0d2VudGlldGgiLCAidGhpcnRpZXRoIiwgImZvcnRpZXRoIiwgImZpZnRpZXRoIiwKKyAgICAgICAgICAgICJzaXh0aWV0aCIsICJzZXZlbnRpZXRoIiwgImVpZ2h0aWV0aCIsICJuaW5ldGlldGgiCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0TGlzdEl0ZW1UZXh0KHN0cmluZyBsYW5ndWFnZUN1bHR1cmVOYW1lLCBpbnQgbGV2ZWxOdW1iZXIsIHN0cmluZyBudW1GbXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChudW1GbXQgPT0gIm5vbmUiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1GbXQgPT0gImRlY2ltYWwiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbE51bWJlci5Ub1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bUZtdCA9PSAiZGVjaW1hbFplcm8iKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChsZXZlbE51bWJlciA8PSA5KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjAiICsgbGV2ZWxOdW1iZXIuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbE51bWJlci5Ub1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bUZtdCA9PSAidXBwZXJSb21hbiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG9uZXMgPSBsZXZlbE51bWJlciAlIDEwOworICAgICAgICAgICAgICAgIGludCB0ZW5zID0gKGxldmVsTnVtYmVyICUgMTAwKSAvIDEwOworICAgICAgICAgICAgICAgIGludCBodW5kcmVkcyA9IChsZXZlbE51bWJlciAlIDEwMDApIC8gMTAwOworICAgICAgICAgICAgICAgIGludCB0aG91c2FuZHMgPSBsZXZlbE51bWJlciAvIDEwMDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJvbWFuVGhvdXNhbmRzW3Rob3VzYW5kc10gKyBSb21hbkh1bmRyZWRzW2h1bmRyZWRzXSArCisgICAgICAgICAgICAgICAgICAgIFJvbWFuVGVuc1t0ZW5zXSArIFJvbWFuT25lc1tvbmVzXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1GbXQgPT0gImxvd2VyUm9tYW4iKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBvbmVzID0gbGV2ZWxOdW1iZXIgJSAxMDsKKyAgICAgICAgICAgICAgICBpbnQgdGVucyA9IChsZXZlbE51bWJlciAlIDEwMCkgLyAxMDsKKyAgICAgICAgICAgICAgICBpbnQgaHVuZHJlZHMgPSAobGV2ZWxOdW1iZXIgJSAxMDAwKSAvIDEwMDsKKyAgICAgICAgICAgICAgICBpbnQgdGhvdXNhbmRzID0gbGV2ZWxOdW1iZXIgLyAxMDAwOworICAgICAgICAgICAgICAgIHJldHVybiAoUm9tYW5UaG91c2FuZHNbdGhvdXNhbmRzXSArIFJvbWFuSHVuZHJlZHNbaHVuZHJlZHNdICsKKyAgICAgICAgICAgICAgICAgICAgUm9tYW5UZW5zW3RlbnNdICsgUm9tYW5PbmVzW29uZXNdKS5Ub0xvd2VyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtRm10ID09ICJ1cHBlckxldHRlciIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGxldmVsTnVtYmVyMiA9IGxldmVsTnVtYmVyICUgNzgwOworICAgICAgICAgICAgICAgIGlmIChsZXZlbE51bWJlcjIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxOdW1iZXIyID0gNzgwOworICAgICAgICAgICAgICAgIHN0cmluZyBhID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IChsZXZlbE51bWJlcjIgLSAxKSAvIDI2OworICAgICAgICAgICAgICAgIGludCBuID0gKGxldmVsTnVtYmVyMiAtIDEpICUgMjY7CisgICAgICAgICAgICAgICAgY2hhciB4ID0gYVtuXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiIuUGFkUmlnaHQoYyArIDEsIHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bUZtdCA9PSAibG93ZXJMZXR0ZXIiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBsZXZlbE51bWJlcjMgPSBsZXZlbE51bWJlciAlIDc4MDsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWxOdW1iZXIzID09IDApCisgICAgICAgICAgICAgICAgICAgIGxldmVsTnVtYmVyMyA9IDc4MDsKKyAgICAgICAgICAgICAgICBzdHJpbmcgYSA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisgICAgICAgICAgICAgICAgaW50IGMgPSAobGV2ZWxOdW1iZXIzIC0gMSkgLyAyNjsKKyAgICAgICAgICAgICAgICBpbnQgbiA9IChsZXZlbE51bWJlcjMgLSAxKSAlIDI2OworICAgICAgICAgICAgICAgIGNoYXIgeCA9IGFbbl07CisgICAgICAgICAgICAgICAgcmV0dXJuICIiLlBhZFJpZ2h0KGMgKyAxLCB4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1GbXQgPT0gIm9yZGluYWwiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXg7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsTnVtYmVyICUgMTAwID09IDExIHx8IGxldmVsTnVtYmVyICUgMTAwID09IDEyIHx8CisgICAgICAgICAgICAgICAgICAgIGxldmVsTnVtYmVyICUgMTAwID09IDEzKQorICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAidGgiOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsTnVtYmVyICUgMTAgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gInN0IjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbE51bWJlciAlIDEwID09IDIpCisgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJuZCI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWxOdW1iZXIgJSAxMCA9PSAzKQorICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAicmQiOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gInRoIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWxOdW1iZXIuVG9TdHJpbmcoKSArIHN1ZmZpeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1GbXQgPT0gImNhcmRpbmFsVGV4dCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHJlc3VsdCA9ICIiOworICAgICAgICAgICAgICAgIGludCB0MSA9IGxldmVsTnVtYmVyIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBpbnQgdDIgPSBsZXZlbE51bWJlciAlIDEwMDA7CisgICAgICAgICAgICAgICAgaWYgKHQxID49IDEpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBPbmVUaHJvdWdoTmluZXRlZW5bdDEgLSAxXSArICIgdGhvdXNhbmQiOworICAgICAgICAgICAgICAgIGlmICh0MSA+PSAxICYmIHQyID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoKSArCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIGlmICh0MSA+PSAxKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiAiOworICAgICAgICAgICAgICAgIGludCBoMSA9IChsZXZlbE51bWJlciAlIDEwMDApIC8gMTAwOworICAgICAgICAgICAgICAgIGludCBoMiA9IGxldmVsTnVtYmVyICUgMTAwOworICAgICAgICAgICAgICAgIGlmIChoMSA+PSAxKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gT25lVGhyb3VnaE5pbmV0ZWVuW2gxIC0gMV0gKyAiIGh1bmRyZWQiOworICAgICAgICAgICAgICAgIGlmIChoMSA+PSAxICYmIGgyID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoKSArCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIGlmIChoMSA+PSAxKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiAiOworICAgICAgICAgICAgICAgIGludCB6ID0gbGV2ZWxOdW1iZXIgJSAxMDA7CisgICAgICAgICAgICAgICAgaWYgKHogPD0gMTkpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBPbmVUaHJvdWdoTmluZXRlZW5beiAtIDFdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB4ID0geiAvIDEwOworICAgICAgICAgICAgICAgICAgICBpbnQgciA9IHogJSAxMDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFRlbnNbeCAtIDFdOworICAgICAgICAgICAgICAgICAgICBpZiAociA+PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICItIiArIE9uZVRocm91Z2hOaW5ldGVlbltyIC0gMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoKSArCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5TdWJzdHJpbmcoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtRm10ID09ICJvcmRpbmFsVGV4dCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHJlc3VsdCA9ICIiOworICAgICAgICAgICAgICAgIGludCB0MSA9IGxldmVsTnVtYmVyIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBpbnQgdDIgPSBsZXZlbE51bWJlciAlIDEwMDA7CisgICAgICAgICAgICAgICAgaWYgKHQxID49IDEgJiYgdDIgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IE9uZVRocm91Z2hOaW5ldGVlblt0MSAtIDFdICsgIiB0aG91c2FuZCI7CisgICAgICAgICAgICAgICAgaWYgKHQxID49IDEgJiYgdDIgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBPbmVUaHJvdWdoTmluZXRlZW5bdDEgLSAxXSArICIgdGhvdXNhbmR0aCI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoKSArCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodDEgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgIjsKKyAgICAgICAgICAgICAgICBpbnQgaDEgPSAobGV2ZWxOdW1iZXIgJSAxMDAwKSAvIDEwMDsKKyAgICAgICAgICAgICAgICBpbnQgaDIgPSBsZXZlbE51bWJlciAlIDEwMDsKKyAgICAgICAgICAgICAgICBpZiAoaDEgPj0gMSAmJiBoMiAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gT25lVGhyb3VnaE5pbmV0ZWVuW2gxIC0gMV0gKyAiIGh1bmRyZWQiOworICAgICAgICAgICAgICAgIGlmIChoMSA+PSAxICYmIGgyID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gT25lVGhyb3VnaE5pbmV0ZWVuW2gxIC0gMV0gKyAiIGh1bmRyZWR0aCI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoKSArCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaDEgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgIjsKKyAgICAgICAgICAgICAgICBpbnQgeiA9IGxldmVsTnVtYmVyICUgMTAwOworICAgICAgICAgICAgICAgIGlmICh6IDw9IDE5KQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gT3JkaW5hbE9uZVRocm91Z2hOaW5ldGVlblt6IC0gMV07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHggPSB6IC8gMTA7CisgICAgICAgICAgICAgICAgICAgIGludCByID0geiAlIDEwOworICAgICAgICAgICAgICAgICAgICBpZiAociA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IE9yZGluYWxUZW50aHNbeCAtIDFdOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gVGVuc1t4IC0gMV07CisgICAgICAgICAgICAgICAgICAgIGlmIChyID49IDEpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIi0iICsgT3JkaW5hbE9uZVRocm91Z2hOaW5ldGVlbltyIC0gMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoKSArCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5TdWJzdHJpbmcoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtRm10ID09ICIwMSwgMDIsIDAzLCAuLi4iKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KCJ7MDowMH0iLCBsZXZlbE51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtRm10ID09ICIwMDEsIDAwMiwgMDAzLCAuLi4iKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KCJ7MDowMDB9IiwgbGV2ZWxOdW1iZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bUZtdCA9PSAiMDAwMSwgMDAwMiwgMDAwMywgLi4uIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkZvcm1hdCgiezA6MDAwMH0iLCBsZXZlbE51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtRm10ID09ICIwMDAwMSwgMDAwMDIsIDAwMDAzLCAuLi4iKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KCJ7MDowMDAwMH0iLCBsZXZlbE51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtRm10ID09ICJidWxsZXQiKQorICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIGlmIChudW1GbXQgPT0gImRlY2ltYWxFbmNsb3NlZENpcmNsZSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsTnVtYmVyID49IDEgJiYgbGV2ZWxOdW1iZXIgPD0gMjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyA5MzExICsgbGV2ZWxOdW1iZXIKKyAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBuZXcgc3RyaW5nKG5ld1tdIHsgKGNoYXIpKDkzMTEgKyBsZXZlbE51bWJlcikgfSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWxOdW1iZXIuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZXZlbE51bWJlci5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvR2V0TGlzdEl0ZW1UZXh0X2ZyX0ZSLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvR2V0TGlzdEl0ZW1UZXh0X2ZyX0ZSLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MGMyZGYKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9HZXRMaXN0SXRlbVRleHRfZnJfRlIuY3MKQEAgLTAsMCArMSwyNDggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgcHVibGljIGNsYXNzIExpc3RJdGVtVGV4dEdldHRlcl9mcl9GUgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gT25lVGhyb3VnaE5pbmV0ZWVuID0geworICAgICAgICAgICAgIiIsICJ1biIsICJkZXV4IiwgInRyb2lzIiwgInF1YXRyZSIsICJjaW5xIiwgInNpeCIsICJzZXB0IiwgImh1aXQiLAorICAgICAgICAgICAgIm5ldWYiLCAiZGl4IiwgIm9uemUiLCAiZG91emUiLCAidHJlaXplIiwgInF1YXRvcnplIiwKKyAgICAgICAgICAgICJxdWluemUiLCAic2VpemUiLCAiZGl4LXNlcHQiLCAiZGl4LWh1aXQiLCAiZGl4LW5ldWYiCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gVGVucyA9IHsKKyAgICAgICAgICAgICIiLCAiZGl4IiwgInZpbmd0IiwgInRyZW50ZSIsICJxdWFyYW50ZSIsICJjaW5xdWFudGUiLCAic29peGFudGUiLCAic29peGFudGUtZGl4IiwKKyAgICAgICAgICAgICJxdWF0cmUtdmluZ3QiLCAicXVhdHJlLXZpbmd0LWRpeCIKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBPcmRpbmFsT25lVGhyb3VnaE5pbmV0ZWVuID0geworICAgICAgICAgICAgIiIsICJ1bmnDqG1lIiwgImRldXhpw6htZSIsICJ0cm9pc2nDqG1lIiwgInF1YXRyacOobWUiLCAiY2lucXVpw6htZSIsICJzaXhpw6htZSIsCisgICAgICAgICAgICAic2VwdGnDqG1lIiwgImh1aXRpw6htZSIsICJuZXV2acOobWUiLCAiZGl4acOobWUiLCAib256acOobWUiLCAiZG91emnDqG1lIiwKKyAgICAgICAgICAgICJ0cmVpemnDqG1lIiwgInF1YXRvcnppw6htZSIsICJxdWluemnDqG1lIiwgInNlaXppw6htZSIsCisgICAgICAgICAgICAiZGl4LXNlcHRpw6htZSIsICJkaXgtaHVpdGnDqG1lIiwgImRpeC1uZXV2acOobWUiCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gT3JkaW5hbFRlbnRocyA9IHsKKyAgICAgICAgICAgICIiLCAiZGl4acOobWUiLCAidmluZ3Rpw6htZSIsICJ0cmVudGnDqG1lIiwgInF1YXJhbnRpw6htZSIsICJjaW5xdWFudGnDqG1lIiwKKyAgICAgICAgICAgICJzb2l4YW50acOobWUiLCAic29peGFudGUtZGl4acOobWUiLCAicXVhdHJlLXZpbmd0acOobWUiLCAicXVhdHJlLXZpbmd0LWRpeGnDqG1lIgorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ1tdIE9yZGluYWxUZW50aHNQbHVzID0geworICAgICAgICAgICAgIiIsICIiLCAidmluZ3QiLCAidHJlbnRlIiwgInF1YXJhbnRlIiwgImNpbnF1YW50ZSIsCisgICAgICAgICAgICAic29peGFudGUiLCAiIiwgInF1YXRyZS12aW5ndCIsICIiCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0TGlzdEl0ZW1UZXh0KHN0cmluZyBsYW5ndWFnZUN1bHR1cmVOYW1lLCBpbnQgbGV2ZWxOdW1iZXIsIHN0cmluZyBudW1GbXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChudW1GbXQgPT0gImNhcmRpbmFsVGV4dCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgICAgICAgICAgICAgICAgdmFyIHNMZXZlbCA9IChsZXZlbE51bWJlciArIDEwMDAwKS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIGludCB0aG91c2FuZHMgPSBpbnQuUGFyc2Uoc0xldmVsLlN1YnN0cmluZygxLCAxKSk7CisgICAgICAgICAgICAgICAgaW50IGh1bmRyZWRzID0gaW50LlBhcnNlKHNMZXZlbC5TdWJzdHJpbmcoMiwgMSkpOworICAgICAgICAgICAgICAgIGludCB0ZW5zID0gaW50LlBhcnNlKHNMZXZlbC5TdWJzdHJpbmcoMywgMSkpOworICAgICAgICAgICAgICAgIGludCBvbmVzID0gaW50LlBhcnNlKHNMZXZlbC5TdWJzdHJpbmcoNCwgMSkpOworCisgICAgICAgICAgICAgICAgLyogZXhhY3QgdGhvdXNhbmRzICovCisgICAgICAgICAgICAgICAgaWYgKGxldmVsTnVtYmVyID09IDEwMDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWlsbGUiOworICAgICAgICAgICAgICAgIGlmIChsZXZlbE51bWJlciA+IDEwMDAgJiYgaHVuZHJlZHMgPT0gMCAmJiB0ZW5zID09IDAgJiYgb25lcyA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gT25lVGhyb3VnaE5pbmV0ZWVuW3Rob3VzYW5kc10gKyAiIG1pbGxlIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsgcmVzdWx0LlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiA+IDEwMDAgKi8KKyAgICAgICAgICAgICAgICBpZiAobGV2ZWxOdW1iZXIgPiAxMDAwICYmIGxldmVsTnVtYmVyIDwgMjAwMCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gIm1pbGxlICI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWxOdW1iZXIgPiAyMDAwICYmIGxldmVsTnVtYmVyIDwgMTAwMDApCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IE9uZVRocm91Z2hOaW5ldGVlblt0aG91c2FuZHNdICsgIiBtaWxsZSAiOworCisgICAgICAgICAgICAgICAgLyogZXhhY3QgaHVuZHJlZHMgKi8KKyAgICAgICAgICAgICAgICBpZiAoaHVuZHJlZHMgPiAwICYmIHRlbnMgPT0gMCAmJiBvbmVzID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaHVuZHJlZHMgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiY2VudCI7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBPbmVUaHJvdWdoTmluZXRlZW5baHVuZHJlZHNdICsgIiBjZW50cyI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoKSArIHJlc3VsdC5TdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogPiAxMDAgKi8KKyAgICAgICAgICAgICAgICBpZiAoaHVuZHJlZHMgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGh1bmRyZWRzID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gImNlbnQgIjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IE9uZVRocm91Z2hOaW5ldGVlbltodW5kcmVkc10gKyAiIGNlbnQgIjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBleGFjdCB0ZW5zICovCisgICAgICAgICAgICAgICAgaWYgKHRlbnMgPiAwICYmIG9uZXMgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW5zID09IDgpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gInF1YXRyZS12aW5ndHMiOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gVGVuc1t0ZW5zXTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsgcmVzdWx0LlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiA3MS03OSAqLworICAgICAgICAgICAgICAgIGlmICh0ZW5zID09IDcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAob25lcyA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFRlbnNbNl0gKyAiIGV0ICIgKyBPbmVUaHJvdWdoTmluZXRlZW5bb25lcyArIDEwXTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFRlbnNbNl0gKyAiLSIgKyBPbmVUaHJvdWdoTmluZXRlZW5bb25lcyArIDEwXTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsgcmVzdWx0LlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiA5MS05OSAqLworICAgICAgICAgICAgICAgIGlmICh0ZW5zID09IDkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gVGVuc1s4XSArICItIiArIE9uZVRocm91Z2hOaW5ldGVlbltvbmVzICsgMTBdOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKyByZXN1bHQuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0ZW5zID49IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAob25lcyA9PSAxICYmIHRlbnMgIT0gOCAmJiB0ZW5zICE9IDkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gVGVuc1t0ZW5zXSArICIgZXQgdW4iOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gVGVuc1t0ZW5zXSArICItIiArIE9uZVRocm91Z2hOaW5ldGVlbltvbmVzXTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsgcmVzdWx0LlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWxOdW1iZXIgPCAyMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBPbmVUaHJvdWdoTmluZXRlZW5bdGVucyAqIDEwICsgb25lc107CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoKSArIHJlc3VsdC5TdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IE9uZVRocm91Z2hOaW5ldGVlblt0ZW5zICogMTAgKyBvbmVzXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKyByZXN1bHQuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bUZtdCA9PSAib3JkaW5hbCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeDsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWxOdW1iZXIgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gImVyIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJlIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWxOdW1iZXIuVG9TdHJpbmcoKSArIHN1ZmZpeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1GbXQgPT0gIm9yZGluYWxUZXh0IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWxOdW1iZXIgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQcmVtaWVyIjsKKworICAgICAgICAgICAgICAgIHZhciBzTGV2ZWwgPSAobGV2ZWxOdW1iZXIgKyAxMDAwMCkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpbnQgdGhvdXNhbmRzID0gaW50LlBhcnNlKHNMZXZlbC5TdWJzdHJpbmcoMSwgMSkpOworICAgICAgICAgICAgICAgIGludCBodW5kcmVkcyA9IGludC5QYXJzZShzTGV2ZWwuU3Vic3RyaW5nKDIsIDEpKTsKKyAgICAgICAgICAgICAgICBpbnQgdGVucyA9IGludC5QYXJzZShzTGV2ZWwuU3Vic3RyaW5nKDMsIDEpKTsKKyAgICAgICAgICAgICAgICBpbnQgb25lcyA9IGludC5QYXJzZShzTGV2ZWwuU3Vic3RyaW5nKDQsIDEpKTsKKworICAgICAgICAgICAgICAgIC8qIGV4YWN0IHRob3VzYW5kcyAqLworICAgICAgICAgICAgICAgIGlmIChsZXZlbE51bWJlciA9PSAxMDAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk1pbGxpw6htZSI7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsTnVtYmVyID4gMTAwMCAmJiBodW5kcmVkcyA9PSAwICYmIHRlbnMgPT0gMCAmJiBvbmVzID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBPbmVUaHJvdWdoTmluZXRlZW5bdGhvdXNhbmRzXSArICIgbWlsbGnDqG1lIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsgcmVzdWx0LlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiA+IDEwMDAgKi8KKyAgICAgICAgICAgICAgICBpZiAobGV2ZWxOdW1iZXIgPiAxMDAwICYmIGxldmVsTnVtYmVyIDwgMjAwMCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gIm1pbGxlICI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWxOdW1iZXIgPiAyMDAwICYmIGxldmVsTnVtYmVyIDwgMTAwMDApCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IE9uZVRocm91Z2hOaW5ldGVlblt0aG91c2FuZHNdICsgIiBtaWxsZSAiOworCisgICAgICAgICAgICAgICAgLyogZXhhY3QgaHVuZHJlZHMgKi8KKyAgICAgICAgICAgICAgICBpZiAoaHVuZHJlZHMgPiAwICYmIHRlbnMgPT0gMCAmJiBvbmVzID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaHVuZHJlZHMgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiY2VudGnDqG1lIjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IE9uZVRocm91Z2hOaW5ldGVlbltodW5kcmVkc10gKyAiIGNlbnRpw6htZSI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoKSArIHJlc3VsdC5TdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogPiAxMDAgKi8KKyAgICAgICAgICAgICAgICBpZiAoaHVuZHJlZHMgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGh1bmRyZWRzID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gImNlbnQgIjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IE9uZVRocm91Z2hOaW5ldGVlbltodW5kcmVkc10gKyAiIGNlbnQgIjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBleGFjdCB0ZW5zICovCisgICAgICAgICAgICAgICAgaWYgKHRlbnMgPiAwICYmIG9uZXMgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBPcmRpbmFsVGVudGhzW3RlbnNdOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKyByZXN1bHQuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIDcxLTc5ICovCisgICAgICAgICAgICAgICAgaWYgKHRlbnMgPT0gNykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbmVzID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gT3JkaW5hbFRlbnRoc1BsdXNbNl0gKyAiIGV0ICIgKyBPcmRpbmFsT25lVGhyb3VnaE5pbmV0ZWVuW29uZXMgKyAxMF07CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBPcmRpbmFsVGVudGhzUGx1c1s2XSArICItIiArIE9yZGluYWxPbmVUaHJvdWdoTmluZXRlZW5bb25lcyArIDEwXTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsgcmVzdWx0LlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiA5MS05OSAqLworICAgICAgICAgICAgICAgIGlmICh0ZW5zID09IDkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gT3JkaW5hbFRlbnRoc1BsdXNbOF0gKyAiLSIgKyBPcmRpbmFsT25lVGhyb3VnaE5pbmV0ZWVuW29uZXMgKyAxMF07CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoKSArIHJlc3VsdC5TdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRlbnMgPj0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbmVzID09IDEgJiYgdGVucyAhPSA4ICYmIHRlbnMgIT0gOSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBPcmRpbmFsVGVudGhzUGx1c1t0ZW5zXSArICIgZXQgdW5pw6htZSI7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBPcmRpbmFsVGVudGhzUGx1c1t0ZW5zXSArICItIiArIE9yZGluYWxPbmVUaHJvdWdoTmluZXRlZW5bb25lc107CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoKSArIHJlc3VsdC5TdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxldmVsTnVtYmVyIDwgMjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gT3JkaW5hbE9uZVRocm91Z2hOaW5ldGVlblt0ZW5zICogMTAgKyBvbmVzXTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsgcmVzdWx0LlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gT3JkaW5hbE9uZVRocm91Z2hOaW5ldGVlblt0ZW5zICogMTAgKyBvbmVzXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKyByZXN1bHQuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9HZXRMaXN0SXRlbVRleHRfcnVfUlUuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9HZXRMaXN0SXRlbVRleHRfcnVfUlUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2ZjE3ZQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzL0dldExpc3RJdGVtVGV4dF9ydV9SVS5jcwpAQCAtMCwwICsxLDEzNyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgY2xhc3MgTGlzdEl0ZW1UZXh0R2V0dGVyX3J1X1JVCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBPbmVUaHJvdWdoTmluZXRlZW4gPSB7CisgICAgICAgICAgICAi0L7QtNC40L0iLCAi0LTQstCwIiwgItGC0YDQuCIsICLRh9C10YLRi9GA0LUiLCAi0L/Rj9GC0YwiLCAi0YjQtdGB0YLRjCIsICLRgdC10LzRjCIsICLQstC+0YHQtdC80YwiLAorICAgICAgICAgICAgItC00LXQstGP0YLRjCIsICLQtNC10YHRj9GC0YwiLCAi0L7QtNC40L3QvdCw0LTRhtCw0YLRjCIsICLQtNCy0LXQvdCw0LTRhtCw0YLRjCIsICLRgtGA0LjQvdCw0LTRhtCw0YLRjCIsICLRh9C10YLRi9GA0L3QsNC00YbQsNGC0YwiLAorICAgICAgICAgICAgItC/0Y/RgtC90LDQtNGG0LDRgtGMIiwgItGI0LXRgdGC0L3QsNC00YbQsNGC0YwiLCAi0YHQtdC80L3QsNC00YbQsNGC0YwiLCAi0LLQvtGB0LXQvNC90LDQtNGG0LDRgtGMIiwgItC00LXQstGP0YLQvdCw0LTRhtCw0YLRjCIKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBUZW5zID0geworICAgICAgICAgICAgItC00LXRgdGP0YLRjCIsICLQtNCy0LDQtNGG0LDRgtGMIiwgItGC0YDQuNC00YbQsNGC0YwiLCAi0YHQvtGA0L7QuiIsICLQv9GP0YLRjNC00LXRgdGP0YIiLCAi0YjQtdGB0YLRjNC00LXRgdGP0YIiLCAi0YHQtdC80YzQtNC10YHRj9GCIiwKKyAgICAgICAgICAgICLQstC+0YHQtdC80YzQtNC10YHRj9GCIiwgItC00LXQstGP0L3QvtGB0YLQviIKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBPcmRpbmFsT25lVGhyb3VnaE5pbmV0ZWVuID0geworICAgICAgICAgICAgItC/0LXRgNCy0YvQuSIsICLQstGC0L7RgNC+0LkiLCAi0YLRgNC10YLQuNC5IiwgItGH0LXRgtCy0LXRgNGC0YvQuSIsICLQv9GP0YLRi9C5IiwgItGI0LXRgdGC0L7QuSIsCisgICAgICAgICAgICAi0YHQtdC00YzQvNC+0LkiLCAi0LLQvtGB0YzQvNC+0LkiLCAi0LTQtdCy0Y/RgtGL0LkiLCAi0LTQtdGB0Y/RgtGL0LkiLCAi0L7QtNC40L3QvdCw0LTRhtCw0YLRi9C5IiwgItC00LLQtdC90LDQtNGG0LDRgtGL0LkiLAorICAgICAgICAgICAgItGC0YDQuNC90LDQtNGG0LDRgtGL0LkiLCAi0YfQtdGC0YvRgNC90LDQtNGG0LDRgtGL0LkiLCAi0L/Rj9GC0L3QsNC00YbQsNGC0YvQuSIsICLRiNC10YHRgtC90LDQtNGG0LDRgtGL0LkiLAorICAgICAgICAgICAgItGB0LXQvNC90LDQtNGG0LDRgtGL0LkiLCAi0LLQvtGB0LXQvNC90LDQtNGG0LDRgtGL0LkiLCAi0LTQtdCy0Y/RgtC90LDQtNGG0LDRgtGL0LkiCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gT3JkaW5hbFRlbnRocyA9IHsKKyAgICAgICAgICAgICLQtNC10YHRj9GC0YvQuSIsICLQtNCy0LDQtNGG0LDRgtGL0LkiLCAi0YLRgNC40LTRhtCw0YLRi9C5IiwgItGB0L7RgNC+0LrQvtCy0L7QuSIsICLQv9GP0YLQuNC00LXRgdGP0YLRi9C5IiwKKyAgICAgICAgICAgICLRiNC10YHRgtC40LTQtdGB0Y/RgtGL0LkiLCAi0YHQtdC80LjQtNC10YHRj9GC0YvQuSIsICLQstC+0YHRjNC80LjQtNC10YHRj9GC0YvQuSIsICLQtNC10LLRj9C90L7RgdGC0YvQuSIKKyAgICAgICAgfTsKKworICAgICAgICAvLyBUT0RPIHRoaXMgaXMgbm90IGNvcnJlY3QgZm9yIHZhbHVlcyBhYm92ZSA5OQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldExpc3RJdGVtVGV4dChzdHJpbmcgbGFuZ3VhZ2VDdWx0dXJlTmFtZSwgaW50IGxldmVsTnVtYmVyLCBzdHJpbmcgbnVtRm10KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobnVtRm10ID09ICJjYXJkaW5hbFRleHQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgICAgICAgICAgICAgICBpbnQgdDEgPSBsZXZlbE51bWJlciAvIDEwMDA7CisgICAgICAgICAgICAgICAgaW50IHQyID0gbGV2ZWxOdW1iZXIgJSAxMDAwOworICAgICAgICAgICAgICAgIGlmICh0MSA+PSAxKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gT25lVGhyb3VnaE5pbmV0ZWVuW3QxIC0gMV0gKyAiIHRob3VzYW5kIjsKKyAgICAgICAgICAgICAgICBpZiAodDEgPj0gMSAmJiB0MiA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICBpZiAodDEgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgIjsKKyAgICAgICAgICAgICAgICBpbnQgaDEgPSAobGV2ZWxOdW1iZXIgJSAxMDAwKSAvIDEwMDsKKyAgICAgICAgICAgICAgICBpbnQgaDIgPSBsZXZlbE51bWJlciAlIDEwMDsKKyAgICAgICAgICAgICAgICBpZiAoaDEgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IE9uZVRocm91Z2hOaW5ldGVlbltoMSAtIDFdICsgIiBodW5kcmVkIjsKKyAgICAgICAgICAgICAgICBpZiAoaDEgPj0gMSAmJiBoMiA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICBpZiAoaDEgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgIjsKKyAgICAgICAgICAgICAgICBpbnQgeiA9IGxldmVsTnVtYmVyICUgMTAwOworICAgICAgICAgICAgICAgIGlmICh6IDw9IDE5KQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gT25lVGhyb3VnaE5pbmV0ZWVuW3ogLSAxXTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IHogLyAxMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHIgPSB6ICUgMTA7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBUZW5zW3ggLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHIgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiLSIgKyBPbmVUaHJvdWdoTmluZXRlZW5bciAtIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKworICAgICAgICAgICAgICAgICAgICByZXN1bHQuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bUZtdCA9PSAib3JkaW5hbFRleHQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgICAgICAgICAgICAgICBpbnQgdDEgPSBsZXZlbE51bWJlciAvIDEwMDA7CisgICAgICAgICAgICAgICAgaW50IHQyID0gbGV2ZWxOdW1iZXIgJSAxMDAwOworICAgICAgICAgICAgICAgIGlmICh0MSA+PSAxICYmIHQyICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBPbmVUaHJvdWdoTmluZXRlZW5bdDEgLSAxXSArICIgdGhvdXNhbmQiOworICAgICAgICAgICAgICAgIGlmICh0MSA+PSAxICYmIHQyID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gT25lVGhyb3VnaE5pbmV0ZWVuW3QxIC0gMV0gKyAiIHRob3VzYW5kdGgiOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHQxID49IDEpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiICI7CisgICAgICAgICAgICAgICAgaW50IGgxID0gKGxldmVsTnVtYmVyICUgMTAwMCkgLyAxMDA7CisgICAgICAgICAgICAgICAgaW50IGgyID0gbGV2ZWxOdW1iZXIgJSAxMDA7CisgICAgICAgICAgICAgICAgaWYgKGgxID49IDEgJiYgaDIgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IE9uZVRocm91Z2hOaW5ldGVlbltoMSAtIDFdICsgIiBodW5kcmVkIjsKKyAgICAgICAgICAgICAgICBpZiAoaDEgPj0gMSAmJiBoMiA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IE9uZVRocm91Z2hOaW5ldGVlbltoMSAtIDFdICsgIiBodW5kcmVkdGgiOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGgxID49IDEpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiICI7CisgICAgICAgICAgICAgICAgaW50IHogPSBsZXZlbE51bWJlciAlIDEwMDsKKyAgICAgICAgICAgICAgICBpZiAoeiA8PSAxOSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IE9yZGluYWxPbmVUaHJvdWdoTmluZXRlZW5beiAtIDFdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB4ID0geiAvIDEwOworICAgICAgICAgICAgICAgICAgICBpbnQgciA9IHogJSAxMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBPcmRpbmFsVGVudGhzW3ggLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFRlbnNbeCAtIDFdOworICAgICAgICAgICAgICAgICAgICBpZiAociA+PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgIiArIE9yZGluYWxPbmVUaHJvdWdoTmluZXRlZW5bciAtIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKworICAgICAgICAgICAgICAgICAgICByZXN1bHQuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9HZXRMaXN0SXRlbVRleHRfc3ZfU0UuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9HZXRMaXN0SXRlbVRleHRfc3ZfU0UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2ZDRhMAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzL0dldExpc3RJdGVtVGV4dF9zdl9TRS5jcwpAQCAtMCwwICsxLDIyOCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKwlwdWJsaWMgY2xhc3MgTGlzdEl0ZW1UZXh0R2V0dGVyX3N2X1NFCisJeworCQlwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBPbmVUaHJvdWdoTmluZXRlZW4gPSB7CisgICAgICAgICAgICAiIiwgImV0dCIsICJ0dsOlIiwgInRyZSIsICJmeXJhIiwgImZlbSIsICJzZXgiLCAic2p1IiwgIsOldHRhIiwKKyAgICAgICAgICAgICJuaW8iLCAidGlvIiwgImVsdmEiLCAidG9sdiIsICJ0cmV0dG9uIiwgImZqb3J0b24iLAorICAgICAgICAgICAgImZlbXRvbiIsICJzZXh0b24iLCAic2p1dHRvbiIsICJhcnRvbiIsICJuaXR0b24iCisgICAgICAgIH07CisKKwkJcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gVGVucyA9IHsKKyAgICAgICAgICAgICIiLCJ0aW8iLCAidGp1Z28iLCAidHJldHRpbyIsICJmeXJ0aW8iLCAiZmVtdGlvIiwgInNleHRpbyIsICJzanV0dGlvIiwgIsOldHRpbyIsCisgICAgICAgICAgICAibml0dGlvIiwgImV0dGh1bmRyYSIKKyAgICAgICAgfTsKKworCQlwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBPcmRpbmFsT25lVGhyb3VnaE5pbmV0ZWVuID0geworICAgICAgICAgICAgIiIsICJmw7Zyc3RhIiwgImFuZHJhIiwgInRyZWRqZSIsICJmasOkcmRlIiwgImZlbXRlIiwgInNqw6R0dGUiLCAic2p1bmRlIiwKKyAgICAgICAgICAgICLDpXR0b25kZSIsICJuaW9uZGUiLCAidGlvbmRlIiwgImVsZnRlIiwgInRvbGZ0ZSIsICJ0cmV0dG9uZGUiLAorICAgICAgICAgICAgImZqb3J0b25kZSIsICJmZW10b25kZSIsICJzZXh0b25kZSIsICJzanV0dG9uZGUiLAorICAgICAgICAgICAgImFydG9uZGUiLCAibml0dG9uZGUiCisgICAgICAgIH07CisKKwkJcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0TGlzdEl0ZW1UZXh0KHN0cmluZyBsYW5ndWFnZUN1bHR1cmVOYW1lLCBpbnQgbGV2ZWxOdW1iZXIsIHN0cmluZyBudW1GbXQpCisJCXsKKwkJCXN3aXRjaCAobnVtRm10KQorCQkJeworCQkJCWNhc2UgImNhcmRpbmFsVGV4dCI6CisJCQkJCXJldHVybiBOdW1iZXJBc0NhcmRpbmFsVGV4dChsYW5ndWFnZUN1bHR1cmVOYW1lLCBsZXZlbE51bWJlciwgbnVtRm10KTsKKwkJCQljYXNlICJvcmRpbmFsVGV4dCI6CisJCQkJCXJldHVybiBOdW1iZXJBc09yZGluYWxUZXh0KGxhbmd1YWdlQ3VsdHVyZU5hbWUsIGxldmVsTnVtYmVyLCBudW1GbXQpOworCQkJCWNhc2UgIm9yZGluYWwiOgorCQkJCQlyZXR1cm4gTnVtYmVyQXNPcmRpbmFsKGxhbmd1YWdlQ3VsdHVyZU5hbWUsIGxldmVsTnVtYmVyLCBudW1GbXQpOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisJCXByaXZhdGUgc3RhdGljIHN0cmluZyBOdW1iZXJBc0NhcmRpbmFsVGV4dChzdHJpbmcgbGFuZ3VhZ2VDdWx0dXJlTmFtZSwgaW50IGxldmVsTnVtYmVyLCBzdHJpbmcgbnVtRm10KQorCQl7CisJCQlzdHJpbmcgcmVzdWx0ID0gIiI7CisKKwkJCXZhciBzTGV2ZWwgPSAobGV2ZWxOdW1iZXIgKyAxMDAwMCkuVG9TdHJpbmcoKTsKKwkJCWludCB0aG91c2FuZHMgPSBpbnQuUGFyc2Uoc0xldmVsLlN1YnN0cmluZygxLCAxKSk7CisJCQlpbnQgaHVuZHJlZHMgPSBpbnQuUGFyc2Uoc0xldmVsLlN1YnN0cmluZygyLCAxKSk7CisJCQlpbnQgdGVucyA9IGludC5QYXJzZShzTGV2ZWwuU3Vic3RyaW5nKDMsIDEpKTsKKwkJCWludCBvbmVzID0gaW50LlBhcnNlKHNMZXZlbC5TdWJzdHJpbmcoNCwgMSkpOworCisKKwkJCS8vVmFsaWRhdGlvbgorCQkJaWYgKHRob3VzYW5kcyA+IDE5KQorCQkJCXRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oImxldmVsTnVtYmVyIiwgIkNvbnZlcmluZyBhIGxldmVsTnVtYmVyIHRvIG9yZGluYWwgdGV4dCB0aGF0IGlzIGdyZWF0ZXIgdGhlbiAxOSA5OTkgaXMgbm90IHN1cHBvcnRlZCIpOworCQkJaWYgKGxldmVsTnVtYmVyID09IDApCisJCQkJcmV0dXJuICJOb2xsIjsKKwkJCWlmIChsZXZlbE51bWJlciA8IDApCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigibGV2ZWxOdW1iZXIiLCAiQ29udmVydGluZyBhIG5lZ2F0aXZlIGxldmVsTnVtYmVyIHRvIG9yZGluYWwgdGV4dCBpcyBub3Qgc3VwcG9ydGVkIik7CisKKwkJCS8qIGV4YWN0IHRob3VzYW5kcyAqLworCQkJaWYgKGxldmVsTnVtYmVyID09IDEwMDApCisJCQkJcmV0dXJuICJFdHR1c2VuIjsKKwkJCWlmIChsZXZlbE51bWJlciA+IDEwMDAgJiYgaHVuZHJlZHMgPT0gMCAmJiB0ZW5zID09IDAgJiYgb25lcyA9PSAwKQorCQkJeworCQkJCXJlc3VsdCA9IE9uZVRocm91Z2hOaW5ldGVlblt0aG91c2FuZHNdICsgInR1c2VuIjsKKwkJCQlyZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKyByZXN1bHQuU3Vic3RyaW5nKDEpOworCQkJfQorCisJCQkvKiA+IDEwMDAgKi8KKwkJCWlmIChsZXZlbE51bWJlciA+IDEwMDAgJiYgbGV2ZWxOdW1iZXIgPCAyMDAwKQorCQkJCXJlc3VsdCA9ICJldHR1c2VuIjsKKwkJCWVsc2UgaWYgKGxldmVsTnVtYmVyID4gMjAwMCAmJiBsZXZlbE51bWJlciA8IDEwMDAwKQorCQkJCXJlc3VsdCA9IE9uZVRocm91Z2hOaW5ldGVlblt0aG91c2FuZHNdICsgInR1c2VuIjsKKworCQkJLyogZXhhY3QgaHVuZHJlZHMgKi8KKwkJCWlmIChodW5kcmVkcyA+IDAgJiYgdGVucyA9PSAwICYmIG9uZXMgPT0gMCkKKwkJCXsKKwkJCQlpZiAoaHVuZHJlZHMgPT0gMSkKKwkJCQkJcmVzdWx0ICs9ICJldHRodW5kcmEiOworCQkJCWVsc2UKKwkJCQkJcmVzdWx0ICs9IE9uZVRocm91Z2hOaW5ldGVlbltodW5kcmVkc10gKyAiaHVuZHJhIjsKKwkJCQlyZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKyByZXN1bHQuU3Vic3RyaW5nKDEpOworCQkJfQorCisJCQkvKiA+IDEwMCAqLworCQkJaWYgKGh1bmRyZWRzID4gMCkKKwkJCXsKKwkJCQlpZiAoaHVuZHJlZHMgPT0gMSkKKwkJCQkJcmVzdWx0ICs9ICJldHRodW5kcmEiOworCQkJCWVsc2UKKwkJCQkJcmVzdWx0ICs9IE9uZVRocm91Z2hOaW5ldGVlbltodW5kcmVkc10gKyAiaHVuZHJhIjsKKwkJCX0KKworCQkJLyogZXhhY3QgdGVucyAqLworCQkJaWYgKHRlbnMgPiAwICYmIG9uZXMgPT0gMCkKKwkJCXsKKwkJCQlyZXN1bHQgKz0gVGVuc1t0ZW5zXTsKKwkJCQlyZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKyByZXN1bHQuU3Vic3RyaW5nKDEpOworCQkJfQorCisJCQkvKiA+IDIwICovCisJCQlpZiAodGVucyA9PSAxKQorCQkJeworCQkJCXJlc3VsdCArPSBPbmVUaHJvdWdoTmluZXRlZW5bdGVucyAqIDEwICsgb25lc107CisJCQkJcmV0dXJuIHJlc3VsdC5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsgcmVzdWx0LlN1YnN0cmluZygxKTsKKwkJCX0KKwkJCWVsc2UgaWYgKHRlbnMgPiAxKQorCQkJeworCQkJCXJlc3VsdCArPSBUZW5zW3RlbnNdICsgT25lVGhyb3VnaE5pbmV0ZWVuW29uZXNdOyA7CisJCQkJcmV0dXJuIHJlc3VsdC5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsgcmVzdWx0LlN1YnN0cmluZygxKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXN1bHQgKz0gT25lVGhyb3VnaE5pbmV0ZWVuW29uZXNdOworCQkJCXJldHVybiByZXN1bHQuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoKSArIHJlc3VsdC5TdWJzdHJpbmcoMSk7CisJCQl9CisJCX0KKwkJcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIE51bWJlckFzT3JkaW5hbFRleHQoc3RyaW5nIGxhbmd1YWdlQ3VsdHVyZU5hbWUsIGludCBsZXZlbE51bWJlciwgc3RyaW5nIG51bUZtdCkKKwkJeworCQkJc3RyaW5nIHJlc3VsdCA9ICIiOworCisJCQlpZiAobGV2ZWxOdW1iZXIgPD0gMCkKKwkJCQl0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJsZXZlbE51bWJlciIsICJDb252ZXJ0aW5nIGEgemVybyBvciBuZWdhdGl2ZSBsZXZlbE51bWJlciB0byBvcmRpbmFsIHRleHQgaXMgbm90IHN1cHBvcnRlZCIpOworCQkJaWYobGV2ZWxOdW1iZXIgPj0gMTAwMDApCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigibGV2ZWxOdW1iZXIiLCAiQ29udmVyaW5nIGEgbGV2ZWxOdW1iZXIgdG8gb3JkaW5hbCB0ZXh0IHRoYXQgaXMgZ3JlYXRlciB0aGVuIDEwMDAwIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKworCQkJaWYgKGxldmVsTnVtYmVyID09IDEpCisJCQkJcmV0dXJuICJGw7Zyc3RhIjsKKworCQkJdmFyIHNMZXZlbCA9IChsZXZlbE51bWJlciArIDEwMDAwKS5Ub1N0cmluZygpOworCQkJaW50IHRob3VzYW5kcyA9IGludC5QYXJzZShzTGV2ZWwuU3Vic3RyaW5nKDEsIDEpKTsKKwkJCWludCBodW5kcmVkcyA9IGludC5QYXJzZShzTGV2ZWwuU3Vic3RyaW5nKDIsIDEpKTsKKwkJCWludCB0ZW5zID0gaW50LlBhcnNlKHNMZXZlbC5TdWJzdHJpbmcoMywgMSkpOworCQkJaW50IG9uZXMgPSBpbnQuUGFyc2Uoc0xldmVsLlN1YnN0cmluZyg0LCAxKSk7CisKKworCQkJLyogZXhhY3QgdGhvdXNhbmRzICovCisJCQlpZiAobGV2ZWxOdW1iZXIgPT0gMTAwMCkKKwkJCQlyZXR1cm4gIkV0dHVzZW5kZSI7CisJCQlpZiAobGV2ZWxOdW1iZXIgPiAxMDAwICYmIGh1bmRyZWRzID09IDAgJiYgdGVucyA9PSAwICYmIG9uZXMgPT0gMCkKKwkJCXsKKwkJCQlyZXN1bHQgPSBPbmVUaHJvdWdoTmluZXRlZW5bdGhvdXNhbmRzXSArICJ0dXNlbmRlIjsKKwkJCQlyZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKyByZXN1bHQuU3Vic3RyaW5nKDEpOworCQkJfQorCisJCQkvKiA+IDEwMDAgKi8KKwkJCWlmIChsZXZlbE51bWJlciA+IDEwMDAgJiYgbGV2ZWxOdW1iZXIgPCAyMDAwKQorCQkJCXJlc3VsdCA9ICJldHR1c2VuIjsKKwkJCWVsc2UgaWYgKGxldmVsTnVtYmVyID4gMjAwMCAmJiBsZXZlbE51bWJlciA8IDEwMDAwKQorCQkJCXJlc3VsdCA9IE9uZVRocm91Z2hOaW5ldGVlblt0aG91c2FuZHNdICsgInR1c2VuZGUiOworCisJCQkvKiBleGFjdCBodW5kcmVkcyAqLworCQkJaWYgKGh1bmRyZWRzID4gMCAmJiB0ZW5zID09IDAgJiYgb25lcyA9PSAwKQorCQkJeworCQkJCWlmIChodW5kcmVkcyA9PSAxKQorCQkJCQlyZXN1bHQgKz0gImV0dGh1bmRyYWRlIjsKKwkJCQllbHNlCisJCQkJCXJlc3VsdCArPSBPbmVUaHJvdWdoTmluZXRlZW5baHVuZHJlZHNdICsgImh1bmRyYWRlIjsKKwkJCQlyZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKyByZXN1bHQuU3Vic3RyaW5nKDEpOworCQkJfQorCisJCQkvKiA+IDEwMCAqLworCQkJaWYgKGh1bmRyZWRzID4gMCkKKwkJCXsKKwkJCQlyZXN1bHQgKz0gT25lVGhyb3VnaE5pbmV0ZWVuW2h1bmRyZWRzXSArICJodW5kcmEiOworCQkJfQorCisJCQkvKiBleGFjdCB0ZW5zICovCisJCQlpZiAodGVucyA+IDAgJiYgb25lcyA9PSAwKQorCQkJeworCQkJCXJlc3VsdCArPSBUZW5zW3RlbnNdICsgIm5kZSI7CisJCQkJcmV0dXJuIHJlc3VsdC5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsgcmVzdWx0LlN1YnN0cmluZygxKTsKKwkJCX0KKworCQkJLyogPiAyMCAqLworCQkJaWYgKHRlbnMgPT0gMSkKKwkJCXsKKwkJCQlyZXN1bHQgKz0gT3JkaW5hbE9uZVRocm91Z2hOaW5ldGVlblt0ZW5zICogMTAgKyBvbmVzXTsKKwkJCQlyZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKyByZXN1bHQuU3Vic3RyaW5nKDEpOworCQkJfQorCQkJZWxzZSBpZiAodGVucyA+IDEpCisJCQl7CisJCQkJcmVzdWx0ICs9IFRlbnNbdGVuc10gKyBPcmRpbmFsT25lVGhyb3VnaE5pbmV0ZWVuW29uZXNdOyA7CisJCQkJcmV0dXJuIHJlc3VsdC5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsgcmVzdWx0LlN1YnN0cmluZygxKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXN1bHQgKz0gT3JkaW5hbE9uZVRocm91Z2hOaW5ldGVlbltvbmVzXTsKKwkJCQlyZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKyByZXN1bHQuU3Vic3RyaW5nKDEpOworCQkJfQorCQl9CisJCXByaXZhdGUgc3RhdGljIHN0cmluZyBOdW1iZXJBc09yZGluYWwoc3RyaW5nIGxhbmd1YWdlQ3VsdHVyZU5hbWUsIGludCBsZXZlbE51bWJlciwgc3RyaW5nIG51bUZtdCkKKwkJeworCQkJc3RyaW5nIGxldmVsQXNTdHJpbmcgPSBsZXZlbE51bWJlci5Ub1N0cmluZygpOworCisgICAgICAgICAgICBpZiAobGV2ZWxBc1N0cmluZyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIGlmIChsZXZlbEFzU3RyaW5nLlRyaW0oKSA9PSAiIikKKwkJCQlyZXR1cm4gIiI7CisKKwkJCWlmKGxldmVsQXNTdHJpbmcuRW5kc1dpdGgoIjEiKSkKKwkJCQlyZXR1cm4gbGV2ZWxBc1N0cmluZyArICI6YSI7CisJCQllbHNlIGlmKGxldmVsQXNTdHJpbmcuRW5kc1dpdGgoIjIiKSkKKwkJCQlyZXR1cm4gbGV2ZWxBc1N0cmluZyArICI6YSI7CisJCQllbHNlCisJCQkJcmV0dXJuIGxldmVsQXNTdHJpbmcgKyAiOmUiOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvR2V0TGlzdEl0ZW1UZXh0X3RyX1RSLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvR2V0TGlzdEl0ZW1UZXh0X3RyX1RSLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NWJiODgKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9HZXRMaXN0SXRlbVRleHRfdHJfVFIuY3MKQEAgLTAsMCArMSwyMzQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEF5YmVyayBDQUwKK0Nvb3JkaW5hdG9yOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPcGVuWG1sUG93ZXJUb29scworeworICAgIHB1YmxpYyBjbGFzcyBMaXN0SXRlbVRleHRHZXR0ZXJfdHJfVFIKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ1tdIFJvbWFuT25lcyA9CisgICAgICAgIHsKKyAgICAgICAgICAgICIiLCAiSSIsICJJSSIsICJJSUkiLCAiSVYiLCAiViIsICJWSSIsICJWSUkiLCAiVklJSSIsICJJWCIKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBSb21hblRlbnMgPQorICAgICAgICB7CisgICAgICAgICAgICAiIiwgIlgiLCAiWFgiLCAiWFhYIiwgIlhMIiwgIkwiLCAiTFgiLCAiTFhYIiwgIkxYWFgiLCAiWEMiCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gUm9tYW5IdW5kcmVkcyA9CisgICAgICAgIHsKKyAgICAgICAgICAgICIiLCAiQyIsICJDQyIsICJDQ0MiLCAiQ0QiLCAiRCIsICJEQyIsICJEQ0MiLCAiRENDQyIsICJDTSIsICJNIgorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ1tdIFJvbWFuVGhvdXNhbmRzID0KKyAgICAgICAgeworICAgICAgICAgICAgIiIsICJNIiwgIk1NIiwgIk1NTSIsICJNTU1NIiwgIk1NTU1NIiwgIk1NTU1NTSIsICJNTU1NTU1NIiwgIk1NTU1NTU1NIiwKKyAgICAgICAgICAgICJNTU1NTU1NTU0iLCAiTU1NTU1NTU1NTSIKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBPbmVUaHJvdWdoTmluZXRlZW4gPSB7CisgICAgICAgICAgICAiYmlyIiwgImlraSIsICLDvMOnIiwgImTDtnJ0IiwgImJlxZ8iLCAiYWx0xLEiLCAieWVkaSIsICJzZWtpeiIsCisgICAgICAgICAgICAiZG9rdXoiLCAib24iLCAib25iaXIiLCAib25pa2kiLCAib27DvMOnIiwgIm9uZMO2cnQiLAorICAgICAgICAgICAgIm9uYmXFnyIsICJvbmFsdMSxIiwgIm9ueWVkaSIsICJvbnNla2l6IiwgIm9uZG9rdXoiCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gVGVucyA9IHsKKyAgICAgICAgICAgICJvbiIsICJ5aXJtaSIsICJvdHV6IiwgImvEsXJrIiwgImVsbGkiLCAiYWx0bcSxxZ8iLCAieWV0bWnFnyIsCisgICAgICAgICAgICAic2Vrc2VuIiwgImRva3NhbiIKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBPcmRpbmFsT25lVGhyb3VnaE5pbmV0ZWVuID0geworICAgICAgICAgICAgImJpcmluY2kiLCAiaWtpbmNpIiwgIsO8w6fDvG5jw7wiLCAiZMO2cmTDvG5jw7wiLCAiYmXFn2luY2kiLCAiYWx0xLFuY8SxIiwKKyAgICAgICAgICAgICJ5ZWRpbmNpIiwgInNla2l6aW5jaSIsICJkb2t1enVuY3UiLCAib251bmN1IiwgIm9uYmlyaW5jaSIsICJvbmlraW5jaSIsCisgICAgICAgICAgICAib27DvMOnw7xuY8O8IiwgIm9uZMO2cmTDvG5jw7wiLCAib25iZcWfaW5jaSIsICJvbmFsdMSxbmPEsSIsCisgICAgICAgICAgICAib255ZWRpbmNpIiwgIm9uc2VraXppbmNpIiwgIm9uZG9rdXp1bmN1IgorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ1tdIFR3b1Rocm91Z2hOaW5ldGVlbiA9IHsKKyAgICAgICAgICAgICIiLCAiaWtpIiwgIsO8w6ciLCAiZMO2cnQiLCAiYmXFnyIsICJhbHTEsSIsICJ5ZWRpIiwgInNla2l6IiwKKyAgICAgICAgICAgICJkb2t1eiIsICJvbiIsICJvbmJpciIsICJvbmlraSIsICJvbsO8w6ciLCAib25kw7ZydCIsCisgICAgICAgICAgICAib25iZcWfIiwgIm9uYWx0xLEiLCAib255ZWRpIiwgIm9uc2VraXoiLCAib25kb2t1eiIKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBPcmRpbmFsVGVudGhzID0geworICAgICAgICAgICAgIm9udW5jdSIsICJ5aXJtaW5jaSIsICJvdHV6dW5jdSIsICJrxLFya8SxbmPEsSIsICJlbGxpbmNpIiwKKyAgICAgICAgICAgICJhbHRtxLHFn8SxbmPEsSIsICJ5ZXRtacWfaW5jaSIsICJzZWtzZW5pbmNpIiwgImRva3NhbsSxbmPEsSIKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRMaXN0SXRlbVRleHQoc3RyaW5nIGxhbmd1YWdlQ3VsdHVyZU5hbWUsIGludCBsZXZlbE51bWJlciwgc3RyaW5nIG51bUZtdCkKKyAgICAgICAgeworICAgICAgICAgICAgI3JlZ2lvbgorICAgICAgICAgICAgaWYgKG51bUZtdCA9PSAiZGVjaW1hbCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxldmVsTnVtYmVyLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtRm10ID09ICJkZWNpbWFsWmVybyIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsTnVtYmVyIDw9IDkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiMCIgKyBsZXZlbE51bWJlci5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxldmVsTnVtYmVyLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtRm10ID09ICJ1cHBlclJvbWFuIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgb25lcyA9IGxldmVsTnVtYmVyICUgMTA7CisgICAgICAgICAgICAgICAgaW50IHRlbnMgPSAobGV2ZWxOdW1iZXIgJSAxMDApIC8gMTA7CisgICAgICAgICAgICAgICAgaW50IGh1bmRyZWRzID0gKGxldmVsTnVtYmVyICUgMTAwMCkgLyAxMDA7CisgICAgICAgICAgICAgICAgaW50IHRob3VzYW5kcyA9IGxldmVsTnVtYmVyIC8gMTAwMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gUm9tYW5UaG91c2FuZHNbdGhvdXNhbmRzXSArIFJvbWFuSHVuZHJlZHNbaHVuZHJlZHNdICsKKyAgICAgICAgICAgICAgICAgICAgUm9tYW5UZW5zW3RlbnNdICsgUm9tYW5PbmVzW29uZXNdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bUZtdCA9PSAibG93ZXJSb21hbiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG9uZXMgPSBsZXZlbE51bWJlciAlIDEwOworICAgICAgICAgICAgICAgIGludCB0ZW5zID0gKGxldmVsTnVtYmVyICUgMTAwKSAvIDEwOworICAgICAgICAgICAgICAgIGludCBodW5kcmVkcyA9IChsZXZlbE51bWJlciAlIDEwMDApIC8gMTAwOworICAgICAgICAgICAgICAgIGludCB0aG91c2FuZHMgPSBsZXZlbE51bWJlciAvIDEwMDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIChSb21hblRob3VzYW5kc1t0aG91c2FuZHNdICsgUm9tYW5IdW5kcmVkc1todW5kcmVkc10gKworICAgICAgICAgICAgICAgICAgICBSb21hblRlbnNbdGVuc10gKyBSb21hbk9uZXNbb25lc10pLlRvTG93ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1GbXQgPT0gInVwcGVyTGV0dGVyIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgYSA9ICJBQkPDh0RFRkfEnkhJxLBKS0xNTk/DllBSU8WeVFXDnFZZWiI7CisgICAgICAgICAgICAgICAgLy9zdHJpbmcgYSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7CisgICAgICAgICAgICAgICAgaW50IGMgPSAobGV2ZWxOdW1iZXIgLSAxKSAvIDI5OworICAgICAgICAgICAgICAgIGludCBuID0gKGxldmVsTnVtYmVyIC0gMSkgJSAyOTsKKyAgICAgICAgICAgICAgICBjaGFyIHggPSBhW25dOworICAgICAgICAgICAgICAgIHJldHVybiAiIi5QYWRSaWdodChjICsgMSwgeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtRm10ID09ICJsb3dlckxldHRlciIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGEgPSAiYWJjw6dkZWZnxJ9oxLFpamtsbW5vw7ZwcnPFn3R1w7x2eXoiOworICAgICAgICAgICAgICAgIGludCBjID0gKGxldmVsTnVtYmVyIC0gMSkgLyAyOTsKKyAgICAgICAgICAgICAgICBpbnQgbiA9IChsZXZlbE51bWJlciAtIDEpICUgMjk7CisgICAgICAgICAgICAgICAgY2hhciB4ID0gYVtuXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiIuUGFkUmlnaHQoYyArIDEsIHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bUZtdCA9PSAib3JkaW5hbCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeDsKKyAgICAgICAgICAgICAgICAvKmlmIChsZXZlbE51bWJlciAlIDEwMCA9PSAxMSB8fCBsZXZlbE51bWJlciAlIDEwMCA9PSAxMiB8fAorICAgICAgICAgICAgICAgICAgICBsZXZlbE51bWJlciAlIDEwMCA9PSAxMykKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gInRoIjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbE51bWJlciAlIDEwID09IDEpCisgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJzdCI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWxOdW1iZXIgJSAxMCA9PSAyKQorICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAibmQiOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsTnVtYmVyICUgMTAgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gInJkIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJ0aCI7Ki8KKyAgICAgICAgICAgICAgICBzdWZmaXggPSAiLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxldmVsTnVtYmVyLlRvU3RyaW5nKCkgKyBzdWZmaXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtRm10ID09ICJjYXJkaW5hbFRleHQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgICAgICAgICAgICAgICBpbnQgdDEgPSBsZXZlbE51bWJlciAvIDEwMDA7CisgICAgICAgICAgICAgICAgaW50IHQyID0gbGV2ZWxOdW1iZXIgJSAxMDAwOworICAgICAgICAgICAgICAgIGlmICh0MSA+PSAxKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gT25lVGhyb3VnaE5pbmV0ZWVuW3QxIC0gMV0gKyAiIHnDvHoiOworICAgICAgICAgICAgICAgIGlmICh0MSA+PSAxICYmIHQyID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoKSArCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIGlmICh0MSA+PSAxKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiAiOworICAgICAgICAgICAgICAgIGludCBoMSA9IChsZXZlbE51bWJlciAlIDEwMDApIC8gMTAwOworICAgICAgICAgICAgICAgIGludCBoMiA9IGxldmVsTnVtYmVyICUgMTAwOworICAgICAgICAgICAgICAgIGlmIChoMSA+PSAxKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gT25lVGhyb3VnaE5pbmV0ZWVuW2gxIC0gMV0gKyAiIGJpbiI7CisgICAgICAgICAgICAgICAgaWYgKGgxID49IDEgJiYgaDIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5TdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgaWYgKGgxID49IDEpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiICI7CisgICAgICAgICAgICAgICAgaW50IHogPSBsZXZlbE51bWJlciAlIDEwMDsKKyAgICAgICAgICAgICAgICBpZiAoeiA8PSAxOSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IE9uZVRocm91Z2hOaW5ldGVlblt6IC0gMV07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHggPSB6IC8gMTA7CisgICAgICAgICAgICAgICAgICAgIGludCByID0geiAlIDEwOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gVGVuc1t4IC0gMV07CisgICAgICAgICAgICAgICAgICAgIGlmIChyID49IDEpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gLyoiLSIgKyAqL09uZVRocm91Z2hOaW5ldGVlbltyIC0gMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoKSArCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5TdWJzdHJpbmcoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgICAgICBpZiAobnVtRm10ID09ICJvcmRpbmFsVGV4dCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHJlc3VsdCA9ICIiOworICAgICAgICAgICAgICAgIGludCB0MSA9IGxldmVsTnVtYmVyIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBpbnQgdDIgPSBsZXZlbE51bWJlciAlIDEwMDA7CisgICAgICAgICAgICAgICAgaWYgKHQxID49IDEgJiYgdDIgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFR3b1Rocm91Z2hOaW5ldGVlblt0MSAtIDFdICsgImJpbiI7CisgICAgICAgICAgICAgICAgaWYgKHQxID49IDEgJiYgdDIgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBUd29UaHJvdWdoTmluZXRlZW5bdDEgLSAxXSArICJiaW5pbmNpIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5TdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vaWYgKHQxID49IDEpCisgICAgICAgICAgICAgICAgLy8gICAgcmVzdWx0ICs9ICIgIjsKKyAgICAgICAgICAgICAgICBpbnQgaDEgPSAobGV2ZWxOdW1iZXIgJSAxMDAwKSAvIDEwMDsKKyAgICAgICAgICAgICAgICBpbnQgaDIgPSBsZXZlbE51bWJlciAlIDEwMDsKKyAgICAgICAgICAgICAgICBpZiAoaDEgPj0gMSAmJiBoMiAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gVHdvVGhyb3VnaE5pbmV0ZWVuW2gxIC0gMV0gKyAiecO8eiI7CisgICAgICAgICAgICAgICAgaWYgKGgxID49IDEgJiYgaDIgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBUd29UaHJvdWdoTmluZXRlZW5baDEgLSAxXSArICJ5w7x6w7xuY8O8IjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5TdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vaWYgKGgxID49IDEpCisgICAgICAgICAgICAgICAgLy8gICAgcmVzdWx0ICs9ICIgIjsKKyAgICAgICAgICAgICAgICBpbnQgeiA9IGxldmVsTnVtYmVyICUgMTAwOworICAgICAgICAgICAgICAgIGlmICh6IDw9IDE5KQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gT3JkaW5hbE9uZVRocm91Z2hOaW5ldGVlblt6IC0gMV07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHggPSB6IC8gMTA7CisgICAgICAgICAgICAgICAgICAgIGludCByID0geiAlIDEwOworICAgICAgICAgICAgICAgICAgICBpZiAociA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IE9yZGluYWxUZW50aHNbeCAtIDFdOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gVGVuc1t4IC0gMV07CisgICAgICAgICAgICAgICAgICAgIGlmIChyID49IDEpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gT3JkaW5hbE9uZVRocm91Z2hOaW5ldGVlbltyIC0gMV07IC8vcmVzdWx0ICs9ICItIiArIE9yZGluYWxPbmVUaHJvdWdoTmluZXRlZW5bciAtIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgKworICAgICAgICAgICAgICAgICAgICByZXN1bHQuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bUZtdCA9PSAiMDAwMSwgMDAwMiwgMDAwMywgLi4uIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkZvcm1hdCgiezA6MDAwMH0iLCBsZXZlbE51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtRm10ID09ICJidWxsZXQiKQorICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIHJldHVybiBsZXZlbE51bWJlci5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvR2V0TGlzdEl0ZW1UZXh0X3poX0NOLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvR2V0TGlzdEl0ZW1UZXh0X3poX0NOLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MmJmODQKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9HZXRMaXN0SXRlbVRleHRfemhfQ04uY3MKQEAgLTAsMCArMSwxNDUgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgcHVibGljIGNsYXNzIExpc3RJdGVtVGV4dEdldHRlcl96aF9DTgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0TGlzdEl0ZW1UZXh0KHN0cmluZyBsYW5ndWFnZUN1bHR1cmVOYW1lLCBpbnQgbGV2ZWxOdW1iZXIsIHN0cmluZyBudW1GbXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZ1tdIGNjVERpZ2l0Q2hhcmFjdGVycyA9IG5ld1tdIHsKKyAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAi5LiAIiwKKyAgICAgICAgICAgICAgICAi5LqMIiwKKyAgICAgICAgICAgICAgICAi5LiJIiwKKyAgICAgICAgICAgICAgICAi5ZubIiwKKyAgICAgICAgICAgICAgICAi5LqUIiwKKyAgICAgICAgICAgICAgICAi5YWtIiwKKyAgICAgICAgICAgICAgICAi5LiDIiwKKyAgICAgICAgICAgICAgICAi5YWrIiwKKyAgICAgICAgICAgICAgICAi5LmdIiwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzdHJpbmcgdGVuQ2hhcmFjdGVyID0gIuWNgSI7CisgICAgICAgICAgICBzdHJpbmcgaHVuZHJlZENoYXJhY3RlciA9ICLnmb4iOworICAgICAgICAgICAgc3RyaW5nIHRob3VzYW5kQ2hhcmFjdGVyID0gIuWNgyI7CisgICAgICAgICAgICBzdHJpbmcgYW5kQ2hhcmFjdGVyID0gIuOAhyI7CisKKyAgICAgICAgICAgIHN0cmluZ1tdIGNjRGlnaXRDaGFyYWN0ZXJzID0gbmV3W10geworICAgICAgICAgICAgICAgICLil4siLAorICAgICAgICAgICAgICAgICLkuIAiLAorICAgICAgICAgICAgICAgICLkuowiLAorICAgICAgICAgICAgICAgICLkuIkiLAorICAgICAgICAgICAgICAgICLlm5siLAorICAgICAgICAgICAgICAgICLkupQiLAorICAgICAgICAgICAgICAgICLlha0iLAorICAgICAgICAgICAgICAgICLkuIMiLAorICAgICAgICAgICAgICAgICLlhasiLAorICAgICAgICAgICAgICAgICLkuZ0iLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaW50IHRob3VzYW5kc1JlbWFpbmRlciA9IGxldmVsTnVtYmVyICUgMTAwMDsKKyAgICAgICAgICAgIGludCBodW5kcmVkc1JlbWFpbmRlciA9IGxldmVsTnVtYmVyICUgMTAwOworICAgICAgICAgICAgaW50IHRob3VzYW5kcyA9IGxldmVsTnVtYmVyIC8gMTAwMDsKKyAgICAgICAgICAgIGludCBodW5kcmVkcyA9IChsZXZlbE51bWJlciAlIDEwMDApIC8gMTAwOworICAgICAgICAgICAgaW50IHRlbnMgPSAobGV2ZWxOdW1iZXIgJSAxMDApIC8gMTA7CisgICAgICAgICAgICBpbnQgb25lcyA9IGxldmVsTnVtYmVyICUgMTA7CisKKyAgICAgICAgICAgIGlmIChudW1GbXQgPT0gImNoaW5lc2VDb3VudGluZyIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsTnVtYmVyID49IDEgJiYgbGV2ZWxOdW1iZXIgPD0gOSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNjRGlnaXRDaGFyYWN0ZXJzW2xldmVsTnVtYmVyXTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWxOdW1iZXIgPj0gMTAgJiYgbGV2ZWxOdW1iZXIgPD0gMTkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWxOdW1iZXIgPT0gMTApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVuQ2hhcmFjdGVyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVuQ2hhcmFjdGVyICsgY2NEaWdpdENoYXJhY3RlcnNbb25lc107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsZXZlbE51bWJlciA+PSAxMSAmJiBsZXZlbE51bWJlciA8PSA5OSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbmVzID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2NEaWdpdENoYXJhY3RlcnNbdGVuc10gKyB0ZW5DaGFyYWN0ZXI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjY0RpZ2l0Q2hhcmFjdGVyc1t0ZW5zXSArIHRlbkNoYXJhY3RlciArIGNjRGlnaXRDaGFyYWN0ZXJzW29uZXNdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGV2ZWxOdW1iZXIgPj0gMTAwICYmIGxldmVsTnVtYmVyIDw9IDk5OSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNjRGlnaXRDaGFyYWN0ZXJzW2h1bmRyZWRzXSArIGNjRGlnaXRDaGFyYWN0ZXJzW3RlbnNdICsgY2NEaWdpdENoYXJhY3RlcnNbb25lc107CisgICAgICAgICAgICAgICAgaWYgKGxldmVsTnVtYmVyID49IDEwMDAgJiYgbGV2ZWxOdW1iZXIgPD0gOTk5OSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNjRGlnaXRDaGFyYWN0ZXJzW3Rob3VzYW5kc10gKyBjY0RpZ2l0Q2hhcmFjdGVyc1todW5kcmVkc10gKyBjY0RpZ2l0Q2hhcmFjdGVyc1t0ZW5zXSArIGNjRGlnaXRDaGFyYWN0ZXJzW29uZXNdOworICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbE51bWJlci5Ub1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bUZtdCA9PSAiY2hpbmVzZUNvdW50aW5nVGhvdXNhbmQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChsZXZlbE51bWJlciA+PSAxICYmIGxldmVsTnVtYmVyIDw9IDkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjY1REaWdpdENoYXJhY3RlcnNbbGV2ZWxOdW1iZXJdOworICAgICAgICAgICAgICAgIGlmIChsZXZlbE51bWJlciA+PSAxMCAmJiBsZXZlbE51bWJlciA8PSAxOSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbkNoYXJhY3RlciArIGNjVERpZ2l0Q2hhcmFjdGVyc1tvbmVzXTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWxOdW1iZXIgPj0gMjAgJiYgbGV2ZWxOdW1iZXIgPD0gOTkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjY1REaWdpdENoYXJhY3RlcnNbdGVuc10gKyB0ZW5DaGFyYWN0ZXIgKyBjY1REaWdpdENoYXJhY3RlcnNbb25lc107CisgICAgICAgICAgICAgICAgaWYgKGxldmVsTnVtYmVyID49IDEwMCAmJiBsZXZlbE51bWJlciA8PSA5OTkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaHVuZHJlZHNSZW1haW5kZXIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjY1REaWdpdENoYXJhY3RlcnNbaHVuZHJlZHNdICsgaHVuZHJlZENoYXJhY3RlcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGh1bmRyZWRzUmVtYWluZGVyID49IDEgJiYgaHVuZHJlZHNSZW1haW5kZXIgPD0gOSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjY1REaWdpdENoYXJhY3RlcnNbaHVuZHJlZHNdICsgaHVuZHJlZENoYXJhY3RlciArIGFuZENoYXJhY3RlciArIGNjVERpZ2l0Q2hhcmFjdGVyc1tsZXZlbE51bWJlciAlIDEwXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uZXMgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjY1REaWdpdENoYXJhY3RlcnNbaHVuZHJlZHNdICsgaHVuZHJlZENoYXJhY3RlciArIGNjVERpZ2l0Q2hhcmFjdGVyc1t0ZW5zXSArIHRlbkNoYXJhY3RlcjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNjVERpZ2l0Q2hhcmFjdGVyc1todW5kcmVkc10gKyBodW5kcmVkQ2hhcmFjdGVyICsgY2NURGlnaXRDaGFyYWN0ZXJzW3RlbnNdICsgdGVuQ2hhcmFjdGVyICsgY2NURGlnaXRDaGFyYWN0ZXJzW29uZXNdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGV2ZWxOdW1iZXIgPj0gMTAwMCAmJiBsZXZlbE51bWJlciA8PSA5OTk5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRob3VzYW5kc1JlbWFpbmRlciA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNjVERpZ2l0Q2hhcmFjdGVyc1t0aG91c2FuZHNdICsgdGhvdXNhbmRDaGFyYWN0ZXI7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aG91c2FuZHNSZW1haW5kZXIgPj0gMSAmJiB0aG91c2FuZHNSZW1haW5kZXIgPD0gOSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjY1REaWdpdENoYXJhY3RlcnNbdGhvdXNhbmRzXSArIHRob3VzYW5kQ2hhcmFjdGVyICsgYW5kQ2hhcmFjdGVyICsgR2V0TGlzdEl0ZW1UZXh0KCJ6aF9DTiIsIHRob3VzYW5kc1JlbWFpbmRlciwgbnVtRm10KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRob3VzYW5kc1JlbWFpbmRlciA+PSAxMCAmJiB0aG91c2FuZHNSZW1haW5kZXIgPD0gOTkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2NURGlnaXRDaGFyYWN0ZXJzW3Rob3VzYW5kc10gKyB0aG91c2FuZENoYXJhY3RlciArIGFuZENoYXJhY3RlciArIGNjVERpZ2l0Q2hhcmFjdGVyc1t0ZW5zXSArIHRlbkNoYXJhY3RlciArIGNjVERpZ2l0Q2hhcmFjdGVyc1tvbmVzXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGh1bmRyZWRzUmVtYWluZGVyID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2NURGlnaXRDaGFyYWN0ZXJzW3Rob3VzYW5kc10gKyB0aG91c2FuZENoYXJhY3RlciArIGNjVERpZ2l0Q2hhcmFjdGVyc1todW5kcmVkc10gKyBodW5kcmVkQ2hhcmFjdGVyOworICAgICAgICAgICAgICAgICAgICBpZiAoaHVuZHJlZHNSZW1haW5kZXIgPj0gMSAmJiBodW5kcmVkc1JlbWFpbmRlciA8PSA5KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNjVERpZ2l0Q2hhcmFjdGVyc1t0aG91c2FuZHNdICsgdGhvdXNhbmRDaGFyYWN0ZXIgKyBjY1REaWdpdENoYXJhY3RlcnNbaHVuZHJlZHNdICsgaHVuZHJlZENoYXJhY3RlciArIGFuZENoYXJhY3RlciArIGNjVERpZ2l0Q2hhcmFjdGVyc1tvbmVzXTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNjVERpZ2l0Q2hhcmFjdGVyc1t0aG91c2FuZHNdICsgdGhvdXNhbmRDaGFyYWN0ZXIgKyBjY1REaWdpdENoYXJhY3RlcnNbaHVuZHJlZHNdICsgaHVuZHJlZENoYXJhY3RlciArIGNjVERpZ2l0Q2hhcmFjdGVyc1t0ZW5zXSArIHRlbkNoYXJhY3RlciArIGNjVERpZ2l0Q2hhcmFjdGVyc1tvbmVzXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGxldmVsTnVtYmVyLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtRm10ID09ICJpZGVvZ3JhcGhUcmFkaXRpb25hbCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nW10gaURpZ2l0Q2hhcmFjdGVycyA9IG5ld1tdIHsKKyAgICAgICAgICAgICAgICAgICAgIiAiLAorICAgICAgICAgICAgICAgICAgICAi55SyIiwKKyAgICAgICAgICAgICAgICAgICAgIuS5mSIsCisgICAgICAgICAgICAgICAgICAgICLkuJkiLAorICAgICAgICAgICAgICAgICAgICAi5LiBIiwKKyAgICAgICAgICAgICAgICAgICAgIuaIiiIsCisgICAgICAgICAgICAgICAgICAgICLlt7EiLAorICAgICAgICAgICAgICAgICAgICAi5bqaIiwKKyAgICAgICAgICAgICAgICAgICAgIui+myIsCisgICAgICAgICAgICAgICAgICAgICLlo6wiLAorICAgICAgICAgICAgICAgICAgICAi55m4IiwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGlmIChsZXZlbE51bWJlciA+PSAxICYmIGxldmVsTnVtYmVyIDw9IDEwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaURpZ2l0Q2hhcmFjdGVyc1tsZXZlbE51bWJlcl07CisgICAgICAgICAgICAgICAgcmV0dXJuIGxldmVsTnVtYmVyLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzL0h0bWxUb1dtbENvbnZlcnRlci5jcyBiL09wZW5YbWxQb3dlclRvb2xzL0h0bWxUb1dtbENvbnZlcnRlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTQ3YTgzCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvSHRtbFRvV21sQ29udmVydGVyLmNzCkBAIC0wLDAgKzEsNTQ5IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkRyYXdpbmcuSW1hZ2luZzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUzsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIFN5c3RlbS5XaW5kb3dzLkZvcm1zOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgY2xhc3MgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3MKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTWFqb3JMYXRpbkZvbnQ7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTWlub3JMYXRpbkZvbnQ7CisgICAgICAgIHB1YmxpYyBkb3VibGUgRGVmYXVsdEZvbnRTaXplOworICAgICAgICBwdWJsaWMgWEVsZW1lbnQgRGVmYXVsdFNwYWNpbmdFbGVtZW50OworICAgICAgICBwdWJsaWMgWEVsZW1lbnQgRGVmYXVsdFNwYWNpbmdFbGVtZW50Rm9yUGFyYWdyYXBoc0luVGFibGVzOworICAgICAgICBwdWJsaWMgWEVsZW1lbnQgU2VjdFByOworICAgICAgICBwdWJsaWMgc3RyaW5nIERlZmF1bHRCbG9ja0NvbnRlbnRNYXJnaW47CisgICAgICAgIHB1YmxpYyBzdHJpbmcgQmFzZVVyaUZvckltYWdlczsKKworICAgICAgICBwdWJsaWMgVHdpcCBQYWdlV2lkdGhUd2lwcyB7IGdldCB7IHJldHVybiAobG9uZylTZWN0UHIuRWxlbWVudHMoVy5wZ1N6KS5BdHRyaWJ1dGVzKFcuX3cpLkZpcnN0T3JEZWZhdWx0KCk7IH0gfQorICAgICAgICBwdWJsaWMgVHdpcCBQYWdlTWFyZ2luTGVmdFR3aXBzIHsgZ2V0IHsgcmV0dXJuIChsb25nKVNlY3RQci5FbGVtZW50cyhXLnBnTWFyKS5BdHRyaWJ1dGVzKFcubGVmdCkuRmlyc3RPckRlZmF1bHQoKTsgfSB9CisgICAgICAgIHB1YmxpYyBUd2lwIFBhZ2VNYXJnaW5SaWdodFR3aXBzIHsgZ2V0IHsgcmV0dXJuIChsb25nKVNlY3RQci5FbGVtZW50cyhXLnBnTWFyKS5BdHRyaWJ1dGVzKFcucmlnaHQpLkZpcnN0T3JEZWZhdWx0KCk7IH0gfQorICAgICAgICBwdWJsaWMgRW11IFBhZ2VXaWR0aEVtdXMgeyBnZXQgeyByZXR1cm4gRW11LlR3aXBzVG9FbXVzKFBhZ2VXaWR0aFR3aXBzKTsgfSB9CisgICAgICAgIHB1YmxpYyBFbXUgUGFnZU1hcmdpbkxlZnRFbXVzIHsgZ2V0IHsgcmV0dXJuIEVtdS5Ud2lwc1RvRW11cyhQYWdlTWFyZ2luTGVmdFR3aXBzKTsgfSB9CisgICAgICAgIHB1YmxpYyBFbXUgUGFnZU1hcmdpblJpZ2h0RW11cyB7IGdldCB7IHJldHVybiBFbXUuVHdpcHNUb0VtdXMoUGFnZU1hcmdpblJpZ2h0VHdpcHMpOyB9IH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgSHRtbFRvV21sQ29udmVydGVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIFdtbERvY3VtZW50IENvbnZlcnRIdG1sVG9XbWwoCisgICAgICAgICAgICBzdHJpbmcgZGVmYXVsdENzcywKKyAgICAgICAgICAgIHN0cmluZyBhdXRob3JDc3MsCisgICAgICAgICAgICBzdHJpbmcgdXNlckNzcywKKyAgICAgICAgICAgIFhFbGVtZW50IHhodG1sLAorICAgICAgICAgICAgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIdG1sVG9XbWxDb252ZXJ0ZXJDb3JlLkNvbnZlcnRIdG1sVG9XbWwoZGVmYXVsdENzcywgYXV0aG9yQ3NzLCB1c2VyQ3NzLCB4aHRtbCwgc2V0dGluZ3MsIG51bGwsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBXbWxEb2N1bWVudCBDb252ZXJ0SHRtbFRvV21sKAorICAgICAgICAgICAgc3RyaW5nIGRlZmF1bHRDc3MsCisgICAgICAgICAgICBzdHJpbmcgYXV0aG9yQ3NzLAorICAgICAgICAgICAgc3RyaW5nIHVzZXJDc3MsCisgICAgICAgICAgICBYRWxlbWVudCB4aHRtbCwKKyAgICAgICAgICAgIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzLAorICAgICAgICAgICAgV21sRG9jdW1lbnQgZW1wdHlEb2N1bWVudCwKKyAgICAgICAgICAgIHN0cmluZyBhbm5vdGF0ZWRIdG1sRHVtcEZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSHRtbFRvV21sQ29udmVydGVyQ29yZS5Db252ZXJ0SHRtbFRvV21sKGRlZmF1bHRDc3MsIGF1dGhvckNzcywgdXNlckNzcywgeGh0bWwsIHNldHRpbmdzLCBlbXB0eURvY3VtZW50LCBhbm5vdGF0ZWRIdG1sRHVtcEZpbGVOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBzX0JsYW5rX3dtbF9iYXNlNjQgPSBAIlVFc0RCQlFBQmdBSUFBQUFJUUFKSkllQ2dRRUFBSTRGQUFBVEFBZ0NXME52Ym5SbGJuUmZWSGx3WlhOZExuaHRiQ0NpQkFJb29BQUMKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzAKK2xFMVBnMEFRaHU4bS9nZXlWd1BiZWpER2xQYWc5YWhOclBHOExrUFp5SDVrWi92MTd4MUtTNnFocFZxOWtNQXk3L3ZNQ3pPRDBVcVgKKzBRSThLbXRTMWs5NkxBSWpiYWJNTEdXdjA4ZjRsa1VZaE1sRWFRMmtiQTNJUnNQTGk4RjA3UUFqcWphWXNpSUVkOGM1eWdLMHdNUTYKK01IU1NXNjlGb0ZzLzQwN0lEekVEZnQzcjNYQnBUUUFUNGxCcHNPSGdBWEl4TDBNMFh0SGptc1JEaVN5NnIxK3N2RkltbkN1VkZJRkkKKytjSmszMXppclVOQ2xadDNzRkFPcndpRDhWYUg2dVN3d2JidW1hTHhLb05vSW54NEVwb3crTkw2akdkV3pqWDFrQnlYYWVHMGVhNGsKK05QV1Ztdk5XQWlKbHJzdWtPZEZDbVIzL1FRNE02eEx3N3lscTNSUHQzMVFveG5rT2tqNTJkeDRhNDZycHBMYllxKzEyZ3hBb3BGTk0KK3Z2NkNjVmZvdUZYdVJGakMrOHUvVWV5SmQ0TGtOQnBUOFY3Q0NZbi9NSXhHdWhNaTBMd0QzMXo3WjNOc1pJNVowbVJNdkhWSSs4UC8KK291M2RncWlxWXhvNUJ6NG9hRlpFMjRnMWpyUjd6dTRQcXUyV1FkYml6VGZiZFBnSkFBRC8vd01BVUVzREJCUUFCZ0FJQUFBQUlRQWUKK2tScTM4d0FBQUU0Q0FBQUxBQWdDWDNKbGJITXZMbkpsYkhNZ29nUUNLS0FBQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBakpMYlNnTkJESWJ2QmQ5aHlIMDMyd29pMHRuZVNLRjMKK0l1c0RoSm5zQVhjT3pLVGF2cjJqSUxwUTIxN205T2ZMVDlhYmc1dlVPNmM4QnE5aFdkV2cySnRnUjk5cmVHMjNpd2RRV2NoYm1vSm4KK0RVZk9zR2x1YjlZdlBKR1VvVHlNTWF1aTRyT0dRU1ErSW1ZenNLTmNoY2krVkxxUUhFa0pVNCtSekJ2MWpLdTZ2c2YwVndPYW1hYmEKK1dRMXBaKzlBdGNkWU5sL1dEbDAzR240S1p1L1l5NGtWeUFkaGI5a3VZaXBzU2NaeWpXb3A5U3dhYkREUEpaMlJZcXdLTnVCcG90WDEKK1JQOWZpNDZGTEFtaENZblA4M3gxbkFOYVhnOTAyYUo1eDY4N0h5RlpMQlo5ZS90RGc3TXZhRDRCQUFELy93TUFVRXNEQkJRQUJnQUkKK0FBQUFJUUI4TzVjNUlnRUFBTGtEQUFBY0FBZ0JkMjl5WkM5ZmNtVnNjeTlrYjJOMWJXVnVkQzU0Yld3dWNtVnNjeUNpQkFFb29BQUIKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLeVRUVStFTUJDRzd5YitCOUs3RkZaZGpkbXlGelhacTY3eDNDMVQKK2FJU1dkTVlQL3IwVnN3cktvZ2N1VFdhYXZzL1RTYnRhdjlWVjlBSWVqYk9DcFhIQ0lyREs1Y1lXZ2oxc2IwOHVXWVFrYlM0clowR3cKK0ZwQ3RzK09qMVIxVWtzSWhMRTJEVVVpeEtGaEoxRnh4anFxRVdtTHNHckJoUnp0ZlN3cWxMM2dqMVpNc2dDK1NaTWw5UDRObGc4eG8KK2t3dm1OL2twaTdadEU4aC9aenV0allKcnA1NXJzRFNDNEFoRTRXWVlNcVV2Z0FUYmQrTGd5Zmk0d3VLQVFtMlVkK2cweGNyVi9KUCsKK1FiMFlYb3dqdFJYZ282SHlSbXRRMU1mLzNKcnlTQTk0akl6NUg2UG95TDFCZFBVVWZqa25uc0lMZ1c5NlYvSnVUYWNjenVkMDBNN1MKK1Z1NnFuc2RYYTByaWJFNkpWOWpkLzNxVnZlWmVoQTgrWFBZT0FBRC8vd01BVUVzREJCUUFCZ0FJQUFDcXBrRHQwdGtGY1FJQUFPc0YKK0FBQVJBQUFBZDI5eVpDOWtiMk4xYldWdWRDNTRiV3pzdlFkZ0hFbVdKU1l2YmNwN2YwcjFTdGZnZEtFSWdHQVRKTmlRUUJEc3dZak4KKzVwTHNIV2xISXltcktvSEtaVlpsWFdZV1FNenRuYnozM252dnZmZmVlKys5OTdvN25VNG45OS8vUDF4bVpBRnM5czVLMnNtZUlZQ3EKK3lCOC9mbndmUHlMK3g3LzNIM3o4ZTd4YmxPbGxYamRGdGZ6c285M3h6a2RwdnB4V3MySjU4ZGxIWDcxNXRuM3dVZHEwMlhLV2xkVXkKKy8reWo2N3o1NlBjNCtvMlR4MWVQWnRWMHZjaVhiVW9nbHMyanE5WDBzNC9tYmJ0NmRQZHVNNTNuaTZ3Wkw0cHBYVFhWZVR1ZVZvdTcKKzFmbDVNYzN2WGxYMTdPN2V6dTRPLzdhcXEybmVOTlRmU2JhOHpKcVBGTnlpRDYxYTVVdjY4cnlxRjFsTGY5WVhkeGRaL1hhOTJpYm8KK3E2d3RKa1ZadE5jRWUrZFRBNmI2N0tOMXZYeWtJTFl0UW5qbGtTQ2tQOHdiOVczNmxWZWVLZ1c0eDd0MVhoSU8xYktaRnlzM2pLOEwKK2piNmNHeUNYbXdaeHVTaE51NnZWN3Y2SHpjSFRPcnVpSHc3Z2JkQ2Z5VXVMVWpEZkRIRjM1eFl6QWhEMmpkdWdFUFpwTUZsa3hkSjEKKy9MVkk0eFAzNHVzQWNGaDlYbGZybFlOV2ZCaTBzK1ZiQ3d1QytSNndkSTc4b1RYdkJhQ0h6T3Q1dGlJQldrd2ZuVjBzcXpxYmxJUVIKK1VUd0ZSMzVFNmlKTlNXRk1xdGsxLzg1L3JkS3JSNlIyWnE4KysyaG41OTc5M2YxajBqMzYwZFA4UEZ1WHJmZU52cWR3cXJjUS9OZHQKK1ZyZjBTakdqaG5oM21TMm8zOS8vOCtwSk5uMzcwZDNZTzZmTG1YM0ROSGg4bDdCeGlEWDV0SDFaK3krdkxsNy9nTjRpVHR6ZDI5dm4KK3J1YjArLzJEZlFkRUczNlIxZlJ0VzVIZzdPNUwwN3E0bUxmdXowblZ0dFhDL1YzbTU5NjM4enliNWFTQ0h1enhuK2RWMVhwL1hxeGIKKy9qUEUzVU1ZZnlxWjhhdFIwVWYvVHdBQUFQLy9VRXNEQkJRQUJnQUlBQUFBSVFBdzNVTXBxQVlBQUtRYkFBQVZBQUFBZDI5eVpDOTAKK2FHVnRaUzkwYUdWdFpURXVlRzFzN0ZsUGI5czJGTDhQMkhjZ2RHOWpKM1lhQjNXSzJMR2JMVTBieEc2SEhtbUpsdGhRb2tEU1NYMGIKKzJ1T0FBY082WVljVjJHMkhZVnVCRnRpbCt6VFpPbXdkMEsrd1IxS1N4Vmhla2piWWlxMCtKQkw1NC92L0hoK3BxOWZ1eHd3ZEVpRXAKK1Q5cGUvWExOUXlUeGVVQ1RzTzNkSHZZdnJYbElLcHdFbVBHRXRMMHBrZDYxamZmZnU0clhWVVJpZ21COUl0ZHgyNHVVU3RlWGxxUVAKK3cxaGU1aWxKWUc3TVJZd1Z2SXB3S1JENENPakdiR201Vmx0ZGlqRk5QSlRnR01qZUdvK3BUOUJRay9RMmN1STlCcStKa25yQVoyS2cKK1NSTm5oY0VHQjNXTmtGUFpaUUlkWXRiMmdFL0FqNGJrdnZJUXcxTEJSTnVybVorM3RIRjFDYTluaTVoYXNMYTBybTkrMmJwc1FYQ3cKK2JIaUtjRlF3cmZjYnJTdGJCWDBEWUdvZTErdjF1cjE2UWM4QXNPK0RwbGFXTXMxR2Y2M2V5V21XUVBaeG5uYTMxcXcxWEh5Si9zcWMKK3pLMU9wOU5zWmJKWW9nWmtIeHR6K0xYYWFtTnoyY0Via01VMzUvQ056bWEzdStyZ0RjamlWK2Z3L1N1dDFZYUxONkNJMGVSZ0RxMGQKKzJ1OW4xQXZJbUxQdFN2Z2F3TmRxR1h5R2dtZ29va3V6R1BORUxZcTFHTi9qb2c4QURXUlkwUVNwYVVyRzJJY283dUo0SkNqV0RQQTYKK3dhVVpPK1RMdVNITkMwbGYwRlMxdlE5VERCa3hvL2ZxK2Zldm5qOUZ4dytlSFQvNDZmamh3K01IUDFwQ3pxcHRuSVRsVlMrLy9lelAKK3h4K2pQNTUrOC9MUkY5VjRXY2IvK3NNbnYvejhlVFVRMG1jbXpvc3ZuL3oyN01tTHJ6NzkvYnRIRmZCTmdVZGwrSkRHUktLYjVBanQKKzh4Z1VNMVp4SlNjamNiNFZ3d2pUOG9yTkpKUTR3WnBMQmYyZWloejB6U2xtbVhjY09UckV0ZUFkQWVXakNuaDljczhSZUJDSmlhSVYKK25IZWkyQUh1Y3M0NlhGUmFZVWZ6S3BsNU9FbkNhdVppVXNidFkzeFl4YnVMRThlL3ZVa0tkVE1QUzBmeGJrUWNNZmNZVGhRT1NVSVUKKzBuUDhnSkFLN2U1UzZ0aDFsL3FDU3o1VzZDNUZIVXdyVFRLa0l5ZWFab3UyYVF4K21WYnBEUDUyYkxON0IzVTRxOUo2aXh5NlNNZ0sKK3pDcUVIeExtbVBFNm5pZ2NWNUVjNHBpVkRYNERxNmhLeU1GVStHVmNUeXJ3ZEVnWVI3MkFTRm0xNXBZQWZVdE8zOEZRc1NyZHZzdW0KK3NZc1VpaDVVMGJ5Qk9TOGp0L2hCTjhKeFdvVWQwQ1FxWXorUUJ4Q2lHTzF4VlFYZjVXNkc2SGZ3QTA0V3V2c09KWTY3VDY4R3Qybm8KK2lEUUxFRDB6RVJXK3ZFNjRFNytES1J0allrb05GSFduVnNjMCtidkN6U2hVYnN2aDRnbzNsTW9YWHordWtQdHRMZG1ic0h0VjVjejIKK2lVSzlDSGV5UEhlNUNPamJYNTIzOENUWkk1QVE4MXZVdStMOHJqaDcvL25pdkNpZkw3NGt6Nm93RkdqZGk5aEcyN1RkOGNLdWUwd1oKK0c2Z3BJemVrYWJ3bDdEMUJId2IxT25QaUpNVXBMSTNnVVdjeU1IQndvY0JtRFJKY2ZVUlZOSWh3Q2sxNzNkTkVRcG1SRGlWS3VZVEQKK29obXVwSzN4MFBncmU5UnM2a09JclJ3U3ExMGUyT0VWUFp5Zk5Rb3lScXJRSEdoelJpdWF3Rm1aclZ6SmlJSnVyOE9zcm9VNk03ZTYKK0VjMFVSWWRib2JJMnNUbVVnOGtMMVdDd3NDWTBOUWhhSWJEeUtwejVOV3M0N0dCR0FtMTM2NlBjTGNZTEYra2lHZUdBWkQ3U2VzLzcKK3FHNmNsTWZLbkNKYUR4c00rdUI0aXRWSzNGcWE3QnR3TzR1VHl1d2FDOWpsM25zVEwrVVJQUE1TVUR1Wmppd3BKeWRMMEZIYmF6V1gKK214N3ljZHIyeG5CT2hzYzRCYTlMM1VkaUZzSmxrNitFRGZ0VGs5bGsrY3liclZ3eE53bnFjUFZoN1Q2bnNGTUhVaUhWRnBhUkRRMHoKK2xZVUFTelFuSy85eUU4eDZVUXBVVktPelNiR3lCc0h3cjBrQmRuUmRTOFpqNHF1eXMwc2oybmIyTlN1bGZLS0lHRVRCRVJxeGlkakgKKzRINGRxcUJQUUNWY2Q1aUtvRi9nYms1YjIweTV4VGxMdXZLTm1NSFpjY3pTQ0dmbFZxZG9uc2tXYmdwU0lZTjVLNGtIdWxYS2JwUTcKK3Z5b201UzlJbFhJWS84OVUwZnNKM0Q2c0JOb0RQbHdOQzR4MHByUTlMbFRFb1FxbEVmWDdBaG9IVXpzZ1d1QitGNllocU9DQzJ2d1gKKzVGRC90emxuYVppMGhrT2sycWNoRWhUMkl4VUpRdmFnTEpub080VllQZHU3TEVtV0VUSVJWUkpYcGxic0VUa2tiS2hyNEtyZTJ6MFUKK1FhaWJhcEtWQVlNN0dYL3VlNVpCbzFBM09lVjhjeXBac2ZmYUhQaW5PeCtiektDVVc0ZE5RNVBidnhDeGFBOW11NnBkYjVibmUyOVoKK0VUMHhhN01hZVZZQXM5SlcwTXJTL2pWRk9PZFdheXZXbk1iTHpWdzQ4T0s4eGpCWU5FUXAzQ0VoL1FmMlB5cDhacjkyNkExMXlQZWgKK3RpTDRlS0dKUWRoQVZGK3lqUWZTQmRJT2pxQnhzb00ybURRcGE5cXNkZEpXeXpmckMrNTBDNzRuakswbE80dS96Mm5zb2psejJUbTUKK2VKSEd6aXpzMk5xT0xUUTFlUFpraXNMUU9EL0lHTWVZejJUbEwxbDhkQThjdlFYZkRDWk1TUk5NOEoxS1lPaWhCeVlQSVBrdFI3TjAKKzR5OEFBQUQvL3dNQVVFc0RCQlFBQmdBSUFLU29wa0NEZDdHVU1RUUFBRUlLQUFBUkFBQUFkMjl5WkM5elpYUjBhVzVuY3k1NGJXenMKK3ZRZGdIRW1XSlNZdmJjcDdmMHIxU3RmZ2RLRUlnR0FUSk5pUVFCRHN3WWpONXBMc0hXbEhJeW1yS29IS1pWWmxYV1lXUU16dG5iejMKKzNudnZ2ZmZlZSsrOTk3bzduVTRuOTkvL1AxeG1aQUZzOXM1SzJzbWVJWUNxeUI4L2Zud2ZQeUwreDcvM0gzejhlN3hibE9sbFhqZEYKK3RmenNvOTN4emtkcHZweFdzMko1OGRsSFg3MTV0bjN3VWRxMDJYS1dsZFV5Lyt5ajY3ejU2UGM0K28yVHgxZVBtcnh0cVZtVEVvaGwKKzgyZ3gvZXlqZWR1dUh0MjkyMHpuK1NKcnh0VXFYOUtYNTFXOXlGcjZzNzY0dThqcXQrdlY5clJhckxLMm1CUmwwVjdmM2R2WitmUWoKK0JWTjk5dEc2WGo1U0VOdUxZbHBYVFhYZTRwVkgxZmw1TWMzMWgzbWp2azIvOHNyVGFycGU1TXVXZTd4YjV5WGhVQzJiZWJGcURMVEYKKzE0VkdYODROa010Tmc3aGNsS2JkMWU3T0xZWjdWZFV6KzhadDBNTUxxN3FhNWsxREU3UW9EWUxGMG5XODN3TmsreDVUM3pwRUJrV3YKKzcrN3didzd6cHJ3Tkl2TFY4MkpTWi9XMWo4VmkrdWpzWWxuVjJhUWtwaUpzUGlLZVNsUGlxaDlVMVNLOWVyVEs2eW1SbGxoeVorZWoKK3UrWkxHbFIxL3JyTjJweWFOS3U4TEpsUHAyV2VFZENyUnhkMXRpQU9NNS9ZOTJiNWViWXUyemZaNUhWYnJhamhaVWI0UDlqelFFL24KK1daMU4yN3grdmNxbUJQV2tXcloxVlpxMnMrcEYxWjRRMTlaRVZPOHQ1bVAreS92N3RVZ0d2YnZNRmpTK2dOdS9xR1k1Y0YzWHhlMm4KKzRDT0RCMUhxN2szZFZTVFBkVEhMMzRDNnI5dnJNbjlHZzNsZC9DQS9YczYrczI3YWd1QXk1MzhBSGplamtTL1IvNWZFRlcrdVYvbXoKK1BHdlhSTHlmMVM1NWxwNlZ4ZXFMb3E2cittdzVJeDc2QnJwOGZEZVlhdXFmRk9hc2Nlamd6MWRWMVpvWGQzYnVIKy9jUHpuMVVVWWIKKzkvM2UwM3YzbmdSRDZuMS8vK0dHNysvZDM5MC9OdndiK1g3LzJZUFQzUWZEMzkrRTM2ZjM3eDAvKzNUNCt5Y1A3aDNmUHg3Ky9uVC8KKzNzSHhCdnlmN2V5ZTdqNzA2T3NvK25qeENNcjBaVzNlbGIvQnhPbEMzai9KRnBPNnlOSXZvSFJ0SDR0SGsvcnRrMkpwV2sxeVVrWjUKKy8vdlg2NGxwc3IzdGY5MHNzcko4Um5yQWZPMFJlUEZvVmpTcnAvbTU5MG41UlZaZnVQNkMxdldHNzBnZmZjZjJBVDJYMTUvWDFYcmwKK3Q3bXFzNVV3c0dtNHU3OGZRQ21XN2ZOaVliNXQxcFBYSVlRbEtWMnZ3WG81Ky9LeXRoUVBpRXpUMDVKUXNLSjRuckZFOFR2NWN2dXIKKzE1NjZLK3ZYRUo3OGkyeTFFc0diWE94KzlsRlpYTXpiWFloTlMzL055TWJ6SDVPTFBmMXVqNy9iaysvNGoyeUtjVk5yL2NWOXRtYysKKzg5cmRNNS9kYzUvdG04LzIzV2YzeldmMzNXZWZtczgreFdkejBrVTFtWTIzcEE3TXIvajh2Q3JMNmlxZmZkdDkzL3ZJRWFLWlo2djgKK3FWZ1Zxd1lxK1ZpTlRaTmVQc3Jma1FYTFowVkxUdFNxbUMyeWR6Qm9lNTVZNlR0bGRsMnQyK0FOYmNGdDhPb3FoRGZMMml6UWlYY0QKK1VGYXMrcGl5UFp3V3hPcXZyeGNUWitMR2JuaGwwWkJ1WFpGRmJLdmFmRC9pN3htbWVuNUgvMDhBQUFELy8xQkxBd1FVQUFZQUNBQUEKK0FDRUFGNkFXVGdJQkFBQ3NBUUFBRkFBQUFIZHZjbVF2ZDJWaVUyVjBkR2x1WjNNdWVHMXNqTkRCU2dNeEVBYmd1K0E3TExtMzJaVWkKK3NuUzNJRkx4SW9MNkFHbDJkaHZNWk1KTWFxeFBiOXFxSUY1Nnl5U1pqNWwvdWZwQVg3MERpNlBRcVdaZXF3cUNwY0dGcVZPdkwrdloKK2phb2ttVEFZVHdFNnRRZFJxLzd5WXBuYkRKdG5TS244bEtvb1FWcTBuZHFtRkZ1dHhXNEJqY3dwUWlpUEl6R2FWRXFlTkJwKzI4V1oKK0pZd211WTN6THUzMVZWMWZxMitHejFGb0hKMkZPN0k3aEpDTy9ackJGNUdDYkYyVUh5MmZvMlhpSVRKWkVDbjdvRDk1YUZ6NFpackYKK1B3aWRaUklhMDd3c28wOFQ2UU5WMnB2NmVFS3ZLclR0d3hTSXpjYVhCSE96VUgySmoySnk2RDVoVFh6TGxBVllINjZOOTVTZkh1OUwKK29mOWszSDhCQUFELy93TUFVRXNEQkJRQUJnQUlBQUFBSVFDQVM0VTMyQWdBQUFKQ0FBQWFBQUFBZDI5eVpDOXpkSGxzWlhOWGFYUm8KK1JXWm1aV04wY3k1NGJXenNXMHR6MnpZUXZuZW0vNEhEdXlQSmNxekVFeVhqT0hIaUdlY3BlM3FHS01oaVRSSXNIM2JjWDkvRmdvUW8KK1VoUjNUZWJXazB3UTJHOWYrQmFTc1cvZS9Rb0Q1MEVtcWEraXVUdDVNWFlkR1hscTVVZDNjL2YyNXZMb2xldWttWWhXSWxDUm5MdFAKK01uWGZ2ZjN6anplUFoybjJGTWpVQVFGUmV2WVllM04zazJYeDJXaVVlaHNaaXZSRjZIdUpTdFU2ZStHcGNLVFdhOStUbzBlVnJFYkgKKzQ4a1kvNG9UNWNrMEJiUUxFVDJJMUMzRWhVMXBLcFlSWUsxVkVvb3NmYUdTdTFFb2t2czhQZ0xwc2NqOHBSLzQyUlBJSHArV1l0VGMKK3paUG9yRkRveUNxa2w1d1poWXFQY2tYU3NHSVBybG41UVhsNUtLTU1FVWVKREVBSEZhVWJQOTZhOFZ4cFlPS21WT25oa0JFUFlWRE8KK2U0d25KdzA4YXpJbEJoOFM4UWloMkFwc2lOdmpqSlZaRkFiR0R6cSsyNmpXSlU3R2g0d3BJcUpGV0Iwb0t1eGlscHFFd28rc21PZTUKK3B1cGMyQTk5OHZ0VG92TFlxaFA3L2FSZFJmZFdsdDZXRE0zR3A3anpxcWFsTEFHTnJidllpRmk2VHVpZFhkMUZLaEhMQURSNm5KdzQKK09pUGR0MEFWSytWOWtHdVJCMW1xSDVQdlNmRllQT0hIcFlxeTFIazhFNm5uK3pkQUlTQWw5RUhnNS9NbzlWMTRJMFdhbmFlKzJQdHkKK28yZnRmZU9sV1VYYWUzL2x1eU9ObVA0TE1oOUVNSGVQajh1UkM2M0J6bGdnb3J0eVRFWkh0NHVxSm5QWERpMUI3dHdWeWRIaVhBc2IKK29abmxaOFhjZU1kNGVFSlZZdUhCemdNY3NjNGtrQkN3bU1ZSmZCM2Q0eGt3bW5uNG1Xdm5panhUQlFnS0FMQ3FXSGlzZVJ5NENaaHEKK1lSZ2Izc3IxdGZMdTVXcVJ3WXU1aTFnd2VIdjFQZkZWQWpRNmQxKy8xcGd3dUpDaC85bGZyYVF1RU1YWWJiVHhWL0t2all4dVU3bmEKK2p2KzRSSG91SkhvcWp6SlEvM1NHV1JDa3E0Ky9QQmxybWdUUmtkQVIvcW9YQUlkQk9DbzRxRkR1YjdVeEF6VlVIUHluaEp5WUdPNUYKKzJVaWhTNXFEK2g4RVFxdnoza0RIMnFLcUFTaVhwZXUwdjRpVC9pSmU5aGVCeWR2UEY3UCtXc0JCcG05RVRHNVVzcEllMUV4NUp2bXEKK2ZwaStQcEN5ZWtVaml6cFhOSkttYzBValJ6cFhORktpYzBVakF6cFhOQUxldWFJUjM4NFZqWEFlWE9FSkpLNTZGazNSRzZTTmZlTm4KK0FkVEpEcWFiOUtTNm90UTQzMFVpN2hJUmJ4eGRXT3RxSHlMTFJiN01hS29pblQ2ZkxCZFpvdlJ4czhNalVKMzExbjAySjM4TTQ0MUkKK2ZUaVZkd0gxZFAyTlB2bzRueElmanE4ZFVDOU44alZzd29QSjNoTDJQUkNlM0toZ0pSUG5SdjR5RVdXcy82cWNoVGxsZENyWE02elgKKy90MG1jK0JVcUV0dUo5aHBpOVBiUFdIa1gvc3ArdUJnTlQ5dE1hVkxPQ21HcHkxNTJTNzhpMXo1ZVZpNmhuQWFPVFY4emdoekRRSlYKK1BPeWlFeDJpNXU3cXRFSUhnR0tDS1JkOEUxQStRWDlUWFBqeWRZd3ArcHRTOUV6NUJQMU40WHFtZk15UHcvRmxNODBIK0ZuRklXMnYKK0dYdnZYcWhBSmVzOEtQZEFKejNNMkR2WVF0Qk1ZRzlpSzU5RUVqUDJEdDZoVCtmYzgrQ2JHeVZQMmJIWThpZ0RoUjBPZzRLYmpXNEwKK095ZzEycHN3TEdJSHFJWjF6TURxeDdVTUlEYnAvcFFQdnY0Um1Gc01rS1h0V2JOek8wOWJQQUFsaUhTRy9wR3JyUHNNZmR6Q2VWU1UKK3F3aCtMa21sUTBPYnR1dzhLbHFSVDZiZU1XTGNyL0F4Z1BwVlFBWlF2MUxJQUdySmovWXpqNjJKZEpEK3haR0J4YVpsVzhVdzdjak0KK1BHTXpzd1hpbFlDQjZpYmgvTld5ZTl0em9WazNDU2pzQURYckpnR0ZIWjFhTGJOMWs0QTFXTjBrWUxWVWpmWVlWVG1WWXhTN2JsYUIKKzdFbUFZTkV3NUUwQUdvYThDVUREa0RjQnFEOTVkNE1NUjk0RUxEWTNXRTZ0a2pjQkNLZHd2dXBib0NwNUU0RFkzR0RZcnZqTnFLeDcKK0tPWHdsOXNCeUp1QXdnNVFrN3dKS096b3RKRTNBUXVuY0RLaGhtV3Bqb0ExREhrVGdJWWhid0xRTU9STkFCcUd2QWxBdzVBM0FhZy8KK2VYZURERWZlQkN3Mk4xaE9yWkkzQVloTkR4YW9TdDRFSUp6QzRZYTk1STI3L3JlVE53R0ZIYUFtZVJOUTJOR3BFYW85cEJLdzJBR3EKK1lWbnlKbURoRkU0eUZGaVkzQnlqaGlGdmdrWERrRGNCYUJqeUpnQU5ROTRFb1A3azNRMHlISGtUc05qY1lEbTFTdDRFSURZOVdLQXEKK2VST0EyTnl3bDd4eE0vNTI4aWFnc0FQVUpHOENDanM2TlVLMVBFZkFZZ2VvaG1YSm00Q0YrZEtidkFsQU9PVzVRQnlMaGlGdmdrWEQKK2tEY0JhQmp5SmdEMUorOXVrT0hJbTRERjVnYkxxVlh5SmdDeDZjRUNWY21iQU1UbWhyM2tqWHZrdDVNM0FZVWRvQ1o1RTFEWTBha1IKK3FpVnZBaFk3UURVc1MzVUVyR0hJbXdDRWlkbWJ2QWxBT09VWlFMaUxPR0VhaHJ3SkZnMUQzZ1NnL3VUZERUSWNlUk93Mk54Z09iVksKKzNnUWdOajFZb0NwNUU0RFkzS0R2MmNKOVVmTDExRWxMRWxEdkdaUzNHc2lBeHkxQm9nSVdCdjZVYTVsQVY2SHN2aDNTRTdDMGtJSFkKK2toNVVFOThyZGUvUUxuWlBXeEtFRE9VdkExL2hsZTRudktWVGFVU1l6ZzUwRXR4OHUzQSttd2FZeGpwTXFkMmJOOUE5VkcwWHd2WWsKKzNUZ0VlbVpQTWJUc3hPWE5jaTBOR29SMFgxZlJBb1E5b1ZmUUVGUzA5ZWpGdXM4SEptSlRWVEdNLzdjdFVQRnY2RDlkbFhQRzQ1UEwKKzJjZEpZVkdqUVdvcG9RVVV0SmlZRGluemVBNE5VYW01M1Z4b1V2UlJGYlB3cVRtcGFLODZ3ZjhpNllmVzlpbzByTU1WMXZqQzJSUHMKK2VxcWF2MjFEUXF1WEFwcW52dWxlcUlaeklyamh2VzhjbEx3dngwdVlpNDFJVFBpM3pTWGxuS0xEcE4zWDcyZlQ4NWZZc1lZOVpOckUKK2V5bmpyNENQT3VxSGEvQk1pazhxejdTYnJoK0NFbUNza1UzL21WNExyWDM0c2JlWlQveDlvSmxQdi94WU5QanB4TnJwNTl0WnVlM24KKzA4UGJmcjZsY2VxRlVkWFROMDFMTGFlbkx5OWZJN2xnS3lCU1BMVFI0ZDNLN2JEKzl5TmsxdnRMNDgxS2YrQ3JjcVRTSDRoallEbWEKK0RKOHRLZUpCZElRSFRYMEhka3ZSczJHdjBXSEhodlpqTlhsYUdqdlE2R2JnaXdhUDdkY0FNMi9ubXJHSlhJdmVtVzVtT0tBek5qc2MKKzNPWU9UakdlYXlvSS9ZV29VcGVHd0RyTHdHUVYvSEVWYVo1NExCb01EUit0ZmdrakN0NWZ5Q0Q0SWpBSE14VzNUdzNrV3U4dkVEUVoKKzR5R3VKbXFwc2t5Rjdlc1Q3SEZvRlFEcFVGWEdQR29qMnZNa3lzT2xUSXFPaVZaVzFZZWZCcTFBYXdlT3Q2UUMxZFB0dXUza3NKZW4KKzRKcUZMZ2wxMXQ5aHBIcitGaStkaWJNbHJCb0Q3dDBIYU5VKzNtdk5MUE5pdDZaVWVlNS9raXBEbmI3OUR3QUEvLzhEQUZCTEF3UVUKK0FBWUFDQUFBQUNFQTdleXMzM3NCQUFEZkFnQUFFUUFJQVdSdlkxQnliM0J6TDJOdmNtVXVlRzFzSUtJRUFTaWdBQUVBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFmSkpkVDhJd0ZJYnZUZndQUys5SHV3RkdGallTUDdpU3hFU014cnZhSHFDeWRVMWIKK21QeDd6ellZTEJxVFh2UjhQZWVjdDUzT3ZvczgySU4xcXRRcGlRYU1CS0JGS1pWZXArUjFPUTl2U2VBODE1TG5wWWFVSE1DUldYWjkKK05SVW1FYVdGWjFzYXNGNkJDNUNrWFNKTVNqYmVtNFJTSnpaUWNEZkFESTNCVldrTDd0RzBhMnE0MlBJMTBKaXhHMXFBNTVKN1RtdGcKK2FEb2lPU0tsNkpCbVovTUdJQVdGSEFyUTN0Rm9FTkZ6cmdkYnVEOExtc2hGWnFIOHdlQk94M0V2MlZLMHdTNzcyNmt1c2FxcVFUVnMKK3hzRDVJL3ErZUhwcFZnMlZyclVTUUxLcEZJbFhQb2RzU3M5WHZMbmQ1eGNJMzdvN0F3UENBdmVselI2dEVrM055VkZMdllWRFZWcnAKK3NLeG5ZWjBFSjZ3eUhoK3doZlljbUoxejV4ZjRvaXNGOHU1dzVQLzIxMjBzN0ZYOUU3SkowNmN6Y1p0R3ZIWklrQUhLa2JUaW5TSnYKK3cvdUg1WnhrTVl1aUVBK0xsMnlVUk9PRXNZOTZuVjU5TFUvcktJNkQvVStNUXpiR3MyU1RaRHpxRTArQVZwbitsOHgrQUFBQS8vOEQKK0FGQkxBd1FVQUFZQUNBQjFncVZBUXpHYjNRUUpBQUNDUkFBQUR3QUFBSGR2Y21RdmMzUjViR1Z6TG5odGJPeTlCMkFjU1pZbEppOXQKK3ludC9TdlZLMStCMG9RaUFZQk1rMkpCQUVPekJpTTNta3V3ZGFVY2pLYXNxZ2NwbFZtVmRaaFpBek8yZHZQZmVlKys5OTk1Nzc3MzMKK3VqdWRUaWYzMy84L1hHWmtBV3oyemtyYXlaNGhnS3JJSHo5K2ZCOC9JdjdIdi9jZmZQeDd2RnVVNldWZU4wVzEvT3lqM2ZIT1IybSsKK25GYXpZbm54MlVkZnZYbTJmZkJSMnJUWmNwYVYxVEwvN0tQcnZQbm85emo2alpQSFY0K2E5cnJNbTVRQUxKdEhpK2xuSDgzYmR2WG8KKzd0MW1PczhYV1RPdVZ2bVN2anl2NmtYVzBwLzF4ZDFGVnI5ZHI3YW4xV0tWdGNXa0tJdjIrdTdlenM2bkh5bVkralpRcXZQellwby8KK3JhYnJSYjVzK2YyN2RWNFN4R3Jaekl0Vlk2QmQzUWJhVlZYUFZuVTF6WnVHQnIwb0JkNGlLNVlXek81K0Q5Q2ltTlpWVTUyM1l4cU0KK1lzU2c2UFhkSGY1dFVYNlVMcWFQemk2V1ZaMU5TaUllQWZxSWFKZW1STDFaTlgyYW4yZnJzbTM0SS82d2ZsbnJoL3FaK2RUK0tSODgKK3E1WnRrMTQ5eXBwcFVid2hqQWo0b3FCK3ZuMjhiSXFQNkpzOGE5cmpwc2lpWDg3eFMvU2JhZE42SHo4cFpzVkhkOE8rbXg5UXM4dXMKKy9PeWp2YjMrZHlmTjhMZGx0cnd3MytiTDdhOWUrM2g2SDAybzE4OCt5dXJ0MThjZWlNZDNmVUxvWHlHeHFJOVZsSUNyTGdHYlZUWXQKK0dKdnN2TTJKNldqTzBYVlpnTWYzSG54cS9uaTF4cnhsNjdZS1IvTzdibThIWUNZNXNSUzEzQlU0OHVjeHZhWk42SnVQWEcvYWl2L3EKK04xSWs5aTFHQVJMYjJ3RkozTkQwTDMvNCtLakxaendSTGNuTmF4RmZhcEdmUDYrbWIvUFo2NWErK093ajdwYysvT3JzWlYxVU5Zbm8KK1p4ODlmS2dmdnM0WHhiZUwyU3hmS3Jab3VKd1hzL3k3ODN6NVZaUFAzT2MvOFl6RlRDRk9xL1dTZnQvNzlNRkhicjdLWm5iNmJwcXYKK0lMclVacG1COTE3Z3RSTHZORjV2REdSZE9KemtnMDdmL09Fdk1oM3YybGtiNm11ZVo5QjE2ZTZOM1QzOEpydmJpMEwvR29EdWZWT0EKKzlyOHBRUGUvS1VDZmZsT0FIbnhUZ0E2K0tVQVBQeFJRVzAyRlpYMGc5eDdlNnIwZTc5M3l2UjZyM2ZLOUhtZmQ4cjBlSTkzeXZSN2YKKzNQSzlIcHZjOHIwZVY5enl2UjRUM09LOWFjWi85OTVrV3IwSC83d3AyaksvVWVYdGZpTXFWczFQK2pLcnM0czZXODFUdUMrOXZtNkUKKzgzbzlhVytIOXU0M2dmYnJ0cTZXRnpkMnRpZmk5SUdkblM1Vzg2d3BtcHU3KzBhbTVBMzgwZlR6dXBqZDJPSDlBYnQzVXhjdnkyeWEKK3o2dHlsdGZwbS94ZCsvV2d2S2pTMStJYzNZam9OekxwejR1TGVadStuck9hdnJITFR3Y200M2E5UEMrYTl1WXVCb1oxdXk1dU5jT2YKK0RuRHdUVjE4a2MrSzljSVE2eFllMUtmM3ZwR085bTd1YVArRE9zTEUzR1k0OXorOGwxdU01ZE1QNmdVY01EUVd2NWNISDk3TExjWnkKKzhPRzkzTHU1bDYrcHNaNVNjdUoyUXZuZ2E4cjlTVlZXOWZtNnZMV0NlZkExcGQ5MmRMdmhmRTBGWUh1NWxacDU4RFdsUDFESjZmRjAKK1NySHJiVGo2YTg2UjA4M3YwZGZYbkNhbnBOK2pyNjg1V1YxdC9SNDlmczJKNjZydDkranhtOURmNzlIZDExVGtyL0xMQW5uVHIvYzIKK1kybDk0aHVSdkRkQWsvUzkvSnVmV0ZmdHpRNzAzamVTNnpoYlVwcXB5ZFBiOVhsdlFGN2ZyOC9BdHI0SEIzd1RSdlk5dXZzbXJPMTcKK2RQZE5tTjMzNk81RDdlL3R1L3FtRFBGNzlQZzFWWDFna2QranU2K3A3UVBUL0I3ZGZVMVZIN1hSdC9BSHYrYjA5VzMwTGZyNm1oUFgKK3Q5RzM2T3RyenRxUWpiNUZqMTl6NG9aczlDMTYvQ1p0OUMyNis1bzJPbW9RYnRIZE4ya1FidEhkTjJrUWJ0SGROMmtRYnRIZE4yVVEKK2J1N3FtellJdCtqeGErcVZxRUc0UlhkZlU3WEVETUp0dXZ1YWVpVnFFRzRSdW4vTjZlc2JoRnYwOVRVbnJtOFFidEhYMTV5MUlZTncKK2l4Ni81c1FOR1lSYjlQaE5Hb1JiZFBkTkdvUmJkUGROR29SYmRQZE5Hb1JiZFBkTkdvUmJkUGROR1lTYnUvcW1EY0l0ZXZ5YWVpVnEKK0VHN1IzZGRVTFZHRGNJdnV2cVplaVJxRS9SdTcrK1lNd2kzNitwb1QxemNJdCtqcmE4N2FrRUc0Ulk5ZmMrS0dETUl0ZXZ3bURjSXQKK3V2c21EY0l0dXZzbURjSXR1dnNtRGNJdHV2c21EY0l0dXZ1bURNTE5YWDNUQnVFV1BYNU52UkkxQ0xmbzdtdXFscWhCdUVWM1gxT3YKK1JBM0MvUnU3KytZTXdpMzYrcG9UMXpjSXQranJhODdha0VHNFJZOWZjK0tHRE1JdGV2d21EY0l0dXZzbURjSXR1dnNtRGNJdHV2dHcKK2cvQmVvL3NtRGNJdHV2dW1ETUxOWFgzVEJ1RVdQWDVOdlJJMUNMZm83bXVxbHFoQnVFVjNYMU92UkEzQ3B6ZDI5ODBaaEZ2MDlUVW4KK3JtOFFidEhYMTV5MUlZTndpeDYvNXNRTkdZUmI5UGhOR29SYmRQZE5Hb1JiZFBkTkdvUmJkUGROR29SYmRQZE5Hb1JiZFBkTkdZU2IKK3UvcW1EY0l0ZXZ5YWVpVnFFRzdSM2RkVUxWR0RjSXZ1dnFaZWViMmV0R1dlbmk1Vzg2d3BtaHY3MlIxZ0VmcndGejJyNmtYV1Vwc2IKK2V6MWJ0dm15ZVk5dTl3WW03LzI2MWNHK3lzL3pPbDlPOHh1N3ZmZU5kR3RHK3g3OURqRFArL1g3cEtyZXBtOEtHdkxOSFE2d3ozdDIKK1dFektvcnFvczlYOHV0ZkRneHRmZi9QbFNmcnRuTVc2OS9iREtDcVA3eEtvaktqYnZtNnZ5N3lSRDJtcytJdGVhSzlYQkhlVjFSa2oKK0JSaXovRHhibHd3ajFZWm5OTlFYZ0Z4KzVEQUVTdFRnTWl2dGx4Nytpb24zU2QyUXVHcjduWjM5Wnc5T2Q4MklnU1YzZEF2MExFSksKK2lOMEJsT2J5ZFJwTXlpU2phZnR5T1l6Mk1uL1hEbjliRnN1MzVsdlQvY2s4cS8wMmJsSk15NGZ2UTVjbkQrNGQzei8yMzFpOXJQVVAKKy92TnRucTllRUphbWhmM3dlYkhNbStEVGF0MFN4dm56eTlMQ2Q0RHYrcENCUnRoTi9heGF0ZzI5bHpYVG9uZ3p6OEYvaSt5bnEvcmIKK3g4dW13RXprV2RNZU4wWG1mM21xbitIN09ScEczNXcycmZmeGsySldXTHhrbXNLL1RzSmhUV0VBeklqdWZYci8yVVBtVkFiSnh1R3oKK2p6SzJDdTVqMkVLSTM3T3duK1lIQnN6ZVFmZWJreWJ5SGFobUNIVUQwMDZKTDdKcG05Y2JaT3FwZlB6UzhEZG9Qc0RPMmpTMWJWTnUKK3ZKSHhBdFozMnMxL0o5Qm50eExHTnB1SXVod1kweHQ4Znd0bGtYTERqKzRlYlpLY1FIUnVQUUwrb3AyVUlVZlRCMmRMU05xVjZtMFoKK3oreGRGazQ5dFR2SnkvS0x6TDB0bjFlckcxN21abVYrM2txNzNaMkRqUzBuVmR0V2k5dkFyRGx5dXdrb0pxNkh2SDU0TzU1ZHJoZVQKK3ZGYnJNbWdINE9ZTlRpMDdnVGZvdzY4M3ErOGpiOU4xUTZSbGs5ZkZQOURiOFZGb0V3cDd1c3E5WXoraThudUR2WGdQVzNHVFpmaVIKK3lnNi9lUytWYlg5dmp2NmZBQUFBLy85UVN3TUVGQUFHQUFnQUFBQWhBRTIyOXA3Q0FRQUFvZ1FBQUJJQUFBQjNiM0prTDJadmJuUlUKK1lXSnNaUzU0Yld5a2trMXUyekFRaGZjRmVnZUIrNWlrcktTSkVEa0kzQnJvcG9zaVBRQk5VeFpSL2dnYzJxcHYzeEVwS3dzamdOMUsKK0FDRzk0VHpNZkhqUEwzK3NLWTRxZ1BhdUlYekJTS0djOUR2dDlnMzU5YmE1ZXlRRlJPRjJ3bmluR25KU1FGNVduejg5RDNYclhZUUMKKyt4M1VWamFraTdHdktRWFpLU3RnNFh2bHNOajZZRVhFMzdDblZvVGZoLzVPZXR1THFMZmE2SGlpSldNUFpMSUoxN2o0dHRWU2ZmWHkKK1lKV0xxWjhHWmREUk8raDBEMmUzNFJxM3dZZGRIN3hVQUxpek5kblBDdTFtRzE1ZEdGa3Rnd2ZmeGdVdVEvTkVkTFRDZHM3U2x6V2sKK3NMTCt2bmMraUsxQmRnT3Z5R29DVnd5MUV4YkZ0VEI2RzNRcTlNSjVVQnhyUjJFYXdrcTJZZmQ0am0vRmx1Tko2T2dnT3hGQXhma2kKK3kzSXJyRGFuc3dxREJzaUZYa2ZabmZXakNIb2NLSmRBNzdGd2dDMXJ5RGZPR0NzM0c1SVYzcEFLaGRmMXJKUTRWSDZlcGp2TFdjSGsKKzRHREpKMTNoVDhrSEZmU1p1dEtjTkVmbmdzU2J0Z3FLSDJvb2Zub3IzQWRFU3ZhQUpPNlJ4MGhtZVJPUmtId1R3V3VKNE9EbDY3dy8KK2JySkc1Y3RqeGFmOWJ5S1NmYTRuc2hZV295RStJREVTeUNSR0lyZGw0OTlJWEdhRFZUT2JkeElwQ1ppby84bkdGQkpZL1FVQUFQLy8KK0F3QlFTd01FRkFBR0FBZ0FBQUFoQUU1d3l0WndBUUFBeFFJQUFCQUFDQUZrYjJOUWNtOXdjeTloY0hBdWVHMXNJS0lFQVNpZ0FBRUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5GTExUc013RUx3ajhROVI3dFFwUWdoVlcxZW9DSEhnVWFtQm5pMTcKK2sxZzR0bVdicXYxNzFnMXRnN2lSMDg2c2R6STdOaXgydlNtMkdLSjJkbDVPSjFWWm9KVk9hZHZPeS9mNjhlcXVMR0lTVmduakxNN0wKK1BjWnl3Uzh2WUJXY3g1QTB4b0lrYkp5WFhVcCt4bGlVSGZZaVRxaHRxZE80MEl0RU1MVE1OWTJXK09Ea1Y0ODJzZXVxdW1XNFMyZ1YKK3FpdC9FaXdIeGRrMi9WZFVPWm45eFk5Njc4a3doeHA3YjBSQy9wcnRtSWx5cVFkMllxRjJTWmhhOThpblJKOEFyRVNMTVhOREFSc1gKK1ZPUVZzS0dBWlNlQ2tJbnl5K1FJd2IzM1JrdVJLRmYrb21WdzBUV3BlRHNrVU9ScFlPTWpRS21zVVg0Rm5mWlphZ3poV1Z0eVFleFEKK2tLc2cyaUI4ZHlCSENOWlNHRnpTNnJ3UkppS3dNd0ZMMTN0aDk1eDhIaXZTKzR6dnZuWVBPWnVma2Qva2FNV05UdDNhQ3psNE9TODcKKzRtRk5nYUFpOTBlMU13RlBkQm5CNUYvU3JHMVJIYy84YmVUNFBvWlh5YWMzazRxK1ExNUhqaTdrOUZ6NE53QUFBUC8vQXdCUVN3RUMKK0xRQVVBQVlBQ0FBQUFDRUFDU1NIZ29FQkFBQ09CUUFBRXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBVzBOdmJuUmxiblJmVkhsd1pYTmQKK0xuaHRiRkJMQVFJdEFCUUFCZ0FJQUFBQUlRQWVrUnEzOHdBQUFFNENBQUFMQUFBQUFBQUFBQUFBQUFBQUFMb0RBQUJmY21Wc2N5OHUKK2NtVnNjMUJMQVFJdEFCUUFCZ0FJQUFBQUlRQjhPNWM1SWdFQUFMa0RBQUFjQUFBQUFBQUFBQUFBQUFBQUFONEdBQUIzYjNKa0wxOXkKK1pXeHpMMlJ2WTNWdFpXNTBMbmh0YkM1eVpXeHpVRXNCQWkwQUZBQUdBQWdBN3FtbVFPM1MyUVZ4QWdBQTZ3VUFBQkVBQUFBQUFBQUEKK0FBQUFBQUFBUWdrQUFIZHZjbVF2Wkc5amRXMWxiblF1ZUcxc1VFc0JBaTBBRkFBR0FBZ0FBQUFoQUREZFF5bW9CZ0FBcEJzQUFCVUEKK0FBQUFBQUFBQUFBQUFBQUE0Z3NBQUhkdmNtUXZkR2hsYldVdmRHaGxiV1V4TG5odGJGQkxBUUl0QUJRQUJnQUlBS1NvcGtDRGQ3R1UKK01RUUFBRUlLQUFBUkFBQUFBQUFBQUFBQUFBQUFBTDBTQUFCM2IzSmtMM05sZEhScGJtZHpMbmh0YkZCTEFRSXRBQlFBQmdBSUFBQUEKK0lRQVhvQlpPQWdFQUFLd0JBQUFVQUFBQUFBQUFBQUFBQUFBQUFCMFhBQUIzYjNKa0wzZGxZbE5sZEhScGJtZHpMbmh0YkZCTEFRSXQKK0FCUUFCZ0FJQUFBQUlRQ0FTNFUzMkFnQUFBSkNBQUFhQUFBQUFBQUFBQUFBQUFBQUFGRVlBQUIzYjNKa0wzTjBlV3hsYzFkcGRHaEYKK1ptWmxZM1J6TG5odGJGQkxBUUl0QUJRQUJnQUlBQUFBSVFEdDdLemZld0VBQU44Q0FBQVJBQUFBQUFBQUFBQUFBQUFBQUdFaEFBQmsKK2IyTlFjbTl3Y3k5amIzSmxMbmh0YkZCTEFRSXRBQlFBQmdBSUFIV0NwVUJETVp2ZEJBa0FBSUpFQUFBUEFBQUFBQUFBQUFBQUFBQUEKK0FCTWtBQUIzYjNKa0wzTjBlV3hsY3k1NGJXeFFTd0VDTFFBVUFBWUFDQUFBQUNFQVRiYjJuc0lCQUFDaUJBQUFFZ0FBQUFBQUFBQUEKK0FBQUFBQUJFTFFBQWQyOXlaQzltYjI1MFZHRmliR1V1ZUcxc1VFc0JBaTBBRkFBR0FBZ0FBQUFoQUU1d3l0WndBUUFBeFFJQUFCQUEKK0FBQUFBQUFBQUFBQUFBQUFOaThBQUdSdlkxQnliM0J6TDJGd2NDNTRiV3hRU3dVR0FBQUFBQXdBREFBSkF3QUEzREVBQUFBQSI7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgV21sRG9jdW1lbnQgc19FbXB0eURvY3VtZW50ID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFdtbERvY3VtZW50IEVtcHR5RG9jdW1lbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICBpZiAoc19FbXB0eURvY3VtZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzX0VtcHR5RG9jdW1lbnQgPSBuZXcgV21sRG9jdW1lbnQoIkVtcHR5RG9jdW1lbnQuZG9jeCIsIENvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhzX0JsYW5rX3dtbF9iYXNlNjQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHNfRW1wdHlEb2N1bWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3MgR2V0RGVmYXVsdFNldHRpbmdzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldERlZmF1bHRTZXR0aW5ncyhFbXB0eURvY3VtZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3MgR2V0RGVmYXVsdFNldHRpbmdzKFdtbERvY3VtZW50IHdtbERvY3VtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBIdG1sVG9XbWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBIdG1sVG9XbWxDb252ZXJ0ZXJTZXR0aW5ncygpOworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtcy5Xcml0ZSh3bWxEb2N1bWVudC5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgd21sRG9jdW1lbnQuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1zLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFqb3JMYXRpbkZvbnQsIG1pbm9yTGF0aW5Gb250OworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGVmYXVsdEZvbnRTaXplOworICAgICAgICAgICAgICAgICAgICBHZXREZWZhdWx0Rm9udEluZm8od0RvYywgb3V0IG1ham9yTGF0aW5Gb250LCBvdXQgbWlub3JMYXRpbkZvbnQsIG91dCBkZWZhdWx0Rm9udFNpemUpOworICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5NYWpvckxhdGluRm9udCA9IG1ham9yTGF0aW5Gb250OworICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5NaW5vckxhdGluRm9udCA9IG1pbm9yTGF0aW5Gb250OworICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5EZWZhdWx0Rm9udFNpemUgPSBkZWZhdWx0Rm9udFNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuTWlub3JMYXRpbkZvbnQgPSAiVGltZXMgTmV3IFJvbWFuIjsKKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuRGVmYXVsdEZvbnRTaXplID0gMTJkOworICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5EZWZhdWx0QmxvY2tDb250ZW50TWFyZ2luID0gImF1dG8iOworICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5EZWZhdWx0U3BhY2luZ0VsZW1lbnQgPSBuZXcgWEVsZW1lbnQoVy5zcGFjaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5iZWZvcmUsIDEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmJlZm9yZUF1dG9zcGFjaW5nLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuYWZ0ZXIsIDEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmFmdGVyQXV0b3NwYWNpbmcsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5saW5lLCAyNDApLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5saW5lUnVsZSwgImF1dG8iKSk7CisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLkRlZmF1bHRTcGFjaW5nRWxlbWVudEZvclBhcmFncmFwaHNJblRhYmxlcyA9IG5ldyBYRWxlbWVudChXLnNwYWNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmJlZm9yZSwgMTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuYmVmb3JlQXV0b3NwYWNpbmcsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5hZnRlciwgMTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuYWZ0ZXJBdXRvc3BhY2luZywgMSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmxpbmUsIDI0MCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmxpbmVSdWxlLCAiYXV0byIpKTsKKworICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgbVhEb2MgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGV4aXN0aW5nU2VjdFByID0gbVhEb2MuUm9vdC5EZXNjZW5kYW50cyhXLnNlY3RQcikuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuU2VjdFByID0gbmV3IFhFbGVtZW50KFcuc2VjdFByLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdTZWN0UHIuRWxlbWVudHMoVy5wZ1N6KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nU2VjdFByLkVsZW1lbnRzKFcucGdNYXIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3M7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEdldERlZmF1bHRGb250SW5mbyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIG91dCBzdHJpbmcgbWFqb3JMYXRpbkZvbnQsIG91dCBzdHJpbmcgbWlub3JMYXRpbkZvbnQsIG91dCBkb3VibGUgZGVmYXVsdEZvbnRTaXplKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod0RvYy5NYWluRG9jdW1lbnRQYXJ0LlRoZW1lUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IGZvbnRTY2hlbWUgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuVGhlbWVQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QuRWxlbWVudHMoQS50aGVtZUVsZW1lbnRzKS5FbGVtZW50cyhBLmZvbnRTY2hlbWUpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKGZvbnRTY2hlbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1ham9yTGF0aW5Gb250ID0gKHN0cmluZylmb250U2NoZW1lLkVsZW1lbnRzKEEubWFqb3JGb250KS5FbGVtZW50cyhBLmxhdGluKS5BdHRyaWJ1dGVzKE5vTmFtZXNwYWNlLnR5cGVmYWNlKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBtaW5vckxhdGluRm9udCA9IChzdHJpbmcpZm9udFNjaGVtZS5FbGVtZW50cyhBLm1pbm9yRm9udCkuRWxlbWVudHMoQS5sYXRpbikuQXR0cmlidXRlcyhOb05hbWVzcGFjZS50eXBlZmFjZSkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGRlZmF1bHRGb250U2l6ZVN0cmluZyA9IChzdHJpbmcpd0RvYy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QuRWxlbWVudHMoVy5kb2NEZWZhdWx0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnJQckRlZmF1bHQpLkVsZW1lbnRzKFcuclByKS5FbGVtZW50cyhXLnN6KS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdEZvbnRTaXplU3RyaW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkZnM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKGRlZmF1bHRGb250U2l6ZVN0cmluZywgb3V0IGRmcykpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZvbnRTaXplID0gZGZzIC8gMmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZvbnRTaXplID0gMTI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYWpvckxhdGluRm9udCA9ICIiOworICAgICAgICAgICAgbWlub3JMYXRpbkZvbnQgPSAiIjsKKyAgICAgICAgICAgIGRlZmF1bHRGb250U2l6ZSA9IDEyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgQ2xlYW5VcENzcyhzdHJpbmcgY3NzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3NzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgY3NzID0gY3NzLlRyaW0oKTsKKyAgICAgICAgICAgIHN0cmluZyBjbGVhbkNzcyA9IFJlZ2V4LlNwbGl0KGNzcywgIlxyXG58XHJ8XG4iKQorICAgICAgICAgICAgICAgIC5XaGVyZShsID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbFRyaW0gPSBsLlRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxUcmltID09ICIvLyIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChsVHJpbSA9PSAiLy8vLyIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChsVHJpbSA9PSAiPCEtLSIgfHwgbFRyaW0gPT0gIiZsdDshLS0iKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAobFRyaW0gPT0gIi0tPiIgfHwgbFRyaW0gPT0gIi0tJmd0OyIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLlNlbGVjdChsID0+IGwgKyBFbnZpcm9ubWVudC5OZXdMaW5lICkKKyAgICAgICAgICAgICAgICAuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKyAgICAgICAgICAgIHJldHVybiBjbGVhbkNzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdHJ1Y3QgRW11CisgICAgeworICAgICAgICBwdWJsaWMgbG9uZyBtX1ZhbHVlOworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBzX0VtdXNQZXJJbmNoID0gOTE0NDAwOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRW11IFR3aXBzVG9FbXVzKGxvbmcgdHdpcHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IHYxID0gKGZsb2F0KXR3aXBzIC8gMjBmOworICAgICAgICAgICAgZmxvYXQgdjIgPSB2MSAvIDcyZjsKKyAgICAgICAgICAgIGZsb2F0IHYzID0gdjIgKiBzX0VtdXNQZXJJbmNoOworICAgICAgICAgICAgbG9uZyBlbXVzID0gKGxvbmcpdjM7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVtdShlbXVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRW11IFBvaW50c1RvRW11cyhkb3VibGUgcG9pbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgdjEgPSBwb2ludHMgLyA3MjsKKyAgICAgICAgICAgIGRvdWJsZSB2MiA9IHYxICogc19FbXVzUGVySW5jaDsKKyAgICAgICAgICAgIGxvbmcgZW11cyA9IChsb25nKXYyOworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbXUoZW11cyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRW11KGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW1wbGljaXQgb3BlcmF0b3IgbG9uZyhFbXUgZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGUubV9WYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW1wbGljaXQgb3BlcmF0b3IgRW11KGxvbmcgbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbXUobCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJDYW4ndCBjb252ZXJ0IGRpcmVjdGx5IHRvIHN0cmluZywgbXVzdCBjYXN0IHRvIGxvbmciKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdHJ1Y3QgVFBvaW50CisgICAgeworICAgICAgICBwdWJsaWMgZG91YmxlIG1fVmFsdWU7CisKKyAgICAgICAgcHVibGljIFRQb2ludChkb3VibGUgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW1wbGljaXQgb3BlcmF0b3IgZG91YmxlKFRQb2ludCB0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdC5tX1ZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbXBsaWNpdCBvcGVyYXRvciBUUG9pbnQoZG91YmxlIGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFBvaW50KGQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiQ2FuJ3QgY29udmVydCBkaXJlY3RseSB0byBzdHJpbmcsIG11c3QgY2FzdCB0byBkb3VibGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdHJ1Y3QgVHdpcAorICAgIHsKKyAgICAgICAgcHVibGljIGxvbmcgbV9WYWx1ZTsKKworICAgICAgICBwdWJsaWMgVHdpcChsb25nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBtX1ZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGltcGxpY2l0IG9wZXJhdG9yIGxvbmcoVHdpcCB0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdC5tX1ZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbXBsaWNpdCBvcGVyYXRvciBUd2lwKGxvbmcgbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUd2lwKGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbXBsaWNpdCBvcGVyYXRvciBUd2lwKGRvdWJsZSBkKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFR3aXAoKGxvbmcpZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJDYW4ndCBjb252ZXJ0IGRpcmVjdGx5IHRvIHN0cmluZywgbXVzdCBjYXN0IHRvIGxvbmciKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBTaXplRW11CisgICAgeworICAgICAgICBwdWJsaWMgRW11IG1fSGVpZ2h0OworICAgICAgICBwdWJsaWMgRW11IG1fV2lkdGg7CisKKyAgICAgICAgcHVibGljIFNpemVFbXUoRW11IHdpZHRoLCBFbXUgaGVpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICBtX1dpZHRoID0gd2lkdGg7CisgICAgICAgICAgICBtX0hlaWdodCA9IGhlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTaXplRW11KGxvbmcgd2lkdGgsIGxvbmcgaGVpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICBtX1dpZHRoID0gd2lkdGg7CisgICAgICAgICAgICBtX0hlaWdodCA9IGhlaWdodDsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvSHRtbFRvV21sQ29udmVydGVyQ29yZS5jcyBiL09wZW5YbWxQb3dlclRvb2xzL0h0bWxUb1dtbENvbnZlcnRlckNvcmUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzNWUyMQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzL0h0bWxUb1dtbENvbnZlcnRlckNvcmUuY3MKQEAgLTAsMCArMSw1NDMzIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIVE1MIGVsZW1lbnRzIGhhbmRsZWQgaW4gdGhpcyBtb2R1bGU6CisgKgorICogYQorICogYgorICogYm9keQorICogY2FwdGlvbgorICogZGl2CisgKiBlbQorICogaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgaDcsIGg4CisgKiBocgorICogaHRtbAorICogaQorICogYmxvY2txdW90ZQorICogaW1nCisgKiBsaQorICogb2wKKyAqIHAKKyAqIHMKKyAqIHNwYW4KKyAqIHN0cm9uZworICogc3R5bGUKKyAqIHN1YgorICogc3VwCisgKiB0YWJsZQorICogdGJvZHkKKyAqIHRkCisgKiB0aAorICogdHIKKyAqIHUKKyAqIHVsCisgKiBicgorICogdHQKKyAqIGNvZGUKKyAqIGtiZAorICogc2FtcAorICogcHJlCisgKgorICogSFRNTCBlbGVtZW50cyB0aGF0IGFyZSBoYW5kbGVkIGJ5IHJlY3Vyc2l2ZWx5IHByb2Nlc3NpbmcgZGVzY2VkYW50cworICoKKyAqIGFydGljbGUKKyAqIGhncm91cAorICogbmF2CisgKiBzZWN0aW9uCisgKiBkZAorICogZGwKKyAqIGR0CisgKiBmaWd1cmUKKyAqIG1haW4KKyAqIGFiYnIKKyAqIGJkaQorICogYmRvCisgKiBjaXRlCisgKiBkYXRhCisgKiBkZm4KKyAqIG1hcmsKKyAqIHEKKyAqIHJwCisgKiBydAorICogcnVieQorICogc21hbGwKKyAqIHRpbWUKKyAqIHZhcgorICogd2JyCisgKgorICogSFRNTCBlbGVtZW50cyBpZ25vcmVkIGluIHRoaXMgbW9kdWxlCisgKgorICogaGVhZAorICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gbmVlZCB0byByZXNlYXJjaCBhbGwgb2YgdGhlIGh0bWwgYXR0cmlidXRlcyB0aGF0IHRha2UgZWZmZWN0LCBzdWNoIGFzIGJvcmRlcj0iMSIgYW5kIHNvbWVob3cgd29yayBpbnRvIHRoZSByZW5kZXJpbmcgc3lzdGVtLgorLy8gbm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgJ2luaGVyaXQnIHNvIG5lZWQgdG8gaW1wbGVtZW50IGNvcnJlY3QgbG9naWMuCisKKy8vIHRoaXMgbW9kdWxlIGhhcyBub3QgYmVlbiBmdWxseSBlbmdpbmVlcmVkIHRvIHdvcmsgd2l0aCBSVEwgbGFuZ3VhZ2VzLiAgVGhpcyBpcyBhIHBlbmRpbmcgd29yayBpdGVtLiAgVGhlcmUgYXJlIGlzc3VlcyBpbnZvbHZlZCwKKy8vIGluY2x1ZGluZyB0aGF0IHRoZXJlIGlzIFJUTCBjb250ZW50IGluIEhUTUwgdGhhdCBjYW4ndCBiZSByZXByZXNlbnRlZCBpbiBXb3JkcHJvY2Vzc2luZ01MLCBhbHRob3VnaCB0aGlzIHByb2JhYmx5IGlzIHJhcmUuCisvLyBUaGUgcmV2ZXJzZSBpcyBub3QgdHJ1ZSAtIGFsbCBSVEwgV29yZHByb2Nlc3NpbmdNTCBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gSFRNTCwgYnV0IHRoZXJlIGlzIHNvbWUgSFRNTCBSVEwgY29udGVudCB0aGF0IGNhbiBvbmx5CisvLyBiZSBhcHByb3hpbWF0ZWQgaW4gV29yZHByb2Nlc3NpbmdNTC4KKworLy8gaGF2ZSBJIGhhbmRsZWQgYWxsIGZvcm1zIG9mIGNvbG9ycz8gc2VlIEdldFdtbENvbG9yRnJvbUV4cHJlc3Npb24gaW4gSHRtbFRvV21sQ3NzQXBwbGllcgorCisvLyBtaW4taGVpZ2h0IGFuZCBtYXgtaGVpZ2h0IG5vdCBpbXBsZW1lbnRlZCB5ZXQuCisKKy8vIGludGVybmFsIGh5cGVybGlua3MgYXJlIG5vdCBzdXBwb3J0ZWQuICBJIGJlbGlldmUgaXQgcG9zc2libGUgLSBib29rbWFya3MgY2FuIGJlIGNyZWF0ZWQsIGh5cGVybGlua3MgdG8gdGhlIGJvb2ttYXJrIGNhbiBiZSBjcmVhdGVkLgorCisvLyBUbyBiZSBzdXBwb3J0ZWQgaW4gZnV0dXJlCisvLyBwYWdlLWJyZWFrLWJlZm9yZTphbHdheXMKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUb0RvIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZQorLy8gSSdtIG5vdCBpbXBsZW1lbnRpbmcgY2FwdGlvbiBleGFjdGx5IGNvcnJlY3RseS4gIElmIGNhcHRpb24gZG9lcyBub3QgaGF2ZSBib3JkZXJzLCB0aGVuIHRoZXJlIG5lZWRzIHRvIG5vdCBiZSBhIGJvcmRlciBhcm91bmQgdGhlIHRhYmxlLAorLy8gb3RoZXJ3aXNlIGl0IGxvb2tzIGFzIGlmIGNhcHRpb24gaGFzIGEgYm9yZGVyLiAgU2VlIFQxMjAwLiAgSWYgdGhlcmUgaXMsIHBlciB0aGUgbWFya3VwLCBhIHRhYmxlIGJvcmRlciwgYnV0IGNhcHRpb24gZG9lcyBub3QgaGF2ZSBhIGJvcmRlciwKKy8vIHRoZW4gbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbGwgb2YgdGhlIGNlbGxzIGJlbG93IHRoZSBjYXB0aW9uIGhhdmUgdGhlIGJvcmRlciBvbiB0aGUgYXBwcm9wcmlhdGUgc2lkZXMgc28gdGhhdCBpdCBsb29rcyBhcyBpZiB0aGUgdGFibGUKKy8vIGhhcyBhIGJvcmRlci4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nLkltYWdpbmc7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbDsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1M7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBTeXN0ZW0uV2luZG93cy5Gb3JtczsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbAoreworICAgIHB1YmxpYyBjbGFzcyBFbGVtZW50VG9TdHlsZU1hcAorICAgIHsKKyAgICAgICAgcHVibGljIHN0cmluZyBFbGVtZW50TmFtZTsKKyAgICAgICAgcHVibGljIHN0cmluZyBTdHlsZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMb2NhbEV4dGVuc2lvbnMKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ3NzRXhwcmVzc2lvbiBHZXRQcm9wKHRoaXMgWEVsZW1lbnQgZWxlbWVudCwgc3RyaW5nIHByb3BlcnR5TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgRGljdGlvbmFyeTxzdHJpbmcsIENzc0V4cHJlc3Npb24+IGQgPSBlbGVtZW50LkFubm90YXRpb248RGljdGlvbmFyeTxzdHJpbmcsIENzc0V4cHJlc3Npb24+PigpOworICAgICAgICAgICAgaWYgKGQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZC5Db250YWluc0tleShwcm9wZXJ0eU5hbWUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZFtwcm9wZXJ0eU5hbWVdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgSHRtbFRvV21sQ29udmVydGVyQ29yZQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBXbWxEb2N1bWVudCBDb252ZXJ0SHRtbFRvV21sKAorICAgICAgICAgICAgc3RyaW5nIGRlZmF1bHRDc3MsCisgICAgICAgICAgICBzdHJpbmcgYXV0aG9yQ3NzLAorICAgICAgICAgICAgc3RyaW5nIHVzZXJDc3MsCisgICAgICAgICAgICBYRWxlbWVudCB4aHRtbCwKKyAgICAgICAgICAgIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ29udmVydEh0bWxUb1dtbChkZWZhdWx0Q3NzLCBhdXRob3JDc3MsIHVzZXJDc3MsIHhodG1sLCBzZXR0aW5ncywgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFdtbERvY3VtZW50IENvbnZlcnRIdG1sVG9XbWwoCisgICAgICAgICAgICBzdHJpbmcgZGVmYXVsdENzcywKKyAgICAgICAgICAgIHN0cmluZyBhdXRob3JDc3MsCisgICAgICAgICAgICBzdHJpbmcgdXNlckNzcywKKyAgICAgICAgICAgIFhFbGVtZW50IHhodG1sLAorICAgICAgICAgICAgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MsCisgICAgICAgICAgICBXbWxEb2N1bWVudCBlbXB0eURvY3VtZW50LAorICAgICAgICAgICAgc3RyaW5nIGFubm90YXRlZEh0bWxEdW1wRmlsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlbXB0eURvY3VtZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgZW1wdHlEb2N1bWVudCA9IEh0bWxUb1dtbENvbnZlcnRlci5FbXB0eURvY3VtZW50OworCisgICAgICAgICAgICBOZXh0UmVjdElkID0gMTAyNTsKKworICAgICAgICAgICAgLy8gY2xvbmUgYW5kIHRyYW5zZm9ybSBhbGwgZWxlbWVudCBuYW1lcyB0byBsb3dlciBjYXNlCisgICAgICAgICAgICBYRWxlbWVudCBodG1sID0gKFhFbGVtZW50KVRyYW5zZm9ybVRvTG93ZXIoeGh0bWwpOworCisgICAgICAgICAgICAvLyBhZGQgcHNldWRvIGNlbGxzIGZvciByb3dzcGFuCisgICAgICAgICAgICBodG1sID0gKFhFbGVtZW50KUFkZFBzZXVkb0NlbGxzKGh0bWwpOworCisgICAgICAgICAgICBodG1sID0gKFhFbGVtZW50KVRyYW5zZm9ybVdoaXRlU3BhY2VJblByZUNvZGVUdEtiZFNhbXAoaHRtbCwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgQ3NzRG9jdW1lbnQgZGVmYXVsdENzc0RvYywgdXNlckNzc0RvYywgYXV0aG9yQ3NzRG9jOworICAgICAgICAgICAgQ3NzQXBwbGllci5BcHBseUFsbENzcygKKyAgICAgICAgICAgICAgICBkZWZhdWx0Q3NzLAorICAgICAgICAgICAgICAgIGF1dGhvckNzcywKKyAgICAgICAgICAgICAgICB1c2VyQ3NzLAorICAgICAgICAgICAgICAgIGh0bWwsCisgICAgICAgICAgICAgICAgc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgb3V0IGRlZmF1bHRDc3NEb2MsCisgICAgICAgICAgICAgICAgb3V0IGF1dGhvckNzc0RvYywKKyAgICAgICAgICAgICAgICBvdXQgdXNlckNzc0RvYywKKyAgICAgICAgICAgICAgICBhbm5vdGF0ZWRIdG1sRHVtcEZpbGVOYW1lKTsKKworICAgICAgICAgICAgV21sRG9jdW1lbnQgbmV3V21sRG9jdW1lbnQ7CisKKyAgICAgICAgICAgIHVzaW5nIChPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgc3RyZWFtRG9jID0gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudChlbXB0eURvY3VtZW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gc3RyZWFtRG9jLkdldFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFubm90YXRlT2xVbCh3RG9jLCBodG1sKTsKKyAgICAgICAgICAgICAgICAgICAgVXBkYXRlTWFpbkRvY3VtZW50UGFydCh3RG9jLCBodG1sLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZU1haW5Eb2N1bWVudFBhcnQod0RvYyk7CisgICAgICAgICAgICAgICAgICAgIFN0eWxlc1VwZGF0ZXIuVXBkYXRlU3R5bGVzUGFydCh3RG9jLCBodG1sLCBzZXR0aW5ncywgZGVmYXVsdENzc0RvYywgYXV0aG9yQ3NzRG9jLCB1c2VyQ3NzRG9jKTsKKyAgICAgICAgICAgICAgICAgICAgSHRtbFRvV21sRm9udFVwZGF0ZXIuVXBkYXRlRm9udHNQYXJ0KHdEb2MsIGh0bWwsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgVGhlbWVVcGRhdGVyLlVwZGF0ZVRoZW1lUGFydCh3RG9jLCBodG1sLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIE51bWJlcmluZ1VwZGF0ZXIuVXBkYXRlTnVtYmVyaW5nUGFydCh3RG9jLCBodG1sLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5ld1dtbERvY3VtZW50ID0gc3RyZWFtRG9jLkdldE1vZGlmaWVkV21sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ld1dtbERvY3VtZW50OworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgVHJhbnNmb3JtVG9Mb3dlcihYTm9kZSBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgZSA9IG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUuTG9jYWxOYW1lLlRvTG93ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCkuU2VsZWN0KGEgPT4gbmV3IFhBdHRyaWJ1dGUoYS5OYW1lLkxvY2FsTmFtZS5Ub0xvd2VyKCksIGEuVmFsdWUpKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybVRvTG93ZXIobikpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgQWRkUHNldWRvQ2VsbHMoWEVsZW1lbnQgaHRtbCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJvd1NwYW5DZWxsID0gaHRtbAorICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoWGh0bWxOb05hbWVzcGFjZS50ZCkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KHRkID0+IHRkLkF0dHJpYnV0ZShYaHRtbE5vTmFtZXNwYWNlLnJvd3NwYW4pICE9IG51bGwgJiYgdGQuQXR0cmlidXRlKCJIdG1sVG9XbWxWTWVyZ2VSZXN0YXJ0IikgPT0gbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKHJvd1NwYW5DZWxsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHJvd1NwYW5DZWxsLkFkZCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIkh0bWxUb1dtbFZNZXJnZVJlc3RhcnQiLCAidHJ1ZSIpKTsKKyAgICAgICAgICAgICAgICBpbnQgY29sTnVtYmVyID0gcm93U3BhbkNlbGwuRWxlbWVudHNCZWZvcmVTZWxmKFhodG1sTm9OYW1lc3BhY2UudGQpLkNvdW50KCk7CisgICAgICAgICAgICAgICAgaW50IG51bWJlclBzZXVkb1RvQWRkID0gKGludClyb3dTcGFuQ2VsbC5BdHRyaWJ1dGUoWGh0bWxOb05hbWVzcGFjZS5yb3dzcGFuKSAtIDE7CisgICAgICAgICAgICAgICAgdmFyIHRyID0gcm93U3BhbkNlbGwuQW5jZXN0b3JzKFhodG1sTm9OYW1lc3BhY2UudHIpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKHRyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW52YWxpZCBIVE1MIC0gdGQgZG9lcyBub3QgaGF2ZSBwYXJlbnQgdHIiKTsKKyAgICAgICAgICAgICAgICB2YXIgcm93c1RvQWRkVG8gPSB0cgorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHNBZnRlclNlbGYoWGh0bWxOb05hbWVzcGFjZS50cikKKyAgICAgICAgICAgICAgICAgICAgLlRha2UobnVtYmVyUHNldWRvVG9BZGQpCisgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcm93VG9BZGRUbyBpbiByb3dzVG9BZGRUbykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2xOdW1iZXIgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGRUb0FkZEFmdGVyID0gcm93VG9BZGRUbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhYaHRtbE5vTmFtZXNwYWNlLnRkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ta2lwKGNvbE51bWJlciAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSBuZXcgWEVsZW1lbnQoWGh0bWxOb05hbWVzcGFjZS50ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTcGFuQ2VsbC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIkh0bWxUb1dtbFZNZXJnZU5vUmVzdGFydCIsICJ0cnVlIikpOworICAgICAgICAgICAgICAgICAgICAgICAgdGRUb0FkZEFmdGVyLkFkZEFmdGVyU2VsZih0ZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGRUb0FkZEJlZm9yZSA9IHJvd1RvQWRkVG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoWGh0bWxOb05hbWVzcGFjZS50ZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcChjb2xOdW1iZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSBuZXcgWEVsZW1lbnQoWGh0bWxOb05hbWVzcGFjZS50ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTcGFuQ2VsbC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIkh0bWxUb1dtbFZNZXJnZU5vUmVzdGFydCIsICJ0cnVlIikpOworICAgICAgICAgICAgICAgICAgICAgICAgdGRUb0FkZEJlZm9yZS5BZGRCZWZvcmVTZWxmKHRkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBodG1sOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIE51bWJlcmVkSXRlbUFubm90YXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBudW1JZDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgaWx2bDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgbGlzdFN0eWxlVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQW5ub3RhdGVPbFVsKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYywgWEVsZW1lbnQgaHRtbCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG51bUlkOworICAgICAgICAgICAgTnVtYmVyaW5nVXBkYXRlci5HZXROZXh0TnVtSWQod0RvYywgb3V0IG51bUlkKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGh0bWwuRGVzY2VuZGFudHNBbmRTZWxmKCkuV2hlcmUoZCA9PiBkLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5vbCB8fCBkLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS51bCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgcGFyZW50T2xVbCA9IGl0ZW0uQW5jZXN0b3JzKCkuV2hlcmUoYSA9PiBhLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5vbCB8fCBhLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS51bCkuTGFzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGludCBudW1JZFRvVXNlOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnRPbFVsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIG51bUlkVG9Vc2UgPSBwYXJlbnRPbFVsLkFubm90YXRpb248TnVtYmVyZWRJdGVtQW5ub3RhdGlvbj4oKS5udW1JZDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG51bUlkVG9Vc2UgPSBudW1JZCsrOworICAgICAgICAgICAgICAgIHN0cmluZyBsc3QgPSBDc3NBcHBsaWVyLkdldENvbXB1dGVkUHJvcGVydHlWYWx1ZShudWxsLCBpdGVtLCAibGlzdC1zdHlsZS10eXBlIiwgbnVsbCkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpdGVtLkFkZEFubm90YXRpb24obmV3IE51bWJlcmVkSXRlbUFubm90YXRpb24KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG51bUlkID0gbnVtSWRUb1VzZSwKKyAgICAgICAgICAgICAgICAgICAgaWx2bCA9IGl0ZW0uQW5jZXN0b3JzKCkuV2hlcmUoYSA9PiBhLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5vbCB8fCBhLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS51bCkuQ291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgbGlzdFN0eWxlVHlwZSA9IGxzdCwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVXBkYXRlTWFpbkRvY3VtZW50UGFydChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIFhFbGVtZW50IGh0bWwsIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgeERvYyA9IFhEb2N1bWVudC5QYXJzZSgKK0AiPHc6ZG9jdW1lbnQgeG1sbnM6d3BjPSdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMTAvd29yZHByb2Nlc3NpbmdDYW52YXMnCisgICAgICAgICAgICB4bWxuczptYz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL21hcmt1cC1jb21wYXRpYmlsaXR5LzIwMDYnCisgICAgICAgICAgICB4bWxuczpvPSd1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UnCisgICAgICAgICAgICB4bWxuczpyPSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzJworICAgICAgICAgICAgeG1sbnM6bT0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvbWF0aCcKKyAgICAgICAgICAgIHhtbG5zOnY9J3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sJworICAgICAgICAgICAgeG1sbnM6d3AxND0naHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDEwL3dvcmRwcm9jZXNzaW5nRHJhd2luZycKKyAgICAgICAgICAgIHhtbG5zOndwPSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvd29yZHByb2Nlc3NpbmdEcmF3aW5nJworICAgICAgICAgICAgeG1sbnM6dzEwPSd1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkJworICAgICAgICAgICAgeG1sbnM6dz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluJworICAgICAgICAgICAgeG1sbnM6dzE0PSdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMTAvd29yZG1sJworICAgICAgICAgICAgeG1sbnM6d3BnPSdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMTAvd29yZHByb2Nlc3NpbmdHcm91cCcKKyAgICAgICAgICAgIHhtbG5zOndwaT0naHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDEwL3dvcmRwcm9jZXNzaW5nSW5rJworICAgICAgICAgICAgeG1sbnM6d25lPSdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMDYvd29yZG1sJworICAgICAgICAgICAgeG1sbnM6d3BzPSdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMTAvd29yZHByb2Nlc3NpbmdTaGFwZScKKyAgICAgICAgICAgIG1jOklnbm9yYWJsZT0ndzE0IHdwMTQnLz4iKTsKKworICAgICAgICAgICAgWEVsZW1lbnQgYm9keSA9IG5ldyBYRWxlbWVudChXLmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm0oaHRtbCwgc2V0dGluZ3MsIHdEb2MsIE5leHRFeHBlY3RlZC5QYXJhZ3JhcGgsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLlNlY3RQcik7CisKKyAgICAgICAgICAgIEFkZE5vbkJyZWFraW5nU3BhY2VzRm9yU3BhbnNXaXRoV2lkdGgod0RvYywgYm9keSk7CisgICAgICAgICAgICBib2R5ID0gKFhFbGVtZW50KVRyYW5zZm9ybUFuZE9yZGVyRWxlbWVudHMoYm9keSk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkIGluIGJvZHkuRGVzY2VuZGFudHMoKSkKKyAgICAgICAgICAgICAgICBkLkF0dHJpYnV0ZXMoKS5XaGVyZShhID0+IGEuTmFtZS5OYW1lc3BhY2UgPT0gUHRPcGVuWG1sLnB0KS5SZW1vdmUoKTsKKyAgICAgICAgICAgIHhEb2MuUm9vdC5BZGQoYm9keSk7CisgICAgICAgICAgICB3RG9jLk1haW5Eb2N1bWVudFBhcnQuUHV0WERvY3VtZW50KHhEb2MpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFRyYW5zZm9ybVdoaXRlU3BhY2VJblByZUNvZGVUdEtiZFNhbXAoWE5vZGUgbm9kZSwgYm9vbCBpblByZSwgYm9vbCBpbk90aGVyKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLnByZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtV2hpdGVTcGFjZUluUHJlQ29kZVR0S2JkU2FtcChuLCB0cnVlLCBmYWxzZSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLmNvZGUgfHwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UudHQgfHwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2Uua2JkIHx8CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLnNhbXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybVdoaXRlU3BhY2VJblByZUNvZGVUdEtiZFNhbXAobiwgZmFsc2UsIHRydWUpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybVdoaXRlU3BhY2VJblByZUNvZGVUdEtiZFNhbXAobiwgZmFsc2UsIGZhbHNlKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgWFRleHQgeHQgPSBub2RlIGFzIFhUZXh0OworICAgICAgICAgICAgaWYgKHh0ICE9IG51bGwgJiYgaW5QcmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHh0LlZhbHVlLlRyaW1TdGFydCgnXHInLCAnXG4nKS5UcmltRW5kKCdccicsICdcbicpOworICAgICAgICAgICAgICAgIHZhciBncm91cGVkQ2hhcmFjdGVycyA9IHZhbC5Hcm91cEFkamFjZW50KGMgPT4gYyA9PSAnXHInIHx8IGMgPT0gJ1xuJyk7CisgICAgICAgICAgICAgICAgdmFyIG5ld05vZGVzID0gZ3JvdXBlZENoYXJhY3RlcnMuU2VsZWN0KGcgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChnLktleSA9PSB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmplY3QpKG5ldyBYRWxlbWVudChYaHRtbE5vTmFtZXNwYWNlLmJyKSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyB4ID0gZy5TZWxlY3QoYyA9PiBjLlRvU3RyaW5nKCkpLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWFRleHQoeCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld05vZGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHh0ICE9IG51bGwgJiYgaW5PdGhlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdmFsID0geHQuVmFsdWUuVHJpbVN0YXJ0KCdccicsICdcbicsICdcdCcsICcgJykuVHJpbUVuZCgnXHInLCAnXG4nLCAnXHQnLCAnICcpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWFRleHQodmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxYTmFtZSwgaW50PiBPcmRlcl9wUHIgPSBuZXcgRGljdGlvbmFyeTxYTmFtZSwgaW50PgorICAgICAgICB7CisgICAgICAgICAgICB7IFcucFN0eWxlLCAxMCB9LAorICAgICAgICAgICAgeyBXLmtlZXBOZXh0LCAyMCB9LAorICAgICAgICAgICAgeyBXLmtlZXBMaW5lcywgMzAgfSwKKyAgICAgICAgICAgIHsgVy5wYWdlQnJlYWtCZWZvcmUsIDQwIH0sCisgICAgICAgICAgICB7IFcuZnJhbWVQciwgNTAgfSwKKyAgICAgICAgICAgIHsgVy53aWRvd0NvbnRyb2wsIDYwIH0sCisgICAgICAgICAgICB7IFcubnVtUHIsIDcwIH0sCisgICAgICAgICAgICB7IFcuc3VwcHJlc3NMaW5lTnVtYmVycywgODAgfSwKKyAgICAgICAgICAgIHsgVy5wQmRyLCA5MCB9LAorICAgICAgICAgICAgeyBXLnNoZCwgMTAwIH0sCisgICAgICAgICAgICB7IFcudGFicywgMTIwIH0sCisgICAgICAgICAgICB7IFcuc3VwcHJlc3NBdXRvSHlwaGVucywgMTMwIH0sCisgICAgICAgICAgICB7IFcua2luc29rdSwgMTQwIH0sCisgICAgICAgICAgICB7IFcud29yZFdyYXAsIDE1MCB9LAorICAgICAgICAgICAgeyBXLm92ZXJmbG93UHVuY3QsIDE2MCB9LAorICAgICAgICAgICAgeyBXLnRvcExpbmVQdW5jdCwgMTcwIH0sCisgICAgICAgICAgICB7IFcuYXV0b1NwYWNlREUsIDE4MCB9LAorICAgICAgICAgICAgeyBXLmF1dG9TcGFjZUROLCAxOTAgfSwKKyAgICAgICAgICAgIHsgVy5iaWRpLCAyMDAgfSwKKyAgICAgICAgICAgIHsgVy5hZGp1c3RSaWdodEluZCwgMjEwIH0sCisgICAgICAgICAgICB7IFcuc25hcFRvR3JpZCwgMjIwIH0sCisgICAgICAgICAgICB7IFcuc3BhY2luZywgMjMwIH0sCisgICAgICAgICAgICB7IFcuaW5kLCAyNDAgfSwKKyAgICAgICAgICAgIHsgVy5jb250ZXh0dWFsU3BhY2luZywgMjUwIH0sCisgICAgICAgICAgICB7IFcubWlycm9ySW5kZW50cywgMjYwIH0sCisgICAgICAgICAgICB7IFcuc3VwcHJlc3NPdmVybGFwLCAyNzAgfSwKKyAgICAgICAgICAgIHsgVy5qYywgMjgwIH0sCisgICAgICAgICAgICB7IFcudGV4dERpcmVjdGlvbiwgMjkwIH0sCisgICAgICAgICAgICB7IFcudGV4dEFsaWdubWVudCwgMzAwIH0sCisgICAgICAgICAgICB7IFcudGV4dGJveFRpZ2h0V3JhcCwgMzEwIH0sCisgICAgICAgICAgICB7IFcub3V0bGluZUx2bCwgMzIwIH0sCisgICAgICAgICAgICB7IFcuZGl2SWQsIDMzMCB9LAorICAgICAgICAgICAgeyBXLmNuZlN0eWxlLCAzNDAgfSwKKyAgICAgICAgICAgIHsgVy5yUHIsIDM1MCB9LAorICAgICAgICAgICAgeyBXLnNlY3RQciwgMzYwIH0sCisgICAgICAgICAgICB7IFcucFByQ2hhbmdlLCAzNzAgfSwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBEaWN0aW9uYXJ5PFhOYW1lLCBpbnQ+IE9yZGVyX3JQciA9IG5ldyBEaWN0aW9uYXJ5PFhOYW1lLCBpbnQ+CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgVy5pbnMsIDEwIH0sCisgICAgICAgICAgICB7IFcuZGVsLCAyMCB9LAorICAgICAgICAgICAgeyBXLnJTdHlsZSwgMzAgfSwKKyAgICAgICAgICAgIHsgVy5yRm9udHMsIDQwIH0sCisgICAgICAgICAgICB7IFcuYiwgNTAgfSwKKyAgICAgICAgICAgIHsgVy5iQ3MsIDYwIH0sCisgICAgICAgICAgICB7IFcuaSwgNzAgfSwKKyAgICAgICAgICAgIHsgVy5pQ3MsIDgwIH0sCisgICAgICAgICAgICB7IFcuY2FwcywgOTAgfSwKKyAgICAgICAgICAgIHsgVy5zbWFsbENhcHMsIDEwMCB9LAorICAgICAgICAgICAgeyBXLnN0cmlrZSwgMTEwIH0sCisgICAgICAgICAgICB7IFcuZHN0cmlrZSwgMTIwIH0sCisgICAgICAgICAgICB7IFcub3V0bGluZSwgMTMwIH0sCisgICAgICAgICAgICB7IFcuc2hhZG93LCAxNDAgfSwKKyAgICAgICAgICAgIHsgVy5lbWJvc3MsIDE1MCB9LAorICAgICAgICAgICAgeyBXLmltcHJpbnQsIDE2MCB9LAorICAgICAgICAgICAgeyBXLm5vUHJvb2YsIDE3MCB9LAorICAgICAgICAgICAgeyBXLnNuYXBUb0dyaWQsIDE4MCB9LAorICAgICAgICAgICAgeyBXLnZhbmlzaCwgMTkwIH0sCisgICAgICAgICAgICB7IFcud2ViSGlkZGVuLCAyMDAgfSwKKyAgICAgICAgICAgIHsgVy5jb2xvciwgMjEwIH0sCisgICAgICAgICAgICB7IFcuc3BhY2luZywgMjIwIH0sCisgICAgICAgICAgICB7IFcuX3csIDIzMCB9LAorICAgICAgICAgICAgeyBXLmtlcm4sIDI0MCB9LAorICAgICAgICAgICAgeyBXLnBvc2l0aW9uLCAyNTAgfSwKKyAgICAgICAgICAgIHsgVy5zeiwgMjYwIH0sCisgICAgICAgICAgICB7IFcxNC53U2hhZG93LCAyNzAgfSwKKyAgICAgICAgICAgIHsgVzE0LndUZXh0T3V0bGluZSwgMjgwIH0sCisgICAgICAgICAgICB7IFcxNC53VGV4dEZpbGwsIDI5MCB9LAorICAgICAgICAgICAgeyBXMTQud1NjZW5lM2QsIDMwMCB9LAorICAgICAgICAgICAgeyBXMTQud1Byb3BzM2QsIDMxMCB9LAorICAgICAgICAgICAgeyBXLnN6Q3MsIDMyMCB9LAorICAgICAgICAgICAgeyBXLmhpZ2hsaWdodCwgMzMwIH0sCisgICAgICAgICAgICB7IFcudSwgMzQwIH0sCisgICAgICAgICAgICB7IFcuZWZmZWN0LCAzNTAgfSwKKyAgICAgICAgICAgIHsgVy5iZHIsIDM2MCB9LAorICAgICAgICAgICAgeyBXLnNoZCwgMzcwIH0sCisgICAgICAgICAgICB7IFcuZml0VGV4dCwgMzgwIH0sCisgICAgICAgICAgICB7IFcudmVydEFsaWduLCAzOTAgfSwKKyAgICAgICAgICAgIHsgVy5ydGwsIDQwMCB9LAorICAgICAgICAgICAgeyBXLmNzLCA0MTAgfSwKKyAgICAgICAgICAgIHsgVy5lbSwgNDIwIH0sCisgICAgICAgICAgICB7IFcubGFuZywgNDMwIH0sCisgICAgICAgICAgICB7IFcuZWFzdEFzaWFuTGF5b3V0LCA0NDAgfSwKKyAgICAgICAgICAgIHsgVy5zcGVjVmFuaXNoLCA0NTAgfSwKKyAgICAgICAgICAgIHsgVy5vTWF0aCwgNDYwIH0sCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxYTmFtZSwgaW50PiBPcmRlcl90YmxQciA9IG5ldyBEaWN0aW9uYXJ5PFhOYW1lLCBpbnQ+CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgVy50YmxTdHlsZSwgMTAgfSwKKyAgICAgICAgICAgIHsgVy50YmxwUHIsIDIwIH0sCisgICAgICAgICAgICB7IFcudGJsT3ZlcmxhcCwgMzAgfSwKKyAgICAgICAgICAgIHsgVy5iaWRpVmlzdWFsLCA0MCB9LAorICAgICAgICAgICAgeyBXLnRibFN0eWxlUm93QmFuZFNpemUsIDUwIH0sCisgICAgICAgICAgICB7IFcudGJsU3R5bGVDb2xCYW5kU2l6ZSwgNjAgfSwKKyAgICAgICAgICAgIHsgVy50YmxXLCA3MCB9LAorICAgICAgICAgICAgeyBXLmpjLCA4MCB9LAorICAgICAgICAgICAgeyBXLnRibENlbGxTcGFjaW5nLCA5MCB9LAorICAgICAgICAgICAgeyBXLnRibEluZCwgMTAwIH0sCisgICAgICAgICAgICB7IFcudGJsQm9yZGVycywgMTEwIH0sCisgICAgICAgICAgICB7IFcuc2hkLCAxMjAgfSwKKyAgICAgICAgICAgIHsgVy50YmxMYXlvdXQsIDEzMCB9LAorICAgICAgICAgICAgeyBXLnRibENlbGxNYXIsIDE0MCB9LAorICAgICAgICAgICAgeyBXLnRibExvb2ssIDE1MCB9LAorICAgICAgICAgICAgeyBXLnRibENhcHRpb24sIDE2MCB9LAorICAgICAgICAgICAgeyBXLnRibERlc2NyaXB0aW9uLCAxNzAgfSwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBEaWN0aW9uYXJ5PFhOYW1lLCBpbnQ+IE9yZGVyX3RibEJvcmRlcnMgPSBuZXcgRGljdGlvbmFyeTxYTmFtZSwgaW50PgorICAgICAgICB7CisgICAgICAgICAgICB7IFcudG9wLCAxMCB9LAorICAgICAgICAgICAgeyBXLmxlZnQsIDIwIH0sCisgICAgICAgICAgICB7IFcuc3RhcnQsIDMwIH0sCisgICAgICAgICAgICB7IFcuYm90dG9tLCA0MCB9LAorICAgICAgICAgICAgeyBXLnJpZ2h0LCA1MCB9LAorICAgICAgICAgICAgeyBXLmVuZCwgNjAgfSwKKyAgICAgICAgICAgIHsgVy5pbnNpZGVILCA3MCB9LAorICAgICAgICAgICAgeyBXLmluc2lkZVYsIDgwIH0sCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxYTmFtZSwgaW50PiBPcmRlcl90Y1ByID0gbmV3IERpY3Rpb25hcnk8WE5hbWUsIGludD4KKyAgICAgICAgeworICAgICAgICAgICAgeyBXLmNuZlN0eWxlLCAxMCB9LAorICAgICAgICAgICAgeyBXLnRjVywgMjAgfSwKKyAgICAgICAgICAgIHsgVy5ncmlkU3BhbiwgMzAgfSwKKyAgICAgICAgICAgIHsgVy5oTWVyZ2UsIDQwIH0sCisgICAgICAgICAgICB7IFcudk1lcmdlLCA1MCB9LAorICAgICAgICAgICAgeyBXLnRjQm9yZGVycywgNjAgfSwKKyAgICAgICAgICAgIHsgVy5zaGQsIDcwIH0sCisgICAgICAgICAgICB7IFcubm9XcmFwLCA4MCB9LAorICAgICAgICAgICAgeyBXLnRjTWFyLCA5MCB9LAorICAgICAgICAgICAgeyBXLnRleHREaXJlY3Rpb24sIDEwMCB9LAorICAgICAgICAgICAgeyBXLnRjRml0VGV4dCwgMTEwIH0sCisgICAgICAgICAgICB7IFcudkFsaWduLCAxMjAgfSwKKyAgICAgICAgICAgIHsgVy5oaWRlTWFyaywgMTMwIH0sCisgICAgICAgICAgICB7IFcuaGVhZGVycywgMTQwIH0sCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxYTmFtZSwgaW50PiBPcmRlcl90Y0JvcmRlcnMgPSBuZXcgRGljdGlvbmFyeTxYTmFtZSwgaW50PgorICAgICAgICB7CisgICAgICAgICAgICB7IFcudG9wLCAxMCB9LAorICAgICAgICAgICAgeyBXLnN0YXJ0LCAyMCB9LAorICAgICAgICAgICAgeyBXLmxlZnQsIDMwIH0sCisgICAgICAgICAgICB7IFcuYm90dG9tLCA0MCB9LAorICAgICAgICAgICAgeyBXLnJpZ2h0LCA1MCB9LAorICAgICAgICAgICAgeyBXLmVuZCwgNjAgfSwKKyAgICAgICAgICAgIHsgVy5pbnNpZGVILCA3MCB9LAorICAgICAgICAgICAgeyBXLmluc2lkZVYsIDgwIH0sCisgICAgICAgICAgICB7IFcudGwyYnIsIDkwIH0sCisgICAgICAgICAgICB7IFcudHIyYmwsIDEwMCB9LAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8WE5hbWUsIGludD4gT3JkZXJfcEJkciA9IG5ldyBEaWN0aW9uYXJ5PFhOYW1lLCBpbnQ+CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgVy50b3AsIDEwIH0sCisgICAgICAgICAgICB7IFcubGVmdCwgMjAgfSwKKyAgICAgICAgICAgIHsgVy5ib3R0b20sIDMwIH0sCisgICAgICAgICAgICB7IFcucmlnaHQsIDQwIH0sCisgICAgICAgICAgICB7IFcuYmV0d2VlbiwgNTAgfSwKKyAgICAgICAgICAgIHsgVy5iYXIsIDYwIH0sCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFRyYW5zZm9ybUFuZE9yZGVyRWxlbWVudHMoWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5wUHIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKCkuU2VsZWN0KGUgPT4gKFhFbGVtZW50KVRyYW5zZm9ybUFuZE9yZGVyRWxlbWVudHMoZSkpLk9yZGVyQnkoZSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPcmRlcl9wUHIuQ29udGFpbnNLZXkoZS5OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9yZGVyX3BQcltlLk5hbWVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5OTk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuclByKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cygpLlNlbGVjdChlID0+IChYRWxlbWVudClUcmFuc2Zvcm1BbmRPcmRlckVsZW1lbnRzKGUpKS5PcmRlckJ5KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3JkZXJfclByLkNvbnRhaW5zS2V5KGUuTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcmRlcl9yUHJbZS5OYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk5OworICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRibFByKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cygpLlNlbGVjdChlID0+IChYRWxlbWVudClUcmFuc2Zvcm1BbmRPcmRlckVsZW1lbnRzKGUpKS5PcmRlckJ5KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3JkZXJfdGJsUHIuQ29udGFpbnNLZXkoZS5OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9yZGVyX3RibFByW2UuTmFtZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDk5OTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy50Y1ByKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cygpLlNlbGVjdChlID0+IChYRWxlbWVudClUcmFuc2Zvcm1BbmRPcmRlckVsZW1lbnRzKGUpKS5PcmRlckJ5KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3JkZXJfdGNQci5Db250YWluc0tleShlLk5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3JkZXJfdGNQcltlLk5hbWVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5OTk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcudGNCb3JkZXJzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cygpLlNlbGVjdChlID0+IChYRWxlbWVudClUcmFuc2Zvcm1BbmRPcmRlckVsZW1lbnRzKGUpKS5PcmRlckJ5KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3JkZXJfdGNCb3JkZXJzLkNvbnRhaW5zS2V5KGUuTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcmRlcl90Y0JvcmRlcnNbZS5OYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk5OworICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRibEJvcmRlcnMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKCkuU2VsZWN0KGUgPT4gKFhFbGVtZW50KVRyYW5zZm9ybUFuZE9yZGVyRWxlbWVudHMoZSkpLk9yZGVyQnkoZSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPcmRlcl90YmxCb3JkZXJzLkNvbnRhaW5zS2V5KGUuTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcmRlcl90YmxCb3JkZXJzW2UuTmFtZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDk5OTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5wQmRyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cygpLlNlbGVjdChlID0+IChYRWxlbWVudClUcmFuc2Zvcm1BbmRPcmRlckVsZW1lbnRzKGUpKS5PcmRlckJ5KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3JkZXJfcEJkci5Db250YWluc0tleShlLk5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3JkZXJfcEJkcltlLk5hbWVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5OTk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcucCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoVy5wUHIpLlNlbGVjdChlID0+IChYRWxlbWVudClUcmFuc2Zvcm1BbmRPcmRlckVsZW1lbnRzKGUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoKS5XaGVyZShlID0+IGUuTmFtZSAhPSBXLnBQcikuU2VsZWN0KGUgPT4gKFhFbGVtZW50KVRyYW5zZm9ybUFuZE9yZGVyRWxlbWVudHMoZSkpKTsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5yKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cyhXLnJQcikuU2VsZWN0KGUgPT4gKFhFbGVtZW50KVRyYW5zZm9ybUFuZE9yZGVyRWxlbWVudHMoZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cygpLldoZXJlKGUgPT4gZS5OYW1lICE9IFcuclByKS5TZWxlY3QoZSA9PiAoWEVsZW1lbnQpVHJhbnNmb3JtQW5kT3JkZXJFbGVtZW50cyhlKSkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtQW5kT3JkZXJFbGVtZW50cyhuKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZE5vbkJyZWFraW5nU3BhY2VzRm9yU3BhbnNXaXRoV2lkdGgoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jLCBYRWxlbWVudCBib2R5KQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBydW5zV2l0aFdpZHRoID0gYm9keQorICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cyhXLnIpCisgICAgICAgICAgICAgICAgLldoZXJlKHIgPT4gci5BdHRyaWJ1dGUoUHRPcGVuWG1sLkh0bWxUb1dtbENzc1dpZHRoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IHJ1biBpbiBydW5zV2l0aFdpZHRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IHAgPSBydW4uQW5jZXN0b3JzKFcucCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBwUHIgPSBwICE9IG51bGwgPyBwLkVsZW1lbnQoVy5wUHIpIDogbnVsbDsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCByUHIgPSBydW4uRWxlbWVudChXLnJQcik7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgckZvbnRzID0gclByICE9IG51bGwgPyByUHIuRWxlbWVudChXLnJGb250cykgOiBudWxsOworICAgICAgICAgICAgICAgIHN0cmluZyBzdHIgPSBydW4uRGVzY2VuZGFudHMoVy50KS5TZWxlY3QodCA9PiAoc3RyaW5nKSB0KS5TdHJpbmdDb25jYXRlbmF0ZSgpOworICAgICAgICAgICAgICAgIGlmICgocFByID09IG51bGwpIHx8IChyUHIgPT0gbnVsbCkgfHwgKHJGb250cyA9PSBudWxsKSB8fCAoc3RyID09ICIiKSkgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBBZGp1c3RGb250QXR0cmlidXRlcyh3RG9jLCBydW4sIHBQciwgclByKTsKKyAgICAgICAgICAgICAgICB2YXIgY3NhID0gbmV3IENoYXJTdHlsZUF0dHJpYnV0ZXMocFByLCByUHIpOworICAgICAgICAgICAgICAgIGNoYXIgY2hhclRvRXhhbWluZSA9IHN0ci5GaXJzdE9yRGVmYXVsdChjID0+ICFXZWFrQW5kTmV1dHJhbERpcmVjdGlvbmFsQ2hhcmFjdGVycy5Db250YWlucyhjKSk7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJUb0V4YW1pbmUgPT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgICAgY2hhclRvRXhhbWluZSA9IHN0clswXTsKKworICAgICAgICAgICAgICAgIEZvbnRUeXBlIGZ0ID0gRGV0ZXJtaW5lRm9udFR5cGVGcm9tQ2hhcmFjdGVyKGNoYXJUb0V4YW1pbmUsIGNzYSk7CisgICAgICAgICAgICAgICAgc3RyaW5nIGZvbnRUeXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBzdHJpbmcgbGFuZ3VhZ2VUeXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZ0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGb250VHlwZS5Bc2NpaToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRUeXBlID0gKHN0cmluZykgckZvbnRzLkF0dHJpYnV0ZShXLmFzY2lpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlVHlwZSA9ICJ3ZXN0ZXJuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZvbnRUeXBlLkhBbnNpOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9udFR5cGUgPSAoc3RyaW5nKSByRm9udHMuQXR0cmlidXRlKFcuaEFuc2kpOworICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VUeXBlID0gIndlc3Rlcm4iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRm9udFR5cGUuRWFzdEFzaWE6CisgICAgICAgICAgICAgICAgICAgICAgICBmb250VHlwZSA9IChzdHJpbmcpIHJGb250cy5BdHRyaWJ1dGUoVy5lYXN0QXNpYSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVR5cGUgPSAiZWFzdEFzaWEiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRm9udFR5cGUuQ1M6CisgICAgICAgICAgICAgICAgICAgICAgICBmb250VHlwZSA9IChzdHJpbmcpIHJGb250cy5BdHRyaWJ1dGUoVy5jcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVR5cGUgPSAiYmlkaSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZm9udFR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhBdHRyaWJ1dGUgZm9udE5hbWVBdHRyaWJ1dGUgPSBydW4uQXR0cmlidXRlKFB0T3BlblhtbC5Gb250TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb250TmFtZUF0dHJpYnV0ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcnVuLkFkZChuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuRm9udE5hbWUsIGZvbnRUeXBlKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbnROYW1lQXR0cmlidXRlLlNldFZhbHVlKGZvbnRUeXBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGFuZ3VhZ2VUeXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYQXR0cmlidXRlIGxhbmd1YWdlVHlwZUF0dHJpYnV0ZSA9IHJ1bi5BdHRyaWJ1dGUoUHRPcGVuWG1sLkxhbmd1YWdlVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZVR5cGVBdHRyaWJ1dGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcnVuLkFkZChuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuTGFuZ3VhZ2VUeXBlLCBsYW5ndWFnZVR5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlVHlwZUF0dHJpYnV0ZS5TZXRWYWx1ZShsYW5ndWFnZVR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IHBpeFdpZHRoID0gQ2FsY1dpZHRoT2ZSdW5JblBpeGVscyhydW4pID8/IDA7CisKKyAgICAgICAgICAgICAgICAvLyBjYWxjIHdpZHRoIG9mIG5vbiBicmVha2luZyBzcGFjZXMKKyAgICAgICAgICAgICAgICB2YXIgbnBTcFJ1biA9IG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgIHJ1bi5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIHJ1bi5FbGVtZW50cyhXLnJQciksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnQsICJcdTAwYTAiKSk7CisgICAgICAgICAgICAgICAgaW50IG5iU3BXaWR0aCA9IENhbGNXaWR0aE9mUnVuSW5QaXhlbHMobnBTcFJ1bikgPz8gMDsKKyAgICAgICAgICAgICAgICBpZiAobmJTcFdpZHRoID09IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgLy8gZ2V0IEh0bWxUb1dtbENzc1dpZHRoIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIHZhciBjc3NXaWR0aCA9IChzdHJpbmcpIHJ1bi5BdHRyaWJ1dGUoUHRPcGVuWG1sLkh0bWxUb1dtbENzc1dpZHRoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNzc1dpZHRoLkVuZHNXaXRoKCJwdCIpKSBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGNzc1dpZHRoID0gY3NzV2lkdGguU3Vic3RyaW5nKDAsIGNzc1dpZHRoLkxlbmd0aCAtIDIpOworICAgICAgICAgICAgICAgIGRlY2ltYWwgY3NzV2lkdGhJbkRlY2ltYWw7CisgICAgICAgICAgICAgICAgaWYgKCFkZWNpbWFsLlRyeVBhcnNlKGNzc1dpZHRoLCBvdXQgY3NzV2lkdGhJbkRlY2ltYWwpKSBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG5vbi1icmVha2luZyBzcGFjZXMgdG8gYWRkCisgICAgICAgICAgICAgICAgZGVjaW1hbCBjc3NXaWR0aEluUGl4ZWxzID0gY3NzV2lkdGhJbkRlY2ltYWwvNzIqOTY7CisgICAgICAgICAgICAgICAgdmFyIG51bWJlck9mTnBTcFRvQWRkID0gKGludCkgKChjc3NXaWR0aEluUGl4ZWxzIC0gcGl4V2lkdGgpL25iU3BXaWR0aCk7CisgICAgICAgICAgICAgICAgaWYgKG51bWJlck9mTnBTcFRvQWRkID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcnVuLkFkZChuZXcgWEVsZW1lbnQoVy50LCAiIi5QYWRSaWdodChudW1iZXJPZk5wU3BUb0FkZCwgJ1x1MDBhMCcpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIE5vcm1hbGl6ZU1haW5Eb2N1bWVudFBhcnQoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jKQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgbWFpblhEb2MgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBYRWxlbWVudCBuZXdSb290ID0gKFhFbGVtZW50KU5vcm1hbGl6ZVRyYW5zZm9ybShtYWluWERvYy5Sb290KTsKKyAgICAgICAgICAgIG1haW5YRG9jLlJvb3QuUmVwbGFjZVdpdGgobmV3Um9vdCk7CisgICAgICAgICAgICB3RG9jLk1haW5Eb2N1bWVudFBhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgTm9ybWFsaXplVHJhbnNmb3JtKFhOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcucCAmJiBlbGVtZW50LkVsZW1lbnRzKCkuQW55KGMgPT4gYy5OYW1lID09IFcucCB8fCBjLk5hbWUgPT0gVy50YmwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwZWRDaGlsZHJlbiA9IGVsZW1lbnQuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoZSA9PiBlLk5hbWUgPT0gVy5wIHx8IGUuTmFtZSA9PSBXLnRibCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDb250ZW50ID0gZ3JvdXBlZENoaWxkcmVuCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGcgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZy5LZXkgPT0gZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBwYXJhZ3JhcGggPSBuZXcgWEVsZW1lbnQoVy5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cyhXLnBQciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLldoZXJlKGdjID0+IGdjLk5hbWUgIT0gVy5wUHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmplY3QpcGFyYWdyYXBoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZy5TZWxlY3QobiA9PiBOb3JtYWxpemVUcmFuc2Zvcm0obikpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdDb250ZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBOb3JtYWxpemVUcmFuc2Zvcm0obikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIE5leHRFeHBlY3RlZAorICAgICAgICB7CisgICAgICAgICAgICBQYXJhZ3JhcGgsCisgICAgICAgICAgICBSdW4sCisgICAgICAgICAgICBTdWJSdW4sCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgVHJhbnNmb3JtKFhOb2RlIG5vZGUsIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzLCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIE5leHRFeHBlY3RlZCBuZXh0RXhwZWN0ZWQsIGJvb2wgcHJlc2VydmVXaGl0ZVNwYWNlKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLmEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcklkID0gIlIiICsgR3VpZC5OZXdHdWlkKCkuVG9TdHJpbmcoKS5SZXBsYWNlKCItIiwgIiIpOworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaHJlZiA9IChzdHJpbmcpZWxlbWVudC5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaHJlZik7CisgICAgICAgICAgICAgICAgICAgIGlmIChocmVmICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpID0gbmV3IFVyaShocmVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChVcmlGb3JtYXRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgclByID0gR2V0UnVuUHJvcGVydGllcyhlbGVtZW50LCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgcnVuID0gbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJQciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnQsIGVsZW1lbnQuVmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3W10geyBydW4gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdEb2MuTWFpbkRvY3VtZW50UGFydC5BZGRIeXBlcmxpbmtSZWxhdGlvbnNoaXAodXJpLCB0cnVlLCBySWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LkVsZW1lbnQoWGh0bWxOb05hbWVzcGFjZS5pbWcpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW1hZ2VUcmFuc2Zvcm1lZCA9IGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBUcmFuc2Zvcm0obiwgc2V0dGluZ3MsIHdEb2MsIG5leHRFeHBlY3RlZCwgcHJlc2VydmVXaGl0ZVNwYWNlKSkuT2ZUeXBlPFhFbGVtZW50PigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3SW1hZ2VUcmFuc2Zvcm1lZCA9IGltYWdlVHJhbnNmb3JtZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoaSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLkVsZW1lbnRzKFcuZHJhd2luZykuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UnVuID0gbmV3IFhFbGVtZW50KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9jUHIgPSBuZXdSdW4uRWxlbWVudHMoVy5kcmF3aW5nKS5FbGVtZW50cyhXUC5pbmxpbmUpLkVsZW1lbnRzKFdQLmRvY1ByKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jUHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhsaW5rQ2xpY2sgPSBuZXcgWEVsZW1lbnQoQS5obGlua0NsaWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFIuaWQsIHJJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJhIiwgQS5hLk5hbWVzcGFjZU5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY1ByLkFkZChobGlua0NsaWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3UnVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdJbWFnZVRyYW5zZm9ybWVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHJQciA9IEdldFJ1blByb3BlcnRpZXMoZWxlbWVudCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGh5cGVybGluayA9IG5ldyBYRWxlbWVudChXLmh5cGVybGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoUi5pZCwgcklkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJQciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnQsIGVsZW1lbnQuVmFsdWUpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1tdIHsgaHlwZXJsaW5rIH07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLmIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtKG4sIHNldHRpbmdzLCB3RG9jLCBuZXh0RXhwZWN0ZWQsIHByZXNlcnZlV2hpdGVTcGFjZSkpOworCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLmJvZHkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtKG4sIHNldHRpbmdzLCB3RG9jLCBuZXh0RXhwZWN0ZWQsIHByZXNlcnZlV2hpdGVTcGFjZSkpOworCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLmNhcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcudHIsCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRUYWJsZVJvd1Byb3BlcnRpZXMoZWxlbWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDZWxsUHJvcGVydGllc0ZvckNhcHRpb24oZWxlbWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybShuLCBzZXR0aW5ncywgd0RvYywgTmV4dEV4cGVjdGVkLlBhcmFncmFwaCwgcHJlc2VydmVXaGl0ZVNwYWNlKSkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UuZGl2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRFeHBlY3RlZCA9PSBOZXh0RXhwZWN0ZWQuUGFyYWdyYXBoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5EZXNjZW5kYW50cygpLkFueShkID0+IGQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLmgxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UubGkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5wIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UudGFibGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtKG4sIHNldHRpbmdzLCB3RG9jLCBuZXh0RXhwZWN0ZWQsIHByZXNlcnZlV2hpdGVTcGFjZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZW5lcmF0ZU5leHRFeHBlY3RlZChlbGVtZW50LCBzZXR0aW5ncywgd0RvYywgbnVsbCwgbmV4dEV4cGVjdGVkLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybShuLCBzZXR0aW5ncywgd0RvYywgbmV4dEV4cGVjdGVkLCBwcmVzZXJ2ZVdoaXRlU3BhY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5lbSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBUcmFuc2Zvcm0obiwgc2V0dGluZ3MsIHdEb2MsIE5leHRFeHBlY3RlZC5SdW4sIHByZXNlcnZlV2hpdGVTcGFjZSkpOworCisgICAgICAgICAgICAgICAgSGVhZGluZ0luZm8gaGkgPSBIZWFkaW5nVGFnTWFwLkZpcnN0T3JEZWZhdWx0KGh0bSA9PiBodG0uTmFtZSA9PSBlbGVtZW50Lk5hbWUpOworICAgICAgICAgICAgICAgIGlmIChoaSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdlbmVyYXRlTmV4dEV4cGVjdGVkKGVsZW1lbnQsIHNldHRpbmdzLCB3RG9jLCBoaS5TdHlsZU5hbWUsIE5leHRFeHBlY3RlZC5QYXJhZ3JhcGgsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UuaHIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IEdldE5leHRSZWN0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgaHIgPSBYRWxlbWVudC5QYXJzZSgKKyAgICAgICAgICAgICAgICAgICAgICBAIjx3OnAgeG1sbnM6dz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOm89J3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxuczp3MTQ9J2h0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3dvcmQvMjAxMC93b3JkbWwnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6dj0ndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwnPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dzpyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3OnBpY3QgdzE0OmFuY2hvcklkPScwREJDOUFERSc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8djpyZWN0IGlkPSdfeDAwMDBfaSIgKyBpICsgQCInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSd3aWR0aDowO2hlaWdodDoxLjVwdCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbzpocmFsaWduPSdjZW50ZXInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG86aHJzdGQ9J3QnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG86aHI9J3QnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxjb2xvcj0nI2EwYTBhMCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlZD0nZicvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdzpwaWN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3c6cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdzpwPiIpOworICAgICAgICAgICAgICAgICAgICBoci5BdHRyaWJ1dGVzKCkuV2hlcmUoYSA9PiBhLklzTmFtZXNwYWNlRGVjbGFyYXRpb24pLlJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLmh0bWwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtKG4sIHNldHRpbmdzLCB3RG9jLCBOZXh0RXhwZWN0ZWQuUGFyYWdyYXBoLCBwcmVzZXJ2ZVdoaXRlU3BhY2UpKTsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybShuLCBzZXR0aW5ncywgd0RvYywgbmV4dEV4cGVjdGVkLCBwcmVzZXJ2ZVdoaXRlU3BhY2UpKTsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5ibG9ja3F1b3RlKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybShuLCBzZXR0aW5ncywgd0RvYywgbmV4dEV4cGVjdGVkLCBwcmVzZXJ2ZVdoaXRlU3BhY2UpKTsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5pbWcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5QYXJlbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLmJvZHkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHBhcmEgPSBuZXcgWEVsZW1lbnQoVy5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFBhcmFncmFwaFByb3BlcnRpZXNGb3JJbWFnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybUltYWdlVG9XbWwoZWxlbWVudCwgc2V0dGluZ3MsIHdEb2MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgY29udGVudCA9IFRyYW5zZm9ybUltYWdlVG9XbWwoZWxlbWVudCwgc2V0dGluZ3MsIHdEb2MpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UubGkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2VuZXJhdGVOZXh0RXhwZWN0ZWQoZWxlbWVudCwgc2V0dGluZ3MsIHdEb2MsIG51bGwsIE5leHRFeHBlY3RlZC5QYXJhZ3JhcGgsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2Uub2wpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtKG4sIHNldHRpbmdzLCB3RG9jLCBOZXh0RXhwZWN0ZWQuUGFyYWdyYXBoLCBwcmVzZXJ2ZVdoaXRlU3BhY2UpKTsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdlbmVyYXRlTmV4dEV4cGVjdGVkKGVsZW1lbnQsIHNldHRpbmdzLCB3RG9jLCBudWxsLCBOZXh0RXhwZWN0ZWQuUGFyYWdyYXBoLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLnMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtKG4sIHNldHRpbmdzLCB3RG9jLCBuZXh0RXhwZWN0ZWQsIHByZXNlcnZlV2hpdGVTcGFjZSkpOworCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTaGFyZVBvaW50IFNwZWNpZmljICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8vIHRvZG8gc2hhcmVwb2ludCBzcGVjaWZpYworICAgICAgICAgICAgICAgIC8vaWYgKGVsZW1lbnQuTmFtZSA9PSBYaHRtbC5kaXYgJiYgKHN0cmluZyllbGVtZW50LkF0dHJpYnV0ZShYaHRtbC5fY2xhc3MpID09ICJtcy1ydGVFbGVtZW50LUNhbGxvdXQxIikKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAvLyAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcucCwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgLy8gdG9kbyBuZWVkIGEgc3R5bGUgZm9yIGNsYXNzCisgICAgICAgICAgICAgICAgLy8gICAgICAgIG5ldyBYRWxlbWVudChXLnBQciwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnBTdHlsZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgIm1zLXJ0ZUVsZW1lbnQtQ2FsbG91dDEiKSkpLAorICAgICAgICAgICAgICAgIC8vICAgICAgICBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudCwgZWxlbWVudC5WYWx1ZSkpKTsKKyAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2Uuc3BhbiAmJiAoc3RyaW5nKWVsZW1lbnQuQXR0cmlidXRlKFhodG1sTm9OYW1lc3BhY2UuaWQpID09ICJsYXlvdXRzRGF0YSIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRW5kIFNoYXJlUG9pbnQgU3BlY2lmaWMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2Uuc3BhbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzcGFuUmVwbGFjZW1lbnQgPSBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtKG4sIHNldHRpbmdzLCB3RG9jLCBuZXh0RXhwZWN0ZWQsIHByZXNlcnZlV2hpdGVTcGFjZSkpOworICAgICAgICAgICAgICAgICAgICB2YXIgZHVtbXlFbGVtZW50ID0gbmV3IFhFbGVtZW50KCJkdW1teSIsIHNwYW5SZXBsYWNlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdENoaWxkID0gZHVtbXlFbGVtZW50LkVsZW1lbnRzKCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgcnVuID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q2hpbGQgIT0gbnVsbCAmJiBmaXJzdENoaWxkLk5hbWUgPT0gVy5yKQorICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gZmlyc3RDaGlsZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1biAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PHN0cmluZywgQ3NzRXhwcmVzc2lvbj4gY29tcHV0ZWRQcm9wZXJ0aWVzID0gZWxlbWVudC5Bbm5vdGF0aW9uPERpY3Rpb25hcnk8c3RyaW5nLCBDc3NFeHByZXNzaW9uPj4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wdXRlZFByb3BlcnRpZXMgIT0gbnVsbCAmJiBjb21wdXRlZFByb3BlcnRpZXMuQ29udGFpbnNLZXkoIndpZHRoIikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHdpZHRoID0gY29tcHV0ZWRQcm9wZXJ0aWVzWyJ3aWR0aCJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCAhPSAiYXV0byIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bi5BZGQobmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLkh0bWxUb1dtbENzc1dpZHRoLCB3aWR0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByRm9udHNMb2NhbCA9IHJ1bi5FbGVtZW50KFcuckZvbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCByRm9udHNHbG9iYWwgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZURlZlBhcnQgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlRGVmUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgckZvbnRzR2xvYmFsID0gc3R5bGVEZWZQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QuRWxlbWVudHMoVy5kb2NEZWZhdWx0cykuRWxlbWVudHMoVy5yUHJEZWZhdWx0KS5FbGVtZW50cyhXLnJQcikuRWxlbWVudHMoVy5yRm9udHMpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByRm9udHNOZXcgPSBGb250TWVyZ2UockZvbnRzTG9jYWwsIHJGb250c0dsb2JhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJQciA9IHJ1bi5FbGVtZW50KFcuclByKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoclByICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgckZvbnRzRXhpc3RpbmcgPSByUHIuRWxlbWVudChXLnJGb250cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyRm9udHNFeGlzdGluZyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgclByLkFkZEZpcnN0KHJGb250c0dsb2JhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJGb250c0V4aXN0aW5nLlJlcGxhY2VXaXRoKHJGb250c0dsb2JhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGR1bW15RWxlbWVudC5FbGVtZW50cygpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwYW5SZXBsYWNlbWVudDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2Uuc3Ryb25nKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybShuLCBzZXR0aW5ncywgd0RvYywgbmV4dEV4cGVjdGVkLCBwcmVzZXJ2ZVdoaXRlU3BhY2UpKTsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2Uuc3ViKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybShuLCBzZXR0aW5ncywgd0RvYywgbmV4dEV4cGVjdGVkLCBwcmVzZXJ2ZVdoaXRlU3BhY2UpKTsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5zdXApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtKG4sIHNldHRpbmdzLCB3RG9jLCBuZXh0RXhwZWN0ZWQsIHByZXNlcnZlV2hpdGVTcGFjZSkpOworCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLnRhYmxlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgd21sVGFibGUgPSBuZXcgWEVsZW1lbnQoVy50YmwsCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRUYWJsZVByb3BlcnRpZXMoZWxlbWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRUYWJsZUdyaWQoZWxlbWVudCwgc2V0dGluZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybShuLCBzZXR0aW5ncywgd0RvYywgTmV4dEV4cGVjdGVkLlBhcmFncmFwaCwgcHJlc2VydmVXaGl0ZVNwYWNlKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gd21sVGFibGU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLnRib2R5KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybShuLCBzZXR0aW5ncywgd0RvYywgTmV4dEV4cGVjdGVkLlBhcmFncmFwaCwgcHJlc2VydmVXaGl0ZVNwYWNlKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UudGQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgdGRUZXh0ID0gZWxlbWVudC5EZXNjZW5kYW50Tm9kZXMoKS5PZlR5cGU8WFRleHQ+KCkuU2VsZWN0KHQgPT4gdC5WYWx1ZSkuU3RyaW5nQ29uY2F0ZW5hdGUoKS5UcmltKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBoYXNPdGhlclRoYW5TcGFuc0FuZFBhcmFzID0gZWxlbWVudC5EZXNjZW5kYW50cygpLkFueShkID0+IGQuTmFtZSAhPSBYaHRtbE5vTmFtZXNwYWNlLnNwYW4gJiYgZC5OYW1lICE9IFhodG1sTm9OYW1lc3BhY2UucCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZFRleHQgIT0gIiIgfHwgaGFzT3RoZXJUaGFuU3BhbnNBbmRQYXJhcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnRSYXcgPSBuZXcgWEVsZW1lbnQoImR1bW15IiwgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybShuLCBzZXR0aW5ncywgd0RvYywgTmV4dEV4cGVjdGVkLlBhcmFncmFwaCwgcHJlc2VydmVXaGl0ZVNwYWNlKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnRzID0gbmV3IFhFbGVtZW50KCJkdW1teSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudFJhdworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChlID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5OYW1lID09IFcuaHlwZXJsaW5rIHx8IGUuTmFtZSA9PSBXLnIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcucCwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLnRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENlbGxQcm9wZXJ0aWVzKGVsZW1lbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnRzLkVsZW1lbnRzKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBuZXcgWEVsZW1lbnQoVy5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFBhcmFncmFwaFByb3BlcnRpZXMoZWxlbWVudCwgbnVsbCwgc2V0dGluZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFJ1blByb3BlcnRpZXMoZWxlbWVudCwgc2V0dGluZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50LCAiIikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy50YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDZWxsUHJvcGVydGllcyhlbGVtZW50KSwgcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UudGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcudGMsCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRDZWxsSGVhZGVyUHJvcGVydGllcyhlbGVtZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBUcmFuc2Zvcm0obiwgc2V0dGluZ3MsIHdEb2MsIG5leHRFeHBlY3RlZCwgcHJlc2VydmVXaGl0ZVNwYWNlKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS50cikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy50ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldFRhYmxlUm93UHJvcGVydGllcyhlbGVtZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBUcmFuc2Zvcm0obiwgc2V0dGluZ3MsIHdEb2MsIG5leHRFeHBlY3RlZCwgcHJlc2VydmVXaGl0ZVNwYWNlKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS51KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybShuLCBzZXR0aW5ncywgd0RvYywgbmV4dEV4cGVjdGVkLCBwcmVzZXJ2ZVdoaXRlU3BhY2UpKTsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS51bCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBUcmFuc2Zvcm0obiwgc2V0dGluZ3MsIHdEb2MsIG5leHRFeHBlY3RlZCwgcHJlc2VydmVXaGl0ZVNwYWNlKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UuYnIpCisgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0RXhwZWN0ZWQgPT0gTmV4dEV4cGVjdGVkLlBhcmFncmFwaCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5yLCBuZXcgWEVsZW1lbnQoVy5icikpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UudHQgfHwgZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UuY29kZSB8fCBlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5rYmQgfHwgZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2Uuc2FtcCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBUcmFuc2Zvcm0obiwgc2V0dGluZ3MsIHdEb2MsIG5leHRFeHBlY3RlZCwgcHJlc2VydmVXaGl0ZVNwYWNlKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UucHJlKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2VuZXJhdGVOZXh0RXhwZWN0ZWQoZWxlbWVudCwgc2V0dGluZ3MsIHdEb2MsIG51bGwsIE5leHRFeHBlY3RlZC5QYXJhZ3JhcGgsIHRydWUpOworCisgICAgICAgICAgICAgICAgLy8gaWYgbm8gbWF0Y2ggdXAgdG8gdGhpcyBwb2ludCwgdGhlbiBqdXN0IHJlY3Vyc2l2ZWx5IHByb2Nlc3MgZGVzY2VuZGFudHMKKyAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybShuLCBzZXR0aW5ncywgd0RvYywgbmV4dEV4cGVjdGVkLCBwcmVzZXJ2ZVdoaXRlU3BhY2UpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5vZGUuUGFyZW50Lk5hbWUgIT0gWGh0bWxOb05hbWVzcGFjZS50aXRsZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gR2VuZXJhdGVOZXh0RXhwZWN0ZWQobm9kZSwgc2V0dGluZ3MsIHdEb2MsIG51bGwsIG5leHRFeHBlY3RlZCwgcHJlc2VydmVXaGl0ZVNwYWNlKTsKKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEZvbnRNZXJnZShYRWxlbWVudCBoaWdoZXJQcmlvcml0eUZvbnQsIFhFbGVtZW50IGxvd2VyUHJpb3JpdHlGb250KQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCByRm9udHM7CisKKyAgICAgICAgICAgIGlmIChoaWdoZXJQcmlvcml0eUZvbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbG93ZXJQcmlvcml0eUZvbnQ7CisgICAgICAgICAgICBpZiAobG93ZXJQcmlvcml0eUZvbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaGlnaGVyUHJpb3JpdHlGb250OworICAgICAgICAgICAgaWYgKGhpZ2hlclByaW9yaXR5Rm9udCA9PSBudWxsICYmIGxvd2VyUHJpb3JpdHlGb250ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJGb250cyA9IG5ldyBYRWxlbWVudChXLnJGb250cywKKyAgICAgICAgICAgICAgICAoaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmFzY2lpKSAhPSBudWxsIHx8IGhpZ2hlclByaW9yaXR5Rm9udC5BdHRyaWJ1dGUoVy5hc2NpaVRoZW1lKSAhPSBudWxsKSA/CisgICAgICAgICAgICAgICAgICAgIG5ld1tdIHsgaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmFzY2lpKSwgaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmFzY2lpVGhlbWUpIH0gOgorICAgICAgICAgICAgICAgICAgICBuZXdbXSB7IGxvd2VyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmFzY2lpKSwgbG93ZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuYXNjaWlUaGVtZSkgfSwKKyAgICAgICAgICAgICAgICAoaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmhBbnNpKSAhPSBudWxsIHx8IGhpZ2hlclByaW9yaXR5Rm9udC5BdHRyaWJ1dGUoVy5oQW5zaVRoZW1lKSAhPSBudWxsKSA/CisgICAgICAgICAgICAgICAgICAgIG5ld1tdIHsgaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmhBbnNpKSwgaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmhBbnNpVGhlbWUpIH0gOgorICAgICAgICAgICAgICAgICAgICBuZXdbXSB7IGxvd2VyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmhBbnNpKSwgbG93ZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuaEFuc2lUaGVtZSkgfSwKKyAgICAgICAgICAgICAgICAoaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmVhc3RBc2lhKSAhPSBudWxsIHx8IGhpZ2hlclByaW9yaXR5Rm9udC5BdHRyaWJ1dGUoVy5lYXN0QXNpYVRoZW1lKSAhPSBudWxsKSA/CisgICAgICAgICAgICAgICAgICAgIG5ld1tdIHsgaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmVhc3RBc2lhKSwgaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmVhc3RBc2lhVGhlbWUpIH0gOgorICAgICAgICAgICAgICAgICAgICBuZXdbXSB7IGxvd2VyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmVhc3RBc2lhKSwgbG93ZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuZWFzdEFzaWFUaGVtZSkgfSwKKyAgICAgICAgICAgICAgICAoaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmNzKSAhPSBudWxsIHx8IGhpZ2hlclByaW9yaXR5Rm9udC5BdHRyaWJ1dGUoVy5jc3RoZW1lKSAhPSBudWxsKSA/CisgICAgICAgICAgICAgICAgICAgIG5ld1tdIHsgaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmNzKSwgaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmNzdGhlbWUpIH0gOgorICAgICAgICAgICAgICAgICAgICBuZXdbXSB7IGxvd2VyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmNzKSwgbG93ZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuY3N0aGVtZSkgfSwKKyAgICAgICAgICAgICAgICAoaGlnaGVyUHJpb3JpdHlGb250LkF0dHJpYnV0ZShXLmhpbnQpICE9IG51bGwgPyBoaWdoZXJQcmlvcml0eUZvbnQuQXR0cmlidXRlKFcuaGludCkgOgorICAgICAgICAgICAgICAgICAgICBsb3dlclByaW9yaXR5Rm9udC5BdHRyaWJ1dGUoVy5oaW50KSkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIHJldHVybiByRm9udHM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQ/IENhbGNXaWR0aE9mUnVuSW5QaXhlbHMoWEVsZW1lbnQgcikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZvbnROYW1lID0gKHN0cmluZylyLkF0dHJpYnV0ZShQdE9wZW5YbWwuRm9udE5hbWUpID8/CisgICAgICAgICAgICAgICAoc3RyaW5nKXIuQW5jZXN0b3JzKFcucCkuRmlyc3QoKS5BdHRyaWJ1dGUoUHRPcGVuWG1sLkZvbnROYW1lKTsKKyAgICAgICAgICAgIGlmIChmb250TmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3IsIHNob3VsZCBoYXZlIEZvbnROYW1lIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgaWYgKFVua25vd25Gb250cy5Db250YWlucyhmb250TmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIGlmIChVbmtub3duRm9udHMuQ29udGFpbnMoZm9udE5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICB2YXIgclByID0gci5FbGVtZW50KFcuclByKTsKKyAgICAgICAgICAgIGlmIChyUHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgdmFyIHN6ID0gR2V0Rm9udFNpemUocikgPz8gMjJtOworCisgICAgICAgICAgICAvLyB1bmtub3duIGZvbnQgZmFtaWxpZXMgd2lsbCB0aHJvdyBBcmd1bWVudEV4Y2VwdGlvbiwgaW4gd2hpY2ggY2FzZSBqdXN0IHJldHVybiAwCisgICAgICAgICAgICBpZiAoIUtub3duRmFtaWxpZXMuQ29udGFpbnMoZm9udE5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAvLyBpbiB0aGVvcnksIGFsbCB1bmtub3duIGZvbnRzIGFyZSBmb3VuZCBieSB0aGUgYWJvdmUgdGVzdCwgYnV0IGlmIG5vdC4uLgorICAgICAgICAgICAgRm9udEZhbWlseSBmZjsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZmID0gbmV3IEZvbnRGYW1pbHkoZm9udE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEFyZ3VtZW50RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVua25vd25Gb250cy5BZGQoZm9udE5hbWUpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBmcyA9IEZvbnRTdHlsZS5SZWd1bGFyOworICAgICAgICAgICAgaWYgKFV0aWwuR2V0Qm9vbFByb3AoclByLCBXLmIpID09IHRydWUgfHwgVXRpbC5HZXRCb29sUHJvcChyUHIsIFcuYkNzKSA9PSB0cnVlKQorICAgICAgICAgICAgICAgIGZzIHw9IEZvbnRTdHlsZS5Cb2xkOworICAgICAgICAgICAgaWYgKFV0aWwuR2V0Qm9vbFByb3AoclByLCBXLmkpID09IHRydWUgfHwgVXRpbC5HZXRCb29sUHJvcChyUHIsIFcuaUNzKSA9PSB0cnVlKQorICAgICAgICAgICAgICAgIGZzIHw9IEZvbnRTdHlsZS5JdGFsaWM7CisKKyAgICAgICAgICAgIC8vIEFwcGVuZGVkIGJsYW5rIGFzIGEgcXVpY2sgZml4IHRvIGFjY29tbW9kYXRlICZuYnNwOyB0aGF0IHdpbGwgZ2V0CisgICAgICAgICAgICAvLyBhcHBlbmRlZCB0byBzb21lIGxheW91dC1jcml0aWNhbCBydW5zIHN1Y2ggYXMgbGlzdCBpdGVtIG51bWJlcnMuCisgICAgICAgICAgICAvLyBJbiBzb21lIGNhc2VzLCB0aGlzIG1pZ2h0IG5vdCBiZSByZXF1aXJlZCBvciBldmVuIHdyb25nLCBzbyB0aGlzCisgICAgICAgICAgICAvLyBtdXN0IGJlIHJldmlzaXRlZC4KKyAgICAgICAgICAgIC8vIFRPRE86IFJldmlzaXQuCisgICAgICAgICAgICB2YXIgcnVuVGV4dCA9IHIuRGVzY2VuZGFudHNUcmltbWVkKFcudHhieENvbnRlbnQpCisgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gZS5OYW1lID09IFcudCkKKyAgICAgICAgICAgICAgICAuU2VsZWN0KHQgPT4gKHN0cmluZyl0KQorICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZSgpICsgIiAiOworCisgICAgICAgICAgICB2YXIgdGFiTGVuZ3RoID0gci5EZXNjZW5kYW50c1RyaW1tZWQoVy50eGJ4Q29udGVudCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgPT0gVy50YWIpCisgICAgICAgICAgICAgICAgLlNlbGVjdCh0ID0+IChkZWNpbWFsKXQuQXR0cmlidXRlKFB0T3BlblhtbC5UYWJXaWR0aCkpCisgICAgICAgICAgICAgICAgLlN1bSgpOworCisgICAgICAgICAgICBpZiAocnVuVGV4dC5MZW5ndGggPT0gMCAmJiB0YWJMZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgaW50IG11bHRpcGxpZXIgPSAxOworICAgICAgICAgICAgaWYgKHJ1blRleHQuTGVuZ3RoIDw9IDIpCisgICAgICAgICAgICAgICAgbXVsdGlwbGllciA9IDEwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJ1blRleHQuTGVuZ3RoIDw9IDQpCisgICAgICAgICAgICAgICAgbXVsdGlwbGllciA9IDUwOworICAgICAgICAgICAgZWxzZSBpZiAocnVuVGV4dC5MZW5ndGggPD0gOCkKKyAgICAgICAgICAgICAgICBtdWx0aXBsaWVyID0gMjU7CisgICAgICAgICAgICBlbHNlIGlmIChydW5UZXh0Lkxlbmd0aCA8PSAxNikKKyAgICAgICAgICAgICAgICBtdWx0aXBsaWVyID0gMTI7CisgICAgICAgICAgICBlbHNlIGlmIChydW5UZXh0Lkxlbmd0aCA8PSAzMikKKyAgICAgICAgICAgICAgICBtdWx0aXBsaWVyID0gNjsKKyAgICAgICAgICAgIGlmIChtdWx0aXBsaWVyICE9IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdWx0aXBsaWVyOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChydW5UZXh0KTsKKyAgICAgICAgICAgICAgICBydW5UZXh0ID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKEZvbnQgZiA9IG5ldyBGb250KGZmLCAoZmxvYXQpc3ogLyAyZiwgZnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGV4dEZvcm1hdEZsYWdzIHRmZiA9IFRleHRGb3JtYXRGbGFncy5Ob1BhZGRpbmc7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wb3NlZFNpemUgPSBuZXcgU2l6ZShpbnQuTWF4VmFsdWUsIGludC5NYXhWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHZhciBzZiA9IFRleHRSZW5kZXJlci5NZWFzdXJlVGV4dChydW5UZXh0LCBmLCBwcm9wb3NlZFNpemUsIHRmZik7CisgICAgICAgICAgICAgICAgICAgIC8vIHNmIHJldHVybnMgc2l6ZSBpbiBwaXhlbHMKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNmLldpZHRoIC8gbXVsdGlwbGllcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQXJndW1lbnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBGb250U3R5bGUgZnMyID0gRm9udFN0eWxlLlJlZ3VsYXI7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChGb250IGYgPSBuZXcgRm9udChmZiwgKGZsb2F0KXN6IC8gMmYsIGZzMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRleHRGb3JtYXRGbGFncyB0ZmYgPSBUZXh0Rm9ybWF0RmxhZ3MuTm9QYWRkaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3Bvc2VkU2l6ZSA9IG5ldyBTaXplKGludC5NYXhWYWx1ZSwgaW50Lk1heFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZiA9IFRleHRSZW5kZXJlci5NZWFzdXJlVGV4dChydW5UZXh0LCBmLCBwcm9wb3NlZFNpemUsIHRmZik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2YuV2lkdGggLyBtdWx0aXBsaWVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChBcmd1bWVudEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvbnRTdHlsZSBmczIgPSBGb250U3R5bGUuQm9sZDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgZiA9IG5ldyBGb250KGZmLCAoZmxvYXQpc3ogLyAyZiwgZnMyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXh0Rm9ybWF0RmxhZ3MgdGZmID0gVGV4dEZvcm1hdEZsYWdzLk5vUGFkZGluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcG9zZWRTaXplID0gbmV3IFNpemUoaW50Lk1heFZhbHVlLCBpbnQuTWF4VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZiA9IFRleHRSZW5kZXJlci5NZWFzdXJlVGV4dChydW5UZXh0LCBmLCBwcm9wb3NlZFNpemUsIHRmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2YgcmV0dXJucyBzaXplIGluIHBpeGVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZi5XaWR0aCAvIG11bHRpcGxpZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEFyZ3VtZW50RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBib3RoIHJlZ3VsYXIgYW5kIGJvbGQgZmFpbCwgdGhlbiBnZXQgbWV0cmljcyBmb3IgVGltZXMgTmV3IFJvbWFuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIG9yaWdpbmFsIEZvbnRTdHlsZSAoaW4gZnMpCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmYyID0gbmV3IEZvbnRGYW1pbHkoIlRpbWVzIE5ldyBSb21hbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBmID0gbmV3IEZvbnQoZmYyLCAoZmxvYXQpc3ogLyAyZiwgZnMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRleHRGb3JtYXRGbGFncyB0ZmYgPSBUZXh0Rm9ybWF0RmxhZ3MuTm9QYWRkaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wb3NlZFNpemUgPSBuZXcgU2l6ZShpbnQuTWF4VmFsdWUsIGludC5NYXhWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNmID0gVGV4dFJlbmRlcmVyLk1lYXN1cmVUZXh0KHJ1blRleHQsIGYsIHByb3Bvc2VkU2l6ZSwgdGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZiByZXR1cm5zIHNpemUgaW4gcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNmLldpZHRoIC8gbXVsdGlwbGllcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChPdmVyZmxvd0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGhhcHBlbmVkIG9uIEF6dXJlIGJ1dCBpbnRlcmVzdGluZ2x5IGVub3VnaCBub3Qgd2hpbGUgdGVzdGluZyBsb2NhbGx5LgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIGFsZ29yaXRobSBmb3IgdGhpcyBtZXRob2QgY29tZXMgZnJvbSB0aGUgaW1wbGVtZW50ZXIgbm90ZXMgaW4gW01TLU9JMjk1MDBdLnBkZgorICAgICAgICAvLyBzZWN0aW9uIDIuMS44NworCisgICAgICAgIC8vIFRoZSBpbXBsZW1lbnRlciBub3RlcyBhcmUgYXQ6CisgICAgICAgIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9lZTkwODY1Mi5hc3B4CisKKyAgICAgICAgcHVibGljIGVudW0gRm9udFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgQXNjaWksCisgICAgICAgICAgICBIQW5zaSwKKyAgICAgICAgICAgIEVhc3RBc2lhLAorICAgICAgICAgICAgQ1MKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgY2xhc3MgQ2hhclN0eWxlQXR0cmlidXRlcworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIEFzY2lpRm9udDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgSEFuc2lGb250OworICAgICAgICAgICAgcHVibGljIHN0cmluZyBFYXN0QXNpYUZvbnQ7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIENzRm9udDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgSGludDsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIFJ0bDsKKworICAgICAgICAgICAgcHVibGljIHN0cmluZyBMYXRpbkxhbmc7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIEJpZGlMYW5nOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBFYXN0QXNpYUxhbmc7CisKKyAgICAgICAgICAgIHB1YmxpYyBEaWN0aW9uYXJ5PFhOYW1lLCBib29sPz4gVG9nZ2xlUHJvcGVydGllczsKKyAgICAgICAgICAgIHB1YmxpYyBEaWN0aW9uYXJ5PFhOYW1lLCBYRWxlbWVudD4gUHJvcGVydGllczsKKworICAgICAgICAgICAgcHVibGljIENoYXJTdHlsZUF0dHJpYnV0ZXMoWEVsZW1lbnQgcFByLCBYRWxlbWVudCByUHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVG9nZ2xlUHJvcGVydGllcyA9IG5ldyBEaWN0aW9uYXJ5PFhOYW1lLCBib29sPz4oKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0gbmV3IERpY3Rpb25hcnk8WE5hbWUsIFhFbGVtZW50PigpOworCisgICAgICAgICAgICAgICAgaWYgKHJQciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoWE5hbWUgeG4gaW4gVG9nZ2xlUHJvcGVydHlOYW1lcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRvZ2dsZVByb3BlcnRpZXNbeG5dID0gVXRpbC5HZXRCb29sUHJvcChyUHIsIHhuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoWE5hbWUgeG4gaW4gUHJvcGVydHlOYW1lcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXNbeG5dID0gR2V0WG1sUHJvcGVydHkoclByLCB4bik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciByRm9udHMgPSByUHIuRWxlbWVudChXLnJGb250cyk7CisgICAgICAgICAgICAgICAgaWYgKHJGb250cyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5Bc2NpaUZvbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0aGlzLkhBbnNpRm9udCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuRWFzdEFzaWFGb250ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5Dc0ZvbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0aGlzLkhpbnQgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aGlzLkFzY2lpRm9udCA9IChzdHJpbmcpKHJGb250cy5BdHRyaWJ1dGUoVy5hc2NpaSkpOworICAgICAgICAgICAgICAgICAgICB0aGlzLkhBbnNpRm9udCA9IChzdHJpbmcpKHJGb250cy5BdHRyaWJ1dGUoVy5oQW5zaSkpOworICAgICAgICAgICAgICAgICAgICB0aGlzLkVhc3RBc2lhRm9udCA9IChzdHJpbmcpKHJGb250cy5BdHRyaWJ1dGUoVy5lYXN0QXNpYSkpOworICAgICAgICAgICAgICAgICAgICB0aGlzLkNzRm9udCA9IChzdHJpbmcpKHJGb250cy5BdHRyaWJ1dGUoVy5jcykpOworICAgICAgICAgICAgICAgICAgICB0aGlzLkhpbnQgPSAoc3RyaW5nKShyRm9udHMuQXR0cmlidXRlKFcuaGludCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBYRWxlbWVudCBjc2VsID0gdGhpcy5Qcm9wZXJ0aWVzW1cuY3NdOworICAgICAgICAgICAgICAgIGJvb2wgY3MgPSBjc2VsICE9IG51bGwgJiYgKGNzZWwuQXR0cmlidXRlKFcudmFsKSA9PSBudWxsIHx8IGNzZWwuQXR0cmlidXRlKFcudmFsKS5Ub0Jvb2xlYW4oKSA9PSB0cnVlKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBydGxlbCA9IHRoaXMuUHJvcGVydGllc1tXLnJ0bF07CisgICAgICAgICAgICAgICAgYm9vbCBydGwgPSBydGxlbCAhPSBudWxsICYmIChydGxlbC5BdHRyaWJ1dGUoVy52YWwpID09IG51bGwgfHwgcnRsZWwuQXR0cmlidXRlKFcudmFsKS5Ub0Jvb2xlYW4oKSA9PSB0cnVlKTsKKyAgICAgICAgICAgICAgICB2YXIgYmlkaSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChwUHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGJpZGllbCA9IHBQci5FbGVtZW50KFcuYmlkaSk7CisgICAgICAgICAgICAgICAgICAgIGJpZGkgPSBiaWRpZWwgIT0gbnVsbCAmJiAoYmlkaWVsLkF0dHJpYnV0ZShXLnZhbCkgPT0gbnVsbCB8fCBiaWRpZWwuQXR0cmlidXRlKFcudmFsKS5Ub0Jvb2xlYW4oKSA9PSB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUnRsID0gY3MgfHwgcnRsIHx8IGJpZGk7CisgICAgICAgICAgICAgICAgdmFyIGxhbmcgPSByUHIuRWxlbWVudChXLmxhbmcpOworICAgICAgICAgICAgICAgIGlmIChsYW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMYXRpbkxhbmcgPSAoc3RyaW5nKWxhbmcuQXR0cmlidXRlKFcudmFsKTsKKyAgICAgICAgICAgICAgICAgICAgQmlkaUxhbmcgPSAoc3RyaW5nKWxhbmcuQXR0cmlidXRlKFcuYmlkaSk7CisgICAgICAgICAgICAgICAgICAgIEVhc3RBc2lhTGFuZyA9IChzdHJpbmcpbGFuZy5BdHRyaWJ1dGUoVy5lYXN0QXNpYSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRYbWxQcm9wZXJ0eShYRWxlbWVudCByUHIsIFhOYW1lIHByb3BlcnR5TmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gclByLkVsZW1lbnQocHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWE5hbWVbXSBUb2dnbGVQcm9wZXJ0eU5hbWVzID0gbmV3W10geworICAgICAgICAgICAgICAgIFcuYiwKKyAgICAgICAgICAgICAgICBXLmJDcywKKyAgICAgICAgICAgICAgICBXLmNhcHMsCisgICAgICAgICAgICAgICAgVy5lbWJvc3MsCisgICAgICAgICAgICAgICAgVy5pLAorICAgICAgICAgICAgICAgIFcuaUNzLAorICAgICAgICAgICAgICAgIFcuaW1wcmludCwKKyAgICAgICAgICAgICAgICBXLm91dGxpbmUsCisgICAgICAgICAgICAgICAgVy5zaGFkb3csCisgICAgICAgICAgICAgICAgVy5zbWFsbENhcHMsCisgICAgICAgICAgICAgICAgVy5zdHJpa2UsCisgICAgICAgICAgICAgICAgVy52YW5pc2gKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIFhOYW1lW10gUHJvcGVydHlOYW1lcyA9IG5ld1tdIHsKKyAgICAgICAgICAgICAgICBXLmNzLAorICAgICAgICAgICAgICAgIFcucnRsLAorICAgICAgICAgICAgICAgIFcudSwKKyAgICAgICAgICAgICAgICBXLmNvbG9yLAorICAgICAgICAgICAgICAgIFcuaGlnaGxpZ2h0LAorICAgICAgICAgICAgICAgIFcuc2hkCisgICAgICAgICAgICB9OworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIEZvbnRUeXBlIERldGVybWluZUZvbnRUeXBlRnJvbUNoYXJhY3RlcihjaGFyIGNoLCBDaGFyU3R5bGVBdHRyaWJ1dGVzIGNzYSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWYgdGhlIHJ1biBoYXMgdGhlIGNzIGVsZW1lbnQgKCJbSVNPL0lFQy0yOTUwMC0xXSDCpzE3LjMuMi43OyBjcyIpIG9yIHRoZSBydGwgZWxlbWVudCAoIltJU08vSUVDLTI5NTAwLTFdIMKnMTcuMy4yLjMwOyBydGwiKSwKKyAgICAgICAgICAgIC8vIHRoZW4gdGhlIGNzIChvciBjc3RoZW1lIGlmIGRlZmluZWQpIGZvbnQgaXMgdXNlZCwgcmVnYXJkbGVzcyBvZiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgdmFsdWVzIG9mIHRoZSBydW7igJlzIGNvbnRlbnQuCisgICAgICAgICAgICBpZiAoY3NhLlJ0bCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuQ1M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEEgbGFyZ2UgcGVyY2VudGFnZSBvZiBjaGFyYWN0ZXJzIHdpbGwgZmFsbCBpbiB0aGUgZm9sbG93aW5nIHJ1bGUuCisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEJhc2ljIExhdGluCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgwMCAmJiBjaCA8PSAweDdmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5Bc2NpaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdGhlIGVhc3RBc2lhIChvciBlYXN0QXNpYVRoZW1lIGlmIGRlZmluZWQpIGF0dHJpYnV0ZeKAmXMgdmFsdWUgaXMg4oCcVGltZXMgTmV3IFJvbWFu4oCdIGFuZCB0aGUgYXNjaWkgKG9yIGFzY2lpVGhlbWUgaWYgZGVmaW5lZCkKKyAgICAgICAgICAgIC8vIGFuZCBoQW5zaSAob3IgaEFuc2lUaGVtZSBpZiBkZWZpbmVkKSBhdHRyaWJ1dGVzIGFyZSBlcXVhbCwgdGhlbiB0aGUgYXNjaWkgKG9yIGFzY2lpVGhlbWUgaWYgZGVmaW5lZCkgZm9udCBpcyB1c2VkLgorICAgICAgICAgICAgaWYgKGNzYS5FYXN0QXNpYUZvbnQgPT0gIlRpbWVzIE5ldyBSb21hbiIgJiYKKyAgICAgICAgICAgICAgICBjc2EuQXNjaWlGb250ID09IGNzYS5IQW5zaUZvbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkFzY2lpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJMb2NrOiBMYXRpbi0xIFN1cHBsZW1lbnQKKyAgICAgICAgICAgIGlmIChjaCA+PSAweEEwICYmIGNoIDw9IDB4RkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gMHhBMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhBNCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhBNyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhBOCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhBQSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhBRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhBRiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGNoID49IDB4QjAgJiYgY2ggPD0gMHhCNCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjaCA+PSAweEI2ICYmIGNoIDw9IDB4QkEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoY2ggPj0gMHhCQyAmJiBjaCA8PSAweEJGKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhENyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhGNykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjc2EuRWFzdEFzaWFMYW5nID09ICJ6aC1oYW50IiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY3NhLkVhc3RBc2lhTGFuZyA9PSAiemgtaGFucyIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAweEUwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhFMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaCA+PSAweEU4ICYmIGNoIDw9IDB4RUEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoID49IDB4RUMgJiYgY2ggPD0gMHhFRCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2ggPj0gMHhGMiAmJiBjaCA8PSAweEYzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaCA+PSAweEY5ICYmIGNoIDw9IDB4RkEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gMHhGQykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBMYXRpbiBFeHRlbmRlZC1BCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgwMTAwICYmIGNoIDw9IDB4MDE3RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjc2EuRWFzdEFzaWFMYW5nID09ICJ6aC1oYW50IiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY3NhLkVhc3RBc2lhTGFuZyA9PSAiemgtaGFucyIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHx8IHRoZSBjaGFyYWN0ZXIgc2V0IG9mIHRoZSBlYXN0IEFzaWEgKG9yIGVhc3QgQXNpYSB0aGVtZSkgZm9udCBpcyBDaGluZXNlNSB8fCBHQjIzMTIgdG9kbyAqLykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogTGF0aW4gRXh0ZW5kZWQtQgorICAgICAgICAgICAgaWYgKGNoID49IDB4MDE4MCAmJiBjaCA8PSAweDAyNEYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3NhLkVhc3RBc2lhTGFuZyA9PSAiemgtaGFudCIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzYS5FYXN0QXNpYUxhbmcgPT0gInpoLWhhbnMiCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB8fCB0aGUgY2hhcmFjdGVyIHNldCBvZiB0aGUgZWFzdCBBc2lhIChvciBlYXN0IEFzaWEgdGhlbWUpIGZvbnQgaXMgQ2hpbmVzZTUgfHwgR0IyMzEyIHRvZG8gKi8pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IElQQSBFeHRlbnNpb25zCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgwMjUwICYmIGNoIDw9IDB4MDJBRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjc2EuRWFzdEFzaWFMYW5nID09ICJ6aC1oYW50IiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY3NhLkVhc3RBc2lhTGFuZyA9PSAiemgtaGFucyIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHx8IHRoZSBjaGFyYWN0ZXIgc2V0IG9mIHRoZSBlYXN0IEFzaWEgKG9yIGVhc3QgQXNpYSB0aGVtZSkgZm9udCBpcyBDaGluZXNlNSB8fCBHQjIzMTIgdG9kbyAqLykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgwMkIwICYmIGNoIDw9IDB4MDJGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBDb21iaW5pbmcgRGlhY3JpdGljIE1hcmtzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgwMzAwICYmIGNoIDw9IDB4MDM2RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBHcmVlaworICAgICAgICAgICAgaWYgKGNoID49IDB4MDM3MCAmJiBjaCA8PSAweDAzQ0YpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogQ3lyaWxsaWMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDA0MDAgJiYgY2ggPD0gMHgwNEZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEhlYnJldworICAgICAgICAgICAgaWYgKGNoID49IDB4MDU5MCAmJiBjaCA8PSAweDA1RkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkFzY2lpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBBcmFiaWMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDA2MDAgJiYgY2ggPD0gMHgwNkZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5Bc2NpaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogU3lyaWFjCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgwNzAwICYmIGNoIDw9IDB4MDc0RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuQXNjaWk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEFyYWJpYyBTdXBwbGVtZW50CisgICAgICAgICAgICBpZiAoY2ggPj0gMHgwNzUwICYmIGNoIDw9IDB4MDc3RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuQXNjaWk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IFRoYW5uYQorICAgICAgICAgICAgaWYgKGNoID49IDB4MDc4MCAmJiBjaCA8PSAweDA3QkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkFzY2lpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBIYW5ndWwgSmFtbworICAgICAgICAgICAgaWYgKGNoID49IDB4MTEwMCAmJiBjaCA8PSAweDExRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgxRTAwICYmIGNoIDw9IDB4MUVGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIiAmJgorICAgICAgICAgICAgICAgICAgICAoY3NhLkVhc3RBc2lhTGFuZyA9PSAiemgtaGFudCIgfHwKKyAgICAgICAgICAgICAgICAgICAgY3NhLkVhc3RBc2lhTGFuZyA9PSAiemgtaGFucyIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEdlbmVyYWwgUHVuY3R1YXRpb24KKyAgICAgICAgICAgIGlmIChjaCA+PSAweDIwMDAgJiYgY2ggPD0gMHgyMDZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IFN1cGVyc2NyaXB0cyBhbmQgU3Vic2NyaXB0cworICAgICAgICAgICAgaWYgKGNoID49IDB4MjA3MCAmJiBjaCA8PSAweDIwOUYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogQ3VycmVuY3kgU3ltYm9scworICAgICAgICAgICAgaWYgKGNoID49IDB4MjBBMCAmJiBjaCA8PSAweDIwQ0YpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIGZvciBTeW1ib2xzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgyMEQwICYmIGNoIDw9IDB4MjBGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBMZXR0ZXItbGlrZSBTeW1ib2xzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgyMTAwICYmIGNoIDw9IDB4MjE0RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBOdW1iZXIgRm9ybXMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDIxNTAgJiYgY2ggPD0gMHgyMThGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEFycm93cworICAgICAgICAgICAgaWYgKGNoID49IDB4MjE5MCAmJiBjaCA8PSAweDIxRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogTWF0aGVtYXRpY2FsIE9wZXJhdG9ycworICAgICAgICAgICAgaWYgKGNoID49IDB4MjIwMCAmJiBjaCA8PSAweDIyRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogTWlzY2VsbGFuZW91cyBUZWNobmljYWwKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDIzMDAgJiYgY2ggPD0gMHgyM0ZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IENvbnRyb2wgUGljdHVyZXMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDI0MDAgJiYgY2ggPD0gMHgyNDNGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IE9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgyNDQwICYmIGNoIDw9IDB4MjQ1RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBFbmNsb3NlZCBBbHBoYW51bWVyaWNzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgyNDYwICYmIGNoIDw9IDB4MjRGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBCb3ggRHJhd2luZworICAgICAgICAgICAgaWYgKGNoID49IDB4MjUwMCAmJiBjaCA8PSAweDI1N0YpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogQmxvY2sgRWxlbWVudHMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDI1ODAgJiYgY2ggPD0gMHgyNTlGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEdlb21ldHJpYyBTaGFwZXMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDI1QTAgJiYgY2ggPD0gMHgyNUZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IE1pc2NlbGxhbmVvdXMgU3ltYm9scworICAgICAgICAgICAgaWYgKGNoID49IDB4MjYwMCAmJiBjaCA8PSAweDI2RkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzYS5IaW50ID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogRGluZ2JhdHMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDI3MDAgJiYgY2ggPD0gMHgyN0JGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2EuSGludCA9PSAiZWFzdEFzaWEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuSEFuc2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IENKSyBSYWRpY2FscyBTdXBwbGVtZW50CisgICAgICAgICAgICBpZiAoY2ggPj0gMHgyRTgwICYmIGNoIDw9IDB4MkVGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBLYW5neGkgUmFkaWNhbHMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDJGMDAgJiYgY2ggPD0gMHgyRkRGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycworICAgICAgICAgICAgaWYgKGNoID49IDB4MkZGMCAmJiBjaCA8PSAweDJGRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24KKyAgICAgICAgICAgIGlmIChjaCA+PSAweDMwMDAgJiYgY2ggPD0gMHgzMDNGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogSGlyYWdhbmEKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDMwNDAgJiYgY2ggPD0gMHgzMDlGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogS2F0YWthbmEKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDMwQTAgJiYgY2ggPD0gMHgzMEZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogQm9wb21vZm8KKyAgICAgICAgICAgIGlmIChjaCA+PSAweDMxMDAgJiYgY2ggPD0gMHgzMTJGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbworICAgICAgICAgICAgaWYgKGNoID49IDB4MzEzMCAmJiBjaCA8PSAweDMxOEYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBLYW5idW4KKyAgICAgICAgICAgIGlmIChjaCA+PSAweDMxOTAgJiYgY2ggPD0gMHgzMTlGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocworICAgICAgICAgICAgaWYgKGNoID49IDB4MzIwMCAmJiBjaCA8PSAweDMyRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBDSksgQ29tcGF0aWJpbGl0eQorICAgICAgICAgICAgaWYgKGNoID49IDB4MzMwMCAmJiBjaCA8PSAweDMzRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBBCisgICAgICAgICAgICBpZiAoY2ggPj0gMHgzNDAwICYmIGNoIDw9IDB4NERCRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IENKSyBVbmlmaWVkIElkZW9ncmFwaHMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweDRFMDAgJiYgY2ggPD0gMHg5RkFGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogWWkgU3lsbGFibGVzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHhBMDAwICYmIGNoIDw9IDB4QTQ4RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IFlpIFJhZGljYWxzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHhBNDkwICYmIGNoIDw9IDB4QTRDRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEhhbmd1bCBTeWxsYWJsZXMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweEFDMDAgJiYgY2ggPD0gMHhEN0FGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogSGlnaCBTdXJyb2dhdGVzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHhEODAwICYmIGNoIDw9IDB4REI3RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEhpZ2ggUHJpdmF0ZSBVc2UgU3Vycm9nYXRlcworICAgICAgICAgICAgaWYgKGNoID49IDB4REI4MCAmJiBjaCA8PSAweERCRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBMb3cgU3Vycm9nYXRlcworICAgICAgICAgICAgaWYgKGNoID49IDB4REMwMCAmJiBjaCA8PSAweERGRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBQcml2YXRlIFVzZSBBcmVhCisgICAgICAgICAgICBpZiAoY2ggPj0gMHhFMDAwICYmIGNoIDw9IDB4RjhGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzCisgICAgICAgICAgICBpZiAoY2ggPj0gMHhGOTAwICYmIGNoIDw9IDB4RkFGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9udFR5cGUuRWFzdEFzaWE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVuaWNvZGUgQmxvY2s6IEFscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zCisgICAgICAgICAgICBpZiAoY2ggPj0gMHhGQjAwICYmIGNoIDw9IDB4RkI0RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NhLkhpbnQgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweEZCMDAgJiYgY2ggPD0gMHhGQjFDKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHhGQjFEICYmIGNoIDw9IDB4RkI0RikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5Bc2NpaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkhBbnNpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUEKKyAgICAgICAgICAgIGlmIChjaCA+PSAweEZCNTAgJiYgY2ggPD0gMHhGREZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5Bc2NpaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweEZFMzAgJiYgY2ggPD0gMHhGRTRGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogU21hbGwgRm9ybSBWYXJpYW50cworICAgICAgICAgICAgaWYgKGNoID49IDB4RkU1MCAmJiBjaCA8PSAweEZFNkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZvbnRUeXBlLkVhc3RBc2lhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbmljb2RlIEJsb2NrOiBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUIKKyAgICAgICAgICAgIGlmIChjaCA+PSAweEZFNzAgJiYgY2ggPD0gMHhGRUZFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5Bc2NpaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5pY29kZSBCbG9jazogSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMKKyAgICAgICAgICAgIGlmIChjaCA+PSAweEZGMDAgJiYgY2ggPD0gMHhGRkVGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5FYXN0QXNpYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBGb250VHlwZS5IQW5zaTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEhhc2hTZXQ8c3RyaW5nPiBVbmtub3duRm9udHMgPSBuZXcgSGFzaFNldDxzdHJpbmc+KCk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIEhhc2hTZXQ8c3RyaW5nPiBfa25vd25GYW1pbGllczsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBIYXNoU2V0PHN0cmluZz4gS25vd25GYW1pbGllcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2tub3duRmFtaWxpZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9rbm93bkZhbWlsaWVzID0gbmV3IEhhc2hTZXQ8c3RyaW5nPigpOworICAgICAgICAgICAgICAgICAgICB2YXIgZmFtaWxpZXMgPSBGb250RmFtaWx5LkZhbWlsaWVzOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZmFtIGluIGZhbWlsaWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgX2tub3duRmFtaWxpZXMuQWRkKGZhbS5OYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9rbm93bkZhbWlsaWVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaFNldDxjaGFyPiBXZWFrQW5kTmV1dHJhbERpcmVjdGlvbmFsQ2hhcmFjdGVycyA9IG5ldyBIYXNoU2V0PGNoYXI+KCkgeworICAgICAgICAgICAgJzAnLAorICAgICAgICAgICAgJzEnLAorICAgICAgICAgICAgJzInLAorICAgICAgICAgICAgJzMnLAorICAgICAgICAgICAgJzQnLAorICAgICAgICAgICAgJzUnLAorICAgICAgICAgICAgJzYnLAorICAgICAgICAgICAgJzcnLAorICAgICAgICAgICAgJzgnLAorICAgICAgICAgICAgJzknLAorICAgICAgICAgICAgJysnLAorICAgICAgICAgICAgJy0nLAorICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgJywnLAorICAgICAgICAgICAgJy4nLAorICAgICAgICAgICAgJ3wnLAorICAgICAgICAgICAgJ1x0JywKKyAgICAgICAgICAgICdccicsCisgICAgICAgICAgICAnXG4nLAorICAgICAgICAgICAgJyAnLAorICAgICAgICAgICAgJ1x4MDBBMCcsIC8vIG5vbiBicmVha2luZyBzcGFjZQorCisgICAgICAgICAgICAnXHgwMEIwJywgLy8gZGVncmVlIHNpZ24KKyAgICAgICAgICAgICdceDA2NkInLCAvLyBhcmFiaWMgZGVjaW1hbCBzZXBhcmF0b3IKKyAgICAgICAgICAgICdceDA2NkMnLCAvLyBhcmFiaWMgdGhvdXNhbmRzIHNlcGFyYXRvcgorCisgICAgICAgICAgICAnXHgwNjI3JywgLy8gYXJhYmljIHBpcGUKKworICAgICAgICAgICAgJ1x4MjBBMCcsIC8vIHN0YXJ0IGN1cnJlbmN5IHN5bWJvbHMKKyAgICAgICAgICAgICdceDIwQTEnLAorICAgICAgICAgICAgJ1x4MjBBMicsCisgICAgICAgICAgICAnXHgyMEEzJywKKyAgICAgICAgICAgICdceDIwQTQnLAorICAgICAgICAgICAgJ1x4MjBBNScsCisgICAgICAgICAgICAnXHgyMEE2JywKKyAgICAgICAgICAgICdceDIwQTcnLAorICAgICAgICAgICAgJ1x4MjBBOCcsCisgICAgICAgICAgICAnXHgyMEE5JywKKyAgICAgICAgICAgICdceDIwQUEnLAorICAgICAgICAgICAgJ1x4MjBBQicsCisgICAgICAgICAgICAnXHgyMEFDJywKKyAgICAgICAgICAgICdceDIwQUQnLAorICAgICAgICAgICAgJ1x4MjBBRScsCisgICAgICAgICAgICAnXHgyMEFGJywKKyAgICAgICAgICAgICdceDIwQjAnLAorICAgICAgICAgICAgJ1x4MjBCMScsCisgICAgICAgICAgICAnXHgyMEIyJywKKyAgICAgICAgICAgICdceDIwQjMnLAorICAgICAgICAgICAgJ1x4MjBCNCcsCisgICAgICAgICAgICAnXHgyMEI1JywKKyAgICAgICAgICAgICdceDIwQjYnLAorICAgICAgICAgICAgJ1x4MjBCNycsCisgICAgICAgICAgICAnXHgyMEI4JywKKyAgICAgICAgICAgICdceDIwQjknLAorICAgICAgICAgICAgJ1x4MjBCQScsCisgICAgICAgICAgICAnXHgyMEJCJywKKyAgICAgICAgICAgICdceDIwQkMnLAorICAgICAgICAgICAgJ1x4MjBCRCcsCisgICAgICAgICAgICAnXHgyMEJFJywKKyAgICAgICAgICAgICdceDIwQkYnLAorICAgICAgICAgICAgJ1x4MjBDMCcsCisgICAgICAgICAgICAnXHgyMEMxJywKKyAgICAgICAgICAgICdceDIwQzInLAorICAgICAgICAgICAgJ1x4MjBDMycsCisgICAgICAgICAgICAnXHgyMEM0JywKKyAgICAgICAgICAgICdceDIwQzUnLAorICAgICAgICAgICAgJ1x4MjBDNicsCisgICAgICAgICAgICAnXHgyMEM3JywKKyAgICAgICAgICAgICdceDIwQzgnLAorICAgICAgICAgICAgJ1x4MjBDOScsCisgICAgICAgICAgICAnXHgyMENBJywKKyAgICAgICAgICAgICdceDIwQ0InLAorICAgICAgICAgICAgJ1x4MjBDQycsCisgICAgICAgICAgICAnXHgyMENEJywKKyAgICAgICAgICAgICdceDIwQ0UnLAorICAgICAgICAgICAgJ1x4MjBDRicsICAvLyBlbmQgY3VycmVuY3kgc3ltYm9scworCisgICAgICAgICAgICAnXHgwNjYwJywgLy8gIkFyYWJpYyIgSW5kaWMgTnVtZXJhbCBGb3JtcyBJcmFxIGFuZCBXZXN0CisgICAgICAgICAgICAnXHgwNjYxJywKKyAgICAgICAgICAgICdceDA2NjInLAorICAgICAgICAgICAgJ1x4MDY2MycsCisgICAgICAgICAgICAnXHgwNjY0JywKKyAgICAgICAgICAgICdceDA2NjUnLAorICAgICAgICAgICAgJ1x4MDY2NicsCisgICAgICAgICAgICAnXHgwNjY3JywKKyAgICAgICAgICAgICdceDA2NjgnLAorICAgICAgICAgICAgJ1x4MDY2OScsCisKKyAgICAgICAgICAgICdceDA2RjAnLCAvLyAiQXJhYmljIiBJbmRpYyBOdW1iZXJhbCBGb3JtcyBJcmFuIGFuZCBFYXN0CisgICAgICAgICAgICAnXHgwNkYxJywKKyAgICAgICAgICAgICdceDA2RjInLAorICAgICAgICAgICAgJ1x4MDZGMycsCisgICAgICAgICAgICAnXHgwNkY0JywKKyAgICAgICAgICAgICdceDA2RjUnLAorICAgICAgICAgICAgJ1x4MDZGNicsCisgICAgICAgICAgICAnXHgwNkY3JywKKyAgICAgICAgICAgICdceDA2RjgnLAorICAgICAgICAgICAgJ1x4MDZGOScsCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGp1c3RGb250QXR0cmlidXRlcyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIFhFbGVtZW50IHBhcmFPclJ1biwgWEVsZW1lbnQgcFByLCBYRWxlbWVudCByUHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCB0aGVtZVhEb2MgPSBudWxsOworICAgICAgICAgICAgaWYgKHdEb2MuTWFpbkRvY3VtZW50UGFydC5UaGVtZVBhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aGVtZVhEb2MgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuVGhlbWVQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICBYRWxlbWVudCBmb250U2NoZW1lID0gbnVsbDsKKyAgICAgICAgICAgIFhFbGVtZW50IG1ham9yRm9udCA9IG51bGw7CisgICAgICAgICAgICBYRWxlbWVudCBtaW5vckZvbnQgPSBudWxsOworICAgICAgICAgICAgaWYgKHRoZW1lWERvYyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvbnRTY2hlbWUgPSB0aGVtZVhEb2MuUm9vdC5FbGVtZW50KEEudGhlbWVFbGVtZW50cykuRWxlbWVudChBLmZvbnRTY2hlbWUpOworICAgICAgICAgICAgICAgIG1ham9yRm9udCA9IGZvbnRTY2hlbWUuRWxlbWVudChBLm1ham9yRm9udCk7CisgICAgICAgICAgICAgICAgbWlub3JGb250ID0gZm9udFNjaGVtZS5FbGVtZW50KEEubWlub3JGb250KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciByRm9udHMgPSByUHIuRWxlbWVudChXLnJGb250cyk7CisgICAgICAgICAgICBpZiAockZvbnRzID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGFzY2lpVGhlbWUgPSAoc3RyaW5nKXJGb250cy5BdHRyaWJ1dGUoVy5hc2NpaVRoZW1lKTsKKyAgICAgICAgICAgIHZhciBoQW5zaVRoZW1lID0gKHN0cmluZylyRm9udHMuQXR0cmlidXRlKFcuaEFuc2lUaGVtZSk7CisgICAgICAgICAgICB2YXIgZWFzdEFzaWFUaGVtZSA9IChzdHJpbmcpckZvbnRzLkF0dHJpYnV0ZShXLmVhc3RBc2lhVGhlbWUpOworICAgICAgICAgICAgdmFyIGNzdGhlbWUgPSAoc3RyaW5nKXJGb250cy5BdHRyaWJ1dGUoVy5jc3RoZW1lKTsKKyAgICAgICAgICAgIHN0cmluZyBhc2NpaSA9IG51bGw7CisgICAgICAgICAgICBzdHJpbmcgaEFuc2kgPSBudWxsOworICAgICAgICAgICAgc3RyaW5nIGVhc3RBc2lhID0gbnVsbDsKKyAgICAgICAgICAgIHN0cmluZyBjcyA9IG51bGw7CisKKyAgICAgICAgICAgIFhFbGVtZW50IG1pbm9yTGF0aW4gPSBudWxsOworICAgICAgICAgICAgc3RyaW5nIG1pbm9yTGF0aW5UeXBlZmFjZSA9IG51bGw7CisgICAgICAgICAgICBYRWxlbWVudCBtYWpvckxhdGluID0gbnVsbDsKKyAgICAgICAgICAgIHN0cmluZyBtYWpvckxhdGluVHlwZWZhY2UgPSBudWxsOworCisgICAgICAgICAgICBpZiAobWlub3JGb250ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWlub3JMYXRpbiA9IG1pbm9yRm9udC5FbGVtZW50KEEubGF0aW4pOworICAgICAgICAgICAgICAgIG1pbm9yTGF0aW5UeXBlZmFjZSA9IChzdHJpbmcpbWlub3JMYXRpbi5BdHRyaWJ1dGUoInR5cGVmYWNlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtYWpvckZvbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYWpvckxhdGluID0gbWFqb3JGb250LkVsZW1lbnQoQS5sYXRpbik7CisgICAgICAgICAgICAgICAgbWFqb3JMYXRpblR5cGVmYWNlID0gKHN0cmluZyltYWpvckxhdGluLkF0dHJpYnV0ZSgidHlwZWZhY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhc2NpaVRoZW1lICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFzY2lpVGhlbWUuU3RhcnRzV2l0aCgibWlub3IiKSAmJiBtaW5vckxhdGluVHlwZWZhY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFzY2lpID0gbWlub3JMYXRpblR5cGVmYWNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhc2NpaVRoZW1lLlN0YXJ0c1dpdGgoIm1ham9yIikgJiYgbWFqb3JMYXRpblR5cGVmYWNlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc2NpaSA9IG1ham9yTGF0aW5UeXBlZmFjZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaEFuc2lUaGVtZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChoQW5zaVRoZW1lLlN0YXJ0c1dpdGgoIm1pbm9yIikgJiYgbWlub3JMYXRpblR5cGVmYWNlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoQW5zaSA9IG1pbm9yTGF0aW5UeXBlZmFjZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaEFuc2lUaGVtZS5TdGFydHNXaXRoKCJtYWpvciIpICYmIG1ham9yTGF0aW5UeXBlZmFjZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaEFuc2kgPSBtYWpvckxhdGluVHlwZWZhY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVhc3RBc2lhVGhlbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWFzdEFzaWFUaGVtZS5TdGFydHNXaXRoKCJtaW5vciIpICYmIG1pbm9yTGF0aW5UeXBlZmFjZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZWFzdEFzaWEgPSBtaW5vckxhdGluVHlwZWZhY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVhc3RBc2lhVGhlbWUuU3RhcnRzV2l0aCgibWFqb3IiKSAmJiBtYWpvckxhdGluVHlwZWZhY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVhc3RBc2lhID0gbWFqb3JMYXRpblR5cGVmYWNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjc3RoZW1lICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzdGhlbWUuU3RhcnRzV2l0aCgibWlub3IiKSAmJiBtaW5vckZvbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNzID0gKHN0cmluZyltaW5vckZvbnQuRWxlbWVudChBLmNzKS5BdHRyaWJ1dGUoInR5cGVmYWNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNzdGhlbWUuU3RhcnRzV2l0aCgibWFqb3IiKSAmJiBtYWpvckZvbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNzID0gKHN0cmluZyltYWpvckZvbnQuRWxlbWVudChBLmNzKS5BdHRyaWJ1dGUoInR5cGVmYWNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXNjaWkgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByRm9udHMuU2V0QXR0cmlidXRlVmFsdWUoVy5hc2NpaSwgYXNjaWkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhBbnNpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgckZvbnRzLlNldEF0dHJpYnV0ZVZhbHVlKFcuaEFuc2ksIGhBbnNpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlYXN0QXNpYSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJGb250cy5TZXRBdHRyaWJ1dGVWYWx1ZShXLmVhc3RBc2lhLCBlYXN0QXNpYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3MgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByRm9udHMuU2V0QXR0cmlidXRlVmFsdWUoVy5jcywgY3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZmlyc3RUZXh0Tm9kZSA9IHBhcmFPclJ1bi5EZXNjZW5kYW50cyhXLnQpLkZpcnN0T3JEZWZhdWx0KHQgPT4gdC5WYWx1ZS5MZW5ndGggPiAwKTsKKyAgICAgICAgICAgIHN0cmluZyBzdHIgPSAiICI7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgcnVuIHdpdGggbm8gdGV4dCBpbiBpdCwgdGhlbiBubyBuZWVkIHRvIGRvIGFueSBvZiB0aGUgcmVzdCBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgICAgIGlmIChmaXJzdFRleHROb2RlID09IG51bGwgJiYgcGFyYU9yUnVuLk5hbWUgPT0gVy5yKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaWYgKGZpcnN0VGV4dE5vZGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdHIgPSBmaXJzdFRleHROb2RlLlZhbHVlOworCisgICAgICAgICAgICB2YXIgY3NhID0gbmV3IENoYXJTdHlsZUF0dHJpYnV0ZXMocFByLCByUHIpOworCisgICAgICAgICAgICAvLyBUaGlzIG1vZHVsZSBkZXRlcm1pbmVzIHRoZSBmb250IGJhc2VkIG9uIGp1c3QgdGhlIGZpcnN0IGNoYXJhY3Rlci4KKyAgICAgICAgICAgIC8vIFRlY2huaWNhbGx5LCBhIHJ1biBjYW4gY29udGFpbiBjaGFyYWN0ZXJzIGZyb20gZGlmZmVyZW50IFVuaWNvZGUgY29kZSBibG9ja3MsIGFuZCBoZW5jZSBzaG91bGQgYmUgcmVuZGVyZWQgd2l0aCBkaWZmZXJlbnQgZm9udHMuCisgICAgICAgICAgICAvLyBIb3dldmVyLCBXb3JkIGJyZWFrcyB1cCBydW5zIHRoYXQgdXNlIG1vcmUgdGhhbiBvbmUgZm9udCBpbnRvIG11bHRpcGxlIHJ1bnMuICBPdGhlciBwcm9kdWNlcnMgb2YgV29yZHByb2Nlc3NpbmdNTCBtYXkgbm90LCBzbyBpbgorICAgICAgICAgICAgLy8gdGhhdCBjYXNlLCB0aGlzIHJvdXRpbmUgbWF5IG5lZWQgdG8gYmUgYXVnbWVudGVkIHRvIGxvb2sgYXQgYWxsIGNoYXJhY3RlcnMgaW4gYSBydW4uCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBvbGQgY29kZQorICAgICAgICAgICAgdmFyIGZvbnRGYW1pbGllcyA9IHN0ci5zZWxlY3QoZnVuY3Rpb24gKGMpIHsKKyAgICAgICAgICAgICAgICB2YXIgZnQgPSBQYXYuRGV0ZXJtaW5lRm9udFR5cGVGcm9tQ2hhcmFjdGVyKGMsIGNzYSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChmdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdi5Gb250VHlwZS5Bc2NpaToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXN0KHJGb250cy5hdHRyaWJ1dGUoVy5hc2NpaSkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdi5Gb250VHlwZS5IQW5zaToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXN0KHJGb250cy5hdHRyaWJ1dGUoVy5oQW5zaSkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdi5Gb250VHlwZS5FYXN0QXNpYToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXN0KHJGb250cy5hdHRyaWJ1dGUoVy5lYXN0QXNpYSkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdi5Gb250VHlwZS5DUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXN0KHJGb250cy5hdHRyaWJ1dGUoVy5jcykpOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2hlcmUoZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGYgIT0gbnVsbCAmJiBmICE9ICIiOyB9KQorICAgICAgICAgICAgICAgIC5kaXN0aW5jdCgpCisgICAgICAgICAgICAgICAgLnNlbGVjdChmdW5jdGlvbiAoZikgeyByZXR1cm4gbmV3IFBhdi5Gb250RmFtaWx5KGYpOyB9KQorICAgICAgICAgICAgICAgIC50b0FycmF5KCk7CisgICAgICAgICAgICAqLworCisgICAgICAgICAgICB2YXIgY2hhclRvRXhhbWluZSA9IHN0ci5GaXJzdE9yRGVmYXVsdChjID0+ICFXZWFrQW5kTmV1dHJhbERpcmVjdGlvbmFsQ2hhcmFjdGVycy5Db250YWlucyhjKSk7CisgICAgICAgICAgICBpZiAoY2hhclRvRXhhbWluZSA9PSAnXDAnKQorICAgICAgICAgICAgICAgIGNoYXJUb0V4YW1pbmUgPSBzdHJbMF07CisKKyAgICAgICAgICAgIHZhciBmdCA9IERldGVybWluZUZvbnRUeXBlRnJvbUNoYXJhY3RlcihjaGFyVG9FeGFtaW5lLCBjc2EpOworICAgICAgICAgICAgc3RyaW5nIGZvbnRUeXBlID0gbnVsbDsKKyAgICAgICAgICAgIHN0cmluZyBsYW5ndWFnZVR5cGUgPSBudWxsOworICAgICAgICAgICAgc3dpdGNoIChmdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEZvbnRUeXBlLkFzY2lpOgorICAgICAgICAgICAgICAgICAgICBmb250VHlwZSA9IChzdHJpbmcpckZvbnRzLkF0dHJpYnV0ZShXLmFzY2lpKTsKKyAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VUeXBlID0gIndlc3Rlcm4iOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZvbnRUeXBlLkhBbnNpOgorICAgICAgICAgICAgICAgICAgICBmb250VHlwZSA9IChzdHJpbmcpckZvbnRzLkF0dHJpYnV0ZShXLmhBbnNpKTsKKyAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VUeXBlID0gIndlc3Rlcm4iOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZvbnRUeXBlLkVhc3RBc2lhOgorICAgICAgICAgICAgICAgICAgICBmb250VHlwZSA9IChzdHJpbmcpckZvbnRzLkF0dHJpYnV0ZShXLmVhc3RBc2lhKTsKKyAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VUeXBlID0gImVhc3RBc2lhIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGb250VHlwZS5DUzoKKyAgICAgICAgICAgICAgICAgICAgZm9udFR5cGUgPSAoc3RyaW5nKXJGb250cy5BdHRyaWJ1dGUoVy5jcyk7CisgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlVHlwZSA9ICJiaWRpIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb250VHlwZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwYXJhT3JSdW4uQXR0cmlidXRlKFB0T3BlblhtbC5Gb250TmFtZSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhBdHRyaWJ1dGUgZnRhID0gbmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLkZvbnROYW1lLCBmb250VHlwZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYU9yUnVuLkFkZChmdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYXJhT3JSdW4uQXR0cmlidXRlKFB0T3BlblhtbC5Gb250TmFtZSkuVmFsdWUgPSBmb250VHlwZS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYW5ndWFnZVR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyYU9yUnVuLkF0dHJpYnV0ZShQdE9wZW5YbWwuTGFuZ3VhZ2VUeXBlKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWEF0dHJpYnV0ZSBsdGEgPSBuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuTGFuZ3VhZ2VUeXBlLCBsYW5ndWFnZVR5cGUpOworICAgICAgICAgICAgICAgICAgICBwYXJhT3JSdW4uQWRkKGx0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFPclJ1bi5BdHRyaWJ1dGUoUHRPcGVuWG1sLkxhbmd1YWdlVHlwZSkuVmFsdWUgPSBsYW5ndWFnZVR5cGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZGVjaW1hbD8gR2V0Rm9udFNpemUoWEVsZW1lbnQgZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGxhbmd1YWdlVHlwZSA9IChzdHJpbmcpZS5BdHRyaWJ1dGUoUHRPcGVuWG1sLkxhbmd1YWdlVHlwZSk7CisgICAgICAgICAgICBpZiAoZS5OYW1lID09IFcucCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0Rm9udFNpemUobGFuZ3VhZ2VUeXBlLCBlLkVsZW1lbnRzKFcucFByKS5FbGVtZW50cyhXLnJQcikuRmlyc3RPckRlZmF1bHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZS5OYW1lID09IFcucikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0Rm9udFNpemUobGFuZ3VhZ2VUeXBlLCBlLkVsZW1lbnQoVy5yUHIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZGVjaW1hbD8gR2V0Rm9udFNpemUoc3RyaW5nIGxhbmd1YWdlVHlwZSwgWEVsZW1lbnQgclByKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoclByID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIGxhbmd1YWdlVHlwZSA9PSAiYmlkaSIKKyAgICAgICAgICAgICAgICA/IChkZWNpbWFsPylyUHIuRWxlbWVudHMoVy5zekNzKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpCisgICAgICAgICAgICAgICAgOiAoZGVjaW1hbD8pclByLkVsZW1lbnRzKFcuc3opLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgTmV4dFJlY3RJZCA9IDEwMjU7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEdldE5leHRSZWN0SWQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTmV4dFJlY3RJZCsrOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IEdlbmVyYXRlTmV4dEV4cGVjdGVkKFhOb2RlIG5vZGUsIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzLCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsCisgICAgICAgICAgICBzdHJpbmcgc3R5bGVOYW1lLCBOZXh0RXhwZWN0ZWQgbmV4dEV4cGVjdGVkLCBib29sIHByZXNlcnZlV2hpdGVTcGFjZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5leHRFeHBlY3RlZCA9PSBOZXh0RXhwZWN0ZWQuUGFyYWdyYXBoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcucCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldFBhcmFncmFwaFByb3BlcnRpZXMoZWxlbWVudCwgc3R5bGVOYW1lLCBzZXR0aW5ncyksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtKG4sIHNldHRpbmdzLCB3RG9jLCBOZXh0RXhwZWN0ZWQuUnVuLCBwcmVzZXJ2ZVdoaXRlU3BhY2UpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhUZXh0IHhUZXh0Tm9kZSA9IG5vZGUgYXMgWFRleHQ7CisgICAgICAgICAgICAgICAgICAgIGlmICh4VGV4dE5vZGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRleHROb2RlU3RyaW5nID0gR2V0RGlzcGxheVRleHQoeFRleHROb2RlLCBwcmVzZXJ2ZVdoaXRlU3BhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBuZXcgWEVsZW1lbnQoVy5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFBhcmFncmFwaFByb3BlcnRpZXMobm9kZS5QYXJlbnQsIG51bGwsIHNldHRpbmdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRSdW5Qcm9wZXJ0aWVzKChYVGV4dClub2RlLCBzZXR0aW5ncyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRYbWxTcGFjZUF0dHJpYnV0ZSh0ZXh0Tm9kZVN0cmluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Tm9kZVN0cmluZykpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBUcmFuc2Zvcm0obiwgc2V0dGluZ3MsIHdEb2MsIG5leHRFeHBlY3RlZCwgcHJlc2VydmVXaGl0ZVNwYWNlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0ZXh0Tm9kZVN0cmluZyA9IEdldERpc3BsYXlUZXh0KChYVGV4dClub2RlLCBwcmVzZXJ2ZVdoaXRlU3BhY2UpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCByUHIgPSBHZXRSdW5Qcm9wZXJ0aWVzKChYVGV4dClub2RlLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHIgPSBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgclByLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRYbWxTcGFjZUF0dHJpYnV0ZSh0ZXh0Tm9kZVN0cmluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE5vZGVTdHJpbmcpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgVHJhbnNmb3JtSW1hZ2VUb1dtbChYRWxlbWVudCBlbGVtZW50LCBIdG1sVG9XbWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncywgV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgc3JjQXR0cmlidXRlID0gKHN0cmluZyllbGVtZW50LkF0dHJpYnV0ZShYaHRtbE5vTmFtZXNwYWNlLnNyYyk7CisgICAgICAgICAgICBieXRlW10gYmEgPSBudWxsOworICAgICAgICAgICAgQml0bWFwIGJtcCA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChzcmNBdHRyaWJ1dGUuU3RhcnRzV2l0aCgiZGF0YToiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2VtaUluZGV4ID0gc3JjQXR0cmlidXRlLkluZGV4T2YoJzsnKTsKKyAgICAgICAgICAgICAgICB2YXIgY29tbWFJbmRleCA9IHNyY0F0dHJpYnV0ZS5JbmRleE9mKCcsJywgc2VtaUluZGV4KTsKKyAgICAgICAgICAgICAgICB2YXIgYmFzZTY0ID0gc3JjQXR0cmlidXRlLlN1YnN0cmluZyhjb21tYUluZGV4ICsgMSk7CisgICAgICAgICAgICAgICAgYmEgPSBDb252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoYmFzZTY0KTsKKyAgICAgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbShiYSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBibXAgPSBuZXcgQml0bWFwKG1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBibXAgPSBuZXcgQml0bWFwKHNldHRpbmdzLkJhc2VVcmlGb3JJbWFnZXMgKyAiLyIgKyBzcmNBdHRyaWJ1dGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoQXJndW1lbnRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKE5vdFN1cHBvcnRlZEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgYm1wLlNhdmUobXMsIGJtcC5SYXdGb3JtYXQpOworICAgICAgICAgICAgICAgIGJhID0gbXMuVG9BcnJheSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNYWluRG9jdW1lbnRQYXJ0IG1kcCA9IHdEb2MuTWFpbkRvY3VtZW50UGFydDsKKyAgICAgICAgICAgIHN0cmluZyBySWQgPSAiUiIgKyBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygpLlJlcGxhY2UoIi0iLCAiIik7CisgICAgICAgICAgICBJbWFnZVBhcnRUeXBlIGlwdCA9IEltYWdlUGFydFR5cGUuUG5nOworICAgICAgICAgICAgSW1hZ2VQYXJ0IG5ld1BhcnQgPSBtZHAuQWRkSW1hZ2VQYXJ0KGlwdCwgcklkKTsKKyAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gcyA9IG5ld1BhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5SZWFkV3JpdGUpKQorICAgICAgICAgICAgICAgIHMuV3JpdGUoYmEsIDAsIGJhLkdldFVwcGVyQm91bmQoMCkgKyAxKTsKKworICAgICAgICAgICAgUGljdHVyZUlkIHBpZCA9IHdEb2MuQW5ub3RhdGlvbjxQaWN0dXJlSWQ+KCk7CisgICAgICAgICAgICBpZiAocGlkID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGlkID0gbmV3IFBpY3R1cmVJZAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSWQgPSAxLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgd0RvYy5BZGRBbm5vdGF0aW9uKHBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcGljdHVyZUlkID0gcGlkLklkOworICAgICAgICAgICAgKytwaWQuSWQ7CisKKyAgICAgICAgICAgIHN0cmluZyBwaWN0dXJlRGVzY3JpcHRpb24gPSAiUGljdHVyZSAiICsgcGljdHVyZUlkLlRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIHN0cmluZyBmbG9hdFZhbHVlID0gZWxlbWVudC5HZXRQcm9wKCJmbG9hdCIpLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSAibm9uZSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgcnVuID0gbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgR2V0UnVuUHJvcGVydGllc0ZvckltYWdlKCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLmRyYXdpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRJbWFnZUFzSW5saW5lKGVsZW1lbnQsIHNldHRpbmdzLCB3RG9jLCBibXAsIHJJZCwgcGljdHVyZUlkLCBwaWN0dXJlRGVzY3JpcHRpb24pKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlID09ICJsZWZ0IiB8fCBmbG9hdFZhbHVlID09ICJyaWdodCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgcnVuID0gbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgR2V0UnVuUHJvcGVydGllc0ZvckltYWdlKCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLmRyYXdpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRJbWFnZUFzQW5jaG9yKGVsZW1lbnQsIHNldHRpbmdzLCB3RG9jLCBibXAsIHJJZCwgZmxvYXRWYWx1ZSwgcGljdHVyZUlkLCBwaWN0dXJlRGVzY3JpcHRpb24pKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgR2V0SW1hZ2VBc0lubGluZShYRWxlbWVudCBlbGVtZW50LCBIdG1sVG9XbWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncywgV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jLCBCaXRtYXAgYm1wLAorICAgICAgICAgICAgc3RyaW5nIHJJZCwgaW50IHBpY3R1cmVJZCwgc3RyaW5nIHBpY3R1cmVEZXNjcmlwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgaW5saW5lID0gbmV3IFhFbGVtZW50KFdQLmlubGluZSwgLy8gMjAuNC4yLjgKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgIndwIiwgV1Aud3AuTmFtZXNwYWNlTmFtZSksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuZGlzdFQsIDApLCAgLy8gZGlzdGFuY2UgZnJvbSB0b3Agb2YgaW1hZ2UgdG8gdGV4dCwgaW4gRU1Vcywgbm8gZWZmZWN0IGlmIHRoZSBwYXJlbnQgaXMgaW5saW5lCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuZGlzdEIsIDApLCAgLy8gYm90dG9tCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuZGlzdEwsIDApLCAgLy8gbGVmdAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmRpc3RSLCAwKSwgIC8vIHJpZ2h0CisgICAgICAgICAgICAgICAgR2V0SW1hZ2VFeHRlbnQoZWxlbWVudCwgYm1wKSwKKyAgICAgICAgICAgICAgICBHZXRFZmZlY3RFeHRlbnQoKSwKKyAgICAgICAgICAgICAgICBHZXREb2NQcihlbGVtZW50LCBwaWN0dXJlSWQsIHBpY3R1cmVEZXNjcmlwdGlvbiksCisgICAgICAgICAgICAgICAgR2V0Q052R3JhcGhpY0ZyYW1lUHIoKSwKKyAgICAgICAgICAgICAgICBHZXRHcmFwaGljRm9ySW1hZ2UoZWxlbWVudCwgcklkLCBibXAsIHBpY3R1cmVJZCwgcGljdHVyZURlc2NyaXB0aW9uKSk7CisgICAgICAgICAgICByZXR1cm4gaW5saW5lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgR2V0SW1hZ2VBc0FuY2hvcihYRWxlbWVudCBlbGVtZW50LCBIdG1sVG9XbWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncywgV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jLCBCaXRtYXAgYm1wLAorICAgICAgICAgICAgc3RyaW5nIHJJZCwgc3RyaW5nIGZsb2F0VmFsdWUsIGludCBwaWN0dXJlSWQsIHN0cmluZyBwaWN0dXJlRGVzY3JpcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIEVtdSBtaW5EaXN0RnJvbUVkZ2UgPSAobG9uZykoMC4xMjUgKiBFbXUuc19FbXVzUGVySW5jaCk7CisgICAgICAgICAgICBsb25nIHJlbEhlaWdodCA9IDI1MTY1ODI0MDsgIC8vIHotb3JkZXIKKworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBtYXJnaW5Ub3BQcm9wID0gZWxlbWVudC5HZXRQcm9wKCJtYXJnaW4tdG9wIik7CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIG1hcmdpbkxlZnRQcm9wID0gZWxlbWVudC5HZXRQcm9wKCJtYXJnaW4tbGVmdCIpOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBtYXJnaW5Cb3R0b21Qcm9wID0gZWxlbWVudC5HZXRQcm9wKCJtYXJnaW4tYm90dG9tIik7CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIG1hcmdpblJpZ2h0UHJvcCA9IGVsZW1lbnQuR2V0UHJvcCgibWFyZ2luLXJpZ2h0Iik7CisKKyAgICAgICAgICAgIEVtdSBtYXJnaW5Ub3BJbkVtdXMgPSAwOworICAgICAgICAgICAgRW11IG1hcmdpbkJvdHRvbUluRW11cyA9IDA7CisgICAgICAgICAgICBFbXUgbWFyZ2luTGVmdEluRW11cyA9IDA7CisgICAgICAgICAgICBFbXUgbWFyZ2luUmlnaHRJbkVtdXMgPSAwOworCisgICAgICAgICAgICBpZiAobWFyZ2luVG9wUHJvcC5Jc05vdEF1dG8pCisgICAgICAgICAgICAgICAgbWFyZ2luVG9wSW5FbXVzID0gKEVtdSltYXJnaW5Ub3BQcm9wOworCisgICAgICAgICAgICBpZiAobWFyZ2luQm90dG9tUHJvcC5Jc05vdEF1dG8pCisgICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tSW5FbXVzID0gKEVtdSltYXJnaW5Cb3R0b21Qcm9wOworCisgICAgICAgICAgICBpZiAobWFyZ2luTGVmdFByb3AuSXNOb3RBdXRvKQorICAgICAgICAgICAgICAgIG1hcmdpbkxlZnRJbkVtdXMgPSAoRW11KW1hcmdpbkxlZnRQcm9wOworCisgICAgICAgICAgICBpZiAobWFyZ2luUmlnaHRQcm9wLklzTm90QXV0bykKKyAgICAgICAgICAgICAgICBtYXJnaW5SaWdodEluRW11cyA9IChFbXUpbWFyZ2luUmlnaHRQcm9wOworCisgICAgICAgICAgICBFbXUgcmVsYXRpdmVGcm9tQ29sdW1uID0gMDsKKyAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlID09ICJsZWZ0IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWxhdGl2ZUZyb21Db2x1bW4gPSBtYXJnaW5MZWZ0SW5FbXVzOworICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gcGFyZW50TWFyZ2luTGVmdCA9IGVsZW1lbnQuUGFyZW50LkdldFByb3AoIm1hcmdpbi1sZWZ0Iik7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudE1hcmdpbkxlZnQuSXNOb3RBdXRvKQorICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZUZyb21Db2x1bW4gKz0gKGxvbmcpKEVtdSlwYXJlbnRNYXJnaW5MZWZ0OworICAgICAgICAgICAgICAgIG1hcmdpblJpZ2h0SW5FbXVzID0gTWF0aC5NYXgobWFyZ2luUmlnaHRJbkVtdXMsIG1pbkRpc3RGcm9tRWRnZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChmbG9hdFZhbHVlID09ICJyaWdodCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRW11IHByaW50V2lkdGggPSAobG9uZylzZXR0aW5ncy5QYWdlV2lkdGhFbXVzIC0gKGxvbmcpc2V0dGluZ3MuUGFnZU1hcmdpbkxlZnRFbXVzIC0gKGxvbmcpc2V0dGluZ3MuUGFnZU1hcmdpblJpZ2h0RW11czsKKyAgICAgICAgICAgICAgICBTaXplRW11IHNsID0gR2V0SW1hZ2VTaXplSW5FbXVzKGVsZW1lbnQsIGJtcCk7CisgICAgICAgICAgICAgICAgcmVsYXRpdmVGcm9tQ29sdW1uID0gcHJpbnRXaWR0aCAtIHNsLm1fV2lkdGg7CisgICAgICAgICAgICAgICAgaWYgKG1hcmdpblJpZ2h0UHJvcC5Jc05vdEF1dG8pCisgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlRnJvbUNvbHVtbiAtPSAobG9uZykoRW11KW1hcmdpblJpZ2h0SW5FbXVzOworICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gcGFyZW50TWFyZ2luUmlnaHQgPSBlbGVtZW50LlBhcmVudC5HZXRQcm9wKCJtYXJnaW4tcmlnaHQiKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50TWFyZ2luUmlnaHQuSXNOb3RBdXRvKQorICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZUZyb21Db2x1bW4gLT0gKGxvbmcpKEVtdSlwYXJlbnRNYXJnaW5SaWdodDsKKyAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0SW5FbXVzID0gTWF0aC5NYXgobWFyZ2luTGVmdEluRW11cywgbWluRGlzdEZyb21FZGdlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRW11IHJlbGF0aXZlRnJvbVBhcmFncmFwaCA9IG1hcmdpblRvcEluRW11czsKKyAgICAgICAgICAgIENzc0V4cHJlc3Npb24gcGFyZW50TWFyZ2luVG9wID0gZWxlbWVudC5QYXJlbnQuR2V0UHJvcCgibWFyZ2luLXRvcCIpOworICAgICAgICAgICAgaWYgKHBhcmVudE1hcmdpblRvcC5Jc05vdEF1dG8pCisgICAgICAgICAgICAgICAgcmVsYXRpdmVGcm9tUGFyYWdyYXBoICs9IChsb25nKShFbXUpcGFyZW50TWFyZ2luVG9wOworCisgICAgICAgICAgICBYRWxlbWVudCBhbmNob3IgPSBuZXcgWEVsZW1lbnQoV1AuYW5jaG9yLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAid3AiLCBXUC53cC5OYW1lc3BhY2VOYW1lKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5kaXN0VCwgKGxvbmcpbWFyZ2luVG9wSW5FbXVzKSwgICAgIC8vIGRpc3RhbmNlIGZyb20gdG9wIG9mIGltYWdlIHRvIHRleHQsIGluIEVNVXMsIG5vIGVmZmVjdCBpZiB0aGUgcGFyZW50IGlzIGlubGluZQorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmRpc3RCLCAobG9uZyltYXJnaW5Cb3R0b21JbkVtdXMpLCAgLy8gYm90dG9tCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuZGlzdEwsIChsb25nKW1hcmdpbkxlZnRJbkVtdXMpLCAgICAvLyBsZWZ0CisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuZGlzdFIsIChsb25nKW1hcmdpblJpZ2h0SW5FbXVzKSwgICAvLyByaWdodAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnNpbXBsZVBvcywgMCksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucmVsYXRpdmVIZWlnaHQsIHJlbEhlaWdodCksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYmVoaW5kRG9jLCAwKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5sb2NrZWQsIDApLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmxheW91dEluQ2VsbCwgMSksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYWxsb3dPdmVybGFwLCAxKSwKKyAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoV1Auc2ltcGxlUG9zLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS54LCAwKSwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UueSwgMCkpLAorICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXUC5wb3NpdGlvbkgsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnJlbGF0aXZlRnJvbSwgImNvbHVtbiIpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoV1AucG9zT2Zmc2V0LCAobG9uZylyZWxhdGl2ZUZyb21Db2x1bW4pKSwKKyAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoV1AucG9zaXRpb25WLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5yZWxhdGl2ZUZyb20sICJwYXJhZ3JhcGgiKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFdQLnBvc09mZnNldCwgKGxvbmcpcmVsYXRpdmVGcm9tUGFyYWdyYXBoKSksCisgICAgICAgICAgICAgICAgR2V0SW1hZ2VFeHRlbnQoZWxlbWVudCwgYm1wKSwKKyAgICAgICAgICAgICAgICBHZXRFZmZlY3RFeHRlbnQoKSwKKyAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoV1Aud3JhcFNxdWFyZSwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2Uud3JhcFRleHQsICJib3RoU2lkZXMiKSksCisgICAgICAgICAgICAgICAgR2V0RG9jUHIoZWxlbWVudCwgcGljdHVyZUlkLCBwaWN0dXJlRGVzY3JpcHRpb24pLAorICAgICAgICAgICAgICAgIEdldENOdkdyYXBoaWNGcmFtZVByKCksCisgICAgICAgICAgICAgICAgR2V0R3JhcGhpY0ZvckltYWdlKGVsZW1lbnQsIHJJZCwgYm1wLCBwaWN0dXJlSWQsIHBpY3R1cmVEZXNjcmlwdGlvbiksCisgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFdQMTQuc2l6ZVJlbEgsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnJlbGF0aXZlRnJvbSwgInBhZ2UiKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFdQMTQucGN0V2lkdGgsIDApKSwKKyAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoV1AxNC5zaXplUmVsViwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucmVsYXRpdmVGcm9tLCAicGFnZSIpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoV1AxNC5wY3RIZWlnaHQsIDApKQorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHJldHVybiBhbmNob3I7CisgICAgICAgIH0KKyNpZiBmYWxzZQorICAgICAgICAgIDx3cDphbmNob3IgZGlzdFQ9IjAiCisgICAgICAgICAgICAgICAgICAgICBkaXN0Qj0iMCIKKyAgICAgICAgICAgICAgICAgICAgIGRpc3RMPSIxMTQzMDAiCisgICAgICAgICAgICAgICAgICAgICBkaXN0Uj0iMTE0MzAwIgorICAgICAgICAgICAgICAgICAgICAgc2ltcGxlUG9zPSIwIgorICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVIZWlnaHQ9IjI1MTY1ODI0MCIKKyAgICAgICAgICAgICAgICAgICAgIGJlaGluZERvYz0iMCIKKyAgICAgICAgICAgICAgICAgICAgIGxvY2tlZD0iMCIKKyAgICAgICAgICAgICAgICAgICAgIGxheW91dEluQ2VsbD0iMSIKKyAgICAgICAgICAgICAgICAgICAgIGFsbG93T3ZlcmxhcD0iMSI+CisgICAgICAgICAgICA8d3A6c2ltcGxlUG9zIHg9IjAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIHk9IjAiLz4KKyAgICAgICAgICAgIDx3cDpwb3NpdGlvbkggcmVsYXRpdmVGcm9tPSJjb2x1bW4iPgorICAgICAgICAgICAgICA8d3A6cG9zT2Zmc2V0PjA8L3dwOnBvc09mZnNldD4KKyAgICAgICAgICAgIDwvd3A6cG9zaXRpb25IPgorICAgICAgICAgICAgPHdwOnBvc2l0aW9uViByZWxhdGl2ZUZyb209InBhcmFncmFwaCI+CisgICAgICAgICAgICAgIDx3cDpwb3NPZmZzZXQ+MDwvd3A6cG9zT2Zmc2V0PgorICAgICAgICAgICAgPC93cDpwb3NpdGlvblY+CisgICAgICAgICAgICA8d3A6ZXh0ZW50IGN4PSIxNzEzODY1IgorICAgICAgICAgICAgICAgICAgICAgICBjeT0iMTY1NjcxNSIvPgorICAgICAgICAgICAgPHdwOmVmZmVjdEV4dGVudCBsPSIwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0PSIwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByPSI2MzUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI9IjYzNSIvPgorICAgICAgICAgICAgPHdwOndyYXBTcXVhcmUgd3JhcFRleHQ9ImJvdGhTaWRlcyIvPgorICAgICAgICAgICAgPHdwOmRvY1ByIGlkPSIxIgorICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlBpY3R1cmUgMSIKKyAgICAgICAgICAgICAgICAgICAgICBkZXNjcj0iaW1nLnBuZyIvPgorICAgICAgICAgICAgPHdwOmNOdkdyYXBoaWNGcmFtZVByPgorICAgICAgICAgICAgICA8YTpncmFwaGljRnJhbWVMb2NrcyB4bWxuczphPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbWFpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9DaGFuZ2VBc3BlY3Q9IjEiLz4KKyAgICAgICAgICAgIDwvd3A6Y052R3JhcGhpY0ZyYW1lUHI+CisgICAgICAgICAgICA8YTpncmFwaGljIHhtbG5zOmE9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9tYWluIj4KKyAgICAgICAgICAgICAgPGE6Z3JhcGhpY0RhdGEgdXJpPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvcGljdHVyZSI+CisgICAgICAgICAgICAgICAgPHBpYzpwaWMgeG1sbnM6cGljPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvcGljdHVyZSI+CisgICAgICAgICAgICAgICAgICA8cGljOm52UGljUHI+CisgICAgICAgICAgICAgICAgICAgIDxwaWM6Y052UHIgaWQ9IjAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iUGljdHVyZSAxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyPSJpbWcucG5nIi8+CisgICAgICAgICAgICAgICAgICAgIDxwaWM6Y052UGljUHI+CisgICAgICAgICAgICAgICAgICAgICAgPGE6cGljTG9ja3Mgbm9DaGFuZ2VBc3BlY3Q9IjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9DaGFuZ2VBcnJvd2hlYWRzPSIxIi8+CisgICAgICAgICAgICAgICAgICAgIDwvcGljOmNOdlBpY1ByPgorICAgICAgICAgICAgICAgICAgPC9waWM6bnZQaWNQcj4KKyAgICAgICAgICAgICAgICAgIDxwaWM6YmxpcEZpbGw+CisgICAgICAgICAgICAgICAgICAgIDxhOmJsaXAgcjplbWJlZD0icklkNSI+CisgICAgICAgICAgICAgICAgICAgICAgPGE6ZXh0THN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGE6ZXh0IHVyaT0iezI4QTAwOTJCLUM1MEMtNDA3RS1BOTQ3LTcwRTc0MDQ4MUMxQ30iPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8YTE0OnVzZUxvY2FsRHBpIHhtbG5zOmExND0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvZHJhd2luZy8yMDEwL21haW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2E6ZXh0PgorICAgICAgICAgICAgICAgICAgICAgIDwvYTpleHRMc3Q+CisgICAgICAgICAgICAgICAgICAgIDwvYTpibGlwPgorICAgICAgICAgICAgICAgICAgICA8YTpzdHJldGNoPgorICAgICAgICAgICAgICAgICAgICAgIDxhOmZpbGxSZWN0Lz4KKyAgICAgICAgICAgICAgICAgICAgPC9hOnN0cmV0Y2g+CisgICAgICAgICAgICAgICAgICA8L3BpYzpibGlwRmlsbD4KKyAgICAgICAgICAgICAgICAgIDxwaWM6c3BQciBid01vZGU9ImF1dG8iPgorICAgICAgICAgICAgICAgICAgICA8YTp4ZnJtPgorICAgICAgICAgICAgICAgICAgICAgIDxhOm9mZiB4PSIwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgPGE6ZXh0IGN4PSIxNzEzODY1IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeT0iMTY1NjcxNSIvPgorICAgICAgICAgICAgICAgICAgICA8L2E6eGZybT4KKyAgICAgICAgICAgICAgICAgICAgPGE6cHJzdEdlb20gcHJzdD0icmVjdCI+CisgICAgICAgICAgICAgICAgICAgICAgPGE6YXZMc3QvPgorICAgICAgICAgICAgICAgICAgICA8L2E6cHJzdEdlb20+CisgICAgICAgICAgICAgICAgICAgIDxhOm5vRmlsbC8+CisgICAgICAgICAgICAgICAgICAgIDxhOmxuPgorICAgICAgICAgICAgICAgICAgICAgIDxhOm5vRmlsbC8+CisgICAgICAgICAgICAgICAgICAgIDwvYTpsbj4KKyAgICAgICAgICAgICAgICAgIDwvcGljOnNwUHI+CisgICAgICAgICAgICAgICAgPC9waWM6cGljPgorICAgICAgICAgICAgICA8L2E6Z3JhcGhpY0RhdGE+CisgICAgICAgICAgICA8L2E6Z3JhcGhpYz4KKyAgICAgICAgICAgIDx3cDE0OnNpemVSZWxIIHJlbGF0aXZlRnJvbT0icGFnZSI+CisgICAgICAgICAgICAgIDx3cDE0OnBjdFdpZHRoPjA8L3dwMTQ6cGN0V2lkdGg+CisgICAgICAgICAgICA8L3dwMTQ6c2l6ZVJlbEg+CisgICAgICAgICAgICA8d3AxNDpzaXplUmVsViByZWxhdGl2ZUZyb209InBhZ2UiPgorICAgICAgICAgICAgICA8d3AxNDpwY3RIZWlnaHQ+MDwvd3AxNDpwY3RIZWlnaHQ+CisgICAgICAgICAgICA8L3dwMTQ6c2l6ZVJlbFY+CisgICAgICAgICAgPC93cDphbmNob3I+CisjZW5kaWYKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRQYXJhZ3JhcGhQcm9wZXJ0aWVzRm9ySW1hZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEdldFJ1blByb3BlcnRpZXNGb3JJbWFnZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5yUHIsCisgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcubm9Qcm9vZikpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU2l6ZUVtdSBHZXRJbWFnZVNpemVJbkVtdXMoWEVsZW1lbnQgaW1nLCBCaXRtYXAgYm1wKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgaHJlcyA9IGJtcC5Ib3Jpem9udGFsUmVzb2x1dGlvbjsKKyAgICAgICAgICAgIGRvdWJsZSB2cmVzID0gYm1wLlZlcnRpY2FsUmVzb2x1dGlvbjsKKyAgICAgICAgICAgIFNpemUgcyA9IGJtcC5TaXplOworICAgICAgICAgICAgRW11IGN4ID0gKGxvbmcpKChkb3VibGUpKHMuV2lkdGggLyBocmVzKSAqIChkb3VibGUpRW11LnNfRW11c1BlckluY2gpOworICAgICAgICAgICAgRW11IGN5ID0gKGxvbmcpKChkb3VibGUpKHMuSGVpZ2h0IC8gdnJlcykgKiAoZG91YmxlKUVtdS5zX0VtdXNQZXJJbmNoKTsKKworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiB3aWR0aCA9IGltZy5HZXRQcm9wKCJ3aWR0aCIpOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBoZWlnaHQgPSBpbWcuR2V0UHJvcCgiaGVpZ2h0Iik7CisgICAgICAgICAgICBpZiAod2lkdGguSXNOb3RBdXRvICYmIGhlaWdodC5Jc0F1dG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRW11IHdpZHRoSW5FbXVzID0gKEVtdSl3aWR0aDsKKyAgICAgICAgICAgICAgICBkb3VibGUgcGVyY2VudENoYW5nZSA9IChmbG9hdCl3aWR0aEluRW11cyAvIChmbG9hdCljeDsKKyAgICAgICAgICAgICAgICBjeCA9IHdpZHRoSW5FbXVzOworICAgICAgICAgICAgICAgIGN5ID0gKGxvbmcpKGN5ICogcGVyY2VudENoYW5nZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaXplRW11KGN4LCBjeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod2lkdGguSXNBdXRvICYmIGhlaWdodC5Jc05vdEF1dG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRW11IGhlaWdodEluRW11cyA9IChFbXUpaGVpZ2h0OworICAgICAgICAgICAgICAgIGRvdWJsZSBwZXJjZW50Q2hhbmdlID0gKGZsb2F0KWhlaWdodEluRW11cyAvIChmbG9hdCljeTsKKyAgICAgICAgICAgICAgICBjeSA9IGhlaWdodEluRW11czsKKyAgICAgICAgICAgICAgICBjeCA9IChsb25nKShjeCAqIHBlcmNlbnRDaGFuZ2UpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2l6ZUVtdShjeCwgY3kpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdpZHRoLklzTm90QXV0byAmJiBoZWlnaHQuSXNOb3RBdXRvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2l6ZUVtdSgoRW11KXdpZHRoLCAoRW11KWhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFNpemVFbXUoY3gsIGN5KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEdldEltYWdlRXh0ZW50KFhFbGVtZW50IGltZywgQml0bWFwIGJtcCkKKyAgICAgICAgeworICAgICAgICAgICAgU2l6ZUVtdSBzekVtdSA9IEdldEltYWdlU2l6ZUluRW11cyhpbWcsIGJtcCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFdQLmV4dGVudCwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5jeCwgKGxvbmcpc3pFbXUubV9XaWR0aCksICAgLy8gaW4gRU1VcworICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmN5LCAobG9uZylzekVtdS5tX0hlaWdodCkpOyAvLyBpbiBFTVVzCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRFZmZlY3RFeHRlbnQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFdQLmVmZmVjdEV4dGVudCwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5sLCAwKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS50LCAwKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5yLCAwKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5iLCAwKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXREb2NQcihYRWxlbWVudCBlbGVtZW50LCBpbnQgcGljdHVyZUlkLCBzdHJpbmcgcGljdHVyZURlc2NyaXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFdQLmRvY1ByLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmlkLCBwaWN0dXJlSWQpLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLm5hbWUsIHBpY3R1cmVEZXNjcmlwdGlvbiksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuZGVzY3IsIChzdHJpbmcpZWxlbWVudC5BdHRyaWJ1dGUoTm9OYW1lc3BhY2Uuc3JjKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgR2V0Q052R3JhcGhpY0ZyYW1lUHIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFdQLmNOdkdyYXBoaWNGcmFtZVByLAorICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChBLmdyYXBoaWNGcmFtZUxvY2tzLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgImEiLCBBLmEuTmFtZXNwYWNlTmFtZSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLm5vQ2hhbmdlQXNwZWN0LCAxKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgR2V0R3JhcGhpY0ZvckltYWdlKFhFbGVtZW50IGVsZW1lbnQsIHN0cmluZyBySWQsIEJpdG1hcCBibXAsIGludCBwaWN0dXJlSWQsIHN0cmluZyBwaWN0dXJlRGVzY3JpcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFNpemVFbXUgc3pFbXUgPSBHZXRJbWFnZVNpemVJbkVtdXMoZWxlbWVudCwgYm1wKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGdyYXBoaWMgPSBuZXcgWEVsZW1lbnQoQS5ncmFwaGljLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAiYSIsIEEuYS5OYW1lc3BhY2VOYW1lKSwKKyAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQS5ncmFwaGljRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UudXJpLCBQaWMucGljLk5hbWVzcGFjZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUGljLl9waWMsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInBpYyIsIFBpYy5waWMuTmFtZXNwYWNlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUGljLm52UGljUHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFBpYy5jTnZQciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaWQsIHBpY3R1cmVJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLm5hbWUsIHBpY3R1cmVEZXNjcmlwdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmRlc2NyLCAoc3RyaW5nKWVsZW1lbnQuQXR0cmlidXRlKE5vTmFtZXNwYWNlLnNyYykpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUGljLmNOdlBpY1ByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQS5waWNMb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLm5vQ2hhbmdlQXNwZWN0LCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLm5vQ2hhbmdlQXJyb3doZWFkcywgMSkpKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUGljLmJsaXBGaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChBLmJsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFIuZW1iZWQsIHJJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChBLmV4dExzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChBLmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS51cmksICJ7MjhBMDA5MkItQzUwQy00MDdFLUE5NDctNzBFNzQwNDgxQzFDfSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChBMTQudXNlTG9jYWxEcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnZhbCwgIjAiKSkpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEEuc3RyZXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEEuZmlsbFJlY3QpKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUGljLnNwUHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYndNb2RlLCAiYXV0byIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChBLnhmcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChBLm9mZiwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UueCwgMCksIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnksIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEEuZXh0LCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5jeCwgKGxvbmcpc3pFbXUubV9XaWR0aCksIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmN5LCAobG9uZylzekVtdS5tX0hlaWdodCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQS5wcnN0R2VvbSwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucHJzdCwgInJlY3QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEEuYXZMc3QpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQS5ub0ZpbGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChBLmxuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQS5ub0ZpbGwpKSkpKSk7CisgICAgICAgICAgICByZXR1cm4gZ3JhcGhpYzsKKyAgICAgICAgfQorCisjaWYgZmFsc2UKKyAgICAgICAgICAgIDxhOmdyYXBoaWMgeG1sbnM6YT0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L21haW4iPgorICAgICAgICAgICAgICA8YTpncmFwaGljRGF0YSB1cmk9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9waWN0dXJlIj4KKyAgICAgICAgICAgICAgICA8cGljOnBpYyB4bWxuczpwaWM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9waWN0dXJlIj4KKyAgICAgICAgICAgICAgICAgIDxwaWM6bnZQaWNQcj4KKyAgICAgICAgICAgICAgICAgICAgPHBpYzpjTnZQciBpZD0iMCIgbmFtZT0iUGljdHVyZSAxIiBkZXNjcj0iaW1nLnBuZyIvPgorICAgICAgICAgICAgICAgICAgICA8cGljOmNOdlBpY1ByPgorICAgICAgICAgICAgICAgICAgICAgIDxhOnBpY0xvY2tzIG5vQ2hhbmdlQXNwZWN0PSIxIiBub0NoYW5nZUFycm93aGVhZHM9IjEiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9waWM6Y052UGljUHI+CisgICAgICAgICAgICAgICAgICA8L3BpYzpudlBpY1ByPgorICAgICAgICAgICAgICAgICAgPHBpYzpibGlwRmlsbD4KKyAgICAgICAgICAgICAgICAgICAgPGE6YmxpcCByOmxpbms9InJJZDUiPgorICAgICAgICAgICAgICAgICAgICAgIDxhOmV4dExzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhOmV4dCB1cmk9InsyOEEwMDkyQi1DNTBDLTQwN0UtQTk0Ny03MEU3NDA0ODFDMUN9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPGExNDp1c2VMb2NhbERwaSB4bWxuczphMTQ9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL2RyYXdpbmcvMjAxMC9tYWluIiB2YWw9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvYTpleHQ+CisgICAgICAgICAgICAgICAgICAgICAgPC9hOmV4dExzdD4KKyAgICAgICAgICAgICAgICAgICAgPC9hOmJsaXA+CisgICAgICAgICAgICAgICAgICAgIDxhOnNyY1JlY3QvPgorICAgICAgICAgICAgICAgICAgICA8YTpzdHJldGNoPgorICAgICAgICAgICAgICAgICAgICAgIDxhOmZpbGxSZWN0Lz4KKyAgICAgICAgICAgICAgICAgICAgPC9hOnN0cmV0Y2g+CisgICAgICAgICAgICAgICAgICA8L3BpYzpibGlwRmlsbD4KKyAgICAgICAgICAgICAgICAgIDxwaWM6c3BQciBid01vZGU9ImF1dG8iPgorICAgICAgICAgICAgICAgICAgICA8YTp4ZnJtPgorICAgICAgICAgICAgICAgICAgICAgIDxhOm9mZiB4PSIwIiB5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgPGE6ZXh0IGN4PSIxNzgxMTc1IiBjeT0iMTc4MTE3NSIvPgorICAgICAgICAgICAgICAgICAgICA8L2E6eGZybT4KKyAgICAgICAgICAgICAgICAgICAgPGE6cHJzdEdlb20gcHJzdD0icmVjdCI+CisgICAgICAgICAgICAgICAgICAgICAgPGE6YXZMc3QvPgorICAgICAgICAgICAgICAgICAgICA8L2E6cHJzdEdlb20+CisgICAgICAgICAgICAgICAgICAgIDxhOm5vRmlsbC8+CisgICAgICAgICAgICAgICAgICAgIDxhOmxuPgorICAgICAgICAgICAgICAgICAgICAgIDxhOm5vRmlsbC8+CisgICAgICAgICAgICAgICAgICAgIDwvYTpsbj4KKyAgICAgICAgICAgICAgICAgIDwvcGljOnNwUHI+CisgICAgICAgICAgICAgICAgPC9waWM6cGljPgorICAgICAgICAgICAgICA8L2E6Z3JhcGhpY0RhdGE+CisgICAgICAgICAgICA8L2E6Z3JhcGhpYz4KKyNlbmRpZgorICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRQYXJhZ3JhcGhQcm9wZXJ0aWVzKFhFbGVtZW50IGJsb2NrTGV2ZWxFbGVtZW50LCBzdHJpbmcgc3R5bGVOYW1lLCBIdG1sVG9XbWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgcGFyYWdyYXBoTWFya1J1blByb3BlcnRpZXMgPSBHZXRSdW5Qcm9wZXJ0aWVzKGJsb2NrTGV2ZWxFbGVtZW50LCBzZXR0aW5ncyk7CisgICAgICAgICAgICBYRWxlbWVudCBiYWNrZ3JvdW5kUHJvcGVydHkgPSBHZXRCYWNrZ3JvdW5kUHJvcGVydHkoYmxvY2tMZXZlbEVsZW1lbnQpOworICAgICAgICAgICAgWEVsZW1lbnRbXSBzcGFjaW5nUHJvcGVydHkgPSBHZXRTcGFjaW5nUHJvcGVydGllcyhibG9ja0xldmVsRWxlbWVudCwgc2V0dGluZ3MpOyAvLyBzcGFjaW5nLCBpbmQsIGNvbnRleHR1YWxTcGFjaW5nCisgICAgICAgICAgICBYRWxlbWVudCBqYyA9IEdldEp1c3RpZmljYXRpb24oYmxvY2tMZXZlbEVsZW1lbnQsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIFhFbGVtZW50IHBTdHlsZSA9IHN0eWxlTmFtZSAhPSBudWxsID8gbmV3IFhFbGVtZW50KFcucFN0eWxlLCBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgc3R5bGVOYW1lKSkgOiBudWxsOworICAgICAgICAgICAgWEVsZW1lbnQgbnVtUHIgPSBHZXROdW1iZXJpbmdQcm9wZXJ0aWVzKGJsb2NrTGV2ZWxFbGVtZW50LCBzZXR0aW5ncyk7CisgICAgICAgICAgICBYRWxlbWVudCBwQmRyID0gR2V0QmxvY2tDb250ZW50Qm9yZGVycyhibG9ja0xldmVsRWxlbWVudCwgVy5wQmRyLCB0cnVlKTsKKworICAgICAgICAgICAgWEVsZW1lbnQgYmlkaSA9IG51bGw7CisgICAgICAgICAgICBzdHJpbmcgZGlyZWN0aW9uID0gR2V0RGlyZWN0aW9uKGJsb2NrTGV2ZWxFbGVtZW50KTsKKyAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gInJ0bCIpCisgICAgICAgICAgICAgICAgYmlkaSA9IG5ldyBYRWxlbWVudChXLmJpZGkpOworCisgICAgICAgICAgICBYRWxlbWVudCBwUHIgPSBuZXcgWEVsZW1lbnQoVy5wUHIsCisgICAgICAgICAgICAgICAgcFN0eWxlLAorICAgICAgICAgICAgICAgIG51bVByLAorICAgICAgICAgICAgICAgIHBCZHIsCisgICAgICAgICAgICAgICAgYmFja2dyb3VuZFByb3BlcnR5LAorICAgICAgICAgICAgICAgIGJpZGksCisgICAgICAgICAgICAgICAgc3BhY2luZ1Byb3BlcnR5LAorICAgICAgICAgICAgICAgIGpjLAorICAgICAgICAgICAgICAgIHBhcmFncmFwaE1hcmtSdW5Qcm9wZXJ0aWVzCisgICAgICAgICAgICApOworICAgICAgICAgICAgcmV0dXJuIHBQcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcnRpY2FsLWFsaWduIGRvZXNuJ3QgcmVhbGx5IHdvcmsgaW4gdGhlIFdvcmQgcmVuZGVyaW5nIC0gcHV0cyBzcGFjZSBhYm92ZSwgYnV0IG5vdCBiZWxvdy4gIFRoZXJlIHJlYWxseSBhcmUgbm8KKyAgICAgICAgLy8gb3B0aW9ucyBpbiBXb3JkcHJvY2Vzc2luZ01MIHRvIHNwZWNpZnkgdmVydGljYWwgYWxpZ25tZW50LiAgSSB0aGluayB0aGF0IHRoZSBvbmx5IHBvc3NpYmxlIHdheSB0aGF0IHRoaXMgY291bGQgYmUKKyAgICAgICAgLy8gaW1wbGVtZW50ZWQgd291bGQgYmUgdG8gc3BlY2lmaWNhbGx5IGNhbGN1bGF0ZSB0aGUgc3BhY2UgYmVmb3JlIGFuZCBzcGFjZSBhZnRlci4gIEknbSBub3QgY29tcGxldGVseSBzdXJlIHRoYXQKKyAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBwb3NzaWJsZS4gIEkgYW0gcHJldHR5IHN1cmUgdGhhdCB0aGlzIGlzIG5vdCB3b3J0aCB0aGUgZWZmb3J0LgorCisgICAgICAgIC8vIFJldHVybnMgdGhlIHNwYWNpbmcsIGluZCwgYW5kIGNvbnRleHR1YWxTcGFjaW5nIGVsZW1lbnRzCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50W10gR2V0U3BhY2luZ1Byb3BlcnRpZXMoWEVsZW1lbnQgcGFyYWdyYXBoLCBIdG1sVG9XbWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBtYXJnaW5MZWZ0UHJvcGVydHkgPSBwYXJhZ3JhcGguR2V0UHJvcCgibWFyZ2luLWxlZnQiKTsKKyAgICAgICAgICAgIENzc0V4cHJlc3Npb24gbWFyZ2luUmlnaHRQcm9wZXJ0eSA9IHBhcmFncmFwaC5HZXRQcm9wKCJtYXJnaW4tcmlnaHQiKTsKKyAgICAgICAgICAgIENzc0V4cHJlc3Npb24gbWFyZ2luVG9wUHJvcGVydHkgPSBwYXJhZ3JhcGguR2V0UHJvcCgibWFyZ2luLXRvcCIpOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBtYXJnaW5Cb3R0b21Qcm9wZXJ0eSA9IHBhcmFncmFwaC5HZXRQcm9wKCJtYXJnaW4tYm90dG9tIik7CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGxpbmVIZWlnaHRQcm9wZXJ0eSA9IHBhcmFncmFwaC5HZXRQcm9wKCJsaW5lLWhlaWdodCIpOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBsZWZ0UGFkZGluZ1Byb3BlcnR5ID0gcGFyYWdyYXBoLkdldFByb3AoInBhZGRpbmctbGVmdCIpOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiByaWdodFBhZGRpbmdQcm9wZXJ0eSA9IHBhcmFncmFwaC5HZXRQcm9wKCJwYWRkaW5nLXJpZ2h0Iik7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIGxlZnRJbmRlbnQsIHJpZ2h0SW5kZW50LCBmaXJzdExpbmUKKworICAgICAgICAgICAgVHdpcCBsZWZ0SW5kZW50ID0gMDsKKyAgICAgICAgICAgIFR3aXAgcmlnaHRJbmRlbnQgPSAwOworICAgICAgICAgICAgVHdpcCBmaXJzdExpbmUgPSAwOworCisjaWYgZmFsc2UKKyAgICAgICAgICAgIC8vIHRoaXMgY29kZSBpcyBoZXJlIGZvciBzb21lIHJlYXNvbi4gIFdoYXQgaXMgaXQ/CisgICAgICAgICAgICBkb3VibGUgbGVmdEJvcmRlclNpemUgPSBHZXRCb3JkZXJTaXplKHBhcmFncmFwaCwgImxlZnQiKTsgLy8gaW4gMS84IHBvaW50CisgICAgICAgICAgICBkb3VibGUgcmlnaHRCb3JkZXJTaXplID0gR2V0Qm9yZGVyU2l6ZShwYXJhZ3JhcGgsICJyaWdodCIpOyAvLyBpbiAxLzggcG9pbnQKKyAgICAgICAgICAgIGxlZnRJbmRlbnQgKz0gKGxvbmcpKChsZWZ0Qm9yZGVyU2l6ZSAvIDhkKSAqIDIwZCk7CisgICAgICAgICAgICByaWdodEluZGVudCArPSAobG9uZykoKHJpZ2h0Qm9yZGVyU2l6ZSAvIDhkKSAqIDIwZCk7CisjZW5kaWYKKworICAgICAgICAgICAgaWYgKGxlZnRQYWRkaW5nUHJvcGVydHkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsZWZ0SW5kZW50ICs9IChUd2lwKWxlZnRQYWRkaW5nUHJvcGVydHk7CisgICAgICAgICAgICBpZiAocmlnaHRQYWRkaW5nUHJvcGVydHkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByaWdodEluZGVudCArPSAoVHdpcClyaWdodFBhZGRpbmdQcm9wZXJ0eTsKKworICAgICAgICAgICAgaWYgKHBhcmFncmFwaC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UubGkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVmdEluZGVudCArPSAxODA7CisgICAgICAgICAgICAgICAgcmlnaHRJbmRlbnQgKz0gMTgwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgWEVsZW1lbnQgbGlzdEVsZW1lbnQgPSBudWxsOworICAgICAgICAgICAgTnVtYmVyZWRJdGVtQW5ub3RhdGlvbiBudW1iZXJlZEl0ZW1Bbm5vdGF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIGxpc3RFbGVtZW50ID0gcGFyYWdyYXBoLkFuY2VzdG9ycygpLkZpcnN0T3JEZWZhdWx0KGEgPT4gYS5OYW1lID09IFhodG1sTm9OYW1lc3BhY2Uub2wgfHwgYS5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UudWwpOworICAgICAgICAgICAgaWYgKGxpc3RFbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbnVtYmVyZWRJdGVtQW5ub3RhdGlvbiA9IGxpc3RFbGVtZW50LkFubm90YXRpb248TnVtYmVyZWRJdGVtQW5ub3RhdGlvbj4oKTsKKyAgICAgICAgICAgICAgICBsZWZ0SW5kZW50ICs9IDYwMCAqIChudW1iZXJlZEl0ZW1Bbm5vdGF0aW9uLmlsdmwgKyAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGJsb2NrUXVvdGVDb3VudCA9IHBhcmFncmFwaC5BbmNlc3RvcnMoWGh0bWxOb05hbWVzcGFjZS5ibG9ja3F1b3RlKS5Db3VudCgpOworICAgICAgICAgICAgbGVmdEluZGVudCArPSBibG9ja1F1b3RlQ291bnQgKiA3MjA7CisgICAgICAgICAgICBpZiAoYmxvY2tRdW90ZUNvdW50ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1hcmdpbkxlZnRQcm9wZXJ0eSAhPSBudWxsICYmIG1hcmdpbkxlZnRQcm9wZXJ0eS5Jc05vdEF1dG8gJiYgbWFyZ2luTGVmdFByb3BlcnR5LklzTm90Tm9ybWFsKQorICAgICAgICAgICAgICAgICAgICBsZWZ0SW5kZW50ICs9IChUd2lwKW1hcmdpbkxlZnRQcm9wZXJ0eTsKKyAgICAgICAgICAgICAgICBpZiAobWFyZ2luUmlnaHRQcm9wZXJ0eSAhPSBudWxsICYmIG1hcmdpblJpZ2h0UHJvcGVydHkuSXNOb3RBdXRvICYmIG1hcmdpblJpZ2h0UHJvcGVydHkuSXNOb3ROb3JtYWwpCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0SW5kZW50ICs9IChUd2lwKW1hcmdpblJpZ2h0UHJvcGVydHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIHRleHRJbmRlbnRQcm9wZXJ0eSA9IHBhcmFncmFwaC5HZXRQcm9wKCJ0ZXh0LWluZGVudCIpOworICAgICAgICAgICAgaWYgKHRleHRJbmRlbnRQcm9wZXJ0eSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFR3aXAgdHdpcHMgPSAoVHdpcCl0ZXh0SW5kZW50UHJvcGVydHk7CisgICAgICAgICAgICAgICAgZmlyc3RMaW5lID0gdHdpcHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFhFbGVtZW50IGluZCA9IG51bGw7CisgICAgICAgICAgICBpZiAobGVmdEluZGVudCA+IDAgfHwgcmlnaHRJbmRlbnQgPiAwIHx8IGZpcnN0TGluZSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdExpbmUgPCAwKQorICAgICAgICAgICAgICAgICAgICBpbmQgPSBuZXcgWEVsZW1lbnQoVy5pbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0SW5kZW50ICE9IDAgPyBuZXcgWEF0dHJpYnV0ZShXLmxlZnQsIChsb25nKWxlZnRJbmRlbnQpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0SW5kZW50ICE9IDAgPyBuZXcgWEF0dHJpYnV0ZShXLnJpZ2h0LCAobG9uZylyaWdodEluZGVudCkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RMaW5lICE9IDAgPyBuZXcgWEF0dHJpYnV0ZShXLmhhbmdpbmcsIC0obG9uZylmaXJzdExpbmUpIDogbnVsbCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpbmQgPSBuZXcgWEVsZW1lbnQoVy5pbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0SW5kZW50ICE9IDAgPyBuZXcgWEF0dHJpYnV0ZShXLmxlZnQsIChsb25nKWxlZnRJbmRlbnQpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0SW5kZW50ICE9IDAgPyBuZXcgWEF0dHJpYnV0ZShXLnJpZ2h0LCAobG9uZylyaWdodEluZGVudCkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RMaW5lICE9IDAgPyBuZXcgWEF0dHJpYnV0ZShXLmZpcnN0TGluZSwgKGxvbmcpZmlyc3RMaW5lKSA6IG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyBzcGFjaW5nCisKKyAgICAgICAgICAgIGxvbmcgbGluZSA9IDI0MDsKKyAgICAgICAgICAgIHN0cmluZyBsaW5lUnVsZSA9ICJhdXRvIjsKKyAgICAgICAgICAgIHN0cmluZyBiZWZvcmVBdXRvc3BhY2luZyA9IG51bGw7CisgICAgICAgICAgICBzdHJpbmcgYWZ0ZXJBdXRvc3BhY2luZyA9IG51bGw7CisgICAgICAgICAgICBsb25nPyBiZWZvcmUgPSBudWxsOworICAgICAgICAgICAgbG9uZz8gYWZ0ZXIgPSBudWxsOworCisgICAgICAgICAgICBpZiAocGFyYWdyYXBoLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS50ZCB8fCBwYXJhZ3JhcGguTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLnRoIHx8IHBhcmFncmFwaC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UuY2FwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW5lID0gKGxvbmcpc2V0dGluZ3MuRGVmYXVsdFNwYWNpbmdFbGVtZW50Rm9yUGFyYWdyYXBoc0luVGFibGVzLkF0dHJpYnV0ZShXLmxpbmUpOworICAgICAgICAgICAgICAgIGxpbmVSdWxlID0gKHN0cmluZylzZXR0aW5ncy5EZWZhdWx0U3BhY2luZ0VsZW1lbnRGb3JQYXJhZ3JhcGhzSW5UYWJsZXMuQXR0cmlidXRlKFcubGluZVJ1bGUpOworICAgICAgICAgICAgICAgIGJlZm9yZSA9IChsb25nPylzZXR0aW5ncy5EZWZhdWx0U3BhY2luZ0VsZW1lbnRGb3JQYXJhZ3JhcGhzSW5UYWJsZXMuQXR0cmlidXRlKFcuYmVmb3JlKTsKKyAgICAgICAgICAgICAgICBiZWZvcmVBdXRvc3BhY2luZyA9IChzdHJpbmcpc2V0dGluZ3MuRGVmYXVsdFNwYWNpbmdFbGVtZW50Rm9yUGFyYWdyYXBoc0luVGFibGVzLkF0dHJpYnV0ZShXLmJlZm9yZUF1dG9zcGFjaW5nKTsKKyAgICAgICAgICAgICAgICBhZnRlciA9IChsb25nPylzZXR0aW5ncy5EZWZhdWx0U3BhY2luZ0VsZW1lbnRGb3JQYXJhZ3JhcGhzSW5UYWJsZXMuQXR0cmlidXRlKFcuYWZ0ZXIpOworICAgICAgICAgICAgICAgIGFmdGVyQXV0b3NwYWNpbmcgPSAoc3RyaW5nKXNldHRpbmdzLkRlZmF1bHRTcGFjaW5nRWxlbWVudEZvclBhcmFncmFwaHNJblRhYmxlcy5BdHRyaWJ1dGUoVy5hZnRlckF1dG9zcGFjaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdG9kbyBzaG91bGQgY2hlY2sgYmFzZWQgb24gZGlzcGxheSBwcm9wZXJ0eQorICAgICAgICAgICAgYm9vbCBudW1JdGVtID0gcGFyYWdyYXBoLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5saTsKKworICAgICAgICAgICAgaWYgKG51bUl0ZW0gJiYgbWFyZ2luVG9wUHJvcGVydHkuSXNBdXRvKQorICAgICAgICAgICAgICAgIGJlZm9yZUF1dG9zcGFjaW5nID0gIjEiOworICAgICAgICAgICAgaWYgKG51bUl0ZW0gJiYgbWFyZ2luQm90dG9tUHJvcGVydHkuSXNBdXRvKQorICAgICAgICAgICAgICAgIGFmdGVyQXV0b3NwYWNpbmcgPSAiMSI7CisgICAgICAgICAgICBpZiAobWFyZ2luVG9wUHJvcGVydHkgIT0gbnVsbCAmJiBtYXJnaW5Ub3BQcm9wZXJ0eS5Jc05vdEF1dG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmVmb3JlID0gKGxvbmcpKFR3aXApbWFyZ2luVG9wUHJvcGVydHk7CisgICAgICAgICAgICAgICAgYmVmb3JlQXV0b3NwYWNpbmcgPSAiMCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWFyZ2luQm90dG9tUHJvcGVydHkgIT0gbnVsbCAmJiBtYXJnaW5Cb3R0b21Qcm9wZXJ0eS5Jc05vdEF1dG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWZ0ZXIgPSAobG9uZykoVHdpcCltYXJnaW5Cb3R0b21Qcm9wZXJ0eTsKKyAgICAgICAgICAgICAgICBhZnRlckF1dG9zcGFjaW5nID0gIjAiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxpbmVIZWlnaHRQcm9wZXJ0eSAhPSBudWxsICYmIGxpbmVIZWlnaHRQcm9wZXJ0eS5Jc05vdEF1dG8gJiYgbGluZUhlaWdodFByb3BlcnR5LklzTm90Tm9ybWFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGxpbmUgaXMgaW4gdHdpcHMgaWYgbGluZVJ1bGUgPT0gImF0TGVhc3QiCisgICAgICAgICAgICAgICAgbGluZSA9IChsb25nKShUd2lwKWxpbmVIZWlnaHRQcm9wZXJ0eTsKKyAgICAgICAgICAgICAgICBsaW5lUnVsZSA9ICJhdExlYXN0IjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgWEVsZW1lbnQgc3BhY2luZyA9IG5ldyBYRWxlbWVudChXLnNwYWNpbmcsCisgICAgICAgICAgICAgICAgYmVmb3JlICE9IG51bGwgPyBuZXcgWEF0dHJpYnV0ZShXLmJlZm9yZSwgYmVmb3JlKSA6IG51bGwsCisgICAgICAgICAgICAgICAgYmVmb3JlQXV0b3NwYWNpbmcgIT0gbnVsbCA/IG5ldyBYQXR0cmlidXRlKFcuYmVmb3JlQXV0b3NwYWNpbmcsIGJlZm9yZUF1dG9zcGFjaW5nKSA6IG51bGwsCisgICAgICAgICAgICAgICAgYWZ0ZXIgIT0gbnVsbCA/IG5ldyBYQXR0cmlidXRlKFcuYWZ0ZXIsIGFmdGVyKSA6IG51bGwsCisgICAgICAgICAgICAgICAgYWZ0ZXJBdXRvc3BhY2luZyAhPSBudWxsID8gbmV3IFhBdHRyaWJ1dGUoVy5hZnRlckF1dG9zcGFjaW5nLCBhZnRlckF1dG9zcGFjaW5nKSA6IG51bGwsCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5saW5lLCBsaW5lKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmxpbmVSdWxlLCBsaW5lUnVsZSkpOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyBjb250ZXh0dWFsU3BhY2luZworCisgICAgICAgICAgICBYRWxlbWVudCBjb250ZXh0dWFsU3BhY2luZyA9IG51bGw7CisgICAgICAgICAgICBpZiAocGFyYWdyYXBoLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5saSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOdW1iZXJlZEl0ZW1Bbm5vdGF0aW9uIHRoaXNOdW1iZXJlZEl0ZW1Bbm5vdGF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBsaXN0RWxlbWVudDIgPSBwYXJhZ3JhcGguQW5jZXN0b3JzKCkuRmlyc3RPckRlZmF1bHQoYSA9PiBhLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5vbCB8fCBhLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS51bCk7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RFbGVtZW50MiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpc051bWJlcmVkSXRlbUFubm90YXRpb24gPSBsaXN0RWxlbWVudDIuQW5ub3RhdGlvbjxOdW1iZXJlZEl0ZW1Bbm5vdGF0aW9uPigpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXh0ID0gcGFyYWdyYXBoLkVsZW1lbnRzQWZ0ZXJTZWxmKCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT0gbnVsbCAmJiBuZXh0Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5saSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV4dExpc3RFbGVtZW50ID0gbmV4dC5BbmNlc3RvcnMoKS5GaXJzdE9yRGVmYXVsdChhID0+IGEuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLm9sIHx8IGEuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLnVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcmVkSXRlbUFubm90YXRpb24gbmV4dE51bWJlcmVkSXRlbUFubm90YXRpb24gPSBuZXh0TGlzdEVsZW1lbnQuQW5ub3RhdGlvbjxOdW1iZXJlZEl0ZW1Bbm5vdGF0aW9uPigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHROdW1iZXJlZEl0ZW1Bbm5vdGF0aW9uICE9IG51bGwgJiYgdGhpc051bWJlcmVkSXRlbUFubm90YXRpb24ubnVtSWQgPT0gbmV4dE51bWJlcmVkSXRlbUFubm90YXRpb24ubnVtSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHVhbFNwYWNpbmcgPSBuZXcgWEVsZW1lbnQoVy5jb250ZXh0dWFsU3BhY2luZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnRbXSB7IHNwYWNpbmcsIGluZCwgY29udGV4dHVhbFNwYWNpbmcgfTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEdldFJ1blByb3BlcnRpZXMoWFRleHQgdGV4dE5vZGUsIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBwYXJlbnQgPSB0ZXh0Tm9kZS5QYXJlbnQ7CisgICAgICAgICAgICBYRWxlbWVudCByUHIgPSBHZXRSdW5Qcm9wZXJ0aWVzKHBhcmVudCwgc2V0dGluZ3MpOworICAgICAgICAgICAgcmV0dXJuIHJQcjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEdldFJ1blByb3BlcnRpZXMoWEVsZW1lbnQgZWxlbWVudCwgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIENzc0V4cHJlc3Npb24gY29sb3JQcm9wZXJ0eSA9IGVsZW1lbnQuR2V0UHJvcCgiY29sb3IiKTsKKyAgICAgICAgICAgIENzc0V4cHJlc3Npb24gZm9udEZhbWlseVByb3BlcnR5ID0gZWxlbWVudC5HZXRQcm9wKCJmb250LWZhbWlseSIpOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBmb250U2l6ZVByb3BlcnR5ID0gZWxlbWVudC5HZXRQcm9wKCJmb250LXNpemUiKTsKKyAgICAgICAgICAgIENzc0V4cHJlc3Npb24gdGV4dERlY29yYXRpb25Qcm9wZXJ0eSA9IGVsZW1lbnQuR2V0UHJvcCgidGV4dC1kZWNvcmF0aW9uIik7CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGZvbnRTdHlsZVByb3BlcnR5ID0gZWxlbWVudC5HZXRQcm9wKCJmb250LXN0eWxlIik7CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGZvbnRXZWlnaHRQcm9wZXJ0eSA9IGVsZW1lbnQuR2V0UHJvcCgiZm9udC13ZWlnaHQiKTsKKyAgICAgICAgICAgIENzc0V4cHJlc3Npb24gYmFja2dyb3VuZENvbG9yUHJvcGVydHkgPSBlbGVtZW50LkdldFByb3AoImJhY2tncm91bmQtY29sb3IiKTsKKyAgICAgICAgICAgIENzc0V4cHJlc3Npb24gbGV0dGVyU3BhY2luZ1Byb3BlcnR5ID0gZWxlbWVudC5HZXRQcm9wKCJsZXR0ZXItc3BhY2luZyIpOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBkaXJlY3Rpb25Qcm9wID0gZWxlbWVudC5HZXRQcm9wKCJkaXJlY3Rpb24iKTsKKworICAgICAgICAgICAgc3RyaW5nIGNvbG9yUHJvcGVydHlTdHJpbmcgPSBjb2xvclByb3BlcnR5LlRvU3RyaW5nKCk7CisgICAgICAgICAgICBzdHJpbmcgZm9udEZhbWlseVN0cmluZyA9IEdldFVzZWRGb250RnJvbUZvbnRGYW1pbHlQcm9wZXJ0eShmb250RmFtaWx5UHJvcGVydHkpOworICAgICAgICAgICAgVFBvaW50PyBmb250U2l6ZVRQb2ludCA9IEdldFVzZWRTaXplRnJvbUZvbnRTaXplUHJvcGVydHkoZm9udFNpemVQcm9wZXJ0eSk7CisgICAgICAgICAgICBzdHJpbmcgdGV4dERlY29yYXRpb25TdHJpbmcgPSB0ZXh0RGVjb3JhdGlvblByb3BlcnR5LlRvU3RyaW5nKCk7CisgICAgICAgICAgICBzdHJpbmcgZm9udFN0eWxlU3RyaW5nID0gZm9udFN0eWxlUHJvcGVydHkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHN0cmluZyBmb250V2VpZ2h0U3RyaW5nID0gZm9udFdlaWdodFByb3BlcnR5LlRvU3RyaW5nKCkuVG9Mb3dlcigpOworICAgICAgICAgICAgc3RyaW5nIGJhY2tncm91bmRDb2xvclN0cmluZyA9IGJhY2tncm91bmRDb2xvclByb3BlcnR5LlRvU3RyaW5nKCkuVG9Mb3dlcigpOworICAgICAgICAgICAgc3RyaW5nIGxldHRlclNwYWNpbmdTdHJpbmcgPSBsZXR0ZXJTcGFjaW5nUHJvcGVydHkuVG9TdHJpbmcoKS5Ub0xvd2VyKCk7CisgICAgICAgICAgICBzdHJpbmcgZGlyZWN0aW9uU3RyaW5nID0gZGlyZWN0aW9uUHJvcC5Ub1N0cmluZygpLlRvTG93ZXIoKTsKKworICAgICAgICAgICAgYm9vbCBzdWJBbmNlc3RvciA9IGVsZW1lbnQuQW5jZXN0b3JzQW5kU2VsZihYaHRtbE5vTmFtZXNwYWNlLnN1YikuQW55KCk7CisgICAgICAgICAgICBib29sIHN1cEFuY2VzdG9yID0gZWxlbWVudC5BbmNlc3RvcnNBbmRTZWxmKFhodG1sTm9OYW1lc3BhY2Uuc3VwKS5BbnkoKTsKKyAgICAgICAgICAgIGJvb2wgYkFuY2VzdG9yID0gZWxlbWVudC5BbmNlc3RvcnNBbmRTZWxmKFhodG1sTm9OYW1lc3BhY2UuYikuQW55KCk7CisgICAgICAgICAgICBib29sIGlBbmNlc3RvciA9IGVsZW1lbnQuQW5jZXN0b3JzQW5kU2VsZihYaHRtbE5vTmFtZXNwYWNlLmkpLkFueSgpOworICAgICAgICAgICAgYm9vbCBzdHJvbmdBbmNlc3RvciA9IGVsZW1lbnQuQW5jZXN0b3JzQW5kU2VsZihYaHRtbE5vTmFtZXNwYWNlLnN0cm9uZykuQW55KCk7CisgICAgICAgICAgICBib29sIGVtQW5jZXN0b3IgPSBlbGVtZW50LkFuY2VzdG9yc0FuZFNlbGYoWGh0bWxOb05hbWVzcGFjZS5lbSkuQW55KCk7CisgICAgICAgICAgICBib29sIHVBbmNlc3RvciA9IGVsZW1lbnQuQW5jZXN0b3JzQW5kU2VsZihYaHRtbE5vTmFtZXNwYWNlLnUpLkFueSgpOworICAgICAgICAgICAgYm9vbCBzQW5jZXN0b3IgPSBlbGVtZW50LkFuY2VzdG9yc0FuZFNlbGYoWGh0bWxOb05hbWVzcGFjZS5zKS5BbnkoKTsKKworICAgICAgICAgICAgWEF0dHJpYnV0ZSBkaXJBdHRyaWJ1dGUgPSBlbGVtZW50LkF0dHJpYnV0ZShYaHRtbE5vTmFtZXNwYWNlLmRpcik7CisgICAgICAgICAgICBzdHJpbmcgZGlyQXR0cmlidXRlU3RyaW5nID0gIiI7CisgICAgICAgICAgICBpZiAoZGlyQXR0cmlidXRlICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGlyQXR0cmlidXRlU3RyaW5nID0gZGlyQXR0cmlidXRlLlZhbHVlLlRvTG93ZXIoKTsKKworICAgICAgICAgICAgWEVsZW1lbnQgc2hkID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kQ29sb3JTdHJpbmcgIT0gInRyYW5zcGFyZW50IikKKyAgICAgICAgICAgICAgICBzaGQgPSBuZXcgWEVsZW1lbnQoVy5zaGQsIG5ldyBYQXR0cmlidXRlKFcudmFsLCAiY2xlYXIiKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5jb2xvciwgImF1dG8iKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5maWxsLCBiYWNrZ3JvdW5kQ29sb3JTdHJpbmcpKTsKKworICAgICAgICAgICAgWEVsZW1lbnQgc3ViU3VwZXIgPSBudWxsOworICAgICAgICAgICAgaWYgKHN1YkFuY2VzdG9yKQorICAgICAgICAgICAgICAgIHN1YlN1cGVyID0gbmV3IFhFbGVtZW50KFcudmVydEFsaWduLCBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgInN1YnNjcmlwdCIpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZiAoc3VwQW5jZXN0b3IpCisgICAgICAgICAgICAgICAgICAgIHN1YlN1cGVyID0gbmV3IFhFbGVtZW50KFcudmVydEFsaWduLCBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgInN1cGVyc2NyaXB0IikpOworCisgICAgICAgICAgICBYRWxlbWVudCByRm9udHMgPSBudWxsOworICAgICAgICAgICAgaWYgKGZvbnRGYW1pbHlTdHJpbmcgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByRm9udHMgPSBuZXcgWEVsZW1lbnQoVy5yRm9udHMsCisgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHlTdHJpbmcgIT0gc2V0dGluZ3MuTWlub3JMYXRpbkZvbnQgPyBuZXcgWEF0dHJpYnV0ZShXLmFzY2lpLCBmb250RmFtaWx5U3RyaW5nKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHlTdHJpbmcgIT0gc2V0dGluZ3MuTWFqb3JMYXRpbkZvbnQgPyBuZXcgWEF0dHJpYnV0ZShXLmhBbnNpLCBmb250RmFtaWx5U3RyaW5nKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuY3MsIGZvbnRGYW1pbHlTdHJpbmcpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdG9kbyBJIHRoaW5rIHRoaXMgcHV0cyBhIGNvbG9yIG9uIGV2ZXJ5IGVsZW1lbnQuCisgICAgICAgICAgICBYRWxlbWVudCBjb2xvciA9IGNvbG9yUHJvcGVydHlTdHJpbmcgIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuY29sb3IsIG5ldyBYQXR0cmlidXRlKFcudmFsLCBjb2xvclByb3BlcnR5U3RyaW5nKSkgOiBudWxsOworCisgICAgICAgICAgICBYRWxlbWVudCBzeiA9IG51bGw7CisgICAgICAgICAgICBYRWxlbWVudCBzekNzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChmb250U2l6ZVRQb2ludCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN6ID0gbmV3IFhFbGVtZW50KFcuc3osIG5ldyBYQXR0cmlidXRlKFcudmFsLCAoaW50KSgoZG91YmxlKWZvbnRTaXplVFBvaW50ICogMikpKTsKKyAgICAgICAgICAgICAgICBzekNzID0gbmV3IFhFbGVtZW50KFcuc3pDcywgbmV3IFhBdHRyaWJ1dGUoVy52YWwsIChpbnQpKChkb3VibGUpZm9udFNpemVUUG9pbnQgKiAyKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBYRWxlbWVudCBzdHJpa2UgPSBudWxsOworICAgICAgICAgICAgaWYgKHRleHREZWNvcmF0aW9uU3RyaW5nID09ICJsaW5lLXRocm91Z2giIHx8IHNBbmNlc3RvcikKKyAgICAgICAgICAgICAgICBzdHJpa2UgPSBuZXcgWEVsZW1lbnQoVy5zdHJpa2UpOworCisgICAgICAgICAgICBYRWxlbWVudCBib2xkID0gbnVsbDsKKyAgICAgICAgICAgIFhFbGVtZW50IGJvbGRDcyA9IG51bGw7CisgICAgICAgICAgICBpZiAoYkFuY2VzdG9yIHx8IHN0cm9uZ0FuY2VzdG9yIHx8IGZvbnRXZWlnaHRTdHJpbmcgPT0gImJvbGQiIHx8IGZvbnRXZWlnaHRTdHJpbmcgPT0gImJvbGRlciIgfHwgZm9udFdlaWdodFN0cmluZyA9PSAiNjAwIiB8fCBmb250V2VpZ2h0U3RyaW5nID09ICI3MDAiIHx8IGZvbnRXZWlnaHRTdHJpbmcgPT0gIjgwMCIgfHwgZm9udFdlaWdodFN0cmluZyA9PSAiOTAwIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib2xkID0gbmV3IFhFbGVtZW50KFcuYik7CisgICAgICAgICAgICAgICAgYm9sZENzID0gbmV3IFhFbGVtZW50KFcuYkNzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgWEVsZW1lbnQgaXRhbGljID0gbnVsbDsKKyAgICAgICAgICAgIFhFbGVtZW50IGl0YWxpY0NzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChpQW5jZXN0b3IgfHwgZW1BbmNlc3RvciB8fCBmb250U3R5bGVTdHJpbmcgPT0gIml0YWxpYyIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXRhbGljID0gbmV3IFhFbGVtZW50KFcuaSk7CisgICAgICAgICAgICAgICAgaXRhbGljQ3MgPSBuZXcgWEVsZW1lbnQoVy5pQ3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBYRWxlbWVudCB1bmRlcmxpbmUgPSBudWxsOworICAgICAgICAgICAgaWYgKHVBbmNlc3RvciB8fCB0ZXh0RGVjb3JhdGlvblN0cmluZyA9PSAidW5kZXJsaW5lIikKKyAgICAgICAgICAgICAgICB1bmRlcmxpbmUgPSBuZXcgWEVsZW1lbnQoVy51LCBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgInNpbmdsZSIpKTsKKworICAgICAgICAgICAgWEVsZW1lbnQgclN0eWxlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5hKQorICAgICAgICAgICAgICAgIHJTdHlsZSA9IG5ldyBYRWxlbWVudChXLnJTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJIeXBlcmxpbmsiKSk7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHNwYWNpbmcgPSBudWxsOworICAgICAgICAgICAgaWYgKGxldHRlclNwYWNpbmdQcm9wZXJ0eS5Jc05vdE5vcm1hbCkKKyAgICAgICAgICAgICAgICBzcGFjaW5nID0gbmV3IFhFbGVtZW50KFcuc3BhY2luZywKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy52YWwsIChsb25nKShUd2lwKWxldHRlclNwYWNpbmdQcm9wZXJ0eSkpOworCisgICAgICAgICAgICBYRWxlbWVudCBydGwgPSBudWxsOworICAgICAgICAgICAgaWYgKGRpckF0dHJpYnV0ZVN0cmluZyA9PSAicnRsIiB8fCBkaXJlY3Rpb25TdHJpbmcgPT0gInJ0bCIpCisgICAgICAgICAgICAgICAgcnRsID0gbmV3IFhFbGVtZW50KFcucnRsKTsKKworICAgICAgICAgICAgWEVsZW1lbnQgcnVuUHJvcHMgPSBuZXcgWEVsZW1lbnQoVy5yUHIsCisgICAgICAgICAgICAgICAgclN0eWxlLAorICAgICAgICAgICAgICAgIHJGb250cywKKyAgICAgICAgICAgICAgICBib2xkLAorICAgICAgICAgICAgICAgIGJvbGRDcywKKyAgICAgICAgICAgICAgICBpdGFsaWMsCisgICAgICAgICAgICAgICAgaXRhbGljQ3MsCisgICAgICAgICAgICAgICAgc3RyaWtlLAorICAgICAgICAgICAgICAgIGNvbG9yLAorICAgICAgICAgICAgICAgIHNwYWNpbmcsCisgICAgICAgICAgICAgICAgc3osCisgICAgICAgICAgICAgICAgc3pDcywKKyAgICAgICAgICAgICAgICB1bmRlcmxpbmUsCisgICAgICAgICAgICAgICAgc2hkLAorICAgICAgICAgICAgICAgIHN1YlN1cGVyLAorICAgICAgICAgICAgICAgIHJ0bCk7CisKKyAgICAgICAgICAgIGlmIChydW5Qcm9wcy5FbGVtZW50cygpLkFueSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBydW5Qcm9wczsKKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyB0b2RvIGNhbiBtYWtlIHRoaXMgZmFzdGVyCisgICAgICAgIC8vIHRvZG8gdGhpcyBpcyBub3QgcmlnaHQgLSBuZWVkcyB0byBiZSByYXRpb25hbGl6ZWQgZm9yIGFsbCBjaGFyYWN0ZXJzIGluIGFuIGVudGlyZSBwYXJhZ3JhcGguCisgICAgICAgIC8vIGlmIHRoZXJlIGlzIHRleHQgbGlrZSA8cD5hYmMgPGVtPiBkZWYgPC9lbT4gZ2hpPC9wPiB0aGVuIHRoZXJlIG5lZWRzIHRvIGJlIGp1c3Qgb25lIHNwYWNlIGJldHdlZW4gYWJjIGFuZCBkZWYsIGFuZCBiZXR3ZWVuCisgICAgICAgIC8vIGRlZiBhbmQgZ2hpLgorICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0RGlzcGxheVRleHQoWFRleHQgbm9kZSwgYm9vbCBwcmVzZXJ2ZVdoaXRlU3BhY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB0ZXh0VHJhbnNmb3JtID0gbm9kZS5QYXJlbnQuR2V0UHJvcCgidGV4dC10cmFuc2Zvcm0iKS5Ub1N0cmluZygpOworICAgICAgICAgICAgYm9vbCBpc0ZpcnN0ID0gbm9kZS5QYXJlbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLnAgJiYgbm9kZSA9PSBub2RlLlBhcmVudC5GaXJzdE5vZGU7CisgICAgICAgICAgICBib29sIGlzTGFzdCA9IG5vZGUuUGFyZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5wICYmIG5vZGUgPT0gbm9kZS5QYXJlbnQuTGFzdE5vZGU7CisKKyAgICAgICAgICAgIElFbnVtZXJhYmxlPElHcm91cGluZzxib29sLCBjaGFyPj4gZ3JvdXBlZENoYXJhY3RlcnMgPSBudWxsOworICAgICAgICAgICAgaWYgKHByZXNlcnZlV2hpdGVTcGFjZSkKKyAgICAgICAgICAgICAgICBncm91cGVkQ2hhcmFjdGVycyA9IG5vZGUuVmFsdWUuR3JvdXBBZGphY2VudChjID0+IGMgPT0gJ1xyJyB8fCBjID09ICdcbicpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdyb3VwZWRDaGFyYWN0ZXJzID0gbm9kZS5WYWx1ZS5Hcm91cEFkamFjZW50KGMgPT4gYyA9PSAnICcgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1xuJyk7CisKKyAgICAgICAgICAgIHN0cmluZyBuZXdTdHJpbmcgPSBncm91cGVkQ2hhcmFjdGVycy5TZWxlY3QoZyA9PgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChnLktleSA9PSB0cnVlKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiAiOworICAgICAgICAgICAgICAgIHN0cmluZyB4ID0gZy5TZWxlY3QoYyA9PiBjLlRvU3RyaW5nKCkpLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZSgpOworICAgICAgICAgICAgaWYgKCFwcmVzZXJ2ZVdoaXRlU3BhY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGlzRmlyc3QpCisgICAgICAgICAgICAgICAgICAgIG5ld1N0cmluZyA9IG5ld1N0cmluZy5UcmltU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNMYXN0KQorICAgICAgICAgICAgICAgICAgICBuZXdTdHJpbmcgPSBuZXdTdHJpbmcuVHJpbUVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRleHRUcmFuc2Zvcm0gPT0gInVwcGVyY2FzZSIpCisgICAgICAgICAgICAgICAgbmV3U3RyaW5nID0gbmV3U3RyaW5nLlRvVXBwZXIoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRleHRUcmFuc2Zvcm0gPT0gImxvd2VyY2FzZSIpCisgICAgICAgICAgICAgICAgbmV3U3RyaW5nID0gbmV3U3RyaW5nLlRvTG93ZXIoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRleHRUcmFuc2Zvcm0gPT0gImNhcGl0YWxpemUiKQorICAgICAgICAgICAgICAgIG5ld1N0cmluZyA9IG5ld1N0cmluZy5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcigpICsgbmV3U3RyaW5nLlN1YnN0cmluZygxKS5Ub0xvd2VyKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3U3RyaW5nOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgR2V0TnVtYmVyaW5nUHJvcGVydGllcyhYRWxlbWVudCBwYXJhZ3JhcGgsIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOdW1iZXJpbmcgcHJvcGVydGllcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgIE51bWJlcmVkSXRlbUFubm90YXRpb24gbnVtYmVyZWRJdGVtQW5ub3RhdGlvbiA9IG51bGw7CisgICAgICAgICAgICBYRWxlbWVudCBsaXN0RWxlbWVudCA9IHBhcmFncmFwaC5BbmNlc3RvcnMoKS5GaXJzdE9yRGVmYXVsdChhID0+IGEuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLm9sIHx8IGEuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLnVsKTsKKyAgICAgICAgICAgIGlmIChsaXN0RWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG51bWJlcmVkSXRlbUFubm90YXRpb24gPSBsaXN0RWxlbWVudC5Bbm5vdGF0aW9uPE51bWJlcmVkSXRlbUFubm90YXRpb24+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBYRWxlbWVudCBudW1QciA9IG51bGw7CisgICAgICAgICAgICBpZiAocGFyYWdyYXBoLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5saSkKKyAgICAgICAgICAgICAgICBudW1QciA9IG5ldyBYRWxlbWVudChXLm51bVByLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5pbHZsLCBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgbnVtYmVyZWRJdGVtQW5ub3RhdGlvbi5pbHZsKSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLm51bUlkLCBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgbnVtYmVyZWRJdGVtQW5ub3RhdGlvbi5udW1JZCkpKTsKKyAgICAgICAgICAgIHJldHVybiBudW1QcjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEdldEp1c3RpZmljYXRpb24oWEVsZW1lbnQgYmxvY2tMZXZlbEVsZW1lbnQsIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBKdXN0aWZ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiB0ZXh0QWxpZ25Qcm9wZXJ0eSA9IGJsb2NrTGV2ZWxFbGVtZW50LkdldFByb3AoInRleHQtYWxpZ24iKTsKKyAgICAgICAgICAgIHN0cmluZyB0ZXh0QWxpZ247CisgICAgICAgICAgICBpZiAoYmxvY2tMZXZlbEVsZW1lbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLmNhcHRpb24gfHwgYmxvY2tMZXZlbEVsZW1lbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLnRoKQorICAgICAgICAgICAgICAgIHRleHRBbGlnbiA9ICJjZW50ZXIiOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRleHRBbGlnbiA9ICJsZWZ0IjsKKyAgICAgICAgICAgIGlmICh0ZXh0QWxpZ25Qcm9wZXJ0eSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRleHRBbGlnbiA9IHRleHRBbGlnblByb3BlcnR5LlRvU3RyaW5nKCk7CisgICAgICAgICAgICBzdHJpbmcgamMgPSBudWxsOworICAgICAgICAgICAgaWYgKHRleHRBbGlnbiA9PSAiY2VudGVyIikKKyAgICAgICAgICAgICAgICBqYyA9ICJjZW50ZXIiOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0ZXh0QWxpZ24gPT0gInJpZ2h0IikKKyAgICAgICAgICAgICAgICAgICAgamMgPSAicmlnaHQiOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0QWxpZ24gPT0gImp1c3RpZnkiKQorICAgICAgICAgICAgICAgICAgICAgICAgamMgPSAiYm90aCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyaW5nIGRpcmVjdGlvbiA9IEdldERpcmVjdGlvbihibG9ja0xldmVsRWxlbWVudCk7CisgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09ICJydGwiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChqYyA9PSAibGVmdCIpCisgICAgICAgICAgICAgICAgICAgIGpjID0gInJpZ2h0IjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChqYyA9PSAicmlnaHQiKQorICAgICAgICAgICAgICAgICAgICBqYyA9ICJsZWZ0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhFbGVtZW50IGpjRWxlbWVudCA9IG51bGw7CisgICAgICAgICAgICBpZiAoamMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBqY0VsZW1lbnQgPSBuZXcgWEVsZW1lbnQoVy5qYywgbmV3IFhBdHRyaWJ1dGUoVy52YWwsIGpjKSk7CisgICAgICAgICAgICByZXR1cm4gamNFbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBIZWFkaW5nSW5mbworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgWE5hbWUgTmFtZTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgU3R5bGVOYW1lOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIEhlYWRpbmdJbmZvW10gSGVhZGluZ1RhZ01hcCA9IG5ld1tdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IEhlYWRpbmdJbmZvIHsgTmFtZSA9IFhodG1sTm9OYW1lc3BhY2UuaDEsIFN0eWxlTmFtZSA9ICJIZWFkaW5nMSIgfSwKKyAgICAgICAgICAgICAgICBuZXcgSGVhZGluZ0luZm8geyBOYW1lID0gWGh0bWxOb05hbWVzcGFjZS5oMiwgU3R5bGVOYW1lID0gIkhlYWRpbmcyIiB9LAorICAgICAgICAgICAgICAgIG5ldyBIZWFkaW5nSW5mbyB7IE5hbWUgPSBYaHRtbE5vTmFtZXNwYWNlLmgzLCBTdHlsZU5hbWUgPSAiSGVhZGluZzMiIH0sCisgICAgICAgICAgICAgICAgbmV3IEhlYWRpbmdJbmZvIHsgTmFtZSA9IFhodG1sTm9OYW1lc3BhY2UuaDQsIFN0eWxlTmFtZSA9ICJIZWFkaW5nNCIgfSwKKyAgICAgICAgICAgICAgICBuZXcgSGVhZGluZ0luZm8geyBOYW1lID0gWGh0bWxOb05hbWVzcGFjZS5oNSwgU3R5bGVOYW1lID0gIkhlYWRpbmc1IiB9LAorICAgICAgICAgICAgICAgIG5ldyBIZWFkaW5nSW5mbyB7IE5hbWUgPSBYaHRtbE5vTmFtZXNwYWNlLmg2LCBTdHlsZU5hbWUgPSAiSGVhZGluZzYiIH0sCisgICAgICAgICAgICAgICAgbmV3IEhlYWRpbmdJbmZvIHsgTmFtZSA9IFhodG1sTm9OYW1lc3BhY2UuaDcsIFN0eWxlTmFtZSA9ICJIZWFkaW5nNyIgfSwKKyAgICAgICAgICAgICAgICBuZXcgSGVhZGluZ0luZm8geyBOYW1lID0gWGh0bWxOb05hbWVzcGFjZS5oOCwgU3R5bGVOYW1lID0gIkhlYWRpbmc4IiB9LAorICAgICAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0RGlyZWN0aW9uKFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyByZXRWYWx1ZSA9ICJsdHIiOworICAgICAgICAgICAgc3RyaW5nIGRpclN0cmluZyA9IChzdHJpbmcpZWxlbWVudC5BdHRyaWJ1dGUoWGh0bWxOb05hbWVzcGFjZS5kaXIpOworICAgICAgICAgICAgaWYgKGRpclN0cmluZyAhPSBudWxsICYmIGRpclN0cmluZy5Ub0xvd2VyKCkgPT0gInJ0bCIpCisgICAgICAgICAgICAgICAgcmV0VmFsdWUgPSAicnRsIjsKKyAgICAgICAgICAgIENzc0V4cHJlc3Npb24gZGlyZWN0aW9uUHJvcCA9IGVsZW1lbnQuR2V0UHJvcCgiZGlyZWN0aW9uIik7CisgICAgICAgICAgICBpZiAoZGlyZWN0aW9uUHJvcCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBkaXJlY3Rpb25WYWx1ZSA9IGRpcmVjdGlvblByb3AuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uVmFsdWUuVG9Mb3dlcigpID09ICJydGwiKQorICAgICAgICAgICAgICAgICAgICByZXRWYWx1ZSA9ICJydGwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgR2V0VGFibGVQcm9wZXJ0aWVzKFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKworICAgICAgICAgICAgWEVsZW1lbnQgYmlkaVZpc3VhbCA9IG51bGw7CisgICAgICAgICAgICBzdHJpbmcgZGlyZWN0aW9uID0gR2V0RGlyZWN0aW9uKGVsZW1lbnQpOworICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSAicnRsIikKKyAgICAgICAgICAgICAgICBiaWRpVmlzdWFsID0gbmV3IFhFbGVtZW50KFcuYmlkaVZpc3VhbCk7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHRibFByID0gbmV3IFhFbGVtZW50KFcudGJsUHIsCisgICAgICAgICAgICAgICAgYmlkaVZpc3VhbCwKKyAgICAgICAgICAgICAgICBHZXRUYWJsZVdpZHRoKGVsZW1lbnQpLAorICAgICAgICAgICAgICAgIEdldFRhYmxlQ2VsbFNwYWNpbmcoZWxlbWVudCksCisgICAgICAgICAgICAgICAgR2V0QmxvY2tDb250ZW50Qm9yZGVycyhlbGVtZW50LCBXLnRibEJvcmRlcnMsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBHZXRUYWJsZVNoYWRpbmcoZWxlbWVudCksCisgICAgICAgICAgICAgICAgR2V0VGFibGVDZWxsTWFyZ2lucyhlbGVtZW50KSwKKyAgICAgICAgICAgICAgICBHZXRUYWJsZUxvb2soZWxlbWVudCkpOworICAgICAgICAgICAgcmV0dXJuIHRibFByOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgR2V0VGFibGVTaGFkaW5nKFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRvZG8gdGhpcyBpcyBub3QgZG9uZS4KKyAgICAgICAgICAgIC8vIG5lZWRzIHRvIHdvcmsgZm9yIFcudGJsIGFuZCBXLnRjCisgICAgICAgICAgICAvL1hFbGVtZW50IHNoZCA9IG5ldyBYRWxlbWVudChXLnNoZCwKKyAgICAgICAgICAgIC8vICAgIG5ldyBYQXR0cmlidXRlKFcudmFsLCAiY2xlYXIiKSwKKyAgICAgICAgICAgIC8vICAgIG5ldyBYQXR0cmlidXRlKFcuY29sb3IsICJhdXRvIiksCisgICAgICAgICAgICAvLyAgICBuZXcgWEF0dHJpYnV0ZShXLmZpbGwsICJmZmZmZmYiKSk7CisgICAgICAgICAgICAvL3JldHVybiBzaGQ7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEdldFRhYmxlV2lkdGgoWEVsZW1lbnQgZWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiB3aWR0aCA9IGVsZW1lbnQuR2V0UHJvcCgid2lkdGgiKTsKKyAgICAgICAgICAgIGlmICh3aWR0aC5Jc0F1dG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLnRibFcsCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuX3csICIwIiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcudHlwZSwgImF1dG8iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBYRWxlbWVudCB3aWR0aEVsZW1lbnQgPSBuZXcgWEVsZW1lbnQoVy50YmxXLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuX3csIChsb25nKShUd2lwKXdpZHRoKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnR5cGUsICJkeGEiKSk7CisgICAgICAgICAgICByZXR1cm4gd2lkdGhFbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgR2V0Q2VsbFdpZHRoKFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIENzc0V4cHJlc3Npb24gd2lkdGggPSBlbGVtZW50LkdldFByb3AoIndpZHRoIik7CisgICAgICAgICAgICBpZiAod2lkdGguSXNBdXRvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy50Y1csCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuX3csICIwIiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcudHlwZSwgImF1dG8iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBYRWxlbWVudCB3aWR0aEVsZW1lbnQgPSBuZXcgWEVsZW1lbnQoVy50Y1csCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5fdywgKGxvbmcpKFR3aXApd2lkdGgpLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcudHlwZSwgImR4YSIpKTsKKyAgICAgICAgICAgIHJldHVybiB3aWR0aEVsZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRCbG9ja0NvbnRlbnRCb3JkZXJzKFhFbGVtZW50IGVsZW1lbnQsIFhOYW1lIGJvcmRlclhOYW1lLCBib29sIGZvclBhcmFncmFwaCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS50ZCB8fCBlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS50aCB8fCBlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5jYXB0aW9uKSAmJiBmb3JQYXJhZ3JhcGgpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBYRWxlbWVudCBib3JkZXJzID0gbmV3IFhFbGVtZW50KGJvcmRlclhOYW1lLAorICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnRvcCwgR2V0Qm9yZGVyQXR0cmlidXRlcyhlbGVtZW50LCAidG9wIikpLAorICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLmxlZnQsIEdldEJvcmRlckF0dHJpYnV0ZXMoZWxlbWVudCwgImxlZnQiKSksCisgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuYm90dG9tLCBHZXRCb3JkZXJBdHRyaWJ1dGVzKGVsZW1lbnQsICJib3R0b20iKSksCisgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcucmlnaHQsIEdldEJvcmRlckF0dHJpYnV0ZXMoZWxlbWVudCwgInJpZ2h0IikpKTsKKyAgICAgICAgICAgIGlmIChib3JkZXJzLkVsZW1lbnRzKCkuQXR0cmlidXRlcyhXLnZhbCkuV2hlcmUodiA9PiAoc3RyaW5nKXYgPT0gIm5vbmUiKS5Db3VudCgpID09IDQpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gYm9yZGVyczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IEJvcmRlclN0eWxlTWFwID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCkKKyAgICAgICAgeworICAgICAgICAgICAgeyAibm9uZSIsICJub25lIiB9LAorICAgICAgICAgICAgeyAiaGlkZGVuIiwgIm5vbmUiIH0sCisgICAgICAgICAgICB7ICJkb3R0ZWQiLCAiZG90dGVkIiB9LAorICAgICAgICAgICAgeyAiZGFzaGVkIiwgImRhc2hlZCIgfSwKKyAgICAgICAgICAgIHsgInNvbGlkIiwgInNpbmdsZSIgfSwKKyAgICAgICAgICAgIHsgImRvdWJsZSIsICJkb3VibGUiIH0sCisgICAgICAgICAgICB7ICJncm9vdmUiLCAiaW5zZXQiIH0sCisgICAgICAgICAgICB7ICJyaWRnZSIsICJvdXRzZXQiIH0sCisgICAgICAgICAgICB7ICJpbnNldCIsICJpbnNldCIgfSwKKyAgICAgICAgICAgIHsgIm91dHNldCIsICJvdXRzZXQiIH0sCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxYQXR0cmlidXRlPiBHZXRCb3JkZXJBdHRyaWJ1dGVzKFhFbGVtZW50IGVsZW1lbnQsIHN0cmluZyB3aGljaEJvcmRlcikKKyAgICAgICAgeworICAgICAgICAgICAgLy9pZiAod2hpY2hCb3JkZXIgPT0gInJpZ2h0IikKKyAgICAgICAgICAgIC8vICAgIENvbnNvbGUuV3JpdGVMaW5lKDEpOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBzdHlsZVByb3AgPSBlbGVtZW50LkdldFByb3Aoc3RyaW5nLkZvcm1hdCgiYm9yZGVyLXswfS1zdHlsZSIsIHdoaWNoQm9yZGVyKSk7CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGNvbG9yUHJvcCA9IGVsZW1lbnQuR2V0UHJvcChzdHJpbmcuRm9ybWF0KCJib3JkZXItezB9LWNvbG9yIiwgd2hpY2hCb3JkZXIpKTsKKyAgICAgICAgICAgIENzc0V4cHJlc3Npb24gcGFkZGluZ1Byb3AgPSBlbGVtZW50LkdldFByb3Aoc3RyaW5nLkZvcm1hdCgicGFkZGluZy17MH0iLCB3aGljaEJvcmRlcikpOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBtYXJnaW5Qcm9wID0gZWxlbWVudC5HZXRQcm9wKHN0cmluZy5Gb3JtYXQoIm1hcmdpbi17MH0iLCB3aGljaEJvcmRlcikpOworCisgICAgICAgICAgICAvLyBUaGUgc3BhY2UgYXR0cmlidXRlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG1hcmdpbiBwcm9wZXJ0aWVzIG9mIENTUworICAgICAgICAgICAgLy8gdGhlIGluZCBlbGVtZW50IG9mIHRoZSBwYXJlbnQgaXMgbW9yZSBvciBsZXNzIGVxdWl2YWxlbnQgdG8gdGhlIHBhZGRpbmcgcHJvcGVydGllcyBvZiBDU1MsIGV4Y2VwdCB0aGF0IGluZCB0YWtlcyBzcGFjZQorICAgICAgICAgICAgLy8gQVdBWSBmcm9tIHRoZSBzcGFjZSBhdHRyaWJ1dGUsIHRoZXJlZm9yZSBpbmQgbmVlZHMgdG8gYmUgaW5jcmVhc2VkIGJ5IHRoZSBhbW91bnQgb2YgcGFkZGluZy4KKworICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gYm9yZGVyLCBhbmQgeWV0IHRoZXJlIGlzIHBhZGRpbmcsIHRoZW4gbmVlZCB0byBjcmVhdGUgYSB0aGluIGJvcmRlciBzbyB0aGF0IHdvcmQgd2lsbCBkaXNwbGF5IHRoZSBiYWNrZ3JvdW5kCisgICAgICAgICAgICAvLyBjb2xvciBvZiB0aGUgcGFyYWdyYXBoIHByb3Blcmx5IChpbmNsdWRpbmcgcGFkZGluZykuCisKKyAgICAgICAgICAgIFhBdHRyaWJ1dGUgdmFsID0gbnVsbDsKKyAgICAgICAgICAgIFhBdHRyaWJ1dGUgc3ogPSBudWxsOworICAgICAgICAgICAgWEF0dHJpYnV0ZSBzcGFjZSA9IG51bGw7CisgICAgICAgICAgICBYQXR0cmlidXRlIGNvbG9yID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKHN0eWxlUHJvcCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChCb3JkZXJTdHlsZU1hcC5Db250YWluc0tleShzdHlsZVByb3AuVG9TdHJpbmcoKSkpCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IG5ldyBYQXR0cmlidXRlKFcudmFsLCBCb3JkZXJTdHlsZU1hcFtzdHlsZVByb3AuVG9TdHJpbmcoKV0pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJub25lIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRvdWJsZSBib3JkZXJTaXplSW5Ud2lwcyA9IEdldEJvcmRlclNpemUoZWxlbWVudCwgd2hpY2hCb3JkZXIpOworCisgICAgICAgICAgICBkb3VibGUgYm9yZGVyU2l6ZUluT25lRWlnaHRoUG9pbnQgPSBib3JkZXJTaXplSW5Ud2lwcyAvIDIwICogODsKKyAgICAgICAgICAgIHN6ID0gbmV3IFhBdHRyaWJ1dGUoVy5zeiwgKGludClib3JkZXJTaXplSW5PbmVFaWdodGhQb2ludCk7CisKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS50ZCB8fCBlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS50aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcGFjZSA9IG5ldyBYQXR0cmlidXRlKFcuc3BhY2UsICIwIik7CisjaWYgZmFsc2UKKyAgICAgICAgICAgICAgICAvLyAyMDEyLTA1LTE0IHRvZG8gYWx0ZXJuYXRpdmUgYWxnb3JpdGhtIGZvciBtYXJnaW4gZm9yIGNlbGxzCisgICAgICAgICAgICAgICAgaWYgKG1hcmdpblByb3AgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNwYWNlIGlzIHNwZWNpZmllZCBpbiBwb2ludHMsIG5vdCB0d2lwcworICAgICAgICAgICAgICAgICAgICBUUG9pbnQgcG9pbnRzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmdpblByb3AuSXNOb3RBdXRvKQorICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzID0gKFRQb2ludCltYXJnaW5Qcm9wOworICAgICAgICAgICAgICAgICAgICBzcGFjZSA9IG5ldyBYQXR0cmlidXRlKFcuc3BhY2UsIE1hdGguTWluKDMxLCAoZG91YmxlKXBvaW50cykpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwYWNlID0gbmV3IFhBdHRyaWJ1dGUoVy5zcGFjZSwgIjAiKTsKKyAgICAgICAgICAgICAgICBpZiAocGFkZGluZ1Byb3AgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNwYWNlIGlzIHNwZWNpZmllZCBpbiBwb2ludHMsIG5vdCB0d2lwcworICAgICAgICAgICAgICAgICAgICBUUG9pbnQgcG9pbnRzID0gKFRQb2ludClwYWRkaW5nUHJvcDsKKyAgICAgICAgICAgICAgICAgICAgc3BhY2UgPSBuZXcgWEF0dHJpYnV0ZShXLnNwYWNlLCAoaW50KShNYXRoLk1pbigzMSwgKGRvdWJsZSlwb2ludHMpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29sb3JQcm9wICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29sb3IgPSBuZXcgWEF0dHJpYnV0ZShXLmNvbG9yLCBjb2xvclByb3AuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAvLyBubyBkZWZhdWx0IHlldAorCisgICAgICAgICAgICBpZiAoKHN0cmluZyl2YWwgPT0gIm5vbmUiICYmIChkb3VibGUpc3BhY2UgIT0gMGQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLlZhbHVlID0gInNpbmdsZSI7CisgICAgICAgICAgICAgICAgc3ouVmFsdWUgPSAiMCI7CisgICAgICAgICAgICAgICAgLy9jb2xvci5WYWx1ZSA9ICJGRjAwMDAiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzeiBpcyBpbiAxLzggb2YgYSBwb2ludAorICAgICAgICAgICAgLy8gc3BhY2UgaXMgaW4gMS8yMCBvZiBhIHBvaW50CisKKyAgICAgICAgICAgIExpc3Q8WEF0dHJpYnV0ZT4gYXR0TGlzdCA9IG5ldyBMaXN0PFhBdHRyaWJ1dGU+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwsCisgICAgICAgICAgICAgICAgc3osCisgICAgICAgICAgICAgICAgc3BhY2UsCisgICAgICAgICAgICAgICAgY29sb3IsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgcmV0dXJuIGF0dExpc3Q7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUd2lwIEdldEJvcmRlclNpemUoWEVsZW1lbnQgZWxlbWVudCwgc3RyaW5nIHdoaWNoQm9yZGVyKQorICAgICAgICB7CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIHdpZHRoUHJvcCA9IGVsZW1lbnQuR2V0UHJvcChzdHJpbmcuRm9ybWF0KCJib3JkZXItezB9LXdpZHRoIiwgd2hpY2hCb3JkZXIpKTsKKworICAgICAgICAgICAgaWYgKHdpZHRoUHJvcCAhPSBudWxsICYmIHdpZHRoUHJvcC5UZXJtcy5Db3VudCgpID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3NzVGVybSB0ZXJtID0gd2lkdGhQcm9wLlRlcm1zLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgVHdpcCB0d2lwcyA9IChUd2lwKXdpZHRoUHJvcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHdpcHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRUYWJsZUxvb2soWEVsZW1lbnQgZWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgdGJsTG9vayA9IFhFbGVtZW50LlBhcnNlKAorICAgICAgICAgICAgICAgIC8vQCI8dzp0YmxMb29rIHc6dmFsPScwNjAwJworICAgICAgICAgICAgICAgIC8vICB3OmZpcnN0Um93PScwJworICAgICAgICAgICAgICAgIC8vICB3Omxhc3RSb3c9JzAnCisgICAgICAgICAgICAgICAgLy8gIHc6Zmlyc3RDb2x1bW49JzAnCisgICAgICAgICAgICAgICAgLy8gIHc6bGFzdENvbHVtbj0nMCcKKyAgICAgICAgICAgICAgICAvLyAgdzpub0hCYW5kPScxJworICAgICAgICAgICAgICAgIC8vICB3Om5vVkJhbmQ9JzEnCisgICAgICAgICAgICAgICAgLy8gIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbicvPiIKKworQCI8dzp0YmxMb29rIHc6dmFsPScwNjAwJyB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nLz4iCisKKyk7CisgICAgICAgICAgICB0YmxMb29rLkF0dHJpYnV0ZXMoKS5XaGVyZShhID0+IGEuSXNOYW1lc3BhY2VEZWNsYXJhdGlvbikuUmVtb3ZlKCk7CisgICAgICAgICAgICByZXR1cm4gdGJsTG9vazsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEdldFRhYmxlR3JpZChYRWxlbWVudCBlbGVtZW50LCBIdG1sVG9XbWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgVHdpcD8gcGFnZVdpZHRoSW5Ud2lwcyA9IChpbnQ/KXNldHRpbmdzLlNlY3RQci5FbGVtZW50cyhXLnBnU3opLkF0dHJpYnV0ZXMoVy5fdykuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIFR3aXA/IG1hcmdpbkxlZnQgPSAoaW50PylzZXR0aW5ncy5TZWN0UHIuRWxlbWVudHMoVy5wZ01hcikuQXR0cmlidXRlcyhXLmxlZnQpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBUd2lwPyBtYXJnaW5SaWdodCA9IChpbnQ/KXNldHRpbmdzLlNlY3RQci5FbGVtZW50cyhXLnBnTWFyKS5BdHRyaWJ1dGVzKFcucmlnaHQpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBUd2lwIHByaW50YWJsZSA9IChsb25nKXBhZ2VXaWR0aEluVHdpcHMgLSAobG9uZyltYXJnaW5MZWZ0IC0gKGxvbmcpbWFyZ2luUmlnaHQ7CisgICAgICAgICAgICBYRWxlbWVudFtdW10gdGFibGVBcnJheSA9IEdldFRhYmxlQXJyYXkoZWxlbWVudCk7CisgICAgICAgICAgICBpbnQgbnVtYmVyQ29sdW1ucyA9IHRhYmxlQXJyYXlbMF0uTGVuZ3RoOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbltdIGNvbHVtbldpZHRocyA9IG5ldyBDc3NFeHByZXNzaW9uW251bWJlckNvbHVtbnNdOworICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBudW1iZXJDb2x1bW5zOyBjKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBjb2x1bW5XaWR0aCA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiYXV0byIgfSB9IH07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCB0YWJsZUFycmF5Lkxlbmd0aDsgKytyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlQXJyYXlbcl1bY10gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgY2VsbCA9IHRhYmxlQXJyYXlbcl1bY107CisgICAgICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIHdpZHRoID0gY2VsbC5HZXRQcm9wKCJ3aWR0aCIpOworICAgICAgICAgICAgICAgICAgICAgICAgWEF0dHJpYnV0ZSBjb2xTcGFuID0gY2VsbC5BdHRyaWJ1dGUoWGh0bWxOb05hbWVzcGFjZS5jb2xzcGFuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xTcGFuID09IG51bGwgJiYgY29sdW1uV2lkdGguVG9TdHJpbmcoKSA9PSAiYXV0byIgJiYgd2lkdGguVG9TdHJpbmcoKSAhPSAiYXV0byIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uV2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb2x1bW5XaWR0aHNbY10gPSBjb2x1bW5XaWR0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgWEVsZW1lbnQgdGJsR3JpZCA9IG5ldyBYRWxlbWVudChXLnRibEdyaWQsCisgICAgICAgICAgICAgICAgY29sdW1uV2lkdGhzLlNlbGVjdChjdyA9PiBuZXcgWEVsZW1lbnQoVy5ncmlkQ29sLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLl93LCAobG9uZylHZXRUd2lwV2lkdGgoY3csIChpbnQpcHJpbnRhYmxlKSkpKSk7CisgICAgICAgICAgICByZXR1cm4gdGJsR3JpZDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFR3aXAgR2V0VHdpcFdpZHRoKENzc0V4cHJlc3Npb24gY29sdW1uV2lkdGgsIGludCBwcmludGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFR3aXAgZGVmYXVsdFR3aXBXaWR0aCA9IDE0NDA7CisgICAgICAgICAgICBpZiAoY29sdW1uV2lkdGguVGVybXMuQ291bnQoKSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENzc1Rlcm0gdGVybSA9IGNvbHVtbldpZHRoLlRlcm1zLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgaWYgKHRlcm0uVW5pdCA9PSBDc3NVbml0LlBUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRG91YmxlIHB0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChEb3VibGUuVHJ5UGFyc2UodGVybS5WYWx1ZSwgb3V0IHB0VmFsdWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUd2lwIHR3aXBzID0gKGxvbmcpKHB0VmFsdWUgKiAyMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHdpcHM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRUd2lwV2lkdGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRUd2lwV2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudFtdW10gR2V0VGFibGVBcnJheShYRWxlbWVudCB0YWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxYRWxlbWVudD4gcm93TGlzdCA9IHRhYmxlLkRlc2NlbmRhbnRzVHJpbW1lZChYaHRtbE5vTmFtZXNwYWNlLnRhYmxlKS5XaGVyZShlID0+IGUuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLnRyKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIGludCBudW1iZXJDb2x1bW5zID0gcm93TGlzdC5TZWxlY3QociA9PiByLkVsZW1lbnRzKCkuV2hlcmUoZSA9PiBlLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS50ZCB8fCBlLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS50aCkuQ291bnQoKSkuTWF4KCk7CisgICAgICAgICAgICBYRWxlbWVudFtdW10gdGFibGVBcnJheSA9IG5ldyBYRWxlbWVudFtyb3dMaXN0LkNvdW50KCldW107CisgICAgICAgICAgICBpbnQgcm93TnVtYmVyID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciByb3cgaW4gcm93TGlzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YWJsZUFycmF5W3Jvd051bWJlcl0gPSBuZXcgWEVsZW1lbnRbbnVtYmVyQ29sdW1uc107CisgICAgICAgICAgICAgICAgaW50IGNvbHVtbk51bWJlciA9IDA7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gcm93LkVsZW1lbnRzKFhodG1sTm9OYW1lc3BhY2UudGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGVBcnJheVtyb3dOdW1iZXJdW2NvbHVtbk51bWJlcl0gPSBjZWxsOworICAgICAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcm93TnVtYmVyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGFibGVBcnJheTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEdldENlbGxQcm9wZXJ0aWVzRm9yQ2FwdGlvbihYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBncmlkU3BhbiA9IG5ldyBYRWxlbWVudChXLmdyaWRTcGFuLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgMykpOworCisgICAgICAgICAgICBYRWxlbWVudCB0Y0JvcmRlcnMgPSBHZXRCbG9ja0NvbnRlbnRCb3JkZXJzKGVsZW1lbnQsIFcudGNCb3JkZXJzLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAodGNCb3JkZXJzID09IG51bGwpCisgICAgICAgICAgICAgICAgdGNCb3JkZXJzID0gbmV3IFhFbGVtZW50KFcudGNCb3JkZXJzLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50b3AsIG5ldyBYQXR0cmlidXRlKFcudmFsLCAibmlsIikpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5sZWZ0LCBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgIm5pbCIpKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuYm90dG9tLCBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgIm5pbCIpKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcucmlnaHQsIG5ldyBYQXR0cmlidXRlKFcudmFsLCAibmlsIikpKTsKKworICAgICAgICAgICAgWEVsZW1lbnQgc2hkID0gR2V0Q2VsbFNoYWRpbmcoZWxlbWVudCk7CisKKyAgICAgICAgICAgIC8vWEVsZW1lbnQgaGlkZU1hcmsgPSBuZXcgWEVsZW1lbnQoVy5oaWRlTWFyayk7CisgICAgICAgICAgICBYRWxlbWVudCBoaWRlTWFyayA9IG51bGw7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHRjTWFyID0gR2V0Q2VsbE1hcmdpbnMoZWxlbWVudCk7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHZBbGlnbiA9IG5ldyBYRWxlbWVudChXLnZBbGlnbiwgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJjZW50ZXIiKSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy50Y1ByLAorICAgICAgICAgICAgICAgIGdyaWRTcGFuLAorICAgICAgICAgICAgICAgIHRjQm9yZGVycywKKyAgICAgICAgICAgICAgICBzaGQsCisgICAgICAgICAgICAgICAgdGNNYXIsCisgICAgICAgICAgICAgICAgdkFsaWduLAorICAgICAgICAgICAgICAgIGhpZGVNYXJrKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEdldENlbGxQcm9wZXJ0aWVzKFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludD8gY29sc3BhbiA9IChpbnQ/KWVsZW1lbnQuQXR0cmlidXRlKFhodG1sTm9OYW1lc3BhY2UuY29sc3Bhbik7CisgICAgICAgICAgICBYRWxlbWVudCBncmlkU3BhbiA9IG51bGw7CisgICAgICAgICAgICBpZiAoY29sc3BhbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIGdyaWRTcGFuID0gbmV3IFhFbGVtZW50KFcuZ3JpZFNwYW4sCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcudmFsLCBjb2xzcGFuKSk7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHRibFcgPSBHZXRDZWxsV2lkdGgoZWxlbWVudCk7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHRjQm9yZGVycyA9IEdldEJsb2NrQ29udGVudEJvcmRlcnMoZWxlbWVudCwgVy50Y0JvcmRlcnMsIGZhbHNlKTsKKworICAgICAgICAgICAgWEVsZW1lbnQgc2hkID0gR2V0Q2VsbFNoYWRpbmcoZWxlbWVudCk7CisKKyAgICAgICAgICAgIC8vWEVsZW1lbnQgaGlkZU1hcmsgPSBuZXcgWEVsZW1lbnQoVy5oaWRlTWFyayk7CisgICAgICAgICAgICBYRWxlbWVudCBoaWRlTWFyayA9IG51bGw7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHRjTWFyID0gR2V0Q2VsbE1hcmdpbnMoZWxlbWVudCk7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHZBbGlnbiA9IG5ldyBYRWxlbWVudChXLnZBbGlnbiwgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJjZW50ZXIiKSk7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHZNZXJnZSA9IG51bGw7CisgICAgICAgICAgICBpZiAoZWxlbWVudC5BdHRyaWJ1dGUoIkh0bWxUb1dtbFZNZXJnZU5vUmVzdGFydCIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgdk1lcmdlID0gbmV3IFhFbGVtZW50KFcudk1lcmdlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5BdHRyaWJ1dGUoIkh0bWxUb1dtbFZNZXJnZVJlc3RhcnQiKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB2TWVyZ2UgPSBuZXcgWEVsZW1lbnQoVy52TWVyZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgInJlc3RhcnQiKSk7CisKKyAgICAgICAgICAgIHN0cmluZyB2QWxpZ25WYWx1ZSA9IChzdHJpbmcpZWxlbWVudC5BdHRyaWJ1dGUoWGh0bWxOb05hbWVzcGFjZS52YWxpZ24pOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiB2ZXJ0aWNhbEFsaWdubWVudFByb3AgPSBlbGVtZW50LkdldFByb3AoInZlcnRpY2FsLWFsaWduIik7CisgICAgICAgICAgICBpZiAodmVydGljYWxBbGlnbm1lbnRQcm9wICE9IG51bGwgJiYgdmVydGljYWxBbGlnbm1lbnRQcm9wLlRvU3RyaW5nKCkgIT0gImluaGVyaXQiKQorICAgICAgICAgICAgICAgIHZBbGlnblZhbHVlID0gdmVydGljYWxBbGlnbm1lbnRQcm9wLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAodkFsaWduVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodkFsaWduVmFsdWUgPT0gIm1pZGRsZSIgfHwgKHZBbGlnblZhbHVlICE9ICJ0b3AiICYmIHZBbGlnblZhbHVlICE9ICJib3R0b20iKSkKKyAgICAgICAgICAgICAgICAgICAgdkFsaWduVmFsdWUgPSAiY2VudGVyIjsKKyAgICAgICAgICAgICAgICB2QWxpZ24gPSBuZXcgWEVsZW1lbnQoVy52QWxpZ24sIG5ldyBYQXR0cmlidXRlKFcudmFsLCB2QWxpZ25WYWx1ZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcudGNQciwKKyAgICAgICAgICAgICAgICB0YmxXLAorICAgICAgICAgICAgICAgIGdyaWRTcGFuLAorICAgICAgICAgICAgICAgIHZNZXJnZSwKKyAgICAgICAgICAgICAgICB0Y0JvcmRlcnMsCisgICAgICAgICAgICAgICAgc2hkLAorICAgICAgICAgICAgICAgIHRjTWFyLAorICAgICAgICAgICAgICAgIHZBbGlnbiwKKyAgICAgICAgICAgICAgICBoaWRlTWFyayk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRDZWxsSGVhZGVyUHJvcGVydGllcyhYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICAvL2ludD8gY29sc3BhbiA9IChpbnQ/KWVsZW1lbnQuQXR0cmlidXRlKFhodG1sLmNvbHNwYW4pOworICAgICAgICAgICAgLy9YRWxlbWVudCBncmlkU3BhbiA9IG51bGw7CisgICAgICAgICAgICAvL2lmIChjb2xzcGFuICE9IG51bGwpCisgICAgICAgICAgICAvLyAgICBncmlkU3BhbiA9IG5ldyBYRWxlbWVudChXLmdyaWRTcGFuLAorICAgICAgICAgICAgLy8gICAgICAgIG5ldyBYQXR0cmlidXRlKFcudmFsLCBjb2xzcGFuKSk7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHRibFcgPSBHZXRDZWxsV2lkdGgoZWxlbWVudCk7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHRjQm9yZGVycyA9IEdldEJsb2NrQ29udGVudEJvcmRlcnMoZWxlbWVudCwgVy50Y0JvcmRlcnMsIGZhbHNlKTsKKworICAgICAgICAgICAgWEVsZW1lbnQgc2hkID0gR2V0Q2VsbFNoYWRpbmcoZWxlbWVudCk7CisKKyAgICAgICAgICAgIC8vWEVsZW1lbnQgaGlkZU1hcmsgPSBuZXcgWEVsZW1lbnQoVy5oaWRlTWFyayk7CisgICAgICAgICAgICBYRWxlbWVudCBoaWRlTWFyayA9IG51bGw7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHRjTWFyID0gR2V0Q2VsbE1hcmdpbnMoZWxlbWVudCk7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHZBbGlnbiA9IG5ldyBYRWxlbWVudChXLnZBbGlnbiwgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJjZW50ZXIiKSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy50Y1ByLAorICAgICAgICAgICAgICAgIHRibFcsCisgICAgICAgICAgICAgICAgdGNCb3JkZXJzLAorICAgICAgICAgICAgICAgIHNoZCwKKyAgICAgICAgICAgICAgICB0Y01hciwKKyAgICAgICAgICAgICAgICB2QWxpZ24sCisgICAgICAgICAgICAgICAgaGlkZU1hcmspOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgR2V0Q2VsbFNoYWRpbmcoWEVsZW1lbnQgZWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBiYWNrZ3JvdW5kQ29sb3JQcm9wID0gZWxlbWVudC5HZXRQcm9wKCJiYWNrZ3JvdW5kLWNvbG9yIik7CisgICAgICAgICAgICBpZiAoYmFja2dyb3VuZENvbG9yUHJvcCAhPSBudWxsICYmIChzdHJpbmcpYmFja2dyb3VuZENvbG9yUHJvcCAhPSAidHJhbnNwYXJlbnQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IHNoZCA9IG5ldyBYRWxlbWVudChXLnNoZCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJjbGVhciIpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmNvbG9yLCAiYXV0byIpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmZpbGwsIGJhY2tncm91bmRDb2xvclByb3ApKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2hkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRDZWxsTWFyZ2lucyhYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIHRvcFByb3AgPSBlbGVtZW50LkdldFByb3AoInBhZGRpbmctdG9wIik7CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGxlZnRQcm9wID0gZWxlbWVudC5HZXRQcm9wKCJwYWRkaW5nLWxlZnQiKTsKKyAgICAgICAgICAgIENzc0V4cHJlc3Npb24gYm90dG9tUHJvcCA9IGVsZW1lbnQuR2V0UHJvcCgicGFkZGluZy1ib3R0b20iKTsKKyAgICAgICAgICAgIENzc0V4cHJlc3Npb24gcmlnaHRQcm9wID0gZWxlbWVudC5HZXRQcm9wKCJwYWRkaW5nLXJpZ2h0Iik7CisgICAgICAgICAgICBpZiAoKGxvbmcpdG9wUHJvcCA9PSAwICYmCisgICAgICAgICAgICAgICAgKGxvbmcpbGVmdFByb3AgPT0gMCAmJgorICAgICAgICAgICAgICAgIChsb25nKWJvdHRvbVByb3AgPT0gMCAmJgorICAgICAgICAgICAgICAgIChsb25nKXJpZ2h0UHJvcCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgWEVsZW1lbnQgdG9wID0gbnVsbDsKKyAgICAgICAgICAgIGlmICh0b3BQcm9wICE9IG51bGwpCisgICAgICAgICAgICAgICAgdG9wID0gbmV3IFhFbGVtZW50KFcudG9wLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLl93LCAobG9uZykoVHdpcCl0b3BQcm9wKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy50eXBlLCAiZHhhIikpOworICAgICAgICAgICAgWEVsZW1lbnQgbGVmdCA9IG51bGw7CisgICAgICAgICAgICBpZiAobGVmdFByb3AgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbmV3IFhFbGVtZW50KFcubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5fdywgKGxvbmcpKFR3aXApbGVmdFByb3ApLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnR5cGUsICJkeGEiKSk7CisgICAgICAgICAgICBYRWxlbWVudCBib3R0b20gPSBudWxsOworICAgICAgICAgICAgaWYgKGJvdHRvbVByb3AgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBib3R0b20gPSBuZXcgWEVsZW1lbnQoVy5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuX3csIChsb25nKShUd2lwKWJvdHRvbVByb3ApLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnR5cGUsICJkeGEiKSk7CisgICAgICAgICAgICBYRWxlbWVudCByaWdodCA9IG51bGw7CisgICAgICAgICAgICBpZiAocmlnaHRQcm9wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmlnaHQgPSBuZXcgWEVsZW1lbnQoVy5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5fdywgKGxvbmcpKFR3aXApcmlnaHRQcm9wKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy50eXBlLCAiZHhhIikpOworICAgICAgICAgICAgWEVsZW1lbnQgdGNNYXIgPSBuZXcgWEVsZW1lbnQoVy50Y01hciwKKyAgICAgICAgICAgICAgICB0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQpOworICAgICAgICAgICAgaWYgKHRjTWFyLkVsZW1lbnRzKCkuQW55KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRjTWFyOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworI2lmIGZhbHNlCisgICAgICAgICAgICA8dzp0Y01hcj4KKyAgICAgICAgICAgICAgPHc6dG9wIHc6dz0iNzIwIgorICAgICAgICAgICAgICAgICAgICAgdzp0eXBlPSJkeGEiIC8+CisgICAgICAgICAgICAgIDx3OmxlZnQgdzp3PSI3MjAiCisgICAgICAgICAgICAgICAgICAgICAgdzp0eXBlPSJkeGEiIC8+CisgICAgICAgICAgICAgIDx3OmJvdHRvbSB3Onc9IjcyMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIHc6dHlwZT0iZHhhIiAvPgorICAgICAgICAgICAgICA8dzpyaWdodCB3Onc9IjcyMCIKKyAgICAgICAgICAgICAgICAgICAgICAgdzp0eXBlPSJkeGEiIC8+CisgICAgICAgICAgICA8L3c6dGNNYXI+CisjZW5kaWYKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRUYWJsZUNlbGxTcGFjaW5nKFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IHRhYmxlID0gZWxlbWVudC5BbmNlc3RvcnNBbmRTZWxmKFhodG1sTm9OYW1lc3BhY2UudGFibGUpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBYRWxlbWVudCB0YmxDZWxsU3BhY2luZyA9IG51bGw7CisgICAgICAgICAgICBpZiAodGFibGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGJvcmRlckNvbGxhcHNlID0gdGFibGUuR2V0UHJvcCgiYm9yZGVyLWNvbGxhcHNlIik7CisgICAgICAgICAgICAgICAgaWYgKGJvcmRlckNvbGxhcHNlID09IG51bGwgfHwgKHN0cmluZylib3JkZXJDb2xsYXBzZSAhPSAiY29sbGFwc2UiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdG9kbyB2ZXJ5IGluY29tcGxldGUKKyAgICAgICAgICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBib3JkZXJTcGFjaW5nID0gdGFibGUuR2V0UHJvcCgiYm9yZGVyLXNwYWNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBtYXJnaW5Ub3BQcm9wZXJ0eSA9IGVsZW1lbnQuR2V0UHJvcCgibWFyZ2luLXRvcCIpOworICAgICAgICAgICAgICAgICAgICBpZiAobWFyZ2luVG9wUHJvcGVydHkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcFByb3BlcnR5ID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICIwIiwgVHlwZSA9IENzc1Rlcm1UeXBlLk51bWJlciwgVW5pdCA9IENzc1VuaXQuUFQgfSB9IH07CisgICAgICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gbWFyZ2luQm90dG9tUHJvcGVydHkgPSBlbGVtZW50LkdldFByb3AoIm1hcmdpbi1ib3R0b20iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmdpbkJvdHRvbVByb3BlcnR5ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Cb3R0b21Qcm9wZXJ0eSA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiMCIsIFR5cGUgPSBDc3NUZXJtVHlwZS5OdW1iZXIsIFVuaXQgPSBDc3NVbml0LlBUIH0gfSB9OworICAgICAgICAgICAgICAgICAgICBUd2lwIHR3aXBzMSA9IChUd2lwKW1hcmdpblRvcFByb3BlcnR5OworICAgICAgICAgICAgICAgICAgICBUd2lwIHR3aXBzMiA9IChUd2lwKW1hcmdpbkJvdHRvbVByb3BlcnR5OworICAgICAgICAgICAgICAgICAgICBUd2lwIG1pblR3aXBzID0gMTU7CisgICAgICAgICAgICAgICAgICAgIGlmIChib3JkZXJTcGFjaW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBtaW5Ud2lwcyA9IChUd2lwKWJvcmRlclNwYWNpbmc7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgdHdpcFRvVXNlID0gTWF0aC5NYXgoKGxvbmcpdHdpcHMxLCAobG9uZyl0d2lwczIpOworICAgICAgICAgICAgICAgICAgICB0d2lwVG9Vc2UgPSBNYXRoLk1heCh0d2lwVG9Vc2UsIChsb25nKW1pblR3aXBzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0byBkaXZpZGUgdHdpcFRvVXNlIGJ5IDIgYmVjYXVzZSBib3JkZXItc3BhY2luZyBzcGVjaWZpZXMgdGhlIHNwYWNlIGJldHdlZW4gdGhlIGJvcmRlciBvZiBvbmNlIGNlbGwgYW5kIGl0cyBhZGphY2VudC4KKyAgICAgICAgICAgICAgICAgICAgLy8gdGJsQ2VsbFNwYWNpbmcgc3BlY2lmaWVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3JkZXIgYW5kIHRoZSBoYWxmIHdheSBwb2ludCBiZXR3ZWVuIHR3byBjZWxscy4KKyAgICAgICAgICAgICAgICAgICAgbG9uZyB0d2lwVG9Vc2VPdmVyVHdvID0gKGxvbmcpdHdpcFRvVXNlIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgdGJsQ2VsbFNwYWNpbmcgPSBuZXcgWEVsZW1lbnQoVy50YmxDZWxsU3BhY2luZywgbmV3IFhBdHRyaWJ1dGUoVy5fdywgdHdpcFRvVXNlT3ZlclR3byksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnR5cGUsICJkeGEiKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGJsQ2VsbFNwYWNpbmc7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRUYWJsZUNlbGxNYXJnaW5zKFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRvZG8gdmVyeSBpbmNvbXBsZXRlCisgICAgICAgICAgICBYRWxlbWVudCB0YmxDZWxsTWFyID0gWEVsZW1lbnQuUGFyc2UoCitAIjx3OnRibENlbGxNYXIgeG1sbnM6dz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluJz4KKyAgPHc6dG9wIHc6dz0nMTUnCisgICAgICAgICAgdzp0eXBlPSdkeGEnLz4KKyAgPHc6bGVmdCB3Onc9JzE1JworICAgICAgICAgIHc6dHlwZT0nZHhhJy8+CisgIDx3OmJvdHRvbSB3Onc9JzE1JworICAgICAgICAgICAgdzp0eXBlPSdkeGEnLz4KKyAgPHc6cmlnaHQgdzp3PScxNScKKyAgICAgICAgICAgIHc6dHlwZT0nZHhhJy8+Cis8L3c6dGJsQ2VsbE1hcj4iKTsKKyAgICAgICAgICAgIHRibENlbGxNYXIuQXR0cmlidXRlcygpLldoZXJlKGEgPT4gYS5Jc05hbWVzcGFjZURlY2xhcmF0aW9uKS5SZW1vdmUoKTsKKyAgICAgICAgICAgIHJldHVybiB0YmxDZWxsTWFyOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgR2V0VGFibGVSb3dQcm9wZXJ0aWVzKFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IHRyUHIgPSBudWxsOworICAgICAgICAgICAgWEVsZW1lbnQgdGFibGUgPSBlbGVtZW50LkFuY2VzdG9yc0FuZFNlbGYoWGh0bWxOb05hbWVzcGFjZS50YWJsZSkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gaGVpZ2h0UHJvcGVydHkgPSBlbGVtZW50LkdldFByb3AoImhlaWdodCIpOworICAgICAgICAgICAgICAgIC8vbG9uZz8gbWF4Q2VsbEhlaWdodCA9IGVsZW1lbnQuRWxlbWVudHMoWGh0bWwudGQpLkFnZ3JlZ2F0ZSgobG9uZz8pbnVsbCwKKyAgICAgICAgICAgICAgICAvLyAgICAoWEVsZW1lbnQgdGQsIGxvbmc/IGxhc3QpID0+CisgICAgICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgICAgIC8vICAgICAgICBFeHByZXNzaW9uIGhlaWdodFByb3AyID0gdGQuR2V0UHJvcCgiaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgLy8gICAgICAgIGlmIChoZWlnaHRQcm9wMiA9PSBudWxsKQorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIGxhc3Q7CisgICAgICAgICAgICAgICAgLy8gICAgICAgIGlmIChsYXN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICByZXR1cm4gKGxvbmcpKFR3aXApaGVpZ2h0UHJvcDI7CisgICAgICAgICAgICAgICAgLy8gICAgICAgIHJldHVybiBsYXN0ICsgKGxvbmc/KShsb25nKShUd2lwKWhlaWdodFByb3AyOworICAgICAgICAgICAgICAgIC8vICAgIH0pOworICAgICAgICAgICAgICAgIHZhciBjZWxsSGVpZ2h0cyA9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFhodG1sTm9OYW1lc3BhY2UudGQpCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QodGQgPT4gdGQuR2V0UHJvcCgiaGVpZ2h0IikpCisgICAgICAgICAgICAgICAgICAgIC5Db25jYXQobmV3W10geyBoZWlnaHRQcm9wZXJ0eSB9KQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBkICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZSA9PiAobG9uZykoVHdpcCllKQorICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgdHJIZWlnaHQgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChjZWxsSGVpZ2h0cy5BbnkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgbWF4ID0gY2VsbEhlaWdodHMuTWF4KCk7CisgICAgICAgICAgICAgICAgICAgIHRySGVpZ2h0ID0gbmV3IFhFbGVtZW50KFcudHJIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgbWF4KSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBib3JkZXJDb2xsYXBzZVByb3BlcnR5ID0gdGFibGUuR2V0UHJvcCgiYm9yZGVyLWNvbGxhcHNlIik7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgYm9yZGVyQ29sbGFwc2UgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChib3JkZXJDb2xsYXBzZVByb3BlcnR5ICE9IG51bGwgJiYgKHN0cmluZylib3JkZXJDb2xsYXBzZVByb3BlcnR5ICE9ICJjb2xsYXBzZSIpCisgICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbGxhcHNlID0gR2V0VGFibGVDZWxsU3BhY2luZyhlbGVtZW50KTsKKworICAgICAgICAgICAgICAgIHRyUHIgPSBuZXcgWEVsZW1lbnQoVy50clByLAorICAgICAgICAgICAgICAgICAgICBHZXRUYWJsZUNlbGxTcGFjaW5nKGVsZW1lbnQpLAorICAgICAgICAgICAgICAgICAgICB0ckhlaWdodCk7CisgICAgICAgICAgICAgICAgaWYgKHRyUHIuRWxlbWVudHMoKS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyUHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJQcjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhBdHRyaWJ1dGUgR2V0WG1sU3BhY2VBdHRyaWJ1dGUoc3RyaW5nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmFsdWUuU3RhcnRzV2l0aCgiICIpIHx8IHZhbHVlLkVuZHNXaXRoKCIgIikpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sICsgInNwYWNlIiwgInByZXNlcnZlIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gSW5zdGFsbGVkRm9udHMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7InNlcmlmIiwgIlRpbWVzIE5ldyBSb21hbiJ9LAorICAgICAgICAgICAgICAgIHsic2Fucy1zZXJpZiIsICJBcmlhbCJ9LAorICAgICAgICAgICAgICAgIHsiY3Vyc2l2ZSIsICJLdW5zdGxlciBTY3JpcHQifSwKKyAgICAgICAgICAgICAgICB7ImZhbnRhc3kiLCAiQ3VybHogTVQifSwKKyAgICAgICAgICAgICAgICB7Im1vbm9zcGFjZSIsICJDb3VyaWVyIE5ldyJ9LAorCisgICAgICAgICAgICAgICAgeyJhZ2VuY3kgZmIiLCAiQWdlbmN5IEZCIn0sCisgICAgICAgICAgICAgICAgeyJhZ2VuY3lmYiIsICJBZ2VuY3kgRkIifSwKKyAgICAgICAgICAgICAgICB7ImFoYXJvbmkiLCAiQWhhcm9uaSJ9LAorICAgICAgICAgICAgICAgIHsiYWxnZXJpYW4iLCAiQWxnZXJpYW4ifSwKKyAgICAgICAgICAgICAgICB7ImFuZGFsdXMiLCAiQW5kYWx1cyJ9LAorICAgICAgICAgICAgICAgIHsiYW5nc2FuYSBuZXciLCAiQW5nc2FuYSBOZXcifSwKKyAgICAgICAgICAgICAgICB7ImFuZ3NhbmFuZXciLCAiQW5nc2FuYSBOZXcifSwKKyAgICAgICAgICAgICAgICB7ImFuZ3NhbmF1cGMiLCAiQW5nc2FuYVVQQyJ9LAorICAgICAgICAgICAgICAgIHsiYXBhcmFqaXRhIiwgIkFwYXJhaml0YSJ9LAorICAgICAgICAgICAgICAgIHsiYXJhYmljIHR5cGVzZXR0aW5nIiwgIkFyYWJpYyBUeXBlc2V0dGluZyJ9LAorICAgICAgICAgICAgICAgIHsiYXJhYmljdHlwZXNldHRpbmciLCAiQXJhYmljIFR5cGVzZXR0aW5nIn0sCisgICAgICAgICAgICAgICAgeyJhcmlhbCIsICJBcmlhbCJ9LAorICAgICAgICAgICAgICAgIHsiYXJpYWwgYmxhY2siLCAiQXJpYWwgQmxhY2sifSwKKyAgICAgICAgICAgICAgICB7ImFyaWFsIG5hcnJvdyIsICJBcmlhbCBOYXJyb3cifSwKKyAgICAgICAgICAgICAgICB7ImFyaWFsIHJvdW5kZWQgbXQgYm9sZCIsICJBcmlhbCBSb3VuZGVkIE1UIEJvbGQifSwKKyAgICAgICAgICAgICAgICB7ImFyaWFsIHVuaWNvZGUgbXMiLCAiQXJpYWwgVW5pY29kZSBNUyJ9LAorICAgICAgICAgICAgICAgIHsiYXJpYWxibGFjayIsICJBcmlhbCBCbGFjayJ9LAorICAgICAgICAgICAgICAgIHsiYXJpYWxuYXJyb3ciLCAiQXJpYWwgTmFycm93In0sCisgICAgICAgICAgICAgICAgeyJhcmlhbHJvdW5kZWRtdGJvbGQiLCAiQXJpYWwgUm91bmRlZCBNVCBCb2xkIn0sCisgICAgICAgICAgICAgICAgeyJhcmlhbHVuaWNvZGVtcyIsICJBcmlhbCBVbmljb2RlIE1TIn0sCisgICAgICAgICAgICAgICAgeyJiYXNrZXJ2aWxsZSBvbGQgZmFjZSIsICJCYXNrZXJ2aWxsZSBPbGQgRmFjZSJ9LAorICAgICAgICAgICAgICAgIHsiYmFza2VydmlsbGVvbGRmYWNlIiwgIkJhc2tlcnZpbGxlIE9sZCBGYWNlIn0sCisgICAgICAgICAgICAgICAgeyJiYXRhbmciLCAiQmF0YW5nIn0sCisgICAgICAgICAgICAgICAgeyJiYXRhbmdjaGUiLCAiQmF0YW5nQ2hlIn0sCisgICAgICAgICAgICAgICAgeyJiYXVoYXVzIDkzIiwgIkJhdWhhdXMgOTMifSwKKyAgICAgICAgICAgICAgICB7ImJhdWhhdXM5MyIsICJCYXVoYXVzIDkzIn0sCisgICAgICAgICAgICAgICAgeyJiZWxsIG10IiwgIkJlbGwgTVQifSwKKyAgICAgICAgICAgICAgICB7ImJlbGxtdCIsICJCZWxsIE1UIn0sCisgICAgICAgICAgICAgICAgeyJiZXJsaW4gc2FucyBmYiIsICJCZXJsaW4gU2FucyBGQiJ9LAorICAgICAgICAgICAgICAgIHsiYmVybGluIHNhbnMgZmIgZGVtaSIsICJCZXJsaW4gU2FucyBGQiBEZW1pIn0sCisgICAgICAgICAgICAgICAgeyJiZXJsaW5zYW5zZmIiLCAiQmVybGluIFNhbnMgRkIifSwKKyAgICAgICAgICAgICAgICB7ImJlcmxpbnNhbnNmYmRlbWkiLCAiQmVybGluIFNhbnMgRkIgRGVtaSJ9LAorICAgICAgICAgICAgICAgIHsiYmVybmFyZCBtdCBjb25kZW5zZWQiLCAiQmVybmFyZCBNVCBDb25kZW5zZWQifSwKKyAgICAgICAgICAgICAgICB7ImJlcm5hcmRtdGNvbmRlbnNlZCIsICJCZXJuYXJkIE1UIENvbmRlbnNlZCJ9LAorICAgICAgICAgICAgICAgIHsiYmxhY2thZGRlciBpdGMiLCAiQmxhY2thZGRlciBJVEMifSwKKyAgICAgICAgICAgICAgICB7ImJsYWNrYWRkZXJpdGMiLCAiQmxhY2thZGRlciBJVEMifSwKKyAgICAgICAgICAgICAgICB7ImJvZG9uaSBtdCIsICJCb2RvbmkgTVQifSwKKyAgICAgICAgICAgICAgICB7ImJvZG9uaSBtdCBibGFjayIsICJCb2RvbmkgTVQgQmxhY2sifSwKKyAgICAgICAgICAgICAgICB7ImJvZG9uaSBtdCBjb25kZW5zZWQiLCAiQm9kb25pIE1UIENvbmRlbnNlZCJ9LAorICAgICAgICAgICAgICAgIHsiYm9kb25pIG10IHBvc3RlciBjb21wcmVzc2VkIiwgIkJvZG9uaSBNVCBQb3N0ZXIgQ29tcHJlc3NlZCJ9LAorICAgICAgICAgICAgICAgIHsiYm9kb25pbXQiLCAiQm9kb25pIE1UIn0sCisgICAgICAgICAgICAgICAgeyJib2RvbmltdGJsYWNrIiwgIkJvZG9uaSBNVCBCbGFjayJ9LAorICAgICAgICAgICAgICAgIHsiYm9kb25pbXRjb25kZW5zZWQiLCAiQm9kb25pIE1UIENvbmRlbnNlZCJ9LAorICAgICAgICAgICAgICAgIHsiYm9kb25pbXRwb3N0ZXJjb21wcmVzc2VkIiwgIkJvZG9uaSBNVCBQb3N0ZXIgQ29tcHJlc3NlZCJ9LAorICAgICAgICAgICAgICAgIHsiYm9vayBhbnRpcXVhIiwgIkJvb2sgQW50aXF1YSJ9LAorICAgICAgICAgICAgICAgIHsiYm9va2FudGlxdWEiLCAiQm9vayBBbnRpcXVhIn0sCisgICAgICAgICAgICAgICAgeyJib29rbWFuIG9sZCBzdHlsZSIsICJCb29rbWFuIE9sZCBTdHlsZSJ9LAorICAgICAgICAgICAgICAgIHsiYm9va21hbm9sZHN0eWxlIiwgIkJvb2ttYW4gT2xkIFN0eWxlIn0sCisgICAgICAgICAgICAgICAgeyJib29rc2hlbGYgc3ltYm9sIDciLCAiQm9va3NoZWxmIFN5bWJvbCA3In0sCisgICAgICAgICAgICAgICAgeyJib29rc2hlbGZzeW1ib2w3IiwgIkJvb2tzaGVsZiBTeW1ib2wgNyJ9LAorICAgICAgICAgICAgICAgIHsiYnJhZGxleSBoYW5kIGl0YyIsICJCcmFkbGV5IEhhbmQgSVRDIn0sCisgICAgICAgICAgICAgICAgeyJicmFkbGV5aGFuZGl0YyIsICJCcmFkbGV5IEhhbmQgSVRDIn0sCisgICAgICAgICAgICAgICAgeyJicml0YW5uaWMgYm9sZCIsICJCcml0YW5uaWMgQm9sZCJ9LAorICAgICAgICAgICAgICAgIHsiYnJpdGFubmljYm9sZCIsICJCcml0YW5uaWMgQm9sZCJ9LAorICAgICAgICAgICAgICAgIHsiYnJvYWR3YXkiLCAiQnJvYWR3YXkifSwKKyAgICAgICAgICAgICAgICB7ImJyb3dhbGxpYSBuZXciLCAiQnJvd2FsbGlhIE5ldyJ9LAorICAgICAgICAgICAgICAgIHsiYnJvd2FsbGlhbmV3IiwgIkJyb3dhbGxpYSBOZXcifSwKKyAgICAgICAgICAgICAgICB7ImJyb3dhbGxpYXVwYyIsICJCcm93YWxsaWFVUEMifSwKKyAgICAgICAgICAgICAgICB7ImJydXNoIHNjcmlwdCBtdCIsICJCcnVzaCBTY3JpcHQgTVQifSwKKyAgICAgICAgICAgICAgICB7ImJydXNoc2NyaXB0bXQiLCAiQnJ1c2ggU2NyaXB0IE1UIn0sCisgICAgICAgICAgICAgICAgeyJjYWxpYnJpIiwgIkNhbGlicmkifSwKKyAgICAgICAgICAgICAgICB7ImNhbGlmb3JuaWFuIGZiIiwgIkNhbGlmb3JuaWFuIEZCIn0sCisgICAgICAgICAgICAgICAgeyJjYWxpZm9ybmlhbmZiIiwgIkNhbGlmb3JuaWFuIEZCIn0sCisgICAgICAgICAgICAgICAgeyJjYWxpc3RvIG10IiwgIkNhbGlzdG8gTVQifSwKKyAgICAgICAgICAgICAgICB7ImNhbGlzdG9tdCIsICJDYWxpc3RvIE1UIn0sCisgICAgICAgICAgICAgICAgeyJjYW1icmlhIiwgIkNhbWJyaWEifSwKKyAgICAgICAgICAgICAgICB7ImNhbWJyaWEgbWF0aCIsICJDYW1icmlhIE1hdGgifSwKKyAgICAgICAgICAgICAgICB7ImNhbWJyaWFtYXRoIiwgIkNhbWJyaWEgTWF0aCJ9LAorICAgICAgICAgICAgICAgIHsiY2FuZGFyYSIsICJDYW5kYXJhIn0sCisgICAgICAgICAgICAgICAgeyJjYXN0ZWxsYXIiLCAiQ2FzdGVsbGFyIn0sCisgICAgICAgICAgICAgICAgeyJjZW50YXVyIiwgIkNlbnRhdXIifSwKKyAgICAgICAgICAgICAgICB7ImNlbnR1cnkiLCAiQ2VudHVyeSJ9LAorICAgICAgICAgICAgICAgIHsiY2VudHVyeSBnb3RoaWMiLCAiQ2VudHVyeSBHb3RoaWMifSwKKyAgICAgICAgICAgICAgICB7ImNlbnR1cnkgc2Nob29sYm9vayIsICJDZW50dXJ5IFNjaG9vbGJvb2sifSwKKyAgICAgICAgICAgICAgICB7ImNlbnR1cnlnb3RoaWMiLCAiQ2VudHVyeSBHb3RoaWMifSwKKyAgICAgICAgICAgICAgICB7ImNlbnR1cnlzY2hvb2xib29rIiwgIkNlbnR1cnkgU2Nob29sYm9vayJ9LAorICAgICAgICAgICAgICAgIHsiY2hpbGxlciIsICJDaGlsbGVyIn0sCisgICAgICAgICAgICAgICAgeyJjb2xvbm5hIG10IiwgIkNvbG9ubmEgTVQifSwKKyAgICAgICAgICAgICAgICB7ImNvbG9ubmFtdCIsICJDb2xvbm5hIE1UIn0sCisgICAgICAgICAgICAgICAgeyJjb21pYyBzYW5zIG1zIiwgIkNvbWljIFNhbnMgTVMifSwKKyAgICAgICAgICAgICAgICB7ImNvbWljc2Fuc21zIiwgIkNvbWljIFNhbnMgTVMifSwKKyAgICAgICAgICAgICAgICB7ImNvbnNvbGFzIiwgIkNvbnNvbGFzIn0sCisgICAgICAgICAgICAgICAgeyJjb25zdGFudGlhIiwgIkNvbnN0YW50aWEifSwKKyAgICAgICAgICAgICAgICB7ImNvb3BlciBibGFjayIsICJDb29wZXIgQmxhY2sifSwKKyAgICAgICAgICAgICAgICB7ImNvb3BlcmJsYWNrIiwgIkNvb3BlciBCbGFjayJ9LAorICAgICAgICAgICAgICAgIHsiY29wcGVycGxhdGUgZ290aGljIGJvbGQiLCAiQ29wcGVycGxhdGUgR290aGljIEJvbGQifSwKKyAgICAgICAgICAgICAgICB7ImNvcHBlcnBsYXRlIGdvdGhpYyBsaWdodCIsICJDb3BwZXJwbGF0ZSBHb3RoaWMgTGlnaHQifSwKKyAgICAgICAgICAgICAgICB7ImNvcHBlcnBsYXRlZ290aGljYm9sZCIsICJDb3BwZXJwbGF0ZSBHb3RoaWMgQm9sZCJ9LAorICAgICAgICAgICAgICAgIHsiY29wcGVycGxhdGVnb3RoaWNsaWdodCIsICJDb3BwZXJwbGF0ZSBHb3RoaWMgTGlnaHQifSwKKyAgICAgICAgICAgICAgICB7ImNvcmJlbCIsICJDb3JiZWwifSwKKyAgICAgICAgICAgICAgICB7ImNvcmRpYSBuZXciLCAiQ29yZGlhIE5ldyJ9LAorICAgICAgICAgICAgICAgIHsiY29yZGlhbmV3IiwgIkNvcmRpYSBOZXcifSwKKyAgICAgICAgICAgICAgICB7ImNvcmRpYXVwYyIsICJDb3JkaWFVUEMifSwKKyAgICAgICAgICAgICAgICB7ImNvdXJpZXIgbmV3IiwgIkNvdXJpZXIgTmV3In0sCisgICAgICAgICAgICAgICAgeyJjb3VyaWVybmV3IiwgIkNvdXJpZXIgTmV3In0sCisgICAgICAgICAgICAgICAgeyJjdXJseiBtdCIsICJDdXJseiBNVCJ9LAorICAgICAgICAgICAgICAgIHsiY3VybHptdCIsICJDdXJseiBNVCJ9LAorICAgICAgICAgICAgICAgIHsiZGF1bnBlbmgiLCAiRGF1blBlbmgifSwKKyAgICAgICAgICAgICAgICB7ImRhdmlkIiwgIkRhdmlkIn0sCisgICAgICAgICAgICAgICAgeyJkZmthaS1zYiIsICJERkthaS1TQiJ9LAorICAgICAgICAgICAgICAgIHsiZGlsbGVuaWF1cGMiLCAiRGlsbGVuaWFVUEMifSwKKyAgICAgICAgICAgICAgICB7ImRva2NoYW1wYSIsICJEb2tDaGFtcGEifSwKKyAgICAgICAgICAgICAgICB7ImRvdHVtIiwgIkRvdHVtIn0sCisgICAgICAgICAgICAgICAgeyJkb3R1bWNoZSIsICJEb3R1bUNoZSJ9LAorICAgICAgICAgICAgICAgIHsiZWJyaW1hIiwgIkVicmltYSJ9LAorICAgICAgICAgICAgICAgIHsiZWR3YXJkaWFuIHNjcmlwdCBpdGMiLCAiRWR3YXJkaWFuIFNjcmlwdCBJVEMifSwKKyAgICAgICAgICAgICAgICB7ImVkd2FyZGlhbnNjcmlwdGl0YyIsICJFZHdhcmRpYW4gU2NyaXB0IElUQyJ9LAorICAgICAgICAgICAgICAgIHsiZWxlcGhhbnQiLCAiRWxlcGhhbnQifSwKKyAgICAgICAgICAgICAgICB7ImVuZ3JhdmVycyBtdCIsICJFbmdyYXZlcnMgTVQifSwKKyAgICAgICAgICAgICAgICB7ImVuZ3JhdmVyc210IiwgIkVuZ3JhdmVycyBNVCJ9LAorICAgICAgICAgICAgICAgIHsiZXJhcyBib2xkIGl0YyIsICJFcmFzIEJvbGQgSVRDIn0sCisgICAgICAgICAgICAgICAgeyJlcmFzIGRlbWkgaXRjIiwgIkVyYXMgRGVtaSBJVEMifSwKKyAgICAgICAgICAgICAgICB7ImVyYXMgbGlnaHQgaXRjIiwgIkVyYXMgTGlnaHQgSVRDIn0sCisgICAgICAgICAgICAgICAgeyJlcmFzIG1lZGl1bSBpdGMiLCAiRXJhcyBNZWRpdW0gSVRDIn0sCisgICAgICAgICAgICAgICAgeyJlcmFzYm9sZGl0YyIsICJFcmFzIEJvbGQgSVRDIn0sCisgICAgICAgICAgICAgICAgeyJlcmFzZGVtaWl0YyIsICJFcmFzIERlbWkgSVRDIn0sCisgICAgICAgICAgICAgICAgeyJlcmFzbGlnaHRpdGMiLCAiRXJhcyBMaWdodCBJVEMifSwKKyAgICAgICAgICAgICAgICB7ImVyYXNtZWRpdW1pdGMiLCAiRXJhcyBNZWRpdW0gSVRDIn0sCisgICAgICAgICAgICAgICAgeyJlc3RyYW5nZWxvIGVkZXNzYSIsICJFc3RyYW5nZWxvIEVkZXNzYSJ9LAorICAgICAgICAgICAgICAgIHsiZXN0cmFuZ2Vsb2VkZXNzYSIsICJFc3RyYW5nZWxvIEVkZXNzYSJ9LAorICAgICAgICAgICAgICAgIHsiZXVjcm9zaWF1cGMiLCAiRXVjcm9zaWFVUEMifSwKKyAgICAgICAgICAgICAgICB7ImV1cGhlbWlhIiwgIkV1cGhlbWlhIn0sCisgICAgICAgICAgICAgICAgeyJmYW5nc29uZyIsICJGYW5nU29uZyJ9LAorICAgICAgICAgICAgICAgIHsiZmVsaXggdGl0bGluZyIsICJGZWxpeCBUaXRsaW5nIn0sCisgICAgICAgICAgICAgICAgeyJmZWxpeHRpdGxpbmciLCAiRmVsaXggVGl0bGluZyJ9LAorICAgICAgICAgICAgICAgIHsiZm9vdGxpZ2h0IG10IGxpZ2h0IiwgIkZvb3RsaWdodCBNVCBMaWdodCJ9LAorICAgICAgICAgICAgICAgIHsiZm9vdGxpZ2h0bXRsaWdodCIsICJGb290bGlnaHQgTVQgTGlnaHQifSwKKyAgICAgICAgICAgICAgICB7ImZvcnRlIiwgIkZvcnRlIn0sCisgICAgICAgICAgICAgICAgeyJmcmFua2xpbiBnb3RoaWMgYm9vayIsICJGcmFua2xpbiBHb3RoaWMgQm9vayJ9LAorICAgICAgICAgICAgICAgIHsiZnJhbmtsaW4gZ290aGljIGRlbWkiLCAiRnJhbmtsaW4gR290aGljIERlbWkifSwKKyAgICAgICAgICAgICAgICB7ImZyYW5rbGluIGdvdGhpYyBkZW1pIGNvbmQiLCAiRnJhbmtsaW4gR290aGljIERlbWkgQ29uZCJ9LAorICAgICAgICAgICAgICAgIHsiZnJhbmtsaW4gZ290aGljIGhlYXZ5IiwgIkZyYW5rbGluIEdvdGhpYyBIZWF2eSJ9LAorICAgICAgICAgICAgICAgIHsiZnJhbmtsaW4gZ290aGljIG1lZGl1bSIsICJGcmFua2xpbiBHb3RoaWMgTWVkaXVtIn0sCisgICAgICAgICAgICAgICAgeyJmcmFua2xpbiBnb3RoaWMgbWVkaXVtIGNvbmQiLCAiRnJhbmtsaW4gR290aGljIE1lZGl1bSBDb25kIn0sCisgICAgICAgICAgICAgICAgeyJmcmFua2xpbmdvdGhpY2Jvb2siLCAiRnJhbmtsaW4gR290aGljIEJvb2sifSwKKyAgICAgICAgICAgICAgICB7ImZyYW5rbGluZ290aGljZGVtaSIsICJGcmFua2xpbiBHb3RoaWMgRGVtaSJ9LAorICAgICAgICAgICAgICAgIHsiZnJhbmtsaW5nb3RoaWNkZW1pY29uZCIsICJGcmFua2xpbiBHb3RoaWMgRGVtaSBDb25kIn0sCisgICAgICAgICAgICAgICAgeyJmcmFua2xpbmdvdGhpY2hlYXZ5IiwgIkZyYW5rbGluIEdvdGhpYyBIZWF2eSJ9LAorICAgICAgICAgICAgICAgIHsiZnJhbmtsaW5nb3RoaWNtZWRpdW0iLCAiRnJhbmtsaW4gR290aGljIE1lZGl1bSJ9LAorICAgICAgICAgICAgICAgIHsiZnJhbmtsaW5nb3RoaWNtZWRpdW1jb25kIiwgIkZyYW5rbGluIEdvdGhpYyBNZWRpdW0gQ29uZCJ9LAorICAgICAgICAgICAgICAgIHsiZnJhbmtydWVobCIsICJGcmFua1J1ZWhsIn0sCisgICAgICAgICAgICAgICAgeyJmcmVlc2lhdXBjIiwgIkZyZWVzaWFVUEMifSwKKyAgICAgICAgICAgICAgICB7ImZyZWVzdHlsZSBzY3JpcHQiLCAiRnJlZXN0eWxlIFNjcmlwdCJ9LAorICAgICAgICAgICAgICAgIHsiZnJlZXN0eWxlc2NyaXB0IiwgIkZyZWVzdHlsZSBTY3JpcHQifSwKKyAgICAgICAgICAgICAgICB7ImZyZW5jaCBzY3JpcHQgbXQiLCAiRnJlbmNoIFNjcmlwdCBNVCJ9LAorICAgICAgICAgICAgICAgIHsiZnJlbmNoc2NyaXB0bXQiLCAiRnJlbmNoIFNjcmlwdCBNVCJ9LAorICAgICAgICAgICAgICAgIHsiZ2FicmlvbGEiLCAiR2FicmlvbGEifSwKKyAgICAgICAgICAgICAgICB7ImdhcmFtb25kIiwgIkdhcmFtb25kIn0sCisgICAgICAgICAgICAgICAgeyJnYXV0YW1pIiwgIkdhdXRhbWkifSwKKyAgICAgICAgICAgICAgICB7Imdlb3JnaWEiLCAiR2VvcmdpYSJ9LAorICAgICAgICAgICAgICAgIHsiZ2lnaSIsICJHaWdpIn0sCisgICAgICAgICAgICAgICAgeyJnaWxsIHNhbnMgbXQiLCAiR2lsbCBTYW5zIE1UIn0sCisgICAgICAgICAgICAgICAgeyJnaWxsIHNhbnMgbXQgY29uZGVuc2VkIiwgIkdpbGwgU2FucyBNVCBDb25kZW5zZWQifSwKKyAgICAgICAgICAgICAgICB7ImdpbGwgc2FucyBtdCBleHQgY29uZGVuc2VkIGJvbGQiLCAiR2lsbCBTYW5zIE1UIEV4dCBDb25kZW5zZWQgQm9sZCJ9LAorICAgICAgICAgICAgICAgIHsiZ2lsbCBzYW5zIHVsdHJhIGJvbGQiLCAiR2lsbCBTYW5zIFVsdHJhIEJvbGQifSwKKyAgICAgICAgICAgICAgICB7ImdpbGwgc2FucyB1bHRyYSBib2xkIGNvbmRlbnNlZCIsICJHaWxsIFNhbnMgVWx0cmEgQm9sZCBDb25kZW5zZWQifSwKKyAgICAgICAgICAgICAgICB7ImdpbGxzYW5zbXQiLCAiR2lsbCBTYW5zIE1UIn0sCisgICAgICAgICAgICAgICAgeyJnaWxsc2Fuc210Y29uZGVuc2VkIiwgIkdpbGwgU2FucyBNVCBDb25kZW5zZWQifSwKKyAgICAgICAgICAgICAgICB7ImdpbGxzYW5zbXRleHRjb25kZW5zZWRib2xkIiwgIkdpbGwgU2FucyBNVCBFeHQgQ29uZGVuc2VkIEJvbGQifSwKKyAgICAgICAgICAgICAgICB7ImdpbGxzYW5zdWx0cmFib2xkIiwgIkdpbGwgU2FucyBVbHRyYSBCb2xkIn0sCisgICAgICAgICAgICAgICAgeyJnaWxsc2Fuc3VsdHJhYm9sZGNvbmRlbnNlZCIsICJHaWxsIFNhbnMgVWx0cmEgQm9sZCBDb25kZW5zZWQifSwKKyAgICAgICAgICAgICAgICB7Imdpc2hhIiwgIkdpc2hhIn0sCisgICAgICAgICAgICAgICAgeyJnbG91Y2VzdGVyIG10IGV4dHJhIGNvbmRlbnNlZCIsICJHbG91Y2VzdGVyIE1UIEV4dHJhIENvbmRlbnNlZCJ9LAorICAgICAgICAgICAgICAgIHsiZ2xvdWNlc3Rlcm10ZXh0cmFjb25kZW5zZWQiLCAiR2xvdWNlc3RlciBNVCBFeHRyYSBDb25kZW5zZWQifSwKKyAgICAgICAgICAgICAgICB7ImdvdWR5IG9sZCBzdHlsZSIsICJHb3VkeSBPbGQgU3R5bGUifSwKKyAgICAgICAgICAgICAgICB7ImdvdWR5IHN0b3V0IiwgIkdvdWR5IFN0b3V0In0sCisgICAgICAgICAgICAgICAgeyJnb3VkeW9sZHN0eWxlIiwgIkdvdWR5IE9sZCBTdHlsZSJ9LAorICAgICAgICAgICAgICAgIHsiZ291ZHlzdG91dCIsICJHb3VkeSBTdG91dCJ9LAorICAgICAgICAgICAgICAgIHsiZ3VsaW0iLCAiR3VsaW0ifSwKKyAgICAgICAgICAgICAgICB7Imd1bGltY2hlIiwgIkd1bGltQ2hlIn0sCisgICAgICAgICAgICAgICAgeyJndW5nc3VoIiwgIkd1bmdzdWgifSwKKyAgICAgICAgICAgICAgICB7Imd1bmdzdWhjaGUiLCAiR3VuZ3N1aENoZSJ9LAorICAgICAgICAgICAgICAgIHsiaGFldHRlbnNjaHdlaWxlciIsICJIYWV0dGVuc2Nod2VpbGVyIn0sCisgICAgICAgICAgICAgICAgeyJoYXJsb3cgc29saWQgaXRhbGljIiwgIkhhcmxvdyBTb2xpZCBJdGFsaWMifSwKKyAgICAgICAgICAgICAgICB7Imhhcmxvd3NvbGlkaXRhbGljIiwgIkhhcmxvdyBTb2xpZCBJdGFsaWMifSwKKyAgICAgICAgICAgICAgICB7ImhhcnJpbmd0b24iLCAiSGFycmluZ3RvbiJ9LAorICAgICAgICAgICAgICAgIHsiaGlnaCB0b3dlciB0ZXh0IiwgIkhpZ2ggVG93ZXIgVGV4dCJ9LAorICAgICAgICAgICAgICAgIHsiaGlnaHRvd2VydGV4dCIsICJIaWdoIFRvd2VyIFRleHQifSwKKyAgICAgICAgICAgICAgICB7ImltcGFjdCIsICJJbXBhY3QifSwKKyAgICAgICAgICAgICAgICB7ImltcHJpbnQgbXQgc2hhZG93IiwgIkltcHJpbnQgTVQgU2hhZG93In0sCisgICAgICAgICAgICAgICAgeyJpbXByaW50bXRzaGFkb3ciLCAiSW1wcmludCBNVCBTaGFkb3cifSwKKyAgICAgICAgICAgICAgICB7ImluZm9ybWFsIHJvbWFuIiwgIkluZm9ybWFsIFJvbWFuIn0sCisgICAgICAgICAgICAgICAgeyJpbmZvcm1hbHJvbWFuIiwgIkluZm9ybWFsIFJvbWFuIn0sCisgICAgICAgICAgICAgICAgeyJpcmlzdXBjIiwgIklyaXNVUEMifSwKKyAgICAgICAgICAgICAgICB7Imlza29vbGEgcG90YSIsICJJc2tvb2xhIFBvdGEifSwKKyAgICAgICAgICAgICAgICB7Imlza29vbGFwb3RhIiwgIklza29vbGEgUG90YSJ9LAorICAgICAgICAgICAgICAgIHsiamFzbWluZXVwYyIsICJKYXNtaW5lVVBDIn0sCisgICAgICAgICAgICAgICAgeyJqb2tlcm1hbiIsICJKb2tlcm1hbiJ9LAorICAgICAgICAgICAgICAgIHsianVpY2UgaXRjIiwgIkp1aWNlIElUQyJ9LAorICAgICAgICAgICAgICAgIHsianVpY2VpdGMiLCAiSnVpY2UgSVRDIn0sCisgICAgICAgICAgICAgICAgeyJrYWl0aSIsICJLYWlUaSJ9LAorICAgICAgICAgICAgICAgIHsia2FsaW5nYSIsICJLYWxpbmdhIn0sCisgICAgICAgICAgICAgICAgeyJrYXJ0aWthIiwgIkthcnRpa2EifSwKKyAgICAgICAgICAgICAgICB7ImtobWVyIHVpIiwgIktobWVyIFVJIn0sCisgICAgICAgICAgICAgICAgeyJraG1lcnVpIiwgIktobWVyIFVJIn0sCisgICAgICAgICAgICAgICAgeyJrb2RjaGlhbmd1cGMiLCAiS29kY2hpYW5nVVBDIn0sCisgICAgICAgICAgICAgICAgeyJrb2tpbGEiLCAiS29raWxhIn0sCisgICAgICAgICAgICAgICAgeyJrcmlzdGVuIGl0YyIsICJLcmlzdGVuIElUQyJ9LAorICAgICAgICAgICAgICAgIHsia3Jpc3Rlbml0YyIsICJLcmlzdGVuIElUQyJ9LAorICAgICAgICAgICAgICAgIHsia3Vuc3RsZXIgc2NyaXB0IiwgIkt1bnN0bGVyIFNjcmlwdCJ9LAorICAgICAgICAgICAgICAgIHsia3Vuc3RsZXJzY3JpcHQiLCAiS3Vuc3RsZXIgU2NyaXB0In0sCisgICAgICAgICAgICAgICAgeyJsYW8gdWkiLCAiTGFvIFVJIn0sCisgICAgICAgICAgICAgICAgeyJsYW91aSIsICJMYW8gVUkifSwKKyAgICAgICAgICAgICAgICB7ImxhdGhhIiwgIkxhdGhhIn0sCisgICAgICAgICAgICAgICAgeyJsZWVsYXdhZGVlIiwgIkxlZWxhd2FkZWUifSwKKyAgICAgICAgICAgICAgICB7ImxldmVuaW0gbXQiLCAiTGV2ZW5pbSBNVCJ9LAorICAgICAgICAgICAgICAgIHsibGV2ZW5pbW10IiwgIkxldmVuaW0gTVQifSwKKyAgICAgICAgICAgICAgICB7ImxpbHl1cGMiLCAiTGlseVVQQyJ9LAorICAgICAgICAgICAgICAgIHsibHVjaWRhIGJyaWdodCIsICJMdWNpZGEgQnJpZ2h0In0sCisgICAgICAgICAgICAgICAgeyJsdWNpZGEgY2FsbGlncmFwaHkiLCAiTHVjaWRhIENhbGxpZ3JhcGh5In0sCisgICAgICAgICAgICAgICAgeyJsdWNpZGEgY29uc29sZSIsICJMdWNpZGEgQ29uc29sZSJ9LAorICAgICAgICAgICAgICAgIHsibHVjaWRhIGZheCIsICJMdWNpZGEgRmF4In0sCisgICAgICAgICAgICAgICAgeyJsdWNpZGEgaGFuZHdyaXRpbmciLCAiTHVjaWRhIEhhbmR3cml0aW5nIn0sCisgICAgICAgICAgICAgICAgeyJsdWNpZGEgc2FucyIsICJMdWNpZGEgU2FucyJ9LAorICAgICAgICAgICAgICAgIHsibHVjaWRhIHNhbnMgdHlwZXdyaXRlciIsICJMdWNpZGEgU2FucyBUeXBld3JpdGVyIn0sCisgICAgICAgICAgICAgICAgeyJsdWNpZGEgc2FucyB1bmljb2RlIiwgIkx1Y2lkYSBTYW5zIFVuaWNvZGUifSwKKyAgICAgICAgICAgICAgICB7Imx1Y2lkYWJyaWdodCIsICJMdWNpZGEgQnJpZ2h0In0sCisgICAgICAgICAgICAgICAgeyJsdWNpZGFjYWxsaWdyYXBoeSIsICJMdWNpZGEgQ2FsbGlncmFwaHkifSwKKyAgICAgICAgICAgICAgICB7Imx1Y2lkYWNvbnNvbGUiLCAiTHVjaWRhIENvbnNvbGUifSwKKyAgICAgICAgICAgICAgICB7Imx1Y2lkYWZheCIsICJMdWNpZGEgRmF4In0sCisgICAgICAgICAgICAgICAgeyJsdWNpZGFoYW5kd3JpdGluZyIsICJMdWNpZGEgSGFuZHdyaXRpbmcifSwKKyAgICAgICAgICAgICAgICB7Imx1Y2lkYXNhbnMiLCAiTHVjaWRhIFNhbnMifSwKKyAgICAgICAgICAgICAgICB7Imx1Y2lkYXNhbnN0eXBld3JpdGVyIiwgIkx1Y2lkYSBTYW5zIFR5cGV3cml0ZXIifSwKKyAgICAgICAgICAgICAgICB7Imx1Y2lkYXNhbnN1bmljb2RlIiwgIkx1Y2lkYSBTYW5zIFVuaWNvZGUifSwKKyAgICAgICAgICAgICAgICB7Im1hZ25ldG8iLCAiTWFnbmV0byJ9LAorICAgICAgICAgICAgICAgIHsibWFpYW5kcmEgZ2QiLCAiTWFpYW5kcmEgR0QifSwKKyAgICAgICAgICAgICAgICB7Im1haWFuZHJhZ2QiLCAiTWFpYW5kcmEgR0QifSwKKyAgICAgICAgICAgICAgICB7Im1hbGd1biBnb3RoaWMiLCAiTWFsZ3VuIEdvdGhpYyJ9LAorICAgICAgICAgICAgICAgIHsibWFsZ3VuZ290aGljIiwgIk1hbGd1biBHb3RoaWMifSwKKyAgICAgICAgICAgICAgICB7Im1hbmdhbCIsICJNYW5nYWwifSwKKyAgICAgICAgICAgICAgICB7Im1hcmxldHQiLCAiTWFybGV0dCJ9LAorICAgICAgICAgICAgICAgIHsibWF0dXJhIG10IHNjcmlwdCBjYXBpdGFscyIsICJNYXR1cmEgTVQgU2NyaXB0IENhcGl0YWxzIn0sCisgICAgICAgICAgICAgICAgeyJtYXR1cmFtdHNjcmlwdGNhcGl0YWxzIiwgIk1hdHVyYSBNVCBTY3JpcHQgQ2FwaXRhbHMifSwKKyAgICAgICAgICAgICAgICB7Im1laXJ5byIsICJNZWlyeW8ifSwKKyAgICAgICAgICAgICAgICB7Im1laXJ5byB1aSIsICJNZWlyeW8gVUkifSwKKyAgICAgICAgICAgICAgICB7Im1laXJ5b3VpIiwgIk1laXJ5byBVSSJ9LAorICAgICAgICAgICAgICAgIHsibWljcm9zb2Z0IGhpbWFsYXlhIiwgIk1pY3Jvc29mdCBIaW1hbGF5YSJ9LAorICAgICAgICAgICAgICAgIHsibWljcm9zb2Z0IGpoZW5naGVpIiwgIk1pY3Jvc29mdCBKaGVuZ0hlaSJ9LAorICAgICAgICAgICAgICAgIHsibWljcm9zb2Z0IG5ldyB0YWkgbHVlIiwgIk1pY3Jvc29mdCBOZXcgVGFpIEx1ZSJ9LAorICAgICAgICAgICAgICAgIHsibWljcm9zb2Z0IHBoYWdzcGEiLCAiTWljcm9zb2Z0IFBoYWdzUGEifSwKKyAgICAgICAgICAgICAgICB7Im1pY3Jvc29mdCBzYW5zIHNlcmlmIiwgIk1pY3Jvc29mdCBTYW5zIFNlcmlmIn0sCisgICAgICAgICAgICAgICAgeyJtaWNyb3NvZnQgdGFpIGxlIiwgIk1pY3Jvc29mdCBUYWkgTGUifSwKKyAgICAgICAgICAgICAgICB7Im1pY3Jvc29mdCB1aWdodXIiLCAiTWljcm9zb2Z0IFVpZ2h1ciJ9LAorICAgICAgICAgICAgICAgIHsibWljcm9zb2Z0IHlhaGVpIiwgIk1pY3Jvc29mdCBZYUhlaSJ9LAorICAgICAgICAgICAgICAgIHsibWljcm9zb2Z0IHlpIGJhaXRpIiwgIk1pY3Jvc29mdCBZaSBCYWl0aSJ9LAorICAgICAgICAgICAgICAgIHsibWljcm9zb2Z0aGltYWxheWEiLCAiTWljcm9zb2Z0IEhpbWFsYXlhIn0sCisgICAgICAgICAgICAgICAgeyJtaWNyb3NvZnRqaGVuZ2hlaSIsICJNaWNyb3NvZnQgSmhlbmdIZWkifSwKKyAgICAgICAgICAgICAgICB7Im1pY3Jvc29mdG5ld3RhaWx1ZSIsICJNaWNyb3NvZnQgTmV3IFRhaSBMdWUifSwKKyAgICAgICAgICAgICAgICB7Im1pY3Jvc29mdHBoYWdzcGEiLCAiTWljcm9zb2Z0IFBoYWdzUGEifSwKKyAgICAgICAgICAgICAgICB7Im1pY3Jvc29mdHNhbnNzZXJpZiIsICJNaWNyb3NvZnQgU2FucyBTZXJpZiJ9LAorICAgICAgICAgICAgICAgIHsibWljcm9zb2Z0dGFpbGUiLCAiTWljcm9zb2Z0IFRhaSBMZSJ9LAorICAgICAgICAgICAgICAgIHsibWljcm9zb2Z0dWlnaHVyIiwgIk1pY3Jvc29mdCBVaWdodXIifSwKKyAgICAgICAgICAgICAgICB7Im1pY3Jvc29mdHlhaGVpIiwgIk1pY3Jvc29mdCBZYUhlaSJ9LAorICAgICAgICAgICAgICAgIHsibWljcm9zb2Z0eWliYWl0aSIsICJNaWNyb3NvZnQgWWkgQmFpdGkifSwKKyAgICAgICAgICAgICAgICB7Im1pbmdsaXUiLCAiTWluZ0xpVSJ9LAorICAgICAgICAgICAgICAgIHsibWluZ2xpdV9oa3NjcyIsICJNaW5nTGlVX0hLU0NTIn0sCisgICAgICAgICAgICAgICAgeyJtaW5nbGl1X2hrc2NzLWV4dGIiLCAiTWluZ0xpVV9IS1NDUy1FeHRCIn0sCisgICAgICAgICAgICAgICAgeyJtaW5nbGl1LWV4dGIiLCAiTWluZ0xpVS1FeHRCIn0sCisgICAgICAgICAgICAgICAgeyJtaXJpYW0iLCAiTWlyaWFtIn0sCisgICAgICAgICAgICAgICAgeyJtaXJpYW0gZml4ZWQiLCAiTWlyaWFtIEZpeGVkIn0sCisgICAgICAgICAgICAgICAgeyJtaXJpYW1maXhlZCIsICJNaXJpYW0gRml4ZWQifSwKKyAgICAgICAgICAgICAgICB7Im1pc3RyYWwiLCAiTWlzdHJhbCJ9LAorICAgICAgICAgICAgICAgIHsibW9kZXJuIG5vLiAyMCIsICJNb2Rlcm4gTm8uIDIwIn0sCisgICAgICAgICAgICAgICAgeyJtb2Rlcm5uby4yMCIsICJNb2Rlcm4gTm8uIDIwIn0sCisgICAgICAgICAgICAgICAgeyJtb25nb2xpYW4gYmFpdGkiLCAiTW9uZ29saWFuIEJhaXRpIn0sCisgICAgICAgICAgICAgICAgeyJtb25nb2xpYW5iYWl0aSIsICJNb25nb2xpYW4gQmFpdGkifSwKKyAgICAgICAgICAgICAgICB7Im1vbm90eXBlIGNvcnNpdmEiLCAiTW9ub3R5cGUgQ29yc2l2YSJ9LAorICAgICAgICAgICAgICAgIHsibW9ub3R5cGVjb3JzaXZhIiwgIk1vbm90eXBlIENvcnNpdmEifSwKKyAgICAgICAgICAgICAgICB7Im1vb2xib3JhbiIsICJNb29sQm9yYW4ifSwKKyAgICAgICAgICAgICAgICB7Im1zIGdvdGhpYyIsICJNUyBHb3RoaWMifSwKKyAgICAgICAgICAgICAgICB7Im1zIG1pbmNobyIsICJNUyBNaW5jaG8ifSwKKyAgICAgICAgICAgICAgICB7Im1zIHBnb3RoaWMiLCAiTVMgUEdvdGhpYyJ9LAorICAgICAgICAgICAgICAgIHsibXMgcG1pbmNobyIsICJNUyBQTWluY2hvIn0sCisgICAgICAgICAgICAgICAgeyJtcyByZWZlcmVuY2Ugc2FucyBzZXJpZiIsICJNUyBSZWZlcmVuY2UgU2FucyBTZXJpZiJ9LAorICAgICAgICAgICAgICAgIHsibXMgcmVmZXJlbmNlIHNwZWNpYWx0eSIsICJNUyBSZWZlcmVuY2UgU3BlY2lhbHR5In0sCisgICAgICAgICAgICAgICAgeyJtcyB1aSBnb3RoaWMiLCAiTVMgVUkgR290aGljIn0sCisgICAgICAgICAgICAgICAgeyJtc2dvdGhpYyIsICJNUyBHb3RoaWMifSwKKyAgICAgICAgICAgICAgICB7Im1zbWluY2hvIiwgIk1TIE1pbmNobyJ9LAorICAgICAgICAgICAgICAgIHsibXNwZ290aGljIiwgIk1TIFBHb3RoaWMifSwKKyAgICAgICAgICAgICAgICB7Im1zcG1pbmNobyIsICJNUyBQTWluY2hvIn0sCisgICAgICAgICAgICAgICAgeyJtc3JlZmVyZW5jZXNhbnNzZXJpZiIsICJNUyBSZWZlcmVuY2UgU2FucyBTZXJpZiJ9LAorICAgICAgICAgICAgICAgIHsibXNyZWZlcmVuY2VzcGVjaWFsdHkiLCAiTVMgUmVmZXJlbmNlIFNwZWNpYWx0eSJ9LAorICAgICAgICAgICAgICAgIHsibXN1aWdvdGhpYyIsICJNUyBVSSBHb3RoaWMifSwKKyAgICAgICAgICAgICAgICB7Im10IGV4dHJhIiwgIk1UIEV4dHJhIn0sCisgICAgICAgICAgICAgICAgeyJtdGV4dHJhIiwgIk1UIEV4dHJhIn0sCisgICAgICAgICAgICAgICAgeyJtdiBib2xpIiwgIk1WIEJvbGkifSwKKyAgICAgICAgICAgICAgICB7Im12Ym9saSIsICJNViBCb2xpIn0sCisgICAgICAgICAgICAgICAgeyJuYXJraXNpbSIsICJOYXJraXNpbSJ9LAorICAgICAgICAgICAgICAgIHsibmlhZ2FyYSBlbmdyYXZlZCIsICJOaWFnYXJhIEVuZ3JhdmVkIn0sCisgICAgICAgICAgICAgICAgeyJuaWFnYXJhIHNvbGlkIiwgIk5pYWdhcmEgU29saWQifSwKKyAgICAgICAgICAgICAgICB7Im5pYWdhcmFlbmdyYXZlZCIsICJOaWFnYXJhIEVuZ3JhdmVkIn0sCisgICAgICAgICAgICAgICAgeyJuaWFnYXJhc29saWQiLCAiTmlhZ2FyYSBTb2xpZCJ9LAorICAgICAgICAgICAgICAgIHsibnNpbXN1biIsICJOU2ltU3VuIn0sCisgICAgICAgICAgICAgICAgeyJueWFsYSIsICJOeWFsYSJ9LAorICAgICAgICAgICAgICAgIHsib2NyIGEgZXh0ZW5kZWQiLCAiT0NSIEEgRXh0ZW5kZWQifSwKKyAgICAgICAgICAgICAgICB7Im9jcmFleHRlbmRlZCIsICJPQ1IgQSBFeHRlbmRlZCJ9LAorICAgICAgICAgICAgICAgIHsib2xkIGVuZ2xpc2ggdGV4dCBtdCIsICJPbGQgRW5nbGlzaCBUZXh0IE1UIn0sCisgICAgICAgICAgICAgICAgeyJvbGRlbmdsaXNodGV4dG10IiwgIk9sZCBFbmdsaXNoIFRleHQgTVQifSwKKyAgICAgICAgICAgICAgICB7Im9ueXgiLCAiT255eCJ9LAorICAgICAgICAgICAgICAgIHsicGFsYWNlIHNjcmlwdCBtdCIsICJQYWxhY2UgU2NyaXB0IE1UIn0sCisgICAgICAgICAgICAgICAgeyJwYWxhY2VzY3JpcHRtdCIsICJQYWxhY2UgU2NyaXB0IE1UIn0sCisgICAgICAgICAgICAgICAgeyJwYWxhdGlubyBsaW5vdHlwZSIsICJQYWxhdGlubyBMaW5vdHlwZSJ9LAorICAgICAgICAgICAgICAgIHsicGFsYXRpbm9saW5vdHlwZSIsICJQYWxhdGlubyBMaW5vdHlwZSJ9LAorICAgICAgICAgICAgICAgIHsicGFweXJ1cyIsICJQYXB5cnVzIn0sCisgICAgICAgICAgICAgICAgeyJwYXJjaG1lbnQiLCAiUGFyY2htZW50In0sCisgICAgICAgICAgICAgICAgeyJwZXJwZXR1YSIsICJQZXJwZXR1YSJ9LAorICAgICAgICAgICAgICAgIHsicGVycGV0dWEgdGl0bGluZyBtdCIsICJQZXJwZXR1YSBUaXRsaW5nIE1UIn0sCisgICAgICAgICAgICAgICAgeyJwZXJwZXR1YXRpdGxpbmdtdCIsICJQZXJwZXR1YSBUaXRsaW5nIE1UIn0sCisgICAgICAgICAgICAgICAgeyJwbGFudGFnZW5ldCBjaGVyb2tlZSIsICJQbGFudGFnZW5ldCBDaGVyb2tlZSJ9LAorICAgICAgICAgICAgICAgIHsicGxhbnRhZ2VuZXRjaGVyb2tlZSIsICJQbGFudGFnZW5ldCBDaGVyb2tlZSJ9LAorICAgICAgICAgICAgICAgIHsicGxheWJpbGwiLCAiUGxheWJpbGwifSwKKyAgICAgICAgICAgICAgICB7InBtaW5nbGl1IiwgIlBNaW5nTGlVIn0sCisgICAgICAgICAgICAgICAgeyJwbWluZ2xpdS1leHRiIiwgIlBNaW5nTGlVLUV4dEIifSwKKyAgICAgICAgICAgICAgICB7InBvb3IgcmljaGFyZCIsICJQb29yIFJpY2hhcmQifSwKKyAgICAgICAgICAgICAgICB7InBvb3JyaWNoYXJkIiwgIlBvb3IgUmljaGFyZCJ9LAorICAgICAgICAgICAgICAgIHsicHJpc3RpbmEiLCAiUHJpc3RpbmEifSwKKyAgICAgICAgICAgICAgICB7InJhYXZpIiwgIlJhYXZpIn0sCisgICAgICAgICAgICAgICAgeyJyYWdlIGl0YWxpYyIsICJSYWdlIEl0YWxpYyJ9LAorICAgICAgICAgICAgICAgIHsicmFnZWl0YWxpYyIsICJSYWdlIEl0YWxpYyJ9LAorICAgICAgICAgICAgICAgIHsicmF2aWUiLCAiUmF2aWUifSwKKyAgICAgICAgICAgICAgICB7InJvY2t3ZWxsIiwgIlJvY2t3ZWxsIn0sCisgICAgICAgICAgICAgICAgeyJyb2Nrd2VsbCBjb25kZW5zZWQiLCAiUm9ja3dlbGwgQ29uZGVuc2VkIn0sCisgICAgICAgICAgICAgICAgeyJyb2Nrd2VsbCBleHRyYSBib2xkIiwgIlJvY2t3ZWxsIEV4dHJhIEJvbGQifSwKKyAgICAgICAgICAgICAgICB7InJvY2t3ZWxsY29uZGVuc2VkIiwgIlJvY2t3ZWxsIENvbmRlbnNlZCJ9LAorICAgICAgICAgICAgICAgIHsicm9ja3dlbGxleHRyYWJvbGQiLCAiUm9ja3dlbGwgRXh0cmEgQm9sZCJ9LAorICAgICAgICAgICAgICAgIHsicm9kIiwgIlJvZCJ9LAorICAgICAgICAgICAgICAgIHsic2Fra2FsIG1hamFsbGEiLCAiU2Fra2FsIE1hamFsbGEifSwKKyAgICAgICAgICAgICAgICB7InNha2thbG1hamFsbGEiLCAiU2Fra2FsIE1hamFsbGEifSwKKyAgICAgICAgICAgICAgICB7InNjcmlwdCBtdCBib2xkIiwgIlNjcmlwdCBNVCBCb2xkIn0sCisgICAgICAgICAgICAgICAgeyJzY3JpcHRtdGJvbGQiLCAiU2NyaXB0IE1UIEJvbGQifSwKKyAgICAgICAgICAgICAgICB7InNlZ29lIHByaW50IiwgIlNlZ29lIFByaW50In0sCisgICAgICAgICAgICAgICAgeyJzZWdvZSBzY3JpcHQiLCAiU2Vnb2UgU2NyaXB0In0sCisgICAgICAgICAgICAgICAgeyJzZWdvZSB1aSIsICJTZWdvZSBVSSJ9LAorICAgICAgICAgICAgICAgIHsic2Vnb2UgdWkgbGlnaHQiLCAiU2Vnb2UgVUkgTGlnaHQifSwKKyAgICAgICAgICAgICAgICB7InNlZ29lIHVpIHNlbWlib2xkIiwgIlNlZ29lIFVJIFNlbWlib2xkIn0sCisgICAgICAgICAgICAgICAgeyJzZWdvZSB1aSBzeW1ib2wiLCAiU2Vnb2UgVUkgU3ltYm9sIn0sCisgICAgICAgICAgICAgICAgeyJzZWdvZXByaW50IiwgIlNlZ29lIFByaW50In0sCisgICAgICAgICAgICAgICAgeyJzZWdvZXNjcmlwdCIsICJTZWdvZSBTY3JpcHQifSwKKyAgICAgICAgICAgICAgICB7InNlZ29ldWkiLCAiU2Vnb2UgVUkifSwKKyAgICAgICAgICAgICAgICB7InNlZ29ldWlsaWdodCIsICJTZWdvZSBVSSBMaWdodCJ9LAorICAgICAgICAgICAgICAgIHsic2Vnb2V1aXNlbWlib2xkIiwgIlNlZ29lIFVJIFNlbWlib2xkIn0sCisgICAgICAgICAgICAgICAgeyJzZWdvZXVpc3ltYm9sIiwgIlNlZ29lIFVJIFN5bWJvbCJ9LAorICAgICAgICAgICAgICAgIHsic2hvbmFyIGJhbmdsYSIsICJTaG9uYXIgQmFuZ2xhIn0sCisgICAgICAgICAgICAgICAgeyJzaG9uYXJiYW5nbGEiLCAiU2hvbmFyIEJhbmdsYSJ9LAorICAgICAgICAgICAgICAgIHsic2hvd2NhcmQgZ290aGljIiwgIlNob3djYXJkIEdvdGhpYyJ9LAorICAgICAgICAgICAgICAgIHsic2hvd2NhcmRnb3RoaWMiLCAiU2hvd2NhcmQgR290aGljIn0sCisgICAgICAgICAgICAgICAgeyJzaHJ1dGkiLCAiU2hydXRpIn0sCisgICAgICAgICAgICAgICAgeyJzaW1oZWkiLCAiU2ltSGVpIn0sCisgICAgICAgICAgICAgICAgeyJzaW1wbGlmaWVkIGFyYWJpYyIsICJTaW1wbGlmaWVkIEFyYWJpYyJ9LAorICAgICAgICAgICAgICAgIHsic2ltcGxpZmllZCBhcmFiaWMgZml4ZWQiLCAiU2ltcGxpZmllZCBBcmFiaWMgRml4ZWQifSwKKyAgICAgICAgICAgICAgICB7InNpbXBsaWZpZWRhcmFiaWMiLCAiU2ltcGxpZmllZCBBcmFiaWMifSwKKyAgICAgICAgICAgICAgICB7InNpbXBsaWZpZWRhcmFiaWNmaXhlZCIsICJTaW1wbGlmaWVkIEFyYWJpYyBGaXhlZCJ9LAorICAgICAgICAgICAgICAgIHsic2ltc3VuIiwgIlNpbVN1biJ9LAorICAgICAgICAgICAgICAgIHsic2ltc3VuLWV4dGIiLCAiU2ltU3VuLUV4dEIifSwKKyAgICAgICAgICAgICAgICB7InNuYXAgaXRjIiwgIlNuYXAgSVRDIn0sCisgICAgICAgICAgICAgICAgeyJzbmFwaXRjIiwgIlNuYXAgSVRDIn0sCisgICAgICAgICAgICAgICAgeyJzdGVuY2lsIiwgIlN0ZW5jaWwifSwKKyAgICAgICAgICAgICAgICB7InN3Z2FtZWtleXMgbXQiLCAiU1dHYW1la2V5cyBNVCJ9LAorICAgICAgICAgICAgICAgIHsic3dnYW1la2V5c210IiwgIlNXR2FtZWtleXMgTVQifSwKKyAgICAgICAgICAgICAgICB7InN3bWFjcm8iLCAiU1dNYWNybyJ9LAorICAgICAgICAgICAgICAgIHsic3lsZmFlbiIsICJTeWxmYWVuIn0sCisgICAgICAgICAgICAgICAgeyJzeW1ib2wiLCAiU3ltYm9sIn0sCisgICAgICAgICAgICAgICAgeyJ0YWhvbWEiLCAiVGFob21hIn0sCisgICAgICAgICAgICAgICAgeyJ0ZW1wdXMgc2FucyBpdGMiLCAiVGVtcHVzIFNhbnMgSVRDIn0sCisgICAgICAgICAgICAgICAgeyJ0ZW1wdXNzYW5zaXRjIiwgIlRlbXB1cyBTYW5zIElUQyJ9LAorICAgICAgICAgICAgICAgIHsidGltZXMgbmV3IHJvbWFuIiwgIlRpbWVzIE5ldyBSb21hbiJ9LAorICAgICAgICAgICAgICAgIHsidGltZXNuZXdyb21hbiIsICJUaW1lcyBOZXcgUm9tYW4ifSwKKyAgICAgICAgICAgICAgICB7InRyYWRpdGlvbmFsIGFyYWJpYyIsICJUcmFkaXRpb25hbCBBcmFiaWMifSwKKyAgICAgICAgICAgICAgICB7InRyYWRpdGlvbmFsYXJhYmljIiwgIlRyYWRpdGlvbmFsIEFyYWJpYyJ9LAorICAgICAgICAgICAgICAgIHsidHJlYnVjaGV0IG1zIiwgIlRyZWJ1Y2hldCBNUyJ9LAorICAgICAgICAgICAgICAgIHsidHJlYnVjaGV0bXMiLCAiVHJlYnVjaGV0IE1TIn0sCisgICAgICAgICAgICAgICAgeyJ0dW5nYSIsICJUdW5nYSJ9LAorICAgICAgICAgICAgICAgIHsidHcgY2VuIG10IiwgIlR3IENlbiBNVCJ9LAorICAgICAgICAgICAgICAgIHsidHcgY2VuIG10IGNvbmRlbnNlZCIsICJUdyBDZW4gTVQgQ29uZGVuc2VkIn0sCisgICAgICAgICAgICAgICAgeyJ0dyBjZW4gbXQgY29uZGVuc2VkIGV4dHJhIGJvbGQiLCAiVHcgQ2VuIE1UIENvbmRlbnNlZCBFeHRyYSBCb2xkIn0sCisgICAgICAgICAgICAgICAgeyJ0d2Nlbm10IiwgIlR3IENlbiBNVCJ9LAorICAgICAgICAgICAgICAgIHsidHdjZW5tdGNvbmRlbnNlZCIsICJUdyBDZW4gTVQgQ29uZGVuc2VkIn0sCisgICAgICAgICAgICAgICAgeyJ0d2Nlbm10Y29uZGVuc2VkZXh0cmFib2xkIiwgIlR3IENlbiBNVCBDb25kZW5zZWQgRXh0cmEgQm9sZCJ9LAorICAgICAgICAgICAgICAgIHsidXRzYWFoIiwgIlV0c2FhaCJ9LAorICAgICAgICAgICAgICAgIHsidmFuaSIsICJWYW5pIn0sCisgICAgICAgICAgICAgICAgeyJ2ZXJkYW5hIiwgIlZlcmRhbmEifSwKKyAgICAgICAgICAgICAgICB7InZpamF5YSIsICJWaWpheWEifSwKKyAgICAgICAgICAgICAgICB7InZpbmVyIGhhbmQgaXRjIiwgIlZpbmVyIEhhbmQgSVRDIn0sCisgICAgICAgICAgICAgICAgeyJ2aW5lcmhhbmRpdGMiLCAiVmluZXIgSGFuZCBJVEMifSwKKyAgICAgICAgICAgICAgICB7InZpdmFsZGkiLCAiVml2YWxkaSJ9LAorICAgICAgICAgICAgICAgIHsidmxhZGltaXIgc2NyaXB0IiwgIlZsYWRpbWlyIFNjcmlwdCJ9LAorICAgICAgICAgICAgICAgIHsidmxhZGltaXJzY3JpcHQiLCAiVmxhZGltaXIgU2NyaXB0In0sCisgICAgICAgICAgICAgICAgeyJ2cmluZGEiLCAiVnJpbmRhIn0sCisgICAgICAgICAgICAgICAgeyJ3ZWJkaW5ncyIsICJXZWJkaW5ncyJ9LAorICAgICAgICAgICAgICAgIHsid2lkZSBsYXRpbiIsICJXaWRlIExhdGluIn0sCisgICAgICAgICAgICAgICAgeyJ3aWRlbGF0aW4iLCAiV2lkZSBMYXRpbiJ9LAorICAgICAgICAgICAgICAgIHsid2luZ2RpbmdzIiwgIldpbmdkaW5ncyJ9LAorICAgICAgICAgICAgICAgIHsid2luZ2RpbmdzIDIiLCAiV2luZ2RpbmdzIDIifSwKKyAgICAgICAgICAgICAgICB7IndpbmdkaW5ncyAzIiwgIldpbmdkaW5ncyAzIn0sCisgICAgICAgICAgICAgICAgeyJ3aW5nZGluZ3MyIiwgIldpbmdkaW5ncyAyIn0sCisgICAgICAgICAgICAgICAgeyJ3aW5nZGluZ3MzIiwgIldpbmdkaW5ncyAzIn0sCisgICAgICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFRQb2ludD8gR2V0VXNlZFNpemVGcm9tRm9udFNpemVQcm9wZXJ0eShDc3NFeHByZXNzaW9uIGZvbnRTaXplKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZm9udFNpemUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGlmIChmb250U2l6ZS5UZXJtcy5Db3VudCgpID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3NzVGVybSB0ZXJtID0gZm9udFNpemUuVGVybXMuRmlyc3QoKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHRlcm0uVW5pdCA9PSBDc3NVbml0LlBUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZSh0ZXJtLlZhbHVlLCBvdXQgc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRQb2ludChzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0VXNlZEZvbnRGcm9tRm9udEZhbWlseVByb3BlcnR5KENzc0V4cHJlc3Npb24gZm9udEZhbWlseSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZvbnRGYW1pbHkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHN0cmluZyBmdWxsRm9udEZhbWlseSA9IGZvbnRGYW1pbHkuVGVybXMuU2VsZWN0KHQgPT4gdCArICIgIikuU3RyaW5nQ29uY2F0ZW5hdGUoKS5UcmltKCk7CisgICAgICAgICAgICBzdHJpbmcgbGNmb250ID0gZnVsbEZvbnRGYW1pbHkuVG9Mb3dlcigpOworICAgICAgICAgICAgaWYgKEluc3RhbGxlZEZvbnRzLkNvbnRhaW5zS2V5KGxjZm9udCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEluc3RhbGxlZEZvbnRzW2xjZm9udF07CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEdldEJhY2tncm91bmRQcm9wZXJ0eShYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGNvbG9yID0gZWxlbWVudC5HZXRQcm9wKCJiYWNrZ3JvdW5kLWNvbG9yIik7CisKKyAgICAgICAgICAgIC8vIHRvZG8gdGhpcyByZWFsbHkgc2hvdWxkIHRlc3QgYWdhaW5zdCBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IKKyAgICAgICAgICAgIGlmIChjb2xvci5Ub1N0cmluZygpICE9ICJ0cmFuc3BhcmVudCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGhleFN0cmluZyA9IGNvbG9yLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgc2hkID0gbmV3IFhFbGVtZW50KFcuc2hkLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgImNsZWFyIiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuY29sb3IsICJhdXRvIiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuZmlsbCwgaGV4U3RyaW5nKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNoZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgUGljdHVyZUlkCisgICAgeworICAgICAgICBwdWJsaWMgaW50IElkOworICAgIH0KKworICAgIGNsYXNzIEh0bWxUb1dtbEZvbnRVcGRhdGVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVXBkYXRlRm9udHNQYXJ0KFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYywgWEVsZW1lbnQgaHRtbCwgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCBmb250WERvYyA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5Gb250VGFibGVQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICBQdFV0aWxzLkFkZEVsZW1lbnRJZk1pc3NpbmcoZm9udFhEb2MsCisgICAgICAgICAgICAgICAgZm9udFhEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy50eXBlKSA9PSAicGFyYWdyYXBoIiAmJiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gIkhlYWRpbmcxIikKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCksCitAIjx3OmZvbnQgdzpuYW1lPSdWZXJkYW5hJyB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICA8dzpwYW5vc2UxIHc6dmFsPScwMjBCMDYwNDAzMDUwNDA0MDIwNCcvPgorICA8dzpjaGFyc2V0IHc6dmFsPScwMCcvPgorICA8dzpmYW1pbHkgdzp2YWw9J3N3aXNzJy8+CisgIDx3OnBpdGNoIHc6dmFsPSd2YXJpYWJsZScvPgorICA8dzpzaWcgdzp1c2IwPSdBMTAwMDZGRicKKyAgICAgICAgICB3OnVzYjE9JzQwMDAyMDVCJworICAgICAgICAgIHc6dXNiMj0nMDAwMDAwMTAnCisgICAgICAgICAgdzp1c2IzPScwMDAwMDAwMCcKKyAgICAgICAgICB3OmNzYjA9JzAwMDAwMTlGJworICAgICAgICAgIHc6Y3NiMT0nMDAwMDAwMDAnLz4KKzwvdzpmb250PiIpOworCisgICAgICAgICAgICB3RG9jLk1haW5Eb2N1bWVudFBhcnQuRm9udFRhYmxlUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIE51bWJlcmluZ1VwZGF0ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBJbml0aWFsaXplTnVtYmVyaW5nUGFydChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIE51bWJlcmluZ0RlZmluaXRpb25zUGFydCBudW1iZXJpbmdQYXJ0ID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0Lk51bWJlcmluZ0RlZmluaXRpb25zUGFydDsKKyAgICAgICAgICAgIGlmIChudW1iZXJpbmdQYXJ0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd0RvYy5NYWluRG9jdW1lbnRQYXJ0LkFkZE5ld1BhcnQ8TnVtYmVyaW5nRGVmaW5pdGlvbnNQYXJ0PigpOworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBucFhEb2MgPSBuZXcgWERvY3VtZW50KAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5udW1iZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInciLCBXLncpKSk7CisgICAgICAgICAgICAgICAgd0RvYy5NYWluRG9jdW1lbnRQYXJ0Lk51bWJlcmluZ0RlZmluaXRpb25zUGFydC5QdXRYRG9jdW1lbnQobnBYRG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBHZXROZXh0TnVtSWQoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jLCBvdXQgaW50IG5leHROdW1JZCkKKyAgICAgICAgeworICAgICAgICAgICAgSW5pdGlhbGl6ZU51bWJlcmluZ1BhcnQod0RvYyk7CisgICAgICAgICAgICBOdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQgbnVtYmVyaW5nUGFydCA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQ7CisgICAgICAgICAgICBYRG9jdW1lbnQgbnVtYmVyaW5nWERvYyA9IG51bWJlcmluZ1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBuZXh0TnVtSWQgPSBudW1iZXJpbmdYRG9jLlJvb3QuRWxlbWVudHMoVy5udW0pLkF0dHJpYnV0ZXMoVy5udW1JZCkuU2VsZWN0KG5pID0+IChpbnQpbmkpLkNvbmNhdChuZXdbXSB7IDEgfSkuTWF4KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZWNpbWFsLCBsb3dlckxldHRlcgorICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgT3JkZXJlZExpc3RBYnN0cmFjdFhtbCA9CitAIjx3OmFic3RyYWN0TnVtIHc6YWJzdHJhY3ROdW1JZD0nezB9JyB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICAgIDx3Om11bHRpTGV2ZWxUeXBlIHc6dmFsPSdtdWx0aWxldmVsJy8+CisgICAgPHc6dG1wbCB3OnZhbD0nN0QyNjk1OUEnLz4KKyAgICA8dzpsdmwgdzppbHZsPScwJz4KKyAgICAgIDx3OnN0YXJ0IHc6dmFsPScxJy8+CisgICAgICA8dzpudW1GbXQgdzp2YWw9J3sxfScvPgorICAgICAgPHc6bHZsVGV4dCB3OnZhbD0nJTEuJy8+CisgICAgICA8dzpsdmxKYyB3OnZhbD0nezJ9Jy8+CisgICAgICA8dzpwUHI+CisgICAgICAgIDx3OnRhYnM+CisgICAgICAgICAgPHc6dGFiIHc6dmFsPSdudW0nCisgICAgICAgICAgICAgICAgIHc6cG9zPSc3MjAnLz4KKyAgICAgICAgPC93OnRhYnM+CisgICAgICAgIDx3OmluZCB3OmxlZnQ9JzcyMCcKKyAgICAgICAgICAgICAgIHc6aGFuZ2luZz0nMzYwJy8+CisgICAgICA8L3c6cFByPgorICAgIDwvdzpsdmw+CisgICAgPHc6bHZsIHc6aWx2bD0nMScKKyAgICAgICAgICAgdzp0ZW50YXRpdmU9JzEnPgorICAgICAgPHc6c3RhcnQgdzp2YWw9JzEnLz4KKyAgICAgIDx3Om51bUZtdCB3OnZhbD0nezN9Jy8+CisgICAgICA8dzpsdmxUZXh0IHc6dmFsPSclMi4nLz4KKyAgICAgIDx3Omx2bEpjIHc6dmFsPSd7NH0nLz4KKyAgICAgIDx3OnBQcj4KKyAgICAgICAgPHc6dGFicz4KKyAgICAgICAgICA8dzp0YWIgdzp2YWw9J251bScKKyAgICAgICAgICAgICAgICAgdzpwb3M9JzE0NDAnLz4KKyAgICAgICAgPC93OnRhYnM+CisgICAgICAgIDx3OmluZCB3OmxlZnQ9JzE0NDAnCisgICAgICAgICAgICAgICB3Omhhbmdpbmc9JzM2MCcvPgorICAgICAgPC93OnBQcj4KKyAgICA8L3c6bHZsPgorICAgIDx3Omx2bCB3Omlsdmw9JzInCisgICAgICAgICAgIHc6dGVudGF0aXZlPScxJz4KKyAgICAgIDx3OnN0YXJ0IHc6dmFsPScxJy8+CisgICAgICA8dzpudW1GbXQgdzp2YWw9J3s1fScvPgorICAgICAgPHc6bHZsVGV4dCB3OnZhbD0nJTMuJy8+CisgICAgICA8dzpsdmxKYyB3OnZhbD0nezZ9Jy8+CisgICAgICA8dzpwUHI+CisgICAgICAgIDx3OnRhYnM+CisgICAgICAgICAgPHc6dGFiIHc6dmFsPSdudW0nCisgICAgICAgICAgICAgICAgIHc6cG9zPScyMTYwJy8+CisgICAgICAgIDwvdzp0YWJzPgorICAgICAgICA8dzppbmQgdzpsZWZ0PScyMTYwJworICAgICAgICAgICAgICAgdzpoYW5naW5nPSczNjAnLz4KKyAgICAgIDwvdzpwUHI+CisgICAgPC93Omx2bD4KKyAgICA8dzpsdmwgdzppbHZsPSczJworICAgICAgICAgICB3OnRlbnRhdGl2ZT0nMSc+CisgICAgICA8dzpzdGFydCB3OnZhbD0nMScvPgorICAgICAgPHc6bnVtRm10IHc6dmFsPSd7N30nLz4KKyAgICAgIDx3Omx2bFRleHQgdzp2YWw9JyU0LicvPgorICAgICAgPHc6bHZsSmMgdzp2YWw9J3s4fScvPgorICAgICAgPHc6cFByPgorICAgICAgICA8dzp0YWJzPgorICAgICAgICAgIDx3OnRhYiB3OnZhbD0nbnVtJworICAgICAgICAgICAgICAgICB3OnBvcz0nMjg4MCcvPgorICAgICAgICA8L3c6dGFicz4KKyAgICAgICAgPHc6aW5kIHc6bGVmdD0nMjg4MCcKKyAgICAgICAgICAgICAgIHc6aGFuZ2luZz0nMzYwJy8+CisgICAgICA8L3c6cFByPgorICAgIDwvdzpsdmw+CisgICAgPHc6bHZsIHc6aWx2bD0nNCcKKyAgICAgICAgICAgdzp0ZW50YXRpdmU9JzEnPgorICAgICAgPHc6c3RhcnQgdzp2YWw9JzEnLz4KKyAgICAgIDx3Om51bUZtdCB3OnZhbD0nezl9Jy8+CisgICAgICA8dzpsdmxUZXh0IHc6dmFsPSclNS4nLz4KKyAgICAgIDx3Omx2bEpjIHc6dmFsPSd7MTB9Jy8+CisgICAgICA8dzpwUHI+CisgICAgICAgIDx3OnRhYnM+CisgICAgICAgICAgPHc6dGFiIHc6dmFsPSdudW0nCisgICAgICAgICAgICAgICAgIHc6cG9zPSczNjAwJy8+CisgICAgICAgIDwvdzp0YWJzPgorICAgICAgICA8dzppbmQgdzpsZWZ0PSczNjAwJworICAgICAgICAgICAgICAgdzpoYW5naW5nPSczNjAnLz4KKyAgICAgIDwvdzpwUHI+CisgICAgPC93Omx2bD4KKyAgICA8dzpsdmwgdzppbHZsPSc1JworICAgICAgICAgICB3OnRlbnRhdGl2ZT0nMSc+CisgICAgICA8dzpzdGFydCB3OnZhbD0nMScvPgorICAgICAgPHc6bnVtRm10IHc6dmFsPSd7MTF9Jy8+CisgICAgICA8dzpsdmxUZXh0IHc6dmFsPSclNi4nLz4KKyAgICAgIDx3Omx2bEpjIHc6dmFsPSd7MTJ9Jy8+CisgICAgICA8dzpwUHI+CisgICAgICAgIDx3OnRhYnM+CisgICAgICAgICAgPHc6dGFiIHc6dmFsPSdudW0nCisgICAgICAgICAgICAgICAgIHc6cG9zPSc0MzIwJy8+CisgICAgICAgIDwvdzp0YWJzPgorICAgICAgICA8dzppbmQgdzpsZWZ0PSc0MzIwJworICAgICAgICAgICAgICAgdzpoYW5naW5nPSczNjAnLz4KKyAgICAgIDwvdzpwUHI+CisgICAgPC93Omx2bD4KKyAgICA8dzpsdmwgdzppbHZsPSc2JworICAgICAgICAgICB3OnRlbnRhdGl2ZT0nMSc+CisgICAgICA8dzpzdGFydCB3OnZhbD0nMScvPgorICAgICAgPHc6bnVtRm10IHc6dmFsPSd7MTN9Jy8+CisgICAgICA8dzpsdmxUZXh0IHc6dmFsPSclNy4nLz4KKyAgICAgIDx3Omx2bEpjIHc6dmFsPSd7MTR9Jy8+CisgICAgICA8dzpwUHI+CisgICAgICAgIDx3OnRhYnM+CisgICAgICAgICAgPHc6dGFiIHc6dmFsPSdudW0nCisgICAgICAgICAgICAgICAgIHc6cG9zPSc1MDQwJy8+CisgICAgICAgIDwvdzp0YWJzPgorICAgICAgICA8dzppbmQgdzpsZWZ0PSc1MDQwJworICAgICAgICAgICAgICAgdzpoYW5naW5nPSczNjAnLz4KKyAgICAgIDwvdzpwUHI+CisgICAgPC93Omx2bD4KKyAgICA8dzpsdmwgdzppbHZsPSc3JworICAgICAgICAgICB3OnRlbnRhdGl2ZT0nMSc+CisgICAgICA8dzpzdGFydCB3OnZhbD0nMScvPgorICAgICAgPHc6bnVtRm10IHc6dmFsPSd7MTV9Jy8+CisgICAgICA8dzpsdmxUZXh0IHc6dmFsPSclOC4nLz4KKyAgICAgIDx3Omx2bEpjIHc6dmFsPSd7MTZ9Jy8+CisgICAgICA8dzpwUHI+CisgICAgICAgIDx3OnRhYnM+CisgICAgICAgICAgPHc6dGFiIHc6dmFsPSdudW0nCisgICAgICAgICAgICAgICAgIHc6cG9zPSc1NzYwJy8+CisgICAgICAgIDwvdzp0YWJzPgorICAgICAgICA8dzppbmQgdzpsZWZ0PSc1NzYwJworICAgICAgICAgICAgICAgdzpoYW5naW5nPSczNjAnLz4KKyAgICAgIDwvdzpwUHI+CisgICAgPC93Omx2bD4KKyAgICA8dzpsdmwgdzppbHZsPSc4JworICAgICAgICAgICB3OnRlbnRhdGl2ZT0nMSc+CisgICAgICA8dzpzdGFydCB3OnZhbD0nMScvPgorICAgICAgPHc6bnVtRm10IHc6dmFsPSd7MTd9Jy8+CisgICAgICA8dzpsdmxUZXh0IHc6dmFsPSclOS4nLz4KKyAgICAgIDx3Omx2bEpjIHc6dmFsPSd7MTh9Jy8+CisgICAgICA8dzpwUHI+CisgICAgICAgIDx3OnRhYnM+CisgICAgICAgICAgPHc6dGFiIHc6dmFsPSdudW0nCisgICAgICAgICAgICAgICAgIHc6cG9zPSc2NDgwJy8+CisgICAgICAgIDwvdzp0YWJzPgorICAgICAgICA8dzppbmQgdzpsZWZ0PSc2NDgwJworICAgICAgICAgICAgICAgdzpoYW5naW5nPSczNjAnLz4KKyAgICAgIDwvdzpwUHI+CisgICAgPC93Omx2bD4KKyAgPC93OmFic3RyYWN0TnVtPiI7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEJ1bGxldEFic3RyYWN0WG1sID0KK0AiPHc6YWJzdHJhY3ROdW0gdzphYnN0cmFjdE51bUlkPSd7MH0nIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbic+CisgIDx3Om11bHRpTGV2ZWxUeXBlIHc6dmFsPSdtdWx0aWxldmVsJyAvPgorICA8dzp0bXBsIHc6dmFsPScwMkJFQTBEQScgLz4KKyAgPHc6bHZsIHc6aWx2bD0nMCc+CisgICAgPHc6c3RhcnQgdzp2YWw9JzEnIC8+CisgICAgPHc6bnVtRm10IHc6dmFsPSdidWxsZXQnIC8+CisgICAgPHc6bHZsVGV4dCB3OnZhbD0n74K3JyAvPgorICAgIDx3Omx2bEpjIHc6dmFsPSdsZWZ0JyAvPgorICAgIDx3OnBQcj4KKyAgICAgIDx3OnRhYnM+CisgICAgICAgIDx3OnRhYiB3OnZhbD0nbnVtJyB3OnBvcz0nNzIwJyAvPgorICAgICAgPC93OnRhYnM+CisgICAgICA8dzppbmQgdzpsZWZ0PSc3MjAnIHc6aGFuZ2luZz0nMzYwJyAvPgorICAgIDwvdzpwUHI+CisgICAgPHc6clByPgorICAgICAgPHc6ckZvbnRzIHc6YXNjaWk9J1N5bWJvbCcgdzpoQW5zaT0nU3ltYm9sJyB3OmhpbnQ9J2RlZmF1bHQnIC8+CisgICAgICA8dzpzeiB3OnZhbD0nMjAnIC8+CisgICAgPC93OnJQcj4KKyAgPC93Omx2bD4KKyAgPHc6bHZsIHc6aWx2bD0nMSc+CisgICAgPHc6c3RhcnQgdzp2YWw9JzEnIC8+CisgICAgPHc6bnVtRm10IHc6dmFsPSdidWxsZXQnIC8+CisgICAgPHc6bHZsVGV4dCB3OnZhbD0nbycgLz4KKyAgICA8dzpsdmxKYyB3OnZhbD0nbGVmdCcgLz4KKyAgICA8dzpwUHI+CisgICAgICA8dzp0YWJzPgorICAgICAgICA8dzp0YWIgdzp2YWw9J251bScgdzpwb3M9JzE0NDAnIC8+CisgICAgICA8L3c6dGFicz4KKyAgICAgIDx3OmluZCB3OmxlZnQ9JzE0NDAnIHc6aGFuZ2luZz0nMzYwJyAvPgorICAgIDwvdzpwUHI+CisgICAgPHc6clByPgorICAgICAgPHc6ckZvbnRzIHc6YXNjaWk9J0NvdXJpZXIgTmV3JyB3OmhBbnNpPSdDb3VyaWVyIE5ldycgdzpoaW50PSdkZWZhdWx0JyAvPgorICAgICAgPHc6c3ogdzp2YWw9JzIwJyAvPgorICAgIDwvdzpyUHI+CisgIDwvdzpsdmw+CisgIDx3Omx2bCB3Omlsdmw9JzInIHc6dGVudGF0aXZlPScxJz4KKyAgICA8dzpzdGFydCB3OnZhbD0nMScgLz4KKyAgICA8dzpudW1GbXQgdzp2YWw9J2J1bGxldCcgLz4KKyAgICA8dzpsdmxUZXh0IHc6dmFsPSfvgqcnIC8+CisgICAgPHc6bHZsSmMgdzp2YWw9J2xlZnQnIC8+CisgICAgPHc6cFByPgorICAgICAgPHc6dGFicz4KKyAgICAgICAgPHc6dGFiIHc6dmFsPSdudW0nIHc6cG9zPScyMTYwJyAvPgorICAgICAgPC93OnRhYnM+CisgICAgICA8dzppbmQgdzpsZWZ0PScyMTYwJyB3Omhhbmdpbmc9JzM2MCcgLz4KKyAgICA8L3c6cFByPgorICAgIDx3OnJQcj4KKyAgICAgIDx3OnJGb250cyB3OmFzY2lpPSdXaW5nZGluZ3MnIHc6aEFuc2k9J1dpbmdkaW5ncycgdzpoaW50PSdkZWZhdWx0JyAvPgorICAgICAgPHc6c3ogdzp2YWw9JzIwJyAvPgorICAgIDwvdzpyUHI+CisgIDwvdzpsdmw+CisgIDx3Omx2bCB3Omlsdmw9JzMnIHc6dGVudGF0aXZlPScxJz4KKyAgICA8dzpzdGFydCB3OnZhbD0nMScgLz4KKyAgICA8dzpudW1GbXQgdzp2YWw9J2J1bGxldCcgLz4KKyAgICA8dzpsdmxUZXh0IHc6dmFsPSfvgqcnIC8+CisgICAgPHc6bHZsSmMgdzp2YWw9J2xlZnQnIC8+CisgICAgPHc6cFByPgorICAgICAgPHc6dGFicz4KKyAgICAgICAgPHc6dGFiIHc6dmFsPSdudW0nIHc6cG9zPScyODgwJyAvPgorICAgICAgPC93OnRhYnM+CisgICAgICA8dzppbmQgdzpsZWZ0PScyODgwJyB3Omhhbmdpbmc9JzM2MCcgLz4KKyAgICA8L3c6cFByPgorICAgIDx3OnJQcj4KKyAgICAgIDx3OnJGb250cyB3OmFzY2lpPSdXaW5nZGluZ3MnIHc6aEFuc2k9J1dpbmdkaW5ncycgdzpoaW50PSdkZWZhdWx0JyAvPgorICAgICAgPHc6c3ogdzp2YWw9JzIwJyAvPgorICAgIDwvdzpyUHI+CisgIDwvdzpsdmw+CisgIDx3Omx2bCB3Omlsdmw9JzQnIHc6dGVudGF0aXZlPScxJz4KKyAgICA8dzpzdGFydCB3OnZhbD0nMScgLz4KKyAgICA8dzpudW1GbXQgdzp2YWw9J2J1bGxldCcgLz4KKyAgICA8dzpsdmxUZXh0IHc6dmFsPSfvgqcnIC8+CisgICAgPHc6bHZsSmMgdzp2YWw9J2xlZnQnIC8+CisgICAgPHc6cFByPgorICAgICAgPHc6dGFicz4KKyAgICAgICAgPHc6dGFiIHc6dmFsPSdudW0nIHc6cG9zPSczNjAwJyAvPgorICAgICAgPC93OnRhYnM+CisgICAgICA8dzppbmQgdzpsZWZ0PSczNjAwJyB3Omhhbmdpbmc9JzM2MCcgLz4KKyAgICA8L3c6cFByPgorICAgIDx3OnJQcj4KKyAgICAgIDx3OnJGb250cyB3OmFzY2lpPSdXaW5nZGluZ3MnIHc6aEFuc2k9J1dpbmdkaW5ncycgdzpoaW50PSdkZWZhdWx0JyAvPgorICAgICAgPHc6c3ogdzp2YWw9JzIwJyAvPgorICAgIDwvdzpyUHI+CisgIDwvdzpsdmw+CisgIDx3Omx2bCB3Omlsdmw9JzUnIHc6dGVudGF0aXZlPScxJz4KKyAgICA8dzpzdGFydCB3OnZhbD0nMScgLz4KKyAgICA8dzpudW1GbXQgdzp2YWw9J2J1bGxldCcgLz4KKyAgICA8dzpsdmxUZXh0IHc6dmFsPSfvgqcnIC8+CisgICAgPHc6bHZsSmMgdzp2YWw9J2xlZnQnIC8+CisgICAgPHc6cFByPgorICAgICAgPHc6dGFicz4KKyAgICAgICAgPHc6dGFiIHc6dmFsPSdudW0nIHc6cG9zPSc0MzIwJyAvPgorICAgICAgPC93OnRhYnM+CisgICAgICA8dzppbmQgdzpsZWZ0PSc0MzIwJyB3Omhhbmdpbmc9JzM2MCcgLz4KKyAgICA8L3c6cFByPgorICAgIDx3OnJQcj4KKyAgICAgIDx3OnJGb250cyB3OmFzY2lpPSdXaW5nZGluZ3MnIHc6aEFuc2k9J1dpbmdkaW5ncycgdzpoaW50PSdkZWZhdWx0JyAvPgorICAgICAgPHc6c3ogdzp2YWw9JzIwJyAvPgorICAgIDwvdzpyUHI+CisgIDwvdzpsdmw+CisgIDx3Omx2bCB3Omlsdmw9JzYnIHc6dGVudGF0aXZlPScxJz4KKyAgICA8dzpzdGFydCB3OnZhbD0nMScgLz4KKyAgICA8dzpudW1GbXQgdzp2YWw9J2J1bGxldCcgLz4KKyAgICA8dzpsdmxUZXh0IHc6dmFsPSfvgqcnIC8+CisgICAgPHc6bHZsSmMgdzp2YWw9J2xlZnQnIC8+CisgICAgPHc6cFByPgorICAgICAgPHc6dGFicz4KKyAgICAgICAgPHc6dGFiIHc6dmFsPSdudW0nIHc6cG9zPSc1MDQwJyAvPgorICAgICAgPC93OnRhYnM+CisgICAgICA8dzppbmQgdzpsZWZ0PSc1MDQwJyB3Omhhbmdpbmc9JzM2MCcgLz4KKyAgICA8L3c6cFByPgorICAgIDx3OnJQcj4KKyAgICAgIDx3OnJGb250cyB3OmFzY2lpPSdXaW5nZGluZ3MnIHc6aEFuc2k9J1dpbmdkaW5ncycgdzpoaW50PSdkZWZhdWx0JyAvPgorICAgICAgPHc6c3ogdzp2YWw9JzIwJyAvPgorICAgIDwvdzpyUHI+CisgIDwvdzpsdmw+CisgIDx3Omx2bCB3Omlsdmw9JzcnIHc6dGVudGF0aXZlPScxJz4KKyAgICA8dzpzdGFydCB3OnZhbD0nMScgLz4KKyAgICA8dzpudW1GbXQgdzp2YWw9J2J1bGxldCcgLz4KKyAgICA8dzpsdmxUZXh0IHc6dmFsPSfvgqcnIC8+CisgICAgPHc6bHZsSmMgdzp2YWw9J2xlZnQnIC8+CisgICAgPHc6cFByPgorICAgICAgPHc6dGFicz4KKyAgICAgICAgPHc6dGFiIHc6dmFsPSdudW0nIHc6cG9zPSc1NzYwJyAvPgorICAgICAgPC93OnRhYnM+CisgICAgICA8dzppbmQgdzpsZWZ0PSc1NzYwJyB3Omhhbmdpbmc9JzM2MCcgLz4KKyAgICA8L3c6cFByPgorICAgIDx3OnJQcj4KKyAgICAgIDx3OnJGb250cyB3OmFzY2lpPSdXaW5nZGluZ3MnIHc6aEFuc2k9J1dpbmdkaW5ncycgdzpoaW50PSdkZWZhdWx0JyAvPgorICAgICAgPHc6c3ogdzp2YWw9JzIwJyAvPgorICAgIDwvdzpyUHI+CisgIDwvdzpsdmw+CisgIDx3Omx2bCB3Omlsdmw9JzgnIHc6dGVudGF0aXZlPScxJz4KKyAgICA8dzpzdGFydCB3OnZhbD0nMScgLz4KKyAgICA8dzpudW1GbXQgdzp2YWw9J2J1bGxldCcgLz4KKyAgICA8dzpsdmxUZXh0IHc6dmFsPSfvgqcnIC8+CisgICAgPHc6bHZsSmMgdzp2YWw9J2xlZnQnIC8+CisgICAgPHc6cFByPgorICAgICAgPHc6dGFicz4KKyAgICAgICAgPHc6dGFiIHc6dmFsPSdudW0nIHc6cG9zPSc2NDgwJyAvPgorICAgICAgPC93OnRhYnM+CisgICAgICA8dzppbmQgdzpsZWZ0PSc2NDgwJyB3Omhhbmdpbmc9JzM2MCcgLz4KKyAgICA8L3c6cFByPgorICAgIDx3OnJQcj4KKyAgICAgIDx3OnJGb250cyB3OmFzY2lpPSdXaW5nZGluZ3MnIHc6aEFuc2k9J1dpbmdkaW5ncycgdzpoaW50PSdkZWZhdWx0JyAvPgorICAgICAgPHc6c3ogdzp2YWw9JzIwJyAvPgorICAgIDwvdzpyUHI+CisgIDwvdzpsdmw+Cis8L3c6YWJzdHJhY3ROdW0+IjsKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVXBkYXRlTnVtYmVyaW5nUGFydChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIFhFbGVtZW50IGh0bWwsIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBJbml0aWFsaXplTnVtYmVyaW5nUGFydCh3RG9jKTsKKyAgICAgICAgICAgIE51bWJlcmluZ0RlZmluaXRpb25zUGFydCBudW1iZXJpbmdQYXJ0ID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0Lk51bWJlcmluZ0RlZmluaXRpb25zUGFydDsKKyAgICAgICAgICAgIFhEb2N1bWVudCBudW1iZXJpbmdYRG9jID0gbnVtYmVyaW5nUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIGludCBuZXh0QWJzdHJhY3RJZCwgbmV4dE51bUlkOworICAgICAgICAgICAgbmV4dE51bUlkID0gbnVtYmVyaW5nWERvYy5Sb290LkVsZW1lbnRzKFcubnVtKS5BdHRyaWJ1dGVzKFcubnVtSWQpLlNlbGVjdChuaSA9PiAoaW50KW5pKS5Db25jYXQobmV3W10geyAxIH0pLk1heCgpOworICAgICAgICAgICAgbmV4dEFic3RyYWN0SWQgPSBudW1iZXJpbmdYRG9jLlJvb3QuRWxlbWVudHMoVy5hYnN0cmFjdE51bSkuQXR0cmlidXRlcyhXLmFic3RyYWN0TnVtSWQpLlNlbGVjdChhbmkgPT4gKGludClhbmkpLkNvbmNhdChuZXdbXSB7IDAgfSkuTWF4KCk7CisgICAgICAgICAgICB2YXIgbnVtYmVyaW5nRWxlbWVudHMgPSBodG1sLkRlc2NlbmRhbnRzQW5kU2VsZigpLldoZXJlKGQgPT4gZC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2Uub2wgfHwgZC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UudWwpLlRvTGlzdCgpOworCisgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBudW1Ub0Fic3RyYWN0TnVtID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CisKKyAgICAgICAgICAgIC8vIGFkZCBhYnN0cmFjdCBudW1iZXJpbmcgZWxlbWVudHMKKyAgICAgICAgICAgIGludCBjdXJyZW50TnVtSWQgPSBuZXh0TnVtSWQ7CisgICAgICAgICAgICBpbnQgY3VycmVudEFic3RyYWN0SWQgPSBuZXh0QWJzdHJhY3RJZDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBsaXN0IGluIG51bWJlcmluZ0VsZW1lbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEh0bWxUb1dtbENvbnZlcnRlckNvcmUuTnVtYmVyZWRJdGVtQW5ub3RhdGlvbiBuaWEgPSBsaXN0LkFubm90YXRpb248SHRtbFRvV21sQ29udmVydGVyQ29yZS5OdW1iZXJlZEl0ZW1Bbm5vdGF0aW9uPigpOworICAgICAgICAgICAgICAgIGlmICghbnVtVG9BYnN0cmFjdE51bS5Db250YWluc0tleShuaWEubnVtSWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtVG9BYnN0cmFjdE51bS5BZGQobmlhLm51bUlkLCBjdXJyZW50QWJzdHJhY3RJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS51bCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgYnVsbGV0QWJzdHJhY3QgPSBYRWxlbWVudC5QYXJzZShTdHJpbmcuRm9ybWF0KEJ1bGxldEFic3RyYWN0WG1sLCBjdXJyZW50QWJzdHJhY3RJZCsrKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJpbmdYRG9jLlJvb3QuQWRkKGJ1bGxldEFic3RyYWN0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGlzdC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2Uub2wpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1tdIG51bUZtdCA9IG5ldyBzdHJpbmdbOV07CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdbXSBqdXN0ID0gbmV3IHN0cmluZ1s5XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRm10Lkxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZtdFtpXSA9ICJkZWNpbWFsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0W2ldID0gImxlZnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGl0ZW1BdExldmVsID0gbnVtYmVyaW5nRWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KG5mID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0bWxUb1dtbENvbnZlcnRlckNvcmUuTnVtYmVyZWRJdGVtQW5ub3RhdGlvbiBuID0gbmYuQW5ub3RhdGlvbjxIdG1sVG9XbWxDb252ZXJ0ZXJDb3JlLk51bWJlcmVkSXRlbUFubm90YXRpb24+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAhPSBudWxsICYmIG4ubnVtSWQgPT0gbmlhLm51bUlkICYmIG4uaWx2bCA9PSBpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUF0TGV2ZWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0bWxUb1dtbENvbnZlcnRlckNvcmUuTnVtYmVyZWRJdGVtQW5ub3RhdGlvbiB0aGlzTGV2ZWxOaWEgPSBpdGVtQXRMZXZlbC5Bbm5vdGF0aW9uPEh0bWxUb1dtbENvbnZlcnRlckNvcmUuTnVtYmVyZWRJdGVtQW5ub3RhdGlvbj4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNMZXZlbE51bUZtdCA9IHRoaXNMZXZlbE5pYS5saXN0U3R5bGVUeXBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc0xldmVsTnVtRm10ID09ICJsb3dlci1hbHBoYSIgfHwgdGhpc0xldmVsTnVtRm10ID09ICJsb3dlci1sYXRpbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZtdFtpXSA9ICJsb3dlckxldHRlciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2p1c3RbaV0gPSAibGVmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNMZXZlbE51bUZtdCA9PSAidXBwZXItYWxwaGEiIHx8IHRoaXNMZXZlbE51bUZtdCA9PSAidXBwZXItbGF0aW4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GbXRbaV0gPSAidXBwZXJMZXR0ZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9qdXN0W2ldID0gImxlZnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzTGV2ZWxOdW1GbXQgPT0gImRlY2ltYWwtbGVhZGluZy16ZXJvIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRm10W2ldID0gImRlY2ltYWxaZXJvIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vanVzdFtpXSA9ICJsZWZ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc0xldmVsTnVtRm10ID09ICJsb3dlci1yb21hbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZtdFtpXSA9ICJsb3dlclJvbWFuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RbaV0gPSAicmlnaHQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzTGV2ZWxOdW1GbXQgPT0gInVwcGVyLXJvbWFuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRm10W2ldID0gInVwcGVyUm9tYW4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdFtpXSA9ICJyaWdodCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHNpbXBsZU51bUFic3RyYWN0ID0gWEVsZW1lbnQuUGFyc2UoU3RyaW5nLkZvcm1hdChPcmRlcmVkTGlzdEFic3RyYWN0WG1sLCBjdXJyZW50QWJzdHJhY3RJZCsrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZtdFswXSwganVzdFswXSwgbnVtRm10WzFdLCBqdXN0WzFdLCBudW1GbXRbMl0sIGp1c3RbMl0sIG51bUZtdFszXSwganVzdFszXSwgbnVtRm10WzRdLCBqdXN0WzRdLCBudW1GbXRbNV0sIGp1c3RbNV0sIG51bUZtdFs2XSwganVzdFs2XSwgbnVtRm10WzddLCBqdXN0WzddLCBudW1GbXRbOF0sIGp1c3RbOF0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcmluZ1hEb2MuUm9vdC5BZGQoc2ltcGxlTnVtQWJzdHJhY3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgbGlzdCBpbiBudW1Ub0Fic3RyYWN0TnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG51bWJlcmluZ1hEb2MuUm9vdC5BZGQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLm51bSwgbmV3IFhBdHRyaWJ1dGUoVy5udW1JZCwgbGlzdC5LZXkpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5hYnN0cmFjdE51bUlkLCBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgbGlzdC5WYWx1ZSkpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdEb2MuTWFpbkRvY3VtZW50UGFydC5OdW1iZXJpbmdEZWZpbml0aW9uc1BhcnQuUHV0WERvY3VtZW50KCk7CisjaWYgZmFsc2UKKyAgPHc6bnVtIHc6bnVtSWQ9JzEnPgorICAgIDx3OmFic3RyYWN0TnVtSWQgdzp2YWw9JzAnLz4KKyAgPC93Om51bT4KKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgU3R5bGVzVXBkYXRlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFVwZGF0ZVN0eWxlc1BhcnQoCisgICAgICAgICAgICBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsCisgICAgICAgICAgICBYRWxlbWVudCBodG1sLAorICAgICAgICAgICAgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MsCisgICAgICAgICAgICBDc3NEb2N1bWVudCBkZWZhdWx0Q3NzRG9jLAorICAgICAgICAgICAgQ3NzRG9jdW1lbnQgYXV0aG9yQ3NzRG9jLAorICAgICAgICAgICAgQ3NzRG9jdW1lbnQgdXNlckNzc0RvYykKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IHN0eWxlWERvYyA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5TdHlsZURlZmluaXRpb25zUGFydC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgaWYgKHNldHRpbmdzLkRlZmF1bHRTcGFjaW5nRWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IHNwYWNpbmdFbGVtZW50ID0gc3R5bGVYRG9jLlJvb3QuRWxlbWVudHMoVy5kb2NEZWZhdWx0cykuRWxlbWVudHMoVy5wUHJEZWZhdWx0KS5FbGVtZW50cyhXLnBQcikuRWxlbWVudHMoVy5zcGFjaW5nKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmIChzcGFjaW5nRWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzcGFjaW5nRWxlbWVudC5SZXBsYWNlV2l0aChzZXR0aW5ncy5EZWZhdWx0U3BhY2luZ0VsZW1lbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgY2xhc3NlcyA9IGh0bWwKKyAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNBbmRTZWxmKCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBkLkF0dHJpYnV0ZShYaHRtbE5vTmFtZXNwYWNlLl9jbGFzcykgIT0gbnVsbCAmJiAoKHN0cmluZylkLkF0dHJpYnV0ZShYaHRtbE5vTmFtZXNwYWNlLl9jbGFzcykpLlNwbGl0KCkuTGVuZ3RoID09IDEpCisgICAgICAgICAgICAgICAgLlNlbGVjdChkID0+IChzdHJpbmcpZC5BdHRyaWJ1dGUoWGh0bWxOb05hbWVzcGFjZS5fY2xhc3MpKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gY2xhc3NlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3N0cmluZyBpdGVtID0gIm1zLXJ0ZVN0eWxlLUJ5bGluZSI7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJ1bGVTZXQgaW4gYXV0aG9yQ3NzRG9jLlJ1bGVTZXRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9yID0gcnVsZVNldC5TZWxlY3RvcnMuV2hlcmUoCisgICAgICAgICAgICAgICAgICAgICAgICBzZWwgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvdW5kID0gc2VsLlNpbXBsZVNlbGVjdG9ycy5Db3VudCgpID09IDEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsLlNpbXBsZVNlbGVjdG9ycy5GaXJzdCgpLkNsYXNzID09IGl0ZW0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbC5TaW1wbGVTZWxlY3RvcnMuRmlyc3QoKS5FbGVtZW50TmFtZSA9PSAiIiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWwuU2ltcGxlU2VsZWN0b3JzLkZpcnN0KCkuRWxlbWVudE5hbWUgPT0gbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kOworICAgICAgICAgICAgICAgICAgICAgICAgfSkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNvbG9yID0gcnVsZVNldC5EZWNsYXJhdGlvbnMuRmlyc3RPckRlZmF1bHQoZCA9PiBkLk5hbWUgPT0gImNvbG9yIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0NvbnNvbGUuV3JpdGVMaW5lKCJmb3VuZCBydWxlc2V0IGFuZCBzZWxlY3RvciBmb3IgezB9IiwgaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGVOYW1lID0gaXRlbS5Ub0xvd2VyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdTdHlsZSA9IG5ldyBYRWxlbWVudChXLnN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcudHlwZSwgInBhcmFncmFwaCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuY3VzdG9tU3R5bGUsICIxIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5zdHlsZUlkLCBzdHlsZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLm5hbWUsIG5ldyBYQXR0cmlidXRlKFcudmFsLCBzdHlsZU5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5iYXNlZE9uLCBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgIk5vcm1hbCIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5wUHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnNwYWNpbmcsIG5ldyBYQXR0cmlidXRlKFcuYmVmb3JlLCAiMTAwIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmJlZm9yZUF1dG9zcGFjaW5nLCAiMSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5hZnRlciwgIjEwMCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5hZnRlckF1dG9zcGFjaW5nLCAiMSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5saW5lLCAiMjQwIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmxpbmVSdWxlLCAiYXV0byIpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuclByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yRm9udHMsIG5ldyBYQXR0cmlidXRlKFcuYXNjaWksICJUaW1lcyBOZXcgUm9tYW4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuZWFzdEFzaWFUaGVtZSwgIm1pbm9yRWFzdEFzaWEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuaEFuc2ksICJUaW1lcyBOZXcgUm9tYW4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuY3MsICJUaW1lcyBOZXcgUm9tYW4iKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICE9IG51bGwgPyBuZXcgWEVsZW1lbnQoVy5jb2xvciwgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJ0aGlzIHNob3VsZCBiZSBhIGNvbG9yIikpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuc3osIG5ldyBYQXR0cmlidXRlKFcudmFsLCAiMjQiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnN6Q3MsIG5ldyBYQXR0cmlidXRlKFcudmFsLCAiMjQiKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy50eXBlKSA9PSAicGFyYWdyYXBoIiAmJiAoKHN0cmluZyllLkF0dHJpYnV0ZShXLnN0eWxlSWQpKS5Ub0xvd2VyKCkgPT0gc3R5bGVOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVYRG9jLlJvb3QuQWRkKG5ld1N0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGh0bWwuRGVzY2VuZGFudHMoWGh0bWxOb05hbWVzcGFjZS5oMSkuQW55KCkpCisgICAgICAgICAgICAgICAgUHRVdGlscy5BZGRFbGVtZW50SWZNaXNzaW5nKHN0eWxlWERvYywKKyAgICAgICAgICAgICAgICAgICAgc3R5bGVYRG9jCisgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcudHlwZSkgPT0gInBhcmFncmFwaCIgJiYgKHN0cmluZyllLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09ICJIZWFkaW5nMSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKSwKK0AiPHc6c3R5bGUgdzp0eXBlPSdwYXJhZ3JhcGgnCisgICAgICAgIHc6c3R5bGVJZD0nSGVhZGluZzEnCisgICAgICAgIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbic+CisgICAgPHc6bmFtZSB3OnZhbD0naGVhZGluZyAxJy8+CisgICAgPHc6YmFzZWRPbiB3OnZhbD0nTm9ybWFsJy8+CisgICAgPHc6bmV4dCB3OnZhbD0nTm9ybWFsJy8+CisgICAgPHc6bGluayB3OnZhbD0nSGVhZGluZzFDaGFyJy8+CisgICAgPHc6dWlQcmlvcml0eSB3OnZhbD0nOScvPgorICAgIDx3OnFGb3JtYXQvPgorICAgIDx3OnBQcj4KKyAgICA8dzprZWVwTmV4dC8+CisgICAgPHc6a2VlcExpbmVzLz4KKyAgICA8dzpzcGFjaW5nIHc6YmVmb3JlPSc0ODAnCisgICAgICAgICAgICAgICAgdzphZnRlcj0nMCcvPgorICAgIDx3Om91dGxpbmVMdmwgdzp2YWw9JzAnLz4KKyAgICA8L3c6cFByPgorICAgIDx3OnJQcj4KKyAgICA8dzpyRm9udHMgdzphc2NpaVRoZW1lPSdtYWpvckhBbnNpJworICAgICAgICAgICAgICAgIHc6ZWFzdEFzaWFUaGVtZT0nbWFqb3JFYXN0QXNpYScKKyAgICAgICAgICAgICAgICB3OmhBbnNpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgICAgdzpjc3RoZW1lPSdtYWpvckJpZGknLz4KKyAgICA8dzpiLz4KKyAgICA8dzpiQ3MvPgorICAgIDx3OmNvbG9yIHc6dmFsPSczNjVGOTEnCisgICAgICAgICAgICAgICAgdzp0aGVtZUNvbG9yPSdhY2NlbnQxJworICAgICAgICAgICAgICAgIHc6dGhlbWVTaGFkZT0nQkYnLz4KKyAgICA8dzpzeiB3OnZhbD0nMjgnLz4KKyAgICA8dzpzekNzIHc6dmFsPScyOCcvPgorICAgIDwvdzpyUHI+Cis8L3c6c3R5bGU+Iik7CisKKyAgICAgICAgICAgIGlmIChodG1sLkRlc2NlbmRhbnRzKFhodG1sTm9OYW1lc3BhY2UuaDIpLkFueSgpKQorICAgICAgICAgICAgICAgIFB0VXRpbHMuQWRkRWxlbWVudElmTWlzc2luZyhzdHlsZVhEb2MsCisgICAgICAgICAgICAgICAgICAgIHN0eWxlWERvYworICAgICAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gKHN0cmluZyllLkF0dHJpYnV0ZShXLnR5cGUpID09ICJwYXJhZ3JhcGgiICYmIChzdHJpbmcpZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKSA9PSAiSGVhZGluZzIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCksCitAIjx3OnN0eWxlIHc6dHlwZT0ncGFyYWdyYXBoJworICAgICAgICAgdzpzdHlsZUlkPSdIZWFkaW5nMicKKyAgICAgICAgIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbic+CisgIDx3Om5hbWUgdzp2YWw9J2hlYWRpbmcgMicvPgorICA8dzpiYXNlZE9uIHc6dmFsPSdOb3JtYWwnLz4KKyAgPHc6bmV4dCB3OnZhbD0nTm9ybWFsJy8+CisgIDx3Omxpbmsgdzp2YWw9J0hlYWRpbmcyQ2hhcicvPgorICA8dzp1aVByaW9yaXR5IHc6dmFsPSc5Jy8+CisgIDx3OnVuaGlkZVdoZW5Vc2VkLz4KKyAgPHc6cUZvcm1hdC8+CisgIDx3OnBQcj4KKyAgICA8dzprZWVwTmV4dC8+CisgICAgPHc6a2VlcExpbmVzLz4KKyAgICA8dzpzcGFjaW5nIHc6YmVmb3JlPScyMDAnCisgICAgICAgICAgICAgICB3OmFmdGVyPScwJy8+CisgICAgPHc6b3V0bGluZUx2bCB3OnZhbD0nMScvPgorICA8L3c6cFByPgorICA8dzpyUHI+CisgICAgPHc6ckZvbnRzIHc6YXNjaWlUaGVtZT0nbWFqb3JIQW5zaScKKyAgICAgICAgICAgICAgdzplYXN0QXNpYVRoZW1lPSdtYWpvckVhc3RBc2lhJworICAgICAgICAgICAgICB3OmhBbnNpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgIHc6Y3N0aGVtZT0nbWFqb3JCaWRpJy8+CisgICAgPHc6Yi8+CisgICAgPHc6YkNzLz4KKyAgICA8dzpjb2xvciB3OnZhbD0nNEY4MUJEJworICAgICAgICAgICAgIHc6dGhlbWVDb2xvcj0nYWNjZW50MScvPgorICAgIDx3OnN6IHc6dmFsPScyNicvPgorICAgIDx3OnN6Q3Mgdzp2YWw9JzI2Jy8+CisgIDwvdzpyUHI+Cis8L3c6c3R5bGU+Iik7CisKKyAgICAgICAgICAgIGlmIChodG1sLkRlc2NlbmRhbnRzKFhodG1sTm9OYW1lc3BhY2UuaDMpLkFueSgpKQorICAgICAgICAgICAgICAgIFB0VXRpbHMuQWRkRWxlbWVudElmTWlzc2luZyhzdHlsZVhEb2MsCisgICAgICAgICAgICAgICAgc3R5bGVYRG9jCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcudHlwZSkgPT0gInBhcmFncmFwaCIgJiYgKHN0cmluZyllLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09ICJIZWFkaW5nMyIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorQCI8dzpzdHlsZSB3OnR5cGU9J3BhcmFncmFwaCcKKyAgICAgICAgIHc6c3R5bGVJZD0nSGVhZGluZzMnCisgICAgICAgICB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICA8dzpuYW1lIHc6dmFsPSdoZWFkaW5nIDMnLz4KKyAgPHc6YmFzZWRPbiB3OnZhbD0nTm9ybWFsJy8+CisgIDx3Om5leHQgdzp2YWw9J05vcm1hbCcvPgorICA8dzpsaW5rIHc6dmFsPSdIZWFkaW5nM0NoYXInLz4KKyAgPHc6dWlQcmlvcml0eSB3OnZhbD0nOScvPgorICA8dzp1bmhpZGVXaGVuVXNlZC8+CisgIDx3OnFGb3JtYXQvPgorICA8dzpwUHI+CisgICAgPHc6a2VlcE5leHQvPgorICAgIDx3OmtlZXBMaW5lcy8+CisgICAgPHc6c3BhY2luZyB3OmJlZm9yZT0nMjAwJworICAgICAgICAgICAgICAgdzphZnRlcj0nMCcvPgorICAgIDx3Om91dGxpbmVMdmwgdzp2YWw9JzInLz4KKyAgPC93OnBQcj4KKyAgPHc6clByPgorICAgIDx3OnJGb250cyB3OmFzY2lpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgIHc6ZWFzdEFzaWFUaGVtZT0nbWFqb3JFYXN0QXNpYScKKyAgICAgICAgICAgICAgdzpoQW5zaVRoZW1lPSdtYWpvckhBbnNpJworICAgICAgICAgICAgICB3OmNzdGhlbWU9J21ham9yQmlkaScvPgorICAgIDx3OmIvPgorICAgIDx3OmJDcy8+CisgICAgPHc6Y29sb3Igdzp2YWw9JzRGODFCRCcKKyAgICAgICAgICAgICB3OnRoZW1lQ29sb3I9J2FjY2VudDEnLz4KKyAgPC93OnJQcj4KKzwvdzpzdHlsZT4iKTsKKworICAgICAgICAgICAgaWYgKGh0bWwuRGVzY2VuZGFudHMoWGh0bWxOb05hbWVzcGFjZS5oNCkuQW55KCkpCisgICAgICAgICAgICAgICAgUHRVdGlscy5BZGRFbGVtZW50SWZNaXNzaW5nKHN0eWxlWERvYywKKyAgICAgICAgICAgICAgICBzdHlsZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy50eXBlKSA9PSAicGFyYWdyYXBoIiAmJiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gIkhlYWRpbmc0IikKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCksCitAIjx3OnN0eWxlIHc6dHlwZT0ncGFyYWdyYXBoJworICAgICAgICAgdzpzdHlsZUlkPSdIZWFkaW5nNCcKKyAgICAgICAgIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbic+CisgIDx3Om5hbWUgdzp2YWw9J2hlYWRpbmcgNCcvPgorICA8dzpiYXNlZE9uIHc6dmFsPSdOb3JtYWwnLz4KKyAgPHc6bmV4dCB3OnZhbD0nTm9ybWFsJy8+CisgIDx3Omxpbmsgdzp2YWw9J0hlYWRpbmc0Q2hhcicvPgorICA8dzp1aVByaW9yaXR5IHc6dmFsPSc5Jy8+CisgIDx3OnVuaGlkZVdoZW5Vc2VkLz4KKyAgPHc6cUZvcm1hdC8+CisgIDx3OnBQcj4KKyAgICA8dzprZWVwTmV4dC8+CisgICAgPHc6a2VlcExpbmVzLz4KKyAgICA8dzpzcGFjaW5nIHc6YmVmb3JlPScyMDAnCisgICAgICAgICAgICAgICB3OmFmdGVyPScwJy8+CisgICAgPHc6b3V0bGluZUx2bCB3OnZhbD0nMycvPgorICA8L3c6cFByPgorICA8dzpyUHI+CisgICAgPHc6ckZvbnRzIHc6YXNjaWlUaGVtZT0nbWFqb3JIQW5zaScKKyAgICAgICAgICAgICAgdzplYXN0QXNpYVRoZW1lPSdtYWpvckVhc3RBc2lhJworICAgICAgICAgICAgICB3OmhBbnNpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgIHc6Y3N0aGVtZT0nbWFqb3JCaWRpJy8+CisgICAgPHc6Yi8+CisgICAgPHc6YkNzLz4KKyAgICA8dzppLz4KKyAgICA8dzppQ3MvPgorICAgIDx3OmNvbG9yIHc6dmFsPSc0RjgxQkQnCisgICAgICAgICAgICAgdzp0aGVtZUNvbG9yPSdhY2NlbnQxJy8+CisgIDwvdzpyUHI+Cis8L3c6c3R5bGU+Iik7CisKKyAgICAgICAgICAgIGlmIChodG1sLkRlc2NlbmRhbnRzKFhodG1sTm9OYW1lc3BhY2UuaDUpLkFueSgpKQorICAgICAgICAgICAgICAgIFB0VXRpbHMuQWRkRWxlbWVudElmTWlzc2luZyhzdHlsZVhEb2MsCisgICAgICAgICAgICAgICAgc3R5bGVYRG9jCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcudHlwZSkgPT0gInBhcmFncmFwaCIgJiYgKHN0cmluZyllLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09ICJIZWFkaW5nNSIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorQCI8dzpzdHlsZSB3OnR5cGU9J3BhcmFncmFwaCcKKyAgICAgICAgIHc6c3R5bGVJZD0nSGVhZGluZzUnCisgICAgICAgICB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICA8dzpuYW1lIHc6dmFsPSdoZWFkaW5nIDUnLz4KKyAgPHc6YmFzZWRPbiB3OnZhbD0nTm9ybWFsJy8+CisgIDx3Om5leHQgdzp2YWw9J05vcm1hbCcvPgorICA8dzpsaW5rIHc6dmFsPSdIZWFkaW5nNUNoYXInLz4KKyAgPHc6dWlQcmlvcml0eSB3OnZhbD0nOScvPgorICA8dzp1bmhpZGVXaGVuVXNlZC8+CisgIDx3OnFGb3JtYXQvPgorICA8dzpwUHI+CisgICAgPHc6a2VlcE5leHQvPgorICAgIDx3OmtlZXBMaW5lcy8+CisgICAgPHc6c3BhY2luZyB3OmJlZm9yZT0nMjAwJworICAgICAgICAgICAgICAgdzphZnRlcj0nMCcvPgorICAgIDx3Om91dGxpbmVMdmwgdzp2YWw9JzQnLz4KKyAgPC93OnBQcj4KKyAgPHc6clByPgorICAgIDx3OnJGb250cyB3OmFzY2lpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgIHc6ZWFzdEFzaWFUaGVtZT0nbWFqb3JFYXN0QXNpYScKKyAgICAgICAgICAgICAgdzpoQW5zaVRoZW1lPSdtYWpvckhBbnNpJworICAgICAgICAgICAgICB3OmNzdGhlbWU9J21ham9yQmlkaScvPgorICAgIDx3OmNvbG9yIHc6dmFsPScyNDNGNjAnCisgICAgICAgICAgICAgdzp0aGVtZUNvbG9yPSdhY2NlbnQxJworICAgICAgICAgICAgIHc6dGhlbWVTaGFkZT0nN0YnLz4KKyAgPC93OnJQcj4KKzwvdzpzdHlsZT4iKTsKKworICAgICAgICAgICAgaWYgKGh0bWwuRGVzY2VuZGFudHMoWGh0bWxOb05hbWVzcGFjZS5oNikuQW55KCkpCisgICAgICAgICAgICAgICAgUHRVdGlscy5BZGRFbGVtZW50SWZNaXNzaW5nKHN0eWxlWERvYywKKyAgICAgICAgICAgICAgICBzdHlsZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy50eXBlKSA9PSAicGFyYWdyYXBoIiAmJiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gIkhlYWRpbmc2IikKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCksCitAIjx3OnN0eWxlIHc6dHlwZT0ncGFyYWdyYXBoJworICAgICAgICAgdzpzdHlsZUlkPSdIZWFkaW5nNicKKyAgICAgICAgIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbic+CisgIDx3Om5hbWUgdzp2YWw9J2hlYWRpbmcgNicvPgorICA8dzpiYXNlZE9uIHc6dmFsPSdOb3JtYWwnLz4KKyAgPHc6bmV4dCB3OnZhbD0nTm9ybWFsJy8+CisgIDx3Omxpbmsgdzp2YWw9J0hlYWRpbmc2Q2hhcicvPgorICA8dzp1aVByaW9yaXR5IHc6dmFsPSc5Jy8+CisgIDx3OnVuaGlkZVdoZW5Vc2VkLz4KKyAgPHc6cUZvcm1hdC8+CisgIDx3OnBQcj4KKyAgICA8dzprZWVwTmV4dC8+CisgICAgPHc6a2VlcExpbmVzLz4KKyAgICA8dzpzcGFjaW5nIHc6YmVmb3JlPScyMDAnCisgICAgICAgICAgICAgICB3OmFmdGVyPScwJy8+CisgICAgPHc6b3V0bGluZUx2bCB3OnZhbD0nNScvPgorICA8L3c6cFByPgorICA8dzpyUHI+CisgICAgPHc6ckZvbnRzIHc6YXNjaWlUaGVtZT0nbWFqb3JIQW5zaScKKyAgICAgICAgICAgICAgdzplYXN0QXNpYVRoZW1lPSdtYWpvckVhc3RBc2lhJworICAgICAgICAgICAgICB3OmhBbnNpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgIHc6Y3N0aGVtZT0nbWFqb3JCaWRpJy8+CisgICAgPHc6aS8+CisgICAgPHc6aUNzLz4KKyAgICA8dzpjb2xvciB3OnZhbD0nMjQzRjYwJworICAgICAgICAgICAgIHc6dGhlbWVDb2xvcj0nYWNjZW50MScKKyAgICAgICAgICAgICB3OnRoZW1lU2hhZGU9JzdGJy8+CisgIDwvdzpyUHI+Cis8L3c6c3R5bGU+Iik7CisKKyAgICAgICAgICAgIGlmIChodG1sLkRlc2NlbmRhbnRzKFhodG1sTm9OYW1lc3BhY2UuaDcpLkFueSgpKQorICAgICAgICAgICAgICAgIFB0VXRpbHMuQWRkRWxlbWVudElmTWlzc2luZyhzdHlsZVhEb2MsCisgICAgICAgICAgICAgICAgc3R5bGVYRG9jCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcudHlwZSkgPT0gInBhcmFncmFwaCIgJiYgKHN0cmluZyllLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09ICJIZWFkaW5nNyIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorQCI8dzpzdHlsZSB3OnR5cGU9J3BhcmFncmFwaCcKKyAgICAgICAgIHc6c3R5bGVJZD0nSGVhZGluZzcnCisgICAgICAgICB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICA8dzpuYW1lIHc6dmFsPSdoZWFkaW5nIDcnLz4KKyAgPHc6YmFzZWRPbiB3OnZhbD0nTm9ybWFsJy8+CisgIDx3Om5leHQgdzp2YWw9J05vcm1hbCcvPgorICA8dzpsaW5rIHc6dmFsPSdIZWFkaW5nN0NoYXInLz4KKyAgPHc6dWlQcmlvcml0eSB3OnZhbD0nOScvPgorICA8dzp1bmhpZGVXaGVuVXNlZC8+CisgIDx3OnFGb3JtYXQvPgorICA8dzpwUHI+CisgICAgPHc6a2VlcE5leHQvPgorICAgIDx3OmtlZXBMaW5lcy8+CisgICAgPHc6c3BhY2luZyB3OmJlZm9yZT0nMjAwJworICAgICAgICAgICAgICAgdzphZnRlcj0nMCcvPgorICAgIDx3Om91dGxpbmVMdmwgdzp2YWw9JzYnLz4KKyAgPC93OnBQcj4KKyAgPHc6clByPgorICAgIDx3OnJGb250cyB3OmFzY2lpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgIHc6ZWFzdEFzaWFUaGVtZT0nbWFqb3JFYXN0QXNpYScKKyAgICAgICAgICAgICAgdzpoQW5zaVRoZW1lPSdtYWpvckhBbnNpJworICAgICAgICAgICAgICB3OmNzdGhlbWU9J21ham9yQmlkaScvPgorICAgIDx3OmkvPgorICAgIDx3OmlDcy8+CisgICAgPHc6Y29sb3Igdzp2YWw9JzQwNDA0MCcKKyAgICAgICAgICAgICB3OnRoZW1lQ29sb3I9J3RleHQxJworICAgICAgICAgICAgIHc6dGhlbWVUaW50PSdCRicvPgorICA8L3c6clByPgorPC93OnN0eWxlPiIpOworCisgICAgICAgICAgICBpZiAoaHRtbC5EZXNjZW5kYW50cyhYaHRtbE5vTmFtZXNwYWNlLmg4KS5BbnkoKSkKKyAgICAgICAgICAgICAgICBQdFV0aWxzLkFkZEVsZW1lbnRJZk1pc3Npbmcoc3R5bGVYRG9jLAorICAgICAgICAgICAgICAgIHN0eWxlWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gKHN0cmluZyllLkF0dHJpYnV0ZShXLnR5cGUpID09ICJwYXJhZ3JhcGgiICYmIChzdHJpbmcpZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKSA9PSAiSGVhZGluZzgiKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKSwKK0AiPHc6c3R5bGUgdzp0eXBlPSdwYXJhZ3JhcGgnCisgICAgICAgICB3OnN0eWxlSWQ9J0hlYWRpbmc4JworICAgICAgICAgeG1sbnM6dz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluJz4KKyAgPHc6bmFtZSB3OnZhbD0naGVhZGluZyA4Jy8+CisgIDx3OmJhc2VkT24gdzp2YWw9J05vcm1hbCcvPgorICA8dzpuZXh0IHc6dmFsPSdOb3JtYWwnLz4KKyAgPHc6bGluayB3OnZhbD0nSGVhZGluZzhDaGFyJy8+CisgIDx3OnVpUHJpb3JpdHkgdzp2YWw9JzknLz4KKyAgPHc6dW5oaWRlV2hlblVzZWQvPgorICA8dzpxRm9ybWF0Lz4KKyAgPHc6cFByPgorICAgIDx3OmtlZXBOZXh0Lz4KKyAgICA8dzprZWVwTGluZXMvPgorICAgIDx3OnNwYWNpbmcgdzpiZWZvcmU9JzIwMCcKKyAgICAgICAgICAgICAgIHc6YWZ0ZXI9JzAnLz4KKyAgICA8dzpvdXRsaW5lTHZsIHc6dmFsPSc3Jy8+CisgIDwvdzpwUHI+CisgIDx3OnJQcj4KKyAgICA8dzpyRm9udHMgdzphc2NpaVRoZW1lPSdtYWpvckhBbnNpJworICAgICAgICAgICAgICB3OmVhc3RBc2lhVGhlbWU9J21ham9yRWFzdEFzaWEnCisgICAgICAgICAgICAgIHc6aEFuc2lUaGVtZT0nbWFqb3JIQW5zaScKKyAgICAgICAgICAgICAgdzpjc3RoZW1lPSdtYWpvckJpZGknLz4KKyAgICA8dzpjb2xvciB3OnZhbD0nNDA0MDQwJworICAgICAgICAgICAgIHc6dGhlbWVDb2xvcj0ndGV4dDEnCisgICAgICAgICAgICAgdzp0aGVtZVRpbnQ9J0JGJy8+CisgICAgPHc6c3ogdzp2YWw9JzIwJy8+CisgICAgPHc6c3pDcyB3OnZhbD0nMjAnLz4KKyAgPC93OnJQcj4KKzwvdzpzdHlsZT4iKTsKKworICAgICAgICAgICAgaWYgKGh0bWwuRGVzY2VuZGFudHMoWGh0bWxOb05hbWVzcGFjZS5oOSkuQW55KCkpCisgICAgICAgICAgICAgICAgUHRVdGlscy5BZGRFbGVtZW50SWZNaXNzaW5nKHN0eWxlWERvYywKKyAgICAgICAgICAgICAgICBzdHlsZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy50eXBlKSA9PSAicGFyYWdyYXBoIiAmJiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gIkhlYWRpbmc5IikKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCksCitAIjx3OnN0eWxlIHc6dHlwZT0ncGFyYWdyYXBoJworICAgICAgICAgdzpzdHlsZUlkPSdIZWFkaW5nOScKKyAgICAgICAgIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbic+CisgIDx3Om5hbWUgdzp2YWw9J2hlYWRpbmcgOScvPgorICA8dzpiYXNlZE9uIHc6dmFsPSdOb3JtYWwnLz4KKyAgPHc6bmV4dCB3OnZhbD0nTm9ybWFsJy8+CisgIDx3Omxpbmsgdzp2YWw9J0hlYWRpbmc5Q2hhcicvPgorICA8dzp1aVByaW9yaXR5IHc6dmFsPSc5Jy8+CisgIDx3OnVuaGlkZVdoZW5Vc2VkLz4KKyAgPHc6cUZvcm1hdC8+CisgIDx3OnBQcj4KKyAgICA8dzprZWVwTmV4dC8+CisgICAgPHc6a2VlcExpbmVzLz4KKyAgICA8dzpzcGFjaW5nIHc6YmVmb3JlPScyMDAnCisgICAgICAgICAgICAgICB3OmFmdGVyPScwJy8+CisgICAgPHc6b3V0bGluZUx2bCB3OnZhbD0nOCcvPgorICA8L3c6cFByPgorICA8dzpyUHI+CisgICAgPHc6ckZvbnRzIHc6YXNjaWlUaGVtZT0nbWFqb3JIQW5zaScKKyAgICAgICAgICAgICAgdzplYXN0QXNpYVRoZW1lPSdtYWpvckVhc3RBc2lhJworICAgICAgICAgICAgICB3OmhBbnNpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgIHc6Y3N0aGVtZT0nbWFqb3JCaWRpJy8+CisgICAgPHc6aS8+CisgICAgPHc6aUNzLz4KKyAgICA8dzpjb2xvciB3OnZhbD0nNDA0MDQwJworICAgICAgICAgICAgIHc6dGhlbWVDb2xvcj0ndGV4dDEnCisgICAgICAgICAgICAgdzp0aGVtZVRpbnQ9J0JGJy8+CisgICAgPHc6c3ogdzp2YWw9JzIwJy8+CisgICAgPHc6c3pDcyB3OnZhbD0nMjAnLz4KKyAgPC93OnJQcj4KKzwvdzpzdHlsZT4iKTsKKworICAgICAgICAgICAgaWYgKGh0bWwuRGVzY2VuZGFudHMoWGh0bWxOb05hbWVzcGFjZS5oMSkuQW55KCkpCisgICAgICAgICAgICAgICAgUHRVdGlscy5BZGRFbGVtZW50SWZNaXNzaW5nKHN0eWxlWERvYywKKyAgICAgICAgICAgICAgICBzdHlsZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy50eXBlKSA9PSAiY2hhcmFjdGVyIiAmJiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gIkhlYWRpbmcxQ2hhciIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorQCI8dzpzdHlsZSB3OnR5cGU9J2NoYXJhY3RlcicKKyAgICAgICAgIHc6Y3VzdG9tU3R5bGU9JzEnCisgICAgICAgICB3OnN0eWxlSWQ9J0hlYWRpbmcxQ2hhcicKKyAgICAgICAgIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbic+CisgIDx3Om5hbWUgdzp2YWw9J0hlYWRpbmcgMSBDaGFyJy8+CisgIDx3OmJhc2VkT24gdzp2YWw9J0RlZmF1bHRQYXJhZ3JhcGhGb250Jy8+CisgIDx3Omxpbmsgdzp2YWw9J0hlYWRpbmcxJy8+CisgIDx3OnVpUHJpb3JpdHkgdzp2YWw9JzknLz4KKyAgPHc6clByPgorICAgIDx3OnJGb250cyB3OmFzY2lpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgIHc6ZWFzdEFzaWFUaGVtZT0nbWFqb3JFYXN0QXNpYScKKyAgICAgICAgICAgICAgdzpoQW5zaVRoZW1lPSdtYWpvckhBbnNpJworICAgICAgICAgICAgICB3OmNzdGhlbWU9J21ham9yQmlkaScvPgorICAgIDx3OmIvPgorICAgIDx3OmJDcy8+CisgICAgPHc6Y29sb3Igdzp2YWw9JzM2NUY5MScKKyAgICAgICAgICAgICB3OnRoZW1lQ29sb3I9J2FjY2VudDEnCisgICAgICAgICAgICAgdzp0aGVtZVNoYWRlPSdCRicvPgorICAgIDx3OnN6IHc6dmFsPScyOCcvPgorICAgIDx3OnN6Q3Mgdzp2YWw9JzI4Jy8+CisgIDwvdzpyUHI+Cis8L3c6c3R5bGU+Iik7CisKKyAgICAgICAgICAgIGlmIChodG1sLkRlc2NlbmRhbnRzKFhodG1sTm9OYW1lc3BhY2UuaDIpLkFueSgpKQorICAgICAgICAgICAgICAgIFB0VXRpbHMuQWRkRWxlbWVudElmTWlzc2luZyhzdHlsZVhEb2MsCisgICAgICAgICAgICAgICAgc3R5bGVYRG9jCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcudHlwZSkgPT0gImNoYXJhY3RlciIgJiYgKHN0cmluZyllLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09ICJIZWFkaW5nMkNoYXIiKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKSwKK0AiPHc6c3R5bGUgdzp0eXBlPSdjaGFyYWN0ZXInCisgICAgICAgICB3OmN1c3RvbVN0eWxlPScxJworICAgICAgICAgdzpzdHlsZUlkPSdIZWFkaW5nMkNoYXInCisgICAgICAgICB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICA8dzpuYW1lIHc6dmFsPSdIZWFkaW5nIDIgQ2hhcicvPgorICA8dzpiYXNlZE9uIHc6dmFsPSdEZWZhdWx0UGFyYWdyYXBoRm9udCcvPgorICA8dzpsaW5rIHc6dmFsPSdIZWFkaW5nMicvPgorICA8dzp1aVByaW9yaXR5IHc6dmFsPSc5Jy8+CisgIDx3OnJQcj4KKyAgICA8dzpyRm9udHMgdzphc2NpaVRoZW1lPSdtYWpvckhBbnNpJworICAgICAgICAgICAgICB3OmVhc3RBc2lhVGhlbWU9J21ham9yRWFzdEFzaWEnCisgICAgICAgICAgICAgIHc6aEFuc2lUaGVtZT0nbWFqb3JIQW5zaScKKyAgICAgICAgICAgICAgdzpjc3RoZW1lPSdtYWpvckJpZGknLz4KKyAgICA8dzpiLz4KKyAgICA8dzpiQ3MvPgorICAgIDx3OmNvbG9yIHc6dmFsPSc0RjgxQkQnCisgICAgICAgICAgICAgdzp0aGVtZUNvbG9yPSdhY2NlbnQxJy8+CisgICAgPHc6c3ogdzp2YWw9JzI2Jy8+CisgICAgPHc6c3pDcyB3OnZhbD0nMjYnLz4KKyAgPC93OnJQcj4KKzwvdzpzdHlsZT4iKTsKKworICAgICAgICAgICAgaWYgKGh0bWwuRGVzY2VuZGFudHMoWGh0bWxOb05hbWVzcGFjZS5oMykuQW55KCkpCisgICAgICAgICAgICAgICAgUHRVdGlscy5BZGRFbGVtZW50SWZNaXNzaW5nKHN0eWxlWERvYywKKyAgICAgICAgICAgICAgICBzdHlsZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy50eXBlKSA9PSAiY2hhcmFjdGVyIiAmJiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gIkhlYWRpbmczQ2hhciIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorQCI8dzpzdHlsZSB3OnR5cGU9J2NoYXJhY3RlcicKKyAgICAgICAgIHc6Y3VzdG9tU3R5bGU9JzEnCisgICAgICAgICB3OnN0eWxlSWQ9J0hlYWRpbmczQ2hhcicKKyAgICAgICAgIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbic+CisgIDx3Om5hbWUgdzp2YWw9J0hlYWRpbmcgMyBDaGFyJy8+CisgIDx3OmJhc2VkT24gdzp2YWw9J0RlZmF1bHRQYXJhZ3JhcGhGb250Jy8+CisgIDx3Omxpbmsgdzp2YWw9J0hlYWRpbmczJy8+CisgIDx3OnVpUHJpb3JpdHkgdzp2YWw9JzknLz4KKyAgPHc6clByPgorICAgIDx3OnJGb250cyB3OmFzY2lpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgIHc6ZWFzdEFzaWFUaGVtZT0nbWFqb3JFYXN0QXNpYScKKyAgICAgICAgICAgICAgdzpoQW5zaVRoZW1lPSdtYWpvckhBbnNpJworICAgICAgICAgICAgICB3OmNzdGhlbWU9J21ham9yQmlkaScvPgorICAgIDx3OmIvPgorICAgIDx3OmJDcy8+CisgICAgPHc6Y29sb3Igdzp2YWw9JzRGODFCRCcKKyAgICAgICAgICAgICB3OnRoZW1lQ29sb3I9J2FjY2VudDEnLz4KKyAgPC93OnJQcj4KKzwvdzpzdHlsZT4iKTsKKworICAgICAgICAgICAgaWYgKGh0bWwuRGVzY2VuZGFudHMoWGh0bWxOb05hbWVzcGFjZS5oNCkuQW55KCkpCisgICAgICAgICAgICAgICAgUHRVdGlscy5BZGRFbGVtZW50SWZNaXNzaW5nKHN0eWxlWERvYywKKyAgICAgICAgICAgICAgICBzdHlsZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy50eXBlKSA9PSAiY2hhcmFjdGVyIiAmJiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gIkhlYWRpbmc0Q2hhciIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorQCI8dzpzdHlsZSB3OnR5cGU9J2NoYXJhY3RlcicKKyAgICAgICAgIHc6Y3VzdG9tU3R5bGU9JzEnCisgICAgICAgICB3OnN0eWxlSWQ9J0hlYWRpbmc0Q2hhcicKKyAgICAgICAgIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbic+CisgIDx3Om5hbWUgdzp2YWw9J0hlYWRpbmcgNCBDaGFyJy8+CisgIDx3OmJhc2VkT24gdzp2YWw9J0RlZmF1bHRQYXJhZ3JhcGhGb250Jy8+CisgIDx3Omxpbmsgdzp2YWw9J0hlYWRpbmc0Jy8+CisgIDx3OnVpUHJpb3JpdHkgdzp2YWw9JzknLz4KKyAgPHc6clByPgorICAgIDx3OnJGb250cyB3OmFzY2lpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgIHc6ZWFzdEFzaWFUaGVtZT0nbWFqb3JFYXN0QXNpYScKKyAgICAgICAgICAgICAgdzpoQW5zaVRoZW1lPSdtYWpvckhBbnNpJworICAgICAgICAgICAgICB3OmNzdGhlbWU9J21ham9yQmlkaScvPgorICAgIDx3OmIvPgorICAgIDx3OmJDcy8+CisgICAgPHc6aS8+CisgICAgPHc6aUNzLz4KKyAgICA8dzpjb2xvciB3OnZhbD0nNEY4MUJEJworICAgICAgICAgICAgIHc6dGhlbWVDb2xvcj0nYWNjZW50MScvPgorICA8L3c6clByPgorPC93OnN0eWxlPiIpOworCisgICAgICAgICAgICBpZiAoaHRtbC5EZXNjZW5kYW50cyhYaHRtbE5vTmFtZXNwYWNlLmg1KS5BbnkoKSkKKyAgICAgICAgICAgICAgICBQdFV0aWxzLkFkZEVsZW1lbnRJZk1pc3Npbmcoc3R5bGVYRG9jLAorICAgICAgICAgICAgICAgIHN0eWxlWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gKHN0cmluZyllLkF0dHJpYnV0ZShXLnR5cGUpID09ICJjaGFyYWN0ZXIiICYmIChzdHJpbmcpZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKSA9PSAiSGVhZGluZzVDaGFyIikKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCksCitAIjx3OnN0eWxlIHc6dHlwZT0nY2hhcmFjdGVyJworICAgICAgICAgdzpjdXN0b21TdHlsZT0nMScKKyAgICAgICAgIHc6c3R5bGVJZD0nSGVhZGluZzVDaGFyJworICAgICAgICAgeG1sbnM6dz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluJz4KKyAgPHc6bmFtZSB3OnZhbD0nSGVhZGluZyA1IENoYXInLz4KKyAgPHc6YmFzZWRPbiB3OnZhbD0nRGVmYXVsdFBhcmFncmFwaEZvbnQnLz4KKyAgPHc6bGluayB3OnZhbD0nSGVhZGluZzUnLz4KKyAgPHc6dWlQcmlvcml0eSB3OnZhbD0nOScvPgorICA8dzpyUHI+CisgICAgPHc6ckZvbnRzIHc6YXNjaWlUaGVtZT0nbWFqb3JIQW5zaScKKyAgICAgICAgICAgICAgdzplYXN0QXNpYVRoZW1lPSdtYWpvckVhc3RBc2lhJworICAgICAgICAgICAgICB3OmhBbnNpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgIHc6Y3N0aGVtZT0nbWFqb3JCaWRpJy8+CisgICAgPHc6Y29sb3Igdzp2YWw9JzI0M0Y2MCcKKyAgICAgICAgICAgICB3OnRoZW1lQ29sb3I9J2FjY2VudDEnCisgICAgICAgICAgICAgdzp0aGVtZVNoYWRlPSc3RicvPgorICA8L3c6clByPgorPC93OnN0eWxlPiIpOworCisgICAgICAgICAgICBpZiAoaHRtbC5EZXNjZW5kYW50cyhYaHRtbE5vTmFtZXNwYWNlLmg2KS5BbnkoKSkKKyAgICAgICAgICAgICAgICBQdFV0aWxzLkFkZEVsZW1lbnRJZk1pc3Npbmcoc3R5bGVYRG9jLAorICAgICAgICAgICAgICAgIHN0eWxlWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gKHN0cmluZyllLkF0dHJpYnV0ZShXLnR5cGUpID09ICJjaGFyYWN0ZXIiICYmIChzdHJpbmcpZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKSA9PSAiSGVhZGluZzZDaGFyIikKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCksCitAIjx3OnN0eWxlIHc6dHlwZT0nY2hhcmFjdGVyJworICAgICAgICAgdzpjdXN0b21TdHlsZT0nMScKKyAgICAgICAgIHc6c3R5bGVJZD0nSGVhZGluZzZDaGFyJworICAgICAgICAgeG1sbnM6dz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluJz4KKyAgPHc6bmFtZSB3OnZhbD0nSGVhZGluZyA2IENoYXInLz4KKyAgPHc6YmFzZWRPbiB3OnZhbD0nRGVmYXVsdFBhcmFncmFwaEZvbnQnLz4KKyAgPHc6bGluayB3OnZhbD0nSGVhZGluZzYnLz4KKyAgPHc6dWlQcmlvcml0eSB3OnZhbD0nOScvPgorICA8dzpyUHI+CisgICAgPHc6ckZvbnRzIHc6YXNjaWlUaGVtZT0nbWFqb3JIQW5zaScKKyAgICAgICAgICAgICAgdzplYXN0QXNpYVRoZW1lPSdtYWpvckVhc3RBc2lhJworICAgICAgICAgICAgICB3OmhBbnNpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgIHc6Y3N0aGVtZT0nbWFqb3JCaWRpJy8+CisgICAgPHc6aS8+CisgICAgPHc6aUNzLz4KKyAgICA8dzpjb2xvciB3OnZhbD0nMjQzRjYwJworICAgICAgICAgICAgIHc6dGhlbWVDb2xvcj0nYWNjZW50MScKKyAgICAgICAgICAgICB3OnRoZW1lU2hhZGU9JzdGJy8+CisgIDwvdzpyUHI+Cis8L3c6c3R5bGU+Iik7CisKKyAgICAgICAgICAgIGlmIChodG1sLkRlc2NlbmRhbnRzKFhodG1sTm9OYW1lc3BhY2UuaDcpLkFueSgpKQorICAgICAgICAgICAgICAgIFB0VXRpbHMuQWRkRWxlbWVudElmTWlzc2luZyhzdHlsZVhEb2MsCisgICAgICAgICAgICAgICAgc3R5bGVYRG9jCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcudHlwZSkgPT0gImNoYXJhY3RlciIgJiYgKHN0cmluZyllLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09ICJIZWFkaW5nN0NoYXIiKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKSwKK0AiPHc6c3R5bGUgdzp0eXBlPSdjaGFyYWN0ZXInCisgICAgICAgICB3OmN1c3RvbVN0eWxlPScxJworICAgICAgICAgdzpzdHlsZUlkPSdIZWFkaW5nN0NoYXInCisgICAgICAgICB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICA8dzpuYW1lIHc6dmFsPSdIZWFkaW5nIDcgQ2hhcicvPgorICA8dzpiYXNlZE9uIHc6dmFsPSdEZWZhdWx0UGFyYWdyYXBoRm9udCcvPgorICA8dzpsaW5rIHc6dmFsPSdIZWFkaW5nNycvPgorICA8dzp1aVByaW9yaXR5IHc6dmFsPSc5Jy8+CisgIDx3OnJQcj4KKyAgICA8dzpyRm9udHMgdzphc2NpaVRoZW1lPSdtYWpvckhBbnNpJworICAgICAgICAgICAgICB3OmVhc3RBc2lhVGhlbWU9J21ham9yRWFzdEFzaWEnCisgICAgICAgICAgICAgIHc6aEFuc2lUaGVtZT0nbWFqb3JIQW5zaScKKyAgICAgICAgICAgICAgdzpjc3RoZW1lPSdtYWpvckJpZGknLz4KKyAgICA8dzppLz4KKyAgICA8dzppQ3MvPgorICAgIDx3OmNvbG9yIHc6dmFsPSc0MDQwNDAnCisgICAgICAgICAgICAgdzp0aGVtZUNvbG9yPSd0ZXh0MScKKyAgICAgICAgICAgICB3OnRoZW1lVGludD0nQkYnLz4KKyAgPC93OnJQcj4KKzwvdzpzdHlsZT4iKTsKKworICAgICAgICAgICAgaWYgKGh0bWwuRGVzY2VuZGFudHMoWGh0bWxOb05hbWVzcGFjZS5oOCkuQW55KCkpCisgICAgICAgICAgICAgICAgUHRVdGlscy5BZGRFbGVtZW50SWZNaXNzaW5nKHN0eWxlWERvYywKKyAgICAgICAgICAgICAgICBzdHlsZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy50eXBlKSA9PSAiY2hhcmFjdGVyIiAmJiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gIkhlYWRpbmc4Q2hhciIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorQCI8dzpzdHlsZSB3OnR5cGU9J2NoYXJhY3RlcicKKyAgICAgICAgIHc6Y3VzdG9tU3R5bGU9JzEnCisgICAgICAgICB3OnN0eWxlSWQ9J0hlYWRpbmc4Q2hhcicKKyAgICAgICAgIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbic+CisgIDx3Om5hbWUgdzp2YWw9J0hlYWRpbmcgOCBDaGFyJy8+CisgIDx3OmJhc2VkT24gdzp2YWw9J0RlZmF1bHRQYXJhZ3JhcGhGb250Jy8+CisgIDx3Omxpbmsgdzp2YWw9J0hlYWRpbmc4Jy8+CisgIDx3OnVpUHJpb3JpdHkgdzp2YWw9JzknLz4KKyAgPHc6clByPgorICAgIDx3OnJGb250cyB3OmFzY2lpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgIHc6ZWFzdEFzaWFUaGVtZT0nbWFqb3JFYXN0QXNpYScKKyAgICAgICAgICAgICAgdzpoQW5zaVRoZW1lPSdtYWpvckhBbnNpJworICAgICAgICAgICAgICB3OmNzdGhlbWU9J21ham9yQmlkaScvPgorICAgIDx3OmNvbG9yIHc6dmFsPSc0MDQwNDAnCisgICAgICAgICAgICAgdzp0aGVtZUNvbG9yPSd0ZXh0MScKKyAgICAgICAgICAgICB3OnRoZW1lVGludD0nQkYnLz4KKyAgICA8dzpzeiB3OnZhbD0nMjAnLz4KKyAgICA8dzpzekNzIHc6dmFsPScyMCcvPgorICA8L3c6clByPgorPC93OnN0eWxlPiIpOworCisgICAgICAgICAgICBpZiAoaHRtbC5EZXNjZW5kYW50cyhYaHRtbE5vTmFtZXNwYWNlLmg5KS5BbnkoKSkKKyAgICAgICAgICAgICAgICBQdFV0aWxzLkFkZEVsZW1lbnRJZk1pc3Npbmcoc3R5bGVYRG9jLAorICAgICAgICAgICAgICAgIHN0eWxlWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gKHN0cmluZyllLkF0dHJpYnV0ZShXLnR5cGUpID09ICJjaGFyYWN0ZXIiICYmIChzdHJpbmcpZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKSA9PSAiSGVhZGluZzlDaGFyIikKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCksCitAIjx3OnN0eWxlIHc6dHlwZT0nY2hhcmFjdGVyJworICAgICAgICAgdzpjdXN0b21TdHlsZT0nMScKKyAgICAgICAgIHc6c3R5bGVJZD0nSGVhZGluZzlDaGFyJworICAgICAgICAgeG1sbnM6dz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluJz4KKyAgPHc6bmFtZSB3OnZhbD0nSGVhZGluZyA5IENoYXInLz4KKyAgPHc6YmFzZWRPbiB3OnZhbD0nRGVmYXVsdFBhcmFncmFwaEZvbnQnLz4KKyAgPHc6bGluayB3OnZhbD0nSGVhZGluZzknLz4KKyAgPHc6dWlQcmlvcml0eSB3OnZhbD0nOScvPgorICA8dzpyUHI+CisgICAgPHc6ckZvbnRzIHc6YXNjaWlUaGVtZT0nbWFqb3JIQW5zaScKKyAgICAgICAgICAgICAgdzplYXN0QXNpYVRoZW1lPSdtYWpvckVhc3RBc2lhJworICAgICAgICAgICAgICB3OmhBbnNpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgIHc6Y3N0aGVtZT0nbWFqb3JCaWRpJy8+CisgICAgPHc6aS8+CisgICAgPHc6aUNzLz4KKyAgICA8dzpjb2xvciB3OnZhbD0nNDA0MDQwJworICAgICAgICAgICAgIHc6dGhlbWVDb2xvcj0ndGV4dDEnCisgICAgICAgICAgICAgdzp0aGVtZVRpbnQ9J0JGJy8+CisgICAgPHc6c3ogdzp2YWw9JzIwJy8+CisgICAgPHc6c3pDcyB3OnZhbD0nMjAnLz4KKyAgPC93OnJQcj4KKzwvdzpzdHlsZT4iKTsKKworICAgICAgICAgICAgaWYgKGh0bWwuRGVzY2VuZGFudHMoWGh0bWxOb05hbWVzcGFjZS5hKS5BbnkoKSkKKyAgICAgICAgICAgICAgICBQdFV0aWxzLkFkZEVsZW1lbnRJZk1pc3Npbmcoc3R5bGVYRG9jLAorICAgICAgICAgICAgICAgIHN0eWxlWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gKHN0cmluZyllLkF0dHJpYnV0ZShXLnR5cGUpID09ICJjaGFyYWN0ZXIiICYmIChzdHJpbmcpZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKSA9PSAiSHlwZXJsaW5rIikKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCksCitAIjx3OnN0eWxlIHc6dHlwZT0nY2hhcmFjdGVyJworICAgICAgICAgdzpzdHlsZUlkPSdIeXBlcmxpbmsnCisgICAgICAgICB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICA8dzpuYW1lIHc6dmFsPSdIeXBlcmxpbmsnIC8+CisgIDx3OmJhc2VkT24gdzp2YWw9J0RlZmF1bHRQYXJhZ3JhcGhGb250JyAvPgorICA8dzp1aVByaW9yaXR5IHc6dmFsPSc5OScgLz4KKyAgPHc6c2VtaUhpZGRlbiAvPgorICA8dzp1bmhpZGVXaGVuVXNlZCAvPgorICA8dzpyUHI+CisgICAgPHc6Y29sb3Igdzp2YWw9JzAwMDBGRicgLz4KKyAgICA8dzp1IHc6dmFsPSdzaW5nbGUnIC8+CisgIDwvdzpyUHI+Cis8L3c6c3R5bGU+Iik7CisKKyAgICAgICAgICAgIHdEb2MuTWFpbkRvY3VtZW50UGFydC5TdHlsZURlZmluaXRpb25zUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIFRoZW1lVXBkYXRlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFVwZGF0ZVRoZW1lUGFydChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIFhFbGVtZW50IGh0bWwsIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgdGhlbWVYRG9jID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LlRoZW1lUGFydC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBtaW5vckZvbnQgPSBodG1sLkRlc2NlbmRhbnRzKFhodG1sTm9OYW1lc3BhY2UuYm9keSkuRmlyc3RPckRlZmF1bHQoKS5HZXRQcm9wKCJmb250LWZhbWlseSIpOworICAgICAgICAgICAgWEVsZW1lbnQgbWFqb3JGb250RWxlbWVudCA9IGh0bWwuRGVzY2VuZGFudHMoKS5XaGVyZShlID0+CisgICAgICAgICAgICAgICAgZS5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UuaDEgfHwKKyAgICAgICAgICAgICAgICBlLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5oMiB8fAorICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLmgzIHx8CisgICAgICAgICAgICAgICAgZS5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UuaDQgfHwKKyAgICAgICAgICAgICAgICBlLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5oNSB8fAorICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLmg2IHx8CisgICAgICAgICAgICAgICAgZS5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UuaDcgfHwKKyAgICAgICAgICAgICAgICBlLk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5oOCB8fAorICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLmg5KS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBtYWpvckZvbnQgPSBudWxsOworICAgICAgICAgICAgaWYgKG1ham9yRm9udEVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtYWpvckZvbnQgPSBtYWpvckZvbnRFbGVtZW50LkdldFByb3AoImZvbnQtZmFtaWx5Iik7CisKKyAgICAgICAgICAgIFhBdHRyaWJ1dGUgbWFqb3JUeXBlZmFjZSA9IHRoZW1lWERvYworICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKEEudGhlbWVFbGVtZW50cykKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoQS5mb250U2NoZW1lKQorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhBLm1ham9yRm9udCkKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoQS5sYXRpbikKKyAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhOb05hbWVzcGFjZS50eXBlZmFjZSkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChtYWpvclR5cGVmYWNlICE9IG51bGwgJiYgbWFqb3JGb250ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3NzVGVybSB0ZXJtID0gbWFqb3JGb250LlRlcm1zLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKHRlcm0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgbWFqb3JUeXBlZmFjZS5WYWx1ZSA9IHRlcm0uVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBYQXR0cmlidXRlIG1pbm9yVHlwZWZhY2UgPSB0aGVtZVhEb2MKKyAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhBLnRoZW1lRWxlbWVudHMpCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKEEuZm9udFNjaGVtZSkKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoQS5taW5vckZvbnQpCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKEEubGF0aW4pCisgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoTm9OYW1lc3BhY2UudHlwZWZhY2UpCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAobWlub3JUeXBlZmFjZSAhPSBudWxsICYmIG1pbm9yRm9udCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENzc1Rlcm0gdGVybSA9IG1pbm9yRm9udC5UZXJtcy5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmICh0ZXJtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIG1pbm9yVHlwZWZhY2UuVmFsdWUgPSB0ZXJtLlZhbHVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3RG9jLk1haW5Eb2N1bWVudFBhcnQuVGhlbWVQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvSHRtbFRvV21sQ3NzQXBwbGllci5jcyBiL09wZW5YbWxQb3dlclRvb2xzL0h0bWxUb1dtbENzc0FwcGxpZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiYjg3YwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzL0h0bWxUb1dtbENzc0FwcGxpZXIuY3MKQEAgLTAsMCArMSwzNzU4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbDsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1M7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKKworI2lmIGZhbHNlCitTb3J0OgorMS4gVXNlciBhZ2VudCBkZWNsYXJhdGlvbnMKKyAgIDEuIERlZmF1bHQgdmFsdWUKKyAgIDIuIFNwZWNpZmllZCBpbiBkZWZhdWx0IHN0eWxlIHNoZWV0ICh3aGljaCBJIGFtIGdvaW5nIHRvIHN1cHBseSkKKzIuIFVzZXIgbm9ybWFsIGRlY2xhcmF0aW9ucworICAgMS4gU3BlY2lmaWVkIGluIHVzZXItc3VwcGxpZWQgc3R5bGUgc2hlZXQKKzMuIEF1dGhvciBub3JtYWwgZGVjbGFyYXRpb25zCisgICAxLiBTcGVjaWZpZWQgaW4gc3R5bGUgc2hlZXQgKGNhbiBkZWZlciB0aGlzIHVudGlsIGxhdGVyKQorICAgMi4gU3BlY2lmaWVkIGluIHN0eWxlIGVsZW1lbnQKKyAgIDMuIFNwZWNpZmllZCBpbiBzdHlsZSBhdHRyaWJ1dGUKKzQuIEF1dGhvciBpbXBvcnRhbnQgZGVjbGFyYXRpb25zCisgICAxLiBTcGVjaWZpZWQgaW4gc3R5bGUgc2hlZXQKKzUuIFVzZXIgaW1wb3J0YW50IGRlY2xhcmF0aW9ucworICAgMS4gU3BlY2lmaWVkIGluIHN0eWxlIHNoZWV0CisKK1NvcnQgS2V5IChtb3N0IHNpZ25pZmljYW50IGZpcnN0KQorezB9ICAgICA5IGlmIHVzZXIgc3VwcGxpZWQgc3R5bGUgc2hlZXQsIGhpZ2gKK3swfSAgICAgOCBpZiBhdXRob3Igc3VwcGxpZWQgc3R5bGUgc2hlZXQsIGhpZ2gKK3swfSAgICAgNyBpZiBzdHlsZSBhdHRyaWJ1dGUsIGhpZ2gKK3swfSAgICAgNiBpZiBzdHlsZSBhdHRyaWJ1dGUsIG5vcm1hbAorezB9ICAgICA1IGlmIGF1dGhvciBzdXBsaWVkIHN0eWxlIHNoZWV0LCBub3JtYWwKK3swfSAgICAgNCBpZiB1c2VyIHN1cHBsaWVkIHN0eWxlIHNoZWV0LCBub3JtYWwKK3swfSAgICAgMyBpZiB1c2VyLWFnZW50IGRlZmF1bHQgc3R5bGUgc2hlZXQsIGhpZ2gKK3swfSAgICAgMiBpZiB1c2VyLWFnZW50IGRlZmF1bHQgc3R5bGUgc2hlZXQsIG5vcm1hbAorezB9ICAgICAxIGlmIGluaGVyaXRlZAorezF9ICAgICBjb3VudCBvZiBudW1iZXIgb2YgSUQgYXR0cmlidXRlcyBpbiBzZWxlY3RvcgorezJ9ICAgICBjb3VudCBvZiBudW1iZXIgb2YgYXR0cmlidXRlcyBhbmQgcHNldWRvIGNsYXNzZXMgaW4gc2VsZWN0b3IKK3szfSAgICAgY291bnQgb2YgbnVtYmVyIG9mIGVsZW1lbnQgbmFtZXMgYW5kIHBzZXVkbyBlbGVtZW50cyBpbiBzZWxlY3RvcgorezR9ICAgICBzZXF1ZW5jZSBudW1iZXIgaW4gb3JkZXIgYWRkZWQgdG8gbGlzdAorCisxLiBQcm9jZXNzIHVzZXItYWdlbnQgZGVmYXVsdCBzdHlsZSBzaGVldAorMi4gUHJvY2VzcyB1c2VyLXN1cHBsaWVkIHN0eWxlIHNoZWV0CiszLiBwcm9jZXNzIGF1dGhvci1zdXBwbGllZCBzdHlsZSBzaGVldAorNC4gcHJvY2VzcyBTVFlMRSBlbGVtZW50Cis1LiBwcm9jZXNzIHN0eWxlIGF0dHJpYnV0ZSBvbiBhbGwgZWxlbWVudHMKKzYuIGV4cGFuZCBhbGwgc2hvcnRoYW5kIHByb3BlcnRpZXMgLSB0aGUgbmV3IHByb3BlcnRpZXMgaGF2ZSB0aGUgc2FtZSBzb3J0IGtleSBhcyBzaG9ydGhhbmQgcHJvcAorNy4gQWRkIGluaXRpYWwgdmFsdWVzIGZvciBhbGwgcHJvcGVydGllcyB0aGF0IGRvbid0IGhhdmUgdmFsdWVzCisKK1RoZSB2YXJpb3VzIHR5cGVzIG9mIHByb3BlcnRpZXM6CistIFNldCBieSB0aGUgc3R5bGUgc2hlZXQgZXhwbGljaXRlbHkKKy0gU2V0IGF0IHJvb3QgbGV2ZWwgb2YgaGllcmFyY2h5IHNvIHRoYXQgb3RoZXIgZWxlbWVudHMgY2FuIGluaGVyaXQgKGlmIG5vIG90aGVyIGFuY2VzdG9yKQorLSBTZXQgYXMgaW5pdGlhbCB2YWx1ZSBmb3IgY2VydGFpbiBlbGVtZW50cyAtIGFsbCBwcm9wZXJ0aWVzIGhhdmUgYW4gaW5pdGlhbCB2YWx1ZS4gIFNvbWUgcHJvcGVydGllcyBhcHBseSB0byBvbmx5IGNlcnRhaW4gZWxlbWVudHMuCistIFNvbWUgcHJvcGVydGllcyBpbmhlcml0IGF1dG9tYXRpY2FsbHksIHN1Y2ggYXMgZm9udC1mYW1pbHkuCistIFNvbWUgcHJvcGVydGllcyBhcmUgc2V0IHRvIGluaGVyaXQgaW4gdGhlIHN0eWxlc2hlZXQuCistIGJvcmRlci10b3AtY29sb3IgZXRjLiBhcmUgc2V0IHRvIHRoZSBjb2xvciBwcm9wZXJ0eSwgd2hpY2ggdGhlbiBpbmhlcml0cy4KKworUHJvcGVydGllcyBlaXRoZXIgaW5oZXJpdCwgb3IgYXJlIHNldCB0byBhbiBpbml0aWFsIHZhbHVlLiAgVGhvc2UgcHJvcGVydGllcyB0aGF0IGluaGVyaXQgYXJlIHNldCB0byBpbml0aWFsIHZhbHVlIG9ubHkgYXQgdGhlIHRvcCBvZgordGhlIHRyZWUuICBUaG9zZSBwcm9wcyB0aGF0IGFyZSBzZXQgdG8gYW4gaW5pdGlhbCB2YWx1ZSB0aHJvdWdob3V0IHRoZSB0cmVlIGRvIG5vdCBpbmhlcml0LiAgSXQgaXMgZWl0aGVyIG9uZSBvciB0aGUgb3RoZXIuCisKK0ZvbGxvd2luZyBpcyBteSBuZXcgdGhlb3J5IG9mIHRoZSBjb3JyZWN0IGFsZ29yaXRobToKKy0gc2V0IGFsbCBwcm9wZXJ0aWVzIGZyb20gdGhlIGNhc2NhZGUuCistIFNldCBpbml0aWFsIHZhbHVlcyBmb3IgcHJvcGVydGllcyBhdCB0aGUgdG9wIG9mIHRoZSB0cmVlLiAgVGhlc2Ugc3BlY2lmaWNhbGx5IG5lZWQgdG8gYmUgc2V0IGZvciBvdGhlciBwcm9wZXJ0aWVzIHRoYXQgd2lsbAorICBpbmhlcml0IGZyb20gdGhlbS4KKy0gY3JlYXRlIGEgbWF0cml4IG9mIGFsbCBlbGVtZW50cywgYW5kIHdoaWNoIHByb3BlcnRpZXMgbmVlZCB0byBiZSBzZXQgZm9yIGVhY2ggZWxlbWVudC4KKy0gaXRlcmF0ZSB0aHJvdWdoIHRoZSB0cmVlLgorCisgIFNldEFsbFZhbHVlcworICAgIGZvciBlYWNoIGVsZW1lbnQKKyAgICAgIGZvciBlYWNoIHByb3BlcnR5CisgICAgICAgIGNhbGwgR2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlICAvLyBpbXBsZW1lbnRlZCBpbiBhIHJlY3Vyc2l2ZSBmYXNoaW9uIHRvIHNldCAmIGdldCBpdHMgY29tcHV0ZWQgdmFsdWUuCisKKyAgR2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlCisgICAgaWYgKHByb3BlcnR5IGlzIGFscmVhZHkgY29tcHV0ZWQpCisgICAgICByZXR1cm4gdGhlIGNvbXB1dGVkIHZhbHVlCisgICAgaWYgKHByb3BlcnR5IGlzIHNldCkKKyAgICAgIGNvbXB1dGUgdmFsdWUKKyAgICAgIHNldCB0aGUgY29tcHV0ZWQgdmFsdWUKKyAgICAgIHJldHVybiB0aGUgY29tcHV0ZWQgdmFsdWUKKyAgICBpZiAocHJvcGVydHkgaXMgaW5oZXJpdGVkIChlaXRoZXIgYmVjYXVzZSBpdCB3YXMgc2V0IHRvIGluaGVyaXQsIG9yIGJlY2F1c2UgaXQgaXMgYW4gaW5oZXJpdGVkIHByb3BlcnR5KSkKKyAgICAgIGlmIChwYXJlbnQgZXhpc3RzKQorICAgICAgICBjYWxsIEdldENvbXB1dGVkVmFsdWUgb24gcGFyZW50CisgICAgICAgIHNldCB0aGUgY29tcHV0ZWQgdmFsdWUKKyAgICAgICAgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZQorICAgICAgZWxzZQorICAgICAgICBjYWxsIEdldEluaXRpYWxWYWx1ZSBmb3IgcHJvcGVydHkKKyAgICAgICAgY29tcHV0ZSB2YWx1ZQorICAgICAgICBzZXQgdGhlIGNvbXB1dGVkIHZhbHVlCisgICAgICAgIHJldHVybiB0aGUgY29tcHV0ZWQgdmFsdWUKKyAgICBlbHNlCisgICAgICBjYWxsIEdldEluaXRpYWxWYWx1ZSBmb3IgcHJvcGVydHkKKyAgICAgIGNvbXB1dGUgdmFsdWUKKyAgICAgIHNldCB0aGUgY29tcHV0ZWQgdmFsdWUKKyAgICAgIHJldHVybiB0aGUgY29tcHV0ZWQgdmFsdWUKKyAgCisgIENvbXB1dGVWYWx1ZQorICAgIHRoaXMgbmVlZHMgdG8gYmUgc3BlY2lmaWNhbGx5IGNvZGVkIGZvciBlYWNoIHByb3BlcnR5CisgICAgaWYgdmFsdWUgaXMgcmVsYXRpdmUgKGVtLCBleCwgcGVyY2VudGFnZSwgCisgICAgICBpZiBwcm9wZXJ0eSBpcyBub3Qgb24gZm9udC1zaXplCisgICAgICAgIEdldENvbXB1dGVkVmFsdWUgZm9yIGZvbnQtc2l6ZQorICAgICAgICBjb21wdXRlIHZhbHVlIGFjY29yZGluZ2x5CisgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgaWYgcHJvcGVydHkgaXMgb24gZm9udC1zaXplCisgICAgICAgIGNhbGwgR2V0Q29tcHV0ZWRWYWx1ZSBmb3IgZm9udC1zaXplIG9mIHBhcmVudAorICAgICAgICBjb21wdXRlIHZhbHVlIGFjY29yZGluZ2x5CisgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgaWYgdmFsdWUgaXMgcGVyY2VudGFnZQorICAgICAgICBpZiBtYXJnaW4tdG9wLCBtYXJnaW4tYm90dG9tLCBtYXJnaW4tcmlnaHQsIG1hcmdpbi1sZWZ0LCBwYWRkaW5nLXRvcCwgcGFkZGluZy1ib3R0b20sIHBhZGRpbmctcmlnaHQsIHBhZGRpbmctbGVmdAorICAgICAgICAgIGNhbGwgR2V0Q29tcHV0ZWRWYWx1ZSBmb3Igd2lkdGggb2YgY29udGFpbmluZyBibG9jaworICAgIGlmIHZhbHVlIGlzIGFic29sdXRlIChpbiwgY20sIG1tLCBwdCwgcGMsIHB4KQorICAgICAgcmV0dXJuIHZhbHVlCisjZW5kaWYKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbAoreworICAgIGNsYXNzIENzc0FwcGxpZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8UHJvcGVydHlJbmZvPiBQcm9wZXJ0eUluZm9MaXN0ID0gbmV3IExpc3Q8UHJvcGVydHlJbmZvPigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNvbG9yCisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgPGNvbG9yPiB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICBkZXBlbmRzIG9uIFVBCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCisgICAgICAgICAgICAvLyBJbmhlcml0ZWQ6ICAgICAgeWVzCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgTi9BCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAiY29sb3IiIH0sCisgICAgICAgICAgICAgICAgSW5oZXJpdHMgPSB0cnVlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PiB0cnVlLAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJibGFjayIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfSwKKyAgICAgICAgICAgICAgICBDb21wdXRlZFZhbHVlID0gKGVsZW1lbnQsIGFzc2lnbmVkVmFsdWUsIHNldHRpbmdzKSA9PiBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gR2V0V21sQ29sb3JGcm9tRXhwcmVzc2lvbihhc3NpZ25lZFZhbHVlKSwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9LAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gZGlyZWN0aW9uCisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgbHRyIHwgcnRsIHwgaW5oZXJpdAorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIGx0cgorICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIHllcworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIE4vQQorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWMKKyAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUluZm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lcyA9IG5ld1tdIHsgImRpcmVjdGlvbiIgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IHRydWUsCisgICAgICAgICAgICAgICAgSW5jbHVkZXMgPSAoZSwgc2V0dGluZ3MpID0+IHRydWUsCisgICAgICAgICAgICAgICAgSW5pdGlhbFZhbHVlID0gKGVsZW1lbnQsIHNldHRpbmdzKSA9PiBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gImx0ciIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfSwKKyAgICAgICAgICAgICAgICBDb21wdXRlZFZhbHVlID0gbnVsbCwKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIGxpbmUtaGVpZ2h0CisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgbm9ybWFsIHwgPG51bWJlcj4gfCA8bGVuZ3RoPiB8IDxwZXJjZW50YWdlPiB8IDxpbmhlcml0PgorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIG5vcm1hbAorICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIHllcworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIHJlZmVyIHRvIHRoZSBmb250IHNpemUgb2YgdGhlIGVsZW1lbnQgaXRzZWxmCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogZm9yIDxsZW5ndGg+IGFuZCA8cGVyY2VudGFnZT4gdGhlIGFic29sdXRlIHZhbHVlLCBvdGhlcndpc2UgYXMgc3BlY2lmaWVkLgorICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAibGluZS1oZWlnaHQiIH0sCisgICAgICAgICAgICAgICAgSW5oZXJpdHMgPSB0cnVlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PiB0cnVlLAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJub3JtYWwiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH0sCisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IChlbGVtZW50LCBhc3NpZ25lZFZhbHVlLCBzZXR0aW5ncykgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gdmFsdWVGb3JQZXJjZW50YWdlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuUGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUZvclBlcmNlbnRhZ2UgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZWxlbWVudCwgImZvbnQtc2l6ZSIsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVBYnNvbHV0ZUxlbmd0aChlbGVtZW50LCBhc3NpZ25lZFZhbHVlLCBzZXR0aW5ncywgdmFsdWVGb3JQZXJjZW50YWdlKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gdmlzaWJpbGl0eQorICAgICAgICAgICAgLy8gVmFsdWU6ICAgICAgICAgIHZpc2libGUgfCBoaWRkZW4gfCBjb2xsYXBzZSB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICB2aXNpYmxlCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCisgICAgICAgICAgICAvLyBJbmhlcml0ZWQ6ICAgICAgeWVzCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgTi9BCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAidmlzaWJpbGl0eSIgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IHRydWUsCisgICAgICAgICAgICAgICAgSW5jbHVkZXMgPSAoZSwgc2V0dGluZ3MpID0+IHRydWUsCisgICAgICAgICAgICAgICAgSW5pdGlhbFZhbHVlID0gKGVsZW1lbnQsIHNldHRpbmdzKSA9PiBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gInZpc2libGUiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH0sCisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IG51bGwsCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBsaXN0LXN0eWxlLXR5cGUKKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICBkaXNjIHwgY2lyY2xlIHwgc3F1YXJlIHwgZGVjaW1hbCB8IGRlY2ltYWwtbGVhZGluZy16ZXJvIHwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBsb3dlci1yb21hbiB8IHVwcGVyLXJvbWFuIHwgbG93ZXItZ3JlZWsgfCBsb3dlci1sYXRpbiB8CisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgdXBwZXItbGF0aW4gfCBhcm1lbmlhbiB8IGdlb3JnaWFuIHwgbG93ZXItYWxwaGEgfCB1cHBlci1hbHBoYSB8CisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgbm9uZSB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICBkaXNjCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgZWxlbWVudHMgd2l0aCBkaXNwbGF5OiBsaXN0LWl0ZW0KKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICB5ZXMKKyAgICAgICAgICAgIC8vIFBlcmNlbnRhZ2VzOiAgICBOL0EKKyAgICAgICAgICAgIC8vIENvbXB1dGVkIHZhbHVlOiBhcyBzcGVjCisgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZXMgPSBuZXdbXSB7ICJsaXN0LXN0eWxlLXR5cGUiIH0sCisgICAgICAgICAgICAgICAgSW5oZXJpdHMgPSB0cnVlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3BsYXkgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZSwgImRpc3BsYXkiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5LlRvU3RyaW5nKCkgPT0gImxpc3QtaXRlbSIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgSW5pdGlhbFZhbHVlID0gKGVsZW1lbnQsIHNldHRpbmdzKSA9PiBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gImRpc2MiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH0sCisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IG51bGwsCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBsaXN0LXN0eWxlLWltYWdlCisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgPHVyaT4gfCBub25lIHwgaW5oZXJpdAorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIG5vbmUKKyAgICAgICAgICAgIC8vIEFwcGxpZXMgdG86ICAgICBlbGVtZW50cyB3aXRoIOKAmWRpc3BsYXk6IGxpc3QtaXRlbeKAmQorICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIHllcworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIE4vQQorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IGFic29sdXRlIFVSSSBvciDigJlub25l4oCZCisgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZXMgPSBuZXdbXSB7ICJsaXN0LXN0eWxlLWltYWdlIiB9LAorICAgICAgICAgICAgICAgIEluaGVyaXRzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBJbmNsdWRlcyA9IChlLCBzZXR0aW5ncykgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBkaXNwbGF5ID0gR2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlKG51bGwsIGUsICJkaXNwbGF5Iiwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcGxheS5Ub1N0cmluZygpID09ICJsaXN0LWl0ZW0iKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJub25lIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSBudWxsLAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gbGlzdC1zdHlsZS1wb3NpdGlvbgorICAgICAgICAgICAgLy8gVmFsdWU6ICAgICAgICAgIGluc2lkZSB8IG91dHNpZGUgfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgb3V0c2lkZQorICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgIGVsZW1lbnRzIHdpdGgg4oCZZGlzcGxheTogbGlzdC1pdGVt4oCZCisgICAgICAgICAgICAvLyBJbmhlcml0ZWQ6ICAgICAgeWVzCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgTi9BCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAibGlzdC1zdHlsZS1wb3NpdGlvbiIgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IHRydWUsCisgICAgICAgICAgICAgICAgSW5jbHVkZXMgPSAoZSwgc2V0dGluZ3MpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZGlzcGxheSA9IEdldENvbXB1dGVkUHJvcGVydHlWYWx1ZShudWxsLCBlLCAiZGlzcGxheSIsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkuVG9TdHJpbmcoKSA9PSAibGlzdC1pdGVtIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZWxlbWVudCwgc2V0dGluZ3MpID0+IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAibm9uZSIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfSwKKyAgICAgICAgICAgICAgICBDb21wdXRlZFZhbHVlID0gbnVsbCwKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIGZvbnQtZmFtaWx5CisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgW1sgPGZhbWlseS1uYW1lPiB8IDxnZW5lcmljLWZhbWlseT4gXSBbLCA8ZmFtaWx5LW5hbWU+fAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIDxnZW5lcmljLWZhbWlseT5dKiBdIHwgaW5oZXJpdAorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIGRlcGVuZHMgb24gdXNlciBhZ2VudAorICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIHllcworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIE4vQQorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWMKKyAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUluZm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lcyA9IG5ld1tdIHsgImZvbnQtZmFtaWx5IiB9LAorICAgICAgICAgICAgICAgIEluaGVyaXRzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBJbmNsdWRlcyA9IChlLCBzZXR0aW5ncykgPT4gdHJ1ZSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZWxlbWVudCwgc2V0dGluZ3MpID0+IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSBzZXR0aW5ncy5NaW5vckxhdGluRm9udCwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSAoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MpID0+IGFzc2lnbmVkVmFsdWUsCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBmb250LXN0eWxlCisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgbm9ybWFsIHwgaXRhbGljIHwgb2JsaXF1ZSB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICBub3JtYWwKKyAgICAgICAgICAgIC8vIEFwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICB5ZXMKKyAgICAgICAgICAgIC8vIFBlcmNlbnRhZ2VzOiAgICBOL0EKKyAgICAgICAgICAgIC8vIENvbXB1dGVkIHZhbHVlOiBhcyBzcGVjCisgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZXMgPSBuZXdbXSB7ICJmb250LXN0eWxlIiB9LAorICAgICAgICAgICAgICAgIEluaGVyaXRzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBJbmNsdWRlcyA9IChlLCBzZXR0aW5ncykgPT4gdHJ1ZSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZWxlbWVudCwgc2V0dGluZ3MpID0+IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAibm9ybWFsIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSBudWxsLAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gZm9udC12YXJpYW50CisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgbm9ybWFsIHwgc21hbGwtY2FwcyB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICBub3JtYWwKKyAgICAgICAgICAgIC8vIEFwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICB5ZXMKKyAgICAgICAgICAgIC8vIFBlcmNlbnRhZ2VzOiAgICBOL0EKKyAgICAgICAgICAgIC8vIENvbXB1dGVkIHZhbHVlOiBhcyBzcGVjCisgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZXMgPSBuZXdbXSB7ICJmb250LXZhcmlhbnQiIH0sCisgICAgICAgICAgICAgICAgSW5oZXJpdHMgPSB0cnVlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PiB0cnVlLAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJub3JtYWwiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH0sCisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IG51bGwsCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBmb250LXdlaWdodAorICAgICAgICAgICAgLy8gVmFsdWU6ICAgICAgICAgIG5vcm1hbCB8IGJvbGQgfCBib2xkZXIgfCBsaWdodGVyIHwgMTAwIHwgMjAwIHwgMzAwIHwgNDAwIHwgNTAwIHwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICA2MDAgfCA3MDAgfCA4MDAgfCA5MDAgfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgbm9ybWFsCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCisgICAgICAgICAgICAvLyBJbmhlcml0ZWQ6ICAgICAgeWVzCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgTi9BCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogc2VlIHRleHQKKyAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUluZm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lcyA9IG5ld1tdIHsgImZvbnQtd2VpZ2h0IiB9LAorICAgICAgICAgICAgICAgIEluaGVyaXRzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBJbmNsdWRlcyA9IChlLCBzZXR0aW5ncykgPT4gdHJ1ZSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZWxlbWVudCwgc2V0dGluZ3MpID0+IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAibm9ybWFsIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSBudWxsLAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gZm9udC1zaXplCisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgPGFic29sdXRlLXNpemU+IHwgPHJlbGF0aXZlLXNpemU+IHwgPGxlbmd0aD4gfCA8cGVyY2VudGFnZT4gfAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICBtZWRpdW0KKyAgICAgICAgICAgIC8vIEFwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICB5ZXMKKyAgICAgICAgICAgIC8vIFBlcmNlbnRhZ2VzOiAgICByZWZlciB0byBpbmhlcml0ZWQgZm9udCBzaXplCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogYWJzb2x1dGUgbGVuZ3RoCisgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZXMgPSBuZXdbXSB7ICJmb250LXNpemUiIH0sCisgICAgICAgICAgICAgICAgSW5oZXJpdHMgPSB0cnVlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PiB0cnVlLAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICgoZG91YmxlKXNldHRpbmdzLkRlZmF1bHRGb250U2l6ZSkuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSksIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLlN0cmluZywgVW5pdCA9IENzc1VuaXQuUFQgfSB9IH0sCisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IChlbGVtZW50LCBhc3NpZ25lZFZhbHVlLCBzZXR0aW5ncykgPT4gQ29tcHV0ZUFic29sdXRlRm9udFNpemUoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MpLAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gdGV4dC1pbmRlbnQKKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICA8bGVuZ3RoPiB8IDxwZXJjZW50YWdlPiB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICAwCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYmxvY2sgY29udGFpbmVycworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIHllcworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIHJlZmVyIHRvIHdpZHRoIG9mIGNvbnRhaW5pbmcgYmxvY2sKKyAgICAgICAgICAgIC8vIENvbXB1dGVkIHZhbHVlOiB0aGUgcGVyY2VudGFnZSBhcyBzcGVjaWZpZWQgb3IgdGhlIGFic29sdXRlIGxlbmd0aAorICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAidGV4dC1pbmRlbnQiIH0sCisgICAgICAgICAgICAgICAgSW5oZXJpdHMgPSB0cnVlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3BsYXkgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZSwgImRpc3BsYXkiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5LlRvU3RyaW5nKCkgPT0gImJsb2NrIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZWxlbWVudCwgc2V0dGluZ3MpID0+IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiMCIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLk51bWJlciwgVW5pdCA9IENzc1VuaXQuUFQsIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSAoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIHZhbHVlRm9yUGVyY2VudGFnZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LlBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVGb3JQZXJjZW50YWdlID0gR2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlKG51bGwsIGVsZW1lbnQuUGFyZW50LCAid2lkdGgiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlQWJzb2x1dGVMZW5ndGgoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MsIHZhbHVlRm9yUGVyY2VudGFnZSk7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIHRleHQtYWxpZ24KKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICBsZWZ0IHwgcmlnaHQgfCBjZW50ZXIgfCBqdXN0aWZ5IHwgaW5oZXJpdAorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIGEgbmFtZWxlc3MgdmFsdWUgdGhhdCBhY3RzIGFzIOKAmWxlZnTigJkgaWYg4oCZZGlyZWN0aW9u4oCZIGlzIOKAmWx0cuKAmSwg4oCZcmlnaHTigJkgaWYKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICDigJlkaXJlY3Rpb27igJkgaXMg4oCZcnRs4oCZCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYmxvY2sgY29udGFpbmVycworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIHllcworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIE4vQQorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IHRoZSBpbml0aWFsIHZhbHVlIG9yIGFzIHNwZWMKKyAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUluZm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lcyA9IG5ld1tdIHsgInRleHQtYWxpZ24iIH0sCisgICAgICAgICAgICAgICAgSW5oZXJpdHMgPSB0cnVlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3BsYXkgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZSwgImRpc3BsYXkiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5LlRvU3RyaW5nKCkgPT0gImJsb2NrIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZWxlbWVudCwgc2V0dGluZ3MpID0+IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAibGVmdCIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLlN0cmluZywgfSB9IH0sICAvLyB0b2RvIHNob3VsZCBiZSBiYXNlZCBvbiB0aGUgZGlyZWN0aW9uIHByb3BlcnR5CisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IG51bGwsCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyB0ZXh0LWRlY29yYXRpb24KKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICBub25lIHwgWyB1bmRlcmxpbmUgfHwgb3ZlcmxpbmUgfHwgbGluZS10aHJvdWdoIHx8IGJsaW5rIF0gfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgbm9uZQorICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIG5vCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgTi9BCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAidGV4dC1kZWNvcmF0aW9uIiB9LAorICAgICAgICAgICAgICAgIEluaGVyaXRzID0gdHJ1ZSwgICAvLyB0b2RvIG5lZWQgdG8gcmVhZCBjc3MgMTYuMy4xIGluIGZ1bGwgZGV0YWlsIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgaXMgaW1wbGVtZW50ZWQuCisgICAgICAgICAgICAgICAgSW5jbHVkZXMgPSAoZSwgc2V0dGluZ3MpID0+IHRydWUsCisgICAgICAgICAgICAgICAgSW5pdGlhbFZhbHVlID0gKGVsZW1lbnQsIHNldHRpbmdzKSA9PiBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gIm5vbmUiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5TdHJpbmcsIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSBudWxsLAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gbGV0dGVyLXNwYWNpbmcKKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICBub3JtYWwgfCA8bGVuZ3RoPiB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICBub3JtYWwKKyAgICAgICAgICAgIC8vIEFwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICB5ZXMKKyAgICAgICAgICAgIC8vIFBlcmNlbnRhZ2VzOiAgICBOL0EKKyAgICAgICAgICAgIC8vIENvbXB1dGVkIHZhbHVlOiDigJlub3JtYWzigJkgb3IgYWJzb2x1dGUgbGVuZ3RoCisKKyAgICAgICAgICAgIC8vIHdvcmQtc3BhY2luZworICAgICAgICAgICAgLy8gVmFsdWU6ICAgICAgICAgIG5vcm1hbCB8IDxsZW5ndGg+IHwgaW5oZXJpdAorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIG5vcm1hbAorICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIHllcworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIE4vQQorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IGZvciDigJlub3JtYWzigJkgdGhlIHZhbHVlIDA7IG90aGVyd2lzZSB0aGUgYWJzb2x1dGUgbGVuZ3RoCisgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZXMgPSBuZXdbXSB7ICJsZXR0ZXItc3BhY2luZyIsICJ3b3JkLXNwYWNpbmciIH0sCisgICAgICAgICAgICAgICAgSW5oZXJpdHMgPSB0cnVlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PiB0cnVlLAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJub3JtYWwiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5TdHJpbmcsIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSAoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MpID0+IENvbXB1dGVBYnNvbHV0ZUxlbmd0aChlbGVtZW50LCBhc3NpZ25lZFZhbHVlLCBzZXR0aW5ncywgbnVsbCksCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyB3aGl0ZS1zcGFjZQorICAgICAgICAgICAgLy8gVmFsdWU6ICAgICAgICAgIG5vcm1hbCB8IHByZSB8IG5vd3JhcCB8IHByZS13cmFwIHwgcHJlLWxpbmUgfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgbm9ybWFsCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCisgICAgICAgICAgICAvLyBJbmhlcml0ZWQ6ICAgICAgeWVzCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgTi9BCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAid2hpdGUtc3BhY2UiIH0sCisgICAgICAgICAgICAgICAgSW5oZXJpdHMgPSB0cnVlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PiB0cnVlLAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJub3JtYWwiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5TdHJpbmcsIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSBudWxsLAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gY2FwdGlvbi1zaWRlCisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgdG9wIHwgYm90dG9tIHwgaW5oZXJpdAorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIHRvcAorICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgICd0YWJsZS1jYXB0aW9uJyBlbGVtZW50cworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIHllcworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIE4vQQorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWMKKyAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUluZm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lcyA9IG5ld1tdIHsgImNhcHRpb24tc2lkZSIgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IHRydWUsCisgICAgICAgICAgICAgICAgSW5jbHVkZXMgPSAoZSwgc2V0dGluZ3MpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZGlzcGxheSA9IEdldENvbXB1dGVkUHJvcGVydHlWYWx1ZShudWxsLCBlLCAiZGlzcGxheSIsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkuVG9TdHJpbmcoKSA9PSAidGFibGUtY2FwdGlvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgSW5pdGlhbFZhbHVlID0gKGVsZW1lbnQsIHNldHRpbmdzKSA9PiBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gInRvcCIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLlN0cmluZywgfSB9IH0sCisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IG51bGwsCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBib3JkZXItY29sbGFwc2UKKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICBjb2xsYXBzZSB8IHNlcGFyYXRlIHwgaW5oZXJpdAorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIHNlcGFyYXRlCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAg4oCZdGFibGXigJkgYW5kIOKAmWlubGluZS10YWJsZeKAmSBlbGVtZW50cworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIHllcworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIE4vQQorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWMKKyAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUluZm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lcyA9IG5ld1tdIHsgImJvcmRlci1jb2xsYXBzZSIgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IHRydWUsCisgICAgICAgICAgICAgICAgSW5jbHVkZXMgPSAoZSwgc2V0dGluZ3MpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZGlzcGxheSA9IEdldENvbXB1dGVkUHJvcGVydHlWYWx1ZShudWxsLCBlLCAiZGlzcGxheSIsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkuVG9TdHJpbmcoKSA9PSAidGFibGUiIHx8IGRpc3BsYXkuVG9TdHJpbmcoKSA9PSAiaW5saW5lLXRhYmxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZWxlbWVudCwgc2V0dGluZ3MpID0+IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAic2VwYXJhdGUiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5TdHJpbmcsIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSBudWxsLAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gYm9yZGVyLXNwYWNpbmcKKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICA8bGVuZ3RoPiA8bGVuZ3RoPj8gfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgMAorICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgIOKAmXRhYmxl4oCZIGFuZCDigJlpbmxpbmUtdGFibGXigJkgZWxlbWVudHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICB5ZXMKKyAgICAgICAgICAgIC8vIFBlcmNlbnRhZ2VzOiAgICBOL0EKKyAgICAgICAgICAgIC8vIENvbXB1dGVkIHZhbHVlOiB0d28gYWJzb2x1dGUgbGVuZ3RocworICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAiYm9yZGVyLXNwYWNpbmciIH0sCisgICAgICAgICAgICAgICAgSW5oZXJpdHMgPSB0cnVlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3BsYXkgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZSwgImRpc3BsYXkiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5LlRvU3RyaW5nKCkgPT0gInRhYmxlIiB8fCBkaXNwbGF5LlRvU3RyaW5nKCkgPT0gImlubGluZS10YWJsZSIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgSW5pdGlhbFZhbHVlID0gKGVsZW1lbnQsIHNldHRpbmdzKSA9PiBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gIjAiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5OdW1iZXIsIFVuaXQgPSBDc3NVbml0LlBULCB9IH0gfSwKKyAgICAgICAgICAgICAgICBDb21wdXRlZFZhbHVlID0gKGVsZW1lbnQsIGFzc2lnbmVkVmFsdWUsIHNldHRpbmdzKSA9PiBDb21wdXRlQWJzb2x1dGVMZW5ndGgoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MsIG51bGwpLCAgLy8gdG9kbyBuZWVkIHRvIGhhbmRsZSB0d28gbGVuZ3RocyBoZXJlCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBlbXB0eS1jZWxscworICAgICAgICAgICAgLy8gVmFsdWU6ICAgICAgICAgIHNob3cgfCBoaWRlIHwgaW5oZXJpdAorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIHNob3cKKyAgICAgICAgICAgIC8vIEFwcGxpZXMgdG86ICAgICAndGFibGUtY2VsbCcgZWxlbWVudHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICB5ZXMKKyAgICAgICAgICAgIC8vIFBlcmNlbnRhZ2VzOiAgICBOL0EKKyAgICAgICAgICAgIC8vIENvbXB1dGVkIHZhbHVlOiBhcyBzcGVjCisgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZXMgPSBuZXdbXSB7ICJlbXB0eS1jZWxscyIgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IHRydWUsCisgICAgICAgICAgICAgICAgSW5jbHVkZXMgPSAoZSwgc2V0dGluZ3MpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZGlzcGxheSA9IEdldENvbXB1dGVkUHJvcGVydHlWYWx1ZShudWxsLCBlLCAiZGlzcGxheSIsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkuVG9TdHJpbmcoKSA9PSAidGFibGUiIHx8IGRpc3BsYXkuVG9TdHJpbmcoKSA9PSAidGFibGUtY2VsbCIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgSW5pdGlhbFZhbHVlID0gKGVsZW1lbnQsIHNldHRpbmdzKSA9PiBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gInNob3ciLCB9IH0gfSwKKyAgICAgICAgICAgICAgICBDb21wdXRlZFZhbHVlID0gbnVsbCwKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIG1hcmdpbi10b3AsIG1hcmdpbi1ib3R0b20KKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICA8bWFyZ2luLXdpZHRoPiB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICAwCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzIGV4Y2VwdCBlbGVtZW50cyB3aXRoIHRhYmxlIGRpc3BsYXkgdHlwZXMgb3RoZXIgdGhhbiB0YWJsZS1jYXB0aW9uLCB0YWJsZSwgYW5kIGlubGluZS10YWJsZQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIGFsbCBlbGVtZW50cyBleGNlcHQgdGgsIHRkLCB0cgorICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIG5vCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgcmVmZXIgdG8gd2lkdGggb2YgY29udGFpbmluZyBibG9jaworICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IHRoZSBwZXJjZW50YWdlIGFzIHNwZWNpZmllZCBvciB0aGUgYWJzb2x1dGUgbGVuZ3RoCisgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZXMgPSBuZXdbXSB7ICJtYXJnaW4tdG9wIiwgIm1hcmdpbi1ib3R0b20iLCB9LAorICAgICAgICAgICAgICAgIEluaGVyaXRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgSW5jbHVkZXMgPSAoZSwgc2V0dGluZ3MpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZGlzcGxheSA9IEdldENvbXB1dGVkUHJvcGVydHlWYWx1ZShudWxsLCBlLCAiZGlzcGxheSIsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkuVG9TdHJpbmcoKSA9PSAidGFibGUtY2FwdGlvbiIgfHwgZGlzcGxheS5Ub1N0cmluZygpID09ICJ0YWJsZSIgfHwgZGlzcGxheS5Ub1N0cmluZygpID09ICJpbmxpbmUtdGFibGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5EZWZhdWx0QmxvY2tDb250ZW50TWFyZ2luICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLkRlZmF1bHRCbG9ja0NvbnRlbnRNYXJnaW4gPT0gImF1dG8iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJhdXRvIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNldHRpbmdzLkRlZmF1bHRCbG9ja0NvbnRlbnRNYXJnaW4uVG9Mb3dlcigpLkVuZHNXaXRoKCJwdCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHMxID0gc2V0dGluZ3MuRGVmYXVsdEJsb2NrQ29udGVudE1hcmdpbi5TdWJzdHJpbmcoMCwgc2V0dGluZ3MuRGVmYXVsdEJsb2NrQ29udGVudE1hcmdpbi5MZW5ndGggLSAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKHMxLCBOdW1iZXJTdHlsZXMuRmxvYXQsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCBkMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gZDEuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSksIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLk51bWJlciwgVW5pdCA9IENzc1VuaXQuUFQgfSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJpbnZhbGlkIHNldHRpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gIjAiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5OdW1iZXIsIFVuaXQgPSBDc3NVbml0LlBUIH0gfSB9OworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSAoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIHZhbHVlRm9yUGVyY2VudGFnZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LlBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVGb3JQZXJjZW50YWdlID0gR2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlKG51bGwsIGVsZW1lbnQuUGFyZW50LCAid2lkdGgiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlQWJzb2x1dGVMZW5ndGgoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MsIHZhbHVlRm9yUGVyY2VudGFnZSk7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIG1hcmdpbi1yaWdodCwgbWFyZ2luLWxlZnQKKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICA8bWFyZ2luLXdpZHRoPiB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICAwCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzIGV4Y2VwdCBlbGVtZW50cyB3aXRoIHRhYmxlIGRpc3BsYXkgdHlwZXMgb3RoZXIgdGhhbiB0YWJsZS1jYXB0aW9uLCB0YWJsZSwgYW5kIGlubGluZS10YWJsZQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIGFsbCBlbGVtZW50cyBleGNlcHQgdGgsIHRkLCB0cgorICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIG5vCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgcmVmZXIgdG8gd2lkdGggb2YgY29udGFpbmluZyBibG9jaworICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IHRoZSBwZXJjZW50YWdlIGFzIHNwZWNpZmllZCBvciB0aGUgYWJzb2x1dGUgbGVuZ3RoCisgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZXMgPSBuZXdbXSB7ICJtYXJnaW4tcmlnaHQiLCAibWFyZ2luLWxlZnQiLCB9LAorICAgICAgICAgICAgICAgIEluaGVyaXRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgSW5jbHVkZXMgPSAoZSwgc2V0dGluZ3MpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZGlzcGxheSA9IEdldENvbXB1dGVkUHJvcGVydHlWYWx1ZShudWxsLCBlLCAiZGlzcGxheSIsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkuVG9TdHJpbmcoKSA9PSAidGFibGUtY2FwdGlvbiIgfHwgZGlzcGxheS5Ub1N0cmluZygpID09ICJ0YWJsZSIgfHwgZGlzcGxheS5Ub1N0cmluZygpID09ICJpbmxpbmUtdGFibGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICIwIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuTnVtYmVyLCBVbml0ID0gQ3NzVW5pdC5QVCwgfSB9IH0sCisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IChlbGVtZW50LCBhc3NpZ25lZFZhbHVlLCBzZXR0aW5ncykgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gdmFsdWVGb3JQZXJjZW50YWdlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuUGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUZvclBlcmNlbnRhZ2UgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZWxlbWVudC5QYXJlbnQsICJ3aWR0aCIsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVBYnNvbHV0ZUxlbmd0aChlbGVtZW50LCBhc3NpZ25lZFZhbHVlLCBzZXR0aW5ncywgdmFsdWVGb3JQZXJjZW50YWdlKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gcGFkZGluZy10b3AsIHBhZGRpbmctcmlnaHQsIHBhZGRpbmctYm90dG9tLCBwYWRkaW5nLWxlZnQKKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICA8cGFkZGluZy13aWR0aD4gfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgMAorICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cyBleGNlcHQgdGFibGUtcm93LWdyb3VwLCB0YWJsZS1oZWFkZXItZ3JvdXAsCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGFibGUtZm9vdGVyLWdyb3VwLCB0YWJsZS1yb3csIHRhYmxlLWNvbHVtbi1ncm91cCBhbmQgdGFibGUtY29sdW1uCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgYWxsIGVsZW1lbnRzIGV4Y2VwdCB0cgorICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIG5vCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgcmVmZXIgdG8gd2lkdGggb2YgY29udGFpbmluZyBibG9jaworICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IHRoZSBwZXJjZW50YWdlIGFzIHNwZWNpZmllZCBvciB0aGUgYWJzb2x1dGUgbGVuZ3RoCisgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZXMgPSBuZXdbXSB7ICJwYWRkaW5nLXRvcCIsICJwYWRkaW5nLXJpZ2h0IiwgInBhZGRpbmctYm90dG9tIiwgInBhZGRpbmctbGVmdCIgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3BsYXkgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZSwgImRpc3BsYXkiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBkdiA9IGRpc3BsYXkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR2ID09ICJ0YWJsZS1yb3ctZ3JvdXAiIHx8IGR2ID09ICJ0YWJsZS1oZWFkZXItZ3JvdXAiIHx8IGR2ID09ICJ0YWJsZS1mb290ZXItZ3JvdXAiIHx8IGR2ID09ICJ0YWJsZS1yb3ciIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBkdiA9PSAidGFibGUtY29sdW1uLWdyb3VwIiB8fCBkdiA9PSAidGFibGUtY29sdW1uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZWxlbWVudCwgc2V0dGluZ3MpID0+IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiMCIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLk51bWJlciwgVW5pdCA9IENzc1VuaXQuUFQsIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSAoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIHZhbHVlRm9yUGVyY2VudGFnZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LlBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVGb3JQZXJjZW50YWdlID0gR2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlKG51bGwsIGVsZW1lbnQuUGFyZW50LCAid2lkdGgiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlQWJzb2x1dGVMZW5ndGgoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MsIHZhbHVlRm9yUGVyY2VudGFnZSk7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIGJvcmRlci10b3Atd2lkdGgsIGJvcmRlci1yaWdodC13aWR0aCwgYm9yZGVyLWJvdHRvbS13aWR0aCwgYm9yZGVyLWxlZnQtd2lkdGgKKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICA8Ym9yZGVyLXdpZHRoPiB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICBtZWRpdW0KKyAgICAgICAgICAgIC8vIEFwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICBubworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIE4vQQorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IGFic29sdXRlIGxlbmd0aDsgJzAnIGlmIHRoZSBib3JkZXIgc3R5bGUgaXMgJ25vbmUnIG9yICdoaWRkZW4nCisgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZXMgPSBuZXdbXSB7ICJib3JkZXItdG9wLXdpZHRoIiwgImJvcmRlci1yaWdodC13aWR0aCIsICJib3JkZXItYm90dG9tLXdpZHRoIiwgImJvcmRlci1sZWZ0LXdpZHRoIiwgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PiB0cnVlLAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICIwIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuTnVtYmVyLCBVbml0ID0gQ3NzVW5pdC5QVCwgfSB9IH0sCisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IChlbGVtZW50LCBhc3NpZ25lZFZhbHVlLCBzZXR0aW5ncykgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFzc2lnbmVkVmFsdWVTdHIgPSBhc3NpZ25lZFZhbHVlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaWduZWRWYWx1ZVN0ciA9PSAidGhpbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiMC43NSIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLk51bWJlciwgVW5pdCA9IENzc1VuaXQuUFQsIH0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFzc2lnbmVkVmFsdWVTdHIgPT0gIm1lZGl1bSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiMy4wIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuTnVtYmVyLCBVbml0ID0gQ3NzVW5pdC5QVCwgfSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaWduZWRWYWx1ZVN0ciA9PSAidGhpY2siKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gIjQuNSIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLk51bWJlciwgVW5pdCA9IENzc1VuaXQuUFQsIH0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVBYnNvbHV0ZUxlbmd0aChlbGVtZW50LCBhc3NpZ25lZFZhbHVlLCBzZXR0aW5ncywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBib3JkZXItdG9wLXN0eWxlLCBib3JkZXItcmlnaHQtc3R5bGUsIGJvcmRlci1ib3R0b20tc3R5bGUsIGJvcmRlci1sZWZ0LXN0eWxlCisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgPGJvcmRlci1zdHlsZT4gfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgbm9uZQorICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIG5vCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgTi9BCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogYXMgc3BlY2lmaWVkCisgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZXMgPSBuZXdbXSB7ICJib3JkZXItdG9wLXN0eWxlIiwgImJvcmRlci1yaWdodC1zdHlsZSIsICJib3JkZXItYm90dG9tLXN0eWxlIiwgImJvcmRlci1sZWZ0LXN0eWxlIiwgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PiB0cnVlLAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJub25lIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSBudWxsLAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gZGlzcGxheQorICAgICAgICAgICAgLy8gVmFsdWU6ICAgICAgICAgIGlubGluZSB8IGJsb2NrIHwgbGlzdC1pdGVtIHwgaW5saW5lLWJsb2NrIHwgdGFibGUgfCBpbmxpbmUtdGFibGUgfAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHRhYmxlLXJvdy1ncm91cCB8IHRhYmxlLWhlYWRlci1ncm91cCB8IHRhYmxlLWZvb3Rlci1ncm91cCB8CisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGFibGUtcm93IHwgdGFibGUtY29sdW1uLWdyb3VwIHwgdGFibGUtY29sdW1uIHwgdGFibGUtY2VsbCB8CisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGFibGUtY2FwdGlvbiB8IG5vbmUgfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgaW5saW5lCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCisgICAgICAgICAgICAvLyBJbmhlcml0ZWQ6ICAgICAgbm8KKyAgICAgICAgICAgIC8vIFBlcmNlbnRhZ2VzOiAgICBOL0EKKyAgICAgICAgICAgIC8vIENvbXB1dGVkIHZhbHVlOiBzZWUgdGV4dAorICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAiZGlzcGxheSIsIH0sCisgICAgICAgICAgICAgICAgSW5oZXJpdHMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICBJbmNsdWRlcyA9IChlLCBzZXR0aW5ncykgPT4gdHJ1ZSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZWxlbWVudCwgc2V0dGluZ3MpID0+IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiaW5saW5lIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSBudWxsLAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gcG9zaXRpb24KKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICBzdGF0aWMgfCByZWxhdGl2ZSB8IGFic29sdXRlIHwgZml4ZWQgfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgc3RhdGljCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCisgICAgICAgICAgICAvLyBJbmhlcml0ZWQ6ICAgICAgbm8KKyAgICAgICAgICAgIC8vIFBlcmNlbnRhZ2VzOiAgICBOL0EKKyAgICAgICAgICAgIC8vIENvbXB1dGVkIHZhbHVlOiBhcyBzcGVjaWZpZWQKKyAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUluZm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lcyA9IG5ld1tdIHsgInBvc2l0aW9uIiwgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PiB0cnVlLAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJzdGF0aWMiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH0sCisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IG51bGwsCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBmbG9hdAorICAgICAgICAgICAgLy8gVmFsdWU6ICAgICAgICAgIGxlZnQgfCByaWdodCB8IG5vbmUgfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgbm9uZQorICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgIGFsbCwgYnV0IHNlZSA5LjcgcC4gMTUzCisgICAgICAgICAgICAvLyBJbmhlcml0ZWQ6ICAgICAgbm8KKyAgICAgICAgICAgIC8vIFBlcmNlbnRhZ2VzOiAgICBOL0EKKyAgICAgICAgICAgIC8vIENvbXB1dGVkIHZhbHVlOiBhcyBzcGVjaWZpZWQKKyAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUluZm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lcyA9IG5ld1tdIHsgImZsb2F0IiwgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PiB0cnVlLAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJub25lIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSBudWxsLAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gdW5pY29kZS1iaWRpCisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgbm9ybWFsIHwgZW1iZWQgfCBiaWRpLW92ZXJyaWRlIHwgaW5oZXJpdAorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIG5vcm1hbAorICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cywgYnV0IHNlZSBwcm9zZQorICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIG5vCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgTi9BCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAidW5pY29kZS1iaWRpIiwgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PiB0cnVlLAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJub3JtYWwiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH0sCisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IG51bGwsCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kLWNvbG9yCisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgPGNvbG9yPiB8IHRyYW5zcGFyZW50IHwgaW5oZXJpdAorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIHRyYW5zcGFyZW50CisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCisgICAgICAgICAgICAvLyBJbmhlcml0ZWQ6ICAgICAgbm8KKyAgICAgICAgICAgIC8vIFBlcmNlbnRhZ2VzOiAgICBOL0EKKyAgICAgICAgICAgIC8vIENvbXB1dGVkIHZhbHVlOiBhcyBzcGVjCisgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZXMgPSBuZXdbXSB7ICJiYWNrZ3JvdW5kLWNvbG9yIiwgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PiB0cnVlLAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJ0cmFuc3BhcmVudCIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfSwKKyAgICAgICAgICAgICAgICBDb21wdXRlZFZhbHVlID0gKGVsZW1lbnQsIGFzc2lnbmVkVmFsdWUsIHNldHRpbmdzKSA9PiBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gR2V0V21sQ29sb3JGcm9tRXhwcmVzc2lvbihhc3NpZ25lZFZhbHVlKSwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9LAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gdGV4dC10cmFuc2Zvcm0KKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICBjYXBpdGFsaXplIHwgdXBwZXJjYXNlIHwgbG93ZXJjYXNlIHwgbm9uZSB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICBub25lCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCisgICAgICAgICAgICAvLyBJbmhlcml0ZWQ6ICAgICAgeWVzCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgTi9BCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAidGV4dC10cmFuc2Zvcm0iLCB9LAorICAgICAgICAgICAgICAgIEluaGVyaXRzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBJbmNsdWRlcyA9IChlLCBzZXR0aW5ncykgPT4gdHJ1ZSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZWxlbWVudCwgc2V0dGluZ3MpID0+IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAibm9uZSIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfSwKKyAgICAgICAgICAgICAgICBDb21wdXRlZFZhbHVlID0gbnVsbCwKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIHRhYmxlLWxheW91dAorICAgICAgICAgICAgLy8gVmFsdWU6ICAgICAgICAgIGF1dG8gfCBmaXhlZCB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICBhdXRvCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAg4oCZdGFibGXigJkgYW5kIOKAmWlubGluZS10YWJsZeKAmSBlbGVtZW50cworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIG5vCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgTi9BCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAidGFibGUtbGF5b3V0IiB9LAorICAgICAgICAgICAgICAgIEluaGVyaXRzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBJbmNsdWRlcyA9IChlLCBzZXR0aW5ncykgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBkaXNwbGF5ID0gR2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlKG51bGwsIGUsICJkaXNwbGF5Iiwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcGxheS5Ub1N0cmluZygpID09ICJ0YWJsZSIgfHwgZGlzcGxheS5Ub1N0cmluZygpID09ICJpbmxpbmUtdGFibGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJhdXRvIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuU3RyaW5nLCB9IH0gfSwKKyAgICAgICAgICAgICAgICBDb21wdXRlZFZhbHVlID0gbnVsbCwKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIGVtcHR5LWNlbGxzCisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgc2hvdyB8IGhpZGUgfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgc2hvdworICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgICd0YWJsZS1jZWxsJyBlbGVtZW50cworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIHllcworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIE4vQQorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWMKKyAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUluZm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lcyA9IG5ld1tdIHsgImJvcmRlci1zcGFjaW5nIiB9LAorICAgICAgICAgICAgICAgIEluaGVyaXRzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBJbmNsdWRlcyA9IChlLCBzZXR0aW5ncykgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBkaXNwbGF5ID0gR2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlKG51bGwsIGUsICJkaXNwbGF5Iiwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcGxheS5Ub1N0cmluZygpID09ICJ0YWJsZS1jZWxsIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZWxlbWVudCwgc2V0dGluZ3MpID0+IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAic2hvdyIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLlN0cmluZywgfSB9IH0sCisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IG51bGwsCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBib3JkZXItdG9wLWNvbG9yLCBib3JkZXItcmlnaHQtY29sb3IsIGJvcmRlci1ib3R0b20tY29sb3IsIGJvcmRlci1sZWZ0LWNvbG9yCisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgPGNvbG9yPiB8IHRyYW5zcGFyZW50IHwgaW5oZXJpdAorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgY29sb3IgcHJvcGVydHkKKyAgICAgICAgICAgIC8vIEFwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICBubworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIE4vQQorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IHdoZW4gdGFrZW4gZnJvbSB0aGUg4oCZY29sb3LigJkgcHJvcGVydHksIHRoZSBjb21wdXRlZCB2YWx1ZSBvZgorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIOKAmWNvbG9y4oCZOyBvdGhlcndpc2UsIGFzIHNwZWNpZmllZAorICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAiYm9yZGVyLXRvcC1jb2xvciIsICJib3JkZXItcmlnaHQtY29sb3IiLCAiYm9yZGVyLWJvdHRvbS1jb2xvciIsICJib3JkZXItbGVmdC1jb2xvciIsIH0sCisgICAgICAgICAgICAgICAgSW5oZXJpdHMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICBJbmNsdWRlcyA9IChlLCBzZXR0aW5ncykgPT4gdHJ1ZSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZSwgc2V0dGluZ3MpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3BsYXkgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZSwgImNvbG9yIiwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzcGxheTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSAoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MpID0+IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSBHZXRXbWxDb2xvckZyb21FeHByZXNzaW9uKGFzc2lnbmVkVmFsdWUpLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH0sCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyB3aWR0aAorICAgICAgICAgICAgLy8gVmFsdWU6ICAgICAgICAgIDxsZW5ndGg+IHwgPHBlcmNlbnRhZ2U+IHwgYXV0byB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICBhdXRvCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzIGJ1dCBub24tcmVwbGFjZWQgaW4tbGluZSBlbGVtZW50cywgdGFibGUgcm93cywgYW5kIHJvdyBncm91cHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICBubworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIHJlZmVyIHRvIHdpZHRoIG9mIGNvbnRhaW5pbmcgYmxvY2sKKyAgICAgICAgICAgIC8vIENvbXB1dGVkIHZhbHVlOiB0aGUgcGVyY2VudGFnZSBvciAnYXV0bycgYXMgc3BlY2lmaWVkIG9yIHRoZSBhYnNvbHV0ZSBsZW5ndGgKKyAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUluZm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lcyA9IG5ld1tdIHsgIndpZHRoIiB9LAorICAgICAgICAgICAgICAgIEluaGVyaXRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgSW5jbHVkZXMgPSAoZSwgc2V0dGluZ3MpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZS5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UuaW1nKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHZhciBkaXNwbGF5ID0gR2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlKG51bGwsIGUsICJkaXNwbGF5Iiwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICB2YXIgZHYgPSBkaXNwbGF5LlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkdiA9PSAiaW5saW5lIiB8fCBkdiA9PSAidGFibGUtcm93IiB8fCBkdiA9PSAidGFibGUtcm93LWdyb3VwIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZWxlbWVudCwgc2V0dGluZ3MpID0+IAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuUGFyZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT8gcGFnZVdpZHRoID0gKGRvdWJsZT8pc2V0dGluZ3MuU2VjdFByLkVsZW1lbnRzKFcucGdTeikuQXR0cmlidXRlcyhXLl93KS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VXaWR0aCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VXaWR0aCA9IDEyMjQwOworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPyBsZWZ0TWFyZ2luID0gKGRvdWJsZT8pc2V0dGluZ3MuU2VjdFByLkVsZW1lbnRzKFcucGdNYXIpLkF0dHJpYnV0ZXMoVy5sZWZ0KS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnRNYXJnaW4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0TWFyZ2luID0gMTQ0MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT8gcmlnaHRNYXJnaW4gPSAoZG91YmxlPylzZXR0aW5ncy5TZWN0UHIuRWxlbWVudHMoVy5wZ01hcikuQXR0cmlidXRlcyhXLmxlZnQpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRNYXJnaW4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodE1hcmdpbiA9IDE0NDA7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgd2lkdGggPSAoZG91YmxlKShwYWdlV2lkdGggLSBsZWZ0TWFyZ2luIC0gcmlnaHRNYXJnaW4pIC8gMjA7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9IHdpZHRoLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5TdHJpbmcsIFVuaXQgPSBDc3NVbml0LlBULCB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJhdXRvIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuU3RyaW5nLCB9IH0gfTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSAoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lICE9IFhodG1sTm9OYW1lc3BhY2UuY2FwdGlvbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lICE9IFhodG1sTm9OYW1lc3BhY2UudGQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTmFtZSAhPSBYaHRtbE5vTmFtZXNwYWNlLnRoICYmCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgIT0gWGh0bWxOb05hbWVzcGFjZS50ciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lICE9IFhodG1sTm9OYW1lc3BhY2UudGFibGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUuSXNBdXRvKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm8gcGkgPSBQcm9wZXJ0eUluZm9MaXN0LkZpcnN0T3JEZWZhdWx0KHAgPT4gcC5OYW1lcy5Db250YWlucygid2lkdGgiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZGlzcGxheSA9IEdldENvbXB1dGVkUHJvcGVydHlWYWx1ZShwaSwgZWxlbWVudCwgImRpc3BsYXkiLCBzZXR0aW5ncykuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5ICE9ICJpbmxpbmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gcGFyZW50UHJvcGVydHlWYWx1ZSA9IEdldENvbXB1dGVkUHJvcGVydHlWYWx1ZShwaSwgZWxlbWVudC5QYXJlbnQsICJ3aWR0aCIsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50UHJvcGVydHlWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIHZhbHVlRm9yUGVyY2VudGFnZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnRUb1F1ZXJ5ID0gZWxlbWVudC5QYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50VG9RdWVyeSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUZvclBlcmNlbnRhZ2UgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZWxlbWVudFRvUXVlcnksICJ3aWR0aCIsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUZvclBlcmNlbnRhZ2UuSXNBdXRvKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb1F1ZXJ5ID0gZWxlbWVudFRvUXVlcnkuUGFyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZUFic29sdXRlTGVuZ3RoKGVsZW1lbnQsIGFzc2lnbmVkVmFsdWUsIHNldHRpbmdzLCB2YWx1ZUZvclBlcmNlbnRhZ2UpOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBtaW4td2lkdGgKKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICA8bGVuZ3RoPiB8IDxwZXJjZW50YWdlPiB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICAwCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzIGJ1dCBub24tcmVwbGFjZWQgaW4tbGluZSBlbGVtZW50cywgdGFibGUgcm93cywgYW5kIHJvdyBncm91cHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICBubworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIHJlZmVyIHRvIHdpZHRoIG9mIGNvbnRhaW5pbmcgYmxvY2sKKyAgICAgICAgICAgIC8vIENvbXB1dGVkIHZhbHVlOiB0aGUgcGVyY2VudGFnZSBhcyBzcGVjIG9yIHRoZSBhYnNvbHV0ZSBsZW5ndGgKKyAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUluZm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lcyA9IG5ld1tdIHsgIm1pbi13aWR0aCIgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3BsYXkgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZSwgImRpc3BsYXkiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIHZhciBkdiA9IGRpc3BsYXkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR2ID09ICJpbmxpbmUiIHx8IGR2ID09ICJ0YWJsZS1yb3ciIHx8IGR2ID09ICJ0YWJsZS1yb3ctZ3JvdXAiKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICIwIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuTnVtYmVyLCBVbml0ID0gQ3NzVW5pdC5QVCwgfSB9IH0sCisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IChlbGVtZW50LCBhc3NpZ25lZFZhbHVlLCBzZXR0aW5ncykgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gdmFsdWVGb3JQZXJjZW50YWdlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuUGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUZvclBlcmNlbnRhZ2UgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZWxlbWVudC5QYXJlbnQsICJ3aWR0aCIsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVBYnNvbHV0ZUxlbmd0aChlbGVtZW50LCBhc3NpZ25lZFZhbHVlLCBzZXR0aW5ncywgdmFsdWVGb3JQZXJjZW50YWdlKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gbWF4LXdpZHRoCisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgPGxlbmd0aD4gfCA8cGVyY2VudGFnZT4gfCBub25lIHwgaW5oZXJpdAorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIG5vbmUKKyAgICAgICAgICAgIC8vIEFwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMgYnV0IG5vbi1yZXBsYWNlZCBpbi1saW5lIGVsZW1lbnRzLCB0YWJsZSByb3dzLCBhbmQgcm93IGdyb3VwcworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIG5vCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgcmVmZXIgdG8gd2lkdGggb2YgY29udGFpbmluZyBibG9jaworICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IHRoZSBwZXJjZW50YWdlIGFzIHNwZWMgb3IgdGhlIGFic29sdXRlIGxlbmd0aAorICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAibWF4LXdpZHRoIiB9LAorICAgICAgICAgICAgICAgIEluaGVyaXRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgSW5jbHVkZXMgPSAoZSwgc2V0dGluZ3MpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZGlzcGxheSA9IEdldENvbXB1dGVkUHJvcGVydHlWYWx1ZShudWxsLCBlLCAiZGlzcGxheSIsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGR2ID0gZGlzcGxheS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBpZiAoZHYgPT0gImlubGluZSIgfHwgZHYgPT0gInRhYmxlLXJvdyIgfHwgZHYgPT0gInRhYmxlLXJvdy1ncm91cCIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgSW5pdGlhbFZhbHVlID0gKGVsZW1lbnQsIHNldHRpbmdzKSA9PiBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gIm5vbmUiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5TdHJpbmcsIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSAoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIHZhbHVlRm9yUGVyY2VudGFnZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LlBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVGb3JQZXJjZW50YWdlID0gR2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlKG51bGwsIGVsZW1lbnQuUGFyZW50LCAid2lkdGgiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlQWJzb2x1dGVMZW5ndGgoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MsIHZhbHVlRm9yUGVyY2VudGFnZSk7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIGhlaWdodAorICAgICAgICAgICAgLy8gVmFsdWU6ICAgICAgICAgIDxsZW5ndGg+IHwgPHBlcmNlbnRhZ2U+IHwgYXV0byB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICBhdXRvCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzIGJ1dCBub24tcmVwbGFjZWQgaW4tbGluZSBlbGVtZW50cywgdGFibGUgY29sdW1ucywgYW5kIGNvbHVtbiBncm91cHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICBubworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIHNlZSBwcm9zZQorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IHRoZSBwZXJjZW50YWdlIGFzIHNwZWMgb3IgdGhlIGFic29sdXRlIGxlbmd0aAorICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAiaGVpZ2h0IiB9LAorICAgICAgICAgICAgICAgIEluaGVyaXRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgSW5jbHVkZXMgPSAoZSwgc2V0dGluZ3MpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZS5OYW1lID09IFhodG1sTm9OYW1lc3BhY2UuaW1nKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHZhciBkaXNwbGF5ID0gR2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlKG51bGwsIGUsICJkaXNwbGF5Iiwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICB2YXIgZHYgPSBkaXNwbGF5LlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkdiA9PSAiaW5saW5lIiB8fCBkdiA9PSAidGFibGUtcm93IiB8fCBkdiA9PSAidGFibGUtcm93LWdyb3VwIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZWxlbWVudCwgc2V0dGluZ3MpID0+IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiYXV0byIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLlN0cmluZywgfSB9IH0sCisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IChlbGVtZW50LCBhc3NpZ25lZFZhbHVlLCBzZXR0aW5ncykgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gdmFsdWVGb3JQZXJjZW50YWdlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuUGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUZvclBlcmNlbnRhZ2UgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZWxlbWVudC5QYXJlbnQsICJoZWlnaHQiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlQWJzb2x1dGVMZW5ndGgoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MsIHZhbHVlRm9yUGVyY2VudGFnZSk7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIG1pbi1oZWlnaHQKKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICA8bGVuZ3RoPiB8IDxwZXJjZW50YWdlPiB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICAwCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzIGJ1dCBub24tcmVwbGFjZWQgaW4tbGluZSBlbGVtZW50cywgdGFibGUgY29sdW1ucywgYW5kIGNvbHVtbiBncm91cHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICBubworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIHNlZSBwcm9zZQorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IHRoZSBwZXJjZW50YWdlIGFzIHNwZWMgb3IgdGhlIGFic29sdXRlIGxlbmd0aAorICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAibWluLWhlaWdodCIgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3BsYXkgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZSwgImRpc3BsYXkiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIHZhciBkdiA9IGRpc3BsYXkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR2ID09ICJpbmxpbmUiIHx8IGR2ID09ICJ0YWJsZS1jb2x1bW4iIHx8IGR2ID09ICJ0YWJsZS1jb2x1bW4tZ3JvdXAiKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICIwIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuTnVtYmVyLCBVbml0ID0gQ3NzVW5pdC5QVCwgfSB9IH0sCisgICAgICAgICAgICAgICAgQ29tcHV0ZWRWYWx1ZSA9IChlbGVtZW50LCBhc3NpZ25lZFZhbHVlLCBzZXR0aW5ncykgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gdmFsdWVGb3JQZXJjZW50YWdlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuUGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUZvclBlcmNlbnRhZ2UgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZWxlbWVudC5QYXJlbnQsICJoZWlnaHQiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlQWJzb2x1dGVMZW5ndGgoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MsIHZhbHVlRm9yUGVyY2VudGFnZSk7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIG1heC1oZWlnaHQKKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICA8bGVuZ3RoPiB8IDxwZXJjZW50YWdlPiB8IG5vbmUgfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgbm9uZQorICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cyBidXQgbm9uLXJlcGxhY2VkIGluLWxpbmUgZWxlbWVudHMsIHRhYmxlIGNvbHVtbnMsIGFuZCBjb2x1bW4gZ3JvdXBzCisgICAgICAgICAgICAvLyBJbmhlcml0ZWQ6ICAgICAgbm8KKyAgICAgICAgICAgIC8vIFBlcmNlbnRhZ2VzOiAgICByZWZlciB0byBoZWlnaHQgb2YgY29udGFpbmluZyBibG9jaworICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IHRoZSBwZXJjZW50YWdlIGFzIHNwZWMgb3IgdGhlIGFic29sdXRlIGxlbmd0aAorICAgICAgICAgICAgbmV3IFByb3BlcnR5SW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWVzID0gbmV3W10geyAibWF4LWhlaWdodCIgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3BsYXkgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZSwgImRpc3BsYXkiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIHZhciBkdiA9IGRpc3BsYXkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR2ID09ICJpbmxpbmUiIHx8IGR2ID09ICJ0YWJsZS1jb2x1bW4iIHx8IGR2ID09ICJ0YWJsZS1jb2x1bW4tZ3JvdXAiKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IChlbGVtZW50LCBzZXR0aW5ncykgPT4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJub25lIiwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuU3RyaW5nLCB9IH0gfSwKKyAgICAgICAgICAgICAgICBDb21wdXRlZFZhbHVlID0gKGVsZW1lbnQsIGFzc2lnbmVkVmFsdWUsIHNldHRpbmdzKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiB2YWx1ZUZvclBlcmNlbnRhZ2UgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5QYXJlbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlRm9yUGVyY2VudGFnZSA9IEdldENvbXB1dGVkUHJvcGVydHlWYWx1ZShudWxsLCBlbGVtZW50LlBhcmVudCwgImhlaWdodCIsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVBYnNvbHV0ZUxlbmd0aChlbGVtZW50LCBhc3NpZ25lZFZhbHVlLCBzZXR0aW5ncywgdmFsdWVGb3JQZXJjZW50YWdlKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gdmVydGljYWwtYWxpZ24KKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICBiYXNlbGluZSB8IHN1YiB8IHN1cGVyIHwgdG9wIHwgdGV4dC10b3AgfCBtaWRkbGUgfCBib3R0b20gfCB0ZXh0LWJvdHRvbSB8CisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgPHBlcmNlbnRhZ2U+IHwgPGxlbmd0aD4gfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgYmFzZWxpbmUKKyAgICAgICAgICAgIC8vIEFwcGxpZXMgdG86ICAgICBpbmxpbmUtbGV2ZWwgYW5kICd0YWJsZS1jZWxsJyBlbGVtZW50cworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIG5vCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgcmVmZXIgdG8gdGhlIGxpbmUgaGVpZ2h0IG9mIHRoZSBlbGVtZW50IGl0c2VsZgorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IGZvciA8bGVuZ3RoPiBhbmQgPHBlcmNlbnRhZ2U+IHRoZSBhYnNvbHV0ZSBsZW5ndGgsIG90aGVyd2lzZSBhcyBzcGVjaWZpZWQuCisgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZXMgPSBuZXdbXSB7ICJ2ZXJ0aWNhbC1hbGlnbiIgfSwKKyAgICAgICAgICAgICAgICBJbmhlcml0cyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIEluY2x1ZGVzID0gKGUsIHNldHRpbmdzKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3BsYXkgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZSwgImRpc3BsYXkiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIHZhciBkdiA9IGRpc3BsYXkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR2ID09ICJpbmxpbmUiIHx8IGR2ID09ICJ0YWJsZS1jZWxsIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBJbml0aWFsVmFsdWUgPSAoZWxlbWVudCwgc2V0dGluZ3MpID0+IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiYmFzZWxpbmUiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5TdHJpbmcsIH0gfSB9LAorICAgICAgICAgICAgICAgIENvbXB1dGVkVmFsdWUgPSAoZWxlbWVudCwgYXNzaWduZWRWYWx1ZSwgc2V0dGluZ3MpID0+IGFzc2lnbmVkVmFsdWUsICAvLyB0b2RvIGZpeAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gcG9zaXRpb25lZCBlbGVtZW50cyBhcmUgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHRvcAorICAgICAgICAgICAgLy8gVmFsdWU6ICAgICAgICAgIDxsZW5ndGg+IHwgPHBlcmNlbnRhZ2U+IHwgYXV0byB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICBhdXRvCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgcG9zaXRpb25lZCBlbGVtZW50cworICAgICAgICAgICAgLy8gSW5oZXJpdGVkOiAgICAgIG5vCisgICAgICAgICAgICAvLyBQZXJjZW50YWdlczogICAgcmVmZXIgdG8gaGVpZ2h0IG9mIGNvbnRhaW5pbmcgYmxvY2sKKyAgICAgICAgICAgIC8vIENvbXB1dGVkIHZhbHVlOiBpZiBzcGVjaWZpZWQgYXMgYSBsZW5ndGgsIHRoZSBjb3JyZXNwb25kaW5nIGFic29sdXRlIGxlbmd0aDsgaWYKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYXMgYSBwZXJjZW50YWdlLCB0aGUgc3BlY2lmaWVkIHZhbHVlOyBvdGhlcndpc2UsIOKAmWF1dG/igJkuCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIC8vIHJpZ2h0CisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgPGxlbmd0aD4gfCA8cGVyY2VudGFnZT4gfCBhdXRvIHwgaW5oZXJpdAorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIGF1dG8KKyAgICAgICAgICAgIC8vIEFwcGxpZXMgdG86ICAgICBwb3NpdGlvbmVkIGVsZW1lbnRzCisgICAgICAgICAgICAvLyBJbmhlcml0ZWQ6ICAgICAgbm8KKyAgICAgICAgICAgIC8vIFBlcmNlbnRhZ2VzOiAgICByZWZlciB0byB3aWR0aCBvZiBjb250YWluaW5nIGJsb2NrCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogaWYgc3BlY2lmaWVkIGFzIGEgbGVuZ3RoLCB0aGUgY29ycmVzcG9uZGluZyBhYnNvbHV0ZSBsZW5ndGg7IGlmCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGFzIGEgcGVyY2VudGFnZSwgdGhlIHNwZWNpZmllZCB2YWx1ZTsgb3RoZXJ3aXNlLCDigJlhdXRv4oCZLgorICAgICAgICAgICAgLy8gCisgICAgICAgICAgICAvLyBib3R0b20KKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICA8bGVuZ3RoPiB8IDxwZXJjZW50YWdlPiB8IGF1dG8gfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgYXV0bworICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgIHBvc2l0aW9uZWQgZWxlbWVudHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICBubworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIHJlZmVyIHRvIGhlaWdodCBvZiBjb250YWluaW5nIGJsb2NrCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogaWYgc3BlY2lmaWVkIGFzIGEgbGVuZ3RoLCB0aGUgY29ycmVzcG9uZGluZyBhYnNvbHV0ZSBsZW5ndGg7IGlmCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGFzIGEgcGVyY2VudGFnZSwgdGhlIHNwZWNpZmllZCB2YWx1ZTsgb3RoZXJ3aXNlLCDigJlhdXRv4oCZLgorICAgICAgICAgICAgLy8gCisgICAgICAgICAgICAvLyBsZWZ0CisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgPGxlbmd0aD4gfCA8cGVyY2VudGFnZT4gfCBhdXRvIHwgaW5oZXJpdAorICAgICAgICAgICAgLy8gSW5pdGlhbDogICAgICAgIGF1dG8KKyAgICAgICAgICAgIC8vIEFwcGxpZXMgdG86ICAgICBwb3NpdGlvbmVkIGVsZW1lbnRzCisgICAgICAgICAgICAvLyBJbmhlcml0ZWQ6ICAgICAgbm8KKyAgICAgICAgICAgIC8vIFBlcmNlbnRhZ2VzOiAgICByZWZlciB0byB3aWR0aCBvZiBjb250YWluaW5nIGJsb2NrCisgICAgICAgICAgICAvLyBDb21wdXRlZCB2YWx1ZTogaWYgc3BlY2lmaWVkIGFzIGEgbGVuZ3RoLCB0aGUgY29ycmVzcG9uZGluZyBhYnNvbHV0ZSBsZW5ndGg7IGlmCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGFzIGEgcGVyY2VudGFnZSwgdGhlIHNwZWNpZmllZCB2YWx1ZTsgb3RoZXJ3aXNlLCDigJlhdXRv4oCZLgorCisgICAgICAgICAgICAvLyBmbG9hdGVkIGVsZW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gY2xlYXIKKyAgICAgICAgICAgIC8vIFZhbHVlOiAgICAgICAgICBub25lIHwgbGVmdCB8IHJpZ2h0IHwgYm90aCB8IGluaGVyaXQKKyAgICAgICAgICAgIC8vIEluaXRpYWw6ICAgICAgICBub25lCisgICAgICAgICAgICAvLyBBcHBsaWVzIHRvOiAgICAgYmxvY2stbGV2ZWwgZWxlbWVudHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICBubworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIE4vQQorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWNpZmllZAorICAgICAgICAgICAgLy8gCisgICAgICAgICAgICAvLyB6LWluZGV4CisgICAgICAgICAgICAvLyBWYWx1ZTogICAgICAgICAgYXV0byB8IGludGVnZXIgfCBpbmhlcml0CisgICAgICAgICAgICAvLyBJbml0aWFsOiAgICAgICAgYXV0bworICAgICAgICAgICAgLy8gQXBwbGllcyB0bzogICAgIHBvc2l0aW9uZWQgZWxlbWVudHMKKyAgICAgICAgICAgIC8vIEluaGVyaXRlZDogICAgICBubworICAgICAgICAgICAgLy8gUGVyY2VudGFnZXM6ICAgIE4vQQorICAgICAgICAgICAgLy8gQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWMKKyAgICAgICAgfTsKKworICAgICAgICAvKgorICAgICAgICAgKiAxLiBQcm9jZXNzIHVzZXItYWdlbnQgZGVmYXVsdCBzdHlsZSBzaGVldAorICAgICAgICAgKiAyLiBQcm9jZXNzIHVzZXItc3VwcGxpZWQgc3R5bGUgc2hlZXQKKyAgICAgICAgICogMy4gcHJvY2VzcyBhdXRob3Itc3VwcGxpZWQgc3R5bGUgc2hlZXQKKyAgICAgICAgICogNC4gcHJvY2VzcyBTVFlMRSBlbGVtZW50CisgICAgICAgICAqIDUuIHByb2Nlc3Mgc3R5bGUgYXR0cmlidXRlIG9uIGFsbCBlbGVtZW50cworICAgICAgICAgKiA2LiBleHBhbmQgYWxsIHNob3J0aGFuZCBwcm9wZXJ0aWVzIC0gdGhlIG5ldyBwcm9wZXJ0aWVzIGhhdmUgdGhlIHNhbWUgc29ydCBrZXkgYXMgc2hvcnRoYW5kIHByb3AKKyAgICAgICAgICogNy4gQWRkIGluaXRpYWwgdmFsdWVzIGZvciBhbGwgcHJvcGVydGllcyB0aGF0IGRvbid0IGhhdmUgdmFsdWVzCisgICAgICAgICovCisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEFwcGx5QWxsQ3NzKAorICAgICAgICAgICAgc3RyaW5nIGRlZmF1bHRDc3MsCisgICAgICAgICAgICBzdHJpbmcgYXV0aG9yQ3NzLAorICAgICAgICAgICAgc3RyaW5nIHVzZXJDc3MsCisgICAgICAgICAgICBYRWxlbWVudCBuZXdYSHRtbCwKKyAgICAgICAgICAgIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzLAorICAgICAgICAgICAgb3V0IENzc0RvY3VtZW50IGRlZmF1bHRDc3NEb2MsCisgICAgICAgICAgICBvdXQgQ3NzRG9jdW1lbnQgYXV0aG9yQ3NzRG9jLAorICAgICAgICAgICAgb3V0IENzc0RvY3VtZW50IHVzZXJDc3NEb2MsCisgICAgICAgICAgICBzdHJpbmcgYW5ub3RhdGVkSHRtbER1bXBGaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHByb3BlcnR5U2VxdWVuY2UgPSAxOworCisgICAgICAgICAgICBDc3NQYXJzZXIgZGVmYXVsdENzc1BhcnNlciA9IG5ldyBDc3NQYXJzZXIoKTsKKyAgICAgICAgICAgIGRlZmF1bHRDc3NEb2MgPSBkZWZhdWx0Q3NzUGFyc2VyLlBhcnNlVGV4dChkZWZhdWx0Q3NzKTsKKyAgICAgICAgICAgIEFwcGx5Q3NzRG9jdW1lbnQoCisgICAgICAgICAgICAgICAgZGVmYXVsdENzc0RvYywKKyAgICAgICAgICAgICAgICBuZXdYSHRtbCwKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eS5IaWdoT3JkZXJQcmlvcml0eS5Vc2VyQWdlbnROb3JtYWwsCisgICAgICAgICAgICAgICAgUHJvcGVydHkuSGlnaE9yZGVyUHJpb3JpdHkuVXNlckFnZW50SGlnaCwKKyAgICAgICAgICAgICAgICByZWYgcHJvcGVydHlTZXF1ZW5jZSk7CisKKyAgICAgICAgICAgIC8vLy8gdG9kbyBkdW1wIGhlcmUsIHNlZSBpZiBtYXJnaW4gaXMgc2V0IG9uIGJvZHkuCisgICAgICAgICAgICAvL2lmIChhbm5vdGF0ZWRIdG1sRHVtcEZpbGVOYW1lICE9IG51bGwpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgLy8gICAgV3JpdGVYSHRtbFdpdGhBbm5vdGF0aW9ucyhuZXdYSHRtbCwgc2IpOworICAgICAgICAgICAgLy8gICAgRmlsZS5Xcml0ZUFsbFRleHQoYW5ub3RhdGVkSHRtbER1bXBGaWxlTmFtZSwgc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAvLyAgICBFbnZpcm9ubWVudC5FeGl0KDApOworICAgICAgICAgICAgLy99CisKKyAgICAgICAgICAgIC8vRHVtcENzcyh1c2VyQWdlbnRDc3NEb2MpOworICAgICAgICAgICAgLy9FbnZpcm9ubWVudC5FeGl0KDApOworCisgICAgICAgICAgICBDc3NQYXJzZXIgdXNlckNzc1BhcnNlciA9IG5ldyBDc3NQYXJzZXIoKTsKKyAgICAgICAgICAgIHVzZXJDc3NEb2MgPSB1c2VyQ3NzUGFyc2VyLlBhcnNlVGV4dCh1c2VyQ3NzKTsKKyAgICAgICAgICAgIEFwcGx5Q3NzRG9jdW1lbnQoCisgICAgICAgICAgICAgICAgdXNlckNzc0RvYywKKyAgICAgICAgICAgICAgICBuZXdYSHRtbCwKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eS5IaWdoT3JkZXJQcmlvcml0eS5Vc2VySGlnaCwKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eS5IaWdoT3JkZXJQcmlvcml0eS5Vc2VyTm9ybWFsLAorICAgICAgICAgICAgICAgIHJlZiBwcm9wZXJ0eVNlcXVlbmNlKTsKKworICAgICAgICAgICAgLy9EdW1wQ3NzKHVzZXJDc3NEb2MpOworICAgICAgICAgICAgLy9FbnZpcm9ubWVudC5FeGl0KDApOworCisgICAgICAgICAgICBDc3NQYXJzZXIgYXV0aG9yQ3NzUGFyc2VyID0gbmV3IENzc1BhcnNlcigpOworICAgICAgICAgICAgYXV0aG9yQ3NzRG9jID0gYXV0aG9yQ3NzUGFyc2VyLlBhcnNlVGV4dChhdXRob3JDc3MpOworICAgICAgICAgICAgQXBwbHlDc3NEb2N1bWVudCgKKyAgICAgICAgICAgICAgICBhdXRob3JDc3NEb2MsCisgICAgICAgICAgICAgICAgbmV3WEh0bWwsCisgICAgICAgICAgICAgICAgUHJvcGVydHkuSGlnaE9yZGVyUHJpb3JpdHkuQXV0aG9yTm9ybWFsLAorICAgICAgICAgICAgICAgIFByb3BlcnR5LkhpZ2hPcmRlclByaW9yaXR5LkF1dGhvckhpZ2gsCisgICAgICAgICAgICAgICAgcmVmIHByb3BlcnR5U2VxdWVuY2UpOworCisgICAgICAgICAgICAvL3N0cmluZyBzID0gRHVtcENzcyhhdXRob3JDc3NEb2MpOworICAgICAgICAgICAgLy9GaWxlLldyaXRlQWxsVGV4dCgiQ3NzVHJlZUR1bXAudHh0Iiwgcyk7CisgICAgICAgICAgICAvL0Vudmlyb25tZW50LkV4aXQoMCk7CisKKyAgICAgICAgICAgIC8vIElmIHByb2Nlc3Npbmcgc3R5bGUgZWxlbWVudCwgZG8gaXQgaGVyZS4KKworICAgICAgICAgICAgQXBwbHlTdHlsZUF0dHJpYnV0ZXMobmV3WEh0bWwsIHJlZiBwcm9wZXJ0eVNlcXVlbmNlKTsKKworICAgICAgICAgICAgRXhwYW5kU2hvcnRoYW5kUHJvcGVydGllcyhuZXdYSHRtbCwgc2V0dGluZ3MpOworCisgICAgICAgICAgICBTZXRBbGxWYWx1ZXMobmV3WEh0bWwsIHNldHRpbmdzKTsKKworICAgICAgICAgICAgaWYgKGFubm90YXRlZEh0bWxEdW1wRmlsZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBXcml0ZVhIdG1sV2l0aEFubm90YXRpb25zKG5ld1hIdG1sLCBzYik7CisgICAgICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoYW5ub3RhdGVkSHRtbER1bXBGaWxlTmFtZSwgc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFNldEFsbFZhbHVlcyhYRWxlbWVudCB4SHRtbCwgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlbGVtZW50IGluIHhIdG1sLkRlc2NlbmRhbnRzQW5kU2VsZigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwcm9wZXJ0eUluZm8gaW4gUHJvcGVydHlJbmZvTGlzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUluZm8uSW5jbHVkZXMoZWxlbWVudCwgc2V0dGluZ3MpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgbmFtZSBpbiBwcm9wZXJ0eUluZm8uTmFtZXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5SW5mbywgZWxlbWVudCwgbmFtZSwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZiBmYWxzZQorICBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUKKyAgICBpZiAocHJvcGVydHkgaXMgYWxyZWFkeSBjb21wdXRlZCkKKyAgICAgIHJldHVybiB0aGUgY29tcHV0ZWQgdmFsdWUKKyAgICBpZiAocHJvcGVydHkgaXMgc2V0KQorICAgICAgY29tcHV0ZSB2YWx1ZQorICAgICAgc2V0IHRoZSBjb21wdXRlZCB2YWx1ZQorICAgICAgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZQorICAgIGlmIChwcm9wZXJ0eSBpcyBpbmhlcml0ZWQgKGVpdGhlciBiZWNhdXNlIGl0IHdhcyBzZXQgdG8gaW5oZXJpdCwgb3IgYmVjYXVzZSBpdCBpcyBhbiBpbmhlcml0ZWQgcHJvcGVydHkpKQorICAgICAgaWYgKHBhcmVudCBleGlzdHMpCisgICAgICAgIGNhbGwgR2V0Q29tcHV0ZWRWYWx1ZSBvbiBwYXJlbnQKKyAgICAgICAgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZQorICAgIGVsc2UKKyAgICAgIGNhbGwgR2V0SW5pdGlhbFZhbHVlIGZvciBwcm9wZXJ0eQorICAgICAgY29tcHV0ZSB2YWx1ZQorICAgICAgc2V0IHRoZSBjb21wdXRlZCB2YWx1ZQorICAgICAgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZQorI2VuZGlmCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ3NzRXhwcmVzc2lvbiBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUoUHJvcGVydHlJbmZvIHByb3BlcnR5SW5mbywgWEVsZW1lbnQgZWxlbWVudCwgc3RyaW5nIHByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZiAocHJvcGVydHkgaXMgYWxyZWFkeSBjb21wdXRlZCkKKyAgICAgICAgICAgIC8vICAgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZQorICAgICAgICAgICAgRGljdGlvbmFyeTxzdHJpbmcsIENzc0V4cHJlc3Npb24+IGNvbXB1dGVkVmFsdWVzID0gZWxlbWVudC5Bbm5vdGF0aW9uPERpY3Rpb25hcnk8c3RyaW5nLCBDc3NFeHByZXNzaW9uPj4oKTsKKyAgICAgICAgICAgIGlmIChjb21wdXRlZFZhbHVlcyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbXB1dGVkVmFsdWVzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBDc3NFeHByZXNzaW9uPigpOworICAgICAgICAgICAgICAgIGVsZW1lbnQuQWRkQW5ub3RhdGlvbihjb21wdXRlZFZhbHVlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29tcHV0ZWRWYWx1ZXMuQ29udGFpbnNLZXkocHJvcGVydHlOYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIHIgPSBjb21wdXRlZFZhbHVlc1twcm9wZXJ0eU5hbWVdOworICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiBwcm9wZXJ0eSBpcyBub3Qgc2V0IG9yIHByb3BlcnR5IGlzIHNldCB0byBpbmhlcml0ZWQgdmFsdWUsIHRoZW4gZ2V0IGluaGVyaXRlZCBvciBpbml0aWFsaXplZCB2YWx1ZS4KKyAgICAgICAgICAgIHN0cmluZyBwTmFtZSA9IHByb3BlcnR5TmFtZS5Ub0xvd2VyKCk7CisgICAgICAgICAgICBpZiAocHJvcGVydHlJbmZvID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJvcGVydHlJbmZvID0gUHJvcGVydHlJbmZvTGlzdC5GaXJzdE9yRGVmYXVsdChwaSA9PiBwaS5OYW1lcy5Db250YWlucyhwTmFtZSkpOworICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJhbGwgcG9zc2libGUgcHJvcGVydGllcyBzaG91bGQgYmUgaW4gdGhlIGxpc3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9wZXJ0eT4gcHJvcExpc3QgPSBlbGVtZW50LkFubm90YXRpb248RGljdGlvbmFyeTxzdHJpbmcsIFByb3BlcnR5Pj4oKTsKKyAgICAgICAgICAgIGlmIChwcm9wTGlzdCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gY29tcHV0ZWRWYWx1ZSA9IEdldEluaGVyaXRlZE9ySW5pdGlhbGl6ZWRWYWx1ZShjb21wdXRlZFZhbHVlcywgcHJvcGVydHlJbmZvLCBlbGVtZW50LCBwcm9wZXJ0eU5hbWUsIGZhbHNlLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVkVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXByb3BMaXN0LkNvbnRhaW5zS2V5KHBOYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGNvbXB1dGVkVmFsdWUgPSBHZXRJbmhlcml0ZWRPckluaXRpYWxpemVkVmFsdWUoY29tcHV0ZWRWYWx1ZXMsIHByb3BlcnR5SW5mbywgZWxlbWVudCwgcHJvcGVydHlOYW1lLCBmYWxzZSwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIHJldHVybiBjb21wdXRlZFZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHJvcGVydHkgcHJvcCA9IHByb3BMaXN0W3BOYW1lXTsKKyAgICAgICAgICAgIHN0cmluZyBwcm9wU3RyID0gcHJvcC5FeHByZXNzaW9uLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAocHJvcFN0ciA9PSAiaW5oZXJpdGVkIiB8fCBwcm9wU3RyID09ICJhdXRvIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGNvbXB1dGVkVmFsdWUgPSBHZXRJbmhlcml0ZWRPckluaXRpYWxpemVkVmFsdWUoY29tcHV0ZWRWYWx1ZXMsIHByb3BlcnR5SW5mbywgZWxlbWVudCwgcHJvcGVydHlOYW1lLCB0cnVlLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVkVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiBwcm9wZXJ0eSBpcyBzZXQsIHRoZW4gY29tcHV0ZSB0aGUgdmFsdWUsIHJldHVybiB0aGUgY29tcHV0ZWQgdmFsdWUKKyAgICAgICAgICAgIENzc0V4cHJlc3Npb24gY29tcHV0ZWRWYWx1ZTI7CisgICAgICAgICAgICBpZiAocHJvcGVydHlJbmZvLkNvbXB1dGVkVmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb21wdXRlZFZhbHVlMiA9IHByb3AuRXhwcmVzc2lvbjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb21wdXRlZFZhbHVlMiA9IHByb3BlcnR5SW5mby5Db21wdXRlZFZhbHVlKGVsZW1lbnQsIHByb3AuRXhwcmVzc2lvbiwgc2V0dGluZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tcHV0ZWRWYWx1ZXMuQWRkKHByb3BlcnR5TmFtZSwgY29tcHV0ZWRWYWx1ZTIpOworICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVkVmFsdWUyOworICAgICAgICB9CisKKyAgICAgICAgLy9pZiAocHJvcGVydHkgaXMgaW5oZXJpdGVkIChlaXRoZXIgYmVjYXVzZSBpdCB3YXMgc2V0IHRvIGluaGVyaXQsIG9yIGJlY2F1c2UgaXQgaXMgYW4gaW5oZXJpdGVkIHByb3BlcnR5KSkKKyAgICAgICAgLy8gIGlmIChwYXJlbnQgZXhpc3RzKQorICAgICAgICAvLyAgICBjYWxsIEdldENvbXB1dGVkVmFsdWUgb24gcGFyZW50CisgICAgICAgIC8vICAgIHJldHVybiB0aGUgY29tcHV0ZWQgdmFsdWUKKyAgICAgICAgLy9lbHNlCisgICAgICAgIC8vICBjYWxsIEdldEluaXRpYWxWYWx1ZSBmb3IgcHJvcGVydHkKKyAgICAgICAgLy8gIGNvbXB1dGUgdmFsdWUKKyAgICAgICAgLy8gIHNldCB0aGUgY29tcHV0ZWQgdmFsdWUKKyAgICAgICAgLy8gIHJldHVybiB0aGUgY29tcHV0ZWQgdmFsdWUKKyAgICAgICAgcHVibGljIHN0YXRpYyBDc3NFeHByZXNzaW9uIEdldEluaGVyaXRlZE9ySW5pdGlhbGl6ZWRWYWx1ZShEaWN0aW9uYXJ5PHN0cmluZywgQ3NzRXhwcmVzc2lvbj4gY29tcHV0ZWRWYWx1ZXMsIFByb3BlcnR5SW5mbyBwcm9wZXJ0eUluZm8sIFhFbGVtZW50IGVsZW1lbnQsIHN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2wgdmFsdWVJc0luaGVyaXQsIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHByb3BlcnR5SW5mby5Jbmhlcml0cyB8fCB2YWx1ZUlzSW5oZXJpdCkgJiYgZWxlbWVudC5QYXJlbnQgIT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8uSW5jbHVkZXMoZWxlbWVudC5QYXJlbnQsIHNldHRpbmdzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIHBhcmVudFByb3BlcnR5VmFsdWUgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUocHJvcGVydHlJbmZvLCBlbGVtZW50LlBhcmVudCwgcHJvcGVydHlOYW1lLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgY29tcHV0ZWRWYWx1ZXMuQWRkKHByb3BlcnR5TmFtZSwgcGFyZW50UHJvcGVydHlWYWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudFByb3BlcnR5VmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGluaXRpYWxQcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlJbmZvLkluaXRpYWxWYWx1ZShlbGVtZW50LCBzZXR0aW5ncyk7CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGNvbXB1dGVkVmFsdWU7CisgICAgICAgICAgICBpZiAocHJvcGVydHlJbmZvLkNvbXB1dGVkVmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb21wdXRlZFZhbHVlID0gaW5pdGlhbFByb3BlcnR5VmFsdWU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29tcHV0ZWRWYWx1ZSA9IHByb3BlcnR5SW5mby5Db21wdXRlZFZhbHVlKGVsZW1lbnQsIGluaXRpYWxQcm9wZXJ0eVZhbHVlLCBzZXR0aW5ncyk7CisgICAgICAgICAgICBjb21wdXRlZFZhbHVlcy5BZGQocHJvcGVydHlOYW1lLCBjb21wdXRlZFZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBjb21wdXRlZFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBcHBseUNzc0RvY3VtZW50KAorICAgICAgICAgICAgQ3NzRG9jdW1lbnQgY3NzRG9jLAorICAgICAgICAgICAgWEVsZW1lbnQgeEh0bWwsCisgICAgICAgICAgICBQcm9wZXJ0eS5IaWdoT3JkZXJQcmlvcml0eSBub3RJbXBvcnRhbnRIaWdoT3JkZXJTb3J0LAorICAgICAgICAgICAgUHJvcGVydHkuSGlnaE9yZGVyUHJpb3JpdHkgaW1wb3J0YW50SGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgIHJlZiBpbnQgcHJvcGVydHlTZXF1ZW5jZSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJ1bGVTZXQgaW4gY3NzRG9jLlJ1bGVTZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzZWxlY3RvciBpbiBydWxlU2V0LlNlbGVjdG9ycykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFwcGx5U2VsZWN0b3Ioc2VsZWN0b3IsIHJ1bGVTZXQsIHhIdG1sLCBub3RJbXBvcnRhbnRIaWdoT3JkZXJTb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW50SGlnaE9yZGVyU29ydCwgcmVmIHByb3BlcnR5U2VxdWVuY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIENzc0V4cHJlc3Npb24gQ29tcHV0ZUFic29sdXRlTGVuZ3RoKFhFbGVtZW50IGVsZW1lbnQsIENzc0V4cHJlc3Npb24gYXNzaWduZWRWYWx1ZSwgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MsCisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGxlbmd0aEZvclBlcmNlbnRhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhc3NpZ25lZFZhbHVlLlRlcm1zLkNvdW50ICE9IDEpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJTaG91bGQgbm90IGhhdmUgYSB1bml0IHdpdGggbW9yZSB0aGFuIG9uZSB0ZXJtIik7CisKKyAgICAgICAgICAgIHN0cmluZyB2YWx1ZSA9IGFzc2lnbmVkVmFsdWUuVGVybXMuRmlyc3QoKS5WYWx1ZTsKKyAgICAgICAgICAgIGJvb2wgbmVnYXRpdmUgPSBhc3NpZ25lZFZhbHVlLlRlcm1zLkZpcnN0KCkuU2lnbiA9PSAnLSc7CisKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAidGhpbiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBuZXdFeHByMSA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiLjMiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5OdW1iZXIsIFVuaXQgPSBDc3NVbml0LlBULCB9IH0gfTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3RXhwcjE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gIm1lZGl1bSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBuZXdFeHByMiA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiMS4yMCIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLk51bWJlciwgVW5pdCA9IENzc1VuaXQuUFQsIH0gfSB9OworICAgICAgICAgICAgICAgIHJldHVybiBuZXdFeHByMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAidGhpY2siKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gbmV3RXhwcjMgPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gIjEuODAiLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5OdW1iZXIsIFVuaXQgPSBDc3NVbml0LlBULCB9IH0gfTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3RXhwcjM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gImF1dG8iIHx8IHZhbHVlID09ICJub3JtYWwiIHx8IHZhbHVlID09ICJub25lIikKKyAgICAgICAgICAgICAgICByZXR1cm4gYXNzaWduZWRWYWx1ZTsKKworICAgICAgICAgICAgQ3NzVW5pdD8gdW5pdCA9IGFzc2lnbmVkVmFsdWUuVGVybXMuRmlyc3QoKS5Vbml0OworICAgICAgICAgICAgaWYgKHVuaXQgPT0gQ3NzVW5pdC5QVCB8fCB1bml0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGFzc2lnbmVkVmFsdWU7CisKKyAgICAgICAgICAgIGlmICh1bml0ID09IENzc1VuaXQuUGVyY2VudCAmJiBsZW5ndGhGb3JQZXJjZW50YWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiYXV0byIsIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKworICAgICAgICAgICAgZG91YmxlIGRlY1ZhbHVlOworICAgICAgICAgICAgaWYgKCFkb3VibGUuVHJ5UGFyc2UodmFsdWUsIE51bWJlclN0eWxlcy5GbG9hdCwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IGRlY1ZhbHVlKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oInZhbHVlIGRpZCBub3QgcGFyc2UiKTsKKyAgICAgICAgICAgIGlmIChuZWdhdGl2ZSkKKyAgICAgICAgICAgICAgICBkZWNWYWx1ZSA9IC1kZWNWYWx1ZTsKKworICAgICAgICAgICAgZG91YmxlPyBuZXdQdFNpemUgPSBudWxsOworICAgICAgICAgICAgaWYgKHVuaXQgPT0gQ3NzVW5pdC5QZXJjZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBwdFNpemU7CisgICAgICAgICAgICAgICAgaWYgKCFkb3VibGUuVHJ5UGFyc2UobGVuZ3RoRm9yUGVyY2VudGFnZS5UZXJtcy5GaXJzdCgpLlZhbHVlLCBOdW1iZXJTdHlsZXMuRmxvYXQsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCBwdFNpemUpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oImRpZCBub3QgcmV0dXJuIGEgZG91YmxlPyIpOworICAgICAgICAgICAgICAgIG5ld1B0U2l6ZSA9IHB0U2l6ZSAqIGRlY1ZhbHVlIC8gMTAwZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHVuaXQgPT0gQ3NzVW5pdC5FTSB8fCB1bml0ID09IENzc1VuaXQuRVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBmb250U2l6ZSA9IEdldENvbXB1dGVkUHJvcGVydHlWYWx1ZShudWxsLCBlbGVtZW50LCAiZm9udC1zaXplIiwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIGRvdWJsZSBkZWNGb250U2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoIWRvdWJsZS5UcnlQYXJzZShmb250U2l6ZS5UZXJtcy5GaXJzdCgpLlZhbHVlLCBOdW1iZXJTdHlsZXMuRmxvYXQsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCBkZWNGb250U2l6ZSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICBuZXdQdFNpemUgPSAodW5pdCA9PSBDc3NVbml0LkVNKSA/IGRlY0ZvbnRTaXplICogZGVjVmFsdWUgOiBkZWNGb250U2l6ZSAqIGRlY1ZhbHVlIC8gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodW5pdCA9PSBudWxsICYmIGRlY1ZhbHVlID09IDBkKQorICAgICAgICAgICAgICAgICAgICBuZXdQdFNpemUgPSAwZDsKKyAgICAgICAgICAgICAgICBpZiAodW5pdCA9PSBDc3NVbml0LklOKQorICAgICAgICAgICAgICAgICAgICBuZXdQdFNpemUgPSBkZWNWYWx1ZSAqIDcyLjBkOworICAgICAgICAgICAgICAgIGlmICh1bml0ID09IENzc1VuaXQuQ00pCisgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZSA9IChkZWNWYWx1ZSAvIDIuNTRkKSAqIDcyLjBkOworICAgICAgICAgICAgICAgIGlmICh1bml0ID09IENzc1VuaXQuTU0pCisgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZSA9IChkZWNWYWx1ZSAvIDI1LjRkKSAqIDcyLjBkOworICAgICAgICAgICAgICAgIGlmICh1bml0ID09IENzc1VuaXQuUEMpCisgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZSA9IGRlY1ZhbHVlICogMTJkOworICAgICAgICAgICAgICAgIGlmICh1bml0ID09IENzc1VuaXQuUFgpCisgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZSA9IGRlY1ZhbHVlICogMC43NWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW5ld1B0U2l6ZS5IYXNWYWx1ZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBzaG91bGQgbm90IGhhdmUgcmVhY2hlZCB0aGlzIGV4Y2VwdGlvbiIpOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBuZXdFeHByID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9IG5ld1B0U2l6ZS5WYWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuTnVtYmVyLCBVbml0ID0gQ3NzVW5pdC5QVCwgfSB9IH07CisgICAgICAgICAgICByZXR1cm4gbmV3RXhwcjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIENzc0V4cHJlc3Npb24gQ29tcHV0ZUFic29sdXRlRm9udFNpemUoWEVsZW1lbnQgZWxlbWVudCwgQ3NzRXhwcmVzc2lvbiBhc3NpZ25lZFZhbHVlLCBIdG1sVG9XbWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFzc2lnbmVkVmFsdWUuVGVybXMuQ291bnQgIT0gMSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIlNob3VsZCBub3QgaGF2ZSBhIHVuaXQgd2l0aCBtb3JlIHRoYW4gb25lIHRlcm0sIEkgdGhpbmsiKTsKKyAgICAgICAgICAgIHN0cmluZyB2YWx1ZSA9IGFzc2lnbmVkVmFsdWUuVGVybXMuRmlyc3QoKS5WYWx1ZTsKKyAgICAgICAgICAgIENzc1VuaXQ/IHVuaXQgPSBhc3NpZ25lZFZhbHVlLlRlcm1zLkZpcnN0KCkuVW5pdDsKKyAgICAgICAgICAgIGlmICh1bml0ID09IENzc1VuaXQuUFQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGFzc2lnbmVkVmFsdWU7CisgICAgICAgICAgICBpZiAoRm9udFNpemVNYXAuQ29udGFpbnNLZXkodmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gRm9udFNpemVNYXBbdmFsdWVdLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLCBUeXBlID0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NUZXJtVHlwZS5OdW1iZXIsIFVuaXQgPSBDc3NVbml0LlBULCB9IH0gfTsKKworICAgICAgICAgICAgLy8gdG9kbyB3aGF0IHNob3VsZCB0aGUgY2FsY3VsYXRpb24gYmUgZm9yIGNvbXB1dGluZyBsYXJnZXIgLyBzbWFsbGVyPworICAgICAgICAgICAgaWYgKHZhbHVlID09ICJsYXJnZXIiIHx8IHZhbHVlID09ICJzbWFsbGVyIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIHBhcmVudEZvbnRTaXplID0gR2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlKG51bGwsIGVsZW1lbnQuUGFyZW50LCAiZm9udC1zaXplIiwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIGRvdWJsZSBwdFNpemU7CisgICAgICAgICAgICAgICAgaWYgKCFkb3VibGUuVHJ5UGFyc2UocGFyZW50Rm9udFNpemUuVGVybXMuRmlyc3QoKS5WYWx1ZSwgTnVtYmVyU3R5bGVzLkZsb2F0LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgcHRTaXplKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJkaWQgbm90IHJldHVybiBhIGRvdWJsZT8iKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgbmV3UHRTaXplMiA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJsYXJnZXIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0U2l6ZSA8IDEwKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHRTaXplMiA9IDEwZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0U2l6ZSA9PSAxMCB8fCBwdFNpemUgPT0gMTEpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQdFNpemUyID0gMTJkOworICAgICAgICAgICAgICAgICAgICBpZiAocHRTaXplID09IDEyKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHRTaXplMiA9IDEzLjVkOworICAgICAgICAgICAgICAgICAgICBpZiAocHRTaXplID49IDEzICYmIHB0U2l6ZSA8PSAxNSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZTIgPSAxOGQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChwdFNpemUgPj0gMTYgJiYgcHRTaXplIDw9IDIwKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHRTaXplMiA9IDI0ZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0U2l6ZSA+PSAyMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZTIgPSAzNmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAic21hbGxlciIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocHRTaXplIDw9IDExKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHRTaXplMiA9IDcuNWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChwdFNpemUgPT0gMTIpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQdFNpemUyID0gMTBkOworICAgICAgICAgICAgICAgICAgICBpZiAocHRTaXplID49IDEzICYmIHB0U2l6ZSA8PSAxNSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZTIgPSAxMmQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChwdFNpemUgPj0gMTYgJiYgcHRTaXplIDw9IDIwKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHRTaXplMiA9IDEzLjVkOworICAgICAgICAgICAgICAgICAgICBpZiAocHRTaXplID49IDIxICYmIHB0U2l6ZSA8PSAyOSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZTIgPSAxOGQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChwdFNpemUgPj0gMzApCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQdFNpemUyID0gMjRkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9IG5ld1B0U2l6ZTIuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSksIFR5cGUgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1Rlcm1UeXBlLk51bWJlciwgVW5pdCA9IENzc1VuaXQuUFQsIH0gfSB9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG91YmxlIGRlY1ZhbHVlOworICAgICAgICAgICAgaWYgKCFkb3VibGUuVHJ5UGFyc2UodmFsdWUsIE51bWJlclN0eWxlcy5GbG9hdCwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IGRlY1ZhbHVlKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oImVtIHZhbHVlIGRpZCBub3QgcGFyc2UiKTsKKyAgICAgICAgICAgIGRvdWJsZT8gbmV3UHRTaXplID0gbnVsbDsKKyAgICAgICAgICAgIGlmICh1bml0ID09IENzc1VuaXQuRU0gfHwgdW5pdCA9PSBDc3NVbml0LkVYIHx8IHVuaXQgPT0gQ3NzVW5pdC5QZXJjZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gcGFyZW50Rm9udFNpemUgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZWxlbWVudC5QYXJlbnQsICJmb250LXNpemUiLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgZG91YmxlIHB0U2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoIWRvdWJsZS5UcnlQYXJzZShwYXJlbnRGb250U2l6ZS5UZXJtcy5GaXJzdCgpLlZhbHVlLCBOdW1iZXJTdHlsZXMuRmxvYXQsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCBwdFNpemUpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oImRpZCBub3QgcmV0dXJuIGEgZG91YmxlPyIpOworICAgICAgICAgICAgICAgIGlmICh1bml0ID09IENzc1VuaXQuRU0pCisgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZSA9IHB0U2l6ZSAqIGRlY1ZhbHVlOworICAgICAgICAgICAgICAgIGlmICh1bml0ID09IENzc1VuaXQuRVgpCisgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZSA9IHB0U2l6ZSAvIDIgKiBkZWNWYWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAodW5pdCA9PSBDc3NVbml0LlBlcmNlbnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZSA9IHB0U2l6ZSAqIGRlY1ZhbHVlIC8gMTAwZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodW5pdCA9PSBDc3NVbml0LklOKQorICAgICAgICAgICAgICAgICAgICBuZXdQdFNpemUgPSBkZWNWYWx1ZSAqIDcyLjBkOworICAgICAgICAgICAgICAgIGlmICh1bml0ID09IENzc1VuaXQuQ00pCisgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZSA9IChkZWNWYWx1ZSAvIDIuNTRkKSAqIDcyLjBkOworICAgICAgICAgICAgICAgIGlmICh1bml0ID09IENzc1VuaXQuTU0pCisgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZSA9IChkZWNWYWx1ZSAvIDI1LjRkKSAqIDcyLjBkOworICAgICAgICAgICAgICAgIGlmICh1bml0ID09IENzc1VuaXQuUEMpCisgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZSA9IGRlY1ZhbHVlICogMTJkOworICAgICAgICAgICAgICAgIGlmICh1bml0ID09IENzc1VuaXQuUFgpCisgICAgICAgICAgICAgICAgICAgIG5ld1B0U2l6ZSA9IGRlY1ZhbHVlICogMC43NWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW5ld1B0U2l6ZS5IYXNWYWx1ZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBzaG91bGQgbm90IGhhdmUgcmVhY2hlZCB0aGlzIGV4Y2VwdGlvbiIpOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBuZXdFeHByID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9IG5ld1B0U2l6ZS5WYWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSwgVHlwZSA9IE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzVGVybVR5cGUuTnVtYmVyLCBVbml0ID0gQ3NzVW5pdC5QVCwgfSB9IH07CisgICAgICAgICAgICByZXR1cm4gbmV3RXhwcjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8c3RyaW5nLCBkb3VibGU+IEZvbnRTaXplTWFwID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBkb3VibGU+KCkKKyAgICAgICAgeworICAgICAgICAgICAgeyAieHgtc21hbGwiLCA3LjVkIH0sCisgICAgICAgICAgICB7ICJ4LXNtYWxsIiwgMTBkIH0sCisgICAgICAgICAgICB7ICJzbWFsbCIsIDEyZCB9LAorICAgICAgICAgICAgeyAibWVkaXVtIiwgMTMuNWQgfSwKKyAgICAgICAgICAgIHsgImxhcmdlIiwgMThkIH0sCisgICAgICAgICAgICB7ICJ4LWxhcmdlIiwgMjRkIH0sCisgICAgICAgICAgICB7ICJ4eC1sYXJnZSIsIDM2ZCB9LAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXBwbHlTZWxlY3RvcigKKyAgICAgICAgICAgIENzc1NlbGVjdG9yIHNlbGVjdG9yLAorICAgICAgICAgICAgQ3NzUnVsZVNldCBydWxlU2V0LAorICAgICAgICAgICAgWEVsZW1lbnQgeEh0bWwsCisgICAgICAgICAgICBQcm9wZXJ0eS5IaWdoT3JkZXJQcmlvcml0eSBub3RJbXBvcnRhbnRIaWdoT3JkZXJTb3J0LAorICAgICAgICAgICAgUHJvcGVydHkuSGlnaE9yZGVyUHJpb3JpdHkgaW1wb3J0YW50SGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgIHJlZiBpbnQgcHJvcGVydHlTZXF1ZW5jZSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVsZW1lbnQgaW4geEh0bWwuRGVzY2VuZGFudHNBbmRTZWxmKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKERvZXNTZWxlY3Rvck1hdGNoKHNlbGVjdG9yLCBlbGVtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKENzc0RlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIGluIHJ1bGVTZXQuRGVjbGFyYXRpb25zKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eSBwcm9wID0gbmV3IFByb3BlcnR5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gZGVjbGFyYXRpb24uTmFtZS5Ub0xvd2VyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiA9IGRlY2xhcmF0aW9uLkV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlnaE9yZGVyU29ydCA9IGRlY2xhcmF0aW9uLkltcG9ydGFudCA/IGltcG9ydGFudEhpZ2hPcmRlclNvcnQgOiBub3RJbXBvcnRhbnRIaWdoT3JkZXJTb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkQXR0cmlidXRlc0luU2VsZWN0b3IgPSBDb3VudElkQXR0cmlidXRlc0luU2VsZWN0b3Ioc2VsZWN0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gQ291bnRBdHRyaWJ1dGVzSW5TZWxlY3RvcihzZWxlY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudE5hbWVzSW5TZWxlY3RvciA9IENvdW50RWxlbWVudE5hbWVzSW5TZWxlY3RvcihzZWxlY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXIgPSBwcm9wZXJ0eVNlcXVlbmNlKyssCisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgQWRkUHJvcGVydHlUb0VsZW1lbnQoZWxlbWVudCwgcHJvcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIERvZXNTZWxlY3Rvck1hdGNoKAorICAgICAgICAgICAgQ3NzU2VsZWN0b3Igc2VsZWN0b3IsCisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY3VycmVudFNpbXBsZVNlbGVjdG9yID0gc2VsZWN0b3IuU2ltcGxlU2VsZWN0b3JzLkNvdW50KCkgLSAxOworICAgICAgICAgICAgWEVsZW1lbnQgY3VycmVudEVsZW1lbnQgPSBlbGVtZW50OworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFEb2VzU2ltcGxlU2VsZWN0b3JNYXRjaChzZWxlY3Rvci5TaW1wbGVTZWxlY3RvcnNbY3VycmVudFNpbXBsZVNlbGVjdG9yXSwgY3VycmVudEVsZW1lbnQpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTaW1wbGVTZWxlY3RvciA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IuU2ltcGxlU2VsZWN0b3JzW2N1cnJlbnRTaW1wbGVTZWxlY3Rvcl0uQ29tYmluYXRvciA9PSBDc3NDb21iaW5hdG9yLkNoaWxkT2YpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LlBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTaW1wbGVTZWxlY3Rvci0tOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLlNpbXBsZVNlbGVjdG9yc1tjdXJyZW50U2ltcGxlU2VsZWN0b3JdLkNvbWJpbmF0b3IgPT0gQ3NzQ29tYmluYXRvci5QcmVjZWRlZEltbWVkaWF0ZWx5QnkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LkVsZW1lbnRzQmVmb3JlU2VsZigpLlJldmVyc2UoKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFNpbXBsZVNlbGVjdG9yLS07CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IuU2ltcGxlU2VsZWN0b3JzW2N1cnJlbnRTaW1wbGVTZWxlY3Rvcl0uQ29tYmluYXRvciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBjb250aW51ZU91dGVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGFuY2VzdG9yIGluIGVsZW1lbnQuQW5jZXN0b3JzKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEb2VzU2ltcGxlU2VsZWN0b3JNYXRjaChzZWxlY3Rvci5TaW1wbGVTZWxlY3RvcnNbY3VycmVudFNpbXBsZVNlbGVjdG9yIC0gMV0sIGFuY2VzdG9yKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGFuY2VzdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTaW1wbGVTZWxlY3Rvci0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlT3V0ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250aW51ZU91dGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIERvZXNTaW1wbGVTZWxlY3Rvck1hdGNoKAorICAgICAgICAgICAgQ3NzU2ltcGxlU2VsZWN0b3Igc2ltcGxlU2VsZWN0b3IsCisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGVsZW1hbnROYW1lTWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgYm9vbCBjbGFzc05hbWVNYXRjaCA9IHRydWU7CisgICAgICAgICAgICBib29sIGNoaWxkU2ltcGxlU2VsZWN0b3JNYXRjaCA9IHRydWU7CisgICAgICAgICAgICBib29sIGlkTWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgYm9vbCBhdHRyaWJ1dGVNYXRjaCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChzaW1wbGVTZWxlY3Rvci5Qc2V1ZG8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoc2ltcGxlU2VsZWN0b3IuRWxlbWVudE5hbWUgIT0gbnVsbCAmJiBzaW1wbGVTZWxlY3Rvci5FbGVtZW50TmFtZSAhPSAiIiAmJiBzaW1wbGVTZWxlY3Rvci5FbGVtZW50TmFtZSAhPSAiKiIpCisgICAgICAgICAgICAgICAgZWxlbWFudE5hbWVNYXRjaCA9IGVsZW1lbnQuTmFtZS5Ub1N0cmluZygpID09IHNpbXBsZVNlbGVjdG9yLkVsZW1lbnROYW1lLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoZWxlbWFudE5hbWVNYXRjaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2ltcGxlU2VsZWN0b3IuQ2xhc3MgIT0gbnVsbCAmJiBzaW1wbGVTZWxlY3Rvci5DbGFzcyAhPSAiIikKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lTWF0Y2ggPSBDbGFzc2VzT2YoZWxlbWVudCkuQ29udGFpbnMoc2ltcGxlU2VsZWN0b3IuQ2xhc3MpOworICAgICAgICAgICAgICAgIGlmIChjbGFzc05hbWVNYXRjaCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaW1wbGVTZWxlY3Rvci5DaGlsZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRTaW1wbGVTZWxlY3Rvck1hdGNoID0gRG9lc1NpbXBsZVNlbGVjdG9yTWF0Y2goc2ltcGxlU2VsZWN0b3IuQ2hpbGQsIGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRTaW1wbGVTZWxlY3Rvck1hdGNoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2ltcGxlU2VsZWN0b3IuSUQgIT0gbnVsbCAmJiBzaW1wbGVTZWxlY3Rvci5JRCAhPSAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaWQgPSAoc3RyaW5nKWVsZW1lbnQuQXR0cmlidXRlKCJJRCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IChzdHJpbmcpZWxlbWVudC5BdHRyaWJ1dGUoImlkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRNYXRjaCA9IHNpbXBsZVNlbGVjdG9yLklEID09IGlkOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkTWF0Y2gpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpbXBsZVNlbGVjdG9yLkF0dHJpYnV0ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVNYXRjaCA9IERvZXNBdHRyaWJ1dGVNYXRjaChzaW1wbGVTZWxlY3Rvci5BdHRyaWJ1dGUsIGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCByZXN1bHQgPQorICAgICAgICAgICAgICAgIGVsZW1hbnROYW1lTWF0Y2ggJiYKKyAgICAgICAgICAgICAgICBjbGFzc05hbWVNYXRjaCAmJgorICAgICAgICAgICAgICAgIGNoaWxkU2ltcGxlU2VsZWN0b3JNYXRjaCAmJgorICAgICAgICAgICAgICAgIGlkTWF0Y2ggJiYKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVNYXRjaDsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIERvZXNBdHRyaWJ1dGVNYXRjaChPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc0F0dHJpYnV0ZSBhdHRyaWJ1dGUsIFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBhdHROYW1lID0gYXR0cmlidXRlLk9wZXJhbmQuVG9Mb3dlcigpOworICAgICAgICAgICAgc3RyaW5nIGF0dFZhbHVlID0gKHN0cmluZyllbGVtZW50LkF0dHJpYnV0ZShhdHROYW1lKTsKKyAgICAgICAgICAgIGlmIChhdHRWYWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuT3BlcmF0b3IgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHN0cmluZyB2YWx1ZSA9IGF0dHJpYnV0ZS5WYWx1ZTsKKyAgICAgICAgICAgIHN3aXRjaCAoYXR0cmlidXRlLk9wZXJhdG9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQ3NzQXR0cmlidXRlT3BlcmF0b3IuRXF1YWxzOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0VmFsdWUgPT0gdmFsdWU7CisgICAgICAgICAgICAgICAgY2FzZSBDc3NBdHRyaWJ1dGVPcGVyYXRvci5CZWdpbnNXaXRoOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0VmFsdWUuU3RhcnRzV2l0aCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgY2FzZSBDc3NBdHRyaWJ1dGVPcGVyYXRvci5Db250YWluczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dFZhbHVlLkNvbnRhaW5zKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBjYXNlIENzc0F0dHJpYnV0ZU9wZXJhdG9yLkVuZHNXaXRoOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0VmFsdWUuRW5kc1dpdGgodmFsdWUpOworICAgICAgICAgICAgICAgIGNhc2UgQ3NzQXR0cmlidXRlT3BlcmF0b3IuSW5MaXN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0VmFsdWUuU3BsaXQoJyAnKS5Db250YWlucyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgY2FzZSBDc3NBdHRyaWJ1dGVPcGVyYXRvci5IeXBoZW5hdGVkOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0VmFsdWUuU3BsaXQoJy0nKVswXSA9PSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgQ291bnRJZEF0dHJpYnV0ZXNJblNpbXBsZVNlbGVjdG9yKENzc1NpbXBsZVNlbGVjdG9yIHNpbXBsZVNlbGVjdG9yKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBzaW1wbGVTZWxlY3Rvci5JRCAhPSBudWxsID8gMSA6IDAgKworICAgICAgICAgICAgICAgIChzaW1wbGVTZWxlY3Rvci5DaGlsZCAhPSBudWxsID8gQ291bnRJZEF0dHJpYnV0ZXNJblNpbXBsZVNlbGVjdG9yKHNpbXBsZVNlbGVjdG9yLkNoaWxkKSA6IDApOworICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IENvdW50SWRBdHRyaWJ1dGVzSW5TZWxlY3RvcihDc3NTZWxlY3RvciBzZWxlY3RvcikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvdW50ID0gc2VsZWN0b3IuU2ltcGxlU2VsZWN0b3JzLlNlbGVjdChzcyA9PiBDb3VudElkQXR0cmlidXRlc0luU2ltcGxlU2VsZWN0b3Ioc3MpKS5TdW0oKTsKKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBDb3VudEF0dHJpYnV0ZXNJblNpbXBsZVNlbGVjdG9yKENzc1NpbXBsZVNlbGVjdG9yIHNpbXBsZVNlbGVjdG9yKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY291bnQgPSAoc2ltcGxlU2VsZWN0b3IuQXR0cmlidXRlICE9IG51bGwgPyAxIDogMCkgKworICAgICAgICAgICAgICAgICgoc2ltcGxlU2VsZWN0b3IuQ2xhc3MgIT0gbnVsbCAmJiBzaW1wbGVTZWxlY3Rvci5DbGFzcyAhPSAiIikgPyAxIDogMCkgKworICAgICAgICAgICAgICAgIChzaW1wbGVTZWxlY3Rvci5DaGlsZCAhPSBudWxsID8gQ291bnRBdHRyaWJ1dGVzSW5TaW1wbGVTZWxlY3RvcihzaW1wbGVTZWxlY3Rvci5DaGlsZCkgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBDb3VudEF0dHJpYnV0ZXNJblNlbGVjdG9yKENzc1NlbGVjdG9yIHNlbGVjdG9yKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBzZWxlY3Rvci5TaW1wbGVTZWxlY3RvcnMuU2VsZWN0KHNzID0+IENvdW50QXR0cmlidXRlc0luU2ltcGxlU2VsZWN0b3Ioc3MpKS5TdW0oKTsKKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBDb3VudEVsZW1lbnROYW1lc0luU2ltcGxlU2VsZWN0b3IoQ3NzU2ltcGxlU2VsZWN0b3Igc2ltcGxlU2VsZWN0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IChzaW1wbGVTZWxlY3Rvci5FbGVtZW50TmFtZSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIHNpbXBsZVNlbGVjdG9yLkVsZW1lbnROYW1lICE9ICIiICYmCisgICAgICAgICAgICAgICAgICAgIHNpbXBsZVNlbGVjdG9yLkVsZW1lbnROYW1lICE9ICIqIikKKyAgICAgICAgICAgICAgICAgICAgPyAxIDogMCArCisgICAgICAgICAgICAgICAgKHNpbXBsZVNlbGVjdG9yLkNoaWxkICE9IG51bGwgPyBDb3VudEVsZW1lbnROYW1lc0luU2ltcGxlU2VsZWN0b3Ioc2ltcGxlU2VsZWN0b3IuQ2hpbGQpIDogMCk7CisgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgQ291bnRFbGVtZW50TmFtZXNJblNlbGVjdG9yKENzc1NlbGVjdG9yIHNlbGVjdG9yKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBzZWxlY3Rvci5TaW1wbGVTZWxlY3RvcnMuU2VsZWN0KHNzID0+IENvdW50RWxlbWVudE5hbWVzSW5TaW1wbGVTZWxlY3RvcihzcykpLlN1bSgpOworICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRQcm9wZXJ0eVRvRWxlbWVudCgKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQsCisgICAgICAgICAgICBQcm9wZXJ0eSBwcm9wZXJ0eSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9pZiAocHJvcGVydHkuTmFtZSA9PSAiZGlyZWN0aW9uIikKKyAgICAgICAgICAgIC8vICAgIENvbnNvbGUuV3JpdGVMaW5lKDEpOworICAgICAgICAgICAgRGljdGlvbmFyeTxzdHJpbmcsIFByb3BlcnR5PiBwcm9wTGlzdCA9IGVsZW1lbnQuQW5ub3RhdGlvbjxEaWN0aW9uYXJ5PHN0cmluZywgUHJvcGVydHk+PigpOworICAgICAgICAgICAgaWYgKHByb3BMaXN0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJvcExpc3QgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIFByb3BlcnR5PigpOworICAgICAgICAgICAgICAgIGVsZW1lbnQuQWRkQW5ub3RhdGlvbihwcm9wTGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXByb3BMaXN0LkNvbnRhaW5zS2V5KHByb3BlcnR5Lk5hbWUpKQorICAgICAgICAgICAgICAgIHByb3BMaXN0LkFkZChwcm9wZXJ0eS5OYW1lLCBwcm9wZXJ0eSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUHJvcGVydHkgY3VycmVudCA9IHByb3BMaXN0W3Byb3BlcnR5Lk5hbWVdOworICAgICAgICAgICAgICAgIGlmICgoKFN5c3RlbS5JQ29tcGFyYWJsZTxQcm9wZXJ0eT4pcHJvcGVydHkpLkNvbXBhcmVUbyhjdXJyZW50KSA9PSAxKQorICAgICAgICAgICAgICAgICAgICBwcm9wTGlzdFtwcm9wZXJ0eS5OYW1lXSA9IHByb3BlcnR5OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRQcm9wZXJ0eVRvRGljdGlvbmFyeSgKKyAgICAgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9wZXJ0eT4gcHJvcExpc3QsCisgICAgICAgICAgICBQcm9wZXJ0eSBwcm9wZXJ0eSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFwcm9wTGlzdC5Db250YWluc0tleShwcm9wZXJ0eS5OYW1lKSkKKyAgICAgICAgICAgICAgICBwcm9wTGlzdC5BZGQocHJvcGVydHkuTmFtZSwgcHJvcGVydHkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFByb3BlcnR5IGN1cnJlbnQgPSBwcm9wTGlzdFtwcm9wZXJ0eS5OYW1lXTsKKyAgICAgICAgICAgICAgICBpZiAoKChTeXN0ZW0uSUNvbXBhcmFibGU8UHJvcGVydHk+KXByb3BlcnR5KS5Db21wYXJlVG8oY3VycmVudCkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcHJvcExpc3RbcHJvcGVydHkuTmFtZV0gPSBwcm9wZXJ0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ1tdIENsYXNzZXNPZihYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgY2xhc3Nlc1N0cmluZyA9IChzdHJpbmcpZWxlbWVudC5BdHRyaWJ1dGUoImNsYXNzIik7CisgICAgICAgICAgICBpZiAoY2xhc3Nlc1N0cmluZyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc3RyaW5nWzBdOworICAgICAgICAgICAgcmV0dXJuIGNsYXNzZXNTdHJpbmcuU3BsaXQoJyAnKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXBwbHlEZWNsYXJhdGlvbnNUb0VsZW1lbnQoCisgICAgICAgICAgICBDc3NSdWxlU2V0IHJ1bGVTZXQsCisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50LAorICAgICAgICAgICAgUHJvcGVydHkuSGlnaE9yZGVyUHJpb3JpdHkgbm90SW1wb3J0YW50SGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgIFByb3BlcnR5LkhpZ2hPcmRlclByaW9yaXR5IGltcG9ydGFudEhpZ2hPcmRlclNvcnQsCisgICAgICAgICAgICByZWYgaW50IHByb3BlcnR5U2VxdWVuY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkZWNsYXJhdGlvbiBpbiBydWxlU2V0LkRlY2xhcmF0aW9ucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eSBwcm9wID0gbmV3IFByb3BlcnR5KCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5hbWUgPSBkZWNsYXJhdGlvbi5OYW1lLlRvTG93ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiA9IGRlY2xhcmF0aW9uLkV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgIEhpZ2hPcmRlclNvcnQgPSBkZWNsYXJhdGlvbi5JbXBvcnRhbnQgPyBpbXBvcnRhbnRIaWdoT3JkZXJTb3J0IDogbm90SW1wb3J0YW50SGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgICAgICAgICAgSWRBdHRyaWJ1dGVzSW5TZWxlY3RvciA9IDAsCisgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gMCwKKyAgICAgICAgICAgICAgICAgICAgRWxlbWVudE5hbWVzSW5TZWxlY3RvciA9IDAsCisgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyID0gcHJvcGVydHlTZXF1ZW5jZSsrLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgQWRkUHJvcGVydHlUb0VsZW1lbnQoZWxlbWVudCwgcHJvcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFwcGx5Q3NzVG9FbGVtZW50KAorICAgICAgICAgICAgQ3NzRG9jdW1lbnQgY3NzRG9jLAorICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCwKKyAgICAgICAgICAgIFByb3BlcnR5LkhpZ2hPcmRlclByaW9yaXR5IG5vdEltcG9ydGFudEhpZ2hPcmRlclNvcnQsCisgICAgICAgICAgICBQcm9wZXJ0eS5IaWdoT3JkZXJQcmlvcml0eSBpbXBvcnRhbnRIaWdoT3JkZXJTb3J0LAorICAgICAgICAgICAgcmVmIGludCBwcm9wZXJ0eVNlcXVlbmNlKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcnVsZVNldCBpbiBjc3NEb2MuUnVsZVNldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXBwbHlEZWNsYXJhdGlvbnNUb0VsZW1lbnQocnVsZVNldCwgZWxlbWVudCwgbm90SW1wb3J0YW50SGlnaE9yZGVyU29ydCwgaW1wb3J0YW50SGlnaE9yZGVyU29ydCwgcmVmIHByb3BlcnR5U2VxdWVuY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBcHBseVN0eWxlQXR0cmlidXRlcyhYRWxlbWVudCB4SHRtbCwgcmVmIGludCBwcm9wZXJ0eVNlcXVlbmNlKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZWxlbWVudCBpbiB4SHRtbC5EZXNjZW5kYW50c0FuZFNlbGYoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYQXR0cmlidXRlIHN0eWxlQXR0ID0gZWxlbWVudC5BdHRyaWJ1dGUoWGh0bWxOb05hbWVzcGFjZS5zdHlsZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0eWxlQXR0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUgPSAoc3RyaW5nKXN0eWxlQXR0OworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY3NzU3RyaW5nID0gZWxlbWVudC5OYW1lICsgInsiICsgc3R5bGUgKyAifSI7CisgICAgICAgICAgICAgICAgICAgIGNzc1N0cmluZyA9IGNzc1N0cmluZy5SZXBsYWNlKCdcIicsICdcJycpOworICAgICAgICAgICAgICAgICAgICBDc3NQYXJzZXIgY3NzUGFyc2VyID0gbmV3IENzc1BhcnNlcigpOworICAgICAgICAgICAgICAgICAgICBDc3NEb2N1bWVudCBjc3NEb2MgPSBjc3NQYXJzZXIuUGFyc2VUZXh0KGNzc1N0cmluZyk7CisgICAgICAgICAgICAgICAgICAgIEFwcGx5Q3NzVG9FbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgY3NzRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5LkhpZ2hPcmRlclByaW9yaXR5LlN0eWxlQXR0cmlidXRlTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkuSGlnaE9yZGVyUHJpb3JpdHkuU3R5bGVBdHRyaWJ1dGVIaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVmIHByb3BlcnR5U2VxdWVuY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBYQXR0cmlidXRlIGRpckF0dCA9IGVsZW1lbnQuQXR0cmlidXRlKFhodG1sTm9OYW1lc3BhY2UuZGlyKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlyQXR0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZGlyID0gZGlyQXR0LlZhbHVlLlRvTG93ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgcHJvcCA9IG5ldyBQcm9wZXJ0eSgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiZGlyZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gZGlyLCBUeXBlID0gQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgSGlnaE9yZGVyU29ydCA9IFByb3BlcnR5LkhpZ2hPcmRlclByaW9yaXR5Lkh0bWxBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICBJZEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lc0luU2VsZWN0b3IgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXIgPSBwcm9wZXJ0eVNlcXVlbmNlKyssCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIEFkZFByb3BlcnR5VG9FbGVtZW50KGVsZW1lbnQsIHByb3ApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZW51bSBDc3NEYXRhVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBCb3JkZXJXaWR0aCwKKyAgICAgICAgICAgIEJvcmRlclN0eWxlLAorICAgICAgICAgICAgQ29sb3IsCisgICAgICAgICAgICBMaXN0U3R5bGVUeXBlLAorICAgICAgICAgICAgTGlzdFN0eWxlUG9zaXRpb24sCisgICAgICAgICAgICBMaXN0U3R5bGVJbWFnZSwKKyAgICAgICAgICAgIEJhY2tncm91bmRDb2xvciwKKyAgICAgICAgICAgIEJhY2tncm91bmRJbWFnZSwKKyAgICAgICAgICAgIEJhY2tncm91bmRSZXBlYXQsCisgICAgICAgICAgICBCYWNrZ3JvdW5kQXR0YWNobWVudCwKKyAgICAgICAgICAgIEJhY2tncm91bmRQb3NpdGlvbiwKKyAgICAgICAgICAgIEZvbnRTdHlsZSwKKyAgICAgICAgICAgIEZvbnRWYXJpZW50LAorICAgICAgICAgICAgRm9udFdlaWdodCwKKyAgICAgICAgICAgIEZvbnRTaXplLAorICAgICAgICAgICAgTGluZUhlaWdodCwKKyAgICAgICAgICAgIEZvbnRGYW1pbHksCisgICAgICAgICAgICBMZW5ndGgsCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBTaG9ydGhhbmRQcm9wZXJ0aWVzSW5mbworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWU7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIFBhdHRlcm47CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBTaG9ydGhhbmRQcm9wZXJ0aWVzSW5mb1tdIFNob3J0aGFuZFByb3BlcnRpZXMgPSBuZXdbXQorICAgICAgICB7CisgICAgICAgICAgICBuZXcgU2hvcnRoYW5kUHJvcGVydGllc0luZm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lID0gIm1hcmdpbiIsCisgICAgICAgICAgICAgICAgUGF0dGVybiA9ICJtYXJnaW4tezB9IiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBuZXcgU2hvcnRoYW5kUHJvcGVydGllc0luZm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lID0gInBhZGRpbmciLAorICAgICAgICAgICAgICAgIFBhdHRlcm4gPSAicGFkZGluZy17MH0iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIG5ldyBTaG9ydGhhbmRQcm9wZXJ0aWVzSW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWUgPSAiYm9yZGVyLXdpZHRoIiwKKyAgICAgICAgICAgICAgICBQYXR0ZXJuID0gImJvcmRlci17MH0td2lkdGgiLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIG5ldyBTaG9ydGhhbmRQcm9wZXJ0aWVzSW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWUgPSAiYm9yZGVyLWNvbG9yIiwKKyAgICAgICAgICAgICAgICBQYXR0ZXJuID0gImJvcmRlci17MH0tY29sb3IiLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIG5ldyBTaG9ydGhhbmRQcm9wZXJ0aWVzSW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWUgPSAiYm9yZGVyLXN0eWxlIiwKKyAgICAgICAgICAgICAgICBQYXR0ZXJuID0gImJvcmRlci17MH0tc3R5bGUiLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEV4cGFuZFNob3J0aGFuZFByb3BlcnRpZXMoWEVsZW1lbnQgeEh0bWwsIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZWxlbWVudCBpbiB4SHRtbC5EZXNjZW5kYW50c0FuZFNlbGYoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFeHBhbmRTaG9ydGhhbmRQcm9wZXJ0aWVzRm9yRWxlbWVudChlbGVtZW50LCBzZXR0aW5ncyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEV4cGFuZFNob3J0aGFuZFByb3BlcnRpZXNGb3JFbGVtZW50KFhFbGVtZW50IGVsZW1lbnQsIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PHN0cmluZywgUHJvcGVydHk+IHByb3BlcnR5TGlzdCA9IGVsZW1lbnQuQW5ub3RhdGlvbjxEaWN0aW9uYXJ5PHN0cmluZywgUHJvcGVydHk+PigpOworICAgICAgICAgICAgaWYgKHByb3BlcnR5TGlzdCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb3BlcnR5TGlzdCA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgUHJvcGVydHk+KCk7CisgICAgICAgICAgICAgICAgZWxlbWVudC5BZGRBbm5vdGF0aW9uKHByb3BlcnR5TGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoICh2YXIga3ZwIGluIHByb3BlcnR5TGlzdC5Ub0xpc3QoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eSBwID0ga3ZwLlZhbHVlOworICAgICAgICAgICAgICAgIGlmIChwLk5hbWUgPT0gImJvcmRlciIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGJvcmRlckNvbG9yOworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGJvcmRlcldpZHRoOworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGJvcmRlclN0eWxlOworICAgICAgICAgICAgICAgICAgICBpZiAocC5FeHByZXNzaW9uLlRlcm1zLkNvdW50ID09IDEgJiYgcC5FeHByZXNzaW9uLlRlcm1zLkZpcnN0KCkuVmFsdWUgPT0gImluaGVyaXQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJDb2xvciA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiaW5oZXJpdCIsIFR5cGUgPSBDc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJXaWR0aCA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiaW5oZXJpdCIsIFR5cGUgPSBDc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJTdHlsZSA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiaW5oZXJpdCIsIFR5cGUgPSBDc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2JvcmRlckNvbG9yID0gR2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlKG51bGwsIGVsZW1lbnQsICJjb2xvciIsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYm9yZGVyV2lkdGggPSBuZXcgRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8VGVybT4geyBuZXcgVGVybSB7IFZhbHVlID0gIm1lZGl1bSIsIFR5cGUgPSBUZXJtVHlwZS5TdHJpbmcgfSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICAvL2JvcmRlclN0eWxlID0gbmV3IEV4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PFRlcm0+IHsgbmV3IFRlcm0geyBWYWx1ZSA9ICJub25lIiwgVHlwZSA9IFRlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclN0eWxlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0ZXJtIGluIHAuRXhwcmVzc2lvbi5UZXJtcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDc3NEYXRhVHlwZSBkYXRhVHlwZSA9IEdldERhdGF0eXBlRnJvbUJvcmRlclRlcm0odGVybSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3NzRGF0YVR5cGUuQ29sb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJDb2xvciA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IHRlcm0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3NzRGF0YVR5cGUuQm9yZGVyV2lkdGg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJXaWR0aCA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IHRlcm0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3NzRGF0YVR5cGUuQm9yZGVyU3R5bGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJTdHlsZSA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IHRlcm0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzaWRlIGluIG5ld1tdIHsgInRvcCIsICJsZWZ0IiwgImJvdHRvbSIsICJyaWdodCIgfSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvcmRlcldpZHRoICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgYndwID0gbmV3IFByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gImJvcmRlci0iICsgc2lkZSArICItd2lkdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uID0gYm9yZGVyV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hPcmRlclNvcnQgPSBwLkhpZ2hPcmRlclNvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLklkQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lc0luU2VsZWN0b3IgPSBwLkVsZW1lbnROYW1lc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5BdHRyaWJ1dGVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXIgPSBwLlNlcXVlbmNlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUHJvcGVydHlUb0RpY3Rpb25hcnkocHJvcGVydHlMaXN0LCBid3ApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvcmRlclN0eWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgYnNwID0gbmV3IFByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gImJvcmRlci0iICsgc2lkZSArICItc3R5bGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uID0gYm9yZGVyU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hPcmRlclNvcnQgPSBwLkhpZ2hPcmRlclNvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLklkQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lc0luU2VsZWN0b3IgPSBwLkVsZW1lbnROYW1lc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5BdHRyaWJ1dGVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXIgPSBwLlNlcXVlbmNlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUHJvcGVydHlUb0RpY3Rpb25hcnkocHJvcGVydHlMaXN0LCBic3ApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvcmRlckNvbG9yICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgYmMgPSBuZXcgUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiYm9yZGVyLSIgKyBzaWRlICsgIi1jb2xvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gPSBib3JkZXJDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlnaE9yZGVyU29ydCA9IHAuSGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRBdHRyaWJ1dGVzSW5TZWxlY3RvciA9IHAuSWRBdHRyaWJ1dGVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudE5hbWVzSW5TZWxlY3RvciA9IHAuRWxlbWVudE5hbWVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLkF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZU51bWJlciA9IHAuU2VxdWVuY2VOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRQcm9wZXJ0eVRvRGljdGlvbmFyeShwcm9wZXJ0eUxpc3QsIGJjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHAuTmFtZSA9PSAiYm9yZGVyLXRvcCIgfHwgcC5OYW1lID09ICJib3JkZXItcmlnaHQiIHx8IHAuTmFtZSA9PSAiYm9yZGVyLWJvdHRvbSIgfHwgcC5OYW1lID09ICJib3JkZXItbGVmdCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGJvcmRlckNvbG9yOworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGJvcmRlcldpZHRoOworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGJvcmRlclN0eWxlOworICAgICAgICAgICAgICAgICAgICBpZiAocC5FeHByZXNzaW9uLlRlcm1zLkNvdW50KCkgPT0gMSAmJiBwLkV4cHJlc3Npb24uVGVybXMuRmlyc3QoKS5WYWx1ZSA9PSAiaW5oZXJpdCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJpbmhlcml0IiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJpbmhlcml0IiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclN0eWxlID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJpbmhlcml0IiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYm9yZGVyQ29sb3IgPSBHZXRDb21wdXRlZFByb3BlcnR5VmFsdWUobnVsbCwgZWxlbWVudCwgImNvbG9yIiwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9ib3JkZXJXaWR0aCA9IG5ldyBFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxUZXJtPiB7IG5ldyBUZXJtIHsgVmFsdWUgPSAibWVkaXVtIiwgVHlwZSA9IFRlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYm9yZGVyU3R5bGUgPSBuZXcgRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8VGVybT4geyBuZXcgVGVybSB7IFZhbHVlID0gIm5vbmUiLCBUeXBlID0gVGVybVR5cGUuU3RyaW5nIH0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3IgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyV2lkdGggPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyU3R5bGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRlcm0gaW4gcC5FeHByZXNzaW9uLlRlcm1zKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzc0RhdGFUeXBlIGRhdGFUeXBlID0gR2V0RGF0YXR5cGVGcm9tQm9yZGVyVGVybSh0ZXJtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGFUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDc3NEYXRhVHlwZS5Db2xvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgdGVybSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDc3NEYXRhVHlwZS5Cb3JkZXJXaWR0aDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgdGVybSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDc3NEYXRhVHlwZS5Cb3JkZXJTdHlsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclN0eWxlID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgdGVybSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJvcmRlcldpZHRoICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5IGJ3cCA9IG5ldyBQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSBwLk5hbWUgKyAiLXdpZHRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uID0gYm9yZGVyV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlnaE9yZGVyU29ydCA9IHAuSGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5JZEF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lc0luU2VsZWN0b3IgPSBwLkVsZW1lbnROYW1lc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLkF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyID0gcC5TZXF1ZW5jZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICBBZGRQcm9wZXJ0eVRvRGljdGlvbmFyeShwcm9wZXJ0eUxpc3QsIGJ3cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJvcmRlclN0eWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5IGJzcCA9IG5ldyBQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSBwLk5hbWUgKyAiLXN0eWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uID0gYm9yZGVyU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlnaE9yZGVyU29ydCA9IHAuSGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5JZEF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lc0luU2VsZWN0b3IgPSBwLkVsZW1lbnROYW1lc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLkF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyID0gcC5TZXF1ZW5jZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICBBZGRQcm9wZXJ0eVRvRGljdGlvbmFyeShwcm9wZXJ0eUxpc3QsIGJzcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJvcmRlckNvbG9yICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5IGJjID0gbmV3IFByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9IHAuTmFtZSArICItY29sb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gPSBib3JkZXJDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWdoT3JkZXJTb3J0ID0gcC5IaWdoT3JkZXJTb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLklkQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudE5hbWVzSW5TZWxlY3RvciA9IHAuRWxlbWVudE5hbWVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzSW5TZWxlY3RvciA9IHAuQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXIgPSBwLlNlcXVlbmNlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZFByb3BlcnR5VG9EaWN0aW9uYXJ5KHByb3BlcnR5TGlzdCwgYmMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwLk5hbWUgPT0gImxpc3Qtc3R5bGUiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBsaXN0U3R5bGVUeXBlOworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGxpc3RTdHlsZVBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGxpc3RTdHlsZUltYWdlOworICAgICAgICAgICAgICAgICAgICBpZiAocC5FeHByZXNzaW9uLlRlcm1zLkNvdW50ID09IDEgJiYgcC5FeHByZXNzaW9uLlRlcm1zLkZpcnN0KCkuVmFsdWUgPT0gImluaGVyaXQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0U3R5bGVUeXBlID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJpbmhlcml0IiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RTdHlsZVBvc2l0aW9uID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJpbmhlcml0IiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RTdHlsZUltYWdlID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJpbmhlcml0IiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RTdHlsZVR5cGUgPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gImRpc2MiLCBUeXBlID0gQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFN0eWxlUG9zaXRpb24gPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gIm91dHNpZGUiLCBUeXBlID0gQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFN0eWxlSW1hZ2UgPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gIm5vbmUiLCBUeXBlID0gQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRlcm0gaW4gcC5FeHByZXNzaW9uLlRlcm1zKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzc0RhdGFUeXBlIGRhdGFUeXBlID0gR2V0RGF0YXR5cGVGcm9tTGlzdFN0eWxlVGVybSh0ZXJtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGFUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDc3NEYXRhVHlwZS5MaXN0U3R5bGVUeXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFN0eWxlVHlwZSA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IHRlcm0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3NzRGF0YVR5cGUuTGlzdFN0eWxlUG9zaXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0U3R5bGVQb3NpdGlvbiA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IHRlcm0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3NzRGF0YVR5cGUuTGlzdFN0eWxlSW1hZ2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0U3R5bGVJbWFnZSA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IHRlcm0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5IGxzdCA9IG5ldyBQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gImxpc3Qtc3R5bGUtdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uID0gbGlzdFN0eWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hPcmRlclNvcnQgPSBwLkhpZ2hPcmRlclNvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBJZEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5JZEF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudE5hbWVzSW5TZWxlY3RvciA9IHAuRWxlbWVudE5hbWVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5BdHRyaWJ1dGVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyID0gcC5TZXF1ZW5jZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgQWRkUHJvcGVydHlUb0RpY3Rpb25hcnkocHJvcGVydHlMaXN0LCBsc3QpOworICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eSBsc3AgPSBuZXcgUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJsaXN0LXN0eWxlLXBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gPSBsaXN0U3R5bGVQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hPcmRlclNvcnQgPSBwLkhpZ2hPcmRlclNvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBJZEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5JZEF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudE5hbWVzSW5TZWxlY3RvciA9IHAuRWxlbWVudE5hbWVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5BdHRyaWJ1dGVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyID0gcC5TZXF1ZW5jZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgQWRkUHJvcGVydHlUb0RpY3Rpb25hcnkocHJvcGVydHlMaXN0LCBsc3ApOworICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eSBsc2kgPSBuZXcgUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJsaXN0LXN0eWxlLWltYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gPSBsaXN0U3R5bGVJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hPcmRlclNvcnQgPSBwLkhpZ2hPcmRlclNvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBJZEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5JZEF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudE5hbWVzSW5TZWxlY3RvciA9IHAuRWxlbWVudE5hbWVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5BdHRyaWJ1dGVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyID0gcC5TZXF1ZW5jZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgQWRkUHJvcGVydHlUb0RpY3Rpb25hcnkocHJvcGVydHlMaXN0LCBsc2kpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocC5OYW1lID09ICJiYWNrZ3JvdW5kIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gYmFja2dyb3VuZENvbG9yOworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGJhY2tncm91bmRJbWFnZTsKKyAgICAgICAgICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBiYWNrZ3JvdW5kUmVwZWF0OworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGJhY2tncm91bmRBdHRhY2htZW50OworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGJhY2tncm91bmRQb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHAuRXhwcmVzc2lvbi5UZXJtcy5Db3VudCA9PSAxICYmIHAuRXhwcmVzc2lvbi5UZXJtcy5GaXJzdCgpLlZhbHVlID09ICJpbmhlcml0IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJpbmhlcml0IiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZSA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiaW5oZXJpdCIsIFR5cGUgPSBDc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kUmVwZWF0ID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJpbmhlcml0IiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRBdHRhY2htZW50ID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJpbmhlcml0IiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRQb3NpdGlvbiA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiaW5oZXJpdCIsIFR5cGUgPSBDc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gInRyYW5zcGFyZW50IiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZSA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAibm9uZSIsIFR5cGUgPSBDc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kUmVwZWF0ID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJyZXBlYXQiLCBUeXBlID0gQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEF0dGFjaG1lbnQgPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gInNjcm9sbCIsIFR5cGUgPSBDc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kUG9zaXRpb24gPSBuZXcgQ3NzRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDc3NUZXJtIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXQgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1VuaXQuUGVyY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IENzc1Rlcm1UeXBlLk51bWJlciB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDc3NUZXJtIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXQgPSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1VuaXQuUGVyY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IENzc1Rlcm1UeXBlLk51bWJlciB9LAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q3NzVGVybT4gYmFja2dyb3VuZFBvc2l0aW9uTGlzdCA9IG5ldyBMaXN0PENzc1Rlcm0+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdGVybSBpbiBwLkV4cHJlc3Npb24uVGVybXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3NzRGF0YVR5cGUgZGF0YVR5cGUgPSBHZXREYXRhdHlwZUZyb21CYWNrZ3JvdW5kVGVybSh0ZXJtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGFUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDc3NEYXRhVHlwZS5CYWNrZ3JvdW5kQ29sb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyB0ZXJtIH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENzc0RhdGFUeXBlLkJhY2tncm91bmRJbWFnZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZSA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IHRlcm0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3NzRGF0YVR5cGUuQmFja2dyb3VuZFJlcGVhdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRSZXBlYXQgPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyB0ZXJtIH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENzc0RhdGFUeXBlLkJhY2tncm91bmRBdHRhY2htZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEF0dGFjaG1lbnQgPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyB0ZXJtIH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENzc0RhdGFUeXBlLkJhY2tncm91bmRQb3NpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRQb3NpdGlvbkxpc3QuQWRkKHRlcm0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRQb3NpdGlvbkxpc3QuQ291bnQoKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRQb3NpdGlvbiA9IG5ldyBDc3NFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uTGlzdC5GaXJzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ3NzVGVybSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJjZW50ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRQb3NpdGlvbkxpc3QuQ291bnQoKSA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRQb3NpdGlvbiA9IG5ldyBDc3NFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXJtcyA9IGJhY2tncm91bmRQb3NpdGlvbkxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5IGJjID0gbmV3IFByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiYmFja2dyb3VuZC1jb2xvciIsCisgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uID0gYmFja2dyb3VuZENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgSGlnaE9yZGVyU29ydCA9IHAuSGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLklkQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50TmFtZXNJblNlbGVjdG9yID0gcC5FbGVtZW50TmFtZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLkF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXIgPSBwLlNlcXVlbmNlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBBZGRQcm9wZXJ0eVRvRGljdGlvbmFyeShwcm9wZXJ0eUxpc3QsIGJjKTsKKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgYmdpID0gbmV3IFByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiYmFja2dyb3VuZC1pbWFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uID0gYmFja2dyb3VuZEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgSGlnaE9yZGVyU29ydCA9IHAuSGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLklkQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50TmFtZXNJblNlbGVjdG9yID0gcC5FbGVtZW50TmFtZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLkF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXIgPSBwLlNlcXVlbmNlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBBZGRQcm9wZXJ0eVRvRGljdGlvbmFyeShwcm9wZXJ0eUxpc3QsIGJnaSk7CisgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5IGJnciA9IG5ldyBQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gImJhY2tncm91bmQtcmVwZWF0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gPSBiYWNrZ3JvdW5kUmVwZWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgSGlnaE9yZGVyU29ydCA9IHAuSGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLklkQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50TmFtZXNJblNlbGVjdG9yID0gcC5FbGVtZW50TmFtZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLkF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXIgPSBwLlNlcXVlbmNlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBBZGRQcm9wZXJ0eVRvRGljdGlvbmFyeShwcm9wZXJ0eUxpc3QsIGJncik7CisgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5IGJnYSA9IG5ldyBQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gImJhY2tncm91bmQtYXR0YWNobWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uID0gYmFja2dyb3VuZEF0dGFjaG1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBIaWdoT3JkZXJTb3J0ID0gcC5IaWdoT3JkZXJTb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgSWRBdHRyaWJ1dGVzSW5TZWxlY3RvciA9IHAuSWRBdHRyaWJ1dGVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lc0luU2VsZWN0b3IgPSBwLkVsZW1lbnROYW1lc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzSW5TZWxlY3RvciA9IHAuQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZU51bWJlciA9IHAuU2VxdWVuY2VOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIEFkZFByb3BlcnR5VG9EaWN0aW9uYXJ5KHByb3BlcnR5TGlzdCwgYmdhKTsKKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgYmdwID0gbmV3IFByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiYmFja2dyb3VuZC1wb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uID0gYmFja2dyb3VuZFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgSGlnaE9yZGVyU29ydCA9IHAuSGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLklkQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50TmFtZXNJblNlbGVjdG9yID0gcC5FbGVtZW50TmFtZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLkF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXIgPSBwLlNlcXVlbmNlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBBZGRQcm9wZXJ0eVRvRGljdGlvbmFyeShwcm9wZXJ0eUxpc3QsIGJncCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwLk5hbWUgPT0gImZvbnQiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBmb250U3R5bGU7CisgICAgICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gZm9udFZhcmllbnQ7CisgICAgICAgICAgICAgICAgICAgIENzc0V4cHJlc3Npb24gZm9udFdlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBmb250U2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBsaW5lSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGZvbnRGYW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwLkV4cHJlc3Npb24uVGVybXMuQ291bnQoKSA9PSAxICYmIHAuRXhwcmVzc2lvbi5UZXJtcy5GaXJzdCgpLlZhbHVlID09ICJpbmhlcml0IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9udFN0eWxlID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJpbmhlcml0IiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRWYXJpZW50ID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJpbmhlcml0IiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQgPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gImluaGVyaXQiLCBUeXBlID0gQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemUgPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gImluaGVyaXQiLCBUeXBlID0gQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAiaW5oZXJpdCIsIFR5cGUgPSBDc3NUZXJtVHlwZS5TdHJpbmcgfSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5ID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJpbmhlcml0IiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTdHlsZSA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAibm9ybWFsIiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRWYXJpZW50ID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJub3JtYWwiLCBUeXBlID0gQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgZm9udFdlaWdodCA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAibm9ybWFsIiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgbmV3IENzc1Rlcm0geyBWYWx1ZSA9ICJtZWRpdW0iLCBUeXBlID0gQ3NzVGVybVR5cGUuU3RyaW5nIH0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IG5ldyBDc3NUZXJtIHsgVmFsdWUgPSAibm9ybWFsIiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHkgPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBuZXcgQ3NzVGVybSB7IFZhbHVlID0gInNlcmlmIiwgVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZyB9IH0gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q3NzVGVybT4gZm9udEZhbWlseUxpc3QgPSBuZXcgTGlzdDxDc3NUZXJtPigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRlcm0gaW4gcC5FeHByZXNzaW9uLlRlcm1zKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzc0RhdGFUeXBlIGRhdGFUeXBlID0gR2V0RGF0YXR5cGVGcm9tRm9udFRlcm0odGVybSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3NzRGF0YVR5cGUuRm9udFN0eWxlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFN0eWxlID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgdGVybSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDc3NEYXRhVHlwZS5Gb250VmFyaWVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRWYXJpZW50ID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgdGVybSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDc3NEYXRhVHlwZS5Gb250V2VpZ2h0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFdlaWdodCA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IHRlcm0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3NzRGF0YVR5cGUuRm9udFNpemU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZSA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IHRlcm0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3NzRGF0YVR5cGUuTGVuZ3RoOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm0uU2VwYXJhdG9yQ2hhciA9PSAiLyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IHRlcm0gfSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgdGVybSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDc3NEYXRhVHlwZS5Gb250RmFtaWx5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseUxpc3QuQWRkKHRlcm0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRGYW1pbHlMaXN0LkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5ID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IGZvbnRGYW1pbHlMaXN0IH07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgZnMgPSBuZXcgUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJmb250LXN0eWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gPSBmb250U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIaWdoT3JkZXJTb3J0ID0gcC5IaWdoT3JkZXJTb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgSWRBdHRyaWJ1dGVzSW5TZWxlY3RvciA9IHAuSWRBdHRyaWJ1dGVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lc0luU2VsZWN0b3IgPSBwLkVsZW1lbnROYW1lc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzSW5TZWxlY3RvciA9IHAuQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZU51bWJlciA9IHAuU2VxdWVuY2VOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIEFkZFByb3BlcnR5VG9EaWN0aW9uYXJ5KHByb3BlcnR5TGlzdCwgZnMpOworICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eSBmdiA9IG5ldyBQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gImZvbnQtdmFyaWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uID0gZm9udFZhcmllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBIaWdoT3JkZXJTb3J0ID0gcC5IaWdoT3JkZXJTb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgSWRBdHRyaWJ1dGVzSW5TZWxlY3RvciA9IHAuSWRBdHRyaWJ1dGVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lc0luU2VsZWN0b3IgPSBwLkVsZW1lbnROYW1lc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzSW5TZWxlY3RvciA9IHAuQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZU51bWJlciA9IHAuU2VxdWVuY2VOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIEFkZFByb3BlcnR5VG9EaWN0aW9uYXJ5KHByb3BlcnR5TGlzdCwgZnYpOworICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eSBmdyA9IG5ldyBQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gImZvbnQtd2VpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gPSBmb250V2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgSGlnaE9yZGVyU29ydCA9IHAuSGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLklkQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50TmFtZXNJblNlbGVjdG9yID0gcC5FbGVtZW50TmFtZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLkF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXIgPSBwLlNlcXVlbmNlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBBZGRQcm9wZXJ0eVRvRGljdGlvbmFyeShwcm9wZXJ0eUxpc3QsIGZ3KTsKKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgZnN6ID0gbmV3IFByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiZm9udC1zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gPSBmb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hPcmRlclNvcnQgPSBwLkhpZ2hPcmRlclNvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBJZEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5JZEF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudE5hbWVzSW5TZWxlY3RvciA9IHAuRWxlbWVudE5hbWVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5BdHRyaWJ1dGVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyID0gcC5TZXF1ZW5jZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgQWRkUHJvcGVydHlUb0RpY3Rpb25hcnkocHJvcGVydHlMaXN0LCBmc3opOworICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eSBsaCA9IG5ldyBQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gImxpbmUtaGVpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gPSBsaW5lSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgSGlnaE9yZGVyU29ydCA9IHAuSGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLklkQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50TmFtZXNJblNlbGVjdG9yID0gcC5FbGVtZW50TmFtZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLkF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXIgPSBwLlNlcXVlbmNlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBBZGRQcm9wZXJ0eVRvRGljdGlvbmFyeShwcm9wZXJ0eUxpc3QsIGxoKTsKKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgZmYgPSBuZXcgUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJmb250LWZhbWlseSIsCisgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uID0gZm9udEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hPcmRlclNvcnQgPSBwLkhpZ2hPcmRlclNvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBJZEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5JZEF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudE5hbWVzSW5TZWxlY3RvciA9IHAuRWxlbWVudE5hbWVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5BdHRyaWJ1dGVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyID0gcC5TZXF1ZW5jZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgQWRkUHJvcGVydHlUb0RpY3Rpb25hcnkocHJvcGVydHlMaXN0LCBmZik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzaFByIGluIFNob3J0aGFuZFByb3BlcnRpZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocC5OYW1lID09IHNoUHIuTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwLkV4cHJlc3Npb24uVGVybXMuQ291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZGlyZWN0aW9uIGluIG5ld1tdIHsgInRvcCIsICJyaWdodCIsICJib3R0b20iLCAibGVmdCIgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgZXAgPSBuZXcgUHJvcGVydHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSBTdHJpbmcuRm9ybWF0KHNoUHIuUGF0dGVybiwgZGlyZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgcC5FeHByZXNzaW9uLlRlcm1zLkZpcnN0KCkgfSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hPcmRlclNvcnQgPSBwLkhpZ2hPcmRlclNvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRBdHRyaWJ1dGVzSW5TZWxlY3RvciA9IHAuSWRBdHRyaWJ1dGVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzSW5TZWxlY3RvciA9IHAuQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudE5hbWVzSW5TZWxlY3RvciA9IHAuRWxlbWVudE5hbWVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZU51bWJlciA9IHAuU2VxdWVuY2VOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUHJvcGVydHlUb0RpY3Rpb25hcnkocHJvcGVydHlMaXN0LCBlcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZGlyZWN0aW9uIGluIG5ld1tdIHsgInRvcCIsICJib3R0b20iIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5IGVwID0gbmV3IFByb3BlcnR5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gU3RyaW5nLkZvcm1hdChzaFByLlBhdHRlcm4sIGRpcmVjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IHAuRXhwcmVzc2lvbi5UZXJtcy5GaXJzdCgpIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWdoT3JkZXJTb3J0ID0gcC5IaWdoT3JkZXJTb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLklkQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLkF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lc0luU2VsZWN0b3IgPSBwLkVsZW1lbnROYW1lc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXIgPSBwLlNlcXVlbmNlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFByb3BlcnR5VG9EaWN0aW9uYXJ5KHByb3BlcnR5TGlzdCwgZXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkaXJlY3Rpb24gaW4gbmV3W10geyAibGVmdCIsICJyaWdodCIgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgZXAgPSBuZXcgUHJvcGVydHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSBTdHJpbmcuRm9ybWF0KHNoUHIuUGF0dGVybiwgZGlyZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uID0gbmV3IENzc0V4cHJlc3Npb24geyBUZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+IHsgcC5FeHByZXNzaW9uLlRlcm1zLlNraXAoMSkuRmlyc3QoKSB9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlnaE9yZGVyU29ydCA9IHAuSGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5JZEF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5BdHRyaWJ1dGVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50TmFtZXNJblNlbGVjdG9yID0gcC5FbGVtZW50TmFtZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyID0gcC5TZXF1ZW5jZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRQcm9wZXJ0eVRvRGljdGlvbmFyeShwcm9wZXJ0eUxpc3QsIGVwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5IGVwMyA9IG5ldyBQcm9wZXJ0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSBTdHJpbmcuRm9ybWF0KHNoUHIuUGF0dGVybiwgInRvcCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IHAuRXhwcmVzc2lvbi5UZXJtcy5GaXJzdCgpIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hPcmRlclNvcnQgPSBwLkhpZ2hPcmRlclNvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5JZEF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLkF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudE5hbWVzSW5TZWxlY3RvciA9IHAuRWxlbWVudE5hbWVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyID0gcC5TZXF1ZW5jZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUHJvcGVydHlUb0RpY3Rpb25hcnkocHJvcGVydHlMaXN0LCBlcDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZGlyZWN0aW9uIGluIG5ld1tdIHsgImxlZnQiLCAicmlnaHQiIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5IGVwMiA9IG5ldyBQcm9wZXJ0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9IFN0cmluZy5Gb3JtYXQoc2hQci5QYXR0ZXJuLCBkaXJlY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBwLkV4cHJlc3Npb24uVGVybXMuU2tpcCgxKS5GaXJzdCgpIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWdoT3JkZXJTb3J0ID0gcC5IaWdoT3JkZXJTb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLklkQXR0cmlidXRlc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLkF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lc0luU2VsZWN0b3IgPSBwLkVsZW1lbnROYW1lc0luU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXIgPSBwLlNlcXVlbmNlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFByb3BlcnR5VG9EaWN0aW9uYXJ5KHByb3BlcnR5TGlzdCwgZXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eSBlcDQgPSBuZXcgUHJvcGVydHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gU3RyaW5nLkZvcm1hdChzaFByLlBhdHRlcm4sICJib3R0b20iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gPSBuZXcgQ3NzRXhwcmVzc2lvbiB7IFRlcm1zID0gbmV3IExpc3Q8Q3NzVGVybT4geyBwLkV4cHJlc3Npb24uVGVybXMuU2tpcCgyKS5GaXJzdCgpIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hPcmRlclNvcnQgPSBwLkhpZ2hPcmRlclNvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5JZEF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc0luU2VsZWN0b3IgPSBwLkF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudE5hbWVzSW5TZWxlY3RvciA9IHAuRWxlbWVudE5hbWVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyID0gcC5TZXF1ZW5jZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUHJvcGVydHlUb0RpY3Rpb25hcnkocHJvcGVydHlMaXN0LCBlcDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBza2lwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGRpcmVjdGlvbiBpbiBuZXdbXSB7ICJ0b3AiLCAicmlnaHQiLCAiYm90dG9tIiwgImxlZnQiIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5IGVwID0gbmV3IFByb3BlcnR5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gU3RyaW5nLkZvcm1hdChzaFByLlBhdHRlcm4sIGRpcmVjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiA9IG5ldyBDc3NFeHByZXNzaW9uIHsgVGVybXMgPSBuZXcgTGlzdDxDc3NUZXJtPiB7IHAuRXhwcmVzc2lvbi5UZXJtcy5Ta2lwKHNraXArKykuRmlyc3QoKSB9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlnaE9yZGVyU29ydCA9IHAuSGlnaE9yZGVyU29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5JZEF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJblNlbGVjdG9yID0gcC5BdHRyaWJ1dGVzSW5TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50TmFtZXNJblNlbGVjdG9yID0gcC5FbGVtZW50TmFtZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyID0gcC5TZXF1ZW5jZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRQcm9wZXJ0eVRvRGljdGlvbmFyeShwcm9wZXJ0eUxpc3QsIGVwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ1tdIEJhY2tncm91bmRSZXBlYXRWYWx1ZXMgPSBuZXdbXQorICAgICAgICB7CisgICAgICAgICAgICAicmVwZWF0IiwKKyAgICAgICAgICAgICJyZXBlYXQteCIsCisgICAgICAgICAgICAicmVwZWF0LXkiLAorICAgICAgICAgICAgIm5vLXJlcGVhdCIsCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gQmFja2dyb3VuZEF0dGFjaG1lbnRWYWx1ZXMgPSBuZXdbXQorICAgICAgICB7CisgICAgICAgICAgICAic2Nyb2xsIiwKKyAgICAgICAgICAgICJmaXhlZCIsCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gQmFja2dyb3VuZFBvc2l0aW9uVmFsdWVzID0gbmV3W10KKyAgICAgICAgeworICAgICAgICAgICAgImxlZnQiLAorICAgICAgICAgICAgInJpZ2h0IiwKKyAgICAgICAgICAgICJ0b3AiLAorICAgICAgICAgICAgImJvdHRvbSIsCisgICAgICAgICAgICAiY2VudGVyIiwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBDc3NEYXRhVHlwZSBHZXREYXRhdHlwZUZyb21CYWNrZ3JvdW5kVGVybShDc3NUZXJtIHRlcm0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0ZXJtLklzQ29sb3IpCisgICAgICAgICAgICAgICAgcmV0dXJuIENzc0RhdGFUeXBlLkJhY2tncm91bmRDb2xvcjsKKyAgICAgICAgICAgIGlmIChCYWNrZ3JvdW5kUmVwZWF0VmFsdWVzLkNvbnRhaW5zKHRlcm0uVmFsdWUuVG9Mb3dlcigpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3NzRGF0YVR5cGUuQmFja2dyb3VuZFJlcGVhdDsKKyAgICAgICAgICAgIGlmIChCYWNrZ3JvdW5kQXR0YWNobWVudFZhbHVlcy5Db250YWlucyh0ZXJtLlZhbHVlLlRvTG93ZXIoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIENzc0RhdGFUeXBlLkJhY2tncm91bmRBdHRhY2htZW50OworICAgICAgICAgICAgaWYgKHRlcm0uRnVuY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3NzRGF0YVR5cGUuQmFja2dyb3VuZEltYWdlOworICAgICAgICAgICAgaWYgKHRlcm0uVW5pdCA9PSBDc3NVbml0LkNNIHx8CisgICAgICAgICAgICAgICAgdGVybS5Vbml0ID09IENzc1VuaXQuRU0gfHwKKyAgICAgICAgICAgICAgICB0ZXJtLlVuaXQgPT0gQ3NzVW5pdC5JTiB8fAorICAgICAgICAgICAgICAgIHRlcm0uVW5pdCA9PSBDc3NVbml0Lk1NIHx8CisgICAgICAgICAgICAgICAgdGVybS5Vbml0ID09IENzc1VuaXQuUFQgfHwKKyAgICAgICAgICAgICAgICB0ZXJtLlVuaXQgPT0gQ3NzVW5pdC5QWCB8fAorICAgICAgICAgICAgICAgIHRlcm0uVW5pdCA9PSBDc3NVbml0LlBlcmNlbnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIENzc0RhdGFUeXBlLkJhY2tncm91bmRQb3NpdGlvbjsKKyAgICAgICAgICAgIGlmIChCYWNrZ3JvdW5kUG9zaXRpb25WYWx1ZXMuQ29udGFpbnModGVybS5WYWx1ZS5Ub0xvd2VyKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBDc3NEYXRhVHlwZS5CYWNrZ3JvdW5kUG9zaXRpb247CisgICAgICAgICAgICByZXR1cm4gQ3NzRGF0YVR5cGUuQmFja2dyb3VuZFBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gTGlzdFN0eWxlUG9zaXRpb25WYWx1ZXMgPSBuZXdbXQorICAgICAgICB7CisgICAgICAgICAgICAiaW5zaWRlIiwKKyAgICAgICAgICAgICJvdXRzaWRlIiwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBCb3JkZXJTdHlsZVZhbHVlcyA9IG5ld1tdCisgICAgICAgIHsKKyAgICAgICAgICAgICJub25lIiwKKyAgICAgICAgICAgICJoaWRkZW4iLAorICAgICAgICAgICAgImRvdHRlZCIsCisgICAgICAgICAgICAiZGFzaGVkIiwKKyAgICAgICAgICAgICJzb2xpZCIsCisgICAgICAgICAgICAiZG91YmxlIiwKKyAgICAgICAgICAgICJncm9vdmUiLAorICAgICAgICAgICAgInJpZGdlIiwKKyAgICAgICAgICAgICJpbnNldCIsCisgICAgICAgICAgICAib3V0c2V0IiwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBDc3NEYXRhVHlwZSBHZXREYXRhdHlwZUZyb21Cb3JkZXJUZXJtKENzc1Rlcm0gdGVybSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRlcm0uSXNDb2xvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3NzRGF0YVR5cGUuQ29sb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoQm9yZGVyU3R5bGVWYWx1ZXMuQ29udGFpbnModGVybS5WYWx1ZS5Ub0xvd2VyKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBDc3NEYXRhVHlwZS5Cb3JkZXJTdHlsZTsKKyAgICAgICAgICAgIHJldHVybiBDc3NEYXRhVHlwZS5Cb3JkZXJXaWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ1tdIExpc3RTdHlsZVR5cGVWYWx1ZXMgPSBuZXdbXQorICAgICAgICB7CisgICAgICAgICAgICAiZGlzYyIsCisgICAgICAgICAgICAiY2lyY2xlIiwKKyAgICAgICAgICAgICJzcXVhcmUiLAorICAgICAgICAgICAgImRlY2ltYWwiLAorICAgICAgICAgICAgImRlY2ltYWwtbGVhZGluZy16ZXJvIiwKKyAgICAgICAgICAgICJsb3dlci1yb21hbiIsCisgICAgICAgICAgICAidXBwZXItcm9tYW4iLAorICAgICAgICAgICAgImxvd2VyLWdyZWVrIiwKKyAgICAgICAgICAgICJsb3dlci1sYXRpbiIsCisgICAgICAgICAgICAidXBwZXItbGF0aW4iLAorICAgICAgICAgICAgImFybWVuaWFuIiwKKyAgICAgICAgICAgICJnZW9yZ2lhbiIsCisgICAgICAgICAgICAibG93ZXItYWxwaGEiLAorICAgICAgICAgICAgInVwcGVyLWFscGhhIiwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBDc3NEYXRhVHlwZSBHZXREYXRhdHlwZUZyb21MaXN0U3R5bGVUZXJtKENzc1Rlcm0gdGVybSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKExpc3RTdHlsZVR5cGVWYWx1ZXMuQ29udGFpbnModGVybS5WYWx1ZS5Ub0xvd2VyKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBDc3NEYXRhVHlwZS5MaXN0U3R5bGVUeXBlOworICAgICAgICAgICAgaWYgKExpc3RTdHlsZVBvc2l0aW9uVmFsdWVzLkNvbnRhaW5zKHRlcm0uVmFsdWUuVG9Mb3dlcigpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3NzRGF0YVR5cGUuTGlzdFN0eWxlUG9zaXRpb247CisgICAgICAgICAgICByZXR1cm4gQ3NzRGF0YVR5cGUuTGlzdFN0eWxlSW1hZ2U7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBGb250U3R5bGVWYWx1ZXMgPSBuZXdbXQorICAgICAgICB7CisgICAgICAgICAgICAiaXRhbGljIiwKKyAgICAgICAgICAgICJvYmxpcXVlIiwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBGb250VmFyaWVudFZhbHVlcyA9IG5ld1tdCisgICAgICAgIHsKKyAgICAgICAgICAgICJzbWFsbC1jYXBzIiwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBGb250V2VpZ2h0VmFsdWVzID0gbmV3W10KKyAgICAgICAgeworICAgICAgICAgICAgImJvbGQiLAorICAgICAgICAgICAgImJvbGRlciIsCisgICAgICAgICAgICAibGlnaHRlciIsCisgICAgICAgICAgICAiMTAwIiwKKyAgICAgICAgICAgICIyMDAiLAorICAgICAgICAgICAgIjMwMCIsCisgICAgICAgICAgICAiNDAwIiwKKyAgICAgICAgICAgICI1MDAiLAorICAgICAgICAgICAgIjYwMCIsCisgICAgICAgICAgICAiNzAwIiwKKyAgICAgICAgICAgICI4MDAiLAorICAgICAgICAgICAgIjkwMCIsCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQ3NzRGF0YVR5cGUgR2V0RGF0YXR5cGVGcm9tRm9udFRlcm0oQ3NzVGVybSB0ZXJtKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoRm9udFN0eWxlVmFsdWVzLkNvbnRhaW5zKHRlcm0uVmFsdWUuVG9Mb3dlcigpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3NzRGF0YVR5cGUuRm9udFN0eWxlOworICAgICAgICAgICAgaWYgKEZvbnRWYXJpZW50VmFsdWVzLkNvbnRhaW5zKHRlcm0uVmFsdWUuVG9Mb3dlcigpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3NzRGF0YVR5cGUuRm9udFZhcmllbnQ7CisgICAgICAgICAgICBpZiAoRm9udFdlaWdodFZhbHVlcy5Db250YWlucyh0ZXJtLlZhbHVlLlRvTG93ZXIoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIENzc0RhdGFUeXBlLkZvbnRXZWlnaHQ7CisgICAgICAgICAgICBpZiAoRm9udFNpemVNYXAuQ29udGFpbnNLZXkodGVybS5WYWx1ZS5Ub0xvd2VyKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBDc3NEYXRhVHlwZS5Gb250U2l6ZTsKKyAgICAgICAgICAgIGlmICh0ZXJtLlVuaXQgPT0gQ3NzVW5pdC5DTSB8fAorICAgICAgICAgICAgICAgIHRlcm0uVW5pdCA9PSBDc3NVbml0LkVNIHx8CisgICAgICAgICAgICAgICAgdGVybS5Vbml0ID09IENzc1VuaXQuSU4gfHwKKyAgICAgICAgICAgICAgICB0ZXJtLlVuaXQgPT0gQ3NzVW5pdC5NTSB8fAorICAgICAgICAgICAgICAgIHRlcm0uVW5pdCA9PSBDc3NVbml0LlBUIHx8CisgICAgICAgICAgICAgICAgdGVybS5Vbml0ID09IENzc1VuaXQuUFggfHwKKyAgICAgICAgICAgICAgICB0ZXJtLlVuaXQgPT0gQ3NzVW5pdC5QZXJjZW50KQorICAgICAgICAgICAgICAgIHJldHVybiBDc3NEYXRhVHlwZS5MZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gQ3NzRGF0YVR5cGUuRm9udEZhbWlseTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBQcm9wZXJ0eUluZm8KKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHN0cmluZ1tdIE5hbWVzOworICAgICAgICAgICAgcHVibGljIGJvb2wgSW5oZXJpdHM7CisgICAgICAgICAgICBwdWJsaWMgRnVuYzxYRWxlbWVudCwgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3MsIGJvb2w+IEluY2x1ZGVzOworICAgICAgICAgICAgcHVibGljIEZ1bmM8WEVsZW1lbnQsIEh0bWxUb1dtbENvbnZlcnRlclNldHRpbmdzLCBDc3NFeHByZXNzaW9uPiBJbml0aWFsVmFsdWU7CisgICAgICAgICAgICBwdWJsaWMgRnVuYzxYRWxlbWVudCwgQ3NzRXhwcmVzc2lvbiwgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3MsIENzc0V4cHJlc3Npb24+IENvbXB1dGVkVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFdyaXRlWEh0bWxXaXRoQW5ub3RhdGlvbnMoWEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nQnVpbGRlciBzYikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGRlcHRoID0gZWxlbWVudC5BbmNlc3RvcnMoKS5Db3VudCgpICogMjsKKyAgICAgICAgICAgIFhFbGVtZW50IGR1bW15RWxlbWVudCA9IG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsIGVsZW1lbnQuQXR0cmlidXRlcygpKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZChTdHJpbmcuRm9ybWF0KCJ7MH17MX0iLCAiIi5QYWRSaWdodChkZXB0aCksIGR1bW15RWxlbWVudCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9wZXJ0eT4gcHJvcExpc3QgPSBlbGVtZW50LkFubm90YXRpb248RGljdGlvbmFyeTxzdHJpbmcsIFByb3BlcnR5Pj4oKTsKKyAgICAgICAgICAgIGlmIChwcm9wTGlzdCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiIi5QYWRSaWdodChkZXB0aCArIDIpICsgIlByb3BlcnRpZXMgZnJvbSBTdHlsZXNoZWV0cyIgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiIuUGFkUmlnaHQoZGVwdGggKyAyKSArICI9PT09PT09PT09PT09PT09PT09PT09PT09PT0iICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGt2cCBpbiBwcm9wTGlzdC5PcmRlckJ5KHAgPT4gcC5LZXkpLlRoZW5CeShwID0+IHAuVmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgcHJvcCA9IGt2cC5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByb3BTdHJpbmcgPSBTdHJpbmcuRm9ybWF0KCJ7MH0gSGlnaDp7MX0gSWQ6ezJ9IEF0dDp7M30gRWxsOns0fSBTZXE6ezV9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wLk5hbWUgKyAiOiIgKyBwcm9wLkV4cHJlc3Npb24gKyAiICIpLlBhZFJpZ2h0KDUwIC0gZGVwdGggKyAyLCAnLicpLCAoaW50KXByb3AuSGlnaE9yZGVyU29ydCwgcHJvcC5JZEF0dHJpYnV0ZXNJblNlbGVjdG9yLCBwcm9wLkF0dHJpYnV0ZXNJblNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5FbGVtZW50TmFtZXNJblNlbGVjdG9yLCBwcm9wLlNlcXVlbmNlTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKFN0cmluZy5Gb3JtYXQoInswfXsxfSIsICIiLlBhZFJpZ2h0KGRlcHRoICsgMiksIHByb3BTdHJpbmcpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZChFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBDc3NFeHByZXNzaW9uPiBjb21wdXRlZFByb3BlcnRpZXMgPSBlbGVtZW50LkFubm90YXRpb248RGljdGlvbmFyeTxzdHJpbmcsIENzc0V4cHJlc3Npb24+PigpOworICAgICAgICAgICAgaWYgKGNvbXB1dGVkUHJvcGVydGllcyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiIi5QYWRSaWdodChkZXB0aCArIDIpICsgIkNvbXB1dGVkIFByb3BlcnRpZXMiICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIiLlBhZFJpZ2h0KGRlcHRoICsgMikgKyAiPT09PT09PT09PT09PT09PT09PSIgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcHJvcCBpbiBjb21wdXRlZFByb3BlcnRpZXMuT3JkZXJCeShjcCA9PiBjcC5LZXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByb3BTdHJpbmcgPSBwcm9wLktleSArICI6IiArIHByb3AuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChTdHJpbmcuRm9ybWF0KCJ7MH17MX0iLCAiIi5QYWRSaWdodChkZXB0aCArIDIpLCBwcm9wU3RyaW5nKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2hpbGQgaW4gZWxlbWVudC5FbGVtZW50cygpKQorICAgICAgICAgICAgICAgIFdyaXRlWEh0bWxXaXRoQW5ub3RhdGlvbnMoY2hpbGQsIHNiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIER1bXBDc3MoQ3NzRG9jdW1lbnQgY3NzKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGludCBpbmRlbnQgPSAwOworCisgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiQ1NTIFRyZWUgRHVtcCIpOworICAgICAgICAgICAgUHIoc2IsIGluZGVudCwgIj09PT09PT09PT09PT0iKTsKKworICAgICAgICAgICAgUHIoc2IsIGluZGVudCwgIkRpcmVjdGl2ZXMgY291bnQ6IHswfSIsIGNzcy5EaXJlY3RpdmVzLkNvdW50KCkpOworICAgICAgICAgICAgUHIoc2IsIGluZGVudCwgIlJ1bGVTZXQgY291bnQ6IHswfSIsIGNzcy5SdWxlU2V0cy5Db3VudCgpKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBycyBpbiBjc3MuUnVsZVNldHMpCisgICAgICAgICAgICAgICAgRHVtcFJ1bGVTZXQoc2IsIGluZGVudCwgcnMpOworCisgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiIik7CisgICAgICAgICAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRHVtcEZ1bmN0aW9uKFN0cmluZ0J1aWxkZXIgc2IsIGludCBpbmRlbnQsIENzc0Z1bmN0aW9uIGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFByKHNiLCBpbmRlbnQsICJGdW5jdGlvbjogezB9IiwgZik7CisgICAgICAgICAgICBpZiAoZiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGVudCsrOworICAgICAgICAgICAgICAgIFByKHNiLCBpbmRlbnQsICJOYW1lOiB7MH0iLCBmLk5hbWUpOworICAgICAgICAgICAgICAgIER1bXBFeHByZXNzaW9uKHNiLCBpbmRlbnQsIGYuRXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgaW5kZW50LS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIER1bXBBdHRyaWJ1dGUoU3RyaW5nQnVpbGRlciBzYiwgaW50IGluZGVudCwgT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NBdHRyaWJ1dGUgYSkKKyAgICAgICAgeworICAgICAgICAgICAgUHIoc2IsIGluZGVudCwgIkF0dHJpYnV0ZTogezB9IiwgYSk7CisgICAgICAgICAgICBpZiAoYSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGVudCsrOworICAgICAgICAgICAgICAgIFByKHNiLCBpbmRlbnQsICJPcGVyYW5kOiB7MH0iLCBhLk9wZXJhbmQpOworICAgICAgICAgICAgICAgIFByKHNiLCBpbmRlbnQsICJPcGVyYXRvcjogezB9IiwgYS5PcGVyYXRvcik7CisgICAgICAgICAgICAgICAgUHIoc2IsIGluZGVudCwgIk9wZXJhdG9yU3RyaW5nOiB7MH0iLCBhLkNzc09wZXJhdG9yU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiVmFsdWU6IHswfSIsIGEuVmFsdWUpOworICAgICAgICAgICAgICAgIGluZGVudC0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBEdW1wU2ltcGxlU2VsZWN0b3IoU3RyaW5nQnVpbGRlciBzYiwgaW50IGluZGVudCwgQ3NzU2ltcGxlU2VsZWN0b3IgcykKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZW50Kys7CisgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiU2ltcGxlU2VsZWN0b3I6IHswfSIsIHMpOworICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRlbnQrKzsKKyAgICAgICAgICAgICAgICBEdW1wQXR0cmlidXRlKHNiLCBpbmRlbnQsIHMuQXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiQ2hpbGQ6IHswfSIsIHMuQ2hpbGQpOworICAgICAgICAgICAgICAgIER1bXBTaW1wbGVTZWxlY3RvcihzYiwgaW5kZW50LCBzLkNoaWxkKTsKKyAgICAgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiQ2xhc3M6IHswfSIsIHMuQ2xhc3MpOworICAgICAgICAgICAgICAgIFByKHNiLCBpbmRlbnQsICJDb21iaW5hdG9yOiB7MH0iLCBzLkNvbWJpbmF0b3IpOworICAgICAgICAgICAgICAgIFByKHNiLCBpbmRlbnQsICJDb21iaW5hdG9yU3RyaW5nOiB7MH0iLCBzLkNvbWJpbmF0b3JTdHJpbmcpOworICAgICAgICAgICAgICAgIFByKHNiLCBpbmRlbnQsICJFbGVtZW50TmFtZTogPnswfTwiLCBzLkVsZW1lbnROYW1lKTsKKyAgICAgICAgICAgICAgICBEdW1wRnVuY3Rpb24oc2IsIGluZGVudCwgcy5GdW5jdGlvbik7CisgICAgICAgICAgICAgICAgUHIoc2IsIGluZGVudCwgIklEOiB7MH0iLCBzLklEKTsKKyAgICAgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiUHNldWRvOiB7MH0iLCBzLlBzZXVkbyk7CisgICAgICAgICAgICAgICAgaW5kZW50LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRlbnQtLTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRHVtcFNlbGVjdG9ycyhTdHJpbmdCdWlsZGVyIHNiLCBpbnQgaW5kZW50LCBDc3NTZWxlY3RvciBzKQorICAgICAgICB7CisgICAgICAgICAgICBpbmRlbnQrKzsKKyAgICAgICAgICAgIFByKHNiLCBpbmRlbnQsICJTaW1wbGVTZWxlY3RvcnMgY291bnQ6IHswfSIsIHMuU2ltcGxlU2VsZWN0b3JzLkNvdW50KCkpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHNzIGluIHMuU2ltcGxlU2VsZWN0b3JzKQorICAgICAgICAgICAgICAgIER1bXBTaW1wbGVTZWxlY3RvcihzYiwgaW5kZW50LCBzcyk7CisgICAgICAgICAgICBpbmRlbnQtLTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRHVtcFRlcm0oU3RyaW5nQnVpbGRlciBzYiwgaW50IGluZGVudCwgQ3NzVGVybSB0KQorICAgICAgICB7CisgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiVGVybSA+ezB9PCIsIHQuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpbmRlbnQrKzsKKyAgICAgICAgICAgIER1bXBGdW5jdGlvbihzYiwgaW5kZW50LCB0LkZ1bmN0aW9uKTsKKyAgICAgICAgICAgIFByKHNiLCBpbmRlbnQsICJJc0NvbG9yOiB7MH0iLCB0LklzQ29sb3IpOworICAgICAgICAgICAgUHIoc2IsIGluZGVudCwgIlNlcGFyYXRvcjogezB9IiwgdC5TZXBhcmF0b3IpOworICAgICAgICAgICAgUHIoc2IsIGluZGVudCwgIlNlcGFyYXRvckNoYXI6IHswfSIsIHQuU2VwYXJhdG9yQ2hhcik7CisgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiU2lnbjogezB9IiwgdC5TaWduKTsKKyAgICAgICAgICAgIFByKHNiLCBpbmRlbnQsICJTaWduQ2hhcjogezB9IiwgdC5TaWduQ2hhcik7CisgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiVHlwZTogezB9IiwgdC5UeXBlKTsKKyAgICAgICAgICAgIFByKHNiLCBpbmRlbnQsICJVbml0OiB7MH0iLCB0LlVuaXQpOworICAgICAgICAgICAgUHIoc2IsIGluZGVudCwgIlVuaXRTdHJpbmc6IHswfSIsIHQuVW5pdFN0cmluZyk7CisgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiVmFsdWU6IHswfSIsIHQuVmFsdWUpOworICAgICAgICAgICAgaW5kZW50LS07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIER1bXBFeHByZXNzaW9uKFN0cmluZ0J1aWxkZXIgc2IsIGludCBpbmRlbnQsIENzc0V4cHJlc3Npb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgUHIoc2IsIGluZGVudCwgIkV4cHJlc3Npb24gPnswfTwiLCBlLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgaW5kZW50Kys7CisgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiVGVybXMgY291bnQ6IHswfSIsIGUuVGVybXMuQ291bnQoKSk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBlLlRlcm1zKQorICAgICAgICAgICAgICAgIER1bXBUZXJtKHNiLCBpbmRlbnQsIHQpOworICAgICAgICAgICAgaW5kZW50LS07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIER1bXBEZWNsYXJhdGlvbnMoU3RyaW5nQnVpbGRlciBzYiwgaW50IGluZGVudCwgQ3NzRGVjbGFyYXRpb24gZCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZW50Kys7CisgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiRGVjbGFyYXRpb24gPnswfTwiLCBkLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgaW5kZW50Kys7CisgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiTmFtZTogezB9IiwgZC5OYW1lKTsKKyAgICAgICAgICAgIER1bXBFeHByZXNzaW9uKHNiLCBpbmRlbnQsIGQuRXhwcmVzc2lvbik7CisgICAgICAgICAgICBQcihzYiwgaW5kZW50LCAiSW1wb3J0YW50OiB7MH0iLCBkLkltcG9ydGFudCk7CisgICAgICAgICAgICBpbmRlbnQtLTsKKyAgICAgICAgICAgIGluZGVudC0tOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBEdW1wUnVsZVNldChTdHJpbmdCdWlsZGVyIHNiLCBpbnQgaW5kZW50LCBDc3NSdWxlU2V0IHJzKQorICAgICAgICB7CisgICAgICAgICAgICBpbmRlbnQrKzsKKyAgICAgICAgICAgIFByKHNiLCBpbmRlbnQsICJSdWxlU2V0Iik7CisgICAgICAgICAgICBpbmRlbnQrKzsKKyAgICAgICAgICAgIFByKHNiLCBpbmRlbnQsICJTZWxlY3RvcnMgY291bnQ6IHswfSIsIHJzLlNlbGVjdG9ycy5Db3VudCgpKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzIGluIHJzLlNlbGVjdG9ycykKKyAgICAgICAgICAgICAgICBEdW1wU2VsZWN0b3JzKHNiLCBpbmRlbnQsIHMpOworICAgICAgICAgICAgUHIoc2IsIGluZGVudCwgIkRlY2xhcmF0aW9ucyBjb3VudDogezB9IiwgcnMuRGVjbGFyYXRpb25zLkNvdW50KCkpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGQgaW4gcnMuRGVjbGFyYXRpb25zKQorICAgICAgICAgICAgICAgIER1bXBEZWNsYXJhdGlvbnMoc2IsIGluZGVudCwgZCk7CisgICAgICAgICAgICBpbmRlbnQtLTsKKyAgICAgICAgICAgIGluZGVudC0tOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBQcihTdHJpbmdCdWlsZGVyIHNiLCBpbnQgaW5kZW50LCBzdHJpbmcgZm9ybWF0LCBvYmplY3QgbykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IFN0cmluZy5Gb3JtYXQoZm9ybWF0LCBvKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IyID0gbmV3IFN0cmluZ0J1aWxkZXIoIiIuUGFkUmlnaHQoaW5kZW50ICogMikgKyB0ZXh0KTsKKyAgICAgICAgICAgIC8vc2IyLlJlcGxhY2UoIiYiLCAiJmFtcDsiKTsKKyAgICAgICAgICAgIC8vc2IyLlJlcGxhY2UoIjwiLCAiJmx0OyIpOworICAgICAgICAgICAgLy9zYjIuUmVwbGFjZSgiPiIsICImZ3Q7Iik7CisgICAgICAgICAgICBzYi5BcHBlbmQoc2IyKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZChFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoc2IyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHIoU3RyaW5nQnVpbGRlciBzYiwgaW50IGluZGVudCwgc3RyaW5nIHRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IyID0gbmV3IFN0cmluZ0J1aWxkZXIoIiIuUGFkUmlnaHQoaW5kZW50ICogMikgKyB0ZXh0KTsKKyAgICAgICAgICAgIC8vc2IyLlJlcGxhY2UoIiYiLCAiJmFtcDsiKTsKKyAgICAgICAgICAgIC8vc2IyLlJlcGxhY2UoIjwiLCAiJmx0OyIpOworICAgICAgICAgICAgLy9zYjIuUmVwbGFjZSgiPiIsICImZ3Q7Iik7CisgICAgICAgICAgICBzYi5BcHBlbmQoc2IyKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZChFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoc2IyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBQcm9wZXJ0eSA6IElDb21wYXJhYmxlPFByb3BlcnR5PgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIENzc0V4cHJlc3Npb24gRXhwcmVzc2lvbiB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgSGlnaE9yZGVyUHJpb3JpdHkgSGlnaE9yZGVyU29ydCB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgaW50IElkQXR0cmlidXRlc0luU2VsZWN0b3IgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIGludCBBdHRyaWJ1dGVzSW5TZWxlY3RvciB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgaW50IEVsZW1lbnROYW1lc0luU2VsZWN0b3IgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIGludCBTZXF1ZW5jZU51bWJlciB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgZW51bSBIaWdoT3JkZXJQcmlvcml0eQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluaXRpYWxWYWx1ZSA9IDAsCisgICAgICAgICAgICAgICAgSW5oZXJpdGVkID0gMSwKKyAgICAgICAgICAgICAgICBVc2VyQWdlbnROb3JtYWwgPSAyLAorICAgICAgICAgICAgICAgIFVzZXJBZ2VudEhpZ2ggPSAzLAorICAgICAgICAgICAgICAgIFVzZXJOb3JtYWwgPSA0LAorICAgICAgICAgICAgICAgIEF1dGhvck5vcm1hbCA9IDUsCisgICAgICAgICAgICAgICAgSHRtbEF0dHJpYnV0ZSA9IDYsCisgICAgICAgICAgICAgICAgU3R5bGVBdHRyaWJ1dGVOb3JtYWwgPSA3LAorICAgICAgICAgICAgICAgIFN0eWxlQXR0cmlidXRlSGlnaCA9IDgsCisgICAgICAgICAgICAgICAgQXV0aG9ySGlnaCA9IDksCisgICAgICAgICAgICAgICAgVXNlckhpZ2ggPSAxMCwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGludCBTeXN0ZW0uSUNvbXBhcmFibGU8UHJvcGVydHk+LkNvbXBhcmVUbyhQcm9wZXJ0eSBvdGhlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGxlc3MgdGhhbiBvdGhlciwgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBncmVhdGVyIHRoYW4gb3RoZXIsIHJldHVybiAxCisKKyAgICAgICAgICAgICAgICBpbnQgZ3QgPSAxOworICAgICAgICAgICAgICAgIGludCBsdCA9IC0xOworICAgICAgICAgICAgICAgIGlmICh0aGlzLkhpZ2hPcmRlclNvcnQgPCBvdGhlci5IaWdoT3JkZXJTb3J0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbHQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuSGlnaE9yZGVyU29ydCA+IG90aGVyLkhpZ2hPcmRlclNvcnQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBndDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5JZEF0dHJpYnV0ZXNJblNlbGVjdG9yIDwgb3RoZXIuSWRBdHRyaWJ1dGVzSW5TZWxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGx0OworICAgICAgICAgICAgICAgIGlmICh0aGlzLklkQXR0cmlidXRlc0luU2VsZWN0b3IgPiBvdGhlci5JZEF0dHJpYnV0ZXNJblNlbGVjdG9yKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Q7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuQXR0cmlidXRlc0luU2VsZWN0b3IgPCBvdGhlci5BdHRyaWJ1dGVzSW5TZWxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGx0OworICAgICAgICAgICAgICAgIGlmICh0aGlzLkF0dHJpYnV0ZXNJblNlbGVjdG9yID4gb3RoZXIuQXR0cmlidXRlc0luU2VsZWN0b3IpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBndDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5FbGVtZW50TmFtZXNJblNlbGVjdG9yIDwgb3RoZXIuRWxlbWVudE5hbWVzSW5TZWxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGx0OworICAgICAgICAgICAgICAgIGlmICh0aGlzLkVsZW1lbnROYW1lc0luU2VsZWN0b3IgPiBvdGhlci5FbGVtZW50TmFtZXNJblNlbGVjdG9yKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Q7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuU2VxdWVuY2VOdW1iZXIuQ29tcGFyZVRvKG90aGVyLlNlcXVlbmNlTnVtYmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IENvbG9yTWFwID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCkKKyAgICAgICAgeworICAgICAgICAgICAgeyAibWFyb29uIiwgIjgwMDAwMCIgfSwKKyAgICAgICAgICAgIHsgInJlZCIsICJGRjAwMDAiIH0sCisgICAgICAgICAgICB7ICJvcmFuZ2UiLCAiRkZBNTAwIiB9LAorICAgICAgICAgICAgeyAieWVsbG93IiwgIkZGRkYwMCIgfSwKKyAgICAgICAgICAgIHsgIm9saXZlIiwgIjgwODAwMCIgfSwKKyAgICAgICAgICAgIHsgInB1cnBsZSIsICI4MDAwODAiIH0sCisgICAgICAgICAgICB7ICJmdWNoc2lhIiwgIkZGMDBGRiIgfSwKKyAgICAgICAgICAgIHsgIndoaXRlIiwgIkZGRkZGRiIgfSwKKyAgICAgICAgICAgIHsgImxpbWUiLCAiMDBGRjAwIiB9LAorICAgICAgICAgICAgeyAiZ3JlZW4iLCAiMDA4MDAwIiB9LAorICAgICAgICAgICAgeyAibmF2eSIsICIwMDAwODAiIH0sCisgICAgICAgICAgICB7ICJibHVlIiwgIjAwMDBGRiIgfSwKKyAgICAgICAgICAgIHsgIm1lZGl1bWJsdWUiLCAiMDAwMENEIiB9LAorICAgICAgICAgICAgeyAiYXF1YSIsICIwMEZGRkYiIH0sCisgICAgICAgICAgICB7ICJ0ZWFsIiwgIjAwODA4MCIgfSwKKyAgICAgICAgICAgIHsgImJsYWNrIiwgIjAwMDAwMCIgfSwKKyAgICAgICAgICAgIHsgInNpbHZlciIsICJDMEMwQzAiIH0sCisgICAgICAgICAgICB7ICJncmF5IiwgIjgwODA4MCIgfSwKKyAgICAgICAgICAgIHsgImRhcmtncmF5IiwgIkE5QTlBOSIgfSwKKyAgICAgICAgICAgIHsgImJlaWdlIiwgIkY1RjVEQyIgfSwKKyAgICAgICAgICAgIHsgIndpbmRvd3RleHQiLCAiMDAwMDAwIiB9LAorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldFdtbENvbG9yRnJvbUV4cHJlc3Npb24oQ3NzRXhwcmVzc2lvbiBjb2xvcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdG9kbyBoYXZlIHRvIGhhbmRsZSBhbGwgZm9ybXMgb2YgY29sb3JzIGhlcmUKKyAgICAgICAgICAgIGlmIChjb2xvci5UZXJtcy5Db3VudCgpID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3NzVGVybSB0ZXJtID0gY29sb3IuVGVybXMuRmlyc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAodGVybS5UeXBlID09IENzc1Rlcm1UeXBlLkZ1bmN0aW9uICYmIHRlcm0uRnVuY3Rpb24uTmFtZS5Ub1VwcGVyKCkgPT0gIlJHQiIgJiYgdGVybS5GdW5jdGlvbi5FeHByZXNzaW9uLlRlcm1zLkNvdW50ID09IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMaXN0PENzc1Rlcm0+IGx0ID0gdGVybS5GdW5jdGlvbi5FeHByZXNzaW9uLlRlcm1zOworICAgICAgICAgICAgICAgICAgICBpZiAobHQuRmlyc3QoKS5Vbml0ID09IENzc1VuaXQuUGVyY2VudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHYxID0gbHQuRmlyc3QoKS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2MiA9IGx0LkVsZW1lbnRBdCgxKS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2MyA9IGx0LkVsZW1lbnRBdCgyKS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb2xvckluSGV4ID0gU3RyaW5nLkZvcm1hdCgiezA6eDJ9ezE6eDJ9ezI6eDJ9IiwgKGludCkoKGZsb2F0LlBhcnNlKHYxKSAvIDEwMC4wKSAqIDI1NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKGZsb2F0LlBhcnNlKHYyKSAvIDEwMC4wKSAqIDI1NSksIChpbnQpKChmbG9hdC5QYXJzZSh2MykgLyAxMDAuMCkgKiAyNTUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvckluSGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHYxID0gbHQuRmlyc3QoKS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2MiA9IGx0LkVsZW1lbnRBdCgxKS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2MyA9IGx0LkVsZW1lbnRBdCgyKS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb2xvckluSGV4ID0gU3RyaW5nLkZvcm1hdCgiezA6eDJ9ezE6eDJ9ezI6eDJ9IiwgaW50LlBhcnNlKHYxKSwgaW50LlBhcnNlKHYyKSwgaW50LlBhcnNlKHYzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3JJbkhleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJpbmcgdmFsdWUgPSB0ZXJtLlZhbHVlOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5TdWJzdHJpbmcoMCwgMSkgPT0gIiMiICYmIHZhbHVlLkxlbmd0aCA9PSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGUgPSBDb252ZXJ0U2luZ2xlRGlnaXQodmFsdWUuU3Vic3RyaW5nKDEsIDEpKSArCisgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0U2luZ2xlRGlnaXQodmFsdWUuU3Vic3RyaW5nKDIsIDEpKSArCisgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0U2luZ2xlRGlnaXQodmFsdWUuU3Vic3RyaW5nKDMsIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5TdWJzdHJpbmcoMCwgMSkgPT0gIiMiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIGlmIChDb2xvck1hcC5Db250YWluc0tleSh2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xvck1hcFt2YWx1ZV07CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICIwMDAwMDAiOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIENvbnZlcnRTaW5nbGVEaWdpdChzdHJpbmcgc2luZ2xlRGlnaXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzaW5nbGVEaWdpdCArIHNpbmdsZURpZ2l0OworICAgICAgICB9CisgICAgfQorfQorCisjaWYgZmFsc2UKK2NvbG9yCitWYWx1ZTogICAgICAgICAgPGNvbG9yPiB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBkZXBlbmRzIG9uIFVBCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgeWVzCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworCittYXJnaW4tdG9wLCBtYXJnaW4tYm90dG9tCitWYWx1ZTogICAgICAgICAgPG1hcmdpbi13aWR0aD4gfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgMAorQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cyBleGNlcHQgZWxlbWVudHMgd2l0aCB0YWJsZSBkaXNwbGF5IHR5cGVzIG90aGVyIHRoYW4gdGFibGUtY2FwdGlvbiwgdGFibGUsIGFuZCBpbmxpbmUtdGFibGUKKyAgICAgICAgICAgICAgICBhbGwgZWxlbWVudHMgZXhjZXB0IHRoLCB0ZCwgdHIKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIHJlZmVyIHRvIHdpZHRoIG9mIGNvbnRhaW5pbmcgYmxvY2sKK0NvbXB1dGVkIHZhbHVlOiB0aGUgcGVyY2VudGFnZSBhcyBzcGVjaWZpZWQgb3IgdGhlIGFic29sdXRlIGxlbmd0aAorCittYXJnaW4tcmlnaHQsIG1hcmdpbi1sZWZ0CitWYWx1ZTogICAgICAgICAgPG1hcmdpbi13aWR0aD4gfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgMAorQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cyBleGNlcHQgZWxlbWVudHMgd2l0aCB0YWJsZSBkaXNwbGF5IHR5cGVzIG90aGVyIHRoYW4gdGFibGUtY2FwdGlvbiwgdGFibGUsIGFuZCBpbmxpbmUtdGFibGUKKyAgICAgICAgICAgICAgICBhbGwgZWxlbWVudHMgZXhjZXB0IHRoLCB0ZCwgdHIKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIHJlZmVyIHRvIHdpZHRoIG9mIGNvbnRhaW5pbmcgYmxvY2sKK0NvbXB1dGVkIHZhbHVlOiB0aGUgcGVyY2VudGFnZSBhcyBzcGVjaWZpZWQgb3IgdGhlIGFic29sdXRlIGxlbmd0aAorCitwYWRkaW5nLXRvcCwgcGFkZGluZy1yaWdodCwgcGFkZGluZy1ib3R0b20sIHBhZGRpbmctbGVmdAorVmFsdWU6ICAgICAgICAgIDxwYWRkaW5nLXdpZHRoPiB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICAwCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzIGV4Y2VwdCB0YWJsZS1yb3ctZ3JvdXAsIHRhYmxlLWhlYWRlci1ncm91cCwKKyAgICAgICAgICAgICAgICB0YWJsZS1mb290ZXItZ3JvdXAsIHRhYmxlLXJvdywgdGFibGUtY29sdW1uLWdyb3VwIGFuZCB0YWJsZS1jb2x1bW4KKyAgICAgICAgICAgICAgICBhbGwgZWxlbWVudHMgZXhjZXB0IHRyCitJbmhlcml0ZWQ6ICAgICAgbm8KK1BlcmNlbnRhZ2VzOiAgICByZWZlciB0byB3aWR0aCBvZiBjb250YWluaW5nIGJsb2NrCitDb21wdXRlZCB2YWx1ZTogdGhlIHBlcmNlbnRhZ2UgYXMgc3BlY2lmaWVkIG9yIHRoZSBhYnNvbHV0ZSBsZW5ndGgKKworYm9yZGVyLXRvcC13aWR0aCwgYm9yZGVyLXJpZ2h0LXdpZHRoLCBib3JkZXItYm90dG9tLXdpZHRoLCBib3JkZXItbGVmdC13aWR0aAorVmFsdWU6ICAgICAgICAgIDxib3JkZXItd2lkdGg+IHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIG1lZGl1bQorQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworSW5oZXJpdGVkOiAgICAgIG5vCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogYWJzb2x1dGUgbGVuZ3RoOyAnMCcgaWYgdGhlIGJvcmRlciBzdHlsZSBpcyAnbm9uZScgb3IgJ2hpZGRlbicKKworYm9yZGVyLXRvcC1jb2xvciwgYm9yZGVyLXJpZ2h0LWNvbG9yLCBib3JkZXItYm90dG9tLWNvbG9yLCBib3JkZXItbGVmdC1jb2xvcgorVmFsdWU6ICAgICAgICAgIDxjb2xvcj4gfCB0cmFuc3BhcmVudCB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIGNvbG9yIHByb3BlcnR5CitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgbm8KK1BlcmNlbnRhZ2VzOiAgICBOL0EKK0NvbXB1dGVkIHZhbHVlOiB3aGVuIHRha2VuIGZyb20gdGhlIOKAmWNvbG9y4oCZIHByb3BlcnR5LCB0aGUgY29tcHV0ZWQgdmFsdWUgb2YKKyAgICAgICAgICAgICAgICDigJljb2xvcuKAmTsgb3RoZXJ3aXNlLCBhcyBzcGVjaWZpZWQKKworYm9yZGVyLXRvcC1zdHlsZSwgYm9yZGVyLXJpZ2h0LXN0eWxlLCBib3JkZXItYm90dG9tLXN0eWxlLCBib3JkZXItbGVmdC1zdHlsZQorVmFsdWU6ICAgICAgICAgIDxib3JkZXItc3R5bGU+IHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIG5vbmUKK0FwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIE4vQQorQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWNpZmllZAorCitkaXNwbGF5CitWYWx1ZTogICAgICAgICAgaW5saW5lIHwgYmxvY2sgfCBsaXN0LWl0ZW0gfCBpbmxpbmUtYmxvY2sgfCB0YWJsZSB8IGlubGluZS10YWJsZSB8CisgICAgICAgICAgICAgICAgdGFibGUtcm93LWdyb3VwIHwgdGFibGUtaGVhZGVyLWdyb3VwIHwgdGFibGUtZm9vdGVyLWdyb3VwIHwKKyAgICAgICAgICAgICAgICB0YWJsZS1yb3cgfCB0YWJsZS1jb2x1bW4tZ3JvdXAgfCB0YWJsZS1jb2x1bW4gfCB0YWJsZS1jZWxsIHwKKyAgICAgICAgICAgICAgICB0YWJsZS1jYXB0aW9uIHwgbm9uZSB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBpbmxpbmUKK0FwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIE4vQQorQ29tcHV0ZWQgdmFsdWU6IHNlZSB0ZXh0CisKK3Bvc2l0aW9uCitWYWx1ZTogICAgICAgICAgc3RhdGljIHwgcmVsYXRpdmUgfCBhYnNvbHV0ZSB8IGZpeGVkIHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIHN0YXRpYworQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworSW5oZXJpdGVkOiAgICAgIG5vCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogYXMgc3BlY2lmaWVkCisKK3RvcAorVmFsdWU6ICAgICAgICAgIDxsZW5ndGg+IHwgPHBlcmNlbnRhZ2U+IHwgYXV0byB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBhdXRvCitBcHBsaWVzIHRvOiAgICAgcG9zaXRpb25lZCBlbGVtZW50cworSW5oZXJpdGVkOiAgICAgIG5vCitQZXJjZW50YWdlczogICAgcmVmZXIgdG8gaGVpZ2h0IG9mIGNvbnRhaW5pbmcgYmxvY2sKK0NvbXB1dGVkIHZhbHVlOiBpZiBzcGVjaWZpZWQgYXMgYSBsZW5ndGgsIHRoZSBjb3JyZXNwb25kaW5nIGFic29sdXRlIGxlbmd0aDsgaWYKKyAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYXMgYSBwZXJjZW50YWdlLCB0aGUgc3BlY2lmaWVkIHZhbHVlOyBvdGhlcndpc2UsIOKAmWF1dG/igJkuCisKK3JpZ2h0CitWYWx1ZTogICAgICAgICAgPGxlbmd0aD4gfCA8cGVyY2VudGFnZT4gfCBhdXRvIHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIGF1dG8KK0FwcGxpZXMgdG86ICAgICBwb3NpdGlvbmVkIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgbm8KK1BlcmNlbnRhZ2VzOiAgICByZWZlciB0byB3aWR0aCBvZiBjb250YWluaW5nIGJsb2NrCitDb21wdXRlZCB2YWx1ZTogaWYgc3BlY2lmaWVkIGFzIGEgbGVuZ3RoLCB0aGUgY29ycmVzcG9uZGluZyBhYnNvbHV0ZSBsZW5ndGg7IGlmCisgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGFzIGEgcGVyY2VudGFnZSwgdGhlIHNwZWNpZmllZCB2YWx1ZTsgb3RoZXJ3aXNlLCDigJlhdXRv4oCZLgorCitib3R0b20KK1ZhbHVlOiAgICAgICAgICA8bGVuZ3RoPiB8IDxwZXJjZW50YWdlPiB8IGF1dG8gfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgYXV0bworQXBwbGllcyB0bzogICAgIHBvc2l0aW9uZWQgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIHJlZmVyIHRvIGhlaWdodCBvZiBjb250YWluaW5nIGJsb2NrCitDb21wdXRlZCB2YWx1ZTogaWYgc3BlY2lmaWVkIGFzIGEgbGVuZ3RoLCB0aGUgY29ycmVzcG9uZGluZyBhYnNvbHV0ZSBsZW5ndGg7IGlmCisgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGFzIGEgcGVyY2VudGFnZSwgdGhlIHNwZWNpZmllZCB2YWx1ZTsgb3RoZXJ3aXNlLCDigJlhdXRv4oCZLgorCitsZWZ0CitWYWx1ZTogICAgICAgICAgPGxlbmd0aD4gfCA8cGVyY2VudGFnZT4gfCBhdXRvIHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIGF1dG8KK0FwcGxpZXMgdG86ICAgICBwb3NpdGlvbmVkIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgbm8KK1BlcmNlbnRhZ2VzOiAgICByZWZlciB0byB3aWR0aCBvZiBjb250YWluaW5nIGJsb2NrCitDb21wdXRlZCB2YWx1ZTogaWYgc3BlY2lmaWVkIGFzIGEgbGVuZ3RoLCB0aGUgY29ycmVzcG9uZGluZyBhYnNvbHV0ZSBsZW5ndGg7IGlmCisgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGFzIGEgcGVyY2VudGFnZSwgdGhlIHNwZWNpZmllZCB2YWx1ZTsgb3RoZXJ3aXNlLCDigJlhdXRv4oCZLgorCitmbG9hdAorVmFsdWU6ICAgICAgICAgIGxlZnQgfCByaWdodCB8IG5vbmUgfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgbm9uZQorQXBwbGllcyB0bzogICAgIGFsbCwgYnV0IHNlZSA5LjcgcC4gMTUzCitJbmhlcml0ZWQ6ICAgICAgbm8KK1BlcmNlbnRhZ2VzOiAgICBOL0EKK0NvbXB1dGVkIHZhbHVlOiBhcyBzcGVjaWZpZWQKKworY2xlYXIKK1ZhbHVlOiAgICAgICAgICBub25lIHwgbGVmdCB8IHJpZ2h0IHwgYm90aCB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBub25lCitBcHBsaWVzIHRvOiAgICAgYmxvY2stbGV2ZWwgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIE4vQQorQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWNpZmllZAorCit6LWluZGV4CitWYWx1ZTogICAgICAgICAgYXV0byB8IGludGVnZXIgfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgYXV0bworQXBwbGllcyB0bzogICAgIHBvc2l0aW9uZWQgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIE4vQQorQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWMKKworZGlyZWN0aW9uCitWYWx1ZTogICAgICAgICAgbHRyIHwgcnRsIHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIGx0cgorQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworSW5oZXJpdGVkOiAgICAgIHllcworUGVyY2VudGFnZXM6ICAgIE4vQQorQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWMKKwordW5pY29kZS1iaWRpCitWYWx1ZTogICAgICAgICAgbm9ybWFsIHwgZW1iZWQgfCBiaWRpLW92ZXJyaWRlIHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIG5vcm1hbAorQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cywgYnV0IHNlZSBwcm9zZQorSW5oZXJpdGVkOiAgICAgIG5vCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworCit3aWR0aAorVmFsdWU6ICAgICAgICAgIDxsZW5ndGg+IHwgPHBlcmNlbnRhZ2U+IHwgYXV0byB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBhdXRvCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzIGJ1dCBub24tcmVwbGFjZWQgaW4tbGluZSBlbGVtZW50cywgdGFibGUgcm93cywgYW5kIHJvdyBncm91cHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIHJlZmVyIHRvIHdpZHRoIG9mIGNvbnRhaW5pbmcgYmxvY2sKK0NvbXB1dGVkIHZhbHVlOiB0aGUgcGVyY2VudGFnZSBvciAnYXV0bycgYXMgc3BlY2lmaWVkIG9yIHRoZSBhYnNvbHV0ZSBsZW5ndGgKKworbWluLXdpZHRoCitWYWx1ZTogICAgICAgICAgPGxlbmd0aD4gfCA8cGVyY2VudGFnZT4gfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgMAorQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cyBidXQgbm9uLXJlcGxhY2VkIGluLWxpbmUgZWxlbWVudHMsIHRhYmxlIHJvd3MsIGFuZCByb3cgZ3JvdXBzCitJbmhlcml0ZWQ6ICAgICAgbm8KK1BlcmNlbnRhZ2VzOiAgICByZWZlciB0byB3aWR0aCBvZiBjb250YWluaW5nIGJsb2NrCitDb21wdXRlZCB2YWx1ZTogdGhlIHBlcmNlbnRhZ2UgYXMgc3BlYyBvciB0aGUgYWJzb2x1dGUgbGVuZ3RoCisKK21heC13aWR0aAorVmFsdWU6ICAgICAgICAgIDxsZW5ndGg+IHwgPHBlcmNlbnRhZ2U+IHwgbm9uZSB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBub25lCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzIGJ1dCBub24tcmVwbGFjZWQgaW4tbGluZSBlbGVtZW50cywgdGFibGUgcm93cywgYW5kIHJvdyBncm91cHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIHJlZmVyIHRvIHdpZHRoIG9mIGNvbnRhaW5pbmcgYmxvY2sKK0NvbXB1dGVkIHZhbHVlOiB0aGUgcGVyY2VudGFnZSBhcyBzcGVjIG9yIHRoZSBhYnNvbHV0ZSBsZW5ndGgKKworaGVpZ2h0CitWYWx1ZTogICAgICAgICAgPGxlbmd0aD4gfCA8cGVyY2VudGFnZT4gfCBhdXRvIHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIGF1dG8KK0FwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMgYnV0IG5vbi1yZXBsYWNlZCBpbi1saW5lIGVsZW1lbnRzLCB0YWJsZSBjb2x1bW5zLCBhbmQgY29sdW1uIGdyb3VwcworSW5oZXJpdGVkOiAgICAgIG5vCitQZXJjZW50YWdlczogICAgc2VlIHByb3NlCitDb21wdXRlZCB2YWx1ZTogdGhlIHBlcmNlbnRhZ2UgYXMgc3BlYyBvciB0aGUgYWJzb2x1dGUgbGVuZ3RoCisKK21pbi1oZWlnaHQKK1ZhbHVlOiAgICAgICAgICA8bGVuZ3RoPiB8IDxwZXJjZW50YWdlPiB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICAwCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzIGJ1dCBub24tcmVwbGFjZWQgaW4tbGluZSBlbGVtZW50cywgdGFibGUgY29sdW1ucywgYW5kIGNvbHVtbiBncm91cHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIHNlZSBwcm9zZQorQ29tcHV0ZWQgdmFsdWU6IHRoZSBwZXJjZW50YWdlIGFzIHNwZWMgb3IgdGhlIGFic29sdXRlIGxlbmd0aAorCittYXgtaGVpZ2h0CitWYWx1ZTogICAgICAgICAgPGxlbmd0aD4gfCA8cGVyY2VudGFnZT4gfCBub25lIHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIG5vbmUKK0FwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMgYnV0IG5vbi1yZXBsYWNlZCBpbi1saW5lIGVsZW1lbnRzLCB0YWJsZSBjb2x1bW5zLCBhbmQgY29sdW1uIGdyb3VwcworSW5oZXJpdGVkOiAgICAgIG5vCitQZXJjZW50YWdlczogICAgcmVmZXIgdG8gaGVpZ2h0IG9mIGNvbnRhaW5pbmcgYmxvY2sKK0NvbXB1dGVkIHZhbHVlOiB0aGUgcGVyY2VudGFnZSBhcyBzcGVjIG9yIHRoZSBhYnNvbHV0ZSBsZW5ndGgKKworbGluZS1oZWlnaHQKK1ZhbHVlOiAgICAgICAgICBub3JtYWwgfCA8bnVtYmVyPiB8IDxsZW5ndGg+IHwgPHBlcmNlbnRhZ2U+IHwgPGluaGVyaXQ+CitJbml0aWFsOiAgICAgICAgbm9ybWFsCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgeWVzCitQZXJjZW50YWdlczogICAgcmVmZXIgdG8gdGhlIGZvbnQgc2l6ZSBvZiB0aGUgZWxlbWVudCBpdHNlbGYKK0NvbXB1dGVkIHZhbHVlOiBmb3IgPGxlbmd0aD4gYW5kIDxwZXJjZW50YWdlPiB0aGUgYWJzb2x1dGUgdmFsdWUsIG90aGVyd2lzZSBhcyBzcGVjaWZpZWQuCisKK3ZlcnRpY2FsLWFsaWduCitWYWx1ZTogICAgICAgICAgYmFzZWxpbmUgfCBzdWIgfCBzdXBlciB8IHRvcCB8IHRleHQtdG9wIHwgbWlkZGxlIHwgYm90dG9tIHwgdGV4dC1ib3R0b20gfAorICAgICAgICAgICAgICAgIDxwZXJjZW50YWdlPiB8IDxsZW5ndGg+IHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIGJhc2VsaW5lCitBcHBsaWVzIHRvOiAgICAgaW5saW5lLWxldmVsIGFuZCAndGFibGUtY2VsbCcgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIHJlZmVyIHRvIHRoZSBsaW5lIGhlaWdodCBvZiB0aGUgZWxlbWVudCBpdHNlbGYKK0NvbXB1dGVkIHZhbHVlOiBmb3IgPGxlbmd0aD4gYW5kIDxwZXJjZW50YWdlPiB0aGUgYWJzb2x1dGUgbGVuZ3RoLCBvdGhlcndpc2UgYXMgc3BlY2lmaWVkLgorCit2aXNpYmlsaXR5CitWYWx1ZTogICAgICAgICAgdmlzaWJsZSB8IGhpZGRlbiB8IGNvbGxhcHNlIHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIHZpc2libGUKK0FwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICB5ZXMKK1BlcmNlbnRhZ2VzOiAgICBOL0EKK0NvbXB1dGVkIHZhbHVlOiBhcyBzcGVjCisKK2xpc3Qtc3R5bGUtdHlwZQorVmFsdWU6ICAgICAgICAgIGRpc2MgfCBjaXJjbGUgfCBzcXVhcmUgfCBkZWNpbWFsIHwgZGVjaW1hbC1sZWFkaW5nLXplcm8gfAorICAgICAgICAgICAgICAgIGxvd2VyLXJvbWFuIHwgdXBwZXItcm9tYW4gfCBsb3dlci1ncmVlayB8IGxvd2VyLWxhdGluIHwKKyAgICAgICAgICAgICAgICB1cHBlci1sYXRpbiB8IGFybWVuaWFuIHwgZ2VvcmdpYW4gfCBsb3dlci1hbHBoYSB8IHVwcGVyLWFscGhhIHwKKyAgICAgICAgICAgICAgICBub25lIHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIGRpc2MKK0FwcGxpZXMgdG86ICAgICBlbGVtZW50cyB3aXRoIGRpc3BsYXk6IGxpc3QtaXRlbQorSW5oZXJpdGVkOiAgICAgIHllcworUGVyY2VudGFnZXM6ICAgIE4vQQorQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWMKKworbGlzdC1zdHlsZS1pbWFnZQorVmFsdWU6ICAgICAgICAgIDx1cmk+IHwgbm9uZSB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBub25lCitBcHBsaWVzIHRvOiAgICAgZWxlbWVudHMgd2l0aCDigJlkaXNwbGF5OiBsaXN0LWl0ZW3igJkKK0luaGVyaXRlZDogICAgICB5ZXMKK1BlcmNlbnRhZ2VzOiAgICBOL0EKK0NvbXB1dGVkIHZhbHVlOiBhYnNvbHV0ZSBVUkkgb3Ig4oCZbm9uZeKAmQorCitsaXN0LXN0eWxlLXBvc2l0aW9uCitWYWx1ZTogICAgICAgICAgaW5zaWRlIHwgb3V0c2lkZSB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBvdXRzaWRlCitBcHBsaWVzIHRvOiAgICAgZWxlbWVudHMgd2l0aCDigJlkaXNwbGF5OiBsaXN0LWl0ZW3igJkKK0luaGVyaXRlZDogICAgICB5ZXMKK1BlcmNlbnRhZ2VzOiAgICBOL0EKK0NvbXB1dGVkIHZhbHVlOiBhcyBzcGVjCisKK2JhY2tncm91bmQtY29sb3IKK1ZhbHVlOiAgICAgICAgICA8Y29sb3I+IHwgdHJhbnNwYXJlbnQgfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgdHJhbnNwYXJlbnQKK0FwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIE4vQQorQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWMKKworZm9udC1mYW1pbHkKK1ZhbHVlOiAgICAgICAgICBbWyA8ZmFtaWx5LW5hbWU+IHwgPGdlbmVyaWMtZmFtaWx5PiBdIFssIDxmYW1pbHktbmFtZT58CisgICAgICAgICAgICAgICAgPGdlbmVyaWMtZmFtaWx5Pl0qIF0gfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgZGVwZW5kcyBvbiB1c2VyIGFnZW50CitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgeWVzCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworCitmb250LXN0eWxlCitWYWx1ZTogICAgICAgICAgbm9ybWFsIHwgaXRhbGljIHwgb2JsaXF1ZSB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBub3JtYWwKK0FwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICB5ZXMKK1BlcmNlbnRhZ2VzOiAgICBOL0EKK0NvbXB1dGVkIHZhbHVlOiBhcyBzcGVjCisKK2ZvbnQtdmFyaWFudAorVmFsdWU6ICAgICAgICAgIG5vcm1hbCB8IHNtYWxsLWNhcHMgfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgbm9ybWFsCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgeWVzCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworCitmb250LXdlaWdodAorVmFsdWU6ICAgICAgICAgIG5vcm1hbCB8IGJvbGQgfCBib2xkZXIgfCBsaWdodGVyIHwgMTAwIHwgMjAwIHwgMzAwIHwgNDAwIHwgNTAwIHwKKyAgICAgICAgICAgICAgICA2MDAgfCA3MDAgfCA4MDAgfCA5MDAgfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgbm9ybWFsCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgeWVzCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogc2VlIHRleHQKKworZm9udC1zaXplCitWYWx1ZTogICAgICAgICAgPGFic29sdXRlLXNpemU+IHwgPHJlbGF0aXZlLXNpemU+IHwgPGxlbmd0aD4gfCA8cGVyY2VudGFnZT4gfAorICAgICAgICAgICAgICAgIGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBtZWRpdW0KK0FwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICB5ZXMKK1BlcmNlbnRhZ2VzOiAgICByZWZlciB0byBpbmhlcml0ZWQgZm9udCBzaXplCitDb21wdXRlZCB2YWx1ZTogYWJzb2x1dGUgbGVuZ3RoCisKK3RleHQtaW5kZW50CitWYWx1ZTogICAgICAgICAgPGxlbmd0aD4gfCA8cGVyY2VudGFnZT4gfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgMAorQXBwbGllcyB0bzogICAgIGJsb2NrIGNvbnRhaW5lcnMKK0luaGVyaXRlZDogICAgICB5ZXMKK1BlcmNlbnRhZ2VzOiAgICByZWZlciB0byB3aWR0aCBvZiBjb250YWluaW5nIGJsb2NrCitDb21wdXRlZCB2YWx1ZTogdGhlIHBlcmNlbnRhZ2UgYXMgc3BlY2lmaWVkIG9yIHRoZSBhYnNvbHV0ZSBsZW5ndGgKKwordGV4dC1hbGlnbgorVmFsdWU6ICAgICAgICAgIGxlZnQgfCByaWdodCB8IGNlbnRlciB8IGp1c3RpZnkgfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgYSBuYW1lbGVzcyB2YWx1ZSB0aGF0IGFjdHMgYXMg4oCZbGVmdOKAmSBpZiDigJlkaXJlY3Rpb27igJkgaXMg4oCZbHRy4oCZLCDigJlyaWdodOKAmSBpZgorICAgICAgICAgICAgICAgIOKAmWRpcmVjdGlvbuKAmSBpcyDigJlydGzigJkKK0FwcGxpZXMgdG86ICAgICBibG9jayBjb250YWluZXJzCitJbmhlcml0ZWQ6ICAgICAgeWVzCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogdGhlIGluaXRpYWwgdmFsdWUgb3IgYXMgc3BlYworCit0ZXh0LWRlY29yYXRpb24KK1ZhbHVlOiAgICAgICAgICBub25lIHwgWyB1bmRlcmxpbmUgfHwgb3ZlcmxpbmUgfHwgbGluZS10aHJvdWdoIHx8IGJsaW5rIF0gfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgbm9uZQorQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworSW5oZXJpdGVkOiAgICAgIG5vCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworCitsZXR0ZXItc3BhY2luZworVmFsdWU6ICAgICAgICAgIG5vcm1hbCB8IDxsZW5ndGg+IHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIG5vcm1hbAorQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworSW5oZXJpdGVkOiAgICAgIHllcworUGVyY2VudGFnZXM6ICAgIE4vQQorQ29tcHV0ZWQgdmFsdWU6IOKAmW5vcm1hbOKAmSBvciBhYnNvbHV0ZSBsZW5ndGgKKword29yZC1zcGFjaW5nCitWYWx1ZTogICAgICAgICAgbm9ybWFsIHwgPGxlbmd0aD4gfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgbm9ybWFsCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgeWVzCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogZm9yIOKAmW5vcm1hbOKAmSB0aGUgdmFsdWUgMDsgb3RoZXJ3aXNlIHRoZSBhYnNvbHV0ZSBsZW5ndGgKKwordGV4dC10cmFuc2Zvcm0KK1ZhbHVlOiAgICAgICAgICBjYXBpdGFsaXplIHwgdXBwZXJjYXNlIHwgbG93ZXJjYXNlIHwgbm9uZSB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBub25lCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgeWVzCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworCit3aGl0ZS1zcGFjZQorVmFsdWU6ICAgICAgICAgIG5vcm1hbCB8IHByZSB8IG5vd3JhcCB8IHByZS13cmFwIHwgcHJlLWxpbmUgfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgbm9ybWFsCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgeWVzCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworCitjYXB0aW9uLXNpZGUKK1ZhbHVlOiAgICAgICAgICB0b3AgfCBib3R0b20gfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgdG9wCitBcHBsaWVzIHRvOiAgICAgJ3RhYmxlLWNhcHRpb24nIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgeWVzCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworCit0YWJsZS1sYXlvdXQKK1ZhbHVlOiAgICAgICAgICBhdXRvIHwgZml4ZWQgfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgYXV0bworQXBwbGllcyB0bzogICAgIOKAmXRhYmxl4oCZIGFuZCDigJlpbmxpbmUtdGFibGXigJkgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIE4vQQorQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWMKKworYm9yZGVyLWNvbGxhcHNlCitWYWx1ZTogICAgICAgICAgY29sbGFwc2UgfCBzZXBhcmF0ZSB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBzZXBhcmF0ZQorQXBwbGllcyB0bzogICAgIOKAmXRhYmxl4oCZIGFuZCDigJlpbmxpbmUtdGFibGXigJkgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICB5ZXMKK1BlcmNlbnRhZ2VzOiAgICBOL0EKK0NvbXB1dGVkIHZhbHVlOiBhcyBzcGVjCisKK2JvcmRlci1zcGFjaW5nCitWYWx1ZTogICAgICAgICAgPGxlbmd0aD4gPGxlbmd0aD4/IHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIDAKK0FwcGxpZXMgdG86ICAgICDigJl0YWJsZeKAmSBhbmQg4oCZaW5saW5lLXRhYmxl4oCZIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgeWVzCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogdHdvIGFic29sdXRlIGxlbmd0aHMKKworZW1wdHktY2VsbHMKK1ZhbHVlOiAgICAgICAgICBzaG93IHwgaGlkZSB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBzaG93CitBcHBsaWVzIHRvOiAgICAgJ3RhYmxlLWNlbGwnIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgeWVzCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworCitTaG9ydGhhbmQgUHJvcGVydGllcworCittYXJnaW4KK1ZhbHVlOiAgICAgICAgICA8bWFyZ2luLXdpZHRoPnsxLDR9IHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIHNlZSBpbmRpdmlkdWFsIHByb3BzCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzIGV4Y2VwdCBlbGVtZW50cyB3aXRoIHRhYmxlIGRpc3BsYXkgdHlwZXMgb3RoZXIgdGhhbiB0YWJsZS1jYXB0aW9uLCB0YWJsZSwgYW5kIGlubGluZS10YWJsZQorSW5oZXJpdGVkOiAgICAgIG5vCitQZXJjZW50YWdlczogICAgcmVmZXIgdG8gd2lkdGggb2YgY29udGFpbmluZyBibG9jaworQ29tcHV0ZWQgdmFsdWU6IHNlZSBpbmRpdmlkdWFsIHByb3BzCisgICAgICAgICAgICAgICAgc2V0IG9uZSAtIHNldHMgYWxsIGZvdXIgdmFsdWVzCisgICAgICAgICAgICAgICAgc2V0IHR3byAtIGZpcnN0IGlzIHRvcC9ib3R0b20sIHNlY29uZCBpcyByaWdodC9sZWZ0CisgICAgICAgICAgICAgICAgc2V0IHRocmVlIC0gZmlyc3QgaXMgdG9wLCBzZWNvbmQgaXMgcmlnaHQvbGVmdCwgdGhpcmQgaXMgYm90dG9tCisgICAgICAgICAgICAgICAgc2V0IGZvdXIgLSB0b3AgcmlnaHQgYm90dG9tIGxlZnQKKworcGFkZGluZworVmFsdWU6ICAgICAgICAgIDxwYWRkaW5nLXdpZHRoPnsxLTR9IHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIHNlZSBpbmRpdmlkdWFsIHByb3BzCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzIGV4Y2VwdCB0YWJsZS1yb3ctZ3JvdXAsIHRhYmxlLWhlYWRlci1ncm91cCwKKyAgICAgICAgICAgICAgICB0YWJsZS1mb290ZXItZ3JvdXAsIHRhYmxlLXJvdywgdGFibGUtY29sdW1uLWdyb3VwIGFuZCB0YWJsZS1jb2x1bW4KK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIHJlZmVyIHRvIHdpZHRoIG9mIGNvbnRhaW5pbmcgYmxvY2sKK0NvbXB1dGVkIHZhbHVlOiBzZWUgaW5kaXZpZHVhbCBwcm9wcworICAgICAgICAgICAgICAgIHNldCBvbmUgLSBzZXRzIGFsbCBmb3VyIHZhbHVlcworICAgICAgICAgICAgICAgIHNldCB0d28gLSBmaXJzdCBpcyB0b3AvYm90dG9tLCBzZWNvbmQgaXMgcmlnaHQvbGVmdAorICAgICAgICAgICAgICAgIHNldCBmb3VyIC0gdG9wIHJpZ2h0IGJvdHRvbSBsZWZ0CisKK2JvcmRlci13aWR0aAorVmFsdWU6ICAgICAgICAgIDxib3JkZXItd2lkdGg+ezEtNH0gfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgc2VlIGluZGl2aWR1YWwgcHJvcHMKK0FwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIE4vQQorQ29tcHV0ZWQgdmFsdWU6IHNlZSBpbmRpdmlkdWFsIHByb3BzCisgICAgICAgICAgICAgICAgc2V0IG9uZSAtIHNldHMgYWxsIGZvdXIgdmFsdWVzCisgICAgICAgICAgICAgICAgc2V0IHR3byAtIGZpcnN0IGlzIHRvcC9ib3R0b20sIHNlY29uZCBpcyByaWdodC9sZWZ0CisgICAgICAgICAgICAgICAgc2V0IGZvdXIgLSB0b3AgcmlnaHQgYm90dG9tIGxlZnQKKworYm9yZGVyLWNvbG9yCitWYWx1ZTogICAgICAgICAgWzxjb2xvcj4gfCB0cmFuc3BhcmVudF17MS00fSB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBzZWUgaW5kaXZpZHVhbCBwcm9wcworQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworSW5oZXJpdGVkOiAgICAgIG5vCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogc2VlIGluZGl2aWR1YWwgcHJvcHMKKyAgICAgICAgICAgICAgICBzZXQgb25lIC0gc2V0cyBhbGwgZm91ciB2YWx1ZXMKKyAgICAgICAgICAgICAgICBzZXQgdHdvIC0gZmlyc3QgaXMgdG9wL2JvdHRvbSwgc2Vjb25kIGlzIHJpZ2h0L2xlZnQKKyAgICAgICAgICAgICAgICBzZXQgZm91ciAtIHRvcCByaWdodCBib3R0b20gbGVmdAorCitib3JkZXItc3R5bGUKK1ZhbHVlOiAgICAgICAgICA8Ym9yZGVyLXN0eWxlPnsxLTR9IHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIHNlZSBpbmRpdmlkdWFsIHByb3BzCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgbm8KK1BlcmNlbnRhZ2VzOiAgICBOL0EKK0NvbXB1dGVkIHZhbHVlOiBzZWUgaW5kaXZpZHVhbCBwcm9wcworICAgICAgICAgICAgICAgIHNldCBvbmUgLSBzZXRzIGFsbCBmb3VyIHZhbHVlcworICAgICAgICAgICAgICAgIHNldCB0d28gLSBmaXJzdCBpcyB0b3AvYm90dG9tLCBzZWNvbmQgaXMgcmlnaHQvbGVmdAorICAgICAgICAgICAgICAgIHNldCBmb3VyIC0gdG9wIHJpZ2h0IGJvdHRvbSBsZWZ0CisKK2JvcmRlci10b3AsIGJvcmRlci1yaWdodCwgYm9yZGVyLWJvdHRvbSwgYm9yZGVyLWxlZnQsIGJvcmRlcgorVmFsdWU6ICAgICAgICAgIFs8Ym9yZGVyLXdpZHRoPiB8fCA8Ym9yZGVyLXN0eWxlPiB8fCA8Ym9yZGVyLXRvcC1jb2xvcj5dIHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIHNlZSBpbmRpdmlkCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgbm8KK1BlcmNlbnRhZ2VzOiAgICBOL0EKK0NvbXB1dGVkIHZhbHVlOiBzZWUgaW5kaXZpZAorCitsaXN0LXN0eWxlCitWYWx1ZTogICAgICAgICAgWyA84oCZbGlzdC1zdHlsZS10eXBl4oCZPiB8fCA84oCZbGlzdC1zdHlsZS1wb3NpdGlvbuKAmT4gfHwgPOKAmWxpc3Qtc3R5bGUtaW1hZ2XigJk+CisgICAgICAgICAgICAgICAgXSB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBzZWUgaW5kaXZpZHVhbCBwcm9wcworQXBwbGllcyB0bzogICAgIGVsZW1lbnRzIHdpdGgg4oCZZGlzcGxheTogbGlzdC1pdGVt4oCZCitJbmhlcml0ZWQ6ICAgICAgeWVzCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogc2VlIGluZGl2aWR1YWwgcHJvcHMKKworYmFja2dyb3VuZAorVmFsdWU6ICAgICAgICAgIFs84oCZYmFja2dyb3VuZC1jb2xvcuKAmT4gfHwgPOKAmWJhY2tncm91bmQtaW1hZ2XigJk+IHx8IDzigJliYWNrZ3JvdW5kLQorICAgICAgICAgICAgICAgIHJlcGVhdOKAmT4gfHwgPOKAmWJhY2tncm91bmQtYXR0YWNobWVudOKAmT4gfHwgPOKAmWJhY2tncm91bmQtCisgICAgICAgICAgICAgICAgcG9zaXRpb27igJk+XSB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBzZWUgaW5kaXZpZHVhbCBwcm9wcworQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworSW5oZXJpdGVkOiAgICAgIG5vCitQZXJjZW50YWdlczogICAgYWxsb3dlZCBvbiBiYWNrZ3JvdW5kLXBvc2l0aW9uCitDb21wdXRlZCB2YWx1ZTogc2VlIGluZGl2aWR1YWwgcHJvcHMKKworZm9udAorVmFsdWU6ICAgICAgICAgIFsgWyA84oCZZm9udC1zdHlsZeKAmT4gfHwgPOKAmWZvbnQtdmFyaWFudOKAmT4gfHwgPOKAmWZvbnQtd2VpZ2h04oCZPiBdPworICAgICAgICAgICAgICAgIDzigJlmb250LXNpemXigJk+IFsgLyA84oCZbGluZS1oZWlnaHTigJk+IF0/IDzigJlmb250LWZhbWlseeKAmT4gXSB8IGNhcHRpb24gfAorICAgICAgICAgICAgICAgIGljb24gfCBtZW51IHwgbWVzc2FnZS1ib3ggfCBzbWFsbC1jYXB0aW9uIHwgc3RhdHVzLWJhciB8CisgICAgICAgICAgICAgICAgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIHNlZSBpbmRpdmlkdWFsIHByb3BzCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgeWVzCitQZXJjZW50YWdlczogICAgc2VlIGluZGl2aWR1YWwgcHJvcHMKK0NvbXB1dGVkIHZhbHVlOiBzZWUgaW5kaXZpZHVhbCBwcm9wcworCitwcm9iYWJseSBub3Qgc3VwcG9ydAorCitvdmVyZmxvdworVmFsdWU6ICAgICAgICAgIHZpc2libGUgfCBoaWRkZW4gfCBzY3JvbGwgfCBhdXRvIHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIHZpc2libGUKK0FwcGxpZXMgdG86ICAgICBibG9jayBjb250YWluZXJzCitJbmhlcml0ZWQ6ICAgICAgbm8KK1BlcmNlbnRhZ2VzOiAgICBOL0EKK0NvbXB1dGVkIHZhbHVlOiBhcyBzcGVjCisKK2NsaXAKK1ZhbHVlOiAgICAgICAgICA8c2hhcGU+IHwgYXV0byB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBhdXRvCitBcHBsaWVzIHRvOiAgICAgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgbm8KK1BlcmNlbnRhZ2VzOiAgICBOL0EKK0NvbXB1dGVkIHZhbHVlOiBhdXRvIGlmIHNwZWMgYXMgJ2F1dG8nLCBvdGhlcndpc2UgYSByZWN0YW5nbGUgd2l0aCBmb3VyIHZhbHVlcywgZWFjaCBvZiB3aGljaCBpcworICAgICAgICAgICAgICAgICdhdXRvJyBpZiBzcGVjIGFzICdhdXRvJyBhbmQgdGhlIGNvbXB1dGVkIGxlbmd0aCBvdGhlcndpc2UKKworY29udGVudAorVmFsdWU6ICAgICAgICAgIG5vcm1hbCB8IG5vbmUgfCBbIDxzdHJpbmc+IHwgPHVyaT4gfCA8Y291bnRlcj4gfCBhdHRyKDxpZGVudGlmaWVyPikKKyAgICAgICAgICAgICAgICB8IG9wZW4tcXVvdGUgfCBjbG9zZS1xdW90ZSB8IG5vLW9wZW4tcXVvdGUgfCBuby1jbG9zZS1xdW90ZQorICAgICAgICAgICAgICAgIF0rIHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIG5vcm1hbAorQXBwbGllcyB0bzogICAgIDpiZWZvcmUgYW5kIDphZnRlciBwc2V1ZG8gZWxlbWVudHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIE4vQQorQ29tcHV0ZWQgdmFsdWU6IE9uIGVsZW1lbnRzLCBhbHdheXMgY29tcHV0ZXMgdG8g4oCZbm9ybWFs4oCZLiBPbiA6YmVmb3JlIGFuZAorICAgICAgICAgICAgICAgIDphZnRlciwgaWYg4oCZbm9ybWFs4oCZIGlzIHNwZWNpZmllZCwgY29tcHV0ZXMgdG8g4oCZbm9uZeKAmS4gT3RoZXJ3aXNlLAorICAgICAgICAgICAgICAgIGZvciBVUkkgdmFsdWVzLCB0aGUgYWJzb2x1dGUgVVJJOyBmb3IgYXR0cigpIHZhbHVlcywgdGhlIHJlc3VsdGluZworICAgICAgICAgICAgICAgIHN0cmluZzsgZm9yIG90aGVyIGtleXdvcmRzLCBhcyBzcGVjaWZpZWQuCisKK3F1b3RlcworVmFsdWU6ICAgICAgICAgIFs8c3RyaW5nPiA8c3RyaW5nPl0rIHwgbm9uZSB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBkZXBlbmRzIG9uIHVzZXIgYWdlbnQKK0FwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICB5ZXMKK1BlcmNlbnRhZ2VzOiAgICBOL0EKK0NvbXB1dGVkIHZhbHVlOiBhcyBzcGVjCisKK2NvdW50ZXItcmVzZXQKK1ZhbHVlOiAgICAgICAgICBbIDxpZGVudGlmaWVyPiA8aW50ZWdlcj4/IF0rIHwgbm9uZSB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICBub25lCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgbm8KK1BlcmNlbnRhZ2VzOiAgICBOL0EKK0NvbXB1dGVkIHZhbHVlOiBhcyBzcGVjCisKK2NvdW50ZXItaW5jcmVtZW50CitWYWx1ZTogICAgICAgICAgWyA8aWRlbnRpZmllcj4gPGludGVnZXI+PyBdKyB8IG5vbmUgfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgbm9uZQorQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworSW5oZXJpdGVkOiAgICAgIG5vCitQZXJjZW50YWdlczogICAgTi9BCitDb21wdXRlZCB2YWx1ZTogYXMgc3BlYworCitiYWNrZ3JvdW5kLWltYWdlCitWYWx1ZTogICAgICAgICAgPHVyaT4gfCBub25lIHwgaW5oZXJpdAorSW5pdGlhbDogICAgICAgIG5vbmUKK0FwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIE4vQQorQ29tcHV0ZWQgdmFsdWU6IGFic29sdXRlIFVSSSBvciBub25lCisKK2JhY2tncm91bmQtcmVwZWF0CitWYWx1ZTogICAgICAgICAgcmVwZWF0IHwgcmVwZWF0LXggfCByZXBlYXQteSB8IG5vLXJlcGVhdCB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICByZXBlYXQKK0FwcGxpZXMgdG86ICAgICBhbGwgZWxlbWVudHMKK0luaGVyaXRlZDogICAgICBubworUGVyY2VudGFnZXM6ICAgIE4vQQorQ29tcHV0ZWQgdmFsdWU6IGFzIHNwZWMKKworYmFja2dyb3VuZC1hdHRhY2htZW50CitWYWx1ZTogICAgICAgICAgc2Nyb2xsIHwgZml4ZWQgfCBpbmhlcml0CitJbml0aWFsOiAgICAgICAgc2Nyb2xsCitBcHBsaWVzIHRvOiAgICAgYWxsIGVsZW1lbnRzCitJbmhlcml0ZWQ6ICAgICAgbm8KK1BlcmNlbnRhZ2VzOiAgICBOL0EKK0NvbXB1dGVkIHZhbHVlOiBhcyBzcGVjCisKK2JhY2tncm91bmQtcG9zaXRpb24KK1ZhbHVlOiAgICAgICAgICBbIFsgPHBlcmNlbnRhZ2U+IHwgPGxlbmd0aD4gfCBsZWZ0IHwgY2VudGVyIHwgcmlnaHQgXSBbIDxwZXJjZW50YWdlPgorICAgICAgICAgICAgICAgIHwgPGxlbmd0aD4gfCB0b3AgfCBjZW50ZXIgfCBib3R0b20gXT8gXSB8IFsgWyBsZWZ0IHwgY2VudGVyIHwKKyAgICAgICAgICAgICAgICByaWdodCBdIHx8IFsgdG9wIHwgY2VudGVyIHwgYm90dG9tIF0gXSB8IGluaGVyaXQKK0luaXRpYWw6ICAgICAgICAwJSAwJQorQXBwbGllcyB0bzogICAgIGFsbCBlbGVtZW50cworSW5oZXJpdGVkOiAgICAgIG5vCitQZXJjZW50YWdlczogICAgcmVmZXIgdG8gdGhlIHNpemUgb2YgdGhlIGJveCBpdHNlbGYKK0NvbXB1dGVkIHZhbHVlOiBmb3IgPGxlbmd0aD4gdGhlIGFic29sdXRlIHZhbHVlLCBvdGhlcndpc2UgYSBwZXJjZW50YWdlCisjZW5kaWYKKworI2lmIGZhbHNlCisKK2JhY2tncm91bmQtY29sb3IKK2JvcmRlci1ib3R0b20tY29sb3IKK2JvcmRlci1ib3R0b20tc3R5bGUKK2JvcmRlci1ib3R0b20td2lkdGgKK2JvcmRlci1jb2xsYXBzZQorYm9yZGVyLWxlZnQtY29sb3IKK2JvcmRlci1sZWZ0LXN0eWxlCitib3JkZXItbGVmdC13aWR0aAorYm9yZGVyLXJpZ2h0LWNvbG9yCitib3JkZXItcmlnaHQtc3R5bGUKK2JvcmRlci1yaWdodC13aWR0aAorYm9yZGVyLXNwYWNpbmcKK2JvcmRlci10b3AtY29sb3IKK2JvcmRlci10b3Atc3R5bGUKK2JvcmRlci10b3Atd2lkdGgKK2JvdHRvbQorY2FwdGlvbi1zaWRlCitjbGVhcgorY29sb3IKK2RpcmVjdGlvbgorZGlzcGxheQorZW1wdHktY2VsbHMKK2Zsb2F0Citmb250LWZhbWlseQorZm9udC1zaXplCitmb250LXN0eWxlCitmb250LXZhcmlhbnQKK2ZvbnQtd2VpZ2h0CitoZWlnaHQKK2xlZnQKK2xldHRlci1zcGFjaW5nCitsaW5lLWhlaWdodAorbGlzdC1zdHlsZS1pbWFnZQorbGlzdC1zdHlsZS1wb3NpdGlvbgorbGlzdC1zdHlsZS10eXBlCittYXJnaW4tYm90dG9tCittYXJnaW4tbGVmdAorbWFyZ2luLXJpZ2h0CittYXJnaW4tdG9wCittYXgtaGVpZ2h0CittYXgtd2lkdGgKK21pbi1oZWlnaHQKK21pbi13aWR0aAorcGFkZGluZy1ib3R0b20KK3BhZGRpbmctbGVmdAorcGFkZGluZy1yaWdodAorcGFkZGluZy10b3AKK3Bvc2l0aW9uCityaWdodAordGFibGUtbGF5b3V0Cit0ZXh0LWFsaWduCit0ZXh0LWRlY29yYXRpb24KK3RleHQtaW5kZW50Cit0ZXh0LXRyYW5zZm9ybQordG9wCit1bmljb2RlLWJpZGkKK3ZlcnRpY2FsLWFsaWduCit2aXNpYmlsaXR5Cit3aGl0ZS1zcGFjZQord2lkdGgKK3dvcmQtc3BhY2luZworei1pbmRleAorCithdHRyaWJ1dGVzCis9PT09PT09PT09CQkJCittZXRhCitzdHlsZQorX2NsYXNzCitocmVmCisKK2Rvbid0IGtub3cKKz09PT09PT09PT0KK2NvbHNwYW4KK2NhcHRpb24KK3RpdGxlCitocgorYm9yZGVyCitodHRwX2VxdWl2Citjb250ZW50CituYW1lCit3aWR0aAoraGVpZ2h0CitzcmMKK2FsdAoraWQKK2Rlc2NyCit0eXBlCisKK2VsZW1lbnRzCis9PT09PT09PQkJCQoraHRtbAoraGVhZAorYm9keQorZGl2CitwCitoMQoraDIKK2gzCitoNAoraDUKK2g2CitoNworaDgKK2g5CithCitiCit0YWJsZQordHIKK3RkCiticgoraW1nCitzcGFuCitibG9ja3F1b3RlCitzdWIKK3N1cAorb2wKK3VsCitsaQorc3Ryb25nCitlbQordGJvZHkKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzL0h0bWxUb1dtbENzc1BhcnNlci5jcyBiL09wZW5YbWxQb3dlclRvb2xzL0h0bWxUb1dtbENzc1BhcnNlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQ4OWRiCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvSHRtbFRvV21sQ3NzUGFyc2VyLmNzCkBAIC0wLDAgKzEsNDM5NCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ3NzQXR0cmlidXRlCisgICAgeworICAgICAgICBwcml2YXRlIHN0cmluZyBtX29wZXJhbmQ7CisgICAgICAgIHByaXZhdGUgQ3NzQXR0cmlidXRlT3BlcmF0b3I/IG1fb3AgPSBudWxsOworICAgICAgICBwcml2YXRlIHN0cmluZyBtX3ZhbDsKKworICAgICAgICBwdWJsaWMgc3RyaW5nIE9wZXJhbmQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9vcGVyYW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBtX29wZXJhbmQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDc3NBdHRyaWJ1dGVPcGVyYXRvcj8gT3BlcmF0b3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9vcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV9vcCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBDc3NPcGVyYXRvclN0cmluZworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLm1fb3AuSGFzVmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tX29wLlZhbHVlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgdGhpcy5tX29wID0gKENzc0F0dHJpYnV0ZU9wZXJhdG9yKUVudW0uUGFyc2UodHlwZW9mKENzc0F0dHJpYnV0ZU9wZXJhdG9yKSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBWYWx1ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV92YWwgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiW3swfSIsIG1fb3BlcmFuZCk7CisgICAgICAgICAgICBpZiAobV9vcC5IYXNWYWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1fb3AuVmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENzc0F0dHJpYnV0ZU9wZXJhdG9yLkVxdWFsczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiPSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3NzQXR0cmlidXRlT3BlcmF0b3IuSW5MaXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ+PSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3NzQXR0cmlidXRlT3BlcmF0b3IuSHlwaGVuYXRlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgifD0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENzc0F0dHJpYnV0ZU9wZXJhdG9yLkJlZ2luc1dpdGg6CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiQ9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDc3NBdHRyaWJ1dGVPcGVyYXRvci5FbmRzV2l0aDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiXj0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENzc0F0dHJpYnV0ZU9wZXJhdG9yLkNvbnRhaW5zOgorICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIqPSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZChtX3ZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5BcHBlbmQoIl0iKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGVudW0gQ3NzQXR0cmlidXRlT3BlcmF0b3IKKyAgICB7CisgICAgICAgIEVxdWFscywKKyAgICAgICAgSW5MaXN0LAorICAgICAgICBIeXBoZW5hdGVkLAorICAgICAgICBFbmRzV2l0aCwKKyAgICAgICAgQmVnaW5zV2l0aCwKKyAgICAgICAgQ29udGFpbnMsCisgICAgfQorCisgICAgcHVibGljIGVudW0gQ3NzQ29tYmluYXRvcgorICAgIHsKKyAgICAgICAgQ2hpbGRPZiwKKyAgICAgICAgUHJlY2VkZWRJbW1lZGlhdGVseUJ5LAorICAgICAgICBQcmVjZWRlZEJ5LAorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBDc3NEb2N1bWVudCA6IEl0ZlJ1bGVTZXRDb250YWluZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgTGlzdDxDc3NEaXJlY3RpdmU+IG1fZGlycyA9IG5ldyBMaXN0PENzc0RpcmVjdGl2ZT4oKTsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PENzc1J1bGVTZXQ+IG1fcnVsZXNldHMgPSBuZXcgTGlzdDxDc3NSdWxlU2V0PigpOworCisgICAgICAgIHB1YmxpYyBMaXN0PENzc0RpcmVjdGl2ZT4gRGlyZWN0aXZlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2RpcnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIG1fZGlycyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8Q3NzUnVsZVNldD4gUnVsZVNldHMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9ydWxlc2V0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV9ydWxlc2V0cyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yZWFjaCAoQ3NzRGlyZWN0aXZlIGNzc0RpciBpbiBtX2RpcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0iICsgRW52aXJvbm1lbnQuTmV3TGluZSwgY3NzRGlyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNiLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAoQ3NzUnVsZVNldCBydWxlcyBpbiBtX3J1bGVzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9IiArIEVudmlyb25tZW50Lk5ld0xpbmUsCisgICAgICAgICAgICAgICAgICAgIHJ1bGVzLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQ3NzRGVjbGFyYXRpb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIG1fbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBDc3NFeHByZXNzaW9uIG1fZXhwcmVzc2lvbjsKKyAgICAgICAgcHJpdmF0ZSBib29sIG1faW1wb3J0YW50OworCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBtX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIG1fbmFtZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSW1wb3J0YW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1faW1wb3J0YW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBtX2ltcG9ydGFudCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENzc0V4cHJlc3Npb24gRXhwcmVzc2lvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2V4cHJlc3Npb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIG1fZXhwcmVzc2lvbiA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH06IHsxfXsyfSIsCisgICAgICAgICAgICAgICAgbV9uYW1lLAorICAgICAgICAgICAgICAgIG1fZXhwcmVzc2lvbi5Ub1N0cmluZygpLAorICAgICAgICAgICAgICAgIG1faW1wb3J0YW50ID8gIiAhaW1wb3J0YW50IiA6ICIiKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIENzc0RpcmVjdGl2ZSA6IEl0ZkRlY2xhcmF0aW9uQ29udGFpbmVyLCBJdGZSdWxlU2V0Q29udGFpbmVyCisgICAgeworICAgICAgICBwcml2YXRlIENzc0RpcmVjdGl2ZVR5cGUgbV90eXBlOworICAgICAgICBwcml2YXRlIHN0cmluZyBtX25hbWU7CisgICAgICAgIHByaXZhdGUgQ3NzRXhwcmVzc2lvbiBtX2V4cHJlc3Npb247CisgICAgICAgIHByaXZhdGUgTGlzdDxDc3NNZWRpdW0+IG1fbWVkaXVtcyA9IG5ldyBMaXN0PENzc01lZGl1bT4oKTsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PENzc0RpcmVjdGl2ZT4gbV9kaXJlY3RpdmVzID0gbmV3IExpc3Q8Q3NzRGlyZWN0aXZlPigpOworICAgICAgICBwcml2YXRlIExpc3Q8Q3NzUnVsZVNldD4gbV9ydWxlc2V0cyA9IG5ldyBMaXN0PENzc1J1bGVTZXQ+KCk7CisgICAgICAgIHByaXZhdGUgTGlzdDxDc3NEZWNsYXJhdGlvbj4gbV9kZWNsYXJhdGlvbnMgPSBuZXcgTGlzdDxDc3NEZWNsYXJhdGlvbj4oKTsKKworICAgICAgICBwdWJsaWMgQ3NzRGlyZWN0aXZlVHlwZSBUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubV90eXBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICB0aGlzLm1fdHlwZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubV9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICB0aGlzLm1fbmFtZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENzc0V4cHJlc3Npb24gRXhwcmVzc2lvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1fZXhwcmVzc2lvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgdGhpcy5tX2V4cHJlc3Npb24gPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0PENzc01lZGl1bT4gTWVkaXVtcworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1fbWVkaXVtczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgdGhpcy5tX21lZGl1bXMgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0PENzc0RpcmVjdGl2ZT4gRGlyZWN0aXZlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1fZGlyZWN0aXZlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgdGhpcy5tX2RpcmVjdGl2ZXMgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0PENzc1J1bGVTZXQ+IFJ1bGVTZXRzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubV9ydWxlc2V0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgdGhpcy5tX3J1bGVzZXRzID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdDxDc3NEZWNsYXJhdGlvbj4gRGVjbGFyYXRpb25zCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubV9kZWNsYXJhdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIHRoaXMubV9kZWNsYXJhdGlvbnMgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoMCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIFRvU3RyaW5nKGludCBpbmRlbnRMZXZlbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHN0YXJ0ID0gIiIuUGFkUmlnaHQoaW5kZW50TGV2ZWwsICdcdCcpOworCisgICAgICAgICAgICBzd2l0Y2ggKG1fdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIENzc0RpcmVjdGl2ZVR5cGUuQ2hhcnNldDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRvQ2hhclNldFN0cmluZyhzdGFydCk7CisgICAgICAgICAgICAgICAgY2FzZSBDc3NEaXJlY3RpdmVUeXBlLlBhZ2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUb1BhZ2VTdHJpbmcoc3RhcnQpOworICAgICAgICAgICAgICAgIGNhc2UgQ3NzRGlyZWN0aXZlVHlwZS5NZWRpYToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRvTWVkaWFTdHJpbmcoaW5kZW50TGV2ZWwpOworICAgICAgICAgICAgICAgIGNhc2UgQ3NzRGlyZWN0aXZlVHlwZS5JbXBvcnQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUb0ltcG9ydFN0cmluZygpOworICAgICAgICAgICAgICAgIGNhc2UgQ3NzRGlyZWN0aXZlVHlwZS5Gb250RmFjZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRvRm9udEZhY2VTdHJpbmcoc3RhcnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0gIiwgbV9uYW1lKTsKKworICAgICAgICAgICAgaWYgKG1fZXhwcmVzc2lvbiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9ICIsIG1fZXhwcmVzc2lvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoQ3NzTWVkaXVtIG1lZCBpbiBtX21lZGl1bXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKG1lZC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBIYXNCbG9jayA9ICh0aGlzLm1fZGVjbGFyYXRpb25zLkNvdW50ID4gMCB8fCB0aGlzLm1fZGlyZWN0aXZlcy5Db3VudCA+IDAgfHwgdGhpcy5tX3J1bGVzZXRzLkNvdW50ID4gMCk7CisKKyAgICAgICAgICAgIGlmICghSGFzQmxvY2spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCI7Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNiLkFwcGVuZCgiIHsiICsgRW52aXJvbm1lbnQuTmV3TGluZSArIHN0YXJ0KTsKKworICAgICAgICAgICAgZm9yZWFjaCAoQ3NzRGlyZWN0aXZlIGRpciBpbiBtX2RpcmVjdGl2ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0iICsgRW52aXJvbm1lbnQuTmV3TGluZSwgZGlyLlRvQ2hhclNldFN0cmluZyhzdGFydCArICJcdCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yZWFjaCAoQ3NzUnVsZVNldCBydWxlcyBpbiBtX3J1bGVzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9IiArIEVudmlyb25tZW50Lk5ld0xpbmUsIHJ1bGVzLlRvU3RyaW5nKGluZGVudExldmVsICsgMSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChDc3NEZWNsYXJhdGlvbiBkZWNsIGluIG1fZGVjbGFyYXRpb25zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiOyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSArICJcdCIgKyBzdGFydCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGRlY2wuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNiLkFwcGVuZChFbnZpcm9ubWVudC5OZXdMaW5lICsgIn0iKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgVG9Gb250RmFjZVN0cmluZyhzdHJpbmcgc3RhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuQXBwZW5kKCJAZm9udC1mYWNlIHsiKTsKKworICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChDc3NEZWNsYXJhdGlvbiBkZWNsIGluIG1fZGVjbGFyYXRpb25zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiOyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSArICJcdCIgKyBzdGFydCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGRlY2wuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNiLkFwcGVuZChFbnZpcm9ubWVudC5OZXdMaW5lICsgIn0iKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgVG9JbXBvcnRTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZCgiQGltcG9ydCAiKTsKKyAgICAgICAgICAgIGlmIChtX2V4cHJlc3Npb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfSAiLCBtX2V4cHJlc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChDc3NNZWRpdW0gbWVkIGluIG1fbWVkaXVtcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQobWVkLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuQXBwZW5kKCI7Iik7CisgICAgICAgICAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RyaW5nIFRvTWVkaWFTdHJpbmcoaW50IGluZGVudExldmVsKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZCgiQG1lZGlhIik7CisKKyAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoQ3NzTWVkaXVtIG1lZGl1bSBpbiBtX21lZGl1bXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKG1lZGl1bS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLkFwcGVuZCgiIHsiICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKENzc1J1bGVTZXQgcnVsZXNldCBpbiBtX3J1bGVzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9IiArIEVudmlyb25tZW50Lk5ld0xpbmUsIHJ1bGVzZXQuVG9TdHJpbmcoaW5kZW50TGV2ZWwgKyAxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNiLkFwcGVuZCgifSIpOworICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0cmluZyBUb1BhZ2VTdHJpbmcoc3RyaW5nIHN0YXJ0KQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZCgiQHBhZ2UgIik7CisgICAgICAgICAgICBpZiAobV9leHByZXNzaW9uICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0gIiwgbV9leHByZXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLkFwcGVuZCgieyIgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKworICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChDc3NEZWNsYXJhdGlvbiBkZWNsIGluIG1fZGVjbGFyYXRpb25zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiOyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSArICJcdCIgKyBzdGFydCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGRlY2wuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNiLkFwcGVuZCgifSIpOworICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0cmluZyBUb0NoYXJTZXRTdHJpbmcoc3RyaW5nIHN0YXJ0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkZvcm1hdCgiezJ9ezB9IHsxfSIsIAorICAgICAgICAgICAgICAgIG1fbmFtZSwgCisgICAgICAgICAgICAgICAgbV9leHByZXNzaW9uLlRvU3RyaW5nKCksIAorICAgICAgICAgICAgICAgIHN0YXJ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBlbnVtIENzc0RpcmVjdGl2ZVR5cGUKKyAgICB7CisgICAgICAgIE1lZGlhLAorICAgICAgICBJbXBvcnQsCisgICAgICAgIENoYXJzZXQsCisgICAgICAgIFBhZ2UsCisgICAgICAgIEZvbnRGYWNlLAorICAgICAgICBOYW1lc3BhY2UsCisgICAgICAgIE90aGVyLAorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBDc3NFeHByZXNzaW9uCisgICAgeworICAgICAgICBwcml2YXRlIExpc3Q8Q3NzVGVybT4gbV90ZXJtcyA9IG5ldyBMaXN0PENzc1Rlcm0+KCk7CisKKyAgICAgICAgcHVibGljIExpc3Q8Q3NzVGVybT4gVGVybXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV90ZXJtczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV90ZXJtcyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNOb3RBdXRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAodGhpcyAhPSBudWxsICYmIHRoaXMuVG9TdHJpbmcoKSAhPSAiYXV0byIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNBdXRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAodGhpcyAhPSBudWxsICYmIHRoaXMuVG9TdHJpbmcoKSA9PSAiYXV0byIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNOb3ROb3JtYWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzICE9IG51bGwgJiYgdGhpcy5Ub1N0cmluZygpICE9ICJub3JtYWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIElzTm9ybWFsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAodGhpcyAhPSBudWxsICYmIHRoaXMuVG9TdHJpbmcoKSA9PSAibm9ybWFsIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKENzc1Rlcm0gdGVybSBpbiBtX3Rlcm1zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9ICIsIAorICAgICAgICAgICAgICAgICAgICAgICAgdGVybS5TZXBhcmF0b3IuSGFzVmFsdWUgPyB0ZXJtLlNlcGFyYXRvci5WYWx1ZS5Ub1N0cmluZygpIDogIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQodGVybS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbXBsaWNpdCBvcGVyYXRvciBzdHJpbmcoQ3NzRXhwcmVzc2lvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZS5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBleHBsaWNpdCBvcGVyYXRvciBkb3VibGUoQ3NzRXhwcmVzc2lvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZG91YmxlLlBhcnNlKGUuVGVybXMuRmlyc3QoKS5WYWx1ZSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGV4cGxpY2l0IG9wZXJhdG9yIEVtdShDc3NFeHByZXNzaW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBFbXUuUG9pbnRzVG9FbXVzKGRvdWJsZS5QYXJzZShlLlRlcm1zLkZpcnN0KCkuVmFsdWUsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdpbGwgb25seSBiZSBjYWxsZWQgb24gZXhwcmVzc2lvbiB0aGF0IGlzIGluIHRlcm1zIG9mIHBvaW50cworICAgICAgICBwdWJsaWMgc3RhdGljIGV4cGxpY2l0IG9wZXJhdG9yIFRQb2ludChDc3NFeHByZXNzaW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFBvaW50KGRvdWJsZS5QYXJzZShlLlRlcm1zLkZpcnN0KCkuVmFsdWUsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdpbGwgb25seSBiZSBjYWxsZWQgb24gZXhwcmVzc2lvbiB0aGF0IGlzIGluIHRlcm1zIG9mIHBvaW50cworICAgICAgICBwdWJsaWMgc3RhdGljIGV4cGxpY2l0IG9wZXJhdG9yIFR3aXAoQ3NzRXhwcmVzc2lvbiBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsZW5ndGguVGVybXMuQ291bnQoKSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENzc1Rlcm0gdGVybSA9IGxlbmd0aC5UZXJtcy5GaXJzdCgpOworICAgICAgICAgICAgICAgIGlmICh0ZXJtLlVuaXQgPT0gQ3NzVW5pdC5QVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwdFZhbHVlOworICAgICAgICAgICAgICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKHRlcm0uVmFsdWUuVG9TdHJpbmcoKSwgTnVtYmVyU3R5bGVzLkZsb2F0LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgcHRWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtLlNpZ24gPT0gJy0nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0VmFsdWUgPSAtcHRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHdpcCgobG9uZykocHRWYWx1ZSAqIDIwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBDc3NGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgbV9uYW1lOworICAgICAgICBwcml2YXRlIENzc0V4cHJlc3Npb24gbV9leHByZXNzaW9uOworCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBtX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIG1fbmFtZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENzc0V4cHJlc3Npb24gRXhwcmVzc2lvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2V4cHJlc3Npb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIG1fZXhwcmVzc2lvbiA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0oIiwgbV9uYW1lKTsKKyAgICAgICAgICAgIGlmIChtX2V4cHJlc3Npb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChDc3NUZXJtIHQgaW4gbV9leHByZXNzaW9uLlRlcm1zKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0LlZhbHVlLkVuZHNXaXRoKCI9IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJvb2wgcXVvdGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQuVHlwZSA9PSBDc3NUZXJtVHlwZS5TdHJpbmcgJiYgIXQuVmFsdWUuRW5kc1dpdGgoIj0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChxdW90ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCInIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKHQuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChxdW90ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCInIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5BcHBlbmQoIikiKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBJdGZEZWNsYXJhdGlvbkNvbnRhaW5lcgorICAgIHsKKyAgICAgICAgTGlzdDxDc3NEZWNsYXJhdGlvbj4gRGVjbGFyYXRpb25zIHsgZ2V0OyBzZXQ7IH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIEl0ZlJ1bGVTZXRDb250YWluZXIKKyAgICB7CisgICAgICAgIExpc3Q8Q3NzUnVsZVNldD4gUnVsZVNldHMgeyBnZXQ7IHNldDsgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgSXRmU2VsZWN0b3JDb250YWluZXIKKyAgICB7CisgICAgICAgIExpc3Q8Q3NzU2VsZWN0b3I+IFNlbGVjdG9ycyB7IGdldDsgc2V0OyB9CisgICAgfQorCisgICAgcHVibGljIGVudW0gQ3NzTWVkaXVtCisgICAgeworICAgICAgICBhbGwsCisgICAgICAgIGF1cmFsLAorICAgICAgICBicmFpbGxlLAorICAgICAgICBlbWJvc3NlZCwKKyAgICAgICAgaGFuZGhlbGQsCisgICAgICAgIHByaW50LAorICAgICAgICBwcm9qZWN0aW9uLAorICAgICAgICBzY3JlZW4sCisgICAgICAgIHR0eSwKKyAgICAgICAgdHYKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQ3NzUHJvcGVydHlWYWx1ZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBDc3NWYWx1ZVR5cGUgbV90eXBlOworICAgICAgICBwcml2YXRlIENzc1VuaXQgbV91bml0OworICAgICAgICBwcml2YXRlIHN0cmluZyBtX3ZhbHVlOworCisgICAgICAgIHB1YmxpYyBDc3NWYWx1ZVR5cGUgVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1fdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgdGhpcy5tX3R5cGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDc3NVbml0IFVuaXQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tX3VuaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIHRoaXMubV91bml0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIFZhbHVlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubV92YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgdGhpcy5tX3ZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKG1fdmFsdWUpOworICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBDc3NWYWx1ZVR5cGUuVW5pdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQobV91bml0LlRvU3RyaW5nKCkuVG9Mb3dlcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLkFwcGVuZCgiIFsiKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZChtX3R5cGUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICBzYi5BcHBlbmQoIl0iKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNDb2xvcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKChtX3R5cGUgPT0gQ3NzVmFsdWVUeXBlLkhleCkgCisgICAgICAgICAgICAgICAgICAgIHx8IChtX3R5cGUgPT0gQ3NzVmFsdWVUeXBlLlN0cmluZyAmJiBtX3ZhbHVlLlN0YXJ0c1dpdGgoIiMiKSkpIAorICAgICAgICAgICAgICAgICAgICAmJiAobV92YWx1ZS5MZW5ndGggPT0gNiB8fCAobV92YWx1ZS5MZW5ndGggPT0gNyAmJiBtX3ZhbHVlLlN0YXJ0c1dpdGgoIiMiKSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBoZXggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChjaGFyIGMgaW4gbV92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGFyLklzRGlnaXQoYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjICE9ICcjJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGMgIT0gJ2EnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYyAhPSAnQScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjICE9ICdiJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGMgIT0gJ0InCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYyAhPSAnYycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjICE9ICdDJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGMgIT0gJ2QnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYyAhPSAnRCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjICE9ICdlJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGMgIT0gJ0UnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYyAhPSAnZicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjICE9ICdGJworICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX3R5cGUgPT0gQ3NzVmFsdWVUeXBlLlN0cmluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgbnVtYmVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoY2hhciBjIGluIG1fdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hhci5Jc0RpZ2l0KGMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXIpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtub3duQ29sb3Iga2MgPSAoS25vd25Db2xvcilFbnVtLlBhcnNlKHR5cGVvZihLbm93bkNvbG9yKSwgbV92YWx1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCB7IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbG9yIFRvQ29sb3IoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgaGV4ID0gIjAwMDAwMCI7CisgICAgICAgICAgICBpZiAobV90eXBlID09IENzc1ZhbHVlVHlwZS5IZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1fdmFsdWUuTGVuZ3RoID09IDcgJiYgbV92YWx1ZS5TdGFydHNXaXRoKCIjIikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoZXggPSBtX3ZhbHVlLlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YWx1ZS5MZW5ndGggPT0gNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhleCA9IG1fdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS25vd25Db2xvciBrYyA9IChLbm93bkNvbG9yKUVudW0uUGFyc2UodHlwZW9mKEtub3duQ29sb3IpLCBtX3ZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IgYyA9IENvbG9yLkZyb21Lbm93bkNvbG9yKGtjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIHsgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHIgPSBDb252ZXJ0RnJvbUhleChoZXguU3Vic3RyaW5nKDAsIDIpKTsKKyAgICAgICAgICAgIGludCBnID0gQ29udmVydEZyb21IZXgoaGV4LlN1YnN0cmluZygyLCAyKSk7CisgICAgICAgICAgICBpbnQgYiA9IENvbnZlcnRGcm9tSGV4KGhleC5TdWJzdHJpbmcoNCkpOworICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKHIsIGcsIGIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgQ29udmVydEZyb21IZXgoc3RyaW5nIGlucHV0KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdmFsOworICAgICAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0Lkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBjaHVuayA9IGlucHV0LlN1YnN0cmluZyhpLCAxKS5Ub1VwcGVyKCk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjaHVuaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIkEiOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMTA7IAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIkIiOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMTE7IAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIkMiOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMTI7IAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIkQiOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMTM7IAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIkUiOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMTQ7IAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIkYiOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMTU7IAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBpbnQuUGFyc2UoY2h1bmspOyAKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHZhbCAqIDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQ3NzUnVsZVNldCA6IEl0ZkRlY2xhcmF0aW9uQ29udGFpbmVyCisgICAgeworICAgICAgICBwcml2YXRlIExpc3Q8Q3NzU2VsZWN0b3I+IG1fc2VsZWN0b3JzID0gbmV3IExpc3Q8Q3NzU2VsZWN0b3I+KCk7CisgICAgICAgIHByaXZhdGUgTGlzdDxDc3NEZWNsYXJhdGlvbj4gbV9kZWNsYXJhdGlvbnMgPSBuZXcgTGlzdDxDc3NEZWNsYXJhdGlvbj4oKTsKKworICAgICAgICBwdWJsaWMgTGlzdDxDc3NTZWxlY3Rvcj4gU2VsZWN0b3JzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fc2VsZWN0b3JzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBtX3NlbGVjdG9ycyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8Q3NzRGVjbGFyYXRpb24+IERlY2xhcmF0aW9ucworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2RlY2xhcmF0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV9kZWNsYXJhdGlvbnMgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoMCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIFRvU3RyaW5nKGludCBpbmRlbnRMZXZlbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHN0YXJ0ID0gIiI7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudExldmVsOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhcnQgKz0gIlx0IjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKENzc1NlbGVjdG9yIHNlbCBpbiBtX3NlbGVjdG9ycykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIAorICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7IAorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoc3RhcnQpOyAKKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIsICIpOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKHNlbC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLkFwcGVuZCgiIHsiICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICBzYi5BcHBlbmQoc3RhcnQpOworCisgICAgICAgICAgICBmb3JlYWNoIChDc3NEZWNsYXJhdGlvbiBkZWMgaW4gbV9kZWNsYXJhdGlvbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJcdHswfTsiICsgRW52aXJvbm1lbnQuTmV3TGluZSArICJ7MX0iLCBkZWMuVG9TdHJpbmcoKSwgc3RhcnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzYi5BcHBlbmQoIn0iKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIENzc1NlbGVjdG9yCisgICAgeworICAgICAgICBwcml2YXRlIExpc3Q8Q3NzU2ltcGxlU2VsZWN0b3I+IG1fc2ltcGxlU2VsZWN0b3JzID0gbmV3IExpc3Q8Q3NzU2ltcGxlU2VsZWN0b3I+KCk7CisKKyAgICAgICAgcHVibGljIExpc3Q8Q3NzU2ltcGxlU2VsZWN0b3I+IFNpbXBsZVNlbGVjdG9ycworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3NpbXBsZVNlbGVjdG9yczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV9zaW1wbGVTZWxlY3RvcnMgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoQ3NzU2ltcGxlU2VsZWN0b3Igc3MgaW4gbV9zaW1wbGVTZWxlY3RvcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZChzcy5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIENzc1NpbXBsZVNlbGVjdG9yCisgICAgeworICAgICAgICBwcml2YXRlIENzc0NvbWJpbmF0b3I/IG1fY29tYmluYXRvciA9IG51bGw7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIG1fZWxlbWVudG5hbWU7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIG1faWQ7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIG1fY2xzOworICAgICAgICBwcml2YXRlIENzc0F0dHJpYnV0ZSBtX2F0dHJpYnV0ZTsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgbV9wc2V1ZG87CisgICAgICAgIHByaXZhdGUgQ3NzRnVuY3Rpb24gbV9mdW5jdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBDc3NTaW1wbGVTZWxlY3RvciBtX2NoaWxkOworCisgICAgICAgIHB1YmxpYyBDc3NDb21iaW5hdG9yPyBDb21iaW5hdG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fY29tYmluYXRvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV9jb21iaW5hdG9yID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0cmluZyBDb21iaW5hdG9yU3RyaW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMubV9jb21iaW5hdG9yLkhhc1ZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fY29tYmluYXRvci5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIHRoaXMubV9jb21iaW5hdG9yID0gKENzc0NvbWJpbmF0b3IpRW51bS5QYXJzZSh0eXBlb2YoQ3NzQ29tYmluYXRvciksIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgRWxlbWVudE5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9lbGVtZW50bmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV9lbGVtZW50bmFtZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBJRAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2lkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBtX2lkID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIENsYXNzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fY2xzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBtX2NscyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBQc2V1ZG8KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9wc2V1ZG87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIG1fcHNldWRvID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ3NzQXR0cmlidXRlIEF0dHJpYnV0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2F0dHJpYnV0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV9hdHRyaWJ1dGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDc3NGdW5jdGlvbiBGdW5jdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2Z1bmN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBtX2Z1bmN0aW9uID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ3NzU2ltcGxlU2VsZWN0b3IgQ2hpbGQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9jaGlsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV9jaGlsZCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgaWYgKG1fY29tYmluYXRvci5IYXNWYWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1fY29tYmluYXRvci5WYWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NDb21iaW5hdG9yLlByZWNlZGVkSW1tZWRpYXRlbHlCeTogCisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiArICIpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbC5DU1MuQ3NzQ29tYmluYXRvci5DaGlsZE9mOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiID4gIik7IAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NDb21iaW5hdG9yLlByZWNlZGVkQnk6IAorICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIgfiAiKTsgCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobV9lbGVtZW50bmFtZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZChtX2VsZW1lbnRuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtX2lkICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCIjezB9IiwgbV9pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobV9jbHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIi57MH0iLCBtX2Nscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobV9wc2V1ZG8gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIjp7MH0iLCBtX3BzZXVkbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobV9hdHRyaWJ1dGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQobV9hdHRyaWJ1dGUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobV9mdW5jdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZChtX2Z1bmN0aW9uLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1fY2hpbGQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobV9jaGlsZC5FbGVtZW50TmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZChtX2NoaWxkLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQ3NzVGFnCisgICAgeworICAgICAgICBwcml2YXRlIENzc1RhZ1R5cGUgbV90YWd0eXBlOworICAgICAgICBwcml2YXRlIHN0cmluZyBtX25hbWU7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIG1fY2xzOworICAgICAgICBwcml2YXRlIHN0cmluZyBtX3BzZXVkbzsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgbV9pZDsKKyAgICAgICAgcHJpdmF0ZSBjaGFyIG1fcGFyZW50cmVsID0gJ1wwJzsKKyAgICAgICAgcHJpdmF0ZSBDc3NUYWcgbV9zdWJ0YWc7CisgICAgICAgIHByaXZhdGUgTGlzdDxzdHJpbmc+IG1fYXR0cmlicyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKworICAgICAgICBwdWJsaWMgQ3NzVGFnVHlwZSBUYWdUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdGFndHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV90YWd0eXBlID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc0lEU2VsZWN0b3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9pZCAhPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSGFzTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBtX25hbWUgIT0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIEhhc0NsYXNzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fY2xzICE9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBIYXNQc2V1ZG9DbGFzcworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3BzZXVkbyAhPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV9uYW1lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIENsYXNzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fY2xzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBtX2NscyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBQc2V1ZG8KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9wc2V1ZG87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIG1fcHNldWRvID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1faWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIG1faWQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjaGFyIFBhcmVudFJlbGF0aW9uc2hpcAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3BhcmVudHJlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV9wYXJlbnRyZWwgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDc3NUYWcgU3ViVGFnCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3VidGFnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBtX3N1YnRhZyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8c3RyaW5nPiBBdHRyaWJ1dGVzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fYXR0cmliczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV9hdHRyaWJzID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFRvU2hvcnRTdHJpbmcoKSk7CisKKyAgICAgICAgICAgIGlmIChtX3N1YnRhZyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiICIpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZChtX3N1YnRhZy5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBUb1Nob3J0U3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBpZiAobV9wYXJlbnRyZWwgIT0gJ1wwJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfSAiLCBtX3BhcmVudHJlbC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIYXNOYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZChtX25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGF0ciBpbiBtX2F0dHJpYnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJbezB9XSIsIGF0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSGFzQ2xhc3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIuIik7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKG1fY2xzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChJc0lEU2VsZWN0b3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIjIik7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKG1faWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhhc1BzZXVkb0NsYXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiOiIpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZChtX3BzZXVkbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFtGbGFnc10KKyAgICBwdWJsaWMgZW51bSBDc3NUYWdUeXBlCisgICAgeworICAgICAgICBOYW1lZCA9IDEsCisgICAgICAgIENsYXNzZWQgPSAyLAorICAgICAgICBJRGVkID0gNCwKKyAgICAgICAgUHNldWRvZWQgPSA4LAorICAgICAgICBEaXJlY3RpdmUgPSAxNgorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBDc3NUZXJtCisgICAgeworICAgICAgICBwcml2YXRlIGNoYXI/IG1fc2VwYXJhdG9yOworICAgICAgICBwcml2YXRlIGNoYXI/IG1fc2lnbjsKKyAgICAgICAgcHJpdmF0ZSBDc3NUZXJtVHlwZSBtX3R5cGU7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIG1fdmFsOworICAgICAgICBwcml2YXRlIENzc1VuaXQ/IG1fdW5pdDsKKyAgICAgICAgcHJpdmF0ZSBDc3NGdW5jdGlvbiBtX2Z1bmN0aW9uOworCisgICAgICAgIHB1YmxpYyBjaGFyPyBTZXBhcmF0b3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9zZXBhcmF0b3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIG1fc2VwYXJhdG9yID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0cmluZyBTZXBhcmF0b3JDaGFyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fc2VwYXJhdG9yLkhhc1ZhbHVlID8gdGhpcy5tX3NlcGFyYXRvci5WYWx1ZS5Ub1N0cmluZygpIDogbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV9zZXBhcmF0b3IgPSAhc3RyaW5nLklzTnVsbE9yRW1wdHkodmFsdWUpID8gdmFsdWVbMF0gOiAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNoYXI/IFNpZ24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9zaWduOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBtX3NpZ24gPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RyaW5nIFNpZ25DaGFyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubV9zaWduLkhhc1ZhbHVlID8gdGhpcy5tX3NpZ24uVmFsdWUuVG9TdHJpbmcoKSA6IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIHRoaXMubV9zaWduID0gIXN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSA/IHZhbHVlWzBdIDogJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDc3NUZXJtVHlwZSBUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV90eXBlID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIFZhbHVlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBtX3ZhbCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENzc1VuaXQ/IFVuaXQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV91bml0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBtX3VuaXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RyaW5nIFVuaXRTdHJpbmcKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5tX3VuaXQuSGFzVmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tX3VuaXQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICB0aGlzLm1fdW5pdCA9IChDc3NVbml0KUVudW0uUGFyc2UodHlwZW9mKENzc1VuaXQpLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ3NzRnVuY3Rpb24gRnVuY3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9mdW5jdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbV9mdW5jdGlvbiA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgICAgICBpZiAobV90eXBlID09IENzc1Rlcm1UeXBlLkZ1bmN0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZChtX2Z1bmN0aW9uLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobV90eXBlID09IENzc1Rlcm1UeXBlLlVybCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInVybCgnezB9JykiLCBtX3ZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtX3R5cGUgPT0gQ3NzVGVybVR5cGUuVW5pY29kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIlVcXHswfSIsIG1fdmFsLlRvVXBwZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtX3R5cGUgPT0gQ3NzVGVybVR5cGUuSGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZChtX3ZhbC5Ub1VwcGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtX3NpZ24uSGFzVmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQobV9zaWduLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKG1fdmFsKTsKKyAgICAgICAgICAgICAgICBpZiAobV91bml0Lkhhc1ZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdW5pdC5WYWx1ZSA9PSBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc1VuaXQuUGVyY2VudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoQ3NzVW5pdE91dHB1dC5Ub1N0cmluZyhtX3VuaXQuVmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc0NvbG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKG1fdHlwZSA9PSBDc3NUZXJtVHlwZS5IZXgpCisgICAgICAgICAgICAgICAgICAgIHx8IChtX3R5cGUgPT0gQ3NzVGVybVR5cGUuU3RyaW5nICYmIG1fdmFsLlN0YXJ0c1dpdGgoIiMiKSkpCisgICAgICAgICAgICAgICAgICAgICYmIChtX3ZhbC5MZW5ndGggPT0gNiB8fCBtX3ZhbC5MZW5ndGggPT0gMyB8fCAoKG1fdmFsLkxlbmd0aCA9PSA3IHx8IG1fdmFsLkxlbmd0aCA9PSA0KQorICAgICAgICAgICAgICAgICAgICAmJiBtX3ZhbC5TdGFydHNXaXRoKCIjIikpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgaGV4ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoY2hhciBjIGluIG1fdmFsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoYXIuSXNEaWdpdChjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGMgIT0gJyMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYyAhPSAnYScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjICE9ICdBJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGMgIT0gJ2InCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYyAhPSAnQicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjICE9ICdjJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGMgIT0gJ0MnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYyAhPSAnZCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjICE9ICdEJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGMgIT0gJ2UnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYyAhPSAnRScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjICE9ICdmJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGMgIT0gJ0YnCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBoZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdHlwZSA9PSBDc3NUZXJtVHlwZS5TdHJpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sIG51bWJlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKGNoYXIgYyBpbiBtX3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGFyLklzRGlnaXQoYykpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgS25vd25Db2xvciBrYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEVudW0uVHJ5UGFyc2UobV92YWwsIHRydWUsIG91dCBrYykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdHlwZSA9PSBDc3NUZXJtVHlwZS5GdW5jdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgobV9mdW5jdGlvbi5OYW1lLlRvTG93ZXIoKS5FcXVhbHMoInJnYiIpICYmIG1fZnVuY3Rpb24uRXhwcmVzc2lvbi5UZXJtcy5Db3VudCA9PSAzKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1fZnVuY3Rpb24uTmFtZS5Ub0xvd2VyKCkuRXF1YWxzKCJyZ2JhIikgJiYgbV9mdW5jdGlvbi5FeHByZXNzaW9uLlRlcm1zLkNvdW50ID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9mdW5jdGlvbi5FeHByZXNzaW9uLlRlcm1zLkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fZnVuY3Rpb24uRXhwcmVzc2lvbi5UZXJtc1tpXS5UeXBlICE9IENzc1Rlcm1UeXBlLk51bWJlcikgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgobV9mdW5jdGlvbi5OYW1lLlRvTG93ZXIoKS5FcXVhbHMoImhzbCIpICYmIG1fZnVuY3Rpb24uRXhwcmVzc2lvbi5UZXJtcy5Db3VudCA9PSAzKQorICAgICAgICAgICAgICAgICAgICAgIHx8IChtX2Z1bmN0aW9uLk5hbWUuVG9Mb3dlcigpLkVxdWFscygiaHNsYSIpICYmIG1fZnVuY3Rpb24uRXhwcmVzc2lvbi5UZXJtcy5Db3VudCA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2Z1bmN0aW9uLkV4cHJlc3Npb24uVGVybXMuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9mdW5jdGlvbi5FeHByZXNzaW9uLlRlcm1zW2ldLlR5cGUgIT0gQ3NzVGVybVR5cGUuTnVtYmVyKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IEdldFJHQlZhbHVlKENzc1Rlcm0gdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHQuVW5pdC5IYXNWYWx1ZSAmJiB0LlVuaXQuVmFsdWUgPT0gT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NVbml0LlBlcmNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGludCkoMjU1ZiAqIGZsb2F0LlBhcnNlKHQuVmFsdWUpIC8gMTAwZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpbnQuUGFyc2UodC5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCB7IH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgR2V0SHVlVmFsdWUoQ3NzVGVybSB0KQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludCkoZmxvYXQuUGFyc2UodC5WYWx1ZSkgKiAyNTVmIC8gMzYwZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCB7IH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbG9yIFRvQ29sb3IoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgaGV4ID0gIjAwMDAwMCI7CisgICAgICAgICAgICBpZiAobV90eXBlID09IENzc1Rlcm1UeXBlLkhleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1fdmFsLkxlbmd0aCA9PSA3IHx8IG1fdmFsLkxlbmd0aCA9PSA0KSAmJiBtX3ZhbC5TdGFydHNXaXRoKCIjIikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoZXggPSBtX3ZhbC5TdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdmFsLkxlbmd0aCA9PSA2IHx8IG1fdmFsLkxlbmd0aCA9PSAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGV4ID0gbV92YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobV90eXBlID09IENzc1Rlcm1UeXBlLkZ1bmN0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgobV9mdW5jdGlvbi5OYW1lLlRvTG93ZXIoKS5FcXVhbHMoInJnYiIpICYmIG1fZnVuY3Rpb24uRXhwcmVzc2lvbi5UZXJtcy5Db3VudCA9PSAzKQorICAgICAgICAgICAgICAgICAgICB8fCAobV9mdW5jdGlvbi5OYW1lLlRvTG93ZXIoKS5FcXVhbHMoInJnYmEiKSAmJiBtX2Z1bmN0aW9uLkV4cHJlc3Npb24uVGVybXMuQ291bnQgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZyID0gMCwgZmcgPSAwLCBmYiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9mdW5jdGlvbi5FeHByZXNzaW9uLlRlcm1zLkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2Z1bmN0aW9uLkV4cHJlc3Npb24uVGVybXNbaV0uVHlwZSAhPSBDc3NUZXJtVHlwZS5OdW1iZXIpIAorICAgICAgICAgICAgICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sb3IuQmxhY2s7IAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogZnIgPSBHZXRSR0JWYWx1ZShtX2Z1bmN0aW9uLkV4cHJlc3Npb24uVGVybXNbaV0pOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiBmZyA9IEdldFJHQlZhbHVlKG1fZnVuY3Rpb24uRXhwcmVzc2lvbi5UZXJtc1tpXSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IGZiID0gR2V0UkdCVmFsdWUobV9mdW5jdGlvbi5FeHByZXNzaW9uLlRlcm1zW2ldKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xvci5Gcm9tQXJnYihmciwgZmcsIGZiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKG1fZnVuY3Rpb24uTmFtZS5Ub0xvd2VyKCkuRXF1YWxzKCJoc2wiKSAmJiBtX2Z1bmN0aW9uLkV4cHJlc3Npb24uVGVybXMuQ291bnQgPT0gMykKKyAgICAgICAgICAgICAgICAgIHx8IChtX2Z1bmN0aW9uLk5hbWUuRXF1YWxzKCJoc2xhIikgJiYgbV9mdW5jdGlvbi5FeHByZXNzaW9uLlRlcm1zLkNvdW50ID09IDQpCisgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaCA9IDAsIHMgPSAwLCB2ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2Z1bmN0aW9uLkV4cHJlc3Npb24uVGVybXMuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fZnVuY3Rpb24uRXhwcmVzc2lvbi5UZXJtc1tpXS5UeXBlICE9IENzc1Rlcm1UeXBlLk51bWJlcikgeyByZXR1cm4gQ29sb3IuQmxhY2s7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IGggPSBHZXRIdWVWYWx1ZShtX2Z1bmN0aW9uLkV4cHJlc3Npb24uVGVybXNbaV0pOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiBzID0gR2V0UkdCVmFsdWUobV9mdW5jdGlvbi5FeHByZXNzaW9uLlRlcm1zW2ldKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogdiA9IEdldFJHQlZhbHVlKG1fZnVuY3Rpb24uRXhwcmVzc2lvbi5UZXJtc1tpXSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBIdWVTYXRWYWwgaHN2ID0gbmV3IEh1ZVNhdFZhbChoLCBzLCB2KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhzdi5Db2xvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLbm93bkNvbG9yIGtjID0gKEtub3duQ29sb3IpRW51bS5QYXJzZSh0eXBlb2YoS25vd25Db2xvciksIG1fdmFsLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IgYyA9IENvbG9yLkZyb21Lbm93bkNvbG9yKGtjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIHsgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhleC5MZW5ndGggPT0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdGVtcCA9ICIiOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGNoYXIgYyBpbiBoZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ZW1wICs9IGMuVG9TdHJpbmcoKSArIGMuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGV4ID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCByID0gQ29udmVydEZyb21IZXgoaGV4LlN1YnN0cmluZygwLCAyKSk7CisgICAgICAgICAgICBpbnQgZyA9IENvbnZlcnRGcm9tSGV4KGhleC5TdWJzdHJpbmcoMiwgMikpOworICAgICAgICAgICAgaW50IGIgPSBDb252ZXJ0RnJvbUhleChoZXguU3Vic3RyaW5nKDQpKTsKKyAgICAgICAgICAgIHJldHVybiBDb2xvci5Gcm9tQXJnYihyLCBnLCBiKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGludCBDb252ZXJ0RnJvbUhleChzdHJpbmcgaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB2YWw7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGNodW5rID0gaW5wdXQuU3Vic3RyaW5nKGksIDEpLlRvVXBwZXIoKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNodW5rKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiQSI6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAxMDsgCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiQiI6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAxMTsgCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiQyI6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAxMjsgCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiRCI6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAxMzsgCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiRSI6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAxNDsgCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiRiI6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAxNTsgCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGludC5QYXJzZShjaHVuayk7IAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdmFsICogMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB2YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBlbnVtIENzc1Rlcm1UeXBlCisgICAgeworICAgICAgICBOdW1iZXIsCisgICAgICAgIEZ1bmN0aW9uLAorICAgICAgICBTdHJpbmcsCisgICAgICAgIFVybCwKKyAgICAgICAgVW5pY29kZSwKKyAgICAgICAgSGV4CisgICAgfQorCisgICAgcHVibGljIGVudW0gQ3NzVW5pdAorICAgIHsKKyAgICAgICAgTm9uZSwKKyAgICAgICAgUGVyY2VudCwKKyAgICAgICAgRU0sCisgICAgICAgIEVYLAorICAgICAgICBQWCwKKyAgICAgICAgR0QsCisgICAgICAgIFJFTSwKKyAgICAgICAgVlcsCisgICAgICAgIFZILAorICAgICAgICBWTSwKKyAgICAgICAgQ0gsCisgICAgICAgIE1NLAorICAgICAgICBDTSwKKyAgICAgICAgSU4sCisgICAgICAgIFBULAorICAgICAgICBQQywKKyAgICAgICAgREVHLAorICAgICAgICBHUkFELAorICAgICAgICBSQUQsCisgICAgICAgIFRVUk4sCisgICAgICAgIE1TLAorICAgICAgICBTLAorICAgICAgICBIeiwKKyAgICAgICAga0h6LAorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3NzVW5pdE91dHB1dAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgVG9TdHJpbmcoQ3NzVW5pdCB1KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodSA9PSBDc3NVbml0LlBlcmNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHUgPT0gQ3NzVW5pdC5IeiB8fCB1ID09IENzc1VuaXQua0h6KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB1LlRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh1ID09IENzc1VuaXQuTm9uZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdS5Ub1N0cmluZygpLlRvTG93ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBlbnVtIENzc1ZhbHVlVHlwZQorICAgIHsKKyAgICAgICAgU3RyaW5nLAorICAgICAgICBIZXgsCisgICAgICAgIFVuaXQsCisgICAgICAgIFBlcmNlbnQsCisgICAgICAgIFVybCwKKyAgICAgICAgRnVuY3Rpb24KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQ3NzUGFyc2VyCisgICAgeworICAgICAgICBwcml2YXRlIExpc3Q8c3RyaW5nPiBtX2Vycm9ycyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgcHJpdmF0ZSBDc3NEb2N1bWVudCBtX2RvYzsKKworICAgICAgICBwdWJsaWMgQ3NzRG9jdW1lbnQgUGFyc2VUZXh0KHN0cmluZyBjb250ZW50KQorICAgICAgICB7CisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbWVtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gQVNDSUlFbmNvZGluZy5BU0NJSS5HZXRCeXRlcyhjb250ZW50KTsKKyAgICAgICAgICAgIG1lbS5Xcml0ZShieXRlcywgMCwgYnl0ZXMuTGVuZ3RoKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVN0cmVhbShtZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIG1zZyA9IGUuTWVzc2FnZSArICIuICBDU1MgPT4gIiArIGNvbnRlbnQ7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBmb2xsb3dpbmcgbWV0aG9kIHNob3VsZCBiZSBwcml2YXRlLCBhcyBpdCBkb2VzIG5vdCBwcm9wZXJseSByZS10aHJvdyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbgorICAgICAgICBwcml2YXRlIENzc0RvY3VtZW50IFBhcnNlU3RyZWFtKFN0cmVhbSBzdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKHN0cmVhbSk7CisgICAgICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcihzY2FubmVyKTsKKyAgICAgICAgICAgIHBhcnNlci5QYXJzZSgpOworICAgICAgICAgICAgbV9kb2MgPSBwYXJzZXIuQ3NzRG9jOworICAgICAgICAgICAgcmV0dXJuIG1fZG9jOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENzc0RvY3VtZW50IENTU0RvY3VtZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBtX2RvYzsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8c3RyaW5nPiBFcnJvcnMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG1fZXJyb3JzOyB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBIdWUgU2F0IGFuZCBWYWwgdmFsdWVzIGZyb20gMCAtIDI1NS4KKyAgICBpbnRlcm5hbCBzdHJ1Y3QgSHVlU2F0VmFsCisgICAgeworICAgICAgICBwcml2YXRlIGludCBtX2h1ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbV9zYXQ7CisgICAgICAgIHByaXZhdGUgaW50IG1fdmFsOworICAgICAgICBwdWJsaWMgSHVlU2F0VmFsKGludCBoLCBpbnQgcywgaW50IHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faHVlID0gaDsKKyAgICAgICAgICAgIG1fc2F0ID0gczsKKyAgICAgICAgICAgIG1fdmFsID0gdjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgSHVlU2F0VmFsKENvbG9yIGNvbG9yKQorICAgICAgICB7CisgICAgICAgICAgICBtX2h1ZSA9IDA7CisgICAgICAgICAgICBtX3NhdCA9IDA7CisgICAgICAgICAgICBtX3ZhbCA9IDA7CisgICAgICAgICAgICBDb252ZXJ0RnJvbVJHQihjb2xvcik7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBIdWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9odWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIG1faHVlID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBTYXR1cmF0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fc2F0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBtX3NhdCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgVmFsdWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIG1fdmFsID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIENvbG9yIENvbG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbnZlcnRUb1JHQigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBDb252ZXJ0RnJvbVJHQih2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIENvbnZlcnRGcm9tUkdCKENvbG9yIGNvbG9yKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgbWluOyBkb3VibGUgbWF4OyBkb3VibGUgZGVsdGE7CisgICAgICAgICAgICBkb3VibGUgciA9IChkb3VibGUpY29sb3IuUiAvIDI1NS4wZDsKKyAgICAgICAgICAgIGRvdWJsZSBnID0gKGRvdWJsZSljb2xvci5HIC8gMjU1LjBkOworICAgICAgICAgICAgZG91YmxlIGIgPSAoZG91YmxlKWNvbG9yLkIgLyAyNTUuMGQ7CisgICAgICAgICAgICBkb3VibGUgaDsgZG91YmxlIHM7IGRvdWJsZSB2OworCisgICAgICAgICAgICBtaW4gPSBNYXRoLk1pbihNYXRoLk1pbihyLCBnKSwgYik7CisgICAgICAgICAgICBtYXggPSBNYXRoLk1heChNYXRoLk1heChyLCBnKSwgYik7CisgICAgICAgICAgICB2ID0gbWF4OworICAgICAgICAgICAgZGVsdGEgPSBtYXggLSBtaW47CisgICAgICAgICAgICBpZiAobWF4ID09IDAgfHwgZGVsdGEgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzID0gMDsKKyAgICAgICAgICAgICAgICBoID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzID0gZGVsdGEgLyBtYXg7CisgICAgICAgICAgICAgICAgaWYgKHIgPT0gbWF4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaCA9ICg2MEQgKiAoKGcgLSBiKSAvIGRlbHRhKSkgJSAzNjAuMGQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGcgPT0gbWF4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaCA9IDYwRCAqICgoYiAtIHIpIC8gZGVsdGEpICsgMTIwLjBkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoID0gNjBEICogKChyIC0gZykgLyBkZWx0YSkgKyAyNDAuMGQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGggPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGggKz0gMzYwLjBkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBIdWUgPSAoaW50KShoIC8gMzYwLjBkICogMjU1LjBkKTsKKyAgICAgICAgICAgIFNhdHVyYXRpb24gPSAoaW50KShzICogMjU1LjBkKTsKKyAgICAgICAgICAgIFZhbHVlID0gKGludCkodiAqIDI1NS4wZCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIENvbG9yIENvbnZlcnRUb1JHQigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBoOworICAgICAgICAgICAgZG91YmxlIHM7CisgICAgICAgICAgICBkb3VibGUgdjsKKyAgICAgICAgICAgIGRvdWJsZSByID0gMDsKKyAgICAgICAgICAgIGRvdWJsZSBnID0gMDsKKyAgICAgICAgICAgIGRvdWJsZSBiID0gMDsKKworICAgICAgICAgICAgaCA9ICgoZG91YmxlKUh1ZSAvIDI1NS4wZCAqIDM2MC4wZCkgJSAzNjAuMGQ7CisgICAgICAgICAgICBzID0gKGRvdWJsZSlTYXR1cmF0aW9uIC8gMjU1LjBkOworICAgICAgICAgICAgdiA9IChkb3VibGUpVmFsdWUgLyAyNTUuMGQ7CisKKyAgICAgICAgICAgIGlmIChzID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgciA9IHY7CisgICAgICAgICAgICAgICAgZyA9IHY7CisgICAgICAgICAgICAgICAgYiA9IHY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHA7CisgICAgICAgICAgICAgICAgZG91YmxlIHE7CisgICAgICAgICAgICAgICAgZG91YmxlIHQ7CisKKyAgICAgICAgICAgICAgICBkb3VibGUgZnJhY3Rpb25hbFBhcnQ7CisgICAgICAgICAgICAgICAgaW50IHNlY3Rvck51bWJlcjsKKyAgICAgICAgICAgICAgICBkb3VibGUgc2VjdG9yUG9zOworCisgICAgICAgICAgICAgICAgc2VjdG9yUG9zID0gaCAvIDYwLjBkOworICAgICAgICAgICAgICAgIHNlY3Rvck51bWJlciA9IChpbnQpKE1hdGguRmxvb3Ioc2VjdG9yUG9zKSk7CisKKyAgICAgICAgICAgICAgICBmcmFjdGlvbmFsUGFydCA9IHNlY3RvclBvcyAtIHNlY3Rvck51bWJlcjsKKworICAgICAgICAgICAgICAgIHAgPSB2ICogKDEuMGQgLSBzKTsKKyAgICAgICAgICAgICAgICBxID0gdiAqICgxLjBkIC0gKHMgKiBmcmFjdGlvbmFsUGFydCkpOworICAgICAgICAgICAgICAgIHQgPSB2ICogKDEuMGQgLSAocyAqICgxLjBkIC0gZnJhY3Rpb25hbFBhcnQpKSk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHNlY3Rvck51bWJlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB2OworICAgICAgICAgICAgICAgICAgICAgICAgZyA9IHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBiID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICByID0gcTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGcgPSB2OworICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgciA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICBnID0gdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgZyA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICBiID0gdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICByID0gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgciA9IHY7CisgICAgICAgICAgICAgICAgICAgICAgICBnID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKChpbnQpKHIgKiAyNTUuMGQpLCAoaW50KShnICogMjU1LjBkKSwgKGludCkoYiAqIDI1NS4wZCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIG9wZXJhdG9yICE9KEh1ZVNhdFZhbCBsZWZ0LCBIdWVTYXRWYWwgcmlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhKGxlZnQgPT0gcmlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIG9wZXJhdG9yID09KEh1ZVNhdFZhbCBsZWZ0LCBIdWVTYXRWYWwgcmlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAobGVmdC5IdWUgPT0gcmlnaHQuSHVlICYmIGxlZnQuVmFsdWUgPT0gcmlnaHQuVmFsdWUgJiYgbGVmdC5TYXR1cmF0aW9uID09IHJpZ2h0LlNhdHVyYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzID09IChIdWVTYXRWYWwpb2JqOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiYXNlLkdldEhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgUGFyc2VyCisgICAgeworICAgICAgICBwdWJsaWMgY29uc3QgaW50IGNfRU9GID0gMDsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBjX2lkZW50ID0gMTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBjX25ld2xpbmUgPSAyOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IGNfZGlnaXQgPSAzOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IGNfd2hpdGVzcGFjZSA9IDQ7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgY19tYXhUID0gNDk7CisKKyAgICAgICAgY29uc3QgYm9vbCBUID0gdHJ1ZTsKKyAgICAgICAgY29uc3QgYm9vbCB4ID0gZmFsc2U7CisgICAgICAgIGNvbnN0IGludCBtaW5FcnJEaXN0ID0gMjsKKworICAgICAgICBwdWJsaWMgU2Nhbm5lciBtX3NjYW5uZXI7CisgICAgICAgIHB1YmxpYyBFcnJvcnMgbV9lcnJvcnM7CisKKyAgICAgICAgcHVibGljIENzc1Rva2VuIG1fbGFzdFJlY29nbml6ZWRUb2tlbjsKKyAgICAgICAgcHVibGljIENzc1Rva2VuIG1fbG9va2FoZWFkVG9rZW47CisgICAgICAgIGludCBlcnJEaXN0ID0gbWluRXJyRGlzdDsKKworICAgICAgICBwdWJsaWMgQ3NzRG9jdW1lbnQgQ3NzRG9jOworCisgICAgICAgIGJvb2wgSXNJbkhleChzdHJpbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZS5MZW5ndGggPT0gNykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFsdWUuTGVuZ3RoICsgbV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuVmFsdWUuTGVuZ3RoID4gNykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgaGV4ZXMgPSBuZXcgTGlzdDxzdHJpbmc+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiCisgICAgICAgICAgICB9OworICAgICAgICAgICAgZm9yZWFjaCAoY2hhciBjIGluIG1fbG9va2FoZWFkVG9rZW4ubV90b2tlblZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaGV4ZXMuQ29udGFpbnMoYy5Ub1N0cmluZygpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgSXNVbml0T2ZMZW5ndGgoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCAhPSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Q8c3RyaW5nPiB1bml0cyA9IG5ldyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0PHN0cmluZz4oCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiZW0iLCAiZXgiLCAicHgiLCAiZ2QiLCAicmVtIiwgInZ3IiwgInZoIiwgInZtIiwgImNoIiwgIm1tIiwgImNtIiwgImluIiwgInB0IiwgInBjIiwgImRlZyIsICJncmFkIiwgInJhZCIsICJ0dXJuIiwgIm1zIiwgInMiLCAiaHoiLCAia2h6IgorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIHVuaXRzLkNvbnRhaW5zKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlblZhbHVlLlRvTG93ZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBib29sIElzTnVtYmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlblZhbHVlLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXIuSXNEaWdpdChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5WYWx1ZVswXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFyc2VyKFNjYW5uZXIgc2Nhbm5lcikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5tX3NjYW5uZXIgPSBzY2FubmVyOworICAgICAgICAgICAgbV9lcnJvcnMgPSBuZXcgRXJyb3JzKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIFN5bnRheEVycihpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVyckRpc3QgPj0gbWluRXJyRGlzdCkgCisgICAgICAgICAgICAgICAgbV9lcnJvcnMuU3ludGF4RXJyb3IobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuTGluZSwgbV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuQ29sdW1uLCBuKTsKKyAgICAgICAgICAgIGVyckRpc3QgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2VtYW50aWNFcnIoc3RyaW5nIG1zZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVyckRpc3QgPj0gbWluRXJyRGlzdCkKKyAgICAgICAgICAgICAgICBtX2Vycm9ycy5TZW1hbnRpY0Vycm9yKG1fbGFzdFJlY29nbml6ZWRUb2tlbi5tX3Rva2VuTGluZSwgbV9sYXN0UmVjb2duaXplZFRva2VuLm1fdG9rZW5Db2x1bW4sIG1zZyk7CisgICAgICAgICAgICBlcnJEaXN0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgR2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2xhc3RSZWNvZ25pemVkVG9rZW4gPSBtX2xvb2thaGVhZFRva2VuOworICAgICAgICAgICAgICAgIG1fbG9va2FoZWFkVG9rZW4gPSBtX3NjYW5uZXIuU2NhbigpOworICAgICAgICAgICAgICAgIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kIDw9IGNfbWF4VCkgCisgICAgICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICAgICAgKytlcnJEaXN0OyAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1fbG9va2FoZWFkVG9rZW4gPSBtX2xhc3RSZWNvZ25pemVkVG9rZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIEV4cGVjdChpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gbikKKyAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeW50YXhFcnIobik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sIFN0YXJ0T2YoaW50IHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRbcywgbV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZF07CisgICAgICAgIH0KKworICAgICAgICB2b2lkIEV4cGVjdFdlYWsoaW50IG4sIGludCBmb2xsb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IG4pIAorICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5bnRheEVycihuKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIVN0YXJ0T2YoZm9sbG93KSkgCisgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBib29sIFdlYWtTZXBhcmF0b3IoaW50IG4sIGludCBzeUZvbCwgaW50IHJlcEZvbCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGtpbmQgPSBtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kOworICAgICAgICAgICAgaWYgKGtpbmQgPT0gbikgCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIEdldCgpOyAKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChTdGFydE9mKHJlcEZvbCkpIAorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5bnRheEVycihuKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIShzZXRbc3lGb2wsIGtpbmRdIHx8IHNldFtyZXBGb2wsIGtpbmRdIHx8IHNldFswLCBraW5kXSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAga2luZCA9IG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBTdGFydE9mKHN5Rm9sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgdm9pZCBDc3MzKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ3NzRG9jID0gbmV3IENzc0RvY3VtZW50KCk7CisgICAgICAgICAgICBDc3NSdWxlU2V0IHJzZXQgPSBudWxsOworICAgICAgICAgICAgQ3NzRGlyZWN0aXZlIGRpciA9IG51bGw7CisKKyAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA1IHx8IG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChTdGFydE9mKDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTdGFydE9mKDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUnVsZVNldChvdXQgcnNldCk7CisgICAgICAgICAgICAgICAgICAgIENzc0RvYy5SdWxlU2V0cy5BZGQocnNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERpcmVjdGl2ZShvdXQgZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgQ3NzRG9jLkRpcmVjdGl2ZXMuQWRkKGRpcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDUgfHwgbV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBSdWxlU2V0KG91dCBDc3NSdWxlU2V0IHJzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzZXQgPSBuZXcgQ3NzUnVsZVNldCgpOworICAgICAgICAgICAgQ3NzU2VsZWN0b3Igc2VsID0gbnVsbDsKKyAgICAgICAgICAgIENzc0RlY2xhcmF0aW9uIGRlYyA9IG51bGw7CisKKyAgICAgICAgICAgIFNlbGVjdG9yKG91dCBzZWwpOworICAgICAgICAgICAgcnNldC5TZWxlY3RvcnMuQWRkKHNlbCk7CisgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMjUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZWxlY3RvcihvdXQgc2VsKTsKKyAgICAgICAgICAgICAgICByc2V0LlNlbGVjdG9ycy5BZGQoc2VsKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgRXhwZWN0KDI2KTsKKyAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoU3RhcnRPZigzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbihvdXQgZGVjKTsKKyAgICAgICAgICAgICAgICByc2V0LkRlY2xhcmF0aW9ucy5BZGQoZGVjKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDI3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5WYWx1ZS5FcXVhbHMoIn0iKSkgCisgICAgICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsgCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb24ob3V0IGRlYyk7CisgICAgICAgICAgICAgICAgICAgIHJzZXQuRGVjbGFyYXRpb25zLkFkZChkZWMpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAyNykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV4cGVjdCgyOCk7CisgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBEaXJlY3RpdmUob3V0IENzc0RpcmVjdGl2ZSBkaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpciA9IG5ldyBDc3NEaXJlY3RpdmUoKTsKKyAgICAgICAgICAgIENzc0RlY2xhcmF0aW9uIGRlYyA9IG51bGw7CisgICAgICAgICAgICBDc3NSdWxlU2V0IHJzZXQgPSBudWxsOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBleHAgPSBudWxsOworICAgICAgICAgICAgQ3NzRGlyZWN0aXZlIGRyID0gbnVsbDsKKyAgICAgICAgICAgIHN0cmluZyBpZGVudCA9IG51bGw7CisgICAgICAgICAgICBDc3NNZWRpdW0gbTsKKworICAgICAgICAgICAgRXhwZWN0KDIzKTsKKyAgICAgICAgICAgIGRpci5OYW1lID0gIkAiOworICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgZGlyLk5hbWUgKz0gIi0iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSWRlbnRpdHkob3V0IGlkZW50KTsKKyAgICAgICAgICAgIGRpci5OYW1lICs9IGlkZW50OworICAgICAgICAgICAgc3dpdGNoIChkaXIuTmFtZS5Ub0xvd2VyKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiQG1lZGlhIjogCisgICAgICAgICAgICAgICAgICAgIGRpci5UeXBlID0gQ3NzRGlyZWN0aXZlVHlwZS5NZWRpYTsgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgIkBpbXBvcnQiOiAKKyAgICAgICAgICAgICAgICAgICAgZGlyLlR5cGUgPSBDc3NEaXJlY3RpdmVUeXBlLkltcG9ydDsgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgIkBjaGFyc2V0IjogCisgICAgICAgICAgICAgICAgICAgIGRpci5UeXBlID0gQ3NzRGlyZWN0aXZlVHlwZS5DaGFyc2V0OyAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAiQHBhZ2UiOiAKKyAgICAgICAgICAgICAgICAgICAgZGlyLlR5cGUgPSBDc3NEaXJlY3RpdmVUeXBlLlBhZ2U7IAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJAZm9udC1mYWNlIjogCisgICAgICAgICAgICAgICAgICAgIGRpci5UeXBlID0gQ3NzRGlyZWN0aXZlVHlwZS5Gb250RmFjZTsgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgIkBuYW1lc3BhY2UiOiAKKyAgICAgICAgICAgICAgICAgICAgZGlyLlR5cGUgPSBDc3NEaXJlY3RpdmVUeXBlLk5hbWVzcGFjZTsgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IAorICAgICAgICAgICAgICAgICAgICBkaXIuVHlwZSA9IENzc0RpcmVjdGl2ZVR5cGUuT3RoZXI7IAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChTdGFydE9mKDQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTdGFydE9mKDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWVkaXVtKG91dCBtKTsKKyAgICAgICAgICAgICAgICAgICAgZGlyLk1lZGl1bXMuQWRkKG0pOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAyNSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaXVtKG91dCBtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5NZWRpdW1zLkFkZChtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXhwcnNuKG91dCBleHApOworICAgICAgICAgICAgICAgICAgICBkaXIuRXhwcmVzc2lvbiA9IGV4cDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAyNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChTdGFydE9mKDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKFN0YXJ0T2YoMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIuVHlwZSA9PSBDc3NEaXJlY3RpdmVUeXBlLlBhZ2UgfHwgZGlyLlR5cGUgPT0gQ3NzRGlyZWN0aXZlVHlwZS5Gb250RmFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbihvdXQgZGVjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIuRGVjbGFyYXRpb25zLkFkZChkZWMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMjcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlblZhbHVlLkVxdWFscygifSIpKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb24ob3V0IGRlYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpci5EZWNsYXJhdGlvbnMuQWRkKGRlYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDI3KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoU3RhcnRPZigyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdWxlU2V0KG91dCByc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIuUnVsZVNldHMuQWRkKHJzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aXZlKG91dCBkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLkRpcmVjdGl2ZXMuQWRkKGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEV4cGVjdCgyOCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMjcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgU3ludGF4RXJyKDUwKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgUXVvdGVkU3RyaW5nKG91dCBzdHJpbmcgcXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHFzID0gIiI7CisgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA3KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgIHdoaWxlIChTdGFydE9mKDcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgIHFzICs9IG1fbGFzdFJlY29nbml6ZWRUb2tlbi5tX3Rva2VuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5WYWx1ZS5FcXVhbHMoIiciKSAmJiAhbV9sYXN0UmVjb2duaXplZFRva2VuLm1fdG9rZW5WYWx1ZS5FcXVhbHMoIlxcIikpIAorICAgICAgICAgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEV4cGVjdCg3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoU3RhcnRPZig4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICBxcyArPSBtX2xhc3RSZWNvZ25pemVkVG9rZW4ubV90b2tlblZhbHVlOworICAgICAgICAgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuVmFsdWUuRXF1YWxzKCJcIiIpICYmICFtX2xhc3RSZWNvZ25pemVkVG9rZW4ubV90b2tlblZhbHVlLkVxdWFscygiXFwiKSkgCisgICAgICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRXhwZWN0KDgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBTeW50YXhFcnIoNTEpOworCisgICAgICAgIH0KKworICAgICAgICB2b2lkIFVSSShvdXQgc3RyaW5nIHVybCkKKyAgICAgICAgeworICAgICAgICAgICAgdXJsID0gIiI7CisgICAgICAgICAgICBFeHBlY3QoOSk7CisgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNyB8fCBtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUXVvdGVkU3RyaW5nKG91dCB1cmwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoU3RhcnRPZig5KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoU3RhcnRPZigxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgdXJsICs9IG1fbGFzdFJlY29nbml6ZWRUb2tlbi5tX3Rva2VuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5WYWx1ZS5FcXVhbHMoIikiKSkgCisgICAgICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIFN5bnRheEVycig1Mik7CisgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIE1lZGl1bShvdXQgQ3NzTWVkaXVtIG0pCisgICAgICAgIHsKKyAgICAgICAgICAgIG0gPSBDc3NNZWRpdW0uYWxsOworICAgICAgICAgICAgc3dpdGNoIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbSA9IENzc01lZGl1bS5hbGw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbSA9IENzc01lZGl1bS5hdXJhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtID0gQ3NzTWVkaXVtLmJyYWlsbGU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbSA9IENzc01lZGl1bS5lbWJvc3NlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtID0gQ3NzTWVkaXVtLmhhbmRoZWxkOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBDc3NNZWRpdW0ucHJpbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbSA9IENzc01lZGl1bS5wcm9qZWN0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBDc3NNZWRpdW0uc2NyZWVuOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBDc3NNZWRpdW0udHR5OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBDc3NNZWRpdW0udHY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFN5bnRheEVycig1Myk7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBJZGVudGl0eShvdXQgc3RyaW5nIGlkZW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZGVudCA9ICIiOworICAgICAgICAgICAgc3dpdGNoIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDogU3ludGF4RXJyKDU0KTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZGVudCArPSBtX2xhc3RSZWNvZ25pemVkVG9rZW4ubV90b2tlblZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBFeHByc24ob3V0IENzc0V4cHJlc3Npb24gZXhwKQorICAgICAgICB7CisgICAgICAgICAgICBleHAgPSBuZXcgQ3NzRXhwcmVzc2lvbigpOworICAgICAgICAgICAgY2hhcj8gc2VwID0gbnVsbDsKKyAgICAgICAgICAgIENzc1Rlcm0gdHJtID0gbnVsbDsKKworICAgICAgICAgICAgVGVybShvdXQgdHJtKTsKKyAgICAgICAgICAgIGV4cC5UZXJtcy5BZGQodHJtKTsKKyAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoU3RhcnRPZigxMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMjUgfHwgbV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0NikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQ2KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICcvJzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gJywnOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFRlcm0ob3V0IHRybSk7CisgICAgICAgICAgICAgICAgaWYgKHNlcC5IYXNWYWx1ZSkgCisgICAgICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICAgICAgdHJtLlNlcGFyYXRvciA9IHNlcC5WYWx1ZTsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGV4cC5UZXJtcy5BZGQodHJtKTsKKyAgICAgICAgICAgICAgICBzZXAgPSBudWxsOworCisgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgRGVjbGFyYXRpb24ob3V0IENzc0RlY2xhcmF0aW9uIGRlYykKKyAgICAgICAgeworICAgICAgICAgICAgZGVjID0gbmV3IENzc0RlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGV4cCA9IG51bGw7CisgICAgICAgICAgICBzdHJpbmcgaWRlbnQgPSAiIjsKKworICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgZGVjLk5hbWUgKz0gIi0iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSWRlbnRpdHkob3V0IGlkZW50KTsKKyAgICAgICAgICAgIGRlYy5OYW1lICs9IGlkZW50OworICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV4cGVjdCg0Myk7CisgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXhwcnNuKG91dCBleHApOworICAgICAgICAgICAgZGVjLkV4cHJlc3Npb24gPSBleHA7CisgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFeHBlY3QoNDUpOworICAgICAgICAgICAgICAgIGRlYy5JbXBvcnRhbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIFNlbGVjdG9yKG91dCBDc3NTZWxlY3RvciBzZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbCA9IG5ldyBDc3NTZWxlY3RvcigpOworICAgICAgICAgICAgQ3NzU2ltcGxlU2VsZWN0b3Igc3MgPSBudWxsOworICAgICAgICAgICAgQ3NzQ29tYmluYXRvcj8gY2IgPSBudWxsOworCisgICAgICAgICAgICBTaW1wbGVTZWxlY3RvcihvdXQgc3MpOworICAgICAgICAgICAgc2VsLlNpbXBsZVNlbGVjdG9ycy5BZGQoc3MpOworICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChTdGFydE9mKDEyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAyOSB8fCBtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDMwIHx8IG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMzEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAyOSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYiA9IENzc0NvbWJpbmF0b3IuUHJlY2VkZWRJbW1lZGlhdGVseUJ5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMzApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2IgPSBDc3NDb21iaW5hdG9yLkNoaWxkT2Y7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNiID0gQ3NzQ29tYmluYXRvci5QcmVjZWRlZEJ5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2ltcGxlU2VsZWN0b3Iob3V0IHNzKTsKKyAgICAgICAgICAgICAgICBpZiAoY2IuSGFzVmFsdWUpIAorICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgIHNzLkNvbWJpbmF0b3IgPSBjYi5WYWx1ZTsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbC5TaW1wbGVTZWxlY3RvcnMuQWRkKHNzKTsKKworICAgICAgICAgICAgICAgIGNiID0gbnVsbDsKKyAgICAgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBTaW1wbGVTZWxlY3RvcihvdXQgQ3NzU2ltcGxlU2VsZWN0b3Igc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNzID0gbmV3IENzc1NpbXBsZVNlbGVjdG9yKCk7CisgICAgICAgICAgICBzcy5FbGVtZW50TmFtZSA9ICIiOworICAgICAgICAgICAgc3RyaW5nIHBzZCA9IG51bGw7CisgICAgICAgICAgICBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWwuQ1NTLkNzc0F0dHJpYnV0ZSBhdGIgPSBudWxsOworICAgICAgICAgICAgQ3NzU2ltcGxlU2VsZWN0b3IgcGFyZW50ID0gc3M7CisgICAgICAgICAgICBzdHJpbmcgaWRlbnQgPSBudWxsOworCisgICAgICAgICAgICBpZiAoU3RhcnRPZigzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAyNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICBzcy5FbGVtZW50TmFtZSArPSAiLSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIElkZW50aXR5KG91dCBpZGVudCk7CisgICAgICAgICAgICAgICAgc3MuRWxlbWVudE5hbWUgKz0gaWRlbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgIHNzLkVsZW1lbnROYW1lID0gIioiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoU3RhcnRPZigxMykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMzMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMjQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgc3MuSUQgPSAiLSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgSWRlbnRpdHkob3V0IGlkZW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNzLklEID09IG51bGwpIAorICAgICAgICAgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgICAgICAgICAgc3MuSUQgPSBpZGVudDsgCisgICAgICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgICAgICBzcy5JRCArPSBpZGVudDsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAzNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICBzcy5DbGFzcyA9ICIiOworICAgICAgICAgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAyNCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcy5DbGFzcyArPSAiLSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgSWRlbnRpdHkob3V0IGlkZW50KTsKKyAgICAgICAgICAgICAgICAgICAgc3MuQ2xhc3MgKz0gaWRlbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMzUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBdHRyaWIob3V0IGF0Yik7CisgICAgICAgICAgICAgICAgICAgIHNzLkF0dHJpYnV0ZSA9IGF0YjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUHNldWRvKG91dCBwc2QpOworICAgICAgICAgICAgICAgICAgICBzcy5Qc2V1ZG8gPSBwc2Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBTeW50YXhFcnIoNTUpOworICAgICAgICAgICAgd2hpbGUgKFN0YXJ0T2YoMTMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENzc1NpbXBsZVNlbGVjdG9yIGNoaWxkID0gbmV3IENzc1NpbXBsZVNlbGVjdG9yKCk7CisgICAgICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMzMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMjQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuSUQgPSAiLSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgSWRlbnRpdHkob3V0IGlkZW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLklEID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLklEID0gaWRlbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5JRCArPSAiLSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAzNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICBjaGlsZC5DbGFzcyA9ICIiOworICAgICAgICAgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAyNCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5DbGFzcyArPSAiLSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgSWRlbnRpdHkob3V0IGlkZW50KTsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuQ2xhc3MgKz0gaWRlbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMzUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBdHRyaWIob3V0IGF0Yik7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLkF0dHJpYnV0ZSA9IGF0YjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUHNldWRvKG91dCBwc2QpOworICAgICAgICAgICAgICAgICAgICBjaGlsZC5Qc2V1ZG8gPSBwc2Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhcmVudC5DaGlsZCA9IGNoaWxkOworICAgICAgICAgICAgICAgIHBhcmVudCA9IGNoaWxkOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIEF0dHJpYihvdXQgT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NBdHRyaWJ1dGUgYXRiKQorICAgICAgICB7CisgICAgICAgICAgICBhdGIgPSBuZXcgT3BlblhtbFBvd2VyVG9vbHMuSHRtbFRvV21sLkNTUy5Dc3NBdHRyaWJ1dGUoKTsKKyAgICAgICAgICAgIGF0Yi5WYWx1ZSA9ICIiOworICAgICAgICAgICAgc3RyaW5nIHF1b3RlID0gbnVsbDsKKyAgICAgICAgICAgIHN0cmluZyBpZGVudCA9IG51bGw7CisKKyAgICAgICAgICAgIEV4cGVjdCgzNSk7CisgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSWRlbnRpdHkob3V0IGlkZW50KTsKKyAgICAgICAgICAgIGF0Yi5PcGVyYW5kID0gaWRlbnQ7CisgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFN0YXJ0T2YoMTQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRiLk9wZXJhdG9yID0gQ3NzQXR0cmlidXRlT3BlcmF0b3IuRXF1YWxzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0Yi5PcGVyYXRvciA9IENzc0F0dHJpYnV0ZU9wZXJhdG9yLkluTGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdGIuT3BlcmF0b3IgPSBDc3NBdHRyaWJ1dGVPcGVyYXRvci5IeXBoZW5hdGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDM5OgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0Yi5PcGVyYXRvciA9IENzc0F0dHJpYnV0ZU9wZXJhdG9yLkVuZHNXaXRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0Yi5PcGVyYXRvciA9IENzc0F0dHJpYnV0ZU9wZXJhdG9yLkJlZ2luc1dpdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDE6CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRiLk9wZXJhdG9yID0gQ3NzQXR0cmlidXRlT3BlcmF0b3IuQ29udGFpbnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFN0YXJ0T2YoMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAyNCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdGIuVmFsdWUgKz0gIi0iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIElkZW50aXR5KG91dCBpZGVudCk7CisgICAgICAgICAgICAgICAgICAgIGF0Yi5WYWx1ZSArPSBpZGVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA3IHx8IG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFF1b3RlZFN0cmluZyhvdXQgcXVvdGUpOworICAgICAgICAgICAgICAgICAgICBhdGIuVmFsdWUgPSBxdW90ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBTeW50YXhFcnIoNTYpOworICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFeHBlY3QoNDIpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBQc2V1ZG8ob3V0IHN0cmluZyBwc2V1ZG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBzZXVkbyA9ICIiOworICAgICAgICAgICAgQ3NzRXhwcmVzc2lvbiBleHAgPSBudWxsOworICAgICAgICAgICAgc3RyaW5nIGlkZW50ID0gbnVsbDsKKworICAgICAgICAgICAgRXhwZWN0KDQzKTsKKyAgICAgICAgICAgIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDI0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgIHBzZXVkbyArPSAiLSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJZGVudGl0eShvdXQgaWRlbnQpOworICAgICAgICAgICAgcHNldWRvICs9IGlkZW50OworICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgcHNldWRvICs9IG1fbGFzdFJlY29nbml6ZWRUb2tlbi5tX3Rva2VuVmFsdWU7CisgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFeHByc24ob3V0IGV4cCk7CisgICAgICAgICAgICAgICAgcHNldWRvICs9IGV4cC5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRXhwZWN0KDExKTsKKyAgICAgICAgICAgICAgICBwc2V1ZG8gKz0gbV9sYXN0UmVjb2duaXplZFRva2VuLm1fdG9rZW5WYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgVGVybShvdXQgQ3NzVGVybSB0cm0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRybSA9IG5ldyBDc3NUZXJtKCk7CisgICAgICAgICAgICBzdHJpbmcgdmFsID0gIiI7CisgICAgICAgICAgICBDc3NFeHByZXNzaW9uIGV4cCA9IG51bGw7CisgICAgICAgICAgICBzdHJpbmcgaWRlbnQgPSBudWxsOworCisgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA3IHx8IG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBRdW90ZWRTdHJpbmcob3V0IHZhbCk7CisgICAgICAgICAgICAgICAgdHJtLlZhbHVlID0gdmFsOyB0cm0uVHlwZSA9IENzc1Rlcm1UeXBlLlN0cmluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gOSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVUkkob3V0IHZhbCk7CisgICAgICAgICAgICAgICAgdHJtLlZhbHVlID0gdmFsOworICAgICAgICAgICAgICAgIHRybS5UeXBlID0gQ3NzVGVybVR5cGUuVXJsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0NykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICBJZGVudGl0eShvdXQgaWRlbnQpOworICAgICAgICAgICAgICAgIHRybS5WYWx1ZSA9ICJVXFwiICsgaWRlbnQ7CisgICAgICAgICAgICAgICAgdHJtLlR5cGUgPSBDc3NUZXJtVHlwZS5Vbmljb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAzMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBIZXhWYWx1ZShvdXQgdmFsKTsKKyAgICAgICAgICAgICAgICB0cm0uVmFsdWUgPSB2YWw7CisgICAgICAgICAgICAgICAgdHJtLlR5cGUgPSBDc3NUZXJtVHlwZS5IZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChTdGFydE9mKDE1KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIG1pbnVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMjQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgbWludXMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoU3RhcnRPZigxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJZGVudGl0eShvdXQgaWRlbnQpOworICAgICAgICAgICAgICAgICAgICB0cm0uVmFsdWUgPSBpZGVudDsKKyAgICAgICAgICAgICAgICAgICAgdHJtLlR5cGUgPSBDc3NUZXJtVHlwZS5TdHJpbmc7CisgICAgICAgICAgICAgICAgICAgIGlmIChtaW51cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJtLlZhbHVlID0gIi0iICsgdHJtLlZhbHVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChTdGFydE9mKDE3KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMzQgfHwgbV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAzNiB8fCBtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRybS5WYWx1ZSArPSBtX2xhc3RSZWNvZ25pemVkVG9rZW4ubV90b2tlblZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU3RhcnRPZigxOCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDQzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRybS5WYWx1ZSArPSBtX2xhc3RSZWNvZ25pemVkVG9rZW4ubV90b2tlblZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMjQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJtLlZhbHVlICs9IG1fbGFzdFJlY29nbml6ZWRUb2tlbi5tX3Rva2VuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGl0eShvdXQgaWRlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJtLlZhbHVlICs9IGlkZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMzMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleFZhbHVlKG91dCB2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJtLlZhbHVlICs9IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChTdGFydE9mKDE5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cm0uVmFsdWUgKz0gbV9sYXN0UmVjb2duaXplZFRva2VuLm1fdG9rZW5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDM0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRybS5WYWx1ZSArPSAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cm0uVmFsdWUgKz0gbV9sYXN0UmVjb2duaXplZFRva2VuLm1fdG9rZW5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBTeW50YXhFcnIoNTcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDM0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRybS5WYWx1ZSArPSBtX2xhc3RSZWNvZ25pemVkVG9rZW4ubV90b2tlblZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAyNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cm0uVmFsdWUgKz0gbV9sYXN0UmVjb2duaXplZFRva2VuLm1fdG9rZW5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGl0eShvdXQgaWRlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cm0uVmFsdWUgKz0gaWRlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cm0uVmFsdWUgKz0gbV9sYXN0UmVjb2duaXplZFRva2VuLm1fdG9rZW5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMjQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJtLlZhbHVlICs9IG1fbGFzdFJlY29nbml6ZWRUb2tlbi5tX3Rva2VuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN0YXJ0T2YoMTYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGl0eShvdXQgaWRlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJtLlZhbHVlICs9IGlkZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFN0YXJ0T2YoMTkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRybS5WYWx1ZSArPSBtX2xhc3RSZWNvZ25pemVkVG9rZW4ubV90b2tlblZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgU3ludGF4RXJyKDU4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMTApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJzbihvdXQgZXhwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENzc0Z1bmN0aW9uIGZ1bmMgPSBuZXcgQ3NzRnVuY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMuTmFtZSA9IHRybS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMuRXhwcmVzc2lvbiA9IGV4cDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRybS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB0cm0uRnVuY3Rpb24gPSBmdW5jOworICAgICAgICAgICAgICAgICAgICAgICAgdHJtLlR5cGUgPSBDc3NUZXJtVHlwZS5GdW5jdGlvbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdCgxMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoU3RhcnRPZigxNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAyOSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cm0uU2lnbiA9ICcrJzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobWludXMpIHsgdHJtLlNpZ24gPSAnLSc7IH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgKz0gbV9sYXN0UmVjb2duaXplZFRva2VuLm1fdG9rZW5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAzNCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgKz0gbV9sYXN0UmVjb2duaXplZFRva2VuLm1fdG9rZW5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsICs9IG1fbGFzdFJlY29nbml6ZWRUb2tlbi5tX3Rva2VuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFN0YXJ0T2YoMjApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuVmFsdWUuVG9Mb3dlcigpLkVxdWFscygibiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdCgyMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsICs9IG1fbGFzdFJlY29nbml6ZWRUb2tlbi5tX3Rva2VuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fbG9va2FoZWFkVG9rZW4ubV90b2tlbktpbmQgPT0gMjQgfHwgbV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAyOSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDI5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCArPSBtX2xhc3RSZWNvZ25pemVkVG9rZW4ubV90b2tlblZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgKz0gbV9sYXN0UmVjb2duaXplZFRva2VuLm1fdG9rZW5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3QoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCArPSBtX2xhc3RSZWNvZ25pemVkVG9rZW4ubV90b2tlblZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCArPSBtX2xhc3RSZWNvZ25pemVkVG9rZW4ubV90b2tlblZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobV9sb29rYWhlYWRUb2tlbi5tX3Rva2VuS2luZCA9PSA0OCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cm0uVW5pdCA9IENzc1VuaXQuUGVyY2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbml0T2ZMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aXR5KG91dCBpZGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cm0uVW5pdCA9IChDc3NVbml0KUVudW0uUGFyc2UodHlwZW9mKENzc1VuaXQpLCBpZGVudCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lcnJvcnMuU2VtYW50aWNFcnJvcihtX2xhc3RSZWNvZ25pemVkVG9rZW4ubV90b2tlbkxpbmUsIG1fbGFzdFJlY29nbml6ZWRUb2tlbi5tX3Rva2VuQ29sdW1uLCBzdHJpbmcuRm9ybWF0KCJVbnJlY29nbml6ZWQgdW5pdCAnezB9JyIsIGlkZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cm0uVmFsdWUgPSB2YWw7IHRybS5UeXBlID0gQ3NzVGVybVR5cGUuTnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIFN5bnRheEVycig1OSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIFN5bnRheEVycig2MCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIEhleFZhbHVlKG91dCBzdHJpbmcgdmFsKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwgPSAiIjsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKworICAgICAgICAgICAgRXhwZWN0KDMzKTsKKyAgICAgICAgICAgIHZhbCArPSBtX2xhc3RSZWNvZ25pemVkVG9rZW4ubV90b2tlblZhbHVlOworICAgICAgICAgICAgaWYgKFN0YXJ0T2YoMTkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlIChtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5LaW5kID09IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9IG1fbGFzdFJlY29nbml6ZWRUb2tlbi5tX3Rva2VuVmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoSXNJbkhleCh2YWwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4cGVjdCgxKTsKKyAgICAgICAgICAgICAgICB2YWwgKz0gbV9sYXN0UmVjb2duaXplZFRva2VuLm1fdG9rZW5WYWx1ZTsgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBTeW50YXhFcnIoNjEpOworICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiBJc0luSGV4KHZhbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRXhwZWN0KDEpOworICAgICAgICAgICAgICAgIHZhbCArPSBtX2xhc3RSZWNvZ25pemVkVG9rZW4ubV90b2tlblZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgUGFyc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBtX2xvb2thaGVhZFRva2VuID0gbmV3IENzc1Rva2VuKCk7CisgICAgICAgICAgICBtX2xvb2thaGVhZFRva2VuLm1fdG9rZW5WYWx1ZSA9ICIiOworICAgICAgICAgICAgR2V0KCk7CisgICAgICAgICAgICBDc3MzKCk7CisgICAgICAgICAgICBFeHBlY3QoMCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgcmVhZG9ubHkgYm9vbFssXSBzZXQgPSB7CisJCSAgICB7VCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHh9LAorCQkgICAge3gsVCx4LHgsIHgseCx4LHgsIHgsVCx4LHgsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQseCx4LHgsIHgseCx4LHgsIFQsVCxULFQsIHgseCx4LHgsIHgseCx4LFQsIHgseCx4LHgsIHgseCx4fSwKKwkJICAgIHt4LFQseCx4LCB4LHgseCx4LCB4LFQseCx4LCBULFQsVCxULCBULFQsVCxULCBULFQsVCx4LCBULHgseCx4LCB4LHgseCx4LCBULFQsVCxULCB4LHgseCx4LCB4LHgseCxULCB4LHgseCx4LCB4LHgseH0sCisJCSAgICB7eCxULHgseCwgeCx4LHgseCwgeCxULHgseCwgVCxULFQsVCwgVCxULFQsVCwgVCxULFQseCwgVCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHh9LAorCQkgICAge3gsVCx4LFQsIFQseCx4LFQsIFQsVCx4LHgsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULHgsIFQsVCxULFQsIHgsVCx4LHgsIHgsVCxULHgsIHgseCx4LHgsIHgseCx4LHgsIHgseCxULFQsIFQseCx4fSwKKwkJICAgIHt4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCBULFQsVCxULCBULFQsVCxULCBULFQseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseH0sCisJCSAgICB7eCxULHgseCwgeCx4LHgseCwgeCxULHgseCwgVCxULFQsVCwgVCxULFQsVCwgVCxULFQsVCwgVCx4LHgseCwgVCx4LHgseCwgVCxULFQsVCwgeCx4LHgseCwgeCx4LHgsVCwgeCx4LHgseCwgeCx4LHh9LAorCQkgICAge3gsVCxULFQsIFQsVCxULHgsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCx4fSwKKwkJICAgIHt4LFQsVCxULCBULFQsVCxULCB4LFQsVCxULCBULFQsVCxULCBULFQsVCxULCBULFQsVCxULCBULFQsVCxULCBULFQsVCxULCBULFQsVCxULCBULFQsVCxULCBULFQsVCxULCBULFQsVCxULCBULFQseH0sCisJCSAgICB7eCxULFQsVCwgVCxULFQsVCwgVCxULHgsVCwgVCxULFQsVCwgVCxULFQsVCwgVCxULFQsVCwgVCxULFQsVCwgVCxULFQsVCwgVCxULFQsVCwgVCxULFQsVCwgVCxULFQsVCwgVCxULFQsVCwgVCxULHh9LAorCQkgICAge3gsVCxULFQsIHgsVCxULHgsIHgsVCx4LHgsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCx4fSwKKwkJICAgIHt4LFQseCxULCBULHgseCxULCBULFQseCx4LCBULFQsVCxULCBULFQsVCxULCBULFQsVCx4LCBULFQseCx4LCB4LFQseCx4LCB4LFQsVCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgsVCxULCBULHgseH0sCisJCSAgICB7eCxULHgseCwgVCx4LHgseCwgeCxULHgseCwgVCxULFQsVCwgVCxULFQsVCwgVCxULFQseCwgVCx4LHgseCwgeCxULFQsVCwgVCxULFQsVCwgeCx4LHgseCwgeCx4LHgsVCwgeCx4LHgseCwgeCx4LHh9LAorCQkgICAge3gseCx4LHgsIHgseCx4LHgsIHgseCx4LHgsIHgseCx4LHgsIHgseCx4LHgsIHgseCx4LHgsIHgseCx4LHgsIHgseCx4LHgsIHgsVCxULFQsIHgseCx4LHgsIHgseCx4LFQsIHgseCx4LHgsIHgseCx4fSwKKwkJICAgIHt4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCBULFQsVCxULCBULFQseCx4LCB4LHgseCx4LCB4LHgseH0sCisJCSAgICB7eCxULHgsVCwgVCx4LHgsVCwgVCxULHgsVCwgVCxULFQsVCwgVCxULFQsVCwgVCxULFQsVCwgVCxULFQsVCwgVCxULHgseCwgVCxULFQsVCwgeCx4LHgseCwgeCx4LHgsVCwgVCx4LFQsVCwgVCx4LHh9LAorCQkgICAge3gsVCx4LHgsIHgseCx4LHgsIHgsVCx4LHgsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULHgsIHgseCx4LHgsIHgseCx4LHgsIHgseCx4LHgsIHgseCx4LHgsIHgseCx4LHgsIHgseCx4LHgsIHgseCx4fSwKKwkJICAgIHt4LHgseCx4LCB4LHgseCx4LCB4LHgsVCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgsVCx4LCBULHgseCx4LCB4LHgseCxULCB4LHgseCx4LCB4LHgseH0sCisJCSAgICB7eCxULHgseCwgeCx4LHgseCwgeCxULHgseCwgVCxULFQsVCwgVCxULFQsVCwgVCxULFQseCwgVCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHgseCwgeCx4LHgsVCwgeCx4LHgseCwgeCx4LHh9LAorCQkgICAge3gsVCx4LFQsIFQseCx4LFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCxULFQsIFQsVCx4LHgsIFQsVCxULFQsIFQseCx4LHgsIHgseCx4LFQsIFQseCxULFQsIFQseCx4fSwKKwkJICAgIHt4LFQseCx4LCB4LHgseCx4LCB4LFQseCx4LCBULFQsVCxULCBULFQsVCxULCBULFQsVCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCB4LHgseCx4LCBULHgseH0KKwkgICAgfTsKKyAgICB9CisKKworICAgIHB1YmxpYyBjbGFzcyBFcnJvcnMKKyAgICB7CisgICAgICAgIHB1YmxpYyBpbnQgbnVtYmVyT2ZFcnJvcnNEZXRlY3RlZCA9IDA7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgZXJyTXNnRm9ybWF0ID0gIkNzc1BhcnNlciBlcnJvcjogbGluZSB7MH0gY29sIHsxfTogezJ9IjsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFN5bnRheEVycm9yKGludCBsaW5lLCBpbnQgY29sLCBpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHM7CisgICAgICAgICAgICBzd2l0Y2ggKG4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiBzID0gIkVPRiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTogcyA9ICJpZGVudGlmaWVyIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiBzID0gIm5ld2xpbmUgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IHMgPSAiZGlnaXQgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6IHMgPSAid2hpdGVzcGFjZSBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTogcyA9ICJcIjwhLS1cIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjogcyA9ICJcIi0tPlwiIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA3OiBzID0gIlwiXCdcIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgODogcyA9ICJcIlwiXCIgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDk6IHMgPSAiXCJ1cmxcIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTA6IHMgPSAiXCIoXCIgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDExOiBzID0gIlwiKVwiIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMjogcyA9ICJcImFsbFwiIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMzogcyA9ICJcImF1cmFsXCIgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE0OiBzID0gIlwiYnJhaWxsZVwiIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxNTogcyA9ICJcImVtYm9zc2VkXCIgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE2OiBzID0gIlwiaGFuZGhlbGRcIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTc6IHMgPSAiXCJwcmludFwiIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxODogcyA9ICJcInByb2plY3Rpb25cIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTk6IHMgPSAiXCJzY3JlZW5cIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjA6IHMgPSAiXCJ0dHlcIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjE6IHMgPSAiXCJ0dlwiIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyMjogcyA9ICJcIm5cIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjM6IHMgPSAiXCJAXCIgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI0OiBzID0gIlwiLVwiIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyNTogcyA9ICJcIixcIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjY6IHMgPSAiXCJ7XCIgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI3OiBzID0gIlwiO1wiIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyODogcyA9ICJcIn1cIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjk6IHMgPSAiXCIrXCIgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMwOiBzID0gIlwiPlwiIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzMTogcyA9ICJcIn5cIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzI6IHMgPSAiXCIqXCIgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMzOiBzID0gIlwiI1wiIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNDogcyA9ICJcIi5cIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzU6IHMgPSAiXCJbXCIgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM2OiBzID0gIlwiPVwiIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNzogcyA9ICJcIn49XCIgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM4OiBzID0gIlwifD1cIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzk6IHMgPSAiXCIkPVwiIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0MDogcyA9ICJcIl49XCIgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQxOiBzID0gIlwiKj1cIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDI6IHMgPSAiXCJdXCIgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQzOiBzID0gIlwiOlwiIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0NDogcyA9ICJcIiFcIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDU6IHMgPSAiXCJpbXBvcnRhbnRcIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDY6IHMgPSAiXCIvXCIgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ3OiBzID0gIlwiVVxcXFxcIiBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDg6IHMgPSAiXCIlXCIgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ5OiBzID0gIj8/PyBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTA6IHMgPSAiaW52YWxpZCBkaXJlY3RpdmUiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUxOiBzID0gImludmFsaWQgUXVvdGVkU3RyaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1MjogcyA9ICJpbnZhbGlkIFVSSSI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTM6IHMgPSAiaW52YWxpZCBtZWRpdW0iOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU0OiBzID0gImludmFsaWQgaWRlbnRpdHkiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU1OiBzID0gImludmFsaWQgc2ltcGxlc2VsZWN0b3IiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU2OiBzID0gImludmFsaWQgYXR0cmliIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1NzogcyA9ICJpbnZhbGlkIHRlcm0iOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU4OiBzID0gImludmFsaWQgdGVybSI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTk6IHMgPSAiaW52YWxpZCB0ZXJtIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2MDogcyA9ICJpbnZhbGlkIHRlcm0iOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDYxOiBzID0gImludmFsaWQgSGV4VmFsdWUiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHMgPSAiZXJyb3IgIiArIG47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGVycm9yU3RyaW5nID0gc3RyaW5nLkZvcm1hdChlcnJNc2dGb3JtYXQsIGxpbmUsIGNvbCwgcyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oZXJyb3JTdHJpbmcpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZW1hbnRpY0Vycm9yKGludCBsaW5lLCBpbnQgY29sLCBzdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVycm9yU3RyaW5nID0gc3RyaW5nLkZvcm1hdChlcnJNc2dGb3JtYXQsIGxpbmUsIGNvbCwgcyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oZXJyb3JTdHJpbmcpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZW1hbnRpY0Vycm9yKHN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24ocyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFdhcm5pbmcoaW50IGxpbmUsIGludCBjb2wsIHN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXJyb3JTdHJpbmcgPSBzdHJpbmcuRm9ybWF0KGVyck1zZ0Zvcm1hdCwgbGluZSwgY29sLCBzKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbihlcnJvclN0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFdhcm5pbmcoc3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbihzKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIGNsYXNzIEZhdGFsRXJyb3IgOiBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBGYXRhbEVycm9yKHN0cmluZyBtKSA6IGJhc2UobSkgeyB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIENzc1Rva2VuCisgICAgeworICAgICAgICBwdWJsaWMgaW50IG1fdG9rZW5LaW5kOworICAgICAgICBwdWJsaWMgaW50IG1fdG9rZW5Qb3NpdGlvbkluQnl0ZXM7CisgICAgICAgIHB1YmxpYyBpbnQgbV90b2tlblBvc2l0aW9uSW5DaGFyYWN0ZXJzOworICAgICAgICBwdWJsaWMgaW50IG1fdG9rZW5Db2x1bW47CisgICAgICAgIHB1YmxpYyBpbnQgbV90b2tlbkxpbmU7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgbV90b2tlblZhbHVlOworICAgICAgICBwdWJsaWMgQ3NzVG9rZW4gbV9uZXh0VG9rZW47CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIENzc0J1ZmZlcgorICAgIHsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBFT0YgPSBjaGFyLk1heFZhbHVlICsgMTsKKyAgICAgICAgY29uc3QgaW50IE1JTl9CVUZGRVJfTEVOR1RIID0gMTAyNDsKKyAgICAgICAgY29uc3QgaW50IE1BWF9CVUZGRVJfTEVOR1RIID0gTUlOX0JVRkZFUl9MRU5HVEggKiA2NDsKKyAgICAgICAgYnl0ZVtdIG1faW5wdXRCdWZmZXI7CisgICAgICAgIGludCBtX2J1ZmZlclN0YXJ0OworICAgICAgICBpbnQgbV9idWZmZXJMZW5ndGg7CisgICAgICAgIGludCBtX2lucHV0U3RyZWFtTGVuZ3RoOworICAgICAgICBpbnQgbV9jdXJyZW50UG9zaXRpb25JbkJ1ZmZlcjsKKyAgICAgICAgU3RyZWFtIG1faW5wdXRTdHJlYW07CisgICAgICAgIGJvb2wgbV9pc1VzZXJTdHJlYW07CisKKyAgICAgICAgcHVibGljIENzc0J1ZmZlcihTdHJlYW0gcywgYm9vbCBpc1VzZXJTdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faW5wdXRTdHJlYW0gPSBzOyB0aGlzLm1faXNVc2VyU3RyZWFtID0gaXNVc2VyU3RyZWFtOworCisgICAgICAgICAgICBpZiAobV9pbnB1dFN0cmVhbS5DYW5TZWVrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1faW5wdXRTdHJlYW1MZW5ndGggPSAoaW50KW1faW5wdXRTdHJlYW0uTGVuZ3RoOworICAgICAgICAgICAgICAgIG1fYnVmZmVyTGVuZ3RoID0gTWF0aC5NaW4obV9pbnB1dFN0cmVhbUxlbmd0aCwgTUFYX0JVRkZFUl9MRU5HVEgpOworICAgICAgICAgICAgICAgIG1fYnVmZmVyU3RhcnQgPSBJbnQzMi5NYXhWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2lucHV0U3RyZWFtTGVuZ3RoID0gbV9idWZmZXJMZW5ndGggPSBtX2J1ZmZlclN0YXJ0ID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbV9pbnB1dEJ1ZmZlciA9IG5ldyBieXRlWyhtX2J1ZmZlckxlbmd0aCA+IDApID8gbV9idWZmZXJMZW5ndGggOiBNSU5fQlVGRkVSX0xFTkdUSF07CisgICAgICAgICAgICBpZiAobV9pbnB1dFN0cmVhbUxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgUG9zID0gMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRQb3NpdGlvbkluQnVmZmVyID0gMDsKKyAgICAgICAgICAgIGlmIChtX2J1ZmZlckxlbmd0aCA9PSBtX2lucHV0U3RyZWFtTGVuZ3RoICYmIG1faW5wdXRTdHJlYW0uQ2FuU2VlaykKKyAgICAgICAgICAgICAgICBDbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIENzc0J1ZmZlcihDc3NCdWZmZXIgYikKKyAgICAgICAgeworICAgICAgICAgICAgbV9pbnB1dEJ1ZmZlciA9IGIubV9pbnB1dEJ1ZmZlcjsKKyAgICAgICAgICAgIG1fYnVmZmVyU3RhcnQgPSBiLm1fYnVmZmVyU3RhcnQ7CisgICAgICAgICAgICBtX2J1ZmZlckxlbmd0aCA9IGIubV9idWZmZXJMZW5ndGg7CisgICAgICAgICAgICBtX2lucHV0U3RyZWFtTGVuZ3RoID0gYi5tX2lucHV0U3RyZWFtTGVuZ3RoOworICAgICAgICAgICAgbV9jdXJyZW50UG9zaXRpb25JbkJ1ZmZlciA9IGIubV9jdXJyZW50UG9zaXRpb25JbkJ1ZmZlcjsKKyAgICAgICAgICAgIG1faW5wdXRTdHJlYW0gPSBiLm1faW5wdXRTdHJlYW07CisgICAgICAgICAgICBiLm1faW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgbV9pc1VzZXJTdHJlYW0gPSBiLm1faXNVc2VyU3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgfkNzc0J1ZmZlcigpIHsgQ2xvc2UoKTsgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFtX2lzVXNlclN0cmVhbSAmJiBtX2lucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9pbnB1dFN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgICAgIG1faW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IFJlYWQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobV9jdXJyZW50UG9zaXRpb25JbkJ1ZmZlciA8IG1fYnVmZmVyTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2lucHV0QnVmZmVyW21fY3VycmVudFBvc2l0aW9uSW5CdWZmZXIrK107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChQb3MgPCBtX2lucHV0U3RyZWFtTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBvcyA9IFBvczsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9pbnB1dEJ1ZmZlclttX2N1cnJlbnRQb3NpdGlvbkluQnVmZmVyKytdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobV9pbnB1dFN0cmVhbSAhPSBudWxsICYmICFtX2lucHV0U3RyZWFtLkNhblNlZWsgJiYgUmVhZE5leHRTdHJlYW1DaHVuaygpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9pbnB1dEJ1ZmZlclttX2N1cnJlbnRQb3NpdGlvbkluQnVmZmVyKytdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFBlZWsoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY3VyUG9zID0gUG9zOworICAgICAgICAgICAgaW50IGNoID0gUmVhZCgpOworICAgICAgICAgICAgUG9zID0gY3VyUG9zOworICAgICAgICAgICAgcmV0dXJuIGNoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBHZXRTdHJpbmcoaW50IGJlZywgaW50IGVuZCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxlbiA9IDA7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbZW5kIC0gYmVnXTsKKyAgICAgICAgICAgIGludCBvbGRQb3MgPSBQb3M7CisgICAgICAgICAgICBQb3MgPSBiZWc7CisgICAgICAgICAgICB3aGlsZSAoUG9zIDwgZW5kKQorICAgICAgICAgICAgICAgIGJ1ZltsZW4rK10gPSAoY2hhcilSZWFkKCk7CisgICAgICAgICAgICBQb3MgPSBvbGRQb3M7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIDAsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFBvcworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbV9jdXJyZW50UG9zaXRpb25JbkJ1ZmZlciArIG1fYnVmZmVyU3RhcnQ7IH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+PSBtX2lucHV0U3RyZWFtTGVuZ3RoICYmIG1faW5wdXRTdHJlYW0gIT0gbnVsbCAmJiAhbV9pbnB1dFN0cmVhbS5DYW5TZWVrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHZhbHVlID49IG1faW5wdXRTdHJlYW1MZW5ndGggJiYgUmVhZE5leHRTdHJlYW1DaHVuaygpID4gMCkgOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiBtX2lucHV0U3RyZWFtTGVuZ3RoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhdGFsRXJyb3IoImJ1ZmZlciBvdXQgb2YgYm91bmRzIGFjY2VzcywgcG9zaXRpb246ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID49IG1fYnVmZmVyU3RhcnQgJiYgdmFsdWUgPCBtX2J1ZmZlclN0YXJ0ICsgbV9idWZmZXJMZW5ndGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRQb3NpdGlvbkluQnVmZmVyID0gdmFsdWUgLSBtX2J1ZmZlclN0YXJ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX2lucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtX2lucHV0U3RyZWFtLlNlZWsodmFsdWUsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgICAgICAgICBtX2J1ZmZlckxlbmd0aCA9IG1faW5wdXRTdHJlYW0uUmVhZChtX2lucHV0QnVmZmVyLCAwLCBtX2lucHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIG1fYnVmZmVyU3RhcnQgPSB2YWx1ZTsgbV9jdXJyZW50UG9zaXRpb25JbkJ1ZmZlciA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1fY3VycmVudFBvc2l0aW9uSW5CdWZmZXIgPSBtX2lucHV0U3RyZWFtTGVuZ3RoIC0gbV9idWZmZXJTdGFydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBSZWFkTmV4dFN0cmVhbUNodW5rKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGZyZWUgPSBtX2lucHV0QnVmZmVyLkxlbmd0aCAtIG1fYnVmZmVyTGVuZ3RoOworICAgICAgICAgICAgaWYgKGZyZWUgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlW10gbmV3QnVmID0gbmV3IGJ5dGVbbV9idWZmZXJMZW5ndGggKiAyXTsKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KG1faW5wdXRCdWZmZXIsIG5ld0J1ZiwgbV9idWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIG1faW5wdXRCdWZmZXIgPSBuZXdCdWY7CisgICAgICAgICAgICAgICAgZnJlZSA9IG1fYnVmZmVyTGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHJlYWQgPSBtX2lucHV0U3RyZWFtLlJlYWQobV9pbnB1dEJ1ZmZlciwgbV9idWZmZXJMZW5ndGgsIGZyZWUpOworICAgICAgICAgICAgaWYgKHJlYWQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1faW5wdXRTdHJlYW1MZW5ndGggPSBtX2J1ZmZlckxlbmd0aCA9IChtX2J1ZmZlckxlbmd0aCArIHJlYWQpOworICAgICAgICAgICAgICAgIHJldHVybiByZWFkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgVVRGOEJ1ZmZlciA6IENzc0J1ZmZlcgorICAgIHsKKyAgICAgICAgcHVibGljIFVURjhCdWZmZXIoQ3NzQnVmZmVyIGIpIDogYmFzZShiKSB7IH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY2g7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoID0gYmFzZS5SZWFkKCk7CisgICAgICAgICAgICB9IHdoaWxlICgoY2ggPj0gMTI4KSAmJiAoKGNoICYgMHhDMCkgIT0gMHhDMCkgJiYgKGNoICE9IEVPRikpOworICAgICAgICAgICAgaWYgKGNoIDwgMTI4IHx8IGNoID09IEVPRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgoY2ggJiAweEYwKSA9PSAweEYwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjMSA9IGNoICYgMHgwNzsKKyAgICAgICAgICAgICAgICBjaCA9IGJhc2UuUmVhZCgpOworICAgICAgICAgICAgICAgIGludCBjMiA9IGNoICYgMHgzRjsKKyAgICAgICAgICAgICAgICBjaCA9IGJhc2UuUmVhZCgpOworICAgICAgICAgICAgICAgIGludCBjMyA9IGNoICYgMHgzRjsKKyAgICAgICAgICAgICAgICBjaCA9IGJhc2UuUmVhZCgpOworICAgICAgICAgICAgICAgIGludCBjNCA9IGNoICYgMHgzRjsKKyAgICAgICAgICAgICAgICBjaCA9ICgoKCgoYzEgPDwgNikgfCBjMikgPDwgNikgfCBjMykgPDwgNikgfCBjNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChjaCAmIDB4RTApID09IDB4RTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGMxID0gY2ggJiAweDBGOworICAgICAgICAgICAgICAgIGNoID0gYmFzZS5SZWFkKCk7CisgICAgICAgICAgICAgICAgaW50IGMyID0gY2ggJiAweDNGOworICAgICAgICAgICAgICAgIGNoID0gYmFzZS5SZWFkKCk7CisgICAgICAgICAgICAgICAgaW50IGMzID0gY2ggJiAweDNGOworICAgICAgICAgICAgICAgIGNoID0gKCgoYzEgPDwgNikgfCBjMikgPDwgNikgfCBjMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChjaCAmIDB4QzApID09IDB4QzApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGMxID0gY2ggJiAweDFGOworICAgICAgICAgICAgICAgIGNoID0gYmFzZS5SZWFkKCk7CisgICAgICAgICAgICAgICAgaW50IGMyID0gY2ggJiAweDNGOworICAgICAgICAgICAgICAgIGNoID0gKGMxIDw8IDYpIHwgYzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgU2Nhbm5lcgorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciBFTkRfT0ZfTElORSA9ICdcbic7CisgICAgICAgIGNvbnN0IGludCBjX2VvZiA9IDA7CisgICAgICAgIGNvbnN0IGludCBjX21heFQgPSA0OTsKKyAgICAgICAgY29uc3QgaW50IGNfbm9TeW0gPSA0OTsKKyAgICAgICAgY29uc3QgaW50IGNfbWF4VG9rZW5MZW5ndGggPSAxMjg7CisKKyAgICAgICAgcHVibGljIENzc0J1ZmZlciBtX3NjYW5uZXJCdWZmZXI7CisKKyAgICAgICAgQ3NzVG9rZW4gbV9jdXJyZW50VG9rZW47CisgICAgICAgIGludCBtX2N1cnJlbnRJbnB1dENoYXJhY3RlcjsKKyAgICAgICAgaW50IG1fY3VycmVudENoYXJhY3RlckJ5dGVQb3NpdGlvbjsKKyAgICAgICAgaW50IG1fdW5pY29kZUNoYXJhY3RlclBvc2l0aW9uOworICAgICAgICBpbnQgbV9jb2x1bW5OdW1iZXJPZkN1cnJlbnRDaGFyYWN0ZXI7CisgICAgICAgIGludCBtX2xpbmVOdW1iZXJPZkN1cnJlbnRDaGFyYWN0ZXI7CisgICAgICAgIGludCBtX2VvbEluQ29tbWVudDsKKyAgICAgICAgc3RhdGljIHJlYWRvbmx5IEhhc2h0YWJsZSBzX3N0YXJ0OworCisgICAgICAgIENzc1Rva2VuIG1fdG9rZW5zQWxyZWFkeVBlZWtlZDsKKyAgICAgICAgQ3NzVG9rZW4gbV9jdXJyZW50UGVla1Rva2VuOworCisgICAgICAgIGNoYXJbXSBtX3RleHRPZkN1cnJlbnRUb2tlbiA9IG5ldyBjaGFyW2NfbWF4VG9rZW5MZW5ndGhdOworICAgICAgICBpbnQgbV9sZW5ndGhPZkN1cnJlbnRUb2tlbjsKKworICAgICAgICBzdGF0aWMgU2Nhbm5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNfc3RhcnQgPSBuZXcgSGFzaHRhYmxlKDEyOCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gNjU7IGkgPD0gODQ7ICsraSkKKyAgICAgICAgICAgICAgICBzX3N0YXJ0W2ldID0gMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSA4NjsgaSA8PSA5MDsgKytpKQorICAgICAgICAgICAgICAgIHNfc3RhcnRbaV0gPSAxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDk1OyBpIDw9IDk1OyArK2kpCisgICAgICAgICAgICAgICAgc19zdGFydFtpXSA9IDE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gOTc7IGkgPD0gMTIyOyArK2kpCisgICAgICAgICAgICAgICAgc19zdGFydFtpXSA9IDE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTA7IGkgPD0gMTA7ICsraSkKKyAgICAgICAgICAgICAgICBzX3N0YXJ0W2ldID0gMjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxMzsgaSA8PSAxMzsgKytpKQorICAgICAgICAgICAgICAgIHNfc3RhcnRbaV0gPSAyOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDQ4OyBpIDw9IDU3OyArK2kpCisgICAgICAgICAgICAgICAgc19zdGFydFtpXSA9IDM7CisgICAgICAgICAgICBmb3IgKGludCBpID0gOTsgaSA8PSA5OyArK2kpCisgICAgICAgICAgICAgICAgc19zdGFydFtpXSA9IDQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTE7IGkgPD0gMTI7ICsraSkKKyAgICAgICAgICAgICAgICBzX3N0YXJ0W2ldID0gNDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAzMjsgaSA8PSAzMjsgKytpKQorICAgICAgICAgICAgICAgIHNfc3RhcnRbaV0gPSA0OworICAgICAgICAgICAgc19zdGFydFs2MF0gPSA1OworICAgICAgICAgICAgc19zdGFydFs0NV0gPSA0MDsKKyAgICAgICAgICAgIHNfc3RhcnRbMzldID0gMTE7CisgICAgICAgICAgICBzX3N0YXJ0WzM0XSA9IDEyOworICAgICAgICAgICAgc19zdGFydFs0MF0gPSAxMzsKKyAgICAgICAgICAgIHNfc3RhcnRbNDFdID0gMTQ7CisgICAgICAgICAgICBzX3N0YXJ0WzY0XSA9IDE1OworICAgICAgICAgICAgc19zdGFydFs0NF0gPSAxNjsKKyAgICAgICAgICAgIHNfc3RhcnRbMTIzXSA9IDE3OworICAgICAgICAgICAgc19zdGFydFs1OV0gPSAxODsKKyAgICAgICAgICAgIHNfc3RhcnRbMTI1XSA9IDE5OworICAgICAgICAgICAgc19zdGFydFs0M10gPSAyMDsKKyAgICAgICAgICAgIHNfc3RhcnRbNjJdID0gMjE7CisgICAgICAgICAgICBzX3N0YXJ0WzEyNl0gPSA0MTsKKyAgICAgICAgICAgIHNfc3RhcnRbNDJdID0gNDI7CisgICAgICAgICAgICBzX3N0YXJ0WzM1XSA9IDIyOworICAgICAgICAgICAgc19zdGFydFs0Nl0gPSAyMzsKKyAgICAgICAgICAgIHNfc3RhcnRbOTFdID0gMjQ7CisgICAgICAgICAgICBzX3N0YXJ0WzYxXSA9IDI1OworICAgICAgICAgICAgc19zdGFydFsxMjRdID0gMjc7CisgICAgICAgICAgICBzX3N0YXJ0WzM2XSA9IDI5OworICAgICAgICAgICAgc19zdGFydFs5NF0gPSAzMTsKKyAgICAgICAgICAgIHNfc3RhcnRbOTNdID0gMzQ7CisgICAgICAgICAgICBzX3N0YXJ0WzU4XSA9IDM1OworICAgICAgICAgICAgc19zdGFydFszM10gPSAzNjsKKyAgICAgICAgICAgIHNfc3RhcnRbNDddID0gMzc7CisgICAgICAgICAgICBzX3N0YXJ0Wzg1XSA9IDQzOworICAgICAgICAgICAgc19zdGFydFszN10gPSAzOTsKKyAgICAgICAgICAgIHNfc3RhcnRbQ3NzQnVmZmVyLkVPRl0gPSAtMTsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNjYW5uZXIoc3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVTdHJlYW0oZmlsZU5hbWUsIEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZCwgRmlsZVNoYXJlLlJlYWQpOworICAgICAgICAgICAgICAgIG1fc2Nhbm5lckJ1ZmZlciA9IG5ldyBDc3NCdWZmZXIoc3RyZWFtLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgSW5pdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXRhbEVycm9yKCJDYW5ub3Qgb3BlbiBmaWxlICIgKyBmaWxlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2Nhbm5lcihTdHJlYW0gcykKKyAgICAgICAgeworICAgICAgICAgICAgbV9zY2FubmVyQnVmZmVyID0gbmV3IENzc0J1ZmZlcihzLCB0cnVlKTsKKyAgICAgICAgICAgIEluaXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgSW5pdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fY3VycmVudENoYXJhY3RlckJ5dGVQb3NpdGlvbiA9IC0xOworICAgICAgICAgICAgbV9saW5lTnVtYmVyT2ZDdXJyZW50Q2hhcmFjdGVyID0gMTsKKyAgICAgICAgICAgIG1fY29sdW1uTnVtYmVyT2ZDdXJyZW50Q2hhcmFjdGVyID0gMDsKKyAgICAgICAgICAgIG1fdW5pY29kZUNoYXJhY3RlclBvc2l0aW9uID0gLTE7CisgICAgICAgICAgICBtX2VvbEluQ29tbWVudCA9IDA7CisgICAgICAgICAgICBOZXh0Q2goKTsKKyAgICAgICAgICAgIGlmIChtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA9PSAweEVGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5leHRDaCgpOworICAgICAgICAgICAgICAgIGludCBjaDEgPSBtX2N1cnJlbnRJbnB1dENoYXJhY3RlcjsKKyAgICAgICAgICAgICAgICBOZXh0Q2goKTsKKyAgICAgICAgICAgICAgICBpbnQgY2gyID0gbV9jdXJyZW50SW5wdXRDaGFyYWN0ZXI7CisgICAgICAgICAgICAgICAgaWYgKGNoMSAhPSAweEJCIHx8IGNoMiAhPSAweEJGKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhdGFsRXJyb3IoU3RyaW5nLkZvcm1hdCgiaWxsZWdhbCBieXRlIG9yZGVyIG1hcms6IEVGIHswLDI6WH0gezEsMjpYfSIsIGNoMSwgY2gyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1fc2Nhbm5lckJ1ZmZlciA9IG5ldyBVVEY4QnVmZmVyKG1fc2Nhbm5lckJ1ZmZlcik7CisgICAgICAgICAgICAgICAgbV9jb2x1bW5OdW1iZXJPZkN1cnJlbnRDaGFyYWN0ZXIgPSAwOworICAgICAgICAgICAgICAgIG1fdW5pY29kZUNoYXJhY3RlclBvc2l0aW9uID0gLTE7CisgICAgICAgICAgICAgICAgTmV4dENoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX2N1cnJlbnRQZWVrVG9rZW4gPSBtX3Rva2Vuc0FscmVhZHlQZWVrZWQgPSBuZXcgQ3NzVG9rZW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgTmV4dENoKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1fZW9sSW5Db21tZW50ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA9IEVORF9PRl9MSU5FOworICAgICAgICAgICAgICAgIG1fZW9sSW5Db21tZW50LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVyQnl0ZVBvc2l0aW9uID0gbV9zY2FubmVyQnVmZmVyLlBvczsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA9IG1fc2Nhbm5lckJ1ZmZlci5SZWFkKCk7CisgICAgICAgICAgICAgICAgbV9jb2x1bW5OdW1iZXJPZkN1cnJlbnRDaGFyYWN0ZXIrKzsKKyAgICAgICAgICAgICAgICBtX3VuaWNvZGVDaGFyYWN0ZXJQb3NpdGlvbisrOworICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA9PSAnXHInICYmIG1fc2Nhbm5lckJ1ZmZlci5QZWVrKCkgIT0gJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPSBFTkRfT0ZfTElORTsKKyAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPT0gRU5EX09GX0xJTkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtX2xpbmVOdW1iZXJPZkN1cnJlbnRDaGFyYWN0ZXIrKzsgbV9jb2x1bW5OdW1iZXJPZkN1cnJlbnRDaGFyYWN0ZXIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBBZGRDaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtX2xlbmd0aE9mQ3VycmVudFRva2VuID49IG1fdGV4dE9mQ3VycmVudFRva2VuLkxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyW10gbmV3QnVmID0gbmV3IGNoYXJbMiAqIG1fdGV4dE9mQ3VycmVudFRva2VuLkxlbmd0aF07CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShtX3RleHRPZkN1cnJlbnRUb2tlbiwgMCwgbmV3QnVmLCAwLCBtX3RleHRPZkN1cnJlbnRUb2tlbi5MZW5ndGgpOworICAgICAgICAgICAgICAgIG1fdGV4dE9mQ3VycmVudFRva2VuID0gbmV3QnVmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1fY3VycmVudElucHV0Q2hhcmFjdGVyICE9IENzc0J1ZmZlci5FT0YpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV90ZXh0T2ZDdXJyZW50VG9rZW5bbV9sZW5ndGhPZkN1cnJlbnRUb2tlbisrXSA9IChjaGFyKW1fY3VycmVudElucHV0Q2hhcmFjdGVyOworICAgICAgICAgICAgICAgIE5leHRDaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbCBDb21tZW50MCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZXZlbCA9IDEsIHBvczAgPSBtX2N1cnJlbnRDaGFyYWN0ZXJCeXRlUG9zaXRpb24sIGxpbmUwID0gbV9saW5lTnVtYmVyT2ZDdXJyZW50Q2hhcmFjdGVyLCBjb2wwID0gbV9jb2x1bW5OdW1iZXJPZkN1cnJlbnRDaGFyYWN0ZXIsIGNoYXJQb3MwID0gbV91bmljb2RlQ2hhcmFjdGVyUG9zaXRpb247CisgICAgICAgICAgICBOZXh0Q2goKTsKKyAgICAgICAgICAgIGlmIChtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA9PSAnKicpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmV4dENoKCk7CisgICAgICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA9PSAnKicpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5leHRDaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudElucHV0Q2hhcmFjdGVyID09ICcvJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lb2xJbkNvbW1lbnQgPSBtX2xpbmVOdW1iZXJPZkN1cnJlbnRDaGFyYWN0ZXIgLSBsaW5lMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dENoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXh0Q2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA9PSBDc3NCdWZmZXIuRU9GKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBOZXh0Q2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9zY2FubmVyQnVmZmVyLlBvcyA9IHBvczA7CisgICAgICAgICAgICAgICAgTmV4dENoKCk7CisgICAgICAgICAgICAgICAgbV9saW5lTnVtYmVyT2ZDdXJyZW50Q2hhcmFjdGVyID0gbGluZTA7CisgICAgICAgICAgICAgICAgbV9jb2x1bW5OdW1iZXJPZkN1cnJlbnRDaGFyYWN0ZXIgPSBjb2wwOworICAgICAgICAgICAgICAgIG1fdW5pY29kZUNoYXJhY3RlclBvc2l0aW9uID0gY2hhclBvczA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworCisgICAgICAgIHZvaWQgQ2hlY2tMaXRlcmFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChtX2N1cnJlbnRUb2tlbi5tX3Rva2VuVmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAidXJsIjoKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50VG9rZW4ubV90b2tlbktpbmQgPSA5OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJhbGwiOgorICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDEyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJhdXJhbCI6CisgICAgICAgICAgICAgICAgICAgIG1fY3VycmVudFRva2VuLm1fdG9rZW5LaW5kID0gMTM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgImJyYWlsbGUiOgorICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDE0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJlbWJvc3NlZCI6CisgICAgICAgICAgICAgICAgICAgIG1fY3VycmVudFRva2VuLm1fdG9rZW5LaW5kID0gMTU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgImhhbmRoZWxkIjoKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50VG9rZW4ubV90b2tlbktpbmQgPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAicHJpbnQiOgorICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDE3OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJwcm9qZWN0aW9uIjoKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50VG9rZW4ubV90b2tlbktpbmQgPSAxODsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAic2NyZWVuIjoKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50VG9rZW4ubV90b2tlbktpbmQgPSAxOTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAidHR5IjoKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50VG9rZW4ubV90b2tlbktpbmQgPSAyMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAidHYiOgorICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDIxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJuIjoKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50VG9rZW4ubV90b2tlbktpbmQgPSAyMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAiaW1wb3J0YW50IjoKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50VG9rZW4ubV90b2tlbktpbmQgPSA0NTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBDc3NUb2tlbiBOZXh0VG9rZW4oKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAobV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPT0gJyAnIHx8IG1fY3VycmVudElucHV0Q2hhcmFjdGVyID09IDEwIHx8IG1fY3VycmVudElucHV0Q2hhcmFjdGVyID09IDEzKQorICAgICAgICAgICAgICAgIE5leHRDaCgpOworICAgICAgICAgICAgaWYgKG1fY3VycmVudElucHV0Q2hhcmFjdGVyID09ICcvJyAmJiBDb21tZW50MCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBOZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGludCByZWNLaW5kID0gY19ub1N5bTsKKyAgICAgICAgICAgIGludCByZWNFbmQgPSBtX2N1cnJlbnRDaGFyYWN0ZXJCeXRlUG9zaXRpb247CisgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbiA9IG5ldyBDc3NUb2tlbigpOworICAgICAgICAgICAgbV9jdXJyZW50VG9rZW4ubV90b2tlblBvc2l0aW9uSW5CeXRlcyA9IG1fY3VycmVudENoYXJhY3RlckJ5dGVQb3NpdGlvbjsKKyAgICAgICAgICAgIG1fY3VycmVudFRva2VuLm1fdG9rZW5Db2x1bW4gPSBtX2NvbHVtbk51bWJlck9mQ3VycmVudENoYXJhY3RlcjsKKyAgICAgICAgICAgIG1fY3VycmVudFRva2VuLm1fdG9rZW5MaW5lID0gbV9saW5lTnVtYmVyT2ZDdXJyZW50Q2hhcmFjdGVyOworICAgICAgICAgICAgbV9jdXJyZW50VG9rZW4ubV90b2tlblBvc2l0aW9uSW5DaGFyYWN0ZXJzID0gbV91bmljb2RlQ2hhcmFjdGVyUG9zaXRpb247CisgICAgICAgICAgICBpbnQgc3RhdGU7CisgICAgICAgICAgICBpZiAoc19zdGFydC5Db250YWluc0tleShtX2N1cnJlbnRJbnB1dENoYXJhY3RlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSAoaW50KXNfc3RhcnRbbV9jdXJyZW50SW5wdXRDaGFyYWN0ZXJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9sZW5ndGhPZkN1cnJlbnRUb2tlbiA9IDA7CisgICAgICAgICAgICBBZGRDaCgpOworCisgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgLTE6IHsKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50VG9rZW4ubV90b2tlbktpbmQgPSBjX2VvZjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY0tpbmQgIT0gY19ub1N5bSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2xlbmd0aE9mQ3VycmVudFRva2VuID0gcmVjRW5kIC0gbV9jdXJyZW50VG9rZW4ubV90b2tlblBvc2l0aW9uSW5CeXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRTY2FubmVyQmVoaW5kVCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50VG9rZW4ubV90b2tlbktpbmQgPSByZWNLaW5kOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHJlY0VuZCA9IG1fY3VycmVudENoYXJhY3RlckJ5dGVQb3NpdGlvbjsgcmVjS2luZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA9PSAnLScgfHwgbV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPj0gJzAnICYmIG1fY3VycmVudElucHV0Q2hhcmFjdGVyIDw9ICc5JyB8fCBtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA+PSAnQScgJiYgbV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPD0gJ1onIHx8IG1fY3VycmVudElucHV0Q2hhcmFjdGVyID09ICdfJyB8fCBtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA+PSAnYScgJiYgbV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPD0gJ3onKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBZGRDaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjYXNlIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDE7IG1fY3VycmVudFRva2VuLm1fdG9rZW5WYWx1ZSA9IG5ldyBTdHJpbmcobV90ZXh0T2ZDdXJyZW50VG9rZW4sIDAsIG1fbGVuZ3RoT2ZDdXJyZW50VG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tMaXRlcmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9jdXJyZW50VG9rZW47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fY3VycmVudFRva2VuLm1fdG9rZW5LaW5kID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50VG9rZW4ubV90b2tlbktpbmQgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA9PSAnIScpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZENoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNhc2UgNjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2FzZSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPT0gJy0nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBZGRDaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjYXNlIDc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNhc2UgMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudElucHV0Q2hhcmFjdGVyID09ICctJykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQWRkQ2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2FzZSA4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjYXNlIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fY3VycmVudFRva2VuLm1fdG9rZW5LaW5kID0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPT0gJz4nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBZGRDaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjYXNlIDEwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjYXNlIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fY3VycmVudFRva2VuLm1fdG9rZW5LaW5kID0gNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50VG9rZW4ubV90b2tlbktpbmQgPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDExOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDIzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDI1OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDI2OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDI3OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDI4OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDI5OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDMwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDMzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDM0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDM1OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDM2OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDM3OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPT0gJz0nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBZGRDaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjYXNlIDI4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjYXNlIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDM4OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPT0gJz0nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBZGRDaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjYXNlIDMwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjYXNlIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDM5OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPT0gJz0nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBZGRDaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjYXNlIDMyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjYXNlIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDQwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDQxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDQyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDM1OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDQzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDM2OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDQ0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDQ2OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDM4OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDQ3OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDM5OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDQ4OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgICByZWNFbmQgPSBtX2N1cnJlbnRDaGFyYWN0ZXJCeXRlUG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIHJlY0tpbmQgPSAyNDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudElucHV0Q2hhcmFjdGVyID09ICctJykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQWRkQ2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2FzZSA5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50VG9rZW4ubV90b2tlbktpbmQgPSAyNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgICAgICAgcmVjRW5kID0gbV9jdXJyZW50Q2hhcmFjdGVyQnl0ZVBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICByZWNLaW5kID0gMzE7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA9PSAnPScpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZENoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNhc2UgMjY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDMxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgICAgICAgICByZWNFbmQgPSBtX2N1cnJlbnRDaGFyYWN0ZXJCeXRlUG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIHJlY0tpbmQgPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudElucHV0Q2hhcmFjdGVyID09ICc9JykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQWRkQ2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2FzZSAzMzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fY3VycmVudFRva2VuLm1fdG9rZW5LaW5kID0gMzI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgNDM6CisgICAgICAgICAgICAgICAgICAgIHJlY0VuZCA9IG1fY3VycmVudENoYXJhY3RlckJ5dGVQb3NpdGlvbjsgcmVjS2luZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA9PSAnLScgfHwgbV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPj0gJzAnICYmIG1fY3VycmVudElucHV0Q2hhcmFjdGVyIDw9ICc5JyB8fCBtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA+PSAnQScgJiYgbV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPD0gJ1onIHx8IG1fY3VycmVudElucHV0Q2hhcmFjdGVyID09ICdfJyB8fCBtX2N1cnJlbnRJbnB1dENoYXJhY3RlciA+PSAnYScgJiYgbV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPD0gJ3onKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBZGRDaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjYXNlIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobV9jdXJyZW50SW5wdXRDaGFyYWN0ZXIgPT0gOTIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZENoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNhc2UgMzg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuS2luZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRUb2tlbi5tX3Rva2VuVmFsdWUgPSBuZXcgU3RyaW5nKG1fdGV4dE9mQ3VycmVudFRva2VuLCAwLCBtX2xlbmd0aE9mQ3VycmVudFRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrTGl0ZXJhbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fY3VycmVudFRva2VuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fY3VycmVudFRva2VuLm1fdG9rZW5WYWx1ZSA9IG5ldyBTdHJpbmcobV90ZXh0T2ZDdXJyZW50VG9rZW4sIDAsIG1fbGVuZ3RoT2ZDdXJyZW50VG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIG1fY3VycmVudFRva2VuOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFNjYW5uZXJCZWhpbmRUKCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9zY2FubmVyQnVmZmVyLlBvcyA9IG1fY3VycmVudFRva2VuLm1fdG9rZW5Qb3NpdGlvbkluQnl0ZXM7CisgICAgICAgICAgICBOZXh0Q2goKTsKKyAgICAgICAgICAgIG1fbGluZU51bWJlck9mQ3VycmVudENoYXJhY3RlciA9IG1fY3VycmVudFRva2VuLm1fdG9rZW5MaW5lOyBtX2NvbHVtbk51bWJlck9mQ3VycmVudENoYXJhY3RlciA9IG1fY3VycmVudFRva2VuLm1fdG9rZW5Db2x1bW47IG1fdW5pY29kZUNoYXJhY3RlclBvc2l0aW9uID0gbV9jdXJyZW50VG9rZW4ubV90b2tlblBvc2l0aW9uSW5DaGFyYWN0ZXJzOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2xlbmd0aE9mQ3VycmVudFRva2VuOyBpKyspIE5leHRDaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENzc1Rva2VuIFNjYW4oKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobV90b2tlbnNBbHJlYWR5UGVla2VkLm1fbmV4dFRva2VuID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5leHRUb2tlbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fY3VycmVudFBlZWtUb2tlbiA9IG1fdG9rZW5zQWxyZWFkeVBlZWtlZCA9IG1fdG9rZW5zQWxyZWFkeVBlZWtlZC5tX25leHRUb2tlbjsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV90b2tlbnNBbHJlYWR5UGVla2VkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENzc1Rva2VuIFBlZWsoKQorICAgICAgICB7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRQZWVrVG9rZW4ubV9uZXh0VG9rZW4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1fY3VycmVudFBlZWtUb2tlbi5tX25leHRUb2tlbiA9IE5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRQZWVrVG9rZW4gPSBtX2N1cnJlbnRQZWVrVG9rZW4ubV9uZXh0VG9rZW47CisgICAgICAgICAgICB9IHdoaWxlIChtX2N1cnJlbnRQZWVrVG9rZW4ubV90b2tlbktpbmQgPiBjX21heFQpOworCisgICAgICAgICAgICByZXR1cm4gbV9jdXJyZW50UGVla1Rva2VuOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgUmVzZXRQZWVrKCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9jdXJyZW50UGVla1Rva2VuID0gbV90b2tlbnNBbHJlYWR5UGVla2VkOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9MaXN0SXRlbVJldHJpZXZlci5jcyBiL09wZW5YbWxQb3dlclRvb2xzL0xpc3RJdGVtUmV0cmlldmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NWIwMmUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9MaXN0SXRlbVJldHJpZXZlci5jcwpAQCAtMCwwICsxLDExOTggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCitWZXJzaW9uOiAyLjcuMDAKKyAqIENvbXBsZXRlIHJlLXdyaXRlIC0gbmV3IGFyY2hpdGVjdHVyZSBlbmFibGVzIG11Y2ggbW9yZSBhY2N1cmF0ZSByZW5kZXJpbmcgb2YgbGlzdCBpdGVtcy4KKworVmVyc2lvbjogMi42LjAzCisgKiBGaXhlZDogRW1wdHkgcGFyYWdyYXBocyB3ZXJlIG5vdCBjb3VudGVkIHByb3Blcmx5CisgKiBGaXhlZDogTnVtYmVyZWQgc3R5bGVzIHdlcmUgbm90IHByb2Nlc3NlZCBwcm9wZXJseSBpZiB0aGV5IGRlcml2ZWQgZnJvbSBhbm90aGVyIHN0eWxlCisgKiBOb3cgaGFzIGEgZGVwZW5kZW5jeSBvbiBGb3JtYXR0aW5nQXNzZW1ibGVyLmNzCisKK1ZlcnNpb246IDIuNi4wMAorICogRW5oYW5jZW1lbnRzIHRvIHN1cHBvcnQgSHRtbENvbnZlcnRlci5jcworCitSZWxldmFudCBTY3JlZW4tQ2FzdHMKKyAqIGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9dzloMVZRM2VSX1EKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgcHVibGljIGNsYXNzIExpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3MKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgRGljdGlvbmFyeTxzdHJpbmcsIEZ1bmM8c3RyaW5nLCBpbnQsIHN0cmluZywgc3RyaW5nPj4gRGVmYXVsdExpc3RJdGVtVGV4dEltcGxlbWVudGF0aW9ucyA9CisgICAgICAgICAgICBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIEZ1bmM8c3RyaW5nLCBpbnQsIHN0cmluZywgc3RyaW5nPj4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsiZnItRlIiLCBMaXN0SXRlbVRleHRHZXR0ZXJfZnJfRlIuR2V0TGlzdEl0ZW1UZXh0fSwKKyAgICAgICAgICAgICAgICB7InRyLVRSIiwgTGlzdEl0ZW1UZXh0R2V0dGVyX3RyX1RSLkdldExpc3RJdGVtVGV4dH0sCisgICAgICAgICAgICAgICAgeyJydS1SVSIsIExpc3RJdGVtVGV4dEdldHRlcl9ydV9SVS5HZXRMaXN0SXRlbVRleHR9LCAKKyAgICAgICAgICAgICAgICB7InN2LVNFIiwgTGlzdEl0ZW1UZXh0R2V0dGVyX3N2X1NFLkdldExpc3RJdGVtVGV4dH0sCisgICAgICAgICAgICAgICAgeyJ6aC1DTiIsIExpc3RJdGVtVGV4dEdldHRlcl96aF9DTi5HZXRMaXN0SXRlbVRleHR9LAorICAgICAgICAgICAgfTsKKyAgICAgICAgcHVibGljIERpY3Rpb25hcnk8c3RyaW5nLCBGdW5jPHN0cmluZywgaW50LCBzdHJpbmcsIHN0cmluZz4+IExpc3RJdGVtVGV4dEltcGxlbWVudGF0aW9uczsKKyAgICAgICAgcHVibGljIExpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3MoKQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0SXRlbVRleHRJbXBsZW1lbnRhdGlvbnMgPSBEZWZhdWx0TGlzdEl0ZW1UZXh0SW1wbGVtZW50YXRpb25zOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIExpc3RJdGVtUmV0cmlldmVyCisgICAgeworICAgICAgICBwdWJsaWMgY2xhc3MgTGlzdEl0ZW1Tb3VyY2VTZXQKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBOdW1JZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bUlkIGZyb20gdGhlIHBhcmFncmFwaCBvciBzdHlsZQorICAgICAgICAgICAgcHVibGljIFhFbGVtZW50IE51bTsgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bSBlbGVtZW50IGZyb20gdGhlIG51bWJlcmluZyBwYXJ0CisgICAgICAgICAgICBwdWJsaWMgaW50IEFic3RyYWN0TnVtSWQ7ICAgICAgICAgICAgICAgICAgLy8gYWJzdHJhY3QgbnVtSWQKKyAgICAgICAgICAgIHB1YmxpYyBYRWxlbWVudCBBYnN0cmFjdE51bTsgICAgICAgICAgICAgICAvLyBhYnN0cmFjdE51bSBlbGVtZW50CisKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0SXRlbVNvdXJjZVNldChYRG9jdW1lbnQgbnVtWERvYywgWERvY3VtZW50IHN0eWxlWERvYywgaW50IG51bUlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE51bUlkID0gbnVtSWQ7CisKKyAgICAgICAgICAgICAgICBOdW0gPSBudW1YRG9jCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLm51bSkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KG4gPT4gKGludCluLkF0dHJpYnV0ZShXLm51bUlkKSA9PSBudW1JZCk7CisKKyAgICAgICAgICAgICAgICBBYnN0cmFjdE51bUlkID0gKGludClOdW0KKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuYWJzdHJhY3ROdW1JZCkKKyAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy52YWwpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgQWJzdHJhY3ROdW0gPSBudW1YRG9jCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmFic3RyYWN0TnVtKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoaW50KWUuQXR0cmlidXRlKFcuYWJzdHJhY3ROdW1JZCkgPT0gQWJzdHJhY3ROdW1JZCkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQ/IFN0YXJ0T3ZlcnJpZGUoaW50IGlsdmwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGx2bE92ZXJyaWRlID0gTnVtCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmx2bE92ZXJyaWRlKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQobmxvID0+IChpbnQpbmxvLkF0dHJpYnV0ZShXLmlsdmwpID09IGlsdmwpOworICAgICAgICAgICAgICAgIGlmIChsdmxPdmVycmlkZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGludD8pbHZsT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0YXJ0T3ZlcnJpZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWEVsZW1lbnQgT3ZlcnJpZGVMdmwoaW50IGlsdmwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGx2bE92ZXJyaWRlID0gTnVtCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmx2bE92ZXJyaWRlKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQobmxvID0+IChpbnQpbmxvLkF0dHJpYnV0ZShXLmlsdmwpID09IGlsdmwpOworICAgICAgICAgICAgICAgIGlmIChsdmxPdmVycmlkZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbHZsT3ZlcnJpZGUuRWxlbWVudChXLmx2bCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYRWxlbWVudCBBYnN0cmFjdEx2bChpbnQgaWx2bCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQWJzdHJhY3ROdW0KKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcubHZsKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoYWwgPT4gKGludClhbC5BdHRyaWJ1dGUoVy5pbHZsKSA9PSBpbHZsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFhFbGVtZW50IEx2bChpbnQgaWx2bCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgb3ZlcnJpZGVMdmwgPSBPdmVycmlkZUx2bChpbHZsKTsKKyAgICAgICAgICAgICAgICBpZiAob3ZlcnJpZGVMdmwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlTHZsOworICAgICAgICAgICAgICAgIHJldHVybiBBYnN0cmFjdEx2bChpbHZsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBMaXN0SXRlbVNvdXJjZQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgTGlzdEl0ZW1Tb3VyY2VTZXQgTWFpbjsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgTnVtU3R5bGVMaW5rTmFtZTsKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0SXRlbVNvdXJjZVNldCBOdW1TdHlsZUxpbms7CisgICAgICAgICAgICBwdWJsaWMgaW50IFN0eWxlX2lsdmw7CisKKyAgICAgICAgICAgIC8vIGZvciBsaXN0IGl0ZW0gc291cmNlcyB0aGF0IHVzZSBudW1TdHlsZUxpbmssIHRoZXJlIGFyZSB0d28gYWJzdHJhY3RJZCB2YWx1ZXMuCisgICAgICAgICAgICAvLyBUaGUgYWJzdHJhY3RJZCB0aGF0IGlzIHVzZSBpcyBpbiBudW0tPmFic3RyYWN0TnVtLT5udW1TdHlsZUxpbmstPnN0eWxlLT5udW0tPmFic3RyYWN0TnVtCisKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0SXRlbVNvdXJjZShYRG9jdW1lbnQgbnVtWERvYywgWERvY3VtZW50IHN0eWxlc1hEb2MsIGludCBudW1JZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNYWluID0gbmV3IExpc3RJdGVtU291cmNlU2V0KG51bVhEb2MsIHN0eWxlc1hEb2MsIG51bUlkKTsKKworICAgICAgICAgICAgICAgIE51bVN0eWxlTGlua05hbWUgPSAoc3RyaW5nKU1haW4KKyAgICAgICAgICAgICAgICAgICAgLkFic3RyYWN0TnVtCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLm51bVN0eWxlTGluaykKKyAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy52YWwpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgaWYgKE51bVN0eWxlTGlua05hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBudW1TdHlsZUxpbmtOdW1JZCA9IChpbnQ/KXN0eWxlc1hEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShzID0+IChzdHJpbmcpcy5BdHRyaWJ1dGUoVy5zdHlsZUlkKSA9PSBOdW1TdHlsZUxpbmtOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucFByKQorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcubnVtUHIpCisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5udW1JZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKFcudmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bVN0eWxlTGlua051bUlkICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBOdW1TdHlsZUxpbmsgPSBuZXcgTGlzdEl0ZW1Tb3VyY2VTZXQobnVtWERvYywgc3R5bGVzWERvYywgKGludCludW1TdHlsZUxpbmtOdW1JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWEVsZW1lbnQgTHZsKGludCBpbHZsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChOdW1TdHlsZUxpbmsgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBsdmwgPSBOdW1TdHlsZUxpbmsuTHZsKGlsdmwpOworICAgICAgICAgICAgICAgICAgICBpZiAobHZsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBpbHZsIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZsID0gTnVtU3R5bGVMaW5rLkx2bChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobHZsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsdmw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciBsdmwyID0gTWFpbi5MdmwoaWx2bCk7CisgICAgICAgICAgICAgICAgaWYgKGx2bDIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBpbHZsIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGx2bDIgPSBNYWluLkx2bChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsdmwyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGx2bDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQ/IFN0YXJ0T3ZlcnJpZGUoaW50IGlsdmwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKE51bVN0eWxlTGluayAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0T3ZlcnJpZGUgPSBOdW1TdHlsZUxpbmsuU3RhcnRPdmVycmlkZShpbHZsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T3ZlcnJpZGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydE92ZXJyaWRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gTWFpbi5TdGFydE92ZXJyaWRlKGlsdmwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IFN0YXJ0KGludCBpbHZsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBsdmwgPSBMdmwoaWx2bCk7CisgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gKGludD8pbHZsLkVsZW1lbnRzKFcuc3RhcnQpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW50KXN0YXJ0OworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IEFic3RyYWN0TnVtSWQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYWluLkFic3RyYWN0TnVtSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIExpc3RJdGVtSW5mbworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBJc0xpc3RJdGVtOworICAgICAgICAgICAgcHVibGljIGJvb2wgSXNaZXJvTnVtSWQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0SXRlbVNvdXJjZSBGcm9tU3R5bGU7CisgICAgICAgICAgICBwdWJsaWMgTGlzdEl0ZW1Tb3VyY2UgRnJvbVBhcmFncmFwaDsKKworICAgICAgICAgICAgcHJpdmF0ZSBpbnQ/IG1BYnN0cmFjdE51bUlkID0gbnVsbDsKKworICAgICAgICAgICAgcHVibGljIGludD8gQWJzdHJhY3ROdW1JZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90ZTogdGhpcyBwcm9wZXJ0eSBkb2VzIG5vdCBnZXQgTnVtU3R5bGVMaW5rQWJzdHJhY3ROdW1JZAorICAgICAgICAgICAgICAgICAgICAvLyBpdCBwcmVzdW1lcyB0aGF0IHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gQWJzdHJhY3ROdW1JZAorICAgICAgICAgICAgICAgICAgICAvLyBob3dldmVyLCBpdCBpcyBlYXN5IGVub3VnaCB0byBjaGFuZ2UgaWYgbmVjZXNzYXJ5CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BYnN0cmFjdE51bUlkICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUFic3RyYWN0TnVtSWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChGcm9tUGFyYWdyYXBoICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBtQWJzdHJhY3ROdW1JZCA9IEZyb21QYXJhZ3JhcGguQWJzdHJhY3ROdW1JZDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoRnJvbVN0eWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBtQWJzdHJhY3ROdW1JZCA9IEZyb21TdHlsZS5BYnN0cmFjdE51bUlkOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUFic3RyYWN0TnVtSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWEVsZW1lbnQgTHZsKGludCBpbHZsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChGcm9tUGFyYWdyYXBoICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbHZsID0gRnJvbVBhcmFncmFwaC5MdmwoaWx2bCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsdmwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGlsdmwgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdmwgPSBGcm9tUGFyYWdyYXBoLkx2bChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobHZsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsdmw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciBsdmwyID0gRnJvbVN0eWxlLkx2bChpbHZsKTsKKyAgICAgICAgICAgICAgICBpZiAobHZsMiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGlsdmwgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbHZsMiA9IEZyb21QYXJhZ3JhcGguTHZsKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGx2bDIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbHZsMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBTdGFydChpbnQgaWx2bCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoRnJvbVBhcmFncmFwaCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRnJvbVBhcmFncmFwaC5TdGFydChpbHZsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRnJvbVN0eWxlLlN0YXJ0KGlsdmwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IFN0YXJ0KGludCBpbHZsLCBib29sIHRha2VPdmVycmlkZSwgb3V0IGJvb2wgaXNPdmVycmlkZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoRnJvbVBhcmFncmFwaCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRha2VPdmVycmlkZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0T3ZlcnJpZGUgPSBGcm9tUGFyYWdyYXBoLlN0YXJ0T3ZlcnJpZGUoaWx2bCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRPdmVycmlkZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3ZlcnJpZGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW50KXN0YXJ0T3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXNPdmVycmlkZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRnJvbVBhcmFncmFwaC5TdGFydChpbHZsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5Gcm9tU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWtlT3ZlcnJpZGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydE92ZXJyaWRlID0gRnJvbVN0eWxlLlN0YXJ0T3ZlcnJpZGUoaWx2bCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRPdmVycmlkZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3ZlcnJpZGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW50KXN0YXJ0T3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXNPdmVycmlkZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRnJvbVN0eWxlLlN0YXJ0KGlsdmwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpc092ZXJyaWRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQ/IFN0YXJ0T3ZlcnJpZGUoaW50IGlsdmwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEZyb21QYXJhZ3JhcGggIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydE92ZXJyaWRlID0gRnJvbVBhcmFncmFwaC5TdGFydE92ZXJyaWRlKGlsdmwpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRPdmVycmlkZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQpc3RhcnRPdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuRnJvbVN0eWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnRPdmVycmlkZSA9IEZyb21TdHlsZS5TdGFydE92ZXJyaWRlKGlsdmwpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRPdmVycmlkZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQpc3RhcnRPdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIGludD8gbU51bUlkOworCisgICAgICAgICAgICBwdWJsaWMgaW50IE51bUlkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobU51bUlkICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGludCltTnVtSWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChGcm9tUGFyYWdyYXBoICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBtTnVtSWQgPSBGcm9tUGFyYWdyYXBoLk1haW4uTnVtSWQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZyb21TdHlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgbU51bUlkID0gRnJvbVN0eWxlLk1haW4uTnVtSWQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW50KW1OdW1JZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0SXRlbUluZm8oKSB7IH0KKworICAgICAgICAgICAgcHVibGljIExpc3RJdGVtSW5mbyhib29sIGlzTGlzdEl0ZW0sIGJvb2wgaXNaZXJvTnVtSWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSXNMaXN0SXRlbSA9IGlzTGlzdEl0ZW07CisgICAgICAgICAgICAgICAgSXNaZXJvTnVtSWQgPSBpc1plcm9OdW1JZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFNldFBhcmFncmFwaExldmVsKFhFbGVtZW50IHBhcmFncmFwaCwgaW50IGlsdmwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwaSA9IHBhcmFncmFwaC5Bbm5vdGF0aW9uPFBhcmFncmFwaEluZm8+KCk7CisgICAgICAgICAgICBpZiAocGkgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaSA9IG5ldyBQYXJhZ3JhcGhJbmZvKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElsdmwgPSBpbHZsLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgcGFyYWdyYXBoLkFkZEFubm90YXRpb24ocGkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IgLSBzaG91bGQgbmV2ZXIgc2V0IGlsdmwgbW9yZSB0aGFuIG9uY2UuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBHZXRQYXJhZ3JhcGhMZXZlbChYRWxlbWVudCBwYXJhZ3JhcGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwaSA9IHBhcmFncmFwaC5Bbm5vdGF0aW9uPFBhcmFncmFwaEluZm8+KCk7CisgICAgICAgICAgICBpZiAocGkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcGkuSWx2bDsKKyAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IgLSBzaG91bGQgbmV2ZXIgYXNrIGZvciBpbHZsIHdpdGhvdXQgaXQgZmlyc3QgYmVpbmcgc2V0LiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0SXRlbUluZm8gR2V0TGlzdEl0ZW1JbmZvKFhEb2N1bWVudCBudW1YRG9jLCBYRG9jdW1lbnQgc3R5bGVzWERvYywgWEVsZW1lbnQgcGFyYWdyYXBoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGlzIGFuIG9wdGltaXphdGlvbiAtIG9ubHkgZGV0ZXJtaW5lIExpc3RJdGVtSW5mbyBvbmNlIGZvciBhCisgICAgICAgICAgICAvLyBwYXJhZ3JhcGguCisgICAgICAgICAgICBMaXN0SXRlbUluZm8gbGlzdEl0ZW1JbmZvID0gcGFyYWdyYXBoLkFubm90YXRpb248TGlzdEl0ZW1JbmZvPigpOworICAgICAgICAgICAgaWYgKGxpc3RJdGVtSW5mbyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBsaXN0SXRlbUluZm87CisgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkF0dGVtcHRpbmcgdG8gcmV0cmlldmUgTGlzdEl0ZW1JbmZvIGJlZm9yZSBpbml0aWFsaXphdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdEl0ZW1JbmZvIE5vdEFMaXN0SXRlbSA9IG5ldyBMaXN0SXRlbUluZm8oZmFsc2UsIHRydWUpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBMaXN0SXRlbUluZm8gWmVyb051bUlkID0gbmV3IExpc3RJdGVtSW5mbyhmYWxzZSwgZmFsc2UpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBJbml0TGlzdEl0ZW1JbmZvKFhEb2N1bWVudCBudW1YRG9jLCBYRG9jdW1lbnQgc3R5bGVzWERvYywgWEVsZW1lbnQgcGFyYWdyYXBoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoRmlyc3RSdW5Jc0VtcHR5U2VjdGlvbkJyZWFrKHBhcmFncmFwaCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyYWdyYXBoLkFkZEFubm90YXRpb24oTm90QUxpc3RJdGVtKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludD8gcGFyYWdyYXBoTnVtSWQgPSBudWxsOworCisgICAgICAgICAgICBYRWxlbWVudCBwYXJhZ3JhcGhOdW1iZXJpbmdQcm9wZXJ0aWVzID0gcGFyYWdyYXBoCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucFByKQorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLm51bVByKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICBpZiAocGFyYWdyYXBoTnVtYmVyaW5nUHJvcGVydGllcyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcmFncmFwaE51bUlkID0gKGludD8pcGFyYWdyYXBoTnVtYmVyaW5nUHJvcGVydGllcworICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5udW1JZCkKKyAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy52YWwpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgLy8gaWYgbnVtUHIgb2YgcGFyYWdyYXBoIGRvZXMgbm90IGNvbnRhaW4gbnVtSWQsIHRoZW4gaXQgaXMgbm90IGEgbGlzdCBpdGVtLgorICAgICAgICAgICAgICAgIC8vIGlmIG51bUlkIG9mIHBhcmFncmFwaCA9PSAwLCB0aGVuIHRoaXMgaXMgbm90IGEgbGlzdCBpdGVtLCByZWdhcmRsZXNzIG9mIHRoZSBtYXJrdXAgaW4gdGhlIHN0eWxlLgorICAgICAgICAgICAgICAgIGlmIChwYXJhZ3JhcGhOdW1JZCA9PSBudWxsIHx8IHBhcmFncmFwaE51bUlkID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGguQWRkQW5ub3RhdGlvbihOb3RBTGlzdEl0ZW0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJpbmcgcGFyYWdyYXBoU3R5bGVOYW1lID0gR2V0UGFyYWdyYXBoU3R5bGVOYW1lKHN0eWxlc1hEb2MsIHBhcmFncmFwaCk7CisKKyAgICAgICAgICAgIHZhciBsaXN0SXRlbUluZm8gPSBHZXRMaXN0SXRlbUluZm9Gcm9tQ2FjaGUobnVtWERvYywgcGFyYWdyYXBoU3R5bGVOYW1lLCBwYXJhZ3JhcGhOdW1JZCk7CisgICAgICAgICAgICBpZiAobGlzdEl0ZW1JbmZvICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyYWdyYXBoLkFkZEFubm90YXRpb24obGlzdEl0ZW1JbmZvKTsKKworICAgICAgICAgICAgICAgIGlmIChsaXN0SXRlbUluZm8uRnJvbVBhcmFncmFwaCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFfaWx2bCA9IChpbnQ/KXBhcmFncmFwaE51bWJlcmluZ1Byb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmlsdmwpCisgICAgICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhX2lsdmwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFfaWx2bCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFic3RyYWN0TnVtID0gbGlzdEl0ZW1JbmZvLkZyb21QYXJhZ3JhcGguTWFpbi5BYnN0cmFjdE51bTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG11bHRpTGV2ZWxUeXBlID0gKHN0cmluZylhYnN0cmFjdE51bS5FbGVtZW50cyhXLm11bHRpTGV2ZWxUeXBlKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlMZXZlbFR5cGUgPT0gInNpbmdsZUxldmVsIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFfaWx2bCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgU2V0UGFyYWdyYXBoTGV2ZWwocGFyYWdyYXBoLCAoaW50KXBhcmFfaWx2bCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxpc3RJdGVtSW5mby5Gcm9tU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB0aGlzX2lsdmwgPSBsaXN0SXRlbUluZm8uRnJvbVN0eWxlLlN0eWxlX2lsdmw7CisgICAgICAgICAgICAgICAgICAgIHZhciBhYnN0cmFjdE51bSA9IGxpc3RJdGVtSW5mby5Gcm9tU3R5bGUuTWFpbi5BYnN0cmFjdE51bTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG11bHRpTGV2ZWxUeXBlID0gKHN0cmluZylhYnN0cmFjdE51bS5FbGVtZW50cyhXLm11bHRpTGV2ZWxUeXBlKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlMZXZlbFR5cGUgPT0gInNpbmdsZUxldmVsIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfaWx2bCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgU2V0UGFyYWdyYXBoTGV2ZWwocGFyYWdyYXBoLCB0aGlzX2lsdmwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxpc3RJdGVtSW5mbyA9IG5ldyBMaXN0SXRlbUluZm8oKTsKKworICAgICAgICAgICAgaW50PyBzdHlsZV9pbHZsID0gbnVsbDsKKyAgICAgICAgICAgIGJvb2w/IHN0eWxlWmVyb051bUlkID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKHBhcmFncmFwaFN0eWxlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3RJdGVtSW5mby5Gcm9tU3R5bGUgPSBJbml0aWFsaXplU3R5bGVMaXN0SXRlbVNvdXJjZShudW1YRG9jLCBzdHlsZXNYRG9jLCBwYXJhZ3JhcGgsIHBhcmFncmFwaFN0eWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCBzdHlsZV9pbHZsLCBvdXQgc3R5bGVaZXJvTnVtSWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQ/IHBhcmFncmFwaF9pbHZsID0gbnVsbDsKKyAgICAgICAgICAgIGJvb2w/IHBhcmFncmFwaFplcm9OdW1JZCA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChwYXJhZ3JhcGhOdW1iZXJpbmdQcm9wZXJ0aWVzICE9IG51bGwgJiYgcGFyYWdyYXBoTnVtYmVyaW5nUHJvcGVydGllcy5FbGVtZW50KFcubnVtSWQpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdEl0ZW1JbmZvLkZyb21QYXJhZ3JhcGggPSBJbml0aWFsaXplUGFyYWdyYXBoTGlzdEl0ZW1Tb3VyY2UobnVtWERvYywgc3R5bGVzWERvYywgcGFyYWdyYXBoLCBwYXJhZ3JhcGhOdW1iZXJpbmdQcm9wZXJ0aWVzLCBvdXQgcGFyYWdyYXBoX2lsdmwsIG91dCBwYXJhZ3JhcGhaZXJvTnVtSWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3R5bGVaZXJvTnVtSWQgPT0gdHJ1ZSAmJiBwYXJhZ3JhcGhaZXJvTnVtSWQgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgIHBhcmFncmFwaFplcm9OdW1JZCA9PSB0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcmFncmFwaC5BZGRBbm5vdGF0aW9uKE5vdEFMaXN0SXRlbSk7CisgICAgICAgICAgICAgICAgQWRkTGlzdEl0ZW1JbmZvSW50b0NhY2hlKG51bVhEb2MsIHBhcmFncmFwaFN0eWxlTmFtZSwgcGFyYWdyYXBoTnVtSWQsIE5vdEFMaXN0SXRlbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgaWx2bFRvU2V0ID0gMDsKKyAgICAgICAgICAgIGlmIChwYXJhZ3JhcGhfaWx2bCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGlsdmxUb1NldCA9IChpbnQpcGFyYWdyYXBoX2lsdmw7CisgICAgICAgICAgICBlbHNlIGlmIChzdHlsZV9pbHZsICE9IG51bGwpCisgICAgICAgICAgICAgICAgaWx2bFRvU2V0ID0gKGludClzdHlsZV9pbHZsOworCisgICAgICAgICAgICBpZiAobGlzdEl0ZW1JbmZvLkZyb21QYXJhZ3JhcGggIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYWJzdHJhY3ROdW0gPSBsaXN0SXRlbUluZm8uRnJvbVBhcmFncmFwaC5NYWluLkFic3RyYWN0TnVtOworICAgICAgICAgICAgICAgIHZhciBtdWx0aUxldmVsVHlwZSA9IChzdHJpbmcpYWJzdHJhY3ROdW0uRWxlbWVudHMoVy5tdWx0aUxldmVsVHlwZSkuQXR0cmlidXRlcyhXLnZhbCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBpZiAobXVsdGlMZXZlbFR5cGUgPT0gInNpbmdsZUxldmVsIikKKyAgICAgICAgICAgICAgICAgICAgaWx2bFRvU2V0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxpc3RJdGVtSW5mby5Gcm9tU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYWJzdHJhY3ROdW0gPSBsaXN0SXRlbUluZm8uRnJvbVN0eWxlLk1haW4uQWJzdHJhY3ROdW07CisgICAgICAgICAgICAgICAgdmFyIG11bHRpTGV2ZWxUeXBlID0gKHN0cmluZylhYnN0cmFjdE51bS5FbGVtZW50cyhXLm11bHRpTGV2ZWxUeXBlKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmIChtdWx0aUxldmVsVHlwZSA9PSAic2luZ2xlTGV2ZWwiKQorICAgICAgICAgICAgICAgICAgICBpbHZsVG9TZXQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTZXRQYXJhZ3JhcGhMZXZlbChwYXJhZ3JhcGgsIGlsdmxUb1NldCk7CisKKyAgICAgICAgICAgIGxpc3RJdGVtSW5mby5Jc0xpc3RJdGVtID0gbGlzdEl0ZW1JbmZvLkZyb21TdHlsZSAhPSBudWxsIHx8IGxpc3RJdGVtSW5mby5Gcm9tUGFyYWdyYXBoICE9IG51bGw7CisgICAgICAgICAgICBwYXJhZ3JhcGguQWRkQW5ub3RhdGlvbihsaXN0SXRlbUluZm8pOworICAgICAgICAgICAgQWRkTGlzdEl0ZW1JbmZvSW50b0NhY2hlKG51bVhEb2MsIHBhcmFncmFwaFN0eWxlTmFtZSwgcGFyYWdyYXBoTnVtSWQsIGxpc3RJdGVtSW5mbyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0UGFyYWdyYXBoU3R5bGVOYW1lKFhEb2N1bWVudCBzdHlsZXNYRG9jLCBYRWxlbWVudCBwYXJhZ3JhcGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYXJhZ3JhcGhTdHlsZU5hbWUgPSAoc3RyaW5nKXBhcmFncmFwaAorICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5wUHIpCisgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnBTdHlsZSkKKyAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy52YWwpCisgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICBpZiAocGFyYWdyYXBoU3R5bGVOYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgcGFyYWdyYXBoU3R5bGVOYW1lID0gR2V0RGVmYXVsdFBhcmFncmFwaFN0eWxlTmFtZShzdHlsZXNYRG9jKTsKKworICAgICAgICAgICAgcmV0dXJuIHBhcmFncmFwaFN0eWxlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgRmlyc3RSdW5Jc0VtcHR5U2VjdGlvbkJyZWFrKFhFbGVtZW50IHBhcmFncmFwaCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZpcnN0UnVuID0gcGFyYWdyYXBoCisgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzVHJpbW1lZChXLnR4YnhDb250ZW50KQorICAgICAgICAgICAgICAgIC5XaGVyZShkID0+IGQuTmFtZSA9PSBXLnIpCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisKKyAgICAgICAgICAgIHZhciBoYXNUZXh0RWxlbWVudCA9IHBhcmFncmFwaAorICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50c1RyaW1tZWQoVy50eGJ4Q29udGVudCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBkLk5hbWUgPT0gVy5yKQorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnQpCisgICAgICAgICAgICAgICAgLkFueSgpOworCisgICAgICAgICAgICBpZiAoZmlyc3RSdW4gPT0gbnVsbCB8fCAhaGFzVGV4dEVsZW1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFncmFwaAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5wUHIpCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnNlY3RQcikKKyAgICAgICAgICAgICAgICAgICAgLkFueSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIExpc3RJdGVtU291cmNlIEluaXRpYWxpemVQYXJhZ3JhcGhMaXN0SXRlbVNvdXJjZShYRG9jdW1lbnQgbnVtWERvYywgWERvY3VtZW50IHN0eWxlc1hEb2MsIFhFbGVtZW50IHBhcmFncmFwaCwgWEVsZW1lbnQgcGFyYWdyYXBoTnVtYmVyaW5nUHJvcGVydGllcywgb3V0IGludD8gaWx2bCwgb3V0IGJvb2w/IHplcm9OdW1JZCkKKyAgICAgICAgeworICAgICAgICAgICAgemVyb051bUlkID0gbnVsbDsKKworICAgICAgICAgICAgLy8gUGFyYWdyYXBoIG51bWJlcmluZyBwcm9wZXJ0aWVzIG11c3QgY29udGFpbiBhIG51bUlkLgorICAgICAgICAgICAgaW50PyBudW1JZCA9IChpbnQ/KXBhcmFncmFwaE51bWJlcmluZ1Byb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5udW1JZCkKKyAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLnZhbCkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKworICAgICAgICAgICAgaWx2bCA9IChpbnQ/KXBhcmFncmFwaE51bWJlcmluZ1Byb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5pbHZsKQorICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKFcudmFsKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICBpZiAobnVtSWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZXJvTnVtSWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbnVtID0gbnVtWERvYworICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcubnVtKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChuID0+IChpbnQpbi5BdHRyaWJ1dGUoVy5udW1JZCkgPT0gbnVtSWQpOworICAgICAgICAgICAgaWYgKG51bSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHplcm9OdW1JZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHplcm9OdW1JZCA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAoaWx2bCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGlsdmwgPSAwOworCisgICAgICAgICAgICBMaXN0SXRlbVNvdXJjZSBsaXN0SXRlbVNvdXJjZSA9IG5ldyBMaXN0SXRlbVNvdXJjZShudW1YRG9jLCBzdHlsZXNYRG9jLCAoaW50KW51bUlkKTsKKworICAgICAgICAgICAgcmV0dXJuIGxpc3RJdGVtU291cmNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdEl0ZW1Tb3VyY2UgSW5pdGlhbGl6ZVN0eWxlTGlzdEl0ZW1Tb3VyY2UoWERvY3VtZW50IG51bVhEb2MsIFhEb2N1bWVudCBzdHlsZXNYRG9jLCBYRWxlbWVudCBwYXJhZ3JhcGgsIHN0cmluZyBwYXJhZ3JhcGhTdHlsZU5hbWUsIAorICAgICAgICAgICAgb3V0IGludD8gaWx2bCwgb3V0IGJvb2w/IHplcm9OdW1JZCkKKyAgICAgICAgeworICAgICAgICAgICAgemVyb051bUlkID0gbnVsbDsKKyAgICAgICAgICAgIFhFbGVtZW50IHBQciA9IEZvcm1hdHRpbmdBc3NlbWJsZXIuUGFyYWdyYXBoU3R5bGVSb2xsdXAocGFyYWdyYXBoLCBzdHlsZXNYRG9jLCBHZXREZWZhdWx0UGFyYWdyYXBoU3R5bGVOYW1lKHN0eWxlc1hEb2MpKTsKKyAgICAgICAgICAgIGlmIChwUHIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBzdHlsZU51bWJlcmluZ1Byb3BlcnRpZXMgPSBwUHIKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcubnVtUHIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgaWYgKHN0eWxlTnVtYmVyaW5nUHJvcGVydGllcyAhPSBudWxsICYmIHN0eWxlTnVtYmVyaW5nUHJvcGVydGllcy5FbGVtZW50KFcubnVtSWQpICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgbnVtSWQgPSAoaW50KXN0eWxlTnVtYmVyaW5nUHJvcGVydGllcworICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcubnVtSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgICAgIGlsdmwgPSAoaW50PylzdHlsZU51bWJlcmluZ1Byb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmlsdmwpCisgICAgICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpbHZsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbHZsID0gMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobnVtSWQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemVyb051bUlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIG51bUlkIGlzIHZhbGlkCisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG51bSA9IG51bVhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5udW0pCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoaW50KWUuQXR0cmlidXRlKFcubnVtSWQpID09IG51bUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvTnVtSWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBMaXN0SXRlbVNvdXJjZSBsaXN0SXRlbVNvdXJjZSA9IG5ldyBMaXN0SXRlbVNvdXJjZShudW1YRG9jLCBzdHlsZXNYRG9jLCBudW1JZCk7CisgICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtU291cmNlLlN0eWxlX2lsdmwgPSAoaW50KWlsdmw7CisKKyAgICAgICAgICAgICAgICAgICAgemVyb051bUlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaXN0SXRlbVNvdXJjZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbHZsID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEdldERlZmF1bHRQYXJhZ3JhcGhTdHlsZU5hbWUoWERvY3VtZW50IHN0eWxlc1hEb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGRlZmF1bHRQYXJhZ3JhcGhTdHlsZTsKKyAgICAgICAgICAgIHN0cmluZyBkZWZhdWx0UGFyYWdyYXBoU3R5bGVOYW1lID0gbnVsbDsKKworICAgICAgICAgICAgU3R5bGVzSW5mbyBzdHlsZXNJbmZvID0gc3R5bGVzWERvYy5Bbm5vdGF0aW9uPFN0eWxlc0luZm8+KCk7CisKKyAgICAgICAgICAgIGlmIChzdHlsZXNJbmZvICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGVmYXVsdFBhcmFncmFwaFN0eWxlTmFtZSA9IHN0eWxlc0luZm8uRGVmYXVsdFBhcmFncmFwaFN0eWxlTmFtZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0UGFyYWdyYXBoU3R5bGUgPSBzdHlsZXNYRG9jCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQocyA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmluZylzLkF0dHJpYnV0ZShXLnR5cGUpICE9ICJwYXJhZ3JhcGgiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0QXR0cmlidXRlID0gcy5BdHRyaWJ1dGUoVy5fZGVmYXVsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNEZWZhdWx0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdEF0dHJpYnV0ZSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJvb2wpcy5BdHRyaWJ1dGUoVy5fZGVmYXVsdCkuVG9Cb29sZWFuKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0RlZmF1bHQ7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGRlZmF1bHRQYXJhZ3JhcGhTdHlsZU5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0UGFyYWdyYXBoU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFBhcmFncmFwaFN0eWxlTmFtZSA9IChzdHJpbmcpZGVmYXVsdFBhcmFncmFwaFN0eWxlLkF0dHJpYnV0ZShXLnN0eWxlSWQpOworICAgICAgICAgICAgICAgIHN0eWxlc0luZm8gPSBuZXcgU3R5bGVzSW5mbygpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZWZhdWx0UGFyYWdyYXBoU3R5bGVOYW1lID0gZGVmYXVsdFBhcmFncmFwaFN0eWxlTmFtZSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHN0eWxlc1hEb2MuQWRkQW5ub3RhdGlvbihzdHlsZXNJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0UGFyYWdyYXBoU3R5bGVOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdEl0ZW1JbmZvIEdldExpc3RJdGVtSW5mb0Zyb21DYWNoZShYRG9jdW1lbnQgbnVtWERvYywgc3RyaW5nIHN0eWxlTmFtZSwgaW50PyBudW1JZCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGtleSA9CisgICAgICAgICAgICAgICAgKHN0eWxlTmFtZSA9PSBudWxsID8gIiIgOiBzdHlsZU5hbWUpICsKKyAgICAgICAgICAgICAgICAifCIgKworICAgICAgICAgICAgICAgIChudW1JZCA9PSBudWxsID8gIiIgOiBudW1JZC5Ub1N0cmluZygpKTsKKworICAgICAgICAgICAgdmFyIG51bVhEb2NSb290ID0gbnVtWERvYy5Sb290OworICAgICAgICAgICAgRGljdGlvbmFyeTxzdHJpbmcsIExpc3RJdGVtSW5mbz4gbGlzdEl0ZW1JbmZvQ2FjaGUgPQorICAgICAgICAgICAgICAgIG51bVhEb2NSb290LkFubm90YXRpb248RGljdGlvbmFyeTxzdHJpbmcsIExpc3RJdGVtSW5mbz4+KCk7CisgICAgICAgICAgICBpZiAobGlzdEl0ZW1JbmZvQ2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0SXRlbUluZm9DYWNoZSA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgTGlzdEl0ZW1JbmZvPigpOworICAgICAgICAgICAgICAgIG51bVhEb2NSb290LkFkZEFubm90YXRpb24obGlzdEl0ZW1JbmZvQ2FjaGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxpc3RJdGVtSW5mb0NhY2hlLkNvbnRhaW5zS2V5KGtleSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RJdGVtSW5mb0NhY2hlW2tleV07CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkTGlzdEl0ZW1JbmZvSW50b0NhY2hlKFhEb2N1bWVudCBudW1YRG9jLCBzdHJpbmcgc3R5bGVOYW1lLCBpbnQ/IG51bUlkLCBMaXN0SXRlbUluZm8gbGlzdEl0ZW1JbmZvKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcga2V5ID0KKyAgICAgICAgICAgICAgICAoc3R5bGVOYW1lID09IG51bGwgPyAiIiA6IHN0eWxlTmFtZSkgKworICAgICAgICAgICAgICAgICJ8IiArCisgICAgICAgICAgICAgICAgKG51bUlkID09IG51bGwgPyAiIiA6IG51bUlkLlRvU3RyaW5nKCkpOworCisgICAgICAgICAgICB2YXIgbnVtWERvY1Jvb3QgPSBudW1YRG9jLlJvb3Q7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PHN0cmluZywgTGlzdEl0ZW1JbmZvPiBsaXN0SXRlbUluZm9DYWNoZSA9CisgICAgICAgICAgICAgICAgbnVtWERvY1Jvb3QuQW5ub3RhdGlvbjxEaWN0aW9uYXJ5PHN0cmluZywgTGlzdEl0ZW1JbmZvPj4oKTsKKyAgICAgICAgICAgIGlmIChsaXN0SXRlbUluZm9DYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3RJdGVtSW5mb0NhY2hlID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBMaXN0SXRlbUluZm8+KCk7CisgICAgICAgICAgICAgICAgbnVtWERvY1Jvb3QuQWRkQW5ub3RhdGlvbihsaXN0SXRlbUluZm9DYWNoZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWxpc3RJdGVtSW5mb0NhY2hlLkNvbnRhaW5zS2V5KGtleSkpCisgICAgICAgICAgICAgICAgbGlzdEl0ZW1JbmZvQ2FjaGUuQWRkKGtleSwgbGlzdEl0ZW1JbmZvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBMZXZlbE51bWJlcnMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludFtdIExldmVsTnVtYmVyc0FycmF5OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBTdHlsZXNJbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRGVmYXVsdFBhcmFncmFwaFN0eWxlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgUGFyYWdyYXBoSW5mbworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IElsdmw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIFJldmVyc2VBeGlzCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBYRWxlbWVudCBQcmV2aW91c1BhcmFncmFwaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFJldHJpZXZlTGlzdEl0ZW0oV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jLCBYRWxlbWVudCBwYXJhZ3JhcGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZXRyaWV2ZUxpc3RJdGVtKHdvcmREb2MsIHBhcmFncmFwaCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBSZXRyaWV2ZUxpc3RJdGVtKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYywgWEVsZW1lbnQgcGFyYWdyYXBoLCBMaXN0SXRlbVJldHJpZXZlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod29yZERvYy5NYWluRG9jdW1lbnRQYXJ0Lk51bWJlcmluZ0RlZmluaXRpb25zUGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICB2YXIgbGlzdEl0ZW1JbmZvID0gcGFyYWdyYXBoLkFubm90YXRpb248TGlzdEl0ZW1JbmZvPigpOworICAgICAgICAgICAgaWYgKGxpc3RJdGVtSW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIEluaXRpYWxpemVMaXN0SXRlbVJldHJpZXZlcih3b3JkRG9jLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgIGxpc3RJdGVtSW5mbyA9IHBhcmFncmFwaC5Bbm5vdGF0aW9uPExpc3RJdGVtSW5mbz4oKTsKKyAgICAgICAgICAgIGlmICghbGlzdEl0ZW1JbmZvLklzTGlzdEl0ZW0pCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHZhciBudW1iZXJpbmdEZWZpbml0aW9uc1BhcnQgPSB3b3JkRG9jCisgICAgICAgICAgICAgICAgLk1haW5Eb2N1bWVudFBhcnQKKyAgICAgICAgICAgICAgICAuTnVtYmVyaW5nRGVmaW5pdGlvbnNQYXJ0OworCisgICAgICAgICAgICBpZiAobnVtYmVyaW5nRGVmaW5pdGlvbnNQYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIFN0eWxlRGVmaW5pdGlvbnNQYXJ0IHN0eWxlRGVmaW5pdGlvbnNQYXJ0ID0gd29yZERvYworICAgICAgICAgICAgICAgIC5NYWluRG9jdW1lbnRQYXJ0CisgICAgICAgICAgICAgICAgLlN0eWxlRGVmaW5pdGlvbnNQYXJ0OworCisgICAgICAgICAgICBpZiAoc3R5bGVEZWZpbml0aW9uc1BhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgdmFyIG51bVhEb2MgPSBudW1iZXJpbmdEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICB2YXIgc3R5bGVzWERvYyA9IHN0eWxlRGVmaW5pdGlvbnNQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICB2YXIgbHZsID0gbGlzdEl0ZW1JbmZvLkx2bChHZXRQYXJhZ3JhcGhMZXZlbChwYXJhZ3JhcGgpKTsKKworICAgICAgICAgICAgc3RyaW5nIGx2bFRleHQgPSAoc3RyaW5nKWx2bC5FbGVtZW50cyhXLmx2bFRleHQpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAobHZsVGV4dCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICB2YXIgbGV2ZWxOdW1iZXJzQW5ub3RhdGlvbiA9IHBhcmFncmFwaC5Bbm5vdGF0aW9uPExldmVsTnVtYmVycz4oKTsKKyAgICAgICAgICAgIGlmIChsZXZlbE51bWJlcnNBbm5vdGF0aW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworCisgICAgICAgICAgICBpbnRbXSBsZXZlbE51bWJlcnMgPSBsZXZlbE51bWJlcnNBbm5vdGF0aW9uLkxldmVsTnVtYmVyc0FycmF5OworICAgICAgICAgICAgc3RyaW5nIGxhbmd1YWdlSWRlbnRpZmllciA9IEdldExhbmd1YWdlSWRlbnRpZmllcihwYXJhZ3JhcGgsIHN0eWxlc1hEb2MpOworICAgICAgICAgICAgc3RyaW5nIGxpc3RJdGVtID0gRm9ybWF0TGlzdEl0ZW0obGlzdEl0ZW1JbmZvLCBsZXZlbE51bWJlcnMsIEdldFBhcmFncmFwaExldmVsKHBhcmFncmFwaCksIAorICAgICAgICAgICAgICAgIGx2bFRleHQsIHN0eWxlc1hEb2MsIGxhbmd1YWdlSWRlbnRpZmllciwgc2V0dGluZ3MpOworICAgICAgICAgICAgcmV0dXJuIGxpc3RJdGVtOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEdldExhbmd1YWdlSWRlbnRpZmllcihYRWxlbWVudCBwYXJhZ3JhcGgsIFhEb2N1bWVudCBzdHlsZXNYRG9jKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbGFuZ3VhZ2VUeXBlID0gKHN0cmluZylwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNUcmltbWVkKFcudHhieENvbnRlbnQpCisgICAgICAgICAgICAgICAgLldoZXJlKGQgPT4gZC5OYW1lID09IFcucikKKyAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhQdE9wZW5YbWwuTGFuZ3VhZ2VUeXBlKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICBzdHJpbmcgbGFuZ3VhZ2VJZGVudGlmaWVyID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKGxhbmd1YWdlVHlwZSA9PSBudWxsIHx8IGxhbmd1YWdlVHlwZSA9PSAid2VzdGVybiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2VJZGVudGlmaWVyID0gKHN0cmluZylwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucikKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuclByKQorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5sYW5nKQorICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLnZhbCkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAobGFuZ3VhZ2VJZGVudGlmaWVyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlSWRlbnRpZmllciA9IChzdHJpbmcpc3R5bGVzWERvYworICAgICAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmRvY0RlZmF1bHRzKQorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuclByRGVmYXVsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnJQcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmxhbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGFuZ3VhZ2VUeXBlID09ICJlYXN0QXNpYSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2VJZGVudGlmaWVyID0gKHN0cmluZylwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucikKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuclByKQorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5sYW5nKQorICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLmVhc3RBc2lhKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKworICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZUlkZW50aWZpZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VJZGVudGlmaWVyID0gKHN0cmluZylzdHlsZXNYRG9jCisgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuZG9jRGVmYXVsdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5yUHJEZWZhdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuclByKQorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcubGFuZykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKFcuZWFzdEFzaWEpCisgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxhbmd1YWdlVHlwZSA9PSAiYmlkaSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2VJZGVudGlmaWVyID0gKHN0cmluZylwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucikKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuclByKQorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5sYW5nKQorICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLmJpZGkpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgaWYgKGxhbmd1YWdlSWRlbnRpZmllciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZUlkZW50aWZpZXIgPSAoc3RyaW5nKXN0eWxlc1hEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5kb2NEZWZhdWx0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnJQckRlZmF1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5yUHIpCisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5sYW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy5iaWRpKQorICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKGxhbmd1YWdlSWRlbnRpZmllciA9PSBudWxsKQorICAgICAgICAgICAgICAgIGxhbmd1YWdlSWRlbnRpZmllciA9ICJlbi1VUyI7CisgICAgICAgICAgICByZXR1cm4gbGFuZ3VhZ2VJZGVudGlmaWVyOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBJbml0aWFsaXplTGlzdEl0ZW1SZXRyaWV2ZXIoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jLCBMaXN0SXRlbVJldHJpZXZlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFydCBpbiB3b3JkRG9jLkNvbnRlbnRQYXJ0cygpKQorICAgICAgICAgICAgICAgIEluaXRpYWxpemVMaXN0SXRlbVJldHJpZXZlckZvclBhcnQod29yZERvYywgcGFydCwgc2V0dGluZ3MpOworCisjaWYgZmFsc2UKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYXJ0IGluIHdvcmREb2MuQ29udGVudFBhcnRzKCkpCisJICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHhEb2MgPSBwYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIHZhciBwYXJhcyA9IHhEb2MKKyAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKFcucCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKHAgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHAuQW5ub3RhdGlvbjxMaXN0SXRlbUluZm8+KCkgPT0gbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFzLkFueSgpKQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3IiKTsKKwkgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBJbml0aWFsaXplTGlzdEl0ZW1SZXRyaWV2ZXJGb3JQYXJ0KFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYywgT3BlblhtbFBhcnQgcGFydCwgTGlzdEl0ZW1SZXRyaWV2ZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG1haW5YRG9jID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIG51bVBhcnQgPSB3b3JkRG9jLk1haW5Eb2N1bWVudFBhcnQuTnVtYmVyaW5nRGVmaW5pdGlvbnNQYXJ0OworICAgICAgICAgICAgaWYgKG51bVBhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB2YXIgbnVtWERvYyA9IG51bVBhcnQuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIHZhciBzdHlsZXNQYXJ0ID0gd29yZERvYy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0OworICAgICAgICAgICAgaWYgKHN0eWxlc1BhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB2YXIgc3R5bGVzWERvYyA9IHN0eWxlc1BhcnQuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIHZhciByb290Tm9kZSA9IG1haW5YRG9jLlJvb3Q7CisKKyAgICAgICAgICAgIEluaXRpYWxpemVMaXN0SXRlbVJldHJpZXZlckZvclN0b3J5KG51bVhEb2MsIHN0eWxlc1hEb2MsIHJvb3ROb2RlKTsKKworICAgICAgICAgICAgdmFyIHRleHRCb3hlcyA9IG1haW5YRG9jCisgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoVy50eGJ4Q29udGVudCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0ZXh0Qm94IGluIHRleHRCb3hlcykKKyAgICAgICAgICAgICAgICBJbml0aWFsaXplTGlzdEl0ZW1SZXRyaWV2ZXJGb3JTdG9yeShudW1YRG9jLCBzdHlsZXNYRG9jLCB0ZXh0Qm94KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZUxpc3RJdGVtUmV0cmlldmVyRm9yU3RvcnkoWERvY3VtZW50IG51bVhEb2MsIFhEb2N1bWVudCBzdHlsZXNYRG9jLCBYRWxlbWVudCByb290Tm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhcmFncmFwaHMgPSByb290Tm9kZQorICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50c1RyaW1tZWQoVy50eGJ4Q29udGVudCkKKyAgICAgICAgICAgICAgICAuV2hlcmUocCA9PiBwLk5hbWUgPT0gVy5wKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcmFncmFwaCBpbiBwYXJhZ3JhcGhzKQorICAgICAgICAgICAgICAgIEluaXRMaXN0SXRlbUluZm8obnVtWERvYywgc3R5bGVzWERvYywgcGFyYWdyYXBoKTsKKworICAgICAgICAgICAgdmFyIGFic3RyYWN0TnVtSWRzID0gcGFyYWdyYXBocworICAgICAgICAgICAgICAgIC5TZWxlY3QocGFyYWdyYXBoID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMaXN0SXRlbUluZm8gbGlzdEl0ZW1JbmZvID0gcGFyYWdyYXBoLkFubm90YXRpb248TGlzdEl0ZW1JbmZvPigpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWxpc3RJdGVtSW5mby5Jc0xpc3RJdGVtKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQ/KW51bGw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaXN0SXRlbUluZm8uQWJzdHJhY3ROdW1JZDsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5XaGVyZShhID0+IGEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAuRGlzdGluY3QoKQorICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKworICAgICAgICAgICAgLy8gd2hlbiBkZWJ1Z2dpbmcsIGl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8gY2F1c2UgcHJvY2Vzc2luZyBvZiBhIHNwZWNpZmljIGFic3RyYWN0TnVtSWQgZmlyc3QuCisgICAgICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGNvZGUgZW5hYmxlcyB0aGlzLgorICAgICAgICAgICAgLy9pbnQ/IGFic3RyYWN0SWRUb1Byb2Nlc3NGaXJzdCA9IG51bGw7CisgICAgICAgICAgICAvL2lmIChhYnN0cmFjdElkVG9Qcm9jZXNzRmlyc3QgIT0gbnVsbCkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgYWJzdHJhY3ROdW1JZHMgPSAobmV3W10geyBhYnN0cmFjdElkVG9Qcm9jZXNzRmlyc3QgfSkKKyAgICAgICAgICAgIC8vICAgICAgICAuQ29uY2F0KGFic3RyYWN0TnVtSWRzLldoZXJlKGFuaSA9PiBhbmkgIT0gYWJzdHJhY3RJZFRvUHJvY2Vzc0ZpcnN0KSkKKyAgICAgICAgICAgIC8vICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAvL30KKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFic3RyYWN0TnVtSWQgaW4gYWJzdHJhY3ROdW1JZHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGxpc3RJdGVtcyA9IHBhcmFncmFwaHMKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKHBhcmFncmFwaCA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdEl0ZW1JbmZvID0gcGFyYWdyYXBoLkFubm90YXRpb248TGlzdEl0ZW1JbmZvPigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0SXRlbUluZm8uSXNMaXN0SXRlbSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGlzdEl0ZW1JbmZvLkFic3RyYWN0TnVtSWQgPT0gYWJzdHJhY3ROdW1JZDsKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICAgICAgLy8gYW5ub3RhdGUgcGFyYWdyYXBocyB3aXRoIHByZXZpb3VzIHBhcmFncmFwaHMgc28gdGhhdCB3ZSBjYW4gbG9vayBiYWNrd2FyZHMgd2l0aCBnb29kIHBlcmYKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBwcmV2UGFyYWdyYXBoID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFyYWdyYXBoIGluIGxpc3RJdGVtcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJldmVyc2VBeGlzIHJldmVyc2UgPSBuZXcgUmV2ZXJzZUF4aXMoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmV2aW91c1BhcmFncmFwaCA9IHByZXZQYXJhZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaC5BZGRBbm5vdGF0aW9uKHJldmVyc2UpOworICAgICAgICAgICAgICAgICAgICBwcmV2UGFyYWdyYXBoID0gcGFyYWdyYXBoOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBzdGFydE92ZXJyaWRlQWxyZWFkeVVzZWQgPSBuZXcgTGlzdDxpbnQ+KCk7CisgICAgICAgICAgICAgICAgTGlzdDxpbnQ+IHByZXZpb3VzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBMaXN0SXRlbUluZm9bXSBsaXN0SXRlbUluZm9JbkVmZmVjdEZvclN0YXJ0T3ZlcnJpZGUgPSBuZXcgTGlzdEl0ZW1JbmZvW10geworICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcmFncmFwaCBpbiBsaXN0SXRlbXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdEl0ZW1JbmZvID0gcGFyYWdyYXBoLkFubm90YXRpb248TGlzdEl0ZW1JbmZvPigpOworICAgICAgICAgICAgICAgICAgICB2YXIgaWx2bCA9IEdldFBhcmFncmFwaExldmVsKHBhcmFncmFwaCk7CisgICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtSW5mb0luRWZmZWN0Rm9yU3RhcnRPdmVycmlkZVtpbHZsXSA9IGxpc3RJdGVtSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgTGlzdEl0ZW1JbmZvIGxpc3RJdGVtSW5mb0luRWZmZWN0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlsdmwgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW1JbmZvSW5FZmZlY3QgPSBsaXN0SXRlbUluZm9JbkVmZmVjdEZvclN0YXJ0T3ZlcnJpZGVbaWx2bCAtIDFdOworICAgICAgICAgICAgICAgICAgICB2YXIgbGV2ZWxOdW1iZXJzID0gbmV3IExpc3Q8aW50PigpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGxldmVsID0gMDsgbGV2ZWwgPD0gaWx2bDsgbGV2ZWwrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG51bUlkID0gbGlzdEl0ZW1JbmZvLk51bUlkOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0T3ZlcnJpZGUgPSBsaXN0SXRlbUluZm8uU3RhcnRPdmVycmlkZShsZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ/IGluRWZmZWN0U3RhcnRPdmVycmlkZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW1JbmZvSW5FZmZlY3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkVmZmVjdFN0YXJ0T3ZlcnJpZGUgPSBsaXN0SXRlbUluZm9JbkVmZmVjdC5TdGFydE92ZXJyaWRlKGxldmVsKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID09IGlsdmwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGx2bCA9IGxpc3RJdGVtSW5mby5MdmwoaWx2bCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGx2bFJlc3RhcnQgPSAoaW50PylsdmwuRWxlbWVudHMoVy5sdmxSZXN0YXJ0KS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsdmxSZXN0YXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNQYXJhID0gUHJldmlvdXNQYXJhZ3JhcGhzRm9yTHZsUmVzdGFydChwYXJhZ3JhcGgsIChpbnQpbHZsUmVzdGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChwID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBsdmwgPSBHZXRQYXJhZ3JhcGhMZXZlbChwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGx2bCA9PSBpbHZsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1BhcmEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gcHJldmlvdXNQYXJhLkFubm90YXRpb248TGV2ZWxOdW1iZXJzPigpLkxldmVsTnVtYmVyc0FycmF5LlRvTGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA+PSBwcmV2aW91cy5Db3VudCgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldmVsID09IGlsdmwgJiYgc3RhcnRPdmVycmlkZSAhPSBudWxsICYmICFzdGFydE92ZXJyaWRlQWxyZWFkeVVzZWQuQ29udGFpbnMobnVtSWQpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMgPT0gbnVsbCB8fCBsZXZlbCA+PSBwcmV2aW91cy5Db3VudCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gbGlzdEl0ZW1JbmZvLlN0YXJ0KGxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBsb29rIGF0IHN0YXJ0T3ZlcnJpZGUgaWYgdGhlIGxldmVsIHRoYXQgd2UncmUgZXhhbWluaW5nIGlzIHNhbWUgYXMgdGhlIHBhcmFncmFwaCdzIGxldmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gaWx2bCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T3ZlcnJpZGUgIT0gbnVsbCAmJiAhc3RhcnRPdmVycmlkZUFscmVhZHlVc2VkLkNvbnRhaW5zKG51bUlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE92ZXJyaWRlQWxyZWFkeVVzZWQuQWRkKG51bUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IChpbnQpc3RhcnRPdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRPdmVycmlkZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IChpbnQpc3RhcnRPdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5FZmZlY3RTdGFydE92ZXJyaWRlICE9IG51bGwgJiYgaW5FZmZlY3RTdGFydE92ZXJyaWRlID4gc3RhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gKGludClpbkVmZmVjdFN0YXJ0T3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxOdW1iZXJzLkFkZChzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IGxpc3RJdGVtSW5mby5TdGFydChsZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgbG9vayBhdCBzdGFydE92ZXJyaWRlIGlmIHRoZSBsZXZlbCB0aGF0IHdlJ3JlIGV4YW1pbmluZyBpcyBzYW1lIGFzIHRoZSBwYXJhZ3JhcGgncyBsZXZlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID09IGlsdmwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydE92ZXJyaWRlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFydE92ZXJyaWRlQWxyZWFkeVVzZWQuQ29udGFpbnMobnVtSWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPdmVycmlkZUFscmVhZHlVc2VkLkFkZChudW1JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gKGludClzdGFydE92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbE51bWJlcnMuQWRkKHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50PyB0aGlzTnVtYmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gaWx2bCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydE92ZXJyaWRlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhcnRPdmVycmlkZUFscmVhZHlVc2VkLkNvbnRhaW5zKG51bUlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE92ZXJyaWRlQWxyZWFkeVVzZWQuQWRkKG51bUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzTnVtYmVyID0gKGludClzdGFydE92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc051bWJlciA9IHByZXZpb3VzLkVsZW1lbnRBdChsZXZlbCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc051bWJlciA9IHByZXZpb3VzLkVsZW1lbnRBdChsZXZlbCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNOdW1iZXIgPSBwcmV2aW91cy5FbGVtZW50QXQobGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbE51bWJlcnMuQWRkKChpbnQpdGhpc051bWJlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFyIGxldmVsTnVtYmVyc0Fubm8gPSBuZXcgTGV2ZWxOdW1iZXJzKCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWxOdW1iZXJzQXJyYXkgPSBsZXZlbE51bWJlcnMuVG9BcnJheSgpCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaC5BZGRBbm5vdGF0aW9uKGxldmVsTnVtYmVyc0Fubm8pOworICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGxldmVsTnVtYmVyczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBJRW51bWVyYWJsZTxYRWxlbWVudD4gUHJldmlvdXNQYXJhZ3JhcGhzRm9yTHZsUmVzdGFydChYRWxlbWVudCBwYXJhZ3JhcGgsIGludCBpbHZsKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY3VycmVudCA9IHBhcmFncmFwaDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByYSA9IGN1cnJlbnQuQW5ub3RhdGlvbjxSZXZlcnNlQXhpcz4oKTsKKyAgICAgICAgICAgICAgICBpZiAocmEgPT0gbnVsbCB8fCByYS5QcmV2aW91c1BhcmFncmFwaCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCBicmVhazsKKyAgICAgICAgICAgICAgICB2YXIgcmFMdmwgPSBHZXRQYXJhZ3JhcGhMZXZlbChyYS5QcmV2aW91c1BhcmFncmFwaCk7CisgICAgICAgICAgICAgICAgaWYgKHJhTHZsIDwgaWx2bCkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgYnJlYWs7CisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIHJhLlByZXZpb3VzUGFyYWdyYXBoOworICAgICAgICAgICAgICAgIGN1cnJlbnQgPSByYS5QcmV2aW91c1BhcmFncmFwaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBGb3JtYXRMaXN0SXRlbShMaXN0SXRlbUluZm8gbGlpLCBpbnRbXSBsZXZlbE51bWJlcnMsIGludCBpbHZsLAorICAgICAgICAgICAgc3RyaW5nIGx2bFRleHQsIFhEb2N1bWVudCBzdHlsZXMsIHN0cmluZyBsYW5ndWFnZUN1bHR1cmVOYW1lLCBMaXN0SXRlbVJldHJpZXZlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmdbXSBmb3JtYXRUb2tlbnMgPSBHZXRGb3JtYXRUb2tlbnMobHZsVGV4dCkuVG9BcnJheSgpOworICAgICAgICAgICAgWEVsZW1lbnQgbHZsID0gbGlpLkx2bChpbHZsKTsKKyAgICAgICAgICAgIGJvb2wgaXNMZ2wgPSBsdmwuRWxlbWVudHMoVy5pc0xnbCkuQW55KCk7CisgICAgICAgICAgICBzdHJpbmcgbGlzdEl0ZW0gPSBmb3JtYXRUb2tlbnMuU2VsZWN0KCh0LCBsKSA9PgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0LlN1YnN0cmluZygwLCAxKSAhPSAiJSIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICAgICAgICAgIGludCBpbmRlbnRhdGlvbkxldmVsOworICAgICAgICAgICAgICAgIGlmICghSW50MzIuVHJ5UGFyc2UodC5TdWJzdHJpbmcoMSksIG91dCBpbmRlbnRhdGlvbkxldmVsKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgICAgICAgICAgaW5kZW50YXRpb25MZXZlbCAtPSAxOworICAgICAgICAgICAgICAgIGlmIChpbmRlbnRhdGlvbkxldmVsID49IGxldmVsTnVtYmVycy5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIGluZGVudGF0aW9uTGV2ZWwgPSBsZXZlbE51bWJlcnMuTGVuZ3RoIC0gMTsKKyAgICAgICAgICAgICAgICBpbnQgbGV2ZWxOdW1iZXIgPSBsZXZlbE51bWJlcnNbaW5kZW50YXRpb25MZXZlbF07CisgICAgICAgICAgICAgICAgc3RyaW5nIGxldmVsVGV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgcmx2bCA9IGxpaS5MdmwoaW5kZW50YXRpb25MZXZlbCk7CisgICAgICAgICAgICAgICAgc3RyaW5nIG51bUZtdEZvckxldmVsID0gKHN0cmluZylybHZsLkVsZW1lbnRzKFcubnVtRm10KS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmIChudW1GbXRGb3JMZXZlbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG51bUZtdEVsZW1lbnQgPSBybHZsLkVsZW1lbnRzKE1DLkFsdGVybmF0ZUNvbnRlbnQpLkVsZW1lbnRzKE1DLkNob2ljZSkuRWxlbWVudHMoVy5udW1GbXQpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1GbXRFbGVtZW50ICE9IG51bGwgJiYgKHN0cmluZyludW1GbXRFbGVtZW50LkF0dHJpYnV0ZShXLnZhbCkgPT0gImN1c3RvbSIpCisgICAgICAgICAgICAgICAgICAgICAgICBudW1GbXRGb3JMZXZlbCA9IChzdHJpbmcpbnVtRm10RWxlbWVudC5BdHRyaWJ1dGUoVy5mb3JtYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnVtRm10Rm9yTGV2ZWwgIT0gIm5vbmUiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTGdsICYmIG51bUZtdEZvckxldmVsICE9ICJkZWNpbWFsWmVybyIpCisgICAgICAgICAgICAgICAgICAgICAgICBudW1GbXRGb3JMZXZlbCA9ICJkZWNpbWFsIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxhbmd1YWdlQ3VsdHVyZU5hbWUgIT0gbnVsbCAmJiBzZXR0aW5ncyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLkxpc3RJdGVtVGV4dEltcGxlbWVudGF0aW9ucy5Db250YWluc0tleShsYW5ndWFnZUN1bHR1cmVOYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGltcGwgPSBzZXR0aW5ncy5MaXN0SXRlbVRleHRJbXBsZW1lbnRhdGlvbnNbbGFuZ3VhZ2VDdWx0dXJlTmFtZV07CisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRleHQgPSBpbXBsKGxhbmd1YWdlQ3VsdHVyZU5hbWUsIGxldmVsTnVtYmVyLCBudW1GbXRGb3JMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxldmVsVGV4dCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBsZXZlbFRleHQgPSBMaXN0SXRlbVRleHRHZXR0ZXJfRGVmYXVsdC5HZXRMaXN0SXRlbVRleHQobGFuZ3VhZ2VDdWx0dXJlTmFtZSwgbGV2ZWxOdW1iZXIsIG51bUZtdEZvckxldmVsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWxUZXh0OworICAgICAgICAgICAgfSkuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKyAgICAgICAgICAgIHJldHVybiBsaXN0SXRlbTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIElFbnVtZXJhYmxlPHN0cmluZz4gR2V0Rm9ybWF0VG9rZW5zKHN0cmluZyBsdmxUZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA+PSBsdmxUZXh0Lkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKGx2bFRleHRbaV0gPT0gJyUnICYmIGkgPD0gbHZsVGV4dC5MZW5ndGggLSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIGx2bFRleHQuU3Vic3RyaW5nKGksIDIpOworICAgICAgICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgcGVyY2VudEluZGV4ID0gbHZsVGV4dC5JbmRleE9mKCclJywgaSk7CisgICAgICAgICAgICAgICAgaWYgKHBlcmNlbnRJbmRleCA9PSAtMSB8fCBwZXJjZW50SW5kZXggPiBsdmxUZXh0Lkxlbmd0aCAtIDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gbHZsVGV4dC5TdWJzdHJpbmcoaSk7CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gbHZsVGV4dC5TdWJzdHJpbmcoaSwgcGVyY2VudEluZGV4IC0gaSk7CisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIGx2bFRleHQuU3Vic3RyaW5nKHBlcmNlbnRJbmRleCwgMik7CisgICAgICAgICAgICAgICAgaSA9IHBlcmNlbnRJbmRleCArIDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzL01hcmt1cFNpbXBsaWZpZXIuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9NYXJrdXBTaW1wbGlmaWVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NjQ0YzEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9NYXJrdXBTaW1wbGlmaWVyLmNzCkBAIC0wLDAgKzEsNzA5IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworVmVyc2lvbjogMi42LjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3MuQ29kZUFuYWx5c2lzOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBTeXN0ZW0uWG1sLlNjaGVtYTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgcGFydGlhbCBjbGFzcyBXbWxEb2N1bWVudAorICAgIHsKKyAgICAgICAgcHVibGljIFdtbERvY3VtZW50IFNpbXBsaWZ5TWFya3VwKFNpbXBsaWZ5TWFya3VwU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNYXJrdXBTaW1wbGlmaWVyLlNpbXBsaWZ5TWFya3VwKHRoaXMsIHNldHRpbmdzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBTaW1wbGlmeU1hcmt1cFNldHRpbmdzCisgICAgeworICAgICAgICBwdWJsaWMgYm9vbCBBY2NlcHRSZXZpc2lvbnM7CisgICAgICAgIHB1YmxpYyBib29sIE5vcm1hbGl6ZVhtbDsKKyAgICAgICAgcHVibGljIGJvb2wgUmVtb3ZlQm9va21hcmtzOworICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmVDb21tZW50czsKKyAgICAgICAgcHVibGljIGJvb2wgUmVtb3ZlQ29udGVudENvbnRyb2xzOworICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmVFbmRBbmRGb290Tm90ZXM7CisgICAgICAgIHB1YmxpYyBib29sIFJlbW92ZUZpZWxkQ29kZXM7CisgICAgICAgIHB1YmxpYyBib29sIFJlbW92ZUdvQmFja0Jvb2ttYXJrOworICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmVIeXBlcmxpbmtzOworICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmVMYXN0UmVuZGVyZWRQYWdlQnJlYWs7CisgICAgICAgIHB1YmxpYyBib29sIFJlbW92ZU1hcmt1cEZvckRvY3VtZW50Q29tcGFyaXNvbjsKKyAgICAgICAgcHVibGljIGJvb2wgUmVtb3ZlUGVybWlzc2lvbnM7CisgICAgICAgIHB1YmxpYyBib29sIFJlbW92ZVByb29mOworICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmVSc2lkSW5mbzsKKyAgICAgICAgcHVibGljIGJvb2wgUmVtb3ZlU21hcnRUYWdzOworICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmVTb2Z0SHlwaGVuczsKKyAgICAgICAgcHVibGljIGJvb2wgUmVtb3ZlV2ViSGlkZGVuOworICAgICAgICBwdWJsaWMgYm9vbCBSZXBsYWNlVGFic1dpdGhTcGFjZXM7CisgICAgfQorCisgICAgW1N1cHByZXNzTWVzc2FnZSgiUmVTaGFycGVyIiwgIkluY29uc2lzdGVudE5hbWluZyIpXQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFya3VwU2ltcGxpZmllcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBXbWxEb2N1bWVudCBTaW1wbGlmeU1hcmt1cChXbWxEb2N1bWVudCBkb2MsIFNpbXBsaWZ5TWFya3VwU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtRG9jID0gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudChkb2MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvY3VtZW50ID0gc3RyZWFtRG9jLkdldFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgU2ltcGxpZnlNYXJrdXAoZG9jdW1lbnQsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtRG9jLkdldE1vZGlmaWVkV21sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBTaW1wbGlmeU1hcmt1cChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYywgU2ltcGxpZnlNYXJrdXBTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNldHRpbmdzLlJlbW92ZU1hcmt1cEZvckRvY3VtZW50Q29tcGFyaXNvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5SZW1vdmVSc2lkSW5mbyA9IHRydWU7CisgICAgICAgICAgICAgICAgUmVtb3ZlRWxlbWVudHNGb3JEb2N1bWVudENvbXBhcmlzb24oZG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXR0aW5ncy5SZW1vdmVSc2lkSW5mbykKKyAgICAgICAgICAgICAgICBSZW1vdmVSc2lkSW5mb0luU2V0dGluZ3MoZG9jKTsKKyAgICAgICAgICAgIGlmIChzZXR0aW5ncy5BY2NlcHRSZXZpc2lvbnMpCisgICAgICAgICAgICAgICAgUmV2aXNpb25BY2NlcHRlci5BY2NlcHRSZXZpc2lvbnMoZG9jKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKE9wZW5YbWxQYXJ0IHBhcnQgaW4gZG9jLkNvbnRlbnRQYXJ0cygpKQorICAgICAgICAgICAgICAgIFNpbXBsaWZ5TWFya3VwRm9yUGFydChwYXJ0LCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgIGlmIChkb2MuTWFpbkRvY3VtZW50UGFydC5TdHlsZURlZmluaXRpb25zUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgIFNpbXBsaWZ5TWFya3VwRm9yUGFydChkb2MuTWFpbkRvY3VtZW50UGFydC5TdHlsZURlZmluaXRpb25zUGFydCwgc2V0dGluZ3MpOworICAgICAgICAgICAgaWYgKGRvYy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlc1dpdGhFZmZlY3RzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgIFNpbXBsaWZ5TWFya3VwRm9yUGFydChkb2MuTWFpbkRvY3VtZW50UGFydC5TdHlsZXNXaXRoRWZmZWN0c1BhcnQsIHNldHRpbmdzKTsKKworICAgICAgICAgICAgaWYgKHNldHRpbmdzLlJlbW92ZUNvbW1lbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0IGNvbW1lbnRzUGFydCA9IGRvYy5NYWluRG9jdW1lbnRQYXJ0LldvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0OworICAgICAgICAgICAgICAgIGlmIChjb21tZW50c1BhcnQgIT0gbnVsbCkgZG9jLk1haW5Eb2N1bWVudFBhcnQuRGVsZXRlUGFydChjb21tZW50c1BhcnQpOworCisgICAgICAgICAgICAgICAgV29yZHByb2Nlc3NpbmdDb21tZW50c0V4UGFydCBjb21tZW50c0V4UGFydCA9IGRvYy5NYWluRG9jdW1lbnRQYXJ0LldvcmRwcm9jZXNzaW5nQ29tbWVudHNFeFBhcnQ7CisgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRzRXhQYXJ0ICE9IG51bGwpIGRvYy5NYWluRG9jdW1lbnRQYXJ0LkRlbGV0ZVBhcnQoY29tbWVudHNFeFBhcnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZW1vdmVSc2lkSW5mb0luU2V0dGluZ3MoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIERvY3VtZW50U2V0dGluZ3NQYXJ0IHBhcnQgPSBkb2MuTWFpbkRvY3VtZW50UGFydC5Eb2N1bWVudFNldHRpbmdzUGFydDsKKyAgICAgICAgICAgIGlmIChwYXJ0ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgWERvY3VtZW50IHNldHRpbmdzWERvYyA9IHBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBzZXR0aW5nc1hEb2MuRGVzY2VuZGFudHMoVy5yc2lkcykuUmVtb3ZlKCk7CisgICAgICAgICAgICBwYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZW1vdmVFbGVtZW50c0ZvckRvY3VtZW50Q29tcGFyaXNvbihXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYykKKyAgICAgICAgeworICAgICAgICAgICAgT3BlblhtbFBhcnQgcGFydCA9IGRvYy5FeHRlbmRlZEZpbGVQcm9wZXJ0aWVzUGFydDsKKyAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IGFwcFByb3BzWERvYyA9IHBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgYXBwUHJvcHNYRG9jLkRlc2NlbmRhbnRzKEVQLlRvdGFsVGltZSkuUmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgcGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFydCA9IGRvYy5Db3JlRmlsZVByb3BlcnRpZXNQYXJ0OworICAgICAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRG9jdW1lbnQgY29yZVByb3BzWERvYyA9IHBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgY29yZVByb3BzWERvYy5EZXNjZW5kYW50cyhDUC5yZXZpc2lvbikuUmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgY29yZVByb3BzWERvYy5EZXNjZW5kYW50cyhEQ1RFUk1TLmNyZWF0ZWQpLlJlbW92ZSgpOworICAgICAgICAgICAgICAgIGNvcmVQcm9wc1hEb2MuRGVzY2VuZGFudHMoRENURVJNUy5tb2RpZmllZCkuUmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgcGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgWERvY3VtZW50IG1haW5YRG9jID0gZG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBib29rbWFya1N0YXJ0ID0gbWFpblhEb2MKKyAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoVy5ib29rbWFya1N0YXJ0KQorICAgICAgICAgICAgICAgIC5XaGVyZShiID0+IChzdHJpbmcpIGIuQXR0cmlidXRlKFcubmFtZSkgPT0gIl9Hb0JhY2siKQorICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGl0ZW0gaW4gYm9va21hcmtTdGFydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gYm9va21hcmtFbmQgPSBtYWluWERvYworICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoVy5ib29rbWFya0VuZCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGJlID0+IChpbnQpIGJlLkF0dHJpYnV0ZShXLmlkKSA9PSAoaW50KSBpdGVtLkF0dHJpYnV0ZShXLmlkKSk7CisgICAgICAgICAgICAgICAgYm9va21hcmtFbmQuUmVtb3ZlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2ttYXJrU3RhcnQuUmVtb3ZlKCk7CisgICAgICAgICAgICBkb2MuTWFpbkRvY3VtZW50UGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWEVsZW1lbnQgTWVyZ2VBZGphY2VudFN1cGVyZmx1b3VzUnVucyhYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKFhFbGVtZW50KSBNZXJnZUFkamFjZW50UnVuc1RyYW5zZm9ybShlbGVtZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWEVsZW1lbnQgVHJhbnNmb3JtRWxlbWVudFRvU2luZ2xlQ2hhcmFjdGVyUnVucyhYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKFhFbGVtZW50KSBTaW5nbGVDaGFyYWN0ZXJSdW5UcmFuc2Zvcm0oZWxlbWVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVHJhbnNmb3JtUGFydFRvU2luZ2xlQ2hhcmFjdGVyUnVucyhPcGVuWG1sUGFydCBwYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBZnRlciB0cmFuc2Zvcm1pbmcgdG8gc2luZ2xlIGNoYXJhY3RlciBydW5zLCBSc2lkIGluZm8gd2lsbCBiZSBpbnZhbGlkLCBzbworICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gdGhlIHBhcnQuCisgICAgICAgICAgICBYRG9jdW1lbnQgeERvYyA9IHBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICB2YXIgbmV3Um9vdCA9IChYRWxlbWVudCkgUmVtb3ZlUnNpZFRyYW5zZm9ybSh4RG9jLlJvb3QpOworICAgICAgICAgICAgbmV3Um9vdCA9IChYRWxlbWVudCkgU2luZ2xlQ2hhcmFjdGVyUnVuVHJhbnNmb3JtKG5ld1Jvb3QpOworICAgICAgICAgICAgeERvYy5FbGVtZW50cygpLkZpcnN0KCkuUmVwbGFjZVdpdGgobmV3Um9vdCk7CisgICAgICAgICAgICBwYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFRyYW5zZm9ybVRvU2luZ2xlQ2hhcmFjdGVyUnVucyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFJldmlzaW9uQWNjZXB0ZXIuSGFzVHJhY2tlZFJldmlzaW9ucyhkb2MpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlRyYW5zZm9ybWluZyBhIGRvY3VtZW50IHRvIHNpbmdsZSBjaGFyYWN0ZXIgcnVucyBpcyBub3Qgc3VwcG9ydGVkIGZvciAiICsKKyAgICAgICAgICAgICAgICAgICAgImEgZG9jdW1lbnQgd2l0aCB0cmFja2VkIHJldmlzaW9ucy4iKTsKKworICAgICAgICAgICAgZm9yZWFjaCAoT3BlblhtbFBhcnQgcGFydCBpbiBkb2MuQ29udGVudFBhcnRzKCkpCisgICAgICAgICAgICAgICAgVHJhbnNmb3JtUGFydFRvU2luZ2xlQ2hhcmFjdGVyUnVucyhwYXJ0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBSZW1vdmVDdXN0b21YbWxBbmRDb250ZW50Q29udHJvbHNUcmFuc2Zvcm0oCisgICAgICAgICAgICBYTm9kZSBub2RlLCBTaW1wbGlmeU1hcmt1cFNldHRpbmdzIHNpbXBsaWZ5TWFya3VwU2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2ltcGxpZnlNYXJrdXBTZXR0aW5ncy5SZW1vdmVTbWFydFRhZ3MgJiYKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lID09IFcuc21hcnRUYWcpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChlID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlQ3VzdG9tWG1sQW5kQ29udGVudENvbnRyb2xzVHJhbnNmb3JtKGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsaWZ5TWFya3VwU2V0dGluZ3MpKTsKKworICAgICAgICAgICAgICAgIGlmIChzaW1wbGlmeU1hcmt1cFNldHRpbmdzLlJlbW92ZUNvbnRlbnRDb250cm9scyAmJgorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgPT0gVy5zZHQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zZHRDb250ZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZUN1c3RvbVhtbEFuZENvbnRlbnRDb250cm9sc1RyYW5zZm9ybShlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGlmeU1hcmt1cFNldHRpbmdzKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBSZW1vdmVDdXN0b21YbWxBbmRDb250ZW50Q29udHJvbHNUcmFuc2Zvcm0obiwgc2ltcGxpZnlNYXJrdXBTZXR0aW5ncykpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgUmVtb3ZlUnNpZFRyYW5zZm9ybShYTm9kZSBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm4gbm9kZTsKKworICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnJzaWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoYSA9PiAoYS5OYW1lICE9IFcucnNpZCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEuTmFtZSAhPSBXLnJzaWREZWwpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhLk5hbWUgIT0gVy5yc2lkUCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEuTmFtZSAhPSBXLnJzaWRSKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYS5OYW1lICE9IFcucnNpZFJEZWZhdWx0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYS5OYW1lICE9IFcucnNpZFJQcikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEuTmFtZSAhPSBXLnJzaWRTZWN0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYS5OYW1lICE9IFcucnNpZFRyKSksCisgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFJlbW92ZVJzaWRUcmFuc2Zvcm0obikpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBNZXJnZUFkamFjZW50UnVuc1RyYW5zZm9ybShYTm9kZSBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm4gbm9kZTsKKworICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnApCisgICAgICAgICAgICAgICAgcmV0dXJuIFdvcmRwcm9jZXNzaW5nTUxVdGlsLkNvYWxlc2NlQWRqYWNlbnRSdW5zV2l0aElkZW50aWNhbEZvcm1hdHRpbmcoZWxlbWVudCk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBNZXJnZUFkamFjZW50UnVuc1RyYW5zZm9ybShuKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFJlbW92ZUVtcHR5UnVuc0FuZFJ1blByb3BlcnRpZXNUcmFuc2Zvcm0oCisgICAgICAgICAgICBYTm9kZSBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKGVsZW1lbnQuTmFtZSA9PSBXLnIpIHx8IChlbGVtZW50Lk5hbWUgPT0gVy5yUHIpIHx8IChlbGVtZW50Lk5hbWUgPT0gVy5wUHIpKSAmJgorICAgICAgICAgICAgICAgICAgICAhZWxlbWVudC5FbGVtZW50cygpLkFueSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFJlbW92ZUVtcHR5UnVuc0FuZFJ1blByb3BlcnRpZXNUcmFuc2Zvcm0obikpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgTWVyZ2VBZGphY2VudEluc3RyVGV4dCgKKyAgICAgICAgICAgIFhOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChlbGVtZW50Lk5hbWUgPT0gVy5yKSAmJiBlbGVtZW50LkVsZW1lbnRzKFcuaW5zdHJUZXh0KS5BbnkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlPElHcm91cGluZzxib29sLCBYRWxlbWVudD4+IGdyb3VwZWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cygpLkdyb3VwQWRqYWNlbnQoZSA9PiBlLk5hbWUgPT0gVy5pbnN0clRleHQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWQuU2VsZWN0KGcgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZy5LZXkgPT0gZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqZWN0KSBnOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgLmRvYyBmaWxlcyBhcmUgY29udmVydGVkIHRvIC5kb2N4IGJ5IHRoZSBCaW5hcnkgdG8gT3BlbiBYTUwgVHJhbnNsYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdzppbnN0clRleHQgZWxlbWVudHMgbWlnaHQgYmUgZW1wdHksIGluIHdoaWNoIGNhc2UgbmV3SW5zdHJUZXh0IHdvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgYW4gZW1wdHkgc3RyaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuZXdJbnN0clRleHQgPSBnLlNlbGVjdChpID0+IChzdHJpbmcpIGkpLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KG5ld0luc3RyVGV4dCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5pbnN0clRleHQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLmluc3RyVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ld0luc3RyVGV4dFswXSA9PSAnICcpIHx8IChuZXdJbnN0clRleHRbbmV3SW5zdHJUZXh0Lkxlbmd0aCAtIDFdID09ICcgJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWwgKyAic3BhY2UiLCAicHJlc2VydmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbnN0clRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IE1lcmdlQWRqYWNlbnRJbnN0clRleHQobikpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBsYXN0UmVuZGVyZWRQYWdlQnJlYWssIHBlcm1FbmQsIHBlcm1TdGFydCwgcHJvb2ZFcnIsIG5vUHJvb2YKKyAgICAgICAgLy8gc29mdEh5cGhlbjoKKyAgICAgICAgLy8gUmVtb3ZlIHdoZW4gc2ltcGxpZnlpbmcuCisKKyAgICAgICAgLy8gZmxkU2ltcGxlLCBmbGREYXRhLCBmbGRDaGFyLCBpbnN0clRleHQ6CisgICAgICAgIC8vIEZvciBoeXBlcmxpbmtzLCBnZW5lcmF0ZSBzYW1lIGluIFhIdG1sLiAgT3RoZXIgdGhhbiBoeXBlcmxpbmtzLCBkbyB0aGUgZm9sbG93aW5nOgorICAgICAgICAvLyAtIGNvbGxhcHNlIGZsZFNpbXBsZQorICAgICAgICAvLyAtIHJlbW92ZSBmbGRTaW1wbGUsIGZsZERhdGEsIGZsZENoYXIsIGluc3RyVGV4dC4KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgU2ltcGxpZnlNYXJrdXBUcmFuc2Zvcm0oCisgICAgICAgICAgICBYTm9kZSBub2RlLAorICAgICAgICAgICAgU2ltcGxpZnlNYXJrdXBTZXR0aW5ncyBzZXR0aW5ncywKKyAgICAgICAgICAgIFNpbXBsaWZ5TWFya3VwUGFyYW1ldGVycyBwYXJhbWV0ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm4gbm9kZTsKKworICAgICAgICAgICAgaWYgKHNldHRpbmdzLlJlbW92ZVBlcm1pc3Npb25zICYmCisgICAgICAgICAgICAgICAgKChlbGVtZW50Lk5hbWUgPT0gVy5wZXJtRW5kKSB8fAorICAgICAgICAgICAgICAgICAoZWxlbWVudC5OYW1lID09IFcucGVybVN0YXJ0KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGlmIChzZXR0aW5ncy5SZW1vdmVQcm9vZiAmJgorICAgICAgICAgICAgICAgICgoZWxlbWVudC5OYW1lID09IFcucHJvb2ZFcnIpIHx8CisgICAgICAgICAgICAgICAgIChlbGVtZW50Lk5hbWUgPT0gVy5ub1Byb29mKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGlmIChzZXR0aW5ncy5SZW1vdmVTb2Z0SHlwaGVucyAmJgorICAgICAgICAgICAgICAgIChlbGVtZW50Lk5hbWUgPT0gVy5zb2Z0SHlwaGVuKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgaWYgKHNldHRpbmdzLlJlbW92ZUxhc3RSZW5kZXJlZFBhZ2VCcmVhayAmJgorICAgICAgICAgICAgICAgIChlbGVtZW50Lk5hbWUgPT0gVy5sYXN0UmVuZGVyZWRQYWdlQnJlYWspKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBpZiAoc2V0dGluZ3MuUmVtb3ZlQm9va21hcmtzICYmCisgICAgICAgICAgICAgICAgKChlbGVtZW50Lk5hbWUgPT0gVy5ib29rbWFya1N0YXJ0KSB8fAorICAgICAgICAgICAgICAgICAoZWxlbWVudC5OYW1lID09IFcuYm9va21hcmtFbmQpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgaWYgKHNldHRpbmdzLlJlbW92ZUdvQmFja0Jvb2ttYXJrICYmCisgICAgICAgICAgICAgICAgKCgoZWxlbWVudC5OYW1lID09IFcuYm9va21hcmtTdGFydCkgJiYgKChpbnQpIGVsZW1lbnQuQXR0cmlidXRlKFcuaWQpID09IHBhcmFtZXRlcnMuR29CYWNrSWQpKSB8fAorICAgICAgICAgICAgICAgICAoKGVsZW1lbnQuTmFtZSA9PSBXLmJvb2ttYXJrRW5kKSAmJiAoKGludCkgZWxlbWVudC5BdHRyaWJ1dGUoVy5pZCkgPT0gcGFyYW1ldGVycy5Hb0JhY2tJZCkpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgaWYgKHNldHRpbmdzLlJlbW92ZVdlYkhpZGRlbiAmJgorICAgICAgICAgICAgICAgIChlbGVtZW50Lk5hbWUgPT0gVy53ZWJIaWRkZW4pKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBpZiAoc2V0dGluZ3MuUmVwbGFjZVRhYnNXaXRoU3BhY2VzICYmCisgICAgICAgICAgICAgICAgKGVsZW1lbnQuTmFtZSA9PSBXLnRhYikgJiYgCisgICAgICAgICAgICAgICAgKGVsZW1lbnQuUGFyZW50ICE9IG51bGwgJiYgZWxlbWVudC5QYXJlbnQuTmFtZSA9PSBXLnIpKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy50LCBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbCArICJzcGFjZSIsICJwcmVzZXJ2ZSIpLCAiICIpOworCisgICAgICAgICAgICBpZiAoc2V0dGluZ3MuUmVtb3ZlQ29tbWVudHMgJiYKKyAgICAgICAgICAgICAgICAoKGVsZW1lbnQuTmFtZSA9PSBXLmNvbW1lbnRSYW5nZVN0YXJ0KSB8fAorICAgICAgICAgICAgICAgICAoZWxlbWVudC5OYW1lID09IFcuY29tbWVudFJhbmdlRW5kKSB8fAorICAgICAgICAgICAgICAgICAoZWxlbWVudC5OYW1lID09IFcuY29tbWVudFJlZmVyZW5jZSkgfHwKKyAgICAgICAgICAgICAgICAgKGVsZW1lbnQuTmFtZSA9PSBXLmFubm90YXRpb25SZWYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgaWYgKHNldHRpbmdzLlJlbW92ZUNvbW1lbnRzICYmCisgICAgICAgICAgICAgICAgKGVsZW1lbnQuTmFtZSA9PSBXLnJTdHlsZSkgJiYKKyAgICAgICAgICAgICAgICAoZWxlbWVudC5BdHRyaWJ1dGUoVy52YWwpLlZhbHVlID09ICJDb21tZW50UmVmZXJlbmNlIikpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGlmIChzZXR0aW5ncy5SZW1vdmVFbmRBbmRGb290Tm90ZXMgJiYKKyAgICAgICAgICAgICAgICAoKGVsZW1lbnQuTmFtZSA9PSBXLmVuZG5vdGVSZWZlcmVuY2UpIHx8CisgICAgICAgICAgICAgICAgIChlbGVtZW50Lk5hbWUgPT0gVy5mb290bm90ZVJlZmVyZW5jZSkpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBpZiAoc2V0dGluZ3MuUmVtb3ZlRmllbGRDb2RlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuZmxkU2ltcGxlKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5FbGVtZW50cygpLlNlbGVjdChlID0+IFNpbXBsaWZ5TWFya3VwVHJhbnNmb3JtKGUsIHNldHRpbmdzLCBwYXJhbWV0ZXJzKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoKGVsZW1lbnQuTmFtZSA9PSBXLmZsZERhdGEpIHx8CisgICAgICAgICAgICAgICAgICAgIChlbGVtZW50Lk5hbWUgPT0gVy5mbGRDaGFyKSB8fAorICAgICAgICAgICAgICAgICAgICAoZWxlbWVudC5OYW1lID09IFcuaW5zdHJUZXh0KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzZXR0aW5ncy5SZW1vdmVIeXBlcmxpbmtzICYmCisgICAgICAgICAgICAgICAgKGVsZW1lbnQuTmFtZSA9PSBXLmh5cGVybGluaykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuRWxlbWVudHMoKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFNpbXBsaWZ5TWFya3VwVHJhbnNmb3JtKG4sIHNldHRpbmdzLCBwYXJhbWV0ZXJzKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWERvY3VtZW50IE5vcm1hbGl6ZShYRG9jdW1lbnQgc291cmNlLCBYbWxTY2hlbWFTZXQgc2NoZW1hKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaGF2ZVBzdmkgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gdmFsaWRhdGUsIHRocm93IGVycm9ycywgYWRkIFBTVkkgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UuVmFsaWRhdGUoc2NoZW1hLCBudWxsLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBoYXZlUHN2aSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFhEb2N1bWVudCgKKyAgICAgICAgICAgICAgICBzb3VyY2UuRGVjbGFyYXRpb24sCisgICAgICAgICAgICAgICAgc291cmNlLk5vZGVzKCkuU2VsZWN0KG4gPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBjb21tZW50cywgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIGFuZCB0ZXh0IG5vZGVzIHRoYXQgYXJlCisgICAgICAgICAgICAgICAgICAgIC8vIGNoaWxkcmVuIG9mIFhEb2N1bWVudC4gIE9ubHkgd2hpdGUgc3BhY2UgdGV4dCBub2RlcyBhcmUgYWxsb3dlZCBhcworICAgICAgICAgICAgICAgICAgICAvLyBjaGlsZHJlbiBvZiBhIGRvY3VtZW50LCBzbyB3ZSBjYW4gcmVtb3ZlIGFsbCB0ZXh0IG5vZGVzLgorICAgICAgICAgICAgICAgICAgICBpZiAobiBpcyBYQ29tbWVudCB8fCBuIGlzIFhQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gfHwgbiBpcyBYVGV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbiBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgIT0gbnVsbCA/IE5vcm1hbGl6ZUVsZW1lbnQoZSwgaGF2ZVBzdmkpIDogbjsKKyAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBDaGVjayB3aGV0aGVyIHRoaXMgY2FuIGJlIHJlbW92ZWQuCisgICAgICAgIC8vcHJpdmF0ZSBzdGF0aWMgYm9vbCBEZWVwRXF1YWxzV2l0aE5vcm1hbGl6YXRpb24oWERvY3VtZW50IGRvYzEsIFhEb2N1bWVudCBkb2MyLCBYbWxTY2hlbWFTZXQgc2NoZW1hU2V0KQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgWERvY3VtZW50IGQxID0gTm9ybWFsaXplKGRvYzEsIHNjaGVtYVNldCk7CisgICAgICAgIC8vICAgIFhEb2N1bWVudCBkMiA9IE5vcm1hbGl6ZShkb2MyLCBzY2hlbWFTZXQpOworICAgICAgICAvLyAgICByZXR1cm4gWE5vZGUuRGVlcEVxdWFscyhkMSwgZDIpOworICAgICAgICAvL30KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBJRW51bWVyYWJsZTxYQXR0cmlidXRlPiBOb3JtYWxpemVBdHRyaWJ1dGVzKFhFbGVtZW50IGVsZW1lbnQsIGJvb2wgaGF2ZVBzdmkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50LkF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgIC5XaGVyZShhID0+ICFhLklzTmFtZXNwYWNlRGVjbGFyYXRpb24gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYS5OYW1lICE9IFhzaS5zY2hlbWFMb2NhdGlvbikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYS5OYW1lICE9IFhzaS5ub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uKSkKKyAgICAgICAgICAgICAgICAuT3JkZXJCeShhID0+IGEuTmFtZS5OYW1lc3BhY2VOYW1lKQorICAgICAgICAgICAgICAgIC5UaGVuQnkoYSA9PiBhLk5hbWUuTG9jYWxOYW1lKQorICAgICAgICAgICAgICAgIC5TZWxlY3QoYSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVQc3ZpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBJWG1sU2NoZW1hSW5mbyBzY2hlbWFJbmZvID0gYS5HZXRTY2hlbWFJbmZvKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHNjaGVtYVR5cGUgPSBzY2hlbWFJbmZvICE9IG51bGwgPyBzY2hlbWFJbmZvLlNjaGVtYVR5cGUgOiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgWG1sVHlwZUNvZGU/IHR5cGVDb2RlID0gc2NoZW1hVHlwZSAhPSBudWxsID8gc2NoZW1hVHlwZS5UeXBlQ29kZSA6IChYbWxUeXBlQ29kZT8pIG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZUNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYbWxUeXBlQ29kZS5Cb29sZWFuOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhBdHRyaWJ1dGUoYS5OYW1lLCAoYm9vbCkgYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYbWxUeXBlQ29kZS5EYXRlVGltZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYQXR0cmlidXRlKGEuTmFtZSwgKERhdGVUaW1lKSBhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkRlY2ltYWw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEF0dHJpYnV0ZShhLk5hbWUsIChkZWNpbWFsKSBhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkRvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYQXR0cmlidXRlKGEuTmFtZSwgKGRvdWJsZSkgYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYbWxUeXBlQ29kZS5GbG9hdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYQXR0cmlidXRlKGEuTmFtZSwgKGZsb2F0KSBhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkhleEJpbmFyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkxhbmd1YWdlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhBdHRyaWJ1dGUoYS5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJpbmcpIGEpLlRvTG93ZXIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhOb2RlIE5vcm1hbGl6ZU5vZGUoWE5vZGUgbm9kZSwgYm9vbCBoYXZlUHN2aSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdHJpbSBjb21tZW50cyBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgZnJvbSBub3JtYWxpemVkIHRyZWUKKyAgICAgICAgICAgIGlmIChub2RlIGlzIFhDb21tZW50IHx8IG5vZGUgaXMgWFByb2Nlc3NpbmdJbnN0cnVjdGlvbikKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgdmFyIGUgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9ybWFsaXplRWxlbWVudChlLCBoYXZlUHN2aSk7CisKKyAgICAgICAgICAgIC8vIE9ubHkgdGhpbmcgbGVmdCBpcyBYQ0RhdGEgYW5kIFhUZXh0LCBzbyBjbG9uZSB0aGVtCisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IE5vcm1hbGl6ZUVsZW1lbnQoWEVsZW1lbnQgZWxlbWVudCwgYm9vbCBoYXZlUHN2aSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhhdmVQc3ZpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElYbWxTY2hlbWFJbmZvIHNjaGVtYUluZm8gPSBlbGVtZW50LkdldFNjaGVtYUluZm8oKTsKKyAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHNjaGVtYVR5cGUgPSBzY2hlbWFJbmZvICE9IG51bGwgPyBzY2hlbWFJbmZvLlNjaGVtYVR5cGUgOiBudWxsOworICAgICAgICAgICAgICAgIFhtbFR5cGVDb2RlPyB0eXBlQ29kZSA9IHNjaGVtYVR5cGUgIT0gbnVsbCA/IHNjaGVtYVR5cGUuVHlwZUNvZGUgOiAoWG1sVHlwZUNvZGU/KSBudWxsOworCisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlQ29kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgWG1sVHlwZUNvZGUuQm9vbGVhbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZUF0dHJpYnV0ZXMoZWxlbWVudCwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJvb2wpIGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkRhdGVUaW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsaXplQXR0cmlidXRlcyhlbGVtZW50LCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGF0ZVRpbWUpIGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkRlY2ltYWw6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVBdHRyaWJ1dGVzKGVsZW1lbnQsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWNpbWFsKSBlbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYbWxUeXBlQ29kZS5Eb3VibGU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVBdHRyaWJ1dGVzKGVsZW1lbnQsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkZsb2F0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsaXplQXR0cmlidXRlcyhlbGVtZW50LCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkhleEJpbmFyeToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYbWxUeXBlQ29kZS5MYW5ndWFnZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZUF0dHJpYnV0ZXMoZWxlbWVudCwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJpbmcpIGVsZW1lbnQpLlRvTG93ZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVBdHRyaWJ1dGVzKGVsZW1lbnQsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBOb3JtYWxpemVOb2RlKG4sIHRydWUpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICBOb3JtYWxpemVBdHRyaWJ1dGVzKGVsZW1lbnQsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gTm9ybWFsaXplTm9kZShuLCBmYWxzZSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgU2ltcGxpZnlNYXJrdXBGb3JQYXJ0KE9wZW5YbWxQYXJ0IHBhcnQsIFNpbXBsaWZ5TWFya3VwU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJzID0gbmV3IFNpbXBsaWZ5TWFya3VwUGFyYW1ldGVycygpOworICAgICAgICAgICAgaWYgKHBhcnQuQ29udGVudFR5cGUgPT0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50Lm1haW4reG1sIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZG9jID0gKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQpIHBhcnQuT3BlblhtbFBhY2thZ2U7CisgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLlJlbW92ZUdvQmFja0Jvb2ttYXJrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgZ29CYWNrQm9va21hcmsgPSBkb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5NYWluRG9jdW1lbnRQYXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAuR2V0WERvY3VtZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cyhXLmJvb2ttYXJrU3RhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoYm0gPT4gKHN0cmluZykgYm0uQXR0cmlidXRlKFcubmFtZSkgPT0gIl9Hb0JhY2siKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdvQmFja0Jvb2ttYXJrICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLkdvQmFja0lkID0gKGludCkgZ29CYWNrQm9va21hcmsuQXR0cmlidXRlKFcuaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgWERvY3VtZW50IHhkb2MgPSBwYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgWEVsZW1lbnQgbmV3Um9vdCA9IHhkb2MuUm9vdDsKKworICAgICAgICAgICAgLy8gTmVlZCB0byBkbyB0aGlzIGZpcnN0IHRvIGVuYWJsZSBzaW1wbGlmeWluZyBoeXBlcmxpbmtzLgorICAgICAgICAgICAgaWYgKHNldHRpbmdzLlJlbW92ZUNvbnRlbnRDb250cm9scyB8fCBzZXR0aW5ncy5SZW1vdmVTbWFydFRhZ3MpCisgICAgICAgICAgICAgICAgbmV3Um9vdCA9IChYRWxlbWVudCkgUmVtb3ZlQ3VzdG9tWG1sQW5kQ29udGVudENvbnRyb2xzVHJhbnNmb3JtKG5ld1Jvb3QsIHNldHRpbmdzKTsKKworICAgICAgICAgICAgLy8gVGhpcyBtYXkgdG91Y2ggbWFueSBlbGVtZW50cywgc28gbmVlZHMgdG8gYmUgaXRzIG93biB0cmFuc2Zvcm0uCisgICAgICAgICAgICBpZiAoc2V0dGluZ3MuUmVtb3ZlUnNpZEluZm8pCisgICAgICAgICAgICAgICAgbmV3Um9vdCA9IChYRWxlbWVudCkgUmVtb3ZlUnNpZFRyYW5zZm9ybShuZXdSb290KTsKKworICAgICAgICAgICAgdmFyIHByZXZOZXdSb290ID0gbmV3IFhEb2N1bWVudChuZXdSb290KTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5SZW1vdmVDb21tZW50cyB8fAorICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5SZW1vdmVFbmRBbmRGb290Tm90ZXMgfHwKKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuUmVwbGFjZVRhYnNXaXRoU3BhY2VzIHx8CisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLlJlbW92ZUZpZWxkQ29kZXMgfHwKKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuUmVtb3ZlUGVybWlzc2lvbnMgfHwKKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuUmVtb3ZlUHJvb2YgfHwKKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuUmVtb3ZlQm9va21hcmtzIHx8CisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLlJlbW92ZVdlYkhpZGRlbiB8fAorICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5SZW1vdmVHb0JhY2tCb29rbWFyayB8fAorICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5SZW1vdmVIeXBlcmxpbmtzKQorICAgICAgICAgICAgICAgICAgICBuZXdSb290ID0gKFhFbGVtZW50KSBTaW1wbGlmeU1hcmt1cFRyYW5zZm9ybShuZXdSb290LCBzZXR0aW5ncywgcGFyYW1ldGVycyk7CisKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgcnVucyBhbmQgcnVuIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlY29tZSBlbXB0eSBkdWUgdG8gcHJldmlvdXMgdHJhbnNmb3Jtcy4KKyAgICAgICAgICAgICAgICBuZXdSb290ID0gKFhFbGVtZW50KSBSZW1vdmVFbXB0eVJ1bnNBbmRSdW5Qcm9wZXJ0aWVzVHJhbnNmb3JtKG5ld1Jvb3QpOworCisgICAgICAgICAgICAgICAgLy8gTWVyZ2UgYWRqYWNlbnQgcnVucyB0aGF0IGhhdmUgaWRlbnRpY2FsIHJ1biBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgICAgIG5ld1Jvb3QgPSAoWEVsZW1lbnQpIE1lcmdlQWRqYWNlbnRSdW5zVHJhbnNmb3JtKG5ld1Jvb3QpOworCisgICAgICAgICAgICAgICAgLy8gTWVyZ2UgYWRqYWNlbnQgaW5zdHJUZXh0IGVsZW1lbnRzLgorICAgICAgICAgICAgICAgIG5ld1Jvb3QgPSAoWEVsZW1lbnQpIE1lcmdlQWRqYWNlbnRJbnN0clRleHQobmV3Um9vdCk7CisKKyAgICAgICAgICAgICAgICAvLyBTZXBhcmF0ZSBydW4gY2hpbGRyZW4gaW50byBzZXBhcmF0ZSBydW5zCisgICAgICAgICAgICAgICAgbmV3Um9vdCA9IChYRWxlbWVudCkgU2VwYXJhdGVSdW5DaGlsZHJlbkludG9TZXBhcmF0ZVJ1bnMobmV3Um9vdCk7CisKKyAgICAgICAgICAgICAgICBpZiAoWE5vZGUuRGVlcEVxdWFscyhwcmV2TmV3Um9vdC5Sb290LCBuZXdSb290KSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBwcmV2TmV3Um9vdCA9IG5ldyBYRG9jdW1lbnQobmV3Um9vdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzZXR0aW5ncy5Ob3JtYWxpemVYbWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEF0dHJpYnV0ZVtdIG5zQXR0cnMgPQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3cGMiLCBXUEMud3BjKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJtYyIsIE1DLm1jKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJvIiwgTy5vKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJyIiwgUi5yKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJtIiwgTS5tKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ2IiwgVk1MLnZtbCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAid3AxNCIsIFdQMTQud3AxNCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAid3AiLCBXUC53cCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidzEwIiwgVzEwLncxMCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidyIsIFcudyksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidzE0IiwgVzE0LncxNCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidzE1IiwgVzE1LncxNSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidzE2c2UiLCBXMTZTRS53MTZzZSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAid3BnIiwgV1BHLndwZyksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAid3BpIiwgV1BJLndwaSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAid25lIiwgV05FLnduZSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAid3BzIiwgV1BTLndwcyksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE1DLklnbm9yYWJsZSwgIncxNCB3cDE0IHcxNSB3MTZzZSIpLAorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBYRG9jdW1lbnQgbmV3WERvYyA9IE5vcm1hbGl6ZShuZXcgWERvY3VtZW50KG5ld1Jvb3QpLCBudWxsKTsKKyAgICAgICAgICAgICAgICBuZXdSb290ID0gbmV3WERvYy5Sb290OworICAgICAgICAgICAgICAgIGlmIChuZXdSb290ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhBdHRyaWJ1dGUgbnNBdHRyIGluIG5zQXR0cnMpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Um9vdC5BdHRyaWJ1dGUobnNBdHRyLk5hbWUpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um9vdC5BZGQobnNBdHRyKTsKKworICAgICAgICAgICAgICAgIHBhcnQuUHV0WERvY3VtZW50KG5ld1hEb2MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcnQuUHV0WERvY3VtZW50KG5ldyBYRG9jdW1lbnQobmV3Um9vdCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFNlcGFyYXRlUnVuQ2hpbGRyZW5JbnRvU2VwYXJhdGVSdW5zKFhOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBub2RlOworCisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcucikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gcnVuQ2hpbGRyZW4gPSBlbGVtZW50LkVsZW1lbnRzKCkuV2hlcmUoZSA9PiBlLk5hbWUgIT0gVy5yUHIpOworICAgICAgICAgICAgICAgIFhFbGVtZW50IHJQciA9IGVsZW1lbnQuRWxlbWVudChXLnJQcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bkNoaWxkcmVuLlNlbGVjdChyYyA9PiBuZXcgWEVsZW1lbnQoVy5yLCByUHIsIHJjKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBTZXBhcmF0ZVJ1bkNoaWxkcmVuSW50b1NlcGFyYXRlUnVucyhuKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFNpbmdsZUNoYXJhY3RlclJ1blRyYW5zZm9ybShYTm9kZSBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm4gbm9kZTsKKworICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgIT0gVy5yUHIpCisgICAgICAgICAgICAgICAgICAgIC5Hcm91cEFkamFjZW50KHNyID0+IHNyLk5hbWUgPT0gVy50KQorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGcgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuS2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzID0gZy5TZWxlY3QodCA9PiAoc3RyaW5nKSB0KS5TdHJpbmdDb25jYXRlbmF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLlNlbGVjdChjID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKFcuclByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnICcgPyBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbCArICJzcGFjZSIsICJwcmVzZXJ2ZSIpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZy5TZWxlY3Qoc3IgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKFcuclByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KHNyLk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzci5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzci5Ob2RlcygpLlNlbGVjdChuID0+IFNpbmdsZUNoYXJhY3RlclJ1blRyYW5zZm9ybShuKSkpKSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gU2luZ2xlQ2hhcmFjdGVyUnVuVHJhbnNmb3JtKG4pKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYc2kKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgWE5hbWVzcGFjZSB4c2kgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOworCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNjaGVtYUxvY2F0aW9uID0geHNpICsgInNjaGVtYUxvY2F0aW9uIjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiA9IHhzaSArICJub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBJbnRlcm5hbEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgSW50ZXJuYWxFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpIDogYmFzZShtZXNzYWdlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIEludmFsaWRTZXR0aW5nc0V4Y2VwdGlvbiA6IEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgSW52YWxpZFNldHRpbmdzRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKSA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgU2ltcGxpZnlNYXJrdXBQYXJhbWV0ZXJzCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQ/IEdvQmFja0lkIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzL01ldHJpY3NHZXR0ZXIuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9NZXRyaWNzR2V0dGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZWY4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9NZXRyaWNzR2V0dGVyLmNzCkBAIC0wLDAgKzEsMTAyNiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uSU8uUGFja2FnaW5nOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5WYWxpZGF0aW9uOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CisKK25hbWVzcGFjZSBPcGVuWG1sUG93ZXJUb29scworeworICAgIHB1YmxpYyBjbGFzcyBNZXRyaWNzR2V0dGVyU2V0dGluZ3MKKyAgICB7CisgICAgICAgIHB1YmxpYyBib29sIEluY2x1ZGVUZXh0SW5Db250ZW50Q29udHJvbHM7CisgICAgICAgIHB1YmxpYyBib29sIEluY2x1ZGVYbHN4VGFibGVDZWxsRGF0YTsKKyAgICAgICAgcHVibGljIGJvb2wgUmV0cmlldmVOYW1lc3BhY2VMaXN0OworICAgICAgICBwdWJsaWMgYm9vbCBSZXRyaWV2ZUNvbnRlbnRUeXBlTGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTWV0cmljc0dldHRlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRWxlbWVudCBHZXRNZXRyaWNzKHN0cmluZyBmaWxlTmFtZSwgTWV0cmljc0dldHRlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBmaSA9IG5ldyBGaWxlSW5mbyhmaWxlTmFtZSk7CisgICAgICAgICAgICBpZiAoIWZpLkV4aXN0cykKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJ7MH0gZG9lcyBub3QgZXhpc3QuIiwgZmkuRnVsbE5hbWUpOworICAgICAgICAgICAgaWYgKFV0aWwuSXNXb3JkcHJvY2Vzc2luZ01MKGZpLkV4dGVuc2lvbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV21sRG9jdW1lbnQgd21sRG9jID0gbmV3IFdtbERvY3VtZW50KGZpLkZ1bGxOYW1lLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0RG9jeE1ldHJpY3Mod21sRG9jLCBzZXR0aW5ncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVXRpbC5Jc1NwcmVhZHNoZWV0TUwoZmkuRXh0ZW5zaW9uKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTbWxEb2N1bWVudCBzbWxEb2MgPSBuZXcgU21sRG9jdW1lbnQoZmkuRnVsbE5hbWUsIHRydWUpOworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbHN4TWV0cmljcyhzbWxEb2MsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChVdGlsLklzUHJlc2VudGF0aW9uTUwoZmkuRXh0ZW5zaW9uKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQbWxEb2N1bWVudCBwbWxEb2MgPSBuZXcgUG1sRG9jdW1lbnQoZmkuRnVsbE5hbWUsIHRydWUpOworICAgICAgICAgICAgICAgIHJldHVybiBHZXRQcHR4TWV0cmljcyhwbWxEb2MsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRWxlbWVudCBHZXREb2N4TWV0cmljcyhXbWxEb2N1bWVudCB3bWxEb2MsIE1ldHJpY3NHZXR0ZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1zLldyaXRlKHdtbERvYy5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgd21sRG9jLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvY3VtZW50ID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1zLCB0cnVlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNUcmFja2VkUmV2aXNpb25zID0gUmV2aXNpb25BY2NlcHRlci5IYXNUcmFja2VkUmV2aXNpb25zKGRvY3VtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNUcmFja2VkUmV2aXNpb25zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldmlzaW9uQWNjZXB0ZXIuQWNjZXB0UmV2aXNpb25zKGRvY3VtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG1ldHJpY3MxID0gR2V0V21sTWV0cmljcyh3bWxEb2MuRmlsZU5hbWUsIGZhbHNlLCBkb2N1bWVudCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1RyYWNrZWRSZXZpc2lvbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljczEuQWRkKG5ldyBYRWxlbWVudChILlJldmlzaW9uVHJhY2tpbmcsIG5ldyBYQXR0cmlidXRlKEguVmFsLCB0cnVlKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldHJpY3MxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGUuVG9TdHJpbmcoKS5Db250YWlucygiSW52YWxpZCBIeXBlcmxpbmsiKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zLldyaXRlKHdtbERvYy5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgd21sRG9jLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisjaWYgIU5FVDM1CisgICAgICAgICAgICAgICAgICAgICAgICBVcmlGaXhlci5GaXhJbnZhbGlkVXJpKG1zLCBicm9rZW5VcmkgPT4gRml4VXJpKGJyb2tlblVyaSkpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB3bWxEb2MgPSBuZXcgV21sRG9jdW1lbnQoImR1bW15LmRvY3giLCBtcy5Ub0FycmF5KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zLldyaXRlKHdtbERvYy5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgd21sRG9jLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2N1bWVudCA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtcywgdHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNUcmFja2VkUmV2aXNpb25zID0gUmV2aXNpb25BY2NlcHRlci5IYXNUcmFja2VkUmV2aXNpb25zKGRvY3VtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVHJhY2tlZFJldmlzaW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV2aXNpb25BY2NlcHRlci5BY2NlcHRSZXZpc2lvbnMoZG9jdW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG1ldHJpY3MyID0gR2V0V21sTWV0cmljcyh3bWxEb2MuRmlsZU5hbWUsIHRydWUsIGRvY3VtZW50LCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1RyYWNrZWRSZXZpc2lvbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MyLkFkZChuZXcgWEVsZW1lbnQoSC5SZXZpc2lvblRyYWNraW5nLCBuZXcgWEF0dHJpYnV0ZShILlZhbCwgdHJ1ZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0cmljczI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgbWV0cmljcyA9IG5ldyBYRWxlbWVudChILk1ldHJpY3MsCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoSC5GaWxlTmFtZSwgd21sRG9jLkZpbGVOYW1lKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShILkZpbGVUeXBlLCAiV29yZHByb2Nlc3NpbmdNTCIpLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKEguRXJyb3IsICJVbmtub3duIGVycm9yLCBtZXRyaWNzIG5vdCBkZXRlcm1pbmVkIikpOworICAgICAgICAgICAgcmV0dXJuIG1ldHJpY3M7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBVcmkgRml4VXJpKHN0cmluZyBicm9rZW5VcmkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVXJpKCJodHRwOi8vYnJva2VuLWxpbmsvIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRXbWxNZXRyaWNzKHN0cmluZyBmaWxlTmFtZSwgYm9vbCBpbnZhbGlkSHlwZXJsaW5rLCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIE1ldHJpY3NHZXR0ZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhcnRzID0gbmV3IFhFbGVtZW50KEguUGFydHMsCisgICAgICAgICAgICAgICAgd0RvYy5HZXRBbGxQYXJ0cygpLlNlbGVjdChwYXJ0ID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0TWV0cmljc0ZvcldtbFBhcnQocGFydCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIGlmICghcGFydHMuSGFzRWxlbWVudHMpCisgICAgICAgICAgICAgICAgcGFydHMgPSBudWxsOworICAgICAgICAgICAgdmFyIG1ldHJpY3MgPSBuZXcgWEVsZW1lbnQoSC5NZXRyaWNzLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKEguRmlsZU5hbWUsIGZpbGVOYW1lKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShILkZpbGVUeXBlLCAiV29yZHByb2Nlc3NpbmdNTCIpLAorICAgICAgICAgICAgICAgIEdldFN0eWxlSGllcmFyY2h5KHdEb2MpLAorICAgICAgICAgICAgICAgIEdldE1pc2NXbWxNZXRyaWNzKHdEb2MsIGludmFsaWRIeXBlcmxpbmspLAorICAgICAgICAgICAgICAgIHBhcnRzLAorICAgICAgICAgICAgICAgIHNldHRpbmdzLlJldHJpZXZlTmFtZXNwYWNlTGlzdCA/IFJldHJpZXZlTmFtZXNwYWNlTGlzdCh3RG9jKSA6IG51bGwsCisgICAgICAgICAgICAgICAgc2V0dGluZ3MuUmV0cmlldmVDb250ZW50VHlwZUxpc3QgPyBSZXRyaWV2ZUNvbnRlbnRUeXBlTGlzdCh3RG9jKSA6IG51bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgcmV0dXJuIG1ldHJpY3M7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBSZXRyaWV2ZUNvbnRlbnRUeXBlTGlzdChPcGVuWG1sUGFja2FnZSBveFBrZykKKyAgICAgICAgeworICAgICAgICAgICAgUGFja2FnZSBwa2cgPSBveFBrZy5QYWNrYWdlOworCisgICAgICAgICAgICB2YXIgbm9uUmVsYXRpb25zaGlwUGFydHMgPSBwa2cuR2V0UGFydHMoKS5DYXN0PFppcFBhY2thZ2VQYXJ0PigpLldoZXJlKHAgPT4gcC5Db250ZW50VHlwZSAhPSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UucmVsYXRpb25zaGlwcyt4bWwiKTsKKyAgICAgICAgICAgIHZhciBjb250ZW50VHlwZXMgPSBub25SZWxhdGlvbnNoaXBQYXJ0cworICAgICAgICAgICAgICAgIC5TZWxlY3QocCA9PiBwLkNvbnRlbnRUeXBlKQorICAgICAgICAgICAgICAgIC5PcmRlckJ5KHQgPT4gdCkKKyAgICAgICAgICAgICAgICAuRGlzdGluY3QoKTsKKyAgICAgICAgICAgIHZhciB4ZSA9IG5ldyBYRWxlbWVudChILkNvbnRlbnRUeXBlcywKKyAgICAgICAgICAgICAgICBjb250ZW50VHlwZXMuU2VsZWN0KGN0ID0+IG5ldyBYRWxlbWVudChILkNvbnRlbnRUeXBlLCBuZXcgWEF0dHJpYnV0ZShILlZhbCwgY3QpKSkpOworICAgICAgICAgICAgcmV0dXJuIHhlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgUmV0cmlldmVOYW1lc3BhY2VMaXN0KE9wZW5YbWxQYWNrYWdlIG94UGtnKQorICAgICAgICB7CisgICAgICAgICAgICBQYWNrYWdlIHBrZyA9IG94UGtnLlBhY2thZ2U7CisKKyAgICAgICAgICAgIHZhciBub25SZWxhdGlvbnNoaXBQYXJ0cyA9IHBrZy5HZXRQYXJ0cygpLkNhc3Q8WmlwUGFja2FnZVBhcnQ+KCkuV2hlcmUocCA9PiBwLkNvbnRlbnRUeXBlICE9ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtcGFja2FnZS5yZWxhdGlvbnNoaXBzK3htbCIpOworICAgICAgICAgICAgdmFyIHhtbFBhcnRzID0gbm9uUmVsYXRpb25zaGlwUGFydHMKKyAgICAgICAgICAgICAgICAuV2hlcmUocCA9PiBwLkNvbnRlbnRUeXBlLlRvTG93ZXIoKS5FbmRzV2l0aCgieG1sIikpOworCisgICAgICAgICAgICB2YXIgdW5pcXVlTmFtZXNwYWNlcyA9IG5ldyBIYXNoU2V0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB4cCBpbiB4bWxQYXJ0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoU3RyZWFtIHN0ID0geHAuR2V0U3RyZWFtKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWERvY3VtZW50IHhkb2MgPSBYRG9jdW1lbnQuTG9hZChzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZXNwYWNlcyA9IHhkb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoYSA9PiBhLklzTmFtZXNwYWNlRGVjbGFyYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChhID0+IHN0cmluZy5Gb3JtYXQoInswfXx7MX0iLCBhLk5hbWUuTG9jYWxOYW1lLCBhLlZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuT3JkZXJCeSh0ID0+IHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRpc3RpbmN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBuYW1lc3BhY2VzKQorCQkgICAgICAgICAgICAgICAgICAgIHVuaXF1ZU5hbWVzcGFjZXMuQWRkKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGNhdGNoIGV4Y2VwdGlvbiwgZm9yZ2V0IGFib3V0IGl0LiAgSnVzdCB0cnlpbmcgdG8gZ2V0IGEgbW9zdCBjb21wbGV0ZSBzdXJ2ZXkgcG9zc2libGUgb2YgYWxsIG5hbWVzcGFjZXMgaW4gYWxsIGRvY3VtZW50cy4KKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgY2F1Z2h0IGV4Y2VwdGlvbiwgY2hhbmNlcyBhcmUgdGhlIGRvY3VtZW50IGlzIGJhZCBhbnl3YXkuCisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHhlID0gbmV3IFhFbGVtZW50KEguTmFtZXNwYWNlcywKKyAgICAgICAgICAgICAgICB1bmlxdWVOYW1lc3BhY2VzLk9yZGVyQnkodCA9PiB0KS5TZWxlY3QobiA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNwbCA9IG4uU3BsaXQoJ3wnKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChILk5hbWVzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKEguTmFtZXNwYWNlUHJlZml4LCBzcGxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoSC5OYW1lc3BhY2VOYW1lLCBzcGxbMV0pKTsKKyAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICByZXR1cm4geGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFhFbGVtZW50PiBHZXRNaXNjV21sTWV0cmljcyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvY3VtZW50LCBib29sIGludmFsaWRIeXBlcmxpbmspCisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IG1ldHJpY3MgPSBuZXcgTGlzdDxYRWxlbWVudD4oKTsKKyAgICAgICAgICAgIExpc3Q8c3RyaW5nPiBub3RlcyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIERpY3Rpb25hcnk8WE5hbWUsIGludD4gZWxlbWVudENvdW50RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5PFhOYW1lLCBpbnQ+KCk7CisKKyAgICAgICAgICAgIGlmIChpbnZhbGlkSHlwZXJsaW5rKQorICAgICAgICAgICAgICAgIG1ldHJpY3MuQWRkKG5ldyBYRWxlbWVudChILkludmFsaWRIeXBlcmxpbmssIG5ldyBYQXR0cmlidXRlKEguVmFsLCBpbnZhbGlkSHlwZXJsaW5rKSkpOworCisgICAgICAgICAgICBib29sIHZhbGlkID0gVmFsaWRhdGVXb3JkcHJvY2Vzc2luZ0RvY3VtZW50KGRvY3VtZW50LCBtZXRyaWNzLCBub3RlcywgZWxlbWVudENvdW50RGljdGlvbmFyeSk7CisgICAgICAgICAgICBpZiAoaW52YWxpZEh5cGVybGluaykKKyAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworCisgICAgICAgICAgICByZXR1cm4gbWV0cmljczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgVmFsaWRhdGVXb3JkcHJvY2Vzc2luZ0RvY3VtZW50KFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYywgTGlzdDxYRWxlbWVudD4gbWV0cmljcywgTGlzdDxzdHJpbmc+IG5vdGVzLCBEaWN0aW9uYXJ5PFhOYW1lLCBpbnQ+IG1ldHJpY0NvdW50RGljdGlvbmFyeSkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCB2YWxpZCA9IFZhbGlkYXRlQWdhaW5zdFNwZWNpZmljVmVyc2lvbih3RG9jLCBtZXRyaWNzLCBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLkZpbGVGb3JtYXRWZXJzaW9ucy5PZmZpY2UyMDA3LCBILlNka1ZhbGlkYXRpb25FcnJvcjIwMDcpOworICAgICAgICAgICAgdmFsaWQgfD0gVmFsaWRhdGVBZ2FpbnN0U3BlY2lmaWNWZXJzaW9uKHdEb2MsIG1ldHJpY3MsIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuRmlsZUZvcm1hdFZlcnNpb25zLk9mZmljZTIwMTAsIEguU2RrVmFsaWRhdGlvbkVycm9yMjAxMCk7CisjaWYgIU5FVDM1CisgICAgICAgICAgICB2YWxpZCB8PSBWYWxpZGF0ZUFnYWluc3RTcGVjaWZpY1ZlcnNpb24od0RvYywgbWV0cmljcywgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5GaWxlRm9ybWF0VmVyc2lvbnMuT2ZmaWNlMjAxMywgSC5TZGtWYWxpZGF0aW9uRXJyb3IyMDEzKTsKKyNlbmRpZgorCisgICAgICAgICAgICBpbnQgZWxlbWVudENvdW50ID0gMDsKKyAgICAgICAgICAgIGludCBwYXJhZ3JhcGhDb3VudCA9IDA7CisgICAgICAgICAgICBpbnQgdGV4dENvdW50ID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYXJ0IGluIHdEb2MuQ29udGVudFBhcnRzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IHhEb2MgPSBwYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlIGluIHhEb2MuRGVzY2VuZGFudHMoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLk5hbWUgPT0gVy50eGJ4Q29udGVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudE1ldHJpYyhtZXRyaWNDb3VudERpY3Rpb25hcnksIEguVGV4dEJveCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGUuTmFtZSA9PSBXLnNkdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudE1ldHJpYyhtZXRyaWNDb3VudERpY3Rpb25hcnksIEguQ29udGVudENvbnRyb2wpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlLk5hbWUgPT0gVy5jdXN0b21YbWwpCisgICAgICAgICAgICAgICAgICAgICAgICBJbmNyZW1lbnRNZXRyaWMobWV0cmljQ291bnREaWN0aW9uYXJ5LCBILkN1c3RvbVhtbE1hcmt1cCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGUuTmFtZSA9PSBXLmZsZENoYXIpCisgICAgICAgICAgICAgICAgICAgICAgICBJbmNyZW1lbnRNZXRyaWMobWV0cmljQ291bnREaWN0aW9uYXJ5LCBILkNvbXBsZXhGaWVsZCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGUuTmFtZSA9PSBXLmZsZFNpbXBsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudE1ldHJpYyhtZXRyaWNDb3VudERpY3Rpb25hcnksIEguU2ltcGxlRmllbGQpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlLk5hbWUgPT0gVy5hbHRDaHVuaykKKyAgICAgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudE1ldHJpYyhtZXRyaWNDb3VudERpY3Rpb25hcnksIEguQWx0Q2h1bmspOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlLk5hbWUgPT0gVy50YmwpCisgICAgICAgICAgICAgICAgICAgICAgICBJbmNyZW1lbnRNZXRyaWMobWV0cmljQ291bnREaWN0aW9uYXJ5LCBILlRhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZS5OYW1lID09IFcuaHlwZXJsaW5rKQorICAgICAgICAgICAgICAgICAgICAgICAgSW5jcmVtZW50TWV0cmljKG1ldHJpY0NvdW50RGljdGlvbmFyeSwgSC5IeXBlcmxpbmspOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlLk5hbWUgPT0gVy5mcmFtZVByKQorICAgICAgICAgICAgICAgICAgICAgICAgSW5jcmVtZW50TWV0cmljKG1ldHJpY0NvdW50RGljdGlvbmFyeSwgSC5MZWdhY3lGcmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGUuTmFtZSA9PSBXLmNvbnRyb2wpCisgICAgICAgICAgICAgICAgICAgICAgICBJbmNyZW1lbnRNZXRyaWMobWV0cmljQ291bnREaWN0aW9uYXJ5LCBILkFjdGl2ZVgpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlLk5hbWUgPT0gVy5zdWJEb2MpCisgICAgICAgICAgICAgICAgICAgICAgICBJbmNyZW1lbnRNZXRyaWMobWV0cmljQ291bnREaWN0aW9uYXJ5LCBILlN1YkRvY3VtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZS5OYW1lID09IFZNTC5pbWFnZWRhdGEgfHwgZS5OYW1lID09IFZNTC5maWxsIHx8IGUuTmFtZSA9PSBWTUwuc3Ryb2tlIHx8IGUuTmFtZSA9PSBBLmJsaXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWxJZCA9IChzdHJpbmcpZS5BdHRyaWJ1dGUoUi5lbWJlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsSWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZUltYWdlRXhpc3RzKHBhcnQsIHJlbElkLCBtZXRyaWNDb3VudERpY3Rpb25hcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVsSWQgPSAoc3RyaW5nKWUuQXR0cmlidXRlKFIucGljdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsSWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZUltYWdlRXhpc3RzKHBhcnQsIHJlbElkLCBtZXRyaWNDb3VudERpY3Rpb25hcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVsSWQgPSAoc3RyaW5nKWUuQXR0cmlidXRlKFIuaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbElkICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGVJbWFnZUV4aXN0cyhwYXJ0LCByZWxJZCwgbWV0cmljQ291bnREaWN0aW9uYXJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LlVyaSA9PSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuVXJpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Q291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLk5hbWUgPT0gVy5wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5OYW1lID09IFcudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q291bnQgKz0gKChzdHJpbmcpZSkuTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBtZXRyaWNDb3VudERpY3Rpb25hcnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWV0cmljcy5BZGQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChpdGVtLktleSwgbmV3IFhBdHRyaWJ1dGUoSC5WYWwsIGl0ZW0uVmFsdWUpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1ldHJpY3MuQWRkKG5ldyBYRWxlbWVudChILkVsZW1lbnRDb3VudCwgbmV3IFhBdHRyaWJ1dGUoSC5WYWwsIGVsZW1lbnRDb3VudCkpKTsKKyAgICAgICAgICAgIG1ldHJpY3MuQWRkKG5ldyBYRWxlbWVudChILkF2ZXJhZ2VQYXJhZ3JhcGhMZW5ndGgsIG5ldyBYQXR0cmlidXRlKEguVmFsLCAoaW50KSgoZG91YmxlKXRleHRDb3VudCAvIChkb3VibGUpcGFyYWdyYXBoQ291bnQpKSkpOworCisgICAgICAgICAgICBpZiAod0RvYy5HZXRBbGxQYXJ0cygpLkFueShwYXJ0ID0+IHBhcnQuQ29udGVudFR5cGUgPT0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0IikpCisgICAgICAgICAgICAgICAgbWV0cmljcy5BZGQobmV3IFhFbGVtZW50KEguRW1iZWRkZWRYbHN4LCBuZXcgWEF0dHJpYnV0ZShILlZhbCwgdHJ1ZSkpKTsKKworICAgICAgICAgICAgTnVtYmVyaW5nRm9ybWF0TGlzdEFzc2VtYmx5KHdEb2MsIG1ldHJpY3MpOworCisgICAgICAgICAgICBYRG9jdW1lbnQgd3hEb2MgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkIGluIHd4RG9jLkRlc2NlbmRhbnRzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGQuTmFtZSA9PSBXLnNhdmVUaHJvdWdoWHNsdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyByaWQgPSAoc3RyaW5nKWQuQXR0cmlidXRlKFIuaWQpOworICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEV4dGVybmFsUmVsYXRpb25zaGlwID0gd0RvYworICAgICAgICAgICAgICAgICAgICAgICAgLk1haW5Eb2N1bWVudFBhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Eb2N1bWVudFNldHRpbmdzUGFydAorICAgICAgICAgICAgICAgICAgICAgICAgLkV4dGVybmFsUmVsYXRpb25zaGlwcworICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGggPT4gaC5JZCA9PSByaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcEV4dGVybmFsUmVsYXRpb25zaGlwID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLkFkZChuZXcgWEVsZW1lbnQoSC5JbnZhbGlkU2F2ZVRocm91Z2hYc2x0LCBuZXcgWEF0dHJpYnV0ZShILlZhbCwgdHJ1ZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZC5OYW1lID09IFcudHJhY2tSZXZpc2lvbnMpCisgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MuQWRkKG5ldyBYRWxlbWVudChILlRyYWNrUmV2aXNpb25zRW5hYmxlZCwgbmV3IFhBdHRyaWJ1dGUoSC5WYWwsIHRydWUpKSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZC5OYW1lID09IFcuZG9jdW1lbnRQcm90ZWN0aW9uKQorICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLkFkZChuZXcgWEVsZW1lbnQoSC5Eb2N1bWVudFByb3RlY3Rpb24sIG5ldyBYQXR0cmlidXRlKEguVmFsLCB0cnVlKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGb250QW5kQ2hhclNldEFuYWx5c2lzKHdEb2MsIG1ldHJpY3MsIG5vdGVzKTsKKworICAgICAgICAgICAgcmV0dXJuIHZhbGlkOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBWYWxpZGF0ZUFnYWluc3RTcGVjaWZpY1ZlcnNpb24oV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jLCBMaXN0PFhFbGVtZW50PiBtZXRyaWNzLCBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLkZpbGVGb3JtYXRWZXJzaW9ucyB2ZXJzaW9uVG9WYWxpZGF0ZUFnYWluc3QsIFhOYW1lIHZlcnNpb25TcGVjaWZpY01ldHJpY05hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9wZW5YbWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IE9wZW5YbWxWYWxpZGF0b3IodmVyc2lvblRvVmFsaWRhdGVBZ2FpbnN0KTsKKyAgICAgICAgICAgIHZhciBlcnJvcnMgPSB2YWxpZGF0b3IuVmFsaWRhdGUod0RvYyk7CisgICAgICAgICAgICBib29sIHZhbGlkID0gZXJyb3JzLkNvdW50KCkgPT0gMDsKKyAgICAgICAgICAgIGlmICghdmFsaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFtZXRyaWNzLkFueShlID0+IGUuTmFtZSA9PSBILlNka1ZhbGlkYXRpb25FcnJvcikpCisgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MuQWRkKG5ldyBYRWxlbWVudChILlNka1ZhbGlkYXRpb25FcnJvciwgbmV3IFhBdHRyaWJ1dGUoSC5WYWwsIHRydWUpKSk7CisgICAgICAgICAgICAgICAgbWV0cmljcy5BZGQobmV3IFhFbGVtZW50KHZlcnNpb25TcGVjaWZpY01ldHJpY05hbWUsIG5ldyBYQXR0cmlidXRlKEguVmFsLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLlRha2UoMykuU2VsZWN0KGVyciA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIuRGVzY3JpcHRpb24uTGVuZ3RoID4gMzAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChQdFV0aWxzLk1ha2VWYWxpZFhtbChlcnIuRGVzY3JpcHRpb24uU3Vic3RyaW5nKDAsIDMwMCkgKyAiIC4uLiBlbGlkZWQgLi4uIikgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoUHRVdGlscy5NYWtlVmFsaWRYbWwoZXJyLkRlc2NyaXB0aW9uKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIgIGluIHBhcnQgIiArIFB0VXRpbHMuTWFrZVZhbGlkWG1sKGVyci5QYXJ0LlVyaS5Ub1N0cmluZygpKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIgIGF0ICIgKyBQdFV0aWxzLk1ha2VWYWxpZFhtbChlcnIuUGF0aC5YUGF0aCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB9KSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbGlkOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBWYWxpZGF0ZUFnYWluc3RTcGVjaWZpY1ZlcnNpb24oU3ByZWFkc2hlZXREb2N1bWVudCBzRG9jLCBMaXN0PFhFbGVtZW50PiBtZXRyaWNzLCBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLkZpbGVGb3JtYXRWZXJzaW9ucyB2ZXJzaW9uVG9WYWxpZGF0ZUFnYWluc3QsIFhOYW1lIHZlcnNpb25TcGVjaWZpY01ldHJpY05hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9wZW5YbWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IE9wZW5YbWxWYWxpZGF0b3IodmVyc2lvblRvVmFsaWRhdGVBZ2FpbnN0KTsKKyAgICAgICAgICAgIHZhciBlcnJvcnMgPSB2YWxpZGF0b3IuVmFsaWRhdGUoc0RvYyk7CisgICAgICAgICAgICBib29sIHZhbGlkID0gZXJyb3JzLkNvdW50KCkgPT0gMDsKKyAgICAgICAgICAgIGlmICghdmFsaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFtZXRyaWNzLkFueShlID0+IGUuTmFtZSA9PSBILlNka1ZhbGlkYXRpb25FcnJvcikpCisgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MuQWRkKG5ldyBYRWxlbWVudChILlNka1ZhbGlkYXRpb25FcnJvciwgbmV3IFhBdHRyaWJ1dGUoSC5WYWwsIHRydWUpKSk7CisgICAgICAgICAgICAgICAgbWV0cmljcy5BZGQobmV3IFhFbGVtZW50KHZlcnNpb25TcGVjaWZpY01ldHJpY05hbWUsIG5ldyBYQXR0cmlidXRlKEguVmFsLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLlRha2UoMykuU2VsZWN0KGVyciA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIuRGVzY3JpcHRpb24uTGVuZ3RoID4gMzAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChQdFV0aWxzLk1ha2VWYWxpZFhtbChlcnIuRGVzY3JpcHRpb24uU3Vic3RyaW5nKDAsIDMwMCkgKyAiIC4uLiBlbGlkZWQgLi4uIikgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoUHRVdGlscy5NYWtlVmFsaWRYbWwoZXJyLkRlc2NyaXB0aW9uKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIgIGluIHBhcnQgIiArIFB0VXRpbHMuTWFrZVZhbGlkWG1sKGVyci5QYXJ0LlVyaS5Ub1N0cmluZygpKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIgIGF0ICIgKyBQdFV0aWxzLk1ha2VWYWxpZFhtbChlcnIuUGF0aC5YUGF0aCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB9KSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbGlkOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBWYWxpZGF0ZUFnYWluc3RTcGVjaWZpY1ZlcnNpb24oUHJlc2VudGF0aW9uRG9jdW1lbnQgcERvYywgTGlzdDxYRWxlbWVudD4gbWV0cmljcywgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5GaWxlRm9ybWF0VmVyc2lvbnMgdmVyc2lvblRvVmFsaWRhdGVBZ2FpbnN0LCBYTmFtZSB2ZXJzaW9uU3BlY2lmaWNNZXRyaWNOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBPcGVuWG1sVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBPcGVuWG1sVmFsaWRhdG9yKHZlcnNpb25Ub1ZhbGlkYXRlQWdhaW5zdCk7CisgICAgICAgICAgICB2YXIgZXJyb3JzID0gdmFsaWRhdG9yLlZhbGlkYXRlKHBEb2MpOworICAgICAgICAgICAgYm9vbCB2YWxpZCA9IGVycm9ycy5Db3VudCgpID09IDA7CisgICAgICAgICAgICBpZiAoIXZhbGlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghbWV0cmljcy5BbnkoZSA9PiBlLk5hbWUgPT0gSC5TZGtWYWxpZGF0aW9uRXJyb3IpKQorICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLkFkZChuZXcgWEVsZW1lbnQoSC5TZGtWYWxpZGF0aW9uRXJyb3IsIG5ldyBYQXR0cmlidXRlKEguVmFsLCB0cnVlKSkpOworICAgICAgICAgICAgICAgIG1ldHJpY3MuQWRkKG5ldyBYRWxlbWVudCh2ZXJzaW9uU3BlY2lmaWNNZXRyaWNOYW1lLCBuZXcgWEF0dHJpYnV0ZShILlZhbCwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5UYWtlKDMpLlNlbGVjdChlcnIgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLkRlc2NyaXB0aW9uLkxlbmd0aCA+IDMwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoUHRVdGlscy5NYWtlVmFsaWRYbWwoZXJyLkRlc2NyaXB0aW9uLlN1YnN0cmluZygwLCAzMDApICsgIiAuLi4gZWxpZGVkIC4uLiIpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKFB0VXRpbHMuTWFrZVZhbGlkWG1sKGVyci5EZXNjcmlwdGlvbikgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiICBpbiBwYXJ0ICIgKyBQdFV0aWxzLk1ha2VWYWxpZFhtbChlcnIuUGFydC5VcmkuVG9TdHJpbmcoKSkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiICBhdCAiICsgUHRVdGlscy5NYWtlVmFsaWRYbWwoZXJyLlBhdGguWFBhdGgpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWxpZDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgSW5jcmVtZW50TWV0cmljKERpY3Rpb25hcnk8WE5hbWUsIGludD4gbWV0cmljQ291bnREaWN0aW9uYXJ5LCBYTmFtZSB4TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1ldHJpY0NvdW50RGljdGlvbmFyeS5Db250YWluc0tleSh4TmFtZSkpCisgICAgICAgICAgICAgICAgbWV0cmljQ291bnREaWN0aW9uYXJ5W3hOYW1lXSA9IG1ldHJpY0NvdW50RGljdGlvbmFyeVt4TmFtZV0gKyAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1ldHJpY0NvdW50RGljdGlvbmFyeS5BZGQoeE5hbWUsIDEpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBWYWxpZGF0ZUltYWdlRXhpc3RzKE9wZW5YbWxQYXJ0IHBhcnQsIHN0cmluZyByZWxJZCwgRGljdGlvbmFyeTxYTmFtZSwgaW50PiBtZXRyaWNzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW1hZ2VQYXJ0ID0gcGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdChpcHAgPT4gaXBwLlJlbGF0aW9uc2hpcElkID09IHJlbElkKTsKKyAgICAgICAgICAgIGlmIChpbWFnZVBhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBJbmNyZW1lbnRNZXRyaWMobWV0cmljcywgSC5SZWZlcmVuY2VUb051bGxJbWFnZSk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgTnVtYmVyaW5nRm9ybWF0TGlzdEFzc2VtYmx5KFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYywgTGlzdDxYRWxlbWVudD4gbWV0cmljcykKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxzdHJpbmc+IG51bUZtdExpc3QgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFydCBpbiB3RG9jLkNvbnRlbnRQYXJ0cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB4RG9jID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBudW1GbXRMaXN0ID0gbnVtRm10TGlzdC5Db25jYXQoeERvYworICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoVy5wKQorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHAgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTGlzdEl0ZW1SZXRyaWV2ZXIuUmV0cmlldmVMaXN0SXRlbSh3RG9jLCBwLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3RJdGVtUmV0cmlldmVyLkxpc3RJdGVtSW5mbyBsaWYgPSBwLkFubm90YXRpb248TGlzdEl0ZW1SZXRyaWV2ZXIuTGlzdEl0ZW1JbmZvPigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpZiAhPSBudWxsICYmIGxpZi5Jc0xpc3RJdGVtICYmIGxpZi5MdmwoTGlzdEl0ZW1SZXRyaWV2ZXIuR2V0UGFyYWdyYXBoTGV2ZWwocCkpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG51bUZtdEZvckxldmVsID0gKHN0cmluZylsaWYuTHZsKExpc3RJdGVtUmV0cmlldmVyLkdldFBhcmFncmFwaExldmVsKHApKS5FbGVtZW50cyhXLm51bUZtdCkuQXR0cmlidXRlcyhXLnZhbCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtRm10Rm9yTGV2ZWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBudW1GbXRFbGVtZW50ID0gbGlmLkx2bChMaXN0SXRlbVJldHJpZXZlci5HZXRQYXJhZ3JhcGhMZXZlbChwKSkuRWxlbWVudHMoTUMuQWx0ZXJuYXRlQ29udGVudCkuRWxlbWVudHMoTUMuQ2hvaWNlKS5FbGVtZW50cyhXLm51bUZtdCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bUZtdEVsZW1lbnQgIT0gbnVsbCAmJiAoc3RyaW5nKW51bUZtdEVsZW1lbnQuQXR0cmlidXRlKFcudmFsKSA9PSAiY3VzdG9tIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZtdEZvckxldmVsID0gKHN0cmluZyludW1GbXRFbGVtZW50LkF0dHJpYnV0ZShXLmZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1GbXRGb3JMZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUocyA9PiBzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIC5EaXN0aW5jdCgpKQorICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtRm10TGlzdC5BbnkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbmZscyA9IG51bUZtdExpc3QuU3RyaW5nQ29uY2F0ZW5hdGUocyA9PiBzICsgIiwiKS5UcmltRW5kKCcsJyk7CisgICAgICAgICAgICAgICAgbWV0cmljcy5BZGQobmV3IFhFbGVtZW50KEguTnVtYmVyaW5nRm9ybWF0TGlzdCwgbmV3IFhBdHRyaWJ1dGUoSC5WYWwsIFB0VXRpbHMuTWFrZVZhbGlkWG1sKG5mbHMpKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgRm9ybWF0dGluZ01ldHJpY3MKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBSdW5Db3VudDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgUnVuV2l0aG91dFJwckNvdW50OworICAgICAgICAgICAgcHVibGljIGludCBaZXJvTGVuZ3RoVGV4dDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTXVsdGlGb250UnVuOworCisgICAgICAgICAgICBwdWJsaWMgaW50IEFzY2lpQ2hhckNvdW50OworICAgICAgICAgICAgcHVibGljIGludCBDU0NoYXJDb3VudDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgRWFzdEFzaWFDaGFyQ291bnQ7CisgICAgICAgICAgICBwdWJsaWMgaW50IEhBbnNpQ2hhckNvdW50OworCisgICAgICAgICAgICBwdWJsaWMgaW50IEFzY2lpUnVuQ291bnQ7CisgICAgICAgICAgICBwdWJsaWMgaW50IENTUnVuQ291bnQ7CisgICAgICAgICAgICBwdWJsaWMgaW50IEVhc3RBc2lhUnVuQ291bnQ7CisgICAgICAgICAgICBwdWJsaWMgaW50IEhBbnNpUnVuQ291bnQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PHN0cmluZz4gTGFuZ3VhZ2VzOworCisgICAgICAgICAgICBwdWJsaWMgRm9ybWF0dGluZ01ldHJpY3MoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExhbmd1YWdlcyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRm9udEFuZENoYXJTZXRBbmFseXNpcyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIExpc3Q8WEVsZW1lbnQ+IG1ldHJpY3MsIExpc3Q8c3RyaW5nPiBub3RlcykKKyAgICAgICAgeworICAgICAgICAgICAgRm9ybWF0dGluZ0Fzc2VtYmxlclNldHRpbmdzIHNldHRpbmdzID0gbmV3IEZvcm1hdHRpbmdBc3NlbWJsZXJTZXR0aW5ncworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlbW92ZVN0eWxlTmFtZXNGcm9tUGFyYWdyYXBoQW5kUnVuUHJvcGVydGllcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIENsZWFyU3R5bGVzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBSZXN0cmljdFRvU3VwcG9ydGVkTnVtYmVyaW5nRm9ybWF0cyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIFJlc3RyaWN0VG9TdXBwb3J0ZWRMYW5ndWFnZXMgPSBmYWxzZSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBGb3JtYXR0aW5nQXNzZW1ibGVyLkFzc2VtYmxlRm9ybWF0dGluZyh3RG9jLCBzZXR0aW5ncyk7CisgICAgICAgICAgICB2YXIgZm9ybWF0dGluZ01ldHJpY3MgPSBuZXcgRm9ybWF0dGluZ01ldHJpY3MoKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gd0RvYy5Db250ZW50UGFydHMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgeERvYyA9IHBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJ1biBpbiB4RG9jLkRlc2NlbmRhbnRzKFcucikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nTWV0cmljcy5SdW5Db3VudCsrOworICAgICAgICAgICAgICAgICAgICBBbmFseXplUnVuKHJ1biwgbWV0cmljcywgbm90ZXMsIGZvcm1hdHRpbmdNZXRyaWNzLCBwYXJ0LlVyaS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1ldHJpY3MuQWRkKG5ldyBYRWxlbWVudChILlJ1bkNvdW50LCBuZXcgWEF0dHJpYnV0ZShILlZhbCwgZm9ybWF0dGluZ01ldHJpY3MuUnVuQ291bnQpKSk7CisgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ01ldHJpY3MuUnVuV2l0aG91dFJwckNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICBtZXRyaWNzLkFkZChuZXcgWEVsZW1lbnQoSC5SdW5XaXRob3V0UnByQ291bnQsIG5ldyBYQXR0cmlidXRlKEguVmFsLCBmb3JtYXR0aW5nTWV0cmljcy5SdW5XaXRob3V0UnByQ291bnQpKSk7CisgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ01ldHJpY3MuWmVyb0xlbmd0aFRleHQgPiAwKQorICAgICAgICAgICAgICAgIG1ldHJpY3MuQWRkKG5ldyBYRWxlbWVudChILlplcm9MZW5ndGhUZXh0LCBuZXcgWEF0dHJpYnV0ZShILlZhbCwgZm9ybWF0dGluZ01ldHJpY3MuWmVyb0xlbmd0aFRleHQpKSk7CisgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ01ldHJpY3MuTXVsdGlGb250UnVuID4gMCkKKyAgICAgICAgICAgICAgICBtZXRyaWNzLkFkZChuZXcgWEVsZW1lbnQoSC5NdWx0aUZvbnRSdW4sIG5ldyBYQXR0cmlidXRlKEguVmFsLCBmb3JtYXR0aW5nTWV0cmljcy5NdWx0aUZvbnRSdW4pKSk7CisgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ01ldHJpY3MuQXNjaWlDaGFyQ291bnQgPiAwKQorICAgICAgICAgICAgICAgIG1ldHJpY3MuQWRkKG5ldyBYRWxlbWVudChILkFzY2lpQ2hhckNvdW50LCBuZXcgWEF0dHJpYnV0ZShILlZhbCwgZm9ybWF0dGluZ01ldHJpY3MuQXNjaWlDaGFyQ291bnQpKSk7CisgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ01ldHJpY3MuQ1NDaGFyQ291bnQgPiAwKQorICAgICAgICAgICAgICAgIG1ldHJpY3MuQWRkKG5ldyBYRWxlbWVudChILkNTQ2hhckNvdW50LCBuZXcgWEF0dHJpYnV0ZShILlZhbCwgZm9ybWF0dGluZ01ldHJpY3MuQ1NDaGFyQ291bnQpKSk7CisgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ01ldHJpY3MuRWFzdEFzaWFDaGFyQ291bnQgPiAwKQorICAgICAgICAgICAgICAgIG1ldHJpY3MuQWRkKG5ldyBYRWxlbWVudChILkVhc3RBc2lhQ2hhckNvdW50LCBuZXcgWEF0dHJpYnV0ZShILlZhbCwgZm9ybWF0dGluZ01ldHJpY3MuRWFzdEFzaWFDaGFyQ291bnQpKSk7CisgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ01ldHJpY3MuSEFuc2lDaGFyQ291bnQgPiAwKQorICAgICAgICAgICAgICAgIG1ldHJpY3MuQWRkKG5ldyBYRWxlbWVudChILkhBbnNpQ2hhckNvdW50LCBuZXcgWEF0dHJpYnV0ZShILlZhbCwgZm9ybWF0dGluZ01ldHJpY3MuSEFuc2lDaGFyQ291bnQpKSk7CisgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ01ldHJpY3MuQXNjaWlSdW5Db3VudCA+IDApCisgICAgICAgICAgICAgICAgbWV0cmljcy5BZGQobmV3IFhFbGVtZW50KEguQXNjaWlSdW5Db3VudCwgbmV3IFhBdHRyaWJ1dGUoSC5WYWwsIGZvcm1hdHRpbmdNZXRyaWNzLkFzY2lpUnVuQ291bnQpKSk7CisgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ01ldHJpY3MuQ1NSdW5Db3VudCA+IDApCisgICAgICAgICAgICAgICAgbWV0cmljcy5BZGQobmV3IFhFbGVtZW50KEguQ1NSdW5Db3VudCwgbmV3IFhBdHRyaWJ1dGUoSC5WYWwsIGZvcm1hdHRpbmdNZXRyaWNzLkNTUnVuQ291bnQpKSk7CisgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ01ldHJpY3MuRWFzdEFzaWFSdW5Db3VudCA+IDApCisgICAgICAgICAgICAgICAgbWV0cmljcy5BZGQobmV3IFhFbGVtZW50KEguRWFzdEFzaWFSdW5Db3VudCwgbmV3IFhBdHRyaWJ1dGUoSC5WYWwsIGZvcm1hdHRpbmdNZXRyaWNzLkVhc3RBc2lhUnVuQ291bnQpKSk7CisgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ01ldHJpY3MuSEFuc2lSdW5Db3VudCA+IDApCisgICAgICAgICAgICAgICAgbWV0cmljcy5BZGQobmV3IFhFbGVtZW50KEguSEFuc2lSdW5Db3VudCwgbmV3IFhBdHRyaWJ1dGUoSC5WYWwsIGZvcm1hdHRpbmdNZXRyaWNzLkhBbnNpUnVuQ291bnQpKSk7CisKKyAgICAgICAgICAgIGlmIChmb3JtYXR0aW5nTWV0cmljcy5MYW5ndWFnZXMuQW55KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHVscyA9IGZvcm1hdHRpbmdNZXRyaWNzLkxhbmd1YWdlcy5TdHJpbmdDb25jYXRlbmF0ZShzID0+IHMgKyAiLCIpLlRyaW1FbmQoJywnKTsKKyAgICAgICAgICAgICAgICBtZXRyaWNzLkFkZChuZXcgWEVsZW1lbnQoSC5MYW5ndWFnZXMsIG5ldyBYQXR0cmlidXRlKEguVmFsLCBQdFV0aWxzLk1ha2VWYWxpZFhtbCh1bHMpKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBbmFseXplUnVuKFhFbGVtZW50IHJ1biwgTGlzdDxYRWxlbWVudD4gYXR0TGlzdCwgTGlzdDxzdHJpbmc+IG5vdGVzLCBGb3JtYXR0aW5nTWV0cmljcyBmb3JtYXR0aW5nTWV0cmljcywgc3RyaW5nIHVyaSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJ1blRleHQgPSBydW4uRWxlbWVudHMoKQorICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IGUuTmFtZSA9PSBXLnQgfHwgZS5OYW1lID09IFcuZGVsVGV4dCkKKyAgICAgICAgICAgICAgICAuU2VsZWN0KHQgPT4gKHN0cmluZyl0KQorICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZSgpOworICAgICAgICAgICAgaWYgKHJ1blRleHQuTGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9ybWF0dGluZ01ldHJpY3MuWmVyb0xlbmd0aFRleHQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgclByID0gcnVuLkVsZW1lbnQoVy5yUHIpOworICAgICAgICAgICAgaWYgKHJQciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdNZXRyaWNzLlJ1bldpdGhvdXRScHJDb3VudCsrOworICAgICAgICAgICAgICAgIG5vdGVzLkFkZChQdFV0aWxzLk1ha2VWYWxpZFhtbChzdHJpbmcuRm9ybWF0KCJFcnJvciBpbiBwYXJ0IHswfTogcnVuIHdpdGhvdXQgclByIGF0IHsxfSIsIHVyaSwgcnVuLkdldFhQYXRoKCkpKSk7CisgICAgICAgICAgICAgICAgclByID0gbmV3IFhFbGVtZW50KFcuclByKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZvcm1hdHRpbmdBc3NlbWJsZXIuQ2hhclN0eWxlQXR0cmlidXRlcyBjc2EgPSBuZXcgRm9ybWF0dGluZ0Fzc2VtYmxlci5DaGFyU3R5bGVBdHRyaWJ1dGVzKG51bGwsIHJQcik7CisgICAgICAgICAgICB2YXIgZm9udFR5cGVBcnJheSA9IHJ1blRleHQKKyAgICAgICAgICAgICAgICAuU2VsZWN0KGNoID0+IEZvcm1hdHRpbmdBc3NlbWJsZXIuRGV0ZXJtaW5lRm9udFR5cGVGcm9tQ2hhcmFjdGVyKGNoLCBjc2EpKQorICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisgICAgICAgICAgICB2YXIgZGlzdGluY3RGb250VHlwZUFycmF5ID0gZm9udFR5cGVBcnJheQorICAgICAgICAgICAgICAgIC5EaXN0aW5jdCgpCisgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIHZhciBkaXN0aW5jdEZvbnRzID0gZGlzdGluY3RGb250VHlwZUFycmF5CisgICAgICAgICAgICAgICAgLlNlbGVjdChmdCA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdldEZvbnRGcm9tRm9udFR5cGUoY3NhLCBmdCk7CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuRGlzdGluY3QoKTsKKyAgICAgICAgICAgIHZhciBsYW5ndWFnZXMgPSBkaXN0aW5jdEZvbnRUeXBlQXJyYXkKKyAgICAgICAgICAgICAgICAuU2VsZWN0KGZ0ID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZnQgPT0gRm9ybWF0dGluZ0Fzc2VtYmxlci5Gb250VHlwZS5Bc2NpaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjc2EuTGF0aW5MYW5nOworICAgICAgICAgICAgICAgICAgICBpZiAoZnQgPT0gRm9ybWF0dGluZ0Fzc2VtYmxlci5Gb250VHlwZS5DUykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjc2EuQmlkaUxhbmc7CisgICAgICAgICAgICAgICAgICAgIGlmIChmdCA9PSBGb3JtYXR0aW5nQXNzZW1ibGVyLkZvbnRUeXBlLkVhc3RBc2lhKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNzYS5FYXN0QXNpYUxhbmc7CisgICAgICAgICAgICAgICAgICAgIC8vaWYgKGZ0ID09IEZvcm1hdHRpbmdBc3NlbWJsZXIuRm9udFR5cGUuSEFuc2kpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjc2EuTGF0aW5MYW5nOworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLlNlbGVjdChsID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobCA9PSAiIiB8fCBsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLyogIkRmbHQ6IiArICovIEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlLk5hbWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLy8uV2hlcmUobCA9PiBsICE9IG51bGwgJiYgbCAhPSAiIikKKyAgICAgICAgICAgICAgICAuRGlzdGluY3QoKTsKKyAgICAgICAgICAgIGlmIChsYW5ndWFnZXMuQW55KGwgPT4gIWZvcm1hdHRpbmdNZXRyaWNzLkxhbmd1YWdlcy5Db250YWlucyhsKSkpCisgICAgICAgICAgICAgICAgZm9ybWF0dGluZ01ldHJpY3MuTGFuZ3VhZ2VzID0gZm9ybWF0dGluZ01ldHJpY3MuTGFuZ3VhZ2VzLkNvbmNhdChsYW5ndWFnZXMpLkRpc3RpbmN0KCkuVG9MaXN0KCk7CisgICAgICAgICAgICB2YXIgbXVsdGlGb250UnVuID0gZGlzdGluY3RGb250cy5Db3VudCgpID4gMTsKKyAgICAgICAgICAgIGlmIChtdWx0aUZvbnRSdW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9ybWF0dGluZ01ldHJpY3MuTXVsdGlGb250UnVuKys7CisKKyAgICAgICAgICAgICAgICBmb3JtYXR0aW5nTWV0cmljcy5Bc2NpaUNoYXJDb3VudCArPSBmb250VHlwZUFycmF5LldoZXJlKGZ0ID0+IGZ0ID09IEZvcm1hdHRpbmdBc3NlbWJsZXIuRm9udFR5cGUuQXNjaWkpLkNvdW50KCk7CisgICAgICAgICAgICAgICAgZm9ybWF0dGluZ01ldHJpY3MuQ1NDaGFyQ291bnQgKz0gZm9udFR5cGVBcnJheS5XaGVyZShmdCA9PiBmdCA9PSBGb3JtYXR0aW5nQXNzZW1ibGVyLkZvbnRUeXBlLkNTKS5Db3VudCgpOworICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdNZXRyaWNzLkVhc3RBc2lhQ2hhckNvdW50ICs9IGZvbnRUeXBlQXJyYXkuV2hlcmUoZnQgPT4gZnQgPT0gRm9ybWF0dGluZ0Fzc2VtYmxlci5Gb250VHlwZS5FYXN0QXNpYSkuQ291bnQoKTsKKyAgICAgICAgICAgICAgICBmb3JtYXR0aW5nTWV0cmljcy5IQW5zaUNoYXJDb3VudCArPSBmb250VHlwZUFycmF5LldoZXJlKGZ0ID0+IGZ0ID09IEZvcm1hdHRpbmdBc3NlbWJsZXIuRm9udFR5cGUuSEFuc2kpLkNvdW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChmb250VHlwZUFycmF5WzBdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGb3JtYXR0aW5nQXNzZW1ibGVyLkZvbnRUeXBlLkFzY2lpOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGluZ01ldHJpY3MuQXNjaWlDaGFyQ291bnQgKz0gcnVuVGV4dC5MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nTWV0cmljcy5Bc2NpaVJ1bkNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGb3JtYXR0aW5nQXNzZW1ibGVyLkZvbnRUeXBlLkNTOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGluZ01ldHJpY3MuQ1NDaGFyQ291bnQgKz0gcnVuVGV4dC5MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nTWV0cmljcy5DU1J1bkNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGb3JtYXR0aW5nQXNzZW1ibGVyLkZvbnRUeXBlLkVhc3RBc2lhOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGluZ01ldHJpY3MuRWFzdEFzaWFDaGFyQ291bnQgKz0gcnVuVGV4dC5MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nTWV0cmljcy5FYXN0QXNpYVJ1bkNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGb3JtYXR0aW5nQXNzZW1ibGVyLkZvbnRUeXBlLkhBbnNpOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGluZ01ldHJpY3MuSEFuc2lDaGFyQ291bnQgKz0gcnVuVGV4dC5MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nTWV0cmljcy5IQW5zaVJ1bkNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0Rm9udEZyb21Gb250VHlwZShGb3JtYXR0aW5nQXNzZW1ibGVyLkNoYXJTdHlsZUF0dHJpYnV0ZXMgY3NhLCBGb3JtYXR0aW5nQXNzZW1ibGVyLkZvbnRUeXBlIGZ0KQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRm9ybWF0dGluZ0Fzc2VtYmxlci5Gb250VHlwZS5Bc2NpaToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNzYS5Bc2NpaUZvbnQ7CisgICAgICAgICAgICAgICAgY2FzZSBGb3JtYXR0aW5nQXNzZW1ibGVyLkZvbnRUeXBlLkNTOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3NhLkNzRm9udDsKKyAgICAgICAgICAgICAgICBjYXNlIEZvcm1hdHRpbmdBc3NlbWJsZXIuRm9udFR5cGUuRWFzdEFzaWE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjc2EuRWFzdEFzaWFGb250OworICAgICAgICAgICAgICAgIGNhc2UgRm9ybWF0dGluZ0Fzc2VtYmxlci5Gb250VHlwZS5IQW5zaToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNzYS5IQW5zaUZvbnQ7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gZHVtbXkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNzYS5Bc2NpaUZvbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IEdldFhsc3hNZXRyaWNzKFNtbERvY3VtZW50IHNtbERvYywgTWV0cmljc0dldHRlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoc21sRG9jKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoU3ByZWFkc2hlZXREb2N1bWVudCBzRG9jID0gc3RyZWFtRG9jLkdldFNwcmVhZHNoZWV0RG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IG1ldHJpY3MgPSBuZXcgTGlzdDxYRWxlbWVudD4oKTsKKworICAgICAgICAgICAgICAgICAgICBib29sIHZhbGlkID0gVmFsaWRhdGVBZ2FpbnN0U3BlY2lmaWNWZXJzaW9uKHNEb2MsIG1ldHJpY3MsIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuRmlsZUZvcm1hdFZlcnNpb25zLk9mZmljZTIwMDcsIEguU2RrVmFsaWRhdGlvbkVycm9yMjAwNyk7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkIHw9IFZhbGlkYXRlQWdhaW5zdFNwZWNpZmljVmVyc2lvbihzRG9jLCBtZXRyaWNzLCBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLkZpbGVGb3JtYXRWZXJzaW9ucy5PZmZpY2UyMDEwLCBILlNka1ZhbGlkYXRpb25FcnJvcjIwMTApOworI2lmICFORVQzNQorICAgICAgICAgICAgICAgICAgICB2YWxpZCB8PSBWYWxpZGF0ZUFnYWluc3RTcGVjaWZpY1ZlcnNpb24oc0RvYywgbWV0cmljcywgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5GaWxlRm9ybWF0VmVyc2lvbnMuT2ZmaWNlMjAxMywgSC5TZGtWYWxpZGF0aW9uRXJyb3IyMDEzKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoSC5NZXRyaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoSC5GaWxlTmFtZSwgc21sRG9jLkZpbGVOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKEguRmlsZVR5cGUsICJTcHJlYWRzaGVldE1MIiksCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgR2V0VGFibGVJbmZvRm9yV29ya2Jvb2soc0RvYywgc2V0dGluZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuUmV0cmlldmVOYW1lc3BhY2VMaXN0ID8gUmV0cmlldmVOYW1lc3BhY2VMaXN0KHNEb2MpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLlJldHJpZXZlQ29udGVudFR5cGVMaXN0ID8gUmV0cmlldmVDb250ZW50VHlwZUxpc3Qoc0RvYykgOiBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRUYWJsZUluZm9Gb3JXb3JrYm9vayhTcHJlYWRzaGVldERvY3VtZW50IHNwcmVhZHNoZWV0LCBNZXRyaWNzR2V0dGVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3b3JrYm9va1BhcnQgPSBzcHJlYWRzaGVldC5Xb3JrYm9va1BhcnQ7CisgICAgICAgICAgICB2YXIgeGQgPSB3b3JrYm9va1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICB2YXIgcGFydEluZm9ybWF0aW9uID0KKyAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoSC5TaGVldHMsCisgICAgICAgICAgICAgICAgICAgIHhkLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQoUy5zaGVldHMpCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnNoZWV0KQorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHNoID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByaWQgPSAoc3RyaW5nKXNoLkF0dHJpYnV0ZShSLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaGVldE5hbWUgPSAoc3RyaW5nKXNoLkF0dHJpYnV0ZSgibmFtZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgV29ya3NoZWV0UGFydCB3b3Jrc2hlZXRQYXJ0ID0gKFdvcmtzaGVldFBhcnQpd29ya2Jvb2tQYXJ0LkdldFBhcnRCeUlkKHJpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0VGFibGVJbmZvRm9yU2hlZXQoc3ByZWFkc2hlZXQsIHdvcmtzaGVldFBhcnQsIHNoZWV0TmFtZSwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICByZXR1cm4gcGFydEluZm9ybWF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRWxlbWVudCBHZXRUYWJsZUluZm9Gb3JTaGVldChTcHJlYWRzaGVldERvY3VtZW50IHNwcmVhZHNoZWV0RG9jdW1lbnQsIFdvcmtzaGVldFBhcnQgc2hlZXRQYXJ0LCBzdHJpbmcgc2hlZXROYW1lLAorICAgICAgICAgICAgTWV0cmljc0dldHRlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgeGQgPSBzaGVldFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBYRWxlbWVudCBzaGVldEluZm9ybWF0aW9uID0gbmV3IFhFbGVtZW50KEguU2hlZXQsCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKEguTmFtZSwgc2hlZXROYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgeGQuUm9vdC5FbGVtZW50cyhTLnRhYmxlUGFydHMpLkVsZW1lbnRzKFMudGFibGVQYXJ0KS5TZWxlY3QodHAgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJJZCA9IChzdHJpbmcpdHAuQXR0cmlidXRlKFIuaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVEZWZpbml0aW9uUGFydCB0YWJsZVBhcnQgPSAoVGFibGVEZWZpbml0aW9uUGFydClzaGVldFBhcnQuR2V0UGFydEJ5SWQocklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0eGQgPSB0YWJsZVBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGVOYW1lID0gKHN0cmluZyl0eGQuUm9vdC5BdHRyaWJ1dGUoImRpc3BsYXlOYW1lIik7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCB0YWJsZUNlbGxEYXRhID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmNsdWRlWGxzeFRhYmxlQ2VsbERhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhsc3hUYWJsZSA9IHNwcmVhZHNoZWV0RG9jdW1lbnQuVGFibGUodGFibGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNlbGxEYXRhID0gbmV3IFhFbGVtZW50KEguVGFibGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bHN4VGFibGUuVGFibGVSb3dzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3Qocm93ID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvd0VsZW1lbnQgPSBuZXcgWEVsZW1lbnQoSC5Sb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsc3hUYWJsZS5UYWJsZUNvbHVtbnMoKS5TZWxlY3QoY29sID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZWxsRWxlbWVudCA9IG5ldyBYRWxlbWVudChILkNlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoSC5OYW1lLCBjb2wuTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoSC5WYWwsIChzdHJpbmcpcm93W2NvbC5OYW1lXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGxFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvd0VsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBuZXcgWEVsZW1lbnQoSC5UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShILk5hbWUsIChzdHJpbmcpdHhkLlJvb3QuQXR0cmlidXRlKCJuYW1lIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKEguRGlzcGxheU5hbWUsIHRhYmxlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEguQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhkLlJvb3QuRWxlbWVudChTLnRhYmxlQ29sdW1ucykuRWxlbWVudHMoUy50YWJsZUNvbHVtbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdCh0YyA9PiBuZXcgWEVsZW1lbnQoSC5Db2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShILk5hbWUsIChzdHJpbmcpdGMuQXR0cmlidXRlKCJuYW1lIikpKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDZWxsRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGU7CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGlmICghc2hlZXRJbmZvcm1hdGlvbi5IYXNFbGVtZW50cykKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBzaGVldEluZm9ybWF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRWxlbWVudCBHZXRQcHR4TWV0cmljcyhQbWxEb2N1bWVudCBwbWxEb2MsIE1ldHJpY3NHZXR0ZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCBzdHJlYW1Eb2MgPSBuZXcgT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50KHBtbERvYykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFByZXNlbnRhdGlvbkRvY3VtZW50IHBEb2MgPSBzdHJlYW1Eb2MuR2V0UHJlc2VudGF0aW9uRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IG1ldHJpY3MgPSBuZXcgTGlzdDxYRWxlbWVudD4oKTsKKworICAgICAgICAgICAgICAgICAgICBib29sIHZhbGlkID0gVmFsaWRhdGVBZ2FpbnN0U3BlY2lmaWNWZXJzaW9uKHBEb2MsIG1ldHJpY3MsIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuRmlsZUZvcm1hdFZlcnNpb25zLk9mZmljZTIwMDcsIEguU2RrVmFsaWRhdGlvbkVycm9yMjAwNyk7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkIHw9IFZhbGlkYXRlQWdhaW5zdFNwZWNpZmljVmVyc2lvbihwRG9jLCBtZXRyaWNzLCBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLkZpbGVGb3JtYXRWZXJzaW9ucy5PZmZpY2UyMDEwLCBILlNka1ZhbGlkYXRpb25FcnJvcjIwMTApOworI2lmICFORVQzNQorICAgICAgICAgICAgICAgICAgICB2YWxpZCB8PSBWYWxpZGF0ZUFnYWluc3RTcGVjaWZpY1ZlcnNpb24ocERvYywgbWV0cmljcywgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5GaWxlRm9ybWF0VmVyc2lvbnMuT2ZmaWNlMjAxMywgSC5TZGtWYWxpZGF0aW9uRXJyb3IyMDEzKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KEguTWV0cmljcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKEguRmlsZU5hbWUsIHBtbERvYy5GaWxlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShILkZpbGVUeXBlLCAiUHJlc2VudGF0aW9uTUwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5SZXRyaWV2ZU5hbWVzcGFjZUxpc3QgPyBSZXRyaWV2ZU5hbWVzcGFjZUxpc3QocERvYykgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuUmV0cmlldmVDb250ZW50VHlwZUxpc3QgPyBSZXRyaWV2ZUNvbnRlbnRUeXBlTGlzdChwRG9jKSA6IG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBHZXRTdHlsZUhpZXJhcmNoeShXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvY3VtZW50KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc3R5bGVQYXJ0ID0gZG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5TdHlsZURlZmluaXRpb25zUGFydDsKKyAgICAgICAgICAgIGlmIChzdHlsZVBhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHZhciB4ZCA9IHN0eWxlUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciBzdHlsZXNXaXRoUGF0aCA9IHhkLlJvb3QKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAuU2VsZWN0KHMgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZVN0cmluZyA9IChzdHJpbmcpcy5BdHRyaWJ1dGUoVy5zdHlsZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRoaXNTdHlsZSA9IHM7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFzZVN0eWxlID0gKHN0cmluZyl0aGlzU3R5bGUuRWxlbWVudHMoVy5iYXNlZE9uKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VTdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVTdHJpbmcgPSBiYXNlU3R5bGUgKyAiLyIgKyBzdHlsZVN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNTdHlsZSA9IHhkLlJvb3QuRWxlbWVudHMoVy5zdHlsZSkuRmlyc3RPckRlZmF1bHQodHMgPT4gdHMuQXR0cmlidXRlKFcuc3R5bGVJZCkuVmFsdWUgPT0gYmFzZVN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzU3R5bGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVTdHJpbmc7CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuT3JkZXJCeShuID0+IG4pCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgWEVsZW1lbnQgc3R5bGVIaWVyYXJjaHkgPSBuZXcgWEVsZW1lbnQoSC5TdHlsZUhpZXJhcmNoeSk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBzdHlsZXNXaXRoUGF0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc3R5bGVDaGFpbiA9IGl0ZW0uU3BsaXQoJy8nKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50VG9BZGRUbyA9IHN0eWxlSGllcmFyY2h5OworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpbkNoYWluIGluIHN0eWxlQ2hhaW4uU2tpcExhc3QoMSkpCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZFRvID0gZWxlbWVudFRvQWRkVG8uRWxlbWVudHMoSC5TdHlsZSkuRmlyc3RPckRlZmF1bHQoeiA9PiB6LkF0dHJpYnV0ZShILklkKS5WYWx1ZSA9PSBpbkNoYWluKTsKKyAgICAgICAgICAgICAgICB2YXIgc3R5bGVUb0FkZCA9IHN0eWxlQ2hhaW4uTGFzdCgpOworICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZFRvLkFkZCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEguU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShILklkLCBzdHlsZUNoYWluLkxhc3QoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShILlR5cGUsIChzdHJpbmcpeGQuUm9vdC5FbGVtZW50cyhXLnN0eWxlKS5GaXJzdCh6ID0+IHouQXR0cmlidXRlKFcuc3R5bGVJZCkuVmFsdWUgPT0gc3R5bGVUb0FkZCkuQXR0cmlidXRlKFcudHlwZSkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3R5bGVIaWVyYXJjaHk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRNZXRyaWNzRm9yV21sUGFydChPcGVuWG1sUGFydCBwYXJ0LCBNZXRyaWNzR2V0dGVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGNvbnRlbnRDb250cm9scyA9IG51bGw7CisgICAgICAgICAgICBpZiAocGFydCBpcyBNYWluRG9jdW1lbnRQYXJ0IHx8CisgICAgICAgICAgICAgICAgcGFydCBpcyBIZWFkZXJQYXJ0IHx8CisgICAgICAgICAgICAgICAgcGFydCBpcyBGb290ZXJQYXJ0IHx8CisgICAgICAgICAgICAgICAgcGFydCBpcyBGb290bm90ZXNQYXJ0IHx8CisgICAgICAgICAgICAgICAgcGFydCBpcyBFbmRub3Rlc1BhcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHhkID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBjb250ZW50Q29udHJvbHMgPSAoWEVsZW1lbnQpR2V0Q29udGVudENvbnRyb2xzVHJhbnNmb3JtKHhkLlJvb3QsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRDb250cm9scy5IYXNFbGVtZW50cykKKyAgICAgICAgICAgICAgICAgICAgY29udGVudENvbnRyb2xzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBwYXJ0TWV0cmljcyA9IG5ldyBYRWxlbWVudChILlBhcnQsCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoSC5Db250ZW50VHlwZSwgcGFydC5Db250ZW50VHlwZSksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoSC5VcmksIHBhcnQuVXJpLlRvU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgIGNvbnRlbnRDb250cm9scyk7CisgICAgICAgICAgICBpZiAocGFydE1ldHJpY3MuSGFzRWxlbWVudHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRNZXRyaWNzOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgR2V0Q29udGVudENvbnRyb2xzVHJhbnNmb3JtKFhOb2RlIG5vZGUsIE1ldHJpY3NHZXR0ZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQuRG9jdW1lbnQuUm9vdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChILkNvbnRlbnRDb250cm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBHZXRDb250ZW50Q29udHJvbHNUcmFuc2Zvcm0obiwgc2V0dGluZ3MpKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuc2R0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IChzdHJpbmcpZWxlbWVudC5FbGVtZW50cyhXLnNkdFByKS5FbGVtZW50cyhXLnRhZykuQXR0cmlidXRlcyhXLnZhbCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgWEF0dHJpYnV0ZSB0YWdBdHRyID0gdGFnICE9IG51bGwgPyBuZXcgWEF0dHJpYnV0ZShILlRhZywgdGFnKSA6IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFsaWFzID0gKHN0cmluZyllbGVtZW50LkVsZW1lbnRzKFcuc2R0UHIpLkVsZW1lbnRzKFcuYWxpYXMpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIFhBdHRyaWJ1dGUgYWxpYXNBdHRyID0gYWxpYXMgIT0gbnVsbCA/IG5ldyBYQXR0cmlidXRlKEguQWxpYXMsIGFsaWFzKSA6IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHhQYXRoQXR0ciA9IG5ldyBYQXR0cmlidXRlKEguWFBhdGgsIGVsZW1lbnQuR2V0WFBhdGgoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGlzVGV4dCA9IGVsZW1lbnQuRWxlbWVudHMoVy5zZHRQcikuRWxlbWVudHMoVy50ZXh0KS5BbnkoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGlzQmlibGlvZ3JhcGh5ID0gZWxlbWVudC5FbGVtZW50cyhXLnNkdFByKS5FbGVtZW50cyhXLmJpYmxpb2dyYXBoeSkuQW55KCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBpc0NpdGF0aW9uID0gZWxlbWVudC5FbGVtZW50cyhXLnNkdFByKS5FbGVtZW50cyhXLmNpdGF0aW9uKS5BbnkoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGlzQ29tYm9Cb3ggPSBlbGVtZW50LkVsZW1lbnRzKFcuc2R0UHIpLkVsZW1lbnRzKFcuY29tYm9Cb3gpLkFueSgpOworICAgICAgICAgICAgICAgICAgICB2YXIgaXNEYXRlID0gZWxlbWVudC5FbGVtZW50cyhXLnNkdFByKS5FbGVtZW50cyhXLmRhdGUpLkFueSgpOworICAgICAgICAgICAgICAgICAgICB2YXIgaXNEb2NQYXJ0TGlzdCA9IGVsZW1lbnQuRWxlbWVudHMoVy5zZHRQcikuRWxlbWVudHMoVy5kb2NQYXJ0TGlzdCkuQW55KCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBpc0RvY1BhcnRPYmogPSBlbGVtZW50LkVsZW1lbnRzKFcuc2R0UHIpLkVsZW1lbnRzKFcuZG9jUGFydE9iaikuQW55KCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBpc0Ryb3BEb3duTGlzdCA9IGVsZW1lbnQuRWxlbWVudHMoVy5zZHRQcikuRWxlbWVudHMoVy5kcm9wRG93bkxpc3QpLkFueSgpOworICAgICAgICAgICAgICAgICAgICB2YXIgaXNFcXVhdGlvbiA9IGVsZW1lbnQuRWxlbWVudHMoVy5zZHRQcikuRWxlbWVudHMoVy5lcXVhdGlvbikuQW55KCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBpc0dyb3VwID0gZWxlbWVudC5FbGVtZW50cyhXLnNkdFByKS5FbGVtZW50cyhXLmdyb3VwKS5BbnkoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGlzUGljdHVyZSA9IGVsZW1lbnQuRWxlbWVudHMoVy5zZHRQcikuRWxlbWVudHMoVy5waWN0dXJlKS5BbnkoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGlzUmljaFRleHQgPSBlbGVtZW50LkVsZW1lbnRzKFcuc2R0UHIpLkVsZW1lbnRzKFcucmljaFRleHQpLkFueSgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoISBpc1RleHQgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAhIGlzQmlibGlvZ3JhcGh5ICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgISBpc0NpdGF0aW9uICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgISBpc0NvbWJvQm94ICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgISBpc0RhdGUgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAhIGlzRG9jUGFydExpc3QgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAhIGlzRG9jUGFydE9iaiAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICEgaXNEcm9wRG93bkxpc3QgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAhIGlzRXF1YXRpb24gJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAhIGlzR3JvdXAgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAhIGlzUGljdHVyZSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0eXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGV4dCAgICAgICAgKSB0eXBlID0gIlRleHQiOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNCaWJsaW9ncmFwaHkpIHR5cGUgPSAiQmlibGlvZ3JhcGh5IjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2l0YXRpb24gICAgKSB0eXBlID0gIkNpdGF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tYm9Cb3ggICAgKSB0eXBlID0gIkNvbWJvQm94IjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGF0ZSAgICAgICAgKSB0eXBlID0gIkRhdGUiOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNEb2NQYXJ0TGlzdCApIHR5cGUgPSAiRG9jUGFydExpc3QiOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNEb2NQYXJ0T2JqICApIHR5cGUgPSAiRG9jUGFydE9iaiI7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0Ryb3BEb3duTGlzdCkgdHlwZSA9ICJEcm9wRG93bkxpc3QiOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNFcXVhdGlvbiAgICApIHR5cGUgPSAiRXF1YXRpb24iOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNHcm91cCAgICAgICApIHR5cGUgPSAiR3JvdXAiOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQaWN0dXJlICAgICApIHR5cGUgPSAiUGljdHVyZSI7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1JpY2hUZXh0ICAgICkgdHlwZSA9ICJSaWNoVGV4dCI7CisgICAgICAgICAgICAgICAgICAgIHZhciB0eXBlQXR0ciA9IG5ldyBYQXR0cmlidXRlKEguVHlwZSwgdHlwZSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChILkNvbnRlbnRDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICB0YWdBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgeFBhdGhBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IEdldENvbnRlbnRDb250cm9sc1RyYW5zZm9ybShuLCBzZXR0aW5ncykpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IEdldENvbnRlbnRDb250cm9sc1RyYW5zZm9ybShuLCBzZXR0aW5ncykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldHRpbmdzLkluY2x1ZGVUZXh0SW5Db250ZW50Q29udHJvbHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBBY3RpdmVYID0gIkFjdGl2ZVgiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIEFsaWFzID0gIkFsaWFzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBBbHRDaHVuayA9ICJBbHRDaHVuayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQXJndW1lbnRzID0gIkFyZ3VtZW50cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQXNjaWlDaGFyQ291bnQgPSAiQXNjaWlDaGFyQ291bnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIEFzY2lpUnVuQ291bnQgPSAiQXNjaWlSdW5Db3VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQXZlcmFnZVBhcmFncmFwaExlbmd0aCA9ICJBdmVyYWdlUGFyYWdyYXBoTGVuZ3RoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBCYXNlbGluZVJlcG9ydCA9ICJCYXNlbGluZVJlcG9ydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQmF0Y2ggPSAiQmF0Y2giOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIEJhdGNoTmFtZSA9ICJCYXRjaE5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIEJhdGNoU2VsZWN0b3IgPSAiQmF0Y2hTZWxlY3RvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQ1NDaGFyQ291bnQgPSAiQ1NDaGFyQ291bnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIENTUnVuQ291bnQgPSAiQ1NSdW5Db3VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQ2F0YWxvZyA9ICJDYXRhbG9nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBDYXRhbG9nTGlzdCA9ICJDYXRhbG9nTGlzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQ2F0YWxvZ0xpc3RGaWxlID0gIkNhdGFsb2dMaXN0RmlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQ2F1Z2h0RXhjZXB0aW9uID0gIkNhdWdodEV4Y2VwdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQ2VsbCA9ICJDZWxsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBDb2x1bW4gPSAiQ29sdW1uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBDb2x1bW5zID0gIkNvbHVtbnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIENvbXBsZXhGaWVsZCA9ICJDb21wbGV4RmllbGQiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIENvbXB1dGVyID0gIkNvbXB1dGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBDb21wdXRlcnMgPSAiQ29tcHV0ZXJzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBDb250ZW50Q29udHJvbCA9ICJDb250ZW50Q29udHJvbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQ29udGVudENvbnRyb2xzID0gIkNvbnRlbnRDb250cm9scyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQ29udGVudFR5cGUgPSAiQ29udGVudFR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIENvbnRlbnRUeXBlcyA9ICJDb250ZW50VHlwZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIEN1c3RvbVhtbE1hcmt1cCA9ICJDdXN0b21YbWxNYXJrdXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIERMTCA9ICJETEwiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIERlZmF1bHREaWFsb2dWYWx1ZXNGaWxlID0gIkRlZmF1bHREaWFsb2dWYWx1ZXNGaWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBEZWZhdWx0VmFsdWVzID0gIkRlZmF1bHRWYWx1ZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIERlcGVuZGVuY2llcyA9ICJEZXBlbmRlbmNpZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIERlc3RpbmF0aW9uRGlyID0gIkRlc3RpbmF0aW9uRGlyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBEaXJlY3RvcnkgPSAiRGlyZWN0b3J5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBEaXJlY3RvcnlQYXR0ZXJuID0gIkRpcmVjdG9yeVBhdHRlcm4iOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIERpc3BsYXlOYW1lID0gIkRpc3BsYXlOYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBEb0pvYlF1ZXVlTmFtZSA9ICJEb0pvYlF1ZXVlTmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgRG9jdW1lbnQgPSAiRG9jdW1lbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIERvY3VtZW50UHJvdGVjdGlvbiA9ICJEb2N1bWVudFByb3RlY3Rpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIERvY3VtZW50U2VsZWN0b3IgPSAiRG9jdW1lbnRTZWxlY3RvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgRG9jdW1lbnRUeXBlID0gIkRvY3VtZW50VHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgRG9jdW1lbnRzID0gIkRvY3VtZW50cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgRWFzdEFzaWFDaGFyQ291bnQgPSAiRWFzdEFzaWFDaGFyQ291bnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIEVhc3RBc2lhUnVuQ291bnQgPSAiRWFzdEFzaWFSdW5Db3VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgRWxlbWVudENvdW50ID0gIkVsZW1lbnRDb3VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgRW1iZWRkZWRYbHN4ID0gIkVtYmVkZGVkWGxzeCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgRXJyb3IgPSAiRXJyb3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIEV4Y2VwdGlvbiA9ICJFeGNlcHRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIEV4ZSA9ICJFeGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIEV4ZVJvb3QgPSAiRXhlUm9vdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgRXh0ZW5zaW9uID0gIkV4dGVuc2lvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgRmlsZSA9ICJGaWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBGaWxlTGVuZ3RoID0gIkZpbGVMZW5ndGgiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIEZpbGVOYW1lID0gIkZpbGVOYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBGaWxlUGF0dGVybiA9ICJGaWxlUGF0dGVybiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgRmlsZVR5cGUgPSAiRmlsZVR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIEd1aWQgPSAiR3VpZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgSEFuc2lDaGFyQ291bnQgPSAiSEFuc2lDaGFyQ291bnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIEhBbnNpUnVuQ291bnQgPSAiSEFuc2lSdW5Db3VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgUmV2aXNpb25UcmFja2luZyA9ICJSZXZpc2lvblRyYWNraW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBIeXBlcmxpbmsgPSAiSHlwZXJsaW5rIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBJUEFkZHJlc3MgPSAiSVBBZGRyZXNzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBJZCA9ICJJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgSW52YWxpZCA9ICJJbnZhbGlkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBJbnZhbGlkSHlwZXJsaW5rID0gIkludmFsaWRIeXBlcmxpbmsiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIEludmFsaWRIeXBlcmxpbmtFeGNlcHRpb24gPSAiSW52YWxpZEh5cGVybGlua0V4Y2VwdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgSW52YWxpZFNhdmVUaHJvdWdoWHNsdCA9ICJJbnZhbGlkU2F2ZVRocm91Z2hYc2x0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBKb2JDb21wbGV0ZSA9ICJKb2JDb21wbGV0ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgSm9iRXhlID0gIkpvYkV4ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgSm9iTmFtZSA9ICJKb2JOYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBKb2JTcGVjID0gIkpvYlNwZWMiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIExhbmd1YWdlcyA9ICJMYW5ndWFnZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIExlZ2FjeUZyYW1lID0gIkxlZ2FjeUZyYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBMb2NhbERvSm9iUXVldWUgPSAiTG9jYWxEb0pvYlF1ZXVlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBNYWNoaW5lTmFtZSA9ICJNYWNoaW5lTmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgTWF4Q29uY3VycmVudEpvYnMgPSAiTWF4Q29uY3VycmVudEpvYnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIE1heERvY3VtZW50c0luSm9iID0gIk1heERvY3VtZW50c0luSm9iIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBNYXhQYXJhZ3JhcGhMZW5ndGggPSAiTWF4UGFyYWdyYXBoTGVuZ3RoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBNZXNzYWdlID0gIk1lc3NhZ2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIE1ldHJpY3MgPSAiTWV0cmljcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgTXVsdGlEaXJlY3RvcnkgPSAiTXVsdGlEaXJlY3RvcnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIE11bHRpRm9udFJ1biA9ICJNdWx0aUZvbnRSdW4iOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIE11bHRpU2VydmVyUXVldWUgPSAiTXVsdGlTZXJ2ZXJRdWV1ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgTmFtZSA9ICJOYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBOYW1lc3BhY2VzID0gIk5hbWVzcGFjZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIE5hbWVzcGFjZSA9ICJOYW1lc3BhY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIE5hbWVzcGFjZU5hbWUgPSAiTmFtZXNwYWNlTmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgTmFtZXNwYWNlUHJlZml4ID0gIk5hbWVzcGFjZVByZWZpeCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgTm90ZSA9ICJOb3RlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBOdW1iZXJpbmdGb3JtYXRMaXN0ID0gIk51bWJlcmluZ0Zvcm1hdExpc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uID0gIk9iamVjdERpc3Bvc2VkRXhjZXB0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBQYXJhZ3JhcGhDb3VudCA9ICJQYXJhZ3JhcGhDb3VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgUGFydCA9ICJQYXJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBQYXJ0cyA9ICJQYXJ0cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgUGFzc2VkRG9jdW1lbnRzID0gIlBhc3NlZERvY3VtZW50cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgUGF0aCA9ICJQYXRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBQcm9kdWNlQ2F0YWxvZyA9ICJQcm9kdWNlQ2F0YWxvZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgUmVmZXJlbmNlVG9OdWxsSW1hZ2UgPSAiUmVmZXJlbmNlVG9OdWxsSW1hZ2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFJlcG9ydCA9ICJSZXBvcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFJvb3QgPSAiUm9vdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgUm9vdERpcmVjdG9yeSA9ICJSb290RGlyZWN0b3J5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBSb3cgPSAiUm93IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBSdW5Db3VudCA9ICJSdW5Db3VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgUnVuV2l0aG91dFJwckNvdW50ID0gIlJ1bldpdGhvdXRScHJDb3VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgU2RrVmFsaWRhdGlvbkVycm9yID0gIlNka1ZhbGlkYXRpb25FcnJvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgU2RrVmFsaWRhdGlvbkVycm9yMjAwNyA9ICJTZGtWYWxpZGF0aW9uRXJyb3IyMDA3IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBTZGtWYWxpZGF0aW9uRXJyb3IyMDEwID0gIlNka1ZhbGlkYXRpb25FcnJvcjIwMTAiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFNka1ZhbGlkYXRpb25FcnJvcjIwMTMgPSAiU2RrVmFsaWRhdGlvbkVycm9yMjAxMyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgU2hlZXQgPSAiU2hlZXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFNoZWV0cyA9ICJTaGVldHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFNpbXBsZUZpZWxkID0gIlNpbXBsZUZpZWxkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBTa2lwID0gIlNraXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFNtYXJ0VGFnID0gIlNtYXJ0VGFnIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBTb3VyY2VSb290RGlyID0gIlNvdXJjZVJvb3REaXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFNwYXduZXJKb2JFeGVMb2NhdGlvbiA9ICJTcGF3bmVySm9iRXhlTG9jYXRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFNwYXduZXJSZWFkeSA9ICJTcGF3bmVyUmVhZHkiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFN0eWxlID0gIlN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBTdHlsZUhpZXJhcmNoeSA9ICJTdHlsZUhpZXJhcmNoeSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgU3ViRG9jdW1lbnQgPSAiU3ViRG9jdW1lbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFRhYmxlID0gIlRhYmxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBUYWJsZURhdGEgPSAiVGFibGVEYXRhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBUYWcgPSAiVGFnIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBUYWtlID0gIlRha2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFRleHRCb3ggPSAiVGV4dEJveCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgVHJhY2tSZXZpc2lvbnNFbmFibGVkID0gIlRyYWNrUmV2aXNpb25zRW5hYmxlZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgVHlwZSA9ICJUeXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBVcmkgPSAiVXJpIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBWYWwgPSAiVmFsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBWYWxpZCA9ICJWYWxpZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgV2luZG93U3R5bGUgPSAiV2luZG93U3R5bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFhQYXRoID0gIlhQYXRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBaZXJvTGVuZ3RoVGV4dCA9ICJaZXJvTGVuZ3RoVGV4dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgY3VzdERhdGFMc3QgPSAiY3VzdERhdGFMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIGN1c3RTaG93THN0ID0gImN1c3RTaG93THN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBraW5zb2t1ID0gImtpbnNva3UiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIG1vZGlmeVZlcmlmaWVyID0gIm1vZGlmeVZlcmlmaWVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBwaG90b0FsYnVtID0gInBob3RvQWxidW0iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzL09wZW5YbWxQb3dlclRvb2xzLmNzcHJvaiBiL09wZW5YbWxQb3dlclRvb2xzL09wZW5YbWxQb3dlclRvb2xzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGE3Njg0Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvT3BlblhtbFBvd2VyVG9vbHMuY3Nwcm9qCkBAIC0wLDAgKzEsMjEgQEAKK++7vzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3Jrcz5uZXQ0NTtuZXQ0NjwvVGFyZ2V0RnJhbWV3b3Jrcz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoVGFyZ2V0RnJhbWV3b3JrKScgPT0gJ25ldDQ1JyI+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uSU8uQ29tcHJlc3Npb24iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2luZG93cy5Gb3JtcyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IldpbmRvd3NCYXNlIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKFRhcmdldEZyYW1ld29yayknID09ICduZXQ0NicgIj4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5JTy5Db21wcmVzc2lvbiIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XaW5kb3dzLkZvcm1zIiAvPgorICA8L0l0ZW1Hcm91cD4KKworPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzL09wZW5YbWxQb3dlclRvb2xzLmNzcHJvai5Eb3RTZXR0aW5ncyBiL09wZW5YbWxQb3dlclRvb2xzL09wZW5YbWxQb3dlclRvb2xzLmNzcHJvai5Eb3RTZXR0aW5ncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDhmMTIxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvT3BlblhtbFBvd2VyVG9vbHMuY3Nwcm9qLkRvdFNldHRpbmdzCkBAIC0wLDAgKzEsMyBAQAor77u/PHdwZjpSZXNvdXJjZURpY3Rpb25hcnkgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM6eD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93aW5meC8yMDA2L3hhbWwiIHhtbG5zOnM9ImNsci1uYW1lc3BhY2U6U3lzdGVtO2Fzc2VtYmx5PW1zY29ybGliIiB4bWxuczpzcz0idXJuOnNoZW1hcy1qZXRicmFpbnMtY29tOnNldHRpbmdzLXN0b3JhZ2UteGFtbCIgeG1sbnM6d3BmPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dpbmZ4LzIwMDYveGFtbC9wcmVzZW50YXRpb24iPgorCTxzOlN0cmluZyB4OktleT0iL0RlZmF1bHQvQ29kZUluc3BlY3Rpb24vQ1NoYXJwTGFuZ3VhZ2VQcm9qZWN0L0xhbmd1YWdlTGV2ZWwvQEVudHJ5VmFsdWUiPkNTaGFycDQwPC9zOlN0cmluZz4KKzwvd3BmOlJlc291cmNlRGljdGlvbmFyeT4KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzL09wZW5YbWxSZWdleC5jcyBiL09wZW5YbWxQb3dlclRvb2xzL09wZW5YbWxSZWdleC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWQwMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvT3BlblhtbFJlZ2V4LmNzCkBAIC0wLDAgKzEsNTc3IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgY2xhc3MgT3BlblhtbFJlZ2V4CisgICAgeworICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBEb250Q29uc29saWRhdGUgPSAiRG9udENvbnNvbGlkYXRlIjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBIYXNoU2V0PFhOYW1lPiBSZXZUcmFja01hcmt1cFdpdGhJZCA9IG5ldyBIYXNoU2V0PFhOYW1lPgorICAgICAgICB7CisgICAgICAgICAgICBXLmNlbGxEZWwsCisgICAgICAgICAgICBXLmNlbGxJbnMsCisgICAgICAgICAgICBXLmNlbGxNZXJnZSwKKyAgICAgICAgICAgIFcuY3VzdG9tWG1sRGVsUmFuZ2VFbmQsCisgICAgICAgICAgICBXLmN1c3RvbVhtbERlbFJhbmdlU3RhcnQsCisgICAgICAgICAgICBXLmN1c3RvbVhtbEluc1JhbmdlRW5kLAorICAgICAgICAgICAgVy5jdXN0b21YbWxJbnNSYW5nZVN0YXJ0LAorICAgICAgICAgICAgVy5jdXN0b21YbWxNb3ZlRnJvbVJhbmdlRW5kLAorICAgICAgICAgICAgVy5jdXN0b21YbWxNb3ZlRnJvbVJhbmdlU3RhcnQsCisgICAgICAgICAgICBXLmN1c3RvbVhtbE1vdmVUb1JhbmdlRW5kLAorICAgICAgICAgICAgVy5jdXN0b21YbWxNb3ZlVG9SYW5nZVN0YXJ0LAorICAgICAgICAgICAgVy5kZWwsCisgICAgICAgICAgICBXLmlucywKKyAgICAgICAgICAgIFcubW92ZUZyb20sCisgICAgICAgICAgICBXLm1vdmVGcm9tUmFuZ2VFbmQsCisgICAgICAgICAgICBXLm1vdmVGcm9tUmFuZ2VTdGFydCwKKyAgICAgICAgICAgIFcubW92ZVRvLAorICAgICAgICAgICAgVy5tb3ZlVG9SYW5nZUVuZCwKKyAgICAgICAgICAgIFcubW92ZVRvUmFuZ2VTdGFydCwKKyAgICAgICAgICAgIFcucFByQ2hhbmdlLAorICAgICAgICAgICAgVy5yUHJDaGFuZ2UsCisgICAgICAgICAgICBXLnNlY3RQckNoYW5nZSwKKyAgICAgICAgICAgIFcudGJsR3JpZENoYW5nZSwKKyAgICAgICAgICAgIFcudGJsUHJDaGFuZ2UsCisgICAgICAgICAgICBXLnRibFByRXhDaGFuZ2UsCisgICAgICAgICAgICBXLnRjUHJDaGFuZ2UKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBNYXRjaChJRW51bWVyYWJsZTxYRWxlbWVudD4gY29udGVudCwgUmVnZXggcmVnZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZXBsYWNlSW50ZXJuYWwoY29udGVudCwgcmVnZXgsIG51bGwsIG51bGwsIGZhbHNlLCBudWxsLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIGNhbGxiYWNrID09IG51bGwgVGhlbiByZXR1cm5zIGNvdW50IG9mIG1hdGNoZXMgaW4gdGhlIGNvbnRlbnQKKyAgICAgICAgLy8vIElmIGNhbGxiYWNrICE9IG51bGwgVGhlbiBNYXRjaCBjYWxscyBGb3VuZCBmb3IgZWFjaCBtYXRjaAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBNYXRjaChJRW51bWVyYWJsZTxYRWxlbWVudD4gY29udGVudCwgUmVnZXggcmVnZXgsIEFjdGlvbjxYRWxlbWVudCwgTWF0Y2g+IGZvdW5kKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmVwbGFjZUludGVybmFsKGNvbnRlbnQsIHJlZ2V4LCBudWxsLAorICAgICAgICAgICAgICAgICh4LCBtKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kICE9IG51bGwpIGZvdW5kLkludm9rZSh4LCBtKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiByZXBsYWNlbWVudCA9PSAibmV3IGNvbnRlbnQiICYmIGNhbGxiYWNrID09IG51bGwKKyAgICAgICAgLy8vICAgICBUaGVuIHJlcGxhY2VzIGFsbCBtYXRjaGVzCisgICAgICAgIC8vLyBJZiByZXBsYWNlbWVudCA9PSAiIiAmJiBjYWxsYmFjayA9PSBudWxsKQorICAgICAgICAvLy8gICAgIFRoZW4gZGVsZXRlcyBhbGwgbWF0Y2hlcworICAgICAgICAvLy8gSWYgcmVwbGFjZW1lbnQgPT0gIm5ldyBjb250ZW50IiAmJiBjYWxsYmFjayAhPSBudWxsKQorICAgICAgICAvLy8gICAgIFRoZW4gdGhlIGNhbGxiYWNrIGNhbiByZXR1cm4gdHJ1ZSAvIGZhbHNlIHRvIGluZGljYXRlIHdoZXRoZXIgdG8gcmVwbGFjZSBvciBub3QKKyAgICAgICAgLy8vIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIHRydWUgb25jZSwgYW5kIGZhbHNlIG9uIGFsbCBzdWJzZXF1ZW50IGNhbGxzLCB0aGVuIHRoaXMgbWV0aG9kIHJlcGxhY2VzIG9ubHkgdGhlIGZpcnN0IGZvdW5kLgorICAgICAgICAvLy8gSWYgcmVwbGFjZW1lbnQgPT0gIiIgJiYgY2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgICAgLy8vICAgICBUaGVuIHRoZSBjYWxsYmFjayBjYW4gcmV0dXJuIHRydWUgLyBmYWxzZSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIGRlbGV0ZSBvciBub3QKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgUmVwbGFjZShJRW51bWVyYWJsZTxYRWxlbWVudD4gY29udGVudCwgUmVnZXggcmVnZXgsIHN0cmluZyByZXBsYWNlbWVudCwKKyAgICAgICAgICAgIEZ1bmM8WEVsZW1lbnQsIE1hdGNoLCBib29sPiBkb1JlcGxhY2VtZW50KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmVwbGFjZUludGVybmFsKGNvbnRlbnQsIHJlZ2V4LCByZXBsYWNlbWVudCwgZG9SZXBsYWNlbWVudCwgZmFsc2UsIG51bGwsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBvdmVybG9hZCBlbmFibGVzIG5vdCBjb2FsZXNjaW5nIGNvbnRlbnQsIHdoaWNoIGlzIG5lY2Vzc2FyeSBmb3IgRG9jdW1lbnRBc3NlbWJsZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IFJlcGxhY2UoSUVudW1lcmFibGU8WEVsZW1lbnQ+IGNvbnRlbnQsIFJlZ2V4IHJlZ2V4LCBzdHJpbmcgcmVwbGFjZW1lbnQsCisgICAgICAgICAgICBGdW5jPFhFbGVtZW50LCBNYXRjaCwgYm9vbD4gZG9SZXBsYWNlbWVudCwgYm9vbCBjb2FsZXNjZUNvbnRlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZXBsYWNlSW50ZXJuYWwoY29udGVudCwgcmVnZXgsIHJlcGxhY2VtZW50LCBkb1JlcGxhY2VtZW50LCBmYWxzZSwgbnVsbCwgY29hbGVzY2VDb250ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHJlcGxhY2VtZW50ID09ICJuZXcgY29udGVudCIgJiYgY2FsbGJhY2sgPT0gbnVsbAorICAgICAgICAvLy8gICAgIFRoZW4gcmVwbGFjZXMgYWxsIG1hdGNoZXMKKyAgICAgICAgLy8vIElmIHJlcGxhY2VtZW50ID09ICIiICYmIGNhbGxiYWNrID09IG51bGwpCisgICAgICAgIC8vLyAgICAgVGhlbiBkZWxldGVzIGFsbCBtYXRjaGVzCisgICAgICAgIC8vLyBJZiByZXBsYWNlbWVudCA9PSAibmV3IGNvbnRlbnQiICYmIGNhbGxiYWNrICE9IG51bGwpCisgICAgICAgIC8vLyAgICAgVGhlbiB0aGUgY2FsbGJhY2sgY2FuIHJldHVybiB0cnVlIC8gZmFsc2UgdG8gaW5kaWNhdGUgd2hldGhlciB0byByZXBsYWNlIG9yIG5vdAorICAgICAgICAvLy8gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSBvbmNlLCBhbmQgZmFsc2Ugb24gYWxsIHN1YnNlcXVlbnQgY2FsbHMsIHRoZW4gdGhpcyBtZXRob2QgcmVwbGFjZXMgb25seSB0aGUgZmlyc3QgZm91bmQuCisgICAgICAgIC8vLyBJZiByZXBsYWNlbWVudCA9PSAiIiAmJiBjYWxsYmFjayAhPSBudWxsKQorICAgICAgICAvLy8gICAgIFRoZW4gdGhlIGNhbGxiYWNrIGNhbiByZXR1cm4gdHJ1ZSAvIGZhbHNlIHRvIGluZGljYXRlIHdoZXRoZXIgdG8gZGVsZXRlIG9yIG5vdAorICAgICAgICAvLy8gSWYgdHJhY2tSZXZpc2lvbnMgPT0gdHJ1ZQorICAgICAgICAvLy8gICAgIFRoZW4gcmVwbGFjZW1lbnQgaXMgZG9uZSB1c2luZyByZXZpc2lvbiB0cmFja2luZyBtYXJrdXAsIHdpdGggYXV0aG9yIGFzIHRoZSByZXZpc2lvbiB0cmFja2luZyBhdXRob3IKKyAgICAgICAgLy8vIElmIHRyYWNrUmV2aXNpb25zID09IHRydWUgZm9yIGEgUFBUWAorICAgICAgICAvLy8gICAgIFRoZW4gY29kZSB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IFJlcGxhY2UoSUVudW1lcmFibGU8WEVsZW1lbnQ+IGNvbnRlbnQsIFJlZ2V4IHJlZ2V4LCBzdHJpbmcgcmVwbGFjZW1lbnQsCisgICAgICAgICAgICBGdW5jPFhFbGVtZW50LCBNYXRjaCwgYm9vbD4gZG9SZXBsYWNlbWVudCwgYm9vbCB0cmFja1JldmlzaW9ucywgc3RyaW5nIGF1dGhvcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnRlcm5hbChjb250ZW50LCByZWdleCwgcmVwbGFjZW1lbnQsIGRvUmVwbGFjZW1lbnQsIHRyYWNrUmV2aXNpb25zLCBhdXRob3IsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFJlcGxhY2VJbnRlcm5hbChJRW51bWVyYWJsZTxYRWxlbWVudD4gY29udGVudCwgUmVnZXggcmVnZXgsIHN0cmluZyByZXBsYWNlbWVudCwKKyAgICAgICAgICAgIEZ1bmM8WEVsZW1lbnQsIE1hdGNoLCBib29sPiBjYWxsYmFjaywgYm9vbCB0cmFja1JldmlzaW9ucywgc3RyaW5nIHJldmlzaW9uVHJhY2tpbmdBdXRob3IsCisgICAgICAgICAgICBib29sIGNvYWxlc2NlQ29udGVudCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiY29udGVudCIpOworICAgICAgICAgICAgaWYgKHJlZ2V4ID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInJlZ2V4Iik7CisKKyAgICAgICAgICAgIElFbnVtZXJhYmxlPFhFbGVtZW50PiBjb250ZW50TGlzdCA9IGNvbnRlbnQgYXMgSUxpc3Q8WEVsZW1lbnQ+ID8/IGNvbnRlbnQuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIFhFbGVtZW50IGZpcnN0ID0gY29udGVudExpc3QuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICBpZiAoZmlyc3QuTmFtZS5OYW1lc3BhY2UgPT0gVy53KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghY29udGVudExpc3QuQW55KCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgdmFyIHJlcGxJbmZvID0gbmV3IFJlcGxhY2VJbnRlcm5hbEluZm8geyBDb3VudCA9IDAgfTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBjIGluIGNvbnRlbnRMaXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0MgPSAoWEVsZW1lbnQpIFdtbFNlYXJjaEFuZFJlcGxhY2VUcmFuc2Zvcm0oYywgcmVnZXgsIHJlcGxhY2VtZW50LCBjYWxsYmFjaywgdHJhY2tSZXZpc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvblRyYWNraW5nQXV0aG9yLCByZXBsSW5mbywgY29hbGVzY2VDb250ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYy5SZXBsYWNlTm9kZXMobmV3Qy5Ob2RlcygpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBYRWxlbWVudCByb290ID0gY29udGVudExpc3QuRmlyc3QoKS5BbmNlc3RvcnNBbmRTZWxmKCkuTGFzdCgpOworICAgICAgICAgICAgICAgIGludCBuZXh0SWQgPSBuZXdbXSB7IDAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkNvbmNhdChyb290CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBSZXZUcmFja01hcmt1cFdpdGhJZC5Db250YWlucyhkLk5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKFcuaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChhID0+IChpbnQpIGEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk1heCgpICsgMTsKKyAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gcmV2VHJhY2tpbmdXaXRob3V0SWQgPSByb290CisgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50c0FuZFNlbGYoKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBSZXZUcmFja01hcmt1cFdpdGhJZC5Db250YWlucyhkLk5hbWUpICYmIChkLkF0dHJpYnV0ZShXLmlkKSA9PSBudWxsKSk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgaXRlbSBpbiByZXZUcmFja2luZ1dpdGhvdXRJZCkKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5BZGQobmV3IFhBdHRyaWJ1dGUoVy5pZCwgbmV4dElkKyspKTsKKworICAgICAgICAgICAgICAgIExpc3Q8SUdyb3VwaW5nPGludCwgWEVsZW1lbnQ+PiByZXZUcmFja2luZ1dpdGhEdXBsaWNhdGVJZHMgPSByb290CisgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50c0FuZFNlbGYoKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBSZXZUcmFja01hcmt1cFdpdGhJZC5Db250YWlucyhkLk5hbWUpKQorICAgICAgICAgICAgICAgICAgICAuR3JvdXBCeShkID0+IChpbnQpIGQuQXR0cmlidXRlKFcuaWQpKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZyA9PiBnLkNvdW50KCkgPiAxKQorICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoSUdyb3VwaW5nPGludCwgWEVsZW1lbnQ+IGdyb3VwIGluIHJldlRyYWNraW5nV2l0aER1cGxpY2F0ZUlkcykKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgZ2MgaW4gZ3JvdXAuU2tpcCgxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWEF0dHJpYnV0ZSB4QXR0cmlidXRlID0gZ2MuQXR0cmlidXRlKFcuaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhBdHRyaWJ1dGUgIT0gbnVsbCkgeEF0dHJpYnV0ZS5WYWx1ZSA9IG5leHRJZC5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dElkKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiByZXBsSW5mby5Db3VudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmaXJzdC5OYW1lLk5hbWVzcGFjZSA9PSBQLnApIHx8IChmaXJzdC5OYW1lLk5hbWVzcGFjZSA9PSBBLmEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0cmFja1JldmlzaW9ucykKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJQUFRYIGRvZXMgbm90IHN1cHBvcnQgcmV2aXNpb24gdHJhY2tpbmciKTsKKworICAgICAgICAgICAgICAgIHZhciBjb3VudGVyID0gbmV3IFJlcGxhY2VJbnRlcm5hbEluZm8geyBDb3VudCA9IDAgfTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBjIGluIGNvbnRlbnRMaXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0MgPSAoWEVsZW1lbnQpIFBtbFNlYXJjaEFuZFJlcGxhY2VUcmFuc2Zvcm0oYywgcmVnZXgsIHJlcGxhY2VtZW50LCBjYWxsYmFjaywgY291bnRlcik7CisgICAgICAgICAgICAgICAgICAgIGMuUmVwbGFjZU5vZGVzKG5ld0MuTm9kZXMoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50ZXIuQ291bnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFdtbFNlYXJjaEFuZFJlcGxhY2VUcmFuc2Zvcm0oWE5vZGUgbm9kZSwgUmVnZXggcmVnZXgsIHN0cmluZyByZXBsYWNlbWVudCwKKyAgICAgICAgICAgIEZ1bmM8WEVsZW1lbnQsIE1hdGNoLCBib29sPiBjYWxsYmFjaywgYm9vbCB0cmFja1JldmlzaW9ucywgc3RyaW5nIHJldmlzaW9uVHJhY2tpbmdBdXRob3IsCisgICAgICAgICAgICBSZXBsYWNlSW50ZXJuYWxJbmZvIHJlcGxJbmZvLCBib29sIGNvYWxlc2NlQ29udGVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIG5vZGU7CisKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IHBhcmFncmFwaCA9IGVsZW1lbnQ7CisKKyAgICAgICAgICAgICAgICBzdHJpbmcgcHJlbGltaW5hcnlDb250ZW50ID0gcGFyYWdyYXBoCisgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50c1RyaW1tZWQoVy50eGJ4Q29udGVudCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGQgPT4gZC5OYW1lID09IFcuciAmJiAoZC5QYXJlbnQgPT0gbnVsbCB8fCBkLlBhcmVudC5OYW1lICE9IFcuZGVsKSkKKyAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChVbmljb2RlTWFwcGVyLlJ1blRvU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVnZXguSXNNYXRjaChwcmVsaW1pbmFyeUNvbnRlbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFncmFwaFdpdGhTcGxpdFJ1bnMgPSBuZXcgWEVsZW1lbnQoVy5wLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoLkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaC5Ob2RlcygpLlNlbGVjdChuID0+IFdtbFNlYXJjaEFuZFJlcGxhY2VUcmFuc2Zvcm0obiwgcmVnZXgsIHJlcGxhY2VtZW50LCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1JldmlzaW9ucywgcmV2aXNpb25UcmFja2luZ0F1dGhvciwgcmVwbEluZm8sIGNvYWxlc2NlQ29udGVudCkpKTsKKworICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gcnVuc1RyaW1tZWQgPSBwYXJhZ3JhcGhXaXRoU3BsaXRSdW5zCisgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNUcmltbWVkKFcudHhieENvbnRlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBkLk5hbWUgPT0gVy5yICYmIChkLlBhcmVudCA9PSBudWxsIHx8IGQuUGFyZW50Lk5hbWUgIT0gVy5kZWwpKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcnNBbmRSdW5zID0gcnVuc1RyaW1tZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QociA9PiBuZXcgeyBDaCA9IFVuaWNvZGVNYXBwZXIuUnVuVG9TdHJpbmcociksIHIgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGVudCA9IGNoYXJzQW5kUnVucy5TZWxlY3QodCA9PiB0LkNoKS5TdHJpbmdDb25jYXRlbmF0ZSgpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudFtdIGFsaWduZWRSdW5zID0gY2hhcnNBbmRSdW5zLlNlbGVjdCh0ID0+IHQucikuVG9BcnJheSgpOworCisgICAgICAgICAgICAgICAgICAgIE1hdGNoQ29sbGVjdGlvbiBtYXRjaENvbGxlY3Rpb24gPSByZWdleC5NYXRjaGVzKGNvbnRlbnQpOworICAgICAgICAgICAgICAgICAgICByZXBsSW5mby5Db3VudCArPSBtYXRjaENvbGxlY3Rpb24uQ291bnQ7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBNYXRjaAorICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHJldHVybiBwYXJhZ3JhcGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKE1hdGNoIG1hdGNoIGluIG1hdGNoQ29sbGVjdGlvbi5DYXN0PE1hdGNoPigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHBhcmFncmFwaCwgbWF0Y2gpOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYWdyYXBoOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBSZXBsYWNlCisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKE1hdGNoIG1hdGNoIGluIG1hdGNoQ29sbGVjdGlvbi5DYXN0PE1hdGNoPigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2guTGVuZ3RoID09IDApIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjYWxsYmFjayAhPSBudWxsKSAmJiAhY2FsbGJhY2socGFyYWdyYXBoLCBtYXRjaCkpIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBydW5Db2xsZWN0aW9uID0gYWxpZ25lZFJ1bnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcChtYXRjaC5JbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVGFrZShtYXRjaC5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VzIHRoZSBTa2lwIC8gVGFrZSBzcGVjaWFsIHNlbWFudGljcyBvZiBhcnJheSB0byBpbXBsZW1lbnQgZWZmaWNpZW50IGZpbmRpbmcgb2Ygc3ViIGFycmF5CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGZpcnN0UnVuID0gcnVuQ29sbGVjdGlvbi5GaXJzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgZmlyc3RSdW5Qcm9wZXJ0aWVzID0gZmlyc3RSdW4uRWxlbWVudHMoVy5yUHIpLkZpcnN0T3JEZWZhdWx0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgYXdheSBmaXJzdCBydW4gcHJvcGVydGllcworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2tSZXZpc2lvbnMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ICE9ICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY29hbGVzY2UgcnVucyBhcyBzb21lIG1ldGhvZHMsIGUuZy4sIGluIERvY3VtZW50QXNzZW1ibGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHRyeSB0byBmaW5kIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgZXZlbiB0aG91Z2ggdGhleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgY29hbGVzY2VDb250ZW50IHRvIGZhbHNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmV3VGV4dFZhbHVlID0gbWF0Y2guUmVzdWx0KHJlcGxhY2VtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxYRWxlbWVudD4gbmV3UnVucyA9IFVuaWNvZGVNYXBwZXIuU3RyaW5nVG9Db2FsZXNjZWRSdW5MaXN0KG5ld1RleHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UnVuUHJvcGVydGllcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdJbnMgPSBuZXcgWEVsZW1lbnQoVy5pbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmF1dGhvciwgcmV2aXNpb25UcmFja2luZ0F1dGhvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmRhdGUsIERhdGVUaW1lLlV0Y05vdy5Ub1N0cmluZygicyIpICsgIloiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1J1bnMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFJ1bi5QYXJlbnQgIT0gbnVsbCAmJiBmaXJzdFJ1bi5QYXJlbnQuTmFtZSA9PSBXLmlucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UnVuLlBhcmVudC5BZGRCZWZvcmVTZWxmKG5ld0lucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UnVuLkFkZEJlZm9yZVNlbGYobmV3SW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBydW4gaW4gcnVuQ29sbGVjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbklucyA9IHJ1bi5QYXJlbnQgIT0gbnVsbCAmJiBydW4uUGFyZW50Lk5hbWUgPT0gVy5pbnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0luSW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBwYXJlbnRJbnMgPSBydW4uUGFyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgZ3JhbmRQYXJlbnRQYXJhZ3JhcGggPSBwYXJlbnRJbnMuUGFyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyYW5kUGFyZW50UGFyYWdyYXBoICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJpbmcpIHBhcmVudElucy5BdHRyaWJ1dGVzKFcuYXV0aG9yKS5GaXJzdE9yRGVmYXVsdCgpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uVHJhY2tpbmdBdXRob3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBwYXJlbnRJbnNTaWJsaW5ncyA9IGdyYW5kUGFyZW50UGFyYWdyYXBoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGMgPT4gYyAhPSBwYXJlbnRJbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW5kUGFyZW50UGFyYWdyYXBoLlJlcGxhY2VOb2RlcyhwYXJlbnRJbnNTaWJsaW5ncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IHBhcmVudEluc1NpYmxpbmdzID0gZ3JhbmRQYXJlbnRQYXJhZ3JhcGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGMgPT4gYyA9PSBwYXJlbnRJbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBYRWxlbWVudChXLmlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5zLkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5hdXRob3IsIHJldmlzaW9uVHJhY2tpbmdBdXRob3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5kYXRlLCBEYXRlVGltZS5VdGNOb3cuVG9TdHJpbmcoInMiKSArICJaIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbnMuRWxlbWVudHMoKS5TZWxlY3QoVHJhbnNmb3JtVG9EZWxUZXh0KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZFBhcmVudFBhcmFncmFwaC5SZXBsYWNlTm9kZXMocGFyZW50SW5zU2libGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWxSdW4gPSBuZXcgWEVsZW1lbnQoVy5kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5hdXRob3IsIHJldmlzaW9uVHJhY2tpbmdBdXRob3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuZGF0ZSwgRGF0ZVRpbWUuVXRjTm93LlRvU3RyaW5nKCJzIikgKyAiWiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybVRvRGVsVGV4dChydW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bi5SZXBsYWNlV2l0aChkZWxSdW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAvLyBub3QgdHJhY2tlZCByZXZpc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBydW5Ub0RlbGV0ZSBpbiBydW5Db2xsZWN0aW9uLlNraXAoMSkuVG9MaXN0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW5Ub0RlbGV0ZS5QYXJlbnQgIT0gbnVsbCAmJiBydW5Ub0RlbGV0ZS5QYXJlbnQuTmFtZSA9PSBXLmlucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blRvRGVsZXRlLlBhcmVudC5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuVG9EZWxldGUuUmVtb3ZlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjb2FsZXNjZSBydW5zIGFzIHNvbWUgbWV0aG9kcywgZS5nLiwgaW4gRG9jdW1lbnRBc3NlbWJsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCB0cnkgdG8gZmluZCB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nIGV2ZW4gdGhvdWdoIHRoZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgY29hbGVzY2VDb250ZW50IHRvIGZhbHNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuZXdUZXh0VmFsdWUgPSBtYXRjaC5SZXN1bHQocmVwbGFjZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IG5ld1J1bnMgPSBVbmljb2RlTWFwcGVyLlN0cmluZ1RvQ29hbGVzY2VkUnVuTGlzdChuZXdUZXh0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UnVuUHJvcGVydGllcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0UnVuLlBhcmVudCAhPSBudWxsICYmIGZpcnN0UnVuLlBhcmVudC5OYW1lID09IFcuaW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJ1bi5QYXJlbnQuUmVwbGFjZVdpdGgobmV3UnVucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJ1bi5SZXBsYWNlV2l0aChuZXdSdW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2FsZXNjZUNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgID8gV29yZHByb2Nlc3NpbmdNTFV0aWwuQ29hbGVzY2VBZGphY2VudFJ1bnNXaXRoSWRlbnRpY2FsRm9ybWF0dGluZyhwYXJhZ3JhcGhXaXRoU3BsaXRSdW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBwYXJhZ3JhcGhXaXRoU3BsaXRSdW5zOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBuZXdQYXJhZ3JhcGggPSBuZXcgWEVsZW1lbnQoVy5wLAorICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGguQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGguTm9kZXMoKS5TZWxlY3QobiA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG4gYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PSBudWxsKSByZXR1cm4gbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuTmFtZSA9PSBXLnBQcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGUuTmFtZSA9PSBXLnIpICYmIGUuRWxlbWVudHMoVy50KS5BbnkoKSkgfHwgZS5FbGVtZW50cyhXLnRhYikuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGUuTmFtZSA9PSBXLmlucykgJiYgZS5FbGVtZW50cyhXLnIpLkVsZW1lbnRzKFcudCkuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXbWxTZWFyY2hBbmRSZXBsYWNlVHJhbnNmb3JtKGUsIHJlZ2V4LCByZXBsYWNlbWVudCwgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tSZXZpc2lvbnMsIHJldmlzaW9uVHJhY2tpbmdBdXRob3IsIHJlcGxJbmZvLCBjb2FsZXNjZUNvbnRlbnQpOworICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvYWxlc2NlQ29udGVudAorICAgICAgICAgICAgICAgICAgICA/IFdvcmRwcm9jZXNzaW5nTUxVdGlsLkNvYWxlc2NlQWRqYWNlbnRSdW5zV2l0aElkZW50aWNhbEZvcm1hdHRpbmcobmV3UGFyYWdyYXBoKSAvLyBDb2FsZXNjZUNvbnRlbnQobmV3UGFyYWdyYXBoKQorICAgICAgICAgICAgICAgICAgICA6IG5ld1BhcmFncmFwaDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLmlucyAmJiBlbGVtZW50LkVsZW1lbnRzKFcucikuQW55KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTGlzdDxvYmplY3Q+IGNvbGxlY3Rpb25PZkNvbGxlY3Rpb25zID0gZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KG4gPT4gV21sU2VhcmNoQW5kUmVwbGFjZVRyYW5zZm9ybShuLCByZWdleCwgcmVwbGFjZW1lbnQsIGNhbGxiYWNrLCB0cmFja1JldmlzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uVHJhY2tpbmdBdXRob3IsIHJlcGxJbmZvLCBjb2FsZXNjZUNvbnRlbnQpKQorICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgTGlzdDxvYmplY3Q+IGNvbGxlY3Rpb25PZklucyA9IGNvbGxlY3Rpb25PZkNvbGxlY3Rpb25zCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoYyA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudHMgPSBjIGFzIElFbnVtZXJhYmxlPFhFbGVtZW50PjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50cyAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlbGVtZW50cy5TZWxlY3QoaXhjID0+IG5ldyBYRWxlbWVudChXLmlucywgZWxlbWVudC5BdHRyaWJ1dGVzKCksIGl4YykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjOworICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25PZkluczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgIT0gVy5yUHIpCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZSA9PiBlLk5hbWUgPT0gVy50CisgICAgICAgICAgICAgICAgICAgICAgICA/ICgoc3RyaW5nKSBlKS5TZWxlY3QoYyA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoVy5yUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50LCBYbWxVdGlsLkdldFhtbFNwYWNlQXR0cmlidXRlKGMpLCBjKSkpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG5ld1tdIHsgbmV3IFhFbGVtZW50KFcuciwgZWxlbWVudC5FbGVtZW50cyhXLnJQciksIGUpIH0pCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3RNYW55KHQgPT4gdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKQorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KG4gPT4gV21sU2VhcmNoQW5kUmVwbGFjZVRyYW5zZm9ybShuLCByZWdleCwgcmVwbGFjZW1lbnQsIGNhbGxiYWNrLCB0cmFja1JldmlzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uVHJhY2tpbmdBdXRob3IsIHJlcGxJbmZvLCBjb2FsZXNjZUNvbnRlbnQpKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgVHJhbnNmb3JtVG9EZWxUZXh0KFhOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBub2RlOworCisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuZGVsVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgWG1sVXRpbC5HZXRYbWxTcGFjZUF0dHJpYnV0ZShlbGVtZW50LlZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5WYWx1ZSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QoVHJhbnNmb3JtVG9EZWxUZXh0KSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgUG1sU2VhcmNoQW5kUmVwbGFjZVRyYW5zZm9ybShYTm9kZSBub2RlLCBSZWdleCByZWdleCwgc3RyaW5nIHJlcGxhY2VtZW50LAorICAgICAgICAgICAgRnVuYzxYRWxlbWVudCwgTWF0Y2gsIGJvb2w+IGNhbGxiYWNrLCBSZXBsYWNlSW50ZXJuYWxJbmZvIGNvdW50ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBub2RlOworCisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IEEucCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBwYXJhZ3JhcGggPSBlbGVtZW50OworICAgICAgICAgICAgICAgIHN0cmluZyBjb250ZW50cyA9IGVsZW1lbnQuRGVzY2VuZGFudHMoQS50KS5TZWxlY3QodCA9PiAoc3RyaW5nKSB0KS5TdHJpbmdDb25jYXRlbmF0ZSgpOworICAgICAgICAgICAgICAgIGlmICghcmVnZXguSXNNYXRjaChjb250ZW50cykpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLCBlbGVtZW50LkF0dHJpYnV0ZXMoKSwgZWxlbWVudC5Ob2RlcygpKTsKKworICAgICAgICAgICAgICAgIHZhciBwYXJhZ3JhcGhXaXRoU3BsaXRSdW5zID0gbmV3IFhFbGVtZW50KEEucCwKKyAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoLkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoLk5vZGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QobiA9PiBQbWxTZWFyY2hBbmRSZXBsYWNlVHJhbnNmb3JtKG4sIHJlZ2V4LCByZXBsYWNlbWVudCwgY2FsbGJhY2ssIGNvdW50ZXIpKSk7CisKKyAgICAgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBydW5zVHJpbW1lZCA9IHBhcmFncmFwaFdpdGhTcGxpdFJ1bnMKKyAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKEEucikKKyAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICAgICAgdmFyIGNoYXJzQW5kUnVucyA9IHJ1bnNUcmltbWVkCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QociA9PgorICAgICAgICAgICAgICAgICAgICAgICAgci5FbGVtZW50KEEudCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IHsgQ2ggPSByLkVsZW1lbnQoQS50KS5WYWx1ZSwgciB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgeyBDaCA9ICJceDAxIiwgciB9KQorICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICBzdHJpbmcgY29udGVudCA9IGNoYXJzQW5kUnVucy5TZWxlY3QodCA9PiB0LkNoKS5TdHJpbmdDb25jYXRlbmF0ZSgpOworICAgICAgICAgICAgICAgIFhFbGVtZW50W10gYWxpZ25lZFJ1bnMgPSBjaGFyc0FuZFJ1bnMuU2VsZWN0KHQgPT4gdC5yKS5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICBNYXRjaENvbGxlY3Rpb24gbWF0Y2hDb2xsZWN0aW9uID0gcmVnZXguTWF0Y2hlcyhjb250ZW50KTsKKyAgICAgICAgICAgICAgICBjb3VudGVyLkNvdW50ICs9IG1hdGNoQ29sbGVjdGlvbi5Db3VudDsKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKE1hdGNoIG1hdGNoIGluIG1hdGNoQ29sbGVjdGlvbi5DYXN0PE1hdGNoPigpKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socGFyYWdyYXBoLCBtYXRjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKE1hdGNoIG1hdGNoIGluIG1hdGNoQ29sbGVjdGlvbi5DYXN0PE1hdGNoPigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrICE9IG51bGwpICYmICFjYWxsYmFjayhwYXJhZ3JhcGgsIG1hdGNoKSkgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IHJ1bkNvbGxlY3Rpb24gPSBhbGlnbmVkUnVucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ta2lwKG1hdGNoLkluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UYWtlKG1hdGNoLkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXMgdGhlIFNraXAgLyBUYWtlIHNwZWNpYWwgc2VtYW50aWNzIG9mIGFycmF5IHRvIGltcGxlbWVudCBlZmZpY2llbnQgZmluZGluZyBvZiBzdWIgYXJyYXkKKworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgZmlyc3RSdW4gPSBydW5Db2xsZWN0aW9uLkZpcnN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgYXdheSBmaXJzdCBydW4gYmVjYXVzZSB3ZSB3YW50IHRoZSBydW4gcHJvcGVydGllcworCisgICAgICAgICAgICAgICAgICAgICAgICBydW5Db2xsZWN0aW9uLlNraXAoMSkuUmVtb3ZlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpbmRzIHRvIFJlbW92ZSh0aGlzIElFbnVtZXJhYmxlPFhFbGVtZW50PiBlbGVtZW50cyksIHdoaWNoIGlzIGFuIGV4dGVuc2lvbgorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBMSU5RIHRvIFhNTCB0aGF0IHVzZXMgc25hcHNob3Qgc2VtYW50aWNzIGFuZCByZW1vdmVzIGV2ZXJ5IGVsZW1lbnQgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIHBhcmVudC4KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0ZpcnN0UnVuID0gbmV3IFhFbGVtZW50KEEuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJ1bi5FbGVtZW50KEEuclByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQS50LCByZXBsYWNlbWVudCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVzIGEgbmV3IHJ1biB3aXRoIHByb3BlciBydW4gcHJvcGVydGllcworCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJ1bi5SZXBsYWNlV2l0aChuZXdGaXJzdFJ1bik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmRzIGZpcnN0UnVuIGluIGl0cyBwYXJlbnQncyBsaXN0IG9mIGNoaWxkcmVuLCB1bnBhcmVudHMgZmlyc3RSdW4sCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHMgbmV3Rmlyc3RSdW4ncyBwYXJlbnQgdG8gZmlyc3RSdW5zIG9sZCBwYXJlbnQsIGFuZCBpbnNlcnRzIGluIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBjaGlsZHJlbiBhdCB0aGUgcmlnaHQgcGxhY2UuCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgcGFyYWdyYXBoV2l0aFJlcGxhY2VkUnVucyA9IHBhcmFncmFwaFdpdGhTcGxpdFJ1bnM7CisKKyAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8SUdyb3VwaW5nPHN0cmluZywgWEVsZW1lbnQ+PiBncm91cGVkQWRqYWNlbnRSdW5zV2l0aElkZW50aWNhbEZvcm1hdHRpbmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoV2l0aFJlcGxhY2VkUnVucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoY2UgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZS5OYW1lICE9IEEucikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEb250Q29uc29saWRhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2UuRWxlbWVudHMoKS5Db3VudChlID0+IGUuTmFtZSAhPSBBLnJQcikgIT0gMSkgfHwgKGNlLkVsZW1lbnQoQS50KSA9PSBudWxsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEb250Q29uc29saWRhdGU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgclByID0gY2UuRWxlbWVudChBLnJQcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByUHIgPT0gbnVsbCA/ICIiIDogclByLlRvU3RyaW5nKFNhdmVPcHRpb25zLk5vbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYWdyYXBoV2l0aENvbnNvbGlkYXRlZFJ1bnMgPSBuZXcgWEVsZW1lbnQoQS5wLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZEFkamFjZW50UnVuc1dpdGhJZGVudGljYWxGb3JtYXR0aW5nLlNlbGVjdChnID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuS2V5ID09IERvbnRDb25zb2xpZGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmplY3QpIGc7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGV4dFZhbHVlID0gZy5TZWxlY3QociA9PiByLkVsZW1lbnQoQS50KS5WYWx1ZSkuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYQXR0cmlidXRlIHhzID0gWG1sVXRpbC5HZXRYbWxTcGFjZUF0dHJpYnV0ZSh0ZXh0VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoQS5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLkZpcnN0KCkuRWxlbWVudHMoQS5yUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQS50LCB4cywgdGV4dFZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaCA9IHBhcmFncmFwaFdpdGhDb25zb2xpZGF0ZWRSdW5zOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBwYXJhZ3JhcGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZWxlbWVudC5OYW1lID09IEEucikgJiYgZWxlbWVudC5FbGVtZW50cyhBLnQpLkFueSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gZS5OYW1lICE9IEEuclByKQorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuTmFtZSA9PSBBLnQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSAoc3RyaW5nKSBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlPFhFbGVtZW50PiBjb2xsZWN0aW9uT2ZTdWJSdW5zID0gcy5TZWxlY3QoYyA9PiBuZXcgWEVsZW1lbnQoQS5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKEEuclByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEEudCwgWG1sVXRpbC5HZXRYbWxTcGFjZUF0dHJpYnV0ZShjKSwgYykpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iamVjdCkgY29sbGVjdGlvbk9mU3ViUnVuczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChBLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cyhBLnJQciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gUG1sU2VhcmNoQW5kUmVwbGFjZVRyYW5zZm9ybShuLCByZWdleCwgcmVwbGFjZW1lbnQsIGNhbGxiYWNrLCBjb3VudGVyKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBSZXBsYWNlSW50ZXJuYWxJbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgQ291bnQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9PeFB0SGVscGVycy5jcyBiL09wZW5YbWxQb3dlclRvb2xzL094UHRIZWxwZXJzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNTI4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9PeFB0SGVscGVycy5jcwpAQCAtMCwwICsxLDY5NCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5Xb3JkcHJvY2Vzc2luZzsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuVmFsaWRhdGlvbjsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sOwordXNpbmcgU3lzdGVtLkRyYXdpbmcuSW1hZ2luZzsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBZGREb2N4VGV4dEhlbHBlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBXbWxEb2N1bWVudCBBcHBlbmRQYXJhZ3JhcGhUb0RvY3VtZW50KAorICAgICAgICAgICAgV21sRG9jdW1lbnQgd21sRG9jLAorICAgICAgICAgICAgc3RyaW5nIHN0clBhcmFncmFwaCwKKyAgICAgICAgICAgIGJvb2wgaXNCb2xkLAorICAgICAgICAgICAgYm9vbCBpc0l0YWxpYywKKyAgICAgICAgICAgIGJvb2wgaXNVbmRlcmxpbmUsCisgICAgICAgICAgICBzdHJpbmcgZm9yZUNvbG9yLAorICAgICAgICAgICAgc3RyaW5nIGJhY2tDb2xvciwKKyAgICAgICAgICAgIHN0cmluZyBzdHlsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgc3RyZWFtRG9jID0gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCh3bWxEb2MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBzdHJlYW1Eb2MuR2V0V29yZHByb2Nlc3NpbmdEb2N1bWVudCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3R5bGVEZWZpbml0aW9uc1BhcnQgcGFydCA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5TdHlsZURlZmluaXRpb25zUGFydDsKKworICAgICAgICAgICAgICAgICAgICBCb2R5IGJvZHkgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuRG9jdW1lbnQuQm9keTsKKworICAgICAgICAgICAgICAgICAgICBTZWN0aW9uUHJvcGVydGllcyBzZWN0aW9uUHJvcGVydGllcyA9IGJvZHkuRWxlbWVudHM8U2VjdGlvblByb3BlcnRpZXM+KCkuRmlyc3RPckRlZmF1bHQoKTsKKworICAgICAgICAgICAgICAgICAgICBQYXJhZ3JhcGggcGFyYWdyYXBoID0gbmV3IFBhcmFncmFwaCgpOworICAgICAgICAgICAgICAgICAgICBSdW4gcnVuID0gcGFyYWdyYXBoLkFwcGVuZENoaWxkKG5ldyBSdW4oKSk7CisgICAgICAgICAgICAgICAgICAgIFJ1blByb3BlcnRpZXMgcnVuUHJvcGVydGllcyA9IG5ldyBSdW5Qcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQm9sZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1blByb3BlcnRpZXMuQXBwZW5kQ2hpbGQobmV3IEJvbGQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzSXRhbGljKQorICAgICAgICAgICAgICAgICAgICAgICAgcnVuUHJvcGVydGllcy5BcHBlbmRDaGlsZChuZXcgSXRhbGljKCkpOworCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShmb3JlQ29sb3IpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3JWYWx1ZSA9IFN5c3RlbS5EcmF3aW5nLkNvbG9yLkZyb21OYW1lKGZvcmVDb2xvcikuVG9BcmdiKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JWYWx1ZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJBZGQtRG9jeFRleHQ6IFRoZSBzcGVjaWZpZWQgY29sb3IgezB9IGlzIHVuc3VwcG9ydGVkLCBQbGVhc2Ugc3BlY2lmeSB0aGUgdmFsaWQgY29sb3IuIEV4LCBSZWQsIEdyZWVuIiwgZm9yZUNvbG9yKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBDb2xvckhleCA9IHN0cmluZy5Gb3JtYXQoInswOng2fSIsIGNvbG9yVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcnVuUHJvcGVydGllcy5BcHBlbmRDaGlsZChuZXcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5Xb3JkcHJvY2Vzc2luZy5Db2xvcigpIHsgVmFsID0gQ29sb3JIZXguU3Vic3RyaW5nKDIpIH0pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzVW5kZXJsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgcnVuUHJvcGVydGllcy5BcHBlbmRDaGlsZChuZXcgVW5kZXJsaW5lKCkgeyBWYWwgPSBVbmRlcmxpbmVWYWx1ZXMuU2luZ2xlIH0pOworCisgICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoYmFja0NvbG9yKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yU2hhZGUgPSBTeXN0ZW0uRHJhd2luZy5Db2xvci5Gcm9tTmFtZShiYWNrQ29sb3IpLlRvQXJnYigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yU2hhZGUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiQWRkLURvY3hUZXh0OiBUaGUgc3BlY2lmaWVkIGNvbG9yIHswfSBpcyB1bnN1cHBvcnRlZCwgUGxlYXNlIHNwZWNpZnkgdGhlIHZhbGlkIGNvbG9yLiBFeCwgUmVkLCBHcmVlbiIsIGZvcmVDb2xvcikpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgQ29sb3JTaGFkZUhleCA9IHN0cmluZy5Gb3JtYXQoInswOng2fSIsIGNvbG9yU2hhZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcnVuUHJvcGVydGllcy5BcHBlbmRDaGlsZChuZXcgU2hhZGluZygpIHsgRmlsbCA9IENvbG9yU2hhZGVIZXguU3Vic3RyaW5nKDIpLCBWYWwgPSBTaGFkaW5nUGF0dGVyblZhbHVlcy5DbGVhciB9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc3R5bGVOYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUgc3R5bGUgPSBwYXJ0LlN0eWxlcy5FbGVtZW50czxTdHlsZT4oKS5XaGVyZShzID0+IHMuU3R5bGVJZCA9PSBzdHlsZU5hbWUpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIHRoZSBzcGVjaWZpZWQgc3R5bGUgaXMgbm90IHByZXNlbnQgaW4gd29yZCBkb2N1bWVudCBhZGQgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbWVtb3J5U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3JlZ2lvbiBEZWZhdWx0LmRvdHggVGVtcGxhdGUgaGFzIGJlZW4gdXNlZCB0byBnZXQgYWxsIHRoZSBwYXJhZ3JhcGggc3R5bGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBiYXNlNjQgPQorICAgICAgICBAIlVFc0RCQlFBQmdBSUFBQUFJUURUTUI4dVhnRUFBQ0FGQUFBVEFBQUFXME52Ym5SbGJuUmZWSGx3WlhOZExuaHRiTFNVeTI3Q01CQkYKKzk1WDZENUczVldMb29xb3FBb3MrbGkxUzZRY1lld0pXL1pJOXZQNitFd0tvcWlDUkNtd2lKVFAzM2pOV3hvUFIycHBzQ1RGcDcwclcKK0wzb3NBeWU5MG01V3NxL0pXLzdJc29UQ0tXRzhnNUp0SUxIUjhQWm1NTmtFU0JtcFhTclpIREU4Y1o3a0hLeEloUS9ncUZMNWFBWFMKK2E1enhJT1MzbUFHLzcvVWV1UFFPd1dHT3RRY2JEbDZnRWd1RDJldWFQamNrRVV4aTJYUFRXR2VWVElSZ3RCUklkYjUwNms5S3Zrc28KK1NMbnRTWE1kMGgwMU1INDBvYTZjRHRqcFB1aG9vbGFRalVYRWQyR3BpNjk4VkZ4NXViQ2tMTnB0am5ENnF0SVNEdnJhTFVRdklTVTYKK2Myc0tCQnRvQWlpczBHN1BmNUlqNGNaQXVqeEY0OXNkRDRna3VBYkF6cmtUWVFYVHo2dFIvREx2Qktrb2R5S21CaTZQY2JEdWhFRGEKK1FHaWUvYk01dGpadGtkUTVqajRrMnVqNGo3SDNLMXVyY3hvNFFFVGQvdGNkRXNuNjdQbWd2ZzBVcUNQWmZIdS9EWDhBQUFELy93TUEKK1VFc0RCQlFBQmdBSUFBQUFJUUFla1JxMzd3QUFBRTRDQUFBTEFBQUFYM0psYkhNdkxuSmxiSE9za3NGcXd6QU1RTytEL1lQUnZWSGEKK3dSaWpUaTlqME5zWTJRY0lXMGxNRTl2WWF0ZisvVHpZMkFKZDZXRkh5OUxUazlCNmM1eEdkZUNVWGZBYWxsVU5pcjBKMXZsZXcxdjcKK3ZIZ0FsWVc4cFRGNDFuRGlESnZtOW1iOXlpTkpLY3FEaTFrVmlzOGFCcEg0aUpqTndCUGxLa1QyNWFjTGFTSXB6OVJqSkxPam5uRlYKKzEvZVlmak9nbVRIVjFtcElXM3NIcWoxRnZvWWR1czRaZmdwbVA3R1hNeTJRajhMZXNsM0VWT3FUdURLTmFpbjFMQnBzTUM4bG5KRmkKK3JBb2E4THpSNm5xanY2ZkZpWVVzQ2FFSmlTLzdmR1pjRWxyKzU0cm1HVDgyN3lGWnRGL2hieHVjWFVIekFRQUEvLzhEQUZCTEF3UVUKK0FBWUFDQURSYWdaQi9GejlmTllCQUFBTEF3QUFFQUFBQUdSdlkxQnliM0J6TDJGd2NDNTRiV3p0dlFkZ0hFbVdKU1l2YmNwN2YwcjEKK1N0ZmdkS0VJZ0dBVEpOaVFRQkRzd1lqTjVwTHNIV2xISXltcktvSEtaVlpsWFdZV1FNenRuYnozM252dnZmZmVlKys5OTdvN25VNG4KKzk5Ly9QMXhtWkFGczlzNUsyc21lSVlDcXlCOC9mbndmUHlMK3g3LzNIM3o4ZTd4YmxPbGxYamRGdGZ6c285M3h6a2RwdnB4V3MySjUKKzhkbEg2L1o4KytDanRHbXo1U3dycTJYKzJVZlhlZlBSNzNIME9GczllbGxYcTd4dWk3eEpDY2F5ZVhUWmZ2YlJ2RzFYais3ZWJhYnoKK2ZKRTFZMnF4cEMvUHEzcVJ0ZlJuZlhHM09qOHZwdm5UYXJwZTVNdjI3dDdPenFkM1o5VVUwSnFmZkhPOUl2Z0tMMXQ5WFhqNXV6WmYKK3p2TFo5c3JpK0JIai9DWmZyTXFzelk4ZTN3Myt3aDlWbTVWdmlrVit0Q05mMnI5NXNObEYzaHp0OGpmeU96NzlibFhQR20wdnYrUFQKK2szbFdaOU9XYUtwZmVSL2crK1BWcWl5bVdVc1VQL3FpbU5aVlU1MjM2WmM4amhSZytDVy9GZDZpRWI3T3ArdTZhSzhWclA4Sldqd3YKK2xybnBVbjRYek92c29zNVdjL09WOXdHK2Z6M055dnlFNkhSMG5wVk56azNjWndyM2JmUFY2azMxRkxSeXJjTFB3NUYvdDJqbnIxZloKKzFDSVUvWXI3cHkveUdZM0Y3OTkraGhiZkpxYW9TM1JHUUpZWCtjeHIyZjlPS2Z5VHd0Skh1L2ZITy9RWWtwcVBoUktXTzQ3K0gxQkwKK0F3UVVBQVlBQ0FEUmFnWkJVc1A5UXJvQkFBQnZBZ0FBRVFBQUFHUnZZMUJ5YjNCekwyTnZjbVV1ZUcxczdiMEhZQnhKbGlVbUwyM0sKK2UzOUs5VXJYNEhTaENJQmdFeVRZa0VBUTdNR0l6ZWFTN0IxcFJ5TXBxeXFCeW1WV1pWMW1Ga0RNN1oyODk5NTc3NzMzM252dnZmZTYKK081MU9KL2ZmL3o5Y1ptUUJiUGJPU3RySm5pR0Fxc2dmUDM1OEh6OGlIdjhlN3habGVwblhUVkV0UC90b2Q3enpVWm92cDlXc1dGNTgKKzl0RlhiNTV0SDN5VU5tMjJuR1ZsdGN3LysrZzZiejc2UFk2U3g5UFZvMmxWNXkvcmFwWFhiWkUzS1FGYU5vK21xODgrbXJmdDZ0SGQKK3U4MTBuaSt5Wmt3dGx2VGxlVlV2c3BiK3JDL3VyckxwMit3aXY3dTNzL1BwM1VYZVpyT3N6ZTRDNFBiS1F2eElRYzZtRnVScVhaY00KK1lEYTltNWY1SWwrMnpkM2Q4ZTVkMTdiTjYwVVRmWUcvOFZvdWl2WjZsVWVibWk5dDYzZE5ZUnRlWFYyTnIrNXhVOEovOSs3di9jWHoKKzF6elU3V0lKVWszemo0NGV6NmFQcG5XZXRWVjlkSklWYlZrczArTm1YdWJYMjYrcXNseGt5OGQzdlNZZ1o1azE3UmRFK1BNaW56MjUKK3ZzdWYxZmxsZ1prNTJuMTgxLy96c1k1VEFPU3psUEI3SktNeDMzejMzc25UTjg4K090cmIyZDNiM25td3ZYZi96ZTZEUjN2M0grM3MKKy9CVDZEdDUzQUJlS3dXMGczbnV6dC90b3Z3UFJBRGhpakVNZU9mcC9BRkJMQXdRVUFBWUFDQUFBQUNFQTFtU3pVZlFBQUFBeEF3QUEKK0hBQUFBSGR2Y21RdlgzSmxiSE12Wkc5amRXMWxiblF1ZUcxc0xuSmxiSE9za3N0cXd6QVFSZmVGL29PWWZTMDdmVkJDNUd4S0lkdlcKKy9RQkZIaitvTEFuTjlPRy9yMGhKNjlCZ3V2QnlycGh6ejRBMjI4L0JpbmVNMUh1bm9NaHlFT2lNcjN2WEtuaXBIcS91UVJCclYydnIKK0hTb1lrV0JiWGw1c250QnFUa3ZVOVlGRW9qaFMwREdIdFpSa09odzBaVDZnU3krTmo0UG1OTVpXQm0xZWRZdHlsZWQzTWs0WlVKNHcKK3hhNVdFSGYxTllocURQZ2Z0bSthM3VDRE4yOERPajVUSVQ5dy80ek02VGhLV0IxYlpBV1RNRXRFa09kRlZrdUswQitMWXpLblVDeXEKK3dLUEZxY0JobnF1L1hiS2UweTcrdGgvRzc3Q1ljN2haMHFIeGppdTl0eE9Qbitnb0lVOCtldmtGQUFELy93TUFVRXNEQkJRQUJnQUkKK0FORnFCa0Y2NVROM013SUFBSkFGQUFBUkFBQUFkMjl5WkM5a2IyTjFiV1Z1ZEM1NGJXenR2UWRnSEVtV0pTWXZiY3A3ZjByMVN0ZmcKK2RLRUlnR0FUSk5pUVFCRHN3WWpONXBMc0hXbEhJeW1yS29IS1pWWmxYV1lXUU16dG5iejMzbnZ2dmZmZWUrKzk5N283blU0bjk5Ly8KK1AxeG1aQUZzOXM1SzJzbWVJWUNxeUI4L2Zud2ZQeUwreDcvM0gzejhlN3hibE9sbFhqZEZ0ZnpzbzkzeHprZHB2cHhXczJKNThkbEgKKzYvWjgrK0NqdEdtejVTd3JxMlgrMlVmWGVmUFI3M0gwK09yUnJKcXVGL215VFFuQXNubDB0WnArOXRHOGJWZVA3dDV0cHZOOGtUWGoKK1JUR3RxNlk2YjhmVGFuRzNPajh2cHZuZHE2cWUzZDNiMmQzaDMxWjFOYzJiaG5vN3laYVhXZk9SZ2x2MG9WV3JmRWxmbmxmMUltdnAKK3ovcmk3aUtyMzY1WDJ3UjlsYlhGcENpTDlwcGc3M3hxd0ZRMGhucjVTRUZzVzRUd3lpTkJTSCtZTityYjlDdXZQRlVLY0k5MzY3d2sKK0hLcGxNeTlXYmhoZkZ4cDlPVGRBTGpjTjRuSlJtblpYcTkzOUQ1dURwM1YyUlQ4Y3dOdWdQNU9YRnFWZ3Zobmk3czR0WmdRZzdCdTMKK1FTSHMwMkN5eUlxbDYvaHJrY1lqN3U3OTl3T3cxd1d3dW5nL0FOM0orYnl1MWlzSHJmZ3dhR2ZMdHhZVzVQbzlZT2trKzBOcjNndEEKK0Q1blg4MnhGRXJpWVBqcTdXRloxTmlrSkk1cXlsS2llZ3EwL2dzYVpWTE5yL0Z5bGQvR2p5YWZ0eTVvL3VIajlnL1FLckxLN3Q3ZFAKK0d1enEwWngrdjMrQTMrOUtpeSt5bWo1dUsyTHAzWDFwVXhjWDg5YjlPYW5hdGxxNHY4djgzUHQybm1lem5KVERnejMrODd5cVd1L1AKK2kzWExmNXIrcGxYWjBNZk5LcHZtMm9nK3YrdVF2bXVHYzlkcDBxUC9CMUJMQXdRVUFBWUFDQURSYWdaQjNpWnhWWm9DQUFBekJ3QUEKK0VnQUFBSGR2Y21RdlptOXVkRlJoWW14bExuaHRiTzI5QjJBY1NaWWxKaTl0eW50L1N2VksxK0Iwb1FpQVlCTWsySkJBRU96QmlNM20KK2t1d2RhVWNqS2FzcWdjcGxWbVZkWmhaQXpPMmR2UGZlZSsrOTk5NTc3NzMzdWp1ZFRpZjMzLzgvWEdaa0FXejJ6a3JheVo0aGdLckkKK0h6OStmQjgvSXY3SHYvY2ZmUHg3dkZ1VTZXVmVOMFcxL095ajNmSE9SMm0rbkZhellubngyVWZyOW56NzRLTzBhYlBsTEN1clpmN1oKK1I5ZDU4OUh2Y2ZUNDZ0RjV0V3libE41ZU5vOFcwODgrbXJmdDZ0SGR1ODEwbmkreVpseXQ4aVY5ZVY3Vmk2eWxQK3VMdTR1c2ZydGUKK2JVK3J4U3ByaTBsUkZ1MzEzYjJkblU4L1VqRDFiYUJVNStmRk5IOWFUZGVMZk5ueSszZnJ2Q1NJMWJLWkY2dkdRTHU2RGJTcnFwNnQKKzZtcWFOdzJOZUZFS3ZFVldMQzJZM2YwZW9FVXhyYXVtT20vSE5CakZpRUhSNjdzNy9OdWlkQUR1dngrQVBRdGdNWDEwZHJHczZteFMKK0V1a0prNVNBZldTb24xNDlXbVlMK3VJa0s0dEpYZkFYcTJ4Wk5ma3VmWGVabFo5OXRMTzM4MnpuUHYyTC8vWjM3dUhmajlLN2FEbWQKK1ozV1R0N2Jsam41K25pMks4dHA4M0Z3VlRhUGZySXAyT2pkZlhHWjFBYnowdTZhNG9HL1d6V1RuczQ5T2QralplL2JzSS9sazk3T1AKKzl1bUQ0eFA3eVI2NjQyZFhQN2xuUDluQkoxT0dJeTBlUHROUGR2MDIxT2xkSVVPUEhLK0x4ZXYxa3FtUmxlMEwrc3pnL0ovL0RYL3MKK2YvYjMvNmxtTkQxSzdlNThTckR2MFUvOUwwNnBnMCtqbE1yV2JmV2VoTkxSM0hPRTJqczRlR2FJNEJOcTk5TWJDQVVLNzc0bm9ZNEoKK3NYS0FhNTRRTGZhVmIvWithRnl6ZCt4enpRbDk4dUJnMzVESGNjM0RtN25tMmZ0eWpRcFIrcnk0bUxlRG9uVFBrT09ISkVySHdIdnYKK3RDTktlenNQbnZTSVluaG1tQ2c3N3kxS2I0cEYzcVF2OHF2MFZiWElsZ05rMlNOZXVVZGFacDgxemIzM0pFdk5rTitQTEQ5c1h0RmYKK21xUC9CMUJMQXdRVUFBUUFDQURSYWdaQmhvSmRTUjBFQUFCNUNRQUFFUUFBQUhkdmNtUXZjMlYwZEdsdVozTXVlRzFzN2IwSFlCeEoKK2xpVW1MMjNLZTM5SzlVclg0SFNoQ0lCZ0V5VFlrRUFRN01HSXplYVM3QjFwUnlNcHF5cUJ5bVZXWlYxbUZrRE03WjI4OTk1Nzc3MzMKKzNudnZ2ZmU2TzUxT0ovZmYvejljWm1RQmJQYk9TdHJKbmlHQXFzZ2ZQMzU4SHo4aS9zZS85eDk4L0h1OFc1VHBaVjQzUmJYODdLUGQKKzhjNUhhYjZjVnJOaWVmSFpSK3YyZlB2Z283UnBzK1VzSzZ0bC90bEgxM256MGU5eDlQanFVWk8zTFRWcVVnS3diQjR0cHA5OU5HL2IKKzFhTzdkNXZwUEY5a3piaGE1VXY2OHJ5cUYxbExmOVlYZHhkWi9YYTkycDVXaTFYV0ZwT2lMTnJydTNzN081OStwR0FxNnJSZVBsSVEKKzI0dGlXbGROZGQ3aWxVZlYrWGt4emZXSGVhTytUYi95eXROcXVsN2t5NVo3dkZ2bkplRlFMWnQ1c1dvTXRNWFhoVVpmemcyUXkwMkQKK3VGeVVwdDNWN3M0dGhudFYxVFA3eG0zUXd3dXJ1cHJtVFVNVHRDZ05nc1hTZGJ6ZkEyVDdIbFBmT2tRR1JhL3Y3dkJ2UHViMzN3L0EKK1hnZEFVOTVtSlBMVjgySlNaL1cxUDR6RjlOSFp4YktxczBsSlBFbkRTUW1qajhDV05QRHEvSFdidFhsS1BMckt5NUk1ZVZybUdiMTMKKzllaWl6aGJFaGZhVHUzaHBscDluNjdKOWswMWV0OVdLV2wxbWhOK0RuUVA5Zm42OW11ZEw1cGFmSWlrd0RmYjM3bXVENlR5cnMybWIKKzE2OVgyWlE2UEttV2JWMlZwdUdzZWxHMUo4VDBOYzJKZVlWbEFMOWxxMVY1L2FUT3M3ZjA1cXQxbVRmU1l0M2t6MDZmWjlmVnV2VmYKK2VTMkNSN0NYMllKR0h3alRGOVVzeHpEWGRYSDdDZnJJNExscnh4UHRxU0k5VVJlei9BM0kvcnE5THZObk5NN1h4US95NCtYc08rdW0KK0xRZ2tVK2tEVU5pSUFVMENkZjBsY2NxYjYxWCtMTS9hTlpIMFo2czNuclpuWmJINm9xanJxajViemtqY2YvWjZLODdQODVwNktJaDUKK3Z5QjJMT3JxaWtuOTdUeWJrWWIrMEk3dk9xWmJQSUsrZWxtYjN6Q1A2VUlhbjJTTFNWMWs2UmVzMGU2aXlhUisrNlJZbWdhVG5HUTAKK0Q3NTZ2WjZZYjdlMzladG1rWlhsTXhJTDg4Mk9makVybXRYVC9GeitLTC9JNmdzSDI3U3A0eCtUb0g3SHdwc1NyZkw2ODdwYXIvVHIKK3F6cGJ5U3laTnJ2NysrYmRZdGsrTHhibWkyWTllVzNmVzVKNjhiNWJMMmRmWHRaQ00wZXBxMGN0MFp0Wi9ubkc4OGFOViszMmsxZWcKK2RKNDE3WEZUWko5OTlJUDU5c2tMZkRRcFpqUmRXYjM5K3RoTWZWbS94clRsWDVEVXkreFBMblkvKzZnc0x1YnRMdDVwNmE4Wm1VbisKK1kzS3hwOS90OFhkNzhoMy9rVTFCQUdxdHY3alA5c3huWHJ0NzVyTjc3ck45ODltKysreSsrZXkrKyt4VDg5bW4rSXlVWVY2VFZuMUwKK2pHaCt4ZWZuVlZsV1YvbnMyKzc3M2tkS2hXYWVyZktub25TYm84ZVZmS0JhdUVrdkgrWHZXaEwyV2RHUzg3RXFab3ZzSFUzbHp0Nm4KKy9MNDJMMFV6K28zeEhWcXZRaEN6ck0yc0VBUnZzMUIwc0lFNW1CYkV2Syt2RnhPbnc4ZUtlMWswSkxvcjB2ZHRWWnN2Ui9MbDduMjIKK0JPMGI0bnBXNXZuNWs2ekpaeXA5eG1VNituOEFVRXNEQkJRQUJBQUlBTkZxQmtFcjkremhVeElBQUJXdEFBQVBBQUFBZDI5eVpDOXoKK2RIbHNaWE11ZUcxczdiMEhZQnhKbGlVbUwyM0tlMzlLOVVyWDRIU2hDSUJnRXlUWWtFQVE3TUdJemVhUzdCMXBSeU1wcXlxQnltVlcKK1pWMW1Ga0RNN1oyODk5NTc3NzMzM252dnZmZTZPNTFPSi9mZi96OWNabVFCYlBiT1N0ckpuaUdBcXNnZlAzNThIejhpL3NlLzl4OTgKKy9IdThXNVRwWlY0M1JiWDg3S1BkOGM1SGFiNmNWck5pZWZIWlIrdjJmUHZnbzdScHMrVXNLNnRsL3RsSDEzbnowZTl4OVBqcVVkTmUKK2wzbVQwdXZMNXRGaSt0bEg4N1pkUGJwN3Q1bk84MFhXakt0VnZxUXZ6NnQ2a2JYMFozMXhkNUhWYjllcjdXbTFXR1Z0TVNuS29yMisKK3U3ZXo4K2xIQ3FhK0RaVHEvTHlZNWsrcjZYcVJMMXQrLzI2ZGx3U3hXamJ6WXRVWWFGZTNnWFpWMWJOVlhVM3pwcUVoTDBxQnQ4aUsKK3BRV3p1OThEdENpbWRkVlU1KzJZQnFNWU1TaDZmWGVIZjF1VURzRDk5d093WndFc3BvL09McFpWblUxS29qMWhraEt3ajBEK1dUVjkKK21wOW42N0p0OEdmOXN0WS85Uy8rOGF4YXRrMTY5U2hycGtYeGhub21JSXVDNEgzN2VOa1VIOUUzYy93Uy9TYlBtdmE0S1RML3kxUDkKK0ROOVBtOWI3NWtreG83ZnVNbVA4Z0w2OXpNclBQdHJic3grZE5MMFB5Mng1WVQ3TWw5dGZ2Zlo3L2V5am44NjJ2L01TSDAwSTlHY2YKK1pmWDI2Mk4rODY2TzcyNTMxS3Z1WDl6MUtwc1czRkYyM3ViRVlEUy9nRm9XNE9hOUI1K2FQMTZ0UWVKczNWYW1sNVgyNHNPOTI2TTgKK01SNng0V3VSQnZvMlAzOWVUZC9tczljdGZmSFpSOXdaZmZqVjJjdTZxR3JpK004K2V2aFFQM3lkTDRwdkY3Tlp2dlFhTHVmRkxQL3UKK1BGOSsxZVF6OS9sUFBHT3UxUSttMVhwSnY5OTdzTXZjVURhejAzZlRmQVVab0crWEdTYm1CVjRvMFhwZHVNNzU5VjlrZ08yYXlZZ0IKK21PY1o5RUM2MjRYeDhQMWg3RVZoTkI0QnBKZk82SGZmdjZkN1A3U2U5bjlvUGQzL29mWDA2USt0cHdjL3RKNE9mbWc5UGZ4Wjc2bFkKK3p2SjNJcEczQVhzVG9MMXZDdEM5YndyUS9qY0Y2UDQzQmVqVGJ3clFnMjhLME1FM0Jlalc3RGtNcUsybWZRTng3eHNDM0xNYTN4VGcKK25wSDRwZ0QzYk1JM0JiaG5BcjRwd0QyTi8wMEI3aW40Yndwd1Q1OS9VNEFmL213QUZqY3NQU09CVzdZZkR1NjhxdHBsMWVacG03LzcKK0JzQmxTd0xHc2RNM0JCQ21NSzgvSEE3RytVM0FFVVduQnZyRHdVMHovcnZIS0xlMk5yYzE5QzFpdnJRNlQ4K0xpM1ZOVWZjdDRROUQKK3pKZVhlVWtoY0pyTlpnU3crZWliZzFqbjdicGVmamlLbHJuci9EeXZLUkdSZnpoTWo4Ty9RYWdJR2RQbGVqSDVKbmgwbFYxOGM4RHkKKzVleWJKcUVCK2Mxb0NNdlpGR3pQSVQvRk44SGRpNHd5S2g4T3BxMnliMDVaUEMrYWI0QmVnSkkrV1pkbC9rMEJlL0VOc1JvRCt3WkMKK0NJYnpEVVFRRE9jYkNDQVl6cTAxK3ExbTdoc2prNEw3cHFpbDRMNHBvaW00YjRwMndxamZHTzBVM0RkRk93WDNUZEZPd1gwRHRIdFQKK3RDV3JmZDlGMlgyUHpOOUpXVFhmaUFaOFhWd3NNL0lOdmdFanBFblg5R1ZXWnhkMXRwcW5TRy8zUnZuaEhUMnBadGZwbTIvRTFGbFEKKzM1ajd6NXh5UWdNdmx1dHZnS2dCdUc5TXppekFiMHJTTE1CdlN0WXN3RzlBMnI0Z1h4b08zTGUvb2NqbjlYclNSZ1dZUWQxT2dGOW4KKzVWcWMzZy9INXlrdFpIdzRGQ2NLejRxNitlWUVJZzczbTJEbEYzQjV2LzFOK1lJT3oyOEFOUWZzRzVDd3JwTDZaaEZVbU44RW5pVXQKK3JIMURpdm5iMTZ1OHBoanU3WWVEZWxhVlpYV1Z6NzVCa0svYnVoS2U4K1YvaitmbGR2Si91bGpOczZab2VqQjhKK0FtdWRjbDl2U0wKK2JQWGhZM3BaMHByNk56UjdwOXUwUUYrbTM2Qno4ZTAzWHp4UDMxUXJoS1VnOERjRThVblZ0dFhpbXdPcXVjU3Q3K2FUT3g4T2pWRTgKK3ByQjVlZjBONENiUXZxblVFa003S2I0Snl5T2dxdGszQllvYzBXSlpmRE8ybFFIK1h2bjFwTXJxMlRjRTdpVmxmbGhIdFBrM0JmSjEKK3RsaVYzeFQ5M3BDaXZDSjE5RTM0U2d6d0o3TzZRRTdwdzhHcGZMMzVacUI1bWNkbVBmbnBmUG9OcUw0WFZmcjhHOGtxZmJsdU9ZY0oKK2FOL0VlbklBN3h2d0lBSjQzNEQzd0hOS0pnT00vRTJNTjREM0RZdzNnUGVOamZla3pKcW0wQlhhYnhMZ056WmlBL0FiSC9JM0VDb3EKK3dLcXM2dk4xK1EwUzBVRDg1cWhvSUg1elpLeks5V0xaZktPRFpvRGY1SmdaNERjKzVHK1NjeGpnTjVCa0VJQ2YxOFhzbTVzUmh2YU4KK1RRZEQrOGJtZ3FGOVl4UEIwTDdaV2ZqMEc0WDI0QnVGZHZCTlFmdW1uQU1QMmpmR2I5K3NZOERRdmpGK1kyamZHTDh4dEcrTTN4Z2EKKzg5czNCdTBiNDdkN1Q5UDgvSndjNVcvUTduZ3d2ekhlODJCK1l4eUlsSFMrV0ZWMVZsOS9VekJQeS93aSt5YXlyQUx1WlYyZFUzUlAKK1gyVGxOd1VUMmU3eW0vVElCZDQzTnRYZnpTZmZISElBOW8xaTlnMXczNU9NOHBmVk41V2FjMWFJWC9WU2ovY2UzdnplbTNtKytBWUMKK2I4bzFUdk41VmRKeXpOQ3dobCttQ1B2MUtwdHEwciszdG5pNy9Pdno0bUxlcHEvbm1Wazg4T0Y4dW5QenE5Q3J2ZmR1MFdXTThwL3UKK2JYcnZpM3hXckJjR1YrSDE0TzE3Ny9IMlh1L3QvVnU4elVhazMvSDkyNzdhNy9YVFc3enFuT25nMVFlM2ZiWGY2OEZ0WDczWGUzV2oKK2NEek42cmRSam5pd2taTnNVRGpBaHc4MjhwTjlPOXJ4UnBheXI4YTQ4Y0ZHZmdvRWg1TFRVeXhBOUNmcGxoSTBET0NXb2pRTTRMMWsKK2Foak1ld25YTUpqYlM5a3dqSTNpOWlxL0xHRDQzMHVWY284dnN6cTdxTFBWdkdjUTJOMituVDc5aVRVdHhuWUI3RDI4UFlBemNxNlcKK1RaNUdBZDE3ajFXeFFPOE1FL1AyQ21nWXh1MDEwVENNMjZ1a1lSaTMwMDJENzcrZmtob0djM3R0TlF6ajltcHJHTWI3NjYrK3BYaFAKKy9kVUg4Sjc2cXcvZ2ErbXZQcGl2cGI4K3hFc1lobkY3ZDJFWXh2dUxiUi9HKzR2dGgzZ1N3ekJ1Rk52TkxQYjF4TFlQNXYzRnRnL2oKKy9jVzJEK1A5eGJidnBiMm4yUFlCdktmWTlnRjhMYkh0Zy9sYVl0c0g4LzVpMjRmeC9tTGJoL0grWXR1SDhmNWkyNGZ4L21MN2RTT0IKK3dmZS9udGoyd2J5LzJQWmh2TC9ZOW1HOHY5anU5MGo2bm1MYkIvQ2VZdHNIOExYRXRnL21hNGx0SDh6N2kyMGZ4dnVMYlIvRys0dHQKK0g4YjdpMjBmeHZ1TGJSL0crNGx0Ny8ydko3WjlNTzh2dG4wWTd5KzJmUmp2TDdiM2V5UjlUN0h0QTNoUHNlMEQrRnBpMndmenRjUzIKK0QrYjl4YllQNC8zRnRnL2ovY1cyRCtQOXhiWVA0LzNGdGcvai9jUzI5LzdYRTlzK21QY1gyejZNOXhmYlBvejNGOXRQZXlSOVQ3SHQKK0EzaFBzZTBEK0ZwaTJ3Znp0Y1MyRCtiOXhiWVA0LzNGdGcvai9jVzJEK1A5eGJZUDQvM0Z0Zy9qL2NTMjkvN1hFOXMrbVBjWDJ6Nk0KKzl4ZmJQb3lObktvcm9xZUwxVHhyaXNhOUxDL3ZQc1FudDB0K21penFFS3k5M2R2RFVyUmU1ZWQ1blMrbi9hVHNlOEF5ZUEwRDI3czkKK3NDZFY5VFo5VXhCeVBTajMzZ05LTVNtTGloUGYxejA0RC9ESmg2MXh2dm55SlAxMnp2elpBLy93dHVCdk94aGFVQzFvaFpqWGFIZTcKKzNlM2YrdFZlVW1aL0kvUDdyL1lDdy8yTlBPKy8ybk5POXpkcVpQL1Zub0hjMzZpSVdVamxUVFpUdmJjM3FoM3Y3ZDJCOXplcWNPLzkKK1BxRTNLbTd2elQ2ZE42cHI3ODArbVRjcWFlL04reWswZHZmMSs3Y2wxcWVwMFpJOUVCczUwd1B4WUJqRVJnN3RUNW5SMFgwcHVmWGMKK0RZTzQ5U1FPZzdqMWJBNkRlTDlwSFlUek5lWjNHTmI3VC9Rd3JLODU0MzJaZSs4Wi93Q3hIUWJ4M2pQZUIvSDFacndINXdObXZBL3IKKzY4OTRIOWJYblBHK3JuenZHZStEZU84Wi93Q05QUXppNjgxNEQ4NEh6SGdmMXRlZjhUNnNyem5qZlJ2MzNqUGVCL0hlTTk0SDhkNHoKKy9xSEdlaERPQjh4NEg5YlhuL0Urcks4NTQzMFA4TDFudkEvaXZXZThEK0s5Wjd3UDR1dk5lQS9PQjh4NEg5YlhuL0Urcks4NTQ3M28KKyt2MW52QS9pdldlOEQrSzlaN3dQb2pQanQ1enhIcHdQbVBFK3JLOC80MzFZRzJmOE9iSXd3WXkvMzBSNzc3K25uK2E5K1o3RzJudnoKK1BUVzI5K2JYQ2ErODE3OXVlT1dCK0xyaFZYL0t6TnkvWjNqbHo5MHdpRnRQNGpDSVc4L21NSWozbTlaQk9GOWpmb2RodmY5RUQ4UDYKK21qUCtudUZWYk1ZL1FHeUhRYnozakw5bmVEVTQ0KzhaWG0yYzhmY01yemJPK0h1R1Y4TXovcDdoVld6RzN6TzhpczM0QjJqc1lSQmYKK2I4YmZNN3phT09QdkdWNXRuUEgzREsrR1ovdzl3NnZZakw5bmVCV2I4ZmNNcjJJei9xSEdlaERPQjh6NGU0WlhHMmY4UGNPcjRSbC8KK3ovQXFOdVB2R1Y3Rlp2dzl3NnZZakw5bmVEVTQ0KzhaWG0yYzhmY01yemJPK0h1R1Y4TXovcDdoVld6RzN6TzhpczM0ZTRaWHNSbC8KK3ovQnFjTWJmTTd6YU9PUHZHVjV0blBHaDhPb3VBY3RvdWJWOTNWNlhlUVBnRFg2ajF1MzFpcUN1c2pyamRVOEE0Sy9PYUxYeEJkWVoKKzJmK2Y1ZWZadXVRbFI3d01WT2pUeTZ4MGpSaGxYWnJVUGhuUWJUdlRoZEYrQjNQNUlqVmttV1MwRlBybE10ci9Nbi9YUnI4b2krVmIKKzg0WHA2V1NlMWZxMW81bHBaQmpERzlIVm85WExHai9lNXZucUJYcTZhLzU2WGl6elJ2NXNWdGtVNkJLaStYbFY1K0RUSFl3ME8yL3oKKytyT1BES2RVNjVhUXlwOWZscWJMSFROWDJrMnRQNTVWeTdZQmdHWmFGRy9tT2RoZ2tmMTBWWC83ZU5rVUFEM0hMOUZ2OHF4cGo1c2kKKzg3ODgxYy93L2JScHZXK2VGTFBDVUZsL25PaXdwbUExZytuZTZZUDlKNnhlK0cxbXc4OCt5cGdKZCszSHIrZlpqQ0EvZWFZZ214L1kKKzk0M2tOajg0d2NqOEQrL3F3TDhtLyt3TjhvOVJmdDhVLyt6ZGluL2NrcjYyREZiMHZ6RWUyOXU1SFkvdEdoci92NTdIN2o5NStPVHAKK01JOTFPY3BZcElDalBqV2ovUkNPdWpmSVVmZStZWTY2OS85RmpySVc1djhISFBXQm5MSS95Q243M3pDbjdQOS9rVlB1R1JyL3Y1RlQKK0N2M3hjOE01OXdjNTUvNDN6RG4zLzcvSU9mdUd4djl2NEp5QU0zYWY3VDk5Y0hCTFQrakJNek9PRCtHVlR3ZDV4ZGpBYjRwWFB2My8KK0lxL2NOelQrZndPdmJOUXFQd2U4ODJDUWQwdzQvazN4em9QL0wvS085UmYvWDg4Nyt6djRyOHM3TFpIRWNjNmJZdG5hOE9zREdlZGcKK2tIRk1LUGROTWM3Qi94Y1o1NEdoOGM4MjQ5eUdjZDdUZGJueXd5Z3p4Q0NNc29tSkQrR2doNE1jWk9iMG0rS2doLzlmNUNDYi9QaC8KK0F3ZDlzNnJubTJPd0tVMXNOaVZLQmd6MlZKS1RMdzMzZ1dSb3NDRnBxYStrOXAxVVhocmdHU3NvTi9MTU1PNHRjcllCM3B6Rk5jeDgKK2l4eXJwSDJIR2Z0OU9MdWRsTUpnOU12WmNrWXdycGc3RGJhemQ1bENvd1luZVZsK2tVbnphcldoYlptZnQvTDE3czVCck1Ha2F0dHEKK3NRRkN6ZXNPd3lEdWhnakpuNXVaWnJsZVRQS2FwRElnL29zS21mUWI2WjVLcXc4bitmdHF6VGRGUzNQZFJVZytWVnArcUxwa1lCdDEKKzVhNlIxcGdpWEQyWjhVODdwL3hLUTRRV1BwK0tZcmpCQUVFVHNQWVQ1Wm43d1o1MjRKU3FhdEY3b2xPaFFVbDU3TnMvWHExTCtpQmIKK3Q1VzFoRXZvcFhWV3ZsWVkvKy9Sc1lGT3ZiZDM3M1QvV1V5bjd0a1BlK2wwU3hZeDlEMWRhNWY3ZkYzclZvUytscTcxZUlhR3NHNW8KKzVsL2p1NWowY052VVk3QU94OGIxZHB4TmIyYlJIMDNtZSt1WTErdEpHMVV6OW90dlNOTVllSnVWamJHeU1XVkRTbHgrS2NySVlvWisKKysvOFN5ZjdBVkdLUEdYYjczTEJuRXNxQkcyVTE1OWNTN1hDU2JwUnUwL3pEQmJ6RGJSczQ0MGZUK3Y3VHFrR1JybmJmT0szYVBOMzkKKzhIazFQUS9PcS9HZWZrNm5kYUkvL2wrNDBCMlpVRGVodXZ4ODZ3bmQrOFltMUZpaS95OU82SzNrMUUzZkI2MHFiNXcrWGV1OTlmVGQKKys4YW16NnhhLy85eitqNXdXblJoOWRiVHN2K05UWXRSL2Y4Zm1aWVB0SVlmT0UyNmlubnJhYnIvalUyVE1kci9MNTJtSDhJQzA4YUoKKzBTWERXMC9NcDkvWXhCaFYvZi9TaWZrNVdBbmNPRkc2UG5mcmlYcndqVTJVV1duOC8rSkV2WGZ1K3dOblNSZkRiajFMQjkvWUxCbkgKKzlmK2xzL1NlNWladzZuNFdsaUNVYUxyeWRPdnBldmlOVFplWmxQK1hUdGMzSzFRLzI3T0poRVNabnk1Vzg2d3BtbWptZzJEWTc5OTMKKytpSUpEak5KUWVwTFoyd2o3UTUyOE45dGFQZUJabU9RR3Q4Z0dleGMza3lHcnp1TU0xb1FXRGJEYzZ2ZmY1T1R1MmRVVUd4VUU0Vi8KK1c3ZjZaOG10ZnQzV0ZTMlE5VGhkUHY0R2FMQjNheHJjUElSVk5KbjlFK3VxelhzamtFK2pBM2ovTkRZRDh6UjJaSnhmVzVCMytCa1EKKzVGdVJKVDZ6SHM0M21pVnUrK0VteWFmNUJoTDljS2dTWnhZVjh6alBHQjN3amZLTzMrTkdGcnIzdzFwejNlZGZibHh6bmVUblZaMUQKK09mTTg2QkxzM29GQnMxak9VbG41SjEvajNxZG93NHY0K3BlQ1ZlZmovMVZLcno4bE4wcEl3Qm9mTGlrQkc5N0lFUC92b3A1NFFhL3kKKzg3ek9sOU8rRkttWDVCcThMNkVpbE5oa1NSdVN1L0lrVzhXb2NQcjB3ZE43elBoOUtoakx0TzVLMHdmUVJ1ZDFtRGlHajc1UjZ0emUKK3huNDR0UWJXcTc5SklqNnBxcmR2b3N2VCtDWjlNN3hBL1g1a00vbndyMEcyS0JWdUhtL2NKaEhZdHFpV3ZkRk85ZlBvVUc5bmlDS2oKK3RvdVArYUw0ZGpHYjVVdHR1cHdYcy95NzgzejVGWFVVb1l5cWNqZDBVbWd3RHhMQjRZOVhheWpQYk4xV3QxUC83Nm13cnJ6b2J6ZTIKK3ZxWWZmdDE1ZVBQbGlRYlZ2YW1ncjFMelhYUTY5RXVENlB0TWlIR0x2dTZFVk9zV3hIOStXUnFRRHcwWlZsK0hEQytxMXpMRlBTcTgKK3FGTHoxZEJvb29xNnh6bnFTMWpHdVEwWHVXR1kzNXFqL3dkUVN3TUVGQUFHQUFnQTBXb0dRUW5id3dYZEJnQUFVQnNBQUJVQUFBQjMKK2IzSmtMM1JvWlcxbEwzUm9aVzFsTVM1NGJXenR2UWRnSEVtV0pTWXZiY3A3ZjByMVN0ZmdkS0VJZ0dBVEpOaVFRQkRzd1lqTjVwTHMKK0hXbEhJeW1yS29IS1pWWmxYV1lXUU16dG5iejMzbnZ2dmZmZWUrKzk5N283blU0bjk5Ly9QMXhtWkFGczlzNUsyc21lSVlDcXlCOC8KK2Zud2ZQeUwreDcvM0gzejhlN3hibE9sbFhqZEZ0ZnpzbzkzeHprZHB2cHhXczJKNThkbEg2L1o4KytDanRHbXo1U3dycTJYKzJVZlgKK2VmUFI3M0gwT0h2VXp2TkZudExieTRaK1gremUvK3lqZWR1dUh0MjkyMHpwcTZ3Wkw0cHBYVFhWZVR1ZVZvdTcxZmw1TWMzdjhtdUwKKzh1N2V6dTdlM1VWV0xEOVNHRm52L1dxVkwrbTc4NnBlWkMzOVdWL2NuZFhaRldIRzcrOThxdTh2c3dVaDlpWERUOThBL2tjV3dkT1MKKy9sbTJEVDZZbHZYcktXUHR2OEZ0WjI5MzhhTzViazdLT3IzTXlzOCtvbjVtMWRXYi9GMzdVVnBtVFV0ZmZQYlJEajhmcFhlUEh0KzEKK2I1WHR3TXZlaTgvNE1TL3FHN08zZS94aWZUR3hiKzd2MzkvLzlOajFzQ2M5OUJ1ZVBqajk5UFJUQjVGYlpOTXBqWGEzMS9qK2s0ZFAKK250NDNqYjFXOG1zRSt0TUhUKy90aGk5NFBkenJ2WEI4SC8rRkw5eHpMK3ozWG5qMjdNUWpwZGRLZnIwZm9jeUR2WlA5OElYNzdvVlAKK2V5ODgyRGwrdXY4Z2ZJRmJ6Y3RpK2JiWGZPZitwL2RPN0pCdG0vT3EvSGEwL2NQNys4OGU3Sm4ycnRsZGo5TUV3TElkNHJ0Rjl0TlYKKy9Zd2E4Q3huYmJGTTIrdFZmcDVOcWQxSlZoYVR1a2lmRnhkellzSlZ0cXdhK25obmIrZlp6ajM2Ri8vdDgyOUNsZXhSbm5tdjYyZlQKK3B2OFpVRXFiYVYyczJzOCsrZzRCL3Nocjh6LytmWC85Ly9qMy9hM3BmL3FIL0czLzZSL3lkLzZuZitnZitwLytJWDlqN0xWdlo4c0wKKy83WC85cS84ay8rN1AvOFBTditidi9VdittLy90RDk5NElYR2YrRS8veHYrMlAvczcvOVRCMXEyZnN2LzRzLzRtLzdMdisxditpLysKK3JEL2h2LzVyLzdSWSsrTTZtL2p0M3hTTHZFbGY1RmZwcTJxQndVVzZ5Q2YxZTc3eVpwNFYvaXZIeTRzbVcyWjRLZGI4dEowSHpWOWMKK1oyVVdhL2drRHduNWt6VXBqMmpMejljL0hTRDllbDZ2MnlMVzh2ZWFMNEtXWDFSVithU3E0d1A3dmJnN2p4YnI1Y1ZBLy9YYWIvZ3EKK3l5NmozWjkwcHZwMHZTTCtMNkpBVCtaNWdPckxrbVkvdThpWGVadml1K3B0bnNmZSszMktJcUR2RjhiYXBMOVBrVDdKaWpoaDNoU1QKK2dMWGNXOTh1RmpSQjExRWNhZW9EQ24zeGsrbVRxb3gyOERTL0RKdVNtR1JsRkdoZUJ0VDhQRnUzMlNLT2RiWW8vYWJQczNZZVJmVDEKK2RUME5DTiswTk9rWGVWbWxwN084YWFJdmZWbGZCeWovWHFSM0JqamdpL0o2RVRhdDIrSnR0T256cktyOHBrK3J0eWZ6YkxHSzQxMHMKKzUzN2pzK1l0Y1d5V3ZxemFPQjVWS0RQNG15WWtXdzdQL0U4V2VURHp0NUQ0cjBqeHhwa0YzNnpycUl6a1ZTaWoxK1Y1bGd2NHV4MkYKK3Z5aVdOMnIvanQ2Ly83T3U5MG5OL2hkLzNwOC9vSmIvMzZyeGorc2lMbVJkUFQvWXNLdmRUNnA2VnZ4L1E3ay96ZGJMbHprRUtOTDIKK1I3cjkvRWU2M1ZmWVB4OTArNkNVLzJ4b2RLZkU3OHFibnV1L0dQVDh6NHV5Zk4xZWwvbnpodFYvUTBPY1BhTVArUTkreVVZYXF6bjkKK2F2b0xHbDdVR2YrZTFsWDczYUtkdjU1bksrcG5sN3U0YUJUMlJaT3Vxb1lzeUVjaGNBODR2aWpYaXkrcW1YUzV1MnNEWGVveWE5MFgKK1pJTHNGMlN4V3ZuNDB3ZGVNR2ZSNTc4dUdoK0grd3ozOW5qNDNZVjQzSXZoOGNCK2VnTWVQTDV2QnBHSE1VUU9kamNpY3RlYkhwTEkKK05FTzY1ZjYrcGhlYWFWYm1NMHlZQWpEei9JM1ArU0JKdzdIdnhZYjRjSC9qRU45cnpnTThmTjRMOGZDWmNwN044dDduMy9Dc1AvVG0KK05rQnh6L1lZWVBMZzRHZG4xdS8yRlVhNURQOUtyMGdLNzkybmw2Zlo2ck9QenNtZnBGOFhLd0xZUUtGbTVRVWwrS2F0MHZ0cnFadFYKKzNiUlBzMll1N2ZncnBjR2lhUE02TFlzRmNYNHdHK1hTb2JlNzl3QmYvTDhYdjRjNy82K2szOTN1Yk9mbjUvbTBIZmpFL1VuZktaVG8KKzF4L2FHbjlVYThMNzlYeDJsVTdLZGYwcUkycmRmN0FMS3M2S3ByVWtuUlcxeCtpT2xCMGRwcElaWk9XY3hHYmxhcDZwdVFuVXZMVG4KKzN5MCsza0FZMWU2d3dyOTFOSk9MWngwcCszcnpmUE5iK01MVHBFTzI1WUVRTEtaUGZ2YjhBQTh2enlBRWVOMjNlQVhxNzZGVmY0TUcKKzVNTk5oWWVlMTEyQTNqMkcwa2ZQK3poRTc1djBHcndPSFp0MkVIVG00eHUzRTEwZXZ1dTVvZnhYYjEya212dzB5Y0ZUY20vWFpkc0kKK3RyVHNVV2NuSm8ydHFvRS9OZ3JuWFp1dTYrS3pqMzd4enYzai9aTzkreWZiT3dmM1Q3ZjM3KzN2YkIvY1A3NjNmWHovL3IzZDAvdTcKK08wK2Y3UDBTb2d3dkVrbnZ6eWdXS3ErL2tjV2p5T0pQV2hCeGZ2R25lODhlM252NDVOUHRoL2VPbjIzdlAzMXlzUDN3NU5NbjIwOC8KK1BYbnc5Tm5Uay9zSEQ1Lzlrby9TUzI2OGYzenZaUC9UMDRQdFQzZFBUcmIzUDkwQitnY1B0eC9zNyswZDd6ODRQampkUC80bGh0dzAKK2RQUFRVSmdSTy9wL0FGQkxBd1FVQUFZQUNBRFJhZ1pCam94ekNYQUJBQUQwQVFBQUZBQUFBSGR2Y21RdmQyVmlVMlYwZEdsdVozTXUKK2VHMXM3YjBIWUJ4SmxpVW1MMjNLZTM5SzlVclg0SFNoQ0lCZ0V5VFlrRUFRN01HSXplYVM3QjFwUnlNcHF5cUJ5bVZXWlYxbUZrRE0KKzdaMjg5OTU3NzczMzNudnZ2ZmU2TzUxT0ovZmYvejljWm1RQmJQYk9TdHJKbmlHQXFzZ2ZQMzU4SHo4aS9zZS85eDk4L0h1OFc1VHAKK1pWNDNSYlg4N0tQZDhjNUhhYjZjVnJOaWVmSFpSK3YyZlB2Z283UnBzK1VzSzZ0bC90bEgxM256MGU5eDlQanEwVlUrZVoyM0xiVnIKK1VvS3hiQjR0cHA5OU5HL2IxYU83ZDV2cFBGOWt6YmhhNVV2NjhyeXFGMWxMZjlZWGR4ZFovWGE5MnA1V2kxWFdGcE9pTE5ycnUzczcKK081OStwR0RxMjBDcHpzK0xhZjYwbXE0WCtiTGw5Ky9XZVVrUXEyVXpMMWFOZ1haMUcyaFhWVDFiMWRVMGJ4b2F6NklVZUl1c1dGb3cKK3UvczlRSXRpV2xkTmRkNk9hVENLRVlPaTEzZDMrTGRGNlFEY2Z6OEFleGJBWXZybzdHSloxZG1rcEFrZ1RGSUM5aEhtb0ZxMXhhTDQKK1FmNnNxcC9VMVZXVDErbGRmSjZWWlhYMThzWG4rT3R1TUZWSC93OVFTd0VDTFFBVUFBWUFDQUFBQUNFQTB6QWZMbDRCQUFBZ0JRQUEKK0V3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQVcwTnZiblJsYm5SZlZIbHdaWE5kTG5odGJGQkxBUUl0QUJRQUJnQUlBQUFBSVFBZWtScTMKKzd3QUFBRTRDQUFBTEFBQUFBQUFBQUFBQUFBQUFBSThCQUFCZmNtVnNjeTh1Y21Wc2MxQkxBUUl0QUJRQUJnQUlBTkZxQmtIOFhQMTgKKzFnRUFBQXNEQUFBUUFBQUFBQUFBQUFBQUFBQUFBS2NDQUFCa2IyTlFjbTl3Y3k5aGNIQXVlRzFzVUVzQkFpMEFGQUFHQUFnQTBXb0cKK1FWTEQvVUs2QVFBQWJ3SUFBQkVBQUFBQUFBQUFBQUFBQUFBQXF3UUFBR1J2WTFCeWIzQnpMMk52Y21VdWVHMXNVRXNCQWkwQUZBQUcKK0FBZ0FBQUFoQU5aa3MxSDBBQUFBTVFNQUFCd0FBQUFBQUFBQUFBQUFBQUFBbEFZQUFIZHZjbVF2WDNKbGJITXZaRzlqZFcxbGJuUXUKK2VHMXNMbkpsYkhOUVN3RUNMUUFVQUFZQUNBRFJhZ1pCZXVVemR6TUNBQUNRQlFBQUVRQUFBQUFBQUFBQUFBQUFBQURDQndBQWQyOXkKK1pDOWtiMk4xYldWdWRDNTRiV3hRU3dFQ0xRQVVBQVlBQ0FEUmFnWkIzaVp4VlpvQ0FBQXpCd0FBRWdBQUFBQUFBQUFBQUFBQUFBQWsKK0NnQUFkMjl5WkM5bWIyNTBWR0ZpYkdVdWVHMXNVRXNCQWkwQUZBQUVBQWdBMFdvR1FZYUNYVWtkQkFBQWVRa0FBQkVBQUFBQUFBQUEKK0FBQUFBQUFBN2d3QUFIZHZjbVF2YzJWMGRHbHVaM011ZUcxc1VFc0JBaTBBRkFBRUFBZ0EwV29HUVN2MzdPRlRFZ0FBRmEwQUFBOEEKK0FBQUFBQUFBQUFBQUFBQUFPaEVBQUhkdmNtUXZjM1I1YkdWekxuaHRiRkJMQVFJdEFCUUFCZ0FJQU5GcUJrRUoyOE1GM1FZQUFGQWIKK0FBQVZBQUFBQUFBQUFBQUFBQUFBQUxvakFBQjNiM0prTDNSb1pXMWxMM1JvWlcxbE1TNTRiV3hRU3dFQ0xRQVVBQVlBQ0FEUmFnWkIKK2pveHpDWEFCQUFEMEFRQUFGQUFBQUFBQUFBQUFBQUFBQUFES0tnQUFkMjl5WkM5M1pXSlRaWFIwYVc1bmN5NTRiV3hRU3dVR0FBQUEKK0FBc0FDd0RCQWdBQWJDd0FBQUFBIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBiYXNlNjRDaGFyQXJyYXkgPSBiYXNlNjQuV2hlcmUoYyA9PiBjICE9ICdccicgJiYgYyAhPSAnXG4nKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlQXJyYXkgPSBTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0Q2hhckFycmF5KGJhc2U2NENoYXJBcnJheSwgMCwgYmFzZTY0Q2hhckFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeVN0cmVhbS5Xcml0ZShieXRlQXJyYXksIDAsIGJ5dGVBcnJheS5MZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRlZmF1bHREb3R4ID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1lbW9yeVN0cmVhbSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vR2V0IHRoZSBzcGVjaWZpZWQgc3R5bGUgZnJvbSBEZWZhdWx0LmRvdHggdGVtcGxhdGUgZm9yIHBhcmFncmFwaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUgdGVtcGxhdGVTdHlsZSA9IGRlZmF1bHREb3R4Lk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQuU3R5bGVzLkVsZW1lbnRzPFN0eWxlPigpLldoZXJlKHMgPT4gcy5TdHlsZUlkID09IHN0eWxlTmFtZSAmJiBzLlR5cGUgPT0gU3R5bGVWYWx1ZXMuUGFyYWdyYXBoKS5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIGlmIHRoZSBzdHlsZSBpcyBwcm9wZXIgc3R5bGUuIEV4LCBIZWFkaW5nMSwgSGVhZGluZzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVN0eWxlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIkFkZC1Eb2N4VGV4dDogVGhlIHNwZWNpZmllZCBzdHlsZSBuYW1lIHswfSBpcyB1bnN1cHBvcnRlZCwgUGxlYXNlIHNwZWNpZnkgdGhlIHZhbGlkIHN0eWxlLiBFeCwgSGVhZGluZzEsIEhlYWRpbmcyLCBUaXRsZSIsIHN0eWxlTmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQuU3R5bGVzLkFwcGVuZCgodGVtcGxhdGVTdHlsZS5DbG9uZU5vZGUodHJ1ZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoLlBhcmFncmFwaFByb3BlcnRpZXMgPSBuZXcgUGFyYWdyYXBoUHJvcGVydGllcyhuZXcgUGFyYWdyYXBoU3R5bGVJZCgpIHsgVmFsID0gc3R5bGVOYW1lIH0pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcnVuLkFwcGVuZENoaWxkKHJ1blByb3BlcnRpZXMpOworICAgICAgICAgICAgICAgICAgICBydW4uQXBwZW5kQ2hpbGQobmV3IFRleHQoc3RyUGFyYWdyYXBoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3Rpb25Qcm9wZXJ0aWVzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBib2R5Lkluc2VydEJlZm9yZShwYXJhZ3JhcGgsIHNlY3Rpb25Qcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYm9keS5BcHBlbmRDaGlsZChwYXJhZ3JhcGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtRG9jLkdldE1vZGlmaWVkV21sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBIdG1sQ29udmVydGVySGVscGVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQ29udmVydFRvSHRtbChzdHJpbmcgZmlsZSwgc3RyaW5nIG91dHB1dERpcmVjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZpID0gbmV3IEZpbGVJbmZvKGZpbGUpOworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVBcnJheSA9IEZpbGUuUmVhZEFsbEJ5dGVzKGZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbWVtb3J5U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbW9yeVN0cmVhbS5Xcml0ZShieXRlQXJyYXksIDAsIGJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obWVtb3J5U3RyZWFtLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBkZXN0RmlsZU5hbWUgPSBuZXcgRmlsZUluZm8oZmkuTmFtZS5SZXBsYWNlKCIuZG9jeCIsICIuaHRtbCIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERpcmVjdG9yeSAhPSBudWxsICYmIG91dHB1dERpcmVjdG9yeSAhPSBzdHJpbmcuRW1wdHkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeUluZm8gZGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhvdXRwdXREaXJlY3RvcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkaS5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJPdXRwdXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0RmlsZU5hbWUgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKGRpLkZ1bGxOYW1lLCBkZXN0RmlsZU5hbWUuTmFtZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZhciBpbWFnZURpcmVjdG9yeU5hbWUgPSBkZXN0RmlsZU5hbWUuRnVsbE5hbWUuU3Vic3RyaW5nKDAsIGRlc3RGaWxlTmFtZS5GdWxsTmFtZS5MZW5ndGggLSA1KSArICJfZmlsZXMiOworICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VDb3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2VUaXRsZSA9IChzdHJpbmcpd0RvYy5Db3JlRmlsZVByb3BlcnRpZXNQYXJ0LkdldFhEb2N1bWVudCgpLkRlc2NlbmRhbnRzKERDLnRpdGxlKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFnZVRpdGxlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGUgPSBmaS5GdWxsTmFtZTsKKworICAgICAgICAgICAgICAgICAgICBXbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBXbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncygpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VUaXRsZSA9IHBhZ2VUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhYnJpY2F0ZUNzc0NsYXNzZXMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3NQcmVmaXggPSAicHQtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RyaWN0VG9TdXBwb3J0ZWRMYW5ndWFnZXMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RyaWN0VG9TdXBwb3J0ZWROdW1iZXJpbmdGb3JtYXRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUhhbmRsZXIgPSBpbWFnZUluZm8gPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnlJbmZvIGxvY2FsRGlySW5mbyA9IG5ldyBEaXJlY3RvcnlJbmZvKGltYWdlRGlyZWN0b3J5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2NhbERpckluZm8uRXhpc3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERpckluZm8uQ3JlYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpbWFnZUNvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGV4dGVuc2lvbiA9IGltYWdlSW5mby5Db250ZW50VHlwZS5TcGxpdCgnLycpWzFdLlRvTG93ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUZvcm1hdCBpbWFnZUZvcm1hdCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSAicG5nIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgcG5nIHRvIGpwZWcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9ICJnaWYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkdpZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJnaWYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkdpZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gImJtcCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuQm1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dGVuc2lvbiA9PSAianBlZyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuSnBlZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gInRpZmYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCB0aWZmIHRvIGdpZi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gImdpZiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuR2lmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gIngtd21mIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9ICJ3bWYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LldtZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaW1hZ2UgZm9ybWF0IGlzbid0IG9uZSB0aGF0IHdlIGV4cGVjdCwgaWdub3JlIGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkb24ndCByZXR1cm4gbWFya3VwIGZvciB0aGUgbGluay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2VGb3JtYXQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW1hZ2VGaWxlTmFtZSA9IGltYWdlRGlyZWN0b3J5TmFtZSArICIvaW1hZ2UiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb3VudGVyLlRvU3RyaW5nKCkgKyAiLiIgKyBleHRlbnNpb247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uQml0bWFwLlNhdmUoaW1hZ2VGaWxlTmFtZSwgaW1hZ2VGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkV4dGVybmFsRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGltZyA9IG5ldyBYRWxlbWVudChYaHRtbC5pbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnNyYywgaW1hZ2VGaWxlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5JbWdTdHlsZUF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLkFsdFRleHQgIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5hbHQsIGltYWdlSW5mby5BbHRUZXh0KSA6IG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbWc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGh0bWwgPSBXbWxUb0h0bWxDb252ZXJ0ZXIuQ29udmVydFRvSHRtbCh3RG9jLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogdGhlIHhodG1sIHJldHVybmVkIGJ5IENvbnZlcnRUb0h0bWxUcmFuc2Zvcm0gY29udGFpbnMgb2JqZWN0cyBvZiB0eXBlCisgICAgICAgICAgICAgICAgICAgIC8vIFhFbnRpdHkuICBQdE9wZW5YbWxVdGlsLmNzIGRlZmluZSB0aGUgWEVudGl0eSBjbGFzcy4gIFNlZQorICAgICAgICAgICAgICAgICAgICAvLyBodHRwOi8vYmxvZ3MubXNkbi5jb20vZXJpY3doaXRlL2FyY2hpdmUvMjAxMC8wMS8yMS93cml0aW5nLWVudGl0eS1yZWZlcmVuY2VzLXVzaW5nLWxpbnEtdG8teG1sLmFzcHgKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBJZiB5b3UgZnVydGhlciB0cmFuc2Zvcm0gdGhlIFhNTCB0cmVlIHJldHVybmVkIGJ5IENvbnZlcnRUb0h0bWxUcmFuc2Zvcm0sIHlvdQorICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGRvIGl0IGNvcnJlY3RseSwgb3IgZW50aXRpZXMgd2lsbCBub3QgYmUgc2VyaWFsaXplZCBwcm9wZXJseS4KKworICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbFN0cmluZyA9IGh0bWwuVG9TdHJpbmcoU2F2ZU9wdGlvbnMuRGlzYWJsZUZvcm1hdHRpbmcpOworICAgICAgICAgICAgICAgICAgICBGaWxlLldyaXRlQWxsVGV4dChkZXN0RmlsZU5hbWUuRnVsbE5hbWUsIGh0bWxTdHJpbmcsIEVuY29kaW5nLlVURjgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSGVscGVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgSXNWYWxpZChzdHJpbmcgZmlsZU5hbWUsIHN0cmluZyBvZmZpY2VWZXJzaW9uKQorICAgICAgICB7CisjaWYgIU5FVDM1CisgICAgICAgICAgICBGaWxlRm9ybWF0VmVyc2lvbnMgZmlsZUZvcm1hdFZlcnNpb24gPSBGaWxlRm9ybWF0VmVyc2lvbnMuT2ZmaWNlMjAxMzsKKyNlbHNlCisgICAgICAgICAgICBGaWxlRm9ybWF0VmVyc2lvbnMgZmlsZUZvcm1hdFZlcnNpb24gPSBGaWxlRm9ybWF0VmVyc2lvbnMuT2ZmaWNlMjAxMDsKKyNlbmRpZgorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsZUZvcm1hdFZlcnNpb24gPSAoRmlsZUZvcm1hdFZlcnNpb25zKUVudW0uUGFyc2UoZmlsZUZvcm1hdFZlcnNpb24uR2V0VHlwZSgpLCBvZmZpY2VWZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisjaWYgIU5FVDM1CisgICAgICAgICAgICAgICAgZmlsZUZvcm1hdFZlcnNpb24gPSBGaWxlRm9ybWF0VmVyc2lvbnMuT2ZmaWNlMjAxMzsKKyNlbHNlCisgICAgICAgICAgICAgICAgZmlsZUZvcm1hdFZlcnNpb24gPSBGaWxlRm9ybWF0VmVyc2lvbnMuT2ZmaWNlMjAxMDsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGaWxlSW5mbyBmaSA9IG5ldyBGaWxlSW5mbyhmaWxlTmFtZSk7CisgICAgICAgICAgICBpZiAoVXRpbC5Jc1dvcmRwcm9jZXNzaW5nTUwoZmkuRXh0ZW5zaW9uKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKGZpbGVOYW1lLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPcGVuWG1sVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBPcGVuWG1sVmFsaWRhdG9yKGZpbGVGb3JtYXRWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9ycyA9IHZhbGlkYXRvci5WYWxpZGF0ZSh3RG9jKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCB2YWxpZCA9IGVycm9ycy5Db3VudCgpID09IDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChVdGlsLklzU3ByZWFkc2hlZXRNTChmaS5FeHRlbnNpb24pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4oZmlsZU5hbWUsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IE9wZW5YbWxWYWxpZGF0b3IoZmlsZUZvcm1hdFZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gdmFsaWRhdG9yLlZhbGlkYXRlKHNEb2MpOworICAgICAgICAgICAgICAgICAgICBib29sIHZhbGlkID0gZXJyb3JzLkNvdW50KCkgPT0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFV0aWwuSXNQcmVzZW50YXRpb25NTChmaS5FeHRlbnNpb24pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChQcmVzZW50YXRpb25Eb2N1bWVudCBwRG9jID0gUHJlc2VudGF0aW9uRG9jdW1lbnQuT3BlbihmaWxlTmFtZSwgZmFsc2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT3BlblhtbFZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgT3BlblhtbFZhbGlkYXRvcihmaWxlRm9ybWF0VmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHZhciBlcnJvcnMgPSB2YWxpZGF0b3IuVmFsaWRhdGUocERvYyk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgdmFsaWQgPSBlcnJvcnMuQ291bnQoKSA9PSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxWYWxpZGF0aW9uRXJyb3JJbmZvPiBHZXRPcGVuWG1sVmFsaWRhdGlvbkVycm9ycyhzdHJpbmcgZmlsZU5hbWUsCisgICAgICAgICAgICBzdHJpbmcgb2ZmaWNlVmVyc2lvbikKKyAgICAgICAgeworI2lmICFORVQzNQorICAgICAgICAgICAgRmlsZUZvcm1hdFZlcnNpb25zIGZpbGVGb3JtYXRWZXJzaW9uID0gRmlsZUZvcm1hdFZlcnNpb25zLk9mZmljZTIwMTM7CisjZWxzZQorICAgICAgICAgICAgRmlsZUZvcm1hdFZlcnNpb25zIGZpbGVGb3JtYXRWZXJzaW9uID0gRmlsZUZvcm1hdFZlcnNpb25zLk9mZmljZTIwMTA7CisjZW5kaWYKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbGVGb3JtYXRWZXJzaW9uID0gKEZpbGVGb3JtYXRWZXJzaW9ucylFbnVtLlBhcnNlKGZpbGVGb3JtYXRWZXJzaW9uLkdldFR5cGUoKSwgb2ZmaWNlVmVyc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworI2lmICFORVQzNQorICAgICAgICAgICAgICAgIGZpbGVGb3JtYXRWZXJzaW9uID0gRmlsZUZvcm1hdFZlcnNpb25zLk9mZmljZTIwMTM7CisjZWxzZQorICAgICAgICAgICAgICAgIGZpbGVGb3JtYXRWZXJzaW9uID0gRmlsZUZvcm1hdFZlcnNpb25zLk9mZmljZTIwMTA7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRmlsZUluZm8gZmkgPSBuZXcgRmlsZUluZm8oZmlsZU5hbWUpOworICAgICAgICAgICAgaWYgKFV0aWwuSXNXb3JkcHJvY2Vzc2luZ01MKGZpLkV4dGVuc2lvbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV21sRG9jdW1lbnQgd21sID0gbmV3IFdtbERvY3VtZW50KGZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQod21sKSkKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gc3RyZWFtRG9jLkdldFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IE9wZW5YbWxWYWxpZGF0b3IoZmlsZUZvcm1hdFZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gdmFsaWRhdG9yLlZhbGlkYXRlKHdEb2MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JzLlRvTGlzdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFV0aWwuSXNTcHJlYWRzaGVldE1MKGZpLkV4dGVuc2lvbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU21sRG9jdW1lbnQgU21sID0gbmV3IFNtbERvY3VtZW50KGZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoU21sKSkKKyAgICAgICAgICAgICAgICB1c2luZyAoU3ByZWFkc2hlZXREb2N1bWVudCB3RG9jID0gc3RyZWFtRG9jLkdldFNwcmVhZHNoZWV0RG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IE9wZW5YbWxWYWxpZGF0b3IoZmlsZUZvcm1hdFZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gdmFsaWRhdG9yLlZhbGlkYXRlKHdEb2MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JzLlRvTGlzdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFV0aWwuSXNQcmVzZW50YXRpb25NTChmaS5FeHRlbnNpb24pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBtbERvY3VtZW50IFBtbCA9IG5ldyBQbWxEb2N1bWVudChmaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCBzdHJlYW1Eb2MgPSBuZXcgT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50KFBtbCkpCisgICAgICAgICAgICAgICAgdXNpbmcgKFByZXNlbnRhdGlvbkRvY3VtZW50IHdEb2MgPSBzdHJlYW1Eb2MuR2V0UHJlc2VudGF0aW9uRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IE9wZW5YbWxWYWxpZGF0b3IoZmlsZUZvcm1hdFZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gdmFsaWRhdG9yLlZhbGlkYXRlKHdEb2MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JzLlRvTGlzdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBFbnVtZXJhYmxlLkVtcHR5PFZhbGlkYXRpb25FcnJvckluZm8+KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgRG9jeE1ldHJpY3MKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgRmlsZU5hbWU7CisKKwkgICAgcHVibGljIGludCBBY3RpdmVYOworCSAgICBwdWJsaWMgaW50IEFsdENodW5rOworCSAgICBwdWJsaWMgaW50IEFzY2lpQ2hhckNvdW50OworCSAgICBwdWJsaWMgaW50IEFzY2lpUnVuQ291bnQ7CisJICAgIHB1YmxpYyBpbnQgQXZlcmFnZVBhcmFncmFwaExlbmd0aDsKKwkgICAgcHVibGljIGludCBDb21wbGV4RmllbGQ7CisJICAgIHB1YmxpYyBpbnQgQ29udGVudENvbnRyb2xDb3VudDsKKwkgICAgcHVibGljIFhtbERvY3VtZW50IENvbnRlbnRDb250cm9sczsKKwkgICAgcHVibGljIGludCBDU0NoYXJDb3VudDsKKwkgICAgcHVibGljIGludCBDU1J1bkNvdW50OworCSAgICBwdWJsaWMgYm9vbCBEb2N1bWVudFByb3RlY3Rpb247CisJICAgIHB1YmxpYyBpbnQgRWFzdEFzaWFDaGFyQ291bnQ7CisJICAgIHB1YmxpYyBpbnQgRWFzdEFzaWFSdW5Db3VudDsKKwkgICAgcHVibGljIGludCBFbGVtZW50Q291bnQ7CisJICAgIHB1YmxpYyBib29sIEVtYmVkZGVkWGxzeDsKKwkgICAgcHVibGljIGludCBIQW5zaUNoYXJDb3VudDsKKwkgICAgcHVibGljIGludCBIQW5zaVJ1bkNvdW50OworCSAgICBwdWJsaWMgaW50IEh5cGVybGluazsKKwkgICAgcHVibGljIGJvb2wgSW52YWxpZFNhdmVUaHJvdWdoWHNsdDsKKwkgICAgcHVibGljIHN0cmluZyBMYW5ndWFnZXM7CisJICAgIHB1YmxpYyBpbnQgTGVnYWN5RnJhbWU7CisJICAgIHB1YmxpYyBpbnQgTXVsdGlGb250UnVuOworCSAgICBwdWJsaWMgc3RyaW5nIE51bWJlcmluZ0Zvcm1hdExpc3Q7CisJICAgIHB1YmxpYyBpbnQgUmVmZXJlbmNlVG9OdWxsSW1hZ2U7CisJICAgIHB1YmxpYyBib29sIFJldmlzaW9uVHJhY2tpbmc7CisJICAgIHB1YmxpYyBpbnQgUnVuQ291bnQ7CisJICAgIHB1YmxpYyBpbnQgU2ltcGxlRmllbGQ7CisJICAgIHB1YmxpYyBYbWxEb2N1bWVudCBTdHlsZUhpZXJhcmNoeTsKKwkgICAgcHVibGljIGludCBTdWJEb2N1bWVudDsKKwkgICAgcHVibGljIGludCBUYWJsZTsKKwkgICAgcHVibGljIGludCBUZXh0Qm94OworCSAgICBwdWJsaWMgYm9vbCBUcmFja1JldmlzaW9uc0VuYWJsZWQ7CisJICAgIHB1YmxpYyBib29sIFZhbGlkOworICAgICAgICBwdWJsaWMgaW50IFplcm9MZW5ndGhUZXh0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0TWV0cmljc0hlbHBlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBEb2N4TWV0cmljcyBHZXREb2N4TWV0cmljcyhzdHJpbmcgZmlsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHdtbERvYyA9IG5ldyBXbWxEb2N1bWVudChmaWxlTmFtZSk7CisgICAgICAgICAgICBNZXRyaWNzR2V0dGVyU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgTWV0cmljc0dldHRlclNldHRpbmdzKCk7CisgICAgICAgICAgICBzZXR0aW5ncy5JbmNsdWRlVGV4dEluQ29udGVudENvbnRyb2xzID0gZmFsc2U7CisgICAgICAgICAgICBzZXR0aW5ncy5JbmNsdWRlWGxzeFRhYmxlQ2VsbERhdGEgPSBmYWxzZTsKKyAgICAgICAgICAgIHZhciBtZXRyaWNzWG1sID0gTWV0cmljc0dldHRlci5HZXREb2N4TWV0cmljcyh3bWxEb2MsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIERvY3hNZXRyaWNzIG1ldHJpY3MgPSBuZXcgRG9jeE1ldHJpY3MoKTsKKyAgICAgICAgICAgIG1ldHJpY3MuRmlsZU5hbWUgPSB3bWxEb2MuRmlsZU5hbWU7CisKKyAgICAgICAgICAgIG1ldHJpY3MuU3R5bGVIaWVyYXJjaHkgICAgICAgICA9IEdldFhtbERvY3VtZW50Rm9yTWV0cmljcyhtZXRyaWNzWG1sLCBILlN0eWxlSGllcmFyY2h5KTsKKyAgICAgICAgICAgIG1ldHJpY3MuQ29udGVudENvbnRyb2xzICAgICAgICA9IEdldFhtbERvY3VtZW50Rm9yTWV0cmljcyhtZXRyaWNzWG1sLCBILlBhcnRzKTsKKyAgICAgICAgICAgIG1ldHJpY3MuVGV4dEJveCAgICAgICAgICAgICAgICA9IEdldEludEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5UZXh0Qm94KTsKKyAgICAgICAgICAgIG1ldHJpY3MuQ29udGVudENvbnRyb2xDb3VudCAgICA9IEdldEludEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5Db250ZW50Q29udHJvbCk7CisgICAgICAgICAgICBtZXRyaWNzLkNvbXBsZXhGaWVsZCAgICAgICAgICAgPSBHZXRJbnRGb3JNZXRyaWNzKG1ldHJpY3NYbWwsIEguQ29tcGxleEZpZWxkKTsKKyAgICAgICAgICAgIG1ldHJpY3MuU2ltcGxlRmllbGQgICAgICAgICAgICA9IEdldEludEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5TaW1wbGVGaWVsZCk7CisgICAgICAgICAgICBtZXRyaWNzLkFsdENodW5rICAgICAgICAgICAgICAgPSBHZXRJbnRGb3JNZXRyaWNzKG1ldHJpY3NYbWwsIEguQWx0Q2h1bmspOworICAgICAgICAgICAgbWV0cmljcy5UYWJsZSAgICAgICAgICAgICAgICAgID0gR2V0SW50Rm9yTWV0cmljcyhtZXRyaWNzWG1sLCBILlRhYmxlKTsKKyAgICAgICAgICAgIG1ldHJpY3MuSHlwZXJsaW5rICAgICAgICAgICAgICA9IEdldEludEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5IeXBlcmxpbmspOworICAgICAgICAgICAgbWV0cmljcy5MZWdhY3lGcmFtZSAgICAgICAgICAgID0gR2V0SW50Rm9yTWV0cmljcyhtZXRyaWNzWG1sLCBILkxlZ2FjeUZyYW1lKTsKKyAgICAgICAgICAgIG1ldHJpY3MuQWN0aXZlWCAgICAgICAgICAgICAgICA9IEdldEludEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5BY3RpdmVYKTsKKyAgICAgICAgICAgIG1ldHJpY3MuU3ViRG9jdW1lbnQgICAgICAgICAgICA9IEdldEludEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5TdWJEb2N1bWVudCk7CisgICAgICAgICAgICBtZXRyaWNzLlJlZmVyZW5jZVRvTnVsbEltYWdlICAgPSBHZXRJbnRGb3JNZXRyaWNzKG1ldHJpY3NYbWwsIEguUmVmZXJlbmNlVG9OdWxsSW1hZ2UpOworICAgICAgICAgICAgbWV0cmljcy5FbGVtZW50Q291bnQgICAgICAgICAgID0gR2V0SW50Rm9yTWV0cmljcyhtZXRyaWNzWG1sLCBILkVsZW1lbnRDb3VudCk7CisgICAgICAgICAgICBtZXRyaWNzLkF2ZXJhZ2VQYXJhZ3JhcGhMZW5ndGggPSBHZXRJbnRGb3JNZXRyaWNzKG1ldHJpY3NYbWwsIEguQXZlcmFnZVBhcmFncmFwaExlbmd0aCk7CisgICAgICAgICAgICBtZXRyaWNzLlJ1bkNvdW50ICAgICAgICAgICAgICAgPSBHZXRJbnRGb3JNZXRyaWNzKG1ldHJpY3NYbWwsIEguUnVuQ291bnQpOworICAgICAgICAgICAgbWV0cmljcy5aZXJvTGVuZ3RoVGV4dCAgICAgICAgID0gR2V0SW50Rm9yTWV0cmljcyhtZXRyaWNzWG1sLCBILlplcm9MZW5ndGhUZXh0KTsKKyAgICAgICAgICAgIG1ldHJpY3MuTXVsdGlGb250UnVuICAgICAgICAgICA9IEdldEludEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5NdWx0aUZvbnRSdW4pOworICAgICAgICAgICAgbWV0cmljcy5Bc2NpaUNoYXJDb3VudCAgICAgICAgID0gR2V0SW50Rm9yTWV0cmljcyhtZXRyaWNzWG1sLCBILkFzY2lpQ2hhckNvdW50KTsKKyAgICAgICAgICAgIG1ldHJpY3MuQ1NDaGFyQ291bnQgICAgICAgICAgICA9IEdldEludEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5DU0NoYXJDb3VudCk7CisgICAgICAgICAgICBtZXRyaWNzLkVhc3RBc2lhQ2hhckNvdW50ICAgICAgPSBHZXRJbnRGb3JNZXRyaWNzKG1ldHJpY3NYbWwsIEguRWFzdEFzaWFDaGFyQ291bnQpOworICAgICAgICAgICAgbWV0cmljcy5IQW5zaUNoYXJDb3VudCAgICAgICAgID0gR2V0SW50Rm9yTWV0cmljcyhtZXRyaWNzWG1sLCBILkhBbnNpQ2hhckNvdW50KTsKKyAgICAgICAgICAgIG1ldHJpY3MuQXNjaWlSdW5Db3VudCAgICAgICAgICA9IEdldEludEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5Bc2NpaVJ1bkNvdW50KTsKKyAgICAgICAgICAgIG1ldHJpY3MuQ1NSdW5Db3VudCAgICAgICAgICAgICA9IEdldEludEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5DU1J1bkNvdW50KTsKKyAgICAgICAgICAgIG1ldHJpY3MuRWFzdEFzaWFSdW5Db3VudCAgICAgICA9IEdldEludEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5FYXN0QXNpYVJ1bkNvdW50KTsKKyAgICAgICAgICAgIG1ldHJpY3MuSEFuc2lSdW5Db3VudCAgICAgICAgICA9IEdldEludEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5IQW5zaVJ1bkNvdW50KTsKKyAgICAgICAgICAgIG1ldHJpY3MuUmV2aXNpb25UcmFja2luZyAgICAgICA9IEdldEJvb2xGb3JNZXRyaWNzKG1ldHJpY3NYbWwsIEguUmV2aXNpb25UcmFja2luZyk7CisgICAgICAgICAgICBtZXRyaWNzLkVtYmVkZGVkWGxzeCAgICAgICAgICAgPSBHZXRCb29sRm9yTWV0cmljcyhtZXRyaWNzWG1sLCBILkVtYmVkZGVkWGxzeCk7CisgICAgICAgICAgICBtZXRyaWNzLkludmFsaWRTYXZlVGhyb3VnaFhzbHQgPSBHZXRCb29sRm9yTWV0cmljcyhtZXRyaWNzWG1sLCBILkludmFsaWRTYXZlVGhyb3VnaFhzbHQpOworICAgICAgICAgICAgbWV0cmljcy5UcmFja1JldmlzaW9uc0VuYWJsZWQgID0gR2V0Qm9vbEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5UcmFja1JldmlzaW9uc0VuYWJsZWQpOworICAgICAgICAgICAgbWV0cmljcy5Eb2N1bWVudFByb3RlY3Rpb24gICAgID0gR2V0Qm9vbEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5Eb2N1bWVudFByb3RlY3Rpb24pOworICAgICAgICAgICAgbWV0cmljcy5WYWxpZCAgICAgICAgICAgICAgICAgID0gR2V0Qm9vbEZvck1ldHJpY3MobWV0cmljc1htbCwgSC5WYWxpZCk7CisgICAgICAgICAgICBtZXRyaWNzLkxhbmd1YWdlcyAgICAgICAgICAgICAgPSBHZXRTdHJpbmdGb3JNZXRyaWNzKG1ldHJpY3NYbWwsIEguTGFuZ3VhZ2VzKTsKKyAgICAgICAgICAgIG1ldHJpY3MuTnVtYmVyaW5nRm9ybWF0TGlzdCAgICA9IEdldFN0cmluZ0Zvck1ldHJpY3MobWV0cmljc1htbCwgSC5OdW1iZXJpbmdGb3JtYXRMaXN0KTsKKworICAgICAgICAgICAgcmV0dXJuIG1ldHJpY3M7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0U3RyaW5nRm9yTWV0cmljcyhYRWxlbWVudCBtZXRyaWNzWG1sLCBYTmFtZSB4TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVsZSA9IG1ldHJpY3NYbWwuRWxlbWVudCh4TmFtZSk7CisgICAgICAgICAgICBpZiAoZWxlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpZWxlLkF0dHJpYnV0ZShILlZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIEdldEJvb2xGb3JNZXRyaWNzKFhFbGVtZW50IG1ldHJpY3NYbWwsIFhOYW1lIHhOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZWxlID0gbWV0cmljc1htbC5FbGVtZW50KHhOYW1lKTsKKyAgICAgICAgICAgIGlmIChlbGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gKGJvb2wpZWxlLkF0dHJpYnV0ZShILlZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgR2V0SW50Rm9yTWV0cmljcyhYRWxlbWVudCBtZXRyaWNzWG1sLCBYTmFtZSB4TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVsZSA9IG1ldHJpY3NYbWwuRWxlbWVudCh4TmFtZSk7CisgICAgICAgICAgICBpZiAoZWxlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICByZXR1cm4gKGludCllbGUuQXR0cmlidXRlKEguVmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhtbERvY3VtZW50IEdldFhtbERvY3VtZW50Rm9yTWV0cmljcyhYRWxlbWVudCBtZXRyaWNzWG1sLCBYTmFtZSB4TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVsZSA9IG1ldHJpY3NYbWwuRWxlbWVudCh4TmFtZSk7CisgICAgICAgICAgICBpZiAoZWxlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gKG5ldyBYRG9jdW1lbnQobWV0cmljc1htbC5FbGVtZW50KHhOYW1lKSkpLkdldFhtbERvY3VtZW50KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9QZWdCYXNlLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvUGVnQmFzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjIyYjFmCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvUGVnQmFzZS5jcwpAQCAtMCwwICsxLDIxMDYgQEAKK++7vy8qQXV0aG9yOk1hcnRpbi5Ib2x6aGVycjtEYXRlOjIwMDgwOTIyO0NvbnRleHQ6IlBFRyBTdXBwb3J0IGZvciBDIyI7TGljZW5jZTpDUE9MCisgKiA8PEhpc3Rvcnk+PiAKKyAqICAyMDA4MDkyMjtWMS4wIGNyZWF0ZWQKKyAqICAyMDA4MDkyOTtVVEYxNkJFO0FkZGVkIFVURjE2QkUgcmVhZCBzdXBwb3J0IHRvIDw8RmlsZUxvYWRlci5Mb2FkRmlsZShvdXQgc3RyaW5nIHNyYyk+PgorICogPDwvSGlzdG9yeT4+CisqLwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtOworbmFtZXNwYWNlIFBlZy5CYXNlCit7CisgICAgI3JlZ2lvbiBJbnB1dCBGaWxlIFN1cHBvcnQKKyAgICBwdWJsaWMgZW51bSBFbmNvZGluZ0NsYXNzIHsgdW5pY29kZSwgdXRmOCwgYmluYXJ5LCBhc2NpaSB9OworICAgIHB1YmxpYyBlbnVtIFVuaWNvZGVEZXRlY3Rpb24geyBub3RBcHBsaWNhYmxlLCBCT00sIEZpcnN0Q2hhcklzQXNjaWkgfTsKKyAgICBwdWJsaWMgY2xhc3MgRmlsZUxvYWRlcgorICAgIHsKKyAgICAgICAgcHVibGljIGVudW0gRmlsZUVuY29kaW5nIHsgbm9uZSwgYXNjaWksIGJpbmFyeSwgdXRmOCwgdW5pY29kZSwgdXRmMTZiZSwgdXRmMTZsZSwgdXRmMzJsZSwgdXRmMzJiZSwgdW5pQ29kZUJPTSB9OworICAgICAgICBwdWJsaWMgRmlsZUxvYWRlcihFbmNvZGluZ0NsYXNzIGVuY29kaW5nQ2xhc3MsIFVuaWNvZGVEZXRlY3Rpb24gZGV0ZWN0aW9uLCBzdHJpbmcgcGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgZW5jb2RpbmdfID0gR2V0RW5jb2RpbmcoZW5jb2RpbmdDbGFzcywgZGV0ZWN0aW9uLCBwYXRoKTsKKyAgICAgICAgICAgIHBhdGhfID0gcGF0aDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBJc0JpbmFyeUZpbGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5jb2RpbmdfID09IEZpbGVFbmNvZGluZy5iaW5hcnk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgTG9hZEZpbGUob3V0IGJ5dGVbXSBzcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNyYyA9IG51bGw7CisgICAgICAgICAgICBpZiAoIUlzQmluYXJ5RmlsZSgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB1c2luZyAoQmluYXJ5UmVhZGVyIGJyZHIgPSBuZXcgQmluYXJ5UmVhZGVyKEZpbGUuT3BlbihwYXRoXywgRmlsZU1vZGUuT3BlbixGaWxlQWNjZXNzLlJlYWQpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcmMgPSBicmRyLlJlYWRCeXRlcygoaW50KWJyZHIuQmFzZVN0cmVhbS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIExvYWRGaWxlKG91dCBzdHJpbmcgc3JjKQorICAgICAgICB7CisgICAgICAgICAgICBzcmMgPSBudWxsOworICAgICAgICAgICAgRW5jb2RpbmcgdGV4dEVuY29kaW5nID0gRmlsZUVuY29kaW5nVG9UZXh0RW5jb2RpbmcoKTsKKyAgICAgICAgICAgIGlmICh0ZXh0RW5jb2RpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdfID09IEZpbGVFbmNvZGluZy5iaW5hcnkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB1c2luZyAoU3RyZWFtUmVhZGVyIHJkID0gbmV3IFN0cmVhbVJlYWRlcihwYXRoXywgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcmMgPSByZC5SZWFkVG9FbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ18gPT0gRmlsZUVuY29kaW5nLnV0ZjE2YmUpLy9VVEYxNkJFCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2luZyAoQmluYXJ5UmVhZGVyIGJyZHIgPSBuZXcgQmluYXJ5UmVhZGVyKEZpbGUuT3BlbihwYXRoXywgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGJyZHIuUmVhZEJ5dGVzKChpbnQpYnJkci5CYXNlU3RyZWFtLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5MZW5ndGg7IGkgKz0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikoYnl0ZXNbaV0gPDwgOCB8IGJ5dGVzW2kgKyAxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5BcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSBzLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2luZyAoU3RyZWFtUmVhZGVyIHJkID0gbmV3IFN0cmVhbVJlYWRlcihwYXRoXywgdGV4dEVuY29kaW5nKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gcmQuUmVhZFRvRW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIEVuY29kaW5nIEZpbGVFbmNvZGluZ1RvVGV4dEVuY29kaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChlbmNvZGluZ18pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBGaWxlRW5jb2RpbmcudXRmODogcmV0dXJuIG5ldyBVVEY4RW5jb2RpbmcoKTsKKyAgICAgICAgICAgICAgICBjYXNlIEZpbGVFbmNvZGluZy51dGYzMmJlOgorICAgICAgICAgICAgICAgIGNhc2UgRmlsZUVuY29kaW5nLnV0ZjMybGU6IHJldHVybiBuZXcgVVRGMzJFbmNvZGluZygpOworICAgICAgICAgICAgICAgIGNhc2UgRmlsZUVuY29kaW5nLnVuaWNvZGU6CisgICAgICAgICAgICAgICAgY2FzZSBGaWxlRW5jb2RpbmcudXRmMTZiZToKKyAgICAgICAgICAgICAgICBjYXNlIEZpbGVFbmNvZGluZy51dGYxNmxlOiByZXR1cm4gbmV3IFVuaWNvZGVFbmNvZGluZygpOworICAgICAgICAgICAgICAgIGNhc2UgRmlsZUVuY29kaW5nLmFzY2lpOiByZXR1cm4gbmV3IEFTQ0lJRW5jb2RpbmcoKTsKKyAgICAgICAgICAgICAgICBjYXNlIEZpbGVFbmNvZGluZy5iaW5hcnk6CisgICAgICAgICAgICAgICAgY2FzZSBGaWxlRW5jb2RpbmcudW5pQ29kZUJPTTogcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogRGVidWcuQXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgRmlsZUVuY29kaW5nIERldGVybWluZVVuaWNvZGVXaGVuRmlyc3RDaGFySXNBc2NpaShzdHJpbmcgcGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKEJpbmFyeVJlYWRlciBiciA9IG5ldyBCaW5hcnlSZWFkZXIoRmlsZS5PcGVuKHBhdGgsIEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBzdGFydEJ5dGVzID0gYnIuUmVhZEJ5dGVzKDQpOworICAgICAgICAgICAgICAgIGlmIChzdGFydEJ5dGVzLkxlbmd0aCA9PSAwKSByZXR1cm4gRmlsZUVuY29kaW5nLm5vbmU7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0Qnl0ZXMuTGVuZ3RoID09IDEgfHwgc3RhcnRCeXRlcy5MZW5ndGggPT0gMykgcmV0dXJuIEZpbGVFbmNvZGluZy51dGY4OworICAgICAgICAgICAgICAgIGlmIChzdGFydEJ5dGVzLkxlbmd0aCA9PSAyICYmIHN0YXJ0Qnl0ZXNbMF0gIT0gMCkgcmV0dXJuIEZpbGVFbmNvZGluZy51dGYxNmxlOworICAgICAgICAgICAgICAgIGlmIChzdGFydEJ5dGVzLkxlbmd0aCA9PSAyICYmIHN0YXJ0Qnl0ZXNbMF0gPT0gMCkgcmV0dXJuIEZpbGVFbmNvZGluZy51dGYxNmJlOworICAgICAgICAgICAgICAgIGlmIChzdGFydEJ5dGVzWzBdID09IDAgJiYgc3RhcnRCeXRlc1sxXSA9PSAwKSByZXR1cm4gRmlsZUVuY29kaW5nLnV0ZjMyYmU7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0Qnl0ZXNbMF0gPT0gMCAmJiBzdGFydEJ5dGVzWzFdICE9IDApIHJldHVybiBGaWxlRW5jb2RpbmcudXRmMTZiZTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRCeXRlc1swXSAhPSAwICYmIHN0YXJ0Qnl0ZXNbMV0gPT0gMCkgcmV0dXJuIEZpbGVFbmNvZGluZy51dGYxNmxlOworICAgICAgICAgICAgICAgIHJldHVybiBGaWxlRW5jb2RpbmcudXRmODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGaWxlRW5jb2RpbmcgR2V0RW5jb2RpbmcoRW5jb2RpbmdDbGFzcyBlbmNvZGluZ0NsYXNzLCBVbmljb2RlRGV0ZWN0aW9uIGRldGVjdGlvbiwgc3RyaW5nIHBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZW5jb2RpbmdDbGFzcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEVuY29kaW5nQ2xhc3MuYXNjaWk6IHJldHVybiBGaWxlRW5jb2RpbmcuYXNjaWk7CisgICAgICAgICAgICAgICAgY2FzZSBFbmNvZGluZ0NsYXNzLnVuaWNvZGU6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXRlY3Rpb24gPT0gVW5pY29kZURldGVjdGlvbi5GaXJzdENoYXJJc0FzY2lpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEZXRlcm1pbmVVbmljb2RlV2hlbkZpcnN0Q2hhcklzQXNjaWkocGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXRlY3Rpb24gPT0gVW5pY29kZURldGVjdGlvbi5CT00pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVFbmNvZGluZy51bmlDb2RlQk9NOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gRmlsZUVuY29kaW5nLnVuaWNvZGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEVuY29kaW5nQ2xhc3MudXRmODogcmV0dXJuIEZpbGVFbmNvZGluZy51dGY4OworICAgICAgICAgICAgICAgIGNhc2UgRW5jb2RpbmdDbGFzcy5iaW5hcnk6IHJldHVybiBGaWxlRW5jb2RpbmcuYmluYXJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEZpbGVFbmNvZGluZy5ub25lOworICAgICAgICB9CisgICAgICAgIHN0cmluZyBwYXRoXzsKKyAgICAgICAgcHVibGljIHJlYWRvbmx5IEZpbGVFbmNvZGluZyBlbmNvZGluZ187CisgICAgfQorICAgICNlbmRyZWdpb24gSW5wdXQgRmlsZSBTdXBwb3J0CisgICAgI3JlZ2lvbiBFcnJvciBoYW5kbGluZworICAgIHB1YmxpYyBjbGFzcyBQZWdFeGNlcHRpb24gOiBTeXN0ZW0uRXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgUGVnRXhjZXB0aW9uKCkKKyAgICAgICAgICAgIDogYmFzZSgiRmF0YWwgcGFyc2luZyBlcnJvciBvY3VycmVkIikKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyBzdHJ1Y3QgUGVnRXJyb3IKKyAgICB7CisgICAgICAgIGludGVybmFsIFNvcnRlZExpc3Q8aW50LCBpbnQ+IGxpbmVTdGFydHM7CisgICAgICAgIHZvaWQgQWRkTGluZVN0YXJ0cyhzdHJpbmcgcywgaW50IGZpcnN0LCBpbnQgbGFzdCwgcmVmIGludCBsaW5lTm8sIG91dCBpbnQgY29sTm8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbE5vID0gMjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBmaXJzdCArIDE7IGkgPD0gbGFzdDsgKytpLCArK2NvbE5vKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzW2kgLSAxXSA9PSAnXG4nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZVN0YXJ0c1tpXSA9ICsrbGluZU5vOworICAgICAgICAgICAgICAgICAgICBjb2xObyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLS1jb2xObzsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRMaW5lQW5kQ29sKHN0cmluZyBzLCBpbnQgcG9zLCBvdXQgaW50IGxpbmVObywgb3V0IGludCBjb2xObykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxpbmVTdGFydHMuQ291bnQoKTsgaSA+IDA7IC0taSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLZXlWYWx1ZVBhaXI8aW50LCBpbnQ+IGN1ckxzID0gbGluZVN0YXJ0cy5FbGVtZW50QXQoaSAtIDEpOworICAgICAgICAgICAgICAgIGlmIChjdXJMcy5LZXkgPT0gcG9zKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZU5vID0gY3VyTHMuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGNvbE5vID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY3VyTHMuS2V5IDwgcG9zKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZU5vID0gY3VyTHMuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIEFkZExpbmVTdGFydHMocywgY3VyTHMuS2V5LCBwb3MsIHJlZiBsaW5lTm8sIG91dCBjb2xObyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW5lTm8gPSAxOworICAgICAgICAgICAgQWRkTGluZVN0YXJ0cyhzLCAwLCBwb3MsIHJlZiBsaW5lTm8sIG91dCBjb2xObyk7CisgICAgICAgIH0KKyAgICB9CisgICAgI2VuZHJlZ2lvbiBFcnJvciBoYW5kbGluZworICAgICNyZWdpb24gU3ludGF4L1BhcnNlLVRyZWUgcmVsYXRlZCBjbGFzc2VzCisgICAgcHVibGljIGVudW0gRVNwZWNpYWxOb2RlcyB7IGVGYXRhbCA9IC0xMDAwMSwgZUFub255bU5UTm9kZSA9IC0xMDAwLCBlQW5vbnltQVNUTm9kZSA9IC0xMDAxLCBlQW5vbnltb3VzTm9kZSA9IC0xMDAgfQorICAgIHB1YmxpYyBlbnVtIEVDcmVhdG9yUGhhc2UgeyBlQ3JlYXRlLCBlQ3JlYXRpb25Db21wbGV0ZSwgZUNyZWF0ZUFuZENvbXBsZXRlIH0KKyAgICBwdWJsaWMgc3RydWN0IFBlZ0JlZ0VuZC8vaW5kaWNlcyBpbnRvIHRoZSBzb3VyY2Ugc3RyaW5nCisgICAgeworICAgICAgICBwdWJsaWMgaW50IExlbmd0aAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcG9zRW5kXyAtIHBvc0JlZ187IH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RyaW5nIEdldEFzU3RyaW5nKHN0cmluZyBzcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIERlYnVnLkFzc2VydChzcmMuTGVuZ3RoID49IHBvc0VuZF8pOworICAgICAgICAgICAgcmV0dXJuIHNyYy5TdWJzdHJpbmcocG9zQmVnXywgTGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHBvc0JlZ187CisgICAgICAgIHB1YmxpYyBpbnQgcG9zRW5kXzsKKyAgICB9CisgICAgcHVibGljIGNsYXNzIFBlZ05vZGUgOiBJQ2xvbmVhYmxlCisgICAgeworICAgICAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgICAgICBwdWJsaWMgUGVnTm9kZShQZWdOb2RlIHBhcmVudCwgaW50IGlkLCBQZWdCZWdFbmQgbWF0Y2gsIFBlZ05vZGUgY2hpbGQsIFBlZ05vZGUgbmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgcGFyZW50XyA9IHBhcmVudDsgaWRfID0gaWQ7IGNoaWxkXyA9IGNoaWxkOyBuZXh0XyA9IG5leHQ7CisgICAgICAgICAgICBtYXRjaF8gPSBtYXRjaDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgUGVnTm9kZShQZWdOb2RlIHBhcmVudCwgaW50IGlkLCBQZWdCZWdFbmQgbWF0Y2gsIFBlZ05vZGUgY2hpbGQpCisgICAgICAgICAgICA6IHRoaXMocGFyZW50LCBpZCwgbWF0Y2gsIGNoaWxkLCBudWxsKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFBlZ05vZGUoUGVnTm9kZSBwYXJlbnQsIGludCBpZCwgUGVnQmVnRW5kIG1hdGNoKQorICAgICAgICAgICAgOiB0aGlzKHBhcmVudCwgaWQsIG1hdGNoLCBudWxsLCBudWxsKQorICAgICAgICB7IH0KKyAgICAgICAgcHVibGljIFBlZ05vZGUoUGVnTm9kZSBwYXJlbnQsIGludCBpZCkKKyAgICAgICAgICAgIDogdGhpcyhwYXJlbnQsIGlkLCBuZXcgUGVnQmVnRW5kKCksIG51bGwsIG51bGwpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworICAgICAgICAjcmVnaW9uIFB1YmxpYyBNZW1iZXJzCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBHZXRBc1N0cmluZyhzdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1hdGNoXy5HZXRBc1N0cmluZyhzKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCBQZWdOb2RlIENsb25lKCkKKyAgICAgICAgeworICAgICAgICAgICAgUGVnTm9kZSBjbG9uZT0gbmV3IFBlZ05vZGUocGFyZW50XywgaWRfLCBtYXRjaF8pOworICAgICAgICAgICAgQ2xvbmVTdWJUcmVlcyhjbG9uZSk7CisgICAgICAgICAgICByZXR1cm4gY2xvbmU7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbiBQdWJsaWMgTWVtYmVycworICAgICAgICAjcmVnaW9uIFByb3RlY3RlZCBNZW1iZXJzCisgICAgICAgIHByb3RlY3RlZCB2b2lkIENsb25lU3ViVHJlZXMoUGVnTm9kZSBjbG9uZSkKKyAgICAgICAgeworICAgICAgICAgICAgUGVnTm9kZSBjaGlsZCA9IG51bGwsIG5leHQgPSBudWxsOworICAgICAgICAgICAgaWYgKGNoaWxkXyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGRfLkNsb25lKCk7CisgICAgICAgICAgICAgICAgY2hpbGQucGFyZW50XyA9IGNsb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5leHRfICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV4dCA9IG5leHRfLkNsb25lKCk7CisgICAgICAgICAgICAgICAgbmV4dC5wYXJlbnRfID0gY2xvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbG9uZS5jaGlsZF8gPSBjaGlsZDsKKyAgICAgICAgICAgIGNsb25lLm5leHRfID0gbmV4dDsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uIFByb3RlY3RlZCBNZW1iZXJzCisgICAgICAgICNyZWdpb24gRGF0YSBNZW1iZXJzCisgICAgICAgIHB1YmxpYyBpbnQgaWRfOworICAgICAgICBwdWJsaWMgUGVnTm9kZSBwYXJlbnRfLCBjaGlsZF8sIG5leHRfOworICAgICAgICBwdWJsaWMgUGVnQmVnRW5kIG1hdGNoXzsKKyAgICAgICAgI2VuZHJlZ2lvbiBEYXRhIE1lbWJlcnMKKworICAgICAgICAjcmVnaW9uIElDbG9uZWFibGUgTWVtYmVycworCisgICAgICAgIG9iamVjdCBJQ2xvbmVhYmxlLkNsb25lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENsb25lKCk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorICAgIGludGVybmFsIHN0cnVjdCBQZWdUcmVlCisgICAgeworICAgICAgICBpbnRlcm5hbCBlbnVtIEFkZFBvbGljeSB7IGVBZGRBc0NoaWxkLCBlQWRkQXNTaWJsaW5nIH07CisgICAgICAgIGludGVybmFsIFBlZ05vZGUgcm9vdF87CisgICAgICAgIGludGVybmFsIFBlZ05vZGUgY3VyXzsKKyAgICAgICAgaW50ZXJuYWwgQWRkUG9saWN5IGFkZFBvbGljeTsKKyAgICB9CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFByaW50Tm9kZQorICAgIHsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBMZW5NYXhMaW5lKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIElzTGVhZihQZWdOb2RlIHApOworICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIElzU2tpcChQZWdOb2RlIHApIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFByaW50Tm9kZUJlZyhQZWdOb2RlIHAsIGJvb2wgYkFsaWduVmVydGljYWwsIHJlZiBpbnQgbk9mZnNldExpbmVCZWcsIGludCBuTGV2ZWwpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBQcmludE5vZGVFbmQoUGVnTm9kZSBwLCBib29sIGJBbGlnblZlcnRpY2FsLCByZWYgaW50IG5PZmZzZXRMaW5lQmVnLCBpbnQgbkxldmVsKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBMZW5Ob2RlQmVnKFBlZ05vZGUgcCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgTGVuTm9kZUVuZChQZWdOb2RlIHApOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBQcmludExlYWYoUGVnTm9kZSBwLCByZWYgaW50IG5PZmZzZXRMaW5lQmVnLCBib29sIGJBbGlnblZlcnRpY2FsKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBMZW5MZWFmKFBlZ05vZGUgcCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgTGVuRGlzdE5leHQoUGVnTm9kZSBwLCBib29sIGJBbGlnblZlcnRpY2FsLCByZWYgaW50IG5PZmZzZXRMaW5lQmVnLCBpbnQgbkxldmVsKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgUHJpbnREaXN0TmV4dChQZWdOb2RlIHAsIGJvb2wgYkFsaWduVmVydGljYWwsIHJlZiBpbnQgbk9mZnNldExpbmVCZWcsIGludCBuTGV2ZWwpOworICAgIH0KKyAgICBwdWJsaWMgY2xhc3MgVHJlZVByaW50IDogUHJpbnROb2RlCisgICAgeworICAgICAgICAjcmVnaW9uIERhdGEgTWVtYmVycworICAgICAgICBwdWJsaWMgZGVsZWdhdGUgc3RyaW5nIEdldE5vZGVOYW1lKFBlZ05vZGUgbm9kZSk7CisgICAgICAgIHN0cmluZyBzcmNfOworICAgICAgICBUZXh0V3JpdGVyIHRyZWVPdXRfOworICAgICAgICBpbnQgbk1heExpbmVMZW5fOworICAgICAgICBib29sIGJWZXJib3NlXzsKKyAgICAgICAgR2V0Tm9kZU5hbWUgR2V0Tm9kZU5hbWVfOworICAgICAgICAjZW5kcmVnaW9uIERhdGEgTWVtYmVycworICAgICAgICAjcmVnaW9uIE1ldGhvZHMKKyAgICAgICAgcHVibGljIFRyZWVQcmludChUZXh0V3JpdGVyIHRyZWVPdXQsIHN0cmluZyBzcmMsIGludCBuTWF4TGluZUxlbiwgR2V0Tm9kZU5hbWUgR2V0Tm9kZU5hbWUsIGJvb2wgYlZlcmJvc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyZWVPdXRfID0gdHJlZU91dDsKKyAgICAgICAgICAgIG5NYXhMaW5lTGVuXyA9IG5NYXhMaW5lTGVuOworICAgICAgICAgICAgYlZlcmJvc2VfID0gYlZlcmJvc2U7CisgICAgICAgICAgICBHZXROb2RlTmFtZV8gPSBHZXROb2RlTmFtZTsKKyAgICAgICAgICAgIHNyY18gPSBzcmM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBQcmludFRyZWUoUGVnTm9kZSBwYXJlbnQsIGludCBuT2Zmc2V0TGluZUJlZywgaW50IG5MZXZlbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElzTGVhZihwYXJlbnQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFByaW50TGVhZihwYXJlbnQsIHJlZiBuT2Zmc2V0TGluZUJlZywgZmFsc2UpOworICAgICAgICAgICAgICAgIHRyZWVPdXRfLkZsdXNoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCBiQWxpZ25WZXJ0aWNhbCA9CisgICAgICAgICAgICAgICAgRGV0ZXJtaW5lTGluZUxlbmd0aChwYXJlbnQsIG5PZmZzZXRMaW5lQmVnKSA+IExlbk1heExpbmUoKTsKKyAgICAgICAgICAgIFByaW50Tm9kZUJlZyhwYXJlbnQsIGJBbGlnblZlcnRpY2FsLCByZWYgbk9mZnNldExpbmVCZWcsIG5MZXZlbCk7CisgICAgICAgICAgICBpbnQgbk9mZnNldCA9IG5PZmZzZXRMaW5lQmVnOworICAgICAgICAgICAgZm9yIChQZWdOb2RlIHAgPSBwYXJlbnQuY2hpbGRfOyBwICE9IG51bGw7IHAgPSBwLm5leHRfKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChJc1NraXAocCkpIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWYgKElzTGVhZihwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFByaW50TGVhZihwLCByZWYgbk9mZnNldExpbmVCZWcsIGJBbGlnblZlcnRpY2FsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUcmVlKHAsIG5PZmZzZXRMaW5lQmVnLCBuTGV2ZWwgKyAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJBbGlnblZlcnRpY2FsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbk9mZnNldExpbmVCZWcgPSBuT2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAocC5uZXh0XyAhPSBudWxsICYmIElzU2tpcChwLm5leHRfKSkgcCA9IHAubmV4dF87CisKKyAgICAgICAgICAgICAgICBpZiAocC5uZXh0XyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnREaXN0TmV4dChwLCBiQWxpZ25WZXJ0aWNhbCwgcmVmIG5PZmZzZXRMaW5lQmVnLCBuTGV2ZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFByaW50Tm9kZUVuZChwYXJlbnQsIGJBbGlnblZlcnRpY2FsLCByZWYgIG5PZmZzZXRMaW5lQmVnLCBuTGV2ZWwpOworICAgICAgICAgICAgdHJlZU91dF8uRmx1c2goKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgRGV0ZXJtaW5lTGluZUxlbmd0aChQZWdOb2RlIHBhcmVudCwgaW50IG5PZmZzZXRMaW5lQmVnKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbkxlbiA9IExlbk5vZGVCZWcocGFyZW50KTsKKyAgICAgICAgICAgIFBlZ05vZGUgcDsKKyAgICAgICAgICAgIGZvciAocCA9IHBhcmVudC5jaGlsZF87IHAgIT0gbnVsbDsgcCA9IHAubmV4dF8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKElzU2tpcChwKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKElzTGVhZihwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5MZW4gKz0gTGVuTGVhZihwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbkxlbiArPSBEZXRlcm1pbmVMaW5lTGVuZ3RoKHAsIG5PZmZzZXRMaW5lQmVnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5MZW4gKyBuT2Zmc2V0TGluZUJlZyA+IExlbk1heExpbmUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuTGVuICsgbk9mZnNldExpbmVCZWc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbkxlbiArPSBMZW5Ob2RlRW5kKHApOworICAgICAgICAgICAgcmV0dXJuIG5MZW47CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBMZW5NYXhMaW5lKCkgeyByZXR1cm4gbk1heExpbmVMZW5fOyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkCisgICAgICAgICAgICBQcmludE5vZGVCZWcoUGVnTm9kZSBwLCBib29sIGJBbGlnblZlcnRpY2FsLCByZWYgaW50IG5PZmZzZXRMaW5lQmVnLCBpbnQgbkxldmVsKQorICAgICAgICB7CisgICAgICAgICAgICBQcmludElkQXNOYW1lKHApOworICAgICAgICAgICAgdHJlZU91dF8uV3JpdGUoIjwiKTsKKyAgICAgICAgICAgIGlmIChiQWxpZ25WZXJ0aWNhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmVlT3V0Xy5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgICAgICB0cmVlT3V0Xy5Xcml0ZShuZXcgc3RyaW5nKCcgJywgbk9mZnNldExpbmVCZWcgKz0gMikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrbk9mZnNldExpbmVCZWc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQKKyAgICAgICAgICAgIFByaW50Tm9kZUVuZChQZWdOb2RlIHAsIGJvb2wgYkFsaWduVmVydGljYWwsIHJlZiBpbnQgbk9mZnNldExpbmVCZWcsIGludCBuTGV2ZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiQWxpZ25WZXJ0aWNhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmVlT3V0Xy5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgICAgICB0cmVlT3V0Xy5Xcml0ZShuZXcgc3RyaW5nKCcgJywgbk9mZnNldExpbmVCZWcgLT0gMikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJlZU91dF8uV3JpdGUoJz4nKTsKKyAgICAgICAgICAgIGlmICghYkFsaWduVmVydGljYWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytuT2Zmc2V0TGluZUJlZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IExlbk5vZGVCZWcoUGVnTm9kZSBwKSB7IHJldHVybiBMZW5JZEFzTmFtZShwKSArIDE7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBMZW5Ob2RlRW5kKFBlZ05vZGUgcCkgeyByZXR1cm4gMTsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludExlYWYoUGVnTm9kZSBwLCByZWYgaW50IG5PZmZzZXRMaW5lQmVnLCBib29sIGJBbGlnblZlcnRpY2FsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYlZlcmJvc2VfKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFByaW50SWRBc05hbWUocCk7CisgICAgICAgICAgICAgICAgdHJlZU91dF8uV3JpdGUoJzwnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBsZW4gPSBwLm1hdGNoXy5wb3NFbmRfIC0gcC5tYXRjaF8ucG9zQmVnXzsKKyAgICAgICAgICAgIHRyZWVPdXRfLldyaXRlKCInIik7CisgICAgICAgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmVlT3V0Xy5Xcml0ZShzcmNfLlN1YnN0cmluZyhwLm1hdGNoXy5wb3NCZWdfLCBwLm1hdGNoXy5wb3NFbmRfIC0gcC5tYXRjaF8ucG9zQmVnXykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJlZU91dF8uV3JpdGUoIiciKTsKKyAgICAgICAgICAgIGlmIChiVmVyYm9zZV8pIHRyZWVPdXRfLldyaXRlKCc+Jyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBMZW5MZWFmKFBlZ05vZGUgcCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG5MZW4gPSBwLm1hdGNoXy5wb3NFbmRfIC0gcC5tYXRjaF8ucG9zQmVnXyArIDI7CisgICAgICAgICAgICBpZiAoYlZlcmJvc2VfKSBuTGVuICs9IExlbklkQXNOYW1lKHApICsgMjsKKyAgICAgICAgICAgIHJldHVybiBuTGVuOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzTGVhZihQZWdOb2RlIHApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwLmNoaWxkXyA9PSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQKKyAgICAgICAgICAgIFByaW50RGlzdE5leHQoUGVnTm9kZSBwLCBib29sIGJBbGlnblZlcnRpY2FsLCByZWYgaW50IG5PZmZzZXRMaW5lQmVnLCBpbnQgbkxldmVsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYkFsaWduVmVydGljYWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJlZU91dF8uV3JpdGVMaW5lKCk7CisgICAgICAgICAgICAgICAgdHJlZU91dF8uV3JpdGUobmV3IHN0cmluZygnICcsIG5PZmZzZXRMaW5lQmVnKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJlZU91dF8uV3JpdGUoJyAnKTsKKyAgICAgICAgICAgICAgICArK25PZmZzZXRMaW5lQmVnOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludAorICAgICAgICAgICAgTGVuRGlzdE5leHQoUGVnTm9kZSBwLCBib29sIGJBbGlnblZlcnRpY2FsLCByZWYgaW50IG5PZmZzZXRMaW5lQmVnLCBpbnQgbkxldmVsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpbnQgTGVuSWRBc05hbWUoUGVnTm9kZSBwKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgbmFtZSA9IEdldE5vZGVOYW1lXyhwKTsKKyAgICAgICAgICAgIHJldHVybiBuYW1lLkxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICB2b2lkIFByaW50SWRBc05hbWUoUGVnTm9kZSBwKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgbmFtZSA9IEdldE5vZGVOYW1lXyhwKTsKKyAgICAgICAgICAgIHRyZWVPdXRfLldyaXRlKG5hbWUpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24gTWV0aG9kcworICAgIH0KKyAgICAjZW5kcmVnaW9uIFN5bnRheC9QYXJzZS1UcmVlIHJlbGF0ZWQgY2xhc3NlcworICAgICNyZWdpb24gUGFyc2VycworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQZWdCYXNlUGFyc2VyCisgICAgeworICAgICAgICAjcmVnaW9uIERhdGEgVHlwZXMKKyAgICAgICAgcHVibGljIGRlbGVnYXRlIGJvb2wgTWF0Y2hlcigpOworICAgICAgICBwdWJsaWMgZGVsZWdhdGUgUGVnTm9kZSBDcmVhdG9yKEVDcmVhdG9yUGhhc2UgZVBoYXNlLCBQZWdOb2RlIHBhcmVudE9yQ3JlYXRlZCwgaW50IGlkKTsKKyAgICAgICAgI2VuZHJlZ2lvbiBEYXRhIFR5cGVzCisgICAgICAgICNyZWdpb24gRGF0YSBtZW1iZXJzCisgICAgICAgIHByb3RlY3RlZCBpbnQgc3JjTGVuXzsKKyAgICAgICAgcHJvdGVjdGVkIGludCBwb3NfOworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBiTXV0ZV87CisgICAgICAgIHByb3RlY3RlZCBUZXh0V3JpdGVyIGVyck91dF87CisgICAgICAgIHByb3RlY3RlZCBDcmVhdG9yIG5vZGVDcmVhdG9yXzsKKyAgICAgICAgcHJvdGVjdGVkIGludCBtYXhwb3NfOworICAgICAgICBQZWdUcmVlIHRyZWU7CisgICAgICAgICNlbmRyZWdpb24gRGF0YSBtZW1iZXJzCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBHZXRSdWxlTmFtZUZyb21JZChpbnQgaWQpCisgICAgICAgIHsvL25vcm1hbGx5IG92ZXJyaWRkZW4KKyAgICAgICAgICAgIHN3aXRjaCAoaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAoaW50KUVTcGVjaWFsTm9kZXMuZUZhdGFsOiByZXR1cm4gIkZBVEFMIjsKKyAgICAgICAgICAgICAgICBjYXNlIChpbnQpRVNwZWNpYWxOb2Rlcy5lQW5vbnltTlROb2RlOiByZXR1cm4gIk5vbnRlcm1pbmFsIjsKKyAgICAgICAgICAgICAgICBjYXNlIChpbnQpRVNwZWNpYWxOb2Rlcy5lQW5vbnltQVNUTm9kZTogcmV0dXJuICJBU1ROb2RlIjsKKyAgICAgICAgICAgICAgICBjYXNlIChpbnQpRVNwZWNpYWxOb2Rlcy5lQW5vbnltb3VzTm9kZTogcmV0dXJuICJOb2RlIjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gaWQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEdldFByb3BlcnRpZXMob3V0IEVuY29kaW5nQ2xhc3MgZW5jb2RpbmcsIG91dCBVbmljb2RlRGV0ZWN0aW9uIGRldGVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgZW5jb2RpbmcgPSBFbmNvZGluZ0NsYXNzLmFzY2lpOworICAgICAgICAgICAgZGV0ZWN0aW9uID0gVW5pY29kZURldGVjdGlvbi5ub3RBcHBsaWNhYmxlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgR2V0TWF4aW11bVBvc2l0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1heHBvc187CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIFBlZ05vZGUgRGVmYXVsdE5vZGVDcmVhdG9yKEVDcmVhdG9yUGhhc2UgcGhhc2UsIFBlZ05vZGUgcGFyZW50T3JDcmVhdGVkLCBpbnQgaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwaGFzZSA9PSBFQ3JlYXRvclBoYXNlLmVDcmVhdGUgfHwgcGhhc2UgPT0gRUNyZWF0b3JQaGFzZS5lQ3JlYXRlQW5kQ29tcGxldGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQZWdOb2RlKHBhcmVudE9yQ3JlYXRlZCwgaWQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwYXJlbnRPckNyZWF0ZWQubWF0Y2hfLnBvc0VuZF8gPiBtYXhwb3NfKQorICAgICAgICAgICAgICAgICAgICBtYXhwb3NfID0gcGFyZW50T3JDcmVhdGVkLm1hdGNoXy5wb3NFbmRfOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgICAgICBwdWJsaWMgUGVnQmFzZVBhcnNlcihUZXh0V3JpdGVyIGVyck91dCkKKyAgICAgICAgeworICAgICAgICAgICAgc3JjTGVuXyA9IHBvc18gPSAwOworICAgICAgICAgICAgZXJyT3V0XyA9IGVyck91dDsKKyAgICAgICAgICAgIG5vZGVDcmVhdG9yXyA9IERlZmF1bHROb2RlQ3JlYXRvcjsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworICAgICAgICAjcmVnaW9uIFJlaW5pdGlhbGl6YXRpb24sIFRleHRXcml0ZXIgYWNjZXNzLFRyZWUgQWNjZXNzCisgICAgICAgICBwdWJsaWMgdm9pZCBDb25zdHJ1Y3QoVGV4dFdyaXRlciBGb3V0KQorICAgICAgICAgeworICAgICAgICAgICAgIHNyY0xlbl8gPSBwb3NfID0gMDsKKyAgICAgICAgICAgICBiTXV0ZV8gPSBmYWxzZTsKKyAgICAgICAgICAgICBTZXRFcnJvckRlc3RpbmF0aW9uKEZvdXQpOworICAgICAgICAgICAgIFJlc2V0VHJlZSgpOworICAgICAgICAgfQorICAgICAgICAgcHVibGljIHZvaWQgUmV3aW5kKCkgeyBwb3NfID0gMDsgfQorICAgICAgICAgcHVibGljIHZvaWQgU2V0RXJyb3JEZXN0aW5hdGlvbihUZXh0V3JpdGVyIGVyck91dCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBlcnJPdXRfID0gZXJyT3V0ID09IG51bGwgPyBuZXcgU3RyZWFtV3JpdGVyKFN5c3RlbS5Db25zb2xlLk9wZW5TdGFuZGFyZEVycm9yKCkpCisgICAgICAgICAgICAgICAgIDogZXJyT3V0OworICAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uIFJlaW5pdGlhbGl6YXRpb24sIFRleHRXcml0ZXIgYWNjZXNzLFRyZWUgQWNjZXNzCisgICAgICAgICAjcmVnaW9uIFRyZWUgcm9vdCBhY2Nlc3MsIFRyZWUgTm9kZSBnZW5lcmF0aW9uL2Rpc3BsYXkKKyAgICAgICAgIHB1YmxpYyBQZWdOb2RlIEdldFJvb3QoKSB7IHJldHVybiB0cmVlLnJvb3RfOyB9CisgICAgICAgICBwdWJsaWMgdm9pZCBSZXNldFRyZWUoKQorICAgICAgICAgeworICAgICAgICAgICAgIHRyZWUucm9vdF8gPSBudWxsOworICAgICAgICAgICAgIHRyZWUuY3VyXyA9IG51bGw7CisgICAgICAgICAgICAgdHJlZS5hZGRQb2xpY3kgPSBQZWdUcmVlLkFkZFBvbGljeS5lQWRkQXNDaGlsZDsKKyAgICAgICAgIH0KKyAgICAgICAgIHZvaWQgQWRkVHJlZU5vZGUoaW50IG5JZCwgUGVnVHJlZS5BZGRQb2xpY3kgbmV3QWRkUG9saWN5LCBDcmVhdG9yIGNyZWF0ZU5vZGUsIEVDcmVhdG9yUGhhc2UgZVBoYXNlKQorICAgICAgICAgeworICAgICAgICAgICAgIGlmIChiTXV0ZV8pIHJldHVybjsKKyAgICAgICAgICAgICBpZiAodHJlZS5yb290XyA9PSBudWxsKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgdHJlZS5yb290XyA9IHRyZWUuY3VyXyA9IGNyZWF0ZU5vZGUoZVBoYXNlLCB0cmVlLmN1cl8sIG5JZCk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGVsc2UgaWYgKHRyZWUuYWRkUG9saWN5ID09IFBlZ1RyZWUuQWRkUG9saWN5LmVBZGRBc0NoaWxkKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgdHJlZS5jdXJfID0gdHJlZS5jdXJfLmNoaWxkXyA9IGNyZWF0ZU5vZGUoZVBoYXNlLCB0cmVlLmN1cl8sIG5JZCk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHRyZWUuY3VyXyA9IHRyZWUuY3VyXy5uZXh0XyA9IGNyZWF0ZU5vZGUoZVBoYXNlLCB0cmVlLmN1cl8ucGFyZW50XywgbklkKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgdHJlZS5hZGRQb2xpY3kgPSBuZXdBZGRQb2xpY3k7CisgICAgICAgICB9CisgICAgICAgICB2b2lkIFJlc3RvcmVUcmVlKFBlZ05vZGUgcHJldkN1ciwgUGVnVHJlZS5BZGRQb2xpY3kgcHJldlBvbGljeSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAoYk11dGVfKSByZXR1cm47CisgICAgICAgICAgICAgaWYgKHByZXZDdXIgPT0gbnVsbCkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHRyZWUucm9vdF8gPSBudWxsOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIGlmIChwcmV2UG9saWN5ID09IFBlZ1RyZWUuQWRkUG9saWN5LmVBZGRBc0NoaWxkKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgcHJldkN1ci5jaGlsZF8gPSBudWxsOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBwcmV2Q3VyLm5leHRfID0gbnVsbDsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgdHJlZS5jdXJfID0gcHJldkN1cjsKKyAgICAgICAgICAgICB0cmVlLmFkZFBvbGljeSA9IHByZXZQb2xpY3k7CisgICAgICAgICB9CisgICAgICAgICBwdWJsaWMgYm9vbCBUcmVlQ2hhcnMoTWF0Y2hlciB0b01hdGNoKQorICAgICAgICAgeworICAgICAgICAgICAgIHJldHVybiBUcmVlQ2hhcnNXaXRoSWQoKGludClFU3BlY2lhbE5vZGVzLmVBbm9ueW1vdXNOb2RlLCB0b01hdGNoKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHB1YmxpYyBib29sIFRyZWVDaGFycyhDcmVhdG9yIG5vZGVDcmVhdG9yLCBNYXRjaGVyIHRvTWF0Y2gpCisgICAgICAgICB7CisgICAgICAgICAgICAgcmV0dXJuIFRyZWVDaGFyc1dpdGhJZChub2RlQ3JlYXRvciwgKGludClFU3BlY2lhbE5vZGVzLmVBbm9ueW1vdXNOb2RlLCB0b01hdGNoKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHB1YmxpYyBib29sIFRyZWVDaGFyc1dpdGhJZChpbnQgbklkLCBNYXRjaGVyIHRvTWF0Y2gpCisgICAgICAgICB7CisgICAgICAgICAgICAgcmV0dXJuIFRyZWVDaGFyc1dpdGhJZChub2RlQ3JlYXRvcl8sIG5JZCwgdG9NYXRjaCk7CisgICAgICAgICB9CisgICAgICAgICBwdWJsaWMgYm9vbCBUcmVlQ2hhcnNXaXRoSWQoQ3JlYXRvciBub2RlQ3JlYXRvciwgaW50IG5JZCwgTWF0Y2hlciB0b01hdGNoKQorICAgICAgICAgeworICAgICAgICAgICAgIGludCBwb3MgPSBwb3NfOworICAgICAgICAgICAgIGlmICh0b01hdGNoKCkpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBpZiAoIWJNdXRlXykKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgQWRkVHJlZU5vZGUobklkLCBQZWdUcmVlLkFkZFBvbGljeS5lQWRkQXNTaWJsaW5nLCBub2RlQ3JlYXRvciwgRUNyZWF0b3JQaGFzZS5lQ3JlYXRlQW5kQ29tcGxldGUpOworICAgICAgICAgICAgICAgICAgICAgdHJlZS5jdXJfLm1hdGNoXy5wb3NCZWdfID0gcG9zOworICAgICAgICAgICAgICAgICAgICAgdHJlZS5jdXJfLm1hdGNoXy5wb3NFbmRfID0gcG9zXzsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgfQorICAgICAgICAgcHVibGljIGJvb2wgVHJlZU5UKGludCBuUnVsZUlkLCBNYXRjaGVyIHRvTWF0Y2gpCisgICAgICAgICB7CisgICAgICAgICAgICAgcmV0dXJuIFRyZWVOVChub2RlQ3JlYXRvcl8sIG5SdWxlSWQsIHRvTWF0Y2gpOworICAgICAgICAgfQorICAgICAgICAgcHVibGljIGJvb2wgVHJlZU5UKENyZWF0b3Igbm9kZUNyZWF0b3IsIGludCBuUnVsZUlkLCBNYXRjaGVyIHRvTWF0Y2gpCisgICAgICAgICB7CisgICAgICAgICAgICAgaWYgKGJNdXRlXykgcmV0dXJuIHRvTWF0Y2goKTsKKyAgICAgICAgICAgICBQZWdOb2RlIHByZXZDdXIgPSB0cmVlLmN1cl8sIHJ1bGVOb2RlOworICAgICAgICAgICAgIFBlZ1RyZWUuQWRkUG9saWN5IHByZXZQb2xpY3kgPSB0cmVlLmFkZFBvbGljeTsKKyAgICAgICAgICAgICBpbnQgcG9zQmVnID0gcG9zXzsKKyAgICAgICAgICAgICBBZGRUcmVlTm9kZShuUnVsZUlkLCBQZWdUcmVlLkFkZFBvbGljeS5lQWRkQXNDaGlsZCwgbm9kZUNyZWF0b3IsIEVDcmVhdG9yUGhhc2UuZUNyZWF0ZSk7CisgICAgICAgICAgICAgcnVsZU5vZGUgPSB0cmVlLmN1cl87CisgICAgICAgICAgICAgYm9vbCBiTWF0Y2hlcyA9IHRvTWF0Y2goKTsKKyAgICAgICAgICAgICBpZiAoIWJNYXRjaGVzKSBSZXN0b3JlVHJlZShwcmV2Q3VyLCBwcmV2UG9saWN5KTsKKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBydWxlTm9kZS5tYXRjaF8ucG9zQmVnXyA9IHBvc0JlZzsKKyAgICAgICAgICAgICAgICAgcnVsZU5vZGUubWF0Y2hfLnBvc0VuZF8gPSBwb3NfOworICAgICAgICAgICAgICAgICB0cmVlLmN1cl8gPSBydWxlTm9kZTsKKyAgICAgICAgICAgICAgICAgdHJlZS5hZGRQb2xpY3kgPSBQZWdUcmVlLkFkZFBvbGljeS5lQWRkQXNTaWJsaW5nOworICAgICAgICAgICAgICAgICBub2RlQ3JlYXRvcihFQ3JlYXRvclBoYXNlLmVDcmVhdGlvbkNvbXBsZXRlLCBydWxlTm9kZSwgblJ1bGVJZCk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIHJldHVybiBiTWF0Y2hlczsKKyAgICAgICAgIH0KKyAgICAgICAgIHB1YmxpYyBib29sIFRyZWVBU1QoaW50IG5SdWxlSWQsIE1hdGNoZXIgdG9NYXRjaCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICByZXR1cm4gVHJlZUFTVChub2RlQ3JlYXRvcl8sIG5SdWxlSWQsIHRvTWF0Y2gpOworICAgICAgICAgfQorICAgICAgICAgcHVibGljIGJvb2wgVHJlZUFTVChDcmVhdG9yIG5vZGVDcmVhdG9yLCBpbnQgblJ1bGVJZCwgTWF0Y2hlciB0b01hdGNoKQorICAgICAgICAgeworICAgICAgICAgICAgIGlmIChiTXV0ZV8pIHJldHVybiB0b01hdGNoKCk7CisgICAgICAgICAgICAgYm9vbCBiTWF0Y2hlcyA9IFRyZWVOVChub2RlQ3JlYXRvciwgblJ1bGVJZCwgdG9NYXRjaCk7CisgICAgICAgICAgICAgaWYgKGJNYXRjaGVzKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgaWYgKHRyZWUuY3VyXy5jaGlsZF8gIT0gbnVsbCAmJiB0cmVlLmN1cl8uY2hpbGRfLm5leHRfID09IG51bGwgJiYgdHJlZS5jdXJfLnBhcmVudF8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKHRyZWUuY3VyXy5wYXJlbnRfLmNoaWxkXyA9PSB0cmVlLmN1cl8pCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZS5jdXJfLnBhcmVudF8uY2hpbGRfID0gdHJlZS5jdXJfLmNoaWxkXzsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlLmN1cl8uY2hpbGRfLnBhcmVudF8gPSB0cmVlLmN1cl8ucGFyZW50XzsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlLmN1cl8gPSB0cmVlLmN1cl8uY2hpbGRfOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIFBlZ05vZGUgcHJldjsKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHByZXYgPSB0cmVlLmN1cl8ucGFyZW50Xy5jaGlsZF87IHByZXYgIT0gbnVsbCAmJiBwcmV2Lm5leHRfICE9IHRyZWUuY3VyXzsgcHJldiA9IHByZXYubmV4dF8pCisgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0XyA9IHRyZWUuY3VyXy5jaGlsZF87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWUuY3VyXy5jaGlsZF8ucGFyZW50XyA9IHRyZWUuY3VyXy5wYXJlbnRfOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlLmN1cl8gPSB0cmVlLmN1cl8uY2hpbGRfOworICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICByZXR1cm4gYk1hdGNoZXM7CisgICAgICAgICB9CisgICAgICAgICBwdWJsaWMgYm9vbCBUcmVlTlQoTWF0Y2hlciB0b01hdGNoKQorICAgICAgICAgeworICAgICAgICAgICAgIHJldHVybiBUcmVlTlQoKGludClFU3BlY2lhbE5vZGVzLmVBbm9ueW1OVE5vZGUsIHRvTWF0Y2gpOworICAgICAgICAgfQorICAgICAgICAgcHVibGljIGJvb2wgVHJlZU5UKENyZWF0b3Igbm9kZUNyZWF0b3IsIE1hdGNoZXIgdG9NYXRjaCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICByZXR1cm4gVHJlZU5UKG5vZGVDcmVhdG9yLCAoaW50KUVTcGVjaWFsTm9kZXMuZUFub255bU5UTm9kZSwgdG9NYXRjaCk7CisgICAgICAgICB9CisgICAgICAgICBwdWJsaWMgYm9vbCBUcmVlQVNUKE1hdGNoZXIgdG9NYXRjaCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICByZXR1cm4gVHJlZUFTVCgoaW50KUVTcGVjaWFsTm9kZXMuZUFub255bUFTVE5vZGUsIHRvTWF0Y2gpOworICAgICAgICAgfQorICAgICAgICAgcHVibGljIGJvb2wgVHJlZUFTVChDcmVhdG9yIG5vZGVDcmVhdG9yLCBNYXRjaGVyIHRvTWF0Y2gpCisgICAgICAgICB7CisgICAgICAgICAgICAgcmV0dXJuIFRyZWVBU1Qobm9kZUNyZWF0b3IsIChpbnQpRVNwZWNpYWxOb2Rlcy5lQW5vbnltQVNUTm9kZSwgdG9NYXRjaCk7CisgICAgICAgICB9CisgICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVHJlZU5vZGVUb1N0cmluZyhQZWdOb2RlIG5vZGUpCisgICAgICAgICB7CisgICAgICAgICAgICAgcmV0dXJuIEdldFJ1bGVOYW1lRnJvbUlkKG5vZGUuaWRfKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHB1YmxpYyB2b2lkIFNldE5vZGVDcmVhdG9yKENyZWF0b3Igbm9kZUNyZWF0b3IpCisgICAgICAgICB7CisgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KG5vZGVDcmVhdG9yICE9IG51bGwpOworICAgICAgICAgICAgIG5vZGVDcmVhdG9yXyA9IG5vZGVDcmVhdG9yOworICAgICAgICAgfQorICAgICAgICAgI2VuZHJlZ2lvbiBUcmVlIE5vZGUgZ2VuZXJhdGlvbgorICAgICAgICAgI3JlZ2lvbiBQRUcgIGUxIGUyIC4uIDsgJmUxIDsgIWUxIDsgIGU/IDsgZSogOyBlKyA7IGV7YSxifSA7IC4KKyAgICAgICAgIHB1YmxpYyBib29sIEFuZChNYXRjaGVyIHBlZ1NlcXVlbmNlKQorICAgICAgICAgeworICAgICAgICAgICAgIFBlZ05vZGUgcHJldkN1ciA9IHRyZWUuY3VyXzsKKyAgICAgICAgICAgICBQZWdUcmVlLkFkZFBvbGljeSBwcmV2UG9saWN5ID0gdHJlZS5hZGRQb2xpY3k7CisgICAgICAgICAgICAgaW50IHBvczAgPSBwb3NfOworICAgICAgICAgICAgIGJvb2wgYk1hdGNoZXMgPSBwZWdTZXF1ZW5jZSgpOworICAgICAgICAgICAgIGlmICghYk1hdGNoZXMpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBwb3NfID0gcG9zMDsKKyAgICAgICAgICAgICAgICAgUmVzdG9yZVRyZWUocHJldkN1ciwgcHJldlBvbGljeSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIHJldHVybiBiTWF0Y2hlczsKKyAgICAgICAgIH0KKyAgICAgICAgIHB1YmxpYyBib29sIFBlZWsoTWF0Y2hlciB0b01hdGNoKQorICAgICAgICAgeworICAgICAgICAgICAgIGludCBwb3MwID0gcG9zXzsKKyAgICAgICAgICAgICBib29sIHByZXZNdXRlID0gYk11dGVfOworICAgICAgICAgICAgIGJNdXRlXyA9IHRydWU7CisgICAgICAgICAgICAgYm9vbCBiTWF0Y2hlcyA9IHRvTWF0Y2goKTsKKyAgICAgICAgICAgICBiTXV0ZV8gPSBwcmV2TXV0ZTsKKyAgICAgICAgICAgICBwb3NfID0gcG9zMDsKKyAgICAgICAgICAgICByZXR1cm4gYk1hdGNoZXM7CisgICAgICAgICB9CisgICAgICAgICBwdWJsaWMgYm9vbCBOb3QoTWF0Y2hlciB0b01hdGNoKQorICAgICAgICAgeworICAgICAgICAgICAgIGludCBwb3MwID0gcG9zXzsKKyAgICAgICAgICAgICBib29sIHByZXZNdXRlID0gYk11dGVfOworICAgICAgICAgICAgIGJNdXRlXyA9IHRydWU7CisgICAgICAgICAgICAgYm9vbCBiTWF0Y2hlcyA9IHRvTWF0Y2goKTsKKyAgICAgICAgICAgICBiTXV0ZV8gPSBwcmV2TXV0ZTsKKyAgICAgICAgICAgICBwb3NfID0gcG9zMDsKKyAgICAgICAgICAgICByZXR1cm4gIWJNYXRjaGVzOworICAgICAgICAgfQorICAgICAgICAgcHVibGljIGJvb2wgUGx1c1JlcGVhdChNYXRjaGVyIHRvUmVwZWF0KQorICAgICAgICAgeworICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgIGZvciAoaSA9IDA7IDsgKytpKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgaW50IHBvczAgPSBwb3NfOworICAgICAgICAgICAgICAgICBpZiAoIXRvUmVwZWF0KCkpCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBvc18gPSBwb3MwOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcmV0dXJuIGkgPiAwOworICAgICAgICAgfQorICAgICAgICAgcHVibGljIGJvb2wgT3B0UmVwZWF0KE1hdGNoZXIgdG9SZXBlYXQpCisgICAgICAgICB7CisgICAgICAgICAgICAgZm9yICg7IDsgKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgaW50IHBvczAgPSBwb3NfOworICAgICAgICAgICAgICAgICBpZiAoIXRvUmVwZWF0KCkpCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBvc18gPSBwb3MwOworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBwdWJsaWMgYm9vbCBPcHRpb24oTWF0Y2hlciB0b01hdGNoKQorICAgICAgICAgeworICAgICAgICAgICAgIGludCBwb3MwID0gcG9zXzsKKyAgICAgICAgICAgICBpZiAoIXRvTWF0Y2goKSkgcG9zXyA9IHBvczA7CisgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICB9CisgICAgICAgICBwdWJsaWMgYm9vbCBGb3JSZXBlYXQoaW50IGNvdW50LCBNYXRjaGVyIHRvUmVwZWF0KQorICAgICAgICAgeworICAgICAgICAgICAgIFBlZ05vZGUgcHJldkN1ciA9IHRyZWUuY3VyXzsKKyAgICAgICAgICAgICBQZWdUcmVlLkFkZFBvbGljeSBwcmV2UG9saWN5ID0gdHJlZS5hZGRQb2xpY3k7CisgICAgICAgICAgICAgaW50IHBvczAgPSBwb3NfOworICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgaWYgKCF0b1JlcGVhdCgpKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwb3NfID0gcG9zMDsKKyAgICAgICAgICAgICAgICAgICAgIFJlc3RvcmVUcmVlKHByZXZDdXIsIHByZXZQb2xpY3kpOworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgfQorICAgICAgICAgcHVibGljIGJvb2wgRm9yUmVwZWF0KGludCBsb3dlciwgaW50IHVwcGVyLCBNYXRjaGVyIHRvUmVwZWF0KQorICAgICAgICAgeworICAgICAgICAgICAgIFBlZ05vZGUgcHJldkN1ciA9IHRyZWUuY3VyXzsKKyAgICAgICAgICAgICBQZWdUcmVlLkFkZFBvbGljeSBwcmV2UG9saWN5ID0gdHJlZS5hZGRQb2xpY3k7CisgICAgICAgICAgICAgaW50IHBvczAgPSBwb3NfOworICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1cHBlcjsgKytpKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgaWYgKCF0b1JlcGVhdCgpKSBicmVhazsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgaWYgKGkgPCBsb3dlcikKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHBvc18gPSBwb3MwOworICAgICAgICAgICAgICAgICBSZXN0b3JlVHJlZShwcmV2Q3VyLCBwcmV2UG9saWN5KTsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgIH0KKyAgICAgICAgIHB1YmxpYyBib29sIEFueSgpCisgICAgICAgICB7CisgICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgfQorICAgICAgICAgI2VuZHJlZ2lvbiBQRUcgIGUxIGUyIC4uIDsgJmUxIDsgIWUxIDsgIGU/IDsgZSogOyBlKyA7IGV7YSxifSA7IC4KKyAgICB9CisgICAgcHVibGljIGNsYXNzIFBlZ0J5dGVQYXJzZXIgOiBQZWdCYXNlUGFyc2VyCisgICAgeworICAgICAgICAjcmVnaW9uIERhdGEgbWVtYmVycworICAgICAgICBwcm90ZWN0ZWQgYnl0ZVtdIHNyY187CisgICAgICAgIFBlZ0Vycm9yIGVycm9yczsKKyAgICAgICAgI2VuZHJlZ2lvbiBEYXRhIG1lbWJlcnMKKyAgICAgICAgCisgICAgICAgICNyZWdpb24gUEVHIG9wdGltaXphdGlvbnMKKyAgICAgICAgcHVibGljIHNlYWxlZCBjbGFzcyBCeXRlc2V0RGF0YSAgICAgCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJ1Y3QgUmFuZ2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgUmFuZ2UoYnl0ZSBsb3csIGJ5dGUgaGlnaCkgeyB0aGlzLmxvdyA9IGxvdzsgdGhpcy5oaWdoID0gaGlnaDsgfQorICAgICAgICAgICAgICAgIHB1YmxpYyBieXRlIGxvdzsKKyAgICAgICAgICAgICAgICBwdWJsaWMgYnl0ZSBoaWdoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtLkNvbGxlY3Rpb25zLkJpdEFycmF5IGNoYXJTZXRfOworICAgICAgICAgICAgYm9vbCBiTmVnYXRlZF87CisgICAgICAgICAgICBwdWJsaWMgQnl0ZXNldERhdGEoU3lzdGVtLkNvbGxlY3Rpb25zLkJpdEFycmF5IGIpCisgICAgICAgICAgICAgICAgOiB0aGlzKGIsIGZhbHNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIEJ5dGVzZXREYXRhKFN5c3RlbS5Db2xsZWN0aW9ucy5CaXRBcnJheSBiLCBib29sIGJOZWdhdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXJTZXRfID0gbmV3IFN5c3RlbS5Db2xsZWN0aW9ucy5CaXRBcnJheShiKTsKKyAgICAgICAgICAgICAgICBiTmVnYXRlZF8gPSBiTmVnYXRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBCeXRlc2V0RGF0YShSYW5nZVtdIHIsIGJ5dGVbXSBjKQorICAgICAgICAgICAgICAgIDogdGhpcyhyLCBjLCBmYWxzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBCeXRlc2V0RGF0YShSYW5nZVtdIHIsIGJ5dGVbXSBjLCBib29sIGJOZWdhdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBtYXggPSAwOworICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwpIGZvcmVhY2ggKFJhbmdlIHZhbCBpbiByKSBpZiAodmFsLmhpZ2ggPiBtYXgpIG1heCA9IHZhbC5oaWdoOworICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGZvcmVhY2ggKGludCB2YWwgaW4gYykgaWYgKHZhbCA+IG1heCkgbWF4ID0gdmFsOworICAgICAgICAgICAgICAgIGNoYXJTZXRfID0gbmV3IFN5c3RlbS5Db2xsZWN0aW9ucy5CaXRBcnJheShtYXggKyAxLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFJhbmdlIHZhbCBpbiByKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gdmFsLmxvdzsgaSA8PSB2YWwuaGlnaDsgKytpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJTZXRfW2ldID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBmb3JlYWNoIChpbnQgdmFsIGluIGMpIGNoYXJTZXRfW3ZhbF0gPSB0cnVlOworICAgICAgICAgICAgICAgIGJOZWdhdGVkXyA9IGJOZWdhdGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIGJvb2wgTWF0Y2hlcyhieXRlIGMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbCBiTWF0Y2hlcyA9IGMgPCBjaGFyU2V0Xy5MZW5ndGggJiYgY2hhclNldF9bKGludCljXTsKKyAgICAgICAgICAgICAgICBpZiAoYk5lZ2F0ZWRfKSByZXR1cm4gIWJNYXRjaGVzOworICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIGJNYXRjaGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qICAgICBwdWJsaWMgY2xhc3MgQnl0ZXNldERhdGEKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHB1YmxpYyBzdHJ1Y3QgUmFuZ2UKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcHVibGljIFJhbmdlKGJ5dGUgbG93LCBieXRlIGhpZ2gpIHsgdGhpcy5sb3cgPSBsb3c7IHRoaXMuaGlnaCA9IGhpZ2g7IH0KKyAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBieXRlIGxvdzsKKyAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBieXRlIGhpZ2g7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFN5c3RlbS5Db2xsZWN0aW9ucy5CaXRBcnJheSBjaGFyU2V0XzsKKyAgICAgICAgICAgICAgICAgYm9vbCBiTmVnYXRlZF87CisgICAgICAgICAgICAgICAgIHB1YmxpYyBCeXRlc2V0RGF0YShTeXN0ZW0uQ29sbGVjdGlvbnMuQml0QXJyYXkgYiwgYm9vbCBiTmVnYXRlZCkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgY2hhclNldF8gPSBuZXcgU3lzdGVtLkNvbGxlY3Rpb25zLkJpdEFycmF5KGIpOworICAgICAgICAgICAgICAgICAgICAgYk5lZ2F0ZWRfID0gYk5lZ2F0ZWQ7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgcHVibGljIEJ5dGVzZXREYXRhKGJ5dGVbXSBjLCBib29sIGJOZWdhdGVkKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCB2YWwgaW4gYykgaWYgKHZhbCA+IG1heCkgbWF4ID0gdmFsOworICAgICAgICAgICAgICAgICAgICAgY2hhclNldF8gPSBuZXcgU3lzdGVtLkNvbGxlY3Rpb25zLkJpdEFycmF5KG1heCArIDEsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCB2YWwgaW4gYykgY2hhclNldF9bdmFsXSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICBiTmVnYXRlZF8gPSBiTmVnYXRlZDsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBwdWJsaWMgQnl0ZXNldERhdGEoUmFuZ2VbXSByLCBieXRlW10gYywgYm9vbCBiTmVnYXRlZCkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaW50IG1heCA9IDA7CisgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChSYW5nZSB2YWwgaW4gcikgaWYgKHZhbC5oaWdoID4gbWF4KSBtYXggPSB2YWwuaGlnaDsKKyAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCB2YWwgaW4gYykgaWYgKHZhbCA+IG1heCkgbWF4ID0gdmFsOworICAgICAgICAgICAgICAgICAgICAgY2hhclNldF8gPSBuZXcgU3lzdGVtLkNvbGxlY3Rpb25zLkJpdEFycmF5KG1heCArIDEsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFJhbmdlIHZhbCBpbiByKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSB2YWwubG93OyBpIDw9IHZhbC5oaWdoOyArK2kpCisgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyU2V0X1tpXSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IHZhbCBpbiBjKSBjaGFyU2V0X1t2YWxdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgcHVibGljIGJvb2wgTWF0Y2hlcyhieXRlIGMpCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk1hdGNoZXMgPSBjIDwgY2hhclNldF8uTGVuZ3RoICYmIGNoYXJTZXRfWyhpbnQpY107CisgICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZ2F0ZWRfKSByZXR1cm4gIWJNYXRjaGVzOworICAgICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gYk1hdGNoZXM7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9Ki8KKyAgICAgICAgI2VuZHJlZ2lvbiBQRUcgb3B0aW1pemF0aW9ucworICAgICAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgICAgICBwdWJsaWMgUGVnQnl0ZVBhcnNlcigpCisgICAgICAgICAgICA6IHRoaXMobnVsbCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBQZWdCeXRlUGFyc2VyKGJ5dGVbXSBzcmMpOmJhc2UobnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0U291cmNlKHNyYyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFBlZ0J5dGVQYXJzZXIoYnl0ZVtdIHNyYywgVGV4dFdyaXRlciBlcnJPdXQpOmJhc2UoZXJyT3V0KQorICAgICAgICB7CisgICAgICAgICAgICBTZXRTb3VyY2Uoc3JjKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworICAgICAgICAjcmVnaW9uIFJlaW5pdGlhbGl6YXRpb24sIFNvdXJjZSBDb2RlIGFjY2VzcywgVGV4dFdyaXRlciBhY2Nlc3MsVHJlZSBBY2Nlc3MKKyAgICAgICAgcHVibGljIHZvaWQgQ29uc3RydWN0KGJ5dGVbXSBzcmMsIFRleHRXcml0ZXIgRm91dCkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZS5Db25zdHJ1Y3QoRm91dCk7CisgICAgICAgICAgICBTZXRTb3VyY2Uoc3JjKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBTZXRTb3VyY2UoYnl0ZVtdIHNyYykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxsKSBzcmMgPSBuZXcgYnl0ZVswXTsKKyAgICAgICAgICAgIHNyY18gPSBzcmM7IHNyY0xlbl8gPSBzcmMuTGVuZ3RoOworICAgICAgICAgICAgZXJyb3JzLmxpbmVTdGFydHMgPSBuZXcgU29ydGVkTGlzdDxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIGVycm9ycy5saW5lU3RhcnRzWzBdID0gMTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYnl0ZVtdIEdldFNvdXJjZSgpIHsgcmV0dXJuIHNyY187IH0KKyAgICAgICAgCisgICAgICAgICNlbmRyZWdpb24gUmVpbml0aWFsaXphdGlvbiwgU291cmNlIENvZGUgYWNjZXNzLCBUZXh0V3JpdGVyIGFjY2VzcyxUcmVlIEFjY2VzcworICAgICAgICAjcmVnaW9uIFNldHRpbmcgaG9zdCB2YXJpYWJsZXMKKyAgICAgICAgcHVibGljIGJvb2wgSW50byhNYXRjaGVyIHRvTWF0Y2gsb3V0IGJ5dGVbXSBpbnRvKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9zID0gcG9zXzsKKyAgICAgICAgICAgIGlmICh0b01hdGNoKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG5MZW4gPSBwb3NfIC0gcG9zOworICAgICAgICAgICAgICAgIGludG89IG5ldyBieXRlW25MZW5dOworICAgICAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8bkxlbjsrK2kpeworICAgICAgICAgICAgICAgICAgICBpbnRvW2ldID0gc3JjX1tpK3Bvc107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludG8gPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBJbnRvKE1hdGNoZXIgdG9NYXRjaCxvdXQgUGVnQmVnRW5kIGJlZ0VuZCkKKyAgICAgICAgeworICAgICAgICAgICAgYmVnRW5kLnBvc0JlZ18gPSBwb3NfOworICAgICAgICAgICAgYm9vbCBiTWF0Y2hlcyA9IHRvTWF0Y2goKTsKKyAgICAgICAgICAgIGJlZ0VuZC5wb3NFbmRfID0gcG9zXzsKKyAgICAgICAgICAgIHJldHVybiBiTWF0Y2hlczsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBJbnRvKE1hdGNoZXIgdG9NYXRjaCxvdXQgaW50IGludG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBzOworICAgICAgICAgICAgaW50byA9IDA7CisgICAgICAgICAgICBpZiAoIUludG8odG9NYXRjaCxvdXQgcykpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGludG8gPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLkxlbmd0aDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludG8gPDw9IDg7CisgICAgICAgICAgICAgICAgaW50byB8PSBzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgSW50byhNYXRjaGVyIHRvTWF0Y2gsb3V0IGRvdWJsZSBpbnRvKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gczsKKyAgICAgICAgICAgIGludG8gPSAwLjA7CisgICAgICAgICAgICBpZiAoIUludG8odG9NYXRjaCxvdXQgcykpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIFN5c3RlbS5UZXh0LkVuY29kaW5nIGVuY29kaW5nID0gU3lzdGVtLlRleHQuRW5jb2RpbmcuVVRGODsKKyAgICAgICAgICAgIHN0cmluZyBzQXNTdHJpbmcgPSBlbmNvZGluZy5HZXRTdHJpbmcocyk7CisgICAgICAgICAgICBpZiAoIVN5c3RlbS5Eb3VibGUuVHJ5UGFyc2Uoc0FzU3RyaW5nLCBvdXQgaW50bykpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIEJpdHNJbnRvKGludCBsb3dCaXRObywgaW50IGhpZ2hCaXRObyxvdXQgaW50IGludG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfIDwgc3JjTGVuXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnRvID0gKHNyY19bcG9zX10gPj4gKGxvd0JpdE5vIC0gMSkpICYgKCgxIDw8IGhpZ2hCaXRObykgLSAxKTsKKyAgICAgICAgICAgICAgICArK3Bvc187CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRvID0gMDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBCaXRzSW50byhpbnQgbG93Qml0Tm8sIGludCBoaWdoQml0Tm8sIEJ5dGVzZXREYXRhIHRvTWF0Y2gsIG91dCBpbnQgaW50bykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgdmFsdWUgPSAoYnl0ZSkoKHNyY19bcG9zX10gPj4gKGxvd0JpdE5vIC0gMSkpICYgKCgxIDw8IGhpZ2hCaXRObykgLSAxKSk7CisgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgIGludG8gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9NYXRjaC5NYXRjaGVzKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludG8gPSAwOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24gU2V0dGluZyBob3N0IHZhcmlhYmxlcworICAgICAgICAjcmVnaW9uIEVycm9yIGhhbmRsaW5nCisgICAgICAgIHZvaWQgTG9nT3V0TXNnKHN0cmluZyBzRXJyS2luZCwgc3RyaW5nIHNNc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyck91dF8uV3JpdGVMaW5lKCI8ezB9PnsxfTp7Mn0iLCBwb3NfLCBzRXJyS2luZCwgc01zZyk7CisgICAgICAgICAgICBlcnJPdXRfLkZsdXNoKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBGYXRhbChzdHJpbmcgc01zZykKKyAgICAgICAgeworCisgICAgICAgICAgICBMb2dPdXRNc2coIkZBVEFMIiwgc01zZyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGVnRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgV2FybmluZyhzdHJpbmcgc01zZykKKyAgICAgICAgeworICAgICAgICAgICAgTG9nT3V0TXNnKCJXQVJOSU5HIiwgc01zZyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uIEVycm9yIGhhbmRsaW5nCisgICAgICAgI3JlZ2lvbiBQRUcgQml0IGxldmVsIGVxdWl2YWxlbnRzIGZvciBQRUcgZTEgOyAmZTEgOyAhZTE7IGUxOmludG8gOyAKKyAgICAgICAgcHVibGljIGJvb2wgQml0cyhpbnQgbG93Qml0Tm8sIGludCBoaWdoQml0Tm8sIGJ5dGUgdG9NYXRjaCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fICYmICgoc3JjX1twb3NfXSA+PiAobG93Qml0Tm8gLSAxKSkgJiAoKDEgPDwgaGlnaEJpdE5vKSAtIDEpKSA9PSB0b01hdGNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrcG9zXzsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBCaXRzKGludCBsb3dCaXRObywgaW50IGhpZ2hCaXRObyxCeXRlc2V0RGF0YSB0b01hdGNoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcG9zXyA8IHNyY0xlbl8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgdmFsdWU9IChieXRlKSgoc3JjX1twb3NfXSA+PiAobG93Qml0Tm8gLSAxKSkgJiAoKDEgPDwgaGlnaEJpdE5vKSAtIDEpKTsKKyAgICAgICAgICAgICAgICArK3Bvc187CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvTWF0Y2guTWF0Y2hlcyh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgUGVla0JpdHMoaW50IGxvd0JpdE5vLCBpbnQgaGlnaEJpdE5vLCBieXRlIHRvTWF0Y2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NfIDwgc3JjTGVuXyAmJiAoKHNyY19bcG9zX10gPj4gKGxvd0JpdE5vIC0gMSkpICYgKCgxIDw8IGhpZ2hCaXRObykgLSAxKSkgPT0gdG9NYXRjaDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBOb3RCaXRzKGludCBsb3dCaXRObywgaW50IGhpZ2hCaXRObywgYnl0ZSB0b01hdGNoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIShwb3NfIDwgc3JjTGVuXyAmJiAoKHNyY19bcG9zX10gPj4gKGxvd0JpdE5vIC0gMSkpICYgKCgxIDw8IGhpZ2hCaXRObykgLSAxKSkgPT0gdG9NYXRjaCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgSW50b0JpdHMoaW50IGxvd0JpdE5vLGludCBoaWdoQml0Tm8sb3V0IGludCB2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCaXRzSW50byhsb3dCaXRObyxoaWdoQml0Tm8sb3V0IHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgSW50b0JpdHMoaW50IGxvd0JpdE5vLCBpbnQgaGlnaEJpdE5vLCBCeXRlc2V0RGF0YSB0b01hdGNoLCBvdXQgaW50IHZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJpdHNJbnRvKGxvd0JpdE5vLCBoaWdoQml0Tm8sIG91dCB2YWwpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIEJpdChpbnQgYml0Tm8sYnl0ZSB0b01hdGNoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyA8IHNyY0xlbl8gJiYgKChzcmNfW3Bvc19dPj4oYml0Tm8tMSkpJjEpPT10b01hdGNoKXsKKyAgICAgICAgICAgICAgICArK3Bvc187CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgUGVla0JpdChpbnQgYml0Tm8sIGJ5dGUgdG9NYXRjaCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBvc18gPCBzcmNMZW5fICYmICgoc3JjX1twb3NfXSA+PiAoYml0Tm8gLSAxKSkgJiAxKSA9PSB0b01hdGNoOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIE5vdEJpdChpbnQgYml0Tm8sIGJ5dGUgdG9NYXRjaCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEocG9zXyA8IHNyY0xlbl8gJiYgKChzcmNfW3Bvc19dID4+IChiaXRObyAtIDEpKSAmIDEpID09IHRvTWF0Y2gpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24gUEVHIEJpdCBsZXZlbCBlcXVpdmFsZW50cyBmb3IgUEVHIGUxIDsgJmUxIDsgIWUxOyBlMTppbnRvIDsKKyAgICAgICAgI3JlZ2lvbiBQRUcgJzxMaXRlcmFsPicgLyAnPExpdGVyYWw+Jy9pIC8gW2xvdzEtaGlnaDEsbG93Mi1oaWdoMi4uXSAvIFs8Q2hhckxpc3Q+XQorICAgICAgICBwdWJsaWMgYm9vbCBDaGFyKGJ5dGUgYzEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfIDwgc3JjTGVuXyAmJiBzcmNfW3Bvc19dID09IGMxKQorICAgICAgICAgICAgeyArK3Bvc187IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgQ2hhcihieXRlIGMxLCBieXRlIGMyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDEgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfXSA9PSBjMQorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDFdID09IGMyKQorICAgICAgICAgICAgeyBwb3NfICs9IDI7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgQ2hhcihieXRlIGMxLCBieXRlIGMyLCBieXRlIGMzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDIgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfXSA9PSBjMQorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDFdID09IGMyCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgMl0gPT0gYzMpCisgICAgICAgICAgICB7IHBvc18gKz0gMzsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBDaGFyKGJ5dGUgYzEsIGJ5dGUgYzIsIGJ5dGUgYzMsIGJ5dGUgYzQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfICsgMyA8IHNyY0xlbl8KKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc19dID09IGMxCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgMV0gPT0gYzIKKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc18gKyAyXSA9PSBjMworICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDNdID09IGM0KQorICAgICAgICAgICAgeyBwb3NfICs9IDQ7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgQ2hhcihieXRlIGMxLCBieXRlIGMyLCBieXRlIGMzLCBieXRlIGM0LCBieXRlIGM1KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDQgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfXSA9PSBjMQorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDFdID09IGMyCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgMl0gPT0gYzMKKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc18gKyAzXSA9PSBjNAorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDRdID09IGM1KQorICAgICAgICAgICAgeyBwb3NfICs9IDU7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgQ2hhcihieXRlIGMxLCBieXRlIGMyLCBieXRlIGMzLCBieXRlIGM0LCBieXRlIGM1LCBieXRlIGM2KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDUgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfXSA9PSBjMQorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDFdID09IGMyCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgMl0gPT0gYzMKKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc18gKyAzXSA9PSBjNAorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDRdID09IGM1CisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgNV0gPT0gYzYpCisgICAgICAgICAgICB7IHBvc18gKz0gNjsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBDaGFyKGJ5dGUgYzEsIGJ5dGUgYzIsIGJ5dGUgYzMsIGJ5dGUgYzQsIGJ5dGUgYzUsIGJ5dGUgYzYsIGJ5dGUgYzcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfICsgNiA8IHNyY0xlbl8KKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc19dID09IGMxCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgMV0gPT0gYzIKKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc18gKyAyXSA9PSBjMworICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDNdID09IGM0CisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgNF0gPT0gYzUKKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc18gKyA1XSA9PSBjNgorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDZdID09IGM3KQorICAgICAgICAgICAgeyBwb3NfICs9IDc7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgQ2hhcihieXRlIGMxLCBieXRlIGMyLCBieXRlIGMzLCBieXRlIGM0LCBieXRlIGM1LCBieXRlIGM2LCBieXRlIGM3LCBieXRlIGM4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDcgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfXSA9PSBjMQorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDFdID09IGMyCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgMl0gPT0gYzMKKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc18gKyAzXSA9PSBjNAorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDRdID09IGM1CisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgNV0gPT0gYzYKKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc18gKyA2XSA9PSBjNworICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDddID09IGM4KQorICAgICAgICAgICAgeyBwb3NfICs9IDg7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgQ2hhcihieXRlW10gcykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNMZW5ndGggPSBzLkxlbmd0aDsKKyAgICAgICAgICAgIGlmIChwb3NfICsgc0xlbmd0aCA+IHNyY0xlbl8pIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc0xlbmd0aDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzW2ldICE9IHNyY19bcG9zXyArIGldKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3NfICs9IHNMZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGUgVG9VcHBlcihieXRlIGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjID49IDk3ICYmIGMgPD0gMTIyKSByZXR1cm4gKGJ5dGUpKGMgLSAzMik7IGVsc2UgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgSUNoYXIoYnl0ZSBjMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fICYmIFRvVXBwZXIoc3JjX1twb3NfXSkgPT0gYzEpCisgICAgICAgICAgICB7ICsrcG9zXzsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBJQ2hhcihieXRlIGMxLCBieXRlIGMyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDEgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgVG9VcHBlcihzcmNfW3Bvc19dKSA9PSBUb1VwcGVyKGMxKQorICAgICAgICAgICAgICAgICYmIFRvVXBwZXIoc3JjX1twb3NfICsgMV0pID09IFRvVXBwZXIoYzIpKQorICAgICAgICAgICAgeyBwb3NfICs9IDI7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgSUNoYXIoYnl0ZSBjMSwgYnl0ZSBjMiwgYnl0ZSBjMykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gKyAyIDwgc3JjTGVuXworICAgICAgICAgICAgICAgICYmIFRvVXBwZXIoc3JjX1twb3NfXSkgPT0gVG9VcHBlcihjMSkKKyAgICAgICAgICAgICAgICAmJiBUb1VwcGVyKHNyY19bcG9zXyArIDFdKSA9PSBUb1VwcGVyKGMyKQorICAgICAgICAgICAgICAgICYmIFRvVXBwZXIoc3JjX1twb3NfICsgMl0pID09IFRvVXBwZXIoYzMpKQorICAgICAgICAgICAgeyBwb3NfICs9IDM7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgSUNoYXIoYnl0ZSBjMSwgYnl0ZSBjMiwgYnl0ZSBjMywgYnl0ZSBjNCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gKyAzIDwgc3JjTGVuXworICAgICAgICAgICAgICAgICYmIFRvVXBwZXIoc3JjX1twb3NfXSkgPT0gVG9VcHBlcihjMSkKKyAgICAgICAgICAgICAgICAmJiBUb1VwcGVyKHNyY19bcG9zXyArIDFdKSA9PSBUb1VwcGVyKGMyKQorICAgICAgICAgICAgICAgICYmIFRvVXBwZXIoc3JjX1twb3NfICsgMl0pID09IFRvVXBwZXIoYzMpCisgICAgICAgICAgICAgICAgJiYgVG9VcHBlcihzcmNfW3Bvc18gKyAzXSkgPT0gVG9VcHBlcihjNCkpCisgICAgICAgICAgICB7IHBvc18gKz0gNDsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBJQ2hhcihieXRlIGMxLCBieXRlIGMyLCBieXRlIGMzLCBieXRlIGM0LCBieXRlIGM1KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDQgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgVG9VcHBlcihzcmNfW3Bvc19dKSA9PSBUb1VwcGVyKGMxKQorICAgICAgICAgICAgICAgICYmIFRvVXBwZXIoc3JjX1twb3NfICsgMV0pID09IFRvVXBwZXIoYzIpCisgICAgICAgICAgICAgICAgJiYgVG9VcHBlcihzcmNfW3Bvc18gKyAyXSkgPT0gVG9VcHBlcihjMykKKyAgICAgICAgICAgICAgICAmJiBUb1VwcGVyKHNyY19bcG9zXyArIDNdKSA9PSBUb1VwcGVyKGM0KQorICAgICAgICAgICAgICAgICYmIFRvVXBwZXIoc3JjX1twb3NfICsgNF0pID09IFRvVXBwZXIoYzUpKQorICAgICAgICAgICAgeyBwb3NfICs9IDU7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgSUNoYXIoYnl0ZSBjMSwgYnl0ZSBjMiwgYnl0ZSBjMywgYnl0ZSBjNCwgYnl0ZSBjNSwgYnl0ZSBjNikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gKyA1IDwgc3JjTGVuXworICAgICAgICAgICAgICAgICYmIFRvVXBwZXIoc3JjX1twb3NfXSkgPT0gVG9VcHBlcihjMSkKKyAgICAgICAgICAgICAgICAmJiBUb1VwcGVyKHNyY19bcG9zXyArIDFdKSA9PSBUb1VwcGVyKGMyKQorICAgICAgICAgICAgICAgICYmIFRvVXBwZXIoc3JjX1twb3NfICsgMl0pID09IFRvVXBwZXIoYzMpCisgICAgICAgICAgICAgICAgJiYgVG9VcHBlcihzcmNfW3Bvc18gKyAzXSkgPT0gVG9VcHBlcihjNCkKKyAgICAgICAgICAgICAgICAmJiBUb1VwcGVyKHNyY19bcG9zXyArIDRdKSA9PSBUb1VwcGVyKGM1KQorICAgICAgICAgICAgICAgICYmIFRvVXBwZXIoc3JjX1twb3NfICsgNV0pID09IFRvVXBwZXIoYzYpKQorICAgICAgICAgICAgeyBwb3NfICs9IDY7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgSUNoYXIoYnl0ZSBjMSwgYnl0ZSBjMiwgYnl0ZSBjMywgYnl0ZSBjNCwgYnl0ZSBjNSwgYnl0ZSBjNiwgYnl0ZSBjNykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gKyA2IDwgc3JjTGVuXworICAgICAgICAgICAgICAgICYmIFRvVXBwZXIoc3JjX1twb3NfXSkgPT0gVG9VcHBlcihjMSkKKyAgICAgICAgICAgICAgICAmJiBUb1VwcGVyKHNyY19bcG9zXyArIDFdKSA9PSBUb1VwcGVyKGMyKQorICAgICAgICAgICAgICAgICYmIFRvVXBwZXIoc3JjX1twb3NfICsgMl0pID09IFRvVXBwZXIoYzMpCisgICAgICAgICAgICAgICAgJiYgVG9VcHBlcihzcmNfW3Bvc18gKyAzXSkgPT0gVG9VcHBlcihjNCkKKyAgICAgICAgICAgICAgICAmJiBUb1VwcGVyKHNyY19bcG9zXyArIDRdKSA9PSBUb1VwcGVyKGM1KQorICAgICAgICAgICAgICAgICYmIFRvVXBwZXIoc3JjX1twb3NfICsgNV0pID09IFRvVXBwZXIoYzYpCisgICAgICAgICAgICAgICAgJiYgVG9VcHBlcihzcmNfW3Bvc18gKyA2XSkgPT0gVG9VcHBlcihjNykpCisgICAgICAgICAgICB7IHBvc18gKz0gNzsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBJQ2hhcihieXRlW10gcykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNMZW5ndGggPSBzLkxlbmd0aDsKKyAgICAgICAgICAgIGlmIChwb3NfICsgc0xlbmd0aCA+IHNyY0xlbl8pIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc0xlbmd0aDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzW2ldICE9IFRvVXBwZXIoc3JjX1twb3NfICsgaV0pKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3NfICs9IHNMZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBJbihieXRlIGMwLCBieXRlIGMxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyA8IHNyY0xlbl8KKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc19dID49IGMwICYmIHNyY19bcG9zX10gPD0gYzEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIEluKGJ5dGUgYzAsIGJ5dGUgYzEsIGJ5dGUgYzIsIGJ5dGUgYzMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfIDwgc3JjTGVuXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlIGMgPSBzcmNfW3Bvc19dOworICAgICAgICAgICAgICAgIGlmIChjID49IGMwICYmIGMgPD0gYzEKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA+PSBjMiAmJiBjIDw9IGMzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgSW4oYnl0ZSBjMCwgYnl0ZSBjMSwgYnl0ZSBjMiwgYnl0ZSBjMywgYnl0ZSBjNCwgYnl0ZSBjNSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgYyA9IHNyY19bcG9zX107CisgICAgICAgICAgICAgICAgaWYgKGMgPj0gYzAgJiYgYyA8PSBjMQorICAgICAgICAgICAgICAgICAgICB8fCBjID49IGMyICYmIGMgPD0gYzMKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA+PSBjNCAmJiBjIDw9IGM1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgSW4oYnl0ZSBjMCwgYnl0ZSBjMSwgYnl0ZSBjMiwgYnl0ZSBjMywgYnl0ZSBjNCwgYnl0ZSBjNSwgYnl0ZSBjNiwgYnl0ZSBjNykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgYyA9IHNyY19bcG9zX107CisgICAgICAgICAgICAgICAgaWYgKGMgPj0gYzAgJiYgYyA8PSBjMQorICAgICAgICAgICAgICAgICAgICB8fCBjID49IGMyICYmIGMgPD0gYzMKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA+PSBjNCAmJiBjIDw9IGM1CisgICAgICAgICAgICAgICAgICAgIHx8IGMgPj0gYzYgJiYgYyA8PSBjNykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICsrcG9zXzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIEluKGJ5dGVbXSBzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyA8IHNyY0xlbl8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZSBjID0gc3JjX1twb3NfXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMuTGVuZ3RoIC0gMTsgaSArPSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gc1tpXSAmJiBjIDw9IHNbaSArIDFdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK3Bvc187CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBOb3RJbihieXRlW10gcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgYyA9IHNyY19bcG9zX107CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLkxlbmd0aCAtIDE7IGkgKz0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggYyA+PSBzW2ldICYmIGMgPD0gc1tpICsgMV0gKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrcG9zXzsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBPbmVPZihieXRlIGMwLCBieXRlIGMxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyA8IHNyY0xlbl8KKyAgICAgICAgICAgICAgICAmJiAoc3JjX1twb3NfXSA9PSBjMCB8fCBzcmNfW3Bvc19dID09IGMxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK3Bvc187CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgT25lT2YoYnl0ZSBjMCwgYnl0ZSBjMSwgYnl0ZSBjMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgYyA9IHNyY19bcG9zX107CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gYzAgfHwgYyA9PSBjMSB8fCBjID09IGMyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgT25lT2YoYnl0ZSBjMCwgYnl0ZSBjMSwgYnl0ZSBjMiwgYnl0ZSBjMykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgYyA9IHNyY19bcG9zX107CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gYzAgfHwgYyA9PSBjMSB8fCBjID09IGMyIHx8IGMgPT0gYzMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK3Bvc187CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBPbmVPZihieXRlIGMwLCBieXRlIGMxLCBieXRlIGMyLCBieXRlIGMzLCBieXRlIGM0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyA8IHNyY0xlbl8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZSBjID0gc3JjX1twb3NfXTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBjMCB8fCBjID09IGMxIHx8IGMgPT0gYzIgfHwgYyA9PSBjMyB8fCBjID09IGM0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgT25lT2YoYnl0ZSBjMCwgYnl0ZSBjMSwgYnl0ZSBjMiwgYnl0ZSBjMywgYnl0ZSBjNCwgYnl0ZSBjNSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgYyA9IHNyY19bcG9zX107CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gYzAgfHwgYyA9PSBjMSB8fCBjID09IGMyIHx8IGMgPT0gYzMgfHwgYyA9PSBjNCB8fCBjID09IGM1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgT25lT2YoYnl0ZSBjMCwgYnl0ZSBjMSwgYnl0ZSBjMiwgYnl0ZSBjMywgYnl0ZSBjNCwgYnl0ZSBjNSwgYnl0ZSBjNikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgYyA9IHNyY19bcG9zX107CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gYzAgfHwgYyA9PSBjMSB8fCBjID09IGMyIHx8IGMgPT0gYzMgfHwgYyA9PSBjNCB8fCBjID09IGM1IHx8IGMgPT0gYzYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK3Bvc187CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBPbmVPZihieXRlIGMwLCBieXRlIGMxLCBieXRlIGMyLCBieXRlIGMzLCBieXRlIGM0LCBieXRlIGM1LCBieXRlIGM2LCBieXRlIGM3KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyA8IHNyY0xlbl8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZSBjID0gc3JjX1twb3NfXTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBjMCB8fCBjID09IGMxIHx8IGMgPT0gYzIgfHwgYyA9PSBjMyB8fCBjID09IGM0IHx8IGMgPT0gYzUgfHwgYyA9PSBjNiB8fCBjID09IGM3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgT25lT2YoYnl0ZVtdIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfIDwgc3JjTGVuXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlIGMgPSBzcmNfW3Bvc19dOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5MZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09IHNbaV0pIHsgKytwb3NfOyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBOb3RPbmVPZihieXRlW10gcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgYyA9IHNyY19bcG9zX107CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLkxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gc1tpXSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgT25lT2YoQnl0ZXNldERhdGEgYnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocG9zXyA8IHNyY0xlbl8gJiYgYnNldC5NYXRjaGVzKHNyY19bcG9zX10pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrcG9zXzsgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbiBQRUcgJzxMaXRlcmFsPicgLyAnPExpdGVyYWw+Jy9pIC8gW2xvdzEtaGlnaDEsbG93Mi1oaWdoMi4uXSAvIFs8Q2hhckxpc3Q+XQorICAgIH0KKyAgICBwdWJsaWMgY2xhc3MgUGVnQ2hhclBhcnNlciA6IFBlZ0Jhc2VQYXJzZXIKKyAgICB7CisgICAgICAgICNyZWdpb24gRGF0YSBtZW1iZXJzCisgICAgICAgIHByb3RlY3RlZCBzdHJpbmcgc3JjXzsKKyAgICAgICAgUGVnRXJyb3IgZXJyb3JzOworICAgICAgICAjZW5kcmVnaW9uIERhdGEgbWVtYmVycworICAgICAgICAjcmVnaW9uIFBFRyBvcHRpbWl6YXRpb25zCisgICAgICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgT3B0aW1pemVkQ2hhcnNldAorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgc3RydWN0IFJhbmdlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHVibGljIFJhbmdlKGNoYXIgbG93LCBjaGFyIGhpZ2gpIHsgdGhpcy5sb3cgPSBsb3c7IHRoaXMuaGlnaCA9IGhpZ2g7IH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgY2hhciBsb3c7CisgICAgICAgICAgICAgICAgcHVibGljIGNoYXIgaGlnaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5Db2xsZWN0aW9ucy5CaXRBcnJheSBjaGFyU2V0XzsKKyAgICAgICAgICAgIGJvb2wgYk5lZ2F0ZWRfOworICAgICAgICAgICAgcHVibGljIE9wdGltaXplZENoYXJzZXQoU3lzdGVtLkNvbGxlY3Rpb25zLkJpdEFycmF5IGIpCisgICAgICAgICAgICAgICAgOiB0aGlzKGIsIGZhbHNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIE9wdGltaXplZENoYXJzZXQoU3lzdGVtLkNvbGxlY3Rpb25zLkJpdEFycmF5IGIsIGJvb2wgYk5lZ2F0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhclNldF8gPSBuZXcgU3lzdGVtLkNvbGxlY3Rpb25zLkJpdEFycmF5KGIpOworICAgICAgICAgICAgICAgIGJOZWdhdGVkXyA9IGJOZWdhdGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIE9wdGltaXplZENoYXJzZXQoUmFuZ2VbXSByLCBjaGFyW10gYykKKyAgICAgICAgICAgICAgICA6IHRoaXMociwgYywgZmFsc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgT3B0aW1pemVkQ2hhcnNldChSYW5nZVtdIHIsIGNoYXJbXSBjLCBib29sIGJOZWdhdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBtYXggPSAwOworICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwpIGZvcmVhY2ggKFJhbmdlIHZhbCBpbiByKSBpZiAodmFsLmhpZ2ggPiBtYXgpIG1heCA9IHZhbC5oaWdoOworICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGZvcmVhY2ggKGludCB2YWwgaW4gYykgaWYgKHZhbCA+IG1heCkgbWF4ID0gdmFsOworICAgICAgICAgICAgICAgIGNoYXJTZXRfID0gbmV3IFN5c3RlbS5Db2xsZWN0aW9ucy5CaXRBcnJheShtYXggKyAxLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFJhbmdlIHZhbCBpbiByKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gdmFsLmxvdzsgaSA8PSB2YWwuaGlnaDsgKytpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJTZXRfW2ldID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBmb3JlYWNoIChpbnQgdmFsIGluIGMpIGNoYXJTZXRfW3ZhbF0gPSB0cnVlOworICAgICAgICAgICAgICAgIGJOZWdhdGVkXyA9IGJOZWdhdGVkOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIE1hdGNoZXMoY2hhciBjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgYk1hdGNoZXMgPSBjIDwgY2hhclNldF8uTGVuZ3RoICYmIGNoYXJTZXRfWyhpbnQpY107CisgICAgICAgICAgICAgICAgaWYgKGJOZWdhdGVkXykgcmV0dXJuICFiTWF0Y2hlczsKKyAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBiTWF0Y2hlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIE9wdGltaXplZExpdGVyYWxzCisgICAgICAgIHsKKyAgICAgICAgICAgIGludGVybmFsIGNsYXNzIFRyaWUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnRlcm5hbCBUcmllKGNoYXIgY1RoaXMsaW50IG5JbmRleCwgc3RyaW5nW10gbGl0ZXJhbHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjVGhpc18gPSBjVGhpczsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjTWF4ID0gY2hhci5NaW5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgY01pbl8gPSBjaGFyLk1heFZhbHVlOworICAgICAgICAgICAgICAgICAgICBIYXNoU2V0PGNoYXI+IGZvbGxvd0NoYXJzID0gbmV3IEhhc2hTZXQ8Y2hhcj4oKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBsaXRlcmFsIGluIGxpdGVyYWxzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGl0ZXJhbD09bnVsbCB8fCAgbkluZGV4ID4gbGl0ZXJhbC5MZW5ndGggKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuSW5kZXggPT0gbGl0ZXJhbC5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxpdEVuZF8gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gbGl0ZXJhbFtuSW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93Q2hhcnMuQWRkKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjIDwgY01pbl8pIGNNaW5fID0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYyA+IGNNYXgpIGNNYXggPSBjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChmb2xsb3dDaGFycy5Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbl8gPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5fID0gbmV3IFRyaWVbKGNNYXggLSBjTWluXykgKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKGNoYXIgYyBpbiBmb2xsb3dDaGFycykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PHN0cmluZz4gc3ViTGl0ZXJhbHMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHMgaW4gbGl0ZXJhbHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG5JbmRleCA+PSBzLkxlbmd0aCApIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSBzW25JbmRleF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkxpdGVyYWxzLkFkZChzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbl9bYyAtIGNNaW5fXSA9IG5ldyBUcmllKGMsIG5JbmRleCArIDEsIHN1YkxpdGVyYWxzLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnRlcm5hbCBjaGFyIGNUaGlzXzsgICAgICAgICAgIC8vY2hhcmFjdGVyIHN0b3JlZCBpbiB0aGlzIG5vZGUKKyAgICAgICAgICAgICAgICBpbnRlcm5hbCBib29sIGJMaXRFbmRfOyAgICAgICAgIC8vZW5kIG9mIGxpdGVyYWwKKworICAgICAgICAgICAgICAgIGludGVybmFsIGNoYXIgY01pbl87ICAgICAgICAgICAgLy9maXJzdCB2YWxpZCBjaGFyYWN0ZXIgaW4gY2hpbGRyZW4KKyAgICAgICAgICAgICAgICBpbnRlcm5hbCBUcmllW10gY2hpbGRyZW5fOyAgICAgIC8vY29udGFpbnMgdGhlIHN1Y2Nlc3NvciBub2RlIG9mIGNUaGlzXzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIFRyaWUgbGl0ZXJhbHNSb290OworICAgICAgICAgICAgcHVibGljIE9wdGltaXplZExpdGVyYWxzKHN0cmluZ1tdIGxpdEFsdGVybmF0aXZlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXRlcmFsc1Jvb3QgPSBuZXcgVHJpZSgnXHUwMDAwJywgMCwgbGl0QWx0ZXJuYXRpdmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uICBQRUcgb3B0aW1pemF0aW9ucworICAgICAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgICAgICBwdWJsaWMgUGVnQ2hhclBhcnNlcigpOnRoaXMoIiIpCisgICAgICAgIHsKKyAgICAgICAgICAgCisKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgUGVnQ2hhclBhcnNlcihzdHJpbmcgc3JjKTpiYXNlKG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldFNvdXJjZShzcmMpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBQZWdDaGFyUGFyc2VyKHN0cmluZyBzcmMsIFRleHRXcml0ZXIgZXJyT3V0KTpiYXNlKGVyck91dCkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0U291cmNlKHNyYyk7CisgICAgICAgICAgICBub2RlQ3JlYXRvcl8gPSBEZWZhdWx0Tm9kZUNyZWF0b3I7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAgICAgI3JlZ2lvbiBPdmVycmlkZXMKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUcmVlTm9kZVRvU3RyaW5nKFBlZ05vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGxhYmVsID0gYmFzZS5UcmVlTm9kZVRvU3RyaW5nKG5vZGUpOworICAgICAgICAgICAgaWYgKG5vZGUuaWRfID09IChpbnQpRVNwZWNpYWxOb2Rlcy5lQW5vbnltb3VzTm9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdmFsdWUgPSBub2RlLkdldEFzU3RyaW5nKHNyY18pOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5MZW5ndGggPCAzMikgbGFiZWwgKz0gIiA8IiArIHZhbHVlICsgIj4iOworICAgICAgICAgICAgICAgIGVsc2UgbGFiZWwgKz0gIiA8IiArIHZhbHVlLlN1YnN0cmluZygwLCAyOSkgKyAiLi4uPiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGFiZWw7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbiBPdmVycmlkZXMKKyAgICAgICAgI3JlZ2lvbiBSZWluaXRpYWxpemF0aW9uLCBTb3VyY2UgQ29kZSBhY2Nlc3MsIFRleHRXcml0ZXIgYWNjZXNzLFRyZWUgQWNjZXNzCisgICAgICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdChzdHJpbmcgc3JjLCBUZXh0V3JpdGVyIEZvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuQ29uc3RydWN0KEZvdXQpOworICAgICAgICAgICAgU2V0U291cmNlKHNyYyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0U291cmNlKHN0cmluZyBzcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgc3JjID0gIiI7CisgICAgICAgICAgICBzcmNfID0gc3JjOyBzcmNMZW5fID0gc3JjLkxlbmd0aDsgcG9zXyA9IDA7CisgICAgICAgICAgICBlcnJvcnMubGluZVN0YXJ0cyA9IG5ldyBTb3J0ZWRMaXN0PGludCwgaW50PigpOworICAgICAgICAgICAgZXJyb3JzLmxpbmVTdGFydHNbMF0gPSAxOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzdHJpbmcgR2V0U291cmNlKCkgeyByZXR1cm4gc3JjXzsgfQorICAgICAgICAjZW5kcmVnaW9uIFJlaW5pdGlhbGl6YXRpb24sIFNvdXJjZSBDb2RlIGFjY2VzcywgVGV4dFdyaXRlciBhY2Nlc3MsVHJlZSBBY2Nlc3MKKyAgICAgICAgI3JlZ2lvbiBTZXR0aW5nIGhvc3QgdmFyaWFibGVzCisgICAgICAgIHB1YmxpYyBib29sIEludG8oTWF0Y2hlciB0b01hdGNoLG91dCBzdHJpbmcgaW50bykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBvcyA9IHBvc187CisgICAgICAgICAgICBpZiAodG9NYXRjaCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludG8gPSBzcmNfLlN1YnN0cmluZyhwb3MsIHBvc18gLSBwb3MpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludG8gPSAiIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgSW50byhNYXRjaGVyIHRvTWF0Y2gsb3V0IFBlZ0JlZ0VuZCBiZWdFbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJlZ0VuZC5wb3NCZWdfID0gcG9zXzsKKyAgICAgICAgICAgIGJvb2wgYk1hdGNoZXMgPSB0b01hdGNoKCk7CisgICAgICAgICAgICBiZWdFbmQucG9zRW5kXyA9IHBvc187CisgICAgICAgICAgICByZXR1cm4gYk1hdGNoZXM7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgSW50byhNYXRjaGVyIHRvTWF0Y2gsb3V0IGludCBpbnRvKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgczsKKyAgICAgICAgICAgIGludG8gPSAwOworICAgICAgICAgICAgaWYgKCFJbnRvKHRvTWF0Y2gsb3V0IHMpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoIVN5c3RlbS5JbnQzMi5UcnlQYXJzZShzLCBvdXQgaW50bykpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIEludG8oTWF0Y2hlciB0b01hdGNoLG91dCBkb3VibGUgaW50bykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHM7CisgICAgICAgICAgICBpbnRvID0gMC4wOworICAgICAgICAgICAgaWYgKCFJbnRvKHRvTWF0Y2gsb3V0IHMpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoIVN5c3RlbS5Eb3VibGUuVHJ5UGFyc2Uocywgb3V0IGludG8pKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uIFNldHRpbmcgaG9zdCB2YXJpYWJsZXMKKyAgICAgICAgI3JlZ2lvbiBFcnJvciBoYW5kbGluZworICAgICAgICB2b2lkIExvZ091dE1zZyhzdHJpbmcgc0VycktpbmQsIHN0cmluZyBzTXNnKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGluZU5vLCBjb2xObzsKKyAgICAgICAgICAgIGVycm9ycy5HZXRMaW5lQW5kQ29sKHNyY18sIHBvc18sIG91dCBsaW5lTm8sIG91dCBjb2xObyk7CisgICAgICAgICAgICBlcnJPdXRfLldyaXRlTGluZSgiPHswfSx7MX0sezJ9PnszfTp7NH0iLCBsaW5lTm8sIGNvbE5vLCBtYXhwb3NfLCBzRXJyS2luZCwgc01zZyk7CisgICAgICAgICAgICBlcnJPdXRfLkZsdXNoKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBGYXRhbChzdHJpbmcgc01zZykKKyAgICAgICAgeworCisgICAgICAgICAgICBMb2dPdXRNc2coIkZBVEFMIiwgc01zZyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGVnRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAvL3JldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBXYXJuaW5nKHN0cmluZyBzTXNnKQorICAgICAgICB7CisgICAgICAgICAgICBMb2dPdXRNc2coIldBUk5JTkciLCBzTXNnKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24gRXJyb3IgaGFuZGxpbmcKKyAgICAgICAgI3JlZ2lvbiBQRUcgIG9wdGltaXplZCB2ZXJzaW9uIG9mICBlKiA7IGUrIAorICAgICAgICBwdWJsaWMgYm9vbCBPcHRSZXBlYXQoT3B0aW1pemVkQ2hhcnNldCBjaGFyc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKDsgcG9zXyA8IHNyY0xlbl8gJiYgY2hhcnNldC5NYXRjaGVzKHNyY19bcG9zX10pOyArK3Bvc18pIDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIFBsdXNSZXBlYXQoT3B0aW1pemVkQ2hhcnNldCBjaGFyc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9zMCA9IHBvc187CisgICAgICAgICAgICBmb3IgKDsgcG9zXyA8IHNyY0xlbl8gJiYgY2hhcnNldC5NYXRjaGVzKHNyY19bcG9zX10pOyArK3Bvc18pIDsKKyAgICAgICAgICAgIHJldHVybiBwb3NfID4gcG9zMDsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uIFBFRyAgb3B0aW1pemVkIHZlcnNpb24gb2YgIGUqIDsgZSsKKyAgICAgICAgI3JlZ2lvbiBQRUcgJzxMaXRlcmFsPicgLyAnPExpdGVyYWw+Jy9pIC8gW2xvdzEtaGlnaDEsbG93Mi1oaWdoMi4uXSAvIFs8Q2hhckxpc3Q+XQorICAgICAgICBwdWJsaWMgYm9vbCBDaGFyKGNoYXIgYzEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfIDwgc3JjTGVuXyAmJiBzcmNfW3Bvc19dID09IGMxKQorICAgICAgICAgICAgeyArK3Bvc187IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgQ2hhcihjaGFyIGMxLCBjaGFyIGMyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDEgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfXSA9PSBjMQorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDFdID09IGMyKQorICAgICAgICAgICAgeyBwb3NfICs9IDI7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgQ2hhcihjaGFyIGMxLCBjaGFyIGMyLCBjaGFyIGMzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDIgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfXSA9PSBjMQorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDFdID09IGMyCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgMl0gPT0gYzMpCisgICAgICAgICAgICB7IHBvc18gKz0gMzsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBDaGFyKGNoYXIgYzEsIGNoYXIgYzIsIGNoYXIgYzMsIGNoYXIgYzQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfICsgMyA8IHNyY0xlbl8KKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc19dID09IGMxCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgMV0gPT0gYzIKKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc18gKyAyXSA9PSBjMworICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDNdID09IGM0KQorICAgICAgICAgICAgeyBwb3NfICs9IDQ7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgQ2hhcihjaGFyIGMxLCBjaGFyIGMyLCBjaGFyIGMzLCBjaGFyIGM0LCBjaGFyIGM1KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDQgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfXSA9PSBjMQorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDFdID09IGMyCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgMl0gPT0gYzMKKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc18gKyAzXSA9PSBjNAorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDRdID09IGM1KQorICAgICAgICAgICAgeyBwb3NfICs9IDU7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgQ2hhcihjaGFyIGMxLCBjaGFyIGMyLCBjaGFyIGMzLCBjaGFyIGM0LCBjaGFyIGM1LCBjaGFyIGM2KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDUgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfXSA9PSBjMQorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDFdID09IGMyCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgMl0gPT0gYzMKKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc18gKyAzXSA9PSBjNAorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDRdID09IGM1CisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgNV0gPT0gYzYpCisgICAgICAgICAgICB7IHBvc18gKz0gNjsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBDaGFyKGNoYXIgYzEsIGNoYXIgYzIsIGNoYXIgYzMsIGNoYXIgYzQsIGNoYXIgYzUsIGNoYXIgYzYsIGNoYXIgYzcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfICsgNiA8IHNyY0xlbl8KKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc19dID09IGMxCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgMV0gPT0gYzIKKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc18gKyAyXSA9PSBjMworICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDNdID09IGM0CisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgNF0gPT0gYzUKKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc18gKyA1XSA9PSBjNgorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDZdID09IGM3KQorICAgICAgICAgICAgeyBwb3NfICs9IDc7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgQ2hhcihjaGFyIGMxLCBjaGFyIGMyLCBjaGFyIGMzLCBjaGFyIGM0LCBjaGFyIGM1LCBjaGFyIGM2LCBjaGFyIGM3LCBjaGFyIGM4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDcgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfXSA9PSBjMQorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDFdID09IGMyCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgMl0gPT0gYzMKKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc18gKyAzXSA9PSBjNAorICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDRdID09IGM1CisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfICsgNV0gPT0gYzYKKyAgICAgICAgICAgICAgICAmJiBzcmNfW3Bvc18gKyA2XSA9PSBjNworICAgICAgICAgICAgICAgICYmIHNyY19bcG9zXyArIDddID09IGM4KQorICAgICAgICAgICAgeyBwb3NfICs9IDg7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgQ2hhcihzdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNMZW5ndGggPSBzLkxlbmd0aDsKKyAgICAgICAgICAgIGlmIChwb3NfICsgc0xlbmd0aCA+IHNyY0xlbl8pIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc0xlbmd0aDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzW2ldICE9IHNyY19bcG9zXyArIGldKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3NfICs9IHNMZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBJQ2hhcihjaGFyIGMxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyA8IHNyY0xlbl8gJiYgU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc19dKSA9PSBjMSkKKyAgICAgICAgICAgIHsgKytwb3NfOyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIElDaGFyKGNoYXIgYzEsIGNoYXIgYzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfICsgMSA8IHNyY0xlbl8KKyAgICAgICAgICAgICAgICAmJiBTeXN0ZW0uQ2hhci5Ub1VwcGVyKHNyY19bcG9zX10pID09IFN5c3RlbS5DaGFyLlRvVXBwZXIoYzEpCisgICAgICAgICAgICAgICAgJiYgU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc18gKyAxXSkgPT0gU3lzdGVtLkNoYXIuVG9VcHBlcihjMikpCisgICAgICAgICAgICB7IHBvc18gKz0gMjsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBJQ2hhcihjaGFyIGMxLCBjaGFyIGMyLCBjaGFyIGMzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDIgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc19dKSA9PSBTeXN0ZW0uQ2hhci5Ub1VwcGVyKGMxKQorICAgICAgICAgICAgICAgICYmIFN5c3RlbS5DaGFyLlRvVXBwZXIoc3JjX1twb3NfICsgMV0pID09IFN5c3RlbS5DaGFyLlRvVXBwZXIoYzIpCisgICAgICAgICAgICAgICAgJiYgU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc18gKyAyXSkgPT0gU3lzdGVtLkNoYXIuVG9VcHBlcihjMykpCisgICAgICAgICAgICB7IHBvc18gKz0gMzsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBJQ2hhcihjaGFyIGMxLCBjaGFyIGMyLCBjaGFyIGMzLCBjaGFyIGM0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDMgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc19dKSA9PSBTeXN0ZW0uQ2hhci5Ub1VwcGVyKGMxKQorICAgICAgICAgICAgICAgICYmIFN5c3RlbS5DaGFyLlRvVXBwZXIoc3JjX1twb3NfICsgMV0pID09IFN5c3RlbS5DaGFyLlRvVXBwZXIoYzIpCisgICAgICAgICAgICAgICAgJiYgU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc18gKyAyXSkgPT0gU3lzdGVtLkNoYXIuVG9VcHBlcihjMykKKyAgICAgICAgICAgICAgICAmJiBTeXN0ZW0uQ2hhci5Ub1VwcGVyKHNyY19bcG9zXyArIDNdKSA9PSBTeXN0ZW0uQ2hhci5Ub1VwcGVyKGM0KSkKKyAgICAgICAgICAgIHsgcG9zXyArPSA0OyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIElDaGFyKGNoYXIgYzEsIGNoYXIgYzIsIGNoYXIgYzMsIGNoYXIgYzQsIGNoYXIgYzUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfICsgNCA8IHNyY0xlbl8KKyAgICAgICAgICAgICAgICAmJiBTeXN0ZW0uQ2hhci5Ub1VwcGVyKHNyY19bcG9zX10pID09IFN5c3RlbS5DaGFyLlRvVXBwZXIoYzEpCisgICAgICAgICAgICAgICAgJiYgU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc18gKyAxXSkgPT0gU3lzdGVtLkNoYXIuVG9VcHBlcihjMikKKyAgICAgICAgICAgICAgICAmJiBTeXN0ZW0uQ2hhci5Ub1VwcGVyKHNyY19bcG9zXyArIDJdKSA9PSBTeXN0ZW0uQ2hhci5Ub1VwcGVyKGMzKQorICAgICAgICAgICAgICAgICYmIFN5c3RlbS5DaGFyLlRvVXBwZXIoc3JjX1twb3NfICsgM10pID09IFN5c3RlbS5DaGFyLlRvVXBwZXIoYzQpCisgICAgICAgICAgICAgICAgJiYgU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc18gKyA0XSkgPT0gU3lzdGVtLkNoYXIuVG9VcHBlcihjNSkpCisgICAgICAgICAgICB7IHBvc18gKz0gNTsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBJQ2hhcihjaGFyIGMxLCBjaGFyIGMyLCBjaGFyIGMzLCBjaGFyIGM0LCBjaGFyIGM1LCBjaGFyIGM2KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDUgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc19dKSA9PSBTeXN0ZW0uQ2hhci5Ub1VwcGVyKGMxKQorICAgICAgICAgICAgICAgICYmIFN5c3RlbS5DaGFyLlRvVXBwZXIoc3JjX1twb3NfICsgMV0pID09IFN5c3RlbS5DaGFyLlRvVXBwZXIoYzIpCisgICAgICAgICAgICAgICAgJiYgU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc18gKyAyXSkgPT0gU3lzdGVtLkNoYXIuVG9VcHBlcihjMykKKyAgICAgICAgICAgICAgICAmJiBTeXN0ZW0uQ2hhci5Ub1VwcGVyKHNyY19bcG9zXyArIDNdKSA9PSBTeXN0ZW0uQ2hhci5Ub1VwcGVyKGM0KQorICAgICAgICAgICAgICAgICYmIFN5c3RlbS5DaGFyLlRvVXBwZXIoc3JjX1twb3NfICsgNF0pID09IFN5c3RlbS5DaGFyLlRvVXBwZXIoYzUpCisgICAgICAgICAgICAgICAgJiYgU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc18gKyA1XSkgPT0gU3lzdGVtLkNoYXIuVG9VcHBlcihjNikpCisgICAgICAgICAgICB7IHBvc18gKz0gNjsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBJQ2hhcihjaGFyIGMxLCBjaGFyIGMyLCBjaGFyIGMzLCBjaGFyIGM0LCBjaGFyIGM1LCBjaGFyIGM2LCBjaGFyIGM3KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyArIDYgPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc19dKSA9PSBTeXN0ZW0uQ2hhci5Ub1VwcGVyKGMxKQorICAgICAgICAgICAgICAgICYmIFN5c3RlbS5DaGFyLlRvVXBwZXIoc3JjX1twb3NfICsgMV0pID09IFN5c3RlbS5DaGFyLlRvVXBwZXIoYzIpCisgICAgICAgICAgICAgICAgJiYgU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc18gKyAyXSkgPT0gU3lzdGVtLkNoYXIuVG9VcHBlcihjMykKKyAgICAgICAgICAgICAgICAmJiBTeXN0ZW0uQ2hhci5Ub1VwcGVyKHNyY19bcG9zXyArIDNdKSA9PSBTeXN0ZW0uQ2hhci5Ub1VwcGVyKGM0KQorICAgICAgICAgICAgICAgICYmIFN5c3RlbS5DaGFyLlRvVXBwZXIoc3JjX1twb3NfICsgNF0pID09IFN5c3RlbS5DaGFyLlRvVXBwZXIoYzUpCisgICAgICAgICAgICAgICAgJiYgU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc18gKyA1XSkgPT0gU3lzdGVtLkNoYXIuVG9VcHBlcihjNikKKyAgICAgICAgICAgICAgICAmJiBTeXN0ZW0uQ2hhci5Ub1VwcGVyKHNyY19bcG9zXyArIDZdKSA9PSBTeXN0ZW0uQ2hhci5Ub1VwcGVyKGM3KSkKKyAgICAgICAgICAgIHsgcG9zXyArPSA3OyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIElDaGFyKHN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc0xlbmd0aCA9IHMuTGVuZ3RoOworICAgICAgICAgICAgaWYgKHBvc18gKyBzTGVuZ3RoID4gc3JjTGVuXykgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzTGVuZ3RoOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNbaV0gIT0gU3lzdGVtLkNoYXIuVG9VcHBlcihzcmNfW3Bvc18gKyBpXSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvc18gKz0gc0xlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSW4oY2hhciBjMCwgY2hhciBjMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fCisgICAgICAgICAgICAgICAgJiYgc3JjX1twb3NfXSA+PSBjMCAmJiBzcmNfW3Bvc19dIDw9IGMxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrcG9zXzsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBJbihjaGFyIGMwLCBjaGFyIGMxLCBjaGFyIGMyLCBjaGFyIGMzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyA8IHNyY0xlbl8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gc3JjX1twb3NfXTsKKyAgICAgICAgICAgICAgICBpZiAoYyA+PSBjMCAmJiBjIDw9IGMxCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPj0gYzIgJiYgYyA8PSBjMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICsrcG9zXzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIEluKGNoYXIgYzAsIGNoYXIgYzEsIGNoYXIgYzIsIGNoYXIgYzMsIGNoYXIgYzQsIGNoYXIgYzUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfIDwgc3JjTGVuXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBzcmNfW3Bvc19dOworICAgICAgICAgICAgICAgIGlmIChjID49IGMwICYmIGMgPD0gYzEKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA+PSBjMiAmJiBjIDw9IGMzCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPj0gYzQgJiYgYyA8PSBjNSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICsrcG9zXzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIEluKGNoYXIgYzAsIGNoYXIgYzEsIGNoYXIgYzIsIGNoYXIgYzMsIGNoYXIgYzQsIGNoYXIgYzUsIGNoYXIgYzYsIGNoYXIgYzcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfIDwgc3JjTGVuXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBzcmNfW3Bvc19dOworICAgICAgICAgICAgICAgIGlmIChjID49IGMwICYmIGMgPD0gYzEKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA+PSBjMiAmJiBjIDw9IGMzCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPj0gYzQgJiYgYyA8PSBjNQorICAgICAgICAgICAgICAgICAgICB8fCBjID49IGM2ICYmIGMgPD0gYzcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK3Bvc187CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBJbihzdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IHNyY19bcG9zX107CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLkxlbmd0aCAtIDE7IGkgKz0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGMgPj0gc1tpXSAmJiBjIDw9IHNbaSArIDFdKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK3Bvc187CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgTm90SW4oc3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfIDwgc3JjTGVuXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBzcmNfW3Bvc19dOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5MZW5ndGggLSAxOyBpICs9IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGMgPj0gc1tpXSAmJiBjIDw9IHNbaSArIDFdKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrcG9zXzsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBPbmVPZihjaGFyIGMwLCBjaGFyIGMxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyA8IHNyY0xlbl8KKyAgICAgICAgICAgICAgICAmJiAoc3JjX1twb3NfXSA9PSBjMCB8fCBzcmNfW3Bvc19dID09IGMxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK3Bvc187CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgT25lT2YoY2hhciBjMCwgY2hhciBjMSwgY2hhciBjMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IHNyY19bcG9zX107CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gYzAgfHwgYyA9PSBjMSB8fCBjID09IGMyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgT25lT2YoY2hhciBjMCwgY2hhciBjMSwgY2hhciBjMiwgY2hhciBjMykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IHNyY19bcG9zX107CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gYzAgfHwgYyA9PSBjMSB8fCBjID09IGMyIHx8IGMgPT0gYzMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK3Bvc187CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBPbmVPZihjaGFyIGMwLCBjaGFyIGMxLCBjaGFyIGMyLCBjaGFyIGMzLCBjaGFyIGM0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyA8IHNyY0xlbl8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gc3JjX1twb3NfXTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBjMCB8fCBjID09IGMxIHx8IGMgPT0gYzIgfHwgYyA9PSBjMyB8fCBjID09IGM0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgT25lT2YoY2hhciBjMCwgY2hhciBjMSwgY2hhciBjMiwgY2hhciBjMywgY2hhciBjNCwgY2hhciBjNSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IHNyY19bcG9zX107CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gYzAgfHwgYyA9PSBjMSB8fCBjID09IGMyIHx8IGMgPT0gYzMgfHwgYyA9PSBjNCB8fCBjID09IGM1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgT25lT2YoY2hhciBjMCwgY2hhciBjMSwgY2hhciBjMiwgY2hhciBjMywgY2hhciBjNCwgY2hhciBjNSwgY2hhciBjNikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvc18gPCBzcmNMZW5fKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IHNyY19bcG9zX107CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gYzAgfHwgYyA9PSBjMSB8fCBjID09IGMyIHx8IGMgPT0gYzMgfHwgYyA9PSBjNCB8fCBjID09IGM1IHx8IGMgPT0gYzYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK3Bvc187CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBPbmVPZihjaGFyIGMwLCBjaGFyIGMxLCBjaGFyIGMyLCBjaGFyIGMzLCBjaGFyIGM0LCBjaGFyIGM1LCBjaGFyIGM2LCBjaGFyIGM3KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyA8IHNyY0xlbl8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gc3JjX1twb3NfXTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBjMCB8fCBjID09IGMxIHx8IGMgPT0gYzIgfHwgYyA9PSBjMyB8fCBjID09IGM0IHx8IGMgPT0gYzUgfHwgYyA9PSBjNiB8fCBjID09IGM3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgT25lT2Yoc3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfIDwgc3JjTGVuXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocy5JbmRleE9mKHNyY19bcG9zX10pICE9IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgTm90T25lT2Yoc3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3NfIDwgc3JjTGVuXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocy5JbmRleE9mKHNyY19bcG9zX10pID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwb3NfOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgT25lT2YoT3B0aW1pemVkQ2hhcnNldCBjc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zXyA8IHNyY0xlbl8gJiYgY3NldC5NYXRjaGVzKHNyY19bcG9zX10pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrcG9zXzsgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgT25lT2ZMaXRlcmFscyhPcHRpbWl6ZWRMaXRlcmFscyBsaXRBbHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9wdGltaXplZExpdGVyYWxzLlRyaWUgbm9kZSA9IGxpdEFsdC5saXRlcmFsc1Jvb3Q7CisgICAgICAgICAgICBpbnQgbWF0Y2hQb3MgPSBwb3NfLTE7CisgICAgICAgICAgICBmb3IgKGludCBwb3MgPSBwb3NfOyBwb3MgPCBzcmNMZW5fIDsgKytwb3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gc3JjX1twb3NdOworICAgICAgICAgICAgICAgIGlmICggICAgbm9kZS5jaGlsZHJlbl89PW51bGwgCisgICAgICAgICAgICAgICAgICAgIHx8ICBjIDwgbm9kZS5jTWluXyB8fCBjID4gbm9kZS5jTWluXyArIG5vZGUuY2hpbGRyZW5fLkxlbmd0aCAtIDEKKyAgICAgICAgICAgICAgICAgICAgfHwgIG5vZGUuY2hpbGRyZW5fW2MgLSBub2RlLmNNaW5fXSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkcmVuX1tjIC0gbm9kZS5jTWluX107CisgICAgICAgICAgICAgICAgaWYgKG5vZGUuYkxpdEVuZF8pIG1hdGNoUG9zID0gcG9zICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXRjaFBvcyA+PSBwb3NfKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvc189IG1hdGNoUG9zOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbiBQRUcgJzxMaXRlcmFsPicgLyAnPExpdGVyYWw+Jy9pIC8gW2xvdzEtaGlnaDEsbG93Mi1oaWdoMi4uXSAvIFs8Q2hhckxpc3Q+XQorICAgIH0KKyAgICAjZW5kcmVnaW9uIFBhcnNlcnMKK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzL1Bvd2VyVG9vbHNCbG9jay5jcyBiL09wZW5YbWxQb3dlclRvb2xzL1Bvd2VyVG9vbHNCbG9jay5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQxODU5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvUG93ZXJUb29sc0Jsb2NrLmNzCkBAIC0wLDAgKzEsNzEgQEAKK++7vy8vCisvLyBDb3B5cmlnaHQgMjAxNyBUaG9tYXMgQmFybmVrb3cKKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiBUaGUgdGV4dCBvZiB0aGUKKy8vIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisvLworLy8gaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorLy8KKy8vIERldmVsb3BlcjogVGhvbWFzIEJhcm5la293CisvLyBFbWFpbDogdGhvbWFzQGJhcm5la293LmluZm8KKy8vCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByb3ZpZGVzIGFuIGVsZWdhbnQgd2F5IG9mIHdyYXBwaW5nIGEgc2V0IG9mIGludm9jYXRpb25zIG9mIHRoZSBQb3dlclRvb2xzIGluIGEgdXNpbmcKKyAgICAvLy8gc3RhdGVtZW50IHRoYXQgZGVtYXJjYXRlcyB0aG9zZSBpbnZva2F0aW9ucyBhcyBvbmUgImJsb2NrIiBiZWZvcmUgYW5kIGFmdGVyIHdoaWNoIHRoZQorICAgIC8vLyBzdHJvbmdseSB0eXBlZCBjbGFzc2VzIHByb3ZpZGVkIGJ5IHRoZSBPcGVuIFhNTCBTREsgY2FuIGJlIHVzZWQgc2FmZWx5LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gVGhpcyBjbGFzcyBsZW5kcyBpdHNlbGYgdG8gc2NlbmFyaW9zIHdoZXJlIHRoZSBQb3dlclRvb2xzIGFuZCBMaW5xLXRvLVhNTCBhcmUgdXNlZCBhcworICAgIC8vLyBhIHNlY29uZGFyeSBBUEkgZm9yIHdvcmtpbmcgd2l0aCBPcGVuIFhNTCBlbGVtZW50cywgbmV4dCB0byB0aGUgc3Ryb25nbHkgdHlwZWQgY2xhc3NlcworICAgIC8vLyBwcm92aWRlZCBieSB0aGUgT3BlbiBYTUwgU0RLLiBJbiB0aGVzZSBzY2VuYXJpb3MsIHRoZSBjbGFzcyB3b3VsZCBiZQorICAgIC8vLyB1c2VkIGFzIGZvbGxvd3M6CisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8gPGNvZGU+CisgICAgLy8vICAgICBbWW91ciBjb2RlIHVzaW5nIHRoZSBzdHJvbmdseSB0eXBlZCBjbGFzc2VzXQorICAgIC8vLyAKKyAgICAvLy8gICAgIHVzaW5nIChuZXcgUG93ZXJUb29sc0Jsb2NrKHdvcmRwcm9jZXNzaW5nRG9jdW1lbnQpKQorICAgIC8vLyAgICAgeworICAgIC8vLyAgICAgICAgIFtZb3VyIGNvZGUgdXNpbmcgdGhlIFBvd2VyVG9vbHNdCisgICAgLy8vICAgICB9CisgICAgLy8vIAorICAgIC8vLyAgICBbWW91ciBjb2RlIHVzaW5nIHRoZSBzdHJvbmdseSB0eXBlZCBjbGFzc2VzXQorICAgIC8vLyA8L2NvZGU+CisgICAgLy8vIDxwYXJhPgorICAgIC8vLyBVcG9uIGNyZWF0aW9uLCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB3aWxsIGludm9rZSB0aGUKKyAgICAvLy8gPHNlZSBjcmVmPSJQb3dlclRvb2xzQmxvY2tFeHRlbnNpb25zLkJlZ2luUG93ZXJUb29sc0Jsb2NrIi8+IG1ldGhvZCBvbiB0aGUgcGFja2FnZQorICAgIC8vLyB0byBiZWdpbiB0aGUgdHJhbnNhY3Rpb24uICBVcG9uIGRpc3Bvc2FsLCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB3aWxsIGNhbGwgdGhlCisgICAgLy8vIDxzZWUgY3JlZj0iUG93ZXJUb29sc0Jsb2NrRXh0ZW5zaW9ucy5FbmRQb3dlclRvb2xzQmxvY2siLz4gbWV0aG9kIG9uIHRoZSBwYWNrYWdlCisgICAgLy8vIHRvIGVuZCB0aGUgdHJhbnNhY3Rpb24uCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJTdHJvbmdseVR5cGVkQmxvY2siIC8+CisgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlBvd2VyVG9vbHNCbG9ja0V4dGVuc2lvbnMuQmVnaW5Qb3dlclRvb2xzQmxvY2siLz4KKyAgICAvLy8gPHNlZWFsc28gY3JlZj0iUG93ZXJUb29sc0Jsb2NrRXh0ZW5zaW9ucy5FbmRQb3dlclRvb2xzQmxvY2siLz4KKyAgICBwdWJsaWMgY2xhc3MgUG93ZXJUb29sc0Jsb2NrIDogSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgT3BlblhtbFBhY2thZ2UgX3BhY2thZ2U7CisKKyAgICAgICAgcHVibGljIFBvd2VyVG9vbHNCbG9jayhPcGVuWG1sUGFja2FnZSBwYWNrYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFja2FnZSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJwYWNrYWdlIik7CisKKyAgICAgICAgICAgIF9wYWNrYWdlID0gcGFja2FnZTsKKyAgICAgICAgICAgIF9wYWNrYWdlLkJlZ2luUG93ZXJUb29sc0Jsb2NrKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9wYWNrYWdlID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgX3BhY2thZ2UuRW5kUG93ZXJUb29sc0Jsb2NrKCk7CisgICAgICAgICAgICBfcGFja2FnZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9Qb3dlclRvb2xzQmxvY2tFeHRlbnNpb25zLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvUG93ZXJUb29sc0Jsb2NrRXh0ZW5zaW9ucy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzA1MTUwCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvUG93ZXJUb29sc0Jsb2NrRXh0ZW5zaW9ucy5jcwpAQCAtMCwwICsxLDc5IEBACisvLworLy8gQ29weXJpZ2h0IDIwMTcgVGhvbWFzIEJhcm5la293CisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gVGhlIHRleHQgb2YgdGhlCisvLyBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorLy8KKy8vIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKy8vCisvLyBEZXZlbG9wZXI6IFRob21hcyBCYXJuZWtvdworLy8gRW1haWw6IHRob21hc0BiYXJuZWtvdy5pbmZvCisvLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQb3dlclRvb2xzQmxvY2tFeHRlbnNpb25zCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBCZWdpbnMgYSBQb3dlclRvb2xzIEJsb2NrIGJ5ICgxKSByZW1vdmluZyBhbm5vdGF0aW9ucyBhbmQsIHVubGVzcyB0aGUgcGFja2FnZSB3YXMKKyAgICAgICAgLy8vIG9wZW5lZCBpbiByZWFkLW9ubHkgbW9kZSwgKDIpIHNhdmluZyB0aGUgcGFja2FnZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gUmVtb3ZlcyA8c2VlIGNyZWY9IlhEb2N1bWVudCIgLz4gYW5kIDxzZWUgY3JlZj0iWG1sTmFtZXNwYWNlTWFuYWdlciIgLz4gaW5zdGFuY2VzCisgICAgICAgIC8vLyBhZGRlZCBieSA8c2VlIGNyZWY9IlB0T3BlblhtbEV4dGVuc2lvbnMuR2V0WERvY3VtZW50KE9wZW5YbWxQYXJ0KSIgLz4sCisgICAgICAgIC8vLyA8c2VlIGNyZWY9IlB0T3BlblhtbEV4dGVuc2lvbnMuR2V0WERvY3VtZW50KE9wZW5YbWxQYXJ0LCBvdXQgWG1sTmFtZXNwYWNlTWFuYWdlcikiIC8+LAorICAgICAgICAvLy8gPHNlZSBjcmVmPSJQdE9wZW5YbWxFeHRlbnNpb25zLlB1dFhEb2N1bWVudChPcGVuWG1sUGFydCkiIC8+LAorICAgICAgICAvLy8gPHNlZSBjcmVmPSJQdE9wZW5YbWxFeHRlbnNpb25zLlB1dFhEb2N1bWVudChPcGVuWG1sUGFydCwgWERvY3VtZW50KSIgLz4sIGFuZAorICAgICAgICAvLy8gPHNlZSBjcmVmPSJQdE9wZW5YbWxFeHRlbnNpb25zLlB1dFhEb2N1bWVudFdpdGhGb3JtYXR0aW5nKE9wZW5YbWxQYXJ0KSIgLz4uCisgICAgICAgIC8vLyBtZXRob2RzLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhY2thZ2UiPgorICAgICAgICAvLy8gQSA8c2VlIGNyZWY9IldvcmRwcm9jZXNzaW5nRG9jdW1lbnQiIC8+LCA8c2VlIGNyZWY9IlNwcmVhZHNoZWV0RG9jdW1lbnQiIC8+LAorICAgICAgICAvLy8gb3IgPHNlZSBjcmVmPSJQcmVzZW50YXRpb25Eb2N1bWVudCIgLz4uCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQmVnaW5Qb3dlclRvb2xzQmxvY2sodGhpcyBPcGVuWG1sUGFja2FnZSBwYWNrYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFja2FnZSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJwYWNrYWdlIik7CisKKyAgICAgICAgICAgIHBhY2thZ2UuUmVtb3ZlUG93ZXJUb29sc0Fubm90YXRpb25zKCk7CisgICAgICAgICAgICBwYWNrYWdlLlNhdmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEVuZHMgYSBQb3dlclRvb2xzIEJsb2NrIGJ5IHJlbG9hZGluZyB0aGUgcm9vdCBlbGVtZW50cyBvZiBhbGwgcGFja2FnZSBwYXJ0cworICAgICAgICAvLy8gdGhhdCB3ZXJlIGNoYW5nZWQgYnkgdGhlIFBvd2VyVG9vbHMuIEEgcGFydCBpcyBkZWVtZWQgY2hhbmdlZCBieSB0aGUgUG93ZXJUb29scworICAgICAgICAvLy8gaWYgaXQgaGFzIGFuIGFubm90YXRpb24gb2YgdHlwZSA8c2VlIGNyZWY9IlhEb2N1bWVudCIgLz4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFja2FnZSI+CisgICAgICAgIC8vLyBBIDxzZWUgY3JlZj0iV29yZHByb2Nlc3NpbmdEb2N1bWVudCIgLz4sIDxzZWUgY3JlZj0iU3ByZWFkc2hlZXREb2N1bWVudCIgLz4sCisgICAgICAgIC8vLyBvciA8c2VlIGNyZWY9IlByZXNlbnRhdGlvbkRvY3VtZW50IiAvPi4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBFbmRQb3dlclRvb2xzQmxvY2sodGhpcyBPcGVuWG1sUGFja2FnZSBwYWNrYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFja2FnZSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJwYWNrYWdlIik7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKE9wZW5YbWxQYXJ0IHBhcnQgaW4gcGFja2FnZS5HZXRBbGxQYXJ0cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwYXJ0LkFubm90YXRpb25zPFhEb2N1bWVudD4oKS5BbnkoKSAmJiBwYXJ0LlJvb3RFbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHBhcnQuUm9vdEVsZW1lbnQuUmVsb2FkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFJlbW92ZVBvd2VyVG9vbHNBbm5vdGF0aW9ucyh0aGlzIE9wZW5YbWxQYWNrYWdlIHBhY2thZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInBhY2thZ2UiKTsKKworICAgICAgICAgICAgZm9yZWFjaCAoT3BlblhtbFBhcnQgcGFydCBpbiBwYWNrYWdlLkdldEFsbFBhcnRzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFydC5SZW1vdmVBbm5vdGF0aW9uczxYRG9jdW1lbnQ+KCk7CisgICAgICAgICAgICAgICAgcGFydC5SZW1vdmVBbm5vdGF0aW9uczxYbWxOYW1lc3BhY2VNYW5hZ2VyPigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvUHJlc2VudGF0aW9uQnVpbGRlci5jcyBiL09wZW5YbWxQb3dlclRvb2xzL1ByZXNlbnRhdGlvbkJ1aWxkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwNjgzYwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzL1ByZXNlbnRhdGlvbkJ1aWxkZXIuY3MKQEAgLTAsMCArMSwxODQ5IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworVmVyc2lvbjogMi41LjAxCisgKiBGaXggaXNzdWUgd2hlcmUgYSBzcGVjaWZpYyByZWxhdGlvbnNoaXAgd2FzIG5vdCBiZWluZyBjcmVhdGVkLgorCitWZXJzaW9uOiAyLjUuMDAKKyAqIEZpeCB0byBvcHRpbWl6ZSBzdG9yaW5nIG9mIGltYWdlcyB3aGVuIHRoZSBzYW1lIGltYWdlIGlzIG9uIG1vcmUgdGhhbiBvbmUgc2xpZGUuCisKK1ZlcnNpb246IDIuNC4wMAorICogVXBkYXRlIHRvIFByZXNlbnRhdGlvbkJ1aWxkZXIgdG8gbWFrZSBpdCBtdWNoIG1vcmUgcm9idXN0LgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgY2xhc3MgU2xpZGVTb3VyY2UKKyAgICB7CisgICAgICAgIHB1YmxpYyBQbWxEb2N1bWVudCBQbWxEb2N1bWVudCB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBpbnQgU3RhcnQgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIGJvb2wgS2VlcE1hc3RlciB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIFNsaWRlU291cmNlKFBtbERvY3VtZW50IHNvdXJjZSwgYm9vbCBrZWVwTWFzdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBQbWxEb2N1bWVudCA9IHNvdXJjZTsKKyAgICAgICAgICAgIFN0YXJ0ID0gMDsKKyAgICAgICAgICAgIENvdW50ID0gSW50MzIuTWF4VmFsdWU7CisgICAgICAgICAgICBLZWVwTWFzdGVyID0ga2VlcE1hc3RlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTbGlkZVNvdXJjZShzdHJpbmcgZmlsZU5hbWUsIGJvb2wga2VlcE1hc3RlcikKKyAgICAgICAgeworICAgICAgICAgICAgUG1sRG9jdW1lbnQgPSBuZXcgUG1sRG9jdW1lbnQoZmlsZU5hbWUpOworICAgICAgICAgICAgU3RhcnQgPSAwOworICAgICAgICAgICAgQ291bnQgPSBJbnQzMi5NYXhWYWx1ZTsKKyAgICAgICAgICAgIEtlZXBNYXN0ZXIgPSBrZWVwTWFzdGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNsaWRlU291cmNlKFBtbERvY3VtZW50IHNvdXJjZSwgaW50IHN0YXJ0LCBib29sIGtlZXBNYXN0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBtbERvY3VtZW50ID0gc291cmNlOworICAgICAgICAgICAgU3RhcnQgPSBzdGFydDsKKyAgICAgICAgICAgIENvdW50ID0gSW50MzIuTWF4VmFsdWU7CisgICAgICAgICAgICBLZWVwTWFzdGVyID0ga2VlcE1hc3RlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTbGlkZVNvdXJjZShzdHJpbmcgZmlsZU5hbWUsIGludCBzdGFydCwgYm9vbCBrZWVwTWFzdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBQbWxEb2N1bWVudCA9IG5ldyBQbWxEb2N1bWVudChmaWxlTmFtZSk7CisgICAgICAgICAgICBTdGFydCA9IHN0YXJ0OworICAgICAgICAgICAgQ291bnQgPSBJbnQzMi5NYXhWYWx1ZTsKKyAgICAgICAgICAgIEtlZXBNYXN0ZXIgPSBrZWVwTWFzdGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNsaWRlU291cmNlKFBtbERvY3VtZW50IHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgY291bnQsIGJvb2wga2VlcE1hc3RlcikKKyAgICAgICAgeworICAgICAgICAgICAgUG1sRG9jdW1lbnQgPSBzb3VyY2U7CisgICAgICAgICAgICBTdGFydCA9IHN0YXJ0OworICAgICAgICAgICAgQ291bnQgPSBjb3VudDsKKyAgICAgICAgICAgIEtlZXBNYXN0ZXIgPSBrZWVwTWFzdGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNsaWRlU291cmNlKHN0cmluZyBmaWxlTmFtZSwgaW50IHN0YXJ0LCBpbnQgY291bnQsIGJvb2wga2VlcE1hc3RlcikKKyAgICAgICAgeworICAgICAgICAgICAgUG1sRG9jdW1lbnQgPSBuZXcgUG1sRG9jdW1lbnQoZmlsZU5hbWUpOworICAgICAgICAgICAgU3RhcnQgPSBzdGFydDsKKyAgICAgICAgICAgIENvdW50ID0gY291bnQ7CisgICAgICAgICAgICBLZWVwTWFzdGVyID0ga2VlcE1hc3RlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlc2VudGF0aW9uQnVpbGRlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEJ1aWxkUHJlc2VudGF0aW9uKExpc3Q8U2xpZGVTb3VyY2U+IHNvdXJjZXMsIHN0cmluZyBmaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCBzdHJlYW1Eb2MgPSBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQuQ3JlYXRlUHJlc2VudGF0aW9uRG9jdW1lbnQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoUHJlc2VudGF0aW9uRG9jdW1lbnQgb3V0cHV0ID0gc3RyZWFtRG9jLkdldFByZXNlbnRhdGlvbkRvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCdWlsZFByZXNlbnRhdGlvbihzb3VyY2VzLCBvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyZWFtRG9jLkdldE1vZGlmaWVkRG9jdW1lbnQoKS5TYXZlQXMoZmlsZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBQbWxEb2N1bWVudCBCdWlsZFByZXNlbnRhdGlvbihMaXN0PFNsaWRlU291cmNlPiBzb3VyY2VzKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudC5DcmVhdGVQcmVzZW50YXRpb25Eb2N1bWVudCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChQcmVzZW50YXRpb25Eb2N1bWVudCBvdXRwdXQgPSBzdHJlYW1Eb2MuR2V0UHJlc2VudGF0aW9uRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ1aWxkUHJlc2VudGF0aW9uKHNvdXJjZXMsIG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtRG9jLkdldE1vZGlmaWVkUG1sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQnVpbGRQcmVzZW50YXRpb24oTGlzdDxTbGlkZVNvdXJjZT4gc291cmNlcywgUHJlc2VudGF0aW9uRG9jdW1lbnQgb3V0cHV0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUmVsYXRpb25zaGlwTWFya3VwID09IG51bGwpCisgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwTWFya3VwID0gbmV3IERpY3Rpb25hcnk8WE5hbWUsIFhOYW1lW10+KCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgQS5hdWRpb0ZpbGUsICAgICAgICBuZXcgW10geyBSLmxpbmsgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgQS52aWRlb0ZpbGUsICAgICAgICBuZXcgW10geyBSLmxpbmsgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgQS5xdWlja1RpbWVGaWxlLCAgICBuZXcgW10geyBSLmxpbmsgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgQS53YXZBdWRpb0ZpbGUsICAgICBuZXcgW10geyBSLmVtYmVkIH19LAorICAgICAgICAgICAgICAgICAgICB7IEEuYmxpcCwgICAgICAgICAgICAgbmV3IFtdIHsgUi5lbWJlZCwgUi5saW5rIH19LAorICAgICAgICAgICAgICAgICAgICB7IEEuaGxpbmtDbGljaywgICAgICAgbmV3IFtdIHsgUi5pZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBBLmhsaW5rTW91c2VPdmVyLCAgIG5ldyBbXSB7IFIuaWQgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgQS5obGlua0hvdmVyLCAgICAgICBuZXcgW10geyBSLmlkIH19LAorICAgICAgICAgICAgICAgICAgICB7IEEucmVsSWRzLCAgICAgICAgICAgbmV3IFtdIHsgUi5jcywgUi5kbSwgUi5sbywgUi5xcyB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBDLmNoYXJ0LCAgICAgICAgICAgIG5ldyBbXSB7IFIuaWQgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgQy5leHRlcm5hbERhdGEsICAgICBuZXcgW10geyBSLmlkIH19LAorICAgICAgICAgICAgICAgICAgICB7IEMudXNlclNoYXBlcywgICAgICAgbmV3IFtdIHsgUi5pZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBER00ucmVsSWRzLCAgICAgICAgIG5ldyBbXSB7IFIuY3MsIFIuZG0sIFIubG8sIFIucXMgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgQTE0LmltZ0xheWVyLCAgICAgICBuZXcgW10geyBSLmVtYmVkIH19LAorICAgICAgICAgICAgICAgICAgICB7IFAxNC5tZWRpYSwgICAgICAgICAgbmV3IFtdIHsgUi5lbWJlZCwgUi5saW5rIH19LAorICAgICAgICAgICAgICAgICAgICB7IFAub2xlT2JqLCAgICAgICAgICAgbmV3IFtdIHsgUi5pZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBQLmV4dGVybmFsRGF0YSwgICAgIG5ldyBbXSB7IFIuaWQgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgUC5jb250cm9sLCAgICAgICAgICBuZXcgW10geyBSLmlkIH19LAorICAgICAgICAgICAgICAgICAgICB7IFAuc25kLCAgICAgICAgICAgICAgbmV3IFtdIHsgUi5lbWJlZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBQLnNuZFRndCwgICAgICAgICAgIG5ldyBbXSB7IFIuZW1iZWQgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgUEFWLnNyY01lZGlhLCAgICAgICBuZXcgW10geyBSLmVtYmVkLCBSLmxpbmsgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgUC5jb250ZW50UGFydCwgICAgICBuZXcgW10geyBSLmlkIH19LAorICAgICAgICAgICAgICAgICAgICB7IFZNTC5maWxsLCAgICAgICAgICAgbmV3IFtdIHsgUi5pZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBWTUwuaW1hZ2VkYXRhLCAgICAgIG5ldyBbXSB7IFIuaHJlZiwgUi5pZCwgUi5waWN0LCBPLnJlbGlkIH19LAorICAgICAgICAgICAgICAgICAgICB7IFZNTC5zdHJva2UsICAgICAgICAgbmV3IFtdIHsgUi5pZCB9fSwKKyAgICAgICAgICAgICAgICAgICAgeyBXTkUudG9vbGJhckRhdGEsICAgIG5ldyBbXSB7IFIuaWQgfX0sCisgICAgICAgICAgICAgICAgICAgIHsgUGxlZ2FjeS50ZXh0ZGF0YSwgICBuZXcgW10geyBYTmFtZS5HZXQoImlkIikgfX0sCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgTGlzdDxJbWFnZURhdGE+IGltYWdlcyA9IG5ldyBMaXN0PEltYWdlRGF0YT4oKTsKKyAgICAgICAgICAgIExpc3Q8TWVkaWFEYXRhPiBtZWRpYUxpc3QgPSBuZXcgTGlzdDxNZWRpYURhdGE+KCk7CisgICAgICAgICAgICBYRG9jdW1lbnQgbWFpblBhcnQgPSBvdXRwdXQuUHJlc2VudGF0aW9uUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIG1haW5QYXJ0LkRlY2xhcmF0aW9uLlN0YW5kYWxvbmUgPSAieWVzIjsKKyAgICAgICAgICAgIG1haW5QYXJ0LkRlY2xhcmF0aW9uLkVuY29kaW5nID0gIlVURi04IjsKKyAgICAgICAgICAgIG91dHB1dC5QcmVzZW50YXRpb25QYXJ0LlB1dFhEb2N1bWVudCgpOworCisgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoc291cmNlc1swXS5QbWxEb2N1bWVudCkpCisgICAgICAgICAgICB1c2luZyAoUHJlc2VudGF0aW9uRG9jdW1lbnQgZG9jID0gc3RyZWFtRG9jLkdldFByZXNlbnRhdGlvbkRvY3VtZW50KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29weVN0YXJ0aW5nUGFydHMoZG9jLCBvdXRwdXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgc291cmNlTnVtID0gMDsKKyAgICAgICAgICAgIFNsaWRlTWFzdGVyUGFydCBjdXJyZW50TWFzdGVyUGFydCA9IG51bGw7CisgICAgICAgICAgICBmb3JlYWNoIChTbGlkZVNvdXJjZSBzb3VyY2UgaW4gc291cmNlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoc291cmNlLlBtbERvY3VtZW50KSkKKyAgICAgICAgICAgICAgICB1c2luZyAoUHJlc2VudGF0aW9uRG9jdW1lbnQgZG9jID0gc3RyZWFtRG9jLkdldFByZXNlbnRhdGlvbkRvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZU51bSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcHlQcmVzZW50YXRpb25QYXJ0cyhkb2MsIG91dHB1dCwgaW1hZ2VzLCBtZWRpYUxpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1hc3RlclBhcnQgPSBBcHBlbmRTbGlkZXMoZG9jLCBvdXRwdXQsIHNvdXJjZS5TdGFydCwgc291cmNlLkNvdW50LCBzb3VyY2UuS2VlcE1hc3RlciwgaW1hZ2VzLCBjdXJyZW50TWFzdGVyUGFydCwgbWVkaWFMaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoUHJlc2VudGF0aW9uQnVpbGRlckludGVybmFsRXhjZXB0aW9uIGRiaWUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYmllLk1lc3NhZ2UuQ29udGFpbnMoInswfSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcmVzZW50YXRpb25CdWlsZGVyRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoZGJpZS5NZXNzYWdlLCBzb3VyY2VOdW0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBkYmllOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNvdXJjZU51bSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gb3V0cHV0LkdldEFsbFBhcnRzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBhcnQuQ29udGVudFR5cGUgPT0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZSt4bWwiIHx8CisgICAgICAgICAgICAgICAgICAgIHBhcnQuQ29udGVudFR5cGUgPT0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZU1hc3Rlcit4bWwiIHx8CisgICAgICAgICAgICAgICAgICAgIHBhcnQuQ29udGVudFR5cGUgPT0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZUxheW91dCt4bWwiIHx8CisgICAgICAgICAgICAgICAgICAgIHBhcnQuQ29udGVudFR5cGUgPT0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5ub3Rlc01hc3Rlcit4bWwiIHx8CisgICAgICAgICAgICAgICAgICAgIHBhcnQuQ29udGVudFR5cGUgPT0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5ub3Rlc1NsaWRlK3htbCIgfHwKKyAgICAgICAgICAgICAgICAgICAgcGFydC5Db250ZW50VHlwZSA9PSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLmhhbmRvdXRNYXN0ZXIreG1sIiB8fAorICAgICAgICAgICAgICAgICAgICBwYXJ0LkNvbnRlbnRUeXBlID09ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQudGhlbWUreG1sIiB8fAorICAgICAgICAgICAgICAgICAgICBwYXJ0LkNvbnRlbnRUeXBlID09ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZ21sLmNoYXJ0K3htbCIgfHwKKyAgICAgICAgICAgICAgICAgICAgcGFydC5Db250ZW50VHlwZSA9PSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5kaWFncmFtRGF0YSt4bWwiIHx8CisgICAgICAgICAgICAgICAgICAgIHBhcnQuQ29udGVudFR5cGUgPT0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuY2hhcnRzaGFwZXMreG1sIiB8fAorICAgICAgICAgICAgICAgICAgICBwYXJ0LkNvbnRlbnRUeXBlID09ICJhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNlLmRyYXdpbmdtbC5kaWFncmFtRHJhd2luZyt4bWwiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWERvY3VtZW50IHhkID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgeGQuRGVzY2VuZGFudHMoKS5BdHRyaWJ1dGVzKCJzbXRDbGVhbiIpLlJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICBwYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJ0LkFubm90YXRpb248WERvY3VtZW50PigpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHBhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvcHlTdGFydGluZ1BhcnRzKFByZXNlbnRhdGlvbkRvY3VtZW50IHNvdXJjZURvY3VtZW50LCBQcmVzZW50YXRpb25Eb2N1bWVudCBuZXdEb2N1bWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQSBDb3JlIEZpbGUgUHJvcGVydGllcyBwYXJ0IGRvZXMgbm90IGhhdmUgaW1wbGljaXQgb3IgZXhwbGljaXQgcmVsYXRpb25zaGlwcyB0byBvdGhlciBwYXJ0cy4KKyAgICAgICAgICAgIENvcmVGaWxlUHJvcGVydGllc1BhcnQgY29yZVBhcnQgPSBzb3VyY2VEb2N1bWVudC5Db3JlRmlsZVByb3BlcnRpZXNQYXJ0OworICAgICAgICAgICAgaWYgKGNvcmVQYXJ0ICE9IG51bGwgJiYgY29yZVBhcnQuR2V0WERvY3VtZW50KCkuUm9vdCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ld0RvY3VtZW50LkFkZENvcmVGaWxlUHJvcGVydGllc1BhcnQoKTsKKyAgICAgICAgICAgICAgICBYRG9jdW1lbnQgbmV3WERvYyA9IG5ld0RvY3VtZW50LkNvcmVGaWxlUHJvcGVydGllc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgbmV3WERvYy5EZWNsYXJhdGlvbi5TdGFuZGFsb25lID0gInllcyI7CisgICAgICAgICAgICAgICAgbmV3WERvYy5EZWNsYXJhdGlvbi5FbmNvZGluZyA9ICJVVEYtOCI7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IHNvdXJjZVhEb2MgPSBjb3JlUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBuZXdYRG9jLkFkZChzb3VyY2VYRG9jLlJvb3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBbiBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIHBhcnQgZG9lcyBub3QgaGF2ZSBpbXBsaWNpdCBvciBleHBsaWNpdCByZWxhdGlvbnNoaXBzIHRvIG90aGVyIHBhcnRzLgorICAgICAgICAgICAgRXh0ZW5kZWRGaWxlUHJvcGVydGllc1BhcnQgZXh0UGFydCA9IHNvdXJjZURvY3VtZW50LkV4dGVuZGVkRmlsZVByb3BlcnRpZXNQYXJ0OworICAgICAgICAgICAgaWYgKGV4dFBhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPcGVuWG1sUGFydCBuZXdQYXJ0ID0gbmV3RG9jdW1lbnQuQWRkRXh0ZW5kZWRGaWxlUHJvcGVydGllc1BhcnQoKTsKKyAgICAgICAgICAgICAgICBYRG9jdW1lbnQgbmV3WERvYyA9IG5ld0RvY3VtZW50LkV4dGVuZGVkRmlsZVByb3BlcnRpZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIG5ld1hEb2MuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgIG5ld1hEb2MuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgIG5ld1hEb2MuQWRkKGV4dFBhcnQuR2V0WERvY3VtZW50KCkuUm9vdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFuIGN1c3RvbSBmaWxlIHByb3BlcnRpZXMgcGFydCBkb2VzIG5vdCBoYXZlIGltcGxpY2l0IG9yIGV4cGxpY2l0IHJlbGF0aW9uc2hpcHMgdG8gb3RoZXIgcGFydHMuCisgICAgICAgICAgICBDdXN0b21GaWxlUHJvcGVydGllc1BhcnQgY3VzdG9tUGFydCA9IHNvdXJjZURvY3VtZW50LkN1c3RvbUZpbGVQcm9wZXJ0aWVzUGFydDsKKyAgICAgICAgICAgIGlmIChjdXN0b21QYXJ0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3RG9jdW1lbnQuQWRkQ3VzdG9tRmlsZVByb3BlcnRpZXNQYXJ0KCk7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IG5ld1hEb2MgPSBuZXdEb2N1bWVudC5DdXN0b21GaWxlUHJvcGVydGllc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgbmV3WERvYy5EZWNsYXJhdGlvbi5TdGFuZGFsb25lID0gInllcyI7CisgICAgICAgICAgICAgICAgbmV3WERvYy5EZWNsYXJhdGlvbi5FbmNvZGluZyA9ICJVVEYtOCI7CisgICAgICAgICAgICAgICAgbmV3WERvYy5BZGQoY3VzdG9tUGFydC5HZXRYRG9jdW1lbnQoKS5Sb290KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWYgZmFsc2UKKyAgICAgICAgICAgIC8vIFRPRE8gbmVlZCB0byBoYW5kbGUgdGhlIGZvbGxvd2luZworCisgICAgICAgICAgICB7IFAuY3VzdFNob3dMc3QsIDgwIH0sCisgICAgICAgICAgICB7IFAucGhvdG9BbGJ1bSwgOTAgfSwKKyAgICAgICAgICAgIHsgUC5jdXN0RGF0YUxzdCwgMTAwIH0sCisgICAgICAgICAgICB7IFAua2luc29rdSwgMTIwIH0sCisgICAgICAgICAgICB7IFAubW9kaWZ5VmVyaWZpZXIsIDE1MCB9LAorI2VuZGlmCisKKyAgICAgICAgLy8gQ29weSBoYW5kb3V0IG1hc3Rlciwgbm90ZXMgbWFzdGVyLCBwcmVzZW50YXRpb24gcHJvcGVydGllcyBhbmQgdmlldyBwcm9wZXJ0aWVzLCBpZiB0aGV5IGV4aXN0CisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weVByZXNlbnRhdGlvblBhcnRzKFByZXNlbnRhdGlvbkRvY3VtZW50IHNvdXJjZURvY3VtZW50LCBQcmVzZW50YXRpb25Eb2N1bWVudCBuZXdEb2N1bWVudCwgTGlzdDxJbWFnZURhdGE+IGltYWdlcywgTGlzdDxNZWRpYURhdGE+IG1lZGlhTGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IG5ld1ByZXNlbnRhdGlvbiA9IG5ld0RvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIC8vIENvcHkgc2xpZGUgYW5kIG5vdGUgc2xpZGUgc2l6ZXMKKyAgICAgICAgICAgIFhEb2N1bWVudCBvbGRQcmVzZW50YXRpb25Eb2MgPSBzb3VyY2VEb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgYXR0IGluIG9sZFByZXNlbnRhdGlvbkRvYy5Sb290LkF0dHJpYnV0ZXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWF0dC5Jc05hbWVzcGFjZURlY2xhcmF0aW9uICYmIG5ld1ByZXNlbnRhdGlvbi5Sb290LkF0dHJpYnV0ZShhdHQuTmFtZSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UHJlc2VudGF0aW9uLlJvb3QuQWRkKG9sZFByZXNlbnRhdGlvbkRvYy5Sb290LkF0dHJpYnV0ZShhdHQuTmFtZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBYRWxlbWVudCBvbGRFbGVtZW50ID0gb2xkUHJlc2VudGF0aW9uRG9jLlJvb3QuRWxlbWVudHMoUC5zbGRTeikuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChvbGRFbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgbmV3UHJlc2VudGF0aW9uLlJvb3QuQWRkKG9sZEVsZW1lbnQpOworCisgICAgICAgICAgICAvLyBDb3B5IEZvbnQgUGFydHMKKyAgICAgICAgICAgIGlmIChvbGRQcmVzZW50YXRpb25Eb2MuUm9vdC5FbGVtZW50KFAuZW1iZWRkZWRGb250THN0KSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld0ZvbnRMc3QgPSBuZXcgWEVsZW1lbnQoUC5lbWJlZGRlZEZvbnRMc3QpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmb250IGluIG9sZFByZXNlbnRhdGlvbkRvYy5Sb290LkVsZW1lbnQoUC5lbWJlZGRlZEZvbnRMc3QpLkVsZW1lbnRzKFAuZW1iZWRkZWRGb250KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld1JlZ3VsYXIgPSBudWxsLCBuZXdCb2xkID0gbnVsbCwgbmV3SXRhbGljID0gbnVsbCwgbmV3Qm9sZEl0YWxpYyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb250LkVsZW1lbnQoUC5yZWd1bGFyKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVndWxhciA9IENyZWF0ZWRFbWJlZGRlZEZvbnRQYXJ0KHNvdXJjZURvY3VtZW50LCBuZXdEb2N1bWVudCwgZm9udCwgUC5yZWd1bGFyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnQuRWxlbWVudChQLmJvbGQpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb2xkID0gQ3JlYXRlZEVtYmVkZGVkRm9udFBhcnQoc291cmNlRG9jdW1lbnQsIG5ld0RvY3VtZW50LCBmb250LCBQLmJvbGQpOworICAgICAgICAgICAgICAgICAgICBpZiAoZm9udC5FbGVtZW50KFAuaXRhbGljKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3SXRhbGljID0gQ3JlYXRlZEVtYmVkZGVkRm9udFBhcnQoc291cmNlRG9jdW1lbnQsIG5ld0RvY3VtZW50LCBmb250LCBQLml0YWxpYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb250LkVsZW1lbnQoUC5ib2xkSXRhbGljKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9sZEl0YWxpYyA9IENyZWF0ZWRFbWJlZGRlZEZvbnRQYXJ0KHNvdXJjZURvY3VtZW50LCBuZXdEb2N1bWVudCwgZm9udCwgUC5ib2xkSXRhbGljKTsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3RW1iZWRkZWRGb250ID0gbmV3IFhFbGVtZW50KFAuZW1iZWRkZWRGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9udC5FbGVtZW50cyhQLmZvbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVndWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb2xkSXRhbGljKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Rm9udExzdC5BZGQobmV3RW1iZWRkZWRGb250KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmV3UHJlc2VudGF0aW9uLlJvb3QuQWRkKG5ld0ZvbnRMc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXdQcmVzZW50YXRpb24uUm9vdC5BZGQob2xkUHJlc2VudGF0aW9uRG9jLlJvb3QuRWxlbWVudChQLmRlZmF1bHRUZXh0U3R5bGUpKTsKKyAgICAgICAgICAgIG5ld1ByZXNlbnRhdGlvbi5Sb290LkFkZChvbGRQcmVzZW50YXRpb25Eb2MuUm9vdC5FbGVtZW50cyhQLmV4dExzdCkpOworCisgICAgICAgICAgICAvLzxwOmVtYmVkZGVkRm9udCB4bWxuczpwPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcHJlc2VudGF0aW9ubWwvMjAwNi9tYWluIgorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6cj0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcyI+CisgICAgICAgICAgICAvLyAgPHA6Zm9udCB0eXBlZmFjZT0iUGVycGV0dWEiIHBhbm9zZT0iMDIwMjA1MDIwNjA0MDEwMjAzMDMiIHBpdGNoRmFtaWx5PSIxOCIgY2hhcnNldD0iMCIgLz4KKyAgICAgICAgICAgIC8vICA8cDpyZWd1bGFyIHI6aWQ9InJJZDUiIC8+CisgICAgICAgICAgICAvLyAgPHA6Ym9sZCByOmlkPSJySWQ2IiAvPgorICAgICAgICAgICAgLy8gIDxwOml0YWxpYyByOmlkPSJySWQ3IiAvPgorICAgICAgICAgICAgLy8gIDxwOmJvbGRJdGFsaWMgcjppZD0icklkOCIgLz4KKyAgICAgICAgICAgIC8vPC9wOmVtYmVkZGVkRm9udD4KKworICAgICAgICAgICAgLy8gQ29weSBIYW5kb3V0IE1hc3RlcgorICAgICAgICAgICAgaWYgKHNvdXJjZURvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuSGFuZG91dE1hc3RlclBhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBIYW5kb3V0TWFzdGVyUGFydCBvbGRNYXN0ZXIgPSBzb3VyY2VEb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0LkhhbmRvdXRNYXN0ZXJQYXJ0OworICAgICAgICAgICAgICAgIEhhbmRvdXRNYXN0ZXJQYXJ0IG5ld01hc3RlciA9IG5ld0RvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuQWRkTmV3UGFydDxIYW5kb3V0TWFzdGVyUGFydD4oKTsKKworICAgICAgICAgICAgICAgIC8vIENvcHkgdGhlbWUgZm9yIG1hc3RlcgorICAgICAgICAgICAgICAgIFRoZW1lUGFydCBuZXdUaGVtZVBhcnQgPSBuZXdNYXN0ZXIuQWRkTmV3UGFydDxUaGVtZVBhcnQ+KCk7CisgICAgICAgICAgICAgICAgbmV3VGhlbWVQYXJ0LlB1dFhEb2N1bWVudChvbGRNYXN0ZXIuVGhlbWVQYXJ0LkdldFhEb2N1bWVudCgpKTsKKyAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKG5ld0RvY3VtZW50LCBvbGRNYXN0ZXIuVGhlbWVQYXJ0LCBuZXdUaGVtZVBhcnQsIG5ld1tdIHsgbmV3VGhlbWVQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzLCBtZWRpYUxpc3QpOworCisgICAgICAgICAgICAgICAgLy8gQ29weSBtYXN0ZXIKKyAgICAgICAgICAgICAgICBuZXdNYXN0ZXIuUHV0WERvY3VtZW50KG9sZE1hc3Rlci5HZXRYRG9jdW1lbnQoKSk7CisgICAgICAgICAgICAgICAgQWRkUmVsYXRpb25zaGlwcyhvbGRNYXN0ZXIsIG5ld01hc3RlciwgbmV3W10geyBuZXdNYXN0ZXIuR2V0WERvY3VtZW50KCkuUm9vdCB9KTsKKyAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKG5ld0RvY3VtZW50LCBvbGRNYXN0ZXIsIG5ld01hc3RlciwgbmV3W10geyBuZXdNYXN0ZXIuR2V0WERvY3VtZW50KCkuUm9vdCB9LCBpbWFnZXMsIG1lZGlhTGlzdCk7CisKKyAgICAgICAgICAgICAgICBuZXdQcmVzZW50YXRpb24uUm9vdC5BZGQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChQLmhhbmRvdXRNYXN0ZXJJZExzdCwgbmV3IFhFbGVtZW50KFAuaGFuZG91dE1hc3RlcklkLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShSLmlkLCBuZXdEb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0LkdldElkT2ZQYXJ0KG5ld01hc3RlcikpKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDb3B5IE5vdGVzIE1hc3RlcgorICAgICAgICAgICAgQ29weU5vdGVzTWFzdGVyKHNvdXJjZURvY3VtZW50LCBuZXdEb2N1bWVudCwgaW1hZ2VzLCBtZWRpYUxpc3QpOworCisgICAgICAgICAgICAvLyBDb3B5IFByZXNlbnRhdGlvbiBQcm9wZXJ0aWVzCisgICAgICAgICAgICBpZiAoc291cmNlRG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5QcmVzZW50YXRpb25Qcm9wZXJ0aWVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFByZXNlbnRhdGlvblByb3BlcnRpZXNQYXJ0IG5ld1BhcnQgPSBuZXdEb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0LkFkZE5ld1BhcnQ8UHJlc2VudGF0aW9uUHJvcGVydGllc1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IHhkMSA9IHNvdXJjZURvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuUHJlc2VudGF0aW9uUHJvcGVydGllc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgeGQxLkRlc2NlbmRhbnRzKFAuY3VzdFNob3cpLlJlbW92ZSgpOworICAgICAgICAgICAgICAgIG5ld1BhcnQuUHV0WERvY3VtZW50KHhkMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENvcHkgVmlldyBQcm9wZXJ0aWVzCisgICAgICAgICAgICBpZiAoc291cmNlRG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5WaWV3UHJvcGVydGllc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWaWV3UHJvcGVydGllc1BhcnQgbmV3UGFydCA9IG5ld0RvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuQWRkTmV3UGFydDxWaWV3UHJvcGVydGllc1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IHhkID0gc291cmNlRG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5WaWV3UHJvcGVydGllc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgeGQuRGVzY2VuZGFudHMoUC5vdXRsaW5lVmlld1ByKS5FbGVtZW50cyhQLnNsZExzdCkuUmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgbmV3UGFydC5QdXRYRG9jdW1lbnQoeGQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgbGVnYWN5RG9jVGV4dEluZm8gaW4gc291cmNlRG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5QYXJ0cy5XaGVyZShwID0+IHAuT3BlblhtbFBhcnQuUmVsYXRpb25zaGlwVHlwZSA9PSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvMjAwNi9yZWxhdGlvbnNoaXBzL2xlZ2FjeURvY1RleHRJbmZvIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTGVnYWN5RGlhZ3JhbVRleHRJbmZvUGFydCBuZXdQYXJ0ID0gbmV3RG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5BZGROZXdQYXJ0PExlZ2FjeURpYWdyYW1UZXh0SW5mb1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgbmV3UGFydC5GZWVkRGF0YShsZWdhY3lEb2NUZXh0SW5mby5PcGVuWG1sUGFydC5HZXRTdHJlYW0oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBsaXN0T2ZSb290Q2hpbGRyZW4gPSBuZXdQcmVzZW50YXRpb24uUm9vdC5FbGVtZW50cygpLlRvTGlzdCgpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJjIGluIGxpc3RPZlJvb3RDaGlsZHJlbikKKyAgICAgICAgICAgICAgICByYy5SZW1vdmUoKTsKKyAgICAgICAgICAgIG5ld1ByZXNlbnRhdGlvbi5Sb290LkFkZCgKKyAgICAgICAgICAgICAgICBsaXN0T2ZSb290Q2hpbGRyZW4uT3JkZXJCeShlID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoT3JkZXJfcHJlc2VudGF0aW9uLkNvbnRhaW5zS2V5KGUuTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3JkZXJfcHJlc2VudGF0aW9uW2UuTmFtZV07CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA5OTk7CisgICAgICAgICAgICAgICAgfSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxYTmFtZSwgaW50PiBPcmRlcl9wcmVzZW50YXRpb24gPSBuZXcgRGljdGlvbmFyeTxYTmFtZSwgaW50PgorICAgICAgICB7CisgICAgICAgICAgICB7IFAuc2xkTWFzdGVySWRMc3QsIDEwIH0sCisgICAgICAgICAgICB7IFAubm90ZXNNYXN0ZXJJZExzdCwgMjAgfSwKKyAgICAgICAgICAgIHsgUC5oYW5kb3V0TWFzdGVySWRMc3QsIDMwIH0sCisgICAgICAgICAgICB7IFAuc2xkSWRMc3QsIDQwIH0sCisgICAgICAgICAgICB7IFAuc2xkU3osIDUwIH0sCisgICAgICAgICAgICB7IFAubm90ZXNTeiwgNjAgfSwKKyAgICAgICAgICAgIHsgUC5lbWJlZGRlZEZvbnRMc3QsIDcwIH0sCisgICAgICAgICAgICB7IFAuY3VzdFNob3dMc3QsIDgwIH0sCisgICAgICAgICAgICB7IFAucGhvdG9BbGJ1bSwgOTAgfSwKKyAgICAgICAgICAgIHsgUC5jdXN0RGF0YUxzdCwgMTAwIH0sCisgICAgICAgICAgICB7IFAua2luc29rdSwgMTIwIH0sCisgICAgICAgICAgICB7IFAuZGVmYXVsdFRleHRTdHlsZSwgMTMwIH0sCisgICAgICAgICAgICB7IFAubW9kaWZ5VmVyaWZpZXIsIDE1MCB9LAorICAgICAgICAgICAgeyBQLmV4dExzdCwgMTYwIH0sCisgICAgICAgIH07CisKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBDcmVhdGVkRW1iZWRkZWRGb250UGFydChQcmVzZW50YXRpb25Eb2N1bWVudCBzb3VyY2VEb2N1bWVudCwgUHJlc2VudGF0aW9uRG9jdW1lbnQgbmV3RG9jdW1lbnQsIFhFbGVtZW50IGZvbnQsIFhOYW1lIGZvbnRYTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgbmV3UmVndWxhcjsKKyAgICAgICAgICAgIEZvbnRQYXJ0IG9sZEZvbnRQYXJ0ID0gKEZvbnRQYXJ0KXNvdXJjZURvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuR2V0UGFydEJ5SWQoKHN0cmluZylmb250LkVsZW1lbnQoZm9udFhOYW1lKS5BdHRyaWJ1dGVzKFIuaWQpLkZpcnN0T3JEZWZhdWx0KCkpOworICAgICAgICAgICAgRm9udFBhcnRUeXBlIGZwdDsKKyAgICAgICAgICAgIGlmIChvbGRGb250UGFydC5Db250ZW50VHlwZSA9PSAiYXBwbGljYXRpb24veC1mb250ZGF0YSIpCisgICAgICAgICAgICAgICAgZnB0ID0gRm9udFBhcnRUeXBlLkZvbnREYXRhOworICAgICAgICAgICAgZWxzZSBpZiAob2xkRm9udFBhcnQuQ29udGVudFR5cGUgPT0gImFwcGxpY2F0aW9uL3gtZm9udC10dGYiKQorICAgICAgICAgICAgICAgIGZwdCA9IEZvbnRQYXJ0VHlwZS5Gb250VHRmOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZwdCA9IEZvbnRQYXJ0VHlwZS5Gb250T2R0dGY7CisgICAgICAgICAgICB2YXIgbmV3SWQgPSAiUiIgKyBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygpLlJlcGxhY2UoIi0iLCAiIikuU3Vic3RyaW5nKDAsIDE2KTsKKyAgICAgICAgICAgIHZhciBuZXdGb250UGFydCA9IG5ld0RvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuQWRkRm9udFBhcnQoZnB0LCBuZXdJZCk7CisgICAgICAgICAgICBuZXdGb250UGFydC5GZWVkRGF0YShvbGRGb250UGFydC5HZXRTdHJlYW0oKSk7CisgICAgICAgICAgICBuZXdSZWd1bGFyID0gbmV3IFhFbGVtZW50KGZvbnRYTmFtZSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShSLmlkLCBuZXdJZCkpOworICAgICAgICAgICAgcmV0dXJuIG5ld1JlZ3VsYXI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBTbGlkZU1hc3RlclBhcnQgQXBwZW5kU2xpZGVzKFByZXNlbnRhdGlvbkRvY3VtZW50IHNvdXJjZURvY3VtZW50LCBQcmVzZW50YXRpb25Eb2N1bWVudCBuZXdEb2N1bWVudCwKKyAgICAgICAgICAgIGludCBzdGFydCwgaW50IGNvdW50LCBib29sIGtlZXBNYXN0ZXIsIExpc3Q8SW1hZ2VEYXRhPiBpbWFnZXMsIFNsaWRlTWFzdGVyUGFydCBjdXJyZW50TWFzdGVyUGFydCwgTGlzdDxNZWRpYURhdGE+IG1lZGlhTGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IG5ld1ByZXNlbnRhdGlvbiA9IG5ld0RvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBpZiAobmV3UHJlc2VudGF0aW9uLlJvb3QuRWxlbWVudChQLnNsZElkTHN0KSA9PSBudWxsKQorICAgICAgICAgICAgICAgIG5ld1ByZXNlbnRhdGlvbi5Sb290LkFkZChuZXcgWEVsZW1lbnQoUC5zbGRJZExzdCkpOworICAgICAgICAgICAgdWludCBuZXdJRCA9IDI1NjsKKyAgICAgICAgICAgIHZhciBpZHMgPSBuZXdQcmVzZW50YXRpb24uUm9vdC5EZXNjZW5kYW50cyhQLnNsZElkKS5TZWxlY3QoZiA9PiAodWludClmLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5pZCkpOworICAgICAgICAgICAgaWYgKGlkcy5BbnkoKSkKKyAgICAgICAgICAgICAgICBuZXdJRCA9IGlkcy5NYXgoKSArIDE7CisgICAgICAgICAgICB2YXIgc2xpZGVMaXN0ID0gc291cmNlRG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5HZXRYRG9jdW1lbnQoKS5Sb290LkRlc2NlbmRhbnRzKFAuc2xkSWQpOworICAgICAgICAgICAgaWYgKHNsaWRlTGlzdC5Db3VudCgpID09IDAgJiYgKGN1cnJlbnRNYXN0ZXJQYXJ0ID09IG51bGwgfHwga2VlcE1hc3RlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNsaWRlTWFzdGVyUGFydCA9IHNvdXJjZURvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuU2xpZGVNYXN0ZXJQYXJ0cy5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmIChzbGlkZU1hc3RlclBhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudE1hc3RlclBhcnQgPSBDb3B5TWFzdGVyU2xpZGUoc291cmNlRG9jdW1lbnQsIHNsaWRlTWFzdGVyUGFydCwgbmV3RG9jdW1lbnQsIG5ld1ByZXNlbnRhdGlvbiwgaW1hZ2VzLCBtZWRpYUxpc3QpOworICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50TWFzdGVyUGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChjb3VudCA+IDAgJiYgc3RhcnQgPCBzbGlkZUxpc3QuQ291bnQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTbGlkZVBhcnQgc2xpZGUgPSAoU2xpZGVQYXJ0KXNvdXJjZURvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuR2V0UGFydEJ5SWQoc2xpZGVMaXN0LkVsZW1lbnRBdChzdGFydCkuQXR0cmlidXRlKFIuaWQpLlZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudE1hc3RlclBhcnQgPT0gbnVsbCB8fCBrZWVwTWFzdGVyKQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWFzdGVyUGFydCA9IENvcHlNYXN0ZXJTbGlkZShzb3VyY2VEb2N1bWVudCwgc2xpZGUuU2xpZGVMYXlvdXRQYXJ0LlNsaWRlTWFzdGVyUGFydCwgbmV3RG9jdW1lbnQsIG5ld1ByZXNlbnRhdGlvbiwgaW1hZ2VzLCBtZWRpYUxpc3QpOworICAgICAgICAgICAgICAgIFNsaWRlUGFydCBuZXdTbGlkZSA9IG5ld0RvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuQWRkTmV3UGFydDxTbGlkZVBhcnQ+KCk7CisgICAgICAgICAgICAgICAgbmV3U2xpZGUuUHV0WERvY3VtZW50KHNsaWRlLkdldFhEb2N1bWVudCgpKTsKKyAgICAgICAgICAgICAgICBBZGRSZWxhdGlvbnNoaXBzKHNsaWRlLCBuZXdTbGlkZSwgbmV3W10geyBuZXdTbGlkZS5HZXRYRG9jdW1lbnQoKS5Sb290IH0pOworICAgICAgICAgICAgICAgIENvcHlSZWxhdGVkUGFydHNGb3JDb250ZW50UGFydHMobmV3RG9jdW1lbnQsIHNsaWRlLCBuZXdTbGlkZSwgbmV3W10geyBuZXdTbGlkZS5HZXRYRG9jdW1lbnQoKS5Sb290IH0sIGltYWdlcywgbWVkaWFMaXN0KTsKKyAgICAgICAgICAgICAgICBDb3B5VGFibGVTdHlsZXMoc291cmNlRG9jdW1lbnQsIG5ld0RvY3VtZW50LCBzbGlkZSwgbmV3U2xpZGUpOworICAgICAgICAgICAgICAgIGlmIChzbGlkZS5Ob3Rlc1NsaWRlUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0RvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuTm90ZXNNYXN0ZXJQYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBDb3B5Tm90ZXNNYXN0ZXIoc291cmNlRG9jdW1lbnQsIG5ld0RvY3VtZW50LCBpbWFnZXMsIG1lZGlhTGlzdCk7CisgICAgICAgICAgICAgICAgICAgIE5vdGVzU2xpZGVQYXJ0IG5ld1BhcnQgPSBuZXdTbGlkZS5BZGROZXdQYXJ0PE5vdGVzU2xpZGVQYXJ0PigpOworICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0LlB1dFhEb2N1bWVudChzbGlkZS5Ob3Rlc1NsaWRlUGFydC5HZXRYRG9jdW1lbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQuQWRkUGFydChuZXdTbGlkZSk7CisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQuQWRkUGFydChuZXdEb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0Lk5vdGVzTWFzdGVyUGFydCk7CisgICAgICAgICAgICAgICAgICAgIEFkZFJlbGF0aW9uc2hpcHMoc2xpZGUuTm90ZXNTbGlkZVBhcnQsIG5ld1BhcnQsIG5ld1tdIHsgbmV3UGFydC5HZXRYRG9jdW1lbnQoKS5Sb290IH0pOworICAgICAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKG5ld0RvY3VtZW50LCBzbGlkZS5Ob3Rlc1NsaWRlUGFydCwgbmV3UGFydCwgbmV3W10geyBuZXdQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzLCBtZWRpYUxpc3QpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0cmluZyBsYXlvdXROYW1lID0gc2xpZGUuU2xpZGVMYXlvdXRQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QuRWxlbWVudChQLmNTbGQpLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5uYW1lKS5WYWx1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChTbGlkZUxheW91dFBhcnQgbGF5b3V0UGFydCBpbiBjdXJyZW50TWFzdGVyUGFydC5TbGlkZUxheW91dFBhcnRzKQorICAgICAgICAgICAgICAgICAgICBpZiAobGF5b3V0UGFydC5HZXRYRG9jdW1lbnQoKS5Sb290LkVsZW1lbnQoUC5jU2xkKS5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UubmFtZSkuVmFsdWUgPT0gbGF5b3V0TmFtZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2xpZGUuQWRkUGFydChsYXlvdXRQYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5ld1NsaWRlLlNsaWRlTGF5b3V0UGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBuZXdTbGlkZS5BZGRQYXJ0KGN1cnJlbnRNYXN0ZXJQYXJ0LlNsaWRlTGF5b3V0UGFydHMuRmlyc3QoKSk7ICAvLyBDYW5ub3QgZmluZCBtYXRjaGluZyBsYXlvdXQgcGFydAorCisgICAgICAgICAgICAgICAgaWYgKHNsaWRlLlNsaWRlQ29tbWVudHNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIENvcHlDb21tZW50cyhzb3VyY2VEb2N1bWVudCwgbmV3RG9jdW1lbnQsIHNsaWRlLCBuZXdTbGlkZSk7CisKKyAgICAgICAgICAgICAgICBuZXdQcmVzZW50YXRpb24uUm9vdC5FbGVtZW50KFAuc2xkSWRMc3QpLkFkZChuZXcgWEVsZW1lbnQoUC5zbGRJZCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaWQsIG5ld0lELlRvU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShSLmlkLCBuZXdEb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0LkdldElkT2ZQYXJ0KG5ld1NsaWRlKSkpKTsKKyAgICAgICAgICAgICAgICBuZXdJRCsrOworICAgICAgICAgICAgICAgIHN0YXJ0Kys7CisgICAgICAgICAgICAgICAgY291bnQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50TWFzdGVyUGFydDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFNsaWRlTWFzdGVyUGFydCBDb3B5TWFzdGVyU2xpZGUoUHJlc2VudGF0aW9uRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIFNsaWRlTWFzdGVyUGFydCBzb3VyY2VNYXN0ZXJQYXJ0LAorICAgICAgICAgICAgUHJlc2VudGF0aW9uRG9jdW1lbnQgbmV3RG9jdW1lbnQsIFhEb2N1bWVudCBuZXdQcmVzZW50YXRpb24sIExpc3Q8SW1hZ2VEYXRhPiBpbWFnZXMsIExpc3Q8TWVkaWFEYXRhPiBtZWRpYUxpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgZXhpc3RpbmcgbWFzdGVyIHNsaWRlIHdpdGggc2FtZSB0aGVtZSBuYW1lCisgICAgICAgICAgICBYRG9jdW1lbnQgb2xkVGhlbWUgPSBzb3VyY2VNYXN0ZXJQYXJ0LlRoZW1lUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyB0aGVtZU5hbWUgPSBvbGRUaGVtZS5Sb290LkF0dHJpYnV0ZShOb05hbWVzcGFjZS5uYW1lKS5WYWx1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFNsaWRlTWFzdGVyUGFydCBtYXN0ZXIgaW4gbmV3RG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5HZXRQYXJ0c09mVHlwZTxTbGlkZU1hc3RlclBhcnQ+KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IHRoZW1lRG9jID0gbWFzdGVyLlRoZW1lUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAodGhlbWVEb2MuUm9vdC5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UubmFtZSkuVmFsdWUgPT0gdGhlbWVOYW1lKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFzdGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTbGlkZU1hc3RlclBhcnQgbmV3TWFzdGVyID0gbmV3RG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5BZGROZXdQYXJ0PFNsaWRlTWFzdGVyUGFydD4oKTsKKyAgICAgICAgICAgIFhEb2N1bWVudCBzb3VyY2VNYXN0ZXIgPSBzb3VyY2VNYXN0ZXJQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICAvLyBBZGQgdG8gcHJlc2VudGF0aW9uIHNsaWRlIG1hc3RlciBsaXN0LCBuZWVkIG5ld0lEIGZvciBsYXlvdXQgSURzIGFsc28KKyAgICAgICAgICAgIHVpbnQgbmV3SUQgPSAyMTQ3NDgzNjQ4OworICAgICAgICAgICAgdmFyIGlkcyA9IG5ld1ByZXNlbnRhdGlvbi5Sb290LkRlc2NlbmRhbnRzKFAuc2xkTWFzdGVySWQpLlNlbGVjdChmID0+ICh1aW50KWYuQXR0cmlidXRlKE5vTmFtZXNwYWNlLmlkKSk7CisgICAgICAgICAgICBpZiAoaWRzLkFueSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ld0lEID0gaWRzLk1heCgpOworICAgICAgICAgICAgICAgIFhFbGVtZW50IG1heE1hc3RlciA9IG5ld1ByZXNlbnRhdGlvbi5Sb290LkRlc2NlbmRhbnRzKFAuc2xkTWFzdGVySWQpLldoZXJlKGYgPT4gKHVpbnQpZi5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaWQpID09IG5ld0lEKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIFNsaWRlTWFzdGVyUGFydCBtYXhNYXN0ZXJQYXJ0ID0gKFNsaWRlTWFzdGVyUGFydCluZXdEb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0LkdldFBhcnRCeUlkKG1heE1hc3Rlci5BdHRyaWJ1dGUoUi5pZCkuVmFsdWUpOworICAgICAgICAgICAgICAgIG5ld0lEICs9ICh1aW50KW1heE1hc3RlclBhcnQuR2V0WERvY3VtZW50KCkuUm9vdC5EZXNjZW5kYW50cyhQLnNsZExheW91dElkKS5Db3VudCgpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld1ByZXNlbnRhdGlvbi5Sb290LkVsZW1lbnQoUC5zbGRNYXN0ZXJJZExzdCkuQWRkKG5ldyBYRWxlbWVudChQLnNsZE1hc3RlcklkLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmlkLCBuZXdJRC5Ub1N0cmluZygpKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShSLmlkLCBuZXdEb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0LkdldElkT2ZQYXJ0KG5ld01hc3RlcikpKSk7CisgICAgICAgICAgICBuZXdJRCsrOworCisgICAgICAgICAgICBUaGVtZVBhcnQgbmV3VGhlbWVQYXJ0ID0gbmV3TWFzdGVyLkFkZE5ld1BhcnQ8VGhlbWVQYXJ0PigpOworICAgICAgICAgICAgaWYgKG5ld0RvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuVGhlbWVQYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgbmV3VGhlbWVQYXJ0ID0gbmV3RG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5BZGRQYXJ0KG5ld1RoZW1lUGFydCk7CisgICAgICAgICAgICBuZXdUaGVtZVBhcnQuUHV0WERvY3VtZW50KG9sZFRoZW1lKTsKKyAgICAgICAgICAgIENvcHlSZWxhdGVkUGFydHNGb3JDb250ZW50UGFydHMobmV3RG9jdW1lbnQsIHNvdXJjZU1hc3RlclBhcnQuVGhlbWVQYXJ0LCBuZXdUaGVtZVBhcnQsIG5ld1tdIHsgbmV3VGhlbWVQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzLCBtZWRpYUxpc3QpOworICAgICAgICAgICAgZm9yZWFjaCAoU2xpZGVMYXlvdXRQYXJ0IGxheW91dFBhcnQgaW4gc291cmNlTWFzdGVyUGFydC5TbGlkZUxheW91dFBhcnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNsaWRlTGF5b3V0UGFydCBuZXdMYXlvdXQgPSBuZXdNYXN0ZXIuQWRkTmV3UGFydDxTbGlkZUxheW91dFBhcnQ+KCk7CisgICAgICAgICAgICAgICAgbmV3TGF5b3V0LlB1dFhEb2N1bWVudChsYXlvdXRQYXJ0LkdldFhEb2N1bWVudCgpKTsKKyAgICAgICAgICAgICAgICBBZGRSZWxhdGlvbnNoaXBzKGxheW91dFBhcnQsIG5ld0xheW91dCwgbmV3W10geyBuZXdMYXlvdXQuR2V0WERvY3VtZW50KCkuUm9vdCB9KTsKKyAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKG5ld0RvY3VtZW50LCBsYXlvdXRQYXJ0LCBuZXdMYXlvdXQsIG5ld1tdIHsgbmV3TGF5b3V0LkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzLCBtZWRpYUxpc3QpOworICAgICAgICAgICAgICAgIG5ld0xheW91dC5BZGRQYXJ0KG5ld01hc3Rlcik7CisgICAgICAgICAgICAgICAgc3RyaW5nIHJlc0lEID0gc291cmNlTWFzdGVyUGFydC5HZXRJZE9mUGFydChsYXlvdXRQYXJ0KTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBlbnRyeSA9IHNvdXJjZU1hc3Rlci5Sb290LkRlc2NlbmRhbnRzKFAuc2xkTGF5b3V0SWQpLldoZXJlKGYgPT4gZi5BdHRyaWJ1dGUoUi5pZCkuVmFsdWUgPT0gcmVzSUQpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgZW50cnkuQXR0cmlidXRlKFIuaWQpLlNldFZhbHVlKG5ld01hc3Rlci5HZXRJZE9mUGFydChuZXdMYXlvdXQpKTsKKyAgICAgICAgICAgICAgICBlbnRyeS5TZXRBdHRyaWJ1dGVWYWx1ZShOb05hbWVzcGFjZS5pZCwgbmV3SUQuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgbmV3SUQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld01hc3Rlci5QdXRYRG9jdW1lbnQoc291cmNlTWFzdGVyKTsKKyAgICAgICAgICAgIEFkZFJlbGF0aW9uc2hpcHMoc291cmNlTWFzdGVyUGFydCwgbmV3TWFzdGVyLCBuZXdbXSB7IG5ld01hc3Rlci5HZXRYRG9jdW1lbnQoKS5Sb290IH0pOworICAgICAgICAgICAgQ29weVJlbGF0ZWRQYXJ0c0ZvckNvbnRlbnRQYXJ0cyhuZXdEb2N1bWVudCwgc291cmNlTWFzdGVyUGFydCwgbmV3TWFzdGVyLCBuZXdbXSB7IG5ld01hc3Rlci5HZXRYRG9jdW1lbnQoKS5Sb290IH0sIGltYWdlcywgbWVkaWFMaXN0KTsKKworICAgICAgICAgICAgcmV0dXJuIG5ld01hc3RlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcGllcyBub3RlcyBtYXN0ZXIgYW5kIG5vdGVzU3ogZWxlbWVudCBmcm9tIHByZXNlbnRhdGlvbgorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvcHlOb3Rlc01hc3RlcihQcmVzZW50YXRpb25Eb2N1bWVudCBzb3VyY2VEb2N1bWVudCwgUHJlc2VudGF0aW9uRG9jdW1lbnQgbmV3RG9jdW1lbnQsIExpc3Q8SW1hZ2VEYXRhPiBpbWFnZXMsIExpc3Q8TWVkaWFEYXRhPiBtZWRpYUxpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENvcHkgbm90ZXNTeiBlbGVtZW50IGZyb20gcHJlc2VudGF0aW9uCisgICAgICAgICAgICBYRG9jdW1lbnQgbmV3UHJlc2VudGF0aW9uID0gbmV3RG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFhEb2N1bWVudCBvbGRQcmVzZW50YXRpb25Eb2MgPSBzb3VyY2VEb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgWEVsZW1lbnQgb2xkRWxlbWVudCA9IG9sZFByZXNlbnRhdGlvbkRvYy5Sb290LkVsZW1lbnQoUC5ub3Rlc1N6KTsKKyAgICAgICAgICAgIG5ld1ByZXNlbnRhdGlvbi5Sb290LkVsZW1lbnQoUC5ub3Rlc1N6KS5SZXBsYWNlV2l0aChvbGRFbGVtZW50KTsKKworICAgICAgICAgICAgLy8gQ29weSBOb3RlcyBNYXN0ZXIKKyAgICAgICAgICAgIGlmIChzb3VyY2VEb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0Lk5vdGVzTWFzdGVyUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5vdGVzTWFzdGVyUGFydCBvbGRNYXN0ZXIgPSBzb3VyY2VEb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0Lk5vdGVzTWFzdGVyUGFydDsKKyAgICAgICAgICAgICAgICBOb3Rlc01hc3RlclBhcnQgbmV3TWFzdGVyID0gbmV3RG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5BZGROZXdQYXJ0PE5vdGVzTWFzdGVyUGFydD4oKTsKKworICAgICAgICAgICAgICAgIC8vIENvcHkgdGhlbWUgZm9yIG1hc3RlcgorICAgICAgICAgICAgICAgIGlmIChvbGRNYXN0ZXIuVGhlbWVQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUaGVtZVBhcnQgbmV3VGhlbWVQYXJ0ID0gbmV3TWFzdGVyLkFkZE5ld1BhcnQ8VGhlbWVQYXJ0PigpOworICAgICAgICAgICAgICAgICAgICBuZXdUaGVtZVBhcnQuUHV0WERvY3VtZW50KG9sZE1hc3Rlci5UaGVtZVBhcnQuR2V0WERvY3VtZW50KCkpOworICAgICAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKG5ld0RvY3VtZW50LCBvbGRNYXN0ZXIuVGhlbWVQYXJ0LCBuZXdUaGVtZVBhcnQsIG5ld1tdIHsgbmV3VGhlbWVQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzLCBtZWRpYUxpc3QpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENvcHkgbWFzdGVyCisgICAgICAgICAgICAgICAgbmV3TWFzdGVyLlB1dFhEb2N1bWVudChvbGRNYXN0ZXIuR2V0WERvY3VtZW50KCkpOworICAgICAgICAgICAgICAgIEFkZFJlbGF0aW9uc2hpcHMob2xkTWFzdGVyLCBuZXdNYXN0ZXIsIG5ld1tdIHsgbmV3TWFzdGVyLkdldFhEb2N1bWVudCgpLlJvb3QgfSk7CisgICAgICAgICAgICAgICAgQ29weVJlbGF0ZWRQYXJ0c0ZvckNvbnRlbnRQYXJ0cyhuZXdEb2N1bWVudCwgb2xkTWFzdGVyLCBuZXdNYXN0ZXIsIG5ld1tdIHsgbmV3TWFzdGVyLkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzLCBtZWRpYUxpc3QpOworCisgICAgICAgICAgICAgICAgbmV3UHJlc2VudGF0aW9uLlJvb3QuQWRkKAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUC5ub3Rlc01hc3RlcklkTHN0LCBuZXcgWEVsZW1lbnQoUC5ub3Rlc01hc3RlcklkLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShSLmlkLCBuZXdEb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0LkdldElkT2ZQYXJ0KG5ld01hc3RlcikpKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb3B5Q29tbWVudHMoUHJlc2VudGF0aW9uRG9jdW1lbnQgb2xkRG9jdW1lbnQsIFByZXNlbnRhdGlvbkRvY3VtZW50IG5ld0RvY3VtZW50LCBTbGlkZVBhcnQgb2xkU2xpZGUsIFNsaWRlUGFydCBuZXdTbGlkZSkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3U2xpZGUuQWRkTmV3UGFydDxTbGlkZUNvbW1lbnRzUGFydD4oKTsKKyAgICAgICAgICAgIG5ld1NsaWRlLlNsaWRlQ29tbWVudHNQYXJ0LlB1dFhEb2N1bWVudChvbGRTbGlkZS5TbGlkZUNvbW1lbnRzUGFydC5HZXRYRG9jdW1lbnQoKSk7CisgICAgICAgICAgICBYRG9jdW1lbnQgbmV3U2xpZGVDb21tZW50cyA9IG5ld1NsaWRlLlNsaWRlQ29tbWVudHNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgWERvY3VtZW50IG9sZEF1dGhvcnMgPSBvbGREb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0LkNvbW1lbnRBdXRob3JzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGNvbW1lbnQgaW4gbmV3U2xpZGVDb21tZW50cy5Sb290LkVsZW1lbnRzKFAuY20pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld0F1dGhvciA9IEZpbmRDb21tZW50c0F1dGhvcihuZXdEb2N1bWVudCwgY29tbWVudCwgb2xkQXV0aG9ycyk7CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGxhc3QgaW5kZXggdmFsdWUgZm9yIG5ldyBjb21tZW50CisgICAgICAgICAgICAgICAgY29tbWVudC5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYXV0aG9ySWQpLlNldFZhbHVlKG5ld0F1dGhvci5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaWQpLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB1aW50IGxhc3RJbmRleCA9IENvbnZlcnQuVG9VSW50MzIobmV3QXV0aG9yLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5sYXN0SWR4KS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgY29tbWVudC5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaWR4KS5TZXRWYWx1ZShsYXN0SW5kZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgbmV3QXV0aG9yLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5sYXN0SWR4KS5TZXRWYWx1ZShDb252ZXJ0LlRvU3RyaW5nKGxhc3RJbmRleCArIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEZpbmRDb21tZW50c0F1dGhvcihQcmVzZW50YXRpb25Eb2N1bWVudCBuZXdEb2N1bWVudCwgWEVsZW1lbnQgY29tbWVudCwgWERvY3VtZW50IG9sZEF1dGhvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IG9sZEF1dGhvciA9IG9sZEF1dGhvcnMuUm9vdC5FbGVtZW50cyhQLmNtQXV0aG9yKS5XaGVyZSgKKyAgICAgICAgICAgICAgICBmID0+IGYuQXR0cmlidXRlKE5vTmFtZXNwYWNlLmlkKS5WYWx1ZSA9PSBjb21tZW50LkF0dHJpYnV0ZShOb05hbWVzcGFjZS5hdXRob3JJZCkuVmFsdWUpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBYRWxlbWVudCBuZXdBdXRob3IgPSBudWxsOworICAgICAgICAgICAgaWYgKG5ld0RvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuQ29tbWVudEF1dGhvcnNQYXJ0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3RG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5BZGROZXdQYXJ0PENvbW1lbnRBdXRob3JzUGFydD4oKTsKKyAgICAgICAgICAgICAgICBuZXdEb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0LkNvbW1lbnRBdXRob3JzUGFydC5QdXRYRG9jdW1lbnQobmV3IFhEb2N1bWVudChuZXcgWEVsZW1lbnQoUC5jbUF1dGhvckxzdCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJhIiwgQS5hKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJyIiwgUi5yKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJwIiwgUC5wKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhEb2N1bWVudCBhdXRob3JzID0gbmV3RG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5Db21tZW50QXV0aG9yc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBuZXdBdXRob3IgPSBhdXRob3JzLlJvb3QuRWxlbWVudHMoUC5jbUF1dGhvcikuV2hlcmUoCisgICAgICAgICAgICAgICAgZiA9PiBmLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5pbml0aWFscykuVmFsdWUgPT0gb2xkQXV0aG9yLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5pbml0aWFscykuVmFsdWUpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAobmV3QXV0aG9yID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludCBuZXdJRCA9IDA7CisgICAgICAgICAgICAgICAgdmFyIGlkcyA9IGF1dGhvcnMuUm9vdC5EZXNjZW5kYW50cyhQLmNtQXV0aG9yKS5TZWxlY3QoZiA9PiAodWludClmLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5pZCkpOworICAgICAgICAgICAgICAgIGlmIChpZHMuQW55KCkpCisgICAgICAgICAgICAgICAgICAgIG5ld0lEID0gaWRzLk1heCgpICsgMTsKKworICAgICAgICAgICAgICAgIG5ld0F1dGhvciA9IG5ldyBYRWxlbWVudChQLmNtQXV0aG9yLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5pZCwgbmV3SUQuVG9TdHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLm5hbWUsIG9sZEF1dGhvci5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UubmFtZSkuVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5pbml0aWFscywgb2xkQXV0aG9yLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5pbml0aWFscykuVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5sYXN0SWR4LCAiMSIpLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5jbHJJZHgsIG5ld0lELlRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICBhdXRob3JzLlJvb3QuQWRkKG5ld0F1dGhvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXdBdXRob3I7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvcHlUYWJsZVN0eWxlcyhQcmVzZW50YXRpb25Eb2N1bWVudCBvbGREb2N1bWVudCwgUHJlc2VudGF0aW9uRG9jdW1lbnQgbmV3RG9jdW1lbnQsIE9wZW5YbWxQYXJ0IG9sZENvbnRlbnRQYXJ0LCBPcGVuWG1sUGFydCBuZXdDb250ZW50UGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgdGFibGUgaW4gbmV3Q29udGVudFBhcnQuR2V0WERvY3VtZW50KCkuRGVzY2VuZGFudHMoQS50YWJsZVN0eWxlSWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBzdHlsZUlkID0gdGFibGUuVmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHN0eWxlSWQpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8vIEZpbmQgb2xkIHN0eWxlCisgICAgICAgICAgICAgICAgaWYgKG9sZERvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuVGFibGVTdHlsZXNQYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBvbGRUYWJsZVN0eWxlcyA9IG9sZERvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuVGFibGVTdHlsZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIFhFbGVtZW50IG9sZFN0eWxlID0gb2xkVGFibGVTdHlsZXMuUm9vdC5FbGVtZW50cyhBLnRibFN0eWxlKS5XaGVyZShmID0+IGYuQXR0cmlidXRlKE5vTmFtZXNwYWNlLnN0eWxlSWQpLlZhbHVlID09IHN0eWxlSWQpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKG9sZFN0eWxlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBUYWJsZVN0eWxlc1BhcnQsIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgIFhEb2N1bWVudCB0YWJsZVN0eWxlcyA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKG5ld0RvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuVGFibGVTdHlsZXNQYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUYWJsZVN0eWxlc1BhcnQgbmV3U3R5bGVzUGFydCA9IG5ld0RvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuQWRkTmV3UGFydDxUYWJsZVN0eWxlc1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlU3R5bGVzID0gbmV3IFhEb2N1bWVudChuZXcgWEVsZW1lbnQoQS50YmxTdHlsZUxzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAiYSIsIEEuYSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5kZWYsIHN0eWxlSWQpKSk7CisgICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlc1BhcnQuUHV0WERvY3VtZW50KHRhYmxlU3R5bGVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0YWJsZVN0eWxlcyA9IG5ld0RvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuVGFibGVTdHlsZXNQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICAgICAgLy8gU2VhcmNoIG5ldyBUYWJsZVN0eWxlc1BhcnQgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIHRoZSBJRAorICAgICAgICAgICAgICAgIGlmICh0YWJsZVN0eWxlcy5Sb290LkVsZW1lbnRzKEEudGJsU3R5bGUpLldoZXJlKGYgPT4gZi5BdHRyaWJ1dGUoTm9OYW1lc3BhY2Uuc3R5bGVJZCkuVmFsdWUgPT0gc3R5bGVJZCkuRmlyc3RPckRlZmF1bHQoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8vIENvcHkgc3R5bGUgdG8gbmV3IHBhcnQKKyAgICAgICAgICAgICAgICB0YWJsZVN0eWxlcy5Sb290LkFkZChvbGRTdHlsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weVJlbGF0ZWRQYXJ0c0ZvckNvbnRlbnRQYXJ0cyhQcmVzZW50YXRpb25Eb2N1bWVudCBuZXdEb2N1bWVudCwgT3BlblhtbFBhcnQgb2xkQ29udGVudFBhcnQsIE9wZW5YbWxQYXJ0IG5ld0NvbnRlbnRQYXJ0LAorICAgICAgICAgICAgSUVudW1lcmFibGU8WEVsZW1lbnQ+IG5ld0NvbnRlbnQsIExpc3Q8SW1hZ2VEYXRhPiBpbWFnZXMsIExpc3Q8TWVkaWFEYXRhPiBtZWRpYUxpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZWxldmFudEVsZW1lbnRzID0gbmV3Q29udGVudC5EZXNjZW5kYW50c0FuZFNlbGYoKQorICAgICAgICAgICAgICAgIC5XaGVyZShkID0+IGQuTmFtZSA9PSBWTUwuaW1hZ2VkYXRhIHx8IGQuTmFtZSA9PSBWTUwuZmlsbCB8fCBkLk5hbWUgPT0gVk1MLnN0cm9rZSB8fCBkLk5hbWUgPT0gQS5ibGlwKQorICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGltYWdlUmVmZXJlbmNlIGluIHJlbGV2YW50RWxlbWVudHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29weVJlbGF0ZWRJbWFnZShvbGRDb250ZW50UGFydCwgbmV3Q29udGVudFBhcnQsIGltYWdlUmVmZXJlbmNlLCBSLmVtYmVkLCBpbWFnZXMpOworICAgICAgICAgICAgICAgIENvcHlSZWxhdGVkSW1hZ2Uob2xkQ29udGVudFBhcnQsIG5ld0NvbnRlbnRQYXJ0LCBpbWFnZVJlZmVyZW5jZSwgUi5waWN0LCBpbWFnZXMpOworICAgICAgICAgICAgICAgIENvcHlSZWxhdGVkSW1hZ2Uob2xkQ29udGVudFBhcnQsIG5ld0NvbnRlbnRQYXJ0LCBpbWFnZVJlZmVyZW5jZSwgUi5pZCwgaW1hZ2VzKTsKKyAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZEltYWdlKG9sZENvbnRlbnRQYXJ0LCBuZXdDb250ZW50UGFydCwgaW1hZ2VSZWZlcmVuY2UsIE8ucmVsaWQsIGltYWdlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlbGV2YW50RWxlbWVudHMgPSBuZXdDb250ZW50LkRlc2NlbmRhbnRzQW5kU2VsZigpCisgICAgICAgICAgICAgICAgLldoZXJlKGQgPT4gZC5OYW1lID09IEEudmlkZW9GaWxlIHx8IGQuTmFtZSA9PSBBLnF1aWNrVGltZUZpbGUpCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgaW1hZ2VSZWZlcmVuY2UgaW4gcmVsZXZhbnRFbGVtZW50cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZE1lZGlhKG9sZENvbnRlbnRQYXJ0LCBuZXdDb250ZW50UGFydCwgaW1hZ2VSZWZlcmVuY2UsIFIubGluaywgbWVkaWFMaXN0LCAidmlkZW8iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVsZXZhbnRFbGVtZW50cyA9IG5ld0NvbnRlbnQuRGVzY2VuZGFudHNBbmRTZWxmKCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBkLk5hbWUgPT0gUDE0Lm1lZGlhIHx8IGQuTmFtZSA9PSBQQVYuc3JjTWVkaWEpCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgaW1hZ2VSZWZlcmVuY2UgaW4gcmVsZXZhbnRFbGVtZW50cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZE1lZGlhKG9sZENvbnRlbnRQYXJ0LCBuZXdDb250ZW50UGFydCwgaW1hZ2VSZWZlcmVuY2UsIFIuZW1iZWQsIG1lZGlhTGlzdCwgIm1lZGlhIik7CisgICAgICAgICAgICAgICAgQ29weVJlbGF0ZWRNZWRpYUV4dGVybmFsUmVsYXRpb25zaGlwKG9sZENvbnRlbnRQYXJ0LCBuZXdDb250ZW50UGFydCwgaW1hZ2VSZWZlcmVuY2UsIFIubGluaywgIm1lZGlhIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGV4dGVuZGVkUmVmZXJlbmNlIGluIG5ld0NvbnRlbnQuRGVzY2VuZGFudHNBbmRTZWxmKEExNC5pbWdMYXllcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29weUV4dGVuZGVkUGFydChvbGRDb250ZW50UGFydCwgbmV3Q29udGVudFBhcnQsIGV4dGVuZGVkUmVmZXJlbmNlLCBSLmVtYmVkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgY29udGVudFBhcnRSZWZlcmVuY2UgaW4gbmV3Q29udGVudC5EZXNjZW5kYW50c0FuZFNlbGYoUC5jb250ZW50UGFydCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29weUlua1BhcnQob2xkQ29udGVudFBhcnQsIG5ld0NvbnRlbnRQYXJ0LCBjb250ZW50UGFydFJlZmVyZW5jZSwgUi5pZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGNvbnRlbnRQYXJ0UmVmZXJlbmNlIGluIG5ld0NvbnRlbnQuRGVzY2VuZGFudHNBbmRTZWxmKFAuY29udHJvbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29weUFjdGl2ZVhQYXJ0KG9sZENvbnRlbnRQYXJ0LCBuZXdDb250ZW50UGFydCwgY29udGVudFBhcnRSZWZlcmVuY2UsIFIuaWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBjb250ZW50UGFydFJlZmVyZW5jZSBpbiBuZXdDb250ZW50LkRlc2NlbmRhbnRzQW5kU2VsZihQbGVnYWN5LnRleHRkYXRhKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb3B5TGVnYWN5RGlhZ3JhbVRleHQob2xkQ29udGVudFBhcnQsIG5ld0NvbnRlbnRQYXJ0LCBjb250ZW50UGFydFJlZmVyZW5jZSwgImlkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGRpYWdyYW1SZWZlcmVuY2UgaW4gbmV3Q29udGVudC5EZXNjZW5kYW50c0FuZFNlbGYoKS5XaGVyZShkID0+IGQuTmFtZSA9PSBER00ucmVsSWRzIHx8IGQuTmFtZSA9PSBBLnJlbElkcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZG0gYXR0cmlidXRlCisgICAgICAgICAgICAgICAgc3RyaW5nIHJlbElkID0gZGlhZ3JhbVJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5kbSkuVmFsdWU7CisgICAgICAgICAgICAgICAgdmFyIHRlbXBQYXJ0SWRQYWlyID0gbmV3Q29udGVudFBhcnQuUGFydHMuRmlyc3RPckRlZmF1bHQocCA9PiBwLlJlbGF0aW9uc2hpcElkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcFBhcnRJZFBhaXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCB0ZW1wRXIgPSBuZXdDb250ZW50UGFydC5FeHRlcm5hbFJlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoZXIgPT4gZXIuSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wRXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBPcGVuWG1sUGFydCBvbGRQYXJ0ID0gb2xkQ29udGVudFBhcnQuR2V0UGFydEJ5SWQocmVsSWQpOworICAgICAgICAgICAgICAgIE9wZW5YbWxQYXJ0IG5ld1BhcnQgPSBuZXdDb250ZW50UGFydC5BZGROZXdQYXJ0PERpYWdyYW1EYXRhUGFydD4oKTsKKyAgICAgICAgICAgICAgICBuZXdQYXJ0LkdldFhEb2N1bWVudCgpLkFkZChvbGRQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QpOworICAgICAgICAgICAgICAgIGRpYWdyYW1SZWZlcmVuY2UuQXR0cmlidXRlKFIuZG0pLlZhbHVlID0gbmV3Q29udGVudFBhcnQuR2V0SWRPZlBhcnQobmV3UGFydCk7CisgICAgICAgICAgICAgICAgQWRkUmVsYXRpb25zaGlwcyhvbGRQYXJ0LCBuZXdQYXJ0LCBuZXdbXSB7IG5ld1BhcnQuR2V0WERvY3VtZW50KCkuUm9vdCB9KTsKKyAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKG5ld0RvY3VtZW50LCBvbGRQYXJ0LCBuZXdQYXJ0LCBuZXdbXSB7IG5ld1BhcnQuR2V0WERvY3VtZW50KCkuUm9vdCB9LCBpbWFnZXMsIG1lZGlhTGlzdCk7CisKKyAgICAgICAgICAgICAgICAvLyBsbyBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICByZWxJZCA9IGRpYWdyYW1SZWZlcmVuY2UuQXR0cmlidXRlKFIubG8pLlZhbHVlOworICAgICAgICAgICAgICAgIHZhciB0ZW1wUGFydElkUGFpcjIgPSBuZXdDb250ZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdChwID0+IHAuUmVsYXRpb25zaGlwSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wUGFydElkUGFpcjIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCB0ZW1wRXIyID0gbmV3Q29udGVudFBhcnQuRXh0ZXJuYWxSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KGVyID0+IGVyLklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcEVyMiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBvbGRQYXJ0ID0gb2xkQ29udGVudFBhcnQuR2V0UGFydEJ5SWQocmVsSWQpOworICAgICAgICAgICAgICAgIG5ld1BhcnQgPSBuZXdDb250ZW50UGFydC5BZGROZXdQYXJ0PERpYWdyYW1MYXlvdXREZWZpbml0aW9uUGFydD4oKTsKKyAgICAgICAgICAgICAgICBuZXdQYXJ0LkdldFhEb2N1bWVudCgpLkFkZChvbGRQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QpOworICAgICAgICAgICAgICAgIGRpYWdyYW1SZWZlcmVuY2UuQXR0cmlidXRlKFIubG8pLlZhbHVlID0gbmV3Q29udGVudFBhcnQuR2V0SWRPZlBhcnQobmV3UGFydCk7CisgICAgICAgICAgICAgICAgQWRkUmVsYXRpb25zaGlwcyhvbGRQYXJ0LCBuZXdQYXJ0LCBuZXdbXSB7IG5ld1BhcnQuR2V0WERvY3VtZW50KCkuUm9vdCB9KTsKKyAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKG5ld0RvY3VtZW50LCBvbGRQYXJ0LCBuZXdQYXJ0LCBuZXdbXSB7IG5ld1BhcnQuR2V0WERvY3VtZW50KCkuUm9vdCB9LCBpbWFnZXMsIG1lZGlhTGlzdCk7CisKKyAgICAgICAgICAgICAgICAvLyBxcyBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICByZWxJZCA9IGRpYWdyYW1SZWZlcmVuY2UuQXR0cmlidXRlKFIucXMpLlZhbHVlOworICAgICAgICAgICAgICAgIHZhciB0ZW1wUGFydElkUGFpcjMgPSBuZXdDb250ZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdChwID0+IHAuUmVsYXRpb25zaGlwSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wUGFydElkUGFpcjMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCB0ZW1wRXIzID0gbmV3Q29udGVudFBhcnQuRXh0ZXJuYWxSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KGVyID0+IGVyLklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcEVyMyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIG9sZFBhcnQgPSBvbGRDb250ZW50UGFydC5HZXRQYXJ0QnlJZChyZWxJZCk7CisgICAgICAgICAgICAgICAgbmV3UGFydCA9IG5ld0NvbnRlbnRQYXJ0LkFkZE5ld1BhcnQ8RGlhZ3JhbVN0eWxlUGFydD4oKTsKKyAgICAgICAgICAgICAgICBuZXdQYXJ0LkdldFhEb2N1bWVudCgpLkFkZChvbGRQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QpOworICAgICAgICAgICAgICAgIGRpYWdyYW1SZWZlcmVuY2UuQXR0cmlidXRlKFIucXMpLlZhbHVlID0gbmV3Q29udGVudFBhcnQuR2V0SWRPZlBhcnQobmV3UGFydCk7CisgICAgICAgICAgICAgICAgQWRkUmVsYXRpb25zaGlwcyhvbGRQYXJ0LCBuZXdQYXJ0LCBuZXdbXSB7IG5ld1BhcnQuR2V0WERvY3VtZW50KCkuUm9vdCB9KTsKKyAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKG5ld0RvY3VtZW50LCBvbGRQYXJ0LCBuZXdQYXJ0LCBuZXdbXSB7IG5ld1BhcnQuR2V0WERvY3VtZW50KCkuUm9vdCB9LCBpbWFnZXMsIG1lZGlhTGlzdCk7CisKKyAgICAgICAgICAgICAgICAvLyBjcyBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICByZWxJZCA9IGRpYWdyYW1SZWZlcmVuY2UuQXR0cmlidXRlKFIuY3MpLlZhbHVlOworICAgICAgICAgICAgICAgIHZhciB0ZW1wUGFydElkUGFpcjQgPSBuZXdDb250ZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdChwID0+IHAuUmVsYXRpb25zaGlwSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wUGFydElkUGFpcjQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCB0ZW1wRXI0ID0gbmV3Q29udGVudFBhcnQuRXh0ZXJuYWxSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KGVyID0+IGVyLklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcEVyNCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIG9sZFBhcnQgPSBvbGRDb250ZW50UGFydC5HZXRQYXJ0QnlJZChyZWxJZCk7CisgICAgICAgICAgICAgICAgbmV3UGFydCA9IG5ld0NvbnRlbnRQYXJ0LkFkZE5ld1BhcnQ8RGlhZ3JhbUNvbG9yc1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgbmV3UGFydC5HZXRYRG9jdW1lbnQoKS5BZGQob2xkUGFydC5HZXRYRG9jdW1lbnQoKS5Sb290KTsKKyAgICAgICAgICAgICAgICBkaWFncmFtUmVmZXJlbmNlLkF0dHJpYnV0ZShSLmNzKS5WYWx1ZSA9IG5ld0NvbnRlbnRQYXJ0LkdldElkT2ZQYXJ0KG5ld1BhcnQpOworICAgICAgICAgICAgICAgIEFkZFJlbGF0aW9uc2hpcHMob2xkUGFydCwgbmV3UGFydCwgbmV3W10geyBuZXdQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSk7CisgICAgICAgICAgICAgICAgQ29weVJlbGF0ZWRQYXJ0c0ZvckNvbnRlbnRQYXJ0cyhuZXdEb2N1bWVudCwgb2xkUGFydCwgbmV3UGFydCwgbmV3W10geyBuZXdQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzLCBtZWRpYUxpc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBvbGVSZWZlcmVuY2UgaW4gbmV3Q29udGVudC5EZXNjZW5kYW50c0FuZFNlbGYoKS5XaGVyZShkID0+IGQuTmFtZSA9PSBQLm9sZU9iaiB8fCBkLk5hbWUgPT0gUC5leHRlcm5hbERhdGEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IG9sZVJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5pZCkuVmFsdWU7CisKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBsb29rIHRvIHNlZSBpZiB0aGlzIHJlbElkIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIG5ldyBkb2N1bWVudC4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhvc2UgcGFydHMgdGhhdCBnZXQgcHJvY2Vzc2VkIHdpdGggYm90aCBvbGQgYW5kIG5ldyBpZHMsIHN1Y2ggYXMgdGhlIGNvbW1lbnRzCisgICAgICAgICAgICAgICAgLy8gcGFydC4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgcGFydHMgc3VjaCBhcyB0aGUgbWFpbiBkb2N1bWVudCBwYXJ0LCBidXQgdGhpcyBjb2RlIHdvbid0IG1hbGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgLy8gaW4gdGhhdCBjYXNlLgorICAgICAgICAgICAgICAgIHZhciB0ZW1wUGFydElkUGFpcjUgPSBuZXdDb250ZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdChwID0+IHAuUmVsYXRpb25zaGlwSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wUGFydElkUGFpcjUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCB0ZW1wRXI1ID0gbmV3Q29udGVudFBhcnQuRXh0ZXJuYWxSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KGVyID0+IGVyLklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcEVyNSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIHZhciBvbGRQYXJ0SWRQYWlyID0gb2xkQ29udGVudFBhcnQuUGFydHMuRmlyc3RPckRlZmF1bHQocCA9PiBwLlJlbGF0aW9uc2hpcElkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAob2xkUGFydElkUGFpciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT3BlblhtbFBhcnQgb2xkUGFydCA9IG9sZFBhcnRJZFBhaXIuT3BlblhtbFBhcnQ7CisgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxQYXJ0IG5ld1BhcnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkUGFydCBpcyBFbWJlZGRlZE9iamVjdFBhcnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBEaWFsb2dzaGVldFBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoRGlhbG9nc2hlZXRQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFbWJlZGRlZE9iamVjdFBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBIYW5kb3V0TWFzdGVyUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChIYW5kb3V0TWFzdGVyUGFydCluZXdDb250ZW50UGFydCkuQWRkRW1iZWRkZWRPYmplY3RQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgTm90ZXNNYXN0ZXJQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKE5vdGVzTWFzdGVyUGFydCluZXdDb250ZW50UGFydCkuQWRkRW1iZWRkZWRPYmplY3RQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgTm90ZXNTbGlkZVBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoTm90ZXNTbGlkZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEVtYmVkZGVkT2JqZWN0UGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFNsaWRlTGF5b3V0UGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChTbGlkZUxheW91dFBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEVtYmVkZGVkT2JqZWN0UGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFNsaWRlTWFzdGVyUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChTbGlkZU1hc3RlclBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEVtYmVkZGVkT2JqZWN0UGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFNsaWRlUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChTbGlkZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEVtYmVkZGVkT2JqZWN0UGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvbGRQYXJ0IGlzIEVtYmVkZGVkUGFja2FnZVBhcnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBDaGFydFBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoQ2hhcnRQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFbWJlZGRlZFBhY2thZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgSGFuZG91dE1hc3RlclBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoSGFuZG91dE1hc3RlclBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEVtYmVkZGVkUGFja2FnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBOb3Rlc01hc3RlclBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoTm90ZXNNYXN0ZXJQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFbWJlZGRlZFBhY2thZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgTm90ZXNTbGlkZVBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoTm90ZXNTbGlkZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEVtYmVkZGVkUGFja2FnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBTbGlkZUxheW91dFBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoU2xpZGVMYXlvdXRQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFbWJlZGRlZFBhY2thZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgU2xpZGVNYXN0ZXJQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFNsaWRlTWFzdGVyUGFydCluZXdDb250ZW50UGFydCkuQWRkRW1iZWRkZWRQYWNrYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFNsaWRlUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChTbGlkZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEVtYmVkZGVkUGFja2FnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBvbGRPYmplY3QgPSBvbGRQYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWQpKQorICAgICAgICAgICAgICAgICAgICB1c2luZyAoU3RyZWFtIG5ld09iamVjdCA9IG5ld1BhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5SZWFkV3JpdGUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzY1NTM2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYnl0ZUNvdW50ID0gb2xkT2JqZWN0LlJlYWQoYnVmZmVyLCAwLCA2NTUzNikpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2JqZWN0LldyaXRlKGJ1ZmZlciwgMCwgYnl0ZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvbGVSZWZlcmVuY2UuQXR0cmlidXRlKFIuaWQpLlZhbHVlID0gbmV3Q29udGVudFBhcnQuR2V0SWRPZlBhcnQobmV3UGFydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsUmVsYXRpb25zaGlwIGVyID0gb2xkQ29udGVudFBhcnQuR2V0RXh0ZXJuYWxSZWxhdGlvbnNoaXAocmVsSWQpOworICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCBuZXdFciA9IG5ld0NvbnRlbnRQYXJ0LkFkZEV4dGVybmFsUmVsYXRpb25zaGlwKGVyLlJlbGF0aW9uc2hpcFR5cGUsIGVyLlVyaSk7CisgICAgICAgICAgICAgICAgICAgIG9sZVJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5pZCkuVmFsdWUgPSBuZXdFci5JZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGNoYXJ0UmVmZXJlbmNlIGluIG5ld0NvbnRlbnQuRGVzY2VuZGFudHNBbmRTZWxmKEMuY2hhcnQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IChzdHJpbmcpY2hhcnRSZWZlcmVuY2UuQXR0cmlidXRlKFIuaWQpOworICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShyZWxJZCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgdmFyIHRlbXBQYXJ0SWRQYWlyNiA9IG5ld0NvbnRlbnRQYXJ0LlBhcnRzLkZpcnN0T3JEZWZhdWx0KHAgPT4gcC5SZWxhdGlvbnNoaXBJZCA9PSByZWxJZCk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBQYXJ0SWRQYWlyNiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIEV4dGVybmFsUmVsYXRpb25zaGlwIHRlbXBFcjYgPSBuZXdDb250ZW50UGFydC5FeHRlcm5hbFJlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoZXIgPT4gZXIuSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wRXI2ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgdmFyIG9sZFBhcnRJZFBhaXIyID0gb2xkQ29udGVudFBhcnQuUGFydHMuRmlyc3RPckRlZmF1bHQocCA9PiBwLlJlbGF0aW9uc2hpcElkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAob2xkUGFydElkUGFpcjIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENoYXJ0UGFydCBvbGRQYXJ0ID0gb2xkUGFydElkUGFpcjIuT3BlblhtbFBhcnQgYXMgQ2hhcnRQYXJ0OworICAgICAgICAgICAgICAgICAgICBpZiAob2xkUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgb2xkQ2hhcnQgPSBvbGRQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRQYXJ0IG5ld1BhcnQgPSBuZXdDb250ZW50UGFydC5BZGROZXdQYXJ0PENoYXJ0UGFydD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhEb2N1bWVudCBuZXdDaGFydCA9IG5ld1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDaGFydC5BZGQob2xkQ2hhcnQuUm9vdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5pZCkuVmFsdWUgPSBuZXdDb250ZW50UGFydC5HZXRJZE9mUGFydChuZXdQYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvcHlDaGFydE9iamVjdHMob2xkUGFydCwgbmV3UGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKG5ld0RvY3VtZW50LCBvbGRQYXJ0LCBuZXdQYXJ0LCBuZXdbXSB7IG5ld0NoYXJ0LlJvb3QgfSwgaW1hZ2VzLCBtZWRpYUxpc3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCB1c2VyU2hhcGUgaW4gbmV3Q29udGVudC5EZXNjZW5kYW50c0FuZFNlbGYoQy51c2VyU2hhcGVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcmVsSWQgPSAoc3RyaW5nKXVzZXJTaGFwZS5BdHRyaWJ1dGUoUi5pZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHJlbElkKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICB2YXIgdGVtcFBhcnRJZFBhaXI3ID0gbmV3Q29udGVudFBhcnQuUGFydHMuRmlyc3RPckRlZmF1bHQocCA9PiBwLlJlbGF0aW9uc2hpcElkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcFBhcnRJZFBhaXI3ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgRXh0ZXJuYWxSZWxhdGlvbnNoaXAgdGVtcEVyNyA9IG5ld0NvbnRlbnRQYXJ0LkV4dGVybmFsUmVsYXRpb25zaGlwcy5GaXJzdE9yRGVmYXVsdChlciA9PiBlci5JZCA9PSByZWxJZCk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBFcjcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICB2YXIgb2xkUGFydElkUGFpcjMgPSBvbGRDb250ZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdChwID0+IHAuUmVsYXRpb25zaGlwSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmIChvbGRQYXJ0SWRQYWlyMyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcnREcmF3aW5nUGFydCBvbGRQYXJ0ID0gb2xkUGFydElkUGFpcjMuT3BlblhtbFBhcnQgYXMgQ2hhcnREcmF3aW5nUGFydDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFBhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWERvY3VtZW50IG9sZFhEb2MgPSBvbGRQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnREcmF3aW5nUGFydCBuZXdQYXJ0ID0gbmV3Q29udGVudFBhcnQuQWRkTmV3UGFydDxDaGFydERyYXdpbmdQYXJ0PigpOworICAgICAgICAgICAgICAgICAgICAgICAgWERvY3VtZW50IG5ld1hEb2MgPSBuZXdQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3WERvYy5BZGQob2xkWERvYy5Sb290KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJTaGFwZS5BdHRyaWJ1dGUoUi5pZCkuVmFsdWUgPSBuZXdDb250ZW50UGFydC5HZXRJZE9mUGFydChuZXdQYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZFJlbGF0aW9uc2hpcHMob2xkUGFydCwgbmV3UGFydCwgbmV3Q29udGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb3B5UmVsYXRlZFBhcnRzRm9yQ29udGVudFBhcnRzKG5ld0RvY3VtZW50LCBvbGRQYXJ0LCBuZXdQYXJ0LCBuZXdbXSB7IG5ld1hEb2MuUm9vdCB9LCBpbWFnZXMsIG1lZGlhTGlzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IHRhZ3MgaW4gbmV3Q29udGVudC5EZXNjZW5kYW50c0FuZFNlbGYoUC50YWdzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcmVsSWQgPSAoc3RyaW5nKXRhZ3MuQXR0cmlidXRlKFIuaWQpOworICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShyZWxJZCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgdmFyIHRlbXBQYXJ0SWRQYWlyOCA9IG5ld0NvbnRlbnRQYXJ0LlBhcnRzLkZpcnN0T3JEZWZhdWx0KHAgPT4gcC5SZWxhdGlvbnNoaXBJZCA9PSByZWxJZCk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBQYXJ0SWRQYWlyOCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIEV4dGVybmFsUmVsYXRpb25zaGlwIHRlbXBFcjggPSBuZXdDb250ZW50UGFydC5FeHRlcm5hbFJlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoZXIgPT4gZXIuSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wRXI4ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgdmFyIG9sZFBhcnRJZFBhaXI0ID0gb2xkQ29udGVudFBhcnQuUGFydHMuRmlyc3RPckRlZmF1bHQocCA9PiBwLlJlbGF0aW9uc2hpcElkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAob2xkUGFydElkUGFpcjQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVzZXJEZWZpbmVkVGFnc1BhcnQgb2xkUGFydCA9IG9sZFBhcnRJZFBhaXI0Lk9wZW5YbWxQYXJ0IGFzIFVzZXJEZWZpbmVkVGFnc1BhcnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbGRQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhEb2N1bWVudCBvbGRYRG9jID0gb2xkUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEZWZpbmVkVGFnc1BhcnQgbmV3UGFydCA9IG5ld0NvbnRlbnRQYXJ0LkFkZE5ld1BhcnQ8VXNlckRlZmluZWRUYWdzUGFydD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhEb2N1bWVudCBuZXdYRG9jID0gbmV3UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1hEb2MuQWRkKG9sZFhEb2MuUm9vdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0YWdzLkF0dHJpYnV0ZShSLmlkKS5WYWx1ZSA9IG5ld0NvbnRlbnRQYXJ0LkdldElkT2ZQYXJ0KG5ld1BhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBjdXN0RGF0YSBpbiBuZXdDb250ZW50LkRlc2NlbmRhbnRzQW5kU2VsZihQLmN1c3REYXRhKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcmVsSWQgPSAoc3RyaW5nKWN1c3REYXRhLkF0dHJpYnV0ZShSLmlkKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkocmVsSWQpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIHZhciB0ZW1wUGFydElkUGFpcjkgPSBuZXdDb250ZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdChwID0+IHAuUmVsYXRpb25zaGlwSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wUGFydElkUGFpcjkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICB2YXIgb2xkUGFydElkUGFpcjkgPSBvbGRDb250ZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdChwID0+IHAuUmVsYXRpb25zaGlwSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmIChvbGRQYXJ0SWRQYWlyOSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3VzdG9tWG1sUGFydCBuZXdQYXJ0ID0gbmV3RG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5BZGRDdXN0b21YbWxQYXJ0KEN1c3RvbVhtbFBhcnRUeXBlLkN1c3RvbVhtbCk7CisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQuRmVlZERhdGEob2xkUGFydElkUGFpcjkuT3BlblhtbFBhcnQuR2V0U3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbVByb3BzIGluIG9sZFBhcnRJZFBhaXI5Lk9wZW5YbWxQYXJ0LlBhcnRzLldoZXJlKHAgPT4gcC5PcGVuWG1sUGFydC5Db250ZW50VHlwZSA9PSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmN1c3RvbVhtbFByb3BlcnRpZXMreG1sIikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdJZDIgPSAiUiIgKyBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygpLlJlcGxhY2UoIi0iLCAiIikuU3Vic3RyaW5nKDAsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbVhtbFByb3BlcnRpZXNQYXJ0IGN4cHAgPSBuZXdQYXJ0LkFkZE5ld1BhcnQ8Q3VzdG9tWG1sUHJvcGVydGllc1BhcnQ+KCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuY3VzdG9tWG1sUHJvcGVydGllcyt4bWwiLCBuZXdJZDIpOworICAgICAgICAgICAgICAgICAgICAgICAgY3hwcC5GZWVkRGF0YShpdGVtUHJvcHMuT3BlblhtbFBhcnQuR2V0U3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdJZCA9ICJSIiArIEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCkuUmVwbGFjZSgiLSIsICIiKS5TdWJzdHJpbmcoMCwgMTYpOworICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50UGFydC5DcmVhdGVSZWxhdGlvbnNoaXBUb1BhcnQobmV3UGFydCwgbmV3SWQpOworICAgICAgICAgICAgICAgICAgICBjdXN0RGF0YS5BdHRyaWJ1dGUoUi5pZCkuVmFsdWUgPSBuZXdJZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IHNvdW5kUmVmZXJlbmNlIGluIG5ld0NvbnRlbnQuRGVzY2VuZGFudHNBbmRTZWxmKCkuV2hlcmUoZCA9PiBkLk5hbWUgPT0gQS5hdWRpb0ZpbGUpKQorICAgICAgICAgICAgICAgIENvcHlSZWxhdGVkU291bmQobmV3RG9jdW1lbnQsIG9sZENvbnRlbnRQYXJ0LCBuZXdDb250ZW50UGFydCwgc291bmRSZWZlcmVuY2UsIFIubGluayk7CisKKyAgICAgICAgICAgIGlmICgob2xkQ29udGVudFBhcnQgaXMgQ2hhcnRzaGVldFBhcnQgJiYgbmV3Q29udGVudFBhcnQgaXMgQ2hhcnRzaGVldFBhcnQpIHx8CisgICAgICAgICAgICAgICAgKG9sZENvbnRlbnRQYXJ0IGlzIERpYWxvZ3NoZWV0UGFydCAmJiBuZXdDb250ZW50UGFydCBpcyBEaWFsb2dzaGVldFBhcnQpIHx8CisgICAgICAgICAgICAgICAgKG9sZENvbnRlbnRQYXJ0IGlzIEhhbmRvdXRNYXN0ZXJQYXJ0ICYmIG5ld0NvbnRlbnRQYXJ0IGlzIEhhbmRvdXRNYXN0ZXJQYXJ0KSB8fAorICAgICAgICAgICAgICAgIChvbGRDb250ZW50UGFydCBpcyBJbnRlcm5hdGlvbmFsTWFjcm9TaGVldFBhcnQgJiYgbmV3Q29udGVudFBhcnQgaXMgSW50ZXJuYXRpb25hbE1hY3JvU2hlZXRQYXJ0KSB8fAorICAgICAgICAgICAgICAgIChvbGRDb250ZW50UGFydCBpcyBNYWNyb1NoZWV0UGFydCAmJiBuZXdDb250ZW50UGFydCBpcyBNYWNyb1NoZWV0UGFydCkgfHwKKyAgICAgICAgICAgICAgICAob2xkQ29udGVudFBhcnQgaXMgTm90ZXNNYXN0ZXJQYXJ0ICYmIG5ld0NvbnRlbnRQYXJ0IGlzIE5vdGVzTWFzdGVyUGFydCkgfHwKKyAgICAgICAgICAgICAgICAob2xkQ29udGVudFBhcnQgaXMgTm90ZXNTbGlkZVBhcnQgJiYgbmV3Q29udGVudFBhcnQgaXMgTm90ZXNTbGlkZVBhcnQpIHx8CisgICAgICAgICAgICAgICAgKG9sZENvbnRlbnRQYXJ0IGlzIFNsaWRlTGF5b3V0UGFydCAmJiBuZXdDb250ZW50UGFydCBpcyBTbGlkZUxheW91dFBhcnQpIHx8CisgICAgICAgICAgICAgICAgKG9sZENvbnRlbnRQYXJ0IGlzIFNsaWRlTWFzdGVyUGFydCAmJiBuZXdDb250ZW50UGFydCBpcyBTbGlkZU1hc3RlclBhcnQpIHx8CisgICAgICAgICAgICAgICAgKG9sZENvbnRlbnRQYXJ0IGlzIFNsaWRlUGFydCAmJiBuZXdDb250ZW50UGFydCBpcyBTbGlkZVBhcnQpIHx8CisgICAgICAgICAgICAgICAgKG9sZENvbnRlbnRQYXJ0IGlzIFdvcmtzaGVldFBhcnQgJiYgbmV3Q29udGVudFBhcnQgaXMgV29ya3NoZWV0UGFydCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgc291bmRSZWZlcmVuY2UgaW4gbmV3Q29udGVudC5EZXNjZW5kYW50c0FuZFNlbGYoKS5XaGVyZShkID0+IGQuTmFtZSA9PSBQLnNuZCB8fCBkLk5hbWUgPT0gUC5zbmRUZ3QgfHwgZC5OYW1lID09IEEud2F2QXVkaW9GaWxlIHx8IGQuTmFtZSA9PSBBLnNuZCB8fCBkLk5hbWUgPT0gUEFWLnNyY01lZGlhKSkKKyAgICAgICAgICAgICAgICAgICAgQ29weVJlbGF0ZWRTb3VuZChuZXdEb2N1bWVudCwgb2xkQ29udGVudFBhcnQsIG5ld0NvbnRlbnRQYXJ0LCBzb3VuZFJlZmVyZW5jZSwgUi5lbWJlZCk7CisKKyAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTxWbWxEcmF3aW5nUGFydD4gdm1sRHJhd2luZ1BhcnRzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAob2xkQ29udGVudFBhcnQgaXMgQ2hhcnRzaGVldFBhcnQpCisgICAgICAgICAgICAgICAgICAgIHZtbERyYXdpbmdQYXJ0cyA9ICgoQ2hhcnRzaGVldFBhcnQpb2xkQ29udGVudFBhcnQpLlZtbERyYXdpbmdQYXJ0czsKKyAgICAgICAgICAgICAgICBpZiAob2xkQ29udGVudFBhcnQgaXMgRGlhbG9nc2hlZXRQYXJ0KQorICAgICAgICAgICAgICAgICAgICB2bWxEcmF3aW5nUGFydHMgPSAoKERpYWxvZ3NoZWV0UGFydClvbGRDb250ZW50UGFydCkuVm1sRHJhd2luZ1BhcnRzOworICAgICAgICAgICAgICAgIGlmIChvbGRDb250ZW50UGFydCBpcyBIYW5kb3V0TWFzdGVyUGFydCkKKyAgICAgICAgICAgICAgICAgICAgdm1sRHJhd2luZ1BhcnRzID0gKChIYW5kb3V0TWFzdGVyUGFydClvbGRDb250ZW50UGFydCkuVm1sRHJhd2luZ1BhcnRzOworICAgICAgICAgICAgICAgIGlmIChvbGRDb250ZW50UGFydCBpcyBJbnRlcm5hdGlvbmFsTWFjcm9TaGVldFBhcnQpCisgICAgICAgICAgICAgICAgICAgIHZtbERyYXdpbmdQYXJ0cyA9ICgoSW50ZXJuYXRpb25hbE1hY3JvU2hlZXRQYXJ0KW9sZENvbnRlbnRQYXJ0KS5WbWxEcmF3aW5nUGFydHM7CisgICAgICAgICAgICAgICAgaWYgKG9sZENvbnRlbnRQYXJ0IGlzIE1hY3JvU2hlZXRQYXJ0KQorICAgICAgICAgICAgICAgICAgICB2bWxEcmF3aW5nUGFydHMgPSAoKE1hY3JvU2hlZXRQYXJ0KW9sZENvbnRlbnRQYXJ0KS5WbWxEcmF3aW5nUGFydHM7CisgICAgICAgICAgICAgICAgaWYgKG9sZENvbnRlbnRQYXJ0IGlzIE5vdGVzTWFzdGVyUGFydCkKKyAgICAgICAgICAgICAgICAgICAgdm1sRHJhd2luZ1BhcnRzID0gKChOb3Rlc01hc3RlclBhcnQpb2xkQ29udGVudFBhcnQpLlZtbERyYXdpbmdQYXJ0czsKKyAgICAgICAgICAgICAgICBpZiAob2xkQ29udGVudFBhcnQgaXMgTm90ZXNTbGlkZVBhcnQpCisgICAgICAgICAgICAgICAgICAgIHZtbERyYXdpbmdQYXJ0cyA9ICgoTm90ZXNTbGlkZVBhcnQpb2xkQ29udGVudFBhcnQpLlZtbERyYXdpbmdQYXJ0czsKKyAgICAgICAgICAgICAgICBpZiAob2xkQ29udGVudFBhcnQgaXMgU2xpZGVMYXlvdXRQYXJ0KQorICAgICAgICAgICAgICAgICAgICB2bWxEcmF3aW5nUGFydHMgPSAoKFNsaWRlTGF5b3V0UGFydClvbGRDb250ZW50UGFydCkuVm1sRHJhd2luZ1BhcnRzOworICAgICAgICAgICAgICAgIGlmIChvbGRDb250ZW50UGFydCBpcyBTbGlkZU1hc3RlclBhcnQpCisgICAgICAgICAgICAgICAgICAgIHZtbERyYXdpbmdQYXJ0cyA9ICgoU2xpZGVNYXN0ZXJQYXJ0KW9sZENvbnRlbnRQYXJ0KS5WbWxEcmF3aW5nUGFydHM7CisgICAgICAgICAgICAgICAgaWYgKG9sZENvbnRlbnRQYXJ0IGlzIFNsaWRlUGFydCkKKyAgICAgICAgICAgICAgICAgICAgdm1sRHJhd2luZ1BhcnRzID0gKChTbGlkZVBhcnQpb2xkQ29udGVudFBhcnQpLlZtbERyYXdpbmdQYXJ0czsKKyAgICAgICAgICAgICAgICBpZiAob2xkQ29udGVudFBhcnQgaXMgV29ya3NoZWV0UGFydCkKKyAgICAgICAgICAgICAgICAgICAgdm1sRHJhd2luZ1BhcnRzID0gKChXb3Jrc2hlZXRQYXJ0KW9sZENvbnRlbnRQYXJ0KS5WbWxEcmF3aW5nUGFydHM7CisKKyAgICAgICAgICAgICAgICBpZiAodm1sRHJhd2luZ1BhcnRzICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2l0aW9uYWw6IENvcHkgVk1MIERyYXdpbmcgcGFydHMsIGltcGxpY2l0IHJlbGF0aW9uc2hpcAorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChWbWxEcmF3aW5nUGFydCB2bWxQYXJ0IGluIHZtbERyYXdpbmdQYXJ0cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVm1sRHJhd2luZ1BhcnQgbmV3Vm1sUGFydCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgQ2hhcnRzaGVldFBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Vm1sUGFydCA9ICgoQ2hhcnRzaGVldFBhcnQpbmV3Q29udGVudFBhcnQpLkFkZE5ld1BhcnQ8Vm1sRHJhd2luZ1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgRGlhbG9nc2hlZXRQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZtbFBhcnQgPSAoKERpYWxvZ3NoZWV0UGFydCluZXdDb250ZW50UGFydCkuQWRkTmV3UGFydDxWbWxEcmF3aW5nUGFydD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBIYW5kb3V0TWFzdGVyUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWbWxQYXJ0ID0gKChIYW5kb3V0TWFzdGVyUGFydCluZXdDb250ZW50UGFydCkuQWRkTmV3UGFydDxWbWxEcmF3aW5nUGFydD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBJbnRlcm5hdGlvbmFsTWFjcm9TaGVldFBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Vm1sUGFydCA9ICgoSW50ZXJuYXRpb25hbE1hY3JvU2hlZXRQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGROZXdQYXJ0PFZtbERyYXdpbmdQYXJ0PigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIE1hY3JvU2hlZXRQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZtbFBhcnQgPSAoKE1hY3JvU2hlZXRQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGROZXdQYXJ0PFZtbERyYXdpbmdQYXJ0PigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIE5vdGVzTWFzdGVyUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWbWxQYXJ0ID0gKChOb3Rlc01hc3RlclBhcnQpbmV3Q29udGVudFBhcnQpLkFkZE5ld1BhcnQ8Vm1sRHJhd2luZ1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgTm90ZXNTbGlkZVBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Vm1sUGFydCA9ICgoTm90ZXNTbGlkZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZE5ld1BhcnQ8Vm1sRHJhd2luZ1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgU2xpZGVMYXlvdXRQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZtbFBhcnQgPSAoKFNsaWRlTGF5b3V0UGFydCluZXdDb250ZW50UGFydCkuQWRkTmV3UGFydDxWbWxEcmF3aW5nUGFydD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBTbGlkZU1hc3RlclBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Vm1sUGFydCA9ICgoU2xpZGVNYXN0ZXJQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGROZXdQYXJ0PFZtbERyYXdpbmdQYXJ0PigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFNsaWRlUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWbWxQYXJ0ID0gKChTbGlkZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZE5ld1BhcnQ8Vm1sRHJhd2luZ1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgV29ya3NoZWV0UGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWbWxQYXJ0ID0gKChXb3Jrc2hlZXRQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGROZXdQYXJ0PFZtbERyYXdpbmdQYXJ0PigpOworCisgICAgICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgeGQgPSB2bWxQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4geGQuRGVzY2VuZGFudHMoTy5pbmspKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLkF0dHJpYnV0ZSgiaSIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGl0ZW0uQXR0cmlidXRlKCJpIikuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpLlJlcGxhY2UoIiAiLCAiXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLkF0dHJpYnV0ZSgiaSIpLlZhbHVlID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdWbWxQYXJ0LlB1dFhEb2N1bWVudCh4ZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBZGRSZWxhdGlvbnNoaXBzKHZtbFBhcnQsIG5ld1ZtbFBhcnQsIG5ld1tdIHsgbmV3Vm1sUGFydC5HZXRYRG9jdW1lbnQoKS5Sb290IH0pOworICAgICAgICAgICAgICAgICAgICAgICAgQ29weVJlbGF0ZWRQYXJ0c0ZvckNvbnRlbnRQYXJ0cyhuZXdEb2N1bWVudCwgdm1sUGFydCwgbmV3Vm1sUGFydCwgbmV3W10geyBuZXdWbWxQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3QgfSwgaW1hZ2VzLCBtZWRpYUxpc3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb3B5Q2hhcnRPYmplY3RzKENoYXJ0UGFydCBvbGRDaGFydCwgQ2hhcnRQYXJ0IG5ld0NoYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBkYXRhUmVmZXJlbmNlIGluIG5ld0NoYXJ0LkdldFhEb2N1bWVudCgpLkRlc2NlbmRhbnRzKEMuZXh0ZXJuYWxEYXRhKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcmVsSWQgPSBkYXRhUmVmZXJlbmNlLkF0dHJpYnV0ZShSLmlkKS5WYWx1ZTsKKworICAgICAgICAgICAgICAgIHZhciBvbGRQYXJ0SWRQYWlyID0gb2xkQ2hhcnQuUGFydHMuRmlyc3RPckRlZmF1bHQocCA9PiBwLlJlbGF0aW9uc2hpcElkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICBpZiAob2xkUGFydElkUGFpciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRW1iZWRkZWRQYWNrYWdlUGFydCBvbGRQYXJ0ID0gb2xkUGFydElkUGFpci5PcGVuWG1sUGFydCBhcyBFbWJlZGRlZFBhY2thZ2VQYXJ0OworICAgICAgICAgICAgICAgICAgICBpZiAob2xkUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFbWJlZGRlZFBhY2thZ2VQYXJ0IG5ld1BhcnQgPSBuZXdDaGFydC5BZGRFbWJlZGRlZFBhY2thZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBvbGRPYmplY3QgPSBvbGRQYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBuZXdPYmplY3QgPSBuZXdQYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs2NTUzNl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChieXRlQ291bnQgPSBvbGRPYmplY3QuUmVhZChidWZmZXIsIDAsIDY1NTM2KSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2JqZWN0LldyaXRlKGJ1ZmZlciwgMCwgYnl0ZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZlcmVuY2UuQXR0cmlidXRlKFIuaWQpLlZhbHVlID0gbmV3Q2hhcnQuR2V0SWRPZlBhcnQobmV3UGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBFbWJlZGRlZE9iamVjdFBhcnQgb2xkRW1iZWRkZWRPYmplY3RQYXJ0ID0gb2xkUGFydElkUGFpci5PcGVuWG1sUGFydCBhcyBFbWJlZGRlZE9iamVjdFBhcnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbGRFbWJlZGRlZE9iamVjdFBhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRW1iZWRkZWRQYWNrYWdlUGFydCBuZXdQYXJ0ID0gbmV3Q2hhcnQuQWRkRW1iZWRkZWRQYWNrYWdlUGFydChvbGRFbWJlZGRlZE9iamVjdFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBvbGRPYmplY3QgPSBvbGRFbWJlZGRlZE9iamVjdFBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZCkpCisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoU3RyZWFtIG5ld09iamVjdCA9IG5ld1BhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5SZWFkV3JpdGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzY1NTM2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGJ5dGVDb3VudCA9IG9sZE9iamVjdC5SZWFkKGJ1ZmZlciwgMCwgNjU1MzYpKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPYmplY3QuV3JpdGUoYnVmZmVyLCAwLCBieXRlQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcklkID0gbmV3Q2hhcnQuR2V0SWRPZlBhcnQobmV3UGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmZXJlbmNlLkF0dHJpYnV0ZShSLmlkKS5WYWx1ZSA9IHJJZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sbG93aW5nIGlzIGEgaGFjayB0byBmaXggdGhlIHBhY2thZ2UgYmVjYXVzZSB0aGUgT3BlbiBYTUwgU0RLIGRvZXMgbm90IGxldCB1cyBjcmVhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmVsYXRpb25zaGlwIGZyb20gYSBjaGFydCB3aXRoIHRoZSBvbGVPYmplY3QgcmVsYXRpb25zaGlwIHR5cGUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwa2cgPSBuZXdDaGFydC5PcGVuWG1sUGFja2FnZS5QYWNrYWdlOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZyb21QYXJ0ID0gcGtnLkdldFBhcnRzKCkuRmlyc3RPckRlZmF1bHQocCA9PiBwLlVyaSA9PSBuZXdDaGFydC5VcmkpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbCA9IGZyb21QYXJ0LkdldFJlbGF0aW9uc2hpcHMoKS5GaXJzdE9yRGVmYXVsdChwID0+IHAuSWQgPT0gcklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRVcmkgPSByZWwuVGFyZ2V0VXJpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tUGFydC5EZWxldGVSZWxhdGlvbnNoaXAocklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb21QYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcCh0YXJnZXRVcmksIFN5c3RlbS5JTy5QYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9vbGVPYmplY3QiLCBySWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXAgPSBvbGRDaGFydC5HZXRFeHRlcm5hbFJlbGF0aW9uc2hpcChyZWxJZCk7CisgICAgICAgICAgICAgICAgICAgIEd1aWQgZyA9IEd1aWQuTmV3R3VpZCgpOworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmV3UmlkID0gIlIiICsgZy5Ub1N0cmluZygpLlJlcGxhY2UoIi0iLCAiIik7CisgICAgICAgICAgICAgICAgICAgIHZhciBvbGRSZWwgPSBvbGRDaGFydC5FeHRlcm5hbFJlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoaCA9PiBoLklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFJlbCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByZXNlbnRhdGlvbkJ1aWxkZXJJbnRlcm5hbEV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3IgMDAwNyIpOworICAgICAgICAgICAgICAgICAgICBuZXdDaGFydC5BZGRFeHRlcm5hbFJlbGF0aW9uc2hpcChvbGRSZWwuUmVsYXRpb25zaGlwVHlwZSwgb2xkUmVsLlVyaSwgbmV3UmlkKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVJlZmVyZW5jZS5BdHRyaWJ1dGUoUi5pZCkuVmFsdWUgPSBuZXdSaWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxYTmFtZSwgWE5hbWVbXT4gUmVsYXRpb25zaGlwTWFya3VwID0gbnVsbDsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFVwZGF0ZUNvbnRlbnQoSUVudW1lcmFibGU8WEVsZW1lbnQ+IG5ld0NvbnRlbnQsIFhOYW1lIGVsZW1lbnRUb01vZGlmeSwgc3RyaW5nIG9sZFJpZCwgc3RyaW5nIG5ld1JpZCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGF0dHJpYnV0ZU5hbWUgaW4gUmVsYXRpb25zaGlwTWFya3VwW2VsZW1lbnRUb01vZGlmeV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRzVG9VcGRhdGUgPSBuZXdDb250ZW50CisgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cyhlbGVtZW50VG9Nb2RpZnkpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgPT0gb2xkUmlkKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZWxlbWVudCBpbiBlbGVtZW50c1RvVXBkYXRlKQorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKS5WYWx1ZSA9IG5ld1JpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUmVtb3ZlQ29udGVudChJRW51bWVyYWJsZTxYRWxlbWVudD4gbmV3Q29udGVudCwgWE5hbWUgZWxlbWVudFRvTW9kaWZ5LCBzdHJpbmcgb2xkUmlkKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgYXR0cmlidXRlTmFtZSBpbiBSZWxhdGlvbnNoaXBNYXJrdXBbZWxlbWVudFRvTW9kaWZ5XSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXdDb250ZW50CisgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cyhlbGVtZW50VG9Nb2RpZnkpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgPT0gb2xkUmlkKS5SZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkUmVsYXRpb25zaGlwcyhPcGVuWG1sUGFydCBvbGRQYXJ0LCBPcGVuWG1sUGFydCBuZXdQYXJ0LCBJRW51bWVyYWJsZTxYRWxlbWVudD4gbmV3Q29udGVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlbGV2YW50RWxlbWVudHMgPSBuZXdDb250ZW50LkRlc2NlbmRhbnRzQW5kU2VsZigpCisgICAgICAgICAgICAgICAgLldoZXJlKGQgPT4gUmVsYXRpb25zaGlwTWFya3VwLkNvbnRhaW5zS2V5KGQuTmFtZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgZC5BdHRyaWJ1dGVzKCkuQW55KGEgPT4gUmVsYXRpb25zaGlwTWFya3VwW2QuTmFtZV0uQ29udGFpbnMoYS5OYW1lKSkpCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGUgaW4gcmVsZXZhbnRFbGVtZW50cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZS5OYW1lID09IEEuaGxpbmtDbGljayB8fCBlLk5hbWUgPT0gQS5obGlua0hvdmVyIHx8IGUuTmFtZSA9PSBBLmhsaW5rTW91c2VPdmVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJlbElkID0gKHN0cmluZyllLkF0dHJpYnV0ZShSLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHJlbElkKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAvLzxhOmhsaW5rQ2xpY2sgcjppZD0iIgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIGFjdGlvbj0icHBhY3Rpb246Ly9jdXN0b21zaG93P2lkPTAiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gKHN0cmluZyllLkF0dHJpYnV0ZSgiYWN0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5Db250YWlucygiY3VzdG9tc2hvdyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLkF0dHJpYnV0ZSgiYWN0aW9uIikuUmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEh5cGVybGluayA9IG5ld1BhcnQuSHlwZXJsaW5rUmVsYXRpb25zaGlwcy5GaXJzdE9yRGVmYXVsdChoID0+IGguSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcEh5cGVybGluayAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIEd1aWQgZyA9IEd1aWQuTmV3R3VpZCgpOworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmV3UmlkID0gIlIiICsgZy5Ub1N0cmluZygpLlJlcGxhY2UoIi0iLCAiIik7CisgICAgICAgICAgICAgICAgICAgIHZhciBvbGRIeXBlcmxpbmsgPSBvbGRQYXJ0Lkh5cGVybGlua1JlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoaCA9PiBoLklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZEh5cGVybGluayA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gSXNzdWUgd2l0aCByZWZlcmVuY2UgdG8gYW5vdGhlciBwYXJ0OiB2YXIgdGVtcCA9IG9sZFBhcnQuR2V0UGFydEJ5SWQocmVsSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlQ29udGVudChuZXdDb250ZW50LCBlLk5hbWUsIHJlbElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQuQWRkSHlwZXJsaW5rUmVsYXRpb25zaGlwKG9sZEh5cGVybGluay5VcmksIG9sZEh5cGVybGluay5Jc0V4dGVybmFsLCBuZXdSaWQpOworICAgICAgICAgICAgICAgICAgICBVcGRhdGVDb250ZW50KG5ld0NvbnRlbnQsIGUuTmFtZSwgcmVsSWQsIG5ld1JpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlLk5hbWUgPT0gVk1MLmltYWdlZGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IChzdHJpbmcpZS5BdHRyaWJ1dGUoUi5ocmVmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHJlbElkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEV4dGVybmFsUmVsYXRpb25zaGlwID0gbmV3UGFydC5FeHRlcm5hbFJlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoaCA9PiBoLklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBFeHRlcm5hbFJlbGF0aW9uc2hpcCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIEd1aWQgZyA9IEd1aWQuTmV3R3VpZCgpOworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmV3UmlkID0gIlIiICsgZy5Ub1N0cmluZygpLlJlcGxhY2UoIi0iLCAiIik7CisgICAgICAgICAgICAgICAgICAgIHZhciBvbGRSZWwgPSBvbGRQYXJ0LkV4dGVybmFsUmVsYXRpb25zaGlwcy5GaXJzdE9yRGVmYXVsdChoID0+IGguSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkUmVsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJlc2VudGF0aW9uQnVpbGRlckludGVybmFsRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvciAwMDA2Iik7CisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQuQWRkRXh0ZXJuYWxSZWxhdGlvbnNoaXAob2xkUmVsLlJlbGF0aW9uc2hpcFR5cGUsIG9sZFJlbC5VcmksIG5ld1JpZCk7CisgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUNvbnRlbnQobmV3Q29udGVudCwgZS5OYW1lLCByZWxJZCwgbmV3UmlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGUuTmFtZSA9PSBBLmJsaXAgfHwgZS5OYW1lID09IEExNC5pbWdMYXllciB8fCBlLk5hbWUgPT0gQS5hdWRpb0ZpbGUgfHwgZS5OYW1lID09IEEudmlkZW9GaWxlIHx8IGUuTmFtZSA9PSBBLnF1aWNrVGltZUZpbGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmVsSWQgPSAoc3RyaW5nKWUuQXR0cmlidXRlKFIubGluayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShyZWxJZCkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBFeHRlcm5hbFJlbGF0aW9uc2hpcCA9IG5ld1BhcnQuRXh0ZXJuYWxSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KGggPT4gaC5JZCA9PSByZWxJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRXh0ZXJuYWxSZWxhdGlvbnNoaXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBHdWlkIGcgPSBHdWlkLk5ld0d1aWQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5ld1JpZCA9ICJSIiArIGcuVG9TdHJpbmcoKS5SZXBsYWNlKCItIiwgIiIpOworICAgICAgICAgICAgICAgICAgICB2YXIgb2xkUmVsID0gb2xkUGFydC5FeHRlcm5hbFJlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoaCA9PiBoLklkID09IHJlbElkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFJlbCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQuQWRkRXh0ZXJuYWxSZWxhdGlvbnNoaXAob2xkUmVsLlJlbGF0aW9uc2hpcFR5cGUsIG9sZFJlbC5VcmksIG5ld1JpZCk7CisgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUNvbnRlbnQobmV3Q29udGVudCwgZS5OYW1lLCByZWxJZCwgbmV3UmlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvcHlSZWxhdGVkSW1hZ2UoT3BlblhtbFBhcnQgb2xkQ29udGVudFBhcnQsIE9wZW5YbWxQYXJ0IG5ld0NvbnRlbnRQYXJ0LCBYRWxlbWVudCBpbWFnZVJlZmVyZW5jZSwgWE5hbWUgYXR0cmlidXRlTmFtZSwKKyAgICAgICAgICAgIExpc3Q8SW1hZ2VEYXRhPiBpbWFnZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IChzdHJpbmcpaW1hZ2VSZWZlcmVuY2UuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHJlbElkKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIEZpcnN0IGxvb2sgdG8gc2VlIGlmIHRoaXMgcmVsSWQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgbmV3IGRvY3VtZW50LgorICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRob3NlIHBhcnRzIHRoYXQgZ2V0IHByb2Nlc3NlZCB3aXRoIGJvdGggb2xkIGFuZCBuZXcgaWRzLCBzdWNoIGFzIHRoZSBjb21tZW50cworICAgICAgICAgICAgLy8gcGFydC4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgcGFydHMgc3VjaCBhcyB0aGUgbWFpbiBkb2N1bWVudCBwYXJ0LCBidXQgdGhpcyBjb2RlIHdvbid0IG1hbGZ1bmN0aW9uCisgICAgICAgICAgICAvLyBpbiB0aGF0IGNhc2UuCisgICAgICAgICAgICB2YXIgcGFydElkUGFpciA9IG5ld0NvbnRlbnRQYXJ0LlBhcnRzLkZpcnN0T3JEZWZhdWx0KHAgPT4gcC5SZWxhdGlvbnNoaXBJZCA9PSByZWxJZCk7CisgICAgICAgICAgICBpZiAocGFydElkUGFpciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgRXh0ZXJuYWxSZWxhdGlvbnNoaXAgZXh0UmVsID0gbmV3Q29udGVudFBhcnQuRXh0ZXJuYWxSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KHIgPT4gci5JZCA9PSByZWxJZCk7CisgICAgICAgICAgICBpZiAoZXh0UmVsICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB2YXIgb2xkUGFydElkUGFpciA9IG9sZENvbnRlbnRQYXJ0LlBhcnRzLkZpcnN0T3JEZWZhdWx0KHAgPT4gcC5SZWxhdGlvbnNoaXBJZCA9PSByZWxJZCk7CisgICAgICAgICAgICBpZiAob2xkUGFydElkUGFpciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEltYWdlUGFydCBvbGRQYXJ0ID0gb2xkUGFydElkUGFpci5PcGVuWG1sUGFydCBhcyBJbWFnZVBhcnQ7CisgICAgICAgICAgICAgICAgSW1hZ2VEYXRhIHRlbXAgPSBNYW5hZ2VJbWFnZUNvcHkob2xkUGFydCwgbmV3Q29udGVudFBhcnQsIGltYWdlcyk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXAuSW1hZ2VQYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJbWFnZVBhcnQgbmV3UGFydCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBDaGFydERyYXdpbmdQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoQ2hhcnREcmF3aW5nUGFydCluZXdDb250ZW50UGFydCkuQWRkSW1hZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBDaGFydFBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChDaGFydFBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEltYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgQ2hhcnRzaGVldFBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChDaGFydHNoZWV0UGFydCluZXdDb250ZW50UGFydCkuQWRkSW1hZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBEaWFncmFtRGF0YVBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChEaWFncmFtRGF0YVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEltYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgRGlhZ3JhbUxheW91dERlZmluaXRpb25QYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoRGlhZ3JhbUxheW91dERlZmluaXRpb25QYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRJbWFnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIERpYWdyYW1QZXJzaXN0TGF5b3V0UGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKERpYWdyYW1QZXJzaXN0TGF5b3V0UGFydCluZXdDb250ZW50UGFydCkuQWRkSW1hZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBEcmF3aW5nc1BhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChEcmF3aW5nc1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEltYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgSGFuZG91dE1hc3RlclBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChIYW5kb3V0TWFzdGVyUGFydCluZXdDb250ZW50UGFydCkuQWRkSW1hZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBOb3Rlc01hc3RlclBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChOb3Rlc01hc3RlclBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEltYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgTm90ZXNTbGlkZVBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChOb3Rlc1NsaWRlUGFydCluZXdDb250ZW50UGFydCkuQWRkSW1hZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBSaWJib25BbmRCYWNrc3RhZ2VDdXN0b21pemF0aW9uc1BhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChSaWJib25BbmRCYWNrc3RhZ2VDdXN0b21pemF0aW9uc1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEltYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgUmliYm9uRXh0ZW5zaWJpbGl0eVBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChSaWJib25FeHRlbnNpYmlsaXR5UGFydCluZXdDb250ZW50UGFydCkuQWRkSW1hZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBTbGlkZUxheW91dFBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChTbGlkZUxheW91dFBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEltYWdlUGFydChvbGRQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgU2xpZGVNYXN0ZXJQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoU2xpZGVNYXN0ZXJQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRJbWFnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFNsaWRlUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFNsaWRlUGFydCluZXdDb250ZW50UGFydCkuQWRkSW1hZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBUaGVtZU92ZXJyaWRlUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFRoZW1lT3ZlcnJpZGVQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRJbWFnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFRoZW1lUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFRoZW1lUGFydCluZXdDb250ZW50UGFydCkuQWRkSW1hZ2VQYXJ0KG9sZFBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBWbWxEcmF3aW5nUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFZtbERyYXdpbmdQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRJbWFnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFdvcmtzaGVldFBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChXb3Jrc2hlZXRQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRJbWFnZVBhcnQob2xkUGFydC5Db250ZW50VHlwZSk7CisKKyAgICAgICAgICAgICAgICAgICAgdGVtcC5JbWFnZVBhcnQgPSBuZXdQYXJ0OworICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBuZXdDb250ZW50UGFydC5HZXRJZE9mUGFydChuZXdQYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcC5BZGRDb250ZW50UGFydFJlbFR5cGVSZXNvdXJjZUlkVHVwcGxlKG5ld0NvbnRlbnRQYXJ0LCBuZXdQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIGlkKTsKKworICAgICAgICAgICAgICAgICAgICB0ZW1wLldyaXRlSW1hZ2UobmV3UGFydCk7CisgICAgICAgICAgICAgICAgICAgIGltYWdlUmVmZXJlbmNlLkF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKS5WYWx1ZSA9IGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcmVmUmVsID0gbmV3Q29udGVudFBhcnQuRGF0YVBhcnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KHJyID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbCA9IHRlbXAuQ29udGVudFBhcnRSZWxUeXBlSWRMaXN0LkZpcnN0T3JEZWZhdWx0KGNwciA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvdW5kID0gY3ByLkNvbnRlbnRQYXJ0ID09IG5ld0NvbnRlbnRQYXJ0ICYmIGNwci5SZWxhdGlvbnNoaXBJZCA9PSByci5JZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWZSZWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VSZWZlcmVuY2UuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpLlZhbHVlID0gdGVtcC5Db250ZW50UGFydFJlbFR5cGVJZExpc3QuRmlyc3QoY3ByID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvdW5kID0gY3ByLkNvbnRlbnRQYXJ0ID09IG5ld0NvbnRlbnRQYXJ0ICYmIGNwci5SZWxhdGlvbnNoaXBJZCA9PSByZWZSZWwuSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kOworICAgICAgICAgICAgICAgICAgICAgICAgfSkuUmVsYXRpb25zaGlwSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXIgY3ByMiA9IHRlbXAuQ29udGVudFBhcnRSZWxUeXBlSWRMaXN0LkZpcnN0T3JEZWZhdWx0KGMgPT4gYy5Db250ZW50UGFydCA9PSBuZXdDb250ZW50UGFydCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjcHIyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUmVmZXJlbmNlLkF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKS5WYWx1ZSA9IGNwcjIuUmVsYXRpb25zaGlwSWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZVBhcnQgaW1hZ2VQYXJ0ID0gKEltYWdlUGFydCl0ZW1wLkltYWdlUGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0ltYWdlUGFydCA9IG5ld0NvbnRlbnRQYXJ0LkFkZFBhcnQ8SW1hZ2VQYXJ0PihpbWFnZVBhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0lkID0gbmV3Q29udGVudFBhcnQuR2V0SWRPZlBhcnQoZXhpc3RpbmdJbWFnZVBhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5BZGRDb250ZW50UGFydFJlbFR5cGVSZXNvdXJjZUlkVHVwcGxlKG5ld0NvbnRlbnRQYXJ0LCBpbWFnZVBhcnQuUmVsYXRpb25zaGlwVHlwZSwgbmV3SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VSZWZlcmVuY2UuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpLlZhbHVlID0gbmV3SWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4dGVybmFsUmVsYXRpb25zaGlwIGVyID0gb2xkQ29udGVudFBhcnQuRXh0ZXJuYWxSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KHIgPT4gci5JZCA9PSByZWxJZCk7CisgICAgICAgICAgICAgICAgaWYgKGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCBuZXdFciA9IG5ld0NvbnRlbnRQYXJ0LkFkZEV4dGVybmFsUmVsYXRpb25zaGlwKGVyLlJlbGF0aW9uc2hpcFR5cGUsIGVyLlVyaSk7CisgICAgICAgICAgICAgICAgICAgIGltYWdlUmVmZXJlbmNlLkF0dHJpYnV0ZShSLmlkKS5WYWx1ZSA9IG5ld0VyLklkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZnJvbVBhcnQgPSBuZXdDb250ZW50UGFydC5PcGVuWG1sUGFja2FnZS5QYWNrYWdlLkdldFBhcnRzKCkuRmlyc3RPckRlZmF1bHQocCA9PiBwLlVyaSA9PSBuZXdDb250ZW50UGFydC5VcmkpOworICAgICAgICAgICAgICAgICAgICBmcm9tUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAobmV3IFVyaSgiTlVMTCIsIFVyaUtpbmQuUmVsYXRpdmVPckFic29sdXRlKSwgU3lzdGVtLklPLlBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9pbWFnZSIsIHJlbElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvcHlSZWxhdGVkTWVkaWEoT3BlblhtbFBhcnQgb2xkQ29udGVudFBhcnQsIE9wZW5YbWxQYXJ0IG5ld0NvbnRlbnRQYXJ0LCBYRWxlbWVudCBpbWFnZVJlZmVyZW5jZSwgWE5hbWUgYXR0cmlidXRlTmFtZSwKKyAgICAgICAgICAgIExpc3Q8TWVkaWFEYXRhPiBtZWRpYUxpc3QsIHN0cmluZyBtZWRpYVJlbGF0aW9uc2hpcFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IChzdHJpbmcpaW1hZ2VSZWZlcmVuY2UuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHJlbElkKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIEZpcnN0IGxvb2sgdG8gc2VlIGlmIHRoaXMgcmVsSWQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgbmV3IGRvY3VtZW50LgorICAgICAgICAgICAgdmFyIGV4aXN0aW5nRGF0YVBhcnRSZWZSZWwyID0gbmV3Q29udGVudFBhcnQuRGF0YVBhcnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KGRwciA9PiBkcHIuSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgaWYgKGV4aXN0aW5nRGF0YVBhcnRSZWZSZWwyICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB2YXIgb2xkUmVsID0gb2xkQ29udGVudFBhcnQuRGF0YVBhcnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KGRwciA9PiBkcHIuSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgaWYgKG9sZFJlbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgRGF0YVBhcnQgb2xkUGFydCA9IG9sZFJlbC5EYXRhUGFydDsKKyAgICAgICAgICAgIE1lZGlhRGF0YSB0ZW1wID0gTWFuYWdlTWVkaWFDb3B5KG9sZFBhcnQsIG1lZGlhTGlzdCk7CisgICAgICAgICAgICBpZiAodGVtcC5EYXRhUGFydCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjdCA9IG9sZFBhcnQuQ29udGVudFR5cGU7CisgICAgICAgICAgICAgICAgdmFyIGV4dCA9IFBhdGguR2V0RXh0ZW5zaW9uKG9sZFBhcnQuVXJpLk9yaWdpbmFsU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBNZWRpYURhdGFQYXJ0IG5ld1BhcnQgPSBuZXdDb250ZW50UGFydC5PcGVuWG1sUGFja2FnZS5DcmVhdGVNZWRpYURhdGFQYXJ0KGN0LCBleHQpOworICAgICAgICAgICAgICAgIG5ld1BhcnQuRmVlZERhdGEob2xkUGFydC5HZXRTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgc3RyaW5nIGlkID0gbnVsbDsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcmVsYXRpb25zaGlwVHlwZSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAobWVkaWFSZWxhdGlvbnNoaXBUeXBlID09ICJtZWRpYSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNZWRpYVJlZmVyZW5jZVJlbGF0aW9uc2hpcCBtcnIgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBTbGlkZVBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBtcnIgPSAoKFNsaWRlUGFydCluZXdDb250ZW50UGFydCkuQWRkTWVkaWFSZWZlcmVuY2VSZWxhdGlvbnNoaXAobmV3UGFydCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFNsaWRlTGF5b3V0UGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1yciA9ICgoU2xpZGVMYXlvdXRQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRNZWRpYVJlZmVyZW5jZVJlbGF0aW9uc2hpcChuZXdQYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgU2xpZGVNYXN0ZXJQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgbXJyID0gKChTbGlkZU1hc3RlclBhcnQpbmV3Q29udGVudFBhcnQpLkFkZE1lZGlhUmVmZXJlbmNlUmVsYXRpb25zaGlwKG5ld1BhcnQpOworCisgICAgICAgICAgICAgICAgICAgIGlkID0gbXJyLklkOworICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBUeXBlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMDcvcmVsYXRpb25zaGlwcy9tZWRpYSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lZGlhUmVsYXRpb25zaGlwVHlwZSA9PSAidmlkZW8iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVmlkZW9SZWZlcmVuY2VSZWxhdGlvbnNoaXAgdnJyID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgU2xpZGVQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgdnJyID0gKChTbGlkZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZFZpZGVvUmVmZXJlbmNlUmVsYXRpb25zaGlwKG5ld1BhcnQpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBIYW5kb3V0TWFzdGVyUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZyciA9ICgoSGFuZG91dE1hc3RlclBhcnQpbmV3Q29udGVudFBhcnQpLkFkZFZpZGVvUmVmZXJlbmNlUmVsYXRpb25zaGlwKG5ld1BhcnQpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBOb3Rlc01hc3RlclBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICB2cnIgPSAoKE5vdGVzTWFzdGVyUGFydCluZXdDb250ZW50UGFydCkuQWRkVmlkZW9SZWZlcmVuY2VSZWxhdGlvbnNoaXAobmV3UGFydCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIE5vdGVzU2xpZGVQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgdnJyID0gKChOb3Rlc1NsaWRlUGFydCluZXdDb250ZW50UGFydCkuQWRkVmlkZW9SZWZlcmVuY2VSZWxhdGlvbnNoaXAobmV3UGFydCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFNsaWRlTGF5b3V0UGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZyciA9ICgoU2xpZGVMYXlvdXRQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRWaWRlb1JlZmVyZW5jZVJlbGF0aW9uc2hpcChuZXdQYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgU2xpZGVNYXN0ZXJQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgdnJyID0gKChTbGlkZU1hc3RlclBhcnQpbmV3Q29udGVudFBhcnQpLkFkZFZpZGVvUmVmZXJlbmNlUmVsYXRpb25zaGlwKG5ld1BhcnQpOworCisgICAgICAgICAgICAgICAgICAgIGlkID0gdnJyLklkOworICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBUeXBlID0gImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvdmlkZW8iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZW1wLkRhdGFQYXJ0ID0gbmV3UGFydDsKKyAgICAgICAgICAgICAgICB0ZW1wLkFkZENvbnRlbnRQYXJ0UmVsVHlwZVJlc291cmNlSWRUdXBwbGUobmV3Q29udGVudFBhcnQsIHJlbGF0aW9uc2hpcFR5cGUsIGlkKTsKKyAgICAgICAgICAgICAgICBpbWFnZVJlZmVyZW5jZS5BdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkuVmFsdWUgPSBpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgZGVzaXJlZFJlbFR5cGUgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChtZWRpYVJlbGF0aW9uc2hpcFR5cGUgPT0gIm1lZGlhIikKKyAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFJlbFR5cGUgPSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvMjAwNy9yZWxhdGlvbnNoaXBzL21lZGlhIjsKKyAgICAgICAgICAgICAgICBpZiAobWVkaWFSZWxhdGlvbnNoaXBUeXBlID09ICJ2aWRlbyIpCisgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRSZWxUeXBlID0gImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvdmlkZW8iOworICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ1JlbCA9IHRlbXAuQ29udGVudFBhcnRSZWxUeXBlSWRMaXN0LkZpcnN0T3JEZWZhdWx0KGNwID0+IGNwLkNvbnRlbnRQYXJ0ID09IG5ld0NvbnRlbnRQYXJ0ICYmIGNwLlJlbGF0aW9uc2hpcFR5cGUgPT0gZGVzaXJlZFJlbFR5cGUpOworICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1JlbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VSZWZlcmVuY2UuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpLlZhbHVlID0gZXhpc3RpbmdSZWwuUmVsYXRpb25zaGlwSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1lZGlhRGF0YVBhcnQgbmV3UGFydCA9IChNZWRpYURhdGFQYXJ0KXRlbXAuRGF0YVBhcnQ7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyByZWxhdGlvbnNoaXBUeXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUmVsYXRpb25zaGlwVHlwZSA9PSAibWVkaWEiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlZmVyZW5jZVJlbGF0aW9uc2hpcCBtcnIgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgU2xpZGVQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yciA9ICgoU2xpZGVQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRNZWRpYVJlZmVyZW5jZVJlbGF0aW9uc2hpcChuZXdQYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBTbGlkZUxheW91dFBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJyID0gKChTbGlkZUxheW91dFBhcnQpbmV3Q29udGVudFBhcnQpLkFkZE1lZGlhUmVmZXJlbmNlUmVsYXRpb25zaGlwKG5ld1BhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFNsaWRlTWFzdGVyUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcnIgPSAoKFNsaWRlTWFzdGVyUGFydCluZXdDb250ZW50UGFydCkuQWRkTWVkaWFSZWZlcmVuY2VSZWxhdGlvbnNoaXAobmV3UGFydCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gbXJyLklkOworICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwVHlwZSA9IG1yci5SZWxhdGlvbnNoaXBUeXBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lZGlhUmVsYXRpb25zaGlwVHlwZSA9PSAidmlkZW8iKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb1JlZmVyZW5jZVJlbGF0aW9uc2hpcCB2cnIgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgU2xpZGVQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyciA9ICgoU2xpZGVQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRWaWRlb1JlZmVyZW5jZVJlbGF0aW9uc2hpcChuZXdQYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBIYW5kb3V0TWFzdGVyUGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cnIgPSAoKEhhbmRvdXRNYXN0ZXJQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRWaWRlb1JlZmVyZW5jZVJlbGF0aW9uc2hpcChuZXdQYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50UGFydCBpcyBOb3Rlc01hc3RlclBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJyID0gKChOb3Rlc01hc3RlclBhcnQpbmV3Q29udGVudFBhcnQpLkFkZFZpZGVvUmVmZXJlbmNlUmVsYXRpb25zaGlwKG5ld1BhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIE5vdGVzU2xpZGVQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyciA9ICgoTm90ZXNTbGlkZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZFZpZGVvUmVmZXJlbmNlUmVsYXRpb25zaGlwKG5ld1BhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFNsaWRlTGF5b3V0UGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cnIgPSAoKFNsaWRlTGF5b3V0UGFydCluZXdDb250ZW50UGFydCkuQWRkVmlkZW9SZWZlcmVuY2VSZWxhdGlvbnNoaXAobmV3UGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgU2xpZGVNYXN0ZXJQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyciA9ICgoU2xpZGVNYXN0ZXJQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRWaWRlb1JlZmVyZW5jZVJlbGF0aW9uc2hpcChuZXdQYXJ0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSB2cnIuSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBUeXBlID0gdnJyLlJlbGF0aW9uc2hpcFR5cGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGVtcC5BZGRDb250ZW50UGFydFJlbFR5cGVSZXNvdXJjZUlkVHVwcGxlKG5ld0NvbnRlbnRQYXJ0LCByZWxhdGlvbnNoaXBUeXBlLCBpZCk7CisgICAgICAgICAgICAgICAgICAgIGltYWdlUmVmZXJlbmNlLkF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKS5WYWx1ZSA9IGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weVJlbGF0ZWRNZWRpYUV4dGVybmFsUmVsYXRpb25zaGlwKE9wZW5YbWxQYXJ0IG9sZENvbnRlbnRQYXJ0LCBPcGVuWG1sUGFydCBuZXdDb250ZW50UGFydCwgWEVsZW1lbnQgaW1hZ2VSZWZlcmVuY2UsIFhOYW1lIGF0dHJpYnV0ZU5hbWUsCisgICAgICAgICAgICBzdHJpbmcgbWVkaWFSZWxhdGlvbnNoaXBUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgcmVsSWQgPSAoc3RyaW5nKWltYWdlUmVmZXJlbmNlLkF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShyZWxJZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB2YXIgZXhpc3RpbmdFeHRlcm5hbFJlZmVyZW5jZSA9IG5ld0NvbnRlbnRQYXJ0LkV4dGVybmFsUmVsYXRpb25zaGlwcy5GaXJzdE9yRGVmYXVsdChlciA9PiBlci5JZCA9PSByZWxJZCk7CisgICAgICAgICAgICBpZiAoZXhpc3RpbmdFeHRlcm5hbFJlZmVyZW5jZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgdmFyIG9sZFJlbCA9IG9sZENvbnRlbnRQYXJ0LkV4dGVybmFsUmVsYXRpb25zaGlwcy5GaXJzdE9yRGVmYXVsdChkcHIgPT4gZHByLklkID09IHJlbElkKTsKKyAgICAgICAgICAgIGlmIChvbGRSZWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHZhciBuZXdJZCA9ICJSIiArIEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCkuUmVwbGFjZSgiLSIsICIiKS5TdWJzdHJpbmcoMCwgMTYpOworICAgICAgICAgICAgbmV3Q29udGVudFBhcnQuQWRkRXh0ZXJuYWxSZWxhdGlvbnNoaXAob2xkUmVsLlJlbGF0aW9uc2hpcFR5cGUsIG9sZFJlbC5VcmksIG5ld0lkKTsKKworICAgICAgICAgICAgaW1hZ2VSZWZlcmVuY2UuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpLlZhbHVlID0gbmV3SWQ7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weUlua1BhcnQoT3BlblhtbFBhcnQgb2xkQ29udGVudFBhcnQsIE9wZW5YbWxQYXJ0IG5ld0NvbnRlbnRQYXJ0LCBYRWxlbWVudCBjb250ZW50UGFydFJlZmVyZW5jZSwgWE5hbWUgYXR0cmlidXRlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHJlbElkID0gKHN0cmluZyljb250ZW50UGFydFJlZmVyZW5jZS5BdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7CisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkocmVsSWQpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgdmFyIHRlbXBQYXJ0SWRQYWlyID0gbmV3Q29udGVudFBhcnQuUGFydHMuRmlyc3RPckRlZmF1bHQocCA9PiBwLlJlbGF0aW9uc2hpcElkID09IHJlbElkKTsKKyAgICAgICAgICAgIGlmICh0ZW1wUGFydElkUGFpciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgdmFyIHRlbXBFciA9IG5ld0NvbnRlbnRQYXJ0LkV4dGVybmFsUmVsYXRpb25zaGlwcy5GaXJzdE9yRGVmYXVsdChlciA9PiBlci5JZCA9PSByZWxJZCk7CisgICAgICAgICAgICBpZiAodGVtcEVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB2YXIgb2xkUGFydCA9IG9sZENvbnRlbnRQYXJ0LkdldFBhcnRCeUlkKHJlbElkKTsKKworICAgICAgICAgICAgdmFyIG5ld0lkID0gIlIiICsgR3VpZC5OZXdHdWlkKCkuVG9TdHJpbmcoKS5SZXBsYWNlKCItIiwgIiIpLlN1YnN0cmluZygwLCAxNik7CisgICAgICAgICAgICBDdXN0b21YbWxQYXJ0IG5ld1BhcnQgPSBuZXdDb250ZW50UGFydC5BZGROZXdQYXJ0PEN1c3RvbVhtbFBhcnQ+KCJhcHBsaWNhdGlvbi9pbmttbCt4bWwiLCBuZXdJZCk7CisKKyAgICAgICAgICAgIG5ld1BhcnQuRmVlZERhdGEob2xkUGFydC5HZXRTdHJlYW0oKSk7CisgICAgICAgICAgICBjb250ZW50UGFydFJlZmVyZW5jZS5BdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkuVmFsdWUgPSBuZXdJZDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weUFjdGl2ZVhQYXJ0KE9wZW5YbWxQYXJ0IG9sZENvbnRlbnRQYXJ0LCBPcGVuWG1sUGFydCBuZXdDb250ZW50UGFydCwgWEVsZW1lbnQgYWN0aXZlWFBhcnRSZWZlcmVuY2UsIFhOYW1lIGF0dHJpYnV0ZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IChzdHJpbmcpYWN0aXZlWFBhcnRSZWZlcmVuY2UuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHJlbElkKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHZhciB0ZW1wUGFydElkUGFpciA9IG5ld0NvbnRlbnRQYXJ0LlBhcnRzLkZpcnN0T3JEZWZhdWx0KHAgPT4gcC5SZWxhdGlvbnNoaXBJZCA9PSByZWxJZCk7CisgICAgICAgICAgICBpZiAodGVtcFBhcnRJZFBhaXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHZhciBvbGRQYXJ0ID0gb2xkQ29udGVudFBhcnQuR2V0UGFydEJ5SWQocmVsSWQpOworCisgICAgICAgICAgICB2YXIgbmV3SWQgPSAiUiIgKyBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygpLlJlcGxhY2UoIi0iLCAiIikuU3Vic3RyaW5nKDAsIDE2KTsKKyAgICAgICAgICAgIEVtYmVkZGVkQ29udHJvbFBlcnNpc3RlbmNlUGFydCBuZXdQYXJ0ID0gbmV3Q29udGVudFBhcnQuQWRkTmV3UGFydDxFbWJlZGRlZENvbnRyb2xQZXJzaXN0ZW5jZVBhcnQ+KCJhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNlLmFjdGl2ZVgreG1sIiwgbmV3SWQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBuZXdQYXJ0LkZlZWREYXRhKG9sZFBhcnQuR2V0U3RyZWFtKCkpOworICAgICAgICAgICAgYWN0aXZlWFBhcnRSZWZlcmVuY2UuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpLlZhbHVlID0gbmV3SWQ7CisKKyAgICAgICAgICAgIGlmIChuZXdQYXJ0LkNvbnRlbnRUeXBlID09ICJhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNlLmFjdGl2ZVgreG1sIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRG9jdW1lbnQgYXhjID0gbmV3UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXhjLlJvb3QuQXR0cmlidXRlKFIuaWQpICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgb2xkUGVyc2lzdGVuY2VQYXJ0ID0gb2xkUGFydC5HZXRQYXJ0QnlJZCgoc3RyaW5nKWF4Yy5Sb290LkF0dHJpYnV0ZShSLmlkKSk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0lkMiA9ICJSIiArIEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCkuUmVwbGFjZSgiLSIsICIiKS5TdWJzdHJpbmcoMCwgMTYpOworICAgICAgICAgICAgICAgICAgICBFbWJlZGRlZENvbnRyb2xQZXJzaXN0ZW5jZUJpbmFyeURhdGFQYXJ0IG5ld1BlcnNpc3RlbmNlUGFydCA9IG5ld1BhcnQuQWRkTmV3UGFydDxFbWJlZGRlZENvbnRyb2xQZXJzaXN0ZW5jZUJpbmFyeURhdGFQYXJ0PigiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZS5hY3RpdmVYIiwgbmV3SWQyKTsKKworICAgICAgICAgICAgICAgICAgICBuZXdQZXJzaXN0ZW5jZVBhcnQuRmVlZERhdGEob2xkUGVyc2lzdGVuY2VQYXJ0LkdldFN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXhjLlJvb3QuQXR0cmlidXRlKFIuaWQpLlZhbHVlID0gbmV3SWQyOworICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weUxlZ2FjeURpYWdyYW1UZXh0KE9wZW5YbWxQYXJ0IG9sZENvbnRlbnRQYXJ0LCBPcGVuWG1sUGFydCBuZXdDb250ZW50UGFydCwgWEVsZW1lbnQgdGV4dGRhdGFSZWZlcmVuY2UsIFhOYW1lIGF0dHJpYnV0ZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IChzdHJpbmcpdGV4dGRhdGFSZWZlcmVuY2UuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHJlbElkKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHZhciB0ZW1wUGFydElkUGFpciA9IG5ld0NvbnRlbnRQYXJ0LlBhcnRzLkZpcnN0T3JEZWZhdWx0KHAgPT4gcC5SZWxhdGlvbnNoaXBJZCA9PSByZWxJZCk7CisgICAgICAgICAgICBpZiAodGVtcFBhcnRJZFBhaXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHZhciBvbGRQYXJ0ID0gb2xkQ29udGVudFBhcnQuR2V0UGFydEJ5SWQocmVsSWQpOworCisgICAgICAgICAgICB2YXIgbmV3SWQgPSAiUiIgKyBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygpLlJlcGxhY2UoIi0iLCAiIikuU3Vic3RyaW5nKDAsIDE2KTsKKyAgICAgICAgICAgIExlZ2FjeURpYWdyYW1UZXh0UGFydCBuZXdQYXJ0ID0gbmV3Q29udGVudFBhcnQuQWRkTmV3UGFydDxMZWdhY3lEaWFncmFtVGV4dFBhcnQ+KG5ld0lkKTsKKworICAgICAgICAgICAgbmV3UGFydC5GZWVkRGF0YShvbGRQYXJ0LkdldFN0cmVhbSgpKTsKKyAgICAgICAgICAgIHRleHRkYXRhUmVmZXJlbmNlLkF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKS5WYWx1ZSA9IG5ld0lkOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb3B5RXh0ZW5kZWRQYXJ0KE9wZW5YbWxQYXJ0IG9sZENvbnRlbnRQYXJ0LCBPcGVuWG1sUGFydCBuZXdDb250ZW50UGFydCwgWEVsZW1lbnQgZXh0ZW5kZWRSZWZlcmVuY2UsIFhOYW1lIGF0dHJpYnV0ZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IChzdHJpbmcpZXh0ZW5kZWRSZWZlcmVuY2UuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHJlbElkKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBsb29rIHRvIHNlZSBpZiB0aGlzIHJlbElkIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIG5ldyBkb2N1bWVudC4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhvc2UgcGFydHMgdGhhdCBnZXQgcHJvY2Vzc2VkIHdpdGggYm90aCBvbGQgYW5kIG5ldyBpZHMsIHN1Y2ggYXMgdGhlIGNvbW1lbnRzCisgICAgICAgICAgICAgICAgLy8gcGFydC4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgcGFydHMgc3VjaCBhcyB0aGUgbWFpbiBkb2N1bWVudCBwYXJ0LCBidXQgdGhpcyBjb2RlIHdvbid0IG1hbGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgLy8gaW4gdGhhdCBjYXNlLgorICAgICAgICAgICAgICAgIHZhciB0ZW1wUGFydElkUGFpciA9IG5ld0NvbnRlbnRQYXJ0LlBhcnRzLkZpcnN0T3JEZWZhdWx0KHAgPT4gcC5SZWxhdGlvbnNoaXBJZCA9PSByZWxJZCk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBQYXJ0SWRQYWlyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIHZhciB0ZW1wRXIgPSBuZXdDb250ZW50UGFydC5FeHRlcm5hbFJlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoZXIgPT4gZXIuSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wRXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgRXh0ZW5kZWRQYXJ0IG9sZFBhcnQgPSAoRXh0ZW5kZWRQYXJ0KW9sZENvbnRlbnRQYXJ0LkdldFBhcnRCeUlkKHJlbElkKTsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBmaWxlSW5mbyA9IG5ldyBGaWxlSW5mbyhvbGRQYXJ0LlVyaS5PcmlnaW5hbFN0cmluZyk7CisgICAgICAgICAgICAgICAgRXh0ZW5kZWRQYXJ0IG5ld1BhcnQgPSBudWxsOworCisjaWYgIU5FVDM1CisgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIENoYXJ0Q29sb3JTdHlsZVBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKENoYXJ0Q29sb3JTdHlsZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIENoYXJ0RHJhd2luZ1BhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKENoYXJ0RHJhd2luZ1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgQ2hhcnRQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChDaGFydFBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgQ2hhcnRzaGVldFBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKENoYXJ0c2hlZXRQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworI2lmICFORVQzNQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIENoYXJ0U3R5bGVQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChDaGFydFN0eWxlUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIENvbW1lbnRBdXRob3JzUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoQ29tbWVudEF1dGhvcnNQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIENvbm5lY3Rpb25zUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoQ29ubmVjdGlvbnNQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIENvbnRyb2xQcm9wZXJ0aWVzUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoQ29udHJvbFByb3BlcnRpZXNQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIENvcmVGaWxlUHJvcGVydGllc1BhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKENvcmVGaWxlUHJvcGVydGllc1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgQ3VzdG9tRGF0YVBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKEN1c3RvbURhdGFQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIEN1c3RvbURhdGFQcm9wZXJ0aWVzUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoQ3VzdG9tRGF0YVByb3BlcnRpZXNQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIEN1c3RvbUZpbGVQcm9wZXJ0aWVzUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoQ3VzdG9tRmlsZVByb3BlcnRpZXNQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIEN1c3RvbWl6YXRpb25QYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChDdXN0b21pemF0aW9uUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBDdXN0b21Qcm9wZXJ0eVBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKEN1c3RvbVByb3BlcnR5UGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBDdXN0b21VSVBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKEN1c3RvbVVJUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBDdXN0b21YbWxNYXBwaW5nc1BhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKEN1c3RvbVhtbE1hcHBpbmdzUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBDdXN0b21YbWxQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChDdXN0b21YbWxQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIEN1c3RvbVhtbFByb3BlcnRpZXNQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChDdXN0b21YbWxQcm9wZXJ0aWVzUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBEaWFncmFtQ29sb3JzUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoRGlhZ3JhbUNvbG9yc1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgRGlhZ3JhbURhdGFQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChEaWFncmFtRGF0YVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgRGlhZ3JhbUxheW91dERlZmluaXRpb25QYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChEaWFncmFtTGF5b3V0RGVmaW5pdGlvblBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgRGlhZ3JhbVBlcnNpc3RMYXlvdXRQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChEaWFncmFtUGVyc2lzdExheW91dFBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgRGlhZ3JhbVN0eWxlUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoRGlhZ3JhbVN0eWxlUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBEaWdpdGFsU2lnbmF0dXJlT3JpZ2luUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoRGlnaXRhbFNpZ25hdHVyZU9yaWdpblBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgRHJhd2luZ3NQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChEcmF3aW5nc1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgRW1iZWRkZWRDb250cm9sUGVyc2lzdGVuY2VCaW5hcnlEYXRhUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoRW1iZWRkZWRDb250cm9sUGVyc2lzdGVuY2VCaW5hcnlEYXRhUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBFbWJlZGRlZENvbnRyb2xQZXJzaXN0ZW5jZVBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKEVtYmVkZGVkQ29udHJvbFBlcnNpc3RlbmNlUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBFbWJlZGRlZE9iamVjdFBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKEVtYmVkZGVkT2JqZWN0UGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBFbWJlZGRlZFBhY2thZ2VQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChFbWJlZGRlZFBhY2thZ2VQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIEV4dGVuZGVkRmlsZVByb3BlcnRpZXNQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChFeHRlbmRlZEZpbGVQcm9wZXJ0aWVzUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBFeHRlbmRlZFBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKEV4dGVuZGVkUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBGb250UGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoRm9udFBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgRm9udFRhYmxlUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoRm9udFRhYmxlUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBIYW5kb3V0TWFzdGVyUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoSGFuZG91dE1hc3RlclBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgSW50ZXJuYXRpb25hbE1hY3JvU2hlZXRQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChJbnRlcm5hdGlvbmFsTWFjcm9TaGVldFBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgTGVnYWN5RGlhZ3JhbVRleHRJbmZvUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoTGVnYWN5RGlhZ3JhbVRleHRJbmZvUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBMZWdhY3lEaWFncmFtVGV4dFBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKExlZ2FjeURpYWdyYW1UZXh0UGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBNYWNyb1NoZWV0UGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoTWFjcm9TaGVldFBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgTm90ZXNNYXN0ZXJQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChOb3Rlc01hc3RlclBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgTm90ZXNTbGlkZVBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKE5vdGVzU2xpZGVQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFByZXNlbnRhdGlvblBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFByZXNlbnRhdGlvblBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgUHJlc2VudGF0aW9uUHJvcGVydGllc1BhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFByZXNlbnRhdGlvblByb3BlcnRpZXNQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFF1aWNrQWNjZXNzVG9vbGJhckN1c3RvbWl6YXRpb25zUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoUXVpY2tBY2Nlc3NUb29sYmFyQ3VzdG9taXphdGlvbnNQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFJpYmJvbkFuZEJhY2tzdGFnZUN1c3RvbWl6YXRpb25zUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoUmliYm9uQW5kQmFja3N0YWdlQ3VzdG9taXphdGlvbnNQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFJpYmJvbkV4dGVuc2liaWxpdHlQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChSaWJib25FeHRlbnNpYmlsaXR5UGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBTaW5nbGVDZWxsVGFibGVQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChTaW5nbGVDZWxsVGFibGVQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFNsaWRlQ29tbWVudHNQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChTbGlkZUNvbW1lbnRzUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBTbGlkZUxheW91dFBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFNsaWRlTGF5b3V0UGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBTbGlkZU1hc3RlclBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFNsaWRlTWFzdGVyUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBTbGlkZVBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFNsaWRlUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBTbGlkZVN5bmNEYXRhUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoU2xpZGVTeW5jRGF0YVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgU3R5bGVEZWZpbml0aW9uc1BhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFN0eWxlRGVmaW5pdGlvbnNQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFN0eWxlc1BhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFN0eWxlc1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgU3R5bGVzV2l0aEVmZmVjdHNQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChTdHlsZXNXaXRoRWZmZWN0c1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgVGFibGVEZWZpbml0aW9uUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoVGFibGVEZWZpbml0aW9uUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBUYWJsZVN0eWxlc1BhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFRhYmxlU3R5bGVzUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBUaGVtZU92ZXJyaWRlUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoVGhlbWVPdmVycmlkZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgVGhlbWVQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChUaGVtZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgVGh1bWJuYWlsUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoVGh1bWJuYWlsUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyNpZiAhTkVUMzUKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBUaW1lTGluZUNhY2hlUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoVGltZUxpbmVDYWNoZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgVGltZUxpbmVQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChUaW1lTGluZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBVc2VyRGVmaW5lZFRhZ3NQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChVc2VyRGVmaW5lZFRhZ3NQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFZiYURhdGFQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChWYmFEYXRhUGFydCluZXdDb250ZW50UGFydCkuQWRkRXh0ZW5kZWRQYXJ0KG9sZFBhcnQuUmVsYXRpb25zaGlwVHlwZSwgb2xkUGFydC5Db250ZW50VHlwZSwgZmlsZUluZm8uRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBWYmFQcm9qZWN0UGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9ICgoVmJhUHJvamVjdFBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgVmlld1Byb3BlcnRpZXNQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gKChWaWV3UHJvcGVydGllc1BhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgVm1sRHJhd2luZ1BhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFZtbERyYXdpbmdQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRFeHRlbmRlZFBhcnQob2xkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBvbGRQYXJ0LkNvbnRlbnRUeXBlLCBmaWxlSW5mby5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFhtbFNpZ25hdHVyZVBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAoKFhtbFNpZ25hdHVyZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEV4dGVuZGVkUGFydChvbGRQYXJ0LlJlbGF0aW9uc2hpcFR5cGUsIG9sZFBhcnQuQ29udGVudFR5cGUsIGZpbGVJbmZvLkV4dGVuc2lvbik7CisKKyAgICAgICAgICAgICAgICByZWxJZCA9IG5ld0NvbnRlbnRQYXJ0LkdldElkT2ZQYXJ0KG5ld1BhcnQpOworICAgICAgICAgICAgICAgIG5ld1BhcnQuRmVlZERhdGEob2xkUGFydC5HZXRTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgZXh0ZW5kZWRSZWZlcmVuY2UuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpLlZhbHVlID0gcmVsSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxSZWxhdGlvbnNoaXAgZXIgPSBvbGRDb250ZW50UGFydC5HZXRFeHRlcm5hbFJlbGF0aW9uc2hpcChyZWxJZCk7CisgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsUmVsYXRpb25zaGlwIG5ld0VyID0gbmV3Q29udGVudFBhcnQuQWRkRXh0ZXJuYWxSZWxhdGlvbnNoaXAoZXIuUmVsYXRpb25zaGlwVHlwZSwgZXIuVXJpKTsKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRSZWZlcmVuY2UuQXR0cmlidXRlKFIuaWQpLlZhbHVlID0gbmV3RXIuSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChLZXlOb3RGb3VuZEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBmcm9tUGFydCA9IG5ld0NvbnRlbnRQYXJ0Lk9wZW5YbWxQYWNrYWdlLlBhY2thZ2UuR2V0UGFydHMoKS5GaXJzdE9yRGVmYXVsdChwID0+IHAuVXJpID09IG5ld0NvbnRlbnRQYXJ0LlVyaSk7CisgICAgICAgICAgICAgICAgICAgIGZyb21QYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChuZXcgVXJpKCJOVUxMIiwgVXJpS2luZC5SZWxhdGl2ZU9yQWJzb2x1dGUpLCBTeXN0ZW0uSU8uUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2ltYWdlIiwgcmVsSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEdlbmVyYWwgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIGltYWdlcyB0aGF0IHRyaWVzIHRvIHVzZSBhbiBleGlzdGluZyBpbWFnZSBpZiB0aGV5IGFyZSB0aGUgc2FtZQorICAgICAgICBwcml2YXRlIHN0YXRpYyBJbWFnZURhdGEgTWFuYWdlSW1hZ2VDb3B5KEltYWdlUGFydCBvbGRJbWFnZSwgT3BlblhtbFBhcnQgbmV3Q29udGVudFBhcnQsIExpc3Q8SW1hZ2VEYXRhPiBpbWFnZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEltYWdlRGF0YSBvbGRJbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKG9sZEltYWdlKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKEltYWdlRGF0YSBpdGVtIGluIGltYWdlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS5Db21wYXJlKG9sZEltYWdlRGF0YSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW1hZ2VzLkFkZChvbGRJbWFnZURhdGEpOworICAgICAgICAgICAgcmV0dXJuIG9sZEltYWdlRGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdlbmVyYWwgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIG1lZGlhIHRoYXQgdHJpZXMgdG8gdXNlIGFuIGV4aXN0aW5nIG1lZGlhIGl0ZW0gaWYgdGhleSBhcmUgdGhlIHNhbWUKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTWVkaWFEYXRhIE1hbmFnZU1lZGlhQ29weShEYXRhUGFydCBvbGRNZWRpYSwgTGlzdDxNZWRpYURhdGE+IG1lZGlhTGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgTWVkaWFEYXRhIG9sZE1lZGlhRGF0YSA9IG5ldyBNZWRpYURhdGEob2xkTWVkaWEpOworICAgICAgICAgICAgZm9yZWFjaCAoTWVkaWFEYXRhIGl0ZW0gaW4gbWVkaWFMaXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpdGVtLkNvbXBhcmUob2xkTWVkaWFEYXRhKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZWRpYUxpc3QuQWRkKG9sZE1lZGlhRGF0YSk7CisgICAgICAgICAgICByZXR1cm4gb2xkTWVkaWFEYXRhOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb3B5UmVsYXRlZFNvdW5kKFByZXNlbnRhdGlvbkRvY3VtZW50IG5ld0RvY3VtZW50LCBPcGVuWG1sUGFydCBvbGRDb250ZW50UGFydCwgT3BlblhtbFBhcnQgbmV3Q29udGVudFBhcnQsCisgICAgICAgICAgICBYRWxlbWVudCBzb3VuZFJlZmVyZW5jZSwgWE5hbWUgYXR0cmlidXRlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHJlbElkID0gKHN0cmluZylzb3VuZFJlZmVyZW5jZS5BdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7CisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkocmVsSWQpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgRXh0ZXJuYWxSZWxhdGlvbnNoaXAgYWxyZWFkeUV4aXN0aW5nRXh0ZXJuYWxSZWxhdGlvbnNoaXAgPSBuZXdDb250ZW50UGFydC5FeHRlcm5hbFJlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoZXIgPT4gZXIuSWQgPT0gcmVsSWQpOworICAgICAgICAgICAgaWYgKGFscmVhZHlFeGlzdGluZ0V4dGVybmFsUmVsYXRpb25zaGlwICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBSZWZlcmVuY2VSZWxhdGlvbnNoaXAgYWxyZWFkeUV4aXN0aW5nUmVmZXJlbmNlUmVsYXRpb25zaGlwID0gbmV3Q29udGVudFBhcnQuRGF0YVBhcnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KGVyID0+IGVyLklkID09IHJlbElkKTsKKyAgICAgICAgICAgIGlmIChhbHJlYWR5RXhpc3RpbmdSZWZlcmVuY2VSZWxhdGlvbnNoaXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGlmIChvbGRDb250ZW50UGFydC5HZXRSZWZlcmVuY2VSZWxhdGlvbnNoaXAocmVsSWQpIGlzIEF1ZGlvUmVmZXJlbmNlUmVsYXRpb25zaGlwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEF1ZGlvUmVmZXJlbmNlUmVsYXRpb25zaGlwIHRlbXAgPSAoQXVkaW9SZWZlcmVuY2VSZWxhdGlvbnNoaXApb2xkQ29udGVudFBhcnQuR2V0UmVmZXJlbmNlUmVsYXRpb25zaGlwKHJlbElkKTsKKyAgICAgICAgICAgICAgICBNZWRpYURhdGFQYXJ0IG5ld1NvdW5kID0gbmV3RG9jdW1lbnQuQ3JlYXRlTWVkaWFEYXRhUGFydCh0ZW1wLkRhdGFQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICBuZXdTb3VuZC5GZWVkRGF0YSh0ZW1wLkRhdGFQYXJ0LkdldFN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICBBdWRpb1JlZmVyZW5jZVJlbGF0aW9uc2hpcCBuZXdSZWwgPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFNsaWRlUGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UmVsID0gKChTbGlkZVBhcnQpbmV3Q29udGVudFBhcnQpLkFkZEF1ZGlvUmVmZXJlbmNlUmVsYXRpb25zaGlwKG5ld1NvdW5kKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBTbGlkZUxheW91dFBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1JlbCA9ICgoU2xpZGVMYXlvdXRQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRBdWRpb1JlZmVyZW5jZVJlbGF0aW9uc2hpcChuZXdTb3VuZCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgU2xpZGVNYXN0ZXJQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdSZWwgPSAoKFNsaWRlTWFzdGVyUGFydCluZXdDb250ZW50UGFydCkuQWRkQXVkaW9SZWZlcmVuY2VSZWxhdGlvbnNoaXAobmV3U291bmQpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIEhhbmRvdXRNYXN0ZXJQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdSZWwgPSAoKEhhbmRvdXRNYXN0ZXJQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRBdWRpb1JlZmVyZW5jZVJlbGF0aW9uc2hpcChuZXdTb3VuZCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3Q29udGVudFBhcnQgaXMgTm90ZXNNYXN0ZXJQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdSZWwgPSAoKE5vdGVzTWFzdGVyUGFydCluZXdDb250ZW50UGFydCkuQWRkQXVkaW9SZWZlcmVuY2VSZWxhdGlvbnNoaXAobmV3U291bmQpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIE5vdGVzU2xpZGVQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdSZWwgPSAoKE5vdGVzU2xpZGVQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRBdWRpb1JlZmVyZW5jZVJlbGF0aW9uc2hpcChuZXdTb3VuZCk7CisgICAgICAgICAgICAgICAgc291bmRSZWZlcmVuY2UuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpLlZhbHVlID0gbmV3UmVsLklkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9sZENvbnRlbnRQYXJ0LkdldFJlZmVyZW5jZVJlbGF0aW9uc2hpcChyZWxJZCkgaXMgTWVkaWFSZWZlcmVuY2VSZWxhdGlvbnNoaXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWVkaWFSZWZlcmVuY2VSZWxhdGlvbnNoaXAgdGVtcCA9IChNZWRpYVJlZmVyZW5jZVJlbGF0aW9uc2hpcClvbGRDb250ZW50UGFydC5HZXRSZWZlcmVuY2VSZWxhdGlvbnNoaXAocmVsSWQpOworICAgICAgICAgICAgICAgIE1lZGlhRGF0YVBhcnQgbmV3U291bmQgPSBuZXdEb2N1bWVudC5DcmVhdGVNZWRpYURhdGFQYXJ0KHRlbXAuRGF0YVBhcnQuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgIG5ld1NvdW5kLkZlZWREYXRhKHRlbXAuRGF0YVBhcnQuR2V0U3RyZWFtKCkpOworICAgICAgICAgICAgICAgIE1lZGlhUmVmZXJlbmNlUmVsYXRpb25zaGlwIG5ld1JlbCA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudFBhcnQgaXMgU2xpZGVQYXJ0KQorICAgICAgICAgICAgICAgICAgICBuZXdSZWwgPSAoKFNsaWRlUGFydCluZXdDb250ZW50UGFydCkuQWRkTWVkaWFSZWZlcmVuY2VSZWxhdGlvbnNoaXAobmV3U291bmQpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld0NvbnRlbnRQYXJ0IGlzIFNsaWRlTGF5b3V0UGFydCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UmVsID0gKChTbGlkZUxheW91dFBhcnQpbmV3Q29udGVudFBhcnQpLkFkZE1lZGlhUmVmZXJlbmNlUmVsYXRpb25zaGlwKG5ld1NvdW5kKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXdDb250ZW50UGFydCBpcyBTbGlkZU1hc3RlclBhcnQpCisgICAgICAgICAgICAgICAgICAgIG5ld1JlbCA9ICgoU2xpZGVNYXN0ZXJQYXJ0KW5ld0NvbnRlbnRQYXJ0KS5BZGRNZWRpYVJlZmVyZW5jZVJlbGF0aW9uc2hpcChuZXdTb3VuZCk7CisgICAgICAgICAgICAgICAgc291bmRSZWZlcmVuY2UuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpLlZhbHVlID0gbmV3UmVsLklkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFByZXNlbnRhdGlvbkJ1aWxkZXJFeGNlcHRpb24gOiBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBQcmVzZW50YXRpb25CdWlsZGVyRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKSA6IGJhc2UobWVzc2FnZSkgeyB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFByZXNlbnRhdGlvbkJ1aWxkZXJJbnRlcm5hbEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIFByZXNlbnRhdGlvbkJ1aWxkZXJJbnRlcm5hbEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkgOiBiYXNlKG1lc3NhZ2UpIHsgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzMjg4MgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsMyBAQAor77u/dXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKKworW2Fzc2VtYmx5OiBJbnRlcm5hbHNWaXNpYmxlVG8oIk9wZW5YbWxQb3dlclRvb2xzLlRlc3RzIildCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9QdE9wZW5YbWxEb2N1bWVudC5jcyBiL09wZW5YbWxQb3dlclRvb2xzL1B0T3BlblhtbERvY3VtZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjU3NGMKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9QdE9wZW5YbWxEb2N1bWVudC5jcwpAQCAtMCwwICsxLDc3MiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKK0hlcmUgaXMgbW9kaWZpY2F0aW9uIG9mIGEgV21sRG9jdW1lbnQ6CisgICAgcHVibGljIHN0YXRpYyBXbWxEb2N1bWVudCBTaW1wbGlmeU1hcmt1cChXbWxEb2N1bWVudCBkb2MsIFNpbXBsaWZ5TWFya3VwU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgeworICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoZG9jKSkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jdW1lbnQgPSBzdHJlYW1Eb2MuR2V0V29yZHByb2Nlc3NpbmdEb2N1bWVudCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNpbXBsaWZ5TWFya3VwKGRvY3VtZW50LCBzZXR0aW5ncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RyZWFtRG9jLkdldE1vZGlmaWVkV21sRG9jdW1lbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworSGVyZSBpcyByZWFkLW9ubHkgb2YgYSBXbWxEb2N1bWVudDoKKworICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEJhY2tncm91bmRDb2xvcihXbWxEb2N1bWVudCBkb2MpCisgICAgeworICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoZG9jKSkKKyAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jdW1lbnQgPSBzdHJlYW1Eb2MuR2V0V29yZHByb2Nlc3NpbmdEb2N1bWVudCgpKQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgbWFpbkRvY3VtZW50ID0gZG9jdW1lbnQuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGJhY2tncm91bmRFbGVtZW50ID0gbWFpbkRvY3VtZW50LkRlc2NlbmRhbnRzKFcuYmFja2dyb3VuZCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIHJldHVybiAoYmFja2dyb3VuZEVsZW1lbnQgPT0gbnVsbCkgPyBzdHJpbmcuRW1wdHkgOiBiYWNrZ3JvdW5kRWxlbWVudC5BdHRyaWJ1dGUoVy5jb2xvcikuVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKK0hlcmUgaXMgY3JlYXRpbmcgYSBuZXcgV21sRG9jdW1lbnQ6CisKKyAgICBwcml2YXRlIE9wZW5YbWxQb3dlclRvb2xzRG9jdW1lbnQgQ3JlYXRlU3BsaXREb2N1bWVudChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHNvdXJjZSwgTGlzdDxYRWxlbWVudD4gY29udGVudHMsIHN0cmluZyBuZXdGaWxlTmFtZSkKKyAgICB7CisgICAgICAgIHVzaW5nIChPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgc3RyZWFtRG9jID0gT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50LkNyZWF0ZVdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jdW1lbnQgPSBzdHJlYW1Eb2MuR2V0V29yZHByb2Nlc3NpbmdEb2N1bWVudCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERvY3VtZW50QnVpbGRlci5GaXhSYW5nZXMoc291cmNlLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCksIGNvbnRlbnRzKTsKKyAgICAgICAgICAgICAgICBQb3dlclRvb2xzRXh0ZW5zaW9ucy5TZXRDb250ZW50KGRvY3VtZW50LCBjb250ZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50IG5ld0RvYyA9IHN0cmVhbURvYy5HZXRNb2RpZmllZERvY3VtZW50KCk7CisgICAgICAgICAgICBuZXdEb2MuRmlsZU5hbWUgPSBuZXdGaWxlTmFtZTsKKyAgICAgICAgICAgIHJldHVybiBuZXdEb2M7CisgICAgICAgIH0KKyAgICB9CisqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIFN5c3RlbS5JTy5QYWNrYWdpbmc7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgcHVibGljIGNsYXNzIFBvd2VyVG9vbHNEb2N1bWVudEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIFBvd2VyVG9vbHNEb2N1bWVudEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkgOiBiYXNlKG1lc3NhZ2UpIHsgfQorICAgIH0KKyAgICBwdWJsaWMgY2xhc3MgUG93ZXJUb29sc0ludmFsaWREYXRhRXhjZXB0aW9uIDogRXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgUG93ZXJUb29sc0ludmFsaWREYXRhRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKSA6IGJhc2UobWVzc2FnZSkgeyB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE9wZW5YbWxQb3dlclRvb2xzRG9jdW1lbnQKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgRmlsZU5hbWUgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgYnl0ZVtdIERvY3VtZW50Qnl0ZUFycmF5IHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIE9wZW5YbWxQb3dlclRvb2xzRG9jdW1lbnQgRnJvbUZpbGVOYW1lKHN0cmluZyBmaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRmlsZS5SZWFkQWxsQnl0ZXMoZmlsZU5hbWUpOworICAgICAgICAgICAgVHlwZSB0eXBlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZSA9IEdldERvY3VtZW50VHlwZShieXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRmlsZUZvcm1hdEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUG93ZXJUb29sc0RvY3VtZW50RXhjZXB0aW9uKCJOb3QgYW4gT3BlbiBYTUwgZG9jdW1lbnQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHlwZSA9PSB0eXBlb2YoV29yZHByb2Nlc3NpbmdEb2N1bWVudCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXbWxEb2N1bWVudChmaWxlTmFtZSwgYnl0ZXMpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gdHlwZW9mKFNwcmVhZHNoZWV0RG9jdW1lbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU21sRG9jdW1lbnQoZmlsZU5hbWUsIGJ5dGVzKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IHR5cGVvZihQcmVzZW50YXRpb25Eb2N1bWVudCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQbWxEb2N1bWVudChmaWxlTmFtZSwgYnl0ZXMpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gdHlwZW9mKFBhY2thZ2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9wZW5YbWxQb3dlclRvb2xzRG9jdW1lbnQgcGtnID0gbmV3IE9wZW5YbWxQb3dlclRvb2xzRG9jdW1lbnQoYnl0ZXMpOworICAgICAgICAgICAgICAgIHBrZy5GaWxlTmFtZSA9IGZpbGVOYW1lOworICAgICAgICAgICAgICAgIHJldHVybiBwa2c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgUG93ZXJUb29sc0RvY3VtZW50RXhjZXB0aW9uKCJOb3QgYW4gT3BlbiBYTUwgZG9jdW1lbnQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIE9wZW5YbWxQb3dlclRvb2xzRG9jdW1lbnQgRnJvbURvY3VtZW50KE9wZW5YbWxQb3dlclRvb2xzRG9jdW1lbnQgZG9jKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlIHR5cGUgPSBkb2MuR2V0RG9jdW1lbnRUeXBlKCk7CisgICAgICAgICAgICBpZiAodHlwZSA9PSB0eXBlb2YoV29yZHByb2Nlc3NpbmdEb2N1bWVudCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXbWxEb2N1bWVudChkb2MpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gdHlwZW9mKFNwcmVhZHNoZWV0RG9jdW1lbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU21sRG9jdW1lbnQoZG9jKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IHR5cGVvZihQcmVzZW50YXRpb25Eb2N1bWVudCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQbWxEb2N1bWVudChkb2MpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBmcm9tIGEgdmFsaWQgT3BlblhtbFBvd2VyVG9vbHNEb2N1bWVudCBvYmplY3QKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50KE9wZW5YbWxQb3dlclRvb2xzRG9jdW1lbnQgb3JpZ2luYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIERvY3VtZW50Qnl0ZUFycmF5ID0gbmV3IGJ5dGVbb3JpZ2luYWwuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoXTsKKyAgICAgICAgICAgIEFycmF5LkNvcHkob3JpZ2luYWwuRG9jdW1lbnRCeXRlQXJyYXksIERvY3VtZW50Qnl0ZUFycmF5LCBvcmlnaW5hbC5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgRmlsZU5hbWUgPSBvcmlnaW5hbC5GaWxlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50KE9wZW5YbWxQb3dlclRvb2xzRG9jdW1lbnQgb3JpZ2luYWwsIGJvb2wgY29udmVydFRvVHJhbnNpdGlvbmFsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29udmVydFRvVHJhbnNpdGlvbmFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnZlcnRUb1RyYW5zaXRpb25hbChvcmlnaW5hbC5GaWxlTmFtZSwgb3JpZ2luYWwuRG9jdW1lbnRCeXRlQXJyYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERvY3VtZW50Qnl0ZUFycmF5ID0gbmV3IGJ5dGVbb3JpZ2luYWwuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KG9yaWdpbmFsLkRvY3VtZW50Qnl0ZUFycmF5LCBEb2N1bWVudEJ5dGVBcnJheSwgb3JpZ2luYWwuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBGaWxlTmFtZSA9IG9yaWdpbmFsLkZpbGVOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9wZW5YbWxQb3dlclRvb2xzRG9jdW1lbnQoc3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLkZpbGVOYW1lID0gZmlsZU5hbWU7CisgICAgICAgICAgICBEb2N1bWVudEJ5dGVBcnJheSA9IEZpbGUuUmVhZEFsbEJ5dGVzKGZpbGVOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50KHN0cmluZyBmaWxlTmFtZSwgYm9vbCBjb252ZXJ0VG9UcmFuc2l0aW9uYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuRmlsZU5hbWUgPSBmaWxlTmFtZTsKKworICAgICAgICAgICAgaWYgKGNvbnZlcnRUb1RyYW5zaXRpb25hbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdGVtcEJ5dGVBcnJheSA9IEZpbGUuUmVhZEFsbEJ5dGVzKGZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICBDb252ZXJ0VG9UcmFuc2l0aW9uYWwoZmlsZU5hbWUsIHRlbXBCeXRlQXJyYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuRmlsZU5hbWUgPSBmaWxlTmFtZTsKKyAgICAgICAgICAgICAgICBEb2N1bWVudEJ5dGVBcnJheSA9IEZpbGUuUmVhZEFsbEJ5dGVzKGZpbGVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDb252ZXJ0VG9UcmFuc2l0aW9uYWwoc3RyaW5nIGZpbGVOYW1lLCBieXRlW10gdGVtcEJ5dGVBcnJheSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSB0eXBlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZSA9IEdldERvY3VtZW50VHlwZSh0ZW1wQnl0ZUFycmF5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChGaWxlRm9ybWF0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQb3dlclRvb2xzRG9jdW1lbnRFeGNlcHRpb24oIk5vdCBhbiBPcGVuIFhNTCBkb2N1bWVudC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtcy5Xcml0ZSh0ZW1wQnl0ZUFycmF5LCAwLCB0ZW1wQnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gdHlwZW9mKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgc0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtcywgdHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2luZyBjb2RlIGZvcmNlcyB0aGUgU0RLIHRvIHNlcmlhbGl6ZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gc0RvYy5QYXJ0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB6ID0gcGFydC5PcGVuWG1sUGFydC5Sb290RWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IHR5cGVvZihTcHJlYWRzaGVldERvY3VtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4obXMsIHRydWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xsb3dpbmcgY29kZSBmb3JjZXMgdGhlIFNESyB0byBzZXJpYWxpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYXJ0IGluIHNEb2MuUGFydHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IHBhcnQuT3BlblhtbFBhcnQuUm9vdEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSB0eXBlb2YoUHJlc2VudGF0aW9uRG9jdW1lbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFByZXNlbnRhdGlvbkRvY3VtZW50IHNEb2MgPSBQcmVzZW50YXRpb25Eb2N1bWVudC5PcGVuKG1zLCB0cnVlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sbG93aW5nIGNvZGUgZm9yY2VzIHRoZSBTREsgdG8gc2VyaWFsaXplCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFydCBpbiBzRG9jLlBhcnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHogPSBwYXJ0Lk9wZW5YbWxQYXJ0LlJvb3RFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuRmlsZU5hbWUgPSBmaWxlTmFtZTsKKyAgICAgICAgICAgICAgICBEb2N1bWVudEJ5dGVBcnJheSA9IG1zLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50KGJ5dGVbXSBieXRlQXJyYXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERvY3VtZW50Qnl0ZUFycmF5ID0gbmV3IGJ5dGVbYnl0ZUFycmF5Lkxlbmd0aF07CisgICAgICAgICAgICBBcnJheS5Db3B5KGJ5dGVBcnJheSwgRG9jdW1lbnRCeXRlQXJyYXksIGJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgdGhpcy5GaWxlTmFtZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT3BlblhtbFBvd2VyVG9vbHNEb2N1bWVudChieXRlW10gYnl0ZUFycmF5LCBib29sIGNvbnZlcnRUb1RyYW5zaXRpb25hbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbnZlcnRUb1RyYW5zaXRpb25hbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb252ZXJ0VG9UcmFuc2l0aW9uYWwobnVsbCwgYnl0ZUFycmF5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEb2N1bWVudEJ5dGVBcnJheSA9IG5ldyBieXRlW2J5dGVBcnJheS5MZW5ndGhdOworICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoYnl0ZUFycmF5LCBEb2N1bWVudEJ5dGVBcnJheSwgYnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdGhpcy5GaWxlTmFtZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT3BlblhtbFBvd2VyVG9vbHNEb2N1bWVudChzdHJpbmcgZmlsZU5hbWUsIE1lbW9yeVN0cmVhbSBtZW1TdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVOYW1lID0gZmlsZU5hbWU7CisgICAgICAgICAgICBEb2N1bWVudEJ5dGVBcnJheSA9IG5ldyBieXRlW21lbVN0cmVhbS5MZW5ndGhdOworICAgICAgICAgICAgQXJyYXkuQ29weShtZW1TdHJlYW0uR2V0QnVmZmVyKCksIERvY3VtZW50Qnl0ZUFycmF5LCBtZW1TdHJlYW0uTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50KHN0cmluZyBmaWxlTmFtZSwgTWVtb3J5U3RyZWFtIG1lbVN0cmVhbSwgYm9vbCBjb252ZXJ0VG9UcmFuc2l0aW9uYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0VG9UcmFuc2l0aW9uYWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29udmVydFRvVHJhbnNpdGlvbmFsKGZpbGVOYW1lLCBtZW1TdHJlYW0uVG9BcnJheSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlTmFtZSA9IGZpbGVOYW1lOworICAgICAgICAgICAgICAgIERvY3VtZW50Qnl0ZUFycmF5ID0gbmV3IGJ5dGVbbWVtU3RyZWFtLkxlbmd0aF07CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShtZW1TdHJlYW0uR2V0QnVmZmVyKCksIERvY3VtZW50Qnl0ZUFycmF5LCBtZW1TdHJlYW0uTGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgR2V0TmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChGaWxlTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAiVW5uYW1lZCBEb2N1bWVudCI7CisgICAgICAgICAgICBGaWxlSW5mbyBmaWxlID0gbmV3IEZpbGVJbmZvKEZpbGVOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBmaWxlLk5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTYXZlQXMoc3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlLldyaXRlQWxsQnl0ZXMoZmlsZU5hbWUsIERvY3VtZW50Qnl0ZUFycmF5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFNhdmUoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpcy5GaWxlTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJBdHRlbXB0aW5nIHRvIFNhdmUgYSBkb2N1bWVudCB0aGF0IGhhcyBubyBmaWxlIG5hbWUuICBVc2UgU2F2ZUFzIGluc3RlYWQuIik7CisgICAgICAgICAgICBGaWxlLldyaXRlQWxsQnl0ZXModGhpcy5GaWxlTmFtZSwgRG9jdW1lbnRCeXRlQXJyYXkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVCeXRlQXJyYXkoU3RyZWFtIHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyZWFtLldyaXRlKERvY3VtZW50Qnl0ZUFycmF5LCAwLCBEb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFR5cGUgR2V0RG9jdW1lbnRUeXBlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldERvY3VtZW50VHlwZShEb2N1bWVudEJ5dGVBcnJheSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUeXBlIEdldERvY3VtZW50VHlwZShieXRlW10gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmVhbS5Xcml0ZShieXRlcywgMCwgYnl0ZXMuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB1c2luZyAoUGFja2FnZSBwYWNrYWdlID0gUGFja2FnZS5PcGVuKHN0cmVhbSwgRmlsZU1vZGUuT3BlbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQYWNrYWdlUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA9IHBhY2thZ2UuR2V0UmVsYXRpb25zaGlwc0J5VHlwZSgiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9vZmZpY2VEb2N1bWVudCIpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IHBhY2thZ2UuR2V0UmVsYXRpb25zaGlwc0J5VHlwZSgiaHR0cDovL3B1cmwub2NsYy5vcmcvb294bWwvb2ZmaWNlRG9jdW1lbnQvcmVsYXRpb25zaGlwcy9vZmZpY2VEb2N1bWVudCIpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZVBhcnQgcGFydCA9IHBhY2thZ2UuR2V0UGFydChQYWNrVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKHJlbGF0aW9uc2hpcC5Tb3VyY2VVcmksIHJlbGF0aW9uc2hpcC5UYXJnZXRVcmkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGFydC5Db250ZW50VHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudC5tYWluK3htbCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiYXBwbGljYXRpb24vdm5kLm1zLXdvcmQuZG9jdW1lbnQubWFjcm9FbmFibGVkLm1haW4reG1sIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJhcHBsaWNhdGlvbi92bmQubXMtd29yZC50ZW1wbGF0ZS5tYWNyb0VuYWJsZWRUZW1wbGF0ZS5tYWluK3htbCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwudGVtcGxhdGUubWFpbit4bWwiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Lm1haW4reG1sIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc2hlZXQubWFjcm9FbmFibGVkLm1haW4reG1sIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwudGVtcGxhdGUubWFjcm9FbmFibGVkLm1haW4reG1sIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZS5tYWluK3htbCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YoU3ByZWFkc2hlZXREb2N1bWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlLm1haW4reG1sIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uLm1haW4reG1sIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC50ZW1wbGF0ZS5tYWNyb0VuYWJsZWQubWFpbit4bWwiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LmFkZGluLm1hY3JvRW5hYmxlZC5tYWluK3htbCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdy5tYWluK3htbCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQucHJlc2VudGF0aW9uLm1hY3JvRW5hYmxlZC5tYWluK3htbCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YoUHJlc2VudGF0aW9uRG9jdW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZihQYWNrYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgU2F2ZVBhcnRBcyhPcGVuWG1sUGFydCBwYXJ0LCBzdHJpbmcgZmlsZVBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmVhbSBwYXJ0U3RyZWFtID0gcGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkKTsKKyAgICAgICAgICAgIGJ5dGVbXSBwYXJ0Q29udGVudCA9IG5ldyBieXRlW3BhcnRTdHJlYW0uTGVuZ3RoXTsKKyAgICAgICAgICAgIHBhcnRTdHJlYW0uUmVhZChwYXJ0Q29udGVudCwgMCwgKGludClwYXJ0U3RyZWFtLkxlbmd0aCk7CisKKyAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxCeXRlcyhmaWxlUGF0aCwgcGFydENvbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHBhcnRpYWwgY2xhc3MgV21sRG9jdW1lbnQgOiBPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50CisgICAgeworICAgICAgICBwdWJsaWMgV21sRG9jdW1lbnQoT3BlblhtbFBvd2VyVG9vbHNEb2N1bWVudCBvcmlnaW5hbCkKKyAgICAgICAgICAgIDogYmFzZShvcmlnaW5hbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEdldERvY3VtZW50VHlwZSgpICE9IHR5cGVvZihXb3JkcHJvY2Vzc2luZ0RvY3VtZW50KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUG93ZXJUb29sc0RvY3VtZW50RXhjZXB0aW9uKCJOb3QgYSBXb3JkcHJvY2Vzc2luZyBkb2N1bWVudC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBXbWxEb2N1bWVudChPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50IG9yaWdpbmFsLCBib29sIGNvbnZlcnRUb1RyYW5zaXRpb25hbCkKKyAgICAgICAgICAgIDogYmFzZShvcmlnaW5hbCwgY29udmVydFRvVHJhbnNpdGlvbmFsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoR2V0RG9jdW1lbnRUeXBlKCkgIT0gdHlwZW9mKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBQb3dlclRvb2xzRG9jdW1lbnRFeGNlcHRpb24oIk5vdCBhIFdvcmRwcm9jZXNzaW5nIGRvY3VtZW50LiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFdtbERvY3VtZW50KHN0cmluZyBmaWxlTmFtZSkKKyAgICAgICAgICAgIDogYmFzZShmaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEdldERvY3VtZW50VHlwZSgpICE9IHR5cGVvZihXb3JkcHJvY2Vzc2luZ0RvY3VtZW50KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUG93ZXJUb29sc0RvY3VtZW50RXhjZXB0aW9uKCJOb3QgYSBXb3JkcHJvY2Vzc2luZyBkb2N1bWVudC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBXbWxEb2N1bWVudChzdHJpbmcgZmlsZU5hbWUsIGJvb2wgY29udmVydFRvVHJhbnNpdGlvbmFsKQorICAgICAgICAgICAgOiBiYXNlKGZpbGVOYW1lLCBjb252ZXJ0VG9UcmFuc2l0aW9uYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChHZXREb2N1bWVudFR5cGUoKSAhPSB0eXBlb2YoV29yZHByb2Nlc3NpbmdEb2N1bWVudCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBvd2VyVG9vbHNEb2N1bWVudEV4Y2VwdGlvbigiTm90IGEgV29yZHByb2Nlc3NpbmcgZG9jdW1lbnQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgV21sRG9jdW1lbnQoc3RyaW5nIGZpbGVOYW1lLCBieXRlW10gYnl0ZUFycmF5KQorICAgICAgICAgICAgOiBiYXNlKGJ5dGVBcnJheSkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZU5hbWUgPSBmaWxlTmFtZTsKKyAgICAgICAgICAgIGlmIChHZXREb2N1bWVudFR5cGUoKSAhPSB0eXBlb2YoV29yZHByb2Nlc3NpbmdEb2N1bWVudCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBvd2VyVG9vbHNEb2N1bWVudEV4Y2VwdGlvbigiTm90IGEgV29yZHByb2Nlc3NpbmcgZG9jdW1lbnQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgV21sRG9jdW1lbnQoc3RyaW5nIGZpbGVOYW1lLCBieXRlW10gYnl0ZUFycmF5LCBib29sIGNvbnZlcnRUb1RyYW5zaXRpb25hbCkKKyAgICAgICAgICAgIDogYmFzZShieXRlQXJyYXksIGNvbnZlcnRUb1RyYW5zaXRpb25hbCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZU5hbWUgPSBmaWxlTmFtZTsKKyAgICAgICAgICAgIGlmIChHZXREb2N1bWVudFR5cGUoKSAhPSB0eXBlb2YoV29yZHByb2Nlc3NpbmdEb2N1bWVudCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBvd2VyVG9vbHNEb2N1bWVudEV4Y2VwdGlvbigiTm90IGEgV29yZHByb2Nlc3NpbmcgZG9jdW1lbnQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgV21sRG9jdW1lbnQoc3RyaW5nIGZpbGVOYW1lLCBNZW1vcnlTdHJlYW0gbWVtU3RyZWFtKQorICAgICAgICAgICAgOiBiYXNlKGZpbGVOYW1lLCBtZW1TdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBXbWxEb2N1bWVudChzdHJpbmcgZmlsZU5hbWUsIE1lbW9yeVN0cmVhbSBtZW1TdHJlYW0sIGJvb2wgY29udmVydFRvVHJhbnNpdGlvbmFsKQorICAgICAgICAgICAgOiBiYXNlKGZpbGVOYW1lLCBtZW1TdHJlYW0sIGNvbnZlcnRUb1RyYW5zaXRpb25hbCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHBhcnRpYWwgY2xhc3MgU21sRG9jdW1lbnQgOiBPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50CisgICAgeworICAgICAgICBwdWJsaWMgU21sRG9jdW1lbnQoT3BlblhtbFBvd2VyVG9vbHNEb2N1bWVudCBvcmlnaW5hbCkKKyAgICAgICAgICAgIDogYmFzZShvcmlnaW5hbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEdldERvY3VtZW50VHlwZSgpICE9IHR5cGVvZihTcHJlYWRzaGVldERvY3VtZW50KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUG93ZXJUb29sc0RvY3VtZW50RXhjZXB0aW9uKCJOb3QgYSBTcHJlYWRzaGVldCBkb2N1bWVudC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTbWxEb2N1bWVudChPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50IG9yaWdpbmFsLCBib29sIGNvbnZlcnRUb1RyYW5zaXRpb25hbCkKKyAgICAgICAgICAgIDogYmFzZShvcmlnaW5hbCwgY29udmVydFRvVHJhbnNpdGlvbmFsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoR2V0RG9jdW1lbnRUeXBlKCkgIT0gdHlwZW9mKFNwcmVhZHNoZWV0RG9jdW1lbnQpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBQb3dlclRvb2xzRG9jdW1lbnRFeGNlcHRpb24oIk5vdCBhIFNwcmVhZHNoZWV0IGRvY3VtZW50LiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNtbERvY3VtZW50KHN0cmluZyBmaWxlTmFtZSkKKyAgICAgICAgICAgIDogYmFzZShmaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEdldERvY3VtZW50VHlwZSgpICE9IHR5cGVvZihTcHJlYWRzaGVldERvY3VtZW50KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUG93ZXJUb29sc0RvY3VtZW50RXhjZXB0aW9uKCJOb3QgYSBTcHJlYWRzaGVldCBkb2N1bWVudC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTbWxEb2N1bWVudChzdHJpbmcgZmlsZU5hbWUsIGJvb2wgY29udmVydFRvVHJhbnNpdGlvbmFsKQorICAgICAgICAgICAgOiBiYXNlKGZpbGVOYW1lLCBjb252ZXJ0VG9UcmFuc2l0aW9uYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChHZXREb2N1bWVudFR5cGUoKSAhPSB0eXBlb2YoU3ByZWFkc2hlZXREb2N1bWVudCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBvd2VyVG9vbHNEb2N1bWVudEV4Y2VwdGlvbigiTm90IGEgU3ByZWFkc2hlZXQgZG9jdW1lbnQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU21sRG9jdW1lbnQoc3RyaW5nIGZpbGVOYW1lLCBieXRlW10gYnl0ZUFycmF5KQorICAgICAgICAgICAgOiBiYXNlKGJ5dGVBcnJheSkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZU5hbWUgPSBmaWxlTmFtZTsKKyAgICAgICAgICAgIGlmIChHZXREb2N1bWVudFR5cGUoKSAhPSB0eXBlb2YoU3ByZWFkc2hlZXREb2N1bWVudCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBvd2VyVG9vbHNEb2N1bWVudEV4Y2VwdGlvbigiTm90IGEgU3ByZWFkc2hlZXQgZG9jdW1lbnQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU21sRG9jdW1lbnQoc3RyaW5nIGZpbGVOYW1lLCBieXRlW10gYnl0ZUFycmF5LCBib29sIGNvbnZlcnRUb1RyYW5zaXRpb25hbCkKKyAgICAgICAgICAgIDogYmFzZShieXRlQXJyYXksIGNvbnZlcnRUb1RyYW5zaXRpb25hbCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZU5hbWUgPSBmaWxlTmFtZTsKKyAgICAgICAgICAgIGlmIChHZXREb2N1bWVudFR5cGUoKSAhPSB0eXBlb2YoU3ByZWFkc2hlZXREb2N1bWVudCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBvd2VyVG9vbHNEb2N1bWVudEV4Y2VwdGlvbigiTm90IGEgU3ByZWFkc2hlZXQgZG9jdW1lbnQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU21sRG9jdW1lbnQoc3RyaW5nIGZpbGVOYW1lLCBNZW1vcnlTdHJlYW0gbWVtU3RyZWFtKQorICAgICAgICAgICAgOiBiYXNlKGZpbGVOYW1lLCBtZW1TdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTbWxEb2N1bWVudChzdHJpbmcgZmlsZU5hbWUsIE1lbW9yeVN0cmVhbSBtZW1TdHJlYW0sIGJvb2wgY29udmVydFRvVHJhbnNpdGlvbmFsKQorICAgICAgICAgICAgOiBiYXNlKGZpbGVOYW1lLCBtZW1TdHJlYW0sIGNvbnZlcnRUb1RyYW5zaXRpb25hbCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHBhcnRpYWwgY2xhc3MgUG1sRG9jdW1lbnQgOiBPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50CisgICAgeworICAgICAgICBwdWJsaWMgUG1sRG9jdW1lbnQoT3BlblhtbFBvd2VyVG9vbHNEb2N1bWVudCBvcmlnaW5hbCkKKyAgICAgICAgICAgIDogYmFzZShvcmlnaW5hbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEdldERvY3VtZW50VHlwZSgpICE9IHR5cGVvZihQcmVzZW50YXRpb25Eb2N1bWVudCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBvd2VyVG9vbHNEb2N1bWVudEV4Y2VwdGlvbigiTm90IGEgUHJlc2VudGF0aW9uIGRvY3VtZW50LiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFBtbERvY3VtZW50KE9wZW5YbWxQb3dlclRvb2xzRG9jdW1lbnQgb3JpZ2luYWwsIGJvb2wgY29udmVydFRvVHJhbnNpdGlvbmFsKQorICAgICAgICAgICAgOiBiYXNlKG9yaWdpbmFsLCBjb252ZXJ0VG9UcmFuc2l0aW9uYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChHZXREb2N1bWVudFR5cGUoKSAhPSB0eXBlb2YoUHJlc2VudGF0aW9uRG9jdW1lbnQpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBQb3dlclRvb2xzRG9jdW1lbnRFeGNlcHRpb24oIk5vdCBhIFByZXNlbnRhdGlvbiBkb2N1bWVudC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQbWxEb2N1bWVudChzdHJpbmcgZmlsZU5hbWUpCisgICAgICAgICAgICA6IGJhc2UoZmlsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChHZXREb2N1bWVudFR5cGUoKSAhPSB0eXBlb2YoUHJlc2VudGF0aW9uRG9jdW1lbnQpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBQb3dlclRvb2xzRG9jdW1lbnRFeGNlcHRpb24oIk5vdCBhIFByZXNlbnRhdGlvbiBkb2N1bWVudC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQbWxEb2N1bWVudChzdHJpbmcgZmlsZU5hbWUsIGJvb2wgY29udmVydFRvVHJhbnNpdGlvbmFsKQorICAgICAgICAgICAgOiBiYXNlKGZpbGVOYW1lLCBjb252ZXJ0VG9UcmFuc2l0aW9uYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChHZXREb2N1bWVudFR5cGUoKSAhPSB0eXBlb2YoUHJlc2VudGF0aW9uRG9jdW1lbnQpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBQb3dlclRvb2xzRG9jdW1lbnRFeGNlcHRpb24oIk5vdCBhIFByZXNlbnRhdGlvbiBkb2N1bWVudC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQbWxEb2N1bWVudChzdHJpbmcgZmlsZU5hbWUsIGJ5dGVbXSBieXRlQXJyYXkpCisgICAgICAgICAgICA6IGJhc2UoYnl0ZUFycmF5KQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlTmFtZSA9IGZpbGVOYW1lOworICAgICAgICAgICAgaWYgKEdldERvY3VtZW50VHlwZSgpICE9IHR5cGVvZihQcmVzZW50YXRpb25Eb2N1bWVudCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBvd2VyVG9vbHNEb2N1bWVudEV4Y2VwdGlvbigiTm90IGEgUHJlc2VudGF0aW9uIGRvY3VtZW50LiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFBtbERvY3VtZW50KHN0cmluZyBmaWxlTmFtZSwgYnl0ZVtdIGJ5dGVBcnJheSwgYm9vbCBjb252ZXJ0VG9UcmFuc2l0aW9uYWwpCisgICAgICAgICAgICA6IGJhc2UoYnl0ZUFycmF5LCBjb252ZXJ0VG9UcmFuc2l0aW9uYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVOYW1lID0gZmlsZU5hbWU7CisgICAgICAgICAgICBpZiAoR2V0RG9jdW1lbnRUeXBlKCkgIT0gdHlwZW9mKFByZXNlbnRhdGlvbkRvY3VtZW50KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUG93ZXJUb29sc0RvY3VtZW50RXhjZXB0aW9uKCJOb3QgYSBQcmVzZW50YXRpb24gZG9jdW1lbnQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUG1sRG9jdW1lbnQoc3RyaW5nIGZpbGVOYW1lLCBNZW1vcnlTdHJlYW0gbWVtU3RyZWFtKQorICAgICAgICAgICAgOiBiYXNlKGZpbGVOYW1lLCBtZW1TdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQbWxEb2N1bWVudChzdHJpbmcgZmlsZU5hbWUsIE1lbW9yeVN0cmVhbSBtZW1TdHJlYW0sIGJvb2wgY29udmVydFRvVHJhbnNpdGlvbmFsKQorICAgICAgICAgICAgOiBiYXNlKGZpbGVOYW1lLCBtZW1TdHJlYW0sIGNvbnZlcnRUb1RyYW5zaXRpb25hbCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCA6IElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBwcml2YXRlIE9wZW5YbWxQb3dlclRvb2xzRG9jdW1lbnQgRG9jdW1lbnQ7CisgICAgICAgIHByaXZhdGUgTWVtb3J5U3RyZWFtIERvY01lbW9yeVN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBQYWNrYWdlIERvY1BhY2thZ2U7CisKKyAgICAgICAgcHVibGljIE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudChPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50IGRvYykKKyAgICAgICAgeworICAgICAgICAgICAgRG9jdW1lbnQgPSBkb2M7CisgICAgICAgICAgICBEb2NNZW1vcnlTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICBEb2NNZW1vcnlTdHJlYW0uV3JpdGUoZG9jLkRvY3VtZW50Qnl0ZUFycmF5LCAwLCBkb2MuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERvY1BhY2thZ2UgPSBQYWNrYWdlLk9wZW4oRG9jTWVtb3J5U3RyZWFtLCBGaWxlTW9kZS5PcGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUG93ZXJUb29sc0RvY3VtZW50RXhjZXB0aW9uKGUuTWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoTWVtb3J5U3RyZWFtIHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgRG9jTWVtb3J5U3RyZWFtID0gc3RyZWFtOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRG9jUGFja2FnZSA9IFBhY2thZ2UuT3BlbihEb2NNZW1vcnlTdHJlYW0sIEZpbGVNb2RlLk9wZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQb3dlclRvb2xzRG9jdW1lbnRFeGNlcHRpb24oZS5NZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IENyZWF0ZVdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoKQorICAgICAgICB7CisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5DcmVhdGUoc3RyZWFtLCBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLldvcmRwcm9jZXNzaW5nRG9jdW1lbnRUeXBlLkRvY3VtZW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb2MuQWRkTWFpbkRvY3VtZW50UGFydCgpOworICAgICAgICAgICAgICAgIGRvYy5NYWluRG9jdW1lbnRQYXJ0LlB1dFhEb2N1bWVudChuZXcgWERvY3VtZW50KAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5kb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidyIsIFcudyksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInIiLCBSLnIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuYm9keSkpKSk7CisgICAgICAgICAgICAgICAgZG9jLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCBDcmVhdGVTcHJlYWRzaGVldERvY3VtZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgTWVtb3J5U3RyZWFtIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IGRvYyA9IFNwcmVhZHNoZWV0RG9jdW1lbnQuQ3JlYXRlKHN0cmVhbSwgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5TcHJlYWRzaGVldERvY3VtZW50VHlwZS5Xb3JrYm9vaykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG9jLkFkZFdvcmtib29rUGFydCgpOworICAgICAgICAgICAgICAgIFhOYW1lc3BhY2UgbnMgPSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIjsKKyAgICAgICAgICAgICAgICBYTmFtZXNwYWNlIHJlbGF0aW9uc2hpcHNucyA9ICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIjsKKyAgICAgICAgICAgICAgICBkb2MuV29ya2Jvb2tQYXJ0LlB1dFhEb2N1bWVudChuZXcgWERvY3VtZW50KAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQobnMgKyAid29ya2Jvb2siLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoInhtbG5zIiwgbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJyIiwgcmVsYXRpb25zaGlwc25zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChucyArICJzaGVldHMiKSkpKTsKKyAgICAgICAgICAgICAgICBkb2MuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudChzdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IENyZWF0ZVByZXNlbnRhdGlvbkRvY3VtZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgTWVtb3J5U3RyZWFtIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHVzaW5nIChQcmVzZW50YXRpb25Eb2N1bWVudCBkb2MgPSBQcmVzZW50YXRpb25Eb2N1bWVudC5DcmVhdGUoc3RyZWFtLCBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlByZXNlbnRhdGlvbkRvY3VtZW50VHlwZS5QcmVzZW50YXRpb24pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvYy5BZGRQcmVzZW50YXRpb25QYXJ0KCk7CisgICAgICAgICAgICAgICAgWE5hbWVzcGFjZSBucyA9ICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcHJlc2VudGF0aW9ubWwvMjAwNi9tYWluIjsKKyAgICAgICAgICAgICAgICBYTmFtZXNwYWNlIHJlbGF0aW9uc2hpcHNucyA9ICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIjsKKyAgICAgICAgICAgICAgICBYTmFtZXNwYWNlIGRyYXdpbmducyA9ICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbWFpbiI7CisgICAgICAgICAgICAgICAgZG9jLlByZXNlbnRhdGlvblBhcnQuUHV0WERvY3VtZW50KG5ldyBYRG9jdW1lbnQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChucyArICJwcmVzZW50YXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJhIiwgZHJhd2luZ25zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAiciIsIHJlbGF0aW9uc2hpcHNucyksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInAiLCBucyksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQobnMgKyAic2xkTWFzdGVySWRMc3QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChucyArICJzbGRJZExzdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KG5zICsgIm5vdGVzU3oiLCBuZXcgWEF0dHJpYnV0ZSgiY3giLCAiNjg1ODAwMCIpLCBuZXcgWEF0dHJpYnV0ZSgiY3kiLCAiOTE0NDAwMCIpKSkpKTsKKyAgICAgICAgICAgICAgICBkb2MuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudChzdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgQ3JlYXRlUGFja2FnZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICBQYWNrYWdlIHBhY2thZ2UgPSBQYWNrYWdlLk9wZW4oc3RyZWFtLCBGaWxlTW9kZS5DcmVhdGUpOworICAgICAgICAgICAgcGFja2FnZS5DbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoc3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQYWNrYWdlIEdldFBhY2thZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRG9jUGFja2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IEdldFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoR2V0RG9jdW1lbnRUeXBlKCkgIT0gdHlwZW9mKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUG93ZXJUb29sc0RvY3VtZW50RXhjZXB0aW9uKCJOb3QgYSBXb3JkcHJvY2Vzc2luZyBkb2N1bWVudC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKERvY1BhY2thZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQb3dlclRvb2xzRG9jdW1lbnRFeGNlcHRpb24oZS5NZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3ByZWFkc2hlZXREb2N1bWVudCBHZXRTcHJlYWRzaGVldERvY3VtZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEdldERvY3VtZW50VHlwZSgpICE9IHR5cGVvZihTcHJlYWRzaGVldERvY3VtZW50KSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBvd2VyVG9vbHNEb2N1bWVudEV4Y2VwdGlvbigiTm90IGEgU3ByZWFkc2hlZXQgZG9jdW1lbnQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNwcmVhZHNoZWV0RG9jdW1lbnQuT3BlbihEb2NQYWNrYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUG93ZXJUb29sc0RvY3VtZW50RXhjZXB0aW9uKGUuTWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUHJlc2VudGF0aW9uRG9jdW1lbnQgR2V0UHJlc2VudGF0aW9uRG9jdW1lbnQoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoR2V0RG9jdW1lbnRUeXBlKCkgIT0gdHlwZW9mKFByZXNlbnRhdGlvbkRvY3VtZW50KSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBvd2VyVG9vbHNEb2N1bWVudEV4Y2VwdGlvbigiTm90IGEgUHJlc2VudGF0aW9uIGRvY3VtZW50LiIpOworICAgICAgICAgICAgICAgIHJldHVybiBQcmVzZW50YXRpb25Eb2N1bWVudC5PcGVuKERvY1BhY2thZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQb3dlclRvb2xzRG9jdW1lbnRFeGNlcHRpb24oZS5NZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUeXBlIEdldERvY3VtZW50VHlwZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhY2thZ2VSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwID0gRG9jUGFja2FnZS5HZXRSZWxhdGlvbnNoaXBzQnlUeXBlKCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL29mZmljZURvY3VtZW50IikuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXAgPSBEb2NQYWNrYWdlLkdldFJlbGF0aW9uc2hpcHNCeVR5cGUoImh0dHA6Ly9wdXJsLm9jbGMub3JnL29veG1sL29mZmljZURvY3VtZW50L3JlbGF0aW9uc2hpcHMvb2ZmaWNlRG9jdW1lbnQiKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBQb3dlclRvb2xzRG9jdW1lbnRFeGNlcHRpb24oIk5vdCBhbiBPcGVuIFhNTCBEb2N1bWVudC4iKTsKKyAgICAgICAgICAgIFBhY2thZ2VQYXJ0IHBhcnQgPSBEb2NQYWNrYWdlLkdldFBhcnQoUGFja1VyaUhlbHBlci5SZXNvbHZlUGFydFVyaShyZWxhdGlvbnNoaXAuU291cmNlVXJpLCByZWxhdGlvbnNoaXAuVGFyZ2V0VXJpKSk7CisgICAgICAgICAgICBzd2l0Y2ggKHBhcnQuQ29udGVudFR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQubWFpbit4bWwiOgorICAgICAgICAgICAgICAgIGNhc2UgImFwcGxpY2F0aW9uL3ZuZC5tcy13b3JkLmRvY3VtZW50Lm1hY3JvRW5hYmxlZC5tYWluK3htbCI6CisgICAgICAgICAgICAgICAgY2FzZSAiYXBwbGljYXRpb24vdm5kLm1zLXdvcmQudGVtcGxhdGUubWFjcm9FbmFibGVkVGVtcGxhdGUubWFpbit4bWwiOgorICAgICAgICAgICAgICAgIGNhc2UgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlLm1haW4reG1sIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZihXb3JkcHJvY2Vzc2luZ0RvY3VtZW50KTsKKyAgICAgICAgICAgICAgICBjYXNlICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldC5tYWluK3htbCI6CisgICAgICAgICAgICAgICAgY2FzZSAiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0Lm1hY3JvRW5hYmxlZC5tYWluK3htbCI6CisgICAgICAgICAgICAgICAgY2FzZSAiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRlbXBsYXRlLm1hY3JvRW5hYmxlZC5tYWluK3htbCI6CisgICAgICAgICAgICAgICAgY2FzZSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudGVtcGxhdGUubWFpbit4bWwiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mKFNwcmVhZHNoZWV0RG9jdW1lbnQpOworICAgICAgICAgICAgICAgIGNhc2UgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC50ZW1wbGF0ZS5tYWluK3htbCI6CisgICAgICAgICAgICAgICAgY2FzZSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvbi5tYWluK3htbCI6CisgICAgICAgICAgICAgICAgY2FzZSAiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQudGVtcGxhdGUubWFjcm9FbmFibGVkLm1haW4reG1sIjoKKyAgICAgICAgICAgICAgICBjYXNlICJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5hZGRpbi5tYWNyb0VuYWJsZWQubWFpbit4bWwiOgorICAgICAgICAgICAgICAgIGNhc2UgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZXNob3cubWFpbit4bWwiOgorICAgICAgICAgICAgICAgIGNhc2UgImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnByZXNlbnRhdGlvbi5tYWNyb0VuYWJsZWQubWFpbit4bWwiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mKFByZXNlbnRhdGlvbkRvY3VtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9wZW5YbWxQb3dlclRvb2xzRG9jdW1lbnQgR2V0TW9kaWZpZWREb2N1bWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERvY1BhY2thZ2UuQ2xvc2UoKTsKKyAgICAgICAgICAgIERvY1BhY2thZ2UgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIG5ldyBPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50KChEb2N1bWVudCA9PSBudWxsKSA/IG51bGwgOiBEb2N1bWVudC5GaWxlTmFtZSwgRG9jTWVtb3J5U3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBXbWxEb2N1bWVudCBHZXRNb2RpZmllZFdtbERvY3VtZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgRG9jUGFja2FnZS5DbG9zZSgpOworICAgICAgICAgICAgRG9jUGFja2FnZSA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gbmV3IFdtbERvY3VtZW50KChEb2N1bWVudCA9PSBudWxsKSA/IG51bGwgOiBEb2N1bWVudC5GaWxlTmFtZSwgRG9jTWVtb3J5U3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTbWxEb2N1bWVudCBHZXRNb2RpZmllZFNtbERvY3VtZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgRG9jUGFja2FnZS5DbG9zZSgpOworICAgICAgICAgICAgRG9jUGFja2FnZSA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNtbERvY3VtZW50KChEb2N1bWVudCA9PSBudWxsKSA/IG51bGwgOiBEb2N1bWVudC5GaWxlTmFtZSwgRG9jTWVtb3J5U3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQbWxEb2N1bWVudCBHZXRNb2RpZmllZFBtbERvY3VtZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgRG9jUGFja2FnZS5DbG9zZSgpOworICAgICAgICAgICAgRG9jUGFja2FnZSA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBtbERvY3VtZW50KChEb2N1bWVudCA9PSBudWxsKSA/IG51bGwgOiBEb2N1bWVudC5GaWxlTmFtZSwgRG9jTWVtb3J5U3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgRGlzcG9zZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBEaXNwb3NlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgfk9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpc3Bvc2UoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIERpc3Bvc2UoQm9vbGVhbiBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKERvY1BhY2thZ2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERvY1BhY2thZ2UuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKERvY01lbW9yeVN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRG9jTWVtb3J5U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoRG9jUGFja2FnZSA9PSBudWxsICYmIERvY01lbW9yeVN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIERvY1BhY2thZ2UgPSBudWxsOworICAgICAgICAgICAgRG9jTWVtb3J5U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIEdDLlN1cHByZXNzRmluYWxpemUodGhpcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9QdE9wZW5YbWxVdGlsLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvUHRPcGVuWG1sVXRpbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODEyZGEyCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvUHRPcGVuWG1sVXRpbC5jcwpAQCAtMCwwICsxLDYwMzYgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCitWZXJzaW9uOiAzLjEuMTAKKyAqIEFkZCBQdE9wZW5YbWwuTGlzdEl0ZW1SdW4KKworVmVyc2lvbjogMi43LjAzCisgKiBFbmhhbmNlbWVudHMgdG8gc3VwcG9ydCBSVEwKKworVmVyc2lvbjogMi42LjAwCisgKiBFbmhhbmNlbWVudHMgdG8gc3VwcG9ydCBIdG1sQ29udmVydGVyLmNzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLklPLlBhY2thZ2luZzsKK3VzaW5nIFN5c3RlbS5JTy5Db21wcmVzc2lvbjsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgRm9udCA9IFN5c3RlbS5EcmF3aW5nLkZvbnQ7Cit1c2luZyBGb250RmFtaWx5ID0gU3lzdGVtLkRyYXdpbmcuRm9udEZhbWlseTsKKworLy8gUmVTaGFycGVyIGRpc2FibGUgSW5jb25zaXN0ZW50TmFtaW5nCisKK25hbWVzcGFjZSBPcGVuWG1sUG93ZXJUb29scworeworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHRPcGVuWG1sRXh0ZW5zaW9ucworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRG9jdW1lbnQgR2V0WERvY3VtZW50KHRoaXMgT3BlblhtbFBhcnQgcGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcnQgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigicGFydCIpOworCisgICAgICAgICAgICBYRG9jdW1lbnQgcGFydFhEb2N1bWVudCA9IHBhcnQuQW5ub3RhdGlvbjxYRG9jdW1lbnQ+KCk7CisgICAgICAgICAgICBpZiAocGFydFhEb2N1bWVudCAhPSBudWxsKSByZXR1cm4gcGFydFhEb2N1bWVudDsKKworICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBwYXJ0U3RyZWFtID0gcGFydC5HZXRTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocGFydFN0cmVhbS5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcnRYRG9jdW1lbnQgPSBuZXcgWERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHBhcnRYRG9jdW1lbnQuRGVjbGFyYXRpb24gPSBuZXcgWERlY2xhcmF0aW9uKCIxLjAiLCAiVVRGLTgiLCAieWVzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChYbWxSZWFkZXIgcGFydFhtbFJlYWRlciA9IFhtbFJlYWRlci5DcmVhdGUocGFydFN0cmVhbSkpCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0WERvY3VtZW50ID0gWERvY3VtZW50LkxvYWQocGFydFhtbFJlYWRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJ0LkFkZEFubm90YXRpb24ocGFydFhEb2N1bWVudCk7CisgICAgICAgICAgICByZXR1cm4gcGFydFhEb2N1bWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWERvY3VtZW50IEdldFhEb2N1bWVudCh0aGlzIE9wZW5YbWxQYXJ0IHBhcnQsIG91dCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJ0ID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInBhcnQiKTsKKworICAgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlciA9IHBhcnQuQW5ub3RhdGlvbjxYbWxOYW1lc3BhY2VNYW5hZ2VyPigpOworICAgICAgICAgICAgWERvY3VtZW50IHBhcnRYRG9jdW1lbnQgPSBwYXJ0LkFubm90YXRpb248WERvY3VtZW50PigpOworICAgICAgICAgICAgaWYgKHBhcnRYRG9jdW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlTWFuYWdlciAhPSBudWxsKSByZXR1cm4gcGFydFhEb2N1bWVudDsKKworICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIgPSBHZXRNYW5hZ2VyRnJvbVhEb2N1bWVudChwYXJ0WERvY3VtZW50KTsKKyAgICAgICAgICAgICAgICBwYXJ0LkFkZEFubm90YXRpb24obmFtZXNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFydFhEb2N1bWVudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBwYXJ0U3RyZWFtID0gcGFydC5HZXRTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocGFydFN0cmVhbS5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcnRYRG9jdW1lbnQgPSBuZXcgWERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHBhcnRYRG9jdW1lbnQuRGVjbGFyYXRpb24gPSBuZXcgWERlY2xhcmF0aW9uKCIxLjAiLCAiVVRGLTgiLCAieWVzIik7CisKKyAgICAgICAgICAgICAgICAgICAgcGFydC5BZGRBbm5vdGF0aW9uKHBhcnRYRG9jdW1lbnQpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0WERvY3VtZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2luZyAoWG1sUmVhZGVyIHBhcnRYbWxSZWFkZXIgPSBYbWxSZWFkZXIuQ3JlYXRlKHBhcnRTdHJlYW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0WERvY3VtZW50ID0gWERvY3VtZW50LkxvYWQocGFydFhtbFJlYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyID0gbmV3IFhtbE5hbWVzcGFjZU1hbmFnZXIocGFydFhtbFJlYWRlci5OYW1lVGFibGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LkFkZEFubm90YXRpb24ocGFydFhEb2N1bWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LkFkZEFubm90YXRpb24obmFtZXNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0WERvY3VtZW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFB1dFhEb2N1bWVudCh0aGlzIE9wZW5YbWxQYXJ0IHBhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJ0ID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInBhcnQiKTsKKworICAgICAgICAgICAgWERvY3VtZW50IHBhcnRYRG9jdW1lbnQgPSBwYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgaWYgKHBhcnRYRG9jdW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyNpZiB0cnVlCisgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBwYXJ0U3RyZWFtID0gcGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSkKKyAgICAgICAgICAgICAgICB1c2luZyAoWG1sV3JpdGVyIHBhcnRYbWxXcml0ZXIgPSBYbWxXcml0ZXIuQ3JlYXRlKHBhcnRTdHJlYW0pKQorICAgICAgICAgICAgICAgICAgICBwYXJ0WERvY3VtZW50LlNhdmUocGFydFhtbFdyaXRlcik7CisjZWxzZQorICAgICAgICAgICAgICAgIGJ5dGVbXSBhcnJheSA9IEVuY29kaW5nLlVURjguR2V0Qnl0ZXMocGFydFhEb2N1bWVudC5Ub1N0cmluZyhTYXZlT3B0aW9ucy5EaXNhYmxlRm9ybWF0dGluZykpOworICAgICAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKGFycmF5KSkKKyAgICAgICAgICAgICAgICAgICAgcGFydC5GZWVkRGF0YShtcyk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBQdXRYRG9jdW1lbnRXaXRoRm9ybWF0dGluZyh0aGlzIE9wZW5YbWxQYXJ0IHBhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJ0ID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInBhcnQiKTsKKworICAgICAgICAgICAgWERvY3VtZW50IHBhcnRYRG9jdW1lbnQgPSBwYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgaWYgKHBhcnRYRG9jdW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoU3RyZWFtIHBhcnRTdHJlYW0gPSBwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sV3JpdGVyU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgWG1sV3JpdGVyU2V0dGluZ3MoKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuSW5kZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuT21pdFhtbERlY2xhcmF0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuTmV3TGluZU9uQXR0cmlidXRlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChYbWxXcml0ZXIgcGFydFhtbFdyaXRlciA9IFhtbFdyaXRlci5DcmVhdGUocGFydFN0cmVhbSwgc2V0dGluZ3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFydFhEb2N1bWVudC5TYXZlKHBhcnRYbWxXcml0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBQdXRYRG9jdW1lbnQodGhpcyBPcGVuWG1sUGFydCBwYXJ0LCBYRG9jdW1lbnQgZG9jdW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJ0ID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInBhcnQiKTsKKyAgICAgICAgICAgIGlmIChkb2N1bWVudCA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJkb2N1bWVudCIpOworCisgICAgICAgICAgICB1c2luZyAoU3RyZWFtIHBhcnRTdHJlYW0gPSBwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKQorICAgICAgICAgICAgdXNpbmcgKFhtbFdyaXRlciBwYXJ0WG1sV3JpdGVyID0gWG1sV3JpdGVyLkNyZWF0ZShwYXJ0U3RyZWFtKSkKKyAgICAgICAgICAgICAgICBkb2N1bWVudC5TYXZlKHBhcnRYbWxXcml0ZXIpOworCisgICAgICAgICAgICBwYXJ0LlJlbW92ZUFubm90YXRpb25zPFhEb2N1bWVudD4oKTsKKyAgICAgICAgICAgIHBhcnQuQWRkQW5ub3RhdGlvbihkb2N1bWVudCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYbWxOYW1lc3BhY2VNYW5hZ2VyIEdldE1hbmFnZXJGcm9tWERvY3VtZW50KFhEb2N1bWVudCB4RG9jdW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbFJlYWRlciByZWFkZXIgPSB4RG9jdW1lbnQuQ3JlYXRlUmVhZGVyKCk7CisgICAgICAgICAgICBYRG9jdW1lbnQgbmV3WERvYyA9IFhEb2N1bWVudC5Mb2FkKHJlYWRlcik7CisKKyAgICAgICAgICAgIFhFbGVtZW50IHJvb3RFbGVtZW50ID0geERvY3VtZW50LkVsZW1lbnRzKCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIHJvb3RFbGVtZW50LlJlcGxhY2VXaXRoKG5ld1hEb2MuUm9vdCk7CisKKyAgICAgICAgICAgIFhtbE5hbWVUYWJsZSBuYW1lVGFibGUgPSByZWFkZXIuTmFtZVRhYmxlOworICAgICAgICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyID0gbmV3IFhtbE5hbWVzcGFjZU1hbmFnZXIobmFtZVRhYmxlKTsKKyAgICAgICAgICAgIHJldHVybiBuYW1lc3BhY2VNYW5hZ2VyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxYRWxlbWVudD4gTG9naWNhbENoaWxkcmVuQ29udGVudCh0aGlzIFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5kb2N1bWVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5EZXNjZW5kYW50cyhXLmJvZHkpLlRha2UoMSk7CisKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5ib2R5IHx8CisgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lID09IFcudGMgfHwKKyAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgPT0gVy50eGJ4Q29udGVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNUcmltbWVkKGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLnRibCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZS5OYW1lID09IFcucCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLnAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLnRibCk7CisKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy50YmwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzVHJpbW1lZChXLnRyKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgPT0gVy50cik7CisKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy50cikKKyAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNUcmltbWVkKFcudGMpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IGUuTmFtZSA9PSBXLnRjKTsKKworICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzVHJpbW1lZChlID0+IGUuTmFtZSA9PSBXLnIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLnBpY3QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLmRyYXdpbmcpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IGUuTmFtZSA9PSBXLnIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLnBpY3QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLmRyYXdpbmcpOworCisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcucikKKyAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNUcmltbWVkKGUgPT4gVy5TdWJSdW5MZXZlbENvbnRlbnQuQ29udGFpbnMoZS5OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gVy5TdWJSdW5MZXZlbENvbnRlbnQuQ29udGFpbnMoZS5OYW1lKSk7CisKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gTUMuQWx0ZXJuYXRlQ29udGVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNUcmltbWVkKGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLnBpY3QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLmRyYXdpbmcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBNQy5GYWxsYmFjaykKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLnBpY3QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLmRyYXdpbmcpOworCisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcucGljdCB8fCBlbGVtZW50Lk5hbWUgPT0gVy5kcmF3aW5nKQorICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50c1RyaW1tZWQoVy50eGJ4Q29udGVudCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gZS5OYW1lID09IFcudHhieENvbnRlbnQpOworCisgICAgICAgICAgICByZXR1cm4gWEVsZW1lbnQuRW1wdHlTZXF1ZW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8WEVsZW1lbnQ+IExvZ2ljYWxDaGlsZHJlbkNvbnRlbnQodGhpcyBJRW51bWVyYWJsZTxYRWxlbWVudD4gc291cmNlKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBlMSBpbiBzb3VyY2UpCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgZTIgaW4gZTEuTG9naWNhbENoaWxkcmVuQ29udGVudCgpKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gZTI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIElFbnVtZXJhYmxlPFhFbGVtZW50PiBMb2dpY2FsQ2hpbGRyZW5Db250ZW50KHRoaXMgWEVsZW1lbnQgZWxlbWVudCwgWE5hbWUgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuTG9naWNhbENoaWxkcmVuQ29udGVudCgpLldoZXJlKGUgPT4gZS5OYW1lID09IG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxYRWxlbWVudD4gTG9naWNhbENoaWxkcmVuQ29udGVudCh0aGlzIElFbnVtZXJhYmxlPFhFbGVtZW50PiBzb3VyY2UsIFhOYW1lIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGUxIGluIHNvdXJjZSkKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBlMiBpbiBlMS5Mb2dpY2FsQ2hpbGRyZW5Db250ZW50KG5hbWUpKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gZTI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIElFbnVtZXJhYmxlPE9wZW5YbWxQYXJ0PiBDb250ZW50UGFydHModGhpcyBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYykKKyAgICAgICAgeworICAgICAgICAgICAgeWllbGQgcmV0dXJuIGRvYy5NYWluRG9jdW1lbnRQYXJ0OworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaGRyIGluIGRvYy5NYWluRG9jdW1lbnRQYXJ0LkhlYWRlclBhcnRzKQorICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBoZHI7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmdHIgaW4gZG9jLk1haW5Eb2N1bWVudFBhcnQuRm9vdGVyUGFydHMpCisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIGZ0cjsKKworICAgICAgICAgICAgaWYgKGRvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gZG9jLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydDsKKworICAgICAgICAgICAgaWYgKGRvYy5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBkb2MuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgY29tcGxldGUgbGlzdCBvZiBhbGwgcGFydHMgY29udGFpbmVkIGluIHRoZSA8c2VlIGNyZWY9Ik9wZW5YbWxQYXJ0Q29udGFpbmVyIi8+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbnRhaW5lciI+CisgICAgICAgIC8vLyBBIDxzZWUgY3JlZj0iV29yZHByb2Nlc3NpbmdEb2N1bWVudCIvPiwgPHNlZSBjcmVmPSJTcHJlYWRzaGVldERvY3VtZW50Ii8+LCBvcgorICAgICAgICAvLy8gPHNlZSBjcmVmPSJQcmVzZW50YXRpb25Eb2N1bWVudCIvPi4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5saXN0IG9mIDxzZWUgY3JlZj0iT3BlblhtbFBhcnQiLz5zIGNvbnRhaW5lZCBpbiB0aGUgPHNlZSBjcmVmPSJPcGVuWG1sUGFydENvbnRhaW5lciIvPi48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPcGVuWG1sUGFydD4gR2V0QWxsUGFydHModGhpcyBPcGVuWG1sUGFydENvbnRhaW5lciBjb250YWluZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVzZSBhIEhhc2hTZXQgc28gdGhhdCBwYXJ0cyBhcmUgcHJvY2Vzc2VkIG9ubHkgb25jZS4KKyAgICAgICAgICAgIEhhc2hTZXQ8T3BlblhtbFBhcnQ+IHBhcnRMaXN0ID0gbmV3IEhhc2hTZXQ8T3BlblhtbFBhcnQ+KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKElkUGFydFBhaXIgcCBpbiBjb250YWluZXIuUGFydHMpCisgICAgICAgICAgICAgICAgQWRkUGFydChwYXJ0TGlzdCwgcC5PcGVuWG1sUGFydCk7CisKKyAgICAgICAgICAgIHJldHVybiBwYXJ0TGlzdC5PcmRlckJ5KHAgPT4gcC5Db250ZW50VHlwZSkuVGhlbkJ5KHAgPT4gcC5VcmkuVG9TdHJpbmcoKSkuVG9MaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZFBhcnQoSGFzaFNldDxPcGVuWG1sUGFydD4gcGFydExpc3QsIE9wZW5YbWxQYXJ0IHBhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJ0TGlzdC5Db250YWlucyhwYXJ0KSkgcmV0dXJuOworCisgICAgICAgICAgICBwYXJ0TGlzdC5BZGQocGFydCk7CisgICAgICAgICAgICBmb3JlYWNoIChJZFBhcnRQYWlyIHAgaW4gcGFydC5QYXJ0cykKKyAgICAgICAgICAgICAgICBBZGRQYXJ0KHBhcnRMaXN0LCBwLk9wZW5YbWxQYXJ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmxhdE9wYworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBGbGF0T3BjVHVwcGxlCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBjaGFyIEZvQ2hhcmFjdGVyOworICAgICAgICAgICAgcHVibGljIGludCBGb0NodW5rOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgR2V0Q29udGVudHNBc1htbChQYWNrYWdlUGFydCBwYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICBYTmFtZXNwYWNlIHBrZyA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L3htbFBhY2thZ2UiOworCisgICAgICAgICAgICBpZiAocGFydC5Db250ZW50VHlwZS5FbmRzV2l0aCgieG1sIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBzdHIgPSBwYXJ0LkdldFN0cmVhbSgpKQorICAgICAgICAgICAgICAgIHVzaW5nIChTdHJlYW1SZWFkZXIgc3RyZWFtUmVhZGVyID0gbmV3IFN0cmVhbVJlYWRlcihzdHIpKQorICAgICAgICAgICAgICAgIHVzaW5nIChYbWxSZWFkZXIgeHIgPSBYbWxSZWFkZXIuQ3JlYXRlKHN0cmVhbVJlYWRlcikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQocGtnICsgInBhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUocGtnICsgIm5hbWUiLCBwYXJ0LlVyaSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShwa2cgKyAiY29udGVudFR5cGUiLCBwYXJ0LkNvbnRlbnRUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChwa2cgKyAieG1sRGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQuTG9hZCh4cikKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoU3RyZWFtIHN0ciA9IHBhcnQuR2V0U3RyZWFtKCkpCisgICAgICAgICAgICAgICAgdXNpbmcgKEJpbmFyeVJlYWRlciBiaW5hcnlSZWFkZXIgPSBuZXcgQmluYXJ5UmVhZGVyKHN0cikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gKGludCliaW5hcnlSZWFkZXIuQmFzZVN0cmVhbS5MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlQXJyYXkgPSBiaW5hcnlSZWFkZXIuUmVhZEJ5dGVzKGxlbik7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiBjcmVhdGVzIHRoZSBiYXNlNjRTdHJpbmcsIHRoZW4gY2h1bmtzCisgICAgICAgICAgICAgICAgICAgIC8vIGl0IHRvIGxpbmVzIG9mIDc2IGNoYXJhY3RlcnMgbG9uZworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYmFzZTY0U3RyaW5nID0gKFN5c3RlbS5Db252ZXJ0LlRvQmFzZTY0U3RyaW5nKGJ5dGVBcnJheSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMsIGkpID0+IG5ldyBGbGF0T3BjVHVwcGxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvQ2hhcmFjdGVyID0gYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9DaHVuayA9IGkgLyA3NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Hcm91cEJ5KGMgPT4gYy5Gb0NodW5rKQorICAgICAgICAgICAgICAgICAgICAgICAgLkFnZ3JlZ2F0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLCBpKSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLkFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuQWdncmVnYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdCdWlsZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlZWQsIGl0KSA9PiBzZWVkLkFwcGVuZChpdC5Gb0NoYXJhY3RlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IgPT4gc2IuVG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9PiBzLlRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQocGtnICsgInBhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUocGtnICsgIm5hbWUiLCBwYXJ0LlVyaSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShwa2cgKyAiY29udGVudFR5cGUiLCBwYXJ0LkNvbnRlbnRUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKHBrZyArICJjb21wcmVzc2lvbiIsICJzdG9yZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KHBrZyArICJiaW5hcnlEYXRhIiwgYmFzZTY0U3RyaW5nKQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gR2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uKHN0cmluZyBwYXRoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmkgPSBuZXcgRmlsZUluZm8ocGF0aCk7CisgICAgICAgICAgICBpZiAoVXRpbC5Jc1dvcmRwcm9jZXNzaW5nTUwoZmkuRXh0ZW5zaW9uKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oIm1zby1hcHBsaWNhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2dpZD1cIldvcmQuRG9jdW1lbnRcIiIpOworICAgICAgICAgICAgaWYgKFV0aWwuSXNQcmVzZW50YXRpb25NTChmaS5FeHRlbnNpb24pKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWFByb2Nlc3NpbmdJbnN0cnVjdGlvbigibXNvLWFwcGxpY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZ2lkPVwiUG93ZXJQb2ludC5TaG93XCIiKTsKKyAgICAgICAgICAgIGlmIChVdGlsLklzU3ByZWFkc2hlZXRNTChmaS5FeHRlbnNpb24pKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWFByb2Nlc3NpbmdJbnN0cnVjdGlvbigibXNvLWFwcGxpY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZ2lkPVwiRXhjZWwuU2hlZXRcIiIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvY3VtZW50IE9wY1RvWG1sRG9jdW1lbnQoc3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoUGFja2FnZSBwYWNrYWdlID0gUGFja2FnZS5PcGVuKGZpbGVOYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYTmFtZXNwYWNlIHBrZyA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L3htbFBhY2thZ2UiOworCisgICAgICAgICAgICAgICAgWERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gbmV3IFhEZWNsYXJhdGlvbigiMS4wIiwgIlVURi04IiwgInllcyIpOworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBkb2MgPSBuZXcgWERvY3VtZW50KAorICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgR2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uKGZpbGVOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KHBrZyArICJwYWNrYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAicGtnIiwgcGtnLlRvU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZS5HZXRQYXJ0cygpLlNlbGVjdChwYXJ0ID0+IEdldENvbnRlbnRzQXNYbWwocGFydCkpCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxEb2N1bWVudChkb2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRG9jdW1lbnQgT3BjVG9YRG9jdW1lbnQoc3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoUGFja2FnZSBwYWNrYWdlID0gUGFja2FnZS5PcGVuKGZpbGVOYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYTmFtZXNwYWNlIHBrZyA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L3htbFBhY2thZ2UiOworCisgICAgICAgICAgICAgICAgWERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gbmV3IFhEZWNsYXJhdGlvbigiMS4wIiwgIlVURi04IiwgInllcyIpOworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBkb2MgPSBuZXcgWERvY3VtZW50KAorICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgR2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uKGZpbGVOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KHBrZyArICJwYWNrYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAicGtnIiwgcGtnLlRvU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZS5HZXRQYXJ0cygpLlNlbGVjdChwYXJ0ID0+IEdldENvbnRlbnRzQXNYbWwocGFydCkpCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHJldHVybiBkb2M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZ1tdIE9wY1RvVGV4dChzdHJpbmcgZmlsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChQYWNrYWdlIHBhY2thZ2UgPSBQYWNrYWdlLk9wZW4oZmlsZU5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhOYW1lc3BhY2UgcGtnID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMDYveG1sUGFja2FnZSI7CisKKyAgICAgICAgICAgICAgICBYRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBuZXcgWERlY2xhcmF0aW9uKCIxLjAiLCAiVVRGLTgiLCAieWVzIik7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IGRvYyA9IG5ldyBYRG9jdW1lbnQoCisgICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICBHZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oZmlsZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQocGtnICsgInBhY2thZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJwa2ciLCBwa2cuVG9TdHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLkdldFBhcnRzKCkuU2VsZWN0KHBhcnQgPT4gR2V0Q29udGVudHNBc1htbChwYXJ0KSkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRvYy5Ub1N0cmluZygpLlNwbGl0KG5ld1tdIHsgRW52aXJvbm1lbnQuTmV3TGluZSB9LCBTdHJpbmdTcGxpdE9wdGlvbnMuTm9uZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYbWxEb2N1bWVudCBHZXRYbWxEb2N1bWVudChYRG9jdW1lbnQgZG9jdW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChYbWxSZWFkZXIgeG1sUmVhZGVyID0gZG9jdW1lbnQuQ3JlYXRlUmVhZGVyKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sRG9jdW1lbnQgeG1sRG9jID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgeG1sRG9jLkxvYWQoeG1sUmVhZGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuRGVjbGFyYXRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhtbERlY2xhcmF0aW9uIGRlYyA9IHhtbERvYy5DcmVhdGVYbWxEZWNsYXJhdGlvbihkb2N1bWVudC5EZWNsYXJhdGlvbi5WZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuRGVjbGFyYXRpb24uRW5jb2RpbmcsIGRvY3VtZW50LkRlY2xhcmF0aW9uLlN0YW5kYWxvbmUpOworICAgICAgICAgICAgICAgICAgICB4bWxEb2MuSW5zZXJ0QmVmb3JlKGRlYywgeG1sRG9jLkZpcnN0Q2hpbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4geG1sRG9jOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWERvY3VtZW50IEdldFhEb2N1bWVudCh0aGlzIFhtbERvY3VtZW50IGRvY3VtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgeERvYyA9IG5ldyBYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHVzaW5nIChYbWxXcml0ZXIgeG1sV3JpdGVyID0geERvYy5DcmVhdGVXcml0ZXIoKSkKKyAgICAgICAgICAgICAgICBkb2N1bWVudC5Xcml0ZVRvKHhtbFdyaXRlcik7CisgICAgICAgICAgICBYbWxEZWNsYXJhdGlvbiBkZWNsID0KKyAgICAgICAgICAgICAgICBkb2N1bWVudC5DaGlsZE5vZGVzLk9mVHlwZTxYbWxEZWNsYXJhdGlvbj4oKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGRlY2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB4RG9jLkRlY2xhcmF0aW9uID0gbmV3IFhEZWNsYXJhdGlvbihkZWNsLlZlcnNpb24sIGRlY2wuRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgIGRlY2wuU3RhbmRhbG9uZSk7CisgICAgICAgICAgICByZXR1cm4geERvYzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBGbGF0VG9PcGMoWG1sRG9jdW1lbnQgZG9jLCBzdHJpbmcgb3V0cHV0UGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IHhkID0gR2V0WERvY3VtZW50KGRvYyk7CisgICAgICAgICAgICBGbGF0VG9PcGMoeGQsIG91dHB1dFBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEZsYXRUb09wYyhzdHJpbmcgeG1sVGV4dCwgc3RyaW5nIG91dHB1dFBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCB4ZCA9IFhEb2N1bWVudC5QYXJzZSh4bWxUZXh0KTsKKyAgICAgICAgICAgIEZsYXRUb09wYyh4ZCwgb3V0cHV0UGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgRmxhdFRvT3BjKFhEb2N1bWVudCBkb2MsIHN0cmluZyBvdXRwdXRQYXRoKQorICAgICAgICB7CisgICAgICAgICAgICBYTmFtZXNwYWNlIHBrZyA9CisgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMDYveG1sUGFja2FnZSI7CisgICAgICAgICAgICBYTmFtZXNwYWNlIHJlbCA9CisgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcyI7CisKKyAgICAgICAgICAgIHVzaW5nIChQYWNrYWdlIHBhY2thZ2UgPSBQYWNrYWdlLk9wZW4ob3V0cHV0UGF0aCwgRmlsZU1vZGUuQ3JlYXRlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgYWxsIHBhcnRzIChidXQgbm90IHJlbGF0aW9uc2hpcHMpCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHhtbFBhcnQgaW4gZG9jLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKHAgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmcpcC5BdHRyaWJ1dGUocGtnICsgImNvbnRlbnRUeXBlIikgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtcGFja2FnZS5yZWxhdGlvbnNoaXBzK3htbCIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSAoc3RyaW5nKXhtbFBhcnQuQXR0cmlidXRlKHBrZyArICJuYW1lIik7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb250ZW50VHlwZSA9IChzdHJpbmcpeG1sUGFydC5BdHRyaWJ1dGUocGtnICsgImNvbnRlbnRUeXBlIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50VHlwZS5FbmRzV2l0aCgieG1sIikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVyaSB1ID0gbmV3IFVyaShuYW1lLCBVcmlLaW5kLlJlbGF0aXZlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VQYXJ0IHBhcnQgPSBwYWNrYWdlLkNyZWF0ZVBhcnQodSwgY29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb25PcHRpb24uU3VwZXJGYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gc3RyID0gcGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChYbWxXcml0ZXIgeG1sV3JpdGVyID0gWG1sV3JpdGVyLkNyZWF0ZShzdHIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFBhcnQuRWxlbWVudChwa2cgKyAieG1sRGF0YSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Xcml0ZVRvKHhtbFdyaXRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVcmkgdSA9IG5ldyBVcmkobmFtZSwgVXJpS2luZC5SZWxhdGl2ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlUGFydCBwYXJ0ID0gcGFja2FnZS5DcmVhdGVQYXJ0KHUsIGNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uT3B0aW9uLlN1cGVyRmFzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoU3RyZWFtIHN0ciA9IHBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoQmluYXJ5V3JpdGVyIGJpbmFyeVdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoc3RyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYmFzZTY0U3RyaW5nSW5DaHVua3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nKXhtbFBhcnQuRWxlbWVudChwa2cgKyAiYmluYXJ5RGF0YSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBiYXNlNjRDaGFyQXJyYXkgPSBiYXNlNjRTdHJpbmdJbkNodW5rcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoYyA9PiBjICE9ICdccicgJiYgYyAhPSAnXG4nKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVBcnJheSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRDaGFyQXJyYXkoYmFzZTY0Q2hhckFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBiYXNlNjRDaGFyQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnlXcml0ZXIuV3JpdGUoYnl0ZUFycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB4bWxQYXJ0IGluIGRvYy5Sb290LkVsZW1lbnRzKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSA9IChzdHJpbmcpeG1sUGFydC5BdHRyaWJ1dGUocGtnICsgIm5hbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbnRlbnRUeXBlID0gKHN0cmluZyl4bWxQYXJ0LkF0dHJpYnV0ZShwa2cgKyAiY29udGVudFR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09CisgICAgICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UucmVsYXRpb25zaGlwcyt4bWwiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHBhY2thZ2UgbGV2ZWwgcmVsYXRpb25zaGlwcworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gIi9fcmVscy8ucmVscyIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgeG1sUmVsIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFBhcnQuRGVzY2VuZGFudHMocmVsICsgIlJlbGF0aW9uc2hpcCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGlkID0gKHN0cmluZyl4bWxSZWwuQXR0cmlidXRlKCJJZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdHlwZSA9IChzdHJpbmcpeG1sUmVsLkF0dHJpYnV0ZSgiVHlwZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGFyZ2V0ID0gKHN0cmluZyl4bWxSZWwuQXR0cmlidXRlKCJUYXJnZXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRhcmdldE1vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZyl4bWxSZWwuQXR0cmlidXRlKCJUYXJnZXRNb2RlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRNb2RlID09ICJFeHRlcm5hbCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLkNyZWF0ZVJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVXJpKHRhcmdldCwgVXJpS2luZC5BYnNvbHV0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TW9kZS5FeHRlcm5hbCwgdHlwZSwgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLkNyZWF0ZVJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVXJpKHRhcmdldCwgVXJpS2luZC5SZWxhdGl2ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TW9kZS5JbnRlcm5hbCwgdHlwZSwgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBwYXJ0IGxldmVsIHJlbGF0aW9uc2hpcHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZGlyZWN0b3J5ID0gbmFtZS5TdWJzdHJpbmcoMCwgbmFtZS5JbmRleE9mKCIvX3JlbHMiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJlbHNGaWxlbmFtZSA9IG5hbWUuU3Vic3RyaW5nKG5hbWUuTGFzdEluZGV4T2YoJy8nKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpbGVuYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsc0ZpbGVuYW1lLlN1YnN0cmluZygwLCByZWxzRmlsZW5hbWUuSW5kZXhPZigiLnJlbHMiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZVBhcnQgZnJvbVBhcnQgPSBwYWNrYWdlLkdldFBhcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVcmkoZGlyZWN0b3J5ICsgZmlsZW5hbWUsIFVyaUtpbmQuUmVsYXRpdmUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCB4bWxSZWwgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sUGFydC5EZXNjZW5kYW50cyhyZWwgKyAiUmVsYXRpb25zaGlwIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaWQgPSAoc3RyaW5nKXhtbFJlbC5BdHRyaWJ1dGUoIklkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0eXBlID0gKHN0cmluZyl4bWxSZWwuQXR0cmlidXRlKCJUeXBlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0YXJnZXQgPSAoc3RyaW5nKXhtbFJlbC5BdHRyaWJ1dGUoIlRhcmdldCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGFyZ2V0TW9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nKXhtbFJlbC5BdHRyaWJ1dGUoIlRhcmdldE1vZGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE1vZGUgPT0gIkV4dGVybmFsIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21QYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVXJpKHRhcmdldCwgVXJpS2luZC5BYnNvbHV0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TW9kZS5FeHRlcm5hbCwgdHlwZSwgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVyaSh0YXJnZXQsIFVyaUtpbmQuUmVsYXRpdmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE1vZGUuSW50ZXJuYWwsIHR5cGUsIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQmFzZTY0CisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBDb252ZXJ0VG9CYXNlNjQoc3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gYmEgPSBTeXN0ZW0uSU8uRmlsZS5SZWFkQWxsQnl0ZXMoZmlsZU5hbWUpOworICAgICAgICAgICAgc3RyaW5nIGJhc2U2NFN0cmluZyA9IChTeXN0ZW0uQ29udmVydC5Ub0Jhc2U2NFN0cmluZyhiYSkpCisgICAgICAgICAgICAgICAgLlNlbGVjdAorICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgKGMsIGkpID0+IG5ldworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDaHVuayA9IGkgLyA3NiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlciA9IGMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuR3JvdXBCeShjID0+IGMuQ2h1bmspCisgICAgICAgICAgICAgICAgLkFnZ3JlZ2F0ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgKHMsIGkpID0+CisgICAgICAgICAgICAgICAgICAgICAgICBzLkFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLkFnZ3JlZ2F0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlZWQsIGl0KSA9PiBzZWVkLkFwcGVuZChpdC5DaGFyYWN0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYiA9PiBzYi5Ub1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgLkFwcGVuZChFbnZpcm9ubWVudC5OZXdMaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgcyA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLkxlbmd0aCAtPSBFbnZpcm9ubWVudC5OZXdMaW5lLkxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICByZXR1cm4gYmFzZTY0U3RyaW5nOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gQ29udmVydEZyb21CYXNlNjQoc3RyaW5nIGZpbGVOYW1lLCBzdHJpbmcgYjY0KQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgYjY0YiA9IGI2NC5SZXBsYWNlKCJcclxuIiwgIiIpOworICAgICAgICAgICAgYnl0ZVtdIGJhID0gU3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhiNjRiKTsKKyAgICAgICAgICAgIHJldHVybiBiYTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgWG1sVXRpbAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYQXR0cmlidXRlIEdldFhtbFNwYWNlQXR0cmlidXRlKHN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICh2YWx1ZS5MZW5ndGggPiAwKSAmJiAoKHZhbHVlWzBdID09ICcgJykgfHwgKHZhbHVlW3ZhbHVlLkxlbmd0aCAtIDFdID09ICcgJykpCisgICAgICAgICAgICAgICAgPyBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbCArICJzcGFjZSIsICJwcmVzZXJ2ZSIpCisgICAgICAgICAgICAgICAgOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBYQXR0cmlidXRlIEdldFhtbFNwYWNlQXR0cmlidXRlKGNoYXIgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSAnICcgPyBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbCArICJzcGFjZSIsICJwcmVzZXJ2ZSIpIDogbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV29yZHByb2Nlc3NpbmdNTFV0aWwKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIEhhc2hTZXQ8c3RyaW5nPiBVbmtub3duRm9udHMgPSBuZXcgSGFzaFNldDxzdHJpbmc+KCk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIEhhc2hTZXQ8c3RyaW5nPiBLbm93bkZhbWlsaWVzID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDYWxjV2lkdGhPZlJ1bkluVHdpcHMoWEVsZW1lbnQgcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEtub3duRmFtaWxpZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLbm93bkZhbWlsaWVzID0gbmV3IEhhc2hTZXQ8c3RyaW5nPigpOworICAgICAgICAgICAgICAgIHZhciBmYW1pbGllcyA9IEZvbnRGYW1pbHkuRmFtaWxpZXM7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZhbSBpbiBmYW1pbGllcykKKyAgICAgICAgICAgICAgICAgICAgS25vd25GYW1pbGllcy5BZGQoZmFtLk5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZm9udE5hbWUgPSAoc3RyaW5nKXIuQXR0cmlidXRlKFB0T3BlblhtbC5wdCArICJGb250TmFtZSIpOworICAgICAgICAgICAgaWYgKGZvbnROYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgZm9udE5hbWUgPSAoc3RyaW5nKXIuQW5jZXN0b3JzKFcucCkuRmlyc3QoKS5BdHRyaWJ1dGUoUHRPcGVuWG1sLnB0ICsgIkZvbnROYW1lIik7CisgICAgICAgICAgICBpZiAoZm9udE5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIEVycm9yLCBzaG91bGQgaGF2ZSBGb250TmFtZSBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIGlmIChVbmtub3duRm9udHMuQ29udGFpbnMoZm9udE5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICB2YXIgclByID0gci5FbGVtZW50KFcuclByKTsKKyAgICAgICAgICAgIGlmIChyUHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIEVycm9yLCBzaG91bGQgaGF2ZSBydW4gcHJvcGVydGllcyIpOworICAgICAgICAgICAgdmFyIGxhbmd1YWdlVHlwZSA9IChzdHJpbmcpci5BdHRyaWJ1dGUoUHRPcGVuWG1sLkxhbmd1YWdlVHlwZSk7CisgICAgICAgICAgICBkZWNpbWFsPyBzeiA9IG51bGw7CisgICAgICAgICAgICBpZiAobGFuZ3VhZ2VUeXBlID09ICJiaWRpIikKKyAgICAgICAgICAgICAgICBzeiA9IChkZWNpbWFsPylyUHIuRWxlbWVudHMoVy5zekNzKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN6ID0gKGRlY2ltYWw/KXJQci5FbGVtZW50cyhXLnN6KS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKHN6ID09IG51bGwpCisgICAgICAgICAgICAgICAgc3ogPSAyMm07CisKKyAgICAgICAgICAgIC8vIHVua25vd24gZm9udCBmYW1pbGllcyB3aWxsIHRocm93IEFyZ3VtZW50RXhjZXB0aW9uLCBpbiB3aGljaCBjYXNlIGp1c3QgcmV0dXJuIDAKKyAgICAgICAgICAgIGlmICghS25vd25GYW1pbGllcy5Db250YWlucyhmb250TmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAvLyBpbiB0aGVvcnksIGFsbCB1bmtub3duIGZvbnRzIGFyZSBmb3VuZCBieSB0aGUgYWJvdmUgdGVzdCwgYnV0IGlmIG5vdC4uLgorICAgICAgICAgICAgRm9udEZhbWlseSBmZjsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZmID0gbmV3IEZvbnRGYW1pbHkoZm9udE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEFyZ3VtZW50RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVua25vd25Gb250cy5BZGQoZm9udE5hbWUpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGb250U3R5bGUgZnMgPSBGb250U3R5bGUuUmVndWxhcjsKKyAgICAgICAgICAgIHZhciBib2xkID0gR2V0Qm9vbFByb3AoclByLCBXLmIpIHx8IEdldEJvb2xQcm9wKHJQciwgVy5iQ3MpOworICAgICAgICAgICAgdmFyIGl0YWxpYyA9IEdldEJvb2xQcm9wKHJQciwgVy5pKSB8fCBHZXRCb29sUHJvcChyUHIsIFcuaUNzKTsKKyAgICAgICAgICAgIGlmIChib2xkICYmICFpdGFsaWMpCisgICAgICAgICAgICAgICAgZnMgPSBGb250U3R5bGUuQm9sZDsKKyAgICAgICAgICAgIGlmIChpdGFsaWMgJiYgIWJvbGQpCisgICAgICAgICAgICAgICAgZnMgPSBGb250U3R5bGUuSXRhbGljOworICAgICAgICAgICAgaWYgKGJvbGQgJiYgaXRhbGljKQorICAgICAgICAgICAgICAgIGZzID0gRm9udFN0eWxlLkJvbGQgfCBGb250U3R5bGUuSXRhbGljOworCisgICAgICAgICAgICB2YXIgcnVuVGV4dCA9IHIuRGVzY2VuZGFudHNUcmltbWVkKFcudHhieENvbnRlbnQpCisgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gZS5OYW1lID09IFcudCkKKyAgICAgICAgICAgICAgICAuU2VsZWN0KHQgPT4gKHN0cmluZyl0KQorICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZSgpOworCisgICAgICAgICAgICB2YXIgdGFiTGVuZ3RoID0gci5EZXNjZW5kYW50c1RyaW1tZWQoVy50eGJ4Q29udGVudCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgPT0gVy50YWIpCisgICAgICAgICAgICAgICAgLlNlbGVjdCh0ID0+IChkZWNpbWFsKXQuQXR0cmlidXRlKFB0T3BlblhtbC5UYWJXaWR0aCkpCisgICAgICAgICAgICAgICAgLlN1bSgpOworCisgICAgICAgICAgICBpZiAocnVuVGV4dC5MZW5ndGggPT0gMCAmJiB0YWJMZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgaW50IG11bHRpcGxpZXIgPSAxOworICAgICAgICAgICAgaWYgKHJ1blRleHQuTGVuZ3RoIDw9IDIpCisgICAgICAgICAgICAgICAgbXVsdGlwbGllciA9IDEwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJ1blRleHQuTGVuZ3RoIDw9IDQpCisgICAgICAgICAgICAgICAgbXVsdGlwbGllciA9IDUwOworICAgICAgICAgICAgZWxzZSBpZiAocnVuVGV4dC5MZW5ndGggPD0gOCkKKyAgICAgICAgICAgICAgICBtdWx0aXBsaWVyID0gMjU7CisgICAgICAgICAgICBlbHNlIGlmIChydW5UZXh0Lkxlbmd0aCA8PSAxNikKKyAgICAgICAgICAgICAgICBtdWx0aXBsaWVyID0gMTI7CisgICAgICAgICAgICBlbHNlIGlmIChydW5UZXh0Lkxlbmd0aCA8PSAzMikKKyAgICAgICAgICAgICAgICBtdWx0aXBsaWVyID0gNjsKKyAgICAgICAgICAgIGlmIChtdWx0aXBsaWVyICE9IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdWx0aXBsaWVyOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChydW5UZXh0KTsKKyAgICAgICAgICAgICAgICBydW5UZXh0ID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKEZvbnQgZiA9IG5ldyBGb250KGZmLCAoZmxvYXQpc3ogLyAyZiwgZnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLldpbmRvd3MuRm9ybXMuVGV4dEZvcm1hdEZsYWdzIHRmZiA9IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlRleHRGb3JtYXRGbGFncy5Ob1BhZGRpbmc7CisgICAgICAgICAgICAgICAgICAgIFNpemUgcHJvcG9zZWRTaXplID0gbmV3IFNpemUoaW50Lk1heFZhbHVlLCBpbnQuTWF4VmFsdWUpOworICAgICAgICAgICAgICAgICAgICB2YXIgc2YgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UZXh0UmVuZGVyZXIuTWVhc3VyZVRleHQocnVuVGV4dCwgZiwgcHJvcG9zZWRTaXplLCB0ZmYpOyAvLyBzZiByZXR1cm5zIHNpemUgaW4gcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgIHZhciBkcGkgPSA5Nm07CisgICAgICAgICAgICAgICAgICAgIHZhciB0d2lwID0gKGludCkoKChzZi5XaWR0aCAvIGRwaSkgKiAxNDQwbSkgLyBtdWx0aXBsaWVyICsgdGFiTGVuZ3RoICogMTQ0MG0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHdpcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQXJndW1lbnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZnMyID0gRm9udFN0eWxlLlJlZ3VsYXI7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChGb250IGYgPSBuZXcgRm9udChmZiwgKGZsb2F0KXN6IC8gMmYsIGZzMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5XaW5kb3dzLkZvcm1zLlRleHRGb3JtYXRGbGFncyB0ZmYgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UZXh0Rm9ybWF0RmxhZ3MuTm9QYWRkaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSBwcm9wb3NlZFNpemUgPSBuZXcgU2l6ZShpbnQuTWF4VmFsdWUsIGludC5NYXhWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2YgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UZXh0UmVuZGVyZXIuTWVhc3VyZVRleHQocnVuVGV4dCwgZiwgcHJvcG9zZWRTaXplLCB0ZmYpOyAvLyBzZiByZXR1cm5zIHNpemUgaW4gcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHBpID0gOTZtOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHR3aXAgPSAoaW50KSgoKHNmLldpZHRoIC8gZHBpKSAqIDE0NDBtKSAvIG11bHRpcGxpZXIgKyB0YWJMZW5ndGggKiAxNDQwbSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHdpcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoQXJndW1lbnRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZnMyID0gRm9udFN0eWxlLkJvbGQ7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoRm9udCBmID0gbmV3IEZvbnQoZmYsIChmbG9hdClzeiAvIDJmLCBmczIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5XaW5kb3dzLkZvcm1zLlRleHRGb3JtYXRGbGFncyB0ZmYgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UZXh0Rm9ybWF0RmxhZ3MuTm9QYWRkaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgcHJvcG9zZWRTaXplID0gbmV3IFNpemUoaW50Lk1heFZhbHVlLCBpbnQuTWF4VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZiA9IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlRleHRSZW5kZXJlci5NZWFzdXJlVGV4dChydW5UZXh0LCBmLCBwcm9wb3NlZFNpemUsIHRmZik7IC8vIHNmIHJldHVybnMgc2l6ZSBpbiBwaXhlbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHBpID0gOTZtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0d2lwID0gKGludCkoKChzZi5XaWR0aCAvIGRwaSkgKiAxNDQwbSkgLyBtdWx0aXBsaWVyICsgdGFiTGVuZ3RoICogMTQ0MG0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0d2lwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChBcmd1bWVudEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgYm90aCByZWd1bGFyIGFuZCBib2xkIGZhaWwsIHRoZW4gZ2V0IG1ldHJpY3MgZm9yIFRpbWVzIE5ldyBSb21hbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBvcmlnaW5hbCBGb250U3R5bGUgKGluIGZzKQorICAgICAgICAgICAgICAgICAgICAgICAgRm9udEZhbWlseSBmZjI7CisgICAgICAgICAgICAgICAgICAgICAgICBmZjIgPSBuZXcgRm9udEZhbWlseSgiVGltZXMgTmV3IFJvbWFuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoRm9udCBmID0gbmV3IEZvbnQoZmYyLCAoZmxvYXQpc3ogLyAyZiwgZnMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5XaW5kb3dzLkZvcm1zLlRleHRGb3JtYXRGbGFncyB0ZmYgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UZXh0Rm9ybWF0RmxhZ3MuTm9QYWRkaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgcHJvcG9zZWRTaXplID0gbmV3IFNpemUoaW50Lk1heFZhbHVlLCBpbnQuTWF4VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZiA9IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlRleHRSZW5kZXJlci5NZWFzdXJlVGV4dChydW5UZXh0LCBmLCBwcm9wb3NlZFNpemUsIHRmZik7IC8vIHNmIHJldHVybnMgc2l6ZSBpbiBwaXhlbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHBpID0gOTZtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0d2lwID0gKGludCkoKChzZi5XaWR0aCAvIGRwaSkgKiAxNDQwbSkgLyBtdWx0aXBsaWVyICsgdGFiTGVuZ3RoICogMTQ0MG0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0d2lwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEdldEJvb2xQcm9wKFhFbGVtZW50IHJ1blByb3BzLCBYTmFtZSB4TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHAgPSBydW5Qcm9wcy5FbGVtZW50KHhOYW1lKTsKKyAgICAgICAgICAgIGlmIChwID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgdmFyIHYgPSBwLkF0dHJpYnV0ZShXLnZhbCk7CisgICAgICAgICAgICBpZiAodiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgdmFyIHMgPSB2LlZhbHVlLlRvTG93ZXIoKTsKKyAgICAgICAgICAgIGlmIChzID09ICIwIiB8fCBzID09ICJmYWxzZSIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKHMgPT0gIjEiIHx8IHMgPT0gInRydWUiKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTGlzdDxYTmFtZT4gQWRkaXRpb25hbFJ1bkNvbnRhaW5lck5hbWVzID0gbmV3IExpc3Q8WE5hbWU+CisgICAgICAgIHsKKyAgICAgICAgICAgIFcudyArICJiZG8iLAorICAgICAgICAgICAgVy5jdXN0b21YbWwsCisgICAgICAgICAgICBXLmRpciwKKyAgICAgICAgICAgIFcuZmxkU2ltcGxlLAorICAgICAgICAgICAgVy5oeXBlcmxpbmssCisgICAgICAgICAgICBXLm1vdmVGcm9tLAorICAgICAgICAgICAgVy5tb3ZlVG8sCisgICAgICAgICAgICBXLnNkdENvbnRlbnQKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IENvYWxlc2NlQWRqYWNlbnRSdW5zV2l0aElkZW50aWNhbEZvcm1hdHRpbmcoWEVsZW1lbnQgcnVuQ29udGFpbmVyKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgZG9udENvbnNvbGlkYXRlID0gIkRvbnRDb25zb2xpZGF0ZSI7CisKKyAgICAgICAgICAgIElFbnVtZXJhYmxlPElHcm91cGluZzxzdHJpbmcsIFhFbGVtZW50Pj4gZ3JvdXBlZEFkamFjZW50UnVuc1dpdGhJZGVudGljYWxGb3JtYXR0aW5nID0KKyAgICAgICAgICAgICAgICBydW5Db250YWluZXIKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoY2UgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlLk5hbWUgPT0gVy5yKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZS5FbGVtZW50cygpLkNvdW50KGUgPT4gZS5OYW1lICE9IFcuclByKSAhPSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9udENvbnNvbGlkYXRlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgclByID0gY2UuRWxlbWVudChXLnJQcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJQclN0cmluZyA9IHJQciAhPSBudWxsID8gclByLlRvU3RyaW5nKFNhdmVPcHRpb25zLk5vbmUpIDogc3RyaW5nLkVtcHR5OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlLkVsZW1lbnQoVy50KSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIld0IiArIHJQclN0cmluZzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZS5FbGVtZW50KFcuaW5zdHJUZXh0KSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIldpbnN0clRleHQiICsgclByU3RyaW5nOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbnRDb25zb2xpZGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlLk5hbWUgPT0gVy5pbnMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlLkVsZW1lbnRzKFcuZGVsKS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb250Q29uc29saWRhdGU7CisjaWYgZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHc6aW5zL3c6ZGVsL3c6ci93OmRlbFRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjZS5FbGVtZW50cyhXLmRlbCkuRWxlbWVudHMoVy5yKS5FbGVtZW50cygpLkNvdW50KGUgPT4gZS5OYW1lICE9IFcuclByKSAhPSAxKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNlLkVsZW1lbnRzKCkuRWxlbWVudHMoKS5FbGVtZW50cyhXLmRlbFRleHQpLkFueSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbnRDb25zb2xpZGF0ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYQXR0cmlidXRlIGRhdGVJbnMgPSBjZS5BdHRyaWJ1dGUoVy5kYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgZGVsID0gY2UuRWxlbWVudChXLmRlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhBdHRyaWJ1dGUgZGF0ZURlbCA9IGRlbC5BdHRyaWJ1dGUoVy5kYXRlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYXV0aG9ySW5zID0gKHN0cmluZykgY2UuQXR0cmlidXRlKFcuYXV0aG9yKSA/PyBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBkYXRlSW5zU3RyaW5nID0gZGF0ZUlucyAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgoRGF0ZVRpbWUpIGRhdGVJbnMpLlRvU3RyaW5nKCJzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYXV0aG9yRGVsID0gKHN0cmluZykgZGVsLkF0dHJpYnV0ZShXLmF1dGhvcikgPz8gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZGF0ZURlbFN0cmluZyA9IGRhdGVEZWwgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoKERhdGVUaW1lKSBkYXRlRGVsKS5Ub1N0cmluZygicyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0cmluZy5FbXB0eTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIldpbnMiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcklucyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlSW5zU3RyaW5nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvckRlbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlRGVsU3RyaW5nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlLkVsZW1lbnRzKFcuZGVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuclByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoclByID0+IHJQci5Ub1N0cmluZyhTYXZlT3B0aW9ucy5Ob25lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHc6aW5zL3c6ci93OnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNlLkVsZW1lbnRzKCkuRWxlbWVudHMoKS5Db3VudChlID0+IGUuTmFtZSAhPSBXLnJQcikgIT0gMSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNlLkVsZW1lbnRzKCkuRWxlbWVudHMoVy50KS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbnRDb25zb2xpZGF0ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhBdHRyaWJ1dGUgZGF0ZUluczIgPSBjZS5BdHRyaWJ1dGUoVy5kYXRlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhdXRob3JJbnMyID0gKHN0cmluZykgY2UuQXR0cmlidXRlKFcuYXV0aG9yKSA/PyBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGRhdGVJbnNTdHJpbmcyID0gZGF0ZUluczIgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgoRGF0ZVRpbWUpIGRhdGVJbnMyKS5Ub1N0cmluZygicyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RyaW5nLkVtcHR5OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGlkSW5zMiA9IChzdHJpbmcpY2UuQXR0cmlidXRlKFcuaWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJXaW5zMiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JJbnMyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUluc1N0cmluZzIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZEluczIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZS5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5yUHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHJQciA9PiByUHIuVG9TdHJpbmcoU2F2ZU9wdGlvbnMuTm9uZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlLk5hbWUgPT0gVy5kZWwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjZS5FbGVtZW50cyhXLnIpLkVsZW1lbnRzKCkuQ291bnQoZSA9PiBlLk5hbWUgIT0gVy5yUHIpICE9IDEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjZS5FbGVtZW50cygpLkVsZW1lbnRzKFcuZGVsVGV4dCkuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb250Q29uc29saWRhdGU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYQXR0cmlidXRlIGRhdGVEZWwyID0gY2UuQXR0cmlidXRlKFcuZGF0ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYXV0aG9yRGVsMiA9IChzdHJpbmcpIGNlLkF0dHJpYnV0ZShXLmF1dGhvcikgPz8gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBkYXRlRGVsU3RyaW5nMiA9IGRhdGVEZWwyICE9IG51bGwgPyAoKERhdGVUaW1lKSBkYXRlRGVsMikuVG9TdHJpbmcoInMiKSA6IHN0cmluZy5FbXB0eTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiV2RlbCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JEZWwyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZURlbFN0cmluZzIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZS5FbGVtZW50cyhXLnIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5yUHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHJQciA9PiByUHIuVG9TdHJpbmcoU2F2ZU9wdGlvbnMuTm9uZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbnRDb25zb2xpZGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHZhciBydW5Db250YWluZXJXaXRoQ29uc29saWRhdGVkUnVucyA9IG5ldyBYRWxlbWVudChydW5Db250YWluZXIuTmFtZSwKKyAgICAgICAgICAgICAgICBydW5Db250YWluZXIuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgIGdyb3VwZWRBZGphY2VudFJ1bnNXaXRoSWRlbnRpY2FsRm9ybWF0dGluZy5TZWxlY3QoZyA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGcuS2V5ID09IGRvbnRDb25zb2xpZGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqZWN0KSBnOworCisgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0ZXh0VmFsdWUgPSBnCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHIgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGQgPT4gKGQuTmFtZSA9PSBXLnQpIHx8IChkLk5hbWUgPT0gVy5kZWxUZXh0KSB8fCAoZC5OYW1lID09IFcuaW5zdHJUZXh0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChkID0+IGQuVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIFhBdHRyaWJ1dGUgeHMgPSBYbWxVdGlsLkdldFhtbFNwYWNlQXR0cmlidXRlKHRleHRWYWx1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGcuRmlyc3QoKS5OYW1lID09IFcucikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuRmlyc3QoKS5FbGVtZW50KFcudCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTxJRW51bWVyYWJsZTxYQXR0cmlidXRlPj4gc3RhdHVzQXR0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5TZWxlY3QociA9PiByLkRlc2NlbmRhbnRzKFcudCkuVGFrZSgxKS5BdHRyaWJ1dGVzKFB0T3BlblhtbC5TdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5GaXJzdCgpLkVsZW1lbnRzKFcuclByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudCwgc3RhdHVzQXR0LCB4cywgdGV4dFZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnLkZpcnN0KCkuRWxlbWVudChXLmluc3RyVGV4dCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5GaXJzdCgpLkVsZW1lbnRzKFcuclByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuaW5zdHJUZXh0LCB4cywgdGV4dFZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZy5GaXJzdCgpLk5hbWUgPT0gVy5pbnMpCisgICAgICAgICAgICAgICAgICAgIHsKKyNpZiBmYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuRmlyc3QoKS5FbGVtZW50cyhXLmRlbCkuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLmlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5GaXJzdCgpLkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5GaXJzdCgpLkVsZW1lbnRzKFcuZGVsKS5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuRmlyc3QoKS5FbGVtZW50cyhXLmRlbCkuRWxlbWVudHMoVy5yKS5FbGVtZW50cyhXLnJQciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuZGVsVGV4dCwgeHMsIHRleHRWYWx1ZSkpKSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5pbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5GaXJzdCgpLkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLkZpcnN0KCkuRWxlbWVudHMoVy5yKS5FbGVtZW50cyhXLnJQciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnQsIHhzLCB0ZXh0VmFsdWUpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZy5GaXJzdCgpLk5hbWUgPT0gVy5kZWwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuRmlyc3QoKS5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5GaXJzdCgpLkVsZW1lbnRzKFcucikuRWxlbWVudHMoVy5yUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5kZWxUZXh0LCB4cywgdGV4dFZhbHVlKSkpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnOworICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgLy8gUHJvY2VzcyB3OnR4YnhDb250ZW50Ly93OnAKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IHR4YnggaW4gcnVuQ29udGFpbmVyV2l0aENvbnNvbGlkYXRlZFJ1bnMuRGVzY2VuZGFudHMoVy50eGJ4Q29udGVudCkpCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgdHhieFBhcmEgaW4gdHhieC5EZXNjZW5kYW50c1RyaW1tZWQoVy50eGJ4Q29udGVudCkuV2hlcmUoZCA9PiBkLk5hbWUgPT0gVy5wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld1BhcmEgPSBDb2FsZXNjZUFkamFjZW50UnVuc1dpdGhJZGVudGljYWxGb3JtYXR0aW5nKHR4YnhQYXJhKTsKKyAgICAgICAgICAgICAgICAgICAgdHhieFBhcmEuUmVwbGFjZVdpdGgobmV3UGFyYSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQcm9jZXNzIGFkZGl0aW9uYWwgcnVuIGNvbnRhaW5lcnMuCisgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBydW5Db250YWluZXJzID0gcnVuQ29udGFpbmVyV2l0aENvbnNvbGlkYXRlZFJ1bnMKKyAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgIC5XaGVyZShkID0+IEFkZGl0aW9uYWxSdW5Db250YWluZXJOYW1lcy5Db250YWlucyhkLk5hbWUpKQorICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGNvbnRhaW5lciBpbiBydW5Db250YWluZXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld0NvbnRhaW5lciA9IENvYWxlc2NlQWRqYWNlbnRSdW5zV2l0aElkZW50aWNhbEZvcm1hdHRpbmcoY29udGFpbmVyKTsKKyAgICAgICAgICAgICAgICBjb250YWluZXIuUmVwbGFjZVdpdGgobmV3Q29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJ1bkNvbnRhaW5lcldpdGhDb25zb2xpZGF0ZWRSdW5zOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxYTmFtZSwgaW50PiBPcmRlcl9zZXR0aW5ncyA9IG5ldyBEaWN0aW9uYXJ5PFhOYW1lLCBpbnQ+CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgVy53cml0ZVByb3RlY3Rpb24sIDEwfSwgCisgICAgICAgICAgICB7IFcudmlldywgMjB9LCAKKyAgICAgICAgICAgIHsgVy56b29tLCAzMH0sIAorICAgICAgICAgICAgeyBXLnJlbW92ZVBlcnNvbmFsSW5mb3JtYXRpb24sIDQwfSwgCisgICAgICAgICAgICB7IFcucmVtb3ZlRGF0ZUFuZFRpbWUsIDUwfSwgCisgICAgICAgICAgICB7IFcuZG9Ob3REaXNwbGF5UGFnZUJvdW5kYXJpZXMsIDYwfSwgCisgICAgICAgICAgICB7IFcuZGlzcGxheUJhY2tncm91bmRTaGFwZSwgNzB9LCAKKyAgICAgICAgICAgIHsgVy5wcmludFBvc3RTY3JpcHRPdmVyVGV4dCwgODB9LCAKKyAgICAgICAgICAgIHsgVy5wcmludEZyYWN0aW9uYWxDaGFyYWN0ZXJXaWR0aCwgOTB9LCAKKyAgICAgICAgICAgIHsgVy5wcmludEZvcm1zRGF0YSwgMTAwfSwgCisgICAgICAgICAgICB7IFcuZW1iZWRUcnVlVHlwZUZvbnRzLCAxMTB9LCAKKyAgICAgICAgICAgIHsgVy5lbWJlZFN5c3RlbUZvbnRzLCAxMjB9LCAKKyAgICAgICAgICAgIHsgVy5zYXZlU3Vic2V0Rm9udHMsIDEzMH0sIAorICAgICAgICAgICAgeyBXLnNhdmVGb3Jtc0RhdGEsIDE0MH0sIAorICAgICAgICAgICAgeyBXLm1pcnJvck1hcmdpbnMsIDE1MH0sIAorICAgICAgICAgICAgeyBXLmFsaWduQm9yZGVyc0FuZEVkZ2VzLCAxNjB9LCAKKyAgICAgICAgICAgIHsgVy5ib3JkZXJzRG9Ob3RTdXJyb3VuZEhlYWRlciwgMTcwfSwgCisgICAgICAgICAgICB7IFcuYm9yZGVyc0RvTm90U3Vycm91bmRGb290ZXIsIDE4MH0sIAorICAgICAgICAgICAgeyBXLmd1dHRlckF0VG9wLCAxOTB9LCAKKyAgICAgICAgICAgIHsgVy5oaWRlU3BlbGxpbmdFcnJvcnMsIDIwMH0sIAorICAgICAgICAgICAgeyBXLmhpZGVHcmFtbWF0aWNhbEVycm9ycywgMjEwfSwgCisgICAgICAgICAgICB7IFcuYWN0aXZlV3JpdGluZ1N0eWxlLCAyMjB9LCAKKyAgICAgICAgICAgIHsgVy5wcm9vZlN0YXRlLCAyMzB9LCAKKyAgICAgICAgICAgIHsgVy5mb3Jtc0Rlc2lnbiwgMjQwfSwgCisgICAgICAgICAgICB7IFcuYXR0YWNoZWRUZW1wbGF0ZSwgMjUwfSwgCisgICAgICAgICAgICB7IFcubGlua1N0eWxlcywgMjYwfSwgCisgICAgICAgICAgICB7IFcuc3R5bGVQYW5lRm9ybWF0RmlsdGVyLCAyNzB9LCAKKyAgICAgICAgICAgIHsgVy5zdHlsZVBhbmVTb3J0TWV0aG9kLCAyODB9LCAKKyAgICAgICAgICAgIHsgVy5kb2N1bWVudFR5cGUsIDI5MH0sIAorICAgICAgICAgICAgeyBXLm1haWxNZXJnZSwgMzAwfSwgCisgICAgICAgICAgICB7IFcucmV2aXNpb25WaWV3LCAzMTB9LCAKKyAgICAgICAgICAgIHsgVy50cmFja1JldmlzaW9ucywgMzIwfSwgCisgICAgICAgICAgICB7IFcuZG9Ob3RUcmFja01vdmVzLCAzMzB9LCAKKyAgICAgICAgICAgIHsgVy5kb05vdFRyYWNrRm9ybWF0dGluZywgMzQwfSwgCisgICAgICAgICAgICB7IFcuZG9jdW1lbnRQcm90ZWN0aW9uLCAzNTB9LCAKKyAgICAgICAgICAgIHsgVy5hdXRvRm9ybWF0T3ZlcnJpZGUsIDM2MH0sIAorICAgICAgICAgICAgeyBXLnN0eWxlTG9ja1RoZW1lLCAzNzB9LCAKKyAgICAgICAgICAgIHsgVy5zdHlsZUxvY2tRRlNldCwgMzgwfSwgCisgICAgICAgICAgICB7IFcuZGVmYXVsdFRhYlN0b3AsIDM5MH0sIAorICAgICAgICAgICAgeyBXLmF1dG9IeXBoZW5hdGlvbiwgNDAwfSwgCisgICAgICAgICAgICB7IFcuY29uc2VjdXRpdmVIeXBoZW5MaW1pdCwgNDEwfSwgCisgICAgICAgICAgICB7IFcuaHlwaGVuYXRpb25ab25lLCA0MjB9LCAKKyAgICAgICAgICAgIHsgVy5kb05vdEh5cGhlbmF0ZUNhcHMsIDQzMH0sIAorICAgICAgICAgICAgeyBXLnNob3dFbnZlbG9wZSwgNDQwfSwgCisgICAgICAgICAgICB7IFcuc3VtbWFyeUxlbmd0aCwgNDUwfSwgCisgICAgICAgICAgICB7IFcuY2xpY2tBbmRUeXBlU3R5bGUsIDQ2MH0sIAorICAgICAgICAgICAgeyBXLmRlZmF1bHRUYWJsZVN0eWxlLCA0NzB9LCAKKyAgICAgICAgICAgIHsgVy5ldmVuQW5kT2RkSGVhZGVycywgNDgwfSwgCisgICAgICAgICAgICB7IFcuYm9va0ZvbGRSZXZQcmludGluZywgNDkwfSwgCisgICAgICAgICAgICB7IFcuYm9va0ZvbGRQcmludGluZywgNTAwfSwgCisgICAgICAgICAgICB7IFcuYm9va0ZvbGRQcmludGluZ1NoZWV0cywgNTEwfSwgCisgICAgICAgICAgICB7IFcuZHJhd2luZ0dyaWRIb3Jpem9udGFsU3BhY2luZywgNTIwfSwgCisgICAgICAgICAgICB7IFcuZHJhd2luZ0dyaWRWZXJ0aWNhbFNwYWNpbmcsIDUzMH0sIAorICAgICAgICAgICAgeyBXLmRpc3BsYXlIb3Jpem9udGFsRHJhd2luZ0dyaWRFdmVyeSwgNTQwfSwgCisgICAgICAgICAgICB7IFcuZGlzcGxheVZlcnRpY2FsRHJhd2luZ0dyaWRFdmVyeSwgNTUwfSwgCisgICAgICAgICAgICB7IFcuZG9Ob3RVc2VNYXJnaW5zRm9yRHJhd2luZ0dyaWRPcmlnaW4sIDU2MH0sIAorICAgICAgICAgICAgeyBXLmRyYXdpbmdHcmlkSG9yaXpvbnRhbE9yaWdpbiwgNTcwfSwgCisgICAgICAgICAgICB7IFcuZHJhd2luZ0dyaWRWZXJ0aWNhbE9yaWdpbiwgNTgwfSwgCisgICAgICAgICAgICB7IFcuZG9Ob3RTaGFkZUZvcm1EYXRhLCA1OTB9LCAKKyAgICAgICAgICAgIHsgVy5ub1B1bmN0dWF0aW9uS2VybmluZywgNjAwfSwgCisgICAgICAgICAgICB7IFcuY2hhcmFjdGVyU3BhY2luZ0NvbnRyb2wsIDYxMH0sIAorICAgICAgICAgICAgeyBXLnByaW50VHdvT25PbmUsIDYyMH0sIAorICAgICAgICAgICAgeyBXLnN0cmljdEZpcnN0QW5kTGFzdENoYXJzLCA2MzB9LCAKKyAgICAgICAgICAgIHsgVy5ub0xpbmVCcmVha3NBZnRlciwgNjQwfSwgCisgICAgICAgICAgICB7IFcubm9MaW5lQnJlYWtzQmVmb3JlLCA2NTB9LCAKKyAgICAgICAgICAgIHsgVy5zYXZlUHJldmlld1BpY3R1cmUsIDY2MH0sIAorICAgICAgICAgICAgeyBXLmRvTm90VmFsaWRhdGVBZ2FpbnN0U2NoZW1hLCA2NzB9LCAKKyAgICAgICAgICAgIHsgVy5zYXZlSW52YWxpZFhtbCwgNjgwfSwgCisgICAgICAgICAgICB7IFcuaWdub3JlTWl4ZWRDb250ZW50LCA2OTB9LCAKKyAgICAgICAgICAgIHsgVy5hbHdheXNTaG93UGxhY2Vob2xkZXJUZXh0LCA3MDB9LCAKKyAgICAgICAgICAgIHsgVy5kb05vdERlbWFyY2F0ZUludmFsaWRYbWwsIDcxMH0sIAorICAgICAgICAgICAgeyBXLnNhdmVYbWxEYXRhT25seSwgNzIwfSwgCisgICAgICAgICAgICB7IFcudXNlWFNMVFdoZW5TYXZpbmcsIDczMH0sIAorICAgICAgICAgICAgeyBXLnNhdmVUaHJvdWdoWHNsdCwgNzQwfSwgCisgICAgICAgICAgICB7IFcuc2hvd1hNTFRhZ3MsIDc1MH0sIAorICAgICAgICAgICAgeyBXLmFsd2F5c01lcmdlRW1wdHlOYW1lc3BhY2UsIDc2MH0sIAorICAgICAgICAgICAgeyBXLnVwZGF0ZUZpZWxkcywgNzcwfSwgCisgICAgICAgICAgICB7IFcuZm9vdG5vdGVQciwgNzgwfSwgCisgICAgICAgICAgICB7IFcuZW5kbm90ZVByLCA3OTB9LCAKKyAgICAgICAgICAgIHsgVy5jb21wYXQsIDgwMH0sIAorICAgICAgICAgICAgeyBXLmRvY1ZhcnMsIDgxMH0sIAorICAgICAgICAgICAgeyBXLnJzaWRzLCA4MjB9LCAKKyAgICAgICAgICAgIHsgTS5tYXRoUHIsIDgzMH0sIAorICAgICAgICAgICAgeyBXLmF0dGFjaGVkU2NoZW1hLCA4NDB9LCAKKyAgICAgICAgICAgIHsgVy50aGVtZUZvbnRMYW5nLCA4NTB9LCAKKyAgICAgICAgICAgIHsgVy5jbHJTY2hlbWVNYXBwaW5nLCA4NjB9LCAKKyAgICAgICAgICAgIHsgVy5kb05vdEluY2x1ZGVTdWJkb2NzSW5TdGF0cywgODcwfSwgCisgICAgICAgICAgICB7IFcuZG9Ob3RBdXRvQ29tcHJlc3NQaWN0dXJlcywgODgwfSwgCisgICAgICAgICAgICB7IFcuZm9yY2VVcGdyYWRlLCA4OTB9LCAKKyAgICAgICAgICAgIC8ve1cuY2FwdGlvbnMsIDkwMH0sIAorICAgICAgICAgICAgeyBXLnJlYWRNb2RlSW5rTG9ja0Rvd24sIDkxMH0sIAorICAgICAgICAgICAgeyBXLnNtYXJ0VGFnVHlwZSwgOTIwfSwgCisgICAgICAgICAgICAvL3tXLnNsOnNjaGVtYUxpYnJhcnksIDkzMH0sIAorICAgICAgICAgICAgeyBXLmRvTm90RW1iZWRTbWFydFRhZ3MsIDk0MH0sIAorICAgICAgICAgICAgeyBXLmRlY2ltYWxTeW1ib2wsIDk1MH0sIAorICAgICAgICAgICAgeyBXLmxpc3RTZXBhcmF0b3IsIDk2MH0sIAorICAgICAgICB9OworCisjaWYgZmFsc2UKKy8vIGZyb20gdGhlIHNjaGVtYSBpbiB0aGUgc3RhbmRhcmQKKyAgICAgICAgCit3cml0ZVByb3RlY3Rpb24KK3ZpZXcKK3pvb20KK3JlbW92ZVBlcnNvbmFsSW5mb3JtYXRpb24KK3JlbW92ZURhdGVBbmRUaW1lCitkb05vdERpc3BsYXlQYWdlQm91bmRhcmllcworZGlzcGxheUJhY2tncm91bmRTaGFwZQorcHJpbnRQb3N0U2NyaXB0T3ZlclRleHQKK3ByaW50RnJhY3Rpb25hbENoYXJhY3RlcldpZHRoCitwcmludEZvcm1zRGF0YQorZW1iZWRUcnVlVHlwZUZvbnRzCitlbWJlZFN5c3RlbUZvbnRzCitzYXZlU3Vic2V0Rm9udHMKK3NhdmVGb3Jtc0RhdGEKK21pcnJvck1hcmdpbnMKK2FsaWduQm9yZGVyc0FuZEVkZ2VzCitib3JkZXJzRG9Ob3RTdXJyb3VuZEhlYWRlcgorYm9yZGVyc0RvTm90U3Vycm91bmRGb290ZXIKK2d1dHRlckF0VG9wCitoaWRlU3BlbGxpbmdFcnJvcnMKK2hpZGVHcmFtbWF0aWNhbEVycm9ycworYWN0aXZlV3JpdGluZ1N0eWxlCitwcm9vZlN0YXRlCitmb3Jtc0Rlc2lnbgorYXR0YWNoZWRUZW1wbGF0ZQorbGlua1N0eWxlcworc3R5bGVQYW5lRm9ybWF0RmlsdGVyCitzdHlsZVBhbmVTb3J0TWV0aG9kCitkb2N1bWVudFR5cGUKK21haWxNZXJnZQorcmV2aXNpb25WaWV3Cit0cmFja1JldmlzaW9ucworZG9Ob3RUcmFja01vdmVzCitkb05vdFRyYWNrRm9ybWF0dGluZworZG9jdW1lbnRQcm90ZWN0aW9uCithdXRvRm9ybWF0T3ZlcnJpZGUKK3N0eWxlTG9ja1RoZW1lCitzdHlsZUxvY2tRRlNldAorZGVmYXVsdFRhYlN0b3AKK2F1dG9IeXBoZW5hdGlvbgorY29uc2VjdXRpdmVIeXBoZW5MaW1pdAoraHlwaGVuYXRpb25ab25lCitkb05vdEh5cGhlbmF0ZUNhcHMKK3Nob3dFbnZlbG9wZQorc3VtbWFyeUxlbmd0aAorY2xpY2tBbmRUeXBlU3R5bGUKK2RlZmF1bHRUYWJsZVN0eWxlCitldmVuQW5kT2RkSGVhZGVycworYm9va0ZvbGRSZXZQcmludGluZworYm9va0ZvbGRQcmludGluZworYm9va0ZvbGRQcmludGluZ1NoZWV0cworZHJhd2luZ0dyaWRIb3Jpem9udGFsU3BhY2luZworZHJhd2luZ0dyaWRWZXJ0aWNhbFNwYWNpbmcKK2Rpc3BsYXlIb3Jpem9udGFsRHJhd2luZ0dyaWRFdmVyeQorZGlzcGxheVZlcnRpY2FsRHJhd2luZ0dyaWRFdmVyeQorZG9Ob3RVc2VNYXJnaW5zRm9yRHJhd2luZ0dyaWRPcmlnaW4KK2RyYXdpbmdHcmlkSG9yaXpvbnRhbE9yaWdpbgorZHJhd2luZ0dyaWRWZXJ0aWNhbE9yaWdpbgorZG9Ob3RTaGFkZUZvcm1EYXRhCitub1B1bmN0dWF0aW9uS2VybmluZworY2hhcmFjdGVyU3BhY2luZ0NvbnRyb2wKK3ByaW50VHdvT25PbmUKK3N0cmljdEZpcnN0QW5kTGFzdENoYXJzCitub0xpbmVCcmVha3NBZnRlcgorbm9MaW5lQnJlYWtzQmVmb3JlCitzYXZlUHJldmlld1BpY3R1cmUKK2RvTm90VmFsaWRhdGVBZ2FpbnN0U2NoZW1hCitzYXZlSW52YWxpZFhtbAoraWdub3JlTWl4ZWRDb250ZW50CithbHdheXNTaG93UGxhY2Vob2xkZXJUZXh0Citkb05vdERlbWFyY2F0ZUludmFsaWRYbWwKK3NhdmVYbWxEYXRhT25seQordXNlWFNMVFdoZW5TYXZpbmcKK3NhdmVUaHJvdWdoWHNsdAorc2hvd1hNTFRhZ3MKK2Fsd2F5c01lcmdlRW1wdHlOYW1lc3BhY2UKK3VwZGF0ZUZpZWxkcworZm9vdG5vdGVQcgorZW5kbm90ZVByCitjb21wYXQKK2RvY1ZhcnMKK3JzaWRzCittOm1hdGhQcgorYXR0YWNoZWRTY2hlbWEKK3RoZW1lRm9udExhbmcKK2NsclNjaGVtZU1hcHBpbmcKK2RvTm90SW5jbHVkZVN1YmRvY3NJblN0YXRzCitkb05vdEF1dG9Db21wcmVzc1BpY3R1cmVzCitmb3JjZVVwZ3JhZGUKK2NhcHRpb25zCityZWFkTW9kZUlua0xvY2tEb3duCitzbWFydFRhZ1R5cGUKK3NsOnNjaGVtYUxpYnJhcnkKK2RvTm90RW1iZWRTbWFydFRhZ3MKK2RlY2ltYWxTeW1ib2wKK2xpc3RTZXBhcmF0b3IKKyNlbmRpZgorCisgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8WE5hbWUsIGludD4gT3JkZXJfcFByID0gbmV3IERpY3Rpb25hcnk8WE5hbWUsIGludD4KKyAgICAgICAgeworICAgICAgICAgICAgeyBXLnBTdHlsZSwgMTAgfSwKKyAgICAgICAgICAgIHsgVy5rZWVwTmV4dCwgMjAgfSwKKyAgICAgICAgICAgIHsgVy5rZWVwTGluZXMsIDMwIH0sCisgICAgICAgICAgICB7IFcucGFnZUJyZWFrQmVmb3JlLCA0MCB9LAorICAgICAgICAgICAgeyBXLmZyYW1lUHIsIDUwIH0sCisgICAgICAgICAgICB7IFcud2lkb3dDb250cm9sLCA2MCB9LAorICAgICAgICAgICAgeyBXLm51bVByLCA3MCB9LAorICAgICAgICAgICAgeyBXLnN1cHByZXNzTGluZU51bWJlcnMsIDgwIH0sCisgICAgICAgICAgICB7IFcucEJkciwgOTAgfSwKKyAgICAgICAgICAgIHsgVy5zaGQsIDEwMCB9LAorICAgICAgICAgICAgeyBXLnRhYnMsIDEyMCB9LAorICAgICAgICAgICAgeyBXLnN1cHByZXNzQXV0b0h5cGhlbnMsIDEzMCB9LAorICAgICAgICAgICAgeyBXLmtpbnNva3UsIDE0MCB9LAorICAgICAgICAgICAgeyBXLndvcmRXcmFwLCAxNTAgfSwKKyAgICAgICAgICAgIHsgVy5vdmVyZmxvd1B1bmN0LCAxNjAgfSwKKyAgICAgICAgICAgIHsgVy50b3BMaW5lUHVuY3QsIDE3MCB9LAorICAgICAgICAgICAgeyBXLmF1dG9TcGFjZURFLCAxODAgfSwKKyAgICAgICAgICAgIHsgVy5hdXRvU3BhY2VETiwgMTkwIH0sCisgICAgICAgICAgICB7IFcuYmlkaSwgMjAwIH0sCisgICAgICAgICAgICB7IFcuYWRqdXN0UmlnaHRJbmQsIDIxMCB9LAorICAgICAgICAgICAgeyBXLnNuYXBUb0dyaWQsIDIyMCB9LAorICAgICAgICAgICAgeyBXLnNwYWNpbmcsIDIzMCB9LAorICAgICAgICAgICAgeyBXLmluZCwgMjQwIH0sCisgICAgICAgICAgICB7IFcuY29udGV4dHVhbFNwYWNpbmcsIDI1MCB9LAorICAgICAgICAgICAgeyBXLm1pcnJvckluZGVudHMsIDI2MCB9LAorICAgICAgICAgICAgeyBXLnN1cHByZXNzT3ZlcmxhcCwgMjcwIH0sCisgICAgICAgICAgICB7IFcuamMsIDI4MCB9LAorICAgICAgICAgICAgeyBXLnRleHREaXJlY3Rpb24sIDI5MCB9LAorICAgICAgICAgICAgeyBXLnRleHRBbGlnbm1lbnQsIDMwMCB9LAorICAgICAgICAgICAgeyBXLnRleHRib3hUaWdodFdyYXAsIDMxMCB9LAorICAgICAgICAgICAgeyBXLm91dGxpbmVMdmwsIDMyMCB9LAorICAgICAgICAgICAgeyBXLmRpdklkLCAzMzAgfSwKKyAgICAgICAgICAgIHsgVy5jbmZTdHlsZSwgMzQwIH0sCisgICAgICAgICAgICB7IFcuclByLCAzNTAgfSwKKyAgICAgICAgICAgIHsgVy5zZWN0UHIsIDM2MCB9LAorICAgICAgICAgICAgeyBXLnBQckNoYW5nZSwgMzcwIH0sCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxYTmFtZSwgaW50PiBPcmRlcl9yUHIgPSBuZXcgRGljdGlvbmFyeTxYTmFtZSwgaW50PgorICAgICAgICB7CisgICAgICAgICAgICB7IFcuaW5zLCAxMCB9LAorICAgICAgICAgICAgeyBXLmRlbCwgMjAgfSwKKyAgICAgICAgICAgIHsgVy5yU3R5bGUsIDMwIH0sCisgICAgICAgICAgICB7IFcuckZvbnRzLCA0MCB9LAorICAgICAgICAgICAgeyBXLmIsIDUwIH0sCisgICAgICAgICAgICB7IFcuYkNzLCA2MCB9LAorICAgICAgICAgICAgeyBXLmksIDcwIH0sCisgICAgICAgICAgICB7IFcuaUNzLCA4MCB9LAorICAgICAgICAgICAgeyBXLmNhcHMsIDkwIH0sCisgICAgICAgICAgICB7IFcuc21hbGxDYXBzLCAxMDAgfSwKKyAgICAgICAgICAgIHsgVy5zdHJpa2UsIDExMCB9LAorICAgICAgICAgICAgeyBXLmRzdHJpa2UsIDEyMCB9LAorICAgICAgICAgICAgeyBXLm91dGxpbmUsIDEzMCB9LAorICAgICAgICAgICAgeyBXLnNoYWRvdywgMTQwIH0sCisgICAgICAgICAgICB7IFcuZW1ib3NzLCAxNTAgfSwKKyAgICAgICAgICAgIHsgVy5pbXByaW50LCAxNjAgfSwKKyAgICAgICAgICAgIHsgVy5ub1Byb29mLCAxNzAgfSwKKyAgICAgICAgICAgIHsgVy5zbmFwVG9HcmlkLCAxODAgfSwKKyAgICAgICAgICAgIHsgVy52YW5pc2gsIDE5MCB9LAorICAgICAgICAgICAgeyBXLndlYkhpZGRlbiwgMjAwIH0sCisgICAgICAgICAgICB7IFcuY29sb3IsIDIxMCB9LAorICAgICAgICAgICAgeyBXLnNwYWNpbmcsIDIyMCB9LAorICAgICAgICAgICAgeyBXLl93LCAyMzAgfSwKKyAgICAgICAgICAgIHsgVy5rZXJuLCAyNDAgfSwKKyAgICAgICAgICAgIHsgVy5wb3NpdGlvbiwgMjUwIH0sCisgICAgICAgICAgICB7IFcuc3osIDI2MCB9LAorICAgICAgICAgICAgeyBXMTQud1NoYWRvdywgMjcwIH0sCisgICAgICAgICAgICB7IFcxNC53VGV4dE91dGxpbmUsIDI4MCB9LAorICAgICAgICAgICAgeyBXMTQud1RleHRGaWxsLCAyOTAgfSwKKyAgICAgICAgICAgIHsgVzE0LndTY2VuZTNkLCAzMDAgfSwKKyAgICAgICAgICAgIHsgVzE0LndQcm9wczNkLCAzMTAgfSwKKyAgICAgICAgICAgIHsgVy5zekNzLCAzMjAgfSwKKyAgICAgICAgICAgIHsgVy5oaWdobGlnaHQsIDMzMCB9LAorICAgICAgICAgICAgeyBXLnUsIDM0MCB9LAorICAgICAgICAgICAgeyBXLmVmZmVjdCwgMzUwIH0sCisgICAgICAgICAgICB7IFcuYmRyLCAzNjAgfSwKKyAgICAgICAgICAgIHsgVy5zaGQsIDM3MCB9LAorICAgICAgICAgICAgeyBXLmZpdFRleHQsIDM4MCB9LAorICAgICAgICAgICAgeyBXLnZlcnRBbGlnbiwgMzkwIH0sCisgICAgICAgICAgICB7IFcucnRsLCA0MDAgfSwKKyAgICAgICAgICAgIHsgVy5jcywgNDEwIH0sCisgICAgICAgICAgICB7IFcuZW0sIDQyMCB9LAorICAgICAgICAgICAgeyBXLmxhbmcsIDQzMCB9LAorICAgICAgICAgICAgeyBXLmVhc3RBc2lhbkxheW91dCwgNDQwIH0sCisgICAgICAgICAgICB7IFcuc3BlY1ZhbmlzaCwgNDUwIH0sCisgICAgICAgICAgICB7IFcub01hdGgsIDQ2MCB9LAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8WE5hbWUsIGludD4gT3JkZXJfdGJsUHIgPSBuZXcgRGljdGlvbmFyeTxYTmFtZSwgaW50PgorICAgICAgICB7CisgICAgICAgICAgICB7IFcudGJsU3R5bGUsIDEwIH0sCisgICAgICAgICAgICB7IFcudGJscFByLCAyMCB9LAorICAgICAgICAgICAgeyBXLnRibE92ZXJsYXAsIDMwIH0sCisgICAgICAgICAgICB7IFcuYmlkaVZpc3VhbCwgNDAgfSwKKyAgICAgICAgICAgIHsgVy50YmxTdHlsZVJvd0JhbmRTaXplLCA1MCB9LAorICAgICAgICAgICAgeyBXLnRibFN0eWxlQ29sQmFuZFNpemUsIDYwIH0sCisgICAgICAgICAgICB7IFcudGJsVywgNzAgfSwKKyAgICAgICAgICAgIHsgVy5qYywgODAgfSwKKyAgICAgICAgICAgIHsgVy50YmxDZWxsU3BhY2luZywgOTAgfSwKKyAgICAgICAgICAgIHsgVy50YmxJbmQsIDEwMCB9LAorICAgICAgICAgICAgeyBXLnRibEJvcmRlcnMsIDExMCB9LAorICAgICAgICAgICAgeyBXLnNoZCwgMTIwIH0sCisgICAgICAgICAgICB7IFcudGJsTGF5b3V0LCAxMzAgfSwKKyAgICAgICAgICAgIHsgVy50YmxDZWxsTWFyLCAxNDAgfSwKKyAgICAgICAgICAgIHsgVy50YmxMb29rLCAxNTAgfSwKKyAgICAgICAgICAgIHsgVy50YmxDYXB0aW9uLCAxNjAgfSwKKyAgICAgICAgICAgIHsgVy50YmxEZXNjcmlwdGlvbiwgMTcwIH0sCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxYTmFtZSwgaW50PiBPcmRlcl90YmxCb3JkZXJzID0gbmV3IERpY3Rpb25hcnk8WE5hbWUsIGludD4KKyAgICAgICAgeworICAgICAgICAgICAgeyBXLnRvcCwgMTAgfSwKKyAgICAgICAgICAgIHsgVy5sZWZ0LCAyMCB9LAorICAgICAgICAgICAgeyBXLnN0YXJ0LCAzMCB9LAorICAgICAgICAgICAgeyBXLmJvdHRvbSwgNDAgfSwKKyAgICAgICAgICAgIHsgVy5yaWdodCwgNTAgfSwKKyAgICAgICAgICAgIHsgVy5lbmQsIDYwIH0sCisgICAgICAgICAgICB7IFcuaW5zaWRlSCwgNzAgfSwKKyAgICAgICAgICAgIHsgVy5pbnNpZGVWLCA4MCB9LAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8WE5hbWUsIGludD4gT3JkZXJfdGNQciA9IG5ldyBEaWN0aW9uYXJ5PFhOYW1lLCBpbnQ+CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgVy5jbmZTdHlsZSwgMTAgfSwKKyAgICAgICAgICAgIHsgVy50Y1csIDIwIH0sCisgICAgICAgICAgICB7IFcuZ3JpZFNwYW4sIDMwIH0sCisgICAgICAgICAgICB7IFcuaE1lcmdlLCA0MCB9LAorICAgICAgICAgICAgeyBXLnZNZXJnZSwgNTAgfSwKKyAgICAgICAgICAgIHsgVy50Y0JvcmRlcnMsIDYwIH0sCisgICAgICAgICAgICB7IFcuc2hkLCA3MCB9LAorICAgICAgICAgICAgeyBXLm5vV3JhcCwgODAgfSwKKyAgICAgICAgICAgIHsgVy50Y01hciwgOTAgfSwKKyAgICAgICAgICAgIHsgVy50ZXh0RGlyZWN0aW9uLCAxMDAgfSwKKyAgICAgICAgICAgIHsgVy50Y0ZpdFRleHQsIDExMCB9LAorICAgICAgICAgICAgeyBXLnZBbGlnbiwgMTIwIH0sCisgICAgICAgICAgICB7IFcuaGlkZU1hcmssIDEzMCB9LAorICAgICAgICAgICAgeyBXLmhlYWRlcnMsIDE0MCB9LAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8WE5hbWUsIGludD4gT3JkZXJfdGNCb3JkZXJzID0gbmV3IERpY3Rpb25hcnk8WE5hbWUsIGludD4KKyAgICAgICAgeworICAgICAgICAgICAgeyBXLnRvcCwgMTAgfSwKKyAgICAgICAgICAgIHsgVy5zdGFydCwgMjAgfSwKKyAgICAgICAgICAgIHsgVy5sZWZ0LCAzMCB9LAorICAgICAgICAgICAgeyBXLmJvdHRvbSwgNDAgfSwKKyAgICAgICAgICAgIHsgVy5yaWdodCwgNTAgfSwKKyAgICAgICAgICAgIHsgVy5lbmQsIDYwIH0sCisgICAgICAgICAgICB7IFcuaW5zaWRlSCwgNzAgfSwKKyAgICAgICAgICAgIHsgVy5pbnNpZGVWLCA4MCB9LAorICAgICAgICAgICAgeyBXLnRsMmJyLCA5MCB9LAorICAgICAgICAgICAgeyBXLnRyMmJsLCAxMDAgfSwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBEaWN0aW9uYXJ5PFhOYW1lLCBpbnQ+IE9yZGVyX3BCZHIgPSBuZXcgRGljdGlvbmFyeTxYTmFtZSwgaW50PgorICAgICAgICB7CisgICAgICAgICAgICB7IFcudG9wLCAxMCB9LAorICAgICAgICAgICAgeyBXLmxlZnQsIDIwIH0sCisgICAgICAgICAgICB7IFcuYm90dG9tLCAzMCB9LAorICAgICAgICAgICAgeyBXLnJpZ2h0LCA0MCB9LAorICAgICAgICAgICAgeyBXLmJldHdlZW4sIDUwIH0sCisgICAgICAgICAgICB7IFcuYmFyLCA2MCB9LAorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb2JqZWN0IFdtbE9yZGVyRWxlbWVudHNQZXJTdGFuZGFyZChYTm9kZSBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnBQcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoKS5TZWxlY3QoZSA9PiAoWEVsZW1lbnQpV21sT3JkZXJFbGVtZW50c1BlclN0YW5kYXJkKGUpKS5PcmRlckJ5KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3JkZXJfcFByLkNvbnRhaW5zS2V5KGUuTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcmRlcl9wUHJbZS5OYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk5OworICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnJQcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoKS5TZWxlY3QoZSA9PiAoWEVsZW1lbnQpV21sT3JkZXJFbGVtZW50c1BlclN0YW5kYXJkKGUpKS5PcmRlckJ5KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3JkZXJfclByLkNvbnRhaW5zS2V5KGUuTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcmRlcl9yUHJbZS5OYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk5OworICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRibFByKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cygpLlNlbGVjdChlID0+IChYRWxlbWVudClXbWxPcmRlckVsZW1lbnRzUGVyU3RhbmRhcmQoZSkpLk9yZGVyQnkoZSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPcmRlcl90YmxQci5Db250YWluc0tleShlLk5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3JkZXJfdGJsUHJbZS5OYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk5OworICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRjUHIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKCkuU2VsZWN0KGUgPT4gKFhFbGVtZW50KVdtbE9yZGVyRWxlbWVudHNQZXJTdGFuZGFyZChlKSkuT3JkZXJCeShlID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9yZGVyX3RjUHIuQ29udGFpbnNLZXkoZS5OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9yZGVyX3RjUHJbZS5OYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk5OworICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRjQm9yZGVycykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoKS5TZWxlY3QoZSA9PiAoWEVsZW1lbnQpV21sT3JkZXJFbGVtZW50c1BlclN0YW5kYXJkKGUpKS5PcmRlckJ5KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3JkZXJfdGNCb3JkZXJzLkNvbnRhaW5zS2V5KGUuTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcmRlcl90Y0JvcmRlcnNbZS5OYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk5OworICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRibEJvcmRlcnMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKCkuU2VsZWN0KGUgPT4gKFhFbGVtZW50KVdtbE9yZGVyRWxlbWVudHNQZXJTdGFuZGFyZChlKSkuT3JkZXJCeShlID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9yZGVyX3RibEJvcmRlcnMuQ29udGFpbnNLZXkoZS5OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9yZGVyX3RibEJvcmRlcnNbZS5OYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk5OworICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnBCZHIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKCkuU2VsZWN0KGUgPT4gKFhFbGVtZW50KVdtbE9yZGVyRWxlbWVudHNQZXJTdGFuZGFyZChlKSkuT3JkZXJCeShlID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9yZGVyX3BCZHIuQ29udGFpbnNLZXkoZS5OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9yZGVyX3BCZHJbZS5OYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk5OworICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UCA9IG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoVy5wUHIpLlNlbGVjdChlID0+IChYRWxlbWVudClXbWxPcmRlckVsZW1lbnRzUGVyU3RhbmRhcmQoZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cygpLldoZXJlKGUgPT4gZS5OYW1lICE9IFcucFByKS5TZWxlY3QoZSA9PiAoWEVsZW1lbnQpV21sT3JkZXJFbGVtZW50c1BlclN0YW5kYXJkKGUpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdQOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5yKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cyhXLnJQcikuU2VsZWN0KGUgPT4gKFhFbGVtZW50KVdtbE9yZGVyRWxlbWVudHNQZXJTdGFuZGFyZChlKSksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKCkuV2hlcmUoZSA9PiBlLk5hbWUgIT0gVy5yUHIpLlNlbGVjdChlID0+IChYRWxlbWVudClXbWxPcmRlckVsZW1lbnRzUGVyU3RhbmRhcmQoZSkpKTsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5zZXR0aW5ncykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoKS5TZWxlY3QoZSA9PiAoWEVsZW1lbnQpV21sT3JkZXJFbGVtZW50c1BlclN0YW5kYXJkKGUpKS5PcmRlckJ5KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3JkZXJfc2V0dGluZ3MuQ29udGFpbnNLZXkoZS5OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9yZGVyX3NldHRpbmdzW2UuTmFtZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDk5OTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFdtbE9yZGVyRWxlbWVudHNQZXJTdGFuZGFyZChuKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFdtbERvY3VtZW50IEJyZWFrTGlua1RvVGVtcGxhdGUoV21sRG9jdW1lbnQgc291cmNlKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKHNvdXJjZS5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgc291cmNlLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtcywgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZWZwcCA9IHdEb2MuRXh0ZW5kZWRGaWxlUHJvcGVydGllc1BhcnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChlZnBwICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ZCA9IGVmcHAuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB4ZC5EZXNjZW5kYW50cyhFUC5UZW1wbGF0ZSkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLlZhbHVlID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICBlZnBwLlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgV21sRG9jdW1lbnQoc291cmNlLkZpbGVOYW1lLCBtcy5Ub0FycmF5KCkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByZXNlbnRhdGlvbk1MVXRpbAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEZpeFVwUHJlc2VudGF0aW9uRG9jdW1lbnQoUHJlc2VudGF0aW9uRG9jdW1lbnQgcERvYykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gcERvYy5HZXRBbGxQYXJ0cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwYXJ0LkNvbnRlbnRUeXBlID09ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGUreG1sIiB8fAorICAgICAgICAgICAgICAgICAgICBwYXJ0LkNvbnRlbnRUeXBlID09ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVNYXN0ZXIreG1sIiB8fAorICAgICAgICAgICAgICAgICAgICBwYXJ0LkNvbnRlbnRUeXBlID09ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVMYXlvdXQreG1sIiB8fAorICAgICAgICAgICAgICAgICAgICBwYXJ0LkNvbnRlbnRUeXBlID09ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwubm90ZXNNYXN0ZXIreG1sIiB8fAorICAgICAgICAgICAgICAgICAgICBwYXJ0LkNvbnRlbnRUeXBlID09ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwubm90ZXNTbGlkZSt4bWwiIHx8CisgICAgICAgICAgICAgICAgICAgIHBhcnQuQ29udGVudFR5cGUgPT0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5oYW5kb3V0TWFzdGVyK3htbCIgfHwKKyAgICAgICAgICAgICAgICAgICAgcGFydC5Db250ZW50VHlwZSA9PSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnRoZW1lK3htbCIgfHwKKyAgICAgICAgICAgICAgICAgICAgcGFydC5Db250ZW50VHlwZSA9PSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5jaGFydCt4bWwiIHx8CisgICAgICAgICAgICAgICAgICAgIHBhcnQuQ29udGVudFR5cGUgPT0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuZGlhZ3JhbURhdGEreG1sIiB8fAorICAgICAgICAgICAgICAgICAgICBwYXJ0LkNvbnRlbnRUeXBlID09ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZ21sLmNoYXJ0c2hhcGVzK3htbCIgfHwKKyAgICAgICAgICAgICAgICAgICAgcGFydC5Db250ZW50VHlwZSA9PSAiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZS5kcmF3aW5nbWwuZGlhZ3JhbURyYXdpbmcreG1sIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhEb2N1bWVudCB4ZCA9IHBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHhkLkRlc2NlbmRhbnRzKCkuQXR0cmlidXRlcygic210Q2xlYW4iKS5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgeGQuRGVzY2VuZGFudHMoKS5BdHRyaWJ1dGVzKCJzbXRJZCIpLlJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICBwYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGFydC5Db250ZW50VHlwZSA9PSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnZtbERyYXdpbmciKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpeGVkQ29udGVudCA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSBwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWRXcml0ZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3IgPSBuZXcgU3RyZWFtUmVhZGVyKHN0cmVhbSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zdHJpbmcgaW5wdXQgPSBAIiAgICA8IVtpZiBndGUgbXNvIDldPjx2OmltYWdlZGF0YSBvOnJlbGlkPSIicklkMTUiIiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gc3IuUmVhZFRvRW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHBhdHRlcm4gPSBAIjwhXFsoPzx0ZXN0Pi4qKVxdPiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zdHJpbmcgcmVwbGFjZW1lbnQgPSAiPCFbQ0RBVEFbJHt0ZXN0fV1dPiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maXhlZENvbnRlbnQgPSBSZWdleC5SZXBsYWNlKGlucHV0LCBwYXR0ZXJuLCByZXBsYWNlbWVudCwgUmVnZXhPcHRpb25zLk11bHRpbGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRDb250ZW50ID0gUmVnZXguUmVwbGFjZShpbnB1dCwgcGF0dGVybiwgbSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBtLkdyb3Vwc1sxXS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuU3RhcnRzV2l0aCgiQ0RBVEFbIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjwhWyIgKyBnICsgIl0+IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICI8IVtDREFUQVsiICsgZyArICJdXT4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnZXhPcHRpb25zLk11bHRpbGluZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ZhciBpbnB1dCA9IEAieHh4eHggbzpyZWxpZD0iInJJZDEiIiBvOnJlbGlkPSIicklkMSIiIHh4eHh4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gQCJvOnJlbGlkPVsiIiddKD88aWQxPi4qKVsiIiddIG86cmVsaWQ9WyIiJ10oPzxpZDI+LiopWyIiJ10iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkQ29udGVudCA9IFJlZ2V4LlJlcGxhY2UoZml4ZWRDb250ZW50LCBwYXR0ZXJuLCBtID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IG0uR3JvdXBzWzFdLlZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQCJvOnJlbGlkPSIiIiArIGcgKyBAIiIiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2V4T3B0aW9ucy5NdWx0aWxpbmUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRDb250ZW50ID0gZml4ZWRDb250ZW50LlJlcGxhY2UoIjwveG1sPm1sPiIsICI8L3htbD4iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5TZXRMZW5ndGgoZml4ZWRDb250ZW50Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhmaXhlZENvbnRlbnQpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQuRmVlZERhdGEobXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ByZWFkc2hlZXRNTFV0aWwKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldENlbGxUeXBlKHN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbHVlLkFueShjID0+ICFDaGFyLklzRGlnaXQoYykgJiYgYyAhPSAnLicpKQorICAgICAgICAgICAgICAgIHJldHVybiAic3RyIjsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgSW50VG9Db2x1bW5JZChpbnQgaSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPj0gMCAmJiBpIDw9IDI1KQorICAgICAgICAgICAgICAgIHJldHVybiAoKGNoYXIpKCgoaW50KSdBJykgKyBpKSkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChpID49IDI2ICYmIGkgPD0gNzAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB2ID0gaSAtIDI2OworICAgICAgICAgICAgICAgIGludCBoID0gdiAvIDI2OworICAgICAgICAgICAgICAgIGludCBsID0gdiAlIDI2OworICAgICAgICAgICAgICAgIHJldHVybiAoKGNoYXIpKCgoaW50KSdBJykgKyBoKSkuVG9TdHJpbmcoKSArICgoY2hhcikoKChpbnQpJ0EnKSArIGwpKS5Ub1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gMTc1NzYKKyAgICAgICAgICAgIGlmIChpID49IDcwMiAmJiBpIDw9IDE4Mjc3KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB2ID0gaSAtIDcwMjsKKyAgICAgICAgICAgICAgICBpbnQgaCA9IHYgLyA2NzY7CisgICAgICAgICAgICAgICAgaW50IHIgPSB2ICUgNjc2OworICAgICAgICAgICAgICAgIGludCBtID0gciAvIDI2OworICAgICAgICAgICAgICAgIGludCBsID0gciAlIDI2OworICAgICAgICAgICAgICAgIHJldHVybiAoKGNoYXIpKCgoaW50KSdBJykgKyBoKSkuVG9TdHJpbmcoKSArCisgICAgICAgICAgICAgICAgICAgICgoY2hhcikoKChpbnQpJ0EnKSArIG0pKS5Ub1N0cmluZygpICsKKyAgICAgICAgICAgICAgICAgICAgKChjaGFyKSgoKGludCknQScpICsgbCkpLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29sdW1uUmVmZXJlbmNlT3V0T2ZSYW5nZShpLlRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IENoYXJUb0ludChjaGFyIGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KWMgLSAoaW50KSdBJzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbHVtbklkVG9JbnQoc3RyaW5nIGNpZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNpZC5MZW5ndGggPT0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2hhclRvSW50KGNpZFswXSk7CisgICAgICAgICAgICBpZiAoY2lkLkxlbmd0aCA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDaGFyVG9JbnQoY2lkWzBdKSAqIDI2ICsgQ2hhclRvSW50KGNpZFsxXSkgKyAyNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaWQuTGVuZ3RoID09IDMpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2hhclRvSW50KGNpZFswXSkgKiA2NzYgKyBDaGFyVG9JbnQoY2lkWzFdKSAqIDI2ICsgQ2hhclRvSW50KGNpZFsyXSkgKyA3MDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29sdW1uUmVmZXJlbmNlT3V0T2ZSYW5nZShjaWQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxzdHJpbmc+IENvbHVtbklEcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodmFyIGMgPSAoaW50KSdBJzsgYyA8PSAoaW50KSdaJzsgKytjKQorICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiAoKGNoYXIpYykuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGZvciAodmFyIGMxID0gKGludCknQSc7IGMxIDw9IChpbnQpJ1onOyArK2MxKQorICAgICAgICAgICAgICAgIGZvciAodmFyIGMyID0gKGludCknQSc7IGMyIDw9IChpbnQpJ1onOyArK2MyKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gKChjaGFyKWMxKS5Ub1N0cmluZygpICsgKChjaGFyKWMyKS5Ub1N0cmluZygpOworICAgICAgICAgICAgZm9yICh2YXIgZDEgPSAoaW50KSdBJzsgZDEgPD0gKGludCknWic7ICsrZDEpCisgICAgICAgICAgICAgICAgZm9yICh2YXIgZDIgPSAoaW50KSdBJzsgZDIgPD0gKGludCknWic7ICsrZDIpCisgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGQzID0gKGludCknQSc7IGQzIDw9IChpbnQpJ1onOyArK2QzKQorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuICgoY2hhcilkMSkuVG9TdHJpbmcoKSArICgoY2hhcilkMikuVG9TdHJpbmcoKSArICgoY2hhcilkMykuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIENvbHVtbklkT2Yoc3RyaW5nIGNlbGxSZWZlcmVuY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBjb2x1bW5JZE9mID0gY2VsbFJlZmVyZW5jZS5TcGxpdCgnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScpLkZpcnN0KCk7CisgICAgICAgICAgICByZXR1cm4gY29sdW1uSWRPZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBVdGlsCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZ1tdIFdvcmRwcm9jZXNzaW5nRXh0ZW5zaW9ucyA9IG5ld1tdIHsKKyAgICAgICAgICAgICIuZG9jeCIsCisgICAgICAgICAgICAiLmRvY20iLAorICAgICAgICAgICAgIi5kb3R4IiwKKyAgICAgICAgICAgICIuZG90bSIsCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIElzV29yZHByb2Nlc3NpbmdNTChzdHJpbmcgZXh0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV29yZHByb2Nlc3NpbmdFeHRlbnNpb25zLkNvbnRhaW5zKGV4dC5Ub0xvd2VyKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmdbXSBTcHJlYWRzaGVldEV4dGVuc2lvbnMgPSBuZXdbXSB7CisgICAgICAgICAgICAiLnhsc3giLAorICAgICAgICAgICAgIi54bHNtIiwKKyAgICAgICAgICAgICIueGx0eCIsCisgICAgICAgICAgICAiLnhsdG0iLAorICAgICAgICAgICAgIi54bGFtIiwKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgSXNTcHJlYWRzaGVldE1MKHN0cmluZyBleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTcHJlYWRzaGVldEV4dGVuc2lvbnMuQ29udGFpbnMoZXh0LlRvTG93ZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZ1tdIFByZXNlbnRhdGlvbkV4dGVuc2lvbnMgPSBuZXdbXSB7CisgICAgICAgICAgICAiLnBwdHgiLAorICAgICAgICAgICAgIi5wb3R4IiwKKyAgICAgICAgICAgICIucHBzeCIsCisgICAgICAgICAgICAiLnBwdG0iLAorICAgICAgICAgICAgIi5wb3RtIiwKKyAgICAgICAgICAgICIucHBzbSIsCisgICAgICAgICAgICAiLnBwYW0iLAorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBJc1ByZXNlbnRhdGlvbk1MKHN0cmluZyBleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBQcmVzZW50YXRpb25FeHRlbnNpb25zLkNvbnRhaW5zKGV4dC5Ub0xvd2VyKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sPyBHZXRCb29sUHJvcChYRWxlbWVudCByUHIsIFhOYW1lIHByb3BlcnR5TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgcHJvcEF0dCA9IHJQci5FbGVtZW50KHByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICBpZiAocHJvcEF0dCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBYQXR0cmlidXRlIHZhbCA9IHByb3BBdHQuQXR0cmlidXRlKFcudmFsKTsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgc3RyaW5nIHMgPSAoKHN0cmluZykgdmFsKS5Ub0xvd2VyKCk7CisgICAgICAgICAgICBpZiAocyA9PSAiMSIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAocyA9PSAiMCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKHMgPT0gInRydWUiKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKHMgPT0gImZhbHNlIikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAocyA9PSAib24iKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKHMgPT0gIm9mZiIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICByZXR1cm4gKGJvb2wpIHByb3BBdHQuQXR0cmlidXRlKFcudmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBGaWVsZEluZm8KKyAgICB7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGRUeXBlOworICAgICAgICBwdWJsaWMgc3RyaW5nW10gU3dpdGNoZXM7CisgICAgICAgIHB1YmxpYyBzdHJpbmdbXSBBcmd1bWVudHM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWVsZFBhcnNlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBlbnVtIFN0YXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIEluVG9rZW4sCisgICAgICAgICAgICBJbldoaXRlU3BhY2UsCisgICAgICAgICAgICBJblF1b3RlZFRva2VuLAorICAgICAgICAgICAgT25PcGVuaW5nUXVvdGUsCisgICAgICAgICAgICBPbkNsb3NpbmdRdW90ZSwKKyAgICAgICAgICAgIE9uQmFja3NsYXNoLAorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gR2V0VG9rZW5zKHN0cmluZyBmaWVsZCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdGUgc3RhdGUgPSBTdGF0ZS5JbldoaXRlU3BhY2U7CisgICAgICAgICAgICBpbnQgdG9rZW5TdGFydCA9IDA7CisgICAgICAgICAgICBjaGFyIHF1b3RlU3RhcnQgPSBjaGFyLk1pblZhbHVlOworICAgICAgICAgICAgTGlzdDxzdHJpbmc+IHRva2VucyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgZmllbGQuTGVuZ3RoOyBjKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKENoYXIuSXNXaGl0ZVNwYWNlKGZpZWxkW2NdKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5JblRva2VuKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMuQWRkKGZpZWxkLlN1YnN0cmluZyh0b2tlblN0YXJ0LCBjIC0gdG9rZW5TdGFydCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5JbldoaXRlU3BhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuT25PcGVuaW5nUXVvdGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuU3RhcnQgPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5JblF1b3RlZFRva2VuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5PbkNsb3NpbmdRdW90ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuSW5XaGl0ZVNwYWNlOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkW2NdID09ICdcXCcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuSW5RdW90ZWRUb2tlbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5PbkJhY2tzbGFzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5PbkJhY2tzbGFzaCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuSW5RdW90ZWRUb2tlbjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmaWVsZFtjXSA9PSAnIicgfHwgZmllbGRbY10gPT0gJ1wnJyB8fCBmaWVsZFtjXSA9PSAweDIwMWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuSW5XaGl0ZVNwYWNlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZVN0YXJ0ID0gZmllbGRbY107CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLk9uT3BlbmluZ1F1b3RlOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkluUXVvdGVkVG9rZW4pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZFtjXSA9PSBxdW90ZVN0YXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5BZGQoZmllbGQuU3Vic3RyaW5nKHRva2VuU3RhcnQsIGMgLSB0b2tlblN0YXJ0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5PbkNsb3NpbmdRdW90ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5Pbk9wZW5pbmdRdW90ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkW2NdID09IHF1b3RlU3RhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5PbkNsb3NpbmdRdW90ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblN0YXJ0ID0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkluUXVvdGVkVG9rZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5JbldoaXRlU3BhY2UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0b2tlblN0YXJ0ID0gYzsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5JblRva2VuOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLk9uT3BlbmluZ1F1b3RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5TdGFydCA9IGM7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuSW5RdW90ZWRUb2tlbjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5PbkNsb3NpbmdRdW90ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRva2VuU3RhcnQgPSBjOworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkluVG9rZW47CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5JblRva2VuKQorICAgICAgICAgICAgICAgIHRva2Vucy5BZGQoZmllbGQuU3Vic3RyaW5nKHRva2VuU3RhcnQsIGZpZWxkLkxlbmd0aCAtIHRva2VuU3RhcnQpKTsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbnMuVG9BcnJheSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBGaWVsZEluZm8gUGFyc2VGaWVsZChzdHJpbmcgZmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpZWxkSW5mbyBlbXB0eUZpZWxkID0gbmV3IEZpZWxkSW5mbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpZWxkVHlwZSA9ICIiLAorICAgICAgICAgICAgICAgIEFyZ3VtZW50cyA9IG5ldyBzdHJpbmdbXSB7IH0sCisgICAgICAgICAgICAgICAgU3dpdGNoZXMgPSBuZXcgc3RyaW5nW10geyB9LAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaWYgKGZpZWxkLkxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlbXB0eUZpZWxkOworICAgICAgICAgICAgc3RyaW5nIGZpZWxkVHlwZSA9IGZpZWxkLlRyaW1TdGFydCgpLlNwbGl0KCcgJykuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChmaWVsZFR5cGUgPT0gbnVsbCB8fCBmaWVsZFR5cGUuVG9VcHBlcigpICE9ICJIWVBFUkxJTksiIHx8IGZpZWxkVHlwZS5Ub1VwcGVyKCkgIT0gIlJFRiIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVtcHR5RmllbGQ7CisgICAgICAgICAgICBzdHJpbmdbXSB0b2tlbnMgPSBHZXRUb2tlbnMoZmllbGQpOworICAgICAgICAgICAgaWYgKHRva2Vucy5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHlGaWVsZDsKKyAgICAgICAgICAgIEZpZWxkSW5mbyBmaWVsZEluZm8gPSBuZXcgRmllbGRJbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWVsZFR5cGUgPSB0b2tlbnNbMF0sCisgICAgICAgICAgICAgICAgU3dpdGNoZXMgPSB0b2tlbnMuV2hlcmUodCA9PiB0WzBdID09ICdcXCcpLlRvQXJyYXkoKSwKKyAgICAgICAgICAgICAgICBBcmd1bWVudHMgPSB0b2tlbnMuU2tpcCgxKS5XaGVyZSh0ID0+IHRbMF0gIT0gJ1xcJykuVG9BcnJheSgpLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZEluZm87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBDb250ZW50UGFydFJlbFR5cGVJZFR1cGxlCisgICAgeworICAgICAgICBwdWJsaWMgT3BlblhtbFBhcnQgQ29udGVudFBhcnQgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgc3RyaW5nIFJlbGF0aW9uc2hpcFR5cGUgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgc3RyaW5nIFJlbGF0aW9uc2hpcElkIHsgZ2V0OyBzZXQ7IH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcHJldmVudCBkdXBsaWNhdGlvbiBvZiBpbWFnZXMKKyAgICBjbGFzcyBJbWFnZURhdGEKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIENvbnRlbnRUeXBlIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gSW1hZ2UgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgT3BlblhtbFBhcnQgSW1hZ2VQYXJ0IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIExpc3Q8Q29udGVudFBhcnRSZWxUeXBlSWRUdXBsZT4gQ29udGVudFBhcnRSZWxUeXBlSWRMaXN0ID0gbmV3IExpc3Q8Q29udGVudFBhcnRSZWxUeXBlSWRUdXBsZT4oKTsKKworICAgICAgICBwdWJsaWMgSW1hZ2VEYXRhKEltYWdlUGFydCBwYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICBDb250ZW50VHlwZSA9IHBhcnQuQ29udGVudFR5cGU7CisgICAgICAgICAgICB1c2luZyAoU3RyZWFtIHMgPSBwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEltYWdlID0gbmV3IGJ5dGVbcy5MZW5ndGhdOworICAgICAgICAgICAgICAgIHMuUmVhZChJbWFnZSwgMCwgKGludClzLkxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBBZGRDb250ZW50UGFydFJlbFR5cGVSZXNvdXJjZUlkVHVwcGxlKE9wZW5YbWxQYXJ0IGNvbnRlbnRQYXJ0LCBzdHJpbmcgcmVsYXRpb25zaGlwVHlwZSwgc3RyaW5nIHJlbGF0aW9uc2hpcElkKQorICAgICAgICB7CisgICAgICAgICAgICBDb250ZW50UGFydFJlbFR5cGVJZExpc3QuQWRkKAorICAgICAgICAgICAgICAgIG5ldyBDb250ZW50UGFydFJlbFR5cGVJZFR1cGxlKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnRlbnRQYXJ0ID0gY29udGVudFBhcnQsCisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcFR5cGUgPSByZWxhdGlvbnNoaXBUeXBlLAorICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBJZCA9IHJlbGF0aW9uc2hpcElkLAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVJbWFnZShJbWFnZVBhcnQgcGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBzID0gcGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLlJlYWRXcml0ZSkpCisgICAgICAgICAgICAgICAgcy5Xcml0ZShJbWFnZSwgMCwgSW1hZ2UuR2V0VXBwZXJCb3VuZCgwKSArIDEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgQ29tcGFyZShJbWFnZURhdGEgYXJnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQ29udGVudFR5cGUgIT0gYXJnLkNvbnRlbnRUeXBlKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChJbWFnZS5HZXRMb25nTGVuZ3RoKDApICE9IGFyZy5JbWFnZS5HZXRMb25nTGVuZ3RoKDApKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIC8vIENvbXBhcmUgdGhlIGFycmF5cyBieXRlIGJ5IGJ5dGUKKyAgICAgICAgICAgIGxvbmcgbGVuZ3RoID0gSW1hZ2UuR2V0TG9uZ0xlbmd0aCgwKTsKKyAgICAgICAgICAgIGJ5dGVbXSBpbWFnZTEgPSBJbWFnZTsKKyAgICAgICAgICAgIGJ5dGVbXSBpbWFnZTIgPSBhcmcuSW1hZ2U7CisgICAgICAgICAgICBmb3IgKGxvbmcgbiA9IDA7IG4gPCBsZW5ndGg7IG4rKykKKyAgICAgICAgICAgICAgICBpZiAoaW1hZ2UxW25dICE9IGltYWdlMltuXSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcHJldmVudCBkdXBsaWNhdGlvbiBvZiBtZWRpYQorICAgIGNsYXNzIE1lZGlhRGF0YQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgQ29udGVudFR5cGUgeyBnZXQ7IHNldDsgfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBNZWRpYSB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBEYXRhUGFydCBEYXRhUGFydCB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBMaXN0PENvbnRlbnRQYXJ0UmVsVHlwZUlkVHVwbGU+IENvbnRlbnRQYXJ0UmVsVHlwZUlkTGlzdCA9IG5ldyBMaXN0PENvbnRlbnRQYXJ0UmVsVHlwZUlkVHVwbGU+KCk7CisKKyAgICAgICAgcHVibGljIE1lZGlhRGF0YShEYXRhUGFydCBwYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICBDb250ZW50VHlwZSA9IHBhcnQuQ29udGVudFR5cGU7CisgICAgICAgICAgICB1c2luZyAoU3RyZWFtIHMgPSBwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1lZGlhID0gbmV3IGJ5dGVbcy5MZW5ndGhdOworICAgICAgICAgICAgICAgIHMuUmVhZChNZWRpYSwgMCwgKGludClzLkxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBBZGRDb250ZW50UGFydFJlbFR5cGVSZXNvdXJjZUlkVHVwcGxlKE9wZW5YbWxQYXJ0IGNvbnRlbnRQYXJ0LCBzdHJpbmcgcmVsYXRpb25zaGlwVHlwZSwgc3RyaW5nIHJlbGF0aW9uc2hpcElkKQorICAgICAgICB7CisgICAgICAgICAgICBDb250ZW50UGFydFJlbFR5cGVJZExpc3QuQWRkKAorICAgICAgICAgICAgICAgIG5ldyBDb250ZW50UGFydFJlbFR5cGVJZFR1cGxlKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnRlbnRQYXJ0ID0gY29udGVudFBhcnQsCisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcFR5cGUgPSByZWxhdGlvbnNoaXBUeXBlLAorICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBJZCA9IHJlbGF0aW9uc2hpcElkLAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVNZWRpYShEYXRhUGFydCBwYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoU3RyZWFtIHMgPSBwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlKSkKKyAgICAgICAgICAgICAgICBzLldyaXRlKE1lZGlhLCAwLCBNZWRpYS5HZXRVcHBlckJvdW5kKDApICsgMSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBDb21wYXJlKE1lZGlhRGF0YSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChDb250ZW50VHlwZSAhPSBhcmcuQ29udGVudFR5cGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKE1lZGlhLkdldExvbmdMZW5ndGgoMCkgIT0gYXJnLk1lZGlhLkdldExvbmdMZW5ndGgoMCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgLy8gQ29tcGFyZSB0aGUgYXJyYXlzIGJ5dGUgYnkgYnl0ZQorICAgICAgICAgICAgbG9uZyBsZW5ndGggPSBNZWRpYS5HZXRMb25nTGVuZ3RoKDApOworICAgICAgICAgICAgYnl0ZVtdIG1lZGlhMSA9IE1lZGlhOworICAgICAgICAgICAgYnl0ZVtdIG1lZGlhMiA9IGFyZy5NZWRpYTsKKyAgICAgICAgICAgIGZvciAobG9uZyBuID0gMDsgbiA8IGxlbmd0aDsgbisrKQorICAgICAgICAgICAgICAgIGlmIChtZWRpYTFbbl0gIT0gbWVkaWEyW25dKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworI2lmICFORVQzNQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVXJpRml4ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBGaXhJbnZhbGlkVXJpKFN0cmVhbSBmcywgRnVuYzxzdHJpbmcsIFVyaT4gaW52YWxpZFVyaUhhbmRsZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhOYW1lc3BhY2UgcmVsTnMgPSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzIjsKKyAgICAgICAgICAgIHVzaW5nIChaaXBBcmNoaXZlIHphID0gbmV3IFppcEFyY2hpdmUoZnMsIFppcEFyY2hpdmVNb2RlLlVwZGF0ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVudHJ5IGluIHphLkVudHJpZXMuVG9MaXN0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWVudHJ5Lk5hbWUuRW5kc1dpdGgoIi5yZWxzIikpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBsYWNlRW50cnkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgWERvY3VtZW50IGVudHJ5WERvYyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgZW50cnlTdHJlYW0gPSBlbnRyeS5PcGVuKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5WERvYyA9IFhEb2N1bWVudC5Mb2FkKGVudHJ5U3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnlYRG9jLlJvb3QgIT0gbnVsbCAmJiBlbnRyeVhEb2MuUm9vdC5OYW1lLk5hbWVzcGFjZSA9PSByZWxOcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmlzVG9DaGVjayA9IGVudHJ5WERvYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKHJlbE5zICsgIlJlbGF0aW9uc2hpcCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUociA9PiByLkF0dHJpYnV0ZSgiVGFyZ2V0TW9kZSIpICE9IG51bGwgJiYgKHN0cmluZylyLkF0dHJpYnV0ZSgiVGFyZ2V0TW9kZSIpID09ICJFeHRlcm5hbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcmVsIGluIHVyaXNUb0NoZWNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gKHN0cmluZylyZWwuQXR0cmlidXRlKCJUYXJnZXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBuZXcgVXJpKHRhcmdldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChVcmlGb3JtYXRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmkgbmV3VXJpID0gaW52YWxpZFVyaUhhbmRsZXIodGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsLkF0dHJpYnV0ZSgiVGFyZ2V0IikuVmFsdWUgPSBuZXdVcmkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUVudHJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlRW50cnkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmdWxsTmFtZSA9IGVudHJ5LkZ1bGxOYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuRGVsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW50cnkgPSB6YS5DcmVhdGVFbnRyeShmdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoU3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJlYW1Xcml0ZXIobmV3RW50cnkuT3BlbigpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChYbWxXcml0ZXIgeG1sV3JpdGVyID0gWG1sV3JpdGVyLkNyZWF0ZSh3cml0ZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5WERvYy5Xcml0ZVRvKHhtbFdyaXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQUNUSVZFWAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIGFjdGl2ZXggPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMDYvYWN0aXZlWCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2xhc3NpZCA9IGFjdGl2ZXggKyAiY2xhc3NpZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9udCA9IGFjdGl2ZXggKyAiZm9udCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGljZW5zZSA9IGFjdGl2ZXggKyAibGljZW5zZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbmFtZSA9IGFjdGl2ZXggKyAibmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb2N4ID0gYWN0aXZleCArICJvY3giOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9jeFByID0gYWN0aXZleCArICJvY3hQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGVyc2lzdGVuY2UgPSBhY3RpdmV4ICsgInBlcnNpc3RlbmNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2YWx1ZSA9IGFjdGl2ZXggKyAidmFsdWUiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQklCTElPCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgYmlibGlvID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMDQvMTAvYmlibGlvZ3JhcGh5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBBbGJ1bVRpdGxlID0gYmlibGlvICsgIkFsYnVtVGl0bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIEFydGlzdCA9IGJpYmxpbyArICJBcnRpc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIEF1dGhvciA9IGJpYmxpbyArICJBdXRob3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIENpdHkgPSBiaWJsaW8gKyAiQ2l0eSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgQ29tbWVudHMgPSBiaWJsaW8gKyAiQ29tbWVudHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIENvbXBvc2VyID0gYmlibGlvICsgIkNvbXBvc2VyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBDb25kdWN0b3IgPSBiaWJsaW8gKyAiQ29uZHVjdG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBDb25mZXJlbmNlTmFtZSA9IGJpYmxpbyArICJDb25mZXJlbmNlTmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgQ291bnRyeSA9IGJpYmxpbyArICJDb3VudHJ5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBEYXkgPSBiaWJsaW8gKyAiRGF5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBEYXlBY2Nlc3NlZCA9IGJpYmxpbyArICJEYXlBY2Nlc3NlZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgRWRpdG9yID0gYmlibGlvICsgIkVkaXRvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgRmlyc3QgPSBiaWJsaW8gKyAiRmlyc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIEd1aWQgPSBiaWJsaW8gKyAiR3VpZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgSW50ZXJuZXRTaXRlVGl0bGUgPSBiaWJsaW8gKyAiSW50ZXJuZXRTaXRlVGl0bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIEludmVudG9yID0gYmlibGlvICsgIkludmVudG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBMYXN0ID0gYmlibGlvICsgIkxhc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIExDSUQgPSBiaWJsaW8gKyAiTENJRCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgTWFpbiA9IGJpYmxpbyArICJNYWluIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBNZWRpdW0gPSBiaWJsaW8gKyAiTWVkaXVtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBNaWRkbGUgPSBiaWJsaW8gKyAiTWlkZGxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBNb250aCA9IGJpYmxpbyArICJNb250aCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgTW9udGhBY2Nlc3NlZCA9IGJpYmxpbyArICJNb250aEFjY2Vzc2VkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBOYW1lTGlzdCA9IGJpYmxpbyArICJOYW1lTGlzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgTnVtYmVyVm9sdW1lcyA9IGJpYmxpbyArICJOdW1iZXJWb2x1bWVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBQYWdlcyA9IGJpYmxpbyArICJQYWdlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgUGF0ZW50TnVtYmVyID0gYmlibGlvICsgIlBhdGVudE51bWJlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgUGVyZm9ybWVyID0gYmlibGlvICsgIlBlcmZvcm1lciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgUGVyc29uID0gYmlibGlvICsgIlBlcnNvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgUHJvZHVjZXJOYW1lID0gYmlibGlvICsgIlByb2R1Y2VyTmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgUHJvZHVjdGlvbkNvbXBhbnkgPSBiaWJsaW8gKyAiUHJvZHVjdGlvbkNvbXBhbnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFB1Ymxpc2hlciA9IGJpYmxpbyArICJQdWJsaXNoZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFJlZk9yZGVyID0gYmlibGlvICsgIlJlZk9yZGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBTaG9ydFRpdGxlID0gYmlibGlvICsgIlNob3J0VGl0bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFNvdXJjZSA9IGJpYmxpbyArICJTb3VyY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFNvdXJjZXMgPSBiaWJsaW8gKyAiU291cmNlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgU291cmNlVHlwZSA9IGJpYmxpbyArICJTb3VyY2VUeXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBUYWcgPSBiaWJsaW8gKyAiVGFnIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBUaXRsZSA9IGJpYmxpbyArICJUaXRsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgVHJhbnNsYXRvciA9IGJpYmxpbyArICJUcmFuc2xhdG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBUeXBlID0gYmlibGlvICsgIlR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFVSTCA9IGJpYmxpbyArICJVUkwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFZlcnNpb24gPSBiaWJsaW8gKyAiVmVyc2lvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgVm9sdW1lID0gYmlibGlvICsgIlZvbHVtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgWWVhciA9IGJpYmxpbyArICJZZWFyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBZZWFyQWNjZXNzZWQgPSBiaWJsaW8gKyAiWWVhckFjY2Vzc2VkIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIElOSworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIGluayA9CisgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9pbmsvMjAxMC9tYWluIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb250ZXh0ID0gaW5rICsgImNvbnRleHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNvdXJjZUxpbmsgPSBpbmsgKyAic291cmNlTGluayI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTU05vTmFtZXNwYWNlCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9yZWYgPSAicmVmIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhcHBseUFsaWdubWVudCA9ICJhcHBseUFsaWdubWVudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXBwbHlCb3JkZXIgPSAiYXBwbHlCb3JkZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFwcGx5Rm9udCA9ICJhcHBseUZvbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFwcGx5TnVtYmVyRm9ybWF0ID0gImFwcGx5TnVtYmVyRm9ybWF0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhcHBOYW1lID0gImFwcE5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJhc2VUeXBlID0gImJhc2VUeXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBib3JkZXJJZCA9ICJib3JkZXJJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm90dG9tID0gImJvdHRvbSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnVpbHRpbklkID0gImJ1aWx0aW5JZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2FsY0lkID0gImNhbGNJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY291bnQgPSAiY291bnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN1c3RvbUhlaWdodCA9ICJjdXN0b21IZWlnaHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlZmF1bHRDb2xXaWR0aCA9ICJkZWZhdWx0Q29sV2lkdGgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlZmF1bHRQaXZvdFN0eWxlID0gImRlZmF1bHRQaXZvdFN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZWZhdWx0Um93SGVpZ2h0ID0gImRlZmF1bHRSb3dIZWlnaHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlZmF1bHRUYWJsZVN0eWxlID0gImRlZmF1bHRUYWJsZVN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZWZhdWx0VGhlbWVWZXJzaW9uID0gImRlZmF1bHRUaGVtZVZlcnNpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpc3BsYXlOYW1lID0gImRpc3BsYXlOYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWxsSWQgPSAiZmlsbElkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb250SWQgPSAiZm9udElkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb290ZXIgPSAiZm9vdGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb3JtYXRDb2RlID0gImZvcm1hdENvZGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhlYWRlciA9ICJoZWFkZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhvcml6b250YWwgPSAiaG9yaXpvbnRhbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaHQgPSAiaHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGlkID0gImlkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsYXN0RWRpdGVkID0gImxhc3RFZGl0ZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxlZnQgPSAibGVmdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbG93ZXN0RWRpdGVkID0gImxvd2VzdEVkaXRlZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWF4ID0gIm1heCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWluID0gIm1pbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBudW1GbXRJZCA9ICJudW1GbXRJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGF0dGVyblR5cGUgPSAicGF0dGVyblR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHIgPSAiciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmdiID0gInJnYiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmlnaHQgPSAicmlnaHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJ1cEJ1aWxkID0gInJ1cEJ1aWxkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzID0gInMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNoZWV0SWQgPSAic2hlZXRJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hvd0NvbHVtblN0cmlwZXMgPSAic2hvd0NvbHVtblN0cmlwZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNob3dGaXJzdENvbHVtbiA9ICJzaG93Rmlyc3RDb2x1bW4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNob3dMYXN0Q29sdW1uID0gInNob3dMYXN0Q29sdW1uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaG93Um93U3RyaXBlcyA9ICJzaG93Um93U3RyaXBlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2l6ZSA9ICJzaXplIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcGFucyA9ICJzcGFucyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3FyZWYgPSAic3FyZWYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0eWxlID0gInN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0ID0gInQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRhYlNlbGVjdGVkID0gInRhYlNlbGVjdGVkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0aGVtZSA9ICJ0aGVtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGhpY2tCb3QgPSAidGhpY2tCb3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRvcCA9ICJ0b3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRvdGFsc1Jvd1Nob3duID0gInRvdGFsc1Jvd1Nob3duIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1bmlxdWVDb3VudCA9ICJ1bmlxdWVDb3VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmFsID0gInZhbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgd2lkdGggPSAid2lkdGgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdpbmRvd0hlaWdodCA9ICJ3aW5kb3dIZWlnaHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdpbmRvd1dpZHRoID0gIndpbmRvd1dpZHRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3b3JrYm9va1ZpZXdJZCA9ICJ3b3JrYm9va1ZpZXdJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgeGZJZCA9ICJ4ZklkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB4V2luZG93ID0gInhXaW5kb3ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHlXaW5kb3cgPSAieVdpbmRvdyI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXTkUKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWVzcGFjZSB3bmUgPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3dvcmQvMjAwNi93b3JkbWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjZCA9IHduZSArICJhY2QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjZEVudHJ5ID0gd25lICsgImFjZEVudHJ5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhY2RNYW5pZmVzdCA9IHduZSArICJhY2RNYW5pZmVzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWNkTmFtZSA9IHduZSArICJhY2ROYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhY2RzID0gd25lICsgImFjZHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjdGl2ZSA9IHduZSArICJhY3RpdmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFyZ1ZhbHVlID0gd25lICsgImFyZ1ZhbHVlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmY2kgPSB3bmUgKyAiZmNpIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmY2lCYXNlZE9uID0gd25lICsgImZjaUJhc2VkT24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZjaUluZGV4QmFzZWRPbiA9IHduZSArICJmY2lJbmRleEJhc2VkT24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZjaU5hbWUgPSB3bmUgKyAiZmNpTmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGFzaCA9IHduZSArICJoYXNoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBrY21QcmltYXJ5ID0gd25lICsgImtjbVByaW1hcnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGtjbVNlY29uZGFyeSA9IHduZSArICJrY21TZWNvbmRhcnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGtleW1hcCA9IHduZSArICJrZXltYXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGtleW1hcHMgPSB3bmUgKyAia2V5bWFwcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWFjcm8gPSB3bmUgKyAibWFjcm8iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1hY3JvTmFtZSA9IHduZSArICJtYWNyb05hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1hc2sgPSB3bmUgKyAibWFzayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVjaXBpZW50RGF0YSA9IHduZSArICJyZWNpcGllbnREYXRhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZWNpcGllbnRzID0gd25lICsgInJlY2lwaWVudHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN3QXJnID0gd25lICsgInN3QXJnIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0Y2cgPSB3bmUgKyAidGNnIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0b29sYmFyRGF0YSA9IHduZSArICJ0b29sYmFyRGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdG9vbGJhcnMgPSB3bmUgKyAidG9vbGJhcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZhbCA9IHduZSArICJ2YWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdjaCA9IHduZSArICJ3Y2giOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV1BDCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2Ugd3BjID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMTAvd29yZHByb2Nlc3NpbmdDYW52YXMiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV1BHCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2Ugd3BnID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMTAvd29yZHByb2Nlc3NpbmdHcm91cCI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXUEkKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWVzcGFjZSB3cGkgPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3dvcmQvMjAxMC93b3JkcHJvY2Vzc2luZ0luayI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgYSA9CisgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L21haW4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjY2VudDEgPSBhICsgImFjY2VudDEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjY2VudDIgPSBhICsgImFjY2VudDIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjY2VudDMgPSBhICsgImFjY2VudDMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjY2VudDQgPSBhICsgImFjY2VudDQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjY2VudDUgPSBhICsgImFjY2VudDUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjY2VudDYgPSBhICsgImFjY2VudDYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFoTHN0ID0gYSArICJhaExzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWhQb2xhciA9IGEgKyAiYWhQb2xhciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWhYWSA9IGEgKyAiYWhYWSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWxwaGEgPSBhICsgImFscGhhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbHBoYUJpTGV2ZWwgPSBhICsgImFscGhhQmlMZXZlbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWxwaGFDZWlsaW5nID0gYSArICJhbHBoYUNlaWxpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFscGhhRmxvb3IgPSBhICsgImFscGhhRmxvb3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFscGhhSW52ID0gYSArICJhbHBoYUludiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWxwaGFNb2QgPSBhICsgImFscGhhTW9kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbHBoYU1vZEZpeCA9IGEgKyAiYWxwaGFNb2RGaXgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFscGhhT2ZmID0gYSArICJhbHBoYU9mZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWxwaGFPdXRzZXQgPSBhICsgImFscGhhT3V0c2V0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbHBoYVJlcGwgPSBhICsgImFscGhhUmVwbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYW5jaG9yID0gYSArICJhbmNob3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFyY1RvID0gYSArICJhcmNUbyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXVkaW9DZCA9IGEgKyAiYXVkaW9DZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXVkaW9GaWxlID0gYSArICJhdWRpb0ZpbGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGF2THN0ID0gYSArICJhdkxzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmFja2Ryb3AgPSBhICsgImJhY2tkcm9wIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiYW5kMUggPSBhICsgImJhbmQxSCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmFuZDFWID0gYSArICJiYW5kMVYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJhbmQySCA9IGEgKyAiYmFuZDJIIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiYW5kMlYgPSBhICsgImJhbmQyViI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmV2ZWwgPSBhICsgImJldmVsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiZXZlbEIgPSBhICsgImJldmVsQiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmV2ZWxUID0gYSArICJiZXZlbFQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJnQ2xyID0gYSArICJiZ0NsciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmdGaWxsU3R5bGVMc3QgPSBhICsgImJnRmlsbFN0eWxlTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiaUxldmVsID0gYSArICJiaUxldmVsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBibGRDaGFydCA9IGEgKyAiYmxkQ2hhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJsZERnbSA9IGEgKyAiYmxkRGdtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBibGVuZCA9IGEgKyAiYmxlbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJsaXAgPSBhICsgImJsaXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJsaXBGaWxsID0gYSArICJibGlwRmlsbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmx1ZSA9IGEgKyAiYmx1ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmx1ZU1vZCA9IGEgKyAiYmx1ZU1vZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmx1ZU9mZiA9IGEgKyAiYmx1ZU9mZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmx1ciA9IGEgKyAiYmx1ciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm9keVByID0gYSArICJib2R5UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJvdHRvbSA9IGEgKyAiYm90dG9tIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiciA9IGEgKyAiYnIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJ1QXV0b051bSA9IGEgKyAiYnVBdXRvTnVtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBidUJsaXAgPSBhICsgImJ1QmxpcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnVDaGFyID0gYSArICJidUNoYXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJ1Q2xyID0gYSArICJidUNsciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnVDbHJUeCA9IGEgKyAiYnVDbHJUeCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnVGb250ID0gYSArICJidUZvbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJ1Rm9udFR4ID0gYSArICJidUZvbnRUeCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnVOb25lID0gYSArICJidU5vbmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJ1U3pQY3QgPSBhICsgImJ1U3pQY3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJ1U3pQdHMgPSBhICsgImJ1U3pQdHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJ1U3pUeCA9IGEgKyAiYnVTelR4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjYW1lcmEgPSBhICsgImNhbWVyYSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2VsbDNEID0gYSArICJjZWxsM0QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNoYXJ0ID0gYSArICJjaGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2hFeHQgPSBhICsgImNoRXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjaE9mZiA9IGEgKyAiY2hPZmYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNsb3NlID0gYSArICJjbG9zZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2xyQ2hhbmdlID0gYSArICJjbHJDaGFuZ2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNsckZyb20gPSBhICsgImNsckZyb20iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNsck1hcCA9IGEgKyAiY2xyTWFwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjbHJSZXBsID0gYSArICJjbHJSZXBsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjbHJTY2hlbWUgPSBhICsgImNsclNjaGVtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2xyVG8gPSBhICsgImNsclRvIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjTnZDeG5TcFByID0gYSArICJjTnZDeG5TcFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjTnZHcmFwaGljRnJhbWVQciA9IGEgKyAiY052R3JhcGhpY0ZyYW1lUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNOdkdycFNwUHIgPSBhICsgImNOdkdycFNwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNOdlBpY1ByID0gYSArICJjTnZQaWNQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052UHIgPSBhICsgImNOdlByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjTnZTcFByID0gYSArICJjTnZTcFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb21wID0gYSArICJjb21wIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb250ID0gYSArICJjb250IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb250b3VyQ2xyID0gYSArICJjb250b3VyQ2xyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjcyA9IGEgKyAiY3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN1YmljQmV6VG8gPSBhICsgImN1YmljQmV6VG8iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN1c3RDbHIgPSBhICsgImN1c3RDbHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN1c3RDbHJMc3QgPSBhICsgImN1c3RDbHJMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN1c3REYXNoID0gYSArICJjdXN0RGFzaCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3VzdEdlb20gPSBhICsgImN1c3RHZW9tIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjeG4gPSBhICsgImN4biI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3huTHN0ID0gYSArICJjeG5Mc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN4blNwID0gYSArICJjeG5TcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3huU3BMb2NrcyA9IGEgKyAiY3huU3BMb2NrcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGVmUFByID0gYSArICJkZWZQUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlZlJQciA9IGEgKyAiZGVmUlByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZ20gPSBhICsgImRnbSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGsxID0gYSArICJkazEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRrMiA9IGEgKyAiZGsyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkcyA9IGEgKyAiZHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGR1b3RvbmUgPSBhICsgImR1b3RvbmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVhID0gYSArICJlYSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZWZmZWN0ID0gYSArICJlZmZlY3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVmZmVjdERhZyA9IGEgKyAiZWZmZWN0RGFnIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlZmZlY3RMc3QgPSBhICsgImVmZmVjdExzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZWZmZWN0UmVmID0gYSArICJlZmZlY3RSZWYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVmZmVjdFN0eWxlID0gYSArICJlZmZlY3RTdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZWZmZWN0U3R5bGVMc3QgPSBhICsgImVmZmVjdFN0eWxlTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlbmQgPSBhICsgImVuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZW5kQ3huID0gYSArICJlbmRDeG4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVuZFBhcmFSUHIgPSBhICsgImVuZFBhcmFSUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV4dCA9IGEgKyAiZXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBleHRMc3QgPSBhICsgImV4dExzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZXh0cmFDbHJTY2hlbWUgPSBhICsgImV4dHJhQ2xyU2NoZW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBleHRyYUNsclNjaGVtZUxzdCA9IGEgKyAiZXh0cmFDbHJTY2hlbWVMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV4dHJ1c2lvbkNsciA9IGEgKyAiZXh0cnVzaW9uQ2xyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmZ0NsciA9IGEgKyAiZmdDbHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZpbGwgPSBhICsgImZpbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZpbGxPdmVybGF5ID0gYSArICJmaWxsT3ZlcmxheSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmlsbFJlY3QgPSBhICsgImZpbGxSZWN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWxsUmVmID0gYSArICJmaWxsUmVmIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWxsU3R5bGVMc3QgPSBhICsgImZpbGxTdHlsZUxzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmlsbFRvUmVjdCA9IGEgKyAiZmlsbFRvUmVjdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmlyc3RDb2wgPSBhICsgImZpcnN0Q29sIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaXJzdFJvdyA9IGEgKyAiZmlyc3RSb3ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZsYXRUeCA9IGEgKyAiZmxhdFR4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmbGQgPSBhICsgImZsZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm10U2NoZW1lID0gYSArICJmbXRTY2hlbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvbEhsaW5rID0gYSArICJmb2xIbGluayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9udCA9IGEgKyAiZm9udCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9udFJlZiA9IGEgKyAiZm9udFJlZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9udFNjaGVtZSA9IGEgKyAiZm9udFNjaGVtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ2FtbWEgPSBhICsgImdhbW1hIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBnZCA9IGEgKyAiZ2QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdkTHN0ID0gYSArICJnZExzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ2xvdyA9IGEgKyAiZ2xvdyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3JhZEZpbGwgPSBhICsgImdyYWRGaWxsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncmFwaGljID0gYSArICJncmFwaGljIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncmFwaGljRGF0YSA9IGEgKyAiZ3JhcGhpY0RhdGEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyYXBoaWNGcmFtZSA9IGEgKyAiZ3JhcGhpY0ZyYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncmFwaGljRnJhbWVMb2NrcyA9IGEgKyAiZ3JhcGhpY0ZyYW1lTG9ja3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyYXkgPSBhICsgImdyYXkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyYXlzY2wgPSBhICsgImdyYXlzY2wiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyZWVuID0gYSArICJncmVlbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3JlZW5Nb2QgPSBhICsgImdyZWVuTW9kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncmVlbk9mZiA9IGEgKyAiZ3JlZW5PZmYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyaWRDb2wgPSBhICsgImdyaWRDb2wiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdycEZpbGwgPSBhICsgImdycEZpbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdycFNwID0gYSArICJncnBTcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3JwU3BMb2NrcyA9IGEgKyAiZ3JwU3BMb2NrcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3JwU3BQciA9IGEgKyAiZ3JwU3BQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3MgPSBhICsgImdzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBnc0xzdCA9IGEgKyAiZ3NMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhlYWRFbmQgPSBhICsgImhlYWRFbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhpZ2hsaWdodCA9IGEgKyAiaGlnaGxpZ2h0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBobGluayA9IGEgKyAiaGxpbmsiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhsaW5rQ2xpY2sgPSBhICsgImhsaW5rQ2xpY2siOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhsaW5rSG92ZXIgPSBhICsgImhsaW5rSG92ZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhsaW5rTW91c2VPdmVyID0gYSArICJobGlua01vdXNlT3ZlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaHNsID0gYSArICJoc2wiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhzbENsciA9IGEgKyAiaHNsQ2xyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBodWUgPSBhICsgImh1ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaHVlTW9kID0gYSArICJodWVNb2QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGh1ZU9mZiA9IGEgKyAiaHVlT2ZmIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbm5lclNoZHcgPSBhICsgImlubmVyU2hkdyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaW5zaWRlSCA9IGEgKyAiaW5zaWRlSCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaW5zaWRlViA9IGEgKyAiaW5zaWRlViI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaW52ID0gYSArICJpbnYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGludkdhbW1hID0gYSArICJpbnZHYW1tYSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGFzdENvbCA9IGEgKyAibGFzdENvbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGFzdFJvdyA9IGEgKyAibGFzdFJvdyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGF0aW4gPSBhICsgImxhdGluIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsZWZ0ID0gYSArICJsZWZ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsaWdodFJpZyA9IGEgKyAibGlnaHRSaWciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxpbiA9IGEgKyAibGluIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsbiA9IGEgKyAibG4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxuQiA9IGEgKyAibG5CIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsbkJsVG9UciA9IGEgKyAibG5CbFRvVHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxuRGVmID0gYSArICJsbkRlZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbG5MID0gYSArICJsbkwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxuUiA9IGEgKyAibG5SIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsblJlZiA9IGEgKyAibG5SZWYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxuU3BjID0gYSArICJsblNwYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbG5TdHlsZUxzdCA9IGEgKyAibG5TdHlsZUxzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbG5UID0gYSArICJsblQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxuVGxUb0JyID0gYSArICJsblRsVG9CciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbG5UbyA9IGEgKyAibG5UbyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbHN0U3R5bGUgPSBhICsgImxzdFN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsdDEgPSBhICsgImx0MSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbHQyID0gYSArICJsdDIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx1bSA9IGEgKyAibHVtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsdW1Nb2QgPSBhICsgImx1bU1vZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbHVtT2ZmID0gYSArICJsdW1PZmYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx2bDFwUHIgPSBhICsgImx2bDFwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx2bDJwUHIgPSBhICsgImx2bDJwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx2bDNwUHIgPSBhICsgImx2bDNwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx2bDRwUHIgPSBhICsgImx2bDRwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx2bDVwUHIgPSBhICsgImx2bDVwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx2bDZwUHIgPSBhICsgImx2bDZwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx2bDdwUHIgPSBhICsgImx2bDdwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx2bDhwUHIgPSBhICsgImx2bDhwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx2bDlwUHIgPSBhICsgImx2bDlwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1ham9yRm9udCA9IGEgKyAibWFqb3JGb250IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYXN0ZXJDbHJNYXBwaW5nID0gYSArICJtYXN0ZXJDbHJNYXBwaW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtaW5vckZvbnQgPSBhICsgIm1pbm9yRm9udCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWl0ZXIgPSBhICsgIm1pdGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtb3ZlVG8gPSBhICsgIm1vdmVUbyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbmVDZWxsID0gYSArICJuZUNlbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5vQXV0b2ZpdCA9IGEgKyAibm9BdXRvZml0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBub0ZpbGwgPSBhICsgIm5vRmlsbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9ybSA9IGEgKyAibm9ybSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9ybUF1dG9maXQgPSBhICsgIm5vcm1BdXRvZml0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBudkN4blNwUHIgPSBhICsgIm52Q3huU3BQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnZHcmFwaGljRnJhbWVQciA9IGEgKyAibnZHcmFwaGljRnJhbWVQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnZHcnBTcFByID0gYSArICJudkdycFNwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG52UGljUHIgPSBhICsgIm52UGljUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG52U3BQciA9IGEgKyAibnZTcFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBud0NlbGwgPSBhICsgIm53Q2VsbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb2JqZWN0RGVmYXVsdHMgPSBhICsgIm9iamVjdERlZmF1bHRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvZmYgPSBhICsgIm9mZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb3V0ZXJTaGR3ID0gYSArICJvdXRlclNoZHciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG92ZXJyaWRlQ2xyTWFwcGluZyA9IGEgKyAib3ZlcnJpZGVDbHJNYXBwaW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwID0gYSArICJwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYXRoID0gYSArICJwYXRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYXRoTHN0ID0gYSArICJwYXRoTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYXR0RmlsbCA9IGEgKyAicGF0dEZpbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpYyA9IGEgKyAicGljIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaWNMb2NrcyA9IGEgKyAicGljTG9ja3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBvcyA9IGEgKyAicG9zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwUHIgPSBhICsgInBQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJzdENsciA9IGEgKyAicHJzdENsciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJzdERhc2ggPSBhICsgInByc3REYXNoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcnN0R2VvbSA9IGEgKyAicHJzdEdlb20iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByc3RTaGR3ID0gYSArICJwcnN0U2hkdyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJzdFR4V2FycCA9IGEgKyAicHJzdFR4V2FycCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHQgPSBhICsgInB0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBxdWFkQmV6VG8gPSBhICsgInF1YWRCZXpUbyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcXVpY2tUaW1lRmlsZSA9IGEgKyAicXVpY2tUaW1lRmlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgciA9IGEgKyAiciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVjdCA9IGEgKyAicmVjdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVkID0gYSArICJyZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlZE1vZCA9IGEgKyAicmVkTW9kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZWRPZmYgPSBhICsgInJlZE9mZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVmbGVjdGlvbiA9IGEgKyAicmVmbGVjdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVsSWRzID0gYSArICJyZWxJZHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlbE9mZiA9IGEgKyAicmVsT2ZmIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByaWdodCA9IGEgKyAicmlnaHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJvdCA9IGEgKyAicm90IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByb3VuZCA9IGEgKyAicm91bmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJQciA9IGEgKyAiclByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzYXQgPSBhICsgInNhdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2F0TW9kID0gYSArICJzYXRNb2QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNhdE9mZiA9IGEgKyAic2F0T2ZmIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzY2VuZTNkID0gYSArICJzY2VuZTNkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzY2hlbWVDbHIgPSBhICsgInNjaGVtZUNsciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2NyZ2JDbHIgPSBhICsgInNjcmdiQ2xyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzZUNlbGwgPSBhICsgInNlQ2VsbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hhZGUgPSBhICsgInNoYWRlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbmQgPSBhICsgInNuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc29mdEVkZ2UgPSBhICsgInNvZnRFZGdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzb2xpZEZpbGwgPSBhICsgInNvbGlkRmlsbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3AgPSBhICsgInNwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcDNkID0gYSArICJzcDNkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcEF1dG9GaXQgPSBhICsgInNwQXV0b0ZpdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3BjQWZ0ID0gYSArICJzcGNBZnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNwY0JlZiA9IGEgKyAic3BjQmVmIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcGNQY3QgPSBhICsgInNwY1BjdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3BjUHRzID0gYSArICJzcGNQdHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNwRGVmID0gYSArICJzcERlZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3BMb2NrcyA9IGEgKyAic3BMb2NrcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3BQciA9IGEgKyAic3BQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3JjUmVjdCA9IGEgKyAic3JjUmVjdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3JnYkNsciA9IGEgKyAic3JnYkNsciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3QgPSBhICsgInN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdEN4biA9IGEgKyAic3RDeG4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0cmV0Y2ggPSBhICsgInN0cmV0Y2giOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0eWxlID0gYSArICJzdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3dDZWxsID0gYSArICJzd0NlbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN4ID0gYSArICJzeCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3kgPSBhICsgInN5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzeW0gPSBhICsgInN5bSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3lzQ2xyID0gYSArICJzeXNDbHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHQgPSBhICsgInQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRhYiA9IGEgKyAidGFiIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YWJsZVN0eWxlID0gYSArICJ0YWJsZVN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YWJsZVN0eWxlSWQgPSBhICsgInRhYmxlU3R5bGVJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGFiTHN0ID0gYSArICJ0YWJMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRhaWxFbmQgPSBhICsgInRhaWxFbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibCA9IGEgKyAidGJsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YmxCZyA9IGEgKyAidGJsQmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibEdyaWQgPSBhICsgInRibEdyaWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibFByID0gYSArICJ0YmxQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGJsU3R5bGUgPSBhICsgInRibFN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YmxTdHlsZUxzdCA9IGEgKyAidGJsU3R5bGVMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRjID0gYSArICJ0YyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGNCZHIgPSBhICsgInRjQmRyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0Y1ByID0gYSArICJ0Y1ByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0Y1N0eWxlID0gYSArICJ0Y1N0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0Y1R4U3R5bGUgPSBhICsgInRjVHhTdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGhlbWUgPSBhICsgInRoZW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0aGVtZUVsZW1lbnRzID0gYSArICJ0aGVtZUVsZW1lbnRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0aGVtZU92ZXJyaWRlID0gYSArICJ0aGVtZU92ZXJyaWRlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0aWxlID0gYSArICJ0aWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0aWxlUmVjdCA9IGEgKyAidGlsZVJlY3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRpbnQgPSBhICsgInRpbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRvcCA9IGEgKyAidG9wIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0ciA9IGEgKyAidHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHR4Qm9keSA9IGEgKyAidHhCb2R5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0eERlZiA9IGEgKyAidHhEZWYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHR4U3AgPSBhICsgInR4U3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVGaWxsID0gYSArICJ1RmlsbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdUZpbGxUeCA9IGEgKyAidUZpbGxUeCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdUxuID0gYSArICJ1TG4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVMblR4ID0gYSArICJ1TG5UeCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXAgPSBhICsgInVwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1c2VTcFJlY3QgPSBhICsgInVzZVNwUmVjdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmlkZW9GaWxlID0gYSArICJ2aWRlb0ZpbGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdhdkF1ZGlvRmlsZSA9IGEgKyAid2F2QXVkaW9GaWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3aG9sZVRibCA9IGEgKyAid2hvbGVUYmwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHhmcm0gPSBhICsgInhmcm0iOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQTE0CisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgYTE0ID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9kcmF3aW5nLzIwMTAvbWFpbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXJ0aXN0aWNDaGFsa1NrZXRjaCA9IGExNCArICJhcnRpc3RpY0NoYWxrU2tldGNoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhcnRpc3RpY0dsYXNzID0gYTE0ICsgImFydGlzdGljR2xhc3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFydGlzdGljR2xvd0VkZ2VzID0gYTE0ICsgImFydGlzdGljR2xvd0VkZ2VzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhcnRpc3RpY0xpZ2h0U2NyZWVuID0gYTE0ICsgImFydGlzdGljTGlnaHRTY3JlZW4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFydGlzdGljUGxhc3RpY1dyYXAgPSBhMTQgKyAiYXJ0aXN0aWNQbGFzdGljV3JhcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXJ0aXN0aWNUZXh0dXJpemVyID0gYTE0ICsgImFydGlzdGljVGV4dHVyaXplciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmFja2dyb3VuZE1hcmsgPSBhMTQgKyAiYmFja2dyb3VuZE1hcmsiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJhY2tncm91bmRSZW1vdmFsID0gYTE0ICsgImJhY2tncm91bmRSZW1vdmFsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBicmlnaHRuZXNzQ29udHJhc3QgPSBhMTQgKyAiYnJpZ2h0bmVzc0NvbnRyYXN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjYW1lcmFUb29sID0gYTE0ICsgImNhbWVyYVRvb2wiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbG9yVGVtcGVyYXR1cmUgPSBhMTQgKyAiY29sb3JUZW1wZXJhdHVyZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29tcGF0RXh0ID0gYTE0ICsgImNvbXBhdEV4dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3BMb2NrcyA9IGExNCArICJjcExvY2tzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBleHRMc3QgPSBhMTQgKyAiZXh0THN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb3JlZ3JvdW5kTWFyayA9IGExNCArICJmb3JlZ3JvdW5kTWFyayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGlkZGVuRWZmZWN0cyA9IGExNCArICJoaWRkZW5FZmZlY3RzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoaWRkZW5GaWxsID0gYTE0ICsgImhpZGRlbkZpbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhpZGRlbkxpbmUgPSBhMTQgKyAiaGlkZGVuTGluZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGlkZGVuU2NlbmUzZCA9IGExNCArICJoaWRkZW5TY2VuZTNkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoaWRkZW5TcDNkID0gYTE0ICsgImhpZGRlblNwM2QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGltZ0VmZmVjdCA9IGExNCArICJpbWdFZmZlY3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGltZ0xheWVyID0gYTE0ICsgImltZ0xheWVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbWdQcm9wcyA9IGExNCArICJpbWdQcm9wcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGVnYWN5U3ByZWFkc2hlZXRDb2xvckluZGV4ID0gYTE0ICsgImxlZ2FjeVNwcmVhZHNoZWV0Q29sb3JJbmRleCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbSA9IGExNCArICJtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzYXR1cmF0aW9uID0gYTE0ICsgInNhdHVyYXRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNoYWRvd09ic2N1cmVkID0gYTE0ICsgInNoYWRvd09ic2N1cmVkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaGFycGVuU29mdGVuID0gYTE0ICsgInNoYXJwZW5Tb2Z0ZW4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVzZUxvY2FsRHBpID0gYTE0ICsgInVzZUxvY2FsRHBpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEMKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWVzcGFjZSBjID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvY2hhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFwcGx5VG9FbmQgPSBjICsgImFwcGx5VG9FbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFwcGx5VG9Gcm9udCA9IGMgKyAiYXBwbHlUb0Zyb250IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhcHBseVRvU2lkZXMgPSBjICsgImFwcGx5VG9TaWRlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXJlYTNEQ2hhcnQgPSBjICsgImFyZWEzRENoYXJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhcmVhQ2hhcnQgPSBjICsgImFyZWFDaGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXV0byA9IGMgKyAiYXV0byI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXV0b1RpdGxlRGVsZXRlZCA9IGMgKyAiYXV0b1RpdGxlRGVsZXRlZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXV0b1VwZGF0ZSA9IGMgKyAiYXV0b1VwZGF0ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXhJZCA9IGMgKyAiYXhJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXhQb3MgPSBjICsgImF4UG9zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiYWNrV2FsbCA9IGMgKyAiYmFja1dhbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJhY2t3YXJkID0gYyArICJiYWNrd2FyZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmFuZEZtdCA9IGMgKyAiYmFuZEZtdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmFuZEZtdHMgPSBjICsgImJhbmRGbXRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiYXIzRENoYXJ0ID0gYyArICJiYXIzRENoYXJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiYXJDaGFydCA9IGMgKyAiYmFyQ2hhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJhckRpciA9IGMgKyAiYmFyRGlyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiYXNlVGltZVVuaXQgPSBjICsgImJhc2VUaW1lVW5pdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnViYmxlM0QgPSBjICsgImJ1YmJsZTNEIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBidWJibGVDaGFydCA9IGMgKyAiYnViYmxlQ2hhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJ1YmJsZVNjYWxlID0gYyArICJidWJibGVTY2FsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnViYmxlU2l6ZSA9IGMgKyAiYnViYmxlU2l6ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnVpbHRJblVuaXQgPSBjICsgImJ1aWx0SW5Vbml0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjYXQgPSBjICsgImNhdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2F0QXggPSBjICsgImNhdEF4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjaGFydCA9IGMgKyAiY2hhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNoYXJ0T2JqZWN0ID0gYyArICJjaGFydE9iamVjdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2hhcnRTcGFjZSA9IGMgKyAiY2hhcnRTcGFjZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2xyTWFwT3ZyID0gYyArICJjbHJNYXBPdnIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNyb3NzQXggPSBjICsgImNyb3NzQXgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNyb3NzQmV0d2VlbiA9IGMgKyAiY3Jvc3NCZXR3ZWVuIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjcm9zc2VzID0gYyArICJjcm9zc2VzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjcm9zc2VzQXQgPSBjICsgImNyb3NzZXNBdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3VzdFNwbGl0ID0gYyArICJjdXN0U3BsaXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN1c3RVbml0ID0gYyArICJjdXN0VW5pdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGF0YSA9IGMgKyAiZGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGF0ZTE5MDQgPSBjICsgImRhdGUxOTA0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkYXRlQXggPSBjICsgImRhdGVBeCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGVsZXRlID0gYyArICJkZWxldGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlcHRoUGVyY2VudCA9IGMgKyAiZGVwdGhQZXJjZW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkaXNwQmxhbmtzQXMgPSBjICsgImRpc3BCbGFua3NBcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlzcEVxID0gYyArICJkaXNwRXEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpc3BSU3FyID0gYyArICJkaXNwUlNxciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlzcFVuaXRzID0gYyArICJkaXNwVW5pdHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpc3BVbml0c0xibCA9IGMgKyAiZGlzcFVuaXRzTGJsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkTGJsID0gYyArICJkTGJsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkTGJsUG9zID0gYyArICJkTGJsUG9zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkTGJscyA9IGMgKyAiZExibHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvdWdobnV0Q2hhcnQgPSBjICsgImRvdWdobnV0Q2hhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvd25CYXJzID0gYyArICJkb3duQmFycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZFB0ID0gYyArICJkUHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRyb3BMaW5lcyA9IGMgKyAiZHJvcExpbmVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkVGFibGUgPSBjICsgImRUYWJsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZXJyQmFycyA9IGMgKyAiZXJyQmFycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZXJyQmFyVHlwZSA9IGMgKyAiZXJyQmFyVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZXJyRGlyID0gYyArICJlcnJEaXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVyclZhbFR5cGUgPSBjICsgImVyclZhbFR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV4cGxvc2lvbiA9IGMgKyAiZXhwbG9zaW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBleHQgPSBjICsgImV4dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZXh0ZXJuYWxEYXRhID0gYyArICJleHRlcm5hbERhdGEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV4dExzdCA9IGMgKyAiZXh0THN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmID0gYyArICJmIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaXJzdFNsaWNlQW5nID0gYyArICJmaXJzdFNsaWNlQW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmbG9vciA9IGMgKyAiZmxvb3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZtdElkID0gYyArICJmbXRJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9ybWF0Q29kZSA9IGMgKyAiZm9ybWF0Q29kZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9ybWF0dGluZyA9IGMgKyAiZm9ybWF0dGluZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9yd2FyZCA9IGMgKyAiZm9yd2FyZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ2FwRGVwdGggPSBjICsgImdhcERlcHRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBnYXBXaWR0aCA9IGMgKyAiZ2FwV2lkdGgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyb3VwaW5nID0gYyArICJncm91cGluZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaCA9IGMgKyAiaCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGVhZGVyRm9vdGVyID0gYyArICJoZWFkZXJGb290ZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhpTG93TGluZXMgPSBjICsgImhpTG93TGluZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhNb2RlID0gYyArICJoTW9kZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaG9sZVNpemUgPSBjICsgImhvbGVTaXplIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoUGVyY2VudCA9IGMgKyAiaFBlcmNlbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGlkeCA9IGMgKyAiaWR4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbnRlcmNlcHQgPSBjICsgImludGVyY2VwdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaW52ZXJ0SWZOZWdhdGl2ZSA9IGMgKyAiaW52ZXJ0SWZOZWdhdGl2ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGFuZyA9IGMgKyAibGFuZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGF5b3V0ID0gYyArICJsYXlvdXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxheW91dFRhcmdldCA9IGMgKyAibGF5b3V0VGFyZ2V0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsYmxBbGduID0gYyArICJsYmxBbGduIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsYmxPZmZzZXQgPSBjICsgImxibE9mZnNldCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGVhZGVyTGluZXMgPSBjICsgImxlYWRlckxpbmVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsZWdlbmQgPSBjICsgImxlZ2VuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGVnZW5kRW50cnkgPSBjICsgImxlZ2VuZEVudHJ5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsZWdlbmRQb3MgPSBjICsgImxlZ2VuZFBvcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGluZTNEQ2hhcnQgPSBjICsgImxpbmUzRENoYXJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsaW5lQ2hhcnQgPSBjICsgImxpbmVDaGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbG9nQmFzZSA9IGMgKyAibG9nQmFzZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbHZsID0gYyArICJsdmwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1ham9yR3JpZGxpbmVzID0gYyArICJtYWpvckdyaWRsaW5lcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWFqb3JUaWNrTWFyayA9IGMgKyAibWFqb3JUaWNrTWFyayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWFqb3JUaW1lVW5pdCA9IGMgKyAibWFqb3JUaW1lVW5pdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWFqb3JVbml0ID0gYyArICJtYWpvclVuaXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1hbnVhbExheW91dCA9IGMgKyAibWFudWFsTGF5b3V0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYXJrZXIgPSBjICsgIm1hcmtlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWF4ID0gYyArICJtYXgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1pbiA9IGMgKyAibWluIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtaW5vckdyaWRsaW5lcyA9IGMgKyAibWlub3JHcmlkbGluZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1pbm9yVGlja01hcmsgPSBjICsgIm1pbm9yVGlja01hcmsiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1pbm9yVGltZVVuaXQgPSBjICsgIm1pbm9yVGltZVVuaXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1pbm9yVW5pdCA9IGMgKyAibWlub3JVbml0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtaW51cyA9IGMgKyAibWludXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG11bHRpTHZsU3RyQ2FjaGUgPSBjICsgIm11bHRpTHZsU3RyQ2FjaGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG11bHRpTHZsU3RyUmVmID0gYyArICJtdWx0aUx2bFN0clJlZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbmFtZSA9IGMgKyAibmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9FbmRDYXAgPSBjICsgIm5vRW5kQ2FwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBub011bHRpTHZsTGJsID0gYyArICJub011bHRpTHZsTGJsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBudW1DYWNoZSA9IGMgKyAibnVtQ2FjaGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG51bUZtdCA9IGMgKyAibnVtRm10IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBudW1MaXQgPSBjICsgIm51bUxpdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnVtUmVmID0gYyArICJudW1SZWYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9kZEZvb3RlciA9IGMgKyAib2RkRm9vdGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvZGRIZWFkZXIgPSBjICsgIm9kZEhlYWRlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb2ZQaWVDaGFydCA9IGMgKyAib2ZQaWVDaGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb2ZQaWVUeXBlID0gYyArICJvZlBpZVR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9yZGVyID0gYyArICJvcmRlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb3JpZW50YXRpb24gPSBjICsgIm9yaWVudGF0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvdmVybGFwID0gYyArICJvdmVybGFwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvdmVybGF5ID0gYyArICJvdmVybGF5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYWdlTWFyZ2lucyA9IGMgKyAicGFnZU1hcmdpbnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBhZ2VTZXR1cCA9IGMgKyAicGFnZVNldHVwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwZXJpb2QgPSBjICsgInBlcmlvZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGVyc3BlY3RpdmUgPSBjICsgInBlcnNwZWN0aXZlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaWN0dXJlRm9ybWF0ID0gYyArICJwaWN0dXJlRm9ybWF0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaWN0dXJlT3B0aW9ucyA9IGMgKyAicGljdHVyZU9wdGlvbnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpY3R1cmVTdGFja1VuaXQgPSBjICsgInBpY3R1cmVTdGFja1VuaXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpZTNEQ2hhcnQgPSBjICsgInBpZTNEQ2hhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpZUNoYXJ0ID0gYyArICJwaWVDaGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGl2b3RGbXQgPSBjICsgInBpdm90Rm10IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaXZvdEZtdHMgPSBjICsgInBpdm90Rm10cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGl2b3RTb3VyY2UgPSBjICsgInBpdm90U291cmNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwbG90QXJlYSA9IGMgKyAicGxvdEFyZWEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBsb3RWaXNPbmx5ID0gYyArICJwbG90VmlzT25seSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGx1cyA9IGMgKyAicGx1cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJpbnRTZXR0aW5ncyA9IGMgKyAicHJpbnRTZXR0aW5ncyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJvdGVjdGlvbiA9IGMgKyAicHJvdGVjdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHQgPSBjICsgInB0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwdENvdW50ID0gYyArICJwdENvdW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByYWRhckNoYXJ0ID0gYyArICJyYWRhckNoYXJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByYWRhclN0eWxlID0gYyArICJyYWRhclN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByQW5nQXggPSBjICsgInJBbmdBeCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmljaCA9IGMgKyAicmljaCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcm90WCA9IGMgKyAicm90WCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcm90WSA9IGMgKyAicm90WSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcm91bmRlZENvcm5lcnMgPSBjICsgInJvdW5kZWRDb3JuZXJzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzY2FsaW5nID0gYyArICJzY2FsaW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzY2F0dGVyQ2hhcnQgPSBjICsgInNjYXR0ZXJDaGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2NhdHRlclN0eWxlID0gYyArICJzY2F0dGVyU3R5bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNlY29uZFBpZVB0ID0gYyArICJzZWNvbmRQaWVQdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2Vjb25kUGllU2l6ZSA9IGMgKyAic2Vjb25kUGllU2l6ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2VsZWN0aW9uID0gYyArICJzZWxlY3Rpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNlcGFyYXRvciA9IGMgKyAic2VwYXJhdG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzZXIgPSBjICsgInNlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2VyQXggPSBjICsgInNlckF4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzZXJMaW5lcyA9IGMgKyAic2VyTGluZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNoYXBlID0gYyArICJzaGFwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hvd0J1YmJsZVNpemUgPSBjICsgInNob3dCdWJibGVTaXplIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaG93Q2F0TmFtZSA9IGMgKyAic2hvd0NhdE5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNob3dETGJsc092ZXJNYXggPSBjICsgInNob3dETGJsc092ZXJNYXgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNob3dIb3J6Qm9yZGVyID0gYyArICJzaG93SG9yekJvcmRlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hvd0tleXMgPSBjICsgInNob3dLZXlzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaG93TGVhZGVyTGluZXMgPSBjICsgInNob3dMZWFkZXJMaW5lcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hvd0xlZ2VuZEtleSA9IGMgKyAic2hvd0xlZ2VuZEtleSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hvd05lZ0J1YmJsZXMgPSBjICsgInNob3dOZWdCdWJibGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaG93T3V0bGluZSA9IGMgKyAic2hvd091dGxpbmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNob3dQZXJjZW50ID0gYyArICJzaG93UGVyY2VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hvd1Nlck5hbWUgPSBjICsgInNob3dTZXJOYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaG93VmFsID0gYyArICJzaG93VmFsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaG93VmVydEJvcmRlciA9IGMgKyAic2hvd1ZlcnRCb3JkZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNpZGVXYWxsID0gYyArICJzaWRlV2FsbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2l6ZSA9IGMgKyAic2l6ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2l6ZVJlcHJlc2VudHMgPSBjICsgInNpemVSZXByZXNlbnRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbW9vdGggPSBjICsgInNtb290aCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3BsaXRQb3MgPSBjICsgInNwbGl0UG9zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcGxpdFR5cGUgPSBjICsgInNwbGl0VHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3BQciA9IGMgKyAic3BQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3RvY2tDaGFydCA9IGMgKyAic3RvY2tDaGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3RyQ2FjaGUgPSBjICsgInN0ckNhY2hlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdHJMaXQgPSBjICsgInN0ckxpdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3RyUmVmID0gYyArICJzdHJSZWYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0eWxlID0gYyArICJzdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3VyZmFjZTNEQ2hhcnQgPSBjICsgInN1cmZhY2UzRENoYXJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdXJmYWNlQ2hhcnQgPSBjICsgInN1cmZhY2VDaGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3ltYm9sID0gYyArICJzeW1ib2wiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRoaWNrbmVzcyA9IGMgKyAidGhpY2tuZXNzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0aWNrTGJsUG9zID0gYyArICJ0aWNrTGJsUG9zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0aWNrTGJsU2tpcCA9IGMgKyAidGlja0xibFNraXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRpY2tNYXJrU2tpcCA9IGMgKyAidGlja01hcmtTa2lwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0aXRsZSA9IGMgKyAidGl0bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRyZW5kbGluZSA9IGMgKyAidHJlbmRsaW5lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0cmVuZGxpbmVMYmwgPSBjICsgInRyZW5kbGluZUxibCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHJlbmRsaW5lVHlwZSA9IGMgKyAidHJlbmRsaW5lVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHggPSBjICsgInR4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0eFByID0gYyArICJ0eFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1cEJhcnMgPSBjICsgInVwQmFycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXBEb3duQmFycyA9IGMgKyAidXBEb3duQmFycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXNlckludGVyZmFjZSA9IGMgKyAidXNlckludGVyZmFjZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXNlclNoYXBlcyA9IGMgKyAidXNlclNoYXBlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdiA9IGMgKyAidiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmFsID0gYyArICJ2YWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZhbEF4ID0gYyArICJ2YWxBeCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmFyeUNvbG9ycyA9IGMgKyAidmFyeUNvbG9ycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmlldzNEID0gYyArICJ2aWV3M0QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHcgPSBjICsgInciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdpcmVmcmFtZSA9IGMgKyAid2lyZWZyYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3TW9kZSA9IGMgKyAid01vZGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHggPSBjICsgIngiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHhNb2RlID0gYyArICJ4TW9kZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgeFZhbCA9IGMgKyAieFZhbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgeSA9IGMgKyAieSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgeU1vZGUgPSBjICsgInlNb2RlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB5VmFsID0gYyArICJ5VmFsIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENEUgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIGNkciA9CisgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L2NoYXJ0RHJhd2luZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWJzU2l6ZUFuY2hvciA9IGNkciArICJhYnNTaXplQW5jaG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBibGlwRmlsbCA9IGNkciArICJibGlwRmlsbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052Q3huU3BQciA9IGNkciArICJjTnZDeG5TcFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjTnZHcmFwaGljRnJhbWVQciA9IGNkciArICJjTnZHcmFwaGljRnJhbWVQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052R3JwU3BQciA9IGNkciArICJjTnZHcnBTcFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjTnZQaWNQciA9IGNkciArICJjTnZQaWNQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052UHIgPSBjZHIgKyAiY052UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNOdlNwUHIgPSBjZHIgKyAiY052U3BQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3huU3AgPSBjZHIgKyAiY3huU3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV4dCA9IGNkciArICJleHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZyb20gPSBjZHIgKyAiZnJvbSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3JhcGhpY0ZyYW1lID0gY2RyICsgImdyYXBoaWNGcmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3JwU3AgPSBjZHIgKyAiZ3JwU3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdycFNwUHIgPSBjZHIgKyAiZ3JwU3BQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnZDeG5TcFByID0gY2RyICsgIm52Q3huU3BQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnZHcmFwaGljRnJhbWVQciA9IGNkciArICJudkdyYXBoaWNGcmFtZVByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBudkdycFNwUHIgPSBjZHIgKyAibnZHcnBTcFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBudlBpY1ByID0gY2RyICsgIm52UGljUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG52U3BQciA9IGNkciArICJudlNwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpYyA9IGNkciArICJwaWMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlbFNpemVBbmNob3IgPSBjZHIgKyAicmVsU2l6ZUFuY2hvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3AgPSBjZHIgKyAic3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNwUHIgPSBjZHIgKyAic3BQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3R5bGUgPSBjZHIgKyAic3R5bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRvID0gY2RyICsgInRvIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0eEJvZHkgPSBjZHIgKyAidHhCb2R5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB4ID0gY2RyICsgIngiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHhmcm0gPSBjZHIgKyAieGZybSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgeSA9IGNkciArICJ5IjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENPTQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIGNvbSA9CisgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L2NvbXBhdGliaWxpdHkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxlZ2FjeURyYXdpbmcgPSBjb20gKyAibGVnYWN5RHJhd2luZyI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDUAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIGNwID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L21ldGFkYXRhL2NvcmUtcHJvcGVydGllcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2F0ZWdvcnkgPSBjcCArICJjYXRlZ29yeSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29udGVudFN0YXR1cyA9IGNwICsgImNvbnRlbnRTdGF0dXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbnRlbnRUeXBlID0gY3AgKyAiY29udGVudFR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvcmVQcm9wZXJ0aWVzID0gY3AgKyAiY29yZVByb3BlcnRpZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGtleXdvcmRzID0gY3AgKyAia2V5d29yZHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxhc3RNb2RpZmllZEJ5ID0gY3AgKyAibGFzdE1vZGlmaWVkQnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxhc3RQcmludGVkID0gY3AgKyAibGFzdFByaW50ZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJldmlzaW9uID0gY3AgKyAicmV2aXNpb24iOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ1VTVFBSTworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIGN1c3Rwcm8gPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2N1c3RvbS1wcm9wZXJ0aWVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBQcm9wZXJ0aWVzID0gY3VzdHBybyArICJQcm9wZXJ0aWVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcm9wZXJ0eSA9IGN1c3Rwcm8gKyAicHJvcGVydHkiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgREMKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWVzcGFjZSBkYyA9CisgICAgICAgICAgICAiaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNyZWF0b3IgPSBkYyArICJjcmVhdG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZXNjcmlwdGlvbiA9IGRjICsgImRlc2NyaXB0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdWJqZWN0ID0gZGMgKyAic3ViamVjdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGl0bGUgPSBkYyArICJ0aXRsZSI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEQ1RFUk1TCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgZGN0ZXJtcyA9CisgICAgICAgICAgICAiaHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zLyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3JlYXRlZCA9IGRjdGVybXMgKyAiY3JlYXRlZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbW9kaWZpZWQgPSBkY3Rlcm1zICsgIm1vZGlmaWVkIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERHTQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIGRnbSA9CisgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L2RpYWdyYW0iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFkaiA9IGRnbSArICJhZGoiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFkakxzdCA9IGRnbSArICJhZGpMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFsZyA9IGRnbSArICJhbGciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFuaW1MdmwgPSBkZ20gKyAiYW5pbUx2bCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYW5pbU9uZSA9IGRnbSArICJhbmltT25lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiZyA9IGRnbSArICJiZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnVsbGV0RW5hYmxlZCA9IGRnbSArICJidWxsZXRFbmFibGVkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjYXQgPSBkZ20gKyAiY2F0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjYXRMc3QgPSBkZ20gKyAiY2F0THN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjaE1heCA9IGRnbSArICJjaE1heCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2hvb3NlID0gZGdtICsgImNob29zZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2hQcmVmID0gZGdtICsgImNoUHJlZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2xyRGF0YSA9IGRnbSArICJjbHJEYXRhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb2xvcnNEZWYgPSBkZ20gKyAiY29sb3JzRGVmIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb25zdHIgPSBkZ20gKyAiY29uc3RyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb25zdHJMc3QgPSBkZ20gKyAiY29uc3RyTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjeG4gPSBkZ20gKyAiY3huIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjeG5Mc3QgPSBkZ20gKyAiY3huTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkYXRhTW9kZWwgPSBkZ20gKyAiZGF0YU1vZGVsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZXNjID0gZGdtICsgImRlc2MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpciA9IGRnbSArICJkaXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVmZmVjdENsckxzdCA9IGRnbSArICJlZmZlY3RDbHJMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9lbHNlID0gZGdtICsgImVsc2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV4dExzdCA9IGRnbSArICJleHRMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZpbGxDbHJMc3QgPSBkZ20gKyAiZmlsbENsckxzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9yRWFjaCA9IGRnbSArICJmb3JFYWNoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoaWVyQnJhbmNoID0gZGdtICsgImhpZXJCcmFuY2giOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9pZiA9IGRnbSArICJpZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGF5b3V0RGVmID0gZGdtICsgImxheW91dERlZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGF5b3V0Tm9kZSA9IGRnbSArICJsYXlvdXROb2RlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsaW5DbHJMc3QgPSBkZ20gKyAibGluQ2xyTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvcmdDaGFydCA9IGRnbSArICJvcmdDaGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGFyYW0gPSBkZ20gKyAicGFyYW0iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByZXNMYXlvdXRWYXJzID0gZGdtICsgInByZXNMYXlvdXRWYXJzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcmVzT2YgPSBkZ20gKyAicHJlc09mIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwclNldCA9IGRnbSArICJwclNldCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHQgPSBkZ20gKyAicHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHB0THN0ID0gZGdtICsgInB0THN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZWxJZHMgPSBkZ20gKyAicmVsSWRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZXNpemVIYW5kbGVzID0gZGdtICsgInJlc2l6ZUhhbmRsZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJ1bGUgPSBkZ20gKyAicnVsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcnVsZUxzdCA9IGRnbSArICJydWxlTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzYW1wRGF0YSA9IGRnbSArICJzYW1wRGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2NlbmUzZCA9IGRnbSArICJzY2VuZTNkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaGFwZSA9IGRnbSArICJzaGFwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3AzZCA9IGRnbSArICJzcDNkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcFByID0gZGdtICsgInNwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0eWxlID0gZGdtICsgInN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdHlsZURhdGEgPSBkZ20gKyAic3R5bGVEYXRhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdHlsZURlZiA9IGRnbSArICJzdHlsZURlZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3R5bGVMYmwgPSBkZ20gKyAic3R5bGVMYmwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHQgPSBkZ20gKyAidCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGl0bGUgPSBkZ20gKyAidGl0bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHR4RWZmZWN0Q2xyTHN0ID0gZGdtICsgInR4RWZmZWN0Q2xyTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0eEZpbGxDbHJMc3QgPSBkZ20gKyAidHhGaWxsQ2xyTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0eExpbkNsckxzdCA9IGRnbSArICJ0eExpbkNsckxzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHhQciA9IGRnbSArICJ0eFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2YXJMc3QgPSBkZ20gKyAidmFyTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3aG9sZSA9IGRnbSArICJ3aG9sZSI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBER00xNAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIGRnbTE0ID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9kcmF3aW5nLzIwMTAvZGlhZ3JhbSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052UHIgPSBkZ20xNCArICJjTnZQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVjb2xvckltZyA9IGRnbTE0ICsgInJlY29sb3JJbWciOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRElHU0lHCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgZGlnc2lnID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L2RpZ3NpZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgQXBwbGljYXRpb25WZXJzaW9uID0gZGlnc2lnICsgIkFwcGxpY2F0aW9uVmVyc2lvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgQ29sb3JEZXB0aCA9IGRpZ3NpZyArICJDb2xvckRlcHRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBIb3Jpem9udGFsUmVzb2x1dGlvbiA9IGRpZ3NpZyArICJIb3Jpem9udGFsUmVzb2x1dGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgTWFuaWZlc3RIYXNoQWxnb3JpdGhtID0gZGlnc2lnICsgIk1hbmlmZXN0SGFzaEFsZ29yaXRobSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgTW9uaXRvcnMgPSBkaWdzaWcgKyAiTW9uaXRvcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIE9mZmljZVZlcnNpb24gPSBkaWdzaWcgKyAiT2ZmaWNlVmVyc2lvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgU2V0dXBJRCA9IGRpZ3NpZyArICJTZXR1cElEIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBTaWduYXR1cmVDb21tZW50cyA9IGRpZ3NpZyArICJTaWduYXR1cmVDb21tZW50cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgU2lnbmF0dXJlSW1hZ2UgPSBkaWdzaWcgKyAiU2lnbmF0dXJlSW1hZ2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFNpZ25hdHVyZUluZm9WMSA9IGRpZ3NpZyArICJTaWduYXR1cmVJbmZvVjEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFNpZ25hdHVyZVByb3ZpZGVyRGV0YWlscyA9IGRpZ3NpZyArICJTaWduYXR1cmVQcm92aWRlckRldGFpbHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFNpZ25hdHVyZVByb3ZpZGVySWQgPSBkaWdzaWcgKyAiU2lnbmF0dXJlUHJvdmlkZXJJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgU2lnbmF0dXJlUHJvdmlkZXJVcmwgPSBkaWdzaWcgKyAiU2lnbmF0dXJlUHJvdmlkZXJVcmwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFNpZ25hdHVyZVRleHQgPSBkaWdzaWcgKyAiU2lnbmF0dXJlVGV4dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgU2lnbmF0dXJlVHlwZSA9IGRpZ3NpZyArICJTaWduYXR1cmVUeXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBWZXJ0aWNhbFJlc29sdXRpb24gPSBkaWdzaWcgKyAiVmVydGljYWxSZXNvbHV0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBXaW5kb3dzVmVyc2lvbiA9IGRpZ3NpZyArICJXaW5kb3dzVmVyc2lvbiI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEUworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIGRzID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9jdXN0b21YbWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRhdGFzdG9yZUl0ZW0gPSBkcyArICJkYXRhc3RvcmVJdGVtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpdGVtSUQgPSBkcyArICJpdGVtSUQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNjaGVtYVJlZiA9IGRzICsgInNjaGVtYVJlZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2NoZW1hUmVmcyA9IGRzICsgInNjaGVtYVJlZnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVyaSA9IGRzICsgInVyaSI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEU1AKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWVzcGFjZSBkc3AgPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL2RyYXdpbmcvMjAwOC9kaWFncmFtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkYXRhTW9kZWxFeHQgPSBkc3AgKyAiZGF0YU1vZGVsRXh0IjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVQCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgZXAgPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2V4dGVuZGVkLXByb3BlcnRpZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIEFwcGxpY2F0aW9uID0gZXAgKyAiQXBwbGljYXRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIEFwcFZlcnNpb24gPSBlcCArICJBcHBWZXJzaW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBDaGFyYWN0ZXJzID0gZXAgKyAiQ2hhcmFjdGVycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgQ2hhcmFjdGVyc1dpdGhTcGFjZXMgPSBlcCArICJDaGFyYWN0ZXJzV2l0aFNwYWNlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgQ29tcGFueSA9IGVwICsgIkNvbXBhbnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIERvY1NlY3VyaXR5ID0gZXAgKyAiRG9jU2VjdXJpdHkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIEhlYWRpbmdQYWlycyA9IGVwICsgIkhlYWRpbmdQYWlycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgSGlkZGVuU2xpZGVzID0gZXAgKyAiSGlkZGVuU2xpZGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBITGlua3MgPSBlcCArICJITGlua3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIEh5cGVybGlua0Jhc2UgPSBlcCArICJIeXBlcmxpbmtCYXNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBIeXBlcmxpbmtzQ2hhbmdlZCA9IGVwICsgIkh5cGVybGlua3NDaGFuZ2VkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBMaW5lcyA9IGVwICsgIkxpbmVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBMaW5rc1VwVG9EYXRlID0gZXAgKyAiTGlua3NVcFRvRGF0ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgTWFuYWdlciA9IGVwICsgIk1hbmFnZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIE1NQ2xpcHMgPSBlcCArICJNTUNsaXBzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBOb3RlcyA9IGVwICsgIk5vdGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBQYWdlcyA9IGVwICsgIlBhZ2VzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBQYXJhZ3JhcGhzID0gZXAgKyAiUGFyYWdyYXBocyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgUHJlc2VudGF0aW9uRm9ybWF0ID0gZXAgKyAiUHJlc2VudGF0aW9uRm9ybWF0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBQcm9wZXJ0aWVzID0gZXAgKyAiUHJvcGVydGllcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgU2NhbGVDcm9wID0gZXAgKyAiU2NhbGVDcm9wIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBTaGFyZWREb2MgPSBlcCArICJTaGFyZWREb2MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFNsaWRlcyA9IGVwICsgIlNsaWRlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgVGVtcGxhdGUgPSBlcCArICJUZW1wbGF0ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgVGl0bGVzT2ZQYXJ0cyA9IGVwICsgIlRpdGxlc09mUGFydHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFRvdGFsVGltZSA9IGVwICsgIlRvdGFsVGltZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgV29yZHMgPSBlcCArICJXb3JkcyI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMQworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIGxjID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbG9ja2VkQ2FudmFzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsb2NrZWRDYW52YXMgPSBsYyArICJsb2NrZWRDYW52YXMiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIG0gPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L21hdGgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjYyA9IG0gKyAiYWNjIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhY2NQciA9IG0gKyAiYWNjUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFsbiA9IG0gKyAiYWxuIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbG5BdCA9IG0gKyAiYWxuQXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFsblNjciA9IG0gKyAiYWxuU2NyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhcmdQciA9IG0gKyAiYXJnUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFyZ1N6ID0gbSArICJhcmdTeiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmFyID0gbSArICJiYXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJhclByID0gbSArICJiYXJQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmFzZUpjID0gbSArICJiYXNlSmMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJlZ0NociA9IG0gKyAiYmVnQ2hyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBib3JkZXJCb3ggPSBtICsgImJvcmRlckJveCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm9yZGVyQm94UHIgPSBtICsgImJvcmRlckJveFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBib3ggPSBtICsgImJveCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm94UHIgPSBtICsgImJveFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBicmsgPSBtICsgImJyayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnJrQmluID0gbSArICJicmtCaW4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJya0JpblN1YiA9IG0gKyAiYnJrQmluU3ViIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjR3AgPSBtICsgImNHcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY0dwUnVsZSA9IG0gKyAiY0dwUnVsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2hyID0gbSArICJjaHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvdW50ID0gbSArICJjb3VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY1NwID0gbSArICJjU3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN0cmxQciA9IG0gKyAiY3RybFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkID0gbSArICJkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZWZKYyA9IG0gKyAiZGVmSmMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlZyA9IG0gKyAiZGVnIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZWdIaWRlID0gbSArICJkZWdIaWRlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZW4gPSBtICsgImRlbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlmZiA9IG0gKyAiZGlmZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlzcERlZiA9IG0gKyAiZGlzcERlZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZFByID0gbSArICJkUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGUgPSBtICsgImUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVuZENociA9IG0gKyAiZW5kQ2hyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlcUFyciA9IG0gKyAiZXFBcnIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVxQXJyUHIgPSBtICsgImVxQXJyUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGYgPSBtICsgImYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZOYW1lID0gbSArICJmTmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZlByID0gbSArICJmUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZ1bmMgPSBtICsgImZ1bmMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZ1bmNQciA9IG0gKyAiZnVuY1ByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncm91cENociA9IG0gKyAiZ3JvdXBDaHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyb3VwQ2hyUHIgPSBtICsgImdyb3VwQ2hyUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyb3cgPSBtICsgImdyb3ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhpZGVCb3QgPSBtICsgImhpZGVCb3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhpZGVMZWZ0ID0gbSArICJoaWRlTGVmdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGlkZVJpZ2h0ID0gbSArICJoaWRlUmlnaHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhpZGVUb3AgPSBtICsgImhpZGVUb3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGludGVyU3AgPSBtICsgImludGVyU3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGludExpbSA9IG0gKyAiaW50TGltIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbnRyYVNwID0gbSArICJpbnRyYVNwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBqYyA9IG0gKyAiamMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxpbSA9IG0gKyAibGltIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsaW1Mb2MgPSBtICsgImxpbUxvYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGltTG93ID0gbSArICJsaW1Mb3ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxpbUxvd1ByID0gbSArICJsaW1Mb3dQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGltVXBwID0gbSArICJsaW1VcHAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxpbVVwcFByID0gbSArICJsaW1VcHBQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGl0ID0gbSArICJsaXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxNYXJnaW4gPSBtICsgImxNYXJnaW4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9tID0gbSArICJtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYXRoRm9udCA9IG0gKyAibWF0aEZvbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1hdGhQciA9IG0gKyAibWF0aFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYXhEaXN0ID0gbSArICJtYXhEaXN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYyA9IG0gKyAibWMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1jSmMgPSBtICsgIm1jSmMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1jUHIgPSBtICsgIm1jUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1jcyA9IG0gKyAibWNzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtUHIgPSBtICsgIm1QciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbXIgPSBtICsgIm1yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBuYXJ5ID0gbSArICJuYXJ5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBuYXJ5TGltID0gbSArICJuYXJ5TGltIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBuYXJ5UHIgPSBtICsgIm5hcnlQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9CcmVhayA9IG0gKyAibm9CcmVhayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9yID0gbSArICJub3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG51bSA9IG0gKyAibnVtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvYmpEaXN0ID0gbSArICJvYmpEaXN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvTWF0aCA9IG0gKyAib01hdGgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9NYXRoUGFyYSA9IG0gKyAib01hdGhQYXJhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvTWF0aFBhcmFQciA9IG0gKyAib01hdGhQYXJhUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9wRW11ID0gbSArICJvcEVtdSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGhhbnQgPSBtICsgInBoYW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaGFudFByID0gbSArICJwaGFudFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwbGNIaWRlID0gbSArICJwbGNIaWRlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwb3MgPSBtICsgInBvcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcG9zdFNwID0gbSArICJwb3N0U3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByZVNwID0gbSArICJwcmVTcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgciA9IG0gKyAiciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmFkID0gbSArICJyYWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJhZFByID0gbSArICJyYWRQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgck1hcmdpbiA9IG0gKyAick1hcmdpbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgclByID0gbSArICJyUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJTcCA9IG0gKyAiclNwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByU3BSdWxlID0gbSArICJyU3BSdWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzY3IgPSBtICsgInNjciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2VwQ2hyID0gbSArICJzZXBDaHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNob3cgPSBtICsgInNob3ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNocCA9IG0gKyAic2hwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbWFsbEZyYWMgPSBtICsgInNtYWxsRnJhYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc1ByZSA9IG0gKyAic1ByZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc1ByZVByID0gbSArICJzUHJlUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNTdWIgPSBtICsgInNTdWIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNTdWJQciA9IG0gKyAic1N1YlByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzU3ViU3VwID0gbSArICJzU3ViU3VwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzU3ViU3VwUHIgPSBtICsgInNTdWJTdXBQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc1N1cCA9IG0gKyAic1N1cCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc1N1cFByID0gbSArICJzU3VwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0cmlrZUJMVFIgPSBtICsgInN0cmlrZUJMVFIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0cmlrZUggPSBtICsgInN0cmlrZUgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0cmlrZVRMQlIgPSBtICsgInN0cmlrZVRMQlIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0cmlrZVYgPSBtICsgInN0cmlrZVYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0eSA9IG0gKyAic3R5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdWIgPSBtICsgInN1YiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3ViSGlkZSA9IG0gKyAic3ViSGlkZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3VwID0gbSArICJzdXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN1cEhpZGUgPSBtICsgInN1cEhpZGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHQgPSBtICsgInQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRyYW5zcCA9IG0gKyAidHJhbnNwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0eXBlID0gbSArICJ0eXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2YWwgPSBtICsgInZhbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmVydEpjID0gbSArICJ2ZXJ0SmMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdyYXBJbmRlbnQgPSBtICsgIndyYXBJbmRlbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdyYXBSaWdodCA9IG0gKyAid3JhcFJpZ2h0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB6ZXJvQXNjID0gbSArICJ6ZXJvQXNjIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB6ZXJvRGVzYyA9IG0gKyAiemVyb0Rlc2MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHplcm9XaWQgPSBtICsgInplcm9XaWQiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTUMKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWVzcGFjZSBtYyA9CisgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL21hcmt1cC1jb21wYXRpYmlsaXR5LzIwMDYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIEFsdGVybmF0ZUNvbnRlbnQgPSBtYyArICJBbHRlcm5hdGVDb250ZW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBDaG9pY2UgPSBtYyArICJDaG9pY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIEZhbGxiYWNrID0gbWMgKyAiRmFsbGJhY2siOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIElnbm9yYWJsZSA9IG1jICsgIklnbm9yYWJsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgUHJlc2VydmVBdHRyaWJ1dGVzID0gbWMgKyAiUHJlc2VydmVBdHRyaWJ1dGVzIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1EU1NJCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgbWRzc2kgPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvZGlnaXRhbC1zaWduYXR1cmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIEZvcm1hdCA9IG1kc3NpICsgIkZvcm1hdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgUmVsYXRpb25zaGlwUmVmZXJlbmNlID0gbWRzc2kgKyAiUmVsYXRpb25zaGlwUmVmZXJlbmNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBTaWduYXR1cmVUaW1lID0gbWRzc2kgKyAiU2lnbmF0dXJlVGltZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgVmFsdWUgPSBtZHNzaSArICJWYWx1ZSI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNUAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIG1wID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9tYWMvcG93ZXJwb2ludC8yMDA4L21haW4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN1YmUgPSBtcCArICJjdWJlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmbGlwID0gbXAgKyAiZmxpcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHJhbnNpdGlvbiA9IG1wICsgInRyYW5zaXRpb24iOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTVYKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWVzcGFjZSBtdiA9CisgICAgICAgICAgICAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTptYWM6dm1sIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBibHVyID0gbXYgKyAiYmx1ciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29tcGxleHRleHRib3ggPSBtdiArICJjb21wbGV4dGV4dGJveCI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb05hbWVzcGFjZQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhID0gImEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjY2VudDEgPSAiYWNjZW50MSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWNjZW50MiA9ICJhY2NlbnQyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhY2NlbnQzID0gImFjY2VudDMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjY2VudDQgPSAiYWNjZW50NCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWNjZW50NSA9ICJhY2NlbnQ1IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhY2NlbnQ2ID0gImFjY2VudDYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjdGlvbiA9ICJhY3Rpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjdGl2ZUNlbGwgPSAiYWN0aXZlQ2VsbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWN0aXZlQ29sID0gImFjdGl2ZUNvbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWN0aXZlUGFuZSA9ICJhY3RpdmVQYW5lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhY3RpdmVSb3cgPSAiYWN0aXZlUm93IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhZHZpc2UgPSAiYWR2aXNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbGduID0gImFsZ24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIEFsZ29yaXRobSA9ICJBbGdvcml0aG0iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFsaWduV2l0aE1hcmdpbnMgPSAiYWxpZ25XaXRoTWFyZ2lucyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWxsb3djb21tZW50cyA9ICJhbGxvd2NvbW1lbnRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbGxvd092ZXJsYXAgPSAiYWxsb3dPdmVybGFwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbGxVbmlxdWVOYW1lID0gImFsbFVuaXF1ZU5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFsdCA9ICJhbHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFsd2F5c1Nob3cgPSAiYWx3YXlzU2hvdyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYW1vdW50ID0gImFtb3VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYW10ID0gImFtdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYW5jaG9yID0gImFuY2hvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYW5jaG9yQ3RyID0gImFuY2hvckN0ciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYW5nID0gImFuZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYW5pbUJnID0gImFuaW1CZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYW5ub3RhdGlvbiA9ICJhbm5vdGF0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhcHBseUFsaWdubWVudCA9ICJhcHBseUFsaWdubWVudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXBwbHlBbGlnbm1lbnRGb3JtYXRzID0gImFwcGx5QWxpZ25tZW50Rm9ybWF0cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXBwbHlCb3JkZXIgPSAiYXBwbHlCb3JkZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFwcGx5Qm9yZGVyRm9ybWF0cyA9ICJhcHBseUJvcmRlckZvcm1hdHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFwcGx5RmlsbCA9ICJhcHBseUZpbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFwcGx5Rm9udCA9ICJhcHBseUZvbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFwcGx5Rm9udEZvcm1hdHMgPSAiYXBwbHlGb250Rm9ybWF0cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXBwbHlOdW1iZXJGb3JtYXQgPSAiYXBwbHlOdW1iZXJGb3JtYXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFwcGx5TnVtYmVyRm9ybWF0cyA9ICJhcHBseU51bWJlckZvcm1hdHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFwcGx5UGF0dGVybkZvcm1hdHMgPSAiYXBwbHlQYXR0ZXJuRm9ybWF0cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXBwbHlQcm90ZWN0aW9uID0gImFwcGx5UHJvdGVjdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXBwbHlXaWR0aEhlaWdodEZvcm1hdHMgPSAiYXBwbHlXaWR0aEhlaWdodEZvcm1hdHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFyY3NpemUgPSAiYXJjc2l6ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXJnID0gImFyZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXNwZWN0cmF0aW8gPSAiYXNwZWN0cmF0aW8iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFzc2lnbiA9ICJhc3NpZ24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGF0dHJpYnV0ZSA9ICJhdHRyaWJ1dGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGF1dGhvciA9ICJhdXRob3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGF1dGhvcklkID0gImF1dGhvcklkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhdXRvID0gImF1dG8iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGF1dG9FbmQgPSAiYXV0b0VuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXV0b0Zvcm1hdElkID0gImF1dG9Gb3JtYXRJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXV0b0xpbmUgPSAiYXV0b0xpbmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGF1dG9TdGFydCA9ICJhdXRvU3RhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGF4aXMgPSAiYXhpcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYiA9ICJiIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiYWNrZGVwdGggPSAiYmFja2RlcHRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiYW5kUm93ID0gImJhbmRSb3ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9iYXNlID0gImJhc2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJhc2VGaWVsZCA9ICJiYXNlRmllbGQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJhc2VJdGVtID0gImJhc2VJdGVtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiYXNlbGluZSA9ICJiYXNlbGluZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmFzZVR5cGUgPSAiYmFzZVR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJlaGluZERvYyA9ICJiZWhpbmREb2MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJlc3RGaXQgPSAiYmVzdEZpdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmcxID0gImJnMSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmcyID0gImJnMiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYklucyA9ICJiSW5zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBibGQgPSAiYmxkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBibGRTdGVwID0gImJsZFN0ZXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJsZW5kID0gImJsZW5kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBibHVyUmFkID0gImJsdXJSYWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJta05hbWUgPSAiYm1rTmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm9yZGVySWQgPSAiYm9yZGVySWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJvdHRvbSA9ICJib3R0b20iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJyaWdodCA9ICJicmlnaHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJyaWdodG5lc3MgPSAiYnJpZ2h0bmVzcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnVpbHRpbklkID0gImJ1aWx0aW5JZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYndNb2RlID0gImJ3TW9kZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnkgPSAiYnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGMgPSAiYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2FjaGVJZCA9ICJjYWNoZUlkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjYWNoZUluZGV4ID0gImNhY2hlSW5kZXgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNhbGNtb2RlID0gImNhbGNtb2RlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjYXAgPSAiY2FwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjYXB0aW9uID0gImNhcHRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNhdGVnb3J5SWR4ID0gImNhdGVnb3J5SWR4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjZWxsID0gImNlbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNlbGxDb2xvciA9ICJjZWxsQ29sb3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNlbGxSYW5nZSA9ICJjZWxsUmFuZ2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9jaGFyID0gImNoYXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNoYXJzZXQgPSAiY2hhcnNldCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2hhcnQgPSAiY2hhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNsZWFyQ29tbWVudHMgPSAiY2xlYXJDb21tZW50cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2xlYXJGb3JtYXRzID0gImNsZWFyRm9ybWF0cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2xpY2sgPSAiY2xpY2siOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNsaWVudEluc2VydGVkVGltZSA9ICJjbGllbnRJbnNlcnRlZFRpbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNscklkeCA9ICJjbHJJZHgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNsclNwYyA9ICJjbHJTcGMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNtZCA9ICJjbWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNtcGQgPSAiY21wZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29kZU5hbWUgPSAiY29kZU5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvZXJjZSA9ICJjb2VyY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbElkID0gImNvbElkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb2xvciA9ICJjb2xvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29sb3JzID0gImNvbG9ycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29sb3JUZW1wID0gImNvbG9yVGVtcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29sUGFnZUNvdW50ID0gImNvbFBhZ2VDb3VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29scyA9ICJjb2xzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb21tYSA9ICJjb21tYSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29tbWFuZCA9ICJjb21tYW5kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb21tYW5kVHlwZSA9ICJjb21tYW5kVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29tbWVudCA9ICJjb21tZW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb21wYXRMblNwYyA9ICJjb21wYXRMblNwYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29uY3VycmVudCA9ICJjb25jdXJyZW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb25uZWN0aW9uID0gImNvbm5lY3Rpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbm5lY3Rpb25JZCA9ICJjb25uZWN0aW9uSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbm5lY3Rsb2MgPSAiY29ubmVjdGxvYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29uc2VjdXRpdmUgPSAiY29uc2VjdXRpdmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbnN0cmFpbmJvdW5kcyA9ICJjb25zdHJhaW5ib3VuZHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbnRhaW5zSW50ZWdlciA9ICJjb250YWluc0ludGVnZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbnRhaW5zTnVtYmVyID0gImNvbnRhaW5zTnVtYmVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb250YWluc1NlbWlNaXhlZFR5cGVzID0gImNvbnRhaW5zU2VtaU1peGVkVHlwZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbnRhaW5zU3RyaW5nID0gImNvbnRhaW5zU3RyaW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb250cmFzdCA9ICJjb250cmFzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29udHJvbDEgPSAiY29udHJvbDEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbnRyb2wyID0gImNvbnRyb2wyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb29yZG9yaWdpbiA9ICJjb29yZG9yaWdpbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29vcmRzaXplID0gImNvb3Jkc2l6ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29weSA9ICJjb3B5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb3VudCA9ICJjb3VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3JlYXRlZFZlcnNpb24gPSAiY3JlYXRlZFZlcnNpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNyeXB0QWxnb3JpdGhtQ2xhc3MgPSAiY3J5cHRBbGdvcml0aG1DbGFzcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3J5cHRBbGdvcml0aG1TaWQgPSAiY3J5cHRBbGdvcml0aG1TaWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNyeXB0QWxnb3JpdGhtVHlwZSA9ICJjcnlwdEFsZ29yaXRobVR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNyeXB0UHJvdmlkZXJUeXBlID0gImNyeXB0UHJvdmlkZXJUeXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjc0NhdElkID0gImNzQ2F0SWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNzdGF0ZSA9ICJjc3RhdGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNzVHlwZUlkID0gImNzVHlwZUlkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjdWx0dXJlID0gImN1bHR1cmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN1cnJlbnQgPSAiY3VycmVudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3VzdG9tRm9ybWF0ID0gImN1c3RvbUZvcm1hdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3VzdG9tTGlzdCA9ICJjdXN0b21MaXN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjdXN0b21XaWR0aCA9ICJjdXN0b21XaWR0aCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3ggPSAiY3giOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN5ID0gImN5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkID0gImQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRhdGEgPSAiZGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGF0YUNhcHRpb24gPSAiZGF0YUNhcHRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRhdGFEeGZJZCA9ICJkYXRhRHhmSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRhdGFGaWVsZCA9ICJkYXRhRmllbGQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRhdGVUaW1lID0gImRhdGVUaW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkYXRlVGltZUdyb3VwaW5nID0gImRhdGVUaW1lR3JvdXBpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRkZSA9ICJkZGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRkZVNlcnZpY2UgPSAiZGRlU2VydmljZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGRlVG9waWMgPSAiZGRlVG9waWMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlZiA9ICJkZWYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlZmF1bHRNZW1iZXJVbmlxdWVOYW1lID0gImRlZmF1bHRNZW1iZXJVbmlxdWVOYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZWZhdWx0UGl2b3RTdHlsZSA9ICJkZWZhdWx0UGl2b3RTdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGVmYXVsdFJvd0hlaWdodCA9ICJkZWZhdWx0Um93SGVpZ2h0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZWZhdWx0U2l6ZSA9ICJkZWZhdWx0U2l6ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGVmYXVsdFRhYmxlU3R5bGUgPSAiZGVmYXVsdFRhYmxlU3R5bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlZlN0eWxlID0gImRlZlN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZWZUYWJTeiA9ICJkZWZUYWJTeiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGVncmVlID0gImRlZ3JlZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGVsYXkgPSAiZGVsYXkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlc2NlbmRpbmcgPSAiZGVzY2VuZGluZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGVzY3IgPSAiZGVzY3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlc3RJZCA9ICJkZXN0SWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlc3RpbmF0aW9uID0gImRlc3RpbmF0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZXN0aW5hdGlvbkZpbGUgPSAiZGVzdGluYXRpb25GaWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZXN0T3JkID0gImRlc3RPcmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRnbWZvbnRzaXplID0gImRnbWZvbnRzaXplIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZ21zdHlsZSA9ICJkZ21zdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlhZ29uYWxEb3duID0gImRpYWdvbmFsRG93biI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlhZ29uYWxVcCA9ICJkaWFnb25hbFVwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkaW1lbnNpb24gPSAiZGltZW5zaW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkaW1lbnNpb25VbmlxdWVOYW1lID0gImRpbWVuc2lvblVuaXF1ZU5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpciA9ICJkaXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpcnR5ID0gImRpcnR5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkaXNwbGF5ID0gImRpc3BsYXkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpc3BsYXlGb2xkZXIgPSAiZGlzcGxheUZvbGRlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlzcGxheU5hbWUgPSAiZGlzcGxheU5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpc3QgPSAiZGlzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlzdEIgPSAiZGlzdEIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpc3RMID0gImRpc3RMIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkaXN0UiA9ICJkaXN0UiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlzdFQgPSAiZGlzdFQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpdklkID0gImRpdklkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkcGkgPSAiZHBpIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkciA9ICJkciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgRHJhd0FzcGVjdCA9ICJEcmF3QXNwZWN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkdCA9ICJkdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZHVyID0gImR1ciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZHggPSAiZHgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGR4ZklkID0gImR4ZklkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkeSA9ICJkeSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZHogPSAiZHoiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVhTG5CcmsgPSAiZWFMbkJyayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZWIgPSAiZWIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVkaXRlZCA9ICJlZGl0ZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVkaXRQYWdlID0gImVkaXRQYWdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlbmQgPSAiZW5kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlbmRBID0gImVuZEEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVuZGFuZ2xlID0gImVuZGFuZ2xlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlbmREYXRlID0gImVuZERhdGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVuZFBvcyA9ICJlbmRQb3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVuZFNuZCA9ICJlbmRTbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVxbiA9ICJlcW4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV2YWxPcmRlciA9ICJldmFsT3JkZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV2dCA9ICJldnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV4cCA9ICJleHAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV4dFByb3BlcnR5ID0gImV4dFByb3BlcnR5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmID0gImYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZhY3QgPSAiZmFjdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmllbGQgPSAiZmllbGQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZpZWxkSWQgPSAiZmllbGRJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmllbGRMaXN0U29ydEFzY2VuZGluZyA9ICJmaWVsZExpc3RTb3J0QXNjZW5kaW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWVsZFBvc2l0aW9uID0gImZpZWxkUG9zaXRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZpbGVUeXBlID0gImZpbGVUeXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWxsY29sb3IgPSAiZmlsbGNvbG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWxsZWQgPSAiZmlsbGVkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWxsSWQgPSAiZmlsbElkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWx0ZXIgPSAiZmlsdGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWx0ZXJWYWwgPSAiZmlsdGVyVmFsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaXJzdCA9ICJmaXJzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmlyc3REYXRhQ29sID0gImZpcnN0RGF0YUNvbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmlyc3REYXRhUm93ID0gImZpcnN0RGF0YVJvdyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmlyc3RIZWFkZXJSb3cgPSAiZmlyc3RIZWFkZXJSb3ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZpcnN0Um93ID0gImZpcnN0Um93IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaXRzaGFwZSA9ICJmaXRzaGFwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZml0VG9QYWdlID0gImZpdFRvUGFnZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmxkID0gImZsZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmxpcCA9ICJmbGlwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmbWxhID0gImZtbGEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZtdGlkID0gImZtdGlkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb2xIbGluayA9ICJmb2xIbGluayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9sbG93Q29sb3JTY2hlbWUgPSAiZm9sbG93Q29sb3JTY2hlbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvbnRJZCA9ICJmb250SWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvb3RlciA9ICJmb290ZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9mb3IgPSAiZm9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb3JjZUFBID0gImZvcmNlQUEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvcm1hdCA9ICJmb3JtYXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvcm1hdENvZGUgPSAiZm9ybWF0Q29kZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9ybXVsYSA9ICJmb3JtdWxhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb3JOYW1lID0gImZvck5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvdiA9ICJmb3YiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZyYW1lID0gImZyYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmcm9tID0gImZyb20iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZyb21Xb3JkQXJ0ID0gImZyb21Xb3JkQXJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmdWxsQ2FsY09uTG9hZCA9ICJmdWxsQ2FsY09uTG9hZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZnVuYyA9ICJmdW5jIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBnID0gImciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdkUmVmQW5nID0gImdkUmVmQW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBnZFJlZlIgPSAiZ2RSZWZSIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBnZFJlZlggPSAiZ2RSZWZYIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBnZFJlZlkgPSAiZ2RSZWZZIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBnb2FsID0gImdvYWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyYWRpZW50c2hhcGVvayA9ICJncmFkaWVudHNoYXBlb2siOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyb3VwQnkgPSAiZ3JvdXBCeSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3JwSWQgPSAiZ3JwSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGd1aWQgPSAiZ3VpZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaCA9ICJoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoYW5naW5nUHVuY3QgPSAiaGFuZ2luZ1B1bmN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoYXNoRGF0YSA9ICJoYXNoRGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGVhZGVyID0gImhlYWRlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGVhZGVyUm93Qm9yZGVyRHhmSWQgPSAiaGVhZGVyUm93Qm9yZGVyRHhmSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhlYWRlclJvd0R4ZklkID0gImhlYWRlclJvd0R4ZklkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoaWRkZW4gPSAiaGlkZGVuIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoaWVyID0gImhpZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhpZXJhcmNoeSA9ICJoaWVyYXJjaHkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhpZXJhcmNoeVVzYWdlID0gImhpZXJhcmNoeVVzYWdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoaWdobGlnaHRDbGljayA9ICJoaWdobGlnaHRDbGljayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGxpbmsgPSAiaGxpbmsiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhvcml6b250YWwgPSAiaG9yaXpvbnRhbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaG9yaXpvbnRhbENlbnRlcmVkID0gImhvcml6b250YWxDZW50ZXJlZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaG9yaXpvbnRhbERwaSA9ICJob3Jpem9udGFsRHBpIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBob3J6T3ZlcmZsb3cgPSAiaG9yek92ZXJmbG93IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBocmVmID0gImhyZWYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhSID0gImhSIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBodG1sRm9ybWF0ID0gImh0bWxGb3JtYXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGh0bWxUYWJsZXMgPSAiaHRtbFRhYmxlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaHVlID0gImh1ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaSA9ICJpIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpMSA9ICJpMSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaWNvbklkID0gImljb25JZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaWNvblNldCA9ICJpY29uU2V0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpZCA9ICJpZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgSWQgPSAiSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGlkZGVzdCA9ICJpZGRlc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGlkcmVmID0gImlkcmVmIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpZHNyYyA9ICJpZHNyYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaWR4ID0gImlkeCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaW1nSCA9ICJpbWdIIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbWdXID0gImltZ1ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9pbiA9ICJpbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaW5jbHVkZU5ld0l0ZW1zSW5GaWx0ZXIgPSAiaW5jbHVkZU5ld0l0ZW1zSW5GaWx0ZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGluZGVudCA9ICJpbmRlbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGluZGV4ID0gImluZGV4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbmRleGVkID0gImluZGV4ZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGluaXRpYWxzID0gImluaXRpYWxzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbnNldHBlbiA9ICJpbnNldHBlbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaW52YWxFbmRDaGFycyA9ICJpbnZhbEVuZENoYXJzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbnZhbGlkVXJsID0gImludmFsaWRVcmwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGludmFsU3RDaGFycyA9ICJpbnZhbFN0Q2hhcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGlzSW52ZXJ0ZWQgPSAiaXNJbnZlcnRlZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaXNzaWduYXR1cmVsaW5lID0gImlzc2lnbmF0dXJlbGluZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaXRlbSA9ICJpdGVtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpdGVtUHJpbnRUaXRsZXMgPSAiaXRlbVByaW50VGl0bGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBqb2luc3R5bGUgPSAiam9pbnN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBqdXN0aWZ5TGFzdExpbmUgPSAianVzdGlmeUxhc3RMaW5lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBrZXkgPSAia2V5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBrZXlBdHRyaWJ1dGUgPSAia2V5QXR0cmlidXRlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsID0gImwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxhbmcgPSAibGFuZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGFzdENsciA9ICJsYXN0Q2xyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsYXN0SWR4ID0gImxhc3RJZHgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxhdCA9ICJsYXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxhdGluTG5CcmsgPSAibGF0aW5MbkJyayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGF5b3V0ID0gImxheW91dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGF5b3V0SW5DZWxsID0gImxheW91dEluQ2VsbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGVmdCA9ICJsZWZ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsZW4gPSAibGVuIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsZW5ndGggPSAibGVuZ3RoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsZXZlbCA9ICJsZXZlbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGlnaHRoYXJzaDIgPSAibGlnaHRoYXJzaDIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxpZ2h0bGV2ZWwgPSAibGlnaHRsZXZlbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGlnaHRsZXZlbDIgPSAibGlnaHRsZXZlbDIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxpZ2h0cG9zaXRpb24gPSAibGlnaHRwb3NpdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGlnaHRwb3NpdGlvbjIgPSAibGlnaHRwb3NpdGlvbjIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxpbSA9ICJsaW0iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxpbmsgPSAibGluayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbElucyA9ICJsSW5zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsb0NhdElkID0gImxvQ2F0SWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxvY2tlZCA9ICJsb2NrZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxvbiA9ICJsb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxvb3AgPSAibG9vcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbG9UeXBlSWQgPSAibG9UeXBlSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx1bSA9ICJsdW0iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx2bCA9ICJsdmwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1hY3JvID0gIm1hY3JvIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYW4gPSAibWFuIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYW51YWxCcmVha0NvdW50ID0gIm1hbnVhbEJyZWFrQ291bnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1hcElkID0gIm1hcElkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYXJMID0gIm1hckwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1heCA9ICJtYXgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1heEFuZyA9ICJtYXhBbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1heFIgPSAibWF4UiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWF4UmFuayA9ICJtYXhSYW5rIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYXhTaGVldElkID0gIm1heFNoZWV0SWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1heFZhbHVlID0gIm1heFZhbHVlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYXhYID0gIm1heFgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1heFkgPSAibWF4WSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWR4ID0gIm1keCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWVhc3VyZUdyb3VwID0gIm1lYXN1cmVHcm91cCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWVtYmVyTmFtZSA9ICJtZW1iZXJOYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtZXJnZSA9ICJtZXJnZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWV0aCA9ICJtZXRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtaW4gPSAibWluIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtaW5BbmcgPSAibWluQW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtaW5SID0gIm1pblIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1pblJlZnJlc2hhYmxlVmVyc2lvbiA9ICJtaW5SZWZyZXNoYWJsZVZlcnNpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1pblN1cHBvcnRlZFZlcnNpb24gPSAibWluU3VwcG9ydGVkVmVyc2lvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWluVmFsdWUgPSAibWluVmFsdWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1pblZlciA9ICJtaW5WZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1pblggPSAibWluWCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWluWSA9ICJtaW5ZIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtb2RlbElkID0gIm1vZGVsSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1vdmVXaXRoQ2VsbHMgPSAibW92ZVdpdGhDZWxscyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbiA9ICJuIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBuYW1lID0gIm5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9uZXcgPSAibmV3IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBuZXdMZW5ndGggPSAibmV3TGVuZ3RoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBuZXdOYW1lID0gIm5ld05hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5leHRBYyA9ICJuZXh0QWMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5leHRJZCA9ICJuZXh0SWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5vQ2hhbmdlQXJyb3doZWFkcyA9ICJub0NoYW5nZUFycm93aGVhZHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5vQ2hhbmdlQXNwZWN0ID0gIm5vQ2hhbmdlQXNwZWN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBub0NoYW5nZVNoYXBlVHlwZSA9ICJub0NoYW5nZVNoYXBlVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9kZVR5cGUgPSAibm9kZVR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5vRWRpdFBvaW50cyA9ICJub0VkaXRQb2ludHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5vR3JwID0gIm5vR3JwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBub1JvdCA9ICJub1JvdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9VbmdycCA9ICJub1VuZ3JwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBucCA9ICJucCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnMgPSAibnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG51bUNvbCA9ICJudW1Db2wiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG51bUZtdElkID0gIm51bUZtdElkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvID0gIm8iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIE9iamVjdElEID0gIk9iamVjdElEIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvYmplY3RzID0gIm9iamVjdHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIE9iamVjdFR5cGUgPSAiT2JqZWN0VHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb2JqSWQgPSAib2JqSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9mZnNldCA9ICJvZmZzZXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9sZCA9ICJvbGQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9sZENvbW1lbnQgPSAib2xkQ29tbWVudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb2xkTmFtZSA9ICJvbGROYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvbGVVcGRhdGUgPSAib2xlVXBkYXRlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvbiA9ICJvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb3AgPSAib3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9yaWVudCA9ICJvcmllbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9yaWVudGF0aW9uID0gIm9yaWVudGF0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvcmlnaW4gPSAib3JpZ2luIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBfb3V0ID0gIm91dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb3V0bGluZSA9ICJvdXRsaW5lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvdXRsaW5lRGF0YSA9ICJvdXRsaW5lRGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcCA9ICJwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYW5lID0gInBhbmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBhbm9zZSA9ICJwYW5vc2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBhcGVyU2l6ZSA9ICJwYXBlclNpemUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBhciA9ICJwYXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBhcmFtZXRlclR5cGUgPSAicGFyYW1ldGVyVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGFyZW50ID0gInBhcmVudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGFzc3dvcmQgPSAicGFzc3dvcmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBhc3RlQWxsID0gInBhc3RlQWxsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYXN0ZVZhbHVlcyA9ICJwYXN0ZVZhbHVlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGF0aCA9ICJwYXRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYXRoRWRpdE1vZGUgPSAicGF0aEVkaXRNb2RlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYXR0ZXJuVHlwZSA9ICJwYXR0ZXJuVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGhsZHIgPSAicGhsZHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpZCA9ICJwaWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpdGNoRmFtaWx5ID0gInBpdGNoRmFtaWx5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaXZvdCA9ICJwaXZvdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcG9pbnRzID0gInBvaW50cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcG9zID0gInBvcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcG9zaXRpb24gPSAicG9zaXRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBvc3QgPSAicG9zdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJlZmVyUGljID0gInByZWZlclBpYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJlc2VydmUgPSAicHJlc2VydmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByZXNzdXJlID0gInByZXNzdXJlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcmV2aW91c0NvbCA9ICJwcmV2aW91c0NvbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJldmlvdXNSb3cgPSAicHJldmlvdXNSb3ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByaSA9ICJwcmkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByaW9yaXR5ID0gInByaW9yaXR5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcm9nSWQgPSAicHJvZ0lkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBQcm9nSUQgPSAiUHJvZ0lEIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcm92aWQgPSAicHJvdmlkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcnN0ID0gInByc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByc3RNYXRlcmlhbCA9ICJwcnN0TWF0ZXJpYWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHB0c1R5cGVzID0gInB0c1R5cGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwdFR5cGUgPSAicHRUeXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBxc0NhdElkID0gInFzQ2F0SWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHFzVHlwZUlkID0gInFzVHlwZUlkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByID0gInIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJhZCA9ICJyYWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlYWRpbmdPcmRlciA9ICJyZWFkaW5nT3JkZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlY29yZENvdW50ID0gInJlY29yZENvdW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBfcmVmID0gInJlZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVmM0QgPSAicmVmM0QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlZmVyc1RvID0gInJlZmVyc1RvIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZWZyZXNoZWRCeSA9ICJyZWZyZXNoZWRCeSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVmcmVzaGVkRGF0ZSA9ICJyZWZyZXNoZWREYXRlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZWZyZXNoZWRWZXJzaW9uID0gInJlZnJlc2hlZFZlcnNpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlZnJlc2hPbkxvYWQgPSAicmVmcmVzaE9uTG9hZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVmVHlwZSA9ICJyZWZUeXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZWxhdGl2ZUZyb20gPSAicmVsYXRpdmVGcm9tIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZWxhdGl2ZUhlaWdodCA9ICJyZWxhdGl2ZUhlaWdodCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVsSWQgPSAicmVsSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFJlcXVpcmVzID0gIlJlcXVpcmVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZXN0YXJ0ID0gInJlc3RhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJldiA9ICJyZXYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJnYiA9ICJyZ2IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJJZCA9ICJySWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJpZyA9ICJyaWciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJpZ2h0ID0gInJpZ2h0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBySW5zID0gInJJbnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJvdCA9ICJyb3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJvdFdpdGhTaGFwZSA9ICJyb3RXaXRoU2hhcGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJvd0NvbFNoaWZ0ID0gInJvd0NvbFNoaWZ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByb3dEcmlsbENvdW50ID0gInJvd0RyaWxsQ291bnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJvd1BhZ2VDb3VudCA9ICJyb3dQYWdlQ291bnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJvd3MgPSAicm93cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcnRsID0gInJ0bCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcnRsQ29sID0gInJ0bENvbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcyA9ICJzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzYWx0RGF0YSA9ICJzYWx0RGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2F0ID0gInNhdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2F2ZURhdGEgPSAic2F2ZURhdGEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNhdmVTdWJzZXRGb250cyA9ICJzYXZlU3Vic2V0Rm9udHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNiID0gInNiIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzY2FsZWQgPSAic2NhbGVkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzY2FsaW5nID0gInNjYWxpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNjZW5hcmlvcyA9ICJzY2VuYXJpb3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNjb3BlID0gInNjb3BlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzY3JpcHQgPSAic2NyaXB0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzZWN1cml0eURlc2NyaXB0b3IgPSAic2VjdXJpdHlEZXNjcmlwdG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzZWVrID0gInNlZWsiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNlbmRMb2NhbGUgPSAic2VuZExvY2FsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2VyaWVzID0gInNlcmllcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2VyaWVzSWR4ID0gInNlcmllc0lkeCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2VydmVyU2xkSWQgPSAic2VydmVyU2xkSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNlcnZlclNsZE1vZGlmaWVkVGltZSA9ICJzZXJ2ZXJTbGRNb2RpZmllZFRpbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNldERlZmluaXRpb24gPSAic2V0RGVmaW5pdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hhcGVJZCA9ICJzaGFwZUlkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBTaGFwZUlEID0gIlNoYXBlSUQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNoZWV0ID0gInNoZWV0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaGVldElkID0gInNoZWV0SWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNoZWV0UG9zaXRpb24gPSAic2hlZXRQb3NpdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hvdyA9ICJzaG93IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaG93QWxsID0gInNob3dBbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNob3dDYXB0aW9ucyA9ICJzaG93Q2FwdGlvbnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNob3dDb2xIZWFkZXJzID0gInNob3dDb2xIZWFkZXJzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaG93Q29sU3RyaXBlcyA9ICJzaG93Q29sU3RyaXBlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hvd0NvbHVtblN0cmlwZXMgPSAic2hvd0NvbHVtblN0cmlwZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNob3dFcnJvck1lc3NhZ2UgPSAic2hvd0Vycm9yTWVzc2FnZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hvd0ZpcnN0Q29sdW1uID0gInNob3dGaXJzdENvbHVtbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hvd0hlYWRlciA9ICJzaG93SGVhZGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaG93SW5wdXRNZXNzYWdlID0gInNob3dJbnB1dE1lc3NhZ2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNob3dMYXN0Q29sdW1uID0gInNob3dMYXN0Q29sdW1uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaG93Um93SGVhZGVycyA9ICJzaG93Um93SGVhZGVycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hvd1Jvd1N0cmlwZXMgPSAic2hvd1Jvd1N0cmlwZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNob3dWYWx1ZSA9ICJzaG93VmFsdWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNocmlua1RvRml0ID0gInNocmlua1RvRml0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaSA9ICJzaSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc0lkID0gInNJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2ltcGxlUG9zID0gInNpbXBsZVBvcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2l6ZSA9ICJzaXplIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBza2V3YW5nbGUgPSAic2tld2FuZ2xlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbW9vdGhuZXNzID0gInNtb290aG5lc3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNtdENsZWFuID0gInNtdENsZWFuIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzb3VyY2UgPSAic291cmNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzb3VyY2VGaWxlID0gInNvdXJjZUZpbGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFNvdXJjZUlkID0gIlNvdXJjZUlkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzb3VyY2VMaW5rZWQgPSAic291cmNlTGlua2VkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzb3VyY2VTaGVldElkID0gInNvdXJjZVNoZWV0SWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNvdXJjZVR5cGUgPSAic291cmNlVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3AgPSAic3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNwYW5zID0gInNwYW5zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcGNDb2wgPSAic3BjQ29sIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcGNGaXJzdExhc3RQYXJhID0gInNwY0ZpcnN0TGFzdFBhcmEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNwaWQgPSAic3BpZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3BpZG1heCA9ICJzcGlkbWF4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcGluQ291bnQgPSAic3BpbkNvdW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcGxpdEZpcnN0ID0gInNwbGl0Rmlyc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNwb2tlcyA9ICJzcG9rZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNxbFR5cGUgPSAic3FsVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3FyZWYgPSAic3FyZWYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNyYyA9ICJzcmMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNyY0lkID0gInNyY0lkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcmNPcmQgPSAic3JjT3JkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdCA9ICJzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3RBID0gInN0QSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3RBbmcgPSAic3RBbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0YXJ0ID0gInN0YXJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdGFydGFuZ2xlID0gInN0YXJ0YW5nbGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0YXJ0RGF0ZSA9ICJzdGFydERhdGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0YXR1cyA9ICJzdGF0dXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0cmlrZSA9ICJzdHJpa2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9zdHJpbmcgPSAic3RyaW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdHJva2Vjb2xvciA9ICJzdHJva2Vjb2xvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3Ryb2tlZCA9ICJzdHJva2VkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdHJva2V3ZWlnaHQgPSAic3Ryb2tld2VpZ2h0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdHlsZSA9ICJzdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3R5bGVJZCA9ICJzdHlsZUlkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdHlsZU5hbWUgPSAic3R5bGVOYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdWJ0b3RhbCA9ICJzdWJ0b3RhbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3VtbWFyeUJlbG93ID0gInN1bW1hcnlCZWxvdyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3dBbmcgPSAic3dBbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN4ID0gInN4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzeSA9ICJzeSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3ogPSAic3oiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHQgPSAidCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGFiID0gInRhYiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGFibGVCb3JkZXJEeGZJZCA9ICJ0YWJsZUJvcmRlckR4ZklkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YWJsZUNvbHVtbklkID0gInRhYmxlQ29sdW1uSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFRhcmdldCA9ICJUYXJnZXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRleHRsaW5rID0gInRleHRsaW5rIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0ZXh0Um90YXRpb24gPSAidGV4dFJvdGF0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0aGVtZSA9ICJ0aGVtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGhyZXNoID0gInRocmVzaCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGhydUJsayA9ICJ0aHJ1QmxrIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0aW1lID0gInRpbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRJbnMgPSAidElucyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGludCA9ICJ0aW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0bSA9ICJ0bSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdG8gPSAidG8iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRvb2x0aXAgPSAidG9vbHRpcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdG9wID0gInRvcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdG9wTGFiZWxzID0gInRvcExhYmVscyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdG9wTGVmdENlbGwgPSAidG9wTGVmdENlbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRvdGFsc1Jvd1Nob3duID0gInRvdGFsc1Jvd1Nob3duIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0cmFjayA9ICJ0cmFjayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHJhbnMgPSAidHJhbnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRyYW5zaXRpb24gPSAidHJhbnNpdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHJlbmQgPSAidHJlbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHR3b0RpZ2l0VGV4dFllYXIgPSAidHdvRGlnaXRUZXh0WWVhciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHggPSAidHgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHR4MSA9ICJ0eDEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHR4MiA9ICJ0eDIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHR4Qm94ID0gInR4Qm94IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0eGJ4U2VxID0gInR4YnhTZXEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHR4YnhTdG9yeSA9ICJ0eGJ4U3RvcnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHR5ID0gInR5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0eXBlID0gInR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFR5cGUgPSAiVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHlwZWZhY2UgPSAidHlwZWZhY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHUgPSAidSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdWEgPSAidWEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVpRXhwYW5kID0gInVpRXhwYW5kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1bmJhbGFuY2VkID0gInVuYmFsYW5jZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVuaXF1ZUNvdW50ID0gInVuaXF1ZUNvdW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1bmlxdWVJZCA9ICJ1bmlxdWVJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdW5pcXVlTmFtZSA9ICJ1bmlxdWVOYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1bmlxdWVQYXJlbnQgPSAidW5pcXVlUGFyZW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1cGRhdGVBdXRvbWF0aWMgPSAidXBkYXRlQXV0b21hdGljIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1cGRhdGVkVmVyc2lvbiA9ICJ1cGRhdGVkVmVyc2lvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXJpID0gInVyaSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgVVJJID0gIlVSSSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXJsID0gInVybCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXNlQXV0b0Zvcm1hdHRpbmcgPSAidXNlQXV0b0Zvcm1hdHRpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVzZURlZiA9ICJ1c2VEZWYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVzZXIgPSAidXNlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXNlck5hbWUgPSAidXNlck5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHYgPSAidiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmFsID0gInZhbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmFsdWUgPSAidmFsdWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZhbHVlVHlwZSA9ICJ2YWx1ZVR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZhclNjYWxlID0gInZhclNjYWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2ZXJ0ID0gInZlcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZlcnRpY2FsID0gInZlcnRpY2FsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2ZXJ0aWNhbENlbnRlcmVkID0gInZlcnRpY2FsQ2VudGVyZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZlcnRpY2FsRHBpID0gInZlcnRpY2FsRHBpIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2ZXJ0T3ZlcmZsb3cgPSAidmVydE92ZXJmbG93IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2aWV3cG9pbnQgPSAidmlld3BvaW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2aWV3cG9pbnRvcmlnaW4gPSAidmlld3BvaW50b3JpZ2luIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3ID0gInciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdlaWdodCA9ICJ3ZWlnaHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdpZHRoID0gIndpZHRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3b3JrYm9va1ZpZXdJZCA9ICJ3b3JrYm9va1ZpZXdJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgd1IgPSAid1IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdyYXAgPSAid3JhcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgd3JhcFRleHQgPSAid3JhcFRleHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHggPSAieCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgeDEgPSAieDEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHgyID0gIngyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB4ZklkID0gInhmSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHhsOTcgPSAieGw5NyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgeG1sRGF0YVR5cGUgPSAieG1sRGF0YVR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHhwYXRoID0gInhwYXRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB4U3BsaXQgPSAieFNwbGl0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB5ID0gInkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHkxID0gInkxIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB5MiA9ICJ5MiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgeWVhciA9ICJ5ZWFyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB5cmFuZ2UgPSAieXJhbmdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB5U3BsaXQgPSAieVNwbGl0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB6ID0gInoiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIG8gPQorICAgICAgICAgICAgInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWxsb3dpbmNlbGwgPSBvICsgImFsbG93aW5jZWxsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbGxvd292ZXJsYXAgPSBvICsgImFsbG93b3ZlcmxhcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWx0aHJlZiA9IG8gKyAiYWx0aHJlZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm9yZGVyYm90dG9tY29sb3IgPSBvICsgImJvcmRlcmJvdHRvbWNvbG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBib3JkZXJsZWZ0Y29sb3IgPSBvICsgImJvcmRlcmxlZnRjb2xvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm9yZGVycmlnaHRjb2xvciA9IG8gKyAiYm9yZGVycmlnaHRjb2xvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm9yZGVydG9wY29sb3IgPSBvICsgImJvcmRlcnRvcGNvbG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBib3R0b20gPSBvICsgImJvdHRvbSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnVsbGV0ID0gbyArICJidWxsZXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJ1dHRvbiA9IG8gKyAiYnV0dG9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBid21vZGUgPSBvICsgImJ3bW9kZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYndub3JtYWwgPSBvICsgImJ3bm9ybWFsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBid3B1cmUgPSBvICsgImJ3cHVyZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2FsbG91dCA9IG8gKyAiY2FsbG91dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2xpcCA9IG8gKyAiY2xpcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2xpcHBhdGggPSBvICsgImNsaXBwYXRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjbGlwdG93cmFwID0gbyArICJjbGlwdG93cmFwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb2xvcm1lbnUgPSBvICsgImNvbG9ybWVudSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29sb3JtcnUgPSBvICsgImNvbG9ybXJ1IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb2x1bW4gPSBvICsgImNvbHVtbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29tcGxleCA9IG8gKyAiY29tcGxleCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29ubmVjdGFuZ2xlcyA9IG8gKyAiY29ubmVjdGFuZ2xlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29ubmVjdGxvY3MgPSBvICsgImNvbm5lY3Rsb2NzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb25uZWN0b3J0eXBlID0gbyArICJjb25uZWN0b3J0eXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb25uZWN0dHlwZSA9IG8gKyAiY29ubmVjdHR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRldGVjdG1vdXNlY2xpY2sgPSBvICsgImRldGVjdG1vdXNlY2xpY2siOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRnbWxheW91dCA9IG8gKyAiZGdtbGF5b3V0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZ21sYXlvdXRtcnUgPSBvICsgImRnbWxheW91dG1ydSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGdtbm9kZWtpbmQgPSBvICsgImRnbW5vZGVraW5kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkaWFncmFtID0gbyArICJkaWFncmFtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkb3VibGVjbGlja25vdGlmeSA9IG8gKyAiZG91YmxlY2xpY2tub3RpZnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVudHJ5ID0gbyArICJlbnRyeSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZXh0cnVzaW9uID0gbyArICJleHRydXNpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV4dHJ1c2lvbm9rID0gbyArICJleHRydXNpb25vayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgRmllbGRDb2RlcyA9IG8gKyAiRmllbGRDb2RlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmlsbCA9IG8gKyAiZmlsbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9yY2VkYXNoID0gbyArICJmb3JjZWRhc2giOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdmeGRhdGEgPSBvICsgImdmeGRhdGEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhyID0gbyArICJociI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaHJhbGlnbiA9IG8gKyAiaHJhbGlnbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaHJlZiA9IG8gKyAiaHJlZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaHJub3NoYWRlID0gbyArICJocm5vc2hhZGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhycGN0ID0gbyArICJocnBjdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaHJzdGQgPSBvICsgImhyc3RkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpZG1hcCA9IG8gKyAiaWRtYXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGluayA9IG8gKyAiaW5rIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbnNldG1vZGUgPSBvICsgImluc2V0bW9kZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGVmdCA9IG8gKyAibGVmdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgTGlua1R5cGUgPSBvICsgIkxpbmtUeXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBfbG9jayA9IG8gKyAibG9jayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgTG9ja2VkRmllbGQgPSBvICsgIkxvY2tlZEZpZWxkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYXN0ZXIgPSBvICsgIm1hc3RlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb2xlID0gbyArICJvbGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9sZWljb24gPSBvICsgIm9sZWljb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIE9MRU9iamVjdCA9IG8gKyAiT0xFT2JqZWN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvbmVkID0gbyArICJvbmVkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvcGFjaXR5MiA9IG8gKyAib3BhY2l0eTIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByZWZlcnJlbGF0aXZlID0gbyArICJwcmVmZXJyZWxhdGl2ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJveHkgPSBvICsgInByb3h5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByID0gbyArICJyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZWdyb3VwaWQgPSBvICsgInJlZ3JvdXBpZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVncm91cHRhYmxlID0gbyArICJyZWdyb3VwdGFibGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlbCA9IG8gKyAicmVsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZWxhdGlvbnRhYmxlID0gbyArICJyZWxhdGlvbnRhYmxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZWxpZCA9IG8gKyAicmVsaWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJpZ2h0ID0gbyArICJyaWdodCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcnVsZXMgPSBvICsgInJ1bGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaGFwZWRlZmF1bHRzID0gbyArICJzaGFwZWRlZmF1bHRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaGFwZWxheW91dCA9IG8gKyAic2hhcGVsYXlvdXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNpZ25hdHVyZWxpbmUgPSBvICsgInNpZ25hdHVyZWxpbmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNpbmdsZWNsaWNrID0gbyArICJzaW5nbGVjbGljayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2tldyA9IG8gKyAic2tldyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3BpZCA9IG8gKyAic3BpZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3B0ID0gbyArICJzcHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN1Z2dlc3RlZHNpZ25lciA9IG8gKyAic3VnZ2VzdGVkc2lnbmVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdWdnZXN0ZWRzaWduZXIyID0gbyArICJzdWdnZXN0ZWRzaWduZXIyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdWdnZXN0ZWRzaWduZXJlbWFpbCA9IG8gKyAic3VnZ2VzdGVkc2lnbmVyZW1haWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRhYmxlbGltaXRzID0gbyArICJ0YWJsZWxpbWl0cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGFibGVwcm9wZXJ0aWVzID0gbyArICJ0YWJsZXByb3BlcnRpZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRhcmdldHNjcmVlbnNpemUgPSBvICsgInRhcmdldHNjcmVlbnNpemUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRpdGxlID0gbyArICJ0aXRsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdG9wID0gbyArICJ0b3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVzZXJkcmF3biA9IG8gKyAidXNlcmRyYXduIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1c2VyaGlkZGVuID0gbyArICJ1c2VyaGlkZGVuIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2ID0gbyArICJ2IjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFAKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWVzcGFjZSBwID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcHJlc2VudGF0aW9ubWwvMjAwNi9tYWluIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbmltID0gcCArICJhbmltIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbmltQ2xyID0gcCArICJhbmltQ2xyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbmltRWZmZWN0ID0gcCArICJhbmltRWZmZWN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbmltTW90aW9uID0gcCArICJhbmltTW90aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbmltUm90ID0gcCArICJhbmltUm90IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbmltU2NhbGUgPSBwICsgImFuaW1TY2FsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXR0ck5hbWUgPSBwICsgImF0dHJOYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhdHRyTmFtZUxzdCA9IHAgKyAiYXR0ck5hbWVMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGF1ZGlvID0gcCArICJhdWRpbyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmcgPSBwICsgImJnIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiZ1ByID0gcCArICJiZ1ByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiZ1JlZiA9IHAgKyAiYmdSZWYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJsZEFzT25lID0gcCArICJibGRBc09uZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmxkRGdtID0gcCArICJibGREZ20iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJsZEdyYXBoaWMgPSBwICsgImJsZEdyYXBoaWMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJsZExzdCA9IHAgKyAiYmxkTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBibGRPbGVDaGFydCA9IHAgKyAiYmxkT2xlQ2hhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJsZFAgPSBwICsgImJsZFAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJsZFN1YiA9IHAgKyAiYmxkU3ViIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBibGluZHMgPSBwICsgImJsaW5kcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmxpcEZpbGwgPSBwICsgImJsaXBGaWxsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBib2R5U3R5bGUgPSBwICsgImJvZHlTdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm9sZCA9IHAgKyAiYm9sZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm9sZEl0YWxpYyA9IHAgKyAiYm9sZEl0YWxpYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm9vbFZhbCA9IHAgKyAiYm9vbFZhbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnkgPSBwICsgImJ5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjQmh2ciA9IHAgKyAiY0JodnIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNoYXJSZyA9IHAgKyAiY2hhclJnIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjaGVja2VyID0gcCArICJjaGVja2VyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjaGlsZFRuTHN0ID0gcCArICJjaGlsZFRuTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjaXJjbGUgPSBwICsgImNpcmNsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2xyTWFwID0gcCArICJjbHJNYXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNsck1hcE92ciA9IHAgKyAiY2xyTWFwT3ZyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjbHJWYWwgPSBwICsgImNsclZhbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY20gPSBwICsgImNtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjbUF1dGhvciA9IHAgKyAiY21BdXRob3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNtQXV0aG9yTHN0ID0gcCArICJjbUF1dGhvckxzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY21kID0gcCArICJjbWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNNZWRpYU5vZGUgPSBwICsgImNNZWRpYU5vZGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNtTHN0ID0gcCArICJjbUxzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052Q3huU3BQciA9IHAgKyAiY052Q3huU3BQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052R3JhcGhpY0ZyYW1lUHIgPSBwICsgImNOdkdyYXBoaWNGcmFtZVByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjTnZHcnBTcFByID0gcCArICJjTnZHcnBTcFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjTnZQaWNQciA9IHAgKyAiY052UGljUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNOdlByID0gcCArICJjTnZQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052U3BQciA9IHAgKyAiY052U3BQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29tYiA9IHAgKyAiY29tYiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29uZCA9IHAgKyAiY29uZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29udGVudFBhcnQgPSBwICsgImNvbnRlbnRQYXJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb250cm9sID0gcCArICJjb250cm9sIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb250cm9scyA9IHAgKyAiY29udHJvbHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvdmVyID0gcCArICJjb3ZlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY1NsZCA9IHAgKyAiY1NsZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY1NsZFZpZXdQciA9IHAgKyAiY1NsZFZpZXdQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY1RuID0gcCArICJjVG4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN1c3REYXRhID0gcCArICJjdXN0RGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3VzdERhdGFMc3QgPSBwICsgImN1c3REYXRhTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjdXN0U2hvdyA9IHAgKyAiY3VzdFNob3ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN1c3RTaG93THN0ID0gcCArICJjdXN0U2hvd0xzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3V0ID0gcCArICJjdXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNWaWV3UHIgPSBwICsgImNWaWV3UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN4blNwID0gcCArICJjeG5TcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGVmYXVsdFRleHRTdHlsZSA9IHAgKyAiZGVmYXVsdFRleHRTdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlhbW9uZCA9IHAgKyAiZGlhbW9uZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlzc29sdmUgPSBwICsgImRpc3NvbHZlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlbWJlZCA9IHAgKyAiZW1iZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVtYmVkZGVkRm9udCA9IHAgKyAiZW1iZWRkZWRGb250IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlbWJlZGRlZEZvbnRMc3QgPSBwICsgImVtYmVkZGVkRm9udExzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZW5kQ29uZExzdCA9IHAgKyAiZW5kQ29uZExzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZW5kU25kID0gcCArICJlbmRTbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVuZFN5bmMgPSBwICsgImVuZFN5bmMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV4dCA9IHAgKyAiZXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBleHRlcm5hbERhdGEgPSBwICsgImV4dGVybmFsRGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZXh0THN0ID0gcCArICJleHRMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZhZGUgPSBwICsgImZhZGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZsdFZhbCA9IHAgKyAiZmx0VmFsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb250ID0gcCArICJmb250IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmcm9tID0gcCArICJmcm9tIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncmFwaGljRWwgPSBwICsgImdyYXBoaWNFbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3JhcGhpY0ZyYW1lID0gcCArICJncmFwaGljRnJhbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyaWRTcGFjaW5nID0gcCArICJncmlkU3BhY2luZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3JwU3AgPSBwICsgImdycFNwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncnBTcFByID0gcCArICJncnBTcFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBndWlkZSA9IHAgKyAiZ3VpZGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGd1aWRlTHN0ID0gcCArICJndWlkZUxzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGFuZG91dE1hc3RlciA9IHAgKyAiaGFuZG91dE1hc3RlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGFuZG91dE1hc3RlcklkID0gcCArICJoYW5kb3V0TWFzdGVySWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhhbmRvdXRNYXN0ZXJJZExzdCA9IHAgKyAiaGFuZG91dE1hc3RlcklkTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoZiA9IHAgKyAiaGYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhzbCA9IHAgKyAiaHNsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbmtUZ3QgPSBwICsgImlua1RndCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaXRhbGljID0gcCArICJpdGFsaWMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGl0ZXJhdGUgPSBwICsgIml0ZXJhdGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGtpbnNva3UgPSBwICsgImtpbnNva3UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxpbmsgPSBwICsgImxpbmsiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1vZGlmeVZlcmlmaWVyID0gcCArICJtb2RpZnlWZXJpZmllciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbmV3c2ZsYXNoID0gcCArICJuZXdzZmxhc2giOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5leHRDb25kTHN0ID0gcCArICJuZXh0Q29uZExzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9ybWFsVmlld1ByID0gcCArICJub3JtYWxWaWV3UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5vdGVzID0gcCArICJub3RlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm90ZXNNYXN0ZXIgPSBwICsgIm5vdGVzTWFzdGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBub3Rlc01hc3RlcklkID0gcCArICJub3Rlc01hc3RlcklkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBub3Rlc01hc3RlcklkTHN0ID0gcCArICJub3Rlc01hc3RlcklkTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBub3Rlc1N0eWxlID0gcCArICJub3Rlc1N0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBub3Rlc1N6ID0gcCArICJub3Rlc1N6IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBub3Rlc1RleHRWaWV3UHIgPSBwICsgIm5vdGVzVGV4dFZpZXdQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm90ZXNWaWV3UHIgPSBwICsgIm5vdGVzVmlld1ByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBudkN4blNwUHIgPSBwICsgIm52Q3huU3BQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnZHcmFwaGljRnJhbWVQciA9IHAgKyAibnZHcmFwaGljRnJhbWVQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnZHcnBTcFByID0gcCArICJudkdycFNwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG52UGljUHIgPSBwICsgIm52UGljUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG52UHIgPSBwICsgIm52UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG52U3BQciA9IHAgKyAibnZTcFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvbGVDaGFydEVsID0gcCArICJvbGVDaGFydEVsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvbGVPYmogPSBwICsgIm9sZU9iaiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb3JpZ2luID0gcCArICJvcmlnaW4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG90aGVyU3R5bGUgPSBwICsgIm90aGVyU3R5bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG91dGxpbmVWaWV3UHIgPSBwICsgIm91dGxpbmVWaWV3UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBhciA9IHAgKyAicGFyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaCA9IHAgKyAicGgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBob3RvQWxidW0gPSBwICsgInBob3RvQWxidW0iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpYyA9IHAgKyAicGljIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwbHVzID0gcCArICJwbHVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwb3MgPSBwICsgInBvcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJlc2VudGF0aW9uID0gcCArICJwcmVzZW50YXRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByZXZDb25kTHN0ID0gcCArICJwcmV2Q29uZExzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcFJnID0gcCArICJwUmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHB1bGwgPSBwICsgInB1bGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHB1c2ggPSBwICsgInB1c2giOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJhbmRvbSA9IHAgKyAicmFuZG9tIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByYW5kb21CYXIgPSBwICsgInJhbmRvbUJhciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgckN0ciA9IHAgKyAickN0ciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVndWxhciA9IHAgKyAicmVndWxhciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVzdG9yZWRMZWZ0ID0gcCArICJyZXN0b3JlZExlZnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlc3RvcmVkVG9wID0gcCArICJyZXN0b3JlZFRvcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmdiID0gcCArICJyZ2IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJ0biA9IHAgKyAicnRuIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzY2FsZSA9IHAgKyAic2NhbGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNlcSA9IHAgKyAic2VxIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzZXQgPSBwICsgInNldCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2xkID0gcCArICJzbGQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNsZElkID0gcCArICJzbGRJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2xkSWRMc3QgPSBwICsgInNsZElkTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbGRMYXlvdXQgPSBwICsgInNsZExheW91dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2xkTGF5b3V0SWQgPSBwICsgInNsZExheW91dElkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbGRMYXlvdXRJZExzdCA9IHAgKyAic2xkTGF5b3V0SWRMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNsZExzdCA9IHAgKyAic2xkTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbGRNYXN0ZXIgPSBwICsgInNsZE1hc3RlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2xkTWFzdGVySWQgPSBwICsgInNsZE1hc3RlcklkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbGRNYXN0ZXJJZExzdCA9IHAgKyAic2xkTWFzdGVySWRMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNsZFN5bmNQciA9IHAgKyAic2xkU3luY1ByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbGRTeiA9IHAgKyAic2xkU3oiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNsZFRndCA9IHAgKyAic2xkVGd0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbGlkZVZpZXdQciA9IHAgKyAic2xpZGVWaWV3UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNuZCA9IHAgKyAic25kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbmRBYyA9IHAgKyAic25kQWMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNuZFRndCA9IHAgKyAic25kVGd0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzb3J0ZXJWaWV3UHIgPSBwICsgInNvcnRlclZpZXdQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3AgPSBwICsgInNwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcGxpdCA9IHAgKyAic3BsaXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNwUHIgPSBwICsgInNwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNwVGd0ID0gcCArICJzcFRndCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3BUcmVlID0gcCArICJzcFRyZWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0Q29uZExzdCA9IHAgKyAic3RDb25kTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdHJpcHMgPSBwICsgInN0cmlwcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3RyVmFsID0gcCArICJzdHJWYWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0U25kID0gcCArICJzdFNuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3R5bGUgPSBwICsgInN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdWJTcCA9IHAgKyAic3ViU3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN1YlRuTHN0ID0gcCArICJzdWJUbkxzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGFnID0gcCArICJ0YWciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRhZ0xzdCA9IHAgKyAidGFnTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YWdzID0gcCArICJ0YWdzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YXYgPSBwICsgInRhdiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGF2THN0ID0gcCArICJ0YXZMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRleHQgPSBwICsgInRleHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRndEVsID0gcCArICJ0Z3RFbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGltaW5nID0gcCArICJ0aW1pbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRpdGxlU3R5bGUgPSBwICsgInRpdGxlU3R5bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRtQWJzID0gcCArICJ0bUFicyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdG1QY3QgPSBwICsgInRtUGN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0bXBsID0gcCArICJ0bXBsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0bXBsTHN0ID0gcCArICJ0bXBsTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0biA9IHAgKyAidG4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRuTHN0ID0gcCArICJ0bkxzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdG8gPSBwICsgInRvIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0cmFuc2l0aW9uID0gcCArICJ0cmFuc2l0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0eEJvZHkgPSBwICsgInR4Qm9keSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHhFbCA9IHAgKyAidHhFbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHhTdHlsZXMgPSBwICsgInR4U3R5bGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2YWwgPSBwICsgInZhbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmlkZW8gPSBwICsgInZpZGVvIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2aWV3UHIgPSBwICsgInZpZXdQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgd2VkZ2UgPSBwICsgIndlZGdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3aGVlbCA9IHAgKyAid2hlZWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdpcGUgPSBwICsgIndpcGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHhmcm0gPSBwICsgInhmcm0iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHpvb20gPSBwICsgInpvb20iOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUDE0CisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgcDE0ID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9wb3dlcnBvaW50LzIwMTAvbWFpbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm1rID0gcDE0ICsgImJtayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm1rTHN0ID0gcDE0ICsgImJta0xzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm1rVGd0ID0gcDE0ICsgImJta1RndCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm91bmNlRW5kID0gcDE0ICsgImJvdW5jZUVuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYndNb2RlID0gcDE0ICsgImJ3TW9kZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052Q29udGVudFBhcnRQciA9IHAxNCArICJjTnZDb250ZW50UGFydFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjTnZQciA9IHAxNCArICJjTnZQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29udmV5b3IgPSBwMTQgKyAiY29udmV5b3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNyZWF0aW9uSWQgPSBwMTQgKyAiY3JlYXRpb25JZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9vcnMgPSBwMTQgKyAiZG9vcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGR1ciA9IHAxNCArICJkdXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV4dExzdCA9IHAxNCArICJleHRMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZhZGUgPSBwMTQgKyAiZmFkZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmVycmlzID0gcDE0ICsgImZlcnJpcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmxhc2ggPSBwMTQgKyAiZmxhc2giOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZsaXAgPSBwMTQgKyAiZmxpcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmx5dGhyb3VnaCA9IHAxNCArICJmbHl0aHJvdWdoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBnYWxsZXJ5ID0gcDE0ICsgImdhbGxlcnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdsaXR0ZXIgPSBwMTQgKyAiZ2xpdHRlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaG9uZXljb21iID0gcDE0ICsgImhvbmV5Y29tYiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGFzZXJUcmFjZUxzdCA9IHAxNCArICJsYXNlclRyYWNlTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtZWRpYSA9IHAxNCArICJtZWRpYSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbW9kSWQgPSBwMTQgKyAibW9kSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG52Q29udGVudFBhcnRQciA9IHAxNCArICJudkNvbnRlbnRQYXJ0UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG52UHIgPSBwMTQgKyAibnZQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGFuID0gcDE0ICsgInBhbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGF1c2VFdnQgPSBwMTQgKyAicGF1c2VFdnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBsYXlFdnQgPSBwMTQgKyAicGxheUV2dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJlc2V0Qm91bmNlRW5kID0gcDE0ICsgInByZXNldEJvdW5jZUVuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJpc20gPSBwMTQgKyAicHJpc20iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlc3VtZUV2dCA9IHAxNCArICJyZXN1bWVFdnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJldmVhbCA9IHAxNCArICJyZXZlYWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJpcHBsZSA9IHAxNCArICJyaXBwbGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNlY3Rpb24gPSBwMTQgKyAic2VjdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2VjdGlvbkxzdCA9IHAxNCArICJzZWN0aW9uTHN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzZWVrRXZ0ID0gcDE0ICsgInNlZWtFdnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNob3dFdnRMc3QgPSBwMTQgKyAic2hvd0V2dExzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hyZWQgPSBwMTQgKyAic2hyZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNsZElkID0gcDE0ICsgInNsZElkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbGRJZExzdCA9IHAxNCArICJzbGRJZExzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3RvcEV2dCA9IHAxNCArICJzdG9wRXZ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBfc3dpdGNoID0gcDE0ICsgInN3aXRjaCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHJhY2VQdCA9IHAxNCArICJ0cmFjZVB0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0cmFjZVB0THN0ID0gcDE0ICsgInRyYWNlUHRMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRyaWdnZXJFdnQgPSBwMTQgKyAidHJpZ2dlckV2dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHJpbSA9IHAxNCArICJ0cmltIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2b3J0ZXggPSBwMTQgKyAidm9ydGV4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3YXJwID0gcDE0ICsgIndhcnAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdoZWVsUmV2ZXJzZSA9IHAxNCArICJ3aGVlbFJldmVyc2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdpbmRvdyA9IHAxNCArICJ3aW5kb3ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHhmcm0gPSBwMTQgKyAieGZybSI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQMTUKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWVzcGFjZSBwMTUgPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlMTUvcG93ZXJwb2ludCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZXh0RWxlbWVudCA9IHAxNSArICJleHRFbGVtZW50IjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBBVgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIHBhdiA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA3LzYvMTkvYXVkaW92aWRlbyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWVkaWEgPSBwYXYgKyAibWVkaWEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNyY01lZGlhID0gcGF2ICsgInNyY01lZGlhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBibWtMc3QgPSBwYXYgKyAiYm1rTHN0IjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBpYworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIHBpYyA9CisgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L3BpY3R1cmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJsaXBGaWxsID0gcGljICsgImJsaXBGaWxsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjTnZQaWNQciA9IHBpYyArICJjTnZQaWNQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052UHIgPSBwaWMgKyAiY052UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG52UGljUHIgPSBwaWMgKyAibnZQaWNQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgX3BpYyA9IHBpYyArICJwaWMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNwUHIgPSBwaWMgKyAic3BQciI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQbGVnYWN5CisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgcGxlZ2FjeSA9ICJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpwb3dlcnBvaW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0ZXh0ZGF0YSA9IHBsZWdhY3kgKyAidGV4dGRhdGEiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIHIgPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJsaXAgPSByICsgImJsaXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNzID0gciArICJjcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG0gPSByICsgImRtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlbWJlZCA9IHIgKyAiZW1iZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhyZWYgPSByICsgImhyZWYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGlkID0gciArICJpZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGluayA9IHIgKyAibGluayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbG8gPSByICsgImxvIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaWN0ID0gciArICJwaWN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBxcyA9IHIgKyAicXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZlcnRpY2FsRHBpID0gciArICJ2ZXJ0aWNhbERwaSI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgcyA9CisgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbGlnbm1lbnQgPSBzICsgImFsaWdubWVudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYW5jaG9yID0gcyArICJhbmNob3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGF1dGhvciA9IHMgKyAiYXV0aG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhdXRob3JzID0gcyArICJhdXRob3JzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhdXRvRmlsdGVyID0gcyArICJhdXRvRmlsdGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhdXRvU29ydFNjb3BlID0gcyArICJhdXRvU29ydFNjb3BlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiID0gcyArICJiIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiZ0NvbG9yID0gcyArICJiZ0NvbG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiayA9IHMgKyAiYmsiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJvcmRlciA9IHMgKyAiYm9yZGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBib3JkZXJzID0gcyArICJib3JkZXJzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBib3R0b20gPSBzICsgImJvdHRvbSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYnJrID0gcyArICJicmsiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGMgPSBzICsgImMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNhY2hlRmllbGQgPSBzICsgImNhY2hlRmllbGQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNhY2hlRmllbGRzID0gcyArICJjYWNoZUZpZWxkcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2FjaGVIaWVyYXJjaGllcyA9IHMgKyAiY2FjaGVIaWVyYXJjaGllcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2FjaGVIaWVyYXJjaHkgPSBzICsgImNhY2hlSGllcmFyY2h5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjYWNoZVNvdXJjZSA9IHMgKyAiY2FjaGVTb3VyY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNhbGNDaGFpbiA9IHMgKyAiY2FsY0NoYWluIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjYWxjUHIgPSBzICsgImNhbGNQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2FsY3VsYXRlZENvbHVtbkZvcm11bGEgPSBzICsgImNhbGN1bGF0ZWRDb2x1bW5Gb3JtdWxhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjYWxjdWxhdGVkSXRlbSA9IHMgKyAiY2FsY3VsYXRlZEl0ZW0iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNhbGN1bGF0ZWRJdGVtcyA9IHMgKyAiY2FsY3VsYXRlZEl0ZW1zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjYWxjdWxhdGVkTWVtYmVyID0gcyArICJjYWxjdWxhdGVkTWVtYmVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjYWxjdWxhdGVkTWVtYmVycyA9IHMgKyAiY2FsY3VsYXRlZE1lbWJlcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNlbGwgPSBzICsgImNlbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNlbGxNZXRhZGF0YSA9IHMgKyAiY2VsbE1ldGFkYXRhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjZWxsU21hcnRUYWcgPSBzICsgImNlbGxTbWFydFRhZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2VsbFNtYXJ0VGFnUHIgPSBzICsgImNlbGxTbWFydFRhZ1ByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjZWxsU21hcnRUYWdzID0gcyArICJjZWxsU21hcnRUYWdzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjZWxsU3R5bGUgPSBzICsgImNlbGxTdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2VsbFN0eWxlcyA9IHMgKyAiY2VsbFN0eWxlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2VsbFN0eWxlWGZzID0gcyArICJjZWxsU3R5bGVYZnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNlbGxXYXRjaCA9IHMgKyAiY2VsbFdhdGNoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjZWxsV2F0Y2hlcyA9IHMgKyAiY2VsbFdhdGNoZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNlbGxYZnMgPSBzICsgImNlbGxYZnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNmUnVsZSA9IHMgKyAiY2ZSdWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjZnZvID0gcyArICJjZnZvIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjaGFyc2V0ID0gcyArICJjaGFyc2V0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjaGFydEZvcm1hdCA9IHMgKyAiY2hhcnRGb3JtYXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNoYXJ0Rm9ybWF0cyA9IHMgKyAiY2hhcnRGb3JtYXRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjaGFydHNoZWV0ID0gcyArICJjaGFydHNoZWV0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb2wgPSBzICsgImNvbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29sQnJlYWtzID0gcyArICJjb2xCcmVha3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbEZpZWxkcyA9IHMgKyAiY29sRmllbGRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb2xIaWVyYXJjaGllc1VzYWdlID0gcyArICJjb2xIaWVyYXJjaGllc1VzYWdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb2xIaWVyYXJjaHlVc2FnZSA9IHMgKyAiY29sSGllcmFyY2h5VXNhZ2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbEl0ZW1zID0gcyArICJjb2xJdGVtcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29sb3IgPSBzICsgImNvbG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb2xvckZpbHRlciA9IHMgKyAiY29sb3JGaWx0ZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbG9ycyA9IHMgKyAiY29sb3JzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb2xvclNjYWxlID0gcyArICJjb2xvclNjYWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb2xzID0gcyArICJjb2xzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb21tZW50ID0gcyArICJjb21tZW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb21tZW50TGlzdCA9IHMgKyAiY29tbWVudExpc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbW1lbnRzID0gcyArICJjb21tZW50cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29uZGVuc2UgPSBzICsgImNvbmRlbnNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb25kaXRpb25hbEZvcm1hdCA9IHMgKyAiY29uZGl0aW9uYWxGb3JtYXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbmRpdGlvbmFsRm9ybWF0cyA9IHMgKyAiY29uZGl0aW9uYWxGb3JtYXRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb25kaXRpb25hbEZvcm1hdHRpbmcgPSBzICsgImNvbmRpdGlvbmFsRm9ybWF0dGluZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29ubmVjdGlvbiA9IHMgKyAiY29ubmVjdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29ubmVjdGlvbnMgPSBzICsgImNvbm5lY3Rpb25zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb25zb2xpZGF0aW9uID0gcyArICJjb25zb2xpZGF0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb250cm9sID0gcyArICJjb250cm9sIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb250cm9sUHIgPSBzICsgImNvbnRyb2xQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29udHJvbHMgPSBzICsgImNvbnRyb2xzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjdXN0b21GaWx0ZXIgPSBzICsgImN1c3RvbUZpbHRlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3VzdG9tRmlsdGVycyA9IHMgKyAiY3VzdG9tRmlsdGVycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3VzdG9tUHIgPSBzICsgImN1c3RvbVByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjdXN0b21Qcm9wZXJ0aWVzID0gcyArICJjdXN0b21Qcm9wZXJ0aWVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjdXN0b21TaGVldFZpZXcgPSBzICsgImN1c3RvbVNoZWV0VmlldyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3VzdG9tU2hlZXRWaWV3cyA9IHMgKyAiY3VzdG9tU2hlZXRWaWV3cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZCA9IHMgKyAiZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGF0YUJhciA9IHMgKyAiZGF0YUJhciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGF0YUNvbnNvbGlkYXRlID0gcyArICJkYXRhQ29uc29saWRhdGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRhdGFGaWVsZCA9IHMgKyAiZGF0YUZpZWxkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkYXRhRmllbGRzID0gcyArICJkYXRhRmllbGRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkYXRhUmVmID0gcyArICJkYXRhUmVmIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkYXRhUmVmcyA9IHMgKyAiZGF0YVJlZnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRhdGFWYWxpZGF0aW9uID0gcyArICJkYXRhVmFsaWRhdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGF0YVZhbGlkYXRpb25zID0gcyArICJkYXRhVmFsaWRhdGlvbnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRhdGVHcm91cEl0ZW0gPSBzICsgImRhdGVHcm91cEl0ZW0iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRiUHIgPSBzICsgImRiUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRkZUl0ZW0gPSBzICsgImRkZUl0ZW0iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRkZUl0ZW1zID0gcyArICJkZGVJdGVtcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGRlTGluayA9IHMgKyAiZGRlTGluayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGVmaW5lZE5hbWUgPSBzICsgImRlZmluZWROYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZWZpbmVkTmFtZXMgPSBzICsgImRlZmluZWROYW1lcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGVsZXRlZEZpZWxkID0gcyArICJkZWxldGVkRmllbGQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpYWdvbmFsID0gcyArICJkaWFnb25hbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlhbG9nc2hlZXQgPSBzICsgImRpYWxvZ3NoZWV0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkaW1lbnNpb24gPSBzICsgImRpbWVuc2lvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGltZW5zaW9ucyA9IHMgKyAiZGltZW5zaW9ucyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlzY3JldGVQciA9IHMgKyAiZGlzY3JldGVQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZHJhd2luZyA9IHMgKyAiZHJhd2luZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZHhmID0gcyArICJkeGYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGR4ZnMgPSBzICsgImR4ZnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGR5bmFtaWNGaWx0ZXIgPSBzICsgImR5bmFtaWNGaWx0ZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGUgPSBzICsgImUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVudHJpZXMgPSBzICsgImVudHJpZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV2ZW5Gb290ZXIgPSBzICsgImV2ZW5Gb290ZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV2ZW5IZWFkZXIgPSBzICsgImV2ZW5IZWFkZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV4dCA9IHMgKyAiZXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBleHRlbmQgPSBzICsgImV4dGVuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZXh0ZXJuYWxCb29rID0gcyArICJleHRlcm5hbEJvb2siOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV4dGVybmFsTGluayA9IHMgKyAiZXh0ZXJuYWxMaW5rIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBleHRMc3QgPSBzICsgImV4dExzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZiA9IHMgKyAiZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmFtaWx5ID0gcyArICJmYW1pbHkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZnQ29sb3IgPSBzICsgImZnQ29sb3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZpZWxkID0gcyArICJmaWVsZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmllbGRHcm91cCA9IHMgKyAiZmllbGRHcm91cCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmllbGRzVXNhZ2UgPSBzICsgImZpZWxkc1VzYWdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWVsZFVzYWdlID0gcyArICJmaWVsZFVzYWdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWxsID0gcyArICJmaWxsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWxscyA9IHMgKyAiZmlsbHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZpbHRlciA9IHMgKyAiZmlsdGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWx0ZXJDb2x1bW4gPSBzICsgImZpbHRlckNvbHVtbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmlsdGVycyA9IHMgKyAiZmlsdGVycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmlyc3RGb290ZXIgPSBzICsgImZpcnN0Rm9vdGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaXJzdEhlYWRlciA9IHMgKyAiZmlyc3RIZWFkZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvbnQgPSBzICsgImZvbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvbnRzID0gcyArICJmb250cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9vID0gcyArICJmb28iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvcm1hdCA9IHMgKyAiZm9ybWF0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb3JtYXRzID0gcyArICJmb3JtYXRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb3JtdWxhID0gcyArICJmb3JtdWxhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb3JtdWxhMSA9IHMgKyAiZm9ybXVsYTEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvcm11bGEyID0gcyArICJmb3JtdWxhMiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZnJvbSA9IHMgKyAiZnJvbSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZnV0dXJlTWV0YWRhdGEgPSBzICsgImZ1dHVyZU1ldGFkYXRhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncmFkaWVudEZpbGwgPSBzICsgImdyYWRpZW50RmlsbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3JvdXAgPSBzICsgImdyb3VwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncm91cEl0ZW1zID0gcyArICJncm91cEl0ZW1zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncm91cExldmVsID0gcyArICJncm91cExldmVsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncm91cExldmVscyA9IHMgKyAiZ3JvdXBMZXZlbHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyb3VwTWVtYmVyID0gcyArICJncm91cE1lbWJlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3JvdXBNZW1iZXJzID0gcyArICJncm91cE1lbWJlcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyb3VwcyA9IHMgKyAiZ3JvdXBzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoZWFkZXIgPSBzICsgImhlYWRlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGVhZGVyRm9vdGVyID0gcyArICJoZWFkZXJGb290ZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhlYWRlcnMgPSBzICsgImhlYWRlcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhvcml6b250YWwgPSBzICsgImhvcml6b250YWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGh5cGVybGluayA9IHMgKyAiaHlwZXJsaW5rIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoeXBlcmxpbmtzID0gcyArICJoeXBlcmxpbmtzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpID0gcyArICJpIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpY29uRmlsdGVyID0gcyArICJpY29uRmlsdGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpY29uU2V0ID0gcyArICJpY29uU2V0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpZ25vcmVkRXJyb3IgPSBzICsgImlnbm9yZWRFcnJvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaWdub3JlZEVycm9ycyA9IHMgKyAiaWdub3JlZEVycm9ycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaW5kZXhlZENvbG9ycyA9IHMgKyAiaW5kZXhlZENvbG9ycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaW5wdXRDZWxscyA9IHMgKyAiaW5wdXRDZWxscyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgX2lzID0gcyArICJpcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaXRlbSA9IHMgKyAiaXRlbSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaXRlbXMgPSBzICsgIml0ZW1zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBrID0gcyArICJrIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBrcGkgPSBzICsgImtwaSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUga3BpcyA9IHMgKyAia3BpcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGVmdCA9IHMgKyAibGVmdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGVnYWN5RHJhd2luZyA9IHMgKyAibGVnYWN5RHJhd2luZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGVnYWN5RHJhd2luZ0hGID0gcyArICJsZWdhY3lEcmF3aW5nSEYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxvY2F0aW9uID0gcyArICJsb2NhdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbSA9IHMgKyAibSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWFpbiA9IHMgKyAibWFpbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWFwID0gcyArICJtYXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1hcHMgPSBzICsgIm1hcHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1keCA9IHMgKyAibWR4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtZHhNZXRhZGF0YSA9IHMgKyAibWR4TWV0YWRhdGEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1lYXN1cmVHcm91cCA9IHMgKyAibWVhc3VyZUdyb3VwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtZWFzdXJlR3JvdXBzID0gcyArICJtZWFzdXJlR3JvdXBzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtZW1iZXIgPSBzICsgIm1lbWJlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWVtYmVycyA9IHMgKyAibWVtYmVycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWVyZ2VDZWxsID0gcyArICJtZXJnZUNlbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1lcmdlQ2VsbHMgPSBzICsgIm1lcmdlQ2VsbHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1ldGFkYXRhID0gcyArICJtZXRhZGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWV0YWRhdGFTdHJpbmdzID0gcyArICJtZXRhZGF0YVN0cmluZ3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1ldGFkYXRhVHlwZSA9IHMgKyAibWV0YWRhdGFUeXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtZXRhZGF0YVR5cGVzID0gcyArICJtZXRhZGF0YVR5cGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtcCA9IHMgKyAibXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1wTWFwID0gcyArICJtcE1hcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbXBzID0gcyArICJtcHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1ydUNvbG9ycyA9IHMgKyAibXJ1Q29sb3JzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtcyA9IHMgKyAibXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG4gPSBzICsgIm4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5hbWUgPSBzICsgIm5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5jID0gcyArICJuYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbmR4ZiA9IHMgKyAibmR4ZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnVtRm10ID0gcyArICJudW1GbXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG51bUZtdHMgPSBzICsgIm51bUZtdHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9iamVjdFByID0gcyArICJvYmplY3RQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb2MgPSBzICsgIm9jIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvZGRGb290ZXIgPSBzICsgIm9kZEZvb3RlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb2RkSGVhZGVyID0gcyArICJvZGRIZWFkZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9keGYgPSBzICsgIm9keGYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9sYXBQciA9IHMgKyAib2xhcFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvbGRGb3JtdWxhID0gcyArICJvbGRGb3JtdWxhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvbGVJdGVtID0gcyArICJvbGVJdGVtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvbGVJdGVtcyA9IHMgKyAib2xlSXRlbXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9sZUxpbmsgPSBzICsgIm9sZUxpbmsiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9sZU9iamVjdCA9IHMgKyAib2xlT2JqZWN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvbGVPYmplY3RzID0gcyArICJvbGVPYmplY3RzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvdXRsaW5lID0gcyArICJvdXRsaW5lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvdXRsaW5lUHIgPSBzICsgIm91dGxpbmVQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcCA9IHMgKyAicCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGFnZSA9IHMgKyAicGFnZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGFnZUZpZWxkID0gcyArICJwYWdlRmllbGQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBhZ2VGaWVsZHMgPSBzICsgInBhZ2VGaWVsZHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBhZ2VJdGVtID0gcyArICJwYWdlSXRlbSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGFnZU1hcmdpbnMgPSBzICsgInBhZ2VNYXJnaW5zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYWdlcyA9IHMgKyAicGFnZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBhZ2VTZXR1cCA9IHMgKyAicGFnZVNldHVwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYWdlU2V0VXBQciA9IHMgKyAicGFnZVNldFVwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBhbmUgPSBzICsgInBhbmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBhcmFtZXRlciA9IHMgKyAicGFyYW1ldGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYXJhbWV0ZXJzID0gcyArICJwYXJhbWV0ZXJzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYXR0ZXJuRmlsbCA9IHMgKyAicGF0dGVybkZpbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBob25ldGljUHIgPSBzICsgInBob25ldGljUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpY3R1cmUgPSBzICsgInBpY3R1cmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpdm90QXJlYSA9IHMgKyAicGl2b3RBcmVhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaXZvdEFyZWFzID0gcyArICJwaXZvdEFyZWFzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaXZvdENhY2hlID0gcyArICJwaXZvdENhY2hlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaXZvdENhY2hlRGVmaW5pdGlvbiA9IHMgKyAicGl2b3RDYWNoZURlZmluaXRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpdm90Q2FjaGVSZWNvcmRzID0gcyArICJwaXZvdENhY2hlUmVjb3JkcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGl2b3RDYWNoZXMgPSBzICsgInBpdm90Q2FjaGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaXZvdEZpZWxkID0gcyArICJwaXZvdEZpZWxkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaXZvdEZpZWxkcyA9IHMgKyAicGl2b3RGaWVsZHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpdm90SGllcmFyY2hpZXMgPSBzICsgInBpdm90SGllcmFyY2hpZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpdm90SGllcmFyY2h5ID0gcyArICJwaXZvdEhpZXJhcmNoeSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGl2b3RTZWxlY3Rpb24gPSBzICsgInBpdm90U2VsZWN0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaXZvdFRhYmxlRGVmaW5pdGlvbiA9IHMgKyAicGl2b3RUYWJsZURlZmluaXRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpdm90VGFibGVTdHlsZUluZm8gPSBzICsgInBpdm90VGFibGVTdHlsZUluZm8iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByaW50T3B0aW9ucyA9IHMgKyAicHJpbnRPcHRpb25zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcm90ZWN0ZWRSYW5nZSA9IHMgKyAicHJvdGVjdGVkUmFuZ2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByb3RlY3RlZFJhbmdlcyA9IHMgKyAicHJvdGVjdGVkUmFuZ2VzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcm90ZWN0aW9uID0gcyArICJwcm90ZWN0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBxdWVyeSA9IHMgKyAicXVlcnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHF1ZXJ5Q2FjaGUgPSBzICsgInF1ZXJ5Q2FjaGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHF1ZXJ5VGFibGUgPSBzICsgInF1ZXJ5VGFibGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHF1ZXJ5VGFibGVEZWxldGVkRmllbGRzID0gcyArICJxdWVyeVRhYmxlRGVsZXRlZEZpZWxkcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcXVlcnlUYWJsZUZpZWxkID0gcyArICJxdWVyeVRhYmxlRmllbGQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHF1ZXJ5VGFibGVGaWVsZHMgPSBzICsgInF1ZXJ5VGFibGVGaWVsZHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHF1ZXJ5VGFibGVSZWZyZXNoID0gcyArICJxdWVyeVRhYmxlUmVmcmVzaCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgciA9IHMgKyAiciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmFmID0gcyArICJyYWYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJhbmdlUHIgPSBzICsgInJhbmdlUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJhbmdlU2V0ID0gcyArICJyYW5nZVNldCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmFuZ2VTZXRzID0gcyArICJyYW5nZVNldHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJjID0gcyArICJyYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmNjID0gcyArICJyY2MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJjZnQgPSBzICsgInJjZnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJjbXQgPSBzICsgInJjbXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJjdiA9IHMgKyAicmN2IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZG4gPSBzICsgInJkbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVmZXJlbmNlID0gcyArICJyZWZlcmVuY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlZmVyZW5jZXMgPSBzICsgInJlZmVyZW5jZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJldmlld2VkID0gcyArICJyZXZpZXdlZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmV2aWV3ZWRMaXN0ID0gcyArICJyZXZpZXdlZExpc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJldmlzaW9ucyA9IHMgKyAicmV2aXNpb25zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZm10ID0gcyArICJyZm10IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByRm9udCA9IHMgKyAickZvbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJnYkNvbG9yID0gcyArICJyZ2JDb2xvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmlnaHQgPSBzICsgInJpZ2h0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByaXMgPSBzICsgInJpcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcm0gPSBzICsgInJtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByb3cgPSBzICsgInJvdyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcm93QnJlYWtzID0gcyArICJyb3dCcmVha3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJvd0ZpZWxkcyA9IHMgKyAicm93RmllbGRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByb3dIaWVyYXJjaGllc1VzYWdlID0gcyArICJyb3dIaWVyYXJjaGllc1VzYWdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByb3dIaWVyYXJjaHlVc2FnZSA9IHMgKyAicm93SGllcmFyY2h5VXNhZ2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJvd0l0ZW1zID0gcyArICJyb3dJdGVtcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgclBoID0gcyArICJyUGgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJQciA9IHMgKyAiclByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBycXQgPSBzICsgInJxdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcnJjID0gcyArICJycmMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJzbm0gPSBzICsgInJzbm0iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9zID0gcyArICJzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzY2VuYXJpbyA9IHMgKyAic2NlbmFyaW8iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNjZW5hcmlvcyA9IHMgKyAic2NlbmFyaW9zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzY2hlbWUgPSBzICsgInNjaGVtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2VsZWN0aW9uID0gcyArICJzZWxlY3Rpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNlcnZlckZvcm1hdCA9IHMgKyAic2VydmVyRm9ybWF0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzZXJ2ZXJGb3JtYXRzID0gcyArICJzZXJ2ZXJGb3JtYXRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzZXQgPSBzICsgInNldCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2V0cyA9IHMgKyAic2V0cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hhZG93ID0gcyArICJzaGFkb3ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNoYXJlZEl0ZW1zID0gcyArICJzaGFyZWRJdGVtcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hlZXQgPSBzICsgInNoZWV0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaGVldENhbGNQciA9IHMgKyAic2hlZXRDYWxjUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNoZWV0RGF0YSA9IHMgKyAic2hlZXREYXRhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaGVldERhdGFTZXQgPSBzICsgInNoZWV0RGF0YVNldCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hlZXRGb3JtYXRQciA9IHMgKyAic2hlZXRGb3JtYXRQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hlZXRJZCA9IHMgKyAic2hlZXRJZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hlZXRJZE1hcCA9IHMgKyAic2hlZXRJZE1hcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hlZXROYW1lID0gcyArICJzaGVldE5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNoZWV0TmFtZXMgPSBzICsgInNoZWV0TmFtZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNoZWV0UHIgPSBzICsgInNoZWV0UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNoZWV0UHJvdGVjdGlvbiA9IHMgKyAic2hlZXRQcm90ZWN0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaGVldHMgPSBzICsgInNoZWV0cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hlZXRWaWV3ID0gcyArICJzaGVldFZpZXciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNoZWV0Vmlld3MgPSBzICsgInNoZWV0Vmlld3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNpID0gcyArICJzaSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2luZ2xlWG1sQ2VsbCA9IHMgKyAic2luZ2xlWG1sQ2VsbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2luZ2xlWG1sQ2VsbHMgPSBzICsgInNpbmdsZVhtbENlbGxzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbWFydFRhZ3MgPSBzICsgInNtYXJ0VGFncyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc29ydEJ5VHVwbGUgPSBzICsgInNvcnRCeVR1cGxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzb3J0Q29uZGl0aW9uID0gcyArICJzb3J0Q29uZGl0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzb3J0U3RhdGUgPSBzICsgInNvcnRTdGF0ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3N0ID0gcyArICJzc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0b3AgPSBzICsgInN0b3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0cCA9IHMgKyAic3RwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdHJpa2UgPSBzICsgInN0cmlrZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3R5bGVTaGVldCA9IHMgKyAic3R5bGVTaGVldCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3ogPSBzICsgInN6IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0ID0gcyArICJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YWJDb2xvciA9IHMgKyAidGFiQ29sb3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRhYmxlID0gcyArICJ0YWJsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGFibGVDb2x1bW4gPSBzICsgInRhYmxlQ29sdW1uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YWJsZUNvbHVtbnMgPSBzICsgInRhYmxlQ29sdW1ucyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGFibGVQYXJ0ID0gcyArICJ0YWJsZVBhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRhYmxlUGFydHMgPSBzICsgInRhYmxlUGFydHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRhYmxlcyA9IHMgKyAidGFibGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YWJsZVN0eWxlID0gcyArICJ0YWJsZVN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YWJsZVN0eWxlRWxlbWVudCA9IHMgKyAidGFibGVTdHlsZUVsZW1lbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRhYmxlU3R5bGVJbmZvID0gcyArICJ0YWJsZVN0eWxlSW5mbyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGFibGVTdHlsZXMgPSBzICsgInRhYmxlU3R5bGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0ZXh0ID0gcyArICJ0ZXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0ZXh0RmllbGQgPSBzICsgInRleHRGaWVsZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGV4dEZpZWxkcyA9IHMgKyAidGV4dEZpZWxkcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGV4dFByID0gcyArICJ0ZXh0UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRvID0gcyArICJ0byI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdG9wID0gcyArICJ0b3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRvcDEwID0gcyArICJ0b3AxMCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdG90YWxzUm93Rm9ybXVsYSA9IHMgKyAidG90YWxzUm93Rm9ybXVsYSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHAgPSBzICsgInRwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0cGwgPSBzICsgInRwbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHBscyA9IHMgKyAidHBscyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHIgPSBzICsgInRyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0dXBsZUNhY2hlID0gcyArICJ0dXBsZUNhY2hlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1ID0gcyArICJ1IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1bmRvID0gcyArICJ1bmRvIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1c2VySW5mbyA9IHMgKyAidXNlckluZm8iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVzZXJzID0gcyArICJ1c2VycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdiA9IHMgKyAidiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmFsID0gcyArICJ2YWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZhbHVlID0gcyArICJ2YWx1ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmFsdWVNZXRhZGF0YSA9IHMgKyAidmFsdWVNZXRhZGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmFsdWVzID0gcyArICJ2YWx1ZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZlcnRBbGlnbiA9IHMgKyAidmVydEFsaWduIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2ZXJ0aWNhbCA9IHMgKyAidmVydGljYWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZvbFR5cGUgPSBzICsgInZvbFR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZvbFR5cGVzID0gcyArICJ2b2xUeXBlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgd2ViUHIgPSBzICsgIndlYlByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3ZWJQdWJsaXNoSXRlbSA9IHMgKyAid2ViUHVibGlzaEl0ZW0iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdlYlB1Ymxpc2hJdGVtcyA9IHMgKyAid2ViUHVibGlzaEl0ZW1zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3b3Jrc2hlZXQgPSBzICsgIndvcmtzaGVldCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgd29ya3NoZWV0RXgxNCA9IHMgKyAid29ya3NoZWV0RXgxNCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgd29ya3NoZWV0U291cmNlID0gcyArICJ3b3Jrc2hlZXRTb3VyY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHggPSBzICsgIngiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHhmID0gcyArICJ4ZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgeG1sQ2VsbFByID0gcyArICJ4bWxDZWxsUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHhtbENvbHVtblByID0gcyArICJ4bWxDb2x1bW5QciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgeG1sUHIgPSBzICsgInhtbFByIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNMCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2Ugc2wgPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zY2hlbWFMaWJyYXJ5LzIwMDYvbWFpbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWFuaWZlc3RMb2NhdGlvbiA9IHNsICsgIm1hbmlmZXN0TG9jYXRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNjaGVtYSA9IHNsICsgInNjaGVtYSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2NoZW1hTGlicmFyeSA9IHNsICsgInNjaGVtYUxpYnJhcnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVyaSA9IHNsICsgInVyaSI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTTEUKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWVzcGFjZSBzbGUgPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL2RyYXdpbmcvMjAxMC9zbGljZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNsaWNlciA9IHNsZSArICJzbGljZXIiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVk1MCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2Ugdm1sID0KKyAgICAgICAgICAgICJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXJjID0gdm1sICsgImFyYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmFja2dyb3VuZCA9IHZtbCArICJiYWNrZ3JvdW5kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjdXJ2ZSA9IHZtbCArICJjdXJ2ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZXh0ID0gdm1sICsgImV4dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZiA9IHZtbCArICJmIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWxsID0gdm1sICsgImZpbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvcm11bGFzID0gdm1sICsgImZvcm11bGFzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncm91cCA9IHZtbCArICJncm91cCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaCA9IHZtbCArICJoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoYW5kbGVzID0gdm1sICsgImhhbmRsZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGltYWdlID0gdm1sICsgImltYWdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbWFnZWRhdGEgPSB2bWwgKyAiaW1hZ2VkYXRhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsaW5lID0gdm1sICsgImxpbmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG92YWwgPSB2bWwgKyAib3ZhbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGF0aCA9IHZtbCArICJwYXRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwb2x5bGluZSA9IHZtbCArICJwb2x5bGluZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVjdCA9IHZtbCArICJyZWN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByb3VuZHJlY3QgPSB2bWwgKyAicm91bmRyZWN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaGFkb3cgPSB2bWwgKyAic2hhZG93IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaGFwZSA9IHZtbCArICJzaGFwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hhcGV0eXBlID0gdm1sICsgInNoYXBldHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3Ryb2tlID0gdm1sICsgInN0cm9rZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGV4dGJveCA9IHZtbCArICJ0ZXh0Ym94IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0ZXh0cGF0aCA9IHZtbCArICJ0ZXh0cGF0aCI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWVAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIHZ0ID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9kb2NQcm9wc1ZUeXBlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgX2Jvb2wgPSB2dCArICJib29sIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWxldGltZSA9IHZ0ICsgImZpbGV0aW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpNCA9IHZ0ICsgImk0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBscHN0ciA9IHZ0ICsgImxwc3RyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBscHdzdHIgPSB2dCArICJscHdzdHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHI4ID0gdnQgKyAicjgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZhcmlhbnQgPSB2dCArICJ2YXJpYW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2ZWN0b3IgPSB2dCArICJ2ZWN0b3IiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIHcgPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWJzdHJhY3ROdW0gPSB3ICsgImFic3RyYWN0TnVtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhYnN0cmFjdE51bUlkID0gdyArICJhYnN0cmFjdE51bUlkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhY2NlbnQxID0gdyArICJhY2NlbnQxIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhY2NlbnQyID0gdyArICJhY2NlbnQyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhY2NlbnQzID0gdyArICJhY2NlbnQzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhY2NlbnQ0ID0gdyArICJhY2NlbnQ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhY2NlbnQ1ID0gdyArICJhY2NlbnQ1IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhY2NlbnQ2ID0gdyArICJhY2NlbnQ2IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhY3RpdmVSZWNvcmQgPSB3ICsgImFjdGl2ZVJlY29yZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWN0aXZlV3JpdGluZ1N0eWxlID0gdyArICJhY3RpdmVXcml0aW5nU3R5bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFjdHVhbFBnID0gdyArICJhY3R1YWxQZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWRkcmVzc0ZpZWxkTmFtZSA9IHcgKyAiYWRkcmVzc0ZpZWxkTmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWRqdXN0TGluZUhlaWdodEluVGFibGUgPSB3ICsgImFkanVzdExpbmVIZWlnaHRJblRhYmxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhZGp1c3RSaWdodEluZCA9IHcgKyAiYWRqdXN0UmlnaHRJbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFmdGVyID0gdyArICJhZnRlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWZ0ZXJBdXRvc3BhY2luZyA9IHcgKyAiYWZ0ZXJBdXRvc3BhY2luZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWZ0ZXJMaW5lcyA9IHcgKyAiYWZ0ZXJMaW5lcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWxnSWRFeHQgPSB3ICsgImFsZ0lkRXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbGdJZEV4dFNvdXJjZSA9IHcgKyAiYWxnSWRFeHRTb3VyY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFsaWFzID0gdyArICJhbGlhcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWxpYXNlcyA9IHcgKyAiYWxpYXNlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWxpZ25Cb3JkZXJzQW5kRWRnZXMgPSB3ICsgImFsaWduQm9yZGVyc0FuZEVkZ2VzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbGlnbm1lbnQgPSB3ICsgImFsaWdubWVudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWxpZ25UYWJsZXNSb3dCeVJvdyA9IHcgKyAiYWxpZ25UYWJsZXNSb3dCeVJvdyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWxsb3dQTkcgPSB3ICsgImFsbG93UE5HIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbGxvd1NwYWNlT2ZTYW1lU3R5bGVJblRhYmxlID0gdyArICJhbGxvd1NwYWNlT2ZTYW1lU3R5bGVJblRhYmxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbHRDaHVuayA9IHcgKyAiYWx0Q2h1bmsiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFsdENodW5rUHIgPSB3ICsgImFsdENodW5rUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFsdE5hbWUgPSB3ICsgImFsdE5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFsd2F5c01lcmdlRW1wdHlOYW1lc3BhY2UgPSB3ICsgImFsd2F5c01lcmdlRW1wdHlOYW1lc3BhY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFsd2F5c1Nob3dQbGFjZWhvbGRlclRleHQgPSB3ICsgImFsd2F5c1Nob3dQbGFjZWhvbGRlclRleHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFuY2hvciA9IHcgKyAiYW5jaG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbmNob3JMb2NrID0gdyArICJhbmNob3JMb2NrIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbm5vdGF0aW9uUmVmID0gdyArICJhbm5vdGF0aW9uUmVmIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhcHBseUJyZWFraW5nUnVsZXMgPSB3ICsgImFwcGx5QnJlYWtpbmdSdWxlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXBwTmFtZSA9IHcgKyAiYXBwTmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXNjaWkgPSB3ICsgImFzY2lpIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhc2NpaVRoZW1lID0gdyArICJhc2NpaVRoZW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhdHRhY2hlZFNjaGVtYSA9IHcgKyAiYXR0YWNoZWRTY2hlbWEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGF0dGFjaGVkVGVtcGxhdGUgPSB3ICsgImF0dGFjaGVkVGVtcGxhdGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGF0dHIgPSB3ICsgImF0dHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGF1dGhvciA9IHcgKyAiYXV0aG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhdXRvZml0VG9GaXJzdEZpeGVkV2lkdGhDZWxsID0gdyArICJhdXRvZml0VG9GaXJzdEZpeGVkV2lkdGhDZWxsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhdXRvRm9ybWF0T3ZlcnJpZGUgPSB3ICsgImF1dG9Gb3JtYXRPdmVycmlkZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXV0b0h5cGhlbmF0aW9uID0gdyArICJhdXRvSHlwaGVuYXRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGF1dG9SZWRlZmluZSA9IHcgKyAiYXV0b1JlZGVmaW5lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhdXRvU3BhY2VERSA9IHcgKyAiYXV0b1NwYWNlREUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGF1dG9TcGFjZUROID0gdyArICJhdXRvU3BhY2VETiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYXV0b1NwYWNlTGlrZVdvcmQ5NSA9IHcgKyAiYXV0b1NwYWNlTGlrZVdvcmQ5NSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYiA9IHcgKyAiYiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmFja2dyb3VuZCA9IHcgKyAiYmFja2dyb3VuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmFsYW5jZVNpbmdsZUJ5dGVEb3VibGVCeXRlV2lkdGggPSB3ICsgImJhbGFuY2VTaW5nbGVCeXRlRG91YmxlQnl0ZVdpZHRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiYXIgPSB3ICsgImJhciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmFzZWRPbiA9IHcgKyAiYmFzZWRPbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYkNzID0gdyArICJiQ3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJkciA9IHcgKyAiYmRyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiZWZvcmUgPSB3ICsgImJlZm9yZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmVmb3JlQXV0b3NwYWNpbmcgPSB3ICsgImJlZm9yZUF1dG9zcGFjaW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiZWZvcmVMaW5lcyA9IHcgKyAiYmVmb3JlTGluZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJlaGF2aW9yID0gdyArICJiZWhhdmlvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmVoYXZpb3JzID0gdyArICJiZWhhdmlvcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJldHdlZW4gPSB3ICsgImJldHdlZW4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJnMSA9IHcgKyAiYmcxIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiZzIgPSB3ICsgImJnMiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmlibGlvZ3JhcGh5ID0gdyArICJiaWJsaW9ncmFwaHkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJpZGkgPSB3ICsgImJpZGkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJpZGlWaXN1YWwgPSB3ICsgImJpZGlWaXN1YWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJsb2NrUXVvdGUgPSB3ICsgImJsb2NrUXVvdGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJvZHkgPSB3ICsgImJvZHkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJvZHlEaXYgPSB3ICsgImJvZHlEaXYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJvb2tGb2xkUHJpbnRpbmcgPSB3ICsgImJvb2tGb2xkUHJpbnRpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJvb2tGb2xkUHJpbnRpbmdTaGVldHMgPSB3ICsgImJvb2tGb2xkUHJpbnRpbmdTaGVldHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJvb2tGb2xkUmV2UHJpbnRpbmcgPSB3ICsgImJvb2tGb2xkUmV2UHJpbnRpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJvb2ttYXJrRW5kID0gdyArICJib29rbWFya0VuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm9va21hcmtTdGFydCA9IHcgKyAiYm9va21hcmtTdGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm9yZGVyc0RvTm90U3Vycm91bmRGb290ZXIgPSB3ICsgImJvcmRlcnNEb05vdFN1cnJvdW5kRm9vdGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBib3JkZXJzRG9Ob3RTdXJyb3VuZEhlYWRlciA9IHcgKyAiYm9yZGVyc0RvTm90U3Vycm91bmRIZWFkZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJvdHRvbSA9IHcgKyAiYm90dG9tIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBib3R0b21Gcm9tVGV4dCA9IHcgKyAiYm90dG9tRnJvbVRleHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJyID0gdyArICJiciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2FjaGVkQ29sQmFsYW5jZSA9IHcgKyAiY2FjaGVkQ29sQmFsYW5jZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2FsY09uRXhpdCA9IHcgKyAiY2FsY09uRXhpdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2FsZW5kYXIgPSB3ICsgImNhbGVuZGFyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjYW50U3BsaXQgPSB3ICsgImNhbnRTcGxpdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2FwcyA9IHcgKyAiY2FwcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2F0ZWdvcnkgPSB3ICsgImNhdGVnb3J5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjZWxsRGVsID0gdyArICJjZWxsRGVsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjZWxsSW5zID0gdyArICJjZWxsSW5zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjZWxsTWVyZ2UgPSB3ICsgImNlbGxNZXJnZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2hhcFNlcCA9IHcgKyAiY2hhcFNlcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2hhcFN0eWxlID0gdyArICJjaGFwU3R5bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9jaGFyID0gdyArICJjaGFyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjaGFyYWN0ZXJTcGFjaW5nQ29udHJvbCA9IHcgKyAiY2hhcmFjdGVyU3BhY2luZ0NvbnRyb2wiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNoYXJzZXQgPSB3ICsgImNoYXJzZXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNoYXJTcGFjZSA9IHcgKyAiY2hhclNwYWNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjaGVja0JveCA9IHcgKyAiY2hlY2tCb3giOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9jaGVja2VkID0gdyArICJjaGVja2VkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjaGVja0Vycm9ycyA9IHcgKyAiY2hlY2tFcnJvcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNoZWNrU3R5bGUgPSB3ICsgImNoZWNrU3R5bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNpdGF0aW9uID0gdyArICJjaXRhdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2xlYXIgPSB3ICsgImNsZWFyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjbGlja0FuZFR5cGVTdHlsZSA9IHcgKyAiY2xpY2tBbmRUeXBlU3R5bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNsclNjaGVtZU1hcHBpbmcgPSB3ICsgImNsclNjaGVtZU1hcHBpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNuZlN0eWxlID0gdyArICJjbmZTdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29kZSA9IHcgKyAiY29kZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29sID0gdyArICJjb2wiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbERlbGltID0gdyArICJjb2xEZWxpbSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29sRmlyc3QgPSB3ICsgImNvbEZpcnN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb2xMYXN0ID0gdyArICJjb2xMYXN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb2xvciA9IHcgKyAiY29sb3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbHMgPSB3ICsgImNvbHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbHVtbiA9IHcgKyAiY29sdW1uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb21iaW5lID0gdyArICJjb21iaW5lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb21iaW5lQnJhY2tldHMgPSB3ICsgImNvbWJpbmVCcmFja2V0cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29tYm9Cb3ggPSB3ICsgImNvbWJvQm94IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb21tZW50ID0gdyArICJjb21tZW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb21tZW50UmFuZ2VFbmQgPSB3ICsgImNvbW1lbnRSYW5nZUVuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29tbWVudFJhbmdlU3RhcnQgPSB3ICsgImNvbW1lbnRSYW5nZVN0YXJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb21tZW50UmVmZXJlbmNlID0gdyArICJjb21tZW50UmVmZXJlbmNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb21tZW50cyA9IHcgKyAiY29tbWVudHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbXBhdCA9IHcgKyAiY29tcGF0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb21wYXRTZXR0aW5nID0gdyArICJjb21wYXRTZXR0aW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb25uZWN0U3RyaW5nID0gdyArICJjb25uZWN0U3RyaW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb25zZWN1dGl2ZUh5cGhlbkxpbWl0ID0gdyArICJjb25zZWN1dGl2ZUh5cGhlbkxpbWl0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb250ZW50UGFydCA9IHcgKyAiY29udGVudFBhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbnRleHR1YWxTcGFjaW5nID0gdyArICJjb250ZXh0dWFsU3BhY2luZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29udGludWF0aW9uU2VwYXJhdG9yID0gdyArICJjb250aW51YXRpb25TZXBhcmF0b3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbnRyb2wgPSB3ICsgImNvbnRyb2wiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvbnZNYWlsTWVyZ2VFc2MgPSB3ICsgImNvbnZNYWlsTWVyZ2VFc2MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNvdW50ID0gdyArICJjb3VudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY291bnRCeSA9IHcgKyAiY291bnRCeSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3IgPSB3ICsgImNyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjcnlwdEFsZ29yaXRobUNsYXNzID0gdyArICJjcnlwdEFsZ29yaXRobUNsYXNzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjcnlwdEFsZ29yaXRobVNpZCA9IHcgKyAiY3J5cHRBbGdvcml0aG1TaWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNyeXB0QWxnb3JpdGhtVHlwZSA9IHcgKyAiY3J5cHRBbGdvcml0aG1UeXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjcnlwdFByb3ZpZGVyID0gdyArICJjcnlwdFByb3ZpZGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjcnlwdFByb3ZpZGVyVHlwZSA9IHcgKyAiY3J5cHRQcm92aWRlclR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNyeXB0UHJvdmlkZXJUeXBlRXh0ID0gdyArICJjcnlwdFByb3ZpZGVyVHlwZUV4dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3J5cHRQcm92aWRlclR5cGVFeHRTb3VyY2UgPSB3ICsgImNyeXB0UHJvdmlkZXJUeXBlRXh0U291cmNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjcnlwdFNwaW5Db3VudCA9IHcgKyAiY3J5cHRTcGluQ291bnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNzID0gdyArICJjcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3NiMCA9IHcgKyAiY3NiMCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3NiMSA9IHcgKyAiY3NiMSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3N0aGVtZSA9IHcgKyAiY3N0aGVtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3VzdG9tTWFya0ZvbGxvd3MgPSB3ICsgImN1c3RvbU1hcmtGb2xsb3dzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjdXN0b21TdHlsZSA9IHcgKyAiY3VzdG9tU3R5bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN1c3RvbVhtbCA9IHcgKyAiY3VzdG9tWG1sIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjdXN0b21YbWxEZWxSYW5nZUVuZCA9IHcgKyAiY3VzdG9tWG1sRGVsUmFuZ2VFbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN1c3RvbVhtbERlbFJhbmdlU3RhcnQgPSB3ICsgImN1c3RvbVhtbERlbFJhbmdlU3RhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN1c3RvbVhtbEluc1JhbmdlRW5kID0gdyArICJjdXN0b21YbWxJbnNSYW5nZUVuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3VzdG9tWG1sSW5zUmFuZ2VTdGFydCA9IHcgKyAiY3VzdG9tWG1sSW5zUmFuZ2VTdGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3VzdG9tWG1sTW92ZUZyb21SYW5nZUVuZCA9IHcgKyAiY3VzdG9tWG1sTW92ZUZyb21SYW5nZUVuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3VzdG9tWG1sTW92ZUZyb21SYW5nZVN0YXJ0ID0gdyArICJjdXN0b21YbWxNb3ZlRnJvbVJhbmdlU3RhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN1c3RvbVhtbE1vdmVUb1JhbmdlRW5kID0gdyArICJjdXN0b21YbWxNb3ZlVG9SYW5nZUVuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3VzdG9tWG1sTW92ZVRvUmFuZ2VTdGFydCA9IHcgKyAiY3VzdG9tWG1sTW92ZVRvUmFuZ2VTdGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY3VzdG9tWG1sUHIgPSB3ICsgImN1c3RvbVhtbFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkYXRhQmluZGluZyA9IHcgKyAiZGF0YUJpbmRpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRhdGFTb3VyY2UgPSB3ICsgImRhdGFTb3VyY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRhdGFUeXBlID0gdyArICJkYXRhVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGF0ZSA9IHcgKyAiZGF0ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGF0ZUZvcm1hdCA9IHcgKyAiZGF0ZUZvcm1hdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGF5TG9uZyA9IHcgKyAiZGF5TG9uZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGF5U2hvcnQgPSB3ICsgImRheVNob3J0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZExpc3QgPSB3ICsgImRkTGlzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGVjaW1hbFN5bWJvbCA9IHcgKyAiZGVjaW1hbFN5bWJvbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgX2RlZmF1bHQgPSB3ICsgImRlZmF1bHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlZmF1bHRUYWJsZVN0eWxlID0gdyArICJkZWZhdWx0VGFibGVTdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGVmYXVsdFRhYlN0b3AgPSB3ICsgImRlZmF1bHRUYWJTdG9wIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZWZMb2NrZWRTdGF0ZSA9IHcgKyAiZGVmTG9ja2VkU3RhdGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlZlFGb3JtYXQgPSB3ICsgImRlZlFGb3JtYXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlZlNlbWlIaWRkZW4gPSB3ICsgImRlZlNlbWlIaWRkZW4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlZlVJUHJpb3JpdHkgPSB3ICsgImRlZlVJUHJpb3JpdHkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlZlVuaGlkZVdoZW5Vc2VkID0gdyArICJkZWZVbmhpZGVXaGVuVXNlZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGVsID0gdyArICJkZWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlbEluc3RyVGV4dCA9IHcgKyAiZGVsSW5zdHJUZXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZWxUZXh0ID0gdyArICJkZWxUZXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkZXNjcmlwdGlvbiA9IHcgKyAiZGVzY3JpcHRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRlc3RpbmF0aW9uID0gdyArICJkZXN0aW5hdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlyID0gdyArICJkaXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpcnR5ID0gdyArICJkaXJ0eSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlzcGxhY2VkQnlDdXN0b21YbWwgPSB3ICsgImRpc3BsYWNlZEJ5Q3VzdG9tWG1sIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkaXNwbGF5ID0gdyArICJkaXNwbGF5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkaXNwbGF5QmFja2dyb3VuZFNoYXBlID0gdyArICJkaXNwbGF5QmFja2dyb3VuZFNoYXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkaXNwbGF5SGFuZ3VsRml4ZWRXaWR0aCA9IHcgKyAiZGlzcGxheUhhbmd1bEZpeGVkV2lkdGgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpc3BsYXlIb3Jpem9udGFsRHJhd2luZ0dyaWRFdmVyeSA9IHcgKyAiZGlzcGxheUhvcml6b250YWxEcmF3aW5nR3JpZEV2ZXJ5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkaXNwbGF5VGV4dCA9IHcgKyAiZGlzcGxheVRleHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpc3BsYXlWZXJ0aWNhbERyYXdpbmdHcmlkRXZlcnkgPSB3ICsgImRpc3BsYXlWZXJ0aWNhbERyYXdpbmdHcmlkRXZlcnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpc3RhbmNlID0gdyArICJkaXN0YW5jZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGl2ID0gdyArICJkaXYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpdkJkciA9IHcgKyAiZGl2QmRyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkaXZJZCA9IHcgKyAiZGl2SWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpdnMgPSB3ICsgImRpdnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpdnNDaGlsZCA9IHcgKyAiZGl2c0NoaWxkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkbGxWZXJzaW9uID0gdyArICJkbGxWZXJzaW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkb2NEZWZhdWx0cyA9IHcgKyAiZG9jRGVmYXVsdHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvY0dyaWQgPSB3ICsgImRvY0dyaWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvY0xvY2F0aW9uID0gdyArICJkb2NMb2NhdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9jUGFydCA9IHcgKyAiZG9jUGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9jUGFydEJvZHkgPSB3ICsgImRvY1BhcnRCb2R5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkb2NQYXJ0Q2F0ZWdvcnkgPSB3ICsgImRvY1BhcnRDYXRlZ29yeSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9jUGFydEdhbGxlcnkgPSB3ICsgImRvY1BhcnRHYWxsZXJ5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkb2NQYXJ0TGlzdCA9IHcgKyAiZG9jUGFydExpc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvY1BhcnRPYmogPSB3ICsgImRvY1BhcnRPYmoiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvY1BhcnRQciA9IHcgKyAiZG9jUGFydFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkb2NQYXJ0cyA9IHcgKyAiZG9jUGFydHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvY1BhcnRVbmlxdWUgPSB3ICsgImRvY1BhcnRVbmlxdWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvY3VtZW50ID0gdyArICJkb2N1bWVudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9jdW1lbnRQcm90ZWN0aW9uID0gdyArICJkb2N1bWVudFByb3RlY3Rpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvY3VtZW50VHlwZSA9IHcgKyAiZG9jdW1lbnRUeXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkb2NWYXIgPSB3ICsgImRvY1ZhciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9jVmFycyA9IHcgKyAiZG9jVmFycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9Ob3RBdXRvQ29tcHJlc3NQaWN0dXJlcyA9IHcgKyAiZG9Ob3RBdXRvQ29tcHJlc3NQaWN0dXJlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9Ob3RBdXRvZml0Q29uc3RyYWluZWRUYWJsZXMgPSB3ICsgImRvTm90QXV0b2ZpdENvbnN0cmFpbmVkVGFibGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkb05vdEJyZWFrQ29uc3RyYWluZWRGb3JjZWRUYWJsZSA9IHcgKyAiZG9Ob3RCcmVha0NvbnN0cmFpbmVkRm9yY2VkVGFibGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvTm90QnJlYWtXcmFwcGVkVGFibGVzID0gdyArICJkb05vdEJyZWFrV3JhcHBlZFRhYmxlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9Ob3REZW1hcmNhdGVJbnZhbGlkWG1sID0gdyArICJkb05vdERlbWFyY2F0ZUludmFsaWRYbWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvTm90RGlzcGxheVBhZ2VCb3VuZGFyaWVzID0gdyArICJkb05vdERpc3BsYXlQYWdlQm91bmRhcmllcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9Ob3RFbWJlZFNtYXJ0VGFncyA9IHcgKyAiZG9Ob3RFbWJlZFNtYXJ0VGFncyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9Ob3RFeHBhbmRTaGlmdFJldHVybiA9IHcgKyAiZG9Ob3RFeHBhbmRTaGlmdFJldHVybiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9Ob3RIeXBoZW5hdGVDYXBzID0gdyArICJkb05vdEh5cGhlbmF0ZUNhcHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvTm90SW5jbHVkZVN1YmRvY3NJblN0YXRzID0gdyArICJkb05vdEluY2x1ZGVTdWJkb2NzSW5TdGF0cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9Ob3RMZWF2ZUJhY2tzbGFzaEFsb25lID0gdyArICJkb05vdExlYXZlQmFja3NsYXNoQWxvbmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvTm90T3JnYW5pemVJbkZvbGRlciA9IHcgKyAiZG9Ob3RPcmdhbml6ZUluRm9sZGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkb05vdFJlbHlPbkNTUyA9IHcgKyAiZG9Ob3RSZWx5T25DU1MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvTm90U2F2ZUFzU2luZ2xlRmlsZSA9IHcgKyAiZG9Ob3RTYXZlQXNTaW5nbGVGaWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkb05vdFNoYWRlRm9ybURhdGEgPSB3ICsgImRvTm90U2hhZGVGb3JtRGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9Ob3RTbmFwVG9HcmlkSW5DZWxsID0gdyArICJkb05vdFNuYXBUb0dyaWRJbkNlbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvTm90U3VwcHJlc3NCbGFua0xpbmVzID0gdyArICJkb05vdFN1cHByZXNzQmxhbmtMaW5lcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9Ob3RTdXBwcmVzc0luZGVudGF0aW9uID0gdyArICJkb05vdFN1cHByZXNzSW5kZW50YXRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvTm90U3VwcHJlc3NQYXJhZ3JhcGhCb3JkZXJzID0gdyArICJkb05vdFN1cHByZXNzUGFyYWdyYXBoQm9yZGVycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9Ob3RUcmFja0Zvcm1hdHRpbmcgPSB3ICsgImRvTm90VHJhY2tGb3JtYXR0aW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkb05vdFRyYWNrTW92ZXMgPSB3ICsgImRvTm90VHJhY2tNb3ZlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9Ob3RVc2VFYXN0QXNpYW5CcmVha1J1bGVzID0gdyArICJkb05vdFVzZUVhc3RBc2lhbkJyZWFrUnVsZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvTm90VXNlSFRNTFBhcmFncmFwaEF1dG9TcGFjaW5nID0gdyArICJkb05vdFVzZUhUTUxQYXJhZ3JhcGhBdXRvU3BhY2luZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9Ob3RVc2VJbmRlbnRBc051bWJlcmluZ1RhYlN0b3AgPSB3ICsgImRvTm90VXNlSW5kZW50QXNOdW1iZXJpbmdUYWJTdG9wIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkb05vdFVzZUxvbmdGaWxlTmFtZXMgPSB3ICsgImRvTm90VXNlTG9uZ0ZpbGVOYW1lcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9Ob3RVc2VNYXJnaW5zRm9yRHJhd2luZ0dyaWRPcmlnaW4gPSB3ICsgImRvTm90VXNlTWFyZ2luc0ZvckRyYXdpbmdHcmlkT3JpZ2luIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkb05vdFZhbGlkYXRlQWdhaW5zdFNjaGVtYSA9IHcgKyAiZG9Ob3RWYWxpZGF0ZUFnYWluc3RTY2hlbWEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvTm90VmVydEFsaWduQ2VsbFdpdGhTcCA9IHcgKyAiZG9Ob3RWZXJ0QWxpZ25DZWxsV2l0aFNwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkb05vdFZlcnRBbGlnbkluVHhieCA9IHcgKyAiZG9Ob3RWZXJ0QWxpZ25JblR4YngiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRvTm90V3JhcFRleHRXaXRoUHVuY3QgPSB3ICsgImRvTm90V3JhcFRleHRXaXRoUHVuY3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRyYXdpbmcgPSB3ICsgImRyYXdpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRyYXdpbmdHcmlkSG9yaXpvbnRhbE9yaWdpbiA9IHcgKyAiZHJhd2luZ0dyaWRIb3Jpem9udGFsT3JpZ2luIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkcmF3aW5nR3JpZEhvcml6b250YWxTcGFjaW5nID0gdyArICJkcmF3aW5nR3JpZEhvcml6b250YWxTcGFjaW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkcmF3aW5nR3JpZFZlcnRpY2FsT3JpZ2luID0gdyArICJkcmF3aW5nR3JpZFZlcnRpY2FsT3JpZ2luIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkcmF3aW5nR3JpZFZlcnRpY2FsU3BhY2luZyA9IHcgKyAiZHJhd2luZ0dyaWRWZXJ0aWNhbFNwYWNpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRyb3BDYXAgPSB3ICsgImRyb3BDYXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRyb3BEb3duTGlzdCA9IHcgKyAiZHJvcERvd25MaXN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkc3RyaWtlID0gdyArICJkc3RyaWtlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkeGFPcmlnID0gdyArICJkeGFPcmlnIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkeWFPcmlnID0gdyArICJkeWFPcmlnIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBkeW5hbWljQWRkcmVzcyA9IHcgKyAiZHluYW1pY0FkZHJlc3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVhc3RBc2lhID0gdyArICJlYXN0QXNpYSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZWFzdEFzaWFuTGF5b3V0ID0gdyArICJlYXN0QXNpYW5MYXlvdXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVhc3RBc2lhVGhlbWUgPSB3ICsgImVhc3RBc2lhVGhlbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVkID0gdyArICJlZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZWRHcnAgPSB3ICsgImVkR3JwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlZGl0ID0gdyArICJlZGl0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlZmZlY3QgPSB3ICsgImVmZmVjdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZWxlbWVudCA9IHcgKyAiZWxlbWVudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZW0gPSB3ICsgImVtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlbWJlZEJvbGQgPSB3ICsgImVtYmVkQm9sZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZW1iZWRCb2xkSXRhbGljID0gdyArICJlbWJlZEJvbGRJdGFsaWMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVtYmVkSXRhbGljID0gdyArICJlbWJlZEl0YWxpYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZW1iZWRSZWd1bGFyID0gdyArICJlbWJlZFJlZ3VsYXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVtYmVkU3lzdGVtRm9udHMgPSB3ICsgImVtYmVkU3lzdGVtRm9udHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVtYmVkVHJ1ZVR5cGVGb250cyA9IHcgKyAiZW1iZWRUcnVlVHlwZUZvbnRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlbWJvc3MgPSB3ICsgImVtYm9zcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZW5hYmxlZCA9IHcgKyAiZW5hYmxlZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZW5jb2RpbmcgPSB3ICsgImVuY29kaW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlbmRub3RlID0gdyArICJlbmRub3RlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlbmRub3RlUHIgPSB3ICsgImVuZG5vdGVQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZW5kbm90ZVJlZiA9IHcgKyAiZW5kbm90ZVJlZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZW5kbm90ZVJlZmVyZW5jZSA9IHcgKyAiZW5kbm90ZVJlZmVyZW5jZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZW5kbm90ZXMgPSB3ICsgImVuZG5vdGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBlbmZvcmNlbWVudCA9IHcgKyAiZW5mb3JjZW1lbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVudHJ5TWFjcm8gPSB3ICsgImVudHJ5TWFjcm8iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVxdWFsV2lkdGggPSB3ICsgImVxdWFsV2lkdGgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVxdWF0aW9uID0gdyArICJlcXVhdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZXZlbkFuZE9kZEhlYWRlcnMgPSB3ICsgImV2ZW5BbmRPZGRIZWFkZXJzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBleGl0TWFjcm8gPSB3ICsgImV4aXRNYWNybyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmFtaWx5ID0gdyArICJmYW1pbHkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZmRGF0YSA9IHcgKyAiZmZEYXRhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmSGRyID0gdyArICJmSGRyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaWVsZE1hcERhdGEgPSB3ICsgImZpZWxkTWFwRGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmlsbCA9IHcgKyAiZmlsbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmlyc3QgPSB3ICsgImZpcnN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaXJzdENvbHVtbiA9IHcgKyAiZmlyc3RDb2x1bW4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZpcnN0TGluZSA9IHcgKyAiZmlyc3RMaW5lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaXJzdExpbmVDaGFycyA9IHcgKyAiZmlyc3RMaW5lQ2hhcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZpcnN0Um93ID0gdyArICJmaXJzdFJvdyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZml0VGV4dCA9IHcgKyAiZml0VGV4dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZmxhdEJvcmRlcnMgPSB3ICsgImZsYXRCb3JkZXJzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmbGRDaGFyID0gdyArICJmbGRDaGFyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmbGRDaGFyVHlwZSA9IHcgKyAiZmxkQ2hhclR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZsZERhdGEgPSB3ICsgImZsZERhdGEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZsZExvY2sgPSB3ICsgImZsZExvY2siOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZsZFNpbXBsZSA9IHcgKyAiZmxkU2ltcGxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmbXQgPSB3ICsgImZtdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9sbG93ZWRIeXBlcmxpbmsgPSB3ICsgImZvbGxvd2VkSHlwZXJsaW5rIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb250ID0gdyArICJmb250IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb250S2V5ID0gdyArICJmb250S2V5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb250cyA9IHcgKyAiZm9udHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvbnRTeiA9IHcgKyAiZm9udFN6IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb290ZXIgPSB3ICsgImZvb3RlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9vdGVyUmVmZXJlbmNlID0gdyArICJmb290ZXJSZWZlcmVuY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvb3Rub3RlID0gdyArICJmb290bm90ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9vdG5vdGVMYXlvdXRMaWtlV1c4ID0gdyArICJmb290bm90ZUxheW91dExpa2VXVzgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvb3Rub3RlUHIgPSB3ICsgImZvb3Rub3RlUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvb3Rub3RlUmVmID0gdyArICJmb290bm90ZVJlZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9vdG5vdGVSZWZlcmVuY2UgPSB3ICsgImZvb3Rub3RlUmVmZXJlbmNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb290bm90ZXMgPSB3ICsgImZvb3Rub3RlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9yY2VVcGdyYWRlID0gdyArICJmb3JjZVVwZ3JhZGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvcmdldExhc3RUYWJBbGlnbm1lbnQgPSB3ICsgImZvcmdldExhc3RUYWJBbGlnbm1lbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvcm1hdCA9IHcgKyAiZm9ybWF0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb3JtYXR0aW5nID0gdyArICJmb3JtYXR0aW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmb3JtUHJvdCA9IHcgKyAiZm9ybVByb3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZvcm1zRGVzaWduID0gdyArICJmb3Jtc0Rlc2lnbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZnJhbWUgPSB3ICsgImZyYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmcmFtZUxheW91dCA9IHcgKyAiZnJhbWVMYXlvdXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZyYW1lUHIgPSB3ICsgImZyYW1lUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZyYW1lc2V0ID0gdyArICJmcmFtZXNldCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZnJhbWVzZXRTcGxpdGJhciA9IHcgKyAiZnJhbWVzZXRTcGxpdGJhciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZnRyID0gdyArICJmdHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZ1bGxEYXRlID0gdyArICJmdWxsRGF0ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ2FsbGVyeSA9IHcgKyAiZ2FsbGVyeSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ2xvc3NhcnlEb2N1bWVudCA9IHcgKyAiZ2xvc3NhcnlEb2N1bWVudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3JhbW1hciA9IHcgKyAiZ3JhbW1hciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3JpZEFmdGVyID0gdyArICJncmlkQWZ0ZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyaWRCZWZvcmUgPSB3ICsgImdyaWRCZWZvcmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyaWRDb2wgPSB3ICsgImdyaWRDb2wiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyaWRTcGFuID0gdyArICJncmlkU3BhbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3JvdXAgPSB3ICsgImdyb3VwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncm93QXV0b2ZpdCA9IHcgKyAiZ3Jvd0F1dG9maXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGd1aWQgPSB3ICsgImd1aWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGd1dHRlciA9IHcgKyAiZ3V0dGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBndXR0ZXJBdFRvcCA9IHcgKyAiZ3V0dGVyQXRUb3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGggPSB3ICsgImgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhBbmNob3IgPSB3ICsgImhBbmNob3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhhbmdpbmcgPSB3ICsgImhhbmdpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhhbmdpbmdDaGFycyA9IHcgKyAiaGFuZ2luZ0NoYXJzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoQW5zaSA9IHcgKyAiaEFuc2kiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhBbnNpVGhlbWUgPSB3ICsgImhBbnNpVGhlbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhhc2ggPSB3ICsgImhhc2giOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhkciA9IHcgKyAiaGRyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoZHJTaGFwZURlZmF1bHRzID0gdyArICJoZHJTaGFwZURlZmF1bHRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoZWFkZXIgPSB3ICsgImhlYWRlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGVhZGVyUmVmZXJlbmNlID0gdyArICJoZWFkZXJSZWZlcmVuY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhlYWRlclNvdXJjZSA9IHcgKyAiaGVhZGVyU291cmNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoZWxwVGV4dCA9IHcgKyAiaGVscFRleHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhpZGRlbiA9IHcgKyAiaGlkZGVuIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoaWRlR3JhbW1hdGljYWxFcnJvcnMgPSB3ICsgImhpZGVHcmFtbWF0aWNhbEVycm9ycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGlkZU1hcmsgPSB3ICsgImhpZGVNYXJrIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoaWRlU3BlbGxpbmdFcnJvcnMgPSB3ICsgImhpZGVTcGVsbGluZ0Vycm9ycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGlnaGxpZ2h0ID0gdyArICJoaWdobGlnaHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhpbnQgPSB3ICsgImhpbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhpc3RvcnkgPSB3ICsgImhpc3RvcnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhNZXJnZSA9IHcgKyAiaE1lcmdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBob3J6QW5jaG9yID0gdyArICJob3J6QW5jaG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBocHMgPSB3ICsgImhwcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaHBzQmFzZVRleHQgPSB3ICsgImhwc0Jhc2VUZXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBocHNSYWlzZSA9IHcgKyAiaHBzUmFpc2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhSdWxlID0gdyArICJoUnVsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaFNwYWNlID0gdyArICJoU3BhY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGh5cGVybGluayA9IHcgKyAiaHlwZXJsaW5rIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBoeXBoZW5hdGlvblpvbmUgPSB3ICsgImh5cGhlbmF0aW9uWm9uZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaSA9IHcgKyAiaSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaUNzID0gdyArICJpQ3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGlkID0gdyArICJpZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaWdub3JlTWl4ZWRDb250ZW50ID0gdyArICJpZ25vcmVNaXhlZENvbnRlbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGlsdmwgPSB3ICsgImlsdmwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGltcHJpbnQgPSB3ICsgImltcHJpbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGluZCA9IHcgKyAiaW5kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbml0aWFscyA9IHcgKyAiaW5pdGlhbHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGlua0Fubm90YXRpb25zID0gdyArICJpbmtBbm5vdGF0aW9ucyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaW5zID0gdyArICJpbnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGluc0RlbCA9IHcgKyAiaW5zRGVsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbnNpZGVIID0gdyArICJpbnNpZGVIIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbnNpZGVWID0gdyArICJpbnNpZGVWIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpbnN0ciA9IHcgKyAiaW5zdHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGluc3RyVGV4dCA9IHcgKyAiaW5zdHJUZXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpc0xnbCA9IHcgKyAiaXNMZ2wiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGpjID0gdyArICJqYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUga2VlcExpbmVzID0gdyArICJrZWVwTGluZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGtlZXBOZXh0ID0gdyArICJrZWVwTmV4dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUga2VybiA9IHcgKyAia2VybiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUga2luc29rdSA9IHcgKyAia2luc29rdSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGFuZyA9IHcgKyAibGFuZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGFzdENvbHVtbiA9IHcgKyAibGFzdENvbHVtbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGFzdFJlbmRlcmVkUGFnZUJyZWFrID0gdyArICJsYXN0UmVuZGVyZWRQYWdlQnJlYWsiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxhc3RWYWx1ZSA9IHcgKyAibGFzdFZhbHVlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsYXN0Um93ID0gdyArICJsYXN0Um93IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsYXRlbnRTdHlsZXMgPSB3ICsgImxhdGVudFN0eWxlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGF5b3V0UmF3VGFibGVXaWR0aCA9IHcgKyAibGF5b3V0UmF3VGFibGVXaWR0aCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGF5b3V0VGFibGVSb3dzQXBhcnQgPSB3ICsgImxheW91dFRhYmxlUm93c0FwYXJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsZWFkZXIgPSB3ICsgImxlYWRlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGVmdCA9IHcgKyAibGVmdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGVmdENoYXJzID0gdyArICJsZWZ0Q2hhcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxlZnRGcm9tVGV4dCA9IHcgKyAibGVmdEZyb21UZXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsZWdhY3kgPSB3ICsgImxlZ2FjeSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGVnYWN5SW5kZW50ID0gdyArICJsZWdhY3lJbmRlbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxlZ2FjeVNwYWNlID0gdyArICJsZWdhY3lTcGFjZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGlkID0gdyArICJsaWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxpbmUgPSB3ICsgImxpbmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxpbmVQaXRjaCA9IHcgKyAibGluZVBpdGNoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsaW5lUnVsZSA9IHcgKyAibGluZVJ1bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxpbmVzID0gdyArICJsaW5lcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGluZVdyYXBMaWtlV29yZDYgPSB3ICsgImxpbmVXcmFwTGlrZVdvcmQ2IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsaW5rID0gdyArICJsaW5rIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsaW5rZWRUb0ZpbGUgPSB3ICsgImxpbmtlZFRvRmlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGlua1N0eWxlcyA9IHcgKyAibGlua1N0eWxlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGlua1RvUXVlcnkgPSB3ICsgImxpbmtUb1F1ZXJ5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsaXN0RW50cnkgPSB3ICsgImxpc3RFbnRyeSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGlzdEl0ZW0gPSB3ICsgImxpc3RJdGVtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsaXN0U2VwYXJhdG9yID0gdyArICJsaXN0U2VwYXJhdG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsbk51bVR5cGUgPSB3ICsgImxuTnVtVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgX2xvY2sgPSB3ICsgImxvY2siOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxvY2tlZCA9IHcgKyAibG9ja2VkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsc2RFeGNlcHRpb24gPSB3ICsgImxzZEV4Y2VwdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbHZsID0gdyArICJsdmwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx2bEpjID0gdyArICJsdmxKYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbHZsT3ZlcnJpZGUgPSB3ICsgImx2bE92ZXJyaWRlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsdmxQaWNCdWxsZXRJZCA9IHcgKyAibHZsUGljQnVsbGV0SWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx2bFJlc3RhcnQgPSB3ICsgImx2bFJlc3RhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGx2bFRleHQgPSB3ICsgImx2bFRleHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1haWxBc0F0dGFjaG1lbnQgPSB3ICsgIm1haWxBc0F0dGFjaG1lbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1haWxNZXJnZSA9IHcgKyAibWFpbE1lcmdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYWlsU3ViamVjdCA9IHcgKyAibWFpbFN1YmplY3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1haW5Eb2N1bWVudFR5cGUgPSB3ICsgIm1haW5Eb2N1bWVudFR5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1hcHBlZE5hbWUgPSB3ICsgIm1hcHBlZE5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1hckJvdHRvbSA9IHcgKyAibWFyQm90dG9tIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYXJIID0gdyArICJtYXJIIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYXJrdXAgPSB3ICsgIm1hcmt1cCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWFyTGVmdCA9IHcgKyAibWFyTGVmdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWFyUmlnaHQgPSB3ICsgIm1hclJpZ2h0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYXJUb3AgPSB3ICsgIm1hclRvcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWFyVyA9IHcgKyAibWFyVyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWF0Y2hTcmMgPSB3ICsgIm1hdGNoU3JjIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtYXhMZW5ndGggPSB3ICsgIm1heExlbmd0aCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWlycm9ySW5kZW50cyA9IHcgKyAibWlycm9ySW5kZW50cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWlycm9yTWFyZ2lucyA9IHcgKyAibWlycm9yTWFyZ2lucyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbW9udGhMb25nID0gdyArICJtb250aExvbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1vbnRoU2hvcnQgPSB3ICsgIm1vbnRoU2hvcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1vdmVGcm9tID0gdyArICJtb3ZlRnJvbSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbW92ZUZyb21SYW5nZUVuZCA9IHcgKyAibW92ZUZyb21SYW5nZUVuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbW92ZUZyb21SYW5nZVN0YXJ0ID0gdyArICJtb3ZlRnJvbVJhbmdlU3RhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1vdmVUbyA9IHcgKyAibW92ZVRvIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtb3ZlVG9SYW5nZUVuZCA9IHcgKyAibW92ZVRvUmFuZ2VFbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG1vdmVUb1JhbmdlU3RhcnQgPSB3ICsgIm1vdmVUb1JhbmdlU3RhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG11bHRpTGV2ZWxUeXBlID0gdyArICJtdWx0aUxldmVsVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbXVsdGlMaW5lID0gdyArICJtdWx0aUxpbmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG13U21hbGxDYXBzID0gdyArICJtd1NtYWxsQ2FwcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbmFtZSA9IHcgKyAibmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbmFtZXNwYWNldXJpID0gdyArICJuYW1lc3BhY2V1cmkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5leHQgPSB3ICsgIm5leHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5sQ2hlY2sgPSB3ICsgIm5sQ2hlY2siOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5vQm9yZGVyID0gdyArICJub0JvcmRlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9CcmVha0h5cGhlbiA9IHcgKyAibm9CcmVha0h5cGhlbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9Db2x1bW5CYWxhbmNlID0gdyArICJub0NvbHVtbkJhbGFuY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5vRW5kbm90ZSA9IHcgKyAibm9FbmRub3RlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBub0V4dHJhTGluZVNwYWNpbmcgPSB3ICsgIm5vRXh0cmFMaW5lU3BhY2luZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9IQmFuZCA9IHcgKyAibm9IQmFuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9MZWFkaW5nID0gdyArICJub0xlYWRpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5vTGluZUJyZWFrc0FmdGVyID0gdyArICJub0xpbmVCcmVha3NBZnRlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9MaW5lQnJlYWtzQmVmb3JlID0gdyArICJub0xpbmVCcmVha3NCZWZvcmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5vUHJvb2YgPSB3ICsgIm5vUHJvb2YiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5vUHVuY3R1YXRpb25LZXJuaW5nID0gdyArICJub1B1bmN0dWF0aW9uS2VybmluZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9SZXNpemVBbGxvd2VkID0gdyArICJub1Jlc2l6ZUFsbG93ZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5vU3BhY2VSYWlzZUxvd2VyID0gdyArICJub1NwYWNlUmFpc2VMb3dlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9UYWJIYW5nSW5kID0gdyArICJub1RhYkhhbmdJbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5vdFRydWVUeXBlID0gdyArICJub3RUcnVlVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9WQmFuZCA9IHcgKyAibm9WQmFuZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbm9XcmFwID0gdyArICJub1dyYXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5zaWQgPSB3ICsgIm5zaWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9udWxsID0gdyArICJudWxsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBudW0gPSB3ICsgIm51bSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnVtYmVyaW5nID0gdyArICJudW1iZXJpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG51bWJlcmluZ0NoYW5nZSA9IHcgKyAibnVtYmVyaW5nQ2hhbmdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBudW1GbXQgPSB3ICsgIm51bUZtdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnVtSWQgPSB3ICsgIm51bUlkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBudW1JZE1hY0F0Q2xlYW51cCA9IHcgKyAibnVtSWRNYWNBdENsZWFudXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG51bVBpY0J1bGxldCA9IHcgKyAibnVtUGljQnVsbGV0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBudW1QaWNCdWxsZXRJZCA9IHcgKyAibnVtUGljQnVsbGV0SWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG51bVByID0gdyArICJudW1QciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnVtUmVzdGFydCA9IHcgKyAibnVtUmVzdGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnVtU3RhcnQgPSB3ICsgIm51bVN0YXJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBudW1TdHlsZUxpbmsgPSB3ICsgIm51bVN0eWxlTGluayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgX29iamVjdCA9IHcgKyAib2JqZWN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvZHNvID0gdyArICJvZHNvIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvZmZzZXRGcm9tID0gdyArICJvZmZzZXRGcm9tIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvTWF0aCA9IHcgKyAib01hdGgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG9wdGltaXplRm9yQnJvd3NlciA9IHcgKyAib3B0aW1pemVGb3JCcm93c2VyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvcmllbnQgPSB3ICsgIm9yaWVudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb3JpZ2luYWwgPSB3ICsgIm9yaWdpbmFsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvdGhlciA9IHcgKyAib3RoZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG91dGxpbmUgPSB3ICsgIm91dGxpbmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG91dGxpbmVMdmwgPSB3ICsgIm91dGxpbmVMdmwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG92ZXJmbG93UHVuY3QgPSB3ICsgIm92ZXJmbG93UHVuY3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHAgPSB3ICsgInAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBhZ2VCcmVha0JlZm9yZSA9IHcgKyAicGFnZUJyZWFrQmVmb3JlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYW5vc2UxID0gdyArICJwYW5vc2UxIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYXBlclNyYyA9IHcgKyAicGFwZXJTcmMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBCZHIgPSB3ICsgInBCZHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBlcmNlbnQgPSB3ICsgInBlcmNlbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBlcm1FbmQgPSB3ICsgInBlcm1FbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBlcm1TdGFydCA9IHcgKyAicGVybVN0YXJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwZXJzb25hbCA9IHcgKyAicGVyc29uYWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBlcnNvbmFsQ29tcG9zZSA9IHcgKyAicGVyc29uYWxDb21wb3NlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwZXJzb25hbFJlcGx5ID0gdyArICJwZXJzb25hbFJlcGx5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwZ0JvcmRlcnMgPSB3ICsgInBnQm9yZGVycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGdNYXIgPSB3ICsgInBnTWFyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwZ051bSA9IHcgKyAicGdOdW0iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBnTnVtVHlwZSA9IHcgKyAicGdOdW1UeXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwZ1N6ID0gdyArICJwZ1N6IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaWN0ID0gdyArICJwaWN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaWN0dXJlID0gdyArICJwaWN0dXJlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwaXRjaCA9IHcgKyAicGl0Y2giOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpeGVsc1BlckluY2ggPSB3ICsgInBpeGVsc1BlckluY2giOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBsYWNlaG9sZGVyID0gdyArICJwbGFjZWhvbGRlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcG9zID0gdyArICJwb3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBvc2l0aW9uID0gdyArICJwb3NpdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcFByID0gdyArICJwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBQckNoYW5nZSA9IHcgKyAicFByQ2hhbmdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwUHJEZWZhdWx0ID0gdyArICJwUHJEZWZhdWx0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcmVmaXhNYXBwaW5ncyA9IHcgKyAicHJlZml4TWFwcGluZ3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByaW50Qm9keVRleHRCZWZvcmVIZWFkZXIgPSB3ICsgInByaW50Qm9keVRleHRCZWZvcmVIZWFkZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByaW50Q29sQmxhY2sgPSB3ICsgInByaW50Q29sQmxhY2siOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByaW50ZXJTZXR0aW5ncyA9IHcgKyAicHJpbnRlclNldHRpbmdzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcmludEZvcm1zRGF0YSA9IHcgKyAicHJpbnRGb3Jtc0RhdGEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByaW50RnJhY3Rpb25hbENoYXJhY3RlcldpZHRoID0gdyArICJwcmludEZyYWN0aW9uYWxDaGFyYWN0ZXJXaWR0aCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJpbnRQb3N0U2NyaXB0T3ZlclRleHQgPSB3ICsgInByaW50UG9zdFNjcmlwdE92ZXJUZXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcmludFR3b09uT25lID0gdyArICJwcmludFR3b09uT25lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcm9vZkVyciA9IHcgKyAicHJvb2ZFcnIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByb29mU3RhdGUgPSB3ICsgInByb29mU3RhdGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBTdHlsZSA9IHcgKyAicFN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwdGFiID0gdyArICJwdGFiIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBxRm9ybWF0ID0gdyArICJxRm9ybWF0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBxdWVyeSA9IHcgKyAicXVlcnkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHIgPSB3ICsgInIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlYWRNb2RlSW5rTG9ja0Rvd24gPSB3ICsgInJlYWRNb2RlSW5rTG9ja0Rvd24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlY2lwaWVudERhdGEgPSB3ICsgInJlY2lwaWVudERhdGEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlY29tbWVuZGVkID0gdyArICJyZWNvbW1lbmRlZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVsYXRpdmVUbyA9IHcgKyAicmVsYXRpdmVUbyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVseU9uVk1MID0gdyArICJyZWx5T25WTUwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJlbW92ZURhdGVBbmRUaW1lID0gdyArICJyZW1vdmVEYXRlQW5kVGltZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVtb3ZlUGVyc29uYWxJbmZvcm1hdGlvbiA9IHcgKyAicmVtb3ZlUGVyc29uYWxJbmZvcm1hdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVzdGFydCA9IHcgKyAicmVzdGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmVzdWx0ID0gdyArICJyZXN1bHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJldmlzaW9uVmlldyA9IHcgKyAicmV2aXNpb25WaWV3IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByRm9udHMgPSB3ICsgInJGb250cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcmljaFRleHQgPSB3ICsgInJpY2hUZXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByaWdodCA9IHcgKyAicmlnaHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJpZ2h0Q2hhcnMgPSB3ICsgInJpZ2h0Q2hhcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJpZ2h0RnJvbVRleHQgPSB3ICsgInJpZ2h0RnJvbVRleHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJQciA9IHcgKyAiclByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByUHJDaGFuZ2UgPSB3ICsgInJQckNoYW5nZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgclByRGVmYXVsdCA9IHcgKyAiclByRGVmYXVsdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcnNpZCA9IHcgKyAicnNpZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcnNpZERlbCA9IHcgKyAicnNpZERlbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcnNpZFAgPSB3ICsgInJzaWRQIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByc2lkUiA9IHcgKyAicnNpZFIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJzaWRSRGVmYXVsdCA9IHcgKyAicnNpZFJEZWZhdWx0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByc2lkUm9vdCA9IHcgKyAicnNpZFJvb3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJzaWRSUHIgPSB3ICsgInJzaWRSUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJzaWRzID0gdyArICJyc2lkcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcnNpZFNlY3QgPSB3ICsgInJzaWRTZWN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByc2lkVHIgPSB3ICsgInJzaWRUciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgclN0eWxlID0gdyArICJyU3R5bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJ0ID0gdyArICJydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcnRsID0gdyArICJydGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJ0bEd1dHRlciA9IHcgKyAicnRsR3V0dGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBydWJ5ID0gdyArICJydWJ5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBydWJ5QWxpZ24gPSB3ICsgInJ1YnlBbGlnbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcnVieUJhc2UgPSB3ICsgInJ1YnlCYXNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBydWJ5UHIgPSB3ICsgInJ1YnlQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2FsdCA9IHcgKyAic2FsdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2F2ZUZvcm1zRGF0YSA9IHcgKyAic2F2ZUZvcm1zRGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2F2ZUludmFsaWRYbWwgPSB3ICsgInNhdmVJbnZhbGlkWG1sIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzYXZlUHJldmlld1BpY3R1cmUgPSB3ICsgInNhdmVQcmV2aWV3UGljdHVyZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2F2ZVNtYXJ0VGFnc0FzWG1sID0gdyArICJzYXZlU21hcnRUYWdzQXNYbWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNhdmVTdWJzZXRGb250cyA9IHcgKyAic2F2ZVN1YnNldEZvbnRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzYXZlVGhyb3VnaFhzbHQgPSB3ICsgInNhdmVUaHJvdWdoWHNsdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2F2ZVhtbERhdGFPbmx5ID0gdyArICJzYXZlWG1sRGF0YU9ubHkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNjcm9sbGJhciA9IHcgKyAic2Nyb2xsYmFyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzZHQgPSB3ICsgInNkdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2R0Q29udGVudCA9IHcgKyAic2R0Q29udGVudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2R0RW5kUHIgPSB3ICsgInNkdEVuZFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzZHRQciA9IHcgKyAic2R0UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNlY3RQciA9IHcgKyAic2VjdFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzZWN0UHJDaGFuZ2UgPSB3ICsgInNlY3RQckNoYW5nZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2VsZWN0RmxkV2l0aEZpcnN0T3JMYXN0Q2hhciA9IHcgKyAic2VsZWN0RmxkV2l0aEZpcnN0T3JMYXN0Q2hhciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2VtaUhpZGRlbiA9IHcgKyAic2VtaUhpZGRlbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2VwID0gdyArICJzZXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNlcGFyYXRvciA9IHcgKyAic2VwYXJhdG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzZXR0aW5ncyA9IHcgKyAic2V0dGluZ3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNoYWRvdyA9IHcgKyAic2hhZG93IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaGFwZURlZmF1bHRzID0gdyArICJzaGFwZURlZmF1bHRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaGFwZWlkID0gdyArICJzaGFwZWlkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaGFwZUxheW91dExpa2VXVzggPSB3ICsgInNoYXBlTGF5b3V0TGlrZVdXOCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hkID0gdyArICJzaGQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNob3dCcmVha3NJbkZyYW1lcyA9IHcgKyAic2hvd0JyZWFrc0luRnJhbWVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaG93RW52ZWxvcGUgPSB3ICsgInNob3dFbnZlbG9wZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hvd2luZ1BsY0hkciA9IHcgKyAic2hvd2luZ1BsY0hkciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2hvd1hNTFRhZ3MgPSB3ICsgInNob3dYTUxUYWdzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaWcgPSB3ICsgInNpZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2l6ZSA9IHcgKyAic2l6ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc2l6ZUF1dG8gPSB3ICsgInNpemVBdXRvIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbWFsbENhcHMgPSB3ICsgInNtYWxsQ2FwcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc21hcnRUYWcgPSB3ICsgInNtYXJ0VGFnIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbWFydFRhZ1ByID0gdyArICJzbWFydFRhZ1ByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzbWFydFRhZ1R5cGUgPSB3ICsgInNtYXJ0VGFnVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc25hcFRvR3JpZCA9IHcgKyAic25hcFRvR3JpZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc29mdEh5cGhlbiA9IHcgKyAic29mdEh5cGhlbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc29sdXRpb25JRCA9IHcgKyAic29sdXRpb25JRCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc291cmNlRmlsZU5hbWUgPSB3ICsgInNvdXJjZUZpbGVOYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcGFjZSA9IHcgKyAic3BhY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNwYWNlRm9yVUwgPSB3ICsgInNwYWNlRm9yVUwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNwYWNpbmcgPSB3ICsgInNwYWNpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNwYWNpbmdJbldob2xlUG9pbnRzID0gdyArICJzcGFjaW5nSW5XaG9sZVBvaW50cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3BlY1ZhbmlzaCA9IHcgKyAic3BlY1ZhbmlzaCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3BlbGxpbmcgPSB3ICsgInNwZWxsaW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcGxpdFBnQnJlYWtBbmRQYXJhTWFyayA9IHcgKyAic3BsaXRQZ0JyZWFrQW5kUGFyYU1hcmsiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNyYyA9IHcgKyAic3JjIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdGFydCA9IHcgKyAic3RhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0YXJ0T3ZlcnJpZGUgPSB3ICsgInN0YXJ0T3ZlcnJpZGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0YXR1c1RleHQgPSB3ICsgInN0YXR1c1RleHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0b3JlSXRlbUlEID0gdyArICJzdG9yZUl0ZW1JRCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3RvcmVNYXBwZWREYXRhQXMgPSB3ICsgInN0b3JlTWFwcGVkRGF0YUFzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdHJpY3RGaXJzdEFuZExhc3RDaGFycyA9IHcgKyAic3RyaWN0Rmlyc3RBbmRMYXN0Q2hhcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0cmlrZSA9IHcgKyAic3RyaWtlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdHlsZSA9IHcgKyAic3R5bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0eWxlSWQgPSB3ICsgInN0eWxlSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0eWxlTGluayA9IHcgKyAic3R5bGVMaW5rIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdHlsZUxvY2tRRlNldCA9IHcgKyAic3R5bGVMb2NrUUZTZXQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0eWxlTG9ja1RoZW1lID0gdyArICJzdHlsZUxvY2tUaGVtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3R5bGVQYW5lRm9ybWF0RmlsdGVyID0gdyArICJzdHlsZVBhbmVGb3JtYXRGaWx0ZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0eWxlUGFuZVNvcnRNZXRob2QgPSB3ICsgInN0eWxlUGFuZVNvcnRNZXRob2QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0eWxlcyA9IHcgKyAic3R5bGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdWJEb2MgPSB3ICsgInN1YkRvYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3ViRm9udEJ5U2l6ZSA9IHcgKyAic3ViRm9udEJ5U2l6ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3Vic2V0dGVkID0gdyArICJzdWJzZXR0ZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN1ZmYgPSB3ICsgInN1ZmYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN1bW1hcnlMZW5ndGggPSB3ICsgInN1bW1hcnlMZW5ndGgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN1cHByZXNzQXV0b0h5cGhlbnMgPSB3ICsgInN1cHByZXNzQXV0b0h5cGhlbnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN1cHByZXNzQm90dG9tU3BhY2luZyA9IHcgKyAic3VwcHJlc3NCb3R0b21TcGFjaW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdXBwcmVzc0xpbmVOdW1iZXJzID0gdyArICJzdXBwcmVzc0xpbmVOdW1iZXJzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdXBwcmVzc092ZXJsYXAgPSB3ICsgInN1cHByZXNzT3ZlcmxhcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3VwcHJlc3NTcGFjaW5nQXRUb3BPZlBhZ2UgPSB3ICsgInN1cHByZXNzU3BhY2luZ0F0VG9wT2ZQYWdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdXBwcmVzc1NwQmZBZnRlclBnQnJrID0gdyArICJzdXBwcmVzc1NwQmZBZnRlclBnQnJrIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdXBwcmVzc1RvcFNwYWNpbmcgPSB3ICsgInN1cHByZXNzVG9wU3BhY2luZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3VwcHJlc3NUb3BTcGFjaW5nV1AgPSB3ICsgInN1cHByZXNzVG9wU3BhY2luZ1dQIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzd2FwQm9yZGVyc0ZhY2luZ1BhZ2VzID0gdyArICJzd2FwQm9yZGVyc0ZhY2luZ1BhZ2VzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzeW0gPSB3ICsgInN5bSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3ogPSB3ICsgInN6IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzekNzID0gdyArICJzekNzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0ID0gdyArICJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0MSA9IHcgKyAidDEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHQyID0gdyArICJ0MiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGFiID0gdyArICJ0YWIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRhYmxlID0gdyArICJ0YWJsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGFicyA9IHcgKyAidGFicyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGFnID0gdyArICJ0YWciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRhcmdldFNjcmVlblN6ID0gdyArICJ0YXJnZXRTY3JlZW5TeiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGJsID0gdyArICJ0YmwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibEJvcmRlcnMgPSB3ICsgInRibEJvcmRlcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibENlbGxNYXIgPSB3ICsgInRibENlbGxNYXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibENlbGxTcGFjaW5nID0gdyArICJ0YmxDZWxsU3BhY2luZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGJsR3JpZCA9IHcgKyAidGJsR3JpZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGJsR3JpZENoYW5nZSA9IHcgKyAidGJsR3JpZENoYW5nZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGJsSGVhZGVyID0gdyArICJ0YmxIZWFkZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibEluZCA9IHcgKyAidGJsSW5kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YmxMYXlvdXQgPSB3ICsgInRibExheW91dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGJsTG9vayA9IHcgKyAidGJsTG9vayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGJsT3ZlcmxhcCA9IHcgKyAidGJsT3ZlcmxhcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGJscFByID0gdyArICJ0YmxwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibFByID0gdyArICJ0YmxQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGJsUHJDaGFuZ2UgPSB3ICsgInRibFByQ2hhbmdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YmxQckV4ID0gdyArICJ0YmxQckV4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YmxQckV4Q2hhbmdlID0gdyArICJ0YmxQckV4Q2hhbmdlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YmxwWCA9IHcgKyAidGJscFgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibHBYU3BlYyA9IHcgKyAidGJscFhTcGVjIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YmxwWSA9IHcgKyAidGJscFkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibHBZU3BlYyA9IHcgKyAidGJscFlTcGVjIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YmxTdHlsZSA9IHcgKyAidGJsU3R5bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibFN0eWxlQ29sQmFuZFNpemUgPSB3ICsgInRibFN0eWxlQ29sQmFuZFNpemUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibFN0eWxlUHIgPSB3ICsgInRibFN0eWxlUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibFN0eWxlUm93QmFuZFNpemUgPSB3ICsgInRibFN0eWxlUm93QmFuZFNpemUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibFcgPSB3ICsgInRibFciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRjID0gdyArICJ0YyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGNCb3JkZXJzID0gdyArICJ0Y0JvcmRlcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRjRml0VGV4dCA9IHcgKyAidGNGaXRUZXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0Y01hciA9IHcgKyAidGNNYXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRjUHIgPSB3ICsgInRjUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRjUHJDaGFuZ2UgPSB3ICsgInRjUHJDaGFuZ2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRjVyA9IHcgKyAidGNXIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0ZW1wb3JhcnkgPSB3ICsgInRlbXBvcmFyeSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGVudGF0aXZlID0gdyArICJ0ZW50YXRpdmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRleHQgPSB3ICsgInRleHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRleHRBbGlnbm1lbnQgPSB3ICsgInRleHRBbGlnbm1lbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRleHRib3hUaWdodFdyYXAgPSB3ICsgInRleHRib3hUaWdodFdyYXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRleHREaXJlY3Rpb24gPSB3ICsgInRleHREaXJlY3Rpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRleHRJbnB1dCA9IHcgKyAidGV4dElucHV0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0Z3RGcmFtZSA9IHcgKyAidGd0RnJhbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRoZW1lQ29sb3IgPSB3ICsgInRoZW1lQ29sb3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRoZW1lRmlsbCA9IHcgKyAidGhlbWVGaWxsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0aGVtZUZpbGxTaGFkZSA9IHcgKyAidGhlbWVGaWxsU2hhZGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRoZW1lRmlsbFRpbnQgPSB3ICsgInRoZW1lRmlsbFRpbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRoZW1lRm9udExhbmcgPSB3ICsgInRoZW1lRm9udExhbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRoZW1lU2hhZGUgPSB3ICsgInRoZW1lU2hhZGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRoZW1lVGludCA9IHcgKyAidGhlbWVUaW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0aXRsZVBnID0gdyArICJ0aXRsZVBnIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0bDJiciA9IHcgKyAidGwyYnIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRtcGwgPSB3ICsgInRtcGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRvb2x0aXAgPSB3ICsgInRvb2x0aXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRvcCA9IHcgKyAidG9wIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0b3BGcm9tVGV4dCA9IHcgKyAidG9wRnJvbVRleHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRvcExpbmVQdW5jdCA9IHcgKyAidG9wTGluZVB1bmN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0cGxjID0gdyArICJ0cGxjIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0ciA9IHcgKyAidHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRyMmJsID0gdyArICJ0cjJibCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHJhY2tSZXZpc2lvbnMgPSB3ICsgInRyYWNrUmV2aXNpb25zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0ckhlaWdodCA9IHcgKyAidHJIZWlnaHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRyUHIgPSB3ICsgInRyUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRyUHJDaGFuZ2UgPSB3ICsgInRyUHJDaGFuZ2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRydW5jYXRlRm9udEhlaWdodHNMaWtlV1A2ID0gdyArICJ0cnVuY2F0ZUZvbnRIZWlnaHRzTGlrZVdQNiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHhieENvbnRlbnQgPSB3ICsgInR4YnhDb250ZW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0eXBlID0gdyArICJ0eXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0eXBlcyA9IHcgKyAidHlwZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHUgPSB3ICsgInUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVkbCA9IHcgKyAidWRsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1aUNvbXBhdDk3VG8yMDAzID0gdyArICJ1aUNvbXBhdDk3VG8yMDAzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1aVByaW9yaXR5ID0gdyArICJ1aVByaW9yaXR5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1bFRyYWlsU3BhY2UgPSB3ICsgInVsVHJhaWxTcGFjZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdW5kZXJsaW5lVGFiSW5OdW1MaXN0ID0gdyArICJ1bmRlcmxpbmVUYWJJbk51bUxpc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVuaGlkZVdoZW5Vc2VkID0gdyArICJ1bmhpZGVXaGVuVXNlZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXBkYXRlRmllbGRzID0gdyArICJ1cGRhdGVGaWVsZHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVyaSA9IHcgKyAidXJpIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1cmwgPSB3ICsgInVybCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXNiMCA9IHcgKyAidXNiMCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXNiMSA9IHcgKyAidXNiMSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXNiMiA9IHcgKyAidXNiMiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXNiMyA9IHcgKyAidXNiMyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXNlQWx0S2luc29rdUxpbmVCcmVha1J1bGVzID0gdyArICJ1c2VBbHRLaW5zb2t1TGluZUJyZWFrUnVsZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVzZUFuc2lLZXJuaW5nUGFpcnMgPSB3ICsgInVzZUFuc2lLZXJuaW5nUGFpcnMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVzZUZFTGF5b3V0ID0gdyArICJ1c2VGRUxheW91dCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXNlTm9ybWFsU3R5bGVGb3JMaXN0ID0gdyArICJ1c2VOb3JtYWxTdHlsZUZvckxpc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVzZVByaW50ZXJNZXRyaWNzID0gdyArICJ1c2VQcmludGVyTWV0cmljcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXNlU2luZ2xlQm9yZGVyZm9yQ29udGlndW91c0NlbGxzID0gdyArICJ1c2VTaW5nbGVCb3JkZXJmb3JDb250aWd1b3VzQ2VsbHMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVzZVdvcmQyMDAyVGFibGVTdHlsZVJ1bGVzID0gdyArICJ1c2VXb3JkMjAwMlRhYmxlU3R5bGVSdWxlcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdXNlV29yZDk3TGluZUJyZWFrUnVsZXMgPSB3ICsgInVzZVdvcmQ5N0xpbmVCcmVha1J1bGVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB1c2VYU0xUV2hlblNhdmluZyA9IHcgKyAidXNlWFNMVFdoZW5TYXZpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZhbCA9IHcgKyAidmFsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2QWxpZ24gPSB3ICsgInZBbGlnbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmFsdWUgPSB3ICsgInZhbHVlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2QW5jaG9yID0gdyArICJ2QW5jaG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2YW5pc2ggPSB3ICsgInZhbmlzaCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmVuZG9ySUQgPSB3ICsgInZlbmRvcklEIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2ZXJ0ID0gdyArICJ2ZXJ0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2ZXJ0QWxpZ24gPSB3ICsgInZlcnRBbGlnbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmVydEFuY2hvciA9IHcgKyAidmVydEFuY2hvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdmVydENvbXByZXNzID0gdyArICJ2ZXJ0Q29tcHJlc3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZpZXcgPSB3ICsgInZpZXciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZpZXdNZXJnZWREYXRhID0gdyArICJ2aWV3TWVyZ2VkRGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdk1lcmdlID0gdyArICJ2TWVyZ2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZNZXJnZU9yaWcgPSB3ICsgInZNZXJnZU9yaWciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHZTcGFjZSA9IHcgKyAidlNwYWNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBfdyA9IHcgKyAidyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgd0FmdGVyID0gdyArICJ3QWZ0ZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdCZWZvcmUgPSB3ICsgIndCZWZvcmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdlYkhpZGRlbiA9IHcgKyAid2ViSGlkZGVuIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3ZWJTZXR0aW5ncyA9IHcgKyAid2ViU2V0dGluZ3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdpZG93Q29udHJvbCA9IHcgKyAid2lkb3dDb250cm9sIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3b3JkV3JhcCA9IHcgKyAid29yZFdyYXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdwSnVzdGlmaWNhdGlvbiA9IHcgKyAid3BKdXN0aWZpY2F0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3cFNwYWNlV2lkdGggPSB3ICsgIndwU3BhY2VXaWR0aCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgd3JhcCA9IHcgKyAid3JhcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgd3JhcFRyYWlsU3BhY2VzID0gdyArICJ3cmFwVHJhaWxTcGFjZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdyaXRlUHJvdGVjdGlvbiA9IHcgKyAid3JpdGVQcm90ZWN0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB4ID0gdyArICJ4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB4QWxpZ24gPSB3ICsgInhBbGlnbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgeHBhdGggPSB3ICsgInhwYXRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB5ID0gdyArICJ5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB5QWxpZ24gPSB3ICsgInlBbGlnbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgeWVhckxvbmcgPSB3ICsgInllYXJMb25nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB5ZWFyU2hvcnQgPSB3ICsgInllYXJTaG9ydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgem9vbSA9IHcgKyAiem9vbSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgek9yZGVyID0gdyArICJ6T3JkZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibENhcHRpb24gPSB3ICsgInRibENhcHRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRibERlc2NyaXB0aW9uID0gdyArICJ0YmxEZXNjcmlwdGlvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3RhcnRDaGFycyA9IHcgKyAic3RhcnRDaGFycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZW5kID0gdyArICJlbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVuZENoYXJzID0gdyArICJlbmRDaGFycyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZXZlbkhCYW5kID0gdyArICJldmVuSEJhbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGV2ZW5WQmFuZCA9IHcgKyAiZXZlblZCYW5kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaXJzdFJvd0ZpcnN0Q29sdW1uID0gdyArICJmaXJzdFJvd0ZpcnN0Q29sdW1uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmaXJzdFJvd0xhc3RDb2x1bW4gPSB3ICsgImZpcnN0Um93TGFzdENvbHVtbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGFzdFJvd0ZpcnN0Q29sdW1uID0gdyArICJsYXN0Um93Rmlyc3RDb2x1bW4iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGxhc3RSb3dMYXN0Q29sdW1uID0gdyArICJsYXN0Um93TGFzdENvbHVtbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgb2RkSEJhbmQgPSB3ICsgIm9kZEhCYW5kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvZGRWQmFuZCA9IHcgKyAib2RkVkJhbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGhlYWRlcnMgPSB3ICsgImhlYWRlcnMiOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWVbXSBCbG9ja0xldmVsQ29udGVudENvbnRhaW5lcnMgPQorICAgICAgICB7CisgICAgICAgICAgICBXLmJvZHksCisgICAgICAgICAgICBXLnRjLAorICAgICAgICAgICAgVy50eGJ4Q29udGVudCwKKyAgICAgICAgICAgIFcuaGRyLAorICAgICAgICAgICAgVy5mdHIsCisgICAgICAgICAgICBXLmVuZG5vdGUsCisgICAgICAgICAgICBXLmZvb3Rub3RlCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZVtdIFN1YlJ1bkxldmVsQ29udGVudCA9CisgICAgICAgIHsKKyAgICAgICAgICAgIFcuYnIsCisgICAgICAgICAgICBXLmNyLAorICAgICAgICAgICAgVy5kYXlMb25nLAorICAgICAgICAgICAgVy5kYXlTaG9ydCwKKyAgICAgICAgICAgIFcuZHJhd2luZywKKyAgICAgICAgICAgIFcuZHJhd2luZywKKyAgICAgICAgICAgIFcubW9udGhMb25nLAorICAgICAgICAgICAgVy5tb250aFNob3J0LAorICAgICAgICAgICAgVy5ub0JyZWFrSHlwaGVuLAorICAgICAgICAgICAgVy5wdGFiLAorICAgICAgICAgICAgVy5wZ051bSwKKyAgICAgICAgICAgIFcucGljdCwKKyAgICAgICAgICAgIFcuc29mdEh5cGhlbiwKKyAgICAgICAgICAgIFcuc3ltLAorICAgICAgICAgICAgVy50LAorICAgICAgICAgICAgVy50YWIsCisgICAgICAgICAgICBXLnllYXJMb25nLAorICAgICAgICAgICAgVy55ZWFyU2hvcnQsCisgICAgICAgICAgICBNQy5BbHRlcm5hdGVDb250ZW50LAorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVzEwCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgdzEwID0KKyAgICAgICAgICAgICJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbmNob3Jsb2NrID0gdzEwICsgImFuY2hvcmxvY2siOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJvcmRlcmJvdHRvbSA9IHcxMCArICJib3JkZXJib3R0b20iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJvcmRlcmxlZnQgPSB3MTAgKyAiYm9yZGVybGVmdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm9yZGVycmlnaHQgPSB3MTAgKyAiYm9yZGVycmlnaHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJvcmRlcnRvcCA9IHcxMCArICJib3JkZXJ0b3AiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdyYXAgPSB3MTAgKyAid3JhcCI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXMTQKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWVzcGFjZSB3MTQgPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3dvcmQvMjAxMC93b3JkbWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFsZ24gPSB3MTQgKyAiYWxnbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWxwaGEgPSB3MTQgKyAiYWxwaGEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFuZyA9IHcxNCArICJhbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGIgPSB3MTQgKyAiYiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmV2ZWwgPSB3MTQgKyAiYmV2ZWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJldmVsQiA9IHcxNCArICJiZXZlbEIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJldmVsVCA9IHcxNCArICJiZXZlbFQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJsdXJSYWQgPSB3MTQgKyAiYmx1clJhZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2FtZXJhID0gdzE0ICsgImNhbWVyYSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2FwID0gdzE0ICsgImNhcCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY2hlY2tib3ggPSB3MTQgKyAiY2hlY2tib3giOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9jaGVja2VkID0gdzE0ICsgImNoZWNrZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNoZWNrZWRTdGF0ZSA9IHcxNCArICJjaGVja2VkU3RhdGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNtcGQgPSB3MTQgKyAiY21wZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY250eHRBbHRzID0gdzE0ICsgImNudHh0QWx0cyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052Q29udGVudFBhcnRQciA9IHcxNCArICJjTnZDb250ZW50UGFydFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb25mbGljdE1vZGUgPSB3MTQgKyAiY29uZmxpY3RNb2RlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb250ZW50UGFydCA9IHcxNCArICJjb250ZW50UGFydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29udG91ckNsciA9IHcxNCArICJjb250b3VyQ2xyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjb250b3VyVyA9IHcxNCArICJjb250b3VyVyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGVmYXVsdEltYWdlRHBpID0gdzE0ICsgImRlZmF1bHRJbWFnZURwaSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlyID0gdzE0ICsgImRpciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZGlzY2FyZEltYWdlRWRpdGluZ0RhdGEgPSB3MTQgKyAiZGlzY2FyZEltYWdlRWRpdGluZ0RhdGEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpc3QgPSB3MTQgKyAiZGlzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9jSWQgPSB3MTQgKyAiZG9jSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVkaXRJZCA9IHcxNCArICJlZGl0SWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVuYWJsZU9wZW5UeXBlS2VybmluZyA9IHcxNCArICJlbmFibGVPcGVuVHlwZUtlcm5pbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVuZEEgPSB3MTQgKyAiZW5kQSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZW5kUG9zID0gdzE0ICsgImVuZFBvcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZW50aXR5UGlja2VyID0gdzE0ICsgImVudGl0eVBpY2tlciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZXh0cnVzaW9uQ2xyID0gdzE0ICsgImV4dHJ1c2lvbkNsciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZXh0cnVzaW9uSCA9IHcxNCArICJleHRydXNpb25IIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmYWRlRGlyID0gdzE0ICsgImZhZGVEaXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGZpbGxUb1JlY3QgPSB3MTQgKyAiZmlsbFRvUmVjdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZm9udCA9IHcxNCArICJmb250IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBnbG93ID0gdzE0ICsgImdsb3ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyYWRGaWxsID0gdzE0ICsgImdyYWRGaWxsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncyA9IHcxNCArICJncyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZ3NMc3QgPSB3MTQgKyAiZ3NMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGggPSB3MTQgKyAiaCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaHVlTW9kID0gdzE0ICsgImh1ZU1vZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaWQgPSB3MTQgKyAiaWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGt4ID0gdzE0ICsgImt4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBreSA9IHcxNCArICJreSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbCA9IHcxNCArICJsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsYXQgPSB3MTQgKyAibGF0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsaWdhdHVyZXMgPSB3MTQgKyAibGlnYXR1cmVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBsaWdodFJpZyA9IHcxNCArICJsaWdodFJpZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGltID0gdzE0ICsgImxpbSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGluID0gdzE0ICsgImxpbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbG9uID0gdzE0ICsgImxvbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbHVtTW9kID0gdzE0ICsgImx1bU1vZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbHVtT2ZmID0gdzE0ICsgImx1bU9mZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbWl0ZXIgPSB3MTQgKyAibWl0ZXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG5vRmlsbCA9IHcxNCArICJub0ZpbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG51bUZvcm0gPSB3MTQgKyAibnVtRm9ybSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnVtU3BhY2luZyA9IHcxNCArICJudW1TcGFjaW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBudkNvbnRlbnRQYXJ0UHIgPSB3MTQgKyAibnZDb250ZW50UGFydFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYXJhSWQgPSB3MTQgKyAicGFyYUlkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwYXRoID0gdzE0ICsgInBhdGgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBvcyA9IHcxNCArICJwb3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByb3BzM2QgPSB3MTQgKyAicHJvcHMzZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJzdCA9IHcxNCArICJwcnN0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcnN0RGFzaCA9IHcxNCArICJwcnN0RGFzaCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcHJzdE1hdGVyaWFsID0gdzE0ICsgInByc3RNYXRlcmlhbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgciA9IHcxNCArICJyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByYWQgPSB3MTQgKyAicmFkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZWZsZWN0aW9uID0gdzE0ICsgInJlZmxlY3Rpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJldiA9IHcxNCArICJyZXYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJpZyA9IHcxNCArICJyaWciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJvdCA9IHcxNCArICJyb3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJvdW5kID0gdzE0ICsgInJvdW5kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzYXQgPSB3MTQgKyAic2F0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzYXRNb2QgPSB3MTQgKyAic2F0TW9kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzYXRPZmYgPSB3MTQgKyAic2F0T2ZmIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzY2FsZWQgPSB3MTQgKyAic2NhbGVkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzY2VuZTNkID0gdzE0ICsgInNjZW5lM2QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNjaGVtZUNsciA9IHcxNCArICJzY2hlbWVDbHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNoYWRlID0gdzE0ICsgInNoYWRlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaGFkb3cgPSB3MTQgKyAic2hhZG93IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzb2xpZEZpbGwgPSB3MTQgKyAic29saWRGaWxsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcmdiQ2xyID0gdzE0ICsgInNyZ2JDbHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0QSA9IHcxNCArICJzdEEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0UG9zID0gdzE0ICsgInN0UG9zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdHlsZVNldCA9IHcxNCArICJzdHlsZVNldCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3R5bGlzdGljU2V0cyA9IHcxNCArICJzdHlsaXN0aWNTZXRzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzeCA9IHcxNCArICJzeCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3kgPSB3MTQgKyAic3kiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHQgPSB3MTQgKyAidCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGV4dEZpbGwgPSB3MTQgKyAidGV4dEZpbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRleHRJZCA9IHcxNCArICJ0ZXh0SWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRleHRPdXRsaW5lID0gdzE0ICsgInRleHRPdXRsaW5lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0aW50ID0gdzE0ICsgInRpbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHVuY2hlY2tlZFN0YXRlID0gdzE0ICsgInVuY2hlY2tlZFN0YXRlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB2YWwgPSB3MTQgKyAidmFsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3ID0gdzE0ICsgInciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdQcm9wczNkID0gdzE0ICsgIndQcm9wczNkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3U2NlbmUzZCA9IHcxNCArICJ3U2NlbmUzZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgd1NoYWRvdyA9IHcxNCArICJ3U2hhZG93IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3VGV4dEZpbGwgPSB3MTQgKyAid1RleHRGaWxsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3VGV4dE91dGxpbmUgPSB3MTQgKyAid1RleHRPdXRsaW5lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB4ZnJtID0gdzE0ICsgInhmcm0iOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVzE1CisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lc3BhY2UgdzE1ID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3dvcmQvMjAxMi93b3JkbWwiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVzE2U0UKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWVzcGFjZSB3MTZzZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMTUvd29yZG1sL3N5bWV4IjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdFCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2Ugd2UgPSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd2ViZXh0ZW5zaW9ucy93ZWJleHRlbnNpb24vMjAxMC8xMSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYWx0ZXJuYXRlUmVmZXJlbmNlcyA9IHdlICsgImFsdGVybmF0ZVJlZmVyZW5jZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJpbmRpbmcgPSB3ZSArICJiaW5kaW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiaW5kaW5ncyA9IHdlICsgImJpbmRpbmdzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBleHRMc3QgPSB3ZSArICJleHRMc3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHByb3BlcnRpZXMgPSB3ZSArICJwcm9wZXJ0aWVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwcm9wZXJ0eSA9IHdlICsgInByb3BlcnR5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSByZWZlcmVuY2UgPSB3ZSArICJyZWZlcmVuY2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNuYXBzaG90ID0gd2UgKyAic25hcHNob3QiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdlYl9leHRlbnNpb24gPSB3ZSArICJ3ZWItZXh0ZW5zaW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3ZWJleHRlbnNpb24gPSB3ZSArICJ3ZWJleHRlbnNpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdlYmV4dGVuc2lvbnJlZiA9IHdlICsgIndlYmV4dGVuc2lvbnJlZiI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXRVRQCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2Ugd2V0cCA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93ZWJleHRlbnNpb25zL3Rhc2twYW5lcy8yMDEwLzExIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBleHRMc3QgPSB3ZXRwICsgImV4dExzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGFza3BhbmUgPSB3ZXRwICsgInRhc2twYW5lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0YXNrcGFuZXMgPSB3ZXRwICsgInRhc2twYW5lcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgd2ViX2V4dGVuc2lvbl90YXNrcGFuZXMgPSB3ZXRwICsgIndlYi1leHRlbnNpb24tdGFza3BhbmVzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3ZWJleHRlbnNpb25yZWYgPSB3ZXRwICsgIndlYmV4dGVuc2lvbnJlZiI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXM0RJR1NJRworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIHczZGlnc2lnID0KKyAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBDYW5vbmljYWxpemF0aW9uTWV0aG9kID0gdzNkaWdzaWcgKyAiQ2Fub25pY2FsaXphdGlvbk1ldGhvZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgRGlnZXN0TWV0aG9kID0gdzNkaWdzaWcgKyAiRGlnZXN0TWV0aG9kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBEaWdlc3RWYWx1ZSA9IHczZGlnc2lnICsgIkRpZ2VzdFZhbHVlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBFeHBvbmVudCA9IHczZGlnc2lnICsgIkV4cG9uZW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBLZXlJbmZvID0gdzNkaWdzaWcgKyAiS2V5SW5mbyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgS2V5VmFsdWUgPSB3M2RpZ3NpZyArICJLZXlWYWx1ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgTWFuaWZlc3QgPSB3M2RpZ3NpZyArICJNYW5pZmVzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgTW9kdWx1cyA9IHczZGlnc2lnICsgIk1vZHVsdXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIE9iamVjdCA9IHczZGlnc2lnICsgIk9iamVjdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgUmVmZXJlbmNlID0gdzNkaWdzaWcgKyAiUmVmZXJlbmNlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBSU0FLZXlWYWx1ZSA9IHczZGlnc2lnICsgIlJTQUtleVZhbHVlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBTaWduYXR1cmUgPSB3M2RpZ3NpZyArICJTaWduYXR1cmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFNpZ25hdHVyZU1ldGhvZCA9IHczZGlnc2lnICsgIlNpZ25hdHVyZU1ldGhvZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgU2lnbmF0dXJlUHJvcGVydGllcyA9IHczZGlnc2lnICsgIlNpZ25hdHVyZVByb3BlcnRpZXMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFNpZ25hdHVyZVByb3BlcnR5ID0gdzNkaWdzaWcgKyAiU2lnbmF0dXJlUHJvcGVydHkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFNpZ25hdHVyZVZhbHVlID0gdzNkaWdzaWcgKyAiU2lnbmF0dXJlVmFsdWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFNpZ25lZEluZm8gPSB3M2RpZ3NpZyArICJTaWduZWRJbmZvIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBUcmFuc2Zvcm0gPSB3M2RpZ3NpZyArICJUcmFuc2Zvcm0iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFRyYW5zZm9ybXMgPSB3M2RpZ3NpZyArICJUcmFuc2Zvcm1zIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBYNTA5Q2VydGlmaWNhdGUgPSB3M2RpZ3NpZyArICJYNTA5Q2VydGlmaWNhdGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFg1MDlEYXRhID0gdzNkaWdzaWcgKyAiWDUwOURhdGEiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFg1MDlJc3N1ZXJOYW1lID0gdzNkaWdzaWcgKyAiWDUwOUlzc3Vlck5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFg1MDlTZXJpYWxOdW1iZXIgPSB3M2RpZ3NpZyArICJYNTA5U2VyaWFsTnVtYmVyIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdQCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2Ugd3AgPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi93b3JkcHJvY2Vzc2luZ0RyYXdpbmciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFsaWduID0gd3AgKyAiYWxpZ24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGFuY2hvciA9IHdwICsgImFuY2hvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052R3JhcGhpY0ZyYW1lUHIgPSB3cCArICJjTnZHcmFwaGljRnJhbWVQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZG9jUHIgPSB3cCArICJkb2NQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZWZmZWN0RXh0ZW50ID0gd3AgKyAiZWZmZWN0RXh0ZW50IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBleHRlbnQgPSB3cCArICJleHRlbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGlubGluZSA9IHdwICsgImlubGluZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbGluZVRvID0gd3AgKyAibGluZVRvIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwb3NpdGlvbkggPSB3cCArICJwb3NpdGlvbkgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBvc2l0aW9uViA9IHdwICsgInBvc2l0aW9uViI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcG9zT2Zmc2V0ID0gd3AgKyAicG9zT2Zmc2V0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaW1wbGVQb3MgPSB3cCArICJzaW1wbGVQb3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0YXJ0ID0gd3AgKyAic3RhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdyYXBOb25lID0gd3AgKyAid3JhcE5vbmUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdyYXBQb2x5Z29uID0gd3AgKyAid3JhcFBvbHlnb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdyYXBTcXVhcmUgPSB3cCArICJ3cmFwU3F1YXJlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3cmFwVGhyb3VnaCA9IHdwICsgIndyYXBUaHJvdWdoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3cmFwVGlnaHQgPSB3cCArICJ3cmFwVGlnaHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdyYXBUb3BBbmRCb3R0b20gPSB3cCArICJ3cmFwVG9wQW5kQm90dG9tIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdQMTQKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWVzcGFjZSB3cDE0ID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS93b3JkLzIwMTAvd29yZHByb2Nlc3NpbmdEcmF3aW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbmNob3JJZCA9IHdwMTQgKyAiYW5jaG9ySWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGVkaXRJZCA9IHdwMTQgKyAiZWRpdElkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBwY3RIZWlnaHQgPSB3cDE0ICsgInBjdEhlaWdodCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGN0UG9zVk9mZnNldCA9IHdwMTQgKyAicGN0UG9zVk9mZnNldCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcGN0V2lkdGggPSB3cDE0ICsgInBjdFdpZHRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzaXplUmVsSCA9IHdwMTQgKyAic2l6ZVJlbEgiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNpemVSZWxWID0gd3AxNCArICJzaXplUmVsViI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXUFMKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWVzcGFjZSB3cHMgPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3dvcmQvMjAxMC93b3JkcHJvY2Vzc2luZ1NoYXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhbHRUeGJ4ID0gd3BzICsgImFsdFR4YngiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJvZHlQciA9IHdwcyArICJib2R5UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNOdlNwUHIgPSB3cHMgKyAiY052U3BQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3BQciA9IHdwcyArICJzcFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdHlsZSA9IHdwcyArICJzdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdGV4dGJveCA9IHdwcyArICJ0ZXh0Ym94IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0eGJ4ID0gd3BzICsgInR4YngiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHdzcCA9IHdwcyArICJ3c3AiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgWAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIHggPQorICAgICAgICAgICAgInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOmV4Y2VsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBBbmNob3IgPSB4ICsgIkFuY2hvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgQXV0b0ZpbGwgPSB4ICsgIkF1dG9GaWxsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBDbGllbnREYXRhID0geCArICJDbGllbnREYXRhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBDb2x1bW4gPSB4ICsgIkNvbHVtbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgTW92ZVdpdGhDZWxscyA9IHggKyAiTW92ZVdpdGhDZWxscyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgUm93ID0geCArICJSb3ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIFNpemVXaXRoQ2VsbHMgPSB4ICsgIlNpemVXaXRoQ2VsbHMiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgWERSCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgeGRyID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvc3ByZWFkc2hlZXREcmF3aW5nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBhYnNvbHV0ZUFuY2hvciA9IHhkciArICJhYnNvbHV0ZUFuY2hvciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYmxpcEZpbGwgPSB4ZHIgKyAiYmxpcEZpbGwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNsaWVudERhdGEgPSB4ZHIgKyAiY2xpZW50RGF0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052Q3huU3BQciA9IHhkciArICJjTnZDeG5TcFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjTnZHcmFwaGljRnJhbWVQciA9IHhkciArICJjTnZHcmFwaGljRnJhbWVQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052R3JwU3BQciA9IHhkciArICJjTnZHcnBTcFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBjTnZQaWNQciA9IHhkciArICJjTnZQaWNQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052UHIgPSB4ZHIgKyAiY052UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNOdlNwUHIgPSB4ZHIgKyAiY052U3BQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29sID0geGRyICsgImNvbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29sT2ZmID0geGRyICsgImNvbE9mZiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY29udGVudFBhcnQgPSB4ZHIgKyAiY29udGVudFBhcnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGN4blNwID0geGRyICsgImN4blNwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBleHQgPSB4ZHIgKyAiZXh0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBmcm9tID0geGRyICsgImZyb20iOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdyYXBoaWNGcmFtZSA9IHhkciArICJncmFwaGljRnJhbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGdycFNwID0geGRyICsgImdycFNwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBncnBTcFByID0geGRyICsgImdycFNwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG52Q3huU3BQciA9IHhkciArICJudkN4blNwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG52R3JhcGhpY0ZyYW1lUHIgPSB4ZHIgKyAibnZHcmFwaGljRnJhbWVQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnZHcnBTcFByID0geGRyICsgIm52R3JwU3BQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnZQaWNQciA9IHhkciArICJudlBpY1ByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBudlNwUHIgPSB4ZHIgKyAibnZTcFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBvbmVDZWxsQW5jaG9yID0geGRyICsgIm9uZUNlbGxBbmNob3IiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBpYyA9IHhkciArICJwaWMiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHBvcyA9IHhkciArICJwb3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJvdyA9IHhkciArICJyb3ciOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHJvd09mZiA9IHhkciArICJyb3dPZmYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNwID0geGRyICsgInNwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcFByID0geGRyICsgInNwUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHN0eWxlID0geGRyICsgInN0eWxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0byA9IHhkciArICJ0byI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHdvQ2VsbEFuY2hvciA9IHhkciArICJ0d29DZWxsQW5jaG9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB0eEJvZHkgPSB4ZHIgKyAidHhCb2R5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSB3c0RyID0geGRyICsgIndzRHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHhmcm0gPSB4ZHIgKyAieGZybSI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBYRFIxNAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIHhkcjE0ID0KKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9leGNlbC8yMDEwL3NwcmVhZHNoZWV0RHJhd2luZyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgY052Q29udGVudFBhcnRQciA9IHhkcjE0ICsgImNOdkNvbnRlbnRQYXJ0UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGNOdlByID0geGRyMTQgKyAiY052UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIG52Q29udGVudFBhcnRQciA9IHhkcjE0ICsgIm52Q29udGVudFBhcnRQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgbnZQciA9IHhkcjE0ICsgIm52UHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHhmcm0gPSB4ZHIxNCArICJ4ZnJtIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFhNCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgeG0gPQorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL2V4Y2VsLzIwMDYvbWFpbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgZiA9IHhtICsgImYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIF9yZWYgPSB4bSArICJyZWYiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHNxcmVmID0geG0gKyAic3FyZWYiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNJCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgeHNpID0KKyAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgdHlwZSA9IHhzaSArICJ0eXBlIjsKKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGVuZCBnZW5lcmF0ZWQgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQdE9wZW5YbWwKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWVzcGFjZSBwdE9wZW5YbWwgPSAiaHR0cDovL3Bvd2VydG9vbHMuY29kZXBsZXguY29tL2RvY3VtZW50YnVpbGRlci8yMDExL2luc2VydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgSW5zZXJ0ID0gcHRPcGVuWG1sICsgIkluc2VydCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgSWQgPSAiSWQiOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWVzcGFjZSBwdCA9ICJodHRwOi8vcG93ZXJ0b29scy5jb2RlcGxleC5jb20vMjAxMSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgVXJpID0gcHQgKyAiVXJpIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBVbmlkID0gcHQgKyAiVW5pZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgU0hBMUhhc2ggPSBwdCArICJTSEExSGFzaCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQ29ycmVsYXRlZFNIQTFIYXNoID0gcHQgKyAiQ29ycmVsYXRlZFNIQTFIYXNoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBTdHJ1Y3R1cmVTSEExSGFzaCA9IHB0ICsgIlN0cnVjdHVyZVNIQTFIYXNoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBDb3JyZWxhdGlvblNldCA9IHB0ICsgIkNvcnJlbGF0aW9uU2V0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBTdGF0dXMgPSBwdCArICJTdGF0dXMiOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgTGV2ZWwgPSBwdCArICJMZXZlbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgSW5kZW50TGV2ZWwgPSBwdCArICJJbmRlbnRMZXZlbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQ29udGVudFR5cGUgPSBwdCArICJDb250ZW50VHlwZSI7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSB0clByID0gcHQgKyAidHJQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgdGNQciA9IHB0ICsgInRjUHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIHJQciA9IHB0ICsgInJQciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgcFByID0gcHQgKyAicFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSB0YmxQciA9IHB0ICsgInRibFByIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBzdHlsZSA9IHB0ICsgInN0eWxlIjsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIEZvbnROYW1lID0gcHQgKyAiRm9udE5hbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIExhbmd1YWdlVHlwZSA9IHB0ICsgIkxhbmd1YWdlVHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgQWJzdHJhY3ROdW1JZCA9IHB0ICsgIkFic3RyYWN0TnVtSWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFN0eWxlTmFtZSA9IHB0ICsgIlN0eWxlTmFtZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgVGFiV2lkdGggPSBwdCArICJUYWJXaWR0aCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgTGVhZGVyID0gcHQgKyAiTGVhZGVyIjsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIExpc3RJdGVtUnVuID0gcHQgKyAiTGlzdEl0ZW1SdW4iOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgSHRtbFRvV21sQ3NzV2lkdGggPSBwdCArICJIdG1sVG9XbWxDc3NXaWR0aCI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBYaHRtbAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIHhodG1sID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGEgPSB4aHRtbCArICJhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBiID0geGh0bWwgKyAiYiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgYm9keSA9IHhodG1sICsgImJvZHkiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGJyID0geGh0bWwgKyAiYnIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGRpdiA9IHhodG1sICsgImRpdiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaDEgPSB4aHRtbCArICJoMSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaDIgPSB4aHRtbCArICJoMiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaGVhZCA9IHhodG1sICsgImhlYWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIGh0bWwgPSB4aHRtbCArICJodG1sIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBpID0geGh0bWwgKyAiaSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgaW1nID0geGh0bWwgKyAiaW1nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBtZXRhID0geGh0bWwgKyAibWV0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgcCA9IHhodG1sICsgInAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHMgPSB4aHRtbCArICJzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzcGFuID0geGh0bWwgKyAic3BhbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3R5bGUgPSB4aHRtbCArICJzdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWE5hbWUgc3ViID0geGh0bWwgKyAic3ViIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBYTmFtZSBzdXAgPSB4aHRtbCArICJzdXAiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRhYmxlID0geGh0bWwgKyAidGFibGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRkID0geGh0bWwgKyAidGQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRpdGxlID0geGh0bWwgKyAidGl0bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHRyID0geGh0bWwgKyAidHIiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhOYW1lIHUgPSB4aHRtbCArICJ1IjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFhodG1sTm9OYW1lc3BhY2UKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWVzcGFjZSB4aHRtbCA9IFhOYW1lc3BhY2UuTm9uZTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBodG1sID0geGh0bWwgKyAiaHRtbCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgaGVhZCA9IHhodG1sICsgImhlYWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIHRpdGxlID0geGh0bWwgKyAidGl0bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIF9jbGFzcyA9IHhodG1sICsgImNsYXNzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBjb2xzcGFuID0geGh0bWwgKyAiY29sc3BhbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgY2FwdGlvbiA9IHhodG1sICsgImNhcHRpb24iOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIGJvZHkgPSB4aHRtbCArICJib2R5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBkaXYgPSB4aHRtbCArICJkaXYiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIHAgPSB4aHRtbCArICJwIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBoMSA9IHhodG1sICsgImgxIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBoMiA9IHhodG1sICsgImgyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBoMyA9IHhodG1sICsgImgzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBoNCA9IHhodG1sICsgImg0IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBoNSA9IHhodG1sICsgImg1IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBoNiA9IHhodG1sICsgImg2IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBoNyA9IHhodG1sICsgImg3IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBoOCA9IHhodG1sICsgImg4IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBoOSA9IHhodG1sICsgImg5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBociA9IHhodG1sICsgImhyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBhID0geGh0bWwgKyAiYSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgYiA9IHhodG1sICsgImIiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIGkgPSB4aHRtbCArICJpIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSB0YWJsZSA9IHhodG1sICsgInRhYmxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSB0aCA9IHhodG1sICsgInRoIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSB0ciA9IHhodG1sICsgInRyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSB0ZCA9IHhodG1sICsgInRkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBtZXRhID0geGh0bWwgKyAibWV0YSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgc3R5bGUgPSB4aHRtbCArICJzdHlsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgYnIgPSB4aHRtbCArICJiciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgaW1nID0geGh0bWwgKyAiaW1nIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBzcGFuID0geGh0bWwgKyAic3BhbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgaHJlZiA9ICJocmVmIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBib3JkZXIgPSAiYm9yZGVyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBodHRwX2VxdWl2ID0gImh0dHAtZXF1aXYiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIGNvbnRlbnQgPSAiY29udGVudCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSB3aWR0aCA9ICJ3aWR0aCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgaGVpZ2h0ID0gImhlaWdodCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgc3JjID0gInNyYyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgYWx0ID0gImFsdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgaWQgPSAiaWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIGRlc2NyID0gImRlc2NyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBibG9ja3F1b3RlID0gImJsb2NrcXVvdGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIHR5cGUgPSAidHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgc3ViID0gInN1YiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgc3VwID0gInN1cCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgb2wgPSAib2wiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIHVsID0gInVsIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBsaSA9ICJsaSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgc3Ryb25nID0gIkJvbGQiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIGVtID0gImVtIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSB0Ym9keSA9ICJ0Ym9keSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgdmFsaWduID0gInZhbGlnbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgZGlyID0gImRpciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgdSA9ICJ1IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBzID0gInMiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIHJvd3NwYW4gPSAicm93c3BhbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgdHQgPSAidHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIGNvZGUgPSAiY29kZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUga2JkID0gImtiZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgc2FtcCA9ICJzYW1wIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBwcmUgPSAicHJlIjsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgSW52YWxpZE9wZW5YbWxEb2N1bWVudEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIEludmFsaWRPcGVuWG1sRG9jdW1lbnRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpIDogYmFzZShtZXNzYWdlKSB7IH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24gOiBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkgOiBiYXNlKG1lc3NhZ2UpIHsgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBDb2x1bW5SZWZlcmVuY2VPdXRPZlJhbmdlIDogRXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgQ29sdW1uUmVmZXJlbmNlT3V0T2ZSYW5nZShzdHJpbmcgY29sdW1uUmVmZXJlbmNlKQorICAgICAgICAgICAgOiBiYXNlKHN0cmluZy5Gb3JtYXQoIkNvbHVtbiByZWZlcmVuY2UgKHswfSkgaXMgb3V0IG9mIHJhbmdlLiIsIGNvbHVtblJlZmVyZW5jZSkpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBXb3Jrc2hlZXRBbHJlYWR5RXhpc3RzRXhjZXB0aW9uIDogRXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgV29ya3NoZWV0QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihzdHJpbmcgc2hlZXROYW1lKQorICAgICAgICAgICAgOiBiYXNlKHN0cmluZy5Gb3JtYXQoIlRoZSB3b3Jrc2hlZXQgKHswfSkgYWxyZWFkeSBleGlzdHMuIiwgc2hlZXROYW1lKSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvUHRVdGlsLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvUHRVdGlsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMTQzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9QdFV0aWwuY3MKQEAgLTAsMCArMSwxMjY2IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworVmVyc2lvbjogMi42LjAwCisgKiBFbmhhbmNlbWVudHMgdG8gc3VwcG9ydCBIdG1sQ29udmVydGVyLmNzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3MuQ29kZUFuYWx5c2lzOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBTeXN0ZW0uWG1sLlNjaGVtYTsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQdFV0aWxzCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBOb3JtYWxpemVEaXJOYW1lKHN0cmluZyBkaXJOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgZCA9IGRpck5hbWUuUmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICAgICAgaWYgKGRbZGlyTmFtZS5MZW5ndGggLSAxXSAhPSAnLycgJiYgZFtkaXJOYW1lLkxlbmd0aCAtIDFdICE9ICdcXCcpCisgICAgICAgICAgICAgICAgcmV0dXJuIGQgKyAiLyI7CisKKyAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgTWFrZVZhbGlkWG1sKHN0cmluZyBwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcC5BbnkoYyA9PiBjIDwgMHgyMCkKKyAgICAgICAgICAgICAgICA/IHAuU2VsZWN0KGMgPT4gYyA8IDB4MjAgPyBzdHJpbmcuRm9ybWF0KCJfezA6WH1fIiwgKGludCkgYykgOiBjLlRvU3RyaW5nKCkpLlN0cmluZ0NvbmNhdGVuYXRlKCkKKyAgICAgICAgICAgICAgICA6IHA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkRWxlbWVudElmTWlzc2luZyhYRG9jdW1lbnQgcGFydFhEb2MsIFhFbGVtZW50IGV4aXN0aW5nLCBzdHJpbmcgbmV3RWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGV4aXN0aW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBYRWxlbWVudCBuZXdYRWxlbWVudCA9IFhFbGVtZW50LlBhcnNlKG5ld0VsZW1lbnQpOworICAgICAgICAgICAgbmV3WEVsZW1lbnQuQXR0cmlidXRlcygpLldoZXJlKGEgPT4gYS5Jc05hbWVzcGFjZURlY2xhcmF0aW9uKS5SZW1vdmUoKTsKKyAgICAgICAgICAgIGlmIChwYXJ0WERvYy5Sb290ICE9IG51bGwpIHBhcnRYRG9jLlJvb3QuQWRkKG5ld1hFbGVtZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBNaHRQYXJzZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTWltZVZlcnNpb247CisgICAgICAgIHB1YmxpYyBzdHJpbmcgQ29udGVudFR5cGU7CisgICAgICAgIHB1YmxpYyBNaHRQYXJzZXJQYXJ0W10gUGFydHM7CisKKyAgICAgICAgcHVibGljIGNsYXNzIE1odFBhcnNlclBhcnQKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHN0cmluZyBDb250ZW50TG9jYXRpb247CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBDb250ZW50VHlwZTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgQ2hhclNldDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgVGV4dDsKKyAgICAgICAgICAgIHB1YmxpYyBieXRlW10gQmluYXJ5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBNaHRQYXJzZXIgUGFyc2Uoc3RyaW5nIHNyYykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIG1pbWVWZXJzaW9uID0gbnVsbDsKKyAgICAgICAgICAgIHN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7CisgICAgICAgICAgICBzdHJpbmcgYm91bmRhcnkgPSBudWxsOworCisgICAgICAgICAgICBzdHJpbmdbXSBsaW5lcyA9IHNyYy5TcGxpdChuZXdbXSB7IEVudmlyb25tZW50Lk5ld0xpbmUgfSwgU3RyaW5nU3BsaXRPcHRpb25zLk5vbmUpOworCisKKyAgICAgICAgICAgIHZhciBwcmlhbWJsZUtleVdvcmRzID0gbmV3W10KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiTUlNRS1WRVJTSU9OOiIsCisgICAgICAgICAgICAgICAgIkNPTlRFTlQtVFlQRToiLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdmFyIHByaWFtYmxlID0gbGluZXMuVGFrZVdoaWxlKGwgPT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcyA9IGwuVG9VcHBlcigpOworICAgICAgICAgICAgICAgIHJldHVybiBwcmlhbWJsZUtleVdvcmRzLkFueShwayA9PiBzLlN0YXJ0c1dpdGgocGspKTsKKyAgICAgICAgICAgIH0pLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gcHJpYW1ibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0uVG9VcHBlcigpLlN0YXJ0c1dpdGgoIk1JTUUtVkVSU0lPTjoiKSkKKyAgICAgICAgICAgICAgICAgICAgbWltZVZlcnNpb24gPSBpdGVtLlN1YnN0cmluZygiTUlNRS1WRVJTSU9OOiIuTGVuZ3RoKS5UcmltKCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS5Ub1VwcGVyKCkuU3RhcnRzV2l0aCgiQ09OVEVOVC1UWVBFOiIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRlbnRUeXBlTGluZSA9IGl0ZW0uU3Vic3RyaW5nKCJDT05URU5ULVRZUEU6Ii5MZW5ndGgpLlRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNwbCA9IGNvbnRlbnRUeXBlTGluZS5TcGxpdCgnOycpLlNlbGVjdCh6ID0+IHouVHJpbSgpKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzIGluIHNwbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuU3RhcnRzV2l0aCgiYm91bmRhcnkiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmVnVGV4dCA9ICJib3VuZGFyeT1cIiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJlZ0xlbiA9IGJlZ1RleHQuTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gcy5TdWJzdHJpbmcoYmVnTGVuLCBzLkxlbmd0aCAtIGJlZ0xlbiAtIDEpLlRyaW1TdGFydCgnLScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNvbnRlbnQgaW4gTUhUTUwiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGdyb3VwZWQgPSBsaW5lcworICAgICAgICAgICAgICAgIC5Ta2lwKHByaWFtYmxlLkxlbmd0aCkKKyAgICAgICAgICAgICAgICAuR3JvdXBBZGphY2VudChsID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGwuVHJpbVN0YXJ0KCctJykgPT0gYm91bmRhcnk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLldoZXJlKGcgPT4gZy5LZXkgPT0gZmFsc2UpCisgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgdmFyIHBhcnRzID0gZ3JvdXBlZC5TZWxlY3QocnAgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwYXJ0UHJpYW1ibGVLZXlXb3JkcyA9IG5ld1tdCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICJDT05URU5ULUxPQ0FUSU9OOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ09OVEVOVC1UUkFOU0ZFUi1FTkNPRElORzoiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNPTlRFTlQtVFlQRToiLAorICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIHZhciBwYXJ0UHJpYW1ibGUgPSBycC5UYWtlV2hpbGUobCA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGwuVG9VcHBlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRQcmlhbWJsZUtleVdvcmRzLkFueShwayA9PiBzLlN0YXJ0c1dpdGgocGspKTsKKyAgICAgICAgICAgICAgICAgICAgfSkuVG9BcnJheSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb250ZW50TG9jYXRpb24gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGVudFRyYW5zZmVyRW5jb2RpbmcgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcGFydENvbnRlbnRUeXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHBhcnRDaGFyU2V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHBhcnRCaW5hcnkgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIHBhcnRQcmlhbWJsZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uVG9VcHBlcigpLlN0YXJ0c1dpdGgoIkNPTlRFTlQtTE9DQVRJT046IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudExvY2F0aW9uID0gaXRlbS5TdWJzdHJpbmcoIkNPTlRFTlQtTE9DQVRJT046Ii5MZW5ndGgpLlRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0uVG9VcHBlcigpLlN0YXJ0c1dpdGgoIkNPTlRFTlQtVFJBTlNGRVItRU5DT0RJTkc6IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFRyYW5zZmVyRW5jb2RpbmcgPSBpdGVtLlN1YnN0cmluZygiQ09OVEVOVC1UUkFOU0ZFUi1FTkNPRElORzoiLkxlbmd0aCkuVHJpbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS5Ub1VwcGVyKCkuU3RhcnRzV2l0aCgiQ09OVEVOVC1UWVBFOiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRDb250ZW50VHlwZSA9IGl0ZW0uU3Vic3RyaW5nKCJDT05URU5ULVRZUEU6Ii5MZW5ndGgpLlRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhciBibGFua0xpbmVzQXRCZWdpbm5pbmcgPSBycAorICAgICAgICAgICAgICAgICAgICAgICAgLlNraXAocGFydFByaWFtYmxlLkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5UYWtlV2hpbGUobCA9PiBsID09ICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLkNvdW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRUZXh0ID0gcnAKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Ta2lwKHBhcnRQcmlhbWJsZS5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcChibGFua0xpbmVzQXRCZWdpbm5pbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGwgPT4gbCArIEVudmlyb25tZW50Lk5ld0xpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocGFydENvbnRlbnRUeXBlICE9IG51bGwgJiYgcGFydENvbnRlbnRUeXBlLkNvbnRhaW5zKCI7IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzUGFydENvbnRlbnRUeXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcGwgPSBwYXJ0Q29udGVudFR5cGUuU3BsaXQoJzsnKS5TZWxlY3QocyA9PiBzLlRyaW0oKSkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHMgaW4gc3BsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLlN0YXJ0c1dpdGgoImNoYXJzZXQiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiZWdUZXh0ID0gImNoYXJzZXQ9XCIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmVnTGVuID0gYmVnVGV4dC5MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRDaGFyU2V0ID0gcy5TdWJzdHJpbmcoYmVnTGVuLCBzLkxlbmd0aCAtIGJlZ0xlbiAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNQYXJ0Q29udGVudFR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNQYXJ0Q29udGVudFR5cGUgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNvbnRlbnQgaW4gTUhUTUwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRDb250ZW50VHlwZSA9IHRoaXNQYXJ0Q29udGVudFR5cGU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFRyYW5zZmVyRW5jb2RpbmcgIT0gbnVsbCAmJiBjb250ZW50VHJhbnNmZXJFbmNvZGluZy5Ub1VwcGVyKCkgPT0gIkJBU0U2NCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRCaW5hcnkgPSBDb252ZXJ0LkZyb21CYXNlNjRTdHJpbmcocGFydFRleHQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNaHRQYXJzZXJQYXJ0KCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudExvY2F0aW9uID0gY29udGVudExvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFRyYW5zZmVyRW5jb2RpbmcgPSBjb250ZW50VHJhbnNmZXJFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0gcGFydENvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNldCA9IHBhcnRDaGFyU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9IHBhcnRUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5ID0gcGFydEJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5XaGVyZShwID0+IHAuQ29udGVudFR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IE1odFBhcnNlcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPSBjb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICBNaW1lVmVyc2lvbiA9IG1pbWVWZXJzaW9uLAorICAgICAgICAgICAgICAgIFBhcnRzID0gcGFydHMsCisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE5vcm1hbGl6ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWERvY3VtZW50IE5vcm1hbGl6ZShYRG9jdW1lbnQgc291cmNlLCBYbWxTY2hlbWFTZXQgc2NoZW1hKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGhhdmVQU1ZJID0gZmFsc2U7CisgICAgICAgICAgICAvLyB2YWxpZGF0ZSwgdGhyb3cgZXJyb3JzLCBhZGQgUFNWSSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNvdXJjZS5WYWxpZGF0ZShzY2hlbWEsIG51bGwsIHRydWUpOworICAgICAgICAgICAgICAgIGhhdmVQU1ZJID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgWERvY3VtZW50KAorICAgICAgICAgICAgICAgIHNvdXJjZS5EZWNsYXJhdGlvbiwKKyAgICAgICAgICAgICAgICBzb3VyY2UuTm9kZXMoKS5TZWxlY3QobiA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGNvbW1lbnRzLCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgYW5kIHRleHQgbm9kZXMgdGhhdCBhcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hpbGRyZW4gb2YgWERvY3VtZW50LiAgT25seSB3aGl0ZSBzcGFjZSB0ZXh0IG5vZGVzIGFyZSBhbGxvd2VkIGFzCisgICAgICAgICAgICAgICAgICAgIC8vIGNoaWxkcmVuIG9mIGEgZG9jdW1lbnQsIHNvIHdlIGNhbiByZW1vdmUgYWxsIHRleHQgbm9kZXMuCisgICAgICAgICAgICAgICAgICAgIGlmIChuIGlzIFhDb21tZW50IHx8IG4gaXMgWFByb2Nlc3NpbmdJbnN0cnVjdGlvbiB8fCBuIGlzIFhUZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGUgPSBuIGFzIFhFbGVtZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vcm1hbGl6ZUVsZW1lbnQoZSwgaGF2ZVBTVkkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBEZWVwRXF1YWxzV2l0aE5vcm1hbGl6YXRpb24oWERvY3VtZW50IGRvYzEsIFhEb2N1bWVudCBkb2MyLAorICAgICAgICAgICAgWG1sU2NoZW1hU2V0IHNjaGVtYVNldCkKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IGQxID0gTm9ybWFsaXplKGRvYzEsIHNjaGVtYVNldCk7CisgICAgICAgICAgICBYRG9jdW1lbnQgZDIgPSBOb3JtYWxpemUoZG9jMiwgc2NoZW1hU2V0KTsKKyAgICAgICAgICAgIHJldHVybiBYTm9kZS5EZWVwRXF1YWxzKGQxLCBkMik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBJRW51bWVyYWJsZTxYQXR0cmlidXRlPiBOb3JtYWxpemVBdHRyaWJ1dGVzKFhFbGVtZW50IGVsZW1lbnQsCisgICAgICAgICAgICBib29sIGhhdmVQU1ZJKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5BdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGEgPT4gIWEuSXNOYW1lc3BhY2VEZWNsYXJhdGlvbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYS5OYW1lICE9IFhzaS5zY2hlbWFMb2NhdGlvbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYS5OYW1lICE9IFhzaS5ub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAuT3JkZXJCeShhID0+IGEuTmFtZS5OYW1lc3BhY2VOYW1lKQorICAgICAgICAgICAgICAgICAgICAuVGhlbkJ5KGEgPT4gYS5OYW1lLkxvY2FsTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgLlNlbGVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGEgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZVBTVkkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHQgPSBhLkdldFNjaGVtYUluZm8oKS5TY2hlbWFUeXBlLlR5cGVDb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGR0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkJvb2xlYW46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYQXR0cmlidXRlKGEuTmFtZSwgKGJvb2wpYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkRhdGVUaW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEF0dHJpYnV0ZShhLk5hbWUsIChEYXRlVGltZSlhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWG1sVHlwZUNvZGUuRGVjaW1hbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhBdHRyaWJ1dGUoYS5OYW1lLCAoZGVjaW1hbClhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWG1sVHlwZUNvZGUuRG91YmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEF0dHJpYnV0ZShhLk5hbWUsIChkb3VibGUpYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkZsb2F0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEF0dHJpYnV0ZShhLk5hbWUsIChmbG9hdClhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWG1sVHlwZUNvZGUuSGV4QmluYXJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYbWxUeXBlQ29kZS5MYW5ndWFnZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhBdHRyaWJ1dGUoYS5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cmluZylhKS5Ub0xvd2VyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWE5vZGUgTm9ybWFsaXplTm9kZShYTm9kZSBub2RlLCBib29sIGhhdmVQU1ZJKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB0cmltIGNvbW1lbnRzIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBmcm9tIG5vcm1hbGl6ZWQgdHJlZQorICAgICAgICAgICAgaWYgKG5vZGUgaXMgWENvbW1lbnQgfHwgbm9kZSBpcyBYUHJvY2Vzc2luZ0luc3RydWN0aW9uKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgWEVsZW1lbnQgZSA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBOb3JtYWxpemVFbGVtZW50KGUsIGhhdmVQU1ZJKTsKKyAgICAgICAgICAgIC8vIE9ubHkgdGhpbmcgbGVmdCBpcyBYQ0RhdGEgYW5kIFhUZXh0LCBzbyBjbG9uZSB0aGVtCisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IE5vcm1hbGl6ZUVsZW1lbnQoWEVsZW1lbnQgZWxlbWVudCwgYm9vbCBoYXZlUFNWSSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhhdmVQU1ZJKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBkdCA9IGVsZW1lbnQuR2V0U2NoZW1hSW5mbygpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZHQuU2NoZW1hVHlwZS5UeXBlQ29kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgWG1sVHlwZUNvZGUuQm9vbGVhbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZUF0dHJpYnV0ZXMoZWxlbWVudCwgaGF2ZVBTVkkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChib29sKWVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkRhdGVUaW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsaXplQXR0cmlidXRlcyhlbGVtZW50LCBoYXZlUFNWSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERhdGVUaW1lKWVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkRlY2ltYWw6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVBdHRyaWJ1dGVzKGVsZW1lbnQsIGhhdmVQU1ZJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjaW1hbCllbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYbWxUeXBlQ29kZS5Eb3VibGU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVBdHRyaWJ1dGVzKGVsZW1lbnQsIGhhdmVQU1ZJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKWVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkZsb2F0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsaXplQXR0cmlidXRlcyhlbGVtZW50LCBoYXZlUFNWSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KWVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbFR5cGVDb2RlLkhleEJpbmFyeToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYbWxUeXBlQ29kZS5MYW5ndWFnZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZUF0dHJpYnV0ZXMoZWxlbWVudCwgaGF2ZVBTVkkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3RyaW5nKWVsZW1lbnQpLlRvTG93ZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVBdHRyaWJ1dGVzKGVsZW1lbnQsIGhhdmVQU1ZJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gTm9ybWFsaXplTm9kZShuLCBoYXZlUFNWSSkpCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgTm9ybWFsaXplQXR0cmlidXRlcyhlbGVtZW50LCBoYXZlUFNWSSksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBOb3JtYWxpemVOb2RlKG4sIGhhdmVQU1ZJKSkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIEZpbGVVdGlscworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBEaXJlY3RvcnlJbmZvIEdldERhdGVUaW1lU3RhbXBlZERpcmVjdG9yeUluZm8oc3RyaW5nIHByZWZpeCkKKyAgICAgICAgeworICAgICAgICAgICAgRGF0ZVRpbWUgbm93ID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgc3RyaW5nIGRpck5hbWUgPQorICAgICAgICAgICAgICAgIHByZWZpeCArCisgICAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgiLXswOjAwfS17MTowMH0tezI6MDB9LXszOjAwfXs0OjAwfXs1OjAwfSIsIG5vdy5ZZWFyIC0gMjAwMCwgbm93Lk1vbnRoLCBub3cuRGF5LCBub3cuSG91ciwKKyAgICAgICAgICAgICAgICAgICAgbm93Lk1pbnV0ZSwgbm93LlNlY29uZCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IERpcmVjdG9yeUluZm8oZGlyTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIEZpbGVJbmZvIEdldERhdGVUaW1lU3RhbXBlZEZpbGVJbmZvKHN0cmluZyBwcmVmaXgsIHN0cmluZyBzdWZmaXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGVUaW1lIG5vdyA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgIHN0cmluZyBmaWxlTmFtZSA9CisgICAgICAgICAgICAgICAgcHJlZml4ICsKKyAgICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KCItezA6MDB9LXsxOjAwfS17MjowMH0tezM6MDB9ezQ6MDB9ezU6MDB9Iiwgbm93LlllYXIgLSAyMDAwLCBub3cuTW9udGgsIG5vdy5EYXksIG5vdy5Ib3VyLAorICAgICAgICAgICAgICAgICAgICBub3cuTWludXRlLCBub3cuU2Vjb25kKSArCisgICAgICAgICAgICAgICAgc3VmZml4OworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5mbyhmaWxlTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVGhyZWFkU2FmZUNyZWF0ZURpcmVjdG9yeShEaXJlY3RvcnlJbmZvIGRpcikKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpci5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkaXIuQ3JlYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcCg1MCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFRocmVhZFNhZmVDb3B5KEZpbGVJbmZvIHNvdXJjZUZpbGUsIEZpbGVJbmZvIGRlc3RGaWxlKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVzdEZpbGUuRXhpc3RzKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZUZpbGUuRnVsbE5hbWUsIGRlc3RGaWxlLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5UaHJlYWRpbmcuVGhyZWFkLlNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVGhyZWFkU2FmZUNyZWF0ZUVtcHR5VGV4dEZpbGVJZk5vdEV4aXN0KEZpbGVJbmZvIGZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaWxlLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KGZpbGUuRnVsbE5hbWUsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5UaHJlYWRpbmcuVGhyZWFkLlNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmICFORVQzNQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBUaHJlYWRTYWZlQXBwZW5kQWxsTGluZXMoRmlsZUluZm8gZmlsZSwgc3RyaW5nW10gc3RyaW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGaWxlLkFwcGVuZEFsbExpbmVzKGZpbGUuRnVsbE5hbWUsIHN0cmluZ3MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoNTApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0PHN0cmluZz4gR2V0RmlsZXNSZWN1cnNpdmUoRGlyZWN0b3J5SW5mbyBkaXIsIHN0cmluZyBzZWFyY2hQYXR0ZXJuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmlsZUxpc3QgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICBHZXRGaWxlc1JlY3Vyc2l2ZUludGVybmFsKGRpciwgc2VhcmNoUGF0dGVybiwgZmlsZUxpc3QpOworICAgICAgICAgICAgcmV0dXJuIGZpbGVMaXN0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBHZXRGaWxlc1JlY3Vyc2l2ZUludGVybmFsKERpcmVjdG9yeUluZm8gZGlyLCBzdHJpbmcgc2VhcmNoUGF0dGVybiwgTGlzdDxzdHJpbmc+IGZpbGVMaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaWxlTGlzdC5BZGRSYW5nZShkaXIuR2V0RmlsZXMoc2VhcmNoUGF0dGVybikuU2VsZWN0KGZpbGUgPT4gZmlsZS5GdWxsTmFtZSkpOworICAgICAgICAgICAgZm9yZWFjaCAoRGlyZWN0b3J5SW5mbyBzdWJkaXIgaW4gZGlyLkdldERpcmVjdG9yaWVzKCkpCisgICAgICAgICAgICAgICAgR2V0RmlsZXNSZWN1cnNpdmVJbnRlcm5hbChzdWJkaXIsIHNlYXJjaFBhdHRlcm4sIGZpbGVMaXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxzdHJpbmc+IEdldEZpbGVzUmVjdXJzaXZlKERpcmVjdG9yeUluZm8gZGlyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmlsZUxpc3QgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICBHZXRGaWxlc1JlY3Vyc2l2ZUludGVybmFsKGRpciwgZmlsZUxpc3QpOworICAgICAgICAgICAgcmV0dXJuIGZpbGVMaXN0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBHZXRGaWxlc1JlY3Vyc2l2ZUludGVybmFsKERpcmVjdG9yeUluZm8gZGlyLCBMaXN0PHN0cmluZz4gZmlsZUxpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGVMaXN0LkFkZFJhbmdlKGRpci5HZXRGaWxlcygpLlNlbGVjdChmaWxlID0+IGZpbGUuRnVsbE5hbWUpKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKERpcmVjdG9yeUluZm8gc3ViZGlyIGluIGRpci5HZXREaXJlY3RvcmllcygpKQorICAgICAgICAgICAgICAgIEdldEZpbGVzUmVjdXJzaXZlSW50ZXJuYWwoc3ViZGlyLCBmaWxlTGlzdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQ29weVN0cmVhbShTdHJlYW0gc291cmNlLCBTdHJlYW0gdGFyZ2V0KQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQgYnVmU2l6ZSA9IDB4NDA5NjsKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgYnl0ZVtidWZTaXplXTsKKyAgICAgICAgICAgIGludCBieXRlc1JlYWQ7CisgICAgICAgICAgICB3aGlsZSAoKGJ5dGVzUmVhZCA9IHNvdXJjZS5SZWFkKGJ1ZiwgMCwgYnVmU2l6ZSkpID4gMCkKKyAgICAgICAgICAgICAgICB0YXJnZXQuV3JpdGUoYnVmLCAwLCBieXRlc1JlYWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQdEV4dGVuc2lvbnMKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWEVsZW1lbnQgR2V0WEVsZW1lbnQodGhpcyBYbWxOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4RG9jID0gbmV3IFhEb2N1bWVudCgpOworICAgICAgICAgICAgdXNpbmcgKFhtbFdyaXRlciB4bWxXcml0ZXIgPSB4RG9jLkNyZWF0ZVdyaXRlcigpKQorICAgICAgICAgICAgICAgIG5vZGUuV3JpdGVUbyh4bWxXcml0ZXIpOworICAgICAgICAgICAgcmV0dXJuIHhEb2MuUm9vdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9kZSBHZXRYbWxOb2RlKHRoaXMgWEVsZW1lbnQgZWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHhtbERvYyA9IG5ldyBYbWxEb2N1bWVudCgpOworICAgICAgICAgICAgdXNpbmcgKFhtbFJlYWRlciB4bWxSZWFkZXIgPSBlbGVtZW50LkNyZWF0ZVJlYWRlcigpKQorICAgICAgICAgICAgICAgIHhtbERvYy5Mb2FkKHhtbFJlYWRlcik7CisgICAgICAgICAgICByZXR1cm4geG1sRG9jOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRG9jdW1lbnQgR2V0WERvY3VtZW50KHRoaXMgWG1sRG9jdW1lbnQgZG9jdW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4RG9jID0gbmV3IFhEb2N1bWVudCgpOworICAgICAgICAgICAgdXNpbmcgKFhtbFdyaXRlciB4bWxXcml0ZXIgPSB4RG9jLkNyZWF0ZVdyaXRlcigpKQorICAgICAgICAgICAgICAgIGRvY3VtZW50LldyaXRlVG8oeG1sV3JpdGVyKTsKKworICAgICAgICAgICAgWG1sRGVjbGFyYXRpb24gZGVjbCA9IGRvY3VtZW50LkNoaWxkTm9kZXMuT2ZUeXBlPFhtbERlY2xhcmF0aW9uPigpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoZGVjbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHhEb2MuRGVjbGFyYXRpb24gPSBuZXcgWERlY2xhcmF0aW9uKGRlY2wuVmVyc2lvbiwgZGVjbC5FbmNvZGluZywgZGVjbC5TdGFuZGFsb25lKTsKKworICAgICAgICAgICAgcmV0dXJuIHhEb2M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvY3VtZW50IEdldFhtbERvY3VtZW50KHRoaXMgWERvY3VtZW50IGRvY3VtZW50KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgeG1sRG9jID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgICAgICB1c2luZyAoWG1sUmVhZGVyIHhtbFJlYWRlciA9IGRvY3VtZW50LkNyZWF0ZVJlYWRlcigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhtbERvYy5Mb2FkKHhtbFJlYWRlcik7CisgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LkRlY2xhcmF0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYbWxEZWNsYXJhdGlvbiBkZWMgPSB4bWxEb2MuQ3JlYXRlWG1sRGVjbGFyYXRpb24oZG9jdW1lbnQuRGVjbGFyYXRpb24uVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LkRlY2xhcmF0aW9uLkVuY29kaW5nLCBkb2N1bWVudC5EZWNsYXJhdGlvbi5TdGFuZGFsb25lKTsKKyAgICAgICAgICAgICAgICAgICAgeG1sRG9jLkluc2VydEJlZm9yZShkZWMsIHhtbERvYy5GaXJzdENoaWxkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4geG1sRG9jOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgU3RyaW5nQ29uY2F0ZW5hdGUodGhpcyBJRW51bWVyYWJsZTxzdHJpbmc+IHNvdXJjZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5BZ2dyZWdhdGUoCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoKSwKKyAgICAgICAgICAgICAgICAoc2IsIHMpID0+IHNiLkFwcGVuZChzKSwKKyAgICAgICAgICAgICAgICBzYiA9PiBzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFN0cmluZ0NvbmNhdGVuYXRlPFQ+KHRoaXMgSUVudW1lcmFibGU8VD4gc291cmNlLCBGdW5jPFQsIHN0cmluZz4gcHJvamVjdGlvbkZ1bmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzb3VyY2UuQWdncmVnYXRlKAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdCdWlsZGVyKCksCisgICAgICAgICAgICAgICAgKHNiLCBpKSA9PiBzYi5BcHBlbmQocHJvamVjdGlvbkZ1bmMoaSkpLAorICAgICAgICAgICAgICAgIHNiID0+IHNiLlRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxUUmVzdWx0PiBQdFppcDxURmlyc3QsIFRTZWNvbmQsIFRSZXN1bHQ+KAorICAgICAgICAgICAgdGhpcyBJRW51bWVyYWJsZTxURmlyc3Q+IGZpcnN0LAorICAgICAgICAgICAgSUVudW1lcmFibGU8VFNlY29uZD4gc2Vjb25kLAorICAgICAgICAgICAgRnVuYzxURmlyc3QsIFRTZWNvbmQsIFRSZXN1bHQ+IGZ1bmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChJRW51bWVyYXRvcjxURmlyc3Q+IGllMSA9IGZpcnN0LkdldEVudW1lcmF0b3IoKSkKKyAgICAgICAgICAgIHVzaW5nIChJRW51bWVyYXRvcjxUU2Vjb25kPiBpZTIgPSBzZWNvbmQuR2V0RW51bWVyYXRvcigpKQorICAgICAgICAgICAgICAgIHdoaWxlIChpZTEuTW92ZU5leHQoKSAmJiBpZTIuTW92ZU5leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIGZ1bmMoaWUxLkN1cnJlbnQsIGllMi5DdXJyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8SUdyb3VwaW5nPFRLZXksIFRTb3VyY2U+PiBHcm91cEFkamFjZW50PFRTb3VyY2UsIFRLZXk+KAorICAgICAgICAgICAgdGhpcyBJRW51bWVyYWJsZTxUU291cmNlPiBzb3VyY2UsCisgICAgICAgICAgICBGdW5jPFRTb3VyY2UsIFRLZXk+IGtleVNlbGVjdG9yKQorICAgICAgICB7CisgICAgICAgICAgICBUS2V5IGxhc3QgPSBkZWZhdWx0KFRLZXkpOworICAgICAgICAgICAgdmFyIGhhdmVMYXN0ID0gZmFsc2U7CisgICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBMaXN0PFRTb3VyY2U+KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKFRTb3VyY2UgcyBpbiBzb3VyY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVEtleSBrID0ga2V5U2VsZWN0b3Iocyk7CisgICAgICAgICAgICAgICAgaWYgKGhhdmVMYXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFrLkVxdWFscyhsYXN0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIG5ldyBHcm91cE9mQWRqYWNlbnQ8VFNvdXJjZSwgVEtleT4obGlzdCwgbGFzdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgTGlzdDxUU291cmNlPiB7IHMgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQocyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZChzKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGs7CisgICAgICAgICAgICAgICAgICAgIGhhdmVMYXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGF2ZUxhc3QpCisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIG5ldyBHcm91cE9mQWRqYWNlbnQ8VFNvdXJjZSwgVEtleT4obGlzdCwgbGFzdCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEluaXRpYWxpemVTaWJsaW5nc1JldmVyc2VEb2N1bWVudE9yZGVyKFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IHByZXYgPSBudWxsOworICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgZSBpbiBlbGVtZW50LkVsZW1lbnRzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZS5BZGRBbm5vdGF0aW9uKG5ldyBTaWJsaW5nc1JldmVyc2VEb2N1bWVudE9yZGVySW5mbyB7IFByZXZpb3VzU2libGluZyA9IHByZXYgfSk7CisgICAgICAgICAgICAgICAgcHJldiA9IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbU3VwcHJlc3NNZXNzYWdlKCJSZVNoYXJwZXIiLCAiUG9zc2libGVOdWxsUmVmZXJlbmNlRXhjZXB0aW9uIildCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8WEVsZW1lbnQ+IFNpYmxpbmdzQmVmb3JlU2VsZlJldmVyc2VEb2N1bWVudE9yZGVyKAorICAgICAgICAgICAgdGhpcyBYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWxlbWVudC5Bbm5vdGF0aW9uPFNpYmxpbmdzUmV2ZXJzZURvY3VtZW50T3JkZXJJbmZvPigpID09IG51bGwpCisgICAgICAgICAgICAgICAgSW5pdGlhbGl6ZVNpYmxpbmdzUmV2ZXJzZURvY3VtZW50T3JkZXIoZWxlbWVudC5QYXJlbnQpOworICAgICAgICAgICAgWEVsZW1lbnQgY3VycmVudCA9IGVsZW1lbnQ7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBwcmV2aW91c0VsZW1lbnQgPSBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgIC5Bbm5vdGF0aW9uPFNpYmxpbmdzUmV2ZXJzZURvY3VtZW50T3JkZXJJbmZvPigpCisgICAgICAgICAgICAgICAgICAgIC5QcmV2aW91c1NpYmxpbmc7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCBicmVhazsKKworICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBwcmV2aW91c0VsZW1lbnQ7CisKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gcHJldmlvdXNFbGVtZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBJbml0aWFsaXplRGVzY2VuZGFudHNSZXZlcnNlRG9jdW1lbnRPcmRlcihYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBwcmV2ID0gbnVsbDsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGUgaW4gZWxlbWVudC5EZXNjZW5kYW50cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGUuQWRkQW5ub3RhdGlvbihuZXcgRGVzY2VuZGFudHNSZXZlcnNlRG9jdW1lbnRPcmRlckluZm8geyBQcmV2aW91c0VsZW1lbnQgPSBwcmV2IH0pOworICAgICAgICAgICAgICAgIHByZXYgPSBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1N1cHByZXNzTWVzc2FnZSgiUmVTaGFycGVyIiwgIlBvc3NpYmxlTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiIpXQorICAgICAgICBwdWJsaWMgc3RhdGljIElFbnVtZXJhYmxlPFhFbGVtZW50PiBEZXNjZW5kYW50c0JlZm9yZVNlbGZSZXZlcnNlRG9jdW1lbnRPcmRlcigKKyAgICAgICAgICAgIHRoaXMgWEVsZW1lbnQgZWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVsZW1lbnQuQW5ub3RhdGlvbjxEZXNjZW5kYW50c1JldmVyc2VEb2N1bWVudE9yZGVySW5mbz4oKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIEluaXRpYWxpemVEZXNjZW5kYW50c1JldmVyc2VEb2N1bWVudE9yZGVyKGVsZW1lbnQuQW5jZXN0b3JzQW5kU2VsZigpLkxhc3QoKSk7CisgICAgICAgICAgICBYRWxlbWVudCBjdXJyZW50ID0gZWxlbWVudDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IHByZXZpb3VzRWxlbWVudCA9IGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgLkFubm90YXRpb248RGVzY2VuZGFudHNSZXZlcnNlRG9jdW1lbnRPcmRlckluZm8+KCkKKyAgICAgICAgICAgICAgICAgICAgLlByZXZpb3VzRWxlbWVudDsKKyAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGJyZWFrOworCisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIHByZXZpb3VzRWxlbWVudDsKKworICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwcmV2aW91c0VsZW1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEluaXRpYWxpemVEZXNjZW5kYW50c1RyaW1tZWRSZXZlcnNlRG9jdW1lbnRPcmRlcihYRWxlbWVudCBlbGVtZW50LCBYTmFtZSB0cmltTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgcHJldiA9IG51bGw7CisgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBlIGluIGVsZW1lbnQuRGVzY2VuZGFudHNUcmltbWVkKHRyaW1OYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlLkFkZEFubm90YXRpb24obmV3IERlc2NlbmRhbnRzVHJpbW1lZFJldmVyc2VEb2N1bWVudE9yZGVySW5mbyB7IFByZXZpb3VzRWxlbWVudCA9IHByZXYgfSk7CisgICAgICAgICAgICAgICAgcHJldiA9IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbU3VwcHJlc3NNZXNzYWdlKCJSZVNoYXJwZXIiLCAiUG9zc2libGVOdWxsUmVmZXJlbmNlRXhjZXB0aW9uIildCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8WEVsZW1lbnQ+IERlc2NlbmRhbnRzVHJpbW1lZEJlZm9yZVNlbGZSZXZlcnNlRG9jdW1lbnRPcmRlcigKKyAgICAgICAgICAgIHRoaXMgWEVsZW1lbnQgZWxlbWVudCwgWE5hbWUgdHJpbU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50LkFubm90YXRpb248RGVzY2VuZGFudHNUcmltbWVkUmV2ZXJzZURvY3VtZW50T3JkZXJJbmZvPigpID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgYW5jZXMgPSBlbGVtZW50LkFuY2VzdG9yc0FuZFNlbGYoVy50eGJ4Q29udGVudCkuRmlyc3RPckRlZmF1bHQoKSA/PworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BbmNlc3RvcnNBbmRTZWxmKCkuTGFzdCgpOworICAgICAgICAgICAgICAgIEluaXRpYWxpemVEZXNjZW5kYW50c1RyaW1tZWRSZXZlcnNlRG9jdW1lbnRPcmRlcihhbmNlcywgdHJpbU5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBYRWxlbWVudCBjdXJyZW50ID0gZWxlbWVudDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IHByZXZpb3VzRWxlbWVudCA9IGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgLkFubm90YXRpb248RGVzY2VuZGFudHNUcmltbWVkUmV2ZXJzZURvY3VtZW50T3JkZXJJbmZvPigpCisgICAgICAgICAgICAgICAgICAgIC5QcmV2aW91c0VsZW1lbnQ7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCBicmVhazsKKworICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBwcmV2aW91c0VsZW1lbnQ7CisKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gcHJldmlvdXNFbGVtZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgVG9TdHJpbmdOZXdMaW5lT25BdHRyaWJ1dGVzKHRoaXMgWEVsZW1lbnQgZWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gbmV3IFhtbFdyaXRlclNldHRpbmdzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5kZW50ID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBPbWl0WG1sRGVjbGFyYXRpb24gPSB0cnVlLAorICAgICAgICAgICAgICAgIE5ld0xpbmVPbkF0dHJpYnV0ZXMgPSB0cnVlCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdmFyIHN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKHN0cmluZ0J1aWxkZXIpKQorICAgICAgICAgICAgdXNpbmcgKFhtbFdyaXRlciB4bWxXcml0ZXIgPSBYbWxXcml0ZXIuQ3JlYXRlKHN0cmluZ1dyaXRlciwgc2V0dGluZ3MpKQorICAgICAgICAgICAgICAgIGVsZW1lbnQuV3JpdGVUbyh4bWxXcml0ZXIpOworICAgICAgICAgICAgcmV0dXJuIHN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8WEVsZW1lbnQ+IERlc2NlbmRhbnRzVHJpbW1lZCh0aGlzIFhFbGVtZW50IGVsZW1lbnQsCisgICAgICAgICAgICBYTmFtZSB0cmltTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIERlc2NlbmRhbnRzVHJpbW1lZChlbGVtZW50LCBlID0+IGUuTmFtZSA9PSB0cmltTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIElFbnVtZXJhYmxlPFhFbGVtZW50PiBEZXNjZW5kYW50c1RyaW1tZWQodGhpcyBYRWxlbWVudCBlbGVtZW50LAorICAgICAgICAgICAgRnVuYzxYRWxlbWVudCwgYm9vbD4gcHJlZGljYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBTdGFjazxJRW51bWVyYXRvcjxYRWxlbWVudD4+IGl0ZXJhdG9yU3RhY2sgPSBuZXcgU3RhY2s8SUVudW1lcmF0b3I8WEVsZW1lbnQ+PigpOworICAgICAgICAgICAgaXRlcmF0b3JTdGFjay5QdXNoKGVsZW1lbnQuRWxlbWVudHMoKS5HZXRFbnVtZXJhdG9yKCkpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yU3RhY2suQ291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvclN0YWNrLlBlZWsoKS5Nb3ZlTmV4dCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgY3VycmVudFhFbGVtZW50ID0gaXRlcmF0b3JTdGFjay5QZWVrKCkuQ3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShjdXJyZW50WEVsZW1lbnQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gY3VycmVudFhFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIGN1cnJlbnRYRWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JTdGFjay5QdXNoKGN1cnJlbnRYRWxlbWVudC5FbGVtZW50cygpLkdldEVudW1lcmF0b3IoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGl0ZXJhdG9yU3RhY2suUG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIElFbnVtZXJhYmxlPFRSZXN1bHQ+IFJvbGx1cDxUU291cmNlLCBUUmVzdWx0PigKKyAgICAgICAgICAgIHRoaXMgSUVudW1lcmFibGU8VFNvdXJjZT4gc291cmNlLAorICAgICAgICAgICAgVFJlc3VsdCBzZWVkLAorICAgICAgICAgICAgRnVuYzxUU291cmNlLCBUUmVzdWx0LCBUUmVzdWx0PiBwcm9qZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBUUmVzdWx0IG5leHRTZWVkID0gc2VlZDsKKyAgICAgICAgICAgIGZvcmVhY2ggKFRTb3VyY2Ugc3JjIGluIHNvdXJjZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUUmVzdWx0IHByb2plY3RlZFZhbHVlID0gcHJvamVjdGlvbihzcmMsIG5leHRTZWVkKTsKKyAgICAgICAgICAgICAgICBuZXh0U2VlZCA9IHByb2plY3RlZFZhbHVlOworICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBwcm9qZWN0ZWRWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8VFJlc3VsdD4gUm9sbHVwPFRTb3VyY2UsIFRSZXN1bHQ+KAorICAgICAgICAgICAgdGhpcyBJRW51bWVyYWJsZTxUU291cmNlPiBzb3VyY2UsCisgICAgICAgICAgICBUUmVzdWx0IHNlZWQsCisgICAgICAgICAgICBGdW5jPFRTb3VyY2UsIFRSZXN1bHQsIGludCwgVFJlc3VsdD4gcHJvamVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVFJlc3VsdCBuZXh0U2VlZCA9IHNlZWQ7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgZm9yZWFjaCAoVFNvdXJjZSBzcmMgaW4gc291cmNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRSZXN1bHQgcHJvamVjdGVkVmFsdWUgPSBwcm9qZWN0aW9uKHNyYywgbmV4dFNlZWQsIGluZGV4KyspOworICAgICAgICAgICAgICAgIG5leHRTZWVkID0gcHJvamVjdGVkVmFsdWU7CisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIHByb2plY3RlZFZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxUU291cmNlPiBTZXF1ZW5jZUF0PFRTb3VyY2U+KHRoaXMgVFNvdXJjZVtdIHNvdXJjZSwgaW50IGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaSA9IGluZGV4OworICAgICAgICAgICAgd2hpbGUgKGkgPCBzb3VyY2UuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBzb3VyY2VbaSsrXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8VD4gU2tpcExhc3Q8VD4odGhpcyBJRW51bWVyYWJsZTxUPiBzb3VyY2UsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNhdmVMaXN0ID0gbmV3IFF1ZXVlPFQ+KCk7CisgICAgICAgICAgICB2YXIgc2F2ZWQgPSAwOworICAgICAgICAgICAgZm9yZWFjaCAoVCBpdGVtIGluIHNvdXJjZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2F2ZWQgPCBjb3VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNhdmVMaXN0LkVucXVldWUoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICsrc2F2ZWQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNhdmVMaXN0LkVucXVldWUoaXRlbSk7CisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIHNhdmVMaXN0LkRlcXVldWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbD8gVG9Cb29sZWFuKHRoaXMgWEF0dHJpYnV0ZSBhKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBzdHJpbmcgcyA9ICgoc3RyaW5nKSBhKS5Ub0xvd2VyKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiMSI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGNhc2UgIjAiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgY2FzZSAidHJ1ZSI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGNhc2UgImZhbHNlIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGNhc2UgIm9uIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgY2FzZSAib2ZmIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYm9vbCkgYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBHZXRRTmFtZShYRWxlbWVudCB4ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHByZWZpeCA9IHhlLkdldFByZWZpeE9mTmFtZXNwYWNlKHhlLk5hbWUuTmFtZXNwYWNlKTsKKyAgICAgICAgICAgIGlmICh4ZS5OYW1lLk5hbWVzcGFjZSA9PSBYTmFtZXNwYWNlLk5vbmUgfHwgcHJlZml4ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHhlLk5hbWUuTG9jYWxOYW1lOworCisgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgIjoiICsgeGUuTmFtZS5Mb2NhbE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0UU5hbWUoWEF0dHJpYnV0ZSB4YSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHByZWZpeCA9IHhhLlBhcmVudCAhPSBudWxsID8geGEuUGFyZW50LkdldFByZWZpeE9mTmFtZXNwYWNlKHhhLk5hbWUuTmFtZXNwYWNlKSA6IG51bGw7CisgICAgICAgICAgICBpZiAoeGEuTmFtZS5OYW1lc3BhY2UgPT0gWE5hbWVzcGFjZS5Ob25lIHx8IHByZWZpeCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiB4YS5OYW1lLlRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyAiOiIgKyB4YS5OYW1lLkxvY2FsTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBOYW1lV2l0aFByZWRpY2F0ZShYRWxlbWVudCBlbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVsLlBhcmVudCAhPSBudWxsICYmIGVsLlBhcmVudC5FbGVtZW50cyhlbC5OYW1lKS5Db3VudCgpICE9IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFFOYW1lKGVsKSArICJbIiArCisgICAgICAgICAgICAgICAgICAgIChlbC5FbGVtZW50c0JlZm9yZVNlbGYoZWwuTmFtZSkuQ291bnQoKSArIDEpICsgIl0iOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBHZXRRTmFtZShlbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBTdHJDYXQ8VD4odGhpcyBJRW51bWVyYWJsZTxUPiBzb3VyY2UsCisgICAgICAgICAgICBzdHJpbmcgc2VwYXJhdG9yKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc291cmNlLkFnZ3JlZ2F0ZShuZXcgU3RyaW5nQnVpbGRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAoc2IsIGkpID0+IHNiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuQXBwZW5kKGkuVG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoc2VwYXJhdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcyA9PiBzLlRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0WFBhdGgodGhpcyBYT2JqZWN0IHhvYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh4b2JqLlBhcmVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBkb2MgPSB4b2JqIGFzIFhEb2N1bWVudDsKKyAgICAgICAgICAgICAgICBpZiAoZG9jICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiLiI7CisKKyAgICAgICAgICAgICAgICB2YXIgZWwgPSB4b2JqIGFzIFhFbGVtZW50OworICAgICAgICAgICAgICAgIGlmIChlbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIi8iICsgTmFtZVdpdGhQcmVkaWNhdGUoZWwpOworCisgICAgICAgICAgICAgICAgdmFyIHh0ID0geG9iaiBhcyBYVGV4dDsKKyAgICAgICAgICAgICAgICBpZiAoeHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vdGhlIGZvbGxvd2luZyBkb2Vzbid0IHdvcmsgYmVjYXVzZSB0aGUgWFBhdGggZGF0YQorICAgICAgICAgICAgICAgIC8vbW9kZWwgZG9lc24ndCBpbmNsdWRlIHdoaXRlIHNwYWNlIHRleHQgbm9kZXMgdGhhdAorICAgICAgICAgICAgICAgIC8vYXJlIGNoaWxkcmVuIG9mIHRoZSBkb2N1bWVudC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vcmV0dXJuCisgICAgICAgICAgICAgICAgLy8gICAgIi8iICsKKyAgICAgICAgICAgICAgICAvLyAgICAoCisgICAgICAgICAgICAgICAgLy8gICAgICAgIHh0CisgICAgICAgICAgICAgICAgLy8gICAgICAgIC5Eb2N1bWVudAorICAgICAgICAgICAgICAgIC8vICAgICAgICAuTm9kZXMoKQorICAgICAgICAgICAgICAgIC8vICAgICAgICAuT2ZUeXBlPFhUZXh0PigpCisgICAgICAgICAgICAgICAgLy8gICAgICAgIC5Db3VudCgpICE9IDEgPworICAgICAgICAgICAgICAgIC8vICAgICAgICAidGV4dCgpWyIgKworICAgICAgICAgICAgICAgIC8vICAgICAgICAoeHQKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgLk5vZGVzQmVmb3JlU2VsZigpCisgICAgICAgICAgICAgICAgLy8gICAgICAgIC5PZlR5cGU8WFRleHQ+KCkKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgLkNvdW50KCkgKyAxKSArICJdIiA6CisgICAgICAgICAgICAgICAgLy8gICAgICAgICJ0ZXh0KCkiCisgICAgICAgICAgICAgICAgLy8gICAgKTsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHZhciBjb20gPSB4b2JqIGFzIFhDb21tZW50OworICAgICAgICAgICAgICAgIGlmIChjb20gIT0gbnVsbCAmJiBjb20uRG9jdW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICAiLyIgKworICAgICAgICAgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRG9jdW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk5vZGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk9mVHlwZTxYQ29tbWVudD4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ291bnQoKSAhPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gImNvbW1lbnQoKVsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuTm9kZXNCZWZvcmVTZWxmKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5PZlR5cGU8WENvbW1lbnQ+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Db3VudCgpICsgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJjb21tZW50KCkiCisgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgdmFyIHBpID0geG9iaiBhcyBYUHJvY2Vzc2luZ0luc3RydWN0aW9uOworICAgICAgICAgICAgICAgIGlmIChwaSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgICIvIiArCisgICAgICAgICAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkuRG9jdW1lbnQgIT0gbnVsbCAmJiBwaS5Eb2N1bWVudC5Ob2RlcygpLk9mVHlwZTxYUHJvY2Vzc2luZ0luc3RydWN0aW9uPigpLkNvdW50KCkgIT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJwcm9jZXNzaW5nLWluc3RydWN0aW9uKClbIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuTm9kZXNCZWZvcmVTZWxmKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5PZlR5cGU8WFByb2Nlc3NpbmdJbnN0cnVjdGlvbj4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkNvdW50KCkgKyAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZWwgPSB4b2JqIGFzIFhFbGVtZW50OworICAgICAgICAgICAgICAgIGlmIChlbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICAiLyIgKworICAgICAgICAgICAgICAgICAgICAgICAgZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQW5jZXN0b3JzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5Eb2N1bWVudE9yZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGUgPT4gTmFtZVdpdGhQcmVkaWNhdGUoZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlN0ckNhdCgiLyIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVXaXRoUHJlZGljYXRlKGVsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgYXQgPSB4b2JqIGFzIFhBdHRyaWJ1dGU7CisgICAgICAgICAgICAgICAgaWYgKGF0ICE9IG51bGwgJiYgYXQuUGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgIi8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BbmNlc3RvcnNBbmRTZWxmKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5Eb2N1bWVudE9yZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGUgPT4gTmFtZVdpdGhQcmVkaWNhdGUoZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlN0ckNhdCgiLyIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJAIiArIEdldFFOYW1lKGF0KTsKKworICAgICAgICAgICAgICAgIHZhciBjb20gPSB4b2JqIGFzIFhDb21tZW50OworICAgICAgICAgICAgICAgIGlmIChjb20gIT0gbnVsbCAmJiBjb20uUGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgIi8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5QYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQW5jZXN0b3JzQW5kU2VsZigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkluRG9jdW1lbnRPcmRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChlID0+IE5hbWVXaXRoUHJlZGljYXRlKGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TdHJDYXQoIi8iKSArCisgICAgICAgICAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5QYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk5vZGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk9mVHlwZTxYQ29tbWVudD4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ291bnQoKSAhPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gImNvbW1lbnQoKVsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuTm9kZXNCZWZvcmVTZWxmKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5PZlR5cGU8WENvbW1lbnQ+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Db3VudCgpICsgMSkgKyAiXSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiY29tbWVudCgpIgorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIHZhciBjZCA9IHhvYmogYXMgWENEYXRhOworICAgICAgICAgICAgICAgIGlmIChjZCAhPSBudWxsICYmIGNkLlBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgICIvIiArCisgICAgICAgICAgICAgICAgICAgICAgICBjZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5QYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQW5jZXN0b3JzQW5kU2VsZigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkluRG9jdW1lbnRPcmRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChlID0+IE5hbWVXaXRoUHJlZGljYXRlKGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TdHJDYXQoIi8iKSArCisgICAgICAgICAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuTm9kZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuT2ZUeXBlPFhUZXh0PigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Db3VudCgpICE9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAidGV4dCgpWyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk5vZGVzQmVmb3JlU2VsZigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuT2ZUeXBlPFhUZXh0PigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ291bnQoKSArIDEpICsgIl0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInRleHQoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICB2YXIgdHggPSB4b2JqIGFzIFhUZXh0OworICAgICAgICAgICAgICAgIGlmICh0eCAhPSBudWxsICYmIHR4LlBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgICIvIiArCisgICAgICAgICAgICAgICAgICAgICAgICB0eAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5QYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQW5jZXN0b3JzQW5kU2VsZigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkluRG9jdW1lbnRPcmRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChlID0+IE5hbWVXaXRoUHJlZGljYXRlKGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TdHJDYXQoIi8iKSArCisgICAgICAgICAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuTm9kZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuT2ZUeXBlPFhUZXh0PigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Db3VudCgpICE9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAidGV4dCgpWyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk5vZGVzQmVmb3JlU2VsZigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuT2ZUeXBlPFhUZXh0PigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ291bnQoKSArIDEpICsgIl0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInRleHQoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICB2YXIgcGkgPSB4b2JqIGFzIFhQcm9jZXNzaW5nSW5zdHJ1Y3Rpb247CisgICAgICAgICAgICAgICAgaWYgKHBpICE9IG51bGwgJiYgcGkuUGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgIi8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BbmNlc3RvcnNBbmRTZWxmKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5Eb2N1bWVudE9yZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGUgPT4gTmFtZVdpdGhQcmVkaWNhdGUoZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlN0ckNhdCgiLyIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUGFyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ob2RlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5PZlR5cGU8WFByb2Nlc3NpbmdJbnN0cnVjdGlvbj4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ291bnQoKSAhPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gInByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oKVsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ob2Rlc0JlZm9yZVNlbGYoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk9mVHlwZTxYUHJvY2Vzc2luZ0luc3RydWN0aW9uPigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ291bnQoKSArIDEpICsgIl0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBFeGVjdXRhYmxlUnVubmVyCisgICAgeworICAgICAgICBwdWJsaWMgY2xhc3MgUnVuUmVzdWx0cworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IEV4aXRDb2RlOworICAgICAgICAgICAgcHVibGljIEV4Y2VwdGlvbiBSdW5FeGNlcHRpb247CisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nQnVpbGRlciBPdXRwdXQ7CisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nQnVpbGRlciBFcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUnVuUmVzdWx0cyBSdW5FeGVjdXRhYmxlKHN0cmluZyBleGVjdXRhYmxlUGF0aCwgc3RyaW5nIGFyZ3VtZW50cywgc3RyaW5nIHdvcmtpbmdEaXJlY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJ1blJlc3VsdHMgcnVuUmVzdWx0cyA9IG5ldyBSdW5SZXN1bHRzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT3V0cHV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKSwKKyAgICAgICAgICAgICAgICBFcnJvciA9IG5ldyBTdHJpbmdCdWlsZGVyKCksCisgICAgICAgICAgICAgICAgUnVuRXhjZXB0aW9uID0gbnVsbAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhleGVjdXRhYmxlUGF0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2luZyAoUHJvY2VzcyBwcm9jID0gbmV3IFByb2Nlc3MoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvYy5TdGFydEluZm8uRmlsZU5hbWUgPSBleGVjdXRhYmxlUGF0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2MuU3RhcnRJbmZvLkFyZ3VtZW50cyA9IGFyZ3VtZW50czsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2MuU3RhcnRJbmZvLldvcmtpbmdEaXJlY3RvcnkgPSB3b3JraW5nRGlyZWN0b3J5OworICAgICAgICAgICAgICAgICAgICAgICAgcHJvYy5TdGFydEluZm8uVXNlU2hlbGxFeGVjdXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jLlN0YXJ0SW5mby5SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2MuU3RhcnRJbmZvLlJlZGlyZWN0U3RhbmRhcmRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jLk91dHB1dERhdGFSZWNlaXZlZCArPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvLCBlKSA9PiBydW5SZXN1bHRzLk91dHB1dC5BcHBlbmQoZS5EYXRhKS5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jLkVycm9yRGF0YVJlY2VpdmVkICs9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG8sIGUpID0+IHJ1blJlc3VsdHMuRXJyb3IuQXBwZW5kKGUuRGF0YSkuQXBwZW5kKEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvYy5TdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvYy5CZWdpbk91dHB1dFJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jLkJlZ2luRXJyb3JSZWFkTGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvYy5XYWl0Rm9yRXhpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVzdWx0cy5FeGl0Q29kZSA9IHByb2MuRXhpdENvZGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGV4ZWN1dGFibGUgcGF0aC4iLCAiZXhlY3V0YWJsZVBhdGgiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcnVuUmVzdWx0cy5SdW5FeGNlcHRpb24gPSBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJ1blJlc3VsdHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgU2libGluZ3NSZXZlcnNlRG9jdW1lbnRPcmRlckluZm8KKyAgICB7CisgICAgICAgIHB1YmxpYyBYRWxlbWVudCBQcmV2aW91c1NpYmxpbmc7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIERlc2NlbmRhbnRzUmV2ZXJzZURvY3VtZW50T3JkZXJJbmZvCisgICAgeworICAgICAgICBwdWJsaWMgWEVsZW1lbnQgUHJldmlvdXNFbGVtZW50OworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBEZXNjZW5kYW50c1RyaW1tZWRSZXZlcnNlRG9jdW1lbnRPcmRlckluZm8KKyAgICB7CisgICAgICAgIHB1YmxpYyBYRWxlbWVudCBQcmV2aW91c0VsZW1lbnQ7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIEdyb3VwT2ZBZGphY2VudDxUU291cmNlLCBUS2V5PiA6IElHcm91cGluZzxUS2V5LCBUU291cmNlPgorICAgIHsKKyAgICAgICAgcHVibGljIEdyb3VwT2ZBZGphY2VudChMaXN0PFRTb3VyY2U+IHNvdXJjZSwgVEtleSBrZXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEdyb3VwTGlzdCA9IHNvdXJjZTsKKyAgICAgICAgICAgIEtleSA9IGtleTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUS2V5IEtleSB7IGdldDsgc2V0OyB9CisgICAgICAgIHByaXZhdGUgTGlzdDxUU291cmNlPiBHcm91cExpc3QgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKChJRW51bWVyYWJsZTxUU291cmNlPikgdGhpcykuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgSUVudW1lcmF0b3I8VFNvdXJjZT4gSUVudW1lcmFibGU8VFNvdXJjZT4uR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoKElFbnVtZXJhYmxlPFRTb3VyY2U+KSBHcm91cExpc3QpLkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHRCdWNrZXRUaW1lcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBCdWNrZXRJbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgQ291bnQ7CisgICAgICAgICAgICBwdWJsaWMgVGltZVNwYW4gVGltZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBMYXN0QnVja2V0ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGF0ZVRpbWUgTGFzdFRpbWU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8c3RyaW5nLCBCdWNrZXRJbmZvPiBCdWNrZXRzOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBCdWNrZXQoc3RyaW5nIGJ1Y2tldCkKKyAgICAgICAgeworICAgICAgICAgICAgRGF0ZVRpbWUgbm93ID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgaWYgKExhc3RCdWNrZXQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUaW1lU3BhbiBkID0gbm93IC0gTGFzdFRpbWU7CisgICAgICAgICAgICAgICAgaWYgKEJ1Y2tldHMuQ29udGFpbnNLZXkoTGFzdEJ1Y2tldCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCdWNrZXRzW0xhc3RCdWNrZXRdLkNvdW50ID0gQnVja2V0c1tMYXN0QnVja2V0XS5Db3VudCArIDE7CisgICAgICAgICAgICAgICAgICAgIEJ1Y2tldHNbTGFzdEJ1Y2tldF0uVGltZSArPSBkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCdWNrZXRzLkFkZChMYXN0QnVja2V0LCBuZXcgQnVja2V0SW5mbygpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgPSBkLAorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMYXN0QnVja2V0ID0gYnVja2V0OworICAgICAgICAgICAgTGFzdFRpbWUgPSBub3c7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBEdW1wQnVja2V0c0J5S2V5KCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgYnVja2V0IGluIEJ1Y2tldHMuT3JkZXJCeShiID0+IGIuS2V5KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdHMgPSBidWNrZXQuVmFsdWUuVGltZS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmICh0cy5Db250YWlucygnLicpKQorICAgICAgICAgICAgICAgICAgICB0cyA9IHRzLlN1YnN0cmluZygwLCB0cy5MZW5ndGggLSA1KTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcyA9IGJ1Y2tldC5LZXkuUGFkUmlnaHQoNjAsICctJykgKyAiICAiICsgc3RyaW5nLkZvcm1hdCgiezA6MDAwMDAwMDB9IiwgYnVja2V0LlZhbHVlLkNvdW50KSArICIgICIgKyB0czsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQocyArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVGltZVNwYW4gdG90YWwgPSBCdWNrZXRzCisgICAgICAgICAgICAgICAgLkFnZ3JlZ2F0ZShUaW1lU3Bhbi5aZXJvLCAodCwgYikgPT4gdCArIGIuVmFsdWUuVGltZSk7CisgICAgICAgICAgICB2YXIgdHogPSB0b3RhbC5Ub1N0cmluZygpOworICAgICAgICAgICAgc2IuQXBwZW5kKHN0cmluZy5Gb3JtYXQoIlRvdGFsOiB7MH0iLCB0ei5TdWJzdHJpbmcoMCwgdHouTGVuZ3RoIC0gNSkpKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgRHVtcEJ1Y2tldHNCeVRpbWUoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBidWNrZXQgaW4gQnVja2V0cy5PcmRlckJ5KGIgPT4gYi5WYWx1ZS5UaW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdHMgPSBidWNrZXQuVmFsdWUuVGltZS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmICh0cy5Db250YWlucygnLicpKQorICAgICAgICAgICAgICAgICAgICB0cyA9IHRzLlN1YnN0cmluZygwLCB0cy5MZW5ndGggLSA1KTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcyA9IGJ1Y2tldC5LZXkuUGFkUmlnaHQoNjAsICctJykgKyAiICAiICsgc3RyaW5nLkZvcm1hdCgiezA6MDAwMDAwMDB9IiwgYnVja2V0LlZhbHVlLkNvdW50KSArICIgICIgKyB0czsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQocyArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVGltZVNwYW4gdG90YWwgPSBCdWNrZXRzCisgICAgICAgICAgICAgICAgLkFnZ3JlZ2F0ZShUaW1lU3Bhbi5aZXJvLCAodCwgYikgPT4gdCArIGIuVmFsdWUuVGltZSk7CisgICAgICAgICAgICB2YXIgdHogPSB0b3RhbC5Ub1N0cmluZygpOworICAgICAgICAgICAgc2IuQXBwZW5kKHN0cmluZy5Gb3JtYXQoIlRvdGFsOiB7MH0iLCB0ei5TdWJzdHJpbmcoMCwgdHouTGVuZ3RoIC0gNSkpKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEluaXQoKQorICAgICAgICB7CisgICAgICAgICAgICBCdWNrZXRzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBCdWNrZXRJbmZvPigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFhFbnRpdHkgOiBYVGV4dAorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhYbWxXcml0ZXIgd3JpdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoVmFsdWUuU3Vic3RyaW5nKDAsIDEpID09ICIjIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgZSA9IHN0cmluZy5Gb3JtYXQoIiZ7MH07IiwgVmFsdWUpOworICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZVJhdyhlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVFbnRpdHlSZWYoVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhFbnRpdHkoc3RyaW5nIHZhbHVlKSA6IGJhc2UodmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgWHNpCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lc3BhY2UgeHNpID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIHNjaGVtYUxvY2F0aW9uID0geHNpICsgInNjaGVtYUxvY2F0aW9uIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZSBub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uID0geHNpICsgIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzL1JlZmVyZW5jZUFkZGVyLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvUmVmZXJlbmNlQWRkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3NDk3MgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzL1JlZmVyZW5jZUFkZGVyLmNzCkBAIC0wLDAgKzEsNjU0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBTeXN0ZW0uWG1sLlhQYXRoOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7CisKK25hbWVzcGFjZSBPcGVuWG1sUG93ZXJUb29scworeworICAgIHB1YmxpYyBwYXJ0aWFsIGNsYXNzIFdtbERvY3VtZW50IDogT3BlblhtbFBvd2VyVG9vbHNEb2N1bWVudAorICAgIHsKKyAgICAgICAgcHVibGljIFdtbERvY3VtZW50IEFkZFRvYyhzdHJpbmcgeFBhdGgsIHN0cmluZyBzd2l0Y2hlcywgc3RyaW5nIHRpdGxlLCBpbnQ/IHJpZ2h0VGFiUG9zKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKFdtbERvY3VtZW50KVJlZmVyZW5jZUFkZGVyLkFkZFRvYyh0aGlzLCB4UGF0aCwgc3dpdGNoZXMsIHRpdGxlLCByaWdodFRhYlBvcyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFdtbERvY3VtZW50IEFkZFRvZihzdHJpbmcgeFBhdGgsIHN0cmluZyBzd2l0Y2hlcywgaW50PyByaWdodFRhYlBvcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChXbWxEb2N1bWVudClSZWZlcmVuY2VBZGRlci5BZGRUb2YodGhpcywgeFBhdGgsIHN3aXRjaGVzLCByaWdodFRhYlBvcyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFdtbERvY3VtZW50IEFkZFRvYShzdHJpbmcgeFBhdGgsIHN0cmluZyBzd2l0Y2hlcywgaW50PyByaWdodFRhYlBvcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChXbWxEb2N1bWVudClSZWZlcmVuY2VBZGRlci5BZGRUb2EodGhpcywgeFBhdGgsIHN3aXRjaGVzLCByaWdodFRhYlBvcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgUmVmZXJlbmNlQWRkZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgV21sRG9jdW1lbnQgQWRkVG9jKFdtbERvY3VtZW50IGRvY3VtZW50LCBzdHJpbmcgeFBhdGgsIHN0cmluZyBzd2l0Y2hlcywgc3RyaW5nIHRpdGxlLCBpbnQ/IHJpZ2h0VGFiUG9zKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoZG9jdW1lbnQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYyA9IHN0cmVhbURvYy5HZXRXb3JkcHJvY2Vzc2luZ0RvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBZGRUb2MoZG9jLCB4UGF0aCwgc3dpdGNoZXMsIHRpdGxlLCByaWdodFRhYlBvcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1Eb2MuR2V0TW9kaWZpZWRXbWxEb2N1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZFRvYyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYywgc3RyaW5nIHhQYXRoLCBzdHJpbmcgc3dpdGNoZXMsIHN0cmluZyB0aXRsZSwgaW50PyByaWdodFRhYlBvcykKKyAgICAgICAgeworICAgICAgICAgICAgVXBkYXRlRm9udFRhYmxlUGFydChkb2MpOworICAgICAgICAgICAgVXBkYXRlU3R5bGVzUGFydEZvclRvYyhkb2MpOworICAgICAgICAgICAgVXBkYXRlU3R5bGVzV2l0aEVmZmVjdHNQYXJ0Rm9yVG9jKGRvYyk7CisKKyAgICAgICAgICAgIGlmICh0aXRsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRpdGxlID0gIkNvbnRlbnRzIjsKKyAgICAgICAgICAgIGlmIChyaWdodFRhYlBvcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJpZ2h0VGFiUG9zID0gOTM1MDsKKworICAgICAgICAgICAgLy8gezB9IHRvY1RpdGxlIChkZWZhdWx0ID0gIkNvbnRlbnRzIikKKyAgICAgICAgICAgIC8vIHsxfSByaWdodFRhYlBvc2l0aW9uIChkZWZhdWx0ID0gOTM1MCkKKyAgICAgICAgICAgIC8vIHsyfSBzd2l0Y2hlcworCisgICAgICAgICAgICBTdHJpbmcgeG1sU3RyaW5nID0KK0AiPHc6c2R0IHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbic+CisgIDx3OnNkdFByPgorICAgIDx3OmRvY1BhcnRPYmo+CisgICAgICA8dzpkb2NQYXJ0R2FsbGVyeSB3OnZhbD0nVGFibGUgb2YgQ29udGVudHMnLz4KKyAgICAgIDx3OmRvY1BhcnRVbmlxdWUvPgorICAgIDwvdzpkb2NQYXJ0T2JqPgorICA8L3c6c2R0UHI+CisgIDx3OnNkdEVuZFByPgorICAgIDx3OnJQcj4KKyAgICAgPHc6ckZvbnRzIHc6YXNjaWlUaGVtZT0nbWlub3JIQW5zaScgdzpjc3RoZW1lPSdtaW5vckJpZGknIHc6ZWFzdEFzaWFUaGVtZT0nbWlub3JIQW5zaScgdzpoQW5zaVRoZW1lPSdtaW5vckhBbnNpJy8+CisgICAgIDx3OmNvbG9yIHc6dmFsPSdhdXRvJy8+CisgICAgIDx3OnN6IHc6dmFsPScyMicvPgorICAgICA8dzpzekNzIHc6dmFsPScyMicvPgorICAgICA8dzpsYW5nIHc6ZWFzdEFzaWE9J2VuLVVTJy8+CisgICAgPC93OnJQcj4KKyAgPC93OnNkdEVuZFByPgorICA8dzpzZHRDb250ZW50PgorICAgIDx3OnA+CisgICAgICA8dzpwUHI+CisgICAgICAgIDx3OnBTdHlsZSB3OnZhbD0nVE9DSGVhZGluZycvPgorICAgICAgPC93OnBQcj4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnQ+ezB9PC93OnQ+CisgICAgICA8L3c6cj4KKyAgICA8L3c6cD4KKyAgICA8dzpwPgorICAgICAgPHc6cFByPgorICAgICAgICA8dzpwU3R5bGUgdzp2YWw9J1RPQzEnLz4KKyAgICAgICAgPHc6dGFicz4KKyAgICAgICAgICA8dzp0YWIgdzp2YWw9J3JpZ2h0JyB3OmxlYWRlcj0nZG90JyB3OnBvcz0nezF9Jy8+CisgICAgICAgIDwvdzp0YWJzPgorICAgICAgICA8dzpyUHI+CisgICAgICAgICAgPHc6bm9Qcm9vZi8+CisgICAgICAgIDwvdzpyUHI+CisgICAgICA8L3c6cFByPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6ZmxkQ2hhciB3OmZsZENoYXJUeXBlPSdiZWdpbicgdzpkaXJ0eT0ndHJ1ZScvPgorICAgICAgPC93OnI+CisgICAgICA8dzpyPgorICAgICAgICA8dzppbnN0clRleHQgeG1sOnNwYWNlPSdwcmVzZXJ2ZSc+IHsyfSA8L3c6aW5zdHJUZXh0PgorICAgICAgPC93OnI+CisgICAgICA8dzpyPgorICAgICAgICA8dzpmbGRDaGFyIHc6ZmxkQ2hhclR5cGU9J3NlcGFyYXRlJy8+CisgICAgICA8L3c6cj4KKyAgICA8L3c6cD4KKyAgICA8dzpwPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6clByPgorICAgICAgICAgIDx3OmIvPgorICAgICAgICAgIDx3OmJDcy8+CisgICAgICAgICAgPHc6bm9Qcm9vZi8+CisgICAgICAgIDwvdzpyUHI+CisgICAgICAgIDx3OmZsZENoYXIgdzpmbGRDaGFyVHlwZT0nZW5kJy8+CisgICAgICA8L3c6cj4KKyAgICA8L3c6cD4KKyAgPC93OnNkdENvbnRlbnQ+Cis8L3c6c2R0PiI7CisKKyAgICAgICAgICAgIFhtbFJlYWRlciBzZHRSZWFkZXIgPSBYbWxSZWFkZXIuQ3JlYXRlKG5ldyBTdHJpbmdSZWFkZXIoU3RyaW5nLkZvcm1hdCh4bWxTdHJpbmcsIHRpdGxlLCByaWdodFRhYlBvcywgc3dpdGNoZXMpKSk7CisgICAgICAgICAgICBYRWxlbWVudCBzZHQgPSBYRWxlbWVudC5Mb2FkKHNkdFJlYWRlcik7CisKKyAgICAgICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcjsKKyAgICAgICAgICAgIFhEb2N1bWVudCBtYWluWERvYyA9IGRvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudChvdXQgbmFtZXNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyLkFkZE5hbWVzcGFjZSgidyIsICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4iKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGFkZEJlZm9yZSA9IG1haW5YRG9jLlhQYXRoU2VsZWN0RWxlbWVudCh4UGF0aCwgbmFtZXNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBpZiAoYWRkQmVmb3JlID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJYUGF0aCBleHByZXNzaW9uIGRpZCBub3Qgc2VsZWN0IGFuIGVsZW1lbnQiKTsKKworICAgICAgICAgICAgYWRkQmVmb3JlLkFkZEJlZm9yZVNlbGYoc2R0KTsKKyAgICAgICAgICAgIGRvYy5NYWluRG9jdW1lbnRQYXJ0LlB1dFhEb2N1bWVudCgpOworCisgICAgICAgICAgICBYRG9jdW1lbnQgc2V0dGluZ3NYRG9jID0gZG9jLk1haW5Eb2N1bWVudFBhcnQuRG9jdW1lbnRTZXR0aW5nc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBYRWxlbWVudCB1cGRhdGVGaWVsZHMgPSBzZXR0aW5nc1hEb2MuRGVzY2VuZGFudHMoVy51cGRhdGVGaWVsZHMpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAodXBkYXRlRmllbGRzICE9IG51bGwpCisgICAgICAgICAgICAgICAgdXBkYXRlRmllbGRzLkF0dHJpYnV0ZShXLnZhbCkuVmFsdWUgPSAidHJ1ZSI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXBkYXRlRmllbGRzID0gbmV3IFhFbGVtZW50KFcudXBkYXRlRmllbGRzLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgInRydWUiKSk7CisgICAgICAgICAgICAgICAgc2V0dGluZ3NYRG9jLlJvb3QuQWRkKHVwZGF0ZUZpZWxkcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkb2MuTWFpbkRvY3VtZW50UGFydC5Eb2N1bWVudFNldHRpbmdzUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgV21sRG9jdW1lbnQgQWRkVG9mKFdtbERvY3VtZW50IGRvY3VtZW50LCBzdHJpbmcgeFBhdGgsIHN0cmluZyBzd2l0Y2hlcywgaW50PyByaWdodFRhYlBvcykKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCBzdHJlYW1Eb2MgPSBuZXcgT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50KGRvY3VtZW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MgPSBzdHJlYW1Eb2MuR2V0V29yZHByb2Nlc3NpbmdEb2N1bWVudCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQWRkVG9mKGRvYywgeFBhdGgsIHN3aXRjaGVzLCByaWdodFRhYlBvcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1Eb2MuR2V0TW9kaWZpZWRXbWxEb2N1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZFRvZihXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYywgc3RyaW5nIHhQYXRoLCBzdHJpbmcgc3dpdGNoZXMsIGludD8gcmlnaHRUYWJQb3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFVwZGF0ZUZvbnRUYWJsZVBhcnQoZG9jKTsKKyAgICAgICAgICAgIFVwZGF0ZVN0eWxlc1BhcnRGb3JUb2YoZG9jKTsKKyAgICAgICAgICAgIFVwZGF0ZVN0eWxlc1dpdGhFZmZlY3RzUGFydEZvclRvZihkb2MpOworCisgICAgICAgICAgICBpZiAocmlnaHRUYWJQb3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByaWdodFRhYlBvcyA9IDkzNTA7CisKKyAgICAgICAgICAgIC8vIHswfSByaWdodFRhYlBvc2l0aW9uIChkZWZhdWx0ID0gOTM1MCkKKyAgICAgICAgICAgIC8vIHsxfSBzd2l0Y2hlcworCisgICAgICAgICAgICBzdHJpbmcgeG1sU3RyaW5nID0KK0AiPHc6cCB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICA8dzpwUHI+CisgICAgPHc6cFN0eWxlIHc6dmFsPSdUYWJsZW9mRmlndXJlcycvPgorICAgIDx3OnRhYnM+CisgICAgICA8dzp0YWIgdzp2YWw9J3JpZ2h0JyB3OmxlYWRlcj0nZG90JyB3OnBvcz0nezB9Jy8+CisgICAgPC93OnRhYnM+CisgICAgPHc6clByPgorICAgICAgPHc6bm9Qcm9vZi8+CisgICAgPC93OnJQcj4KKyAgPC93OnBQcj4KKyAgPHc6cj4KKyAgICA8dzpmbGRDaGFyIHc6ZmxkQ2hhclR5cGU9J2JlZ2luJyBkaXJ0eT0ndHJ1ZScvPgorICA8L3c6cj4KKyAgPHc6cj4KKyAgICA8dzppbnN0clRleHQgeG1sOnNwYWNlPSdwcmVzZXJ2ZSc+IHsxfSA8L3c6aW5zdHJUZXh0PgorICA8L3c6cj4KKyAgPHc6cj4KKyAgICA8dzpmbGRDaGFyIHc6ZmxkQ2hhclR5cGU9J3NlcGFyYXRlJy8+CisgIDwvdzpyPgorICA8dzpyPgorICAgIDx3OmZsZENoYXIgdzpmbGRDaGFyVHlwZT0nZW5kJy8+CisgIDwvdzpyPgorPC93OnA+IjsKKyAgICAgICAgICAgIFhEb2N1bWVudCBtYWluWERvYyA9IGRvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICBYbWxSZWFkZXIgcGFyYWdyYXBoUmVhZGVyID0gWG1sUmVhZGVyLkNyZWF0ZShuZXcgU3RyaW5nUmVhZGVyKFN0cmluZy5Gb3JtYXQoeG1sU3RyaW5nLCByaWdodFRhYlBvcywgc3dpdGNoZXMpKSk7CisgICAgICAgICAgICBYRWxlbWVudCBwYXJhZ3JhcGggPSBYRWxlbWVudC5Mb2FkKHBhcmFncmFwaFJlYWRlcik7CisgICAgICAgICAgICBYbWxOYW1lVGFibGUgbmFtZVRhYmxlID0gcGFyYWdyYXBoUmVhZGVyLk5hbWVUYWJsZTsKKyAgICAgICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlciA9IG5ldyBYbWxOYW1lc3BhY2VNYW5hZ2VyKG5hbWVUYWJsZSk7CisgICAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyLkFkZE5hbWVzcGFjZSgidyIsICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4iKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGFkZEJlZm9yZSA9IG1haW5YRG9jLlhQYXRoU2VsZWN0RWxlbWVudCh4UGF0aCwgbmFtZXNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBpZiAoYWRkQmVmb3JlID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJYUGF0aCBleHByZXNzaW9uIGRpZCBub3Qgc2VsZWN0IGFuIGVsZW1lbnQiKTsKKworICAgICAgICAgICAgYWRkQmVmb3JlLkFkZEJlZm9yZVNlbGYocGFyYWdyYXBoKTsKKyAgICAgICAgICAgIGRvYy5NYWluRG9jdW1lbnRQYXJ0LlB1dFhEb2N1bWVudCgpOworCisgICAgICAgICAgICBYRG9jdW1lbnQgc2V0dGluZ3NYRG9jID0gZG9jLk1haW5Eb2N1bWVudFBhcnQuRG9jdW1lbnRTZXR0aW5nc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBYRWxlbWVudCB1cGRhdGVGaWVsZHMgPSBzZXR0aW5nc1hEb2MuRGVzY2VuZGFudHMoVy51cGRhdGVGaWVsZHMpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAodXBkYXRlRmllbGRzICE9IG51bGwpCisgICAgICAgICAgICAgICAgdXBkYXRlRmllbGRzLkF0dHJpYnV0ZShXLnZhbCkuVmFsdWUgPSAidHJ1ZSI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXBkYXRlRmllbGRzID0gbmV3IFhFbGVtZW50KFcudXBkYXRlRmllbGRzLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgInRydWUiKSk7CisgICAgICAgICAgICAgICAgc2V0dGluZ3NYRG9jLlJvb3QuQWRkKHVwZGF0ZUZpZWxkcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkb2MuTWFpbkRvY3VtZW50UGFydC5Eb2N1bWVudFNldHRpbmdzUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgV21sRG9jdW1lbnQgQWRkVG9hKFdtbERvY3VtZW50IGRvY3VtZW50LCBzdHJpbmcgeFBhdGgsIHN0cmluZyBzd2l0Y2hlcywgaW50PyByaWdodFRhYlBvcykKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCBzdHJlYW1Eb2MgPSBuZXcgT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50KGRvY3VtZW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MgPSBzdHJlYW1Eb2MuR2V0V29yZHByb2Nlc3NpbmdEb2N1bWVudCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQWRkVG9hKGRvYywgeFBhdGgsIHN3aXRjaGVzLCByaWdodFRhYlBvcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1Eb2MuR2V0TW9kaWZpZWRXbWxEb2N1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZFRvYShXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYywgc3RyaW5nIHhQYXRoLCBzdHJpbmcgc3dpdGNoZXMsIGludD8gcmlnaHRUYWJQb3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFVwZGF0ZUZvbnRUYWJsZVBhcnQoZG9jKTsKKyAgICAgICAgICAgIFVwZGF0ZVN0eWxlc1BhcnRGb3JUb2EoZG9jKTsKKyAgICAgICAgICAgIFVwZGF0ZVN0eWxlc1dpdGhFZmZlY3RzUGFydEZvclRvYShkb2MpOworCisgICAgICAgICAgICBpZiAocmlnaHRUYWJQb3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByaWdodFRhYlBvcyA9IDkzNTA7CisKKyAgICAgICAgICAgIC8vIHswfSByaWdodFRhYlBvc2l0aW9uIChkZWZhdWx0ID0gOTM1MCkKKyAgICAgICAgICAgIC8vIHsxfSBzd2l0Y2hlcworCisgICAgICAgICAgICBzdHJpbmcgeG1sU3RyaW5nID0KK0AiPHc6cCB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICA8dzpwUHI+CisgICAgPHc6cFN0eWxlIHc6dmFsPSdUT0FIZWFkaW5nJy8+CisgICAgPHc6dGFicz4KKyAgICAgIDx3OnRhYiB3OnZhbD0ncmlnaHQnCisgICAgICAgICAgICAgdzpsZWFkZXI9J2RvdCcKKyAgICAgICAgICAgICB3OnBvcz0nezB9Jy8+CisgICAgICA8L3c6dGFicz4KKyAgICA8dzpyUHI+CisgICAgICA8dzpyRm9udHMgdzphc2NpaVRoZW1lPSdtaW5vckhBbnNpJworICAgICAgICAgICAgICAgIHc6ZWFzdEFzaWFUaGVtZT0nbWlub3JFYXN0QXNpYScKKyAgICAgICAgICAgICAgICB3OmhBbnNpVGhlbWU9J21pbm9ySEFuc2knCisgICAgICAgICAgICAgICAgdzpjc3RoZW1lPSdtaW5vckJpZGknLz4KKyAgICAgIDx3OmIgdzp2YWw9JzAnLz4KKyAgICAgIDx3OmJDcyB3OnZhbD0nMCcvPgorICAgICAgPHc6bm9Qcm9vZi8+CisgICAgICA8dzpzeiB3OnZhbD0nMjInLz4KKyAgICAgIDx3OnN6Q3Mgdzp2YWw9JzIyJy8+CisgICAgPC93OnJQcj4KKyAgPC93OnBQcj4KKyAgPHc6cj4KKyAgICA8dzpmbGRDaGFyIHc6ZmxkQ2hhclR5cGU9J2JlZ2luJy8+CisgIDwvdzpyPgorICA8dzpyPgorICAgIDx3Omluc3RyVGV4dCB4bWw6c3BhY2U9J3ByZXNlcnZlJz4gezF9IDwvdzppbnN0clRleHQ+CisgIDwvdzpyPgorICA8dzpyPgorICAgIDx3OmZsZENoYXIgdzpmbGRDaGFyVHlwZT0nc2VwYXJhdGUnLz4KKyAgPC93OnI+CisgIDx3OnI+CisgICAgPHc6ZmxkQ2hhciB3OmZsZENoYXJUeXBlPSdlbmQnLz4KKyAgPC93OnI+Cis8L3c6cD4iOworCisgICAgICAgICAgICBYRG9jdW1lbnQgbWFpblhEb2MgPSBkb2MuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgWG1sUmVhZGVyIHBhcmFncmFwaFJlYWRlciA9IFhtbFJlYWRlci5DcmVhdGUobmV3IFN0cmluZ1JlYWRlcihTdHJpbmcuRm9ybWF0KHhtbFN0cmluZywgcmlnaHRUYWJQb3MsIHN3aXRjaGVzKSkpOworICAgICAgICAgICAgWEVsZW1lbnQgcGFyYWdyYXBoID0gWEVsZW1lbnQuTG9hZChwYXJhZ3JhcGhSZWFkZXIpOworICAgICAgICAgICAgWG1sTmFtZVRhYmxlIG5hbWVUYWJsZSA9IHBhcmFncmFwaFJlYWRlci5OYW1lVGFibGU7CisgICAgICAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIgPSBuZXcgWG1sTmFtZXNwYWNlTWFuYWdlcihuYW1lVGFibGUpOworICAgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlci5BZGROYW1lc3BhY2UoInciLCAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluIik7CisgICAgICAgICAgICBYRWxlbWVudCBhZGRCZWZvcmUgPSBtYWluWERvYy5YUGF0aFNlbGVjdEVsZW1lbnQoeFBhdGgsIG5hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgaWYgKGFkZEJlZm9yZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiWFBhdGggZXhwcmVzc2lvbiBkaWQgbm90IHNlbGVjdCBhbiBlbGVtZW50Iik7CisKKyAgICAgICAgICAgIGFkZEJlZm9yZS5BZGRCZWZvcmVTZWxmKHBhcmFncmFwaCk7CisgICAgICAgICAgICBkb2MuTWFpbkRvY3VtZW50UGFydC5QdXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgWERvY3VtZW50IHNldHRpbmdzWERvYyA9IGRvYy5NYWluRG9jdW1lbnRQYXJ0LkRvY3VtZW50U2V0dGluZ3NQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgWEVsZW1lbnQgdXBkYXRlRmllbGRzID0gc2V0dGluZ3NYRG9jLkRlc2NlbmRhbnRzKFcudXBkYXRlRmllbGRzKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKHVwZGF0ZUZpZWxkcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHVwZGF0ZUZpZWxkcy5BdHRyaWJ1dGUoVy52YWwpLlZhbHVlID0gInRydWUiOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVwZGF0ZUZpZWxkcyA9IG5ldyBYRWxlbWVudChXLnVwZGF0ZUZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJ0cnVlIikpOworICAgICAgICAgICAgICAgIHNldHRpbmdzWERvYy5Sb290LkFkZCh1cGRhdGVGaWVsZHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG9jLk1haW5Eb2N1bWVudFBhcnQuRG9jdW1lbnRTZXR0aW5nc1BhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZEVsZW1lbnRJZk1pc3NpbmcoWERvY3VtZW50IHBhcnRYRG9jLCBYRWxlbWVudCBleGlzdGluZywgc3RyaW5nIG5ld0VsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChleGlzdGluZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFhFbGVtZW50IG5ld1hFbGVtZW50ID0gWEVsZW1lbnQuUGFyc2UobmV3RWxlbWVudCk7CisgICAgICAgICAgICBuZXdYRWxlbWVudC5BdHRyaWJ1dGVzKCkuV2hlcmUoYSA9PiBhLklzTmFtZXNwYWNlRGVjbGFyYXRpb24pLlJlbW92ZSgpOworICAgICAgICAgICAgcGFydFhEb2MuUm9vdC5BZGQobmV3WEVsZW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBVcGRhdGVGb250VGFibGVQYXJ0KFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jKQorICAgICAgICB7CisgICAgICAgICAgICBGb250VGFibGVQYXJ0IGZvbnRUYWJsZVBhcnQgPSBkb2MuTWFpbkRvY3VtZW50UGFydC5Gb250VGFibGVQYXJ0OworICAgICAgICAgICAgaWYgKGZvbnRUYWJsZVBhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUb2RvIG5lZWQgdG8gaW5zZXJ0IGZvbnQgdGFibGUgcGFydCIpOworICAgICAgICAgICAgWERvY3VtZW50IGZvbnRUYWJsZVhEb2MgPSBmb250VGFibGVQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICBBZGRFbGVtZW50SWZNaXNzaW5nKGZvbnRUYWJsZVhEb2MsCisgICAgICAgICAgICAgICAgZm9udFRhYmxlWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5mb250KQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcubmFtZSkgPT0gIlRhaG9tYSIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorICAgICAgICAgICAgICAgIEAiPHc6Zm9udCB3Om5hbWU9J1RhaG9tYScgeG1sbnM6dz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluJz4KKyAgICAgICAgICAgICAgICAgICAgIDx3OnBhbm9zZTEgdzp2YWw9JzAyMEIwNjA0MDMwNTA0MDQwMjA0Jy8+CisgICAgICAgICAgICAgICAgICAgICA8dzpjaGFyc2V0IHc6dmFsPScwMCcvPgorICAgICAgICAgICAgICAgICAgICAgPHc6ZmFtaWx5IHc6dmFsPSdzd2lzcycvPgorICAgICAgICAgICAgICAgICAgICAgPHc6cGl0Y2ggdzp2YWw9J3ZhcmlhYmxlJy8+CisgICAgICAgICAgICAgICAgICAgICA8dzpzaWcgdzp1c2IwPSdFMTAwMkVGRicgdzp1c2IxPSdDMDAwNjA1Qicgdzp1c2IyPScwMDAwMDAyOScgdzp1c2IzPScwMDAwMDAwMCcgdzpjc2IwPScwMDAxMDFGRicgdzpjc2IxPScwMDAwMDAwMCcvPgorICAgICAgICAgICAgICAgICAgIDwvdzpmb250PiIpOworCisgICAgICAgICAgICBmb250VGFibGVQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBVcGRhdGVQYXJ0Rm9yVG9jKE9wZW5YbWxQYXJ0IHBhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCB4RG9jID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgQWRkRWxlbWVudElmTWlzc2luZygKKyAgICAgICAgICAgICAgICB4RG9jLAorICAgICAgICAgICAgICAgIHhEb2MuUm9vdC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcudHlwZSkgPT0gInBhcmFncmFwaCIgJiYgKHN0cmluZyllLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09ICJUT0NIZWFkaW5nIikKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCksCisgICAgICAgICAgICAgICAgQCI8dzpzdHlsZSB3OnR5cGU9J3BhcmFncmFwaCcgdzpzdHlsZUlkPSdUT0NIZWFkaW5nJyB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICAgICAgICAgICAgICAgICAgICA8dzpuYW1lIHc6dmFsPSdUT0MgSGVhZGluZycvPgorICAgICAgICAgICAgICAgICAgICA8dzpiYXNlZE9uIHc6dmFsPSdIZWFkaW5nMScvPgorICAgICAgICAgICAgICAgICAgICA8dzpuZXh0IHc6dmFsPSdOb3JtYWwnLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6dWlQcmlvcml0eSB3OnZhbD0nMzknLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6c2VtaUhpZGRlbi8+CisgICAgICAgICAgICAgICAgICAgIDx3OnVuaGlkZVdoZW5Vc2VkLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6cUZvcm1hdC8+CisgICAgICAgICAgICAgICAgICAgIDx3OnBQcj4KKyAgICAgICAgICAgICAgICAgICAgICA8dzpvdXRsaW5lTHZsIHc6dmFsPSc5Jy8+CisgICAgICAgICAgICAgICAgICAgIDwvdzpwUHI+CisgICAgICAgICAgICAgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICAgICAgICAgICAgICA8dzpsYW5nIHc6ZWFzdEFzaWE9J2phLUpQJy8+CisgICAgICAgICAgICAgICAgICAgIDwvdzpyUHI+CisgICAgICAgICAgICAgICAgICA8L3c6c3R5bGU+Iik7CisKKyAgICAgICAgICAgIEFkZEVsZW1lbnRJZk1pc3NpbmcoCisgICAgICAgICAgICAgICAgeERvYywKKyAgICAgICAgICAgICAgICB4RG9jLlJvb3QuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gKHN0cmluZyllLkF0dHJpYnV0ZShXLnR5cGUpID09ICJwYXJhZ3JhcGgiICYmIChzdHJpbmcpZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKSA9PSAiVE9DMSIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorICAgICAgICAgICAgICAgIEAiPHc6c3R5bGUgdzp0eXBlPSdwYXJhZ3JhcGgnIHc6c3R5bGVJZD0nVE9DMScgeG1sbnM6dz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluJz4KKyAgICAgICAgICAgICAgICAgICAgPHc6bmFtZSB3OnZhbD0ndG9jIDEnLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6YmFzZWRPbiB3OnZhbD0nTm9ybWFsJy8+CisgICAgICAgICAgICAgICAgICAgIDx3Om5leHQgdzp2YWw9J05vcm1hbCcvPgorICAgICAgICAgICAgICAgICAgICA8dzphdXRvUmVkZWZpbmUvPgorICAgICAgICAgICAgICAgICAgICA8dzp1aVByaW9yaXR5IHc6dmFsPSczOScvPgorICAgICAgICAgICAgICAgICAgICA8dzp1bmhpZGVXaGVuVXNlZC8+CisgICAgICAgICAgICAgICAgICAgIDx3OnBQcj4KKyAgICAgICAgICAgICAgICAgICAgICA8dzpzcGFjaW5nIHc6YWZ0ZXI9JzEwMCcvPgorICAgICAgICAgICAgICAgICAgICA8L3c6cFByPgorICAgICAgICAgICAgICAgICAgPC93OnN0eWxlPiIpOworCisgICAgICAgICAgICBBZGRFbGVtZW50SWZNaXNzaW5nKAorICAgICAgICAgICAgICAgIHhEb2MsCisgICAgICAgICAgICAgICAgeERvYy5Sb290LkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy50eXBlKSA9PSAicGFyYWdyYXBoIiAmJiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gIlRPQzIiKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKSwKKyAgICAgICAgICAgICAgICBAIjx3OnN0eWxlIHc6dHlwZT0ncGFyYWdyYXBoJyB3OnN0eWxlSWQ9J1RPQzInIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbic+CisgICAgICAgICAgICAgICAgICAgIDx3Om5hbWUgdzp2YWw9J3RvYyAyJy8+CisgICAgICAgICAgICAgICAgICAgIDx3OmJhc2VkT24gdzp2YWw9J05vcm1hbCcvPgorICAgICAgICAgICAgICAgICAgICA8dzpuZXh0IHc6dmFsPSdOb3JtYWwnLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6YXV0b1JlZGVmaW5lLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6dWlQcmlvcml0eSB3OnZhbD0nMzknLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6dW5oaWRlV2hlblVzZWQvPgorICAgICAgICAgICAgICAgICAgICA8dzpwUHI+CisgICAgICAgICAgICAgICAgICAgICAgPHc6c3BhY2luZyB3OmFmdGVyPScxMDAnLz4KKyAgICAgICAgICAgICAgICAgICAgICA8dzppbmQgdzpsZWZ0PScyMjAnLz4KKyAgICAgICAgICAgICAgICAgICAgPC93OnBQcj4KKyAgICAgICAgICAgICAgICAgIDwvdzpzdHlsZT4iKTsKKworICAgICAgICAgICAgQWRkRWxlbWVudElmTWlzc2luZygKKyAgICAgICAgICAgICAgICB4RG9jLAorICAgICAgICAgICAgICAgIHhEb2MuUm9vdC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcudHlwZSkgPT0gInBhcmFncmFwaCIgJiYgKHN0cmluZyllLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09ICJUT0MzIikKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCksCisgICAgICAgICAgICAgICAgQCI8dzpzdHlsZSB3OnR5cGU9J3BhcmFncmFwaCcgdzpzdHlsZUlkPSdUT0MzJyB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICAgICAgICAgICAgICAgICAgICA8dzpuYW1lIHc6dmFsPSd0b2MgMycvPgorICAgICAgICAgICAgICAgICAgICA8dzpiYXNlZE9uIHc6dmFsPSdOb3JtYWwnLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6bmV4dCB3OnZhbD0nTm9ybWFsJy8+CisgICAgICAgICAgICAgICAgICAgIDx3OmF1dG9SZWRlZmluZS8+CisgICAgICAgICAgICAgICAgICAgIDx3OnVpUHJpb3JpdHkgdzp2YWw9JzM5Jy8+CisgICAgICAgICAgICAgICAgICAgIDx3OnVuaGlkZVdoZW5Vc2VkLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6cFByPgorICAgICAgICAgICAgICAgICAgICAgIDx3OnNwYWNpbmcgdzphZnRlcj0nMTAwJy8+CisgICAgICAgICAgICAgICAgICAgICAgPHc6aW5kIHc6bGVmdD0nNDQwJy8+CisgICAgICAgICAgICAgICAgICAgIDwvdzpwUHI+CisgICAgICAgICAgICAgICAgICA8L3c6c3R5bGU+Iik7CisKKyAgICAgICAgICAgIEFkZEVsZW1lbnRJZk1pc3NpbmcoCisgICAgICAgICAgICAgICAgeERvYywKKyAgICAgICAgICAgICAgICB4RG9jLlJvb3QuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gKHN0cmluZyllLkF0dHJpYnV0ZShXLnR5cGUpID09ICJwYXJhZ3JhcGgiICYmIChzdHJpbmcpZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKSA9PSAiVE9DNCIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorICAgICAgICAgICAgICAgIEAiPHc6c3R5bGUgdzp0eXBlPSdwYXJhZ3JhcGgnIHc6c3R5bGVJZD0nVE9DNCcgeG1sbnM6dz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluJz4KKyAgICAgICAgICAgICAgICAgICAgPHc6bmFtZSB3OnZhbD0ndG9jIDQnLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6YmFzZWRPbiB3OnZhbD0nTm9ybWFsJy8+CisgICAgICAgICAgICAgICAgICAgIDx3Om5leHQgdzp2YWw9J05vcm1hbCcvPgorICAgICAgICAgICAgICAgICAgICA8dzphdXRvUmVkZWZpbmUvPgorICAgICAgICAgICAgICAgICAgICA8dzp1aVByaW9yaXR5IHc6dmFsPSczOScvPgorICAgICAgICAgICAgICAgICAgICA8dzp1bmhpZGVXaGVuVXNlZC8+CisgICAgICAgICAgICAgICAgICAgIDx3OnBQcj4KKyAgICAgICAgICAgICAgICAgICAgICA8dzpzcGFjaW5nIHc6YWZ0ZXI9JzEwMCcvPgorICAgICAgICAgICAgICAgICAgICAgIDx3OmluZCB3OmxlZnQ9JzY2MCcvPgorICAgICAgICAgICAgICAgICAgICA8L3c6cFByPgorICAgICAgICAgICAgICAgICAgPC93OnN0eWxlPiIpOworCisgICAgICAgICAgICBBZGRFbGVtZW50SWZNaXNzaW5nKAorICAgICAgICAgICAgICAgIHhEb2MsCisgICAgICAgICAgICAgICAgeERvYy5Sb290LkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy50eXBlKSA9PSAiY2hhcmFjdGVyIiAmJiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gIkh5cGVybGluayIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorICAgICAgICAgICAgICAgIEAiPHc6c3R5bGUgdzp0eXBlPSdjaGFyYWN0ZXInIHc6c3R5bGVJZD0nSHlwZXJsaW5rJyB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICAgICAgICAgICAgICAgICAgICAgPHc6bmFtZSB3OnZhbD0nSHlwZXJsaW5rJy8+CisgICAgICAgICAgICAgICAgICAgICA8dzpiYXNlZE9uIHc6dmFsPSdEZWZhdWx0UGFyYWdyYXBoRm9udCcvPgorICAgICAgICAgICAgICAgICAgICAgPHc6dWlQcmlvcml0eSB3OnZhbD0nOTknLz4KKyAgICAgICAgICAgICAgICAgICAgIDx3OnVuaGlkZVdoZW5Vc2VkLz4KKyAgICAgICAgICAgICAgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICAgICAgICAgICAgICAgPHc6Y29sb3Igdzp2YWw9JzAwMDBGRicgdzp0aGVtZUNvbG9yPSdoeXBlcmxpbmsnLz4KKyAgICAgICAgICAgICAgICAgICAgICAgPHc6dSB3OnZhbD0nc2luZ2xlJy8+CisgICAgICAgICAgICAgICAgICAgICA8L3c6clByPgorICAgICAgICAgICAgICAgICAgIDwvdzpzdHlsZT4iKTsKKworICAgICAgICAgICAgQWRkRWxlbWVudElmTWlzc2luZygKKyAgICAgICAgICAgICAgICB4RG9jLAorICAgICAgICAgICAgICAgIHhEb2MuUm9vdC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcudHlwZSkgPT0gInBhcmFncmFwaCIgJiYgKHN0cmluZyllLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09ICJCYWxsb29uVGV4dCIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorICAgICAgICAgICAgICAgIEAiPHc6c3R5bGUgdzp0eXBlPSdwYXJhZ3JhcGgnIHc6c3R5bGVJZD0nQmFsbG9vblRleHQnIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbic+CisgICAgICAgICAgICAgICAgICAgIDx3Om5hbWUgdzp2YWw9J0JhbGxvb24gVGV4dCcvPgorICAgICAgICAgICAgICAgICAgICA8dzpiYXNlZE9uIHc6dmFsPSdOb3JtYWwnLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6bGluayB3OnZhbD0nQmFsbG9vblRleHRDaGFyJy8+CisgICAgICAgICAgICAgICAgICAgIDx3OnVpUHJpb3JpdHkgdzp2YWw9Jzk5Jy8+CisgICAgICAgICAgICAgICAgICAgIDx3OnNlbWlIaWRkZW4vPgorICAgICAgICAgICAgICAgICAgICA8dzp1bmhpZGVXaGVuVXNlZC8+CisgICAgICAgICAgICAgICAgICAgIDx3OnBQcj4KKyAgICAgICAgICAgICAgICAgICAgICA8dzpzcGFjaW5nIHc6YWZ0ZXI9JzAnIHc6bGluZT0nMjQwJyB3OmxpbmVSdWxlPSdhdXRvJy8+CisgICAgICAgICAgICAgICAgICAgIDwvdzpwUHI+CisgICAgICAgICAgICAgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICAgICAgICAgICAgICA8dzpyRm9udHMgdzphc2NpaT0nVGFob21hJyB3OmhBbnNpPSdUYWhvbWEnIHc6Y3M9J1RhaG9tYScvPgorICAgICAgICAgICAgICAgICAgICAgIDx3OnN6IHc6dmFsPScxNicvPgorICAgICAgICAgICAgICAgICAgICAgIDx3OnN6Q3Mgdzp2YWw9JzE2Jy8+CisgICAgICAgICAgICAgICAgICAgIDwvdzpyUHI+CisgICAgICAgICAgICAgICAgICA8L3c6c3R5bGU+Iik7CisKKyAgICAgICAgICAgIEFkZEVsZW1lbnRJZk1pc3NpbmcoCisgICAgICAgICAgICAgICAgeERvYywKKyAgICAgICAgICAgICAgICB4RG9jLlJvb3QuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gKHN0cmluZyllLkF0dHJpYnV0ZShXLnR5cGUpID09ICJjaGFyYWN0ZXIiICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoYm9vbD8pZS5BdHRyaWJ1dGUoVy5jdXN0b21TdHlsZSkgPT0gdHJ1ZSAmJiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gIkJhbGxvb25UZXh0Q2hhciIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorICAgICAgICAgICAgICAgIEAiPHc6c3R5bGUgdzp0eXBlPSdjaGFyYWN0ZXInIHc6Y3VzdG9tU3R5bGU9JzEnIHc6c3R5bGVJZD0nQmFsbG9vblRleHRDaGFyJyB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICAgICAgICAgICAgICAgICAgICA8dzpuYW1lIHc6dmFsPSdCYWxsb29uIFRleHQgQ2hhcicvPgorICAgICAgICAgICAgICAgICAgICA8dzpiYXNlZE9uIHc6dmFsPSdEZWZhdWx0UGFyYWdyYXBoRm9udCcvPgorICAgICAgICAgICAgICAgICAgICA8dzpsaW5rIHc6dmFsPSdCYWxsb29uVGV4dCcvPgorICAgICAgICAgICAgICAgICAgICA8dzp1aVByaW9yaXR5IHc6dmFsPSc5OScvPgorICAgICAgICAgICAgICAgICAgICA8dzpzZW1pSGlkZGVuLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6clByPgorICAgICAgICAgICAgICAgICAgICAgIDx3OnJGb250cyB3OmFzY2lpPSdUYWhvbWEnIHc6aEFuc2k9J1RhaG9tYScgdzpjcz0nVGFob21hJy8+CisgICAgICAgICAgICAgICAgICAgICAgPHc6c3ogdzp2YWw9JzE2Jy8+CisgICAgICAgICAgICAgICAgICAgICAgPHc6c3pDcyB3OnZhbD0nMTYnLz4KKyAgICAgICAgICAgICAgICAgICAgPC93OnJQcj4KKyAgICAgICAgICAgICAgICAgIDwvdzpzdHlsZT4iKTsKKworICAgICAgICAgICAgcGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVXBkYXRlU3R5bGVzUGFydEZvclRvYyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYykKKyAgICAgICAgeworICAgICAgICAgICAgU3R5bGVzUGFydCBzdHlsZXNQYXJ0ID0gZG9jLk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQ7CisgICAgICAgICAgICBpZiAoc3R5bGVzUGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFVwZGF0ZVBhcnRGb3JUb2Moc3R5bGVzUGFydCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFVwZGF0ZVN0eWxlc1dpdGhFZmZlY3RzUGFydEZvclRvYyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYykKKyAgICAgICAgeworICAgICAgICAgICAgU3R5bGVzV2l0aEVmZmVjdHNQYXJ0IHN0eWxlc1dpdGhFZmZlY3RzUGFydCA9IGRvYy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlc1dpdGhFZmZlY3RzUGFydDsKKyAgICAgICAgICAgIGlmIChzdHlsZXNXaXRoRWZmZWN0c1BhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBVcGRhdGVQYXJ0Rm9yVG9jKHN0eWxlc1dpdGhFZmZlY3RzUGFydCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFVwZGF0ZVBhcnRGb3JUb2YoT3BlblhtbFBhcnQgcGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IHhEb2MgPSBwYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICBBZGRFbGVtZW50SWZNaXNzaW5nKAorICAgICAgICAgICAgICAgIHhEb2MsCisgICAgICAgICAgICAgICAgeERvYy5Sb290LkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy50eXBlKSA9PSAicGFyYWdyYXBoIiAmJiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gIlRhYmxlb2ZGaWd1cmVzIikKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCksCisgICAgICAgICAgICAgICAgQCI8dzpzdHlsZSB3OnR5cGU9J3BhcmFncmFwaCcgdzpzdHlsZUlkPSdUYWJsZW9mRmlndXJlcycgeG1sbnM6dz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluJz4KKyAgICAgICAgICAgICAgICAgICAgPHc6bmFtZSB3OnZhbD0ndGFibGUgb2YgZmlndXJlcycvPgorICAgICAgICAgICAgICAgICAgICA8dzpiYXNlZE9uIHc6dmFsPSdOb3JtYWwnLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6bmV4dCB3OnZhbD0nTm9ybWFsJy8+CisgICAgICAgICAgICAgICAgICAgIDx3OnVpUHJpb3JpdHkgdzp2YWw9Jzk5Jy8+CisgICAgICAgICAgICAgICAgICAgIDx3OnVuaGlkZVdoZW5Vc2VkLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6cFByPgorICAgICAgICAgICAgICAgICAgICAgIDx3OnNwYWNpbmcgdzphZnRlcj0nMCcvPgorICAgICAgICAgICAgICAgICAgICA8L3c6cFByPgorICAgICAgICAgICAgICAgICAgPC93OnN0eWxlPiIpOworCisgICAgICAgICAgICBBZGRFbGVtZW50SWZNaXNzaW5nKAorICAgICAgICAgICAgICAgIHhEb2MsCisgICAgICAgICAgICAgICAgeERvYy5Sb290LkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy50eXBlKSA9PSAiY2hhcmFjdGVyIiAmJiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gIkh5cGVybGluayIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorICAgICAgICAgICAgICAgIEAiPHc6c3R5bGUgdzp0eXBlPSdjaGFyYWN0ZXInIHc6c3R5bGVJZD0nSHlwZXJsaW5rJyB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICAgICAgICAgICAgICAgICAgICAgPHc6bmFtZSB3OnZhbD0nSHlwZXJsaW5rJy8+CisgICAgICAgICAgICAgICAgICAgICA8dzpiYXNlZE9uIHc6dmFsPSdEZWZhdWx0UGFyYWdyYXBoRm9udCcvPgorICAgICAgICAgICAgICAgICAgICAgPHc6dWlQcmlvcml0eSB3OnZhbD0nOTknLz4KKyAgICAgICAgICAgICAgICAgICAgIDx3OnVuaGlkZVdoZW5Vc2VkLz4KKyAgICAgICAgICAgICAgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICAgICAgICAgICAgICAgPHc6Y29sb3Igdzp2YWw9JzAwMDBGRicgdzp0aGVtZUNvbG9yPSdoeXBlcmxpbmsnLz4KKyAgICAgICAgICAgICAgICAgICAgICAgPHc6dSB3OnZhbD0nc2luZ2xlJy8+CisgICAgICAgICAgICAgICAgICAgICA8L3c6clByPgorICAgICAgICAgICAgICAgICAgIDwvdzpzdHlsZT4iKTsKKyAgICAgICAgICAgIHBhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFVwZGF0ZVN0eWxlc1BhcnRGb3JUb2YoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0eWxlc1BhcnQgc3R5bGVzUGFydCA9IGRvYy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0OworICAgICAgICAgICAgaWYgKHN0eWxlc1BhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBVcGRhdGVQYXJ0Rm9yVG9mKHN0eWxlc1BhcnQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBVcGRhdGVTdHlsZXNXaXRoRWZmZWN0c1BhcnRGb3JUb2YoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0eWxlc1dpdGhFZmZlY3RzUGFydCBzdHlsZXNXaXRoRWZmZWN0c1BhcnQgPSBkb2MuTWFpbkRvY3VtZW50UGFydC5TdHlsZXNXaXRoRWZmZWN0c1BhcnQ7CisgICAgICAgICAgICBpZiAoc3R5bGVzV2l0aEVmZmVjdHNQYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgVXBkYXRlUGFydEZvclRvZihzdHlsZXNXaXRoRWZmZWN0c1BhcnQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBVcGRhdGVQYXJ0Rm9yVG9hKE9wZW5YbWxQYXJ0IHBhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCB4RG9jID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgQWRkRWxlbWVudElmTWlzc2luZygKKyAgICAgICAgICAgICAgICB4RG9jLAorICAgICAgICAgICAgICAgIHhEb2MuUm9vdC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcudHlwZSkgPT0gInBhcmFncmFwaCIgJiYgKHN0cmluZyllLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09ICJUYWJsZW9mQXV0aG9yaXRpZXMiKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKSwKKyAgICAgICAgICAgICAgICBAIjx3OnN0eWxlIHc6dHlwZT0ncGFyYWdyYXBoJworICAgICAgICAgICAgICAgICAgICAgICAgICAgdzpzdHlsZUlkPSdUYWJsZW9mQXV0aG9yaXRpZXMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICAgICAgICAgICAgICAgICAgICA8dzpuYW1lIHc6dmFsPSd0YWJsZSBvZiBhdXRob3JpdGllcycvPgorICAgICAgICAgICAgICAgICAgICA8dzpiYXNlZE9uIHc6dmFsPSdOb3JtYWwnLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6bmV4dCB3OnZhbD0nTm9ybWFsJy8+CisgICAgICAgICAgICAgICAgICAgIDx3OnVpUHJpb3JpdHkgdzp2YWw9Jzk5Jy8+CisgICAgICAgICAgICAgICAgICAgIDx3OnNlbWlIaWRkZW4vPgorICAgICAgICAgICAgICAgICAgICA8dzp1bmhpZGVXaGVuVXNlZC8+CisgICAgICAgICAgICAgICAgICAgIDx3OnJzaWQgdzp2YWw9JzAwOTA1NjlEJy8+CisgICAgICAgICAgICAgICAgICAgIDx3OnBQcj4KKyAgICAgICAgICAgICAgICAgICAgICA8dzpzcGFjaW5nIHc6YWZ0ZXI9JzAnLz4KKyAgICAgICAgICAgICAgICAgICAgICA8dzppbmQgdzpsZWZ0PScyMjAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6aGFuZ2luZz0nMjIwJy8+CisgICAgICAgICAgICAgICAgICAgIDwvdzpwUHI+CisgICAgICAgICAgICAgICAgICA8L3c6c3R5bGU+Iik7CisKKyAgICAgICAgICAgIEFkZEVsZW1lbnRJZk1pc3NpbmcoCisgICAgICAgICAgICAgICAgeERvYywKKyAgICAgICAgICAgICAgICB4RG9jLlJvb3QuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gKHN0cmluZyllLkF0dHJpYnV0ZShXLnR5cGUpID09ICJwYXJhZ3JhcGgiICYmIChzdHJpbmcpZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKSA9PSAiVE9BSGVhZGluZyIpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLAorICAgICAgICAgICAgICAgIEAiPHc6c3R5bGUgdzp0eXBlPSdwYXJhZ3JhcGgnCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3OnN0eWxlSWQ9J1RPQUhlYWRpbmcnCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxuczp3PSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4nPgorICAgICAgICAgICAgICAgICAgICA8dzpuYW1lIHc6dmFsPSd0b2EgaGVhZGluZycvPgorICAgICAgICAgICAgICAgICAgICA8dzpiYXNlZE9uIHc6dmFsPSdOb3JtYWwnLz4KKyAgICAgICAgICAgICAgICAgICAgPHc6bmV4dCB3OnZhbD0nTm9ybWFsJy8+CisgICAgICAgICAgICAgICAgICAgIDx3OnVpUHJpb3JpdHkgdzp2YWw9Jzk5Jy8+CisgICAgICAgICAgICAgICAgICAgIDx3OnNlbWlIaWRkZW4vPgorICAgICAgICAgICAgICAgICAgICA8dzp1bmhpZGVXaGVuVXNlZC8+CisgICAgICAgICAgICAgICAgICAgIDx3OnJzaWQgdzp2YWw9JzAwOTA1NjlEJy8+CisgICAgICAgICAgICAgICAgICAgIDx3OnBQcj4KKyAgICAgICAgICAgICAgICAgICAgICA8dzpzcGFjaW5nIHc6YmVmb3JlPScxMjAnLz4KKyAgICAgICAgICAgICAgICAgICAgPC93OnBQcj4KKyAgICAgICAgICAgICAgICAgICAgPHc6clByPgorICAgICAgICAgICAgICAgICAgICAgIDx3OnJGb250cyB3OmFzY2lpVGhlbWU9J21ham9ySEFuc2knCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6ZWFzdEFzaWFUaGVtZT0nbWFqb3JFYXN0QXNpYScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzpoQW5zaVRoZW1lPSdtYWpvckhBbnNpJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OmNzdGhlbWU9J21ham9yQmlkaScvPgorICAgICAgICAgICAgICAgICAgICAgIDx3OmIvPgorICAgICAgICAgICAgICAgICAgICAgIDx3OmJDcy8+CisgICAgICAgICAgICAgICAgICAgICAgPHc6c3ogdzp2YWw9JzI0Jy8+CisgICAgICAgICAgICAgICAgICAgICAgPHc6c3pDcyB3OnZhbD0nMjQnLz4KKyAgICAgICAgICAgICAgICAgICAgPC93OnJQcj4KKyAgICAgICAgICAgICAgICAgIDwvdzpzdHlsZT4iKTsKKworICAgICAgICAgICAgcGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVXBkYXRlU3R5bGVzUGFydEZvclRvYShXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYykKKyAgICAgICAgeworICAgICAgICAgICAgU3R5bGVzUGFydCBzdHlsZXNQYXJ0ID0gZG9jLk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQ7CisgICAgICAgICAgICBpZiAoc3R5bGVzUGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFVwZGF0ZVBhcnRGb3JUb2Eoc3R5bGVzUGFydCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFVwZGF0ZVN0eWxlc1dpdGhFZmZlY3RzUGFydEZvclRvYShXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYykKKyAgICAgICAgeworICAgICAgICAgICAgU3R5bGVzV2l0aEVmZmVjdHNQYXJ0IHN0eWxlc1dpdGhFZmZlY3RzUGFydCA9IGRvYy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlc1dpdGhFZmZlY3RzUGFydDsKKyAgICAgICAgICAgIGlmIChzdHlsZXNXaXRoRWZmZWN0c1BhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBVcGRhdGVQYXJ0Rm9yVG9hKHN0eWxlc1dpdGhFZmZlY3RzUGFydCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9SZXZpc2lvbkFjY2VwdGVyLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvUmV2aXNpb25BY2NlcHRlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQwNzdmCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvUmV2aXNpb25BY2NlcHRlci5jcwpAQCAtMCwwICsxLDYxIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7CisKK25hbWVzcGFjZSBPcGVuWG1sUG93ZXJUb29scworeworICAgIHB1YmxpYyBjbGFzcyBSZXZpc2lvbkFjY2VwdGVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIFdtbERvY3VtZW50IEFjY2VwdFJldmlzaW9ucyhXbWxEb2N1bWVudCBkb2N1bWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCBzdHJlYW1Eb2MgPSBuZXcgT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50KGRvY3VtZW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MgPSBzdHJlYW1Eb2MuR2V0V29yZHByb2Nlc3NpbmdEb2N1bWVudCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQWNjZXB0UmV2aXNpb25zKGRvYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1Eb2MuR2V0TW9kaWZpZWRXbWxEb2N1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEFjY2VwdFJldmlzaW9ucyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYykKKyAgICAgICAgeworICAgICAgICAgICAgUmV2aXNpb25Qcm9jZXNzb3IuQWNjZXB0UmV2aXNpb25zKGRvYyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgUGFydEhhc1RyYWNrZWRSZXZpc2lvbnMoT3BlblhtbFBhcnQgcGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFJldmlzaW9uUHJvY2Vzc29yLlBhcnRIYXNUcmFja2VkUmV2aXNpb25zKHBhcnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEhhc1RyYWNrZWRSZXZpc2lvbnMoV21sRG9jdW1lbnQgZG9jdW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZXZpc2lvblByb2Nlc3Nvci5IYXNUcmFja2VkUmV2aXNpb25zKGRvY3VtZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBIYXNUcmFja2VkUmV2aXNpb25zKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmV2aXNpb25Qcm9jZXNzb3IuSGFzVHJhY2tlZFJldmlzaW9ucyhkb2MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvUmV2aXNpb25Qcm9jZXNzb3IuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9SZXZpc2lvblByb2Nlc3Nvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDEyNjNjCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvUmV2aXNpb25Qcm9jZXNzb3IuY3MKQEAgLTAsMCArMSwzMjUzIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1BvcnRpb25zIENvcHlyaWdodCAoYykgRXJpYyBXaGl0ZSAyMDE3LgorUG9ydGlvbnMgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9FcmljV2hpdGUuY29tCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9lcmljd2hpdGUuY29tL2Jsb2cvYmxvZy9vcGVuLXhtbC1wb3dlcnRvb2xzLWRldmVsb3Blci1jZW50ZXIvCisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tLCBlcmljd2hpdGVkZXZAZ21haWwuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBjbGFzcyBSZXZlcnNlUmV2aXNpb25zSW5mbworICAgIHsKKyAgICAgICAgcHVibGljIGJvb2wgSW5JbnNlcnQ7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFJldmlzaW9uUHJvY2Vzc29yCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIFdtbERvY3VtZW50IFJlamVjdFJldmlzaW9ucyhXbWxEb2N1bWVudCBkb2N1bWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCBzdHJlYW1Eb2MgPSBuZXcgT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50KGRvY3VtZW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MgPSBzdHJlYW1Eb2MuR2V0V29yZHByb2Nlc3NpbmdEb2N1bWVudCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmVqZWN0UmV2aXNpb25zKGRvYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1Eb2MuR2V0TW9kaWZpZWRXbWxEb2N1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlamVjdFJldmlzaW9ucyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYykKKyAgICAgICAgeworICAgICAgICAgICAgUmVqZWN0UmV2aXNpb25zRm9yUGFydChkb2MuTWFpbkRvY3VtZW50UGFydCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFydCBpbiBkb2MuTWFpbkRvY3VtZW50UGFydC5IZWFkZXJQYXJ0cykKKyAgICAgICAgICAgICAgICBSZWplY3RSZXZpc2lvbnNGb3JQYXJ0KHBhcnQpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gZG9jLk1haW5Eb2N1bWVudFBhcnQuRm9vdGVyUGFydHMpCisgICAgICAgICAgICAgICAgUmVqZWN0UmV2aXNpb25zRm9yUGFydChwYXJ0KTsKKyAgICAgICAgICAgIGlmIChkb2MuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBSZWplY3RSZXZpc2lvbnNGb3JQYXJ0KGRvYy5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCk7CisgICAgICAgICAgICBpZiAoZG9jLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgIFJlamVjdFJldmlzaW9uc0ZvclBhcnQoZG9jLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydCk7CisgICAgICAgICAgICBpZiAoZG9jLk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBSZWplY3RSZXZpc2lvbnNGb3JTdHlsZXNEZWZpbml0aW9uUGFydChkb2MuTWFpbkRvY3VtZW50UGFydC5TdHlsZURlZmluaXRpb25zUGFydCk7CisKKyAgICAgICAgICAgIFJldmVyc2VSZXZpc2lvbnMoZG9jKTsKKyAgICAgICAgICAgIEFjY2VwdFJldmlzaW9uc0ZvclBhcnQoZG9jLk1haW5Eb2N1bWVudFBhcnQpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gZG9jLk1haW5Eb2N1bWVudFBhcnQuSGVhZGVyUGFydHMpCisgICAgICAgICAgICAgICAgQWNjZXB0UmV2aXNpb25zRm9yUGFydChwYXJ0KTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYXJ0IGluIGRvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3RlclBhcnRzKQorICAgICAgICAgICAgICAgIEFjY2VwdFJldmlzaW9uc0ZvclBhcnQocGFydCk7CisgICAgICAgICAgICBpZiAoZG9jLk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgQWNjZXB0UmV2aXNpb25zRm9yUGFydChkb2MuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQpOworICAgICAgICAgICAgaWYgKGRvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBBY2NlcHRSZXZpc2lvbnNGb3JQYXJ0KGRvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQpOworICAgICAgICAgICAgaWYgKGRvYy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgQWNjZXB0UmV2aXNpb25zRm9yU3R5bGVzRGVmaW5pdGlvblBhcnQoZG9jLk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVqZWN0IHJldmlzaW9ucyBmb3IgdGhvc2UgcmV2aXNpb25zIHRoYXQgY2FuJ3QgYmUgcmVqZWN0ZWQgYnkgaW52ZXJ0aW5nIHRoZSBzZW5zZSBvZiB0aGUgcmV2aXNpb24sIGFuZCB0aGVuIGFjY2VwdGluZy4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZWplY3RSZXZpc2lvbnNGb3JQYXJ0KE9wZW5YbWxQYXJ0IHBhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4RG9jID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciBuZXdSb290ID0gUmVqZWN0UmV2aXNpb25zRm9yUGFydFRyYW5zZm9ybSh4RG9jLlJvb3QpOworICAgICAgICAgICAgeERvYy5Sb290LlJlcGxhY2VXaXRoKG5ld1Jvb3QpOworICAgICAgICAgICAgcGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBSZWplY3RSZXZpc2lvbnNGb3JQYXJ0VHJhbnNmb3JtKFhOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgIC8vIEluc2VydGVkIE51bWJlcmluZyBQcm9wZXJ0aWVzCisjaWYgZmFsc2UKKyAgICA8dzpwPgorICAgICAgPHc6cFByPgorICAgICAgICA8dzpwU3R5bGUgdzp2YWw9Ikxpc3RQYXJhZ3JhcGgiLz4KKyAgICAgICAgPHc6bnVtUHI+CisgICAgICAgICAgPHc6aWx2bCB3OnZhbD0iMCIvPgorICAgICAgICAgIDx3Om51bUlkIHc6dmFsPSIxIi8+CisgICAgICAgICAgPHc6aW5zIHc6aWQ9IjAiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjZUMDM6NTA6MDBaIiAvPgorICAgICAgICA8L3c6bnVtUHI+CisgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICA8dzpsYW5nIHc6dmFsPSJlbi1VUyIvPgorICAgICAgICA8L3c6clByPgorICAgICAgPC93OnBQcj4KKyAgICAgIDx3OnIgdzpyc2lkUlByPSIwMDlENTlCMyI+CisgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICA8dzpsYW5nIHc6dmFsPSJlbi1VUyIvPgorICAgICAgICA8L3c6clByPgorICAgICAgICA8dzp0PlRoaXMgaXMgYSB0ZXN0Ljwvdzp0PgorICAgICAgPC93OnI+CisgICAgPC93OnA+CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcubnVtUHIgJiYgZWxlbWVudC5FbGVtZW50KFcuaW5zKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAvLyBQYXJhZ3JhcGggcHJvcGVydGllcyBjaGFuZ2UKKyNpZiBmYWxzZQorICAgIDx3OnA+CisgICAgICA8dzpwUHI+CisgICAgICAgIDx3OnBTdHlsZSB3OnZhbD0iTGlzdFBhcmFncmFwaCIvPgorICAgICAgICA8dzpudW1Qcj4KKyAgICAgICAgICA8dzppbHZsIHc6dmFsPSIxIi8+CisgICAgICAgICAgPHc6bnVtSWQgdzp2YWw9IjIiLz4KKyAgICAgICAgPC93Om51bVByPgorICAgICAgICA8dzpyUHI+CisgICAgICAgICAgPHc6bGFuZyB3OnZhbD0iZW4tVVMiLz4KKyAgICAgICAgPC93OnJQcj4KKyAgICAgICAgPHc6cFByQ2hhbmdlIHc6aWQ9IjAiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjZUMDQ6NTU6MDBaIj4KKyAgICAgICAgICA8dzpwUHI+CisgICAgICAgICAgICA8dzpwU3R5bGUgdzp2YWw9Ikxpc3RQYXJhZ3JhcGgiLz4KKyAgICAgICAgICAgIDx3Om51bVByPgorICAgICAgICAgICAgICA8dzppbHZsIHc6dmFsPSIxIi8+CisgICAgICAgICAgICAgIDx3Om51bUlkIHc6dmFsPSIxIi8+CisgICAgICAgICAgICA8L3c6bnVtUHI+CisgICAgICAgICAgICA8dzppbmQgdzpsZWZ0PSIxNDQwIiB3Omhhbmdpbmc9IjM2MCIvPgorICAgICAgICAgIDwvdzpwUHI+CisgICAgICAgIDwvdzpwUHJDaGFuZ2U+CisgICAgICA8L3c6cFByPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6dD5XaGVuIHlvdSBjbGljayBPbmxpbmUgVmlkZW8sIHlvdSBjYW4gcGFzdGUgaW4gdGhlIGVtYmVkIGNvZGUgZm9yIHRoZSB2aWRlbyB5b3Ugd2FudCB0byBhZGQuPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICA8L3c6cD4KKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5wUHIgJiYKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50KFcucFByQ2hhbmdlKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBQciA9IGVsZW1lbnQuRWxlbWVudChXLnBQckNoYW5nZSkuRWxlbWVudChXLnBQcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwUHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBQciA9IG5ldyBYRWxlbWVudChXLnBQcik7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdfcFByID0gbmV3IFhFbGVtZW50KHBQcik7IC8vIGNsb25lIGl0CisgICAgICAgICAgICAgICAgICAgIG5ld19wUHIuQWRkKFJlamVjdFJldmlzaW9uc0ZvclBhcnRUcmFuc2Zvcm0oZWxlbWVudC5FbGVtZW50KFcuclByKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVqZWN0UmV2aXNpb25zRm9yUGFydFRyYW5zZm9ybShuZXdfcFByKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gUnVuIHByb3BlcnRpZXMgY2hhbmdlCisjaWYgZmFsc2UKKyAgICAgICAgPHc6cCB3OnJzaWRSPSIwMDYxNTE0OCIgdzpyc2lkUlByPSIwMDYxNTE0OCIgdzpyc2lkUkRlZmF1bHQ9IjAwNjE1MTQ4Ij4KKyAgICAgICAgICA8dzpwUHI+CisgICAgICAgICAgICA8dzpyUHI+CisgICAgICAgICAgICAgIDx3OmIvPgorICAgICAgICAgICAgICA8dzpsYW5nIHc6dmFsPSJlbi1VUyIvPgorICAgICAgICAgICAgICA8dzpyUHJDaGFuZ2UgdzppZD0iMCIgdzphdXRob3I9IkVyaWMgV2hpdGUiIHc6ZGF0ZT0iMjAxNy0wMy0yNlQwNTowMjowMFoiPgorICAgICAgICAgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICAgICAgICAgIDx3Omxhbmcgdzp2YWw9ImVuLVVTIi8+CisgICAgICAgICAgICAgICAgPC93OnJQcj4KKyAgICAgICAgICAgICAgPC93OnJQckNoYW5nZT4KKyAgICAgICAgICAgIDwvdzpyUHI+CisgICAgICAgICAgPC93OnBQcj4KKyAgICAgICAgICA8dzpyPgorICAgICAgICAgICAgPHc6clByPgorICAgICAgICAgICAgICA8dzpsYW5nIHc6dmFsPSJlbi1VUyIvPgorICAgICAgICAgICAgPC93OnJQcj4KKyAgICAgICAgICAgIDx3OnQ+V2hlbiB5b3UgY2xpY2sgT25saW5lIFZpZGVvLCB5b3UgY2FuIHBhc3RlIGluIHRoZSBlbWJlZCBjb2RlIGZvciB0aGUgdmlkZW8geW91IHdhbnQgdG8gYWRkLjwvdzp0PgorICAgICAgICAgIDwvdzpyPgorICAgICAgICAgIDx3OmJvb2ttYXJrU3RhcnQgdzppZD0iMSIgdzpuYW1lPSJfR29CYWNrIi8+CisgICAgICAgIDwvdzpwPgorI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnJQciAmJgorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnQoVy5yUHJDaGFuZ2UpICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbmV3X3JQciA9IGVsZW1lbnQuRWxlbWVudChXLnJQckNoYW5nZSkuRWxlbWVudChXLnJQcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWplY3RSZXZpc2lvbnNGb3JQYXJ0VHJhbnNmb3JtKG5ld19yUHIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAvLyBGaWVsZCBjb2RlIG51bWJlcmluZyBjaGFuZ2UKKyNpZiBmYWxzZQorICAgIDx3OnAgdzpyc2lkUj0iMDBENDYyNDciIHc6cnNpZFJEZWZhdWx0PSIwMEQ0NjI0NyI+CisgICAgICA8dzpyPgorICAgICAgICA8dzpmbGRDaGFyIHc6ZmxkQ2hhclR5cGU9ImJlZ2luIi8+CisgICAgICA8L3c6cj4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3Omluc3RyVGV4dCB4bWw6c3BhY2U9InByZXNlcnZlIj4gTElTVE5VTSA8L3c6aW5zdHJUZXh0PgorICAgICAgPC93OnI+CisgICAgICA8dzpyPgorICAgICAgICA8dzpmbGRDaGFyIHc6ZmxkQ2hhclR5cGU9ImVuZCI+CisgICAgICAgICAgPHc6bnVtYmVyaW5nQ2hhbmdlIHc6aWQ9IjAiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjZUMTI6NDg6MDBaIiB3Om9yaWdpbmFsPSIxKSIvPgorICAgICAgICA8L3c6ZmxkQ2hhcj4KKyAgICAgIDwvdzpyPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6dCB4bWw6c3BhY2U9InByZXNlcnZlIj4gVmlkZW8gcHJvdmlkZXMgYSBwb3dlcmZ1bCB3YXkgdG8gaGVscCB5b3UgcHJvdmUgeW91ciBwb2ludC48L3c6dD4KKyAgICAgIDwvdzpyPgorICAgIDwvdzpwPgorI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLm51bWJlcmluZ0NoYW5nZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgdzpzZWN0UHIKKyNpZiBmYWxzZQorICAgIDx3OnA+CisgICAgICA8dzpwUHI+CisgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICA8dzppbnMgdzppZD0iMCIgdzphdXRob3I9IkVyaWMgV2hpdGUiIHc6ZGF0ZT0iMjAxNy0wMy0yNlQxNTo0MDowMFoiLz4KKyAgICAgICAgPC93OnJQcj4KKyAgICAgICAgPHc6c2VjdFByPgorICAgICAgICAgIDx3OnBnU3ogdzp3PSIxMjI0MCIgdzpoPSIxNTg0MCIvPgorICAgICAgICAgIDx3OnBnTWFyIHc6dG9wPSI3MjAiIHc6cmlnaHQ9IjcyMCIgdzpib3R0b209IjcyMCIgdzpsZWZ0PSI3MjAiIHc6aGVhZGVyPSI3MjAiIHc6Zm9vdGVyPSI3MjAiIHc6Z3V0dGVyPSIwIi8+CisgICAgICAgICAgPHc6Y29scyB3OnNwYWNlPSI3MjAiLz4KKyAgICAgICAgICA8dzpkb2NHcmlkIHc6bGluZVBpdGNoPSIzNjAiLz4KKyAgICAgICAgICA8dzpzZWN0UHJDaGFuZ2UgdzppZD0iMSIgdzphdXRob3I9IkVyaWMgV2hpdGUiIHc6ZGF0ZT0iMjAxNy0wMy0yNlQxNTo0MjowMFoiPgorICAgICAgICAgICAgPHc6c2VjdFByIHc6cnNpZFI9IjAwNjIwOTkwIiB3OnJzaWRTZWN0PSIwMDRFMDc1NyI+CisgICAgICAgICAgICAgIDx3OnBnTWFyIHc6dG9wPSIxNDQwIiB3OnJpZ2h0PSIxNDQwIiB3OmJvdHRvbT0iMTQ0MCIgdzpsZWZ0PSIxNDQwIiB3OmhlYWRlcj0iNzIwIiB3OmZvb3Rlcj0iNzIwIiB3Omd1dHRlcj0iMCIvPgorICAgICAgICAgICAgPC93OnNlY3RQcj4KKyAgICAgICAgICA8L3c6c2VjdFByQ2hhbmdlPgorICAgICAgICA8L3c6c2VjdFByPgorICAgICAgPC93OnBQcj4KKyAgICA8L3c6cD4KKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5zZWN0UHIgJiYKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50KFcuc2VjdFByQ2hhbmdlKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1NlY3RQciA9IGVsZW1lbnQuRWxlbWVudChXLnNlY3RQckNoYW5nZSkuRWxlbWVudChXLnNlY3RQcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWplY3RSZXZpc2lvbnNGb3JQYXJ0VHJhbnNmb3JtKG5ld1NlY3RQcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gdGJsR3JpZENoYW5nZQorI2lmIGZhbHNlCisgICAgICA8dzp0YmxHcmlkPgorICAgICAgICA8dzpncmlkQ29sIHc6dz0iMTUyNSIvPgorICAgICAgICA8dzpncmlkQ29sIHc6dz0iMzAwNSIvPgorICAgICAgICA8dzpncmlkQ29sIHc6dz0iMzAwNiIvPgorICAgICAgICA8dzp0YmxHcmlkQ2hhbmdlIHc6aWQ9IjEiPgorICAgICAgICAgIDx3OnRibEdyaWQ+CisgICAgICAgICAgICA8dzpncmlkQ29sIHc6dz0iMzAwNSIvPgorICAgICAgICAgICAgPHc6Z3JpZENvbCB3Onc9IjMwMDUiLz4KKyAgICAgICAgICAgIDx3OmdyaWRDb2wgdzp3PSIzMDA2Ii8+CisgICAgICAgICAgPC93OnRibEdyaWQ+CisgICAgICAgIDwvdzp0YmxHcmlkQ2hhbmdlPgorICAgICAgPC93OnRibEdyaWQ+CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcudGJsR3JpZCAmJgorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnQoVy50YmxHcmlkQ2hhbmdlKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1RibEdyaWQgPSBlbGVtZW50LkVsZW1lbnQoVy50YmxHcmlkQ2hhbmdlKS5FbGVtZW50KFcudGJsR3JpZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWplY3RSZXZpc2lvbnNGb3JQYXJ0VHJhbnNmb3JtKG5ld1RibEdyaWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgIC8vIHRjUHJDaGFuZ2UKKyNpZiBmYWxzZQorICAgICAgICA8dzp0Yz4KKyAgICAgICAgICA8dzp0Y1ByPgorICAgICAgICAgICAgPHc6dGNXIHc6dz0iMTUyNSIgdzp0eXBlPSJkeGEiLz4KKyAgICAgICAgICAgIDx3OnRjUHJDaGFuZ2UgdzppZD0iMiIgdzphdXRob3I9IkVyaWMgV2hpdGUiIHc6ZGF0ZT0iMjAxNy0wMy0yNlQxODowMTowMFoiPgorICAgICAgICAgICAgICA8dzp0Y1ByPgorICAgICAgICAgICAgICAgIDx3OnRjVyB3Onc9IjMwMDUiIHc6dHlwZT0iZHhhIi8+CisgICAgICAgICAgICAgIDwvdzp0Y1ByPgorICAgICAgICAgICAgPC93OnRjUHJDaGFuZ2U+CisgICAgICAgICAgPC93OnRjUHI+CisgICAgICAgICAgPHc6cD4KKyAgICAgICAgICAgIDx3OnI+CisgICAgICAgICAgICAgIDx3OnQ+MTwvdzp0PgorICAgICAgICAgICAgPC93OnI+CisgICAgICAgICAgPC93OnA+CisgICAgICAgIDwvdzp0Yz4KKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy50Y1ByICYmCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudChXLnRjUHJDaGFuZ2UpICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VGNQciA9IGVsZW1lbnQuRWxlbWVudChXLnRjUHJDaGFuZ2UpLkVsZW1lbnQoVy50Y1ByKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlamVjdFJldmlzaW9uc0ZvclBhcnRUcmFuc2Zvcm0obmV3VGNQcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gdHJQckNoYW5nZQorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy50clByICYmCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudChXLnRyUHJDaGFuZ2UpICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VHJQciA9IGVsZW1lbnQuRWxlbWVudChXLnRyUHJDaGFuZ2UpLkVsZW1lbnQoVy50clByKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlamVjdFJldmlzaW9uc0ZvclBhcnRUcmFuc2Zvcm0obmV3VHJQcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gdGJsUHJFeENoYW5nZQorI2lmIGZhbHNlCisgICAgICAgIDx3OnRibFByRXg+CisgICAgICAgICAgPHc6dGJsVyB3Onc9IjAiIHc6dHlwZT0iYXV0byIvPgorICAgICAgICAgIDx3OnRibFByRXhDaGFuZ2UgdzppZD0iMSIgdzphdXRob3I9IkVyaWMgV2hpdGUiIHc6ZGF0ZT0iMjAxNy0wMy0yNlQxODoxMDowMFoiPgorICAgICAgICAgICAgPHc6dGJsUHJFeD4KKyAgICAgICAgICAgICAgPHc6dGJsVyB3Onc9IjAiIHc6dHlwZT0iYXV0byIvPgorICAgICAgICAgICAgPC93OnRibFByRXg+CisgICAgICAgICAgPC93OnRibFByRXhDaGFuZ2U+CisgICAgICAgIDwvdzp0YmxQckV4PgorI2VuZGlmCisKKyNpZiBmYWxzZQorICAgICAgPHc6dHIgdzpyc2lkUj0iMDAwOTc1ODIiIHc6cnNpZFRyPSIwMEY4NDNDNCI+CisgICAgICAgIDx3OnRibFByRXg+CisgICAgICAgICAgPHc6dGJsVyB3Onc9IjAiIHc6dHlwZT0iYXV0byIvPgorICAgICAgICAgIDx3OnRibEJvcmRlcnM+CisgICAgICAgICAgICA8dzp0b3Agdzp2YWw9InRoaWNrVGhpbk1lZGl1bUdhcCIgdzpzej0iMjQiIHc6c3BhY2U9IjAiIHc6Y29sb3I9ImF1dG8iLz4KKyAgICAgICAgICAgIDx3OmxlZnQgdzp2YWw9InRoaWNrVGhpbk1lZGl1bUdhcCIgdzpzej0iMjQiIHc6c3BhY2U9IjAiIHc6Y29sb3I9ImF1dG8iLz4KKyAgICAgICAgICAgIDx3OmJvdHRvbSB3OnZhbD0idGhpY2tUaGluTWVkaXVtR2FwIiB3OnN6PSIyNCIgdzpzcGFjZT0iMCIgdzpjb2xvcj0iYXV0byIvPgorICAgICAgICAgICAgPHc6cmlnaHQgdzp2YWw9InRoaWNrVGhpbk1lZGl1bUdhcCIgdzpzej0iMjQiIHc6c3BhY2U9IjAiIHc6Y29sb3I9ImF1dG8iLz4KKyAgICAgICAgICAgIDx3Omluc2lkZUggdzp2YWw9InRoaWNrVGhpbk1lZGl1bUdhcCIgdzpzej0iMjQiIHc6c3BhY2U9IjAiIHc6Y29sb3I9ImF1dG8iLz4KKyAgICAgICAgICAgIDx3Omluc2lkZVYgdzp2YWw9InRoaWNrVGhpbk1lZGl1bUdhcCIgdzpzej0iMjQiIHc6c3BhY2U9IjAiIHc6Y29sb3I9ImF1dG8iLz4KKyAgICAgICAgICA8L3c6dGJsQm9yZGVycz4KKyAgICAgICAgICA8dzp0YmxQckV4Q2hhbmdlIHc6aWQ9IjEiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjZUMjA6Mzg6MDBaIj4KKyAgICAgICAgICAgIDx3OnRibFByRXg+CisgICAgICAgICAgICAgIDx3OnRibFcgdzp3PSIwIiB3OnR5cGU9ImF1dG8iLz4KKyAgICAgICAgICAgICAgPHc6dGJsQm9yZGVycz4KKyAgICAgICAgICAgICAgICA8dzp0b3Agdzp2YWw9InRoaWNrVGhpbk1lZGl1bUdhcCIgdzpzej0iMjQiIHc6c3BhY2U9IjAiIHc6Y29sb3I9ImF1dG8iLz4KKyAgICAgICAgICAgICAgICA8dzpsZWZ0IHc6dmFsPSJ0aGlja1RoaW5NZWRpdW1HYXAiIHc6c3o9IjI0IiB3OnNwYWNlPSIwIiB3OmNvbG9yPSJhdXRvIi8+CisgICAgICAgICAgICAgICAgPHc6Ym90dG9tIHc6dmFsPSJ0aGlja1RoaW5NZWRpdW1HYXAiIHc6c3o9IjI0IiB3OnNwYWNlPSIwIiB3OmNvbG9yPSJhdXRvIi8+CisgICAgICAgICAgICAgICAgPHc6cmlnaHQgdzp2YWw9InRoaWNrVGhpbk1lZGl1bUdhcCIgdzpzej0iMjQiIHc6c3BhY2U9IjAiIHc6Y29sb3I9ImF1dG8iLz4KKyAgICAgICAgICAgICAgICA8dzppbnNpZGVIIHc6dmFsPSJ0aGlja1RoaW5NZWRpdW1HYXAiIHc6c3o9IjI0IiB3OnNwYWNlPSIwIiB3OmNvbG9yPSJhdXRvIi8+CisgICAgICAgICAgICAgICAgPHc6aW5zaWRlViB3OnZhbD0idGhpY2tUaGluTWVkaXVtR2FwIiB3OnN6PSIyNCIgdzpzcGFjZT0iMCIgdzpjb2xvcj0iYXV0byIvPgorICAgICAgICAgICAgICA8L3c6dGJsQm9yZGVycz4KKyAgICAgICAgICAgIDwvdzp0YmxQckV4PgorICAgICAgICAgIDwvdzp0YmxQckV4Q2hhbmdlPgorICAgICAgICA8L3c6dGJsUHJFeD4KKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy50YmxQckV4ICYmCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudChXLnRibFByRXhDaGFuZ2UpICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VGJsUHJFeCA9IGVsZW1lbnQuRWxlbWVudChXLnRibFByRXhDaGFuZ2UpLkVsZW1lbnQoVy50YmxQckV4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlamVjdFJldmlzaW9uc0ZvclBhcnRUcmFuc2Zvcm0obmV3VGJsUHJFeCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gdGJsUHJDaGFuZ2UKKyNpZiBmYWxzZQorICAgIDx3OnRibD4KKyAgICAgIDx3OnRibFByPgorICAgICAgICA8dzp0YmxTdHlsZSB3OnZhbD0iR3JpZFRhYmxlNC1BY2NlbnQxIi8+CisgICAgICAgIDx3OnRibFcgdzp3PSIwIiB3OnR5cGU9ImF1dG8iLz4KKyAgICAgICAgPHc6dGJsTG9vayB3OnZhbD0iMDRBMCIgdzpmaXJzdFJvdz0iMSIgdzpsYXN0Um93PSIwIiB3OmZpcnN0Q29sdW1uPSIxIiB3Omxhc3RDb2x1bW49IjAiIHc6bm9IQmFuZD0iMCIgdzpub1ZCYW5kPSIxIi8+CisgICAgICAgIDx3OnRibFByQ2hhbmdlIHc6aWQ9IjAiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjZUMjA6MDU6MDBaIj4KKyAgICAgICAgICA8dzp0YmxQcj4KKyAgICAgICAgICAgIDx3OnRibFN0eWxlIHc6dmFsPSJUYWJsZUdyaWQiLz4KKyAgICAgICAgICAgIDx3OnRibFcgdzp3PSIwIiB3OnR5cGU9ImF1dG8iLz4KKyAgICAgICAgICAgIDx3OnRibExvb2sgdzp2YWw9IjA0QTAiIHc6Zmlyc3RSb3c9IjEiIHc6bGFzdFJvdz0iMCIgdzpmaXJzdENvbHVtbj0iMSIgdzpsYXN0Q29sdW1uPSIwIiB3Om5vSEJhbmQ9IjAiIHc6bm9WQmFuZD0iMSIvPgorICAgICAgICAgIDwvdzp0YmxQcj4KKyAgICAgICAgPC93OnRibFByQ2hhbmdlPgorICAgICAgPC93OnRibFByPgorI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRibFByICYmCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudChXLnRibFByQ2hhbmdlKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1RyUHIgPSBlbGVtZW50LkVsZW1lbnQoVy50YmxQckNoYW5nZSkuRWxlbWVudChXLnRibFByKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlamVjdFJldmlzaW9uc0ZvclBhcnRUcmFuc2Zvcm0obmV3VHJQcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gdGJsUHJDaGFuZ2UKKyNpZiBmYWxzZQorICAgICAgICA8dzp0Yz4KKyAgICAgICAgICA8dzp0Y1ByPgorICAgICAgICAgICAgPHc6dGNXIHc6dz0iMzAwNSIgdzp0eXBlPSJkeGEiLz4KKyAgICAgICAgICAgIDx3OmNlbGxEZWwgdzppZD0iOCIgdzphdXRob3I9IkVyaWMgV2hpdGUiIHc6ZGF0ZT0iMjAxNy0wMy0yNlQyMToxMjowMFoiLz4KKyAgICAgICAgICAgIDx3OnRjUHJDaGFuZ2UgdzppZD0iOSIgdzphdXRob3I9IkVyaWMgV2hpdGUiIHc6ZGF0ZT0iMjAxNy0wMy0yNlQyMToxMjowMFoiPgorICAgICAgICAgICAgICA8dzp0Y1ByPgorICAgICAgICAgICAgICAgIDx3OnRjVyB3Onc9IjMwMDUiIHc6dHlwZT0iZHhhIi8+CisgICAgICAgICAgICAgICAgPHc6Z3JpZFNwYW4gdzp2YWw9IjIiLz4KKyAgICAgICAgICAgICAgICA8dzpjZWxsRGVsIHc6aWQ9IjEwIiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI2VDIxOjEyOjAwWiIvPgorICAgICAgICAgICAgICA8L3c6dGNQcj4KKyAgICAgICAgICAgIDwvdzp0Y1ByQ2hhbmdlPgorICAgICAgICAgIDwvdzp0Y1ByPgorI2VuZGlmCisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuY2VsbERlbCB8fAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgPT0gVy5jZWxsTWVyZ2UpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRjICYmCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoVy50Y1ByKS5FbGVtZW50cyhXLmNlbGxJbnMpLkFueSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFJlamVjdFJldmlzaW9uc0ZvclBhcnRUcmFuc2Zvcm0obikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZWplY3RSZXZpc2lvbnNGb3JTdHlsZXNEZWZpbml0aW9uUGFydChTdHlsZURlZmluaXRpb25zUGFydCBzdHlsZXNEZWZpbml0aW9uc1BhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4RG9jID0gc3R5bGVzRGVmaW5pdGlvbnNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgdmFyIG5ld1Jvb3QgPSBSZWplY3RSZXZpc2lvbnNGb3JTdHlsZXNUcmFuc2Zvcm0oeERvYy5Sb290KTsKKyAgICAgICAgICAgIHhEb2MuUm9vdC5SZXBsYWNlV2l0aChuZXdSb290KTsKKyAgICAgICAgICAgIHN0eWxlc0RlZmluaXRpb25zUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBSZWplY3RSZXZpc2lvbnNGb3JTdHlsZXNUcmFuc2Zvcm0oWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5wUHIgJiYKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50KFcucFByQ2hhbmdlKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld19wUHIgPSBlbGVtZW50LkVsZW1lbnQoVy5wUHJDaGFuZ2UpLkVsZW1lbnQoVy5wUHIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVqZWN0UmV2aXNpb25zRm9yU3R5bGVzVHJhbnNmb3JtKG5ld19wUHIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5yUHIgJiYKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50KFcuclByQ2hhbmdlKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld19yUHIgPSBlbGVtZW50LkVsZW1lbnQoVy5yUHJDaGFuZ2UpLkVsZW1lbnQoVy5yUHIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVqZWN0UmV2aXNpb25zRm9yU3R5bGVzVHJhbnNmb3JtKG5ld19yUHIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFJlamVjdFJldmlzaW9uc0ZvclN0eWxlc1RyYW5zZm9ybShuKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZXZlcnNlUmV2aXNpb25zKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jKQorICAgICAgICB7CisgICAgICAgICAgICBSZXZlcnNlUmV2aXNpb25zRm9yUGFydChkb2MuTWFpbkRvY3VtZW50UGFydCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFydCBpbiBkb2MuTWFpbkRvY3VtZW50UGFydC5IZWFkZXJQYXJ0cykKKyAgICAgICAgICAgICAgICBSZXZlcnNlUmV2aXNpb25zRm9yUGFydChwYXJ0KTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYXJ0IGluIGRvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3RlclBhcnRzKQorICAgICAgICAgICAgICAgIFJldmVyc2VSZXZpc2lvbnNGb3JQYXJ0KHBhcnQpOworICAgICAgICAgICAgaWYgKGRvYy5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgIFJldmVyc2VSZXZpc2lvbnNGb3JQYXJ0KGRvYy5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCk7CisgICAgICAgICAgICBpZiAoZG9jLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgIFJldmVyc2VSZXZpc2lvbnNGb3JQYXJ0KGRvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZXZlcnNlUmV2aXNpb25zRm9yUGFydChPcGVuWG1sUGFydCBwYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgeERvYyA9IHBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBSZXZlcnNlUmV2aXNpb25zSW5mbyBycmkgPSBuZXcgUmV2ZXJzZVJldmlzaW9uc0luZm8oKTsKKyAgICAgICAgICAgIHJyaS5Jbkluc2VydCA9IGZhbHNlOworICAgICAgICAgICAgdmFyIG5ld1Jvb3QgPSAoWEVsZW1lbnQpUmV2ZXJzZVJldmlzaW9uc1RyYW5zZm9ybSh4RG9jLlJvb3QsIHJyaSk7CisgICAgICAgICAgICBuZXdSb290ID0gKFhFbGVtZW50KVJlbW92ZVJzaWRUcmFuc2Zvcm0obmV3Um9vdCk7CisgICAgICAgICAgICB4RG9jLlJvb3QuUmVwbGFjZVdpdGgobmV3Um9vdCk7CisgICAgICAgICAgICBwYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFJlbW92ZVJzaWRUcmFuc2Zvcm0oWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5yc2lkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCkuV2hlcmUoYSA9PiBhLk5hbWUgIT0gVy5yc2lkICYmCisgICAgICAgICAgICAgICAgICAgICAgICBhLk5hbWUgIT0gVy5yc2lkRGVsICYmCisgICAgICAgICAgICAgICAgICAgICAgICBhLk5hbWUgIT0gVy5yc2lkUCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYS5OYW1lICE9IFcucnNpZFIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuTmFtZSAhPSBXLnJzaWRSRGVmYXVsdCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYS5OYW1lICE9IFcucnNpZFJQciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYS5OYW1lICE9IFcucnNpZFNlY3QgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuTmFtZSAhPSBXLnJzaWRUciksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBSZW1vdmVSc2lkVHJhbnNmb3JtKG4pKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBNZXJnZUFkamFjZW50VGFibGVzVHJhbnNmb3JtKFhOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5FbGVtZW50KFcudGJsKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwZWQgPSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoZSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLk5hbWUgIT0gVy50YmwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmlkaVZpc3VhbCA9IGUuRWxlbWVudHMoVy50YmxQcikuRWxlbWVudHMoVy5iaWRpVmlzdWFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiaWRpVmlzU3RyaW5nID0gYmlkaVZpc3VhbCA9PSBudWxsID8gIiIgOiAifGJpZGlWaXN1YWwiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAidGJsIiArIGJpZGlWaXNTdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDb250ZW50ID0gZ3JvdXBlZAorICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChnID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuS2V5ID09ICIiIHx8IGcuQ291bnQoKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iamVjdClnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb2xsZWQgPSBnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QodGJsID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBncmlkQ29scyA9IHRibAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnRibEdyaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuZ3JpZENvbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLl93KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoYSA9PiAoaW50KWEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJvbGx1cCgwLCAocywgaSkgPT4gcyArIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyaWRDb2xzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0TWFueShtID0+IG0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5EaXN0aW5jdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5PcmRlckJ5KHcgPT4gdykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VGFibGUgPSBuZXcgWEVsZW1lbnQoVy50YmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuRmlyc3QoKS5FbGVtZW50cyhXLnRibFByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudGJsR3JpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGxlZC5TZWxlY3QoKHIsIGkpID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gciAtIHJvbGxlZFtpIC0gMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLmdyaWRDb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuX3csIHYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5TZWxlY3QodGJsID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXhlZFdpZHRoc1RibCA9IEZpeFdpZHRocyh0YmwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1Jvd3MgPSBmaXhlZFdpZHRoc1RibC5FbGVtZW50cyhXLnRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QodHIgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld1JvdyA9IG5ldyBYRWxlbWVudChXLnRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIuRWxlbWVudHMoKS5XaGVyZShlID0+IGUuTmFtZSAhPSBXLnRjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyLkVsZW1lbnRzKFcudGMpLlNlbGVjdCh0YyA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludD8gdyA9IChpbnQ/KXRjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnRjUHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnRjVykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy5fdykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHcgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZWxsc1RvTGVmdCA9IHRjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5QYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcudGMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UYWtlV2hpbGUoYnRjID0+IGJ0YyAhPSB0Yyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoVG9MZWZ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbHNUb0xlZnQuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoVG9MZWZ0ID0gY2VsbHNUb0xlZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcudGNQcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcudGNXKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLl93KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHdpID0+IChpbnQpd2kpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TdW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm9sbGVkUGFpcnMgPSBuZXdbXSB7IG5ldworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmlkVmFsdWUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ29uY2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KChyLCBpKSA9PiBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmlkVmFsdWUgPSByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4ID0gaSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcm9sbGVkUGFpcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KHQgPT4gdC5HcmlkVmFsdWUgPj0gd2lkdGhUb0xlZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdyaWRzUmVxdWlyZWQgPSByb2xsZWRQYWlycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNraXAoc3RhcnQuSW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVGFrZVdoaWxlKHJwID0+IHJwLkdyaWRWYWx1ZSAtIHN0YXJ0LkdyaWRWYWx1ZSA8IHcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRjUHIgPSBuZXcgWEVsZW1lbnQoVy50Y1ByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjLkVsZW1lbnRzKFcudGNQcikuRWxlbWVudHMoKS5XaGVyZShlID0+IGUuTmFtZSAhPSBXLmdyaWRTcGFuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkc1JlcXVpcmVkICE9IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5ncmlkU3BhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcudmFsLCBncmlkc1JlcXVpcmVkKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9yZGVyZWRUY1ByID0gbmV3IFhFbGVtZW50KFcudGNQciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjUHIuRWxlbWVudHMoKS5PcmRlckJ5KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3JkZXJfdGNQci5Db250YWluc0tleShlLk5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3JkZXJfdGNQcltlLk5hbWVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5OTk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDZWxsID0gbmV3IFhFbGVtZW50KFcudGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkVGNQciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjLkVsZW1lbnRzKCkuV2hlcmUoZSA9PiBlLk5hbWUgIT0gVy50Y1ByKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdDZWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdSb3c7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3Um93czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdUYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gTWVyZ2VBZGphY2VudFRhYmxlc1RyYW5zZm9ybShuKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgUmV2ZXJzZVJldmlzaW9uc1RyYW5zZm9ybShYTm9kZSBub2RlLCBSZXZlcnNlUmV2aXNpb25zSW5mbyBycmkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBhcmVudCA9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLkFuY2VzdG9ycygpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShhID0+IGEuTmFtZSAhPSBXLnNkdENvbnRlbnQgJiYgYS5OYW1lICE9IFcuc2R0ICYmIGEuTmFtZSAhPSBXLnNtYXJ0VGFnKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKworICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgIC8vIERlbGV0ZWQgcnVuCisjaWYgZmFsc2UKKyAgICA8dzpwPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6dCB4bWw6c3BhY2U9InByZXNlcnZlIj5WaWRlbyA8L3c6dD4KKyAgICAgIDwvdzpyPgorICAgICAgPHc6ZGVsPgorICAgICAgICA8dzpyPgorICAgICAgICAgIDx3OmRlbFRleHQgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+cHJvdmlkZXMgPC93OmRlbFRleHQ+CisgICAgICAgIDwvdzpyPgorICAgICAgPC93OmRlbD4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnQ+YSBwb3dlcmZ1bCB3YXkgdG8gaGVscCB5b3UgcHJvdmUgeW91ciBwb2ludC48L3c6dD4KKyAgICAgIDwvdzpyPgorICAgIDwvdzpwPgorI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLmRlbCAmJgorICAgICAgICAgICAgICAgICAgICBwYXJlbnQuTmFtZSA9PSBXLnApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFJldmVyc2VSZXZpc2lvbnNUcmFuc2Zvcm0obiwgcnJpKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgIC8vIERlbGV0ZWQgcGFyYWdyYXBoIG1hcmsKKyNpZiBmYWxzZQorICAgIDx3OnA+CisgICAgICA8dzpwUHI+CisgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICA8dzpkZWwgdzppZD0iMCIgdzphdXRob3I9IkVyaWMgV2hpdGUiIHc6ZGF0ZT0iMjAxNy0wMy0yNFQyMTo1MjowMFoiLz4KKyAgICAgICAgPC93OnJQcj4KKyAgICAgIDwvdzpwUHI+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0PlZpZGVvIHByb3ZpZGVzIGEgcG93ZXJmdWwgd2F5IHRvIGhlbHAgeW91IHByb3ZlIHlvdXIgcG9pbnQuPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICA8L3c6cD4KKyAgICA8dzpwPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6dD5Zb3UgY2FuIGFsc28gdHlwZSBhIGtleXdvcmQgdG8gc2VhcmNoIG9ubGluZSBmb3IgdGhlIHZpZGVvIHRoYXQgYmVzdCBmaXRzIHlvdXIgZG9jdW1lbnQuPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICA8L3c6cD4KKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5kZWwgJiYKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50Lk5hbWUgPT0gVy5yUHIgJiYKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LlBhcmVudC5OYW1lID09IFcucFByKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLmlucyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gSW5zZXJ0ZWQgcGFyYWdyYXBoIG1hcmsKKyNpZiBmYWxzZQorICAgIDx3OnA+CisgICAgICA8dzpwUHI+CisgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICA8dzppbnMgdzppZD0iMCIgdzphdXRob3I9IkVyaWMgV2hpdGUiIHc6ZGF0ZT0iMjAxNy0wMy0yNFQyMTo1ODowMFoiLz4KKyAgICAgICAgPC93OnJQcj4KKyAgICAgIDwvdzpwUHI+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0IHhtbDpzcGFjZT0icHJlc2VydmUiPlZpZGVvIHByb3ZpZGVzIGEgcG93ZXJmdWwgd2F5IHRvIGhlbHAgeW91IHByb3ZlIHlvdXIgcG9pbnQuIDwvdzp0PgorICAgICAgPC93OnI+CisgICAgPC93OnA+CisgICAgPHc6cD4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICA8dzpsYW5nIHc6dmFsPSJlbi1VUyIvPgorICAgICAgICA8L3c6clByPgorICAgICAgICA8dzp0PldoZW4geW91IGNsaWNrIE9ubGluZSBWaWRlbywgeW91IGNhbiBwYXN0ZSBpbiB0aGUgZW1iZWQgY29kZSBmb3IgdGhlIHZpZGVvIHlvdSB3YW50IHRvIGFkZC48L3c6dD4KKyAgICAgIDwvdzpyPgorICAgIDwvdzpwPgorI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLmlucyAmJgorICAgICAgICAgICAgICAgICAgICBwYXJlbnQuTmFtZSA9PSBXLnJQciAmJgorICAgICAgICAgICAgICAgICAgICBwYXJlbnQuUGFyZW50Lk5hbWUgPT0gVy5wUHIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuZGVsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAvLyBJbnNlcnRlZCBydW4KKyNpZiBmYWxzZQorICAgIDx3OnA+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0IHhtbDpzcGFjZT0icHJlc2VydmUiPlZpZGVvIDwvdzp0PgorICAgICAgPC93OnI+CisgICAgICA8dzppbnM+CisgICAgICAgIDx3OnI+CisgICAgICAgICAgPHc6dCB4bWw6c3BhY2U9InByZXNlcnZlIj5wcm92aWRlcyA8L3c6dD4KKyAgICAgICAgPC93OnI+CisgICAgICA8L3c6aW5zPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6dD5hIHBvd2VyZnVsIHdheSB0byBoZWxwIHlvdSBwcm92ZSB5b3VyIHBvaW50Ljwvdzp0PgorICAgICAgPC93OnI+CisgICAgPC93OnA+CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuaW5zICYmCisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5OYW1lID09IFcucCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdScmkgPSBuZXcgUmV2ZXJzZVJldmlzaW9uc0luZm8oKSB7IEluSW5zZXJ0ID0gdHJ1ZSB9OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFJldmVyc2VSZXZpc2lvbnNUcmFuc2Zvcm0obiwgcnJpKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgIC8vIERlbGV0ZWQgdGFibGUgcm93CisjaWYgZmFsc2UKKyAgICA8dzp0Ymw+CisgICAgICA8dzp0cj4KKyAgICAgICAgPHc6dGM+CisgICAgICAgICAgPHc6cD4KKyAgICAgICAgICAgIDx3OnI+CisgICAgICAgICAgICAgIDx3OnQ+MTwvdzp0PgorICAgICAgICAgICAgPC93OnI+CisgICAgICAgICAgPC93OnA+CisgICAgICAgIDwvdzp0Yz4KKyAgICAgIDwvdzp0cj4KKyAgICAgIDx3OnRyPgorICAgICAgICA8dzp0clByPgorICAgICAgICAgIDx3OmRlbCB3OmlkPSIwIiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI0VDIyOjE1OjAwWiIvPgorICAgICAgICA8L3c6dHJQcj4KKyAgICAgICAgPHc6dGM+CisgICAgICAgICAgPHc6cD4KKyAgICAgICAgICAgIDx3OnBQcj4KKyAgICAgICAgICAgICAgPHc6clByPgorICAgICAgICAgICAgICAgIDx3OmRlbCB3OmlkPSIxIiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI0VDIyOjE1OjAwWiIvPgorICAgICAgICAgICAgICA8L3c6clByPgorICAgICAgICAgICAgPC93OnBQcj4KKyAgICAgICAgICAgIDx3OmRlbCB3OmlkPSIyIiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI0VDIyOjE1OjAwWiI+CisgICAgICAgICAgICAgIDx3OnI+CisgICAgICAgICAgICAgICAgPHc6ZGVsVGV4dD40PC93OmRlbFRleHQ+CisgICAgICAgICAgICAgIDwvdzpyPgorICAgICAgICAgICAgPC93OmRlbD4KKyAgICAgICAgICA8L3c6cD4KKyAgICAgICAgPC93OnRjPgorICAgICAgPC93OnRyPgorICAgICAgPHc6dHI+CisgICAgICAgIDx3OnRjPgorICAgICAgICAgIDx3OnA+CisgICAgICAgICAgICA8dzpyPgorICAgICAgICAgICAgICA8dzp0Pjc8L3c6dD4KKyAgICAgICAgICAgIDwvdzpyPgorICAgICAgICAgIDwvdzpwPgorICAgICAgICA8L3c6dGM+CisgICAgICA8L3c6dHI+CisgICAgPC93OnRibD4KKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5kZWwgJiYKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50Lk5hbWUgPT0gVy50clByKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLmlucyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gSW5zZXJ0ZWQgdGFibGUgcm93CisjaWYgZmFsc2UKKyAgICA8dzp0Ymw+CisgICAgICA8dzp0cj4KKyAgICAgICAgPHc6dGM+CisgICAgICAgICAgPHc6cD4KKyAgICAgICAgICAgIDx3OnI+CisgICAgICAgICAgICAgIDx3OnQ+MTwvdzp0PgorICAgICAgICAgICAgPC93OnI+CisgICAgICAgICAgPC93OnA+CisgICAgICAgIDwvdzp0Yz4KKyAgICAgIDwvdzp0cj4KKyAgICAgIDx3OnRyPgorICAgICAgICA8dzp0clByPgorICAgICAgICAgIDx3OmlucyB3OmlkPSIwIiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI0VDIyOjE2OjAwWiIvPgorICAgICAgICA8L3c6dHJQcj4KKyAgICAgICAgPHc6dGM+CisgICAgICAgICAgPHc6cD4KKyAgICAgICAgICAgIDx3OnBQcj4KKyAgICAgICAgICAgICAgPHc6clByPgorICAgICAgICAgICAgICAgIDx3OmlucyB3OmlkPSIxIiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI0VDIyOjE2OjAwWiIvPgorICAgICAgICAgICAgICA8L3c6clByPgorICAgICAgICAgICAgPC93OnBQcj4KKyAgICAgICAgICAgIDx3OmlucyB3OmlkPSIyIiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI0VDIyOjE2OjAwWiI+CisgICAgICAgICAgICAgIDx3OnI+CisgICAgICAgICAgICAgICAgPHc6dD4xYTwvdzp0PgorICAgICAgICAgICAgICA8L3c6cj4KKyAgICAgICAgICAgIDwvdzppbnM+CisgICAgICAgICAgPC93OnA+CisgICAgICAgIDwvdzp0Yz4KKyAgICAgIDwvdzp0cj4KKyAgICAgIDx3OnRyPgorICAgICAgICA8dzp0Yz4KKyAgICAgICAgICA8dzpwPgorICAgICAgICAgICAgPHc6cj4KKyAgICAgICAgICAgICAgPHc6dD40PC93OnQ+CisgICAgICAgICAgICA8L3c6cj4KKyAgICAgICAgICA8L3c6cD4KKyAgICAgICAgPC93OnRjPgorICAgICAgPC93OnRyPgorICAgIDwvdzp0Ymw+CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuaW5zICYmCisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5OYW1lID09IFcudHJQcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5kZWwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgIC8vIERlbGV0ZWQgbWF0aCBjb250cm9sIGNoYXJhY3RlcgorI2lmIGZhbHNlCisgICAgPHc6cCB3OnJzaWRSPSIwMDdGNEU0OCIgdzpyc2lkUkRlZmF1bHQ9IjAwQzk0MDNCIj4KKyAgICAgIDxtOm9NYXRoUGFyYT4KKyAgICAgICAgPG06b01hdGg+CisgICAgICAgICAgPG06cj4KKyAgICAgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICAgICAgPHc6ckZvbnRzIHc6YXNjaWk9IkNhbWJyaWEgTWF0aCIgdzpoQW5zaT0iQ2FtYnJpYSBNYXRoIi8+CisgICAgICAgICAgICA8L3c6clByPgorICAgICAgICAgICAgPG06dD5BPTwvbTp0PgorICAgICAgICAgIDwvbTpyPgorICAgICAgICAgIDxtOnI+CisgICAgICAgICAgICA8dzpkZWwgdzppZD0iMCIgdzphdXRob3I9IkVyaWMgV2hpdGUiIHc6ZGF0ZT0iMjAxNy0wMy0yNFQyMjo1MzowMFoiPgorICAgICAgICAgICAgICA8dzpyUHI+CisgICAgICAgICAgICAgICAgPHc6ckZvbnRzIHc6YXNjaWk9IkNhbWJyaWEgTWF0aCIgdzpoQW5zaT0iQ2FtYnJpYSBNYXRoIi8+CisgICAgICAgICAgICAgIDwvdzpyUHI+CisgICAgICAgICAgICAgIDxtOnQ+MjwvbTp0PgorICAgICAgICAgICAgPC93OmRlbD4KKyAgICAgICAgICA8L206cj4KKyAgICAgICAgICA8bTpyPgorICAgICAgICAgICAgPHc6clByPgorICAgICAgICAgICAgICA8dzpyRm9udHMgdzphc2NpaT0iQ2FtYnJpYSBNYXRoIiB3OmhBbnNpPSJDYW1icmlhIE1hdGgiLz4KKyAgICAgICAgICAgIDwvdzpyUHI+CisgICAgICAgICAgICA8bTp0Ps+APC9tOnQ+CisgICAgICAgICAgPC9tOnI+CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuZGVsICYmCisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5OYW1lID09IE0ucikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5pbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gUmV2ZXJzZVJldmlzaW9uc1RyYW5zZm9ybShuLCBycmkpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gSW5zZXJ0ZWQgbWF0aCBjb250cm9sIGNoYXJhY3RlcgorI2lmIGZhbHNlCisgICAgPHc6cCB3OnJzaWRSPSIwMDdGNEU0OCIgdzpyc2lkUkRlZmF1bHQ9IjAwQzk0MDNCIj4KKyAgICAgIDxtOm9NYXRoUGFyYT4KKyAgICAgICAgPG06b01hdGg+CisgICAgICAgICAgPG06cj4KKyAgICAgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICAgICAgPHc6ckZvbnRzIHc6YXNjaWk9IkNhbWJyaWEgTWF0aCIgdzpoQW5zaT0iQ2FtYnJpYSBNYXRoIi8+CisgICAgICAgICAgICA8L3c6clByPgorICAgICAgICAgICAgPG06dD5BPTwvbTp0PgorICAgICAgICAgIDwvbTpyPgorICAgICAgICAgIDxtOnI+CisgICAgICAgICAgICA8dzppbnMgdzppZD0iMCIgdzphdXRob3I9IkVyaWMgV2hpdGUiIHc6ZGF0ZT0iMjAxNy0wMy0yNFQyMjo1NDowMFoiPgorICAgICAgICAgICAgICA8dzpyUHI+CisgICAgICAgICAgICAgICAgPHc6ckZvbnRzIHc6YXNjaWk9IkNhbWJyaWEgTWF0aCIgdzpoQW5zaT0iQ2FtYnJpYSBNYXRoIi8+CisgICAgICAgICAgICAgIDwvdzpyUHI+CisgICAgICAgICAgICAgIDxtOnQ+MjwvbTp0PgorICAgICAgICAgICAgPC93Omlucz4KKyAgICAgICAgICA8L206cj4KKyAgICAgICAgICA8bTpyPgorICAgICAgICAgICAgPHc6clByPgorICAgICAgICAgICAgICA8dzpyRm9udHMgdzphc2NpaT0iQ2FtYnJpYSBNYXRoIiB3OmhBbnNpPSJDYW1icmlhIE1hdGgiLz4KKyAgICAgICAgICAgIDwvdzpyUHI+CisgICAgICAgICAgICA8bTp0Ps+APC9tOnQ+CisgICAgICAgICAgPC9tOnI+CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuaW5zICYmCisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5OYW1lID09IE0ucikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gUmV2ZXJzZVJldmlzaW9uc1RyYW5zZm9ybShuLCBycmkpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gbW92ZUZyb20gLyBtb3ZlVG8KKyNpZiBmYWxzZQorICAgIDx3OnA+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0PlZpZGVvIHByb3ZpZGVzIGEgcG93ZXJmdWwgd2F5Ljwvdzp0PgorICAgICAgPC93OnI+CisgICAgPC93OnA+CisgICAgPHc6cD4KKyAgICAgIDx3OnBQcj4KKyAgICAgICAgPHc6clByPgorICAgICAgICAgIDx3Om1vdmVGcm9tIHc6aWQ9IjAiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjRUMjM6MTg6MDBaIi8+CisgICAgICAgIDwvdzpyUHI+CisgICAgICA8L3c6cFByPgorICAgICAgPHc6bW92ZUZyb21SYW5nZVN0YXJ0IHc6aWQ9IjEiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjRUMjM6MTg6MDBaIiB3Om5hbWU9Im1vdmU0NzgxNjA4MDgiLz4KKyAgICAgIDx3Om1vdmVGcm9tIHc6aWQ9IjIiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjRUMjM6MTg6MDBaIj4KKyAgICAgICAgPHc6cj4KKyAgICAgICAgICA8dzp0PldoZW4geW91IGNsaWNrIE9ubGluZSBWaWRlby48L3c6dD4KKyAgICAgICAgPC93OnI+CisgICAgICA8L3c6bW92ZUZyb20+CisgICAgPC93OnA+CisgICAgPHc6bW92ZUZyb21SYW5nZUVuZCB3OmlkPSIxIi8+CisgICAgPHc6cD4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICA8dzpsYW5nIHc6dmFsPSJlbi1VUyIvPgorICAgICAgICA8L3c6clByPgorICAgICAgICA8dzp0PllvdSBjYW4gYWxzbyB0eXBlIGEga2V5d29yZC48L3c6dD4KKyAgICAgIDwvdzpyPgorICAgIDwvdzpwPgorICAgIDx3OnA+CisgICAgICA8dzpwUHI+CisgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICA8dzptb3ZlVG8gdzppZD0iMyIgdzphdXRob3I9IkVyaWMgV2hpdGUiIHc6ZGF0ZT0iMjAxNy0wMy0yNFQyMzoxODowMFoiLz4KKyAgICAgICAgPC93OnJQcj4KKyAgICAgIDwvdzpwUHI+CisgICAgICA8dzptb3ZlVG9SYW5nZVN0YXJ0IHc6aWQ9IjUiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjRUMjM6MTg6MDBaIiB3Om5hbWU9Im1vdmU0NzgxNjA4MDgiLz4KKyAgICAgIDx3Om1vdmVUbyB3OmlkPSI2IiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI0VDIzOjE4OjAwWiI+CisgICAgICAgIDx3OnI+CisgICAgICAgICAgPHc6dD5XaGVuIHlvdSBjbGljayBPbmxpbmUgVmlkZW8uPC93OnQ+CisgICAgICAgIDwvdzpyPgorICAgICAgPC93Om1vdmVUbz4KKyAgICA8L3c6cD4KKyAgICA8dzptb3ZlVG9SYW5nZUVuZCB3OmlkPSI1Ii8+CisgICAgPHc6cD4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnQ+TWFrZSB5b3VyIGRvY3VtZW50IGxvb2sgcHJvZmVzc2lvbmFsbHkgcHJvZHVjZWQuPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICA8L3c6cD4KKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5tb3ZlRnJvbSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5tb3ZlVG8sCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBSZXZlcnNlUmV2aXNpb25zVHJhbnNmb3JtKG4sIHJyaSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLm1vdmVGcm9tUmFuZ2VTdGFydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5tb3ZlVG9SYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gUmV2ZXJzZVJldmlzaW9uc1RyYW5zZm9ybShuLCBycmkpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5tb3ZlRnJvbVJhbmdlRW5kKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLm1vdmVUb1JhbmdlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gUmV2ZXJzZVJldmlzaW9uc1RyYW5zZm9ybShuLCBycmkpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5tb3ZlVG8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcubW92ZUZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBSZXZlcnNlUmV2aXNpb25zVHJhbnNmb3JtKG4sIHJyaSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLm1vdmVUb1JhbmdlU3RhcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcubW92ZUZyb21SYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gUmV2ZXJzZVJldmlzaW9uc1RyYW5zZm9ybShuLCBycmkpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5tb3ZlVG9SYW5nZUVuZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5tb3ZlRnJvbVJhbmdlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gUmV2ZXJzZVJldmlzaW9uc1RyYW5zZm9ybShuLCBycmkpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gRGVsZXRlZCBjb250ZW50IGNvbnRyb2wKKyNpZiBmYWxzZQorICAgIDx3OnA+CisgICAgICA8dzpjdXN0b21YbWxEZWxSYW5nZVN0YXJ0IHc6aWQ9IjEiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjVUMjI6MTA6MDBaIi8+CisgICAgICA8dzpzZHQ+CisgICAgICAgIDx3OnNkdFByPgorICAgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICAgIDx3Omxhbmcgdzp2YWw9ImVuLVVTIi8+CisgICAgICAgICAgPC93OnJQcj4KKyAgICAgICAgICA8dzppZCB3OnZhbD0iOTkwMjkyMzczIi8+CisgICAgICAgICAgPHc6cGxhY2Vob2xkZXI+CisgICAgICAgICAgICA8dzpkb2NQYXJ0IHc6dmFsPSJEZWZhdWx0UGxhY2Vob2xkZXJfLTE4NTQwMTM0NDAiLz4KKyAgICAgICAgICA8L3c6cGxhY2Vob2xkZXI+CisgICAgICAgICAgPHc6dGV4dC8+CisgICAgICAgIDwvdzpzZHRQcj4KKyAgICAgICAgPHc6c2R0Q29udGVudD4KKyAgICAgICAgICA8dzpjdXN0b21YbWxEZWxSYW5nZUVuZCB3OmlkPSIxIi8+CisgICAgICAgICAgPHc6cj4KKyAgICAgICAgICAgIDx3OnQ+VmlkZW88L3c6dD4KKyAgICAgICAgICA8L3c6cj4KKyAgICAgICAgICA8dzpjdXN0b21YbWxEZWxSYW5nZVN0YXJ0IHc6aWQ9IjIiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjVUMjI6MTA6MDBaIi8+CisgICAgICAgIDwvdzpzZHRDb250ZW50PgorICAgICAgPC93OnNkdD4KKyAgICAgIDx3OmN1c3RvbVhtbERlbFJhbmdlRW5kIHc6aWQ9IjIiLz4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnQgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+IHByb3ZpZGVzIGEgcG93ZXJmdWwgd2F5IHRvIGhlbHAgeW91IHByb3ZlIHlvdXIgcG9pbnQuPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICA8L3c6cD4KKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5jdXN0b21YbWxEZWxSYW5nZVN0YXJ0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLmN1c3RvbVhtbEluc1JhbmdlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBSZXZlcnNlUmV2aXNpb25zVHJhbnNmb3JtKG4sIHJyaSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLmN1c3RvbVhtbERlbFJhbmdlRW5kKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLmN1c3RvbVhtbEluc1JhbmdlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gUmV2ZXJzZVJldmlzaW9uc1RyYW5zZm9ybShuLCBycmkpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gSW5zZXJ0ZWQgY29udGVudCBjb250cm9sCisjaWYgZmFsc2UKKyAgICA8dzpwPgorICAgICAgPHc6Y3VzdG9tWG1sSW5zUmFuZ2VTdGFydCB3OmlkPSIwIiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI1VDIyOjEwOjAwWiIvPgorICAgICAgPHc6c2R0PgorICAgICAgICA8dzpzZHRQcj4KKyAgICAgICAgICA8dzppZCB3OnZhbD0iLTQ3MzgzOTk2NiIvPgorICAgICAgICAgIDx3OnBsYWNlaG9sZGVyPgorICAgICAgICAgICAgPHc6ZG9jUGFydCB3OnZhbD0iRGVmYXVsdFBsYWNlaG9sZGVyXy0xODU0MDEzNDQwIi8+CisgICAgICAgICAgPC93OnBsYWNlaG9sZGVyPgorICAgICAgICAgIDx3OnRleHQvPgorICAgICAgICA8L3c6c2R0UHI+CisgICAgICAgIDx3OnNkdENvbnRlbnQ+CisgICAgICAgICAgPHc6Y3VzdG9tWG1sSW5zUmFuZ2VFbmQgdzppZD0iMCIvPgorICAgICAgICAgIDx3OnI+CisgICAgICAgICAgICA8dzp0PlZpZGVvPC93OnQ+CisgICAgICAgICAgPC93OnI+CisgICAgICAgICAgPHc6Y3VzdG9tWG1sSW5zUmFuZ2VTdGFydCB3OmlkPSIxIiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI1VDIyOjEwOjAwWiIvPgorICAgICAgICA8L3c6c2R0Q29udGVudD4KKyAgICAgIDwvdzpzZHQ+CisgICAgICA8dzpjdXN0b21YbWxJbnNSYW5nZUVuZCB3OmlkPSIxIi8+CisgICAgICA8dzpyPgorICAgICAgICA8dzpyUHI+CisgICAgICAgICAgPHc6bGFuZyB3OnZhbD0iZW4tVVMiLz4KKyAgICAgICAgPC93OnJQcj4KKyAgICAgICAgPHc6dCB4bWw6c3BhY2U9InByZXNlcnZlIj4gcHJvdmlkZXMgYSBwb3dlcmZ1bCB3YXkgdG8gaGVscCB5b3UgcHJvdmUgeW91ciBwb2ludC48L3c6dD4KKyAgICAgIDwvdzpyPgorICAgIDwvdzpwPgorI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLmN1c3RvbVhtbEluc1JhbmdlU3RhcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuY3VzdG9tWG1sRGVsUmFuZ2VTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFJldmVyc2VSZXZpc2lvbnNUcmFuc2Zvcm0obiwgcnJpKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuY3VzdG9tWG1sSW5zUmFuZ2VFbmQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuY3VzdG9tWG1sRGVsUmFuZ2VFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBSZXZlcnNlUmV2aXNpb25zVHJhbnNmb3JtKG4sIHJyaSkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAvLyBNb3ZlZCBjb250ZW50IGNvbnRyb2wKKyNpZiBmYWxzZQorICAgIDx3OnA+CisgICAgICA8dzpyPgorICAgICAgICA8dzp0PlZpZGVvIHByb3ZpZGVzIGEgcG93ZXJmdWwgd2F5Ljwvdzp0PgorICAgICAgPC93OnI+CisgICAgPC93OnA+CisgICAgPHc6Y3VzdG9tWG1sTW92ZUZyb21SYW5nZVN0YXJ0IHc6aWQ9IjAiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjVUMjI6MjE6MDBaIi8+CisgICAgPHc6bW92ZUZyb21SYW5nZVN0YXJ0IHc6aWQ9IjEiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjVUMjI6MjE6MDBaIiB3Om5hbWU9Im1vdmU0NzgyNDM4MjQiIHc6ZGlzcGxhY2VkQnlDdXN0b21YbWw9Im5leHQiLz4KKyAgICA8dzpzZHQ+CisgICAgICA8dzpzZHRQcj4KKyAgICAgICAgPHc6aWQgdzp2YWw9Ii0yMDYwMDA3MzI4Ii8+CisgICAgICAgIDx3OnBsYWNlaG9sZGVyPgorICAgICAgICAgIDx3OmRvY1BhcnQgdzp2YWw9IkRlZmF1bHRQbGFjZWhvbGRlcl8tMTg1NDAxMzQ0MCIvPgorICAgICAgICA8L3c6cGxhY2Vob2xkZXI+CisgICAgICA8L3c6c2R0UHI+CisgICAgICA8dzpzZHRDb250ZW50PgorICAgICAgICA8dzpjdXN0b21YbWxNb3ZlRnJvbVJhbmdlRW5kIHc6aWQ9IjAiLz4KKyAgICAgICAgPHc6cCB3OnJzaWRSPSIwMEQzMDZGRCIgdzpyc2lkRGVsPSIwMDEwMzdFNiIgdzpyc2lkUkRlZmF1bHQ9IjAwRDMwNkZEIj4KKyAgICAgICAgICA8dzpwUHI+CisgICAgICAgICAgICA8dzpyUHI+CisgICAgICAgICAgICAgIDx3Om1vdmVGcm9tIHc6aWQ9IjIiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjVUMjI6MjE6MDBaIi8+CisgICAgICAgICAgICAgIDx3Omxhbmcgdzp2YWw9ImVuLVVTIi8+CisgICAgICAgICAgICA8L3c6clByPgorICAgICAgICAgIDwvdzpwUHI+CisgICAgICAgICAgPHc6bW92ZUZyb20gdzppZD0iMyIgdzphdXRob3I9IkVyaWMgV2hpdGUiIHc6ZGF0ZT0iMjAxNy0wMy0yNVQyMjoyMTowMFoiPgorICAgICAgICAgICAgPHc6ciB3OnJzaWREZWw9IjAwMTAzN0U2Ij4KKyAgICAgICAgICAgICAgPHc6clByPgorICAgICAgICAgICAgICAgIDx3Omxhbmcgdzp2YWw9ImVuLVVTIi8+CisgICAgICAgICAgICAgIDwvdzpyUHI+CisgICAgICAgICAgICAgIDx3OnQ+V2hlbiB5b3UgY2xpY2sgT25saW5lIFZpZGVvLjwvdzp0PgorICAgICAgICAgICAgPC93OnI+CisgICAgICAgICAgPC93Om1vdmVGcm9tPgorICAgICAgICA8L3c6cD4KKyAgICAgICAgPHc6Y3VzdG9tWG1sTW92ZUZyb21SYW5nZVN0YXJ0IHc6aWQ9IjQiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjVUMjI6MjE6MDBaIi8+CisgICAgICA8L3c6c2R0Q29udGVudD4KKyAgICA8L3c6c2R0PgorICAgIDx3OmN1c3RvbVhtbE1vdmVGcm9tUmFuZ2VFbmQgdzppZD0iNCIvPgorICAgIDx3Om1vdmVGcm9tUmFuZ2VFbmQgdzppZD0iMSIvPgorICAgIDx3OnA+CisgICAgICA8dzpyPgorICAgICAgICA8dzpyUHI+CisgICAgICAgICAgPHc6bGFuZyB3OnZhbD0iZW4tVVMiLz4KKyAgICAgICAgPC93OnJQcj4KKyAgICAgICAgPHc6dD5Zb3UgY2FuIGFsc28gdHlwZSBhIGtleXdvcmQuPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICA8L3c6cD4KKyAgICA8dzpwPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6clByPgorICAgICAgICAgIDx3Omxhbmcgdzp2YWw9ImVuLVVTIi8+CisgICAgICAgIDwvdzpyUHI+CisgICAgICAgIDx3OnQ+VG8gbWFrZSB5b3VyIGRvY3VtZW50IGxvb2suPC93OnQ+CisgICAgICA8L3c6cj4KKyAgICA8L3c6cD4KKyAgICA8dzpjdXN0b21YbWxNb3ZlVG9SYW5nZVN0YXJ0IHc6aWQ9IjUiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjVUMjI6MjE6MDBaIi8+CisgICAgPHc6bW92ZVRvUmFuZ2VTdGFydCB3OmlkPSI2IiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI1VDIyOjIxOjAwWiIgdzpuYW1lPSJtb3ZlNDc4MjQzODI0IiB3OmRpc3BsYWNlZEJ5Q3VzdG9tWG1sPSJuZXh0Ii8+CisgICAgPHc6c2R0PgorICAgICAgPHc6c2R0UHI+CisgICAgICAgIDx3OmlkIHc6dmFsPSItNDgzNjIyNjQ5Ii8+CisgICAgICAgIDx3OnBsYWNlaG9sZGVyPgorICAgICAgICAgIDx3OmRvY1BhcnQgdzp2YWw9IkRDNDZGMTk3NDkxRDRFQzhCNzlEQjRDRTJEMjJFMjIyIi8+CisgICAgICAgIDwvdzpwbGFjZWhvbGRlcj4KKyAgICAgIDwvdzpzZHRQcj4KKyAgICAgIDx3OnNkdENvbnRlbnQ+CisgICAgICAgIDx3OmN1c3RvbVhtbE1vdmVUb1JhbmdlRW5kIHc6aWQ9IjUiLz4KKyAgICAgICAgPHc6cD4KKyAgICAgICAgICA8dzpwUHI+CisgICAgICAgICAgICA8dzpyUHI+CisgICAgICAgICAgICAgIDx3Om1vdmVUbyB3OmlkPSI4IiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI1VDIyOjIxOjAwWiIvPgorICAgICAgICAgICAgPC93OnJQcj4KKyAgICAgICAgICA8L3c6cFByPgorICAgICAgICAgIDx3Om1vdmVUbyB3OmlkPSI5IiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI1VDIyOjIxOjAwWiI+CisgICAgICAgICAgICA8dzpyPgorICAgICAgICAgICAgICA8dzp0PldoZW4geW91IGNsaWNrIE9ubGluZSBWaWRlby48L3c6dD4KKyAgICAgICAgICAgIDwvdzpyPgorICAgICAgICAgIDwvdzptb3ZlVG8+CisgICAgICAgIDwvdzpwPgorICAgICAgICA8dzpjdXN0b21YbWxNb3ZlVG9SYW5nZVN0YXJ0IHc6aWQ9IjEwIiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI1VDIyOjIxOjAwWiIvPgorICAgICAgPC93OnNkdENvbnRlbnQ+CisgICAgPC93OnNkdD4KKyAgICA8dzpjdXN0b21YbWxNb3ZlVG9SYW5nZUVuZCB3OmlkPSIxMCIvPgorICAgIDx3Om1vdmVUb1JhbmdlRW5kIHc6aWQ9IjYiLz4KKyAgICA8dzpwPgorICAgICAgPHc6aW5zIHc6aWQ9IjExIiB3OmF1dGhvcj0iRXJpYyBXaGl0ZSIgdzpkYXRlPSIyMDE3LTAzLTI1VDIyOjIxOjAwWiI+CisgICAgICAgIDx3OnI+CisgICAgICAgICAgPHc6dCB4bWw6c3BhY2U9InByZXNlcnZlIj4gPC93OnQ+CisgICAgICAgIDwvdzpyPgorICAgICAgPC93Omlucz4KKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnQ+Rm9yIGV4YW1wbGUsIHlvdSBjYW4gYWRkLjwvdzp0PgorICAgICAgPC93OnI+CisgICAgPC93OnA+CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuY3VzdG9tWG1sTW92ZUZyb21SYW5nZVN0YXJ0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLmN1c3RvbVhtbE1vdmVUb1JhbmdlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBSZXZlcnNlUmV2aXNpb25zVHJhbnNmb3JtKG4sIHJyaSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLmN1c3RvbVhtbE1vdmVGcm9tUmFuZ2VFbmQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuY3VzdG9tWG1sTW92ZVRvUmFuZ2VFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBSZXZlcnNlUmV2aXNpb25zVHJhbnNmb3JtKG4sIHJyaSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLmN1c3RvbVhtbE1vdmVUb1JhbmdlU3RhcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuY3VzdG9tWG1sTW92ZUZyb21SYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gUmV2ZXJzZVJldmlzaW9uc1RyYW5zZm9ybShuLCBycmkpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5jdXN0b21YbWxNb3ZlVG9SYW5nZUVuZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5jdXN0b21YbWxNb3ZlRnJvbVJhbmdlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gUmV2ZXJzZVJldmlzaW9uc1RyYW5zZm9ybShuLCBycmkpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gRGVsZXRlZCBmaWVsZCBjb2RlCisjaWYgZmFsc2UKKyAgICA8dzpwPgorICAgICAgPHc6cFByPgorICAgICAgICA8dzpyUHI+CisgICAgICAgICAgPHc6ZGVsIHc6aWQ9IjAiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjVUMjI6NDM6MDBaIi8+CisgICAgICAgIDwvdzpyUHI+CisgICAgICA8L3c6cFByPgorICAgICAgPHc6ZGVsIHc6aWQ9IjEiIHc6YXV0aG9yPSJFcmljIFdoaXRlIiB3OmRhdGU9IjIwMTctMDMtMjVUMjI6NDM6MDBaIj4KKyAgICAgICAgPHc6cj4KKyAgICAgICAgICA8dzpmbGRDaGFyIHc6ZmxkQ2hhclR5cGU9ImJlZ2luIi8+CisgICAgICAgIDwvdzpyPgorICAgICAgICA8dzpyPgorICAgICAgICAgIDx3OmRlbEluc3RyVGV4dCB4bWw6c3BhY2U9InByZXNlcnZlIj4gRDwvdzpkZWxJbnN0clRleHQ+CisgICAgICAgIDwvdzpyPgorICAgICAgICA8dzpyPgorICAgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICAgIDx3OmNvbG9yIHc6dmFsPSJGRjAwMDAiLz4KKyAgICAgICAgICA8L3c6clByPgorICAgICAgICAgIDx3OmRlbEluc3RyVGV4dD5BPC93OmRlbEluc3RyVGV4dD4KKyAgICAgICAgPC93OnI+CisgICAgICAgIDx3OnI+CisgICAgICAgICAgPHc6ZGVsSW5zdHJUZXh0IHhtbDpzcGFjZT0icHJlc2VydmUiPlRFIDwvdzpkZWxJbnN0clRleHQ+CisgICAgICAgIDwvdzpyPgorICAgICAgICA8dzpyPgorICAgICAgICAgIDx3OmZsZENoYXIgdzpmbGRDaGFyVHlwZT0ic2VwYXJhdGUiLz4KKyAgICAgICAgPC93OnI+CisgICAgICAgIDx3OnI+CisgICAgICAgICAgPHc6ZGVsVGV4dD4yNS8wMy8yMDE3PC93OmRlbFRleHQ+CisgICAgICAgIDwvdzpyPgorICAgICAgICA8dzpyPgorICAgICAgICAgIDx3OmZsZENoYXIgdzpmbGRDaGFyVHlwZT0iZW5kIi8+CisgICAgICAgIDwvdzpyPgorICAgICAgPC93OmRlbD4KKyAgICA8L3c6cD4KKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5kZWxJbnN0clRleHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuaW5zdHJUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksIC8vIHB1bGxzIGluIHhtbDpzcGFjZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBSZXZlcnNlUmV2aXNpb25zVHJhbnNmb3JtKG4sIHJyaSkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgaW5zZXJ0ZWQgaW5zdHJUZXh0IGVsZW1lbnQgdG8gdzpkZWxJbnN0clRleHQKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuaW5zdHJUZXh0ICYmIHJyaS5Jbkluc2VydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5kZWxJbnN0clRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBSZXZlcnNlUmV2aXNpb25zVHJhbnNmb3JtKG4sIHJyaSkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgaW5zZXJ0ZWQgdGV4dCBlbGVtZW50IHRvIHc6ZGVsVGV4dAorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy50ICYmIHJyaS5Jbkluc2VydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5kZWxUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gUmV2ZXJzZVJldmlzaW9uc1RyYW5zZm9ybShuLCBycmkpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIHc6ZGVsVGV4dCB0byB3OnQKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuZGVsVGV4dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy50LAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksIC8vIHB1bGxzIGluIHhtbDpzcGFjZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBSZXZlcnNlUmV2aXNpb25zVHJhbnNmb3JtKG4sIHJyaSkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAvLyBJZGVudGl0eSB0cmFuc2Zvcm0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBSZXZlcnNlUmV2aXNpb25zVHJhbnNmb3JtKG4sIHJyaSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBXbWxEb2N1bWVudCBBY2NlcHRSZXZpc2lvbnMoV21sRG9jdW1lbnQgZG9jdW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgc3RyZWFtRG9jID0gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudChkb2N1bWVudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jID0gc3RyZWFtRG9jLkdldFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFjY2VwdFJldmlzaW9ucyhkb2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtRG9jLkdldE1vZGlmaWVkV21sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBY2NlcHRSZXZpc2lvbnMoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFjY2VwdFJldmlzaW9uc0ZvclBhcnQoZG9jLk1haW5Eb2N1bWVudFBhcnQpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gZG9jLk1haW5Eb2N1bWVudFBhcnQuSGVhZGVyUGFydHMpCisgICAgICAgICAgICAgICAgQWNjZXB0UmV2aXNpb25zRm9yUGFydChwYXJ0KTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYXJ0IGluIGRvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3RlclBhcnRzKQorICAgICAgICAgICAgICAgIEFjY2VwdFJldmlzaW9uc0ZvclBhcnQocGFydCk7CisgICAgICAgICAgICBpZiAoZG9jLk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgQWNjZXB0UmV2aXNpb25zRm9yUGFydChkb2MuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQpOworICAgICAgICAgICAgaWYgKGRvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBBY2NlcHRSZXZpc2lvbnNGb3JQYXJ0KGRvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQpOworICAgICAgICAgICAgaWYgKGRvYy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgQWNjZXB0UmV2aXNpb25zRm9yU3R5bGVzRGVmaW5pdGlvblBhcnQoZG9jLk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBY2NlcHRSZXZpc2lvbnNGb3JTdHlsZXNEZWZpbml0aW9uUGFydChTdHlsZURlZmluaXRpb25zUGFydCBzdHlsZXNEZWZpbml0aW9uc1BhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4RG9jID0gc3R5bGVzRGVmaW5pdGlvbnNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgdmFyIG5ld1Jvb3QgPSBBY2NlcHRSZXZpc2lvbnNGb3JTdHlsZXNUcmFuc2Zvcm0oeERvYy5Sb290KTsKKyAgICAgICAgICAgIHhEb2MuUm9vdC5SZXBsYWNlV2l0aChuZXdSb290KTsKKyAgICAgICAgICAgIHN0eWxlc0RlZmluaXRpb25zUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBBY2NlcHRSZXZpc2lvbnNGb3JTdHlsZXNUcmFuc2Zvcm0oWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5wUHJDaGFuZ2UgfHwgZWxlbWVudC5OYW1lID09IFcuclByQ2hhbmdlKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBBY2NlcHRSZXZpc2lvbnNGb3JTdHlsZXNUcmFuc2Zvcm0obikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEFjY2VwdFJldmlzaW9uc0ZvclBhcnQoT3BlblhtbFBhcnQgcGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gcGFydC5HZXRYRG9jdW1lbnQoKS5Sb290OworICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50ID0gKFhFbGVtZW50KVJlbW92ZVJzaWRUcmFuc2Zvcm0oZG9jdW1lbnRFbGVtZW50KTsKKyAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudCA9IChYRWxlbWVudClGaXhVcERlbGV0ZWRPckluc2VydGVkRmllbGRDb2Rlc1RyYW5zZm9ybShkb2N1bWVudEVsZW1lbnQpOworICAgICAgICAgICAgdmFyIGNvbnRhaW5zTW92ZUZyb21Nb3ZlVG8gPSBkb2N1bWVudEVsZW1lbnQuRGVzY2VuZGFudHMoVy5tb3ZlRnJvbSkuQW55KCk7CisgICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQgPSAoWEVsZW1lbnQpQWNjZXB0TW92ZUZyb21Nb3ZlVG9UcmFuc2Zvcm0oZG9jdW1lbnRFbGVtZW50KTsKKyAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudCA9IEFjY2VwdE1vdmVGcm9tUmFuZ2VzKGRvY3VtZW50RWxlbWVudCk7CisgICAgICAgICAgICAvLyBBY2NlcHRQYXJhZ3JhcGhFbmRUYWdzSW5Nb3ZlRnJvbVRyYW5zZm9ybSBuZWVkcyByZXdyaXR0ZW4gc2ltaWxhciB0byBBY2NlcHREZWxldGVkQW5kTW92ZUZyb21QYXJhZ3JhcGhNYXJrcworICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50ID0gKFhFbGVtZW50KUFjY2VwdFBhcmFncmFwaEVuZFRhZ3NJbk1vdmVGcm9tVHJhbnNmb3JtKGRvY3VtZW50RWxlbWVudCk7CisgICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQgPSBBY2NlcHREZWxldGVkQW5kTW92ZWRGcm9tQ29udGVudENvbnRyb2xzKGRvY3VtZW50RWxlbWVudCk7CisgICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQgPSBBY2NlcHREZWxldGVkQW5kTW92ZUZyb21QYXJhZ3JhcGhNYXJrcyhkb2N1bWVudEVsZW1lbnQpOworICAgICAgICAgICAgaWYgKGNvbnRhaW5zTW92ZUZyb21Nb3ZlVG8pCisgICAgICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50ID0gKFhFbGVtZW50KVJlbW92ZVJvd3NMZWZ0RW1wdHlCeU1vdmVGcm9tKGRvY3VtZW50RWxlbWVudCk7CisgICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQgPSAoWEVsZW1lbnQpQWNjZXB0QWxsT3RoZXJSZXZpc2lvbnNUcmFuc2Zvcm0oZG9jdW1lbnRFbGVtZW50KTsKKyAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudCA9IChYRWxlbWVudClBY2NlcHREZWxldGVkQ2VsbHNUcmFuc2Zvcm0oZG9jdW1lbnRFbGVtZW50KTsKKyAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudCA9IChYRWxlbWVudClNZXJnZUFkamFjZW50VGFibGVzVHJhbnNmb3JtKGRvY3VtZW50RWxlbWVudCk7CisgICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQgPSAoWEVsZW1lbnQpQWRkRW1wdHlQYXJhZ3JhcGhUb0FueUVtcHR5Q2VsbHMoZG9jdW1lbnRFbGVtZW50KTsKKyAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudC5EZXNjZW5kYW50cygpLkF0dHJpYnV0ZXMoKS5XaGVyZShhID0+IGEuTmFtZSA9PSBQVC5VbmlxdWVJZCB8fCBhLk5hbWUgPT0gUFQuUnVuSWRzKS5SZW1vdmUoKTsKKyAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudC5EZXNjZW5kYW50cyhXLm51bVByKS5XaGVyZShucCA9PiAhbnAuSGFzRWxlbWVudHMpLlJlbW92ZSgpOworICAgICAgICAgICAgWERvY3VtZW50IG5ld1hEb2MgPSBuZXcgWERvY3VtZW50KGRvY3VtZW50RWxlbWVudCk7CisgICAgICAgICAgICBwYXJ0LlB1dFhEb2N1bWVudChuZXdYRG9jKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGUgdGhhdCBBY2NlcHRSZXZpc2lvbnNGb3JFbGVtZW50IGlzIGFuIGluY29tcGxldGUgaW1wbGVtZW50YXRpb24uICBJdCBpcyBub3QgcG9zc2libGUgdG8gYWNjZXB0IGFsbCB2YXJpZXRpZXMgb2YgcmV2aXNpb25zCisgICAgICAgIC8vIGZvciBhIHNpbmdsZSBwYXJhZ3JhcGguICBUaGUgcGFyYWdyYXBoIG1heSBjb250YWluIGEgbWFya2VyIGZvciBhIGRlbGV0ZWQgb3IgaW5zZXJ0ZWQgY29udGVudCBjb250cm9sLCBhcyBvbmUgZXhhbXBsZSwgb2YKKyAgICAgICAgLy8gd2hpY2ggdGhlcmUgYXJlIG1hbnkuICBUaGlzIG1ldGhvZCBhY2NlcHRzIHNpbXBsZSByZXZpc2lvbnMsIHN1Y2ggYXMgZGVsZXRlZCBvciBpbnNlcnRlZCB0ZXh0LCB3aGljaCBpcyB0aGUgbW9zdCBjb21tb24gdXNlCisgICAgICAgIC8vIGNhc2UuCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWEVsZW1lbnQgQWNjZXB0UmV2aXNpb25zRm9yRWxlbWVudChYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCByRWxlbWVudCA9IGVsZW1lbnQ7CisgICAgICAgICAgICByRWxlbWVudCA9IChYRWxlbWVudClSZW1vdmVSc2lkVHJhbnNmb3JtKHJFbGVtZW50KTsKKyAgICAgICAgICAgIHZhciBjb250YWluc01vdmVGcm9tTW92ZVRvID0gckVsZW1lbnQuRGVzY2VuZGFudHMoVy5tb3ZlRnJvbSkuQW55KCk7CisgICAgICAgICAgICByRWxlbWVudCA9IChYRWxlbWVudClBY2NlcHRNb3ZlRnJvbU1vdmVUb1RyYW5zZm9ybShyRWxlbWVudCk7CisgICAgICAgICAgICByRWxlbWVudCA9IChYRWxlbWVudClBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybShyRWxlbWVudCk7CisgICAgICAgICAgICByRWxlbWVudC5EZXNjZW5kYW50cygpLkF0dHJpYnV0ZXMoKS5XaGVyZShhID0+IGEuTmFtZSA9PSBQVC5VbmlxdWVJZCB8fCBhLk5hbWUgPT0gUFQuUnVuSWRzKS5SZW1vdmUoKTsKKyAgICAgICAgICAgIHJFbGVtZW50LkRlc2NlbmRhbnRzKFcubnVtUHIpLldoZXJlKG5wID0+ICFucC5IYXNFbGVtZW50cykuUmVtb3ZlKCk7CisgICAgICAgICAgICByZXR1cm4gckVsZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgRml4VXBEZWxldGVkT3JJbnNlcnRlZEZpZWxkQ29kZXNUcmFuc2Zvcm0oWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcucCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIDEgb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gMiB3OmRlbC93OnIvdzpmbGRDaGFyCisgICAgICAgICAgICAgICAgICAgIC8vIDMgdzppbnMvdzpyL3c6ZmxkQ2hhcgorICAgICAgICAgICAgICAgICAgICAvLyA0IHc6aW5zdHJUZXh0CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9ybXVsYXRlIG5ldyBwYXJhZ3JhcGgsIGxvb2tpbmcgZm9yIDQgdGhhdCBoYXMgMiAob3IgMykgYmVmb3JlIGFuZCBhZnRlci4gIFRoZW4gcHV0IGluIGEgdzpkZWwgKG9yIHc6aW5zKSwgdHJhbnNmb3JtaW5nIHc6aW5zdHJUZXh0IHRvIHc6ZGVsSW5zdHJUZXh0IGlmIHc6ZGVsLgorICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2Zvcm0gMSwgMiwgMyBhcyB1c3VhbAorCisgICAgICAgICAgICAgICAgICAgIHZhciBncm91cGVkUGFyYUNvbnRlbnRzS2V5ID0gZWxlbWVudC5FbGVtZW50cygpLlNlbGVjdChlID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLk5hbWUgPT0gVy5kZWwgJiYgZS5FbGVtZW50cyhXLnIpLkVsZW1lbnRzKFcuZmxkQ2hhcikuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5OYW1lID09IFcuaW5zICYmIGUuRWxlbWVudHMoVy5yKS5FbGVtZW50cyhXLmZsZENoYXIpLkFueSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuTmFtZSA9PSBXLnIgJiYgZS5FbGVtZW50KFcuaW5zdHJUZXh0KSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIHZhciB6aXBwZWQgPSBlbGVtZW50LkVsZW1lbnRzKCkuWmlwKGdyb3VwZWRQYXJhQ29udGVudHNLZXksIChlLCBrKSA9PiBuZXcgeyBFbGUgPSBlLCBLZXkgPSBrIH0pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBncm91cGVkID0gemlwcGVkLkdyb3VwQWRqYWNlbnQoeiA9PiB6LktleSkuVG9BcnJheSgpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBnTGVuID0gZ3JvdXBlZC5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAoZ0xlbiAhPSAxKQorICAgICAgICAgICAgICAgICAgICAvLyAgICBDb25zb2xlLldyaXRlTGluZSgpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdQYXJhQ29udGVudHMgPSBncm91cGVkCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KChnLCBpKSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnLktleSA9PSAxIHx8IGcuS2V5ID09IDIgfHwgZy5LZXkgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmplY3QpZy5TZWxlY3QoZ2MgPT4gRml4VXBEZWxldGVkT3JJbnNlcnRlZEZpZWxkQ29kZXNUcmFuc2Zvcm0oZ2MuRWxlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuS2V5ID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwIHx8IGkgPT0gZ0xlbiAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZy5TZWxlY3QoZ2MgPT4gRml4VXBEZWxldGVkT3JJbnNlcnRlZEZpZWxkQ29kZXNUcmFuc2Zvcm0oZ2MuRWxlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cGVkW2ktMV0uS2V5ID09IDIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRbaSsxXS5LZXkgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLmRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLlNlbGVjdChnYyA9PiBUcmFuc2Zvcm1JbnN0clRleHRUb0RlbEluc3RyVGV4dChnYy5FbGUpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZ3JvdXBlZFtpIC0gMV0uS2V5ID09IDMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRbaSArIDFdLktleSA9PSAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuU2VsZWN0KGdjID0+IEZpeFVwRGVsZXRlZE9ySW5zZXJ0ZWRGaWVsZENvZGVzVHJhbnNmb3JtKGdjLkVsZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnLlNlbGVjdChnYyA9PiBGaXhVcERlbGV0ZWRPckluc2VydGVkRmllbGRDb2Rlc1RyYW5zZm9ybShnYy5FbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UGFyYWdyYXBoID0gbmV3IFhFbGVtZW50KFcucCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyYUNvbnRlbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1BhcmFncmFwaDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBGaXhVcERlbGV0ZWRPckluc2VydGVkRmllbGRDb2Rlc1RyYW5zZm9ybShuKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgVHJhbnNmb3JtSW5zdHJUZXh0VG9EZWxJbnN0clRleHQoWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuaW5zdHJUZXh0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuZGVsSW5zdHJUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtSW5zdHJUZXh0VG9EZWxJbnN0clRleHQobikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IEFkZEVtcHR5UGFyYWdyYXBoVG9BbnlFbXB0eUNlbGxzKFhOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcudGMgJiYgIWVsZW1lbnQuRWxlbWVudHMoKS5XaGVyZShlID0+IGUuTmFtZSAhPSBXLnRjUHIpLkFueSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcudGMsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnApKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IEFkZEVtcHR5UGFyYWdyYXBoVG9BbnlFbXB0eUNlbGxzKG4pKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8WE5hbWUsIGludD4gT3JkZXJfdGNQciA9IG5ldyBEaWN0aW9uYXJ5PFhOYW1lLCBpbnQ+CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgVy5jbmZTdHlsZSwgMTAgfSwKKyAgICAgICAgICAgIHsgVy50Y1csIDIwIH0sCisgICAgICAgICAgICB7IFcuZ3JpZFNwYW4sIDMwIH0sCisgICAgICAgICAgICB7IFcuaE1lcmdlLCA0MCB9LAorICAgICAgICAgICAgeyBXLnZNZXJnZSwgNTAgfSwKKyAgICAgICAgICAgIHsgVy50Y0JvcmRlcnMsIDYwIH0sCisgICAgICAgICAgICB7IFcuc2hkLCA3MCB9LAorICAgICAgICAgICAgeyBXLm5vV3JhcCwgODAgfSwKKyAgICAgICAgICAgIHsgVy50Y01hciwgOTAgfSwKKyAgICAgICAgICAgIHsgVy50ZXh0RGlyZWN0aW9uLCAxMDAgfSwKKyAgICAgICAgICAgIHsgVy50Y0ZpdFRleHQsIDExMCB9LAorICAgICAgICAgICAgeyBXLnZBbGlnbiwgMTIwIH0sCisgICAgICAgICAgICB7IFcuaGlkZU1hcmssIDEzMCB9LAorICAgICAgICAgICAgeyBXLmhlYWRlcnMsIDE0MCB9LAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEZpeFdpZHRocyhYRWxlbWVudCB0YmwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBuZXdUYmwgPSBuZXcgWEVsZW1lbnQodGJsKTsKKyAgICAgICAgICAgIHZhciBncmlkTGluZXMgPSB0YmwuRWxlbWVudHMoVy50YmxHcmlkKS5FbGVtZW50cyhXLmdyaWRDb2wpLkF0dHJpYnV0ZXMoVy5fdykuU2VsZWN0KHcgPT4gKGludCl3KS5Ub0FycmF5KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdHIgaW4gbmV3VGJsLkVsZW1lbnRzKFcudHIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB1c2VkID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbGFzdFVzZWQgPSAtMTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdGMgaW4gdHIuRWxlbWVudHMoVy50YykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgdGNXID0gdGMuRWxlbWVudHMoVy50Y1ByKS5FbGVtZW50cyhXLnRjVykuQXR0cmlidXRlcyhXLl93KS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodGNXICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludD8gZ3JpZFNwYW4gPSAoaW50Pyl0Yy5FbGVtZW50cyhXLnRjUHIpLkVsZW1lbnRzKFcuZ3JpZFNwYW4pLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncmlkU3BhbiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRTcGFuID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHogPSBNYXRoLk1pbihncmlkTGluZXMuTGVuZ3RoIC0gMSwgbGFzdFVzZWQgKyAoaW50KWdyaWRTcGFuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ID0gZ3JpZExpbmVzLldoZXJlKChnLCBpKSA9PiBpID4gbGFzdFVzZWQgJiYgaSA8PSB6KS5TdW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjVy5WYWx1ZSA9IHcuVG9TdHJpbmcoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFVzZWQgKz0gKGludClncmlkU3BhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgKz0gKGludClncmlkU3BhbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXdUYmw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQWNjZXB0TW92ZUZyb21Nb3ZlVG9UcmFuc2Zvcm0oWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5tb3ZlVG8pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gQWNjZXB0TW92ZUZyb21Nb3ZlVG9UcmFuc2Zvcm0obikpOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5tb3ZlRnJvbSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gQWNjZXB0TW92ZUZyb21Nb3ZlVG9UcmFuc2Zvcm0obikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgQWNjZXB0TW92ZUZyb21SYW5nZXMoWEVsZW1lbnQgZG9jdW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB3b3JkUHJvY2Vzc2luZ05hbWVzcGFjZVByZWZpeCA9IGRvY3VtZW50LkdldFByZWZpeE9mTmFtZXNwYWNlKFcudyk7CisKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbGlzdHMgY29udGFpbiB0aGUgZWxlbWVudHMgdGhhdCBhcmUgYmV0d2VlbiBzdGFydC9lbmQgZWxlbWVudHMuCisgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBzdGFydEVsZW1lbnRUYWdzSW5Nb3ZlRnJvbVJhbmdlID0gbmV3IExpc3Q8WEVsZW1lbnQ+KCk7CisgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBlbmRFbGVtZW50VGFnc0luTW92ZUZyb21SYW5nZSA9IG5ldyBMaXN0PFhFbGVtZW50PigpOworCisgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBlbGVtZW50cyB0aGF0ICptYXkqIGJlIGluIGEgcmFuZ2UgdGhhdCBoYXMgYm90aCBzdGFydCBhbmQgZW5kCisgICAgICAgICAgICAvLyBlbGVtZW50cy4KKyAgICAgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBQb3RlbnRpYWxJblJhbmdlRWxlbWVudHM+IHBvdGVudGlhbERlbGV0ZWRFbGVtZW50cyA9CisgICAgICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBQb3RlbnRpYWxJblJhbmdlRWxlbWVudHM+KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0YWcgaW4gRGVzY2VuZGFudEFuZFNlbGZUYWdzKGRvY3VtZW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodGFnLkVsZW1lbnQuTmFtZSA9PSBXLm1vdmVGcm9tUmFuZ2VTdGFydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZCA9IHRhZy5FbGVtZW50LkF0dHJpYnV0ZShXLmlkKS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsRGVsZXRlZEVsZW1lbnRzLkFkZChpZCwgbmV3IFBvdGVudGlhbEluUmFuZ2VFbGVtZW50cygpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0YWcuRWxlbWVudC5OYW1lID09IFcubW92ZUZyb21SYW5nZUVuZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZCA9IHRhZy5FbGVtZW50LkF0dHJpYnV0ZShXLmlkKS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvdGVudGlhbERlbGV0ZWRFbGVtZW50cy5Db250YWluc0tleShpZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RWxlbWVudFRhZ3NJbk1vdmVGcm9tUmFuZ2UuQWRkUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsRGVsZXRlZEVsZW1lbnRzW2lkXS5Qb3RlbnRpYWxTdGFydEVsZW1lbnRUYWdzSW5SYW5nZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmRFbGVtZW50VGFnc0luTW92ZUZyb21SYW5nZS5BZGRSYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxEZWxldGVkRWxlbWVudHNbaWRdLlBvdGVudGlhbEVuZEVsZW1lbnRUYWdzSW5SYW5nZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxEZWxldGVkRWxlbWVudHMuUmVtb3ZlKGlkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvdGVudGlhbERlbGV0ZWRFbGVtZW50cy5Db3VudCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFnLlRhZ1R5cGUgPT0gVGFnVHlwZUVudW0uRWxlbWVudCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHRhZy5FbGVtZW50Lk5hbWUgIT0gVy5tb3ZlRnJvbVJhbmdlU3RhcnQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YWcuRWxlbWVudC5OYW1lICE9IFcubW92ZUZyb21SYW5nZUVuZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpZCBpbiBwb3RlbnRpYWxEZWxldGVkRWxlbWVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQuVmFsdWUuUG90ZW50aWFsU3RhcnRFbGVtZW50VGFnc0luUmFuZ2UuQWRkKHRhZy5FbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWcuVGFnVHlwZSA9PSBUYWdUeXBlRW51bS5FbXB0eUVsZW1lbnQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICh0YWcuRWxlbWVudC5OYW1lICE9IFcubW92ZUZyb21SYW5nZVN0YXJ0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLkVsZW1lbnQuTmFtZSAhPSBXLm1vdmVGcm9tUmFuZ2VFbmQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaWQgaW4gcG90ZW50aWFsRGVsZXRlZEVsZW1lbnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLlZhbHVlLlBvdGVudGlhbFN0YXJ0RWxlbWVudFRhZ3NJblJhbmdlLkFkZCh0YWcuRWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQuVmFsdWUuUG90ZW50aWFsRW5kRWxlbWVudFRhZ3NJblJhbmdlLkFkZCh0YWcuRWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodGFnLlRhZ1R5cGUgPT0gVGFnVHlwZUVudW0uRW5kRWxlbWVudCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHRhZy5FbGVtZW50Lk5hbWUgIT0gVy5tb3ZlRnJvbVJhbmdlU3RhcnQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5FbGVtZW50Lk5hbWUgIT0gVy5tb3ZlRnJvbVJhbmdlRW5kKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGlkIGluIHBvdGVudGlhbERlbGV0ZWRFbGVtZW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC5WYWx1ZS5Qb3RlbnRpYWxFbmRFbGVtZW50VGFnc0luUmFuZ2UuQWRkKHRhZy5FbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIG1vdmVGcm9tRWxlbWVudHNUb0RlbGV0ZSA9IHN0YXJ0RWxlbWVudFRhZ3NJbk1vdmVGcm9tUmFuZ2UKKyAgICAgICAgICAgICAgICAuSW50ZXJzZWN0KGVuZEVsZW1lbnRUYWdzSW5Nb3ZlRnJvbVJhbmdlKQorICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisgICAgICAgICAgICBpZiAobW92ZUZyb21FbGVtZW50c1RvRGVsZXRlLkNvdW50KCkgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiAoWEVsZW1lbnQpQWNjZXB0TW92ZUZyb21SYW5nZXNUcmFuc2Zvcm0oCisgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LCBtb3ZlRnJvbUVsZW1lbnRzVG9EZWxldGUpOworICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIE1vdmVGcm9tQ29sbGVjdGlvblR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgUGFyYWdyYXBoRW5kVGFnSW5Nb3ZlRnJvbVJhbmdlLAorICAgICAgICAgICAgT3RoZXIKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQWNjZXB0UGFyYWdyYXBoRW5kVGFnc0luTW92ZUZyb21UcmFuc2Zvcm0oWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChXLkJsb2NrTGV2ZWxDb250ZW50Q29udGFpbmVycy5Db250YWlucyhlbGVtZW50Lk5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwZWRCb2R5Q2hpbGRyZW4gPSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoYyA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrQ29udGVudEluZm8gcGkgPSBjLkdldFBhcmFncmFwaEluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGkuVGhpc0Jsb2NrQ29udGVudEVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcGFyYWdyYXBoTWFya0lzSW5Nb3ZlRnJvbVJhbmdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLlRoaXNCbG9ja0NvbnRlbnRFbGVtZW50LkVsZW1lbnRzKFcubW92ZUZyb21SYW5nZVN0YXJ0KS5BbnkoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXBpLlRoaXNCbG9ja0NvbnRlbnRFbGVtZW50LkVsZW1lbnRzKFcubW92ZUZyb21SYW5nZUVuZCkuQW55KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhZ3JhcGhNYXJrSXNJbk1vdmVGcm9tUmFuZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW92ZUZyb21Db2xsZWN0aW9uVHlwZS5QYXJhZ3JhcGhFbmRUYWdJbk1vdmVGcm9tUmFuZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHByZXZpb3VzQ29udGVudEVsZW1lbnQgPSBjLkNvbnRlbnRFbGVtZW50c0JlZm9yZVNlbGYoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLkdldFBhcmFncmFwaEluZm8oKS5UaGlzQmxvY2tDb250ZW50RWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNDb250ZW50RWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tDb250ZW50SW5mbyBwaTIgPSBwcmV2aW91c0NvbnRlbnRFbGVtZW50LkdldFBhcmFncmFwaEluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuTmFtZSA9PSBXLnAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpMi5UaGlzQmxvY2tDb250ZW50RWxlbWVudC5FbGVtZW50cyhXLm1vdmVGcm9tUmFuZ2VTdGFydCkuQW55KCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFwaTIuVGhpc0Jsb2NrQ29udGVudEVsZW1lbnQuRWxlbWVudHMoVy5tb3ZlRnJvbVJhbmdlRW5kKS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNb3ZlRnJvbUNvbGxlY3Rpb25UeXBlLlBhcmFncmFwaEVuZFRhZ0luTW92ZUZyb21SYW5nZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1vdmVGcm9tQ29sbGVjdGlvblR5cGUuT3RoZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIGdyb3VwLCBhbmQgaXQncyBrZXkgaXMgTW92ZUZyb21Db2xsZWN0aW9uVHlwZS5PdGhlcgorICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCisgICAgICAgICAgICAgICAgICAgIGlmIChncm91cGVkQm9keUNoaWxkcmVuLkNvdW50KCkgPT0gMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZEJvZHlDaGlsZHJlbi5GaXJzdCgpLktleSA9PSBNb3ZlRnJvbUNvbGxlY3Rpb25UeXBlLk90aGVyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdFbGVtZW50ID0gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkQm9keUNoaWxkcmVuLlNlbGVjdChnID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZy5LZXkgPT0gTW92ZUZyb21Db2xsZWN0aW9uVHlwZS5PdGhlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqZWN0KWc7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHRyYW5zZm9ybSB0aGF0IHByb2R1Y2VzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0aW9uLCBleGNlcHQgdGhhdCB0aGUgcGFyYWdyYXBoIGluIHRoZSBkZXNjZW5kZW50cyBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlZCB3aXRoIGEgbmV3IHBhcmFncmFwaCB0aGF0IGNvbnRhaW5zIGFsbCBjb250ZW50cyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgcGFyYWdyYXBoLCBwbHVzIHN1YnNlcXVlbnQgZWxlbWVudHMgaW4gdGhlIGdyb3VwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3Rpb24sIHdoZXJlIHRoZSBwYXJhZ3JhcGggaW4gZWFjaCBvZiB0aG9zZSBncm91cHMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGFwc2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29hbGVzcXVlUGFyYWdyYXBoRW5kVGFnc0luTW92ZUZyb21UcmFuc2Zvcm0oZy5GaXJzdCgpLCBnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0UGFyYWdyYXBoRW5kVGFnc0luTW92ZUZyb21UcmFuc2Zvcm0obikpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gQWNjZXB0UGFyYWdyYXBoRW5kVGFnc0luTW92ZUZyb21UcmFuc2Zvcm0obikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IEFjY2VwdEFsbE90aGVyUmV2aXNpb25zVHJhbnNmb3JtKFhOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLy8gQWNjZXB0IGluc2VydGVkIHRleHQsIGluc2VydGVkIHBhcmFncmFwaCBtYXJrcywgZXRjLgorICAgICAgICAgICAgICAgIC8vLyBDb2xsYXBzZSBhbGwgdzppbnMgZWxlbWVudHMuCisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuaW5zKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgLk5vZGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QobiA9PiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybShuKSk7CisKKyAgICAgICAgICAgICAgICAvLy8gUmVtb3ZlIGFsbCBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzLiAgVGhlc2UgZWxlbWVudHMgYXJlIHByb2Nlc3NlZCBpbjoKKyAgICAgICAgICAgICAgICAvLy8gICBBY2NlcHREZWxldGVkQW5kTW92ZWRGcm9tQ29udGVudENvbnRyb2xzCisgICAgICAgICAgICAgICAgLy8vICAgQWNjZXB0TW92ZUZyb21Nb3ZlVG9UcmFuc2Zvcm0KKyAgICAgICAgICAgICAgICAvLy8gICBBY2NlcHREZWxldGVkQW5kTW92ZUZyb21QYXJhZ3JhcGhNYXJrc1RyYW5zZm9ybQorICAgICAgICAgICAgICAgIC8vLyAgIEFjY2VwdFBhcmFncmFwaEVuZFRhZ3NJbk1vdmVGcm9tVHJhbnNmb3JtCisgICAgICAgICAgICAgICAgLy8vICAgQWNjZXB0TW92ZUZyb21SYW5nZXMKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5jdXN0b21YbWxEZWxSYW5nZVN0YXJ0IHx8CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTmFtZSA9PSBXLmN1c3RvbVhtbERlbFJhbmdlRW5kIHx8CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTmFtZSA9PSBXLmN1c3RvbVhtbEluc1JhbmdlU3RhcnQgfHwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lID09IFcuY3VzdG9tWG1sSW5zUmFuZ2VFbmQgfHwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lID09IFcuY3VzdG9tWG1sTW92ZUZyb21SYW5nZVN0YXJ0IHx8CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTmFtZSA9PSBXLmN1c3RvbVhtbE1vdmVGcm9tUmFuZ2VFbmQgfHwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lID09IFcuY3VzdG9tWG1sTW92ZVRvUmFuZ2VTdGFydCB8fAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgPT0gVy5jdXN0b21YbWxNb3ZlVG9SYW5nZUVuZCB8fAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgPT0gVy5tb3ZlRnJvbVJhbmdlU3RhcnQgfHwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lID09IFcubW92ZUZyb21SYW5nZUVuZCB8fAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgPT0gVy5tb3ZlVG9SYW5nZVN0YXJ0IHx8CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTmFtZSA9PSBXLm1vdmVUb1JhbmdlRW5kKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIC8vLyBBY2NlcHQgcmV2aXNpb25zIGluIGZvcm1hdHRpbmcgb24gcGFyYWdyYXBocy4KKyAgICAgICAgICAgICAgICAvLy8gQWNjZXB0IHJldmlzaW9ucyBpbiBmb3JtYXR0aW5nIG9uIHJ1bnMuCisgICAgICAgICAgICAgICAgLy8vIEFjY2VwdCByZXZpc2lvbnMgZm9yIGFwcGxpZWQgc3R5bGVzIHRvIGEgdGFibGUuCisgICAgICAgICAgICAgICAgLy8vIEFjY2VwdCByZXZpc2lvbnMgZm9yIGdyaWQgcmV2aXNpb25zIHRvIGEgdGFibGUuCisgICAgICAgICAgICAgICAgLy8vIEFjY2VwdCByZXZpc2lvbnMgZm9yIGNvbHVtbiBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgICAgIC8vLyBBY2NlcHQgcmV2aXNpb25zIGZvciByb3cgcHJvcGVydGllcy4KKyAgICAgICAgICAgICAgICAvLy8gQWNjZXB0IHJldmlzaW9ucyBmb3IgdGFibGUgbGV2ZWwgcHJvcGVydHkgZXhjZXB0aW9ucy4KKyAgICAgICAgICAgICAgICAvLy8gQWNjZXB0IHJldmlzaW9ucyBmb3Igc2VjdGlvbiBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgICAgIC8vLyBBY2NlcHQgbnVtYmVyaW5nIHJldmlzaW9uIGluIGZpZWxkcy4KKyAgICAgICAgICAgICAgICAvLy8gQWNjZXB0IGRlbGV0ZWQgZmllbGQgY29kZSB0ZXh0LgorICAgICAgICAgICAgICAgIC8vLyBBY2NlcHQgZGVsZXRlZCBsaXRlcmFsIHRleHQuCisgICAgICAgICAgICAgICAgLy8vIEFjY2VwdCBpbnNlcnRlZCBjZWxsLgorCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnBQckNoYW5nZSB8fAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgPT0gVy5yUHJDaGFuZ2UgfHwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lID09IFcudGJsUHJDaGFuZ2UgfHwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lID09IFcudGJsR3JpZENoYW5nZSB8fAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgPT0gVy50Y1ByQ2hhbmdlIHx8CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTmFtZSA9PSBXLnRyUHJDaGFuZ2UgfHwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lID09IFcudGJsUHJFeENoYW5nZSB8fAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgPT0gVy5zZWN0UHJDaGFuZ2UgfHwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lID09IFcubnVtYmVyaW5nQ2hhbmdlIHx8CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTmFtZSA9PSBXLmRlbEluc3RyVGV4dCB8fAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgPT0gVy5kZWxUZXh0IHx8CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTmFtZSA9PSBXLmNlbGxJbnMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgLy8gQWNjZXB0IHJldmlzaW9ucyBmb3IgZGVsZXRlZCBtYXRoIGNvbnRyb2wgY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgIC8vIE1hdGNoIG06Zi9tOmZQci9tOmN0cmxQci93OmRlbCwgcmVtb3ZlIG06Zi4KKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gTS5mICYmCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoTS5mUHIpLkVsZW1lbnRzKE0uY3RybFByKS5FbGVtZW50cyhXLmRlbCkuQW55KCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgLy8gQWNjZXB0IHJldmlzaW9ucyBmb3IgZGVsZXRlZCByb3dzIGluIHRhYmxlcy4KKyAgICAgICAgICAgICAgICAvLyBNYXRjaCB3OnRyL3c6dHJQci93OmRlbCwgcmVtb3ZlIHc6dHIuCisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcudHIgJiYKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cyhXLnRyUHIpLkVsZW1lbnRzKFcuZGVsKS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICAvLyBBY2NlcHQgZGVsZXRlZCB0ZXh0IGluIHBhcmFncmFwaHMuCisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuZGVsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIC8vIEFjY2VwdCByZXZpc2lvbnMgZm9yIHZlcnRpY2FsbHkgbWVyZ2VkIGNlbGxzLgorICAgICAgICAgICAgICAgIC8vICAgY2VsbE1lcmdlIHdpdGggYSBwYXJlbnQgb2YgdGNQciwgd2l0aCBhdHRyaWJ1dGUgdzp2TWVyZ2U9InJlc3QiIHRyYW5zZm9ybWVkCisgICAgICAgICAgICAgICAgLy8gICAgIHRvIDx3OnZNZXJnZSB3OnZhbD0icmVzdGFydCIvPgorICAgICAgICAgICAgICAgIC8vICAgY2VsbE1lcmdlIHdpdGggYSBwYXJlbnQgb2YgdGNQciwgd2l0aCBhdHRyaWJ1dGUgdzp2TWVyZ2U9ImNvbnQiIHRyYW5zZm9ybWVkCisgICAgICAgICAgICAgICAgLy8gICAgIHRvIDx3OnZNZXJnZSB3OnZhbD0iY29udGludWUiLz4KKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5jZWxsTWVyZ2UgJiYKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5QYXJlbnQuTmFtZSA9PSBXLnRjUHIgJiYKKyAgICAgICAgICAgICAgICAgICAgKHN0cmluZyllbGVtZW50LkF0dHJpYnV0ZShXLnZNZXJnZSkgPT0gInJlc3QiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcudk1lcmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJyZXN0YXJ0IikpOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5jZWxsTWVyZ2UgJiYKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5QYXJlbnQuTmFtZSA9PSBXLnRjUHIgJiYKKyAgICAgICAgICAgICAgICAgICAgKHN0cmluZyllbGVtZW50LkF0dHJpYnV0ZShXLnZNZXJnZSkgPT0gImNvbnQiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcudk1lcmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJjb250aW51ZSIpKTsKKworICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBkbyBpZGVudGl0eSBjbG9uZS4KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybShuKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQ29sbGFwc2VQYXJhZ3JhcGhUcmFuc2Zvcm0oWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5wKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5FbGVtZW50cygpLldoZXJlKGUgPT4gZS5OYW1lICE9IFcucFByKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBDb2xsYXBzZVBhcmFncmFwaFRyYW5zZm9ybShuKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gRGVsZXRlZFBhcmFncmFwaENvbGxlY3Rpb25UeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIERlbGV0ZWRQYXJhZ3JhcGhNYXJrQ29udGVudCwKKyAgICAgICAgICAgIFBhcmFncmFwaEZvbGxvd2luZywKKyAgICAgICAgICAgIE90aGVyCisgICAgICAgIH07CisKKyAgICAgICAgLy8vIEFjY2VwdCBkZWxldGVkIHBhcmFncmFwaHMuCisgICAgICAgIC8vLworICAgICAgICAvLy8gR3JvdXAgdG9nZXRoZXIgYWxsIHBhcmFncmFwaHMgdGhhdCBjb250YWluIHc6cC93OnBQci93OnJQci93OmRlbCBlbGVtZW50cy4gIE1ha2UgYQorICAgICAgICAvLy8gc2Vjb25kIGdyb3VwIGZvciB0aGUgY29udGVudCBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhIHBhcmFncmFwaCB0aGF0IGNvbnRhaW5zCisgICAgICAgIC8vLyBhIHc6ZGVsIGVsZW1lbnQuICBUaGUgY29kZSB1c2VzIHRoZSBhcHByb2FjaCBvZiBkZWFsaW5nIHdpdGggcGFyYWdyYXBoIGNvbnRlbnQgYXQKKyAgICAgICAgLy8vICdsZXZlbHMnLCBpZ25vcmluZyBwYXJhZ3JhcGggY29udGVudCBhdCBvdGhlciBsZXZlbHMuICBGb3JtIGEgbmV3IHBhcmFncmFwaCB0aGF0CisgICAgICAgIC8vLyBjb250YWlucyB0aGUgY29udGVudCBvZiB0aGUgZ3JvdXBlZCBwYXJhZ3JhcGhzIHdpdGggZGVsZXRlZCBwYXJhZ3JhcGggbWFya3MsIGFuZCB0aGUKKyAgICAgICAgLy8vIGNvbnRlbnQgb2YgdGhlIHBhcmFncmFwaCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYSBwYXJhZ3JhcGggdGhhdCBjb250YWlucyBhIGRlbGV0ZWQKKyAgICAgICAgLy8vIHBhcmFncmFwaCBtYXJrLiAgSW5jbHVkZSBpbiB0aGUgbmV3IHBhcmFncmFwaCB0aGUgcGFyYWdyYXBoIHByb3BlcnRpZXMgZnJvbSB0aGUKKyAgICAgICAgLy8vIHBhcmFncmFwaCBmb2xsb3dpbmcuICBXaGVuIGFzc2VtYmxpbmcgdGhlIG5ldyBwYXJhZ3JhcGgsIHVzZSBhIHRyYW5zZm9ybSB0aGF0IGNvbGxhcHNlcworICAgICAgICAvLy8gdGhlIHBhcmFncmFwaCBub2RlcyB3aGVuIGFkZGluZyBjb250ZW50LCB0aGVyZWJ5IHByZXNlcnZpbmcgY3VzdG9tIFhNTCBhbmQgY29udGVudAorICAgICAgICAvLy8gY29udHJvbHMuCisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBbm5vdGF0ZUJsb2NrQ29udGVudEVsZW1lbnRzKFhFbGVtZW50IGNvbnRlbnRDb250YWluZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZvciBjb252ZW5pZW5jZSwgdGhlcmUgaXMgYSBQYXJhZ3JhcGhJbmZvIGFubm90YXRpb24gb24gdGhlIGNvbnRlbnRDb250YWluZXIuCisgICAgICAgICAgICAvLyBJdCBjb250YWlucyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgUGFyYWdyYXBoSW5mbyBhbm5vdGF0aW9uIG9uIHRoZSBmaXJzdAorICAgICAgICAgICAgLy8gICBwYXJhZ3JhcGguCisgICAgICAgICAgICBpZiAoY29udGVudENvbnRhaW5lci5Bbm5vdGF0aW9uPEJsb2NrQ29udGVudEluZm8+KCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBYRWxlbWVudCBmaXJzdENvbnRlbnRFbGVtZW50ID0gY29udGVudENvbnRhaW5lcgorICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzQW5kU2VsZigpCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGUgPT4gZS5OYW1lID09IFcucCB8fCBlLk5hbWUgPT0gVy50YmwpOworICAgICAgICAgICAgaWYgKGZpcnN0Q29udGVudEVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIEFkZCB0aGUgYW5ub3RhdGlvbiBvbiB0aGUgY29udGVudENvbnRhaW5lci4KKyAgICAgICAgICAgIEJsb2NrQ29udGVudEluZm8gY3VycmVudENvbnRlbnRJbmZvID0gbmV3IEJsb2NrQ29udGVudEluZm8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFByZXZpb3VzQmxvY2tDb250ZW50RWxlbWVudCA9IG51bGwsCisgICAgICAgICAgICAgICAgVGhpc0Jsb2NrQ29udGVudEVsZW1lbnQgPSBmaXJzdENvbnRlbnRFbGVtZW50LAorICAgICAgICAgICAgICAgIE5leHRCbG9ja0NvbnRlbnRFbGVtZW50ID0gbnVsbAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIC8vIEFkZCBhcyBhbm5vdGF0aW9uIGV2ZW4gdGhvdWdoIE5leHRQYXJhZ3JhcGggaXMgbm90IHNldCB5ZXQuCisgICAgICAgICAgICBjb250ZW50Q29udGFpbmVyLkFkZEFubm90YXRpb24oY3VycmVudENvbnRlbnRJbmZvKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZW50SW5mby5UaGlzQmxvY2tDb250ZW50RWxlbWVudC5BZGRBbm5vdGF0aW9uKGN1cnJlbnRDb250ZW50SW5mbyk7CisgICAgICAgICAgICAgICAgLy8gRmluZCBuZXh0IHNpYmxpbmcgY29udGVudCBlbGVtZW50LgorICAgICAgICAgICAgICAgIFhFbGVtZW50IG5leHRDb250ZW50RWxlbWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgY3VycmVudCA9IGN1cnJlbnRDb250ZW50SW5mby5UaGlzQmxvY2tDb250ZW50RWxlbWVudDsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5leHRDb250ZW50RWxlbWVudCA9IGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50c0FmdGVyU2VsZigpCisgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNBbmRTZWxmKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChlID0+IGUuTmFtZSA9PSBXLnAgfHwgZS5OYW1lID09IFcudGJsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDb250ZW50RWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udGVudEluZm8uTmV4dEJsb2NrQ29udGVudEVsZW1lbnQgPSBuZXh0Q29udGVudEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5QYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gd2UndmUgYmFja2VkIHVwIHRoZSB0cmVlIHRvIHRoZSBjb250ZW50Q29udGFpbmVyLCB3ZSdyZSBkb25lLgorICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PSBjb250ZW50Q29udGFpbmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJyZW50Q29udGVudEluZm8gPSBuZXcgQmxvY2tDb250ZW50SW5mbygpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQcmV2aW91c0Jsb2NrQ29udGVudEVsZW1lbnQgPSBjdXJyZW50Q29udGVudEluZm8uVGhpc0Jsb2NrQ29udGVudEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgIFRoaXNCbG9ja0NvbnRlbnRFbGVtZW50ID0gbmV4dENvbnRlbnRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICBOZXh0QmxvY2tDb250ZW50RWxlbWVudCA9IG51bGwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSUVudW1lcmFibGU8QmxvY2tDb250ZW50SW5mbz4gSXRlcmF0ZUJsb2NrQ29udGVudEVsZW1lbnRzKFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGN1cnJlbnQgPSBlbGVtZW50LkVsZW1lbnRzKCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgeWllbGQgYnJlYWs7CisgICAgICAgICAgICBBbm5vdGF0ZUJsb2NrQ29udGVudEVsZW1lbnRzKGVsZW1lbnQpOworICAgICAgICAgICAgQmxvY2tDb250ZW50SW5mbyBjdXJyZW50QmxvY2tDb250ZW50SW5mbyA9IGVsZW1lbnQuQW5ub3RhdGlvbjxCbG9ja0NvbnRlbnRJbmZvPigpOworICAgICAgICAgICAgaWYgKGN1cnJlbnRCbG9ja0NvbnRlbnRJbmZvICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gY3VycmVudEJsb2NrQ29udGVudEluZm87CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QmxvY2tDb250ZW50SW5mby5OZXh0QmxvY2tDb250ZW50RWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9ja0NvbnRlbnRJbmZvID0gY3VycmVudEJsb2NrQ29udGVudEluZm8uTmV4dEJsb2NrQ29udGVudEVsZW1lbnQuQW5ub3RhdGlvbjxCbG9ja0NvbnRlbnRJbmZvPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUFQKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZXNwYWNlIHB0ID0gImh0dHA6Ly93d3cuY29kZXBsZXguY29tL1Bvd2VyVG9vbHMvMjAwOS9SZXZpc2lvbkFjY2VwdGVyIjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWUgVW5pcXVlSWQgPSBwdCArICJVbmlxdWVJZCI7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lIFJ1bklkcyA9IHB0ICsgIlJ1bklkcyI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFubm90YXRlUnVuRWxlbWVudHNXaXRoSWQoWEVsZW1lbnQgZWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHJ1bklkID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhFbGVtZW50IGUgaW4gZWxlbWVudC5EZXNjZW5kYW50cygpLldoZXJlKGUgPT4gZS5OYW1lID09IFcucikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGUuTmFtZSA9PSBXLnIpCisgICAgICAgICAgICAgICAgICAgIGUuQWRkKG5ldyBYQXR0cmlidXRlKFBULlVuaXF1ZUlkLCBydW5JZCsrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFubm90YXRlQ29udGVudENvbnRyb2xzV2l0aFJ1bklkcyhYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2R0SWQgPSAwOworICAgICAgICAgICAgZm9yZWFjaCAoWEVsZW1lbnQgZSBpbiBlbGVtZW50LkRlc2NlbmRhbnRzKFcuc2R0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBvbGQgdmVyc2lvbgorICAgICAgICAgICAgICAgIC8vZS5BZGQobmV3IFhBdHRyaWJ1dGUoUFQuUnVuSWRzLAorICAgICAgICAgICAgICAgIC8vICAgIGUuRGVzY2VuZGFudHMoVy5yKS5TZWxlY3QociA9PiByLkF0dHJpYnV0ZShQVC5VbmlxdWVJZCkuVmFsdWUpLlN0cmluZ0NvbmNhdGVuYXRlKHMgPT4gcyArICIsIikuVHJpbSgnLCcpKSwKKyAgICAgICAgICAgICAgICAvLyAgICBuZXcgWEF0dHJpYnV0ZShQVC5VbmlxdWVJZCwgc2R0SWQrKykpOworICAgICAgICAgICAgICAgIGUuQWRkKG5ldyBYQXR0cmlidXRlKFBULlJ1bklkcywKKyAgICAgICAgICAgICAgICAgICAgZS5EZXNjZW5kYW50c1RyaW1tZWQoVy50eGJ4Q29udGVudCkKKyAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShkID0+IGQuTmFtZSA9PSBXLnIpCisgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHIgPT4gci5BdHRyaWJ1dGUoUFQuVW5pcXVlSWQpLlZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgLlN0cmluZ0NvbmNhdGVuYXRlKHMgPT4gcyArICIsIikKKyAgICAgICAgICAgICAgICAgICAgIC5UcmltKCcsJykpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShQVC5VbmlxdWVJZCwgc2R0SWQrKykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgQWRkQmxvY2tMZXZlbENvbnRlbnRDb250cm9scyhYRWxlbWVudCBuZXdEb2N1bWVudCwgWEVsZW1lbnQgb3JpZ2luYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBvcmlnaW5hbENvbnRlbnRDb250cm9scyA9IG9yaWdpbmFsLkRlc2NlbmRhbnRzKFcuc2R0KS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIHZhciBleGlzdGluZ0NvbnRlbnRDb250cm9scyA9IG5ld0RvY3VtZW50LkRlc2NlbmRhbnRzKFcuc2R0KS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIHZhciBjb250ZW50Q29udHJvbHNUb0FkZCA9IG9yaWdpbmFsQ29udGVudENvbnRyb2xzCisgICAgICAgICAgICAgICAgLlNlbGVjdChvY2MgPT4gb2NjLkF0dHJpYnV0ZShQVC5VbmlxdWVJZCkuVmFsdWUpCisgICAgICAgICAgICAgICAgLkV4Y2VwdChleGlzdGluZ0NvbnRlbnRDb250cm9scworICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGVjYyA9PiBlY2MuQXR0cmlidXRlKFBULlVuaXF1ZUlkKS5WYWx1ZSkpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNvbnRlbnRDb250cm9sIGluIG9yaWdpbmFsQ29udGVudENvbnRyb2xzCisgICAgICAgICAgICAgICAgLldoZXJlKG9jYyA9PiBjb250ZW50Q29udHJvbHNUb0FkZC5Db250YWlucyhvY2MuQXR0cmlidXRlKFBULlVuaXF1ZUlkKS5WYWx1ZSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBOZWVkIGEgc2xpZ2h0IG1vZGlmaWNhdGlvbiBoZXJlLiAgSWYgdGhlcmUgaXMgYSBwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGUgY29udGVudCBjb250cm9sIHRoYXQgY29udGFpbnMgbm8gcnVucywgdGhlbiB0aGUgcGFyYWdyYXBoIGlzbid0IGluY2x1ZGVkIGluIHRoZQorICAgICAgICAgICAgICAgIC8vIGNvbnRlbnQgY29udHJvbCwgYmVjYXVzZSB0aGUgZm9sbG93aW5nIHRyaWdnZXJzIG9mZiBvZiBydW5zLgorICAgICAgICAgICAgICAgIC8vIFRvIHNlZSBhbiBleGFtcGxlIG9mIHRoaXMsIHNlZSBleGFtcGxlIGRvY3VtZW50ICJOdW1iZXJpbmdQYXJhZ3JhcGhQcm9wZXJ0aWVzQ2hhbmdlLmRvY3hzIgorCisgICAgICAgICAgICAgICAgLy8gZmluZCBsaXN0IG9mIHJ1bnMgdG8gc3Vycm91bmQKKyAgICAgICAgICAgICAgICB2YXIgcnVuSWRzID0gY29udGVudENvbnRyb2wuQXR0cmlidXRlKFBULlJ1bklkcykuVmFsdWUuU3BsaXQoJywnKTsKKyAgICAgICAgICAgICAgICB2YXIgcnVucyA9IGNvbnRlbnRDb250cm9sLkRlc2NlbmRhbnRzKFcucikuV2hlcmUociA9PiBydW5JZHMuQ29udGFpbnMoci5BdHRyaWJ1dGUoUFQuVW5pcXVlSWQpLlZhbHVlKSk7CisgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgcnVucyBpbiB0aGUgbmV3IGRvY3VtZW50CisKKyAgICAgICAgICAgICAgICB2YXIgcnVuc0luTmV3RG9jdW1lbnQgPSBydW5zLlNlbGVjdChyID0+IG5ld0RvY3VtZW50LkRlc2NlbmRhbnRzKFcucikuRmlyc3QoeiA9PiB6LkF0dHJpYnV0ZShQVC5VbmlxdWVJZCkuVmFsdWUgPT0gci5BdHRyaWJ1dGUoUFQuVW5pcXVlSWQpLlZhbHVlKSkuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICAvLyBmaW5kIGNvbW1vbiBhbmNlc3RvcgorICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IHJ1bkFuY2VzdG9ySW50ZXJzZWN0aW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcnVuIGluIHJ1bnNJbk5ld0RvY3VtZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bkFuY2VzdG9ySW50ZXJzZWN0aW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBydW5BbmNlc3RvckludGVyc2VjdGlvbiA9IHJ1bi5BbmNlc3RvcnMoKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcnVuQW5jZXN0b3JJbnRlcnNlY3Rpb24gPSBydW4uQW5jZXN0b3JzKCkuSW50ZXJzZWN0KHJ1bkFuY2VzdG9ySW50ZXJzZWN0aW9uKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJ1bkFuY2VzdG9ySW50ZXJzZWN0aW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIFhFbGVtZW50IGNvbW1vbkFuY2VzdG9yID0gcnVuQW5jZXN0b3JJbnRlcnNlY3Rpb24uSW5Eb2N1bWVudE9yZGVyKCkuTGFzdCgpOworICAgICAgICAgICAgICAgIC8vIGZpbmQgY2hpbGQgb2YgY29tbW9uIGFuY2VzdG9yIHRoYXQgY29udGFpbnMgZmlyc3QgcnVuCisgICAgICAgICAgICAgICAgLy8gZmluZCBjaGlsZCBvZiBjb21tb24gYW5jZXN0b3IgdGhhdCBjb250YWlucyBsYXN0IHJ1bgorICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgY29tbW9uIGFuY2VzdG9yOgorICAgICAgICAgICAgICAgIC8vICAgZWxlbWVudHMgYmVmb3JlIGZpcnN0IHJ1biBjaGlsZAorICAgICAgICAgICAgICAgIC8vICAgYWRkIGNvbnRlbnQgY29udHJvbCwgYW5kIHJ1bnMgZnJvbSBmaXJzdCBydW4gY2hpbGQgdG8gbGFzdCBydW4gY2hpbGQKKyAgICAgICAgICAgICAgICAvLyAgIGVsZW1lbnRzIGFmdGVyIGxhc3QgcnVuIGNoaWxkCisgICAgICAgICAgICAgICAgdmFyIGZpcnN0UnVuQ2hpbGQgPSBjb21tb25BbmNlc3RvcgorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3QoYyA9PiBjLkRlc2NlbmRhbnRzQW5kU2VsZigpCisgICAgICAgICAgICAgICAgICAgICAgICAuQW55KHogPT4gei5OYW1lID09IFcuciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LkF0dHJpYnV0ZShQVC5VbmlxdWVJZCkuVmFsdWUgPT0gcnVuc0luTmV3RG9jdW1lbnQuRmlyc3QoKS5BdHRyaWJ1dGUoUFQuVW5pcXVlSWQpLlZhbHVlKSk7CisgICAgICAgICAgICAgICAgdmFyIGxhc3RSdW5DaGlsZCA9IGNvbW1vbkFuY2VzdG9yCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdChjID0+IGMuRGVzY2VuZGFudHNBbmRTZWxmKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5BbnkoeiA9PiB6Lk5hbWUgPT0gVy5yICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouQXR0cmlidXRlKFBULlVuaXF1ZUlkKS5WYWx1ZSA9PSBydW5zSW5OZXdEb2N1bWVudC5MYXN0KCkuQXR0cmlidXRlKFBULlVuaXF1ZUlkKS5WYWx1ZSkpOworCisgICAgICAgICAgICAgICAgLy8vIElmIHRoZSBsaXN0IG9mIHJ1bnMgZm9yIHRoZSBjb250ZW50IGNvbnRyb2wgaXMgZXhhY3RseSB0aGUgbGlzdCBvZiBydW5zIGZvciB0aGUgcGFyYWdyYXBoLCB0aGVuCisgICAgICAgICAgICAgICAgLy8vIGNyZWF0ZSB0aGUgY29udGVudCBjb250cm9sIHN1cnJvdW5kaW5nIHRoZSBwYXJhZ3JhcGgsIG5vdCBzdXJyb3VuZGluZyB0aGUgcnVucy4KKworICAgICAgICAgICAgICAgIGlmIChjb21tb25BbmNlc3Rvci5OYW1lID09IFcucCAmJgorICAgICAgICAgICAgICAgICAgICBjb21tb25BbmNlc3Rvci5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgIT0gVy5wUHIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLk5hbWUgIT0gVy5jb21tZW50UmFuZ2VTdGFydCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSAhPSBXLmNvbW1lbnRSYW5nZUVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpID09IGZpcnN0UnVuQ2hpbGQgJiYKKyAgICAgICAgICAgICAgICAgICAgY29tbW9uQW5jZXN0b3IuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gZS5OYW1lICE9IFcucFByICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5OYW1lICE9IFcuY29tbWVudFJhbmdlU3RhcnQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLk5hbWUgIT0gVy5jb21tZW50UmFuZ2VFbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAuTGFzdE9yRGVmYXVsdCgpID09IGxhc3RSdW5DaGlsZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgY29tbW9uQW5jZXN0b3Igd2l0aCBjb250ZW50IGNvbnRyb2wgY29udGFpbmluZyBjb21tb25BbmNlc3RvcgorICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdDb250ZW50Q29udHJvbCA9IG5ldyBYRWxlbWVudChjb250ZW50Q29udHJvbC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudENvbnRyb2wuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudENvbnRyb2wuRWxlbWVudHMoKS5XaGVyZShlID0+IGUuTmFtZSAhPSBXLnNkdENvbnRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuc2R0Q29udGVudCwgY29tbW9uQW5jZXN0b3IpKTsKKworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdDb250ZW50Q29udHJvbE9yZGVyZWQgPSBuZXcgWEVsZW1lbnQoY29udGVudENvbnRyb2wuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRDb250cm9sLkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRDb250cm9sLkVsZW1lbnRzKCkuT3JkZXJCeShlID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9yZGVyX3NkdC5Db250YWluc0tleShlLk5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3JkZXJfc2R0W2UuTmFtZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDk5OTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgICAgICAgICBjb21tb25BbmNlc3Rvci5SZXBsYWNlV2l0aChuZXdDb250ZW50Q29udHJvbE9yZGVyZWQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBlbGVtZW50c0JlZm9yZVJhbmdlID0gY29tbW9uQW5jZXN0b3IKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgLlRha2VXaGlsZShlID0+IGUgIT0gZmlyc3RSdW5DaGlsZCkKKyAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IGVsZW1lbnRzSW5SYW5nZSA9IGNvbW1vbkFuY2VzdG9yCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgIC5Ta2lwV2hpbGUoZSA9PiBlICE9IGZpcnN0UnVuQ2hpbGQpCisgICAgICAgICAgICAgICAgICAgIC5UYWtlV2hpbGUoZSA9PiBlICE9IGxhc3RSdW5DaGlsZC5FbGVtZW50c0FmdGVyU2VsZigpLkZpcnN0T3JEZWZhdWx0KCkpCisgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBlbGVtZW50c0FmdGVyUmFuZ2UgPSBjb21tb25BbmNlc3RvcgorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAuU2tpcFdoaWxlKGUgPT4gZSAhPSBsYXN0UnVuQ2hpbGQuRWxlbWVudHNBZnRlclNlbGYoKS5GaXJzdE9yRGVmYXVsdCgpKQorICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICAvLyBkZXRhdGNoIGZyb20gY3VycmVudCBwYXJlbnQKKyAgICAgICAgICAgICAgICBjb21tb25BbmNlc3Rvci5FbGVtZW50cygpLlJlbW92ZSgpOworCisgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3Q29udGVudENvbnRyb2wyID0gbmV3IFhFbGVtZW50KGNvbnRlbnRDb250cm9sLk5hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRDb250cm9sLkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgY29udGVudENvbnRyb2wuRWxlbWVudHMoKS5XaGVyZShlID0+IGUuTmFtZSAhPSBXLnNkdENvbnRlbnQpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5zZHRDb250ZW50LCBlbGVtZW50c0luUmFuZ2UpKTsKKworICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld0NvbnRlbnRDb250cm9sT3JkZXJlZDIgPSBuZXcgWEVsZW1lbnQobmV3Q29udGVudENvbnRyb2wyLk5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRDb250cm9sMi5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRDb250cm9sMi5FbGVtZW50cygpLk9yZGVyQnkoZSA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3JkZXJfc2R0LkNvbnRhaW5zS2V5KGUuTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9yZGVyX3NkdFtlLk5hbWVdOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDk5OTsKKyAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgICAgY29tbW9uQW5jZXN0b3IuQWRkKAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50c0JlZm9yZVJhbmdlLAorICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50Q29udHJvbE9yZGVyZWQyLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50c0FmdGVyUmFuZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ld0RvY3VtZW50OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxYTmFtZSwgaW50PiBPcmRlcl9zZHQgPSBuZXcgRGljdGlvbmFyeTxYTmFtZSwgaW50PgorICAgICAgICB7CisgICAgICAgICAgICB7IFcuc2R0UHIsIDEwIH0sCisgICAgICAgICAgICB7IFcuc2R0RW5kUHIsIDIwIH0sCisgICAgICAgICAgICB7IFcuc2R0Q29udGVudCwgMzAgfSwKKyAgICAgICAgICAgIHsgVy5ib29rbWFya1N0YXJ0LCA0MCB9LAorICAgICAgICAgICAgeyBXLmJvb2ttYXJrRW5kLCA1MCB9LAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEFjY2VwdERlbGV0ZWRBbmRNb3ZlRnJvbVBhcmFncmFwaE1hcmtzKFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFubm90YXRlUnVuRWxlbWVudHNXaXRoSWQoZWxlbWVudCk7CisgICAgICAgICAgICBBbm5vdGF0ZUNvbnRlbnRDb250cm9sc1dpdGhSdW5JZHMoZWxlbWVudCk7CisgICAgICAgICAgICBYRWxlbWVudCBuZXdFbGVtZW50ID0gKFhFbGVtZW50KUFjY2VwdERlbGV0ZWRBbmRNb3ZlRnJvbVBhcmFncmFwaE1hcmtzVHJhbnNmb3JtKGVsZW1lbnQpOworICAgICAgICAgICAgWEVsZW1lbnQgd2l0aEJsb2NrTGV2ZWxDb250ZW50Q29udHJvbHMgPSBBZGRCbG9ja0xldmVsQ29udGVudENvbnRyb2xzKG5ld0VsZW1lbnQsIGVsZW1lbnQpOworICAgICAgICAgICAgcmV0dXJuIHdpdGhCbG9ja0xldmVsQ29udGVudENvbnRyb2xzOworICAgICAgICB9CisKKyAgICAgICAgZW51bSBHcm91cGluZ1R5cGUKKyAgICAgICAgeworICAgICAgICAgICAgRGVsZXRlZFJhbmdlLAorICAgICAgICAgICAgT3RoZXIsCisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgR3JvdXBpbmdJbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBHcm91cGluZ1R5cGUgR3JvdXBpbmdUeXBlOworICAgICAgICAgICAgcHVibGljIGludCBHcm91cGluZ0tleTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQWNjZXB0RGVsZXRlZEFuZE1vdmVGcm9tUGFyYWdyYXBoTWFya3NUcmFuc2Zvcm0oWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChXLkJsb2NrTGV2ZWxDb250ZW50Q29udGFpbmVycy5Db250YWlucyhlbGVtZW50Lk5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgYm9keVNlY3RQciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5ib2R5KQorICAgICAgICAgICAgICAgICAgICAgICAgYm9keVNlY3RQciA9IGVsZW1lbnQuRWxlbWVudChXLnNlY3RQcik7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGN1cnJlbnRLZXkgPSAwOworICAgICAgICAgICAgICAgICAgICB2YXIgZGVsZXRlZFBhcmFncmFwaEdyb3VwaW5nSW5mbyA9IG5ldyBMaXN0PEdyb3VwaW5nSW5mbz4oKTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSAwOyAvLyAwID0gaW4gbm9uIGRlbGV0ZWQgcGFyYWdyYXBocworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxID0gaW4gZGVsZXRlZCBwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiAtIHBhcmFncmFwaCBmb2xsb3dpbmcgZGVsZXRlZCBwYXJhZ3JhcGhzCisKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGMgaW4gSXRlcmF0ZUJsb2NrQ29udGVudEVsZW1lbnRzKGVsZW1lbnQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5UaGlzQmxvY2tDb250ZW50RWxlbWVudC5OYW1lID09IFcucCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBhcmFncmFwaE1hcmtJc0RlbGV0ZWRPck1vdmVkRnJvbSA9IGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRoaXNCbG9ja0NvbnRlbnRFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnBQcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuclByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgPT0gVy5kZWwgfHwgZS5OYW1lID09IFcubW92ZUZyb20pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BbnkoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhZ3JhcGhNYXJrSXNEZWxldGVkT3JNb3ZlZEZyb20pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEtleSArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZFBhcmFncmFwaEdyb3VwaW5nSW5mby5BZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdyb3VwaW5nSW5mbygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBpbmdUeXBlID0gR3JvdXBpbmdUeXBlLkRlbGV0ZWRSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBpbmdLZXkgPSBjdXJyZW50S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZFBhcmFncmFwaEdyb3VwaW5nSW5mby5BZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdyb3VwaW5nSW5mbygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cGluZ1R5cGUgPSBHcm91cGluZ1R5cGUuRGVsZXRlZFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cGluZ0tleSA9IGN1cnJlbnRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50S2V5ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkUGFyYWdyYXBoR3JvdXBpbmdJbmZvLkFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgR3JvdXBpbmdJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwaW5nVHlwZSA9IEdyb3VwaW5nVHlwZS5EZWxldGVkUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwaW5nS2V5ID0gY3VycmVudEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50S2V5ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZWRQYXJhZ3JhcGhHcm91cGluZ0luZm8uQWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdyb3VwaW5nSW5mbygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBpbmdUeXBlID0gR3JvdXBpbmdUeXBlLk90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwaW5nS2V5ID0gY3VycmVudEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZFBhcmFncmFwaEdyb3VwaW5nSW5mby5BZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgR3JvdXBpbmdJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cGluZ1R5cGUgPSBHcm91cGluZ1R5cGUuRGVsZXRlZFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwaW5nS2V5ID0gY3VycmVudEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEtleSArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkUGFyYWdyYXBoR3JvdXBpbmdJbmZvLkFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBHcm91cGluZ0luZm8oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwaW5nVHlwZSA9IEdyb3VwaW5nVHlwZS5PdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cGluZ0tleSA9IGN1cnJlbnRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYy5UaGlzQmxvY2tDb250ZW50RWxlbWVudC5OYW1lID09IFcudGJsIHx8IGMuVGhpc0Jsb2NrQ29udGVudEVsZW1lbnQuTmFtZS5OYW1lc3BhY2UgPT0gTS5tKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRLZXkgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkUGFyYWdyYXBoR3JvdXBpbmdJbmZvLkFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdyb3VwaW5nSW5mbygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwaW5nVHlwZSA9IEdyb3VwaW5nVHlwZS5PdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwaW5nS2V5ID0gY3VycmVudEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBrZWVwIHRoZSBzYW1lIHN0YXRlLCBwdXQgaW4gdGhlIHNhbWUgZ3JvdXAsIGFuZCBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZWRQYXJhZ3JhcGhHcm91cGluZ0luZm8uQWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgR3JvdXBpbmdJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBpbmdUeXBlID0gR3JvdXBpbmdUeXBlLk90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBpbmdLZXkgPSBjdXJyZW50S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhciB6aXBwZWQgPSBJdGVyYXRlQmxvY2tDb250ZW50RWxlbWVudHMoZWxlbWVudCkuWmlwKGRlbGV0ZWRQYXJhZ3JhcGhHcm91cGluZ0luZm8sIChibGMsIGdpKSA9PiBuZXcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tMZXZlbENvbnRlbnQgPSBibGMsCisgICAgICAgICAgICAgICAgICAgICAgICBHcm91cGluZ0luZm8gPSBnaSwKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwZWRQYXJhZ3JhcGhzID0gemlwcGVkCisgICAgICAgICAgICAgICAgICAgICAgICAuR3JvdXBBZGphY2VudCh6ID0+IHouR3JvdXBpbmdJbmZvLkdyb3VwaW5nS2V5KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYmxvY2sgbGV2ZWwgY29udGVudCBjb250YWluZXIuCisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld0Jsb2NrTGV2ZWxDb250ZW50Q29udGFpbmVyID0gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cygpLldoZXJlKGUgPT4gZS5OYW1lID09IFcudGNQciksCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUGFyYWdyYXBocy5TZWxlY3QoKGcsIGkpID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuRmlyc3QoKS5Hcm91cGluZ0luZm8uR3JvdXBpbmdUeXBlID09IEdyb3VwaW5nVHlwZS5EZWxldGVkUmFuZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdQYXJhZ3JhcGggPSBuZXcgWEVsZW1lbnQoVy5wLAorI2lmIGZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2aW91c2x5LCB0aGlzIHdhcyBzZXQgdG8gZy5GaXJzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBob3dldmVyLCB0aGlzIGNhdXNlZCB0ZXN0IFtJbmxpbmVEYXRhKCJSUC9SUDA1Mi1EZWxldGVkLVBhcmEtTWFyay5kb2N4IildIHRvIGxvc2UgcGFyYWdyYXBoIG51bWJlcmluZyBmb3IgYSBwYXJhZ3JhcGggdGhhdCB3ZSBkaWQgbm90IHdhbnQgdG8gbG9vc2UgaXQgZm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHF1ZXN0aW9uIGlzIC0gd2hlbiBjb2FsZXNjaW5nIG11bHRpcGxlIHBhcmFncmFwaHMgZHVlIHRvIGRlbGV0ZWQgcGFyYWdyYXBoIG1hcmtzLCBzaG91bGQgd2UgYmUgdGFraW5nIHRoZSBwYXJhZ3JhcGggcHJvcGVydGllcyBmcm9tIHRoZSBmaXJzdCBvciB0aGUgbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIHNlcXVlbmNlIG9mIGNvYWxlc2NlZCBwYXJhZ3JhcGguICBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlIHNob3VsZCB0YWtlIExhc3Qgd2hlbiBhY2NlcHRpbmcgcmV2aXNpb25zLCBidXQgRmlyc3Qgd2hlbiByZWplY3RpbmcgcmV2aXNpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5GaXJzdCgpLkJsb2NrTGV2ZWxDb250ZW50LlRoaXNCbG9ja0NvbnRlbnRFbGVtZW50LkVsZW1lbnRzKFcucFByKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5MYXN0KCkuQmxvY2tMZXZlbENvbnRlbnQuVGhpc0Jsb2NrQ29udGVudEVsZW1lbnQuRWxlbWVudHMoVy5wUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5TZWxlY3QoeiA9PiBDb2xsYXBzZVBhcmFncmFwaFRyYW5zZm9ybSh6LkJsb2NrTGV2ZWxDb250ZW50LlRoaXNCbG9ja0NvbnRlbnRFbGVtZW50KSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgY29udGFpbnMgdGhlIGxhc3QgcGFyYWdyYXBoIGluIHRoZSBkb2N1bWVudCwgYW5kIGlmIHRoZXJlIGlzIG5vIGNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBpZiB0aGUgcGFyYWdyYXBoIG1hcmsgaXMgZGVsZXRlZCwgdGhlbiBudWtlIHRoZSBwYXJhZ3JhcGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbGxJc0RlbGV0ZWQgPSBBbGxQYXJhQ29udGVudElzRGVsZXRlZChuZXdQYXJhZ3JhcGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsSXNEZWxldGVkICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLkxhc3QoKS5CbG9ja0xldmVsQ29udGVudC5UaGlzQmxvY2tDb250ZW50RWxlbWVudC5FbGVtZW50cyhXLnBQcikuRWxlbWVudHMoVy5yUHIpLkVsZW1lbnRzKFcuZGVsKS5BbnkoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGcuTGFzdCgpLkJsb2NrTGV2ZWxDb250ZW50Lk5leHRCbG9ja0NvbnRlbnRFbGVtZW50ID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLkxhc3QoKS5CbG9ja0xldmVsQ29udGVudC5OZXh0QmxvY2tDb250ZW50RWxlbWVudC5OYW1lID09IFcudGJsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqZWN0KW5ld1BhcmFncmFwaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcuU2VsZWN0KHogPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0VsZSA9IG5ldyBYRWxlbWVudCh6LkJsb2NrTGV2ZWxDb250ZW50LlRoaXNCbG9ja0NvbnRlbnRFbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgei5CbG9ja0xldmVsQ29udGVudC5UaGlzQmxvY2tDb250ZW50RWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgei5CbG9ja0xldmVsQ29udGVudC5UaGlzQmxvY2tDb250ZW50RWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IEFjY2VwdERlbGV0ZWRBbmRNb3ZlRnJvbVBhcmFncmFwaE1hcmtzVHJhbnNmb3JtKG4pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3RWxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlTZWN0UHIpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdCbG9ja0xldmVsQ29udGVudENvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGlkZW50aXR5IGNsb25lLgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IEFjY2VwdERlbGV0ZWRBbmRNb3ZlRnJvbVBhcmFncmFwaE1hcmtzVHJhbnNmb3JtKG4pKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgcGFyYWdyYXBoIGNvbnRhaW5zIGFueSBjb250ZW50IHRoYXQgaXMgbm90IGRlbGV0ZWQuCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgQWxsUGFyYUNvbnRlbnRJc0RlbGV0ZWQoWEVsZW1lbnQgcCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbmVlZHMgY29sbGFwc2UKKyAgICAgICAgICAgIC8vIGRpciwgYmRvLCBzZHQsIGlucywgbW92ZVRvLCBzbWFydFRhZworICAgICAgICAgICAgdmFyIHRlc3RQID0gKFhFbGVtZW50KUNvbGxhcHNlVHJhbnNmb3JtKHApOworCisgICAgICAgICAgICB2YXIgY2hpbGRFbGVtZW50cyA9IHRlc3RQLkVsZW1lbnRzKCk7CisgICAgICAgICAgICB2YXIgY29udGVudEVsZW1lbnRzID0gY2hpbGRFbGVtZW50cworICAgICAgICAgICAgICAgIC5XaGVyZShjZSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBJc1J1bkNvbnRlbnQoY2UuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2wpYjsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IgMjAsIGZvdW5kIGVsZW1lbnQgIiArIGNlLk5hbWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoY29udGVudEVsZW1lbnRzLkFueSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGlyLCBiZG8sIHNkdCwgaW5zLCBtb3ZlVG8sIHNtYXJ0VGFnCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBDb2xsYXBzZVRyYW5zZm9ybShYTm9kZSBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLmRpciB8fAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgPT0gVy5iZHIgfHwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lID09IFcuaW5zIHx8CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTmFtZSA9PSBXLm1vdmVUbyB8fAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgPT0gVy5zbWFydFRhZykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuRWxlbWVudHMoKTsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5zZHQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LkVsZW1lbnRzKFcuc2R0Q29udGVudCkuRWxlbWVudHMoKTsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5wUHIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gQ29sbGFwc2VUcmFuc2Zvcm0obikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbD8gSXNSdW5Db250ZW50KFhOYW1lIGNlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaXMgY29udGVudAorICAgICAgICAgICAgLy8gciwgZmxkU2ltcGxlLCBoeXBlcmxpbmssIG9NYXRoLCBvTWF0aFBhcmEsIHN1YkRvYworICAgICAgICAgICAgaWYgKGNlTmFtZSA9PSBXLnIgfHwKKyAgICAgICAgICAgICAgICBjZU5hbWUgPT0gVy5mbGRTaW1wbGUgfHwKKyAgICAgICAgICAgICAgICBjZU5hbWUgPT0gVy5oeXBlcmxpbmsgfHwKKyAgICAgICAgICAgICAgICBjZU5hbWUgPT0gVy5zdWJEb2MgfHwKKyAgICAgICAgICAgICAgICBjZU5hbWUgPT0gVy5zbWFydFRhZyB8fAorICAgICAgICAgICAgICAgIGNlTmFtZSA9PSBXLnNtYXJ0VGFnUHIgfHwKKyAgICAgICAgICAgICAgICBjZU5hbWUuTmFtZXNwYWNlID09IE0ubSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgLy8gbm90IGNvbnRlbnQKKyAgICAgICAgICAgIC8vIGJvb2ttYXJrU3RhcnQsIGJvb2ttYXJrRW5kLCBjb21tZW50UmFuZ2VTdGFydCwgY29tbWVudFJhbmdlRW5kLCBkZWwsIG1vdmVGcm9tLCBwcm9vZkVycgorICAgICAgICAgICAgaWYgKGNlTmFtZSA9PSBXLmJvb2ttYXJrU3RhcnQgfHwKKyAgICAgICAgICAgICAgICBjZU5hbWUgPT0gVy5ib29rbWFya0VuZCB8fAorICAgICAgICAgICAgICAgIGNlTmFtZSA9PSBXLmNvbW1lbnRSYW5nZVN0YXJ0IHx8CisgICAgICAgICAgICAgICAgY2VOYW1lID09IFcuY29tbWVudFJhbmdlRW5kIHx8CisgICAgICAgICAgICAgICAgY2VOYW1lID09IFcuY3VzdG9tWG1sRGVsUmFuZ2VTdGFydCB8fAorICAgICAgICAgICAgICAgIGNlTmFtZSA9PSBXLmN1c3RvbVhtbERlbFJhbmdlRW5kIHx8CisgICAgICAgICAgICAgICAgY2VOYW1lID09IFcuY3VzdG9tWG1sSW5zUmFuZ2VTdGFydCB8fAorICAgICAgICAgICAgICAgIGNlTmFtZSA9PSBXLmN1c3RvbVhtbEluc1JhbmdlRW5kIHx8CisgICAgICAgICAgICAgICAgY2VOYW1lID09IFcuY3VzdG9tWG1sTW92ZUZyb21SYW5nZVN0YXJ0IHx8CisgICAgICAgICAgICAgICAgY2VOYW1lID09IFcuY3VzdG9tWG1sTW92ZUZyb21SYW5nZUVuZCB8fAorICAgICAgICAgICAgICAgIGNlTmFtZSA9PSBXLmN1c3RvbVhtbE1vdmVUb1JhbmdlU3RhcnQgfHwKKyAgICAgICAgICAgICAgICBjZU5hbWUgPT0gVy5jdXN0b21YbWxNb3ZlVG9SYW5nZUVuZCB8fAorICAgICAgICAgICAgICAgIGNlTmFtZSA9PSBXLmRlbCB8fAorICAgICAgICAgICAgICAgIGNlTmFtZSA9PSBXLm1vdmVGcm9tIHx8CisgICAgICAgICAgICAgICAgY2VOYW1lID09IFcubW92ZUZyb21SYW5nZVN0YXJ0IHx8CisgICAgICAgICAgICAgICAgY2VOYW1lID09IFcubW92ZUZyb21SYW5nZUVuZCB8fAorICAgICAgICAgICAgICAgIGNlTmFtZSA9PSBXLm1vdmVUb1JhbmdlU3RhcnQgfHwKKyAgICAgICAgICAgICAgICBjZU5hbWUgPT0gVy5tb3ZlVG9SYW5nZUVuZCB8fAorICAgICAgICAgICAgICAgIGNlTmFtZSA9PSBXLnBlcm1TdGFydCB8fAorICAgICAgICAgICAgICAgIGNlTmFtZSA9PSBXLnBlcm1FbmQgfHwKKyAgICAgICAgICAgICAgICBjZU5hbWUgPT0gVy5wcm9vZkVycikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSUVudW1lcmFibGU8VGFnPiBEZXNjZW5kYW50QW5kU2VsZlRhZ3MoWEVsZW1lbnQgZWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgeWllbGQgcmV0dXJuIG5ldyBUYWcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50ID0gZWxlbWVudCwKKyAgICAgICAgICAgICAgICBUYWdUeXBlID0gVGFnVHlwZUVudW0uRWxlbWVudAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIFN0YWNrPElFbnVtZXJhdG9yPFhFbGVtZW50Pj4gaXRlcmF0b3JTdGFjayA9IG5ldyBTdGFjazxJRW51bWVyYXRvcjxYRWxlbWVudD4+KCk7CisgICAgICAgICAgICBpdGVyYXRvclN0YWNrLlB1c2goZWxlbWVudC5FbGVtZW50cygpLkdldEVudW1lcmF0b3IoKSk7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3JTdGFjay5Db3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yU3RhY2suUGVlaygpLk1vdmVOZXh0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBjdXJyZW50WEVsZW1lbnQgPSBpdGVyYXRvclN0YWNrLlBlZWsoKS5DdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRYRWxlbWVudC5Ob2RlcygpLkFueSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gbmV3IFRhZygpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCA9IGN1cnJlbnRYRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWdUeXBlID0gVGFnVHlwZUVudW0uRW1wdHlFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIG5ldyBUYWcoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50ID0gY3VycmVudFhFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgVGFnVHlwZSA9IFRhZ1R5cGVFbnVtLkVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JTdGFjay5QdXNoKGN1cnJlbnRYRWxlbWVudC5FbGVtZW50cygpLkdldEVudW1lcmF0b3IoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpdGVyYXRvclN0YWNrLlBvcCgpOworICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvclN0YWNrLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIG5ldyBUYWcoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50ID0gaXRlcmF0b3JTdGFjay5QZWVrKCkuQ3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRhZ1R5cGUgPSBUYWdUeXBlRW51bS5FbmRFbGVtZW50CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5aWVsZCByZXR1cm4gbmV3IFRhZworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVsZW1lbnQgPSBlbGVtZW50LAorICAgICAgICAgICAgICAgIFRhZ1R5cGUgPSBUYWdUeXBlRW51bS5FbmRFbGVtZW50CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBQb3RlbnRpYWxJblJhbmdlRWxlbWVudHMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIExpc3Q8WEVsZW1lbnQ+IFBvdGVudGlhbFN0YXJ0RWxlbWVudFRhZ3NJblJhbmdlOworICAgICAgICAgICAgcHVibGljIExpc3Q8WEVsZW1lbnQ+IFBvdGVudGlhbEVuZEVsZW1lbnRUYWdzSW5SYW5nZTsKKworICAgICAgICAgICAgcHVibGljIFBvdGVudGlhbEluUmFuZ2VFbGVtZW50cygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUG90ZW50aWFsU3RhcnRFbGVtZW50VGFnc0luUmFuZ2UgPSBuZXcgTGlzdDxYRWxlbWVudD4oKTsKKyAgICAgICAgICAgICAgICBQb3RlbnRpYWxFbmRFbGVtZW50VGFnc0luUmFuZ2UgPSBuZXcgTGlzdDxYRWxlbWVudD4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZW51bSBUYWdUeXBlRW51bQorICAgICAgICB7CisgICAgICAgICAgICBFbGVtZW50LAorICAgICAgICAgICAgRW5kRWxlbWVudCwKKyAgICAgICAgICAgIEVtcHR5RWxlbWVudAorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBUYWcKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFhFbGVtZW50IEVsZW1lbnQ7CisgICAgICAgICAgICBwdWJsaWMgVGFnVHlwZUVudW0gVGFnVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBBY2NlcHREZWxldGVkQW5kTW92ZWRGcm9tQ29udGVudENvbnRyb2xzVHJhbnNmb3JtKFhOb2RlIG5vZGUsCisgICAgICAgICAgICBYRWxlbWVudFtdIGNvbnRlbnRDb250cm9sRWxlbWVudHNUb0NvbGxhcHNlLAorICAgICAgICAgICAgWEVsZW1lbnRbXSBtb3ZlRnJvbUVsZW1lbnRzVG9EZWxldGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuc2R0ICYmIGNvbnRlbnRDb250cm9sRWxlbWVudHNUb0NvbGxhcHNlLkNvbnRhaW5zKGVsZW1lbnQpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQoVy5zZHRDb250ZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLk5vZGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QobiA9PiBBY2NlcHREZWxldGVkQW5kTW92ZWRGcm9tQ29udGVudENvbnRyb2xzVHJhbnNmb3JtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4sIGNvbnRlbnRDb250cm9sRWxlbWVudHNUb0NvbGxhcHNlLCBtb3ZlRnJvbUVsZW1lbnRzVG9EZWxldGUpKTsKKyAgICAgICAgICAgICAgICBpZiAobW92ZUZyb21FbGVtZW50c1RvRGVsZXRlLkNvbnRhaW5zKGVsZW1lbnQpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBBY2NlcHREZWxldGVkQW5kTW92ZWRGcm9tQ29udGVudENvbnRyb2xzVHJhbnNmb3JtKAorICAgICAgICAgICAgICAgICAgICAgICAgbiwgY29udGVudENvbnRyb2xFbGVtZW50c1RvQ29sbGFwc2UsIG1vdmVGcm9tRWxlbWVudHNUb0RlbGV0ZSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgQWNjZXB0RGVsZXRlZEFuZE1vdmVkRnJvbUNvbnRlbnRDb250cm9scyhYRWxlbWVudCBkb2N1bWVudFJvb3RFbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgd29yZFByb2Nlc3NpbmdOYW1lc3BhY2VQcmVmaXggPSBkb2N1bWVudFJvb3RFbGVtZW50LkdldFByZWZpeE9mTmFtZXNwYWNlKFcudyk7CisKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbGlzdHMgY29udGFpbiB0aGUgZWxlbWVudHMgdGhhdCBhcmUgYmV0d2VlbiBzdGFydC9lbmQgZWxlbWVudHMuCisgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBzdGFydEVsZW1lbnRUYWdzSW5EZWxldGVSYW5nZSA9IG5ldyBMaXN0PFhFbGVtZW50PigpOworICAgICAgICAgICAgTGlzdDxYRWxlbWVudD4gZW5kRWxlbWVudFRhZ3NJbkRlbGV0ZVJhbmdlID0gbmV3IExpc3Q8WEVsZW1lbnQ+KCk7CisgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBzdGFydEVsZW1lbnRUYWdzSW5Nb3ZlRnJvbVJhbmdlID0gbmV3IExpc3Q8WEVsZW1lbnQ+KCk7CisgICAgICAgICAgICBMaXN0PFhFbGVtZW50PiBlbmRFbGVtZW50VGFnc0luTW92ZUZyb21SYW5nZSA9IG5ldyBMaXN0PFhFbGVtZW50PigpOworCisgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBlbGVtZW50cyB0aGF0ICptYXkqIGJlIGluIGEgcmFuZ2UgdGhhdCBoYXMgYm90aCBzdGFydCBhbmQgZW5kCisgICAgICAgICAgICAvLyBlbGVtZW50cy4KKyAgICAgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBQb3RlbnRpYWxJblJhbmdlRWxlbWVudHM+IHBvdGVudGlhbERlbGV0ZWRFbGVtZW50cyA9CisgICAgICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBQb3RlbnRpYWxJblJhbmdlRWxlbWVudHM+KCk7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PHN0cmluZywgUG90ZW50aWFsSW5SYW5nZUVsZW1lbnRzPiBwb3RlbnRpYWxNb3ZlRnJvbUVsZW1lbnRzID0KKyAgICAgICAgICAgICAgICBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIFBvdGVudGlhbEluUmFuZ2VFbGVtZW50cz4oKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRhZyBpbiBEZXNjZW5kYW50QW5kU2VsZlRhZ3MoZG9jdW1lbnRSb290RWxlbWVudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRhZy5FbGVtZW50Lk5hbWUgPT0gVy5jdXN0b21YbWxEZWxSYW5nZVN0YXJ0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGlkID0gdGFnLkVsZW1lbnQuQXR0cmlidXRlKFcuaWQpLlZhbHVlOworICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxEZWxldGVkRWxlbWVudHMuQWRkKGlkLCBuZXcgUG90ZW50aWFsSW5SYW5nZUVsZW1lbnRzKCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRhZy5FbGVtZW50Lk5hbWUgPT0gVy5jdXN0b21YbWxEZWxSYW5nZUVuZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZCA9IHRhZy5FbGVtZW50LkF0dHJpYnV0ZShXLmlkKS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvdGVudGlhbERlbGV0ZWRFbGVtZW50cy5Db250YWluc0tleShpZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RWxlbWVudFRhZ3NJbkRlbGV0ZVJhbmdlLkFkZFJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbERlbGV0ZWRFbGVtZW50c1tpZF0uUG90ZW50aWFsU3RhcnRFbGVtZW50VGFnc0luUmFuZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5kRWxlbWVudFRhZ3NJbkRlbGV0ZVJhbmdlLkFkZFJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbERlbGV0ZWRFbGVtZW50c1tpZF0uUG90ZW50aWFsRW5kRWxlbWVudFRhZ3NJblJhbmdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbERlbGV0ZWRFbGVtZW50cy5SZW1vdmUoaWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGFnLkVsZW1lbnQuTmFtZSA9PSBXLmN1c3RvbVhtbE1vdmVGcm9tUmFuZ2VTdGFydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZCA9IHRhZy5FbGVtZW50LkF0dHJpYnV0ZShXLmlkKS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsTW92ZUZyb21FbGVtZW50cy5BZGQoaWQsIG5ldyBQb3RlbnRpYWxJblJhbmdlRWxlbWVudHMoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGFnLkVsZW1lbnQuTmFtZSA9PSBXLmN1c3RvbVhtbE1vdmVGcm9tUmFuZ2VFbmQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaWQgPSB0YWcuRWxlbWVudC5BdHRyaWJ1dGUoVy5pZCkuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3RlbnRpYWxNb3ZlRnJvbUVsZW1lbnRzLkNvbnRhaW5zS2V5KGlkKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRFbGVtZW50VGFnc0luTW92ZUZyb21SYW5nZS5BZGRSYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxNb3ZlRnJvbUVsZW1lbnRzW2lkXS5Qb3RlbnRpYWxTdGFydEVsZW1lbnRUYWdzSW5SYW5nZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmRFbGVtZW50VGFnc0luTW92ZUZyb21SYW5nZS5BZGRSYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxNb3ZlRnJvbUVsZW1lbnRzW2lkXS5Qb3RlbnRpYWxFbmRFbGVtZW50VGFnc0luUmFuZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsTW92ZUZyb21FbGVtZW50cy5SZW1vdmUoaWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGFnLkVsZW1lbnQuTmFtZSA9PSBXLnNkdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWcuVGFnVHlwZSA9PSBUYWdUeXBlRW51bS5FbGVtZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaWQgaW4gcG90ZW50aWFsRGVsZXRlZEVsZW1lbnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLlZhbHVlLlBvdGVudGlhbFN0YXJ0RWxlbWVudFRhZ3NJblJhbmdlLkFkZCh0YWcuRWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaWQgaW4gcG90ZW50aWFsTW92ZUZyb21FbGVtZW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC5WYWx1ZS5Qb3RlbnRpYWxTdGFydEVsZW1lbnRUYWdzSW5SYW5nZS5BZGQodGFnLkVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhZy5UYWdUeXBlID09IFRhZ1R5cGVFbnVtLkVtcHR5RWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGlkIGluIHBvdGVudGlhbERlbGV0ZWRFbGVtZW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC5WYWx1ZS5Qb3RlbnRpYWxTdGFydEVsZW1lbnRUYWdzSW5SYW5nZS5BZGQodGFnLkVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLlZhbHVlLlBvdGVudGlhbEVuZEVsZW1lbnRUYWdzSW5SYW5nZS5BZGQodGFnLkVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGlkIGluIHBvdGVudGlhbE1vdmVGcm9tRWxlbWVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQuVmFsdWUuUG90ZW50aWFsU3RhcnRFbGVtZW50VGFnc0luUmFuZ2UuQWRkKHRhZy5FbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC5WYWx1ZS5Qb3RlbnRpYWxFbmRFbGVtZW50VGFnc0luUmFuZ2UuQWRkKHRhZy5FbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWcuVGFnVHlwZSA9PSBUYWdUeXBlRW51bS5FbmRFbGVtZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaWQgaW4gcG90ZW50aWFsRGVsZXRlZEVsZW1lbnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLlZhbHVlLlBvdGVudGlhbEVuZEVsZW1lbnRUYWdzSW5SYW5nZS5BZGQodGFnLkVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGlkIGluIHBvdGVudGlhbE1vdmVGcm9tRWxlbWVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQuVmFsdWUuUG90ZW50aWFsRW5kRWxlbWVudFRhZ3NJblJhbmdlLkFkZCh0YWcuRWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUG93ZXJUb29sc0ludmFsaWREYXRhRXhjZXB0aW9uKCJTaG91bGQgbm90IGhhdmUgcmVhY2hlZCB0aGlzIHBvaW50LiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocG90ZW50aWFsTW92ZUZyb21FbGVtZW50cy5Db3VudCgpID4gMCAmJgorICAgICAgICAgICAgICAgICAgICB0YWcuRWxlbWVudC5OYW1lICE9IFcubW92ZUZyb21SYW5nZVN0YXJ0ICYmCisgICAgICAgICAgICAgICAgICAgIHRhZy5FbGVtZW50Lk5hbWUgIT0gVy5tb3ZlRnJvbVJhbmdlRW5kICYmCisgICAgICAgICAgICAgICAgICAgIHRhZy5FbGVtZW50Lk5hbWUgIT0gVy5jdXN0b21YbWxNb3ZlRnJvbVJhbmdlU3RhcnQgJiYKKyAgICAgICAgICAgICAgICAgICAgdGFnLkVsZW1lbnQuTmFtZSAhPSBXLmN1c3RvbVhtbE1vdmVGcm9tUmFuZ2VFbmQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFnLlRhZ1R5cGUgPT0gVGFnVHlwZUVudW0uRWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGlkIGluIHBvdGVudGlhbE1vdmVGcm9tRWxlbWVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQuVmFsdWUuUG90ZW50aWFsU3RhcnRFbGVtZW50VGFnc0luUmFuZ2UuQWRkKHRhZy5FbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWcuVGFnVHlwZSA9PSBUYWdUeXBlRW51bS5FbXB0eUVsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpZCBpbiBwb3RlbnRpYWxNb3ZlRnJvbUVsZW1lbnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLlZhbHVlLlBvdGVudGlhbFN0YXJ0RWxlbWVudFRhZ3NJblJhbmdlLkFkZCh0YWcuRWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQuVmFsdWUuUG90ZW50aWFsRW5kRWxlbWVudFRhZ3NJblJhbmdlLkFkZCh0YWcuRWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodGFnLlRhZ1R5cGUgPT0gVGFnVHlwZUVudW0uRW5kRWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGlkIGluIHBvdGVudGlhbE1vdmVGcm9tRWxlbWVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQuVmFsdWUuUG90ZW50aWFsRW5kRWxlbWVudFRhZ3NJblJhbmdlLkFkZCh0YWcuRWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGNvbnRlbnRDb250cm9sRWxlbWVudHNUb0NvbGxhcHNlID0gc3RhcnRFbGVtZW50VGFnc0luRGVsZXRlUmFuZ2UKKyAgICAgICAgICAgICAgICAuSW50ZXJzZWN0KGVuZEVsZW1lbnRUYWdzSW5EZWxldGVSYW5nZSkKKyAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgdmFyIGVsZW1lbnRzVG9EZWxldGVCZWNhdXNlTW92ZWRGcm9tID0gc3RhcnRFbGVtZW50VGFnc0luTW92ZUZyb21SYW5nZQorICAgICAgICAgICAgICAgIC5JbnRlcnNlY3QoZW5kRWxlbWVudFRhZ3NJbk1vdmVGcm9tUmFuZ2UpCisgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIGlmIChjb250ZW50Q29udHJvbEVsZW1lbnRzVG9Db2xsYXBzZS5MZW5ndGggPiAwIHx8CisgICAgICAgICAgICAgICAgZWxlbWVudHNUb0RlbGV0ZUJlY2F1c2VNb3ZlZEZyb20uTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbmV3RG9jID0gQWNjZXB0RGVsZXRlZEFuZE1vdmVkRnJvbUNvbnRlbnRDb250cm9sc1RyYW5zZm9ybShkb2N1bWVudFJvb3RFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICBjb250ZW50Q29udHJvbEVsZW1lbnRzVG9Db2xsYXBzZSwgZWxlbWVudHNUb0RlbGV0ZUJlY2F1c2VNb3ZlZEZyb20pOworICAgICAgICAgICAgICAgIHJldHVybiBuZXdEb2MgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50Um9vdEVsZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQWNjZXB0TW92ZUZyb21SYW5nZXNUcmFuc2Zvcm0oWE5vZGUgbm9kZSwKKyAgICAgICAgICAgIFhFbGVtZW50W10gZWxlbWVudHNUb0RlbGV0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1RvRGVsZXRlLkNvbnRhaW5zKGVsZW1lbnQpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PgorICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0TW92ZUZyb21SYW5nZXNUcmFuc2Zvcm0obiwgZWxlbWVudHNUb0RlbGV0ZSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IENvYWxlc3F1ZVBhcmFncmFwaEVuZFRhZ3NJbk1vdmVGcm9tVHJhbnNmb3JtKFhOb2RlIG5vZGUsCisgICAgICAgICAgICBJR3JvdXBpbmc8TW92ZUZyb21Db2xsZWN0aW9uVHlwZSwgWEVsZW1lbnQ+IGcpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcucCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLnAsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGcuU2tpcCgxKS5TZWxlY3QocCA9PiBDb2xsYXBzZVBhcmFncmFwaFRyYW5zZm9ybShwKSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvYWxlc3F1ZVBhcmFncmFwaEVuZFRhZ3NJbk1vdmVGcm9tVHJhbnNmb3JtKG4sIGcpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZW51bSBEZWxldGVkQ2VsbENvbGxlY3Rpb25UeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIERlbGV0ZWRDZWxsLAorICAgICAgICAgICAgT3RoZXIKKyAgICAgICAgfTsKKworICAgICAgICAvLyBGb3IgZWFjaCB0YWJsZSByb3csIGdyb3VwIGRlbGV0ZWQgY2VsbHMgcGx1cyB0aGUgY2VsbCBiZWZvcmUgYW55IGRlbGV0ZWQgY2VsbC4KKyAgICAgICAgLy8gUHJvZHVjZSBhIG5ldyBjZWxsIHRoYXQgaGFzIGdyaWRTcGFuIHNldCBhcHByb3ByaWF0ZWx5IGZvciBncm91cCwgYW5kIGNsb25lIGV2ZXJ5dGhpbmcKKyAgICAgICAgLy8gZWxzZS4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IEFjY2VwdERlbGV0ZWRDZWxsc1RyYW5zZm9ybShYTm9kZSBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwZWRDZWxscyA9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAuR3JvdXBBZGphY2VudChlID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgY2VsbEFmdGVyID0gZS5FbGVtZW50c0FmdGVyU2VsZihXLnRjKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2VsbEFmdGVySXNEZWxldGVkID0gY2VsbEFmdGVyICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbEFmdGVyLkRlc2NlbmRhbnRzKFcuY2VsbERlbCkuQW55KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuTmFtZSA9PSBXLnRjICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsQWZ0ZXJJc0RlbGV0ZWQgfHwgZS5EZXNjZW5kYW50cyhXLmNlbGxEZWwpLkFueSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbmV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25UeXBlID0gRGVsZXRlZENlbGxDb2xsZWN0aW9uVHlwZS5EZWxldGVkQ2VsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FtYmlndWF0b3IgPSBuZXdbXSB7IGUgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Db25jYXQoZS5TaWJsaW5nc0JlZm9yZVNlbGZSZXZlcnNlRG9jdW1lbnRPcmRlcigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZSh6ID0+IHouTmFtZSA9PSBXLnRjICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF6LkRlc2NlbmRhbnRzKFcuY2VsbERlbCkuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhMiA9IG5ldworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvblR5cGUgPSBEZWxldGVkQ2VsbENvbGxlY3Rpb25UeXBlLk90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhbWJpZ3VhdG9yID0gZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEyOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIHZhciB0ciA9IG5ldyBYRWxlbWVudChXLnRyLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkQ2VsbHMuU2VsZWN0KGcgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZy5LZXkuQ29sbGVjdGlvblR5cGUgPT0gRGVsZXRlZENlbGxDb2xsZWN0aW9uVHlwZS5EZWxldGVkQ2VsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBnLkZpcnN0KCkuRGVzY2VuZGFudHMoVy5jZWxsRGVsKS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuS2V5LkNvbGxlY3Rpb25UeXBlID09IERlbGV0ZWRDZWxsQ29sbGVjdGlvblR5cGUuT3RoZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqZWN0KWc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgZ3JpZFNwYW5FbGVtZW50ID0gZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy50Y1ByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5ncmlkU3BhbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyaWRTcGFuID0gZ3JpZFNwYW5FbGVtZW50ICE9IG51bGwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWdyaWRTcGFuRWxlbWVudC5BdHRyaWJ1dGUoVy52YWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3R3JpZFNwYW4gPSBncmlkU3BhbiArIGcuQ291bnQoKSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgY3VycmVudFRjUHIgPSBnLkZpcnN0KCkuRWxlbWVudHMoVy50Y1ByKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld1RjUHIgPSBuZXcgWEVsZW1lbnQoVy50Y1ByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGNQciAhPSBudWxsID8gY3VycmVudFRjUHIuQXR0cmlidXRlcygpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuZ3JpZFNwYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgbmV3R3JpZFNwYW4pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRjUHIuRWxlbWVudHMoKS5XaGVyZShlID0+IGUuTmFtZSAhPSBXLmdyaWRTcGFuKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9yZGVyZWRUY1ByID0gbmV3IFhFbGVtZW50KFcudGNQciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGNQci5FbGVtZW50cygpLk9yZGVyQnkoZSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3JkZXJfdGNQci5Db250YWluc0tleShlLk5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcmRlcl90Y1ByW2UuTmFtZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3VGMgPSBuZXcgWEVsZW1lbnQoVy50YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZFRjUHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuRmlyc3QoKS5FbGVtZW50cygpLldoZXJlKGUgPT4gZS5OYW1lICE9IFcudGNQcikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqZWN0KW5ld1RjOworICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWRlbnRpdHkgY2xvbmUKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBBY2NlcHREZWxldGVkQ2VsbHNUcmFuc2Zvcm0obikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyNpZiBmYWxzZQorICAgICAgPHc6dHI+CisgICAgICAgIDx3OnRjPgorICAgICAgICAgIDx3OnRjUHI+CisgICAgICAgICAgICA8dzp0Y1cgdzp3PSI1MDE2IgorICAgICAgICAgICAgICAgICAgIHc6dHlwZT0iZHhhIiAvPgorICAgICAgICAgIDwvdzp0Y1ByPgorICAgICAgICA8L3c6dGM+CisgICAgICA8L3c6dHI+CisjZW5kaWYKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWE5hbWVbXSBCbG9ja0xldmVsRWxlbWVudHMgPSBuZXdbXSB7CisgICAgICAgICAgICBXLnAsCisgICAgICAgICAgICBXLnRibCwKKyAgICAgICAgICAgIFcuc2R0LAorICAgICAgICAgICAgVy5kZWwsCisgICAgICAgICAgICBXLmlucywKKyAgICAgICAgICAgIE0ub01hdGgsCisgICAgICAgICAgICBNLm9NYXRoUGFyYSwKKyAgICAgICAgICAgIFcubW92ZVRvLAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBSZW1vdmVSb3dzTGVmdEVtcHR5QnlNb3ZlRnJvbShYTm9kZSBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5vbkVtcHR5Q2VsbHMgPSBlbGVtZW50LkVsZW1lbnRzKFcudGMpLkFueSh0YyA9PiB0Yy5FbGVtZW50cygpLkFueSh0Y2MgPT4gQmxvY2tMZXZlbEVsZW1lbnRzLkNvbnRhaW5zKHRjYy5OYW1lKSkpOworICAgICAgICAgICAgICAgICAgICBpZiAobm9uRW1wdHlDZWxscykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFJlbW92ZVJvd3NMZWZ0RW1wdHlCeU1vdmVGcm9tKG4pKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gUmVtb3ZlUm93c0xlZnRFbXB0eUJ5TW92ZUZyb20obikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTmFtZVtdIFRyYWNrZWRSZXZpc2lvbnNFbGVtZW50cyA9IG5ld1tdCisgICAgICAgIHsKKyAgICAgICAgICAgIFcuY2VsbERlbCwKKyAgICAgICAgICAgIFcuY2VsbElucywKKyAgICAgICAgICAgIFcuY2VsbE1lcmdlLAorICAgICAgICAgICAgVy5jdXN0b21YbWxEZWxSYW5nZUVuZCwKKyAgICAgICAgICAgIFcuY3VzdG9tWG1sRGVsUmFuZ2VTdGFydCwKKyAgICAgICAgICAgIFcuY3VzdG9tWG1sSW5zUmFuZ2VFbmQsCisgICAgICAgICAgICBXLmN1c3RvbVhtbEluc1JhbmdlU3RhcnQsCisgICAgICAgICAgICBXLmRlbCwKKyAgICAgICAgICAgIFcuZGVsSW5zdHJUZXh0LAorICAgICAgICAgICAgVy5kZWxUZXh0LAorICAgICAgICAgICAgVy5pbnMsCisgICAgICAgICAgICBXLm1vdmVGcm9tLAorICAgICAgICAgICAgVy5tb3ZlRnJvbVJhbmdlRW5kLAorICAgICAgICAgICAgVy5tb3ZlRnJvbVJhbmdlU3RhcnQsCisgICAgICAgICAgICBXLm1vdmVUbywKKyAgICAgICAgICAgIFcubW92ZVRvUmFuZ2VFbmQsCisgICAgICAgICAgICBXLm1vdmVUb1JhbmdlU3RhcnQsCisgICAgICAgICAgICBXLm51bWJlcmluZ0NoYW5nZSwKKyAgICAgICAgICAgIFcucFByQ2hhbmdlLAorICAgICAgICAgICAgVy5yUHJDaGFuZ2UsCisgICAgICAgICAgICBXLnNlY3RQckNoYW5nZSwKKyAgICAgICAgICAgIFcudGJsR3JpZENoYW5nZSwKKyAgICAgICAgICAgIFcudGJsUHJDaGFuZ2UsCisgICAgICAgICAgICBXLnRibFByRXhDaGFuZ2UsCisgICAgICAgICAgICBXLnRjUHJDaGFuZ2UsCisgICAgICAgICAgICBXLnRyUHJDaGFuZ2UsCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIFBhcnRIYXNUcmFja2VkUmV2aXNpb25zKE9wZW5YbWxQYXJ0IHBhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJ0LkdldFhEb2N1bWVudCgpCisgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAuQW55KGUgPT4gVHJhY2tlZFJldmlzaW9uc0VsZW1lbnRzLkNvbnRhaW5zKGUuTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEhhc1RyYWNrZWRSZXZpc2lvbnMoV21sRG9jdW1lbnQgZG9jdW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgc3RyZWFtRG9jID0gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudChkb2N1bWVudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd2RvYyA9IHN0cmVhbURvYy5HZXRXb3JkcHJvY2Vzc2luZ0RvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmV2aXNpb25BY2NlcHRlci5IYXNUcmFja2VkUmV2aXNpb25zKHdkb2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBIYXNUcmFja2VkUmV2aXNpb25zKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUGFydEhhc1RyYWNrZWRSZXZpc2lvbnMoZG9jLk1haW5Eb2N1bWVudFBhcnQpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gZG9jLk1haW5Eb2N1bWVudFBhcnQuSGVhZGVyUGFydHMpCisgICAgICAgICAgICAgICAgaWYgKFBhcnRIYXNUcmFja2VkUmV2aXNpb25zKHBhcnQpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYXJ0IGluIGRvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3RlclBhcnRzKQorICAgICAgICAgICAgICAgIGlmIChQYXJ0SGFzVHJhY2tlZFJldmlzaW9ucyhwYXJ0KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoZG9jLk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgaWYgKFBhcnRIYXNUcmFja2VkUmV2aXNpb25zKGRvYy5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKGRvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpZiAoUGFydEhhc1RyYWNrZWRSZXZpc2lvbnMoZG9jLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHBhcnRpYWwgY2xhc3MgV21sRG9jdW1lbnQgOiBPcGVuWG1sUG93ZXJUb29sc0RvY3VtZW50CisgICAgeworICAgICAgICBwdWJsaWMgV21sRG9jdW1lbnQgQWNjZXB0UmV2aXNpb25zKFdtbERvY3VtZW50IGRvY3VtZW50KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmV2aXNpb25BY2NlcHRlci5BY2NlcHRSZXZpc2lvbnMoZG9jdW1lbnQpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIEhhc1RyYWNrZWRSZXZpc2lvbnMoV21sRG9jdW1lbnQgZG9jdW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZXZpc2lvbkFjY2VwdGVyLkhhc1RyYWNrZWRSZXZpc2lvbnMoZG9jdW1lbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIEJsb2NrQ29udGVudEluZm8KKyAgICB7CisgICAgICAgIHB1YmxpYyBYRWxlbWVudCBQcmV2aW91c0Jsb2NrQ29udGVudEVsZW1lbnQ7CisgICAgICAgIHB1YmxpYyBYRWxlbWVudCBUaGlzQmxvY2tDb250ZW50RWxlbWVudDsKKyAgICAgICAgcHVibGljIFhFbGVtZW50IE5leHRCbG9ja0NvbnRlbnRFbGVtZW50OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmV2aXNpb25BY2NlcHRlckV4dGVuc2lvbnMKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZVBhcmFncmFwaEluZm8oWEVsZW1lbnQgY29udGVudENvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghKFcuQmxvY2tMZXZlbENvbnRlbnRDb250YWluZXJzLkNvbnRhaW5zKGNvbnRlbnRDb250ZXh0Lk5hbWUpKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJHZXRQYXJhZ3JhcGhJbmZvIGNhbGxlZCBmb3IgZWxlbWVudCB0aGF0IGlzIG5vdCBjaGlsZCBvZiBjb250ZW50IGNvbnRhaW5lciIpOworICAgICAgICAgICAgWEVsZW1lbnQgcHJldiA9IG51bGw7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgY29udGVudCBpbiBjb250ZW50Q29udGV4dC5FbGVtZW50cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF5IHJldHVybiBudWxsLCBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgaXMgbm8gZGVzY2VuZGFudCBwYXJhZ3JhcGguICBGb3IKKyAgICAgICAgICAgICAgICAvLyBleGFtcGxlLCBjb21tZW50IGVsZW1lbnRzIGhhdmUgbm8gZGVzY2VuZGFudCBlbGVtZW50cy4KKyAgICAgICAgICAgICAgICBYRWxlbWVudCBwYXJhZ3JhcGggPSBjb250ZW50CisgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50c0FuZFNlbGYoKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgPT0gVy5wIHx8IGUuTmFtZSA9PSBXLnRjIHx8IGUuTmFtZSA9PSBXLnR4YnhDb250ZW50KQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYWdyYXBoICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgKHBhcmFncmFwaC5OYW1lID09IFcudGMgfHwgcGFyYWdyYXBoLk5hbWUgPT0gVy50eGJ4Q29udGVudCkpCisgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaCA9IG51bGw7CisgICAgICAgICAgICAgICAgQmxvY2tDb250ZW50SW5mbyBwaSA9IG5ldyBCbG9ja0NvbnRlbnRJbmZvKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFByZXZpb3VzQmxvY2tDb250ZW50RWxlbWVudCA9IHByZXYsCisgICAgICAgICAgICAgICAgICAgIFRoaXNCbG9ja0NvbnRlbnRFbGVtZW50ID0gcGFyYWdyYXBoCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBjb250ZW50LkFkZEFubm90YXRpb24ocGkpOworICAgICAgICAgICAgICAgIHByZXYgPSBjb250ZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBCbG9ja0NvbnRlbnRJbmZvIEdldFBhcmFncmFwaEluZm8odGhpcyBYRWxlbWVudCBjb250ZW50RWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgQmxvY2tDb250ZW50SW5mbyBwYXJhZ3JhcGhJbmZvID0gY29udGVudEVsZW1lbnQuQW5ub3RhdGlvbjxCbG9ja0NvbnRlbnRJbmZvPigpOworICAgICAgICAgICAgaWYgKHBhcmFncmFwaEluZm8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFyYWdyYXBoSW5mbzsKKyAgICAgICAgICAgIEluaXRpYWxpemVQYXJhZ3JhcGhJbmZvKGNvbnRlbnRFbGVtZW50LlBhcmVudCk7CisgICAgICAgICAgICByZXR1cm4gY29udGVudEVsZW1lbnQuQW5ub3RhdGlvbjxCbG9ja0NvbnRlbnRJbmZvPigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxYRWxlbWVudD4gQ29udGVudEVsZW1lbnRzQmVmb3JlU2VsZih0aGlzIFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGN1cnJlbnQgPSBlbGVtZW50OworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQmxvY2tDb250ZW50SW5mbyBwaSA9IGN1cnJlbnQuR2V0UGFyYWdyYXBoSW5mbygpOworICAgICAgICAgICAgICAgIGlmIChwaS5QcmV2aW91c0Jsb2NrQ29udGVudEVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgYnJlYWs7CisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIHBpLlByZXZpb3VzQmxvY2tDb250ZW50RWxlbWVudDsKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gcGkuUHJldmlvdXNCbG9ja0NvbnRlbnRFbGVtZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLy8gTWFya3VwIHRoYXQgdGhpcyBjb2RlIHByb2Nlc3NlczoKKy8vLyAKKy8vLyBkZWxUZXh0CisvLy8gICBNZXRob2Q6IEFjY2VwdEFsbE90aGVyUmV2aXNpb25zVHJhbnNmb3JtCisvLy8gICBTYW1wbGUgZG9jdW1lbnQ6IE1vdmVkVGV4dC5kb2N4CisvLy8gICBSZXZpZXdlZDogemV5YWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gICBTZW1hbnRpY3M6CisvLy8gICAgIFJlbW92ZSB0aGVzZSBlbGVtZW50cy4KKy8vLyAgIFJlamVjdDoKKy8vLyAgICAgVHJhbnNmb3JtIHRvIHc6dCBlbGVtZW50CisvLy8gCisvLy8gZGVsIChkZWxldGVkIHJ1biBjb250ZW50KQorLy8vICAgTWV0aG9kOiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybQorLy8vICAgUmV2aWV3ZWQ6IHpleWFkICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8vICAgU2VtYW50aWNzOgorLy8vICAgICBSZW1vdmUgdGhlc2UgZWxlbWVudHMgYW5kIGRlc2NlbmRhbnQgZWxlbWVudHMuCisvLy8gICBSZWplY3Q6CisvLy8gICAgIFRyYW5zZm9ybSB0byB3OmlucyBlbGVtZW50CisvLy8gICAgIFRoZW4gQWNjZXB0CisvLy8gICAKKy8vLyBpbnMgKGluc2VydGVkIHJ1biBjb250ZW50KQorLy8vICAgTWV0aG9kOiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybQorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBJbnNlcnRlZFBhcmFncmFwaHNBbmRSdW5zLmRvY3gKKy8vLyAgIFJldmlld2VkOiB6ZXlhZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLyAgIFNlbWFudGljczoKKy8vLyAgICAgQ29sbGFwc2UgdGhlc2UgZWxlbWVudHMuCisvLy8gICBSZWplY3Q6CisvLy8gICAgIFRyYW5zZm9ybSB0byB3OmRlbCBlbGVtZW50LCBhbmQgY2hpbGQgdzp0IHRyYW5zZm9ybSB0byB3OmRlbFRleHQgZWxlbWVudAorLy8vICAgICBUaGVuIEFjY2VwdAorLy8vIAorLy8vIGlucyAoaW5zZXJ0ZWQgcGFyYWdyYXBoKQorLy8vICAgTWV0aG9kOiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybQorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBJbnNlcnRlZFBhcmFncmFwaHNBbmRSdW5zLmRvY3gKKy8vLyAgIFJldmlld2VkOiB6ZXlhZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLyAgIFNlbWFudGljczoKKy8vLyAgICAgUmVtb3ZlIHRoZXNlIGVsZW1lbnRzLgorLy8vICAgUmVqZWN0OgorLy8vICAgICBUcmFuc2Zvcm0gdG8gdzpkZWwgZWxlbWVudAorLy8vICAgICBUaGVuIEFjY2VwdAorLy8vICAgCisvLy8gZGVsIChkZWxldGVkIHBhcmFncmFwaCBtYXJrKQorLy8vICAgTWV0aG9kOiBBY2NlcHREZWxldGVkQW5kTW92ZUZyb21QYXJhZ3JhcGhNYXJrc1RyYW5zZm9ybQorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBWYXJpb3VzVGFibGVSZXZpc2lvbnMuZG9jeCAoZGVsZXRlZCBwYXJhZ3JhcGggbWFyayBpbiBwYXJhZ3JhcGggaW4KKy8vLyAgICAgY29udGVudCBjb250cm9sKQorLy8vICAgUmV2aWV3ZWQ6IHRyaXN0YW4gYW5kIHpleWFkICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLyAgIFNlbWFudGljczoKKy8vLyAgICAgRmluZCBhbGwgYWRqYWNlbnQgcGFyYWdyYXBzIHRoYXQgaGF2ZSB0aGlzIGVsZW1lbnQuCisvLy8gICAgIEdyb3VwIGFkamFjZW50IHBhcmFncmFwaHMgcGx1cyB0aGUgcGFyYWdyYXBoIGZvbGxvd2luZyBwYXJhZ3JhcGggdGhhdCBoYXMgdGhpcyBlbGVtZW50LgorLy8vICAgICBSZXBsYWNlIGdyb3VwZWQgcGFyYWdyYXBocyB3aXRoIGEgbmV3IHBhcmFncmFwaCBjb250YWluaW5nIHRoZSBjb250ZW50IGZyb20gYWxsIGdyb3VwZWQKKy8vLyAgICAgICBwYXJhZ3JhcGhzLiAgVXNlIHRoZSBwYXJhZ3JhcGggcHJvcGVydGllcyBmcm9tIHRoZSBmaXJzdCBwYXJhZ3JhcGggaW4gdGhlIGdyb3VwLgorLy8vICAgUmVqZWN0OgorLy8vICAgICBUcmFuc2Zvcm0gdG8gdzppbnMgZWxlbWVudAorLy8vICAgICBUaGVuIEFjY2VwdAorLy8vIAorLy8vIGRlbCAoZGVsZXRlZCB0YWJsZSByb3cpCisvLy8gICBNZXRob2Q6IEFjY2VwdEFsbE90aGVyUmV2aXNpb25zVHJhbnNmb3JtCisvLy8gICBTYW1wbGUgZG9jdW1lbnQ6IFZhcmlvdXNUYWJsZVJldmlzaW9ucy5kb2N4IAorLy8vICAgUmV2aWV3ZWQ6IHpleWFkICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8vICAgU2VtYW50aWNzOgorLy8vICAgICBNYXRjaCB3OnRyL3c6dHJQci93OmRlbCwgcmVtb3ZlIHc6dHIuCisvLy8gICBSZWplY3Q6CisvLy8gICAgIFRyYW5zZm9ybSB0byB3OmlucworLy8vICAgICBUaGVuIEFjY2VwdAorLy8vIAorLy8vIGlucyAoaW5zZXJ0ZWQgdGFibGUgcm93KQorLy8vICAgTWV0aG9kOiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybQorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBWYXJpb3VzVGFibGVSZXZpc2lvbnMuZG9jeAorLy8vICAgUmV2aWV3ZWQ6IHpleWFkICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8vICAgU2VtYW50aWNzOgorLy8vICAgICBSZW1vdmUgdGhlc2UgZWxlbWVudHMuCisvLy8gICBSZWplY3Q6CisvLy8gICAgIFRyYW5zZm9ybSB0byB3OmRlbAorLy8vICAgICBUaGVuIEFjY2VwdAorLy8vIAorLy8vIGRlbCAoZGVsZXRlZCBtYXRoIGNvbnRyb2wgY2hhcmFjdGVyKQorLy8vICAgTWV0aG9kOiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybQorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBEZWxldGVkTWF0aENvbnRyb2xDaGFyYWN0ZXIuZG9jeAorLy8vICAgUmV2aWV3ZWQ6IHpleWFkICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8vICAgU2VtYW50aWNzOgorLy8vICAgICBNYXRjaCBtOmYvbTpmUHIvbTpjdHJsUHIvdzpkZWwsIHJlbW92ZSBtOmYuCisvLy8gICBSZWplY3Q6CisvLy8gICAgIFRyYW5zZm9ybSB0byB3OmlucworLy8vICAgICBUaGVuIEFjY2VwdAorLy8vIAorLy8vIGlucyAoaW5zZXJ0ZWQgbWF0aCBjb250cm9sIGNoYXJhY3RlcikKKy8vLyAgIE1ldGhvZDogQWNjZXB0QWxsT3RoZXJSZXZpc2lvbnNUcmFuc2Zvcm0KKy8vLyAgIFNhbXBsZSBkb2N1bWVudDogSW5zZXJ0ZWRNYXRoQ29udHJvbENoYXJhY3Rlci5kb2N4CisvLy8gICBSZXZpZXdlZDogemV5YWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gICBTZW1hbnRpY3M6CisvLy8gICAgIFJlbW92ZSB0aGVzZSBlbGVtZW50cy4KKy8vLyAgIFJlamVjdDoKKy8vLyAgICAgVHJhbnNmb3JtIHRvIHc6ZGVsCisvLy8gICAgIFRoZW4gQWNjZXB0CisvLy8gICAKKy8vLyBtb3ZlVG8gKG1vdmUgZGVzdGluYXRpb24gcGFyYWdyYXBoIG1hcmspCisvLy8gICBNZXRob2Q6IEFjY2VwdE1vdmVGcm9tTW92ZVRvVHJhbnNmb3JtCisvLy8gICBTYW1wbGUgZG9jdW1lbnQ6IE1vdmVkVGV4dC5kb2N4CisvLy8gICBSZXZpZXdlZDogemV5YWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gICBTZW1hbnRpY3M6CisvLy8gICAgIFJlbW92ZSB0aGVzZSBlbGVtZW50cy4KKy8vLyAgIFJlamVjdDoKKy8vLyAgICAgVHJhbnNmb3JtIHRvIG1vdmVGcm9tCisvLy8gICAgIFRoZW4gQWNjZXB0CisvLy8gICAKKy8vLyBtb3ZlVG8gKG1vdmUgZGVzdGluYXRpb24gcnVuIGNvbnRlbnQpCisvLy8gICBNZXRob2Q6IEFjY2VwdE1vdmVGcm9tTW92ZVRvVHJhbnNmb3JtCisvLy8gICBTYW1wbGUgZG9jdW1lbnQ6IE1vdmVkVGV4dC5kb2N4CisvLy8gICBSZXZpZXdlZDogemV5YWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gICBTZW1hbnRpY3M6CisvLy8gICAgIENvbGxhcHNlIHRoZXNlIGVsZW1lbnRzLgorLy8vICAgUmVqZWN0OgorLy8vICAgICBUcmFuc2Zvcm0gdG8gbW92ZUZyb20KKy8vLyAgICAgVGhlbiBBY2NlcHQKKy8vLyAKKy8vLyBtb3ZlRnJvbSAobW92ZSBzb3VyY2UgcGFyYWdyYXBoIG1hcmspCisvLy8gICBNZXRob2RzOiBBY2NlcHREZWxldGVkQW5kTW92ZUZyb21QYXJhZ3JhcGhNYXJrc1RyYW5zZm9ybSwgQWNjZXB0UGFyYWdyYXBoRW5kVGFnc0luTW92ZUZyb21UcmFuc2Zvcm0KKy8vLyAgIFNhbXBsZSBkb2N1bWVudDogTW92ZWRUZXh0LmRvY3gKKy8vLyAgIFJldmlld2VkOiB0cmlzdGFuIGFuZCB6ZXlhZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gICBTZW1hbnRpY3M6CisvLy8gICAgIEZpbmQgYWxsIGFkamFjZW50IHBhcmFncmFwcyB0aGF0IGhhdmUgdGhpcyBlbGVtZW50IG9yIGRlbGV0ZWQgcGFyYWdyYXBoIG1hcmsuCisvLy8gICAgIEdyb3VwIGFkamFjZW50IHBhcmFncmFwaHMgcGx1cyB0aGUgcGFyYWdyYXBoIGZvbGxvd2luZyBwYXJhZ3JhcGggdGhhdCBoYXMgdGhpcyBlbGVtZW50LgorLy8vICAgICBSZXBsYWNlIGdyb3VwZWQgcGFyYWdyYXBocyB3aXRoIGEgbmV3IHBhcmFncmFwaCBjb250YWluaW5nIHRoZSBjb250ZW50IGZyb20gYWxsIGdyb3VwZWQKKy8vLyAgICAgICBwYXJhZ3JhcGhzLgorLy8vICAgICBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIHNhbWUgY29kZSB0aGF0IGhhbmRsZXMgZGVsIChkZWxldGVkIHBhcmFncmFwaCBtYXJrKS4KKy8vLyAgIFJlamVjdDoKKy8vLyAgICAgVHJhbnNmb3JtIHRvIG1vdmVUbworLy8vICAgICBUaGVuIEFjY2VwdAorLy8vIAorLy8vIG1vdmVGcm9tIChtb3ZlIHNvdXJjZSBydW4gY29udGVudCkKKy8vLyAgIE1ldGhvZDogQWNjZXB0TW92ZUZyb21Nb3ZlVG9UcmFuc2Zvcm0KKy8vLyAgIFNhbXBsZSBkb2N1bWVudDogTW92ZWRUZXh0LmRvY3gKKy8vLyAgIFJldmlld2VkOiB6ZXlhZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLyAgIFNlbWFudGljczoKKy8vLyAgICAgUmVtb3ZlIHRoZXNlIGVsZW1lbnRzLgorLy8vICAgUmVqZWN0OgorLy8vICAgICBUcmFuc2Zvcm0gdG8gbW92ZVRvCisvLy8gICAgIFRoZW4gQWNjZXB0CisvLy8gCisvLy8gbW92ZUZyb21SYW5nZVN0YXJ0CisvLy8gbW92ZUZyb21SYW5nZUVuZAorLy8vICAgTWV0aG9kOiBBY2NlcHRNb3ZlRnJvbVJhbmdlcworLy8vICAgU2FtcGxlIGRvY3VtZW50OiBNb3ZlZFRleHQuZG9jeAorLy8vICAgU2VtYW50aWNzOgorLy8vICAgICBGaW5kIHBhaXJzIG9mIGVsZW1lbnRzLiAgUmVtb3ZlIGFsbCBlbGVtZW50cyB0aGF0IGhhdmUgYm90aCBzdGFydCBhbmQgZW5kIHRhZ3MgaW4gYQorLy8vICAgICAgIHJhbmdlLgorLy8vICAgUmVqZWN0OgorLy8vICAgICBUcmFuc2Zvcm0gdG8gbW92ZVRvUmFuZ2VTdGFydCwgbW92ZVRvUmFuZ2VFbmQKKy8vLyAgICAgVGhlbiBBY2NlcHQKKy8vLyAKKy8vLyBtb3ZlVG9SYW5nZVN0YXJ0CisvLy8gbW92ZVRvUmFuZ2VFbmQKKy8vLyAgIE1ldGhvZDogQWNjZXB0QWxsT3RoZXJSZXZpc2lvbnNUcmFuc2Zvcm0KKy8vLyAgIFNhbXBsZSBkb2N1bWVudDogTW92ZWRUZXh0LmRvY3gKKy8vLyAgIFJldmlld2VkOiB6ZXlhZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLyAgIFNlbWFudGljczoKKy8vLyAgICAgUmVtb3ZlIHRoZXNlIGVsZW1lbnRzLgorLy8vICAgUmVqZWN0OgorLy8vICAgICBUcmFuc2Zvcm0gdG8gbW92ZUZyb21SYW5nZVN0YXJ0LCBtb3ZlRnJvbVJhbmdlRW5kCisvLy8gICAgIFRoZW4gQWNjZXB0CisvLy8gCisvLy8gY3VzdG9tWG1sRGVsUmFuZ2VTdGFydAorLy8vIGN1c3RvbVhtbERlbFJhbmdlRW5kCisvLy8gY3VzdG9tWG1sTW92ZUZyb21SYW5nZVN0YXJ0CisvLy8gY3VzdG9tWG1sTW92ZUZyb21SYW5nZUVuZAorLy8vICAgTWV0aG9kOiBBY2NlcHREZWxldGVkQW5kTW92ZWRGcm9tQ29udGVudENvbnRyb2xzCisvLy8gICBSZXZpZXdlZDogdHJpc3RhbiBhbmQgemV5YWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8vICAgU2VtYW50aWNzOgorLy8vICAgICBGaW5kIHBhaXJzIG9mIHN0YXJ0L2VuZCBlbGVtZW50cywgbWF0Y2hpbmcgaWQgYXR0cmlidXRlcy4gIENvbGxhcHNlIHNkdAorLy8vICAgICAgIGVsZW1lbnRzIHRoYXQgaGF2ZSBib3RoIHN0YXJ0IGFuZCBlbmQgdGFncyBpbiBhIHJhbmdlLgorLy8vICAgUmVqZWN0OgorLy8vICAgICBUcmFuc2Zvcm0gdG8gY3VzdG9tWG1sSW5zUmFuZ2VTdGFydCwgY3VzdG9tWG1sSW5zUmFuZ2VFbmQsIGN1c3RvbVhtbE1vdmVUb1JhbmdlU3RhcnQsIGN1c3RvbVhtbE1vdmVUb1JhbmdlRW5kCisvLy8gICAgIFRoZW4gQWNjZXB0CisvLy8gICAKKy8vLyBjdXN0b21YbWxJbnNSYW5nZVN0YXJ0CisvLy8gY3VzdG9tWG1sSW5zUmFuZ2VFbmQKKy8vLyBjdXN0b21YbWxNb3ZlVG9SYW5nZVN0YXJ0CisvLy8gY3VzdG9tWG1sTW92ZVRvUmFuZ2VFbmQKKy8vLyAgIE1ldGhvZDogQWNjZXB0QWxsT3RoZXJSZXZpc2lvbnNUcmFuc2Zvcm0KKy8vLyAgIFJldmlld2VkOiB0cmlzdGFuIGFuZCB6ZXlhZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gICBTZW1hbnRpY3M6CisvLy8gICAgIFJlbW92ZSB0aGVzZSBlbGVtZW50cy4KKy8vLyAgIFJlamVjdDoKKy8vLyAgICAgVHJhbnNmb3JtIHRvIGN1c3RvbVhtbERlbFJhbmdlU3RhcnQsIGN1c3RvbVhtbERlbFJhbmdlRW5kLCBjdXN0b21YbWxNb3ZlRnJvbVJhbmdlU3RhcnQsIGN1c3RvbVhtbE1vdmVGcm9tUmFuZ2VFbmQKKy8vLyAgICAgVGhlbiBBY2NlcHQKKy8vLyAgIAorLy8vIGRlbEluc3RyVGV4dCAoZGVsZXRlZCBmaWVsZCBjb2RlKQorLy8vICAgTWV0aG9kOiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybQorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBOdW1iZXJpbmdQYXJhZ3JhcGhQcm9wZXJ0aWVzQ2hhbmdlLmRvY3gKKy8vLyAgIFJldmlld2VkOiB6ZXlhZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLyAgIFNlbWFudGljczoKKy8vLyAgICAgUmVtb3ZlIHRoZXNlIGVsZW1lbnRzLgorLy8vICAgUmVqZWN0OgorLy8vICAgICBUcmFuc2Zvcm0gdG8gaW5zdHJUZXh0CisvLy8gICAgIFRoZW4gQWNjZXB0CisvLy8gICAgIE5vdGUgdGhhdCBpbnN0clRleHQgbXVzdCBiZSB0cmFuc2Zvcm1lZCB0byBkZWxJbnN0clRleHQgd2hlbiBpbiBhIHc6aW5zLCBpbiB0aGUgc2FtZSBmYXNoaW9uIHRoYXQgdzp0IG11c3QgYmUgdHJhbnNmb3JtZWQgdG8gdzpkZWxUZXh0IHdoZW4gaW4gdzppbnMKKy8vLyAKKy8vLyBpbnMgKGluc2VydGVkIG51bWJlcmluZyBwcm9wZXJ0aWVzKQorLy8vICAgTWV0aG9kOiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybQorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBJbnNlcnRlZE51bWJlcmluZ1Byb3BlcnRpZXMuZG9jeAorLy8vICAgUmV2aWV3ZWQ6IHpleWFkICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8vICAgU2VtYW50aWNzOgorLy8vICAgICBSZW1vdmUgdGhlc2UgZWxlbWVudHMuCisvLy8gICBSZWplY3QKKy8vLyAgICAgUmVtb3ZlIHRoZSBjb250YWluaW5nIHc6bnVtUHIKKy8vLyAgICAgCisvLy8gcFByQ2hhbmdlIChyZXZpc2lvbiBpbmZvcm1hdGlvbiBmb3IgcGFyYWdyYXBoIHByb3BlcnRpZXMpCisvLy8gICBNZXRob2Q6IEFjY2VwdEFsbE90aGVyUmV2aXNpb25zVHJhbnNmb3JtCisvLy8gICBTYW1wbGUgZG9jdW1lbnQ6IFBhcmFncmFwaEFuZFJ1blByb3BlcnR5UmV2aXNpb25zLmRvY3ggCisvLy8gICBSZXZpZXdlZDogemV5YWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gICBTZW1hbnRpY3M6CisvLy8gICAgIFJlbW92ZSB0aGVzZSBlbGVtZW50cy4KKy8vLyAgIFJlamVjdDoKKy8vLyAgICAgUmVwbGFjZSBwUHIgd2l0aCB0aGUgcFByIGluIHBQckNoYW5nZQorLy8vIAorLy8vIHJQckNoYW5nZSAocmV2aXNpb24gaW5mb3JtYXRpb24gZm9yIHJ1biBwcm9wZXJ0aWVzKQorLy8vICAgTWV0aG9kOiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybQorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBQYXJhZ3JhcGhBbmRSdW5Qcm9wZXJ0eVJldmlzaW9ucy5kb2N4CisvLy8gICBTYW1wbGUgZG9jdW1lbnQ6IFZhcmlvdXNUYWJsZVJldmlzaW9ucy5kb2N4CisvLy8gICBSZXZpZXdlZDogemV5YWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gICBTZW1hbnRpY3M6CisvLy8gICAgIFJlbW92ZSB0aGVzZSBlbGVtZW50cy4KKy8vLyAgIFJlamVjdDoKKy8vLyAgICAgUmVwbGFjZSByUHIgd2l0aCB0aGUgclByIGluIHJQckNoYW5nZQorLy8vICAgCisvLy8gclByQ2hhbmdlIChyZXZpc2lvbiBpbmZvcm1hdGlvbiBmb3IgcnVuIHByb3BlcnRpZXMgb24gdGhlIHBhcmFncmFwaCBtYXJrKQorLy8vICAgTWV0aG9kOiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybQorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBQYXJhZ3JhcGhBbmRSdW5Qcm9wZXJ0eVJldmlzaW9ucy5kb2N4IAorLy8vICAgUmV2aWV3ZWQ6IHpleWFkICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8vICAgU2VtYW50aWNzOgorLy8vICAgICBSZW1vdmUgdGhlc2UgZWxlbWVudHMuCisvLy8gICBSZWplY3Q6CisvLy8gICAgIFJlcGxhY2UgclByIHdpdGggdGhlIHJQciBpbiByUHJDaGFuZ2UuCisvLy8gCisvLy8gbnVtYmVyaW5nQ2hhbmdlIChwcmV2aW91cyBudW1iZXJpbmcgZmllbGQgcHJvcGVydGllcykKKy8vLyAgIE1ldGhvZDogQWNjZXB0QWxsT3RoZXJSZXZpc2lvbnNUcmFuc2Zvcm0KKy8vLyAgIFNhbXBsZSBkb2N1bWVudDogTnVtYmVyaW5nRmllbGRQcm9wZXJ0aWVzQ2hhbmdlLmRvY3ggCisvLy8gICBTZW1hbnRpY3M6CisvLy8gICAgIFJlbW92ZSB0aGVzZSBlbGVtZW50cy4KKy8vLyAgIFJlamVjdDoKKy8vLyAgICAgUmVtb3ZlIHRoZXNlIGVsZW1lbnRzLgorLy8vICAgICBUaGVzZSBhcmUgdGhlcmUgZm9yIG51bWJlcmluZyBjcmVhdGVkIHZpYSBmaWVsZHMsIGFuZCBhcmUgbm90IGltcG9ydGFudC4KKy8vLyAKKy8vLyBudW1iZXJpbmdDaGFuZ2UgKHByZXZpb3VzIHBhcmFncmFwaCBudW1iZXJpbmcgcHJvcGVydGllcykKKy8vLyAgIE1ldGhvZDogQWNjZXB0QWxsT3RoZXJSZXZpc2lvbnNUcmFuc2Zvcm0KKy8vLyAgIFNhbXBsZSBkb2N1bWVudDogTnVtYmVyaW5nRmllbGRQcm9wZXJ0aWVzQ2hhbmdlLmRvY3ggCisvLy8gICBTZW1hbnRpY3M6CisvLy8gICAgIFJlbW92ZSB0aGVzZSBlbGVtZW50cy4KKy8vLyAgIFJlamVjdDoKKy8vLyAgICAgUmVtb3ZlIHRoZXNlIGVsZW1lbnRzLgorLy8vIAorLy8vIHNlY3RQckNoYW5nZQorLy8vICAgTWV0aG9kOiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybQorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBTZWN0aW9uUHJvcGVydGllc0NoYW5nZS5kb2N4CisvLy8gICBSZXZpZXdlZDogemV5YWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gICBTZW1hbnRpY3M6CisvLy8gICAgIFJlbW92ZSB0aGVzZSBlbGVtZW50cy4KKy8vLyAgIFJlamVjdDoKKy8vLyAgICAgUmVwbGFjZSBzZWN0UHIgd2l0aCB0aGUgc2VjdFByIGluIHNlY3RQckNoYW5nZQorLy8vICAgCisvLy8gdGJsR3JpZENoYW5nZQorLy8vICAgTWV0aG9kOiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybQorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBUYWJsZUdyaWRDaGFuZ2UuZG9jeAorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBWYXJpb3VzVGFibGVSZXZpc2lvbnMuZG9jeAorLy8vICAgUmV2aWV3ZWQ6IHpleWFkICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8vICAgU2VtYW50aWNzOgorLy8vICAgICBSZW1vdmUgdGhlc2UgZWxlbWVudHMuCisvLy8gICBSZWplY3Q6CisvLy8gICAgIFJlcGxhY2UgdGJsR3JpZCB3aXRoIHRoZSB0YmxHcmlkIGluIHRibEdyaWRDaGFuZ2UKKy8vLyAKKy8vLyB0YmxQckNoYW5nZQorLy8vICAgTWV0aG9kOiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybQorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBUYWJsZUdyaWRDaGFuZ2UuZG9jeAorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBWYXJpb3VzVGFibGVSZXZpc2lvbnMuZG9jeAorLy8vICAgUmV2aWV3ZWQ6IHpleWFkICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8vICAgU2VtYW50aWNzOgorLy8vICAgICBSZW1vdmUgdGhlc2UgZWxlbWVudHMuCisvLy8gICBSZWplY3Q6CisvLy8gICAgIFJlcGxhY2UgdGJsUHIgd2l0aCB0aGUgdGJsUHIgaW4gdGJsUHJDaGFuZ2UKKy8vLyAgIAorLy8vIHRibFByRXhDaGFuZ2UKKy8vLyAgIE1ldGhvZDogQWNjZXB0QWxsT3RoZXJSZXZpc2lvbnNUcmFuc2Zvcm0KKy8vLyAgIFNhbXBsZSBkb2N1bWVudDogVmFyaW91c1RhYmxlUmV2aXNpb25zLmRvY3gKKy8vLyAgIFJldmlld2VkOiB6ZXlhZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLyAgIFNlbWFudGljczoKKy8vLyAgICAgUmVtb3ZlIHRoZXNlIGVsZW1lbnRzLgorLy8vICAgUmVqZWN0OgorLy8vICAgICBSZXBsYWNlIHRibFByRXggd2l0aCB0aGUgdGJsUHJFeCBpbiB0YmxQckV4Q2hhbmdlCisvLy8gICAKKy8vLyB0Y1ByQ2hhbmdlCisvLy8gICBNZXRob2Q6IEFjY2VwdEFsbE90aGVyUmV2aXNpb25zVHJhbnNmb3JtCisvLy8gICBTYW1wbGUgZG9jdW1lbnQ6IFRhYmxlR3JpZENoYW5nZS5kb2N4CisvLy8gICBTYW1wbGUgZG9jdW1lbnQ6IFZhcmlvdXNUYWJsZVJldmlzaW9ucy5kb2N4CisvLy8gICBSZXZpZXdlZDogemV5YWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gICBTZW1hbnRpY3M6CisvLy8gICAgIFJlbW92ZSB0aGVzZSBlbGVtZW50cy4KKy8vLyAgIFJlamVjdDoKKy8vLyAgICAgUmVwbGFjZSB0Y1ByIHdpdGggdGhlIHRjUHIgaW4gdGNQckNoYW5nZQorLy8vICAgCisvLy8gdHJQckNoYW5nZQorLy8vICAgTWV0aG9kOiBBY2NlcHRBbGxPdGhlclJldmlzaW9uc1RyYW5zZm9ybQorLy8vICAgU2FtcGxlIGRvY3VtZW50OiBWYXJpb3VzVGFibGVSZXZpc2lvbnMuZG9jeAorLy8vICAgUmV2aWV3ZWQ6IHpleWFkICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8vICAgU2VtYW50aWNzOgorLy8vICAgICBSZW1vdmUgdGhlc2UgZWxlbWVudHMuCisvLy8gICBSZWplY3Q6CisvLy8gICAgIFJlcGxhY2UgdHJQciB3aXRoIHRoZSB0clByIGluIHRyUHJDaGFuZ2UKKy8vLyAKKy8vLyBjZWxEZWwKKy8vLyAgIE1ldGhvZDogQWNjZXB0RGVsZXRlZENlbGxzVHJhbnNmb3JtCisvLy8gICBTYW1wbGUgZG9jdW1lbnQ6IEhvcml6b250YWxseU1lcmdlZENlbGxzLmRvY3gKKy8vLyAgIFNlbWFudGljczoKKy8vLyAgICAgR3JvdXAgY29uc2VjdXRpdmUgZGVsZXRlZCBjZWxscywgYW5kIHJlbW92ZSB0aGVtLgorLy8vICAgICBBZGp1c3QgdGhlIGNlbGwgYmVmb3JlIGRlbGV0ZWQgY2VsbHM6CisvLy8gICAgICAgSW5jcmVhc2UgZ3JpZFNwYW4gYnkgdGhlIG51bWJlciBvZiBkZWxldGVkIGNlbGxzIHRoYXQgYXJlIHJlbW92ZWQuCisvLy8gICBSZWplY3Q6CisvLy8gICAgIFJlbW92ZSB0aGlzIGVsZW1lbnQKKy8vLyAKKy8vLyBjZWxJbnMKKy8vLyAgIE1ldGhvZDogQWNjZXB0QWxsT3RoZXJSZXZpc2lvbnNUcmFuc2Zvcm0KKy8vLyAgIFNhbXBsZSBkb2N1bWVudDogSG9yaXpvbnRhbGx5TWVyZ2VkQ2VsbHMxMS5kb2N4CisvLy8gICBTZW1hbnRpY3M6CisvLy8gICAgIFJlbW92ZSB0aGVzZSBlbGVtZW50cy4KKy8vLyAgIFJlamVjdDoKKy8vLyAgICAgSWYgYSB3OnRjIGNvbnRhaW5zIHc6dGNQci93OmNlbGxJbnMsIHRoZW4gcmVtb3ZlIHRoZSBjZWxsCisvLy8gICAKKy8vLyBjZWxsTWVyZ2UKKy8vLyAgIE1ldGhvZDogQWNjZXB0QWxsT3RoZXJSZXZpc2lvbnNUcmFuc2Zvcm0KKy8vLyAgIFNhbXBsZSBkb2N1bWVudDogTWVyZ2VkQ2VsbC5kb2N4CisvLy8gICBTZW1hbnRpY3M6CisvLy8gICAgIFRyYW5zZm9ybSBjZWxsTWVyZ2Ugd2l0aCBhIHBhcmVudCBvZiB0Y1ByLCB3aXRoIGF0dHJpYnV0ZSB3OnZNZXJnZT0icmVzdCIKKy8vLyAgICAgICB0byA8dzp2TWVyZ2Ugdzp2YWw9InJlc3RhcnQiLz4uCisvLy8gICAgIFRyYW5zZm9ybSBjZWxsTWVyZ2Ugd2l0aCBhIHBhcmVudCBvZiB0Y1ByLCB3aXRoIGF0dHJpYnV0ZSB3OnZNZXJnZT0iY29udCIKKy8vLyAgICAgICB0byA8dzp2TWVyZ2Ugdzp2YWw9ImNvbnRpbnVlIi8+CisvLy8gCisvLy8gVGhlIGZvbGxvd2luZyBpdGVtcyBuZWVkIHRvIGJlIGFkZHJlc3NlZCBpbiBhIGZ1dHVyZSByZWxlYXNlOgorLy8vIC0gaW5zZXJ0ZWQgcnVuIGluc2lkZSBkZWxldGVkIHBhcmFncmFwaCAtIG1vdmVUbyBpcyBzYW1lIGFzIGluc2VydAorLy8vIC0gbXVzdCBpbmNyZWFzZSB3OnZhbCBhdHRyaWJ1dGUgb2YgdGhlIHc6Z3JpZFNwYW4gZWxlbWVudCBvZiB0aGUKKy8vLyAgIGNlbGwgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZSBncm91cCBvZiBkZWxldGVkIGNlbGxzIGJ5IHRoZQorLy8vICAgKioqc3VtKioqIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIHc6dmFsIGF0dHJpYnV0ZXMgb2YgdzpncmlkU3BhbgorLy8vICAgZWxlbWVudHMgb2YgZWFjaCBvZiB0aGUgZGVsZXRlZCBjZWxscy4KKwpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvU1NGb3JtdWxhLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvU1NGb3JtdWxhLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMmJkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9TU0Zvcm11bGEuY3MKQEAgLTAsMCArMSwxMjAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIEV4Y2VsRm9ybXVsYQoreworICAgIHB1YmxpYyBjbGFzcyBQYXJzZUZvcm11bGEKKyAgICB7CisgICAgICAgIEV4Y2VsRm9ybXVsYSBwYXJzZXI7CisKKyAgICAgICAgcHVibGljIFBhcnNlRm9ybXVsYShzdHJpbmcgZm9ybXVsYSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFyc2VyID0gbmV3IEV4Y2VsRm9ybXVsYShmb3JtdWxhLCBDb25zb2xlLk91dCk7CisgICAgICAgICAgICBib29sIHBhcnNlclJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyc2VyUmVzdWx0ID0gcGFyc2VyLkZvcm11bGEoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChQZWcuQmFzZS5QZWdFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXBhcnNlclJlc3VsdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXJzZXIuV2FybmluZygiRXJyb3IgcHJvY2Vzc2luZyAiICsgZm9ybXVsYSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIFJlcGxhY2VTaGVldE5hbWUoc3RyaW5nIG9sZE5hbWUsIHN0cmluZyBuZXdOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHRleHQgPSBuZXcgU3RyaW5nQnVpbGRlcihwYXJzZXIuR2V0U291cmNlKCkpOworICAgICAgICAgICAgUmVwbGFjZU5vZGUocGFyc2VyLkdldFJvb3QoKSwgKGludClFRXhjZWxGb3JtdWxhLlNoZWV0TmFtZSwgb2xkTmFtZSwgbmV3TmFtZSwgdGV4dCk7CisgICAgICAgICAgICByZXR1cm4gdGV4dC5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBSZXBsYWNlUmVsYXRpdmVDZWxsKGludCByb3dPZmZzZXQsIGludCBjb2xPZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKHBhcnNlci5HZXRTb3VyY2UoKSk7CisgICAgICAgICAgICBSZXBsYWNlUmVsYXRpdmVDZWxsKHBhcnNlci5HZXRSb290KCksIHJvd09mZnNldCwgY29sT2Zmc2V0LCB0ZXh0KTsKKyAgICAgICAgICAgIHJldHVybiB0ZXh0LlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWN1cnNpdmUgZnVuY3Rpb24gdGhhdCB3aWxsIHJlcGxhY2UgdmFsdWVzIGZyb20gbGFzdCB0byBmaXJzdAorICAgICAgICBwcml2YXRlIHZvaWQgUmVwbGFjZU5vZGUoUGVnLkJhc2UuUGVnTm9kZSBub2RlLCBpbnQgaWQsIHN0cmluZyBvbGROYW1lLCBzdHJpbmcgbmV3TmFtZSwgU3RyaW5nQnVpbGRlciB0ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobm9kZS5uZXh0XyAhPSBudWxsKQorICAgICAgICAgICAgICAgIFJlcGxhY2VOb2RlKG5vZGUubmV4dF8sIGlkLCBvbGROYW1lLCBuZXdOYW1lLCB0ZXh0KTsKKyAgICAgICAgICAgIGlmIChub2RlLmlkXyA9PSBpZCAmJiBwYXJzZXIuR2V0U291cmNlKCkuU3Vic3RyaW5nKG5vZGUubWF0Y2hfLnBvc0JlZ18sIG5vZGUubWF0Y2hfLkxlbmd0aCkgPT0gb2xkTmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXh0LlJlbW92ZShub2RlLm1hdGNoXy5wb3NCZWdfLCBub2RlLm1hdGNoXy5MZW5ndGgpOworICAgICAgICAgICAgICAgIHRleHQuSW5zZXJ0KG5vZGUubWF0Y2hfLnBvc0JlZ18sIG5ld05hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5jaGlsZF8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBSZXBsYWNlTm9kZShub2RlLmNoaWxkXywgaWQsIG9sZE5hbWUsIG5ld05hbWUsIHRleHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVjdXJzaXZlIGZ1bmN0aW9uIHRoYXQgd2lsbCBhZGp1c3QgcmVsYXRpdmUgY2VsbHMgZnJvbSBsYXN0IHRvIGZpcnN0CisgICAgICAgIHByaXZhdGUgdm9pZCBSZXBsYWNlUmVsYXRpdmVDZWxsKFBlZy5CYXNlLlBlZ05vZGUgbm9kZSwgaW50IHJvd09mZnNldCwgaW50IGNvbE9mZnNldCwgU3RyaW5nQnVpbGRlciB0ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobm9kZS5uZXh0XyAhPSBudWxsKQorICAgICAgICAgICAgICAgIFJlcGxhY2VSZWxhdGl2ZUNlbGwobm9kZS5uZXh0Xywgcm93T2Zmc2V0LCBjb2xPZmZzZXQsIHRleHQpOworICAgICAgICAgICAgaWYgKG5vZGUuaWRfID09IChpbnQpRUV4Y2VsRm9ybXVsYS5BMVJvdyAmJiBwYXJzZXIuR2V0U291cmNlKCkuU3Vic3RyaW5nKG5vZGUubWF0Y2hfLnBvc0JlZ18sIDEpICE9ICIkIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcm93TnVtYmVyID0gQ29udmVydC5Ub0ludDMyKHBhcnNlci5HZXRTb3VyY2UoKS5TdWJzdHJpbmcobm9kZS5tYXRjaF8ucG9zQmVnXywgbm9kZS5tYXRjaF8uTGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgdGV4dC5SZW1vdmUobm9kZS5tYXRjaF8ucG9zQmVnXywgbm9kZS5tYXRjaF8uTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB0ZXh0Lkluc2VydChub2RlLm1hdGNoXy5wb3NCZWdfLCBDb252ZXJ0LlRvU3RyaW5nKHJvd051bWJlciArIHJvd09mZnNldCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5pZF8gPT0gKGludClFRXhjZWxGb3JtdWxhLkExQ29sdW1uICYmIHBhcnNlci5HZXRTb3VyY2UoKS5TdWJzdHJpbmcobm9kZS5tYXRjaF8ucG9zQmVnXywgMSkgIT0gIiQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjb2xOdW1iZXIgPSBHZXRDb2x1bW5OdW1iZXIocGFyc2VyLkdldFNvdXJjZSgpLlN1YnN0cmluZyhub2RlLm1hdGNoXy5wb3NCZWdfLCBub2RlLm1hdGNoXy5MZW5ndGgpKTsKKyAgICAgICAgICAgICAgICB0ZXh0LlJlbW92ZShub2RlLm1hdGNoXy5wb3NCZWdfLCBub2RlLm1hdGNoXy5MZW5ndGgpOworICAgICAgICAgICAgICAgIHRleHQuSW5zZXJ0KG5vZGUubWF0Y2hfLnBvc0JlZ18sIEdldENvbHVtbklkKGNvbE51bWJlciArIGNvbE9mZnNldCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5jaGlsZF8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBSZXBsYWNlUmVsYXRpdmVDZWxsKG5vZGUuY2hpbGRfLCByb3dPZmZzZXQsIGNvbE9mZnNldCwgdGV4dCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0cyB0aGUgY29sdW1uIHJlZmVyZW5jZSBzdHJpbmcgdG8gYSBjb2x1bW4gbnVtYmVyIChlLmcuIEEgLT4gMSwgQiAtPiAyKQorICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgR2V0Q29sdW1uTnVtYmVyKHN0cmluZyBjZWxsUmVmZXJlbmNlKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29sdW1uTnVtYmVyID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggKGNoYXIgYyBpbiBjZWxsUmVmZXJlbmNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChDaGFyLklzTGV0dGVyKGMpKQorICAgICAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXIgPSBjb2x1bW5OdW1iZXIgKiAyNiArIFN5c3RlbS5Db252ZXJ0LlRvSW50MzIoYykgLSBTeXN0ZW0uQ29udmVydC5Ub0ludDMyKCdBJykgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNvbHVtbk51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyYW5zbGF0ZXMgdGhlIGNvbHVtbiBudW1iZXIgdG8gdGhlIGNvbHVtbiByZWZlcmVuY2Ugc3RyaW5nIChlLmcuIDEgLT4gQSwgMi0+IEIpCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBHZXRDb2x1bW5JZChpbnQgY29sdW1uTnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9ICgoY2hhcikoKGNvbHVtbk51bWJlciAtIDEpICUgMjYgKyAoaW50KSdBJykpLlRvU3RyaW5nKCkgKyByZXN1bHQ7CisgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyID0gKGNvbHVtbk51bWJlciAtIDEpIC8gMjY7CisgICAgICAgICAgICB9IHdoaWxlIChjb2x1bW5OdW1iZXIgIT0gMCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvU2NhbGFyVHlwZXMuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9TY2FsYXJUeXBlcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGUzNzY4Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvU2NhbGFyVHlwZXMuY3MKQEAgLTAsMCArMSw2OSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRGVmYXVsdFNjYWxhclR5cGVzCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBIYXNodGFibGUgZGVmYXVsdFNjYWxhclR5cGVzSGFzaDsKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJvb2wgSXNUeXBlSW5MaXN0KENvbGxlY3Rpb248c3RyaW5nPiB0eXBlTmFtZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gUFNPYmplY3RJc09mRXhhY3RUeXBlKHR5cGVOYW1lcyk7CisgICAgICAgICAgICByZXR1cm4gIXN0cmluZy5Jc051bGxPckVtcHR5KHRleHQpICYmIChQU09iamVjdElzRW51bSh0eXBlTmFtZXMpIHx8IERlZmF1bHRTY2FsYXJUeXBlcy5kZWZhdWx0U2NhbGFyVHlwZXNIYXNoLkNvbnRhaW5zS2V5KHRleHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBEZWZhdWx0U2NhbGFyVHlwZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBEZWZhdWx0U2NhbGFyVHlwZXMuZGVmYXVsdFNjYWxhclR5cGVzSGFzaCA9IG5ldyBIYXNodGFibGUoU3RyaW5nQ29tcGFyZXIuT3JkaW5hbElnbm9yZUNhc2UpOworICAgICAgICAgICAgRGVmYXVsdFNjYWxhclR5cGVzLmRlZmF1bHRTY2FsYXJUeXBlc0hhc2guQWRkKCJTeXN0ZW0uU3RyaW5nIiwgbnVsbCk7CisgICAgICAgICAgICBEZWZhdWx0U2NhbGFyVHlwZXMuZGVmYXVsdFNjYWxhclR5cGVzSGFzaC5BZGQoIlN5c3RlbS5TQnl0ZSIsIG51bGwpOworICAgICAgICAgICAgRGVmYXVsdFNjYWxhclR5cGVzLmRlZmF1bHRTY2FsYXJUeXBlc0hhc2guQWRkKCJTeXN0ZW0uQnl0ZSIsIG51bGwpOworICAgICAgICAgICAgRGVmYXVsdFNjYWxhclR5cGVzLmRlZmF1bHRTY2FsYXJUeXBlc0hhc2guQWRkKCJTeXN0ZW0uSW50MTYiLCBudWxsKTsKKyAgICAgICAgICAgIERlZmF1bHRTY2FsYXJUeXBlcy5kZWZhdWx0U2NhbGFyVHlwZXNIYXNoLkFkZCgiU3lzdGVtLlVJbnQxNiIsIG51bGwpOworICAgICAgICAgICAgRGVmYXVsdFNjYWxhclR5cGVzLmRlZmF1bHRTY2FsYXJUeXBlc0hhc2guQWRkKCJTeXN0ZW0uSW50MzIiLCAxMCk7CisgICAgICAgICAgICBEZWZhdWx0U2NhbGFyVHlwZXMuZGVmYXVsdFNjYWxhclR5cGVzSGFzaC5BZGQoIlN5c3RlbS5VSW50MzIiLCAxMCk7CisgICAgICAgICAgICBEZWZhdWx0U2NhbGFyVHlwZXMuZGVmYXVsdFNjYWxhclR5cGVzSGFzaC5BZGQoIlN5c3RlbS5JbnQ2NCIsIG51bGwpOworICAgICAgICAgICAgRGVmYXVsdFNjYWxhclR5cGVzLmRlZmF1bHRTY2FsYXJUeXBlc0hhc2guQWRkKCJTeXN0ZW0uVUludDY0IiwgbnVsbCk7CisgICAgICAgICAgICBEZWZhdWx0U2NhbGFyVHlwZXMuZGVmYXVsdFNjYWxhclR5cGVzSGFzaC5BZGQoIlN5c3RlbS5DaGFyIiwgMSk7CisgICAgICAgICAgICBEZWZhdWx0U2NhbGFyVHlwZXMuZGVmYXVsdFNjYWxhclR5cGVzSGFzaC5BZGQoIlN5c3RlbS5TaW5nbGUiLCBudWxsKTsKKyAgICAgICAgICAgIERlZmF1bHRTY2FsYXJUeXBlcy5kZWZhdWx0U2NhbGFyVHlwZXNIYXNoLkFkZCgiU3lzdGVtLkRvdWJsZSIsIG51bGwpOworICAgICAgICAgICAgRGVmYXVsdFNjYWxhclR5cGVzLmRlZmF1bHRTY2FsYXJUeXBlc0hhc2guQWRkKCJTeXN0ZW0uQm9vbGVhbiIsIDUpOworICAgICAgICAgICAgRGVmYXVsdFNjYWxhclR5cGVzLmRlZmF1bHRTY2FsYXJUeXBlc0hhc2guQWRkKCJTeXN0ZW0uRGVjaW1hbCIsIG51bGwpOworICAgICAgICAgICAgRGVmYXVsdFNjYWxhclR5cGVzLmRlZmF1bHRTY2FsYXJUeXBlc0hhc2guQWRkKCJTeXN0ZW0uSW50UHRyIiwgbnVsbCk7CisgICAgICAgICAgICBEZWZhdWx0U2NhbGFyVHlwZXMuZGVmYXVsdFNjYWxhclR5cGVzSGFzaC5BZGQoIlN5c3RlbS5TZWN1cml0eS5TZWN1cmVTdHJpbmciLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgUFNPYmplY3RJc09mRXhhY3RUeXBlKENvbGxlY3Rpb248c3RyaW5nPiB0eXBlTmFtZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0eXBlTmFtZXMuQ291bnQgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZU5hbWVzWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBQU09iamVjdElzRW51bShDb2xsZWN0aW9uPHN0cmluZz4gdHlwZU5hbWVzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHlwZU5hbWVzLkNvdW50ID49IDIgJiYgIXN0cmluZy5Jc051bGxPckVtcHR5KHR5cGVOYW1lc1sxXSkgJiYgc3RyaW5nLkVxdWFscyh0eXBlTmFtZXNbMV0sICJTeXN0ZW0uRW51bSIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9TbWxDZWxsRm9ybWF0dGVyLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvU21sQ2VsbEZvcm1hdHRlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTM0Y2RkCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvU21sQ2VsbEZvcm1hdHRlci5jcwpAQCAtMCwwICsxLDI3NiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3MuQ29kZUFuYWx5c2lzOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBTeXN0ZW0uV2luZG93cy5Gb3JtczsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgY2xhc3MgU21sQ2VsbEZvcm1hdHRlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBlbnVtIENlbGxUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIEdlbmVyYWwsCisgICAgICAgICAgICBOdW1iZXIsCisgICAgICAgICAgICBEYXRlLAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgY2xhc3MgRm9ybWF0Q29uZmlnCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBDZWxsVHlwZSBDZWxsVHlwZTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRm9ybWF0Q29kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8c3RyaW5nLCBGb3JtYXRDb25maWc+IEV4Y2VsRm9ybWF0Q29kZVRvTmV0Rm9ybWF0Q29kZUV4Y2VwdGlvbk1hcCA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgRm9ybWF0Q29uZmlnPigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiIyA/Lz8iLAorICAgICAgICAgICAgICAgIG5ldyBGb3JtYXRDb25maWcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENlbGxUeXBlID0gU21sQ2VsbEZvcm1hdHRlci5DZWxsVHlwZS5OdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIEZvcm1hdENvZGUgPSAiMC4wMCIsCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiIyA/Py8/PyIsCisgICAgICAgICAgICAgICAgbmV3IEZvcm1hdENvbmZpZworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ2VsbFR5cGUgPSBTbWxDZWxsRm9ybWF0dGVyLkNlbGxUeXBlLk51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgRm9ybWF0Q29kZSA9ICIwLjAwIiwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICB9OworCisgICAgICAgIC8vIFVwIHRvIGZvdXIgc2VjdGlvbnMgb2YgZm9ybWF0IGNvZGVzIGNhbiBiZSBzcGVjaWZpZWQuIFRoZSBmb3JtYXQgY29kZXMsIHNlcGFyYXRlZCBieSBzZW1pY29sb25zLCBkZWZpbmUgdGhlCisgICAgICAgIC8vIGZvcm1hdHMgZm9yIHBvc2l0aXZlIG51bWJlcnMsIG5lZ2F0aXZlIG51bWJlcnMsIHplcm8gdmFsdWVzLCBhbmQgdGV4dCwgaW4gdGhhdCBvcmRlci4gSWYgb25seSB0d28gc2VjdGlvbnMgYXJlCisgICAgICAgIC8vIHNwZWNpZmllZCwgdGhlIGZpcnN0IGlzIHVzZWQgZm9yIHBvc2l0aXZlIG51bWJlcnMgYW5kIHplcm9zLCBhbmQgdGhlIHNlY29uZCBpcyB1c2VkIGZvciBuZWdhdGl2ZSBudW1iZXJzLiBJZiBvbmx5CisgICAgICAgIC8vIG9uZSBzZWN0aW9uIGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYWxsIG51bWJlcnMuIFRvIHNraXAgYSBzZWN0aW9uLCB0aGUgZW5kaW5nIHNlbWljb2xvbiBmb3IgdGhhdCBzZWN0aW9uIHNoYWxsCisgICAgICAgIC8vIGJlIHdyaXR0ZW4uCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEZvcm1hdENlbGwoc3RyaW5nIGZvcm1hdENvZGUsIHN0cmluZyB2YWx1ZSwgb3V0IHN0cmluZyBjb2xvcikKKyAgICAgICAgeworICAgICAgICAgICAgY29sb3IgPSBudWxsOworCisgICAgICAgICAgICBpZiAoZm9ybWF0Q29kZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGZvcm1hdENvZGUgPSAiR2VuZXJhbCI7CisKKyAgICAgICAgICAgIHZhciBzcGxpdEZvcm1hdENvZGUgPSBmb3JtYXRDb2RlLlNwbGl0KCc7Jyk7CisgICAgICAgICAgICBpZiAoc3BsaXRGb3JtYXRDb2RlLkxlbmd0aCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBkdjsKKyAgICAgICAgICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKHZhbHVlLCBOdW1iZXJTdHlsZXMuRmxvYXQsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCBkdikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9ybWF0RG91YmxlKGZvcm1hdENvZGUsIGR2LCBvdXQgY29sb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3BsaXRGb3JtYXRDb2RlLkxlbmd0aCA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBkdjsKKyAgICAgICAgICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKHZhbHVlLCBOdW1iZXJTdHlsZXMuRmxvYXQsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCBkdikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZHYgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9ybWF0RG91YmxlKHNwbGl0Rm9ybWF0Q29kZVswXSwgZHYsIG91dCBjb2xvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9ybWF0RG91YmxlKHNwbGl0Rm9ybWF0Q29kZVsxXSwgZHYsIG91dCBjb2xvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBwb3NpdGl2ZSwgbmVnYXRpdmUsIHplcm8sIHRleHQKKyAgICAgICAgICAgIC8vIF8oIiQiKiAjLCMjMC4wMF8pO18oIiQiKiBcKCMsIyMwLjAwXCk7XygiJCIqICItIj8/Xyk7XyhAXykKKyAgICAgICAgICAgIGlmIChzcGxpdEZvcm1hdENvZGUuTGVuZ3RoID09IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGR2OworICAgICAgICAgICAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2UodmFsdWUsIE51bWJlclN0eWxlcy5GbG9hdCwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IGR2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkdiA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB6MSA9IEZvcm1hdERvdWJsZShzcGxpdEZvcm1hdENvZGVbMF0sIGR2LCBvdXQgY29sb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHoxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGR2IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHoyID0gRm9ybWF0RG91YmxlKHNwbGl0Rm9ybWF0Q29kZVsxXSwgZHYsIG91dCBjb2xvcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gejI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvLyA9PSAwCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB6MyA9IEZvcm1hdERvdWJsZShzcGxpdEZvcm1hdENvZGVbMl0sIGR2LCBvdXQgY29sb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHozOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmluZyBmbXQgPSBzcGxpdEZvcm1hdENvZGVbM10uUmVwbGFjZSgiQCIsICJ7MH0iKS5SZXBsYWNlKCJcIiIsICIiKTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzID0gc3RyaW5nLkZvcm1hdChmbXQsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIFJlZ2V4IFVuZGVyUmVnZXggPSBuZXcgUmVnZXgoIl8uIik7CisKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBSZWdleCB0cmFuc2Zvcm1zIGN1cnJlbmN5IHNwZWNpZmllcyBpbnRvIGEgY2hhcmFjdGVyIC8gc3RyaW5nCisgICAgICAgIC8vIHRoYXQgc3RyaW5nLkZvcm1hdCBjYW4gdXNlIHRvIHByb3Blcmx5IHByb2R1Y2UgdGhlIGNvcnJlY3QgdGV4dC4KKyAgICAgICAgLy8gIlskwqMtODA5XSIgICAgPT4gIsKjIgorICAgICAgICAvLyAiWyTigqwtMl0iICAgICAgPT4gIuKCrCIKKyAgICAgICAgLy8gIlskwqUtODA0XSIgICAgPT4gIsKlCisgICAgICAgIC8vICJbJENIRi0xMDBDXSIgPT4gIkNIRiIKKyAgICAgICAgc3RhdGljIHN0cmluZyBzX0N1cnJSZWdleCA9IEAiXFtcJCg/PGN1cnI+LiotKS4qXF0iOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBDb252ZXJ0Rm9ybWF0Q29kZShzdHJpbmcgZm9ybWF0Q29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG5ld0Zvcm1hdENvZGUgPSBmb3JtYXRDb2RlCisgICAgICAgICAgICAgICAgLlJlcGxhY2UoIm1tbS0iLCAiTU1NLSIpCisgICAgICAgICAgICAgICAgLlJlcGxhY2UoIi1tbW0iLCAiLU1NTSIpCisgICAgICAgICAgICAgICAgLlJlcGxhY2UoIm1tLSIsICJNTS0iKQorICAgICAgICAgICAgICAgIC5SZXBsYWNlKCJtbW1tIiwgIk1NTU0iKQorICAgICAgICAgICAgICAgIC5SZXBsYWNlKCJBTS9QTSIsICJ0dCIpCisgICAgICAgICAgICAgICAgLlJlcGxhY2UoIm0vIiwgIk0vIikKKyAgICAgICAgICAgICAgICAuUmVwbGFjZSgiKiIsICIiKQorICAgICAgICAgICAgICAgIC5SZXBsYWNlKCI/IiwgIiMiKQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIHZhciB3aXRoVHJpbW1lZFVuZGVyc2NvcmVzID0gVW5kZXJSZWdleC5SZXBsYWNlKG5ld0Zvcm1hdENvZGUsICIiKTsKKyAgICAgICAgICAgIHZhciB3aXRoVHJhbnNmb3JtZWRDdXJyZW5jeSA9IFJlZ2V4LlJlcGxhY2Uod2l0aFRyaW1tZWRVbmRlcnNjb3Jlcywgc19DdXJyUmVnZXgsIG0gPT4gbS5Hcm91cHNbMV0uVmFsdWUuVHJpbUVuZCgnLScpKTsKKyAgICAgICAgICAgIHJldHVybiB3aXRoVHJhbnNmb3JtZWRDdXJyZW5jeTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ1tdIFZhbGlkQ29sb3JzID0gbmV3W10geworICAgICAgICAgICAgIkJsYWNrIiwKKyAgICAgICAgICAgICJCbHVlIiwKKyAgICAgICAgICAgICJDeWFuIiwKKyAgICAgICAgICAgICJHcmVlbiIsCisgICAgICAgICAgICAiTWFnZW50YSIsCisgICAgICAgICAgICAiUmVkIiwKKyAgICAgICAgICAgICJXaGl0ZSIsCisgICAgICAgICAgICAiWWVsbG93IiwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgRm9ybWF0RG91YmxlKHN0cmluZyBmb3JtYXRDb2RlLCBkb3VibGUgZHYsIG91dCBzdHJpbmcgY29sb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbG9yID0gbnVsbDsKKyAgICAgICAgICAgIHZhciB0cmltbWVkID0gZm9ybWF0Q29kZS5UcmltKCk7CisgICAgICAgICAgICBpZiAodHJpbW1lZC5TdGFydHNXaXRoKCJbIikgJiYKKyAgICAgICAgICAgICAgICB0cmltbWVkLkNvbnRhaW5zKCJdIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNvbG9yTGVuID0gdHJpbW1lZC5JbmRleE9mKCddJyk7CisgICAgICAgICAgICAgICAgY29sb3IgPSB0cmltbWVkLlN1YnN0cmluZygxLCBjb2xvckxlbiAtIDEpOworICAgICAgICAgICAgICAgIGlmIChWYWxpZENvbG9ycy5Db250YWlucyhjb2xvcikgfHwKKyAgICAgICAgICAgICAgICAgICAgY29sb3IuU3RhcnRzV2l0aCgiQ29sb3IiKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvci5TdGFydHNXaXRoKCJDb2xvciIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWR4U3RyID0gY29sb3IuU3Vic3RyaW5nKDUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9ySWR4OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludC5UcnlQYXJzZShpZHhTdHIsIG91dCBjb2xvcklkeCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9ySWR4IDwgU21sRGF0YVJldHJpZXZlci5JbmRleGVkQ29sb3JzLkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBTbWxEYXRhUmV0cmlldmVyLkluZGV4ZWRDb2xvcnNbY29sb3JJZHhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdENvZGUgPSB0cmltbWVkLlN1YnN0cmluZyhjb2xvckxlbiArIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoZm9ybWF0Q29kZSA9PSAiR2VuZXJhbCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGR2LlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgYm9vbCBpc0RhdGUgPSBJc0Zvcm1hdENvZGVGb3JEYXRlKGZvcm1hdENvZGUpOworICAgICAgICAgICAgdmFyIGNmYyA9IENvbnZlcnRGb3JtYXRDb2RlKGZvcm1hdENvZGUpOworICAgICAgICAgICAgaWYgKGlzRGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEYXRlVGltZSB0aGlzRGF0ZTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRoaXNEYXRlID0gRGF0ZVRpbWUuRnJvbU9BRGF0ZShkdik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChBcmd1bWVudEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkdi5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNmYy5TdGFydHNXaXRoKCJbaF0iKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lIHplcm9Ib3VyID0gbmV3IERhdGVUaW1lKDE4OTksIDEyLCAzMCwgMCwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YUluSG91cnMgPSAoaW50KSgodGhpc0RhdGUgLSB6ZXJvSG91cikuVG90YWxIb3Vycyk7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDZmMgPSBjZmMuU3Vic3RyaW5nKDMpOworICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IChkZWx0YUluSG91cnMuVG9TdHJpbmcoKSArIHRoaXNEYXRlLlRvU3RyaW5nKG5ld0NmYykpLlRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjZmMuRW5kc1dpdGgoIi4wIikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY2ZjMiA9IGNmYy5SZXBsYWNlKCIuMCIsICI6ZmZmIik7CisgICAgICAgICAgICAgICAgICAgIHZhciBzNCA9IHRoaXNEYXRlLlRvU3RyaW5nKGNmYzIpLlRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgczIgPSB0aGlzRGF0ZS5Ub1N0cmluZyhjZmMsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLlRyaW0oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gczI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoRXhjZWxGb3JtYXRDb2RlVG9OZXRGb3JtYXRDb2RlRXhjZXB0aW9uTWFwLkNvbnRhaW5zS2V5KGZvcm1hdENvZGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZvcm1hdENvbmZpZyBmYyA9IEV4Y2VsRm9ybWF0Q29kZVRvTmV0Rm9ybWF0Q29kZUV4Y2VwdGlvbk1hcFtmb3JtYXRDb2RlXTsKKyAgICAgICAgICAgICAgICB2YXIgcyA9IGR2LlRvU3RyaW5nKGZjLkZvcm1hdENvZGUsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLlRyaW0oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoY2ZjLkNvbnRhaW5zKCcoJykgJiYgY2ZjLkNvbnRhaW5zKCcpJykpIHx8IGNmYy5Db250YWlucygnLScpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzMyA9ICgtZHYpLlRvU3RyaW5nKGNmYywgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkuVHJpbSgpOworICAgICAgICAgICAgICAgIHJldHVybiBzMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgczQgPSBkdi5Ub1N0cmluZyhjZmMsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLlRyaW0oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gczQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIElzRm9ybWF0Q29kZUZvckRhdGUoc3RyaW5nIGZvcm1hdENvZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmb3JtYXRDb2RlID09ICJHZW5lcmFsIikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gZm9ybWF0Q29kZS5Db250YWlucygibSIpIHx8CisgICAgICAgICAgICAgICAgZm9ybWF0Q29kZS5Db250YWlucygiZCIpIHx8CisgICAgICAgICAgICAgICAgZm9ybWF0Q29kZS5Db250YWlucygieSIpIHx8CisgICAgICAgICAgICAgICAgZm9ybWF0Q29kZS5Db250YWlucygiaCIpIHx8CisgICAgICAgICAgICAgICAgZm9ybWF0Q29kZS5Db250YWlucygicyIpIHx8CisgICAgICAgICAgICAgICAgZm9ybWF0Q29kZS5Db250YWlucygiQU0iKSB8fAorICAgICAgICAgICAgICAgIGZvcm1hdENvZGUuQ29udGFpbnMoIlBNIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9TbWxEYXRhUmV0cmlldmVyLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvU21sRGF0YVJldHJpZXZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjQzZDljCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvU21sRGF0YVJldHJpZXZlci5jcwpAQCAtMCwwICsxLDExMDcgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzLkNvZGVBbmFseXNpczsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLldpbmRvd3MuRm9ybXM7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgY2xhc3MgU21sRGF0YVJldHJpZXZlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRWxlbWVudCBSZXRyaWV2ZVNoZWV0KFNtbERvY3VtZW50IHNtbERvYywgc3RyaW5nIHNoZWV0TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtcy5Xcml0ZShzbWxEb2MuRG9jdW1lbnRCeXRlQXJyYXksIDAsIHNtbERvYy5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4obXMsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXRyaWV2ZVNoZWV0KHNEb2MsIHNoZWV0TmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRWxlbWVudCBSZXRyaWV2ZVNoZWV0KHN0cmluZyBmaWxlTmFtZSwgc3RyaW5nIHNoZWV0TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKFNwcmVhZHNoZWV0RG9jdW1lbnQgc0RvYyA9IFNwcmVhZHNoZWV0RG9jdW1lbnQuT3BlbihmaWxlTmFtZSwgZmFsc2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXRyaWV2ZVNoZWV0KHNEb2MsIHNoZWV0TmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IFJldHJpZXZlU2hlZXQoU3ByZWFkc2hlZXREb2N1bWVudCBzRG9jLCBzdHJpbmcgc2hlZXROYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd2JYZG9jID0gc0RvYy5Xb3JrYm9va1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICB2YXIgc2hlZXQgPSB3Ylhkb2MKKyAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnNoZWV0cykKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy5zaGVldCkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQocyA9PiAoc3RyaW5nKXMuQXR0cmlidXRlKCJuYW1lIikgPT0gc2hlZXROYW1lKTsKKyAgICAgICAgICAgIGlmIChzaGVldCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzaGVldCBuYW1lIHBhc3NlZCB0byBSZXRyaWV2ZVNoZWV0IiwgInNoZWV0TmFtZSIpOworICAgICAgICAgICAgdmFyIHJhbmdlID0gIkExOlhGRDEwNDg1NzYiOworICAgICAgICAgICAgaW50IGxlZnRDb2x1bW4sIHRvcFJvdywgcmlnaHRDb2x1bW4sIGJvdHRvbVJvdzsKKyAgICAgICAgICAgIFhsc3hUYWJsZXMuUGFyc2VSYW5nZShyYW5nZSwgb3V0IGxlZnRDb2x1bW4sIG91dCB0b3BSb3csIG91dCByaWdodENvbHVtbiwgb3V0IGJvdHRvbVJvdyk7CisgICAgICAgICAgICByZXR1cm4gUmV0cmlldmVSYW5nZShzRG9jLCBzaGVldE5hbWUsIGxlZnRDb2x1bW4sIHRvcFJvdywgcmlnaHRDb2x1bW4sIGJvdHRvbVJvdyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IFJldHJpZXZlUmFuZ2UoU21sRG9jdW1lbnQgc21sRG9jLCBzdHJpbmcgc2hlZXROYW1lLCBzdHJpbmcgcmFuZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXMuV3JpdGUoc21sRG9jLkRvY3VtZW50Qnl0ZUFycmF5LCAwLCBzbWxEb2MuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB1c2luZyAoU3ByZWFkc2hlZXREb2N1bWVudCBzRG9jID0gU3ByZWFkc2hlZXREb2N1bWVudC5PcGVuKG1zLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmV0cmlldmVSYW5nZShzRG9jLCBzaGVldE5hbWUsIHJhbmdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IFJldHJpZXZlUmFuZ2Uoc3RyaW5nIGZpbGVOYW1lLCBzdHJpbmcgc2hlZXROYW1lLCBzdHJpbmcgcmFuZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4oZmlsZU5hbWUsIGZhbHNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmV0cmlldmVSYW5nZShzRG9jLCBzaGVldE5hbWUsIHJhbmdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWEVsZW1lbnQgUmV0cmlldmVSYW5nZShTcHJlYWRzaGVldERvY3VtZW50IHNEb2MsIHN0cmluZyBzaGVldE5hbWUsIHN0cmluZyByYW5nZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxlZnRDb2x1bW4sIHRvcFJvdywgcmlnaHRDb2x1bW4sIGJvdHRvbVJvdzsKKyAgICAgICAgICAgIFhsc3hUYWJsZXMuUGFyc2VSYW5nZShyYW5nZSwgb3V0IGxlZnRDb2x1bW4sIG91dCB0b3BSb3csIG91dCByaWdodENvbHVtbiwgb3V0IGJvdHRvbVJvdyk7CisgICAgICAgICAgICByZXR1cm4gUmV0cmlldmVSYW5nZShzRG9jLCBzaGVldE5hbWUsIGxlZnRDb2x1bW4sIHRvcFJvdywgcmlnaHRDb2x1bW4sIGJvdHRvbVJvdyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IFJldHJpZXZlUmFuZ2UoU21sRG9jdW1lbnQgc21sRG9jLCBzdHJpbmcgc2hlZXROYW1lLCBpbnQgbGVmdENvbHVtbiwgaW50IHRvcFJvdywgaW50IHJpZ2h0Q29sdW1uLCBpbnQgYm90dG9tUm93KQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKHNtbERvYy5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgc21sRG9jLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFNwcmVhZHNoZWV0RG9jdW1lbnQgc0RvYyA9IFNwcmVhZHNoZWV0RG9jdW1lbnQuT3BlbihtcywgZmFsc2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJldHJpZXZlUmFuZ2Uoc0RvYywgc2hlZXROYW1lLCBsZWZ0Q29sdW1uLCB0b3BSb3csIHJpZ2h0Q29sdW1uLCBib3R0b21Sb3cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWEVsZW1lbnQgUmV0cmlldmVSYW5nZShzdHJpbmcgZmlsZU5hbWUsIHN0cmluZyBzaGVldE5hbWUsIGludCBsZWZ0Q29sdW1uLCBpbnQgdG9wUm93LCBpbnQgcmlnaHRDb2x1bW4sIGludCBib3R0b21Sb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4oZmlsZU5hbWUsIGZhbHNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmV0cmlldmVSYW5nZShzRG9jLCBzaGVldE5hbWUsIGxlZnRDb2x1bW4sIHRvcFJvdywgcmlnaHRDb2x1bW4sIGJvdHRvbVJvdyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IFJldHJpZXZlUmFuZ2UoU3ByZWFkc2hlZXREb2N1bWVudCBzRG9jLCBzdHJpbmcgc2hlZXROYW1lLCBpbnQgbGVmdENvbHVtbiwgaW50IHRvcFJvdywgaW50IHJpZ2h0Q29sdW1uLCBpbnQgYm90dG9tUm93KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd2JYZG9jID0gc0RvYy5Xb3JrYm9va1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICB2YXIgc2hlZXQgPSB3Ylhkb2MKKyAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnNoZWV0cykKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy5zaGVldCkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQocyA9PiAoc3RyaW5nKXMuQXR0cmlidXRlKCJuYW1lIikgPT0gc2hlZXROYW1lKTsKKyAgICAgICAgICAgIGlmIChzaGVldCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzaGVldCBuYW1lIHBhc3NlZCB0byBSZXRyaWV2ZVJhbmdlIiwgInNoZWV0TmFtZSIpOworICAgICAgICAgICAgdmFyIHJJZCA9IChzdHJpbmcpc2hlZXQuQXR0cmlidXRlKFIuaWQpOworICAgICAgICAgICAgaWYgKHJJZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIHNwcmVhZHNoZWV0Iik7CisgICAgICAgICAgICB2YXIgc2hlZXRQYXJ0ID0gc0RvYy5Xb3JrYm9va1BhcnQuR2V0UGFydEJ5SWQocklkKTsKKyAgICAgICAgICAgIGlmIChzaGVldFBhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZUZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBzcHJlYWRzaGVldCIpOworICAgICAgICAgICAgdmFyIHNoWERvYyA9IHNoZWV0UGFydC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgaWYgKHNEb2MuV29ya2Jvb2tQYXJ0Lldvcmtib29rU3R5bGVzUGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIHNwcmVhZHNoZWV0LiAgTm8gV29ya2Jvb2tTdHlsZXNQYXJ0LiIpOworICAgICAgICAgICAgdmFyIHN0eWxlWERvYyA9IHNEb2MuV29ya2Jvb2tQYXJ0Lldvcmtib29rU3R5bGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gc2hhcmVkIHN0cmluZyB0YWJsZSwgc2hhcmVkU3RyaW5nVGFibGUgd2lsbCBiZSBudWxsCisgICAgICAgICAgICAvLyBpdCB3aWxsIG9ubHkgYmUgdXNlZCBpZiB0aGVyZSBpcyBhIGNlbGwgdHlwZSA9PSAicyIsIGluIHdoaWNoIGNhc2UsIHJlZmVyZW5jaW5nIHRoaXMKKyAgICAgICAgICAgIC8vIHBhcnQgd291bGQgaW5kaWNhdGUgYW4gaW52YWxpZCBzcHJlYWRzaGVldC4KKyAgICAgICAgICAgIFNoYXJlZFN0cmluZ1RhYmxlUGFydCBzaGFyZWRTdHJpbmdUYWJsZSA9IHNEb2MuV29ya2Jvb2tQYXJ0LlNoYXJlZFN0cmluZ1RhYmxlUGFydDsKKworICAgICAgICAgICAgRml4VXBDZWxsc1RoYXRIYXZlTm9SQXR0KHNoWERvYyk7CisKKyAgICAgICAgICAgIC8vIGFzc2VtYmxlIHRoZSB0cmFuc2Zvcm0KKyAgICAgICAgICAgIHZhciBzaGVldERhdGEgPSBzaFhEb2MKKyAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnNoZWV0RGF0YSkKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy5yb3cpCisgICAgICAgICAgICAgICAgLlNlbGVjdChyb3cgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlcgorICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmEgPSAoc3RyaW5nKXJvdy5BdHRyaWJ1dGUoInIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJhID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJvd05icjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnQuVHJ5UGFyc2UocmEsIG91dCByb3dOYnIpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChyb3dOYnIgPCB0b3BSb3cpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJvd05iciA+IGJvdHRvbVJvdykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgICAgIHZhciBjZWxscyA9IHJvdworICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFMuYykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoY2VsbCA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZWxsQWRkcmVzcyA9IChzdHJpbmcpY2VsbC5BdHRyaWJ1dGUoInIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbEFkZHJlc3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgc3ByZWFkc2hlZXQgLSBjZWxsIGRvZXMgbm90IGhhdmUgciBhdHRyaWJ1dGUuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNwbGl0Q2VsbEFkZHJlc3MgPSBYbHN4VGFibGVzLlNwbGl0QWRkcmVzcyhjZWxsQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbkFkZHJlc3MgPSBzcGxpdENlbGxBZGRyZXNzWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5JbmRleCA9IFhsc3hUYWJsZXMuQ29sdW1uQWRkcmVzc1RvSW5kZXgoY29sdW1uQWRkcmVzcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggPCBsZWZ0Q29sdW1uIHx8IGNvbHVtbkluZGV4ID4gcmlnaHRDb2x1bW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGxUeXBlID0gKHN0cmluZyljZWxsLkF0dHJpYnV0ZSgidCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzaGFyZWRTdHJpbmcgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsVHlwZSA9PSAicyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hhcmVkU3RyaW5nSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzaGFyZWRTdHJpbmdCZWZvcmVQYXJzaW5nID0gKHN0cmluZyljZWxsLkVsZW1lbnQoUy52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoYXJlZFN0cmluZ0JlZm9yZVBhcnNpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZFN0cmluZ0JlZm9yZVBhcnNpbmcgPSAoc3RyaW5nKWNlbGwuRWxlbWVudHMoUy5faXMpLkVsZW1lbnRzKFMudCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoYXJlZFN0cmluZ0JlZm9yZVBhcnNpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIGRvY3VtZW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW50LlRyeVBhcnNlKHNoYXJlZFN0cmluZ0JlZm9yZVBhcnNpbmcsIG91dCBzaGFyZWRTdHJpbmdJbmRleCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZUZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBkb2N1bWVudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBzaGFyZWRTdHJpbmdFbGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoYXJlZFN0cmluZ1RhYmxlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZUZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBzcHJlYWRzaGVldC4gIFNoYXJlZCBzdHJpbmcsIGJ1dCBubyBTaGFyZWQgU3RyaW5nIFBhcnQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZFN0cmluZ0VsZW1lbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkU3RyaW5nVGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5HZXRYRG9jdW1lbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnNpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNraXAoc2hhcmVkU3RyaW5nSW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoYXJlZFN0cmluZ0VsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIHNwcmVhZHNoZWV0LiAgU2hhcmVkIHN0cmluZyByZWZlcmVuY2Ugbm90IHZhbGlkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRTdHJpbmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkU3RyaW5nRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKFMudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZShlID0+IChzdHJpbmcpZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoYXJlZFN0cmluZyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgY2VsbFByb3BzID0gR2V0Q2VsbFByb3BzX05vdEluVGFibGUoc0RvYywgc3R5bGVYRG9jLCBjZWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZhbHVlID0gc2hhcmVkU3RyaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZGlzcGxheVZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29sb3IgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbFByb3BzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWUgPSBTbWxDZWxsRm9ybWF0dGVyLkZvcm1hdENlbGwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZyljZWxsUHJvcHMuQXR0cmlidXRlKCJmb3JtYXRDb2RlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IGNvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld0NlbGwxID0gbmV3IFhFbGVtZW50KCJDZWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJSZWYiLCAoc3RyaW5nKWNlbGwuQXR0cmlidXRlKCJyIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIkNvbHVtbklkIiwgY29sdW1uQWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgiQ29sdW1uTnVtYmVyIiwgY29sdW1uSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5BdHRyaWJ1dGUoImYiKSAhPSBudWxsID8gbmV3IFhBdHRyaWJ1dGUoIkZvcm11bGEiLCAoc3RyaW5nKWNlbGwuQXR0cmlidXRlKCJmIikpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuQXR0cmlidXRlKCJzIikgIT0gbnVsbCA/IG5ldyBYQXR0cmlidXRlKCJTdHlsZSIsIChzdHJpbmcpY2VsbC5BdHRyaWJ1dGUoInMiKSkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5BdHRyaWJ1dGUoInQiKSAhPSBudWxsID8gbmV3IFhBdHRyaWJ1dGUoIlR5cGUiLCAoc3RyaW5nKWNlbGwuQXR0cmlidXRlKCJ0IikpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudCgiVmFsdWUiLCB2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoIkRpc3BsYXlWYWx1ZSIsIGRpc3BsYXlWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAhPSBudWxsID8gbmV3IFhFbGVtZW50KCJEaXNwbGF5Q29sb3IiLCBjb2xvcikgOiBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q2VsbDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gKHN0cmluZyljZWxsLkF0dHJpYnV0ZSgidCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCB2YWx1ZSA9IG5ldyBYRWxlbWVudCgiVmFsdWUiLCBjZWxsLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlID09ICJpbmxpbmVTdHIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gInMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhBdHRyaWJ1dGUgdHlwZUF0dHIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUF0dHIgPSBuZXcgWEF0dHJpYnV0ZSgiVHlwZSIsIHR5cGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGNlbGxQcm9wcyA9IEdldENlbGxQcm9wc19Ob3RJblRhYmxlKHNEb2MsIHN0eWxlWERvYywgY2VsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBkaXNwbGF5VmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb2xvciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsUHJvcHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSA9IFNtbENlbGxGb3JtYXR0ZXIuRm9ybWF0Q2VsbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nKWNlbGxQcm9wcy5BdHRyaWJ1dGUoImZvcm1hdENvZGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLlZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBjb2xvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSA9IGRpc3BsYXlWYWx1ZSA9IFNtbENlbGxGb3JtYXR0ZXIuRm9ybWF0Q2VsbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nKSJHZW5lcmFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLlZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBjb2xvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld0NlbGwyID0gbmV3IFhFbGVtZW50KCJDZWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJSZWYiLCAoc3RyaW5nKWNlbGwuQXR0cmlidXRlKCJyIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIkNvbHVtbklkIiwgY29sdW1uQWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgiQ29sdW1uTnVtYmVyIiwgY29sdW1uSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLkF0dHJpYnV0ZSgiZiIpICE9IG51bGwgPyBuZXcgWEF0dHJpYnV0ZSgiRm9ybXVsYSIsIChzdHJpbmcpY2VsbC5BdHRyaWJ1dGUoImYiKSkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5BdHRyaWJ1dGUoInMiKSAhPSBudWxsID8gbmV3IFhBdHRyaWJ1dGUoIlN0eWxlIiwgKHN0cmluZyljZWxsLkF0dHJpYnV0ZSgicyIpKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudCgiRGlzcGxheVZhbHVlIiwgZGlzcGxheVZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICE9IG51bGwgPyBuZXcgWEVsZW1lbnQoIkRpc3BsYXlDb2xvciIsIGNvbG9yKSA6IG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q2VsbDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGRhdGFSb3cgPSBuZXcgWEVsZW1lbnQoIlJvdyIsCisgICAgICAgICAgICAgICAgICAgICAgICByb3cuQXR0cmlidXRlKCJyIikgIT0gbnVsbCA/IG5ldyBYQXR0cmlidXRlKCJSb3dOdW1iZXIiLCAoaW50KXJvdy5BdHRyaWJ1dGUoInIiKSkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YVJvdzsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdmFyIGRhdGFQcm9wcyA9IEdldERhdGFQcm9wcyhzaFhEb2MpOworICAgICAgICAgICAgWEVsZW1lbnQgZGF0YSA9IG5ldyBYRWxlbWVudCgiRGF0YSIsCisgICAgICAgICAgICAgICAgZGF0YVByb3BzLAorICAgICAgICAgICAgICAgIHNoZWV0RGF0YSk7CisgICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNvbWV0aW1lcyBlbmNvdW50ZXIgY2VsbHMgdGhhdCBoYXZlIG5vIHIgYXR0cmlidXRlLCBzbyBpbmZlciBpdCBpZiBwb3NzaWJsZS4KKyAgICAgICAgLy8gVGhlc2UgYXJlIGludmFsaWQgc3ByZWFkc2hlZXRzLCBidXQgYXR0ZW1wdCB0byBnZXQgdGhlIGRhdGEgYW55d2F5LgorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEZpeFVwQ2VsbHNUaGF0SGF2ZU5vUkF0dChYRG9jdW1lbnQgc2hYRG9jKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgYW55IHJvd3MgdGhhdCBoYXZlIGFsbCBjZWxscyB3aXRoIG5vIHIgYXR0cmlidXRlLCB0aGVuIGZpeCB0aGVtIHVwCisgICAgICAgICAgICB2YXIgaW52YWxpZFJvd3MgPSBzaFhEb2MKKyAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoUy5yb3cpCisgICAgICAgICAgICAgICAgLldoZXJlKHIgPT4gISByLkVsZW1lbnRzKFMuYykuQW55KGMgPT4gYy5BdHRyaWJ1dGUoInIiKSAhPSBudWxsKSkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciByb3cgaW4gaW52YWxpZFJvd3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJvd051bWJlclN0ciA9IChzdHJpbmcpcm93LkF0dHJpYnV0ZSgiciIpOworICAgICAgICAgICAgICAgIHZhciBjb2xOdW1iZXIgPSAwOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHJvdy5FbGVtZW50cyhTLmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NlbGxSZWYgPSBYbHN4VGFibGVzLkluZGV4VG9Db2x1bW5BZGRyZXNzKGNvbE51bWJlcikgKyByb3dOdW1iZXJTdHI7CisgICAgICAgICAgICAgICAgICAgIGNlbGwuQWRkKG5ldyBYQXR0cmlidXRlKCJyIiwgbmV3Q2VsbFJlZikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmVwZWF0IGl0ZXJhdGl2ZWx5IHVudGlsIG5vIGZ1cnRoZXIgZml4ZXMgY2FuIGJlIG1hZGUKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBpbnZhbGlkQ2VsbHMgPSBzaFhEb2MKKyAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKFMuYykKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGMgPT4gYy5BdHRyaWJ1dGUoInIiKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICBib29sIGRpZEZpeHVwID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gaW52YWxpZENlbGxzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZvbGxvd2luZ0NlbGwgPSBjZWxsLkVsZW1lbnRzQWZ0ZXJTZWxmKFMuYykuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGxvd2luZ0NlbGwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvbGxvd2luZ1IgPSAoc3RyaW5nKWZvbGxvd2luZ0NlbGwuQXR0cmlidXRlKCJyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9sbG93aW5nUiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcGwgPSBYbHN4VGFibGVzLlNwbGl0QWRkcmVzcyhmb2xsb3dpbmdSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sSWR4Rm9sbG93aW5nID0gWGxzeFRhYmxlcy5Db2x1bW5BZGRyZXNzVG9JbmRleChzcGxbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdSZWYgPSBYbHN4VGFibGVzLkluZGV4VG9Db2x1bW5BZGRyZXNzKGNvbElkeEZvbGxvd2luZyAtIDEpICsgc3BsWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuQWRkKG5ldyBYQXR0cmlidXRlKCJyIiwgbmV3UmVmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkRml4dXAgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZEZpeHVwID0gRml4VXBCYXNlZE9uUHJlY2VkaW5nQ2VsbChkaWRGaXh1cCwgY2VsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWRGaXh1cCA9IEZpeFVwQmFzZWRPblByZWNlZGluZ0NlbGwoZGlkRml4dXAsIGNlbGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZGlkRml4dXApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBGaXhVcEJhc2VkT25QcmVjZWRpbmdDZWxsKGJvb2wgZGlkRml4dXAsIFhFbGVtZW50IGNlbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IHByZWNlZGluZ0NlbGwgPSBHZXRQcmV2b3VzRWxlbWVudChjZWxsKTsKKyAgICAgICAgICAgIGlmIChwcmVjZWRpbmdDZWxsICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHByZWNlZGluZ1IgPSAoc3RyaW5nKXByZWNlZGluZ0NlbGwuQXR0cmlidXRlKCJyIik7CisgICAgICAgICAgICAgICAgaWYgKHByZWNlZGluZ1IgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzcGwgPSBYbHN4VGFibGVzLlNwbGl0QWRkcmVzcyhwcmVjZWRpbmdSKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNvbElkeEZvbGxvd2luZyA9IFhsc3hUYWJsZXMuQ29sdW1uQWRkcmVzc1RvSW5kZXgoc3BsWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1JlZiA9IFhsc3hUYWJsZXMuSW5kZXhUb0NvbHVtbkFkZHJlc3MoY29sSWR4Rm9sbG93aW5nICsgMSkgKyBzcGxbMV07CisgICAgICAgICAgICAgICAgICAgIGNlbGwuQWRkKG5ldyBYQXR0cmlidXRlKCJyIiwgbmV3UmVmKSk7CisgICAgICAgICAgICAgICAgICAgIGRpZEZpeHVwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGlkRml4dXA7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRQcmV2b3VzRWxlbWVudChYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBwcmV2aW91c0VsZW1lbnQgPSBudWxsOworICAgICAgICAgICAgWE5vZGUgY3VycmVudE5vZGUgPSBlbGVtZW50OworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLlByZXZpb3VzTm9kZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQgPSBjdXJyZW50Tm9kZS5QcmV2aW91c05vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNFbGVtZW50OworICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuUHJldmlvdXNOb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRWxlbWVudCBSZXRyaWV2ZVRhYmxlKFNtbERvY3VtZW50IHNtbERvYywgc3RyaW5nIHNoZWV0TmFtZSwgc3RyaW5nIHRhYmxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtcy5Xcml0ZShzbWxEb2MuRG9jdW1lbnRCeXRlQXJyYXksIDAsIHNtbERvYy5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4obXMsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXRyaWV2ZVRhYmxlKHNEb2MsIHRhYmxlTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRWxlbWVudCBSZXRyaWV2ZVRhYmxlKHN0cmluZyBmaWxlTmFtZSwgc3RyaW5nIHRhYmxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKFNwcmVhZHNoZWV0RG9jdW1lbnQgc0RvYyA9IFNwcmVhZHNoZWV0RG9jdW1lbnQuT3BlbihmaWxlTmFtZSwgZmFsc2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXRyaWV2ZVRhYmxlKHNEb2MsIHRhYmxlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IFJldHJpZXZlVGFibGUoU3ByZWFkc2hlZXREb2N1bWVudCBzRG9jLCBzdHJpbmcgdGFibGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdGFibGUgPSBzRG9jLlRhYmxlKHRhYmxlTmFtZSk7CisgICAgICAgICAgICBpZiAodGFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRhYmxlIG5vdCBmb3VuZCIsICJ0YWJsZU5hbWUiKTsKKworICAgICAgICAgICAgdmFyIHN0eWxlWERvYyA9IHNEb2MuV29ya2Jvb2tQYXJ0Lldvcmtib29rU3R5bGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciByID0gdGFibGUuUmVmOworICAgICAgICAgICAgaW50IGxlZnRDb2x1bW4sIHRvcFJvdywgcmlnaHRDb2x1bW4sIGJvdHRvbVJvdzsKKyAgICAgICAgICAgIFhsc3hUYWJsZXMuUGFyc2VSYW5nZShyLCBvdXQgbGVmdENvbHVtbiwgb3V0IHRvcFJvdywgb3V0IHJpZ2h0Q29sdW1uLCBvdXQgYm90dG9tUm93KTsKKyAgICAgICAgICAgIHZhciBzaFhEb2MgPSB0YWJsZS5QYXJlbnQuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIEZpeFVwQ2VsbHNUaGF0SGF2ZU5vUkF0dChzaFhEb2MpOworCisgICAgICAgICAgICAvLyBhc3NlbWJsZSB0aGUgdHJhbnNmb3JtCisgICAgICAgICAgICB2YXIgY29sdW1ucyA9IG5ldyBYRWxlbWVudCgiQ29sdW1ucyIsCisgICAgICAgICAgICAgICAgdGFibGUuVGFibGVDb2x1bW5zKCkuU2VsZWN0KHRjID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY29sWEVsZW1lbnQgPSBuZXcgWEVsZW1lbnQoIkNvbHVtbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB0Yy5OYW1lICE9IG51bGwgPyBuZXcgWEF0dHJpYnV0ZSgiTmFtZSIsIHRjLk5hbWUpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjLlVuaXF1ZU5hbWUgIT0gbnVsbCA/IG5ldyBYQXR0cmlidXRlKCJVbmlxdWVOYW1lIiwgdGMuVW5pcXVlTmFtZSkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIkNvbHVtbkluZGV4IiwgdGMuQ29sdW1uSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIklkIiwgdGMuSWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGMuRGF0YUR4ZklkICE9IG51bGwgPyBuZXcgWEF0dHJpYnV0ZSgiRGF0YUR4ZklkIiwgdGMuRGF0YUR4ZklkKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICB0Yy5RdWVyeVRhYmxlRmllbGRJZCAhPSBudWxsID8gbmV3IFhBdHRyaWJ1dGUoIlF1ZXJ5VGFibGVGaWVsZElkIiwgdGMuUXVlcnlUYWJsZUZpZWxkSWQpIDogbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xYRWxlbWVudDsKKyAgICAgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgICAgIHZhciBkYXRhUHJvcHMgPSBHZXREYXRhUHJvcHMoc2hYRG9jKTsKKyAgICAgICAgICAgIHZhciBkYXRhID0gbmV3IFhFbGVtZW50KCJEYXRhIiwKKyAgICAgICAgICAgICAgICBkYXRhUHJvcHMsCisgICAgICAgICAgICAgICAgdGFibGUuVGFibGVSb3dzKCkuU2VsZWN0KHRyID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgcm93UmVmOworICAgICAgICAgICAgICAgICAgICBpZiAoIWludC5UcnlQYXJzZSh0ci5Sb3cuUm93SWQsIG91dCByb3dSZWYpKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgc3ByZWFkc2hlZXQiKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJvd1JlZiA8IHRvcFJvdyB8fCByb3dSZWYgPiBib3R0b21Sb3cpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbERhdGEgPSB0ci5Sb3cuQ2VsbHMoKS5TZWxlY3QodGMgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uSW5kZXggPSB0Yy5Db2x1bW5JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA8IGxlZnRDb2x1bW4gfHwgY29sdW1uSW5kZXggPiByaWdodENvbHVtbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgY2VsbFByb3BzID0gR2V0Q2VsbFByb3BzX0luVGFibGUoc0RvYywgc3R5bGVYRG9jLCB0YWJsZSwgdGMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRjLlNoYXJlZFN0cmluZyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBkaXNwbGF5VmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbG9yID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbFByb3BzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSA9IFNtbENlbGxGb3JtYXR0ZXIuRm9ybWF0Q2VsbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmcpY2VsbFByb3BzLkF0dHJpYnV0ZSgiZm9ybWF0Q29kZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMuU2hhcmVkU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IGNvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSA9IHRjLlNoYXJlZFN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdDZWxsMSA9IG5ldyBYRWxlbWVudCgiQ2VsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjLkNlbGxFbGVtZW50ICE9IG51bGwgPyBuZXcgWEF0dHJpYnV0ZSgiUmVmIiwgKHN0cmluZyl0Yy5DZWxsRWxlbWVudC5BdHRyaWJ1dGUoInIiKSkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yy5Db2x1bW5BZGRyZXNzICE9IG51bGwgPyBuZXcgWEF0dHJpYnV0ZSgiQ29sdW1uSWQiLCB0Yy5Db2x1bW5BZGRyZXNzKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJDb2x1bW5OdW1iZXIiLCB0Yy5Db2x1bW5JbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjLlR5cGUgIT0gbnVsbCA/IG5ldyBYQXR0cmlidXRlKCJUeXBlIiwgInMiKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjLkZvcm11bGEgIT0gbnVsbCA/IG5ldyBYQXR0cmlidXRlKCJGb3JtdWxhIiwgdGMuRm9ybXVsYSkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yy5TdHlsZSAhPSBudWxsID8gbmV3IFhBdHRyaWJ1dGUoIlN0eWxlIiwgdGMuU3R5bGUpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoIlZhbHVlIiwgdGMuU2hhcmVkU3RyaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KCJEaXNwbGF5VmFsdWUiLCBkaXNwbGF5VmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAhPSBudWxsID8gbmV3IFhFbGVtZW50KCJEaXNwbGF5Q29sb3IiLCBjb2xvcikgOiBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q2VsbDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEF0dHJpYnV0ZSB0eXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGMuVHlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRjLlR5cGUgPT0gImlubGluZVN0ciIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gbmV3IFhBdHRyaWJ1dGUoIlR5cGUiLCAicyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gbmV3IFhBdHRyaWJ1dGUoIlR5cGUiLCB0Yy5UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGRpc3BsYXlWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29sb3IgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsUHJvcHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlID0gU21sQ2VsbEZvcm1hdHRlci5Gb3JtYXRDZWxsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZyljZWxsUHJvcHMuQXR0cmlidXRlKCJmb3JtYXRDb2RlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yy5WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBjb2xvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWUgPSBTbWxDZWxsRm9ybWF0dGVyLkZvcm1hdENlbGwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nKSJHZW5lcmFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjLlZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IGNvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdDZWxsID0gbmV3IFhFbGVtZW50KCJDZWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMuQ2VsbEVsZW1lbnQgIT0gbnVsbCA/IG5ldyBYQXR0cmlidXRlKCJSZWYiLCAoc3RyaW5nKXRjLkNlbGxFbGVtZW50LkF0dHJpYnV0ZSgiciIpKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjLkNvbHVtbkFkZHJlc3MgIT0gbnVsbCA/IG5ldyBYQXR0cmlidXRlKCJDb2x1bW5JZCIsIHRjLkNvbHVtbkFkZHJlc3MpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIkNvbHVtbk51bWJlciIsIHRjLkNvbHVtbkluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMuRm9ybXVsYSAhPSBudWxsID8gbmV3IFhBdHRyaWJ1dGUoIkZvcm11bGEiLCB0Yy5Gb3JtdWxhKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjLlN0eWxlICE9IG51bGwgPyBuZXcgWEF0dHJpYnV0ZSgiU3R5bGUiLCB0Yy5TdHlsZSkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudCgiVmFsdWUiLCB0Yy5WYWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudCgiRGlzcGxheVZhbHVlIiwgZGlzcGxheVZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgIT0gbnVsbCA/IG5ldyBYRWxlbWVudCgiRGlzcGxheUNvbG9yIiwgY29sb3IpIDogbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0NlbGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB2YXIgcm93UHJvcHMgPSBHZXRSb3dQcm9wcyh0ci5Sb3cuUm93RWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdSb3cgPSBuZXcgWEVsZW1lbnQoIlJvdyIsCisgICAgICAgICAgICAgICAgICAgICAgICByb3dQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJSb3dOdW1iZXIiLCB0ci5Sb3cuUm93SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2VsbERhdGEpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3Um93OworICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgWEVsZW1lbnQgdGFibGVQcm9wcyA9IEdldFRhYmxlUHJvcHModGFibGUpOworICAgICAgICAgICAgdmFyIHRhYmxlWG1sID0gbmV3IFhFbGVtZW50KCJUYWJsZSIsCisgICAgICAgICAgICAgICAgdGFibGVQcm9wcywKKyAgICAgICAgICAgICAgICB0YWJsZS5UYWJsZU5hbWUgIT0gbnVsbCA/IG5ldyBYQXR0cmlidXRlKCJUYWJsZU5hbWUiLCB0YWJsZS5UYWJsZU5hbWUpIDogbnVsbCwKKyAgICAgICAgICAgICAgICB0YWJsZS5EaXNwbGF5TmFtZSAhPSBudWxsID8gbmV3IFhBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgdGFibGUuRGlzcGxheU5hbWUpIDogbnVsbCwKKyAgICAgICAgICAgICAgICB0YWJsZS5SZWYgIT0gbnVsbCA/IG5ldyBYQXR0cmlidXRlKCJSZWYiLCB0YWJsZS5SZWYpIDogbnVsbCwKKyAgICAgICAgICAgICAgICB0YWJsZS5IZWFkZXJSb3dDb3VudCAhPSBudWxsID8gbmV3IFhBdHRyaWJ1dGUoIkhlYWRlclJvd0NvdW50IiwgdGFibGUuSGVhZGVyUm93Q291bnQpIDogbnVsbCwKKyAgICAgICAgICAgICAgICB0YWJsZS5Ub3RhbHNSb3dDb3VudCAhPSBudWxsID8gbmV3IFhBdHRyaWJ1dGUoIlRvdGFsc1Jvd0NvdW50IiwgdGFibGUuVG90YWxzUm93Q291bnQpIDogbnVsbCwKKyAgICAgICAgICAgICAgICBjb2x1bW5zLAorICAgICAgICAgICAgICAgIGRhdGEpOworICAgICAgICAgICAgcmV0dXJuIHRhYmxlWG1sOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmdbXSBTaGVldE5hbWVzKFNtbERvY3VtZW50IHNtbERvYykKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtcy5Xcml0ZShzbWxEb2MuRG9jdW1lbnRCeXRlQXJyYXksIDAsIHNtbERvYy5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4obXMsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTaGVldE5hbWVzKHNEb2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nW10gU2hlZXROYW1lcyhzdHJpbmcgZmlsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4oZmlsZU5hbWUsIGZhbHNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU2hlZXROYW1lcyhzRG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nW10gU2hlZXROYW1lcyhTcHJlYWRzaGVldERvY3VtZW50IHNEb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3b3JrYm9va1hEb2MgPSBzRG9jLldvcmtib29rUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciBzaGVldE5hbWVzID0gd29ya2Jvb2tYRG9jLlJvb3QuRWxlbWVudHMoUy5zaGVldHMpLkVsZW1lbnRzKFMuc2hlZXQpLkF0dHJpYnV0ZXMoIm5hbWUiKS5TZWxlY3QoYSA9PiAoc3RyaW5nKWEpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIHJldHVybiBzaGVldE5hbWVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmdbXSBUYWJsZU5hbWVzKFNtbERvY3VtZW50IHNtbERvYykKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtcy5Xcml0ZShzbWxEb2MuRG9jdW1lbnRCeXRlQXJyYXksIDAsIHNtbERvYy5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4obXMsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUYWJsZU5hbWVzKHNEb2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nW10gVGFibGVOYW1lcyhzdHJpbmcgZmlsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4oZmlsZU5hbWUsIGZhbHNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFibGVOYW1lcyhzRG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nW10gVGFibGVOYW1lcyhTcHJlYWRzaGVldERvY3VtZW50IHNEb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3b3JrYm9va1hEb2MgPSBzRG9jLldvcmtib29rUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciBzaGVldHMgPSB3b3JrYm9va1hEb2MuUm9vdC5FbGVtZW50cyhTLnNoZWV0cykuRWxlbWVudHMoUy5zaGVldCk7CisgICAgICAgICAgICB2YXIgdGFibGVOYW1lcyA9IHNoZWV0cy5TZWxlY3Qoc2ggPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBySWQgPSAoc3RyaW5nKXNoLkF0dHJpYnV0ZShSLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNoZWV0UGFydCA9IHNEb2MuV29ya2Jvb2tQYXJ0LkdldFBhcnRCeUlkKHJJZCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBzaGVldFhEb2MgPSBzaGVldFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZVBhcnRzID0gc2hlZXRYRG9jLlJvb3QuRWxlbWVudChTLnRhYmxlUGFydHMpOworICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVQYXJ0cyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlTmFtZXMyID0gdGFibGVQYXJ0cworICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFMudGFibGVQYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdCh0cCA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cFJJZCA9IChzdHJpbmcpdHAuQXR0cmlidXRlKFIuaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cGFydCA9IHNoZWV0UGFydC5HZXRQYXJ0QnlJZCh0cFJJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRweGQgPSB0cGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IChzdHJpbmcpdHB4ZC5Sb290LkF0dHJpYnV0ZSgibmFtZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlTmFtZXMyOworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAuU2VsZWN0TWFueShtID0+IG0pCisgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgcmV0dXJuIHRhYmxlTmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRUYWJsZVByb3BzKFRhYmxlIHRhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCB0YWJsZVByb3BzID0gbmV3IFhFbGVtZW50KCJUYWJsZVByb3BzIik7CisgICAgICAgICAgICBYRWxlbWVudCB0YWJsZVN0eWxlSW5mbyA9IHRhYmxlLlRhYmxlU3R5bGVJbmZvOworICAgICAgICAgICAgaWYgKHRhYmxlU3R5bGVJbmZvICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG5ld1RhYmxlU3R5bGVJbmZvID0gVHJhbnNmb3JtUmVtb3ZlTmFtZXNwYWNlKHRhYmxlU3R5bGVJbmZvKTsKKyAgICAgICAgICAgICAgICB0YWJsZVByb3BzLkFkZChuZXdUYWJsZVN0eWxlSW5mbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghdGFibGVQcm9wcy5IYXNFbGVtZW50cyAmJiAhdGFibGVQcm9wcy5IYXNFbGVtZW50cykKKyAgICAgICAgICAgICAgICB0YWJsZVByb3BzID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiB0YWJsZVByb3BzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgR2V0RGF0YVByb3BzKFhEb2N1bWVudCBzaFhEb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzaGVldEZvcm1hdFByID0gc2hYRG9jLlJvb3QuRWxlbWVudChTLnNoZWV0Rm9ybWF0UHIpOworICAgICAgICAgICAgaWYgKHNoZWV0Rm9ybWF0UHIgIT0gbnVsbCAmJiBzaGVldEZvcm1hdFByLkF0dHJpYnV0ZSgiZGVmYXVsdENvbFdpZHRoIikgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzaGVldEZvcm1hdFByLkFkZChuZXcgWEF0dHJpYnV0ZSgiZGVmYXVsdENvbFdpZHRoIiwgIjkuMjUiKSk7CisgICAgICAgICAgICBpZiAoc2hlZXRGb3JtYXRQciAhPSBudWxsICYmIHNoZWV0Rm9ybWF0UHIuQXR0cmlidXRlKCJkZWZhdWx0Um93SGVpZ2h0IikgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzaGVldEZvcm1hdFByLkFkZChuZXcgWEF0dHJpYnV0ZSgiZGVmYXVsdFJvd0hlaWdodCIsICIxNC4yNSIpKTsKKworICAgICAgICAgICAgdmFyIG1lcmdlQ2VsbHMgPSBUcmFuc2Zvcm1SZW1vdmVOYW1lc3BhY2Uoc2hYRG9jLlJvb3QuRWxlbWVudChTLm1lcmdlQ2VsbHMpKTsKKworICAgICAgICAgICAgdmFyIGRhdGFQcm9wcyA9IG5ldyBYRWxlbWVudCgiRGF0YVByb3BzIiwKKyAgICAgICAgICAgICAgICBUcmFuc2Zvcm1SZW1vdmVOYW1lc3BhY2Uoc2hlZXRGb3JtYXRQciksCisgICAgICAgICAgICAgICAgVHJhbnNmb3JtUmVtb3ZlTmFtZXNwYWNlKHNoWERvYy5Sb290LkVsZW1lbnQoUy5jb2xzKSksCisgICAgICAgICAgICAgICAgbWVyZ2VDZWxscyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICghZGF0YVByb3BzLkhhc0F0dHJpYnV0ZXMgJiYgIWRhdGFQcm9wcy5IYXNFbGVtZW50cykKKyAgICAgICAgICAgICAgICBkYXRhUHJvcHMgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIGRhdGFQcm9wczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEdldFJvd1Byb3BzKFhFbGVtZW50IHJvd0VsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByb3dQcm9wcyA9IG5ldyBYRWxlbWVudCgiUm93UHJvcHMiKTsKKyAgICAgICAgICAgIHZhciBodCA9IHJvd0VsZW1lbnQuQXR0cmlidXRlKCJodCIpOworICAgICAgICAgICAgaWYgKGh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcm93UHJvcHMuQWRkKGh0KTsKKyAgICAgICAgICAgIHZhciBkeURlc2NlbnQgPSByb3dFbGVtZW50LkF0dHJpYnV0ZSh4MTRhYyArICJkeURlc2NlbnQiKTsKKyAgICAgICAgICAgIGlmIChkeURlc2NlbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByb3dQcm9wcy5BZGQobmV3IFhBdHRyaWJ1dGUoImR5RGVzY2VudCIsIChzdHJpbmcpZHlEZXNjZW50KSk7CisKKyAgICAgICAgICAgIGlmICghcm93UHJvcHMuSGFzQXR0cmlidXRlcyAmJiAhcm93UHJvcHMuSGFzRWxlbWVudHMpCisgICAgICAgICAgICAgICAgcm93UHJvcHMgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHJvd1Byb3BzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgR2V0Q2VsbFByb3BzX05vdEluVGFibGUoU3ByZWFkc2hlZXREb2N1bWVudCBzRG9jLCBYRG9jdW1lbnQgc3R5bGVYRG9jLCBYRWxlbWVudCBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2VsbFByb3BzID0gbmV3IFhFbGVtZW50KCJDZWxsUHJvcHMiKTsKKyAgICAgICAgICAgIHZhciBzdHlsZSA9IChpbnQ/KWNlbGwuQXR0cmlidXRlKCJzIik7CisgICAgICAgICAgICBpZiAoc3R5bGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2VsbFByb3BzOworCisgICAgICAgICAgICB2YXIgeGYgPSBzdHlsZVhEb2MKKyAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLmNlbGxYZnMpCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFMueGYpCisgICAgICAgICAgICAgICAgLlNraXAoKGludClzdHlsZSkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKworICAgICAgICAgICAgdmFyIG51bUZtdElkID0gKGludD8peGYuQXR0cmlidXRlKCJudW1GbXRJZCIpOworICAgICAgICAgICAgaWYgKG51bUZtdElkICE9IG51bGwpCisgICAgICAgICAgICAgICAgQWRkTnVtRm10SWRBbmRGb3JtYXRDb2RlKHN0eWxlWERvYywgY2VsbFByb3BzLCBudW1GbXRJZCk7CisKKyAgICAgICAgICAgIHZhciBtYXN0ZXJYZklkID0gKGludD8peGYuQXR0cmlidXRlKCJ4ZklkIik7CisgICAgICAgICAgICBpZiAobWFzdGVyWGZJZCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBtYXN0ZXJYZiA9IHN0eWxlWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy5jZWxsU3R5bGVYZnMpCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnhmKQorICAgICAgICAgICAgICAgICAgICAuU2tpcCgoaW50KW1hc3RlclhmSWQpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmIChtYXN0ZXJYZiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBBZGRGb3JtYXR0aW5nVG9DZWxsUHJvcHMoc3R5bGVYRG9jLCBjZWxsUHJvcHMsIG1hc3RlclhmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQWRkRm9ybWF0dGluZ1RvQ2VsbFByb3BzKHN0eWxlWERvYywgY2VsbFByb3BzLCB4Zik7CisgICAgICAgICAgICBBdWdtZW50QW5kQ2xlYW5VcFByb3BzKGNlbGxQcm9wcyk7CisKKyAgICAgICAgICAgIGlmICghY2VsbFByb3BzLkhhc0VsZW1lbnRzICYmICFjZWxsUHJvcHMuSGFzQXR0cmlidXRlcykKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBjZWxsUHJvcHM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRDZWxsUHJvcHNfSW5UYWJsZShTcHJlYWRzaGVldERvY3VtZW50IHNEb2MsIFhEb2N1bWVudCBzdHlsZVhEb2MsIFRhYmxlIHRhYmxlLCBDZWxsIHRjKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc3R5bGUgPSB0Yy5TdHlsZTsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICB2YXIgY29sSWRTdHIgPSB0Yy5Db2x1bW5BZGRyZXNzOworICAgICAgICAgICAgaW50IGNvbE5iciA9IFhsc3hUYWJsZXMuQ29sdW1uQWRkcmVzc1RvSW5kZXgoY29sSWRTdHIpOworICAgICAgICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gdGFibGUuVGFibGVDb2x1bW5zKCkuRmlyc3RPckRlZmF1bHQoeiA9PiB6LkNvbHVtbk51bWJlciA9PSBjb2xOYnIpOworICAgICAgICAgICAgaWYgKGNvbHVtbiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIHNwcmVhZHNoZWV0Iik7CisKKyAgICAgICAgICAgIHZhciBjZWxsUHJvcHMgPSBuZXcgWEVsZW1lbnQoIkNlbGxQcm9wcyIpOworICAgICAgICAgICAgdmFyIGQgPSBjb2x1bW4uRGF0YUR4ZklkOworICAgICAgICAgICAgaWYgKGQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZGF0YUR4ZiA9IHN0eWxlWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy5keGZzKQorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy5keGYpCisgICAgICAgICAgICAgICAgICAgIC5Ta2lwKChpbnQpZCkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKGRhdGFEeGYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgc3ByZWFkc2hlZXQiKTsKKworICAgICAgICAgICAgICAgIHZhciBudW1GbXQgPSBkYXRhRHhmLkVsZW1lbnQoUy5udW1GbXQpOworICAgICAgICAgICAgICAgIGlmIChudW1GbXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBudW1GbXRJZCA9IChpbnQ/KW51bUZtdC5BdHRyaWJ1dGUoIm51bUZtdElkIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1GbXRJZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFByb3BzLkFkZChuZXcgWEF0dHJpYnV0ZSgibnVtRm10SWQiLCBudW1GbXRJZCkpOworICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0Q29kZSA9IChzdHJpbmcpbnVtRm10LkF0dHJpYnV0ZSgiZm9ybWF0Q29kZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0Q29kZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFByb3BzLkFkZChuZXcgWEF0dHJpYnV0ZSgiZm9ybWF0Q29kZSIsIGZvcm1hdENvZGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciB4ZiA9IHN0eWxlWERvYy5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFMuY2VsbFhmcykKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy54ZikKKyAgICAgICAgICAgICAgICAuU2tpcCgoaW50KXN0eWxlKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKHhmID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgc3ByZWFkc2hlZXQiKTsKKworICAgICAgICAgICAgLy8gaWYgeGYgaGFzIGRpZmZlcmVudCBudW1GbXRJZCwgdGhlbiByZXBsYWNlIHRoZSBvbmVzIGZyb20gdGhlIHRhYmxlIGRlZmluaXRpb24KKyAgICAgICAgICAgIHZhciBudW1GbXRJZDIgPSAoaW50Pyl4Zi5BdHRyaWJ1dGUoIm51bUZtdElkIik7CisgICAgICAgICAgICBpZiAobnVtRm10SWQyICE9IG51bGwpCisgICAgICAgICAgICAgICAgQWRkTnVtRm10SWRBbmRGb3JtYXRDb2RlKHN0eWxlWERvYywgY2VsbFByb3BzLCBudW1GbXRJZDIpOworCisgICAgICAgICAgICB2YXIgbWFzdGVyWGZJZCA9IChpbnQ/KXhmLkF0dHJpYnV0ZSgieGZJZCIpOworICAgICAgICAgICAgaWYgKG1hc3RlclhmSWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbWFzdGVyWGYgPSBzdHlsZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFMuY2VsbFN0eWxlWGZzKQorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy54ZikKKyAgICAgICAgICAgICAgICAgICAgLlNraXAoKGludCltYXN0ZXJYZklkKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBpZiAobWFzdGVyWGYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgQWRkRm9ybWF0dGluZ1RvQ2VsbFByb3BzKHN0eWxlWERvYywgY2VsbFByb3BzLCBtYXN0ZXJYZik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFkZEZvcm1hdHRpbmdUb0NlbGxQcm9wcyhzdHlsZVhEb2MsIGNlbGxQcm9wcywgeGYpOworICAgICAgICAgICAgQXVnbWVudEFuZENsZWFuVXBQcm9wcyhjZWxsUHJvcHMpOworCisgICAgICAgICAgICBpZiAoIWNlbGxQcm9wcy5IYXNFbGVtZW50cyAmJiAhY2VsbFByb3BzLkhhc0F0dHJpYnV0ZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gY2VsbFByb3BzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGROdW1GbXRJZEFuZEZvcm1hdENvZGUoWERvY3VtZW50IHN0eWxlWERvYywgWEVsZW1lbnQgcHJvcHMsIGludD8gbnVtRm10SWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleGlzdGluZ051bUZtdElkID0gcHJvcHMuQXR0cmlidXRlKCJudW1GbXRJZCIpOworICAgICAgICAgICAgaWYgKGV4aXN0aW5nTnVtRm10SWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBleGlzdGluZ051bUZtdElkLlZhbHVlID0gbnVtRm10SWQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcm9wcy5BZGQobmV3IFhBdHRyaWJ1dGUoIm51bUZtdElkIiwgbnVtRm10SWQpKTsKKworICAgICAgICAgICAgdmFyIG51bUZtdCA9IHN0eWxlWERvYworICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFMubnVtRm10cykKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy5udW1GbXQpCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KHogPT4gKGludCl6LkF0dHJpYnV0ZSgibnVtRm10SWQiKSA9PSBudW1GbXRJZCk7CisKKyAgICAgICAgICAgIGlmIChudW1GbXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZm9ybWF0Q29kZSA9IEdldEZvcm1hdENvZGVGcm9tRm10SWQoKGludCludW1GbXRJZCk7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdENvZGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0Zvcm1hdENvZGUgPSBwcm9wcy5BdHRyaWJ1dGUoImZvcm1hdENvZGUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRm9ybWF0Q29kZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdGb3JtYXRDb2RlLlZhbHVlID0gZm9ybWF0Q29kZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMuQWRkKG5ldyBYQXR0cmlidXRlKCJmb3JtYXRDb2RlIiwgZm9ybWF0Q29kZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZm9ybWF0Q29kZSA9IChzdHJpbmcpbnVtRm10LkF0dHJpYnV0ZSgiZm9ybWF0Q29kZSIpOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDb2RlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdGb3JtYXRDb2RlID0gcHJvcHMuQXR0cmlidXRlKCJmb3JtYXRDb2RlIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0Zvcm1hdENvZGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRm9ybWF0Q29kZS5WYWx1ZSA9IGZvcm1hdENvZGU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLkFkZChuZXcgWEF0dHJpYnV0ZSgiZm9ybWF0Q29kZSIsIGZvcm1hdENvZGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZEZvcm1hdHRpbmdUb0NlbGxQcm9wcyhYRG9jdW1lbnQgc3R5bGVYRG9jLCBYRWxlbWVudCBwcm9wcywgWEVsZW1lbnQgeGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1vdmVCb29sZWFuQXR0cmlidXRlKHByb3BzLCB4ZiwgImFwcGx5QWxpZ25tZW50Iik7CisgICAgICAgICAgICBNb3ZlQm9vbGVhbkF0dHJpYnV0ZShwcm9wcywgeGYsICJhcHBseUJvcmRlciIpOworICAgICAgICAgICAgTW92ZUJvb2xlYW5BdHRyaWJ1dGUocHJvcHMsIHhmLCAiYXBwbHlGaWxsIik7CisgICAgICAgICAgICBNb3ZlQm9vbGVhbkF0dHJpYnV0ZShwcm9wcywgeGYsICJhcHBseUZvbnQiKTsKKyAgICAgICAgICAgIE1vdmVCb29sZWFuQXR0cmlidXRlKHByb3BzLCB4ZiwgImFwcGx5TnVtYmVyRm9ybWF0Iik7CisKKyAgICAgICAgICAgIGludD8gYm9yZGVySWQgPSAoaW50Pyl4Zi5BdHRyaWJ1dGUoImJvcmRlcklkIik7CisgICAgICAgICAgICBpbnQ/IGZpbGxJZCA9IChpbnQ/KXhmLkF0dHJpYnV0ZSgiZmlsbElkIik7CisgICAgICAgICAgICBpbnQ/IGZvbnRJZCA9IChpbnQ/KXhmLkF0dHJpYnV0ZSgiZm9udElkIik7CisKKyAgICAgICAgICAgIGlmIChmb250SWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZm9udEVsZW1lbnQgPSBzdHlsZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFMuZm9udHMpCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLmZvbnQpCisgICAgICAgICAgICAgICAgICAgIC5Ta2lwKChpbnQpZm9udElkKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZm9udEVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdGb250RWxlbWVudCA9IChYRWxlbWVudClUcmFuc2Zvcm1SZW1vdmVOYW1lc3BhY2UoZm9udEVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBBZGRPclJlcGxhY2VFbGVtZW50KHByb3BzLCBuZXdGb250RWxlbWVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmlsbElkICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZpbGxFbGVtZW50ID0gc3R5bGVYRG9jCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLmZpbGxzKQorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy5maWxsKQorICAgICAgICAgICAgICAgICAgICAuU2tpcCgoaW50KWZpbGxJZCkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKGZpbGxFbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RmlsbEVsZW1lbnQgPSAoWEVsZW1lbnQpVHJhbnNmb3JtUmVtb3ZlTmFtZXNwYWNlKGZpbGxFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgQWRkT3JSZXBsYWNlRWxlbWVudChwcm9wcywgbmV3RmlsbEVsZW1lbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJvcmRlcklkICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGJvcmRlckVsZW1lbnQgPSBzdHlsZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFMuYm9yZGVycykKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFMuYm9yZGVyKQorICAgICAgICAgICAgICAgICAgICAuU2tpcCgoaW50KWJvcmRlcklkKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYm9yZGVyRWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld2JvcmRlckVsZW1lbnQgPSAoWEVsZW1lbnQpVHJhbnNmb3JtUmVtb3ZlTmFtZXNwYWNlKGJvcmRlckVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBBZGRPclJlcGxhY2VFbGVtZW50KHByb3BzLCBuZXdib3JkZXJFbGVtZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh4Zi5FbGVtZW50KFMuYWxpZ25tZW50KSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBuZXdBbGlnbm1lbnRFbGVtZW50ID0gKFhFbGVtZW50KVRyYW5zZm9ybVJlbW92ZU5hbWVzcGFjZSh4Zi5FbGVtZW50KFMuYWxpZ25tZW50KSk7CisgICAgICAgICAgICAgICAgQWRkT3JSZXBsYWNlRWxlbWVudChwcm9wcywgbmV3QWxpZ25tZW50RWxlbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIE1vdmVCb29sZWFuQXR0cmlidXRlKFhFbGVtZW50IHByb3BzLCBYRWxlbWVudCB4ZiwgWE5hbWUgYXR0cmlidXRlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBhdHRyVmFsdWUgPSBDb252ZXJ0QXR0cmlidXRlVG9Cb29sKHhmLkF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSk7CisgICAgICAgICAgICBpZiAoYXR0clZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwcm9wcy5BdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcHJvcHMuQWRkKG5ldyBYQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGF0dHJWYWx1ZSA/ICIxIiA6ICIwIikpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJvcHMuQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpLlZhbHVlID0gYXR0clZhbHVlID8gIjEiIDogIjAiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmdbXSBJbmRleGVkQ29sb3JzID0gbmV3IHN0cmluZ1tdIHsKKyAgICAgICAgICAgICIwMDAwMDAwMCIsCisgICAgICAgICAgICAiMDBGRkZGRkYiLAorICAgICAgICAgICAgIjAwRkYwMDAwIiwKKyAgICAgICAgICAgICIwMDAwRkYwMCIsCisgICAgICAgICAgICAiMDAwMDAwRkYiLAorICAgICAgICAgICAgIjAwRkZGRjAwIiwKKyAgICAgICAgICAgICIwMEZGMDBGRiIsCisgICAgICAgICAgICAiMDAwMEZGRkYiLAorICAgICAgICAgICAgIjAwMDAwMDAwIiwKKyAgICAgICAgICAgICIwMEZGRkZGRiIsCisgICAgICAgICAgICAiMDBGRjAwMDAiLAorICAgICAgICAgICAgIjAwMDBGRjAwIiwKKyAgICAgICAgICAgICIwMDAwMDBGRiIsCisgICAgICAgICAgICAiMDBGRkZGMDAiLAorICAgICAgICAgICAgIjAwRkYwMEZGIiwKKyAgICAgICAgICAgICIwMDAwRkZGRiIsCisgICAgICAgICAgICAiMDA4MDAwMDAiLAorICAgICAgICAgICAgIjAwMDA4MDAwIiwKKyAgICAgICAgICAgICIwMDAwMDA4MCIsCisgICAgICAgICAgICAiMDA4MDgwMDAiLAorICAgICAgICAgICAgIjAwODAwMDgwIiwKKyAgICAgICAgICAgICIwMDAwODA4MCIsCisgICAgICAgICAgICAiMDBDMEMwQzAiLAorICAgICAgICAgICAgIjAwODA4MDgwIiwKKyAgICAgICAgICAgICIwMDk5OTlGRiIsCisgICAgICAgICAgICAiMDA5OTMzNjYiLAorICAgICAgICAgICAgIjAwRkZGRkNDIiwKKyAgICAgICAgICAgICIwMENDRkZGRiIsCisgICAgICAgICAgICAiMDA2NjAwNjYiLAorICAgICAgICAgICAgIjAwRkY4MDgwIiwKKyAgICAgICAgICAgICIwMDAwNjZDQyIsCisgICAgICAgICAgICAiMDBDQ0NDRkYiLAorICAgICAgICAgICAgIjAwMDAwMDgwIiwKKyAgICAgICAgICAgICIwMEZGMDBGRiIsCisgICAgICAgICAgICAiMDBGRkZGMDAiLAorICAgICAgICAgICAgIjAwMDBGRkZGIiwKKyAgICAgICAgICAgICIwMDgwMDA4MCIsCisgICAgICAgICAgICAiMDA4MDAwMDAiLAorICAgICAgICAgICAgIjAwMDA4MDgwIiwKKyAgICAgICAgICAgICIwMDAwMDBGRiIsCisgICAgICAgICAgICAiMDAwMENDRkYiLAorICAgICAgICAgICAgIjAwQ0NGRkZGIiwKKyAgICAgICAgICAgICIwMENDRkZDQyIsCisgICAgICAgICAgICAiMDBGRkZGOTkiLAorICAgICAgICAgICAgIjAwOTlDQ0ZGIiwKKyAgICAgICAgICAgICIwMEZGOTlDQyIsCisgICAgICAgICAgICAiMDBDQzk5RkYiLAorICAgICAgICAgICAgIjAwRkZDQzk5IiwKKyAgICAgICAgICAgICIwMDMzNjZGRiIsCisgICAgICAgICAgICAiMDAzM0NDQ0MiLAorICAgICAgICAgICAgIjAwOTlDQzAwIiwKKyAgICAgICAgICAgICIwMEZGQ0MwMCIsCisgICAgICAgICAgICAiMDBGRjk5MDAiLAorICAgICAgICAgICAgIjAwRkY2NjAwIiwKKyAgICAgICAgICAgICIwMDY2NjY5OSIsCisgICAgICAgICAgICAiMDA5Njk2OTYiLAorICAgICAgICAgICAgIjAwMDAzMzY2IiwKKyAgICAgICAgICAgICIwMDMzOTk2NiIsCisgICAgICAgICAgICAiMDAwMDMzMDAiLAorICAgICAgICAgICAgIjAwMzMzMzAwIiwKKyAgICAgICAgICAgICIwMDk5MzMwMCIsCisgICAgICAgICAgICAiMDA5OTMzNjYiLAorICAgICAgICAgICAgIjAwMzMzMzk5IiwKKyAgICAgICAgICAgICIwMDMzMzMzMyIsCisgICAgICAgICAgICAiU3lzdGVtIEZvcmVncm91bmQiLAorICAgICAgICAgICAgIlN5c3RlbSBCYWNrZ3JvdW5kIiwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBGb250RmFtaWx5TGlzdCA9IG5ldyBzdHJpbmdbXSB7CisgICAgICAgICAgICAiTm90IGFwcGxpY2FibGUiLAorICAgICAgICAgICAgIlJvbWFuIiwKKyAgICAgICAgICAgICJTd2lzcyIsCisgICAgICAgICAgICAiTW9kZXJuIiwKKyAgICAgICAgICAgICJTY3JpcHQiLAorICAgICAgICAgICAgIkRlY29yYXRpdmUiLAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXVnbWVudEFuZENsZWFuVXBQcm9wcyhYRWxlbWVudCBwcm9wcykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNvbG9yIGluIHByb3BzLkRlc2NlbmRhbnRzKCJjb2xvciIpLldoZXJlKGMgPT4gYy5BdHRyaWJ1dGUoImluZGV4ZWQiKSAhPSBudWxsKS5Ub0xpc3QoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaWR4ID0gKGludCljb2xvci5BdHRyaWJ1dGUoImluZGV4ZWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4IDwgSW5kZXhlZENvbG9ycy5MZW5ndGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb2xvci5BZGQobmV3IFhBdHRyaWJ1dGUoInZhbCIsIEluZGV4ZWRDb2xvcnNbaWR4XSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb2xvci5BdHRyaWJ1dGUoImluZGV4ZWQiKS5SZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmYW1pbHkgaW4gcHJvcHMuRGVzY2VuZGFudHMoImZhbWlseSIpLlRvTGlzdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmYW0gPSAoaW50PylmYW1pbHkuQXR0cmlidXRlKCJ2YWwiKTsKKyAgICAgICAgICAgICAgICBpZiAoZmFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmFtIDwgRm9udEZhbWlseUxpc3QuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkuQXR0cmlidXRlKCJ2YWwiKS5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseS5BZGQobmV3IFhBdHRyaWJ1dGUoInZhbCIsIEZvbnRGYW1pbHlMaXN0WyhpbnQpZmFtXSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIGJvcmRlciBpbiBwcm9wcy5EZXNjZW5kYW50cygiYm9yZGVyIikuVG9MaXN0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVtb3ZlSWZFbXB0eShib3JkZXIuRWxlbWVudCgibGVmdCIpKTsKKyAgICAgICAgICAgICAgICBSZW1vdmVJZkVtcHR5KGJvcmRlci5FbGVtZW50KCJyaWdodCIpKTsKKyAgICAgICAgICAgICAgICBSZW1vdmVJZkVtcHR5KGJvcmRlci5FbGVtZW50KCJ0b3AiKSk7CisgICAgICAgICAgICAgICAgUmVtb3ZlSWZFbXB0eShib3JkZXIuRWxlbWVudCgiYm90dG9tIikpOworICAgICAgICAgICAgICAgIFJlbW92ZUlmRW1wdHkoYm9yZGVyLkVsZW1lbnQoImRpYWdvbmFsIikpOworICAgICAgICAgICAgICAgIGlmICghYm9yZGVyLkhhc0F0dHJpYnV0ZXMgJiYgIWJvcmRlci5IYXNFbGVtZW50cykKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyLlJlbW92ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZpbGwgaW4gcHJvcHMuRGVzY2VuZGFudHMoImZpbGwiKS5Ub0xpc3QoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWxsLkVsZW1lbnRzKCJwYXR0ZXJuRmlsbCIpLldoZXJlKHBmID0+IChzdHJpbmcpcGYuQXR0cmlidXRlKCJwYXR0ZXJuVHlwZSIpID09ICJub25lIikuUmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgaWYgKCFmaWxsLkhhc0F0dHJpYnV0ZXMgJiYgIWZpbGwuSGFzRWxlbWVudHMpCisgICAgICAgICAgICAgICAgICAgIGZpbGwuUmVtb3ZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFJlbW92ZUlmRW1wdHkoWEVsZW1lbnQgeEVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh4RWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGlmICgheEVsZW1lbnQuSGFzQXR0cmlidXRlcyAmJiAheEVsZW1lbnQuSGFzRWxlbWVudHMpCisgICAgICAgICAgICAgICAgeEVsZW1lbnQuUmVtb3ZlKCk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBUcmFuc2Zvcm1SZW1vdmVOYW1lc3BhY2UoWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZS5Mb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLlNlbGVjdChhID0+IG5ldyBYQXR0cmlidXRlKGEuTmFtZS5Mb2NhbE5hbWUsIChzdHJpbmcpYSkpLk9yZGVyQnkoYSA9PiAoc3RyaW5nKWEuTmFtZS5Mb2NhbE5hbWUpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtUmVtb3ZlTmFtZXNwYWNlKG4pKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBHZXRGb3JtYXRDb2RlRnJvbUZtdElkKGludCBmbXRJZCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChmbXRJZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiAiR2VuZXJhbCI7CisgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gIjAiOworICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuICIwLjAwIjsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiAiIywjIzAiOworICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuICIjLCMjMC4wMCI7CisgICAgICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4gIjAlIjsKKyAgICAgICAgICAgICAgICBjYXNlIDEwOiByZXR1cm4gIjAuMDAlIjsKKyAgICAgICAgICAgICAgICBjYXNlIDExOiByZXR1cm4gIjAuMDBFKzAwIjsKKyAgICAgICAgICAgICAgICBjYXNlIDEyOiByZXR1cm4gIiMgPy8/IjsKKyAgICAgICAgICAgICAgICBjYXNlIDEzOiByZXR1cm4gIiMgPz8vPz8iOworICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHJldHVybiAibW0tZGQteXkiOworICAgICAgICAgICAgICAgIGNhc2UgMTU6IHJldHVybiAiZC1tbW0teXkiOworICAgICAgICAgICAgICAgIGNhc2UgMTY6IHJldHVybiAiZC1tbW0iOworICAgICAgICAgICAgICAgIGNhc2UgMTc6IHJldHVybiAibW1tLXl5IjsKKyAgICAgICAgICAgICAgICBjYXNlIDE4OiByZXR1cm4gImg6bW0gQU0vUE0iOworICAgICAgICAgICAgICAgIGNhc2UgMTk6IHJldHVybiAiaDptbTpzcyBBTS9QTSI7CisgICAgICAgICAgICAgICAgY2FzZSAyMDogcmV0dXJuICJoOm1tIjsKKyAgICAgICAgICAgICAgICBjYXNlIDIxOiByZXR1cm4gImg6bW06c3MiOworICAgICAgICAgICAgICAgIGNhc2UgMjI6IHJldHVybiAiMjIgbS9kL3l5IGg6bW0iOworICAgICAgICAgICAgICAgIGNhc2UgMzc6IHJldHVybiAiIywjIzAgOygjLCMjMCkiOworICAgICAgICAgICAgICAgIGNhc2UgMzg6IHJldHVybiAiIywjIzAgO1tSZWRdKCMsIyMwKSI7CisgICAgICAgICAgICAgICAgY2FzZSAzOTogcmV0dXJuICIjLCMjMC4wMDsoIywjIzAuMDApIjsKKyAgICAgICAgICAgICAgICBjYXNlIDQwOiByZXR1cm4gIiMsIyMwLjAwO1tSZWRdKCMsIyMwLjAwKSI7CisgICAgICAgICAgICAgICAgY2FzZSA0NTogcmV0dXJuICJtbTpzcyI7CisgICAgICAgICAgICAgICAgY2FzZSA0NjogcmV0dXJuICJbaF06bW06c3MiOworICAgICAgICAgICAgICAgIGNhc2UgNDc6IHJldHVybiAibW1zcy4wIjsKKyAgICAgICAgICAgICAgICBjYXNlIDQ4OiByZXR1cm4gIiMjMC4wRSswIjsKKyAgICAgICAgICAgICAgICBjYXNlIDQ5OiByZXR1cm4gIkAiOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRPclJlcGxhY2VFbGVtZW50KFhFbGVtZW50IHByb3BzLCBYTmFtZSBjaGlsZEVsZW1lbnROYW1lLCBpbnQgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleGlzdGluZ0VsZW1lbnQgPSBwcm9wcy5FbGVtZW50KGNoaWxkRWxlbWVudE5hbWUpOworICAgICAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5SZXBsYWNlV2l0aChuZXcgWEVsZW1lbnQoY2hpbGRFbGVtZW50TmFtZSwgbmV3IFhBdHRyaWJ1dGUoIlZhbCIsIHZhbHVlKSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByb3BzLkFkZChuZXcgWEVsZW1lbnQoY2hpbGRFbGVtZW50TmFtZSwgbmV3IFhBdHRyaWJ1dGUoIlZhbCIsIHZhbHVlKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRPclJlcGxhY2VFbGVtZW50KFhFbGVtZW50IHByb3BzLCBYTmFtZSBjaGlsZEVsZW1lbnROYW1lLCBzdHJpbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleGlzdGluZ0VsZW1lbnQgPSBwcm9wcy5FbGVtZW50KGNoaWxkRWxlbWVudE5hbWUpOworICAgICAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5SZXBsYWNlV2l0aChuZXcgWEVsZW1lbnQoY2hpbGRFbGVtZW50TmFtZSwgbmV3IFhBdHRyaWJ1dGUoIlZhbCIsIHZhbHVlKSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByb3BzLkFkZChuZXcgWEVsZW1lbnQoY2hpbGRFbGVtZW50TmFtZSwgbmV3IFhBdHRyaWJ1dGUoIlZhbCIsIHZhbHVlKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRPclJlcGxhY2VFbGVtZW50KFhFbGVtZW50IHByb3BzLCBYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhpc3RpbmdFbGVtZW50ID0gcHJvcHMuRWxlbWVudChlbGVtZW50Lk5hbWUpOworICAgICAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5SZXBsYWNlV2l0aChlbGVtZW50KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcm9wcy5BZGQoZWxlbWVudCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIENvbnZlcnRBdHRyaWJ1dGVUb0Jvb2woWEF0dHJpYnV0ZSB4QXR0cmlidXRlKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgYXBwbHlOdW1iZXJGb3JtYXRTdHIgPSAoc3RyaW5nKXhBdHRyaWJ1dGU7CisgICAgICAgICAgICBib29sIHJldHVyblZhbHVlID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoYXBwbHlOdW1iZXJGb3JtYXRTdHIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYXBwbHlOdW1iZXJGb3JtYXRTdHIgPT0gIjEiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKGFwcGx5TnVtYmVyRm9ybWF0U3RyLlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKCkgPT0gIlQiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYTmFtZXNwYWNlIHgxNGFjID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3NwcmVhZHNoZWV0bWwvMjAwOS85L2FjIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9TbWxUb0h0bWxDb252ZXJ0ZXIuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9TbWxUb0h0bWxDb252ZXJ0ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmNTRkNwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzL1NtbFRvSHRtbENvbnZlcnRlci5jcwpAQCAtMCwwICsxLDMyNCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3MuQ29kZUFuYWx5c2lzOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uV2luZG93cy5Gb3JtczsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgU3lzdGVtLklPOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgcGFydGlhbCBjbGFzcyBTbWxEb2N1bWVudAorICAgIHsKKyAgICAgICAgW1N1cHByZXNzTWVzc2FnZSgiUmVTaGFycGVyIiwgIlVudXNlZE1lbWJlci5HbG9iYWwiKV0KKyAgICAgICAgcHVibGljIFhFbGVtZW50IENvbnZlcnRUb0h0bWwoU21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3MgaHRtbENvbnZlcnRlclNldHRpbmdzLCBzdHJpbmcgdGFibGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU21sVG9IdG1sQ29udmVydGVyLkNvbnZlcnRUYWJsZVRvSHRtbCh0aGlzLCBodG1sQ29udmVydGVyU2V0dGluZ3MsIHRhYmxlTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBbU3VwcHJlc3NNZXNzYWdlKCJSZVNoYXJwZXIiLCAiVW51c2VkTWVtYmVyLkdsb2JhbCIpXQorICAgICAgICBwdWJsaWMgWEVsZW1lbnQgQ29udmVydFRhYmxlVG9IdG1sKHN0cmluZyB0YWJsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzID0gbmV3IFNtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzKCk7CisgICAgICAgICAgICByZXR1cm4gU21sVG9IdG1sQ29udmVydGVyLkNvbnZlcnRUYWJsZVRvSHRtbCh0aGlzLCBzZXR0aW5ncywgdGFibGVOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFtTdXBwcmVzc01lc3NhZ2UoIlJlU2hhcnBlciIsICJGaWVsZENhbkJlTWFkZVJlYWRPbmx5Lkdsb2JhbCIpXQorICAgIHB1YmxpYyBjbGFzcyBTbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncworICAgIHsKKyAgICAgICAgcHVibGljIHN0cmluZyBQYWdlVGl0bGU7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgQ3NzQ2xhc3NQcmVmaXg7CisgICAgICAgIHB1YmxpYyBib29sIEZhYnJpY2F0ZUNzc0NsYXNzZXM7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgR2VuZXJhbENzczsKKyAgICAgICAgcHVibGljIHN0cmluZyBBZGRpdGlvbmFsQ3NzOworCisgICAgICAgIHB1YmxpYyBTbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhZ2VUaXRsZSA9ICIiOworICAgICAgICAgICAgQ3NzQ2xhc3NQcmVmaXggPSAicHQtIjsKKyAgICAgICAgICAgIEZhYnJpY2F0ZUNzc0NsYXNzZXMgPSB0cnVlOworICAgICAgICAgICAgR2VuZXJhbENzcyA9ICJzcGFuIHsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9IjsKKyAgICAgICAgICAgIEFkZGl0aW9uYWxDc3MgPSAiIjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyhTbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyBodG1sQ29udmVydGVyU2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhZ2VUaXRsZSA9IGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5QYWdlVGl0bGU7CisgICAgICAgICAgICBDc3NDbGFzc1ByZWZpeCA9IGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5Dc3NDbGFzc1ByZWZpeDsKKyAgICAgICAgICAgIEZhYnJpY2F0ZUNzc0NsYXNzZXMgPSBodG1sQ29udmVydGVyU2V0dGluZ3MuRmFicmljYXRlQ3NzQ2xhc3NlczsKKyAgICAgICAgICAgIEdlbmVyYWxDc3MgPSBodG1sQ29udmVydGVyU2V0dGluZ3MuR2VuZXJhbENzczsKKyAgICAgICAgICAgIEFkZGl0aW9uYWxDc3MgPSBodG1sQ29udmVydGVyU2V0dGluZ3MuQWRkaXRpb25hbENzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU21sVG9IdG1sQ29udmVydGVyCisgICAgeworICAgICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAjcmVnaW9uIFB1YmxpY0FwaXMKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRWxlbWVudCBDb252ZXJ0VGFibGVUb0h0bWwoU21sRG9jdW1lbnQgc21sRG9jLCBTbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncywgc3RyaW5nIHRhYmxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtcy5Xcml0ZShzbWxEb2MuRG9jdW1lbnRCeXRlQXJyYXksIDAsIHNtbERvYy5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MgPSBTcHJlYWRzaGVldERvY3VtZW50Lk9wZW4obXMsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciByYW5nZVhtbCA9IFNtbERhdGFSZXRyaWV2ZXIuUmV0cmlldmVUYWJsZShzRG9jLCB0YWJsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICB2YXIgeGh0bWwgPSBTbWxUb0h0bWxDb252ZXJ0ZXIuQ29udmVydFRvSHRtbEludGVybmFsKHNEb2MsIHNldHRpbmdzLCByYW5nZVhtbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHRtbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IENvbnZlcnRUYWJsZVRvSHRtbChTcHJlYWRzaGVldERvY3VtZW50IHNEb2MsIFNtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzLCBzdHJpbmcgdGFibGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmFuZ2VYbWwgPSBTbWxEYXRhUmV0cmlldmVyLlJldHJpZXZlVGFibGUoc0RvYywgdGFibGVOYW1lKTsKKyAgICAgICAgICAgIHZhciB4aHRtbCA9IFNtbFRvSHRtbENvbnZlcnRlci5Db252ZXJ0VG9IdG1sSW50ZXJuYWwoc0RvYywgc2V0dGluZ3MsIHJhbmdlWG1sKTsKKyAgICAgICAgICAgIHJldHVybiB4aHRtbDsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgQ29udmVydFRvSHRtbEludGVybmFsKFNwcmVhZHNoZWV0RG9jdW1lbnQgc0RvYywgU21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3MgaHRtbENvbnZlcnRlclNldHRpbmdzLCBYRWxlbWVudCByYW5nZVhtbCkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgeGh0bWwgPSAoWEVsZW1lbnQpQ29udmVydFRvSHRtbFRyYW5zZm9ybShzRG9jLCBodG1sQ29udmVydGVyU2V0dGluZ3MsIHJhbmdlWG1sKTsKKworICAgICAgICAgICAgUmVpZnlTdHlsZXNBbmRDbGFzc2VzKGh0bWxDb252ZXJ0ZXJTZXR0aW5ncywgeGh0bWwpOworCisgICAgICAgICAgICAvLyBOb3RlOiB0aGUgeGh0bWwgcmV0dXJuZWQgYnkgQ29udmVydFRvSHRtbFRyYW5zZm9ybSBjb250YWlucyBvYmplY3RzIG9mIHR5cGUKKyAgICAgICAgICAgIC8vIFhFbnRpdHkuICBQdE9wZW5YbWxVdGlsLmNzIGRlZmluZSB0aGUgWEVudGl0eSBjbGFzcy4gIFNlZQorICAgICAgICAgICAgLy8gaHR0cDovL2Jsb2dzLm1zZG4uY29tL2VyaWN3aGl0ZS9hcmNoaXZlLzIwMTAvMDEvMjEvd3JpdGluZy1lbnRpdHktcmVmZXJlbmNlcy11c2luZy1saW5xLXRvLXhtbC5hc3B4CisgICAgICAgICAgICAvLyBmb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24uCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgeW91IGZ1cnRoZXIgdHJhbnNmb3JtIHRoZSBYTUwgdHJlZSByZXR1cm5lZCBieSBDb252ZXJ0VG9IdG1sVHJhbnNmb3JtLCB5b3UKKyAgICAgICAgICAgIC8vIG11c3QgZG8gaXQgY29ycmVjdGx5LCBvciBlbnRpdGllcyB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHByb3Blcmx5LgorCisgICAgICAgICAgICByZXR1cm4geGh0bWw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYTm9kZSBDb252ZXJ0VG9IdG1sVHJhbnNmb3JtKFNwcmVhZHNoZWV0RG9jdW1lbnQgc0RvYywgU21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3MgaHRtbENvbnZlcnRlclNldHRpbmdzLCBYTm9kZSBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IENvbnZlcnRUb0h0bWxUcmFuc2Zvcm0oc0RvYywgaHRtbENvbnZlcnRlclNldHRpbmdzLCBuKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFJlaWZ5U3R5bGVzQW5kQ2xhc3NlcyhTbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyBodG1sQ29udmVydGVyU2V0dGluZ3MsIFhFbGVtZW50IHhodG1sKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaHRtbENvbnZlcnRlclNldHRpbmdzLkZhYnJpY2F0ZUNzc0NsYXNzZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHVzZWRDc3NDbGFzc05hbWVzID0gbmV3IEhhc2hTZXQ8c3RyaW5nPigpOworICAgICAgICAgICAgICAgIHZhciBlbGVtZW50c1RoYXROZWVkQ2xhc3NlcyA9IHhodG1sCisgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50c0FuZFNlbGYoKQorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGQgPT4gbmV3CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgPSBkLAorICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVzID0gZC5Bbm5vdGF0aW9uPERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+PigpLAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoeiA9PiB6LlN0eWxlcyAhPSBudWxsKTsKKyAgICAgICAgICAgICAgICB2YXIgYXVnbWVudGVkID0gZWxlbWVudHNUaGF0TmVlZENsYXNzZXMKKyAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChwID0+IG5ldworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwLkVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBwLlN0eWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlc1N0cmluZyA9IHAuRWxlbWVudC5OYW1lLkxvY2FsTmFtZSArICJ8IiArIHAuU3R5bGVzLk9yZGVyQnkoayA9PiBrLktleSkuU2VsZWN0KHMgPT4gc3RyaW5nLkZvcm1hdCgiezB9OiB7MX07Iiwgcy5LZXksIHMuVmFsdWUpKS5TdHJpbmdDb25jYXRlbmF0ZSgpLAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAuR3JvdXBCeShwID0+IHAuU3R5bGVzU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgaW50IGNsYXNzQ291bnRlciA9IDEwMDAwMDA7CisgICAgICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGdycCBpbiBhdWdtZW50ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xhc3NOYW1lVG9Vc2U7CisgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdE9uZSA9IGdycC5GaXJzdCgpOworICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVzID0gZmlyc3RPbmUuU3R5bGVzOworICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVzLkNvbnRhaW5zS2V5KCJQdFN0eWxlTmFtZSIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWVUb1VzZSA9IGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5Dc3NDbGFzc1ByZWZpeCArIHN0eWxlc1siUHRTdHlsZU5hbWUiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VkQ3NzQ2xhc3NOYW1lcy5Db250YWlucyhjbGFzc05hbWVUb1VzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lVG9Vc2UgPSBodG1sQ29udmVydGVyU2V0dGluZ3MuQ3NzQ2xhc3NQcmVmaXggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXNbIlB0U3R5bGVOYW1lIl0gKyAiLSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0NvdW50ZXIuVG9TdHJpbmcoKS5TdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NDb3VudGVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWVUb1VzZSA9IGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5Dc3NDbGFzc1ByZWZpeCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NDb3VudGVyLlRvU3RyaW5nKCkuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NDb3VudGVyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdXNlZENzc0NsYXNzTmFtZXMuQWRkKGNsYXNzTmFtZVRvVXNlKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGZpcnN0T25lLkVsZW1lbnQuTmFtZS5Mb2NhbE5hbWUgKyAiLiIgKyBjbGFzc05hbWVUb1VzZSArICIgeyIgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHN0IGluIGZpcnN0T25lLlN0eWxlcy5XaGVyZShzID0+IHMuS2V5ICE9ICJQdFN0eWxlTmFtZSIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9ICIgICAgIiArIHN0LktleSArICI6ICIgKyBzdC5WYWx1ZSArICI7IiArIEVudmlyb25tZW50Lk5ld0xpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQocyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ9IiArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICB2YXIgY2xhc3NBdHQgPSBuZXcgWEF0dHJpYnV0ZSgiY2xhc3MiLCBjbGFzc05hbWVUb1VzZSk7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBnYyBpbiBncnApCisgICAgICAgICAgICAgICAgICAgICAgICBnYy5FbGVtZW50LkFkZChjbGFzc0F0dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciBzdHlsZVZhbHVlID0gaHRtbENvbnZlcnRlclNldHRpbmdzLkdlbmVyYWxDc3MgKyBzYiArIGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5BZGRpdGlvbmFsQ3NzOworCisgICAgICAgICAgICAgICAgU2V0U3R5bGVFbGVtZW50VmFsdWUoeGh0bWwsIHN0eWxlVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFByZXZpb3VzbHksIHRoZSBoOnN0eWxlIGVsZW1lbnQgd2FzIG5vdCBhZGRlZCBhdCB0aGlzIHBvaW50LiBIb3dldmVyLAorICAgICAgICAgICAgICAgIC8vIGF0IGxlYXN0IHRoZSBHZW5lcmFsIENTUyB3aWxsIGNvbnRhaW4gaW1wb3J0YW50IHNldHRpbmdzLgorICAgICAgICAgICAgICAgIFNldFN0eWxlRWxlbWVudFZhbHVlKHhodG1sLCBodG1sQ29udmVydGVyU2V0dGluZ3MuR2VuZXJhbENzcyArIGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5BZGRpdGlvbmFsQ3NzKTsKKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkIGluIHhodG1sLkRlc2NlbmRhbnRzQW5kU2VsZigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlID0gZC5Bbm5vdGF0aW9uPERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+PigpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKHAgPT4gcC5LZXkgIT0gIlB0U3R5bGVOYW1lIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5PcmRlckJ5KHAgPT4gcC5LZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGUgPT4gc3RyaW5nLkZvcm1hdCgiezB9OiB7MX07IiwgZS5LZXksIGUuVmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIFhBdHRyaWJ1dGUgc3QgPSBuZXcgWEF0dHJpYnV0ZSgic3R5bGUiLCBzdHlsZVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQuQXR0cmlidXRlKCJzdHlsZSIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBkLkF0dHJpYnV0ZSgic3R5bGUiKS5WYWx1ZSArPSBzdHlsZVZhbHVlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBkLkFkZChzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBTZXRTdHlsZUVsZW1lbnRWYWx1ZShYRWxlbWVudCB4aHRtbCwgc3RyaW5nIHN0eWxlVmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzdHlsZUVsZW1lbnQgPSB4aHRtbAorICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cyhYaHRtbC5zdHlsZSkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChzdHlsZUVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdHlsZUVsZW1lbnQuVmFsdWUgPSBzdHlsZVZhbHVlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0eWxlRWxlbWVudCA9IG5ldyBYRWxlbWVudChYaHRtbC5zdHlsZSwgc3R5bGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgdmFyIGhlYWQgPSB4aHRtbC5FbGVtZW50KFhodG1sLmhlYWQpOworICAgICAgICAgICAgICAgIGlmIChoZWFkICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGhlYWQuQWRkKHN0eWxlRWxlbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQ29udmVydFRvSHRtbFRyYW5zZm9ybShXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdvcmREb2MsCisgICAgICAgICAgICBXbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncywgWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWdub3JlIGVsZW1lbnQuCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEhhc2hTZXQ8c3RyaW5nPiBVbmtub3duRm9udHMgPSBuZXcgSGFzaFNldDxzdHJpbmc+KCk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIEhhc2hTZXQ8c3RyaW5nPiBfa25vd25GYW1pbGllczsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBIYXNoU2V0PHN0cmluZz4gS25vd25GYW1pbGllcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2tub3duRmFtaWxpZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9rbm93bkZhbWlsaWVzID0gbmV3IEhhc2hTZXQ8c3RyaW5nPigpOworICAgICAgICAgICAgICAgICAgICB2YXIgZmFtaWxpZXMgPSBGb250RmFtaWx5LkZhbWlsaWVzOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZmFtIGluIGZhbWlsaWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgX2tub3duRmFtaWxpZXMuQWRkKGZhbS5OYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9rbm93bkZhbWlsaWVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gRm9udEZhbGxiYWNrID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCkKKyAgICAgICAgeworICAgICAgICAgICAgeyAiQXJpYWwiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJBcmlhbCBOYXJyb3ciLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJBcmlhbCBSb3VuZGVkIE1UIEJvbGQiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJBcmlhbCBVbmljb2RlIE1TIiwgQCInezB9JywgJ3NhbnMtc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiQmFza2VydmlsbGUgT2xkIEZhY2UiLCBAIid7MH0nLCAnc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiQmVybGluIFNhbnMgRkIiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJCZXJsaW4gU2FucyBGQiBEZW1pIiwgQCInezB9JywgJ3NhbnMtc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiQ2FsaWJyaSBMaWdodCIsIEAiJ3swfScsICdzYW5zLXNlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIkdpbGwgU2FucyBNVCIsIEAiJ3swfScsICdzYW5zLXNlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIkdpbGwgU2FucyBNVCBDb25kZW5zZWQiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJMdWNpZGEgU2FucyIsIEAiJ3swfScsICdzYW5zLXNlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIkx1Y2lkYSBTYW5zIFVuaWNvZGUiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJTZWdvZSBVSSIsIEAiJ3swfScsICdzYW5zLXNlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIlNlZ29lIFVJIExpZ2h0IiwgQCInezB9JywgJ3NhbnMtc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiU2Vnb2UgVUkgU2VtaWJvbGQiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJUYWhvbWEiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJUcmVidWNoZXQgTVMiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJWZXJkYW5hIiwgQCInezB9JywgJ3NhbnMtc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiQm9vayBBbnRpcXVhIiwgQCInezB9JywgJ3NlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIkJvb2ttYW4gT2xkIFN0eWxlIiwgQCInezB9JywgJ3NlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIkNhbGlmb3JuaWFuIEZCIiwgQCInezB9JywgJ3NlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIkNhbWJyaWEiLCBAIid7MH0nLCAnc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiQ29uc3RhbnRpYSIsIEAiJ3swfScsICdzZXJpZiciIH0sCisgICAgICAgICAgICB7ICJHYXJhbW9uZCIsIEAiJ3swfScsICdzZXJpZiciIH0sCisgICAgICAgICAgICB7ICJMdWNpZGEgQnJpZ2h0IiwgQCInezB9JywgJ3NlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIkx1Y2lkYSBGYXgiLCBAIid7MH0nLCAnc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiUGFsYXRpbm8gTGlub3R5cGUiLCBAIid7MH0nLCAnc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgQCInezB9JywgJ3NlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIldpZGUgTGF0aW4iLCBAIid7MH0nLCAnc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiQ291cmllciBOZXciLCBAIid7MH0nIiB9LAorICAgICAgICAgICAgeyAiTHVjaWRhIENvbnNvbGUiLCBAIid7MH0nIiB9LAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ3JlYXRlRm9udENzc1Byb3BlcnR5KHN0cmluZyBmb250LCBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBzdHlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEZvbnRGYWxsYmFjay5Db250YWluc0tleShmb250KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoImZvbnQtZmFtaWx5Iiwgc3RyaW5nLkZvcm1hdChGb250RmFsbGJhY2tbZm9udF0sIGZvbnQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoImZvbnQtZmFtaWx5IiwgZm9udCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIEdldEJvb2xQcm9wKFhFbGVtZW50IHJ1blByb3BzLCBYTmFtZSB4TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHAgPSBydW5Qcm9wcy5FbGVtZW50KHhOYW1lKTsKKyAgICAgICAgICAgIGlmIChwID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgdmFyIHYgPSBwLkF0dHJpYnV0ZShXLnZhbCk7CisgICAgICAgICAgICBpZiAodiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgdmFyIHMgPSB2LlZhbHVlLlRvTG93ZXIoKTsKKyAgICAgICAgICAgIGlmIChzID09ICIwIiB8fCBzID09ICJmYWxzZSIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKHMgPT0gIjEiIHx8IHMgPT0gInRydWUiKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvU3ByZWFkc2hlZXREb2N1bWVudE1hbmFnZXIuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9TcHJlYWRzaGVldERvY3VtZW50TWFuYWdlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWY2YmVmCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvU3ByZWFkc2hlZXREb2N1bWVudE1hbmFnZXIuY3MKQEAgLTAsMCArMSwyMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBNYW5hZ2VzIFNwcmVhZHNoZWV0RG9jdW1lbnQgY29udGVudAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFNwcmVhZHNoZWV0RG9jdW1lbnRNYW5hZ2VyCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBYTmFtZXNwYWNlIG5zOworICAgICAgICBwcml2YXRlIHN0YXRpYyBYTmFtZXNwYWNlIHJlbGF0aW9uc2hpcHNuczsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGhlYWRlclJvdyA9IDE7CisKKyAgICAgICAgc3RhdGljIFNwcmVhZHNoZWV0RG9jdW1lbnRNYW5hZ2VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgbnMgPSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIjsKKyAgICAgICAgICAgIHJlbGF0aW9uc2hpcHNucyA9ICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBzcHJlYWRzaGVldCBkb2N1bWVudCBmcm9tIGEgdmFsdWUgdGFibGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlUGF0aCI+UGF0aCB0byBzdG9yZSB0aGUgZG9jdW1lbnQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImhlYWRlckxpc3QiPkNvbnRlbnRzIG9mIGZpcnN0IHJvdyAoaGVhZGVyKTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWVUYWJsZSI+Q29udGVudHMgb2YgZGF0YTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5pdGlhbFJvdyI+Um93IHRvIHN0YXJ0IGNvcHlpbmcgZGF0YSBmcm9tPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIENyZWF0ZShTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50LCBMaXN0PHN0cmluZz4gaGVhZGVyTGlzdCwgc3RyaW5nW11bXSB2YWx1ZVRhYmxlLCBpbnQgaW5pdGlhbFJvdykKKyAgICAgICAgeworICAgICAgICAgICAgaGVhZGVyUm93ID0gaW5pdGlhbFJvdzsKKworICAgICAgICAgICAgLy9DcmVhdGVzIGEgd29ya3NoZWV0IHdpdGggZ2l2ZW4gZGF0YQorICAgICAgICAgICAgV29ya3NoZWV0UGFydCB3b3Jrc2hlZXQgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5DcmVhdGUoZG9jdW1lbnQsIGhlYWRlckxpc3QsIHZhbHVlVGFibGUsIGhlYWRlclJvdyk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgc3ByZWFkc2hlZXQgZG9jdW1lbnQgd2l0aCBhIGNoYXJ0IGZyb20gYSB2YWx1ZSB0YWJsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVQYXRoIj5QYXRoIHRvIHN0b3JlIHRoZSBkb2N1bWVudDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaGVhZGVyTGlzdCI+Q29udGVudHMgb2YgZmlyc3Qgcm93IChoZWFkZXIpPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZVRhYmxlIj5Db250ZW50cyBvZiBkYXRhPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjaGFydFR5cGUiPkNoYXJ0IHR5cGU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNhdGVnb3J5Q29sdW1uIj5Db2x1bW4gdG8gdXNlIGFzIGNhdGVnb3J5IGZvciBjaGFydGluZzwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1uc1RvQ2hhcnQiPkNvbHVtbnMgdG8gdXNlIGFzIGRhdGEgc2VyaWVzPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbml0aWFsUm93Ij5Sb3cgaW5kZXggdG8gc3RhcnQgY29weWluZyBkYXRhPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlNwcmVhZHNoZWV0RG9jdW1lbnQ8L3JldHVybnM+CisgICAgICAgIC8vcHVibGljIHN0YXRpYyB2b2lkIENyZWF0ZShTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50LCBMaXN0PHN0cmluZz4gaGVhZGVyTGlzdCwgc3RyaW5nW11bXSB2YWx1ZVRhYmxlLCBDaGFydFR5cGUgY2hhcnRUeXBlLCBzdHJpbmcgY2F0ZWdvcnlDb2x1bW4sIExpc3Q8c3RyaW5nPiBjb2x1bW5zVG9DaGFydCwgaW50IGluaXRpYWxSb3cpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBoZWFkZXJSb3cgPSBpbml0aWFsUm93OworCisgICAgICAgIC8vICAgIC8vQ3JlYXRlcyB3b3Jrc2hlZXQgd2l0aCBkYXRhCisgICAgICAgIC8vICAgIFdvcmtzaGVldFBhcnQgd29ya3NoZWV0ID0gV29ya3NoZWV0QWNjZXNzb3IuQ3JlYXRlKGRvY3VtZW50LCBoZWFkZXJMaXN0LCB2YWx1ZVRhYmxlLCBoZWFkZXJSb3cpOworICAgICAgICAvLyAgICAvL0NyZWF0ZXMgY2hhcnRzaGVldCB3aXRoIGdpdmVuIHNlcmllcyBhbmQgY2F0ZWdvcnkKKyAgICAgICAgLy8gICAgc3RyaW5nIHNoZWV0TmFtZSA9IEdldFNoZWV0TmFtZSh3b3Jrc2hlZXQsIGRvY3VtZW50KTsKKyAgICAgICAgLy8gICAgQ2hhcnRzaGVldFBhcnQgY2hhcnRzaGVldCA9CisgICAgICAgIC8vICAgICAgICBDaGFydHNoZWV0QWNjZXNzb3IuQ3JlYXRlKGRvY3VtZW50LAorICAgICAgICAvLyAgICAgICAgICAgIGNoYXJ0VHlwZSwKKyAgICAgICAgLy8gICAgICAgICAgICBHZXRWYWx1ZVJlZmVyZW5jZXMoc2hlZXROYW1lLCBjYXRlZ29yeUNvbHVtbiwgaGVhZGVyTGlzdCwgY29sdW1uc1RvQ2hhcnQsIHZhbHVlVGFibGUpLAorICAgICAgICAvLyAgICAgICAgICAgIEdldEhlYWRlclJlZmVyZW5jZXMoc2hlZXROYW1lLCBjYXRlZ29yeUNvbHVtbiwgaGVhZGVyTGlzdCwgY29sdW1uc1RvQ2hhcnQsIHZhbHVlVGFibGUpLAorICAgICAgICAvLyAgICAgICAgICAgIEdldENhdGVnb3J5UmVmZXJlbmNlKHNoZWV0TmFtZSwgY2F0ZWdvcnlDb2x1bW4sIGhlYWRlckxpc3QsIHZhbHVlVGFibGUpCisgICAgICAgIC8vICAgICAgICApOworICAgICAgICAvL30KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHRoZSBpbnRlcm5hbCBuYW1lIG9mIGEgd29ya3NoZWV0IGZyb20gYSBkb2N1bWVudAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0U2hlZXROYW1lKFdvcmtzaGVldFBhcnQgd29ya3NoZWV0LCBTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50KQorICAgICAgICB7CisgICAgICAgICAgICAvL0dldHMgdGhlIGlkIG9mIHdvcmtzaGVldCBwYXJ0CisgICAgICAgICAgICBzdHJpbmcgcGFydElkID0gZG9jdW1lbnQuV29ya2Jvb2tQYXJ0LkdldElkT2ZQYXJ0KHdvcmtzaGVldCk7CisgICAgICAgICAgICBYRG9jdW1lbnQgd29ya2Jvb2tEb2N1bWVudCA9IGRvY3VtZW50Lldvcmtib29rUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIC8vR2V0cyB0aGUgbmFtZSBmcm9tIHNoZWV0IHRhZyByZWxhdGVkIHRvIHdvcmtzaGVldAorICAgICAgICAgICAgc3RyaW5nIHNoZWV0TmFtZSA9CisgICAgICAgICAgICAgICAgd29ya2Jvb2tEb2N1bWVudC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnQobnMgKyAic2hlZXRzIikKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMobnMgKyAic2hlZXQiKQorICAgICAgICAgICAgICAgIC5XaGVyZSgKKyAgICAgICAgICAgICAgICAgICAgdCA9PgorICAgICAgICAgICAgICAgICAgICAgICAgdC5BdHRyaWJ1dGUocmVsYXRpb25zaGlwc25zICsgImlkIikuVmFsdWUgPT0gcGFydElkCisgICAgICAgICAgICAgICAgKS5GaXJzdCgpCisgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZSgibmFtZSIpLlZhbHVlOworICAgICAgICAgICAgcmV0dXJuIHNoZWV0TmFtZTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHRoZSByYW5nZSByZWZlcmVuY2UgZm9yIGNhdGVnb3J5CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2hlZXROYW1lIj53b3Jrc2hlZXQgdG8gdGFrZSBkYXRhIGZyb208L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImhlYWRlckNvbHVtbiI+bmFtZSBvZiBjb2x1bW4gdXNlZCBhcyBjYXRlZ29yeTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaGVhZGVyTGlzdCI+Y29sdW1uIG5hbWVzIGZyb20gZGF0YTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWVUYWJsZSI+RGF0YSB2YWx1ZXM8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0Q2F0ZWdvcnlSZWZlcmVuY2Uoc3RyaW5nIHNoZWV0TmFtZSwgc3RyaW5nIGhlYWRlckNvbHVtbiwgTGlzdDxzdHJpbmc+IGhlYWRlckxpc3QsIHN0cmluZ1tdW10gdmFsdWVUYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNhdGVnb3J5Q29sdW1uID0gaGVhZGVyTGlzdC5JbmRleE9mKGhlYWRlckNvbHVtbi5Ub1VwcGVyKCkpICsgMTsKKyAgICAgICAgICAgIGludCBudW1Sb3dzID0gdmFsdWVUYWJsZS5HZXRMZW5ndGgoMCk7CisKKyAgICAgICAgICAgIHJldHVybiBHZXRSYW5nZVJlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICBzaGVldE5hbWUsCisgICAgICAgICAgICAgICAgY2F0ZWdvcnlDb2x1bW4sCisgICAgICAgICAgICAgICAgaGVhZGVyUm93ICsgMSwKKyAgICAgICAgICAgICAgICBjYXRlZ29yeUNvbHVtbiwKKyAgICAgICAgICAgICAgICBudW1Sb3dzICsgaGVhZGVyUm93CisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyBhIGxpc3Qgb2YgcmFuZ2UgcmVmZXJlbmNlcyBmb3IgZWFjaCBvZiB0aGUgc2VyaWVzIGhlYWRlcnMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzaGVldE5hbWUiPndvcmtzaGVldCB0byB0YWtlIGRhdGEgZnJvbTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaGVhZGVyQ29sdW1uIj5uYW1lIG9mIGNvbHVtbiB1c2VkIGFzIGNhdGVnb3J5PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJoZWFkZXJMaXN0Ij5jb2x1bW4gbmFtZXMgZnJvbSBkYXRhPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZVRhYmxlIj5EYXRhIHZhbHVlczwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sc1RvQ2hhcnQiPkNvbHVtbnMgdXNlZCBhcyBkYXRhIHNlcmllczwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8c3RyaW5nPiBHZXRIZWFkZXJSZWZlcmVuY2VzKHN0cmluZyBzaGVldE5hbWUsIHN0cmluZyBoZWFkZXJDb2x1bW4sIExpc3Q8c3RyaW5nPiBoZWFkZXJMaXN0LCBMaXN0PHN0cmluZz4gY29sc1RvQ2hhcnQsIHN0cmluZ1tdW10gdmFsdWVUYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxzdHJpbmc+IHZhbHVlUmVmZXJlbmNlTGlzdCA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKworICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGNvbHVtbiBpbiBjb2xzVG9DaGFydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZVJlZmVyZW5jZUxpc3QuQWRkKAorICAgICAgICAgICAgICAgICAgICBHZXRSYW5nZVJlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckxpc3QuSW5kZXhPZihjb2x1bW4uVG9VcHBlcigpKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJSb3cKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdmFsdWVSZWZlcmVuY2VMaXN0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyBhIGxpc3Qgb2YgcmFuZ2UgcmVmZXJlbmNlcyBmb3IgZWFjaCBvZiB0aGUgc2VyaWVzIHZhbHVlcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNoZWV0TmFtZSI+d29ya3NoZWV0IHRvIHRha2UgZGF0YSBmcm9tPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJoZWFkZXJDb2x1bW4iPm5hbWUgb2YgY29sdW1uIHVzZWQgYXMgY2F0ZWdvcnk8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImhlYWRlckxpc3QiPmNvbHVtbiBuYW1lcyBmcm9tIGRhdGE8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlVGFibGUiPkRhdGEgdmFsdWVzPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2xzVG9DaGFydCI+Q29sdW1ucyB1c2VkIGFzIGRhdGEgc2VyaWVzPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxzdHJpbmc+IEdldFZhbHVlUmVmZXJlbmNlcyhzdHJpbmcgc2hlZXROYW1lLCBzdHJpbmcgaGVhZGVyQ29sdW1uLCBMaXN0PHN0cmluZz4gaGVhZGVyTGlzdCwgTGlzdDxzdHJpbmc+IGNvbHNUb0NoYXJ0LCBzdHJpbmdbXVtdIHZhbHVlVGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8c3RyaW5nPiB2YWx1ZVJlZmVyZW5jZUxpc3QgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICBpbnQgbnVtUm93cyA9IHZhbHVlVGFibGUuR2V0TGVuZ3RoKDApOworCisgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgY29sdW1uIGluIGNvbHNUb0NoYXJ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBkYXRhQ29sdW1uID0gaGVhZGVyTGlzdC5JbmRleE9mKGNvbHVtbi5Ub1VwcGVyKCkpICsgMTsKKyAgICAgICAgICAgICAgICB2YWx1ZVJlZmVyZW5jZUxpc3QuQWRkKAorICAgICAgICAgICAgICAgICAgICBHZXRSYW5nZVJlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFDb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJSb3cgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVJvd3MgKyBoZWFkZXJSb3cKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdmFsdWVSZWZlcmVuY2VMaXN0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyBhIGZvcm1hdHRlZCByZXByZXNlbnRhdGlvbiBvZiBhIGNlbGwgcmFuZ2UgZnJvbSBhIHdvcmtzaGVldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0UmFuZ2VSZWZlcmVuY2Uoc3RyaW5nIHdvcmtzaGVldCwgaW50IGNvbHVtbiwgaW50IHJvdykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoInswfSF7MX17Mn0iLCB3b3Jrc2hlZXQsIFdvcmtzaGVldEFjY2Vzc29yLkdldENvbHVtbklkKGNvbHVtbiksIHJvdyk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIGEgZm9ybWF0dGVkIHJlcHJlc2VudGF0aW9uIG9mIGEgY2VsbCByYW5nZSBmcm9tIGEgd29ya3NoZWV0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBHZXRSYW5nZVJlZmVyZW5jZShzdHJpbmcgd29ya3NoZWV0LCBpbnQgc3RhcnRDb2x1bW4sIGludCBzdGFydFJvdywgaW50IGVuZENvbHVtbiwgaW50IGVuZFJvdykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoInswfSF7MX17Mn06ezN9ezR9IiwKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICAgICAgV29ya3NoZWV0QWNjZXNzb3IuR2V0Q29sdW1uSWQoc3RhcnRDb2x1bW4pLAorICAgICAgICAgICAgICAgIHN0YXJ0Um93LAorICAgICAgICAgICAgICAgIFdvcmtzaGVldEFjY2Vzc29yLkdldENvbHVtbklkKGVuZENvbHVtbiksCisgICAgICAgICAgICAgICAgZW5kUm93CisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhbiBlbXB0eSAoYmFzZSkgd29ya2Jvb2sgZG9jdW1lbnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWERvY3VtZW50IENyZWF0ZUVtcHR5V29ya2Jvb2soKQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgICAgIG5ldyBYRG9jdW1lbnQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChucyArICJ3b3JrYm9vayIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgieG1sbnMiLCBucyksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInIiLCByZWxhdGlvbnNoaXBzbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KG5zICsgInNoZWV0cyIpCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQ7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvU3ByZWFkc2hlZXRXcml0ZXIuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9TcHJlYWRzaGVldFdyaXRlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTEyMmFiCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvU3ByZWFkc2hlZXRXcml0ZXIuY3MKQEAgLTAsMCArMSw3OTYgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMi0yMDE1LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9PcGVuWG1sRGV2ZWxvcGVyLm9yZworUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvcG93ZXJ0b29scy1mb3Itb3Blbi14bWwuYXNweAorCitEZXZlbG9wZXI6IEVyaWMgV2hpdGUKK0Jsb2c6IGh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbQorVHdpdHRlcjogQEVyaWNXaGl0ZURldgorRW1haWw6IGVyaWNAZXJpY3doaXRlLmNvbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyN1bmRlZiBEaXNwbGF5V29ya2luZ1NldAorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7CisKK25hbWVzcGFjZSBPcGVuWG1sUG93ZXJUb29scworeworICAgIC8vIFRoZSBjbGFzc2VzIGluIFNwcmVhZHNoZWV0V3JpdGVyIGFyZSBzdGlsbCBhIHdvcmstaW4tcHJvZ3Jlc3MuICBXaGlsZSB0aGV5IGFyZSB1c2VmdWwgaW4gdGhlaXIgY3VycmVudCBzdGF0ZSwgSSB3aWxsIGJlIGVuaGFuY2luZyBhbmQKKyAgICAvLyBjaGFuZ2luZyB0aGVtIGluIHRoZSBmdXR1cmUuICBJbiBwYXJ0aWN1bGFyLCBJIHdpbGwgYmUgYXVnbWVudGluZyB0aGUgdmFyaW91cyBkZWZpbml0aW9uIGNsYXNzZXMgKFdvcmtib29rRGZuLCBXb3Jrc2hlZXREZm4sCisgICAgLy8gUm93RGZuLCBhbmQgQ2VsbERmbi4KKyAgICAKKyAgICAvLyBUaGV5IGFyZSByb2J1c3QgZW5vdWdoIGluIHRoZWlyIGN1cnJlbnQgZm9ybSB0byBiZSB1c2VkIGluIGVudGVycHJpc2UsIG1pc3Npb24gY3JpdGljYWwuCisKKyAgICBwdWJsaWMgY2xhc3MgV29ya2Jvb2tEZm4KKyAgICB7CisgICAgICAgIHB1YmxpYyBJRW51bWVyYWJsZTxXb3Jrc2hlZXREZm4+IFdvcmtzaGVldHM7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFdvcmtzaGVldERmbgorICAgIHsKKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lOworICAgICAgICBwdWJsaWMgc3RyaW5nIFRhYmxlTmFtZTsKKyAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPENlbGxEZm4+IENvbHVtbkhlYWRpbmdzOworICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8Um93RGZuPiBSb3dzOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBSb3dEZm4KKyAgICB7CisgICAgICAgIHB1YmxpYyBJRW51bWVyYWJsZTxDZWxsRGZuPiBDZWxsczsKKyAgICB9CisKKyAgICAvLyBWYWx1ZSBjYW4gYmU6CisgICAgLy8gLSBzdHJpbmcKKyAgICAvLyAtIGJvb2wKKyAgICAvLyAtIERhdGVUaW1lCisgICAgLy8gLSBpbnQzMiwgaW50NjQsIHVpbnQsIGRvdWJsZSwgZmxvYXQsIGV0Yy4KKworICAgIC8vIFN0YW5kYXJkIGZvcm1hdHMKKyAgICBwdWJsaWMgY2xhc3MgQ2VsbERmbgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBEaWN0aW9uYXJ5PHN0cmluZywgaW50PiBTdGFuZGFyZEZvcm1hdHMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIGludD4KKyAgICAgICAgeworICAgICAgICAgICAgeyAiMCIsICAgICAgICAgICAgICAgICAgICAgICAgMSAgIH0sCisgICAgICAgICAgICB7ICIwLjAwIiwgICAgICAgICAgICAgICAgICAgICAyICAgfSwKKyAgICAgICAgICAgIHsgIiMsIyMwIiwgICAgICAgICAgICAgICAgICAgIDMgICB9LAorICAgICAgICAgICAgeyAiIywjIzAuMDAiLCAgICAgICAgICAgICAgICAgNCAgIH0sCisgICAgICAgICAgICB7ICIwJSIsICAgICAgICAgICAgICAgICAgICAgICA5ICAgfSwKKyAgICAgICAgICAgIHsgIjAuMDAlIiwgICAgICAgICAgICAgICAgICAgIDEwICB9LAorICAgICAgICAgICAgeyAiMC4wMEUrMDAiLCAgICAgICAgICAgICAgICAgMTEgIH0sCisgICAgICAgICAgICB7ICIjID8vPyIsICAgICAgICAgICAgICAgICAgICAxMiAgfSwKKyAgICAgICAgICAgIHsgIiMgPz8vPz8iLCAgICAgICAgICAgICAgICAgIDEzICB9LAorICAgICAgICAgICAgeyAibW0tZGQteXkiLCAgICAgICAgICAgICAgICAgMTQgIH0sCisgICAgICAgICAgICB7ICJkLW1tbS15eSIsICAgICAgICAgICAgICAgICAxNSAgfSwKKyAgICAgICAgICAgIHsgImQtbW1tIiwgICAgICAgICAgICAgICAgICAgIDE2ICB9LAorICAgICAgICAgICAgeyAibW1tLXl5IiwgICAgICAgICAgICAgICAgICAgMTcgIH0sCisgICAgICAgICAgICB7ICJoOm1tIEFNL1BNIiwgICAgICAgICAgICAgICAxOCAgfSwKKyAgICAgICAgICAgIHsgImg6bW06c3MgQU0vUE0iLCAgICAgICAgICAgIDE5ICB9LAorICAgICAgICAgICAgeyAiaDptbSIsICAgICAgICAgICAgICAgICAgICAgMjAgIH0sCisgICAgICAgICAgICB7ICJoOm1tOnNzIiwgICAgICAgICAgICAgICAgICAyMSAgfSwKKyAgICAgICAgICAgIHsgImgvZC95eSBoOm1tIiwgICAgICAgICAgICAgIDIyICB9LAorICAgICAgICAgICAgeyAiIywjIzA7KCMsIyMwKSIsICAgICAgICAgICAgMzcgIH0sCisgICAgICAgICAgICB7ICIjLCMjMDtbUmVkXSgjLCMjMCkiLCAgICAgICAzOCAgfSwKKyAgICAgICAgICAgIHsgIiMsIyMwLjAwOygjLCMjMC4wMCkiLCAgICAgIDM5ICB9LAorICAgICAgICAgICAgeyAiIywjIzAuMDA7W1JlZF0oIywjIzAuMDApIiwgNDAgIH0sCisgICAgICAgICAgICB7ICJtbTpzcyIsICAgICAgICAgICAgICAgICAgICA0NSAgfSwKKyAgICAgICAgICAgIHsgIltoXTptbTpzcyIsICAgICAgICAgICAgICAgIDQ2ICB9LAorICAgICAgICAgICAgeyAibW1zcy4wIiwgICAgICAgICAgICAgICAgICAgNDcgIH0sCisgICAgICAgICAgICB7ICIjIzAuMEUrMCIsICAgICAgICAgICAgICAgICA0OCAgfSwKKyAgICAgICAgICAgIHsgIkAiLCAgICAgICAgICAgICAgICAgICAgICAgIDQ5ICB9LAorICAgICAgICB9OworICAgICAgICBwdWJsaWMgb2JqZWN0IFZhbHVlOworICAgICAgICBwdWJsaWMgQ2VsbERhdGFUeXBlPyBDZWxsRGF0YVR5cGU7CisgICAgICAgIHB1YmxpYyBIb3Jpem9udGFsQ2VsbEFsaWdubWVudD8gSG9yaXpvbnRhbENlbGxBbGlnbm1lbnQ7CisgICAgICAgIHB1YmxpYyBib29sPyBCb2xkOworICAgICAgICBwdWJsaWMgYm9vbD8gSXRhbGljOworICAgICAgICBwdWJsaWMgc3RyaW5nIEZvcm1hdENvZGU7CisgICAgfQorCisgICAgcHVibGljIGVudW0gSG9yaXpvbnRhbENlbGxBbGlnbm1lbnQKKyAgICB7CisgICAgICAgIExlZnQsCisgICAgICAgIENlbnRlciwKKyAgICAgICAgUmlnaHQsCisgICAgfQorCisgICAgcHVibGljIGVudW0gQ2VsbERhdGFUeXBlCisgICAgeworICAgICAgICBCb29sZWFuLAorICAgICAgICBEYXRlLAorICAgICAgICBOdW1iZXIsCisgICAgICAgIFN0cmluZywKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNwcmVhZHNoZWV0V3JpdGVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgV3JpdGUoc3RyaW5nIGZpbGVOYW1lLCBXb3JrYm9va0RmbiB3b3JrYm9vaykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImZpbGVOYW1lIik7CisgICAgICAgICAgICAgICAgaWYgKHdvcmtib29rID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oIndvcmtib29rIik7CisKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBmaSA9IG5ldyBGaWxlSW5mbyhmaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGZpLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgZmkuRGVsZXRlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGJsYW5rIHdvcmtib29rCisgICAgICAgICAgICAgICAgY2hhcltdIGJhc2U2NENoYXJBcnJheSA9IF9FbXB0eVhsc3gKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGMgPT4gYyAhPSAnXHInICYmIGMgIT0gJ1xuJykuVG9BcnJheSgpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlQXJyYXkgPQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0Q2hhckFycmF5KGJhc2U2NENoYXJBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgMCwgYmFzZTY0Q2hhckFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbEJ5dGVzKGZpLkZ1bGxOYW1lLCBieXRlQXJyYXkpOworCisgICAgICAgICAgICAgICAgLy8gb3BlbiB0aGUgd29ya2Jvb2ssIGFuZCBjcmVhdGUgdGhlIFRhYmxlUHJvcGVydGllcyBzaGVldCwgcG9wdWxhdGUgaXQKKyAgICAgICAgICAgICAgICB1c2luZyAoU3ByZWFkc2hlZXREb2N1bWVudCBzRG9jID0gU3ByZWFkc2hlZXREb2N1bWVudC5PcGVuKGZpLkZ1bGxOYW1lLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFdvcmtib29rUGFydCB3b3JrYm9va1BhcnQgPSBzRG9jLldvcmtib29rUGFydDsKKyAgICAgICAgICAgICAgICAgICAgWERvY3VtZW50IHdYRG9jID0gd29ya2Jvb2tQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBzaGVldEVsZW1lbnQgPSB3WERvYworICAgICAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnNoZWV0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnNoZWV0KQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKHMgPT4gKHN0cmluZylzLkF0dHJpYnV0ZShTU05vTmFtZXNwYWNlLm5hbWUpID09ICJTaGVldDEiKQorICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaGVldEVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTcHJlYWRzaGVldFdyaXRlckludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZCA9IChzdHJpbmcpc2hlZXRFbGVtZW50LkF0dHJpYnV0ZShSLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgc2hlZXRFbGVtZW50LlJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICB3b3JrYm9va1BhcnQuUHV0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgV29ya3NoZWV0UGFydCBzUGFydCA9IChXb3Jrc2hlZXRQYXJ0KXdvcmtib29rUGFydC5HZXRQYXJ0QnlJZChpZCk7CisgICAgICAgICAgICAgICAgICAgIHdvcmtib29rUGFydC5EZWxldGVQYXJ0KHNQYXJ0KTsKKworICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgYXBwWERvYyA9IHNEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FeHRlbmRlZEZpbGVQcm9wZXJ0aWVzUGFydAorICAgICAgICAgICAgICAgICAgICAgICAgLkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCB2ZWN0b3IgPSBhcHBYRG9jCisgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKEVQLlRpdGxlc09mUGFydHMpCisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVlQudmVjdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZWN0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yLlNldEF0dHJpYnV0ZVZhbHVlKFNTTm9OYW1lc3BhY2Uuc2l6ZSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBscHN0ciA9IHZlY3Rvci5FbGVtZW50KFZULmxwc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwc3RyLlJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHZlY3RvcjIgPSBhcHBYRG9jCisgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKEVQLkhlYWRpbmdQYWlycykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhWVC52ZWN0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgdmFyaWFudCA9IHZlY3RvcjIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cyhWVC5pNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudC5WYWx1ZSA9ICIxIjsKKyAgICAgICAgICAgICAgICAgICAgc0RvYy5FeHRlbmRlZEZpbGVQcm9wZXJ0aWVzUGFydC5QdXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAod29ya2Jvb2suV29ya3NoZWV0cyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHdvcmtzaGVldCBpbiB3b3JrYm9vay5Xb3Jrc2hlZXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFdvcmtzaGVldChzRG9jLCB3b3Jrc2hlZXQpOworCisgICAgICAgICAgICAgICAgICAgIHdvcmtib29rUGFydC5Xb3JrYm9va1N0eWxlc1BhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVbmhhbmRsZWQgZXhjZXB0aW9uOiB7MH0gaW4gezF9IiwKKyAgICAgICAgICAgICAgICAgICAgZS5Ub1N0cmluZygpLCBlLlNvdXJjZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRXb3Jrc2hlZXQoU3ByZWFkc2hlZXREb2N1bWVudCBzRG9jLCBXb3Jrc2hlZXREZm4gd29ya3NoZWV0RGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgUmVnZXggdmFsaWRTaGVldE5hbWUgPSBuZXcgUmVnZXgoQCJeW14nKlxbXF0vXFw6P11bXipcW1xdL1xcOj9dezAsMzB9JCIpOworICAgICAgICAgICAgaWYgKCF2YWxpZFNoZWV0TmFtZS5Jc01hdGNoKHdvcmtzaGVldERhdGEuTmFtZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTaGVldE5hbWVFeGNlcHRpb24od29ya3NoZWV0RGF0YS5OYW1lKTsKKworICAgICAgICAgICAgLy8gdGhyb3cgV29ya3NoZWV0QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbiBpZiBhIHNoZWV0IHdpdGggdGhlIHNhbWUgbmFtZSAoY2FzZS1pbnNlbnNpdGl2ZSkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHdvcmtib29rCisgICAgICAgICAgICBzdHJpbmcgVUNOYW1lID0gd29ya3NoZWV0RGF0YS5OYW1lLlRvVXBwZXIoKTsKKyAgICAgICAgICAgIFhEb2N1bWVudCB3WERvYyA9IHNEb2MuV29ya2Jvb2tQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgaWYgKHdYRG9jCisgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy5zaGVldHMpCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFMuc2hlZXQpCisgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoU1NOb05hbWVzcGFjZS5uYW1lKQorICAgICAgICAgICAgICAgIC5TZWxlY3QoYSA9PiAoKHN0cmluZylhKS5Ub1VwcGVyKCkpCisgICAgICAgICAgICAgICAgLkNvbnRhaW5zKFVDTmFtZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtzaGVldEFscmVhZHlFeGlzdHNFeGNlcHRpb24od29ya3NoZWV0RGF0YS5OYW1lKTsKKworICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSB3b3Jrc2hlZXQgd2l0aCB0aGUgc3VwcGxpZWQgbmFtZQorICAgICAgICAgICAgWERvY3VtZW50IGFwcFhEb2MgPSBzRG9jCisgICAgICAgICAgICAgICAgLkV4dGVuZGVkRmlsZVByb3BlcnRpZXNQYXJ0CisgICAgICAgICAgICAgICAgLkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgWEVsZW1lbnQgdmVjdG9yID0gYXBwWERvYworICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKEVQLlRpdGxlc09mUGFydHMpCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFZULnZlY3RvcikKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmICh2ZWN0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQ/IHNpemUgPSAoaW50Pyl2ZWN0b3IuQXR0cmlidXRlKFNTTm9OYW1lc3BhY2Uuc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzaXplID0gc2l6ZSArIDE7CisgICAgICAgICAgICAgICAgdmVjdG9yLlNldEF0dHJpYnV0ZVZhbHVlKFNTTm9OYW1lc3BhY2Uuc2l6ZSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgdmVjdG9yLkFkZCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFZULmxwc3RyLCB3b3Jrc2hlZXREYXRhLk5hbWUpKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBpNCA9IGFwcFhEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKEVQLkhlYWRpbmdQYWlycykKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFZULnZlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFZULnZhcmlhbnQpCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhWVC5pNCkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKGk0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGk0LlZhbHVlID0gKChpbnQpaTQgKyAxKS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIHNEb2MuRXh0ZW5kZWRGaWxlUHJvcGVydGllc1BhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFdvcmtib29rUGFydCB3b3JrYm9vayA9IHNEb2MuV29ya2Jvb2tQYXJ0OworICAgICAgICAgICAgc3RyaW5nIHJJZCA9ICJSIiArIEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCkuUmVwbGFjZSgiLSIsICIiKTsKKyAgICAgICAgICAgIFdvcmtzaGVldFBhcnQgd29ya3NoZWV0UGFydCA9IHdvcmtib29rLkFkZE5ld1BhcnQ8V29ya3NoZWV0UGFydD4ocklkKTsKKworICAgICAgICAgICAgWERvY3VtZW50IHdiWERvYyA9IHdvcmtib29rLkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgWEVsZW1lbnQgc2hlZXRzID0gd2JYRG9jLkRlc2NlbmRhbnRzKFMuc2hlZXRzKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgc2hlZXRzLkFkZCgKKyAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUy5zaGVldCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5uYW1lLCB3b3Jrc2hlZXREYXRhLk5hbWUuVG9TdHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFNTTm9OYW1lc3BhY2Uuc2hlZXRJZCwgc2hlZXRzLkVsZW1lbnRzKFMuc2hlZXQpLkNvdW50KCkgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoUi5pZCwgcklkKSkpOworICAgICAgICAgICAgd29ya2Jvb2suUHV0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIHN0cmluZyB3cyA9IFMucy5Ub1N0cmluZygpOworICAgICAgICAgICAgc3RyaW5nIHJlbG5zID0gUi5yLlRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gcGFydFN0cmVhbSA9IHdvcmtzaGVldFBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFhtbFdyaXRlciBwYXJ0WG1sV3JpdGVyID0gWG1sV3JpdGVyLkNyZWF0ZShwYXJ0U3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcnRYbWxXcml0ZXIuV3JpdGVTdGFydERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHBhcnRYbWxXcml0ZXIuV3JpdGVTdGFydEVsZW1lbnQoIndvcmtzaGVldCIsIHdzKTsKKyAgICAgICAgICAgICAgICAgICAgcGFydFhtbFdyaXRlci5Xcml0ZVN0YXJ0RWxlbWVudCgic2hlZXREYXRhIiwgd3MpOworCisgICAgICAgICAgICAgICAgICAgIGludCBudW1Db2x1bW5IZWFkaW5nUm93cyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCBudW1Db2x1bW5zID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bUNvbHVtbnNJblJvd3MgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgbnVtUm93czsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtzaGVldERhdGEuQ29sdW1uSGVhZGluZ3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUm93RGZuIHJvdyA9IG5ldyBSb3dEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxscyA9IHdvcmtzaGVldERhdGEuQ29sdW1uSGVhZGluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemVSb3dzKHNEb2MsIHBhcnRYbWxXcml0ZXIsIG5ld1tdIHsgcm93IH0sIDEsIG91dCBudW1Db2x1bW5zLCBvdXQgbnVtQ29sdW1uSGVhZGluZ1Jvd3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6ZVJvd3Moc0RvYywgcGFydFhtbFdyaXRlciwgd29ya3NoZWV0RGF0YS5Sb3dzLCBudW1Db2x1bW5IZWFkaW5nUm93cyArIDEsIG91dCBudW1Db2x1bW5zSW5Sb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0IG51bVJvd3MpOworICAgICAgICAgICAgICAgICAgICBpbnQgdG90YWxSb3dzID0gbnVtQ29sdW1uSGVhZGluZ1Jvd3MgKyBudW1Sb3dzOworICAgICAgICAgICAgICAgICAgICBpbnQgdG90YWxDb2x1bW5zID0gTWF0aC5NYXgobnVtQ29sdW1ucywgbnVtQ29sdW1uc0luUm93cyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh3b3Jrc2hlZXREYXRhLkNvbHVtbkhlYWRpbmdzICE9IG51bGwgJiYgd29ya3NoZWV0RGF0YS5UYWJsZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFydFhtbFdyaXRlci5Xcml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBySWQyID0gIlIiICsgR3VpZC5OZXdHdWlkKCkuVG9TdHJpbmcoKS5SZXBsYWNlKCItIiwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFydFhtbFdyaXRlci5Xcml0ZVN0YXJ0RWxlbWVudCgidGFibGVQYXJ0cyIsIHdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRYbWxXcml0ZXIuV3JpdGVTdGFydEF0dHJpYnV0ZSgiY291bnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRYbWxXcml0ZXIuV3JpdGVWYWx1ZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRYbWxXcml0ZXIuV3JpdGVFbmRBdHRyaWJ1dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRYbWxXcml0ZXIuV3JpdGVTdGFydEVsZW1lbnQoInRhYmxlUGFydCIsIHdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRYbWxXcml0ZXIuV3JpdGVTdGFydEF0dHJpYnV0ZSgiaWQiLCByZWxucyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0WG1sV3JpdGVyLldyaXRlVmFsdWUocklkMik7CisgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZURlZmluaXRpb25QYXJ0IHRkcCA9IHdvcmtzaGVldFBhcnQuQWRkTmV3UGFydDxUYWJsZURlZmluaXRpb25QYXJ0PihySWQyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhEb2N1bWVudCB0WERvYyA9IHRkcC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHRhYmxlID0gbmV3IFhFbGVtZW50KFMudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5pZCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5uYW1lLCB3b3Jrc2hlZXREYXRhLlRhYmxlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5kaXNwbGF5TmFtZSwgd29ya3NoZWV0RGF0YS5UYWJsZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UuX3JlZiwgIkExOiIgKyBTcHJlYWRzaGVldE1MVXRpbC5JbnRUb0NvbHVtbklkKHRvdGFsQ29sdW1ucyAtIDEpICsgdG90YWxSb3dzLlRvU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UudG90YWxzUm93U2hvd24sIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChTLmF1dG9GaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UuX3JlZiwgIkExOiIgKyBTcHJlYWRzaGVldE1MVXRpbC5JbnRUb0NvbHVtbklkKHRvdGFsQ29sdW1ucyAtIDEpICsgdG90YWxSb3dzLlRvU3RyaW5nKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUy50YWJsZUNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UuY291bnQsIHRvdGFsQ29sdW1ucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldERhdGEuQ29sdW1uSGVhZGluZ3MuU2VsZWN0KChjaCwgaSkgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChTLnRhYmxlQ29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UuaWQsIGkgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShTU05vTmFtZXNwYWNlLm5hbWUsIGNoLlZhbHVlKSkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUy50YWJsZVN0eWxlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5uYW1lLCAiVGFibGVTdHlsZU1lZGl1bTIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5zaG93Rmlyc3RDb2x1bW4sIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShTU05vTmFtZXNwYWNlLnNob3dMYXN0Q29sdW1uLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5zaG93Um93U3RyaXBlcywgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFNTTm9OYW1lc3BhY2Uuc2hvd0NvbHVtblN0cmlwZXMsIDApKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0WERvYy5BZGQodGFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGRwLlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc0RvYy5Xb3JrYm9va1BhcnQuV29ya2Jvb2tTdHlsZXNQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgc0RvYy5Xb3JrYm9va1BhcnQuV29ya2Jvb2tTdHlsZXNQYXJ0LlN0eWxlc2hlZXQuU2F2ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBTZXJpYWxpemVSb3dzKFNwcmVhZHNoZWV0RG9jdW1lbnQgc0RvYywgWG1sV3JpdGVyIHhtbFdyaXRlciwgSUVudW1lcmFibGU8Um93RGZuPiByb3dzLAorICAgICAgICAgICAgaW50IHN0YXJ0aW5nUm93TnVtYmVyLCBvdXQgaW50IG51bUNvbHVtbnMsIG91dCBpbnQgbnVtUm93cykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHJvd0NvdW50ID0gMDsKKyAgICAgICAgICAgIGludCByb3dOdW1iZXIgPSBzdGFydGluZ1Jvd051bWJlcjsKKyAgICAgICAgICAgIGludCBtYXhDb2x1bW5zID0gMDsKKyAgICAgICAgICAgIGludCBsb2NhbE51bUNvbHVtbnM7CisjaWYgRGlzcGxheVdvcmtpbmdTZXQKKyAgICAgICAgICAgIGludCB3b3JraW5nU2V0SW50ZXJ2YWwgPSAxMDAwMDsKKyAgICAgICAgICAgIGludCB3b3JraW5nU2V0Q291bnQgPSAwOworI2VuZGlmCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcm93IGluIHJvd3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2VyaWFsaXplUm93KHNEb2MsIHhtbFdyaXRlciwgcm93TnVtYmVyLCByb3csIG91dCBsb2NhbE51bUNvbHVtbnMpOworICAgICAgICAgICAgICAgIG1heENvbHVtbnMgPSBNYXRoLk1heChtYXhDb2x1bW5zLCBsb2NhbE51bUNvbHVtbnMpOworICAgICAgICAgICAgICAgIHJvd051bWJlcisrOworICAgICAgICAgICAgICAgIHJvd0NvdW50Kys7CisjaWYgRGlzcGxheVdvcmtpbmdTZXQKKyAgICAgICAgICAgICAgICBpZiAod29ya2luZ1NldENvdW50KysgPiB3b3JraW5nU2V0SW50ZXJ2YWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3b3JraW5nU2V0Q291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShFbnZpcm9ubWVudC5Xb3JraW5nU2V0KTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bUNvbHVtbnMgPSBtYXhDb2x1bW5zOworICAgICAgICAgICAgbnVtUm93cyA9IHJvd0NvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBTZXJpYWxpemVSb3coU3ByZWFkc2hlZXREb2N1bWVudCBzRG9jLCBYbWxXcml0ZXIgeHcsIGludCByb3dDb3VudCwgUm93RGZuIHJvdywgb3V0IGludCBudW1Db2x1bW5zKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgbnMgPSBTLnMuTmFtZXNwYWNlTmFtZTsKKworICAgICAgICAgICAgeHcuV3JpdGVTdGFydEVsZW1lbnQoInJvdyIsIG5zKTsKKyAgICAgICAgICAgIHh3LldyaXRlU3RhcnRBdHRyaWJ1dGUoInIiKTsKKyAgICAgICAgICAgIHh3LldyaXRlVmFsdWUocm93Q291bnQpOworICAgICAgICAgICAgeHcuV3JpdGVFbmRBdHRyaWJ1dGUoKTsKKyAgICAgICAgICAgIHh3LldyaXRlU3RhcnRBdHRyaWJ1dGUoInNwYW5zIik7CisgICAgICAgICAgICB4dy5Xcml0ZVZhbHVlKCIxOiIgKyByb3cuQ2VsbHMuQ291bnQoKS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIHh3LldyaXRlRW5kQXR0cmlidXRlKCk7CisgICAgICAgICAgICBpbnQgY2VsbENvdW50ID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHJvdy5DZWxscykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2VsbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeHcuV3JpdGVTdGFydEVsZW1lbnQoImMiLCBucyk7CisgICAgICAgICAgICAgICAgICAgIHh3LldyaXRlU3RhcnRBdHRyaWJ1dGUoInIiKTsKKyAgICAgICAgICAgICAgICAgICAgeHcuV3JpdGVWYWx1ZShTcHJlYWRzaGVldE1MVXRpbC5JbnRUb0NvbHVtbklkKGNlbGxDb3VudCkgKyByb3dDb3VudC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgeHcuV3JpdGVFbmRBdHRyaWJ1dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGwuQm9sZCAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLkl0YWxpYyAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLkZvcm1hdENvZGUgIT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5Ib3Jpem9udGFsQ2VsbEFsaWdubWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB4dy5Xcml0ZVN0YXJ0QXR0cmlidXRlKCJzIik7CisgICAgICAgICAgICAgICAgICAgICAgICB4dy5Xcml0ZVZhbHVlKEdldENlbGxTdHlsZShzRG9jLCBjZWxsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB4dy5Xcml0ZUVuZEF0dHJpYnV0ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY2VsbC5DZWxsRGF0YVR5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2VsbERhdGFUeXBlLkJvb2xlYW46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHcuV3JpdGVTdGFydEF0dHJpYnV0ZSgidCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh3LldyaXRlVmFsdWUoImIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dy5Xcml0ZUVuZEF0dHJpYnV0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDZWxsRGF0YVR5cGUuRGF0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dy5Xcml0ZVN0YXJ0QXR0cmlidXRlKCJ0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHcuV3JpdGVWYWx1ZSgiZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh3LldyaXRlRW5kQXR0cmlidXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENlbGxEYXRhVHlwZS5OdW1iZXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHcuV3JpdGVTdGFydEF0dHJpYnV0ZSgidCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh3LldyaXRlVmFsdWUoIm4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dy5Xcml0ZUVuZEF0dHJpYnV0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDZWxsRGF0YVR5cGUuU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh3LldyaXRlU3RhcnRBdHRyaWJ1dGUoInQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dy5Xcml0ZVZhbHVlKCJzdHIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dy5Xcml0ZUVuZEF0dHJpYnV0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dy5Xcml0ZVN0YXJ0QXR0cmlidXRlKCJ0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHcuV3JpdGVWYWx1ZSgic3RyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHcuV3JpdGVFbmRBdHRyaWJ1dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5WYWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB4dy5Xcml0ZVN0YXJ0RWxlbWVudCgidiIsIG5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHh3LldyaXRlVmFsdWUoY2VsbC5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB4dy5Xcml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB4dy5Xcml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2VsbENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4dy5Xcml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIG51bUNvbHVtbnMgPSBjZWxsQ291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgR2V0Q2VsbFN0eWxlKFNwcmVhZHNoZWV0RG9jdW1lbnQgc0RvYywgQ2VsbERmbiBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgc1hEb2MgPSBzRG9jLldvcmtib29rUGFydC5Xb3JrYm9va1N0eWxlc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICB2YXIgbWF0Y2ggPSBzWERvYworICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnQoUy5jZWxsWGZzKQorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnhmKQorICAgICAgICAgICAgICAgIC5TZWxlY3QoKGUsIGkpID0+IG5ldworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRWxlbWVudCA9IGUsCisgICAgICAgICAgICAgICAgICAgIEluZGV4ID0gaSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCh4ZiA9PiBDb21wYXJlU3R5bGVzKHNYRG9jLCB4Zi5FbGVtZW50LCBjZWxsKSk7CisgICAgICAgICAgICBpZiAobWF0Y2ggIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2guSW5kZXg7CisKKyAgICAgICAgICAgIC8vIGlmIG5vIG1hdGNoLCB0aGVuIGNyZWF0ZSBhIHN0eWxlCisgICAgICAgICAgICBpbnQgbmV3SWQgPSBDcmVhdGVOZXdTdHlsZShzWERvYywgY2VsbCwgc0RvYyk7CisgICAgICAgICAgICByZXR1cm4gbmV3SWQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgQ3JlYXRlTmV3U3R5bGUoWERvY3VtZW50IHNYRG9jLCBDZWxsRGZuIGNlbGwsIFNwcmVhZHNoZWV0RG9jdW1lbnQgc0RvYykKKyAgICAgICAgeworICAgICAgICAgICAgWEF0dHJpYnV0ZSBhcHBseUZvbnQgPSBudWxsOworICAgICAgICAgICAgWEF0dHJpYnV0ZSBmb250SWQgPSBudWxsOworICAgICAgICAgICAgaWYgKGNlbGwuQm9sZCA9PSB0cnVlIHx8IGNlbGwuSXRhbGljID09IHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBwbHlGb250ID0gbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5hcHBseUZvbnQsIDEpOworICAgICAgICAgICAgICAgIGZvbnRJZCA9IG5ldyBYQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UuZm9udElkLCBHZXRGb250SWQoc1hEb2MsIGNlbGwpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhBdHRyaWJ1dGUgYXBwbHlBbGlnbm1lbnQgPSBudWxsOworICAgICAgICAgICAgWEVsZW1lbnQgYWxpZ25tZW50ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjZWxsLkhvcml6b250YWxDZWxsQWxpZ25tZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBwbHlBbGlnbm1lbnQgPSBuZXcgWEF0dHJpYnV0ZShTU05vTmFtZXNwYWNlLmFwcGx5QWxpZ25tZW50LCAxKTsKKyAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSBuZXcgWEVsZW1lbnQoUy5hbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UuaG9yaXpvbnRhbCwgY2VsbC5Ib3Jpem9udGFsQ2VsbEFsaWdubWVudC5Ub1N0cmluZygpLlRvTG93ZXIoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgWEF0dHJpYnV0ZSBhcHBseU51bWJlckZvcm1hdCA9IG51bGw7CisgICAgICAgICAgICBYQXR0cmlidXRlIG51bUZtdElkID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjZWxsLkZvcm1hdENvZGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQ2VsbERmbi5TdGFuZGFyZEZvcm1hdHMuQ29udGFpbnNLZXkoY2VsbC5Gb3JtYXRDb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwcGx5TnVtYmVyRm9ybWF0ID0gbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5hcHBseU51bWJlckZvcm1hdCwgMSk7CisgICAgICAgICAgICAgICAgICAgIG51bUZtdElkID0gbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5udW1GbXRJZCwgQ2VsbERmbi5TdGFuZGFyZEZvcm1hdHNbY2VsbC5Gb3JtYXRDb2RlXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwcGx5TnVtYmVyRm9ybWF0ID0gbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5hcHBseU51bWJlckZvcm1hdCwgMSk7CisgICAgICAgICAgICAgICAgICAgIG51bUZtdElkID0gbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5udW1GbXRJZCwgR2V0TnVtRm10SWQoc1hEb2MsIGNlbGwuRm9ybWF0Q29kZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhFbGVtZW50IG5ld1hmID0gbmV3IFhFbGVtZW50KFMueGYsCisgICAgICAgICAgICAgICAgYXBwbHlGb250LAorICAgICAgICAgICAgICAgIGZvbnRJZCwKKyAgICAgICAgICAgICAgICBhcHBseUFsaWdubWVudCwKKyAgICAgICAgICAgICAgICBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgYXBwbHlOdW1iZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgbnVtRm10SWQpOworICAgICAgICAgICAgWEVsZW1lbnQgY2VsbFhmcyA9IHNYRG9jCisgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAuRWxlbWVudChTLmNlbGxYZnMpOworICAgICAgICAgICAgaWYgKGNlbGxYZnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjZWxsWGZzID0gbmV3IFhFbGVtZW50KFMuY2VsbFhmcywKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5jb3VudCwgMSksCisgICAgICAgICAgICAgICAgICAgIG5ld1hmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY3VycmVudENvdW50ID0gKGludCljZWxsWGZzLkF0dHJpYnV0ZShTU05vTmFtZXNwYWNlLmNvdW50KTsKKyAgICAgICAgICAgICAgICBjZWxsWGZzLlNldEF0dHJpYnV0ZVZhbHVlKFNTTm9OYW1lc3BhY2UuY291bnQsIGN1cnJlbnRDb3VudCArIDEpOworICAgICAgICAgICAgICAgIGNlbGxYZnMuQWRkKG5ld1hmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudENvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEdldEZvbnRJZChYRG9jdW1lbnQgc1hEb2MsIENlbGxEZm4gY2VsbCkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZm9udHMgPSBzWERvYy5Sb290LkVsZW1lbnQoUy5mb250cyk7CisgICAgICAgICAgICBpZiAoZm9udHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb250cyA9IG5ldyBYRWxlbWVudChTLmZvbnRzLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShTU05vTmFtZXNwYWNlLmNvdW50LCAxKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFMuZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuQm9sZCA9PSB0cnVlID8gbmV3IFhFbGVtZW50KFMuYikgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5JdGFsaWMgPT0gdHJ1ZSA/IG5ldyBYRWxlbWVudChTLmkpIDogbnVsbCkpOworICAgICAgICAgICAgICAgIHNYRG9jLlJvb3QuQWRkKGZvbnRzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhFbGVtZW50IGZvbnQgPSBuZXcgWEVsZW1lbnQoUy5mb250LAorICAgICAgICAgICAgICAgIGNlbGwuQm9sZCA9PSB0cnVlID8gbmV3IFhFbGVtZW50KFMuYikgOiBudWxsLAorICAgICAgICAgICAgICAgIGNlbGwuSXRhbGljID09IHRydWUgPyBuZXcgWEVsZW1lbnQoUy5pKSA6IG51bGwpOworICAgICAgICAgICAgZm9udHMuQWRkKGZvbnQpOworICAgICAgICAgICAgaW50IGNvdW50ID0gKGludClmb250cy5BdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5jb3VudCk7CisgICAgICAgICAgICBmb250cy5TZXRBdHRyaWJ1dGVWYWx1ZShTU05vTmFtZXNwYWNlLmNvdW50LCBjb3VudCArIDEpOworICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEdldE51bUZtdElkKFhEb2N1bWVudCBzWERvYywgc3RyaW5nIGZvcm1hdENvZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB4Zk51bWJlciA9IDgxOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy5udW1GbXRzKQorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy5udW1GbXQpCisgICAgICAgICAgICAgICAgICAgIC5BbnkobmYgPT4gKGludCluZi5BdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5udW1GbXRJZCkgPT0geGZOdW1iZXIpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICArK3hmTnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgWEVsZW1lbnQgbnVtRm10cyA9IHNYRG9jLlJvb3QuRWxlbWVudChTLm51bUZtdHMpOworICAgICAgICAgICAgaWYgKG51bUZtdHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBudW1GbXRzID0gbmV3IFhFbGVtZW50KFMubnVtRm10cywKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5jb3VudCwgMSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChTLm51bUZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UubnVtRm10SWQsIHhmTnVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UuZm9ybWF0Q29kZSwgZm9ybWF0Q29kZSkpKTsKKyAgICAgICAgICAgICAgICBzWERvYy5Sb290LkFkZEZpcnN0KG51bUZtdHMpOworICAgICAgICAgICAgICAgIHJldHVybiB4Zk51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhFbGVtZW50IG51bUZtdCA9IG5ldyBYRWxlbWVudChTLm51bUZtdCwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShTU05vTmFtZXNwYWNlLm51bUZtdElkLCB4Zk51bWJlciksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5mb3JtYXRDb2RlLCBmb3JtYXRDb2RlKSk7CisgICAgICAgICAgICBudW1GbXRzLkFkZChudW1GbXQpOworICAgICAgICAgICAgcmV0dXJuIHhmTnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBDb21wYXJlU3R5bGVzKFhEb2N1bWVudCBzWERvYywgWEVsZW1lbnQgeGYsIENlbGxEZm4gY2VsbCkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBtYXRjaEZvbnQgPSBNYXRjaEZvbnQoc1hEb2MsIHhmLCBjZWxsKTsKKyAgICAgICAgICAgIGJvb2wgbWF0Y2hBbGlnbm1lbnQgPSBNYXRjaEFsaWdubWVudChzWERvYywgeGYsIGNlbGwpOworICAgICAgICAgICAgYm9vbCBtYXRjaEZvcm1hdCA9IE1hdGNoRm9ybWF0KHNYRG9jLCB4ZiwgY2VsbCk7CisgICAgICAgICAgICByZXR1cm4gKG1hdGNoRm9udCAmJiBtYXRjaEFsaWdubWVudCAmJiBtYXRjaEZvcm1hdCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIE1hdGNoRm9udChYRG9jdW1lbnQgc1hEb2MsIFhFbGVtZW50IHhmLCBDZWxsRGZuIGNlbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKGludD8peGYuQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UuYXBwbHlGb250KSA9PSAwIHx8CisgICAgICAgICAgICAgICAgeGYuQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UuYXBwbHlGb250KSA9PSBudWxsKSAmJgorICAgICAgICAgICAgICAgIChjZWxsLkJvbGQgPT0gbnVsbCB8fCBjZWxsLkJvbGQgPT0gZmFsc2UpICYmCisgICAgICAgICAgICAgICAgKGNlbGwuSXRhbGljID09IG51bGwgfHwgY2VsbC5JdGFsaWMgPT0gZmFsc2UpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKCgoaW50Pyl4Zi5BdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5hcHBseUZvbnQpID09IDAgfHwKKyAgICAgICAgICAgICAgICB4Zi5BdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5hcHBseUZvbnQpID09IG51bGwpICYmCisgICAgICAgICAgICAgICAgKGNlbGwuQm9sZCA9PSB0cnVlIHx8CisgICAgICAgICAgICAgICAgIGNlbGwuSXRhbGljID09IHRydWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGludCBmb250SWQgPSAoaW50KXhmLkF0dHJpYnV0ZShTU05vTmFtZXNwYWNlLmZvbnRJZCk7CisgICAgICAgICAgICBYRWxlbWVudCBmb250ID0gc1hEb2MKKyAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50KFMuZm9udHMpCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFMuZm9udCkKKyAgICAgICAgICAgICAgICAuRWxlbWVudEF0KGZvbnRJZCk7CisgICAgICAgICAgICBYRWxlbWVudCBmYWJGb250ID0gbmV3IFhFbGVtZW50KFMuZm9udCwKKyAgICAgICAgICAgICAgICBjZWxsLkJvbGQgPT0gdHJ1ZSA/IG5ldyBYRWxlbWVudChTLmIpIDogbnVsbCwKKyAgICAgICAgICAgICAgICBjZWxsLkl0YWxpYyA9PSB0cnVlID8gbmV3IFhFbGVtZW50KFMuaSkgOiBudWxsKTsKKyAgICAgICAgICAgIGJvb2wgbWF0Y2ggPSBYTm9kZS5EZWVwRXF1YWxzKGZvbnQsIGZhYkZvbnQpOworICAgICAgICAgICAgcmV0dXJuIG1hdGNoOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBNYXRjaEFsaWdubWVudChYRG9jdW1lbnQgc1hEb2MsIFhFbGVtZW50IHhmLCBDZWxsRGZuIGNlbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoaW50Pyl4Zi5BdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5hcHBseUFsaWdubWVudCkgPT0gMCB8fAorICAgICAgICAgICAgICAgICh4Zi5BdHRyaWJ1dGUoU1NOb05hbWVzcGFjZS5hcHBseUFsaWdubWVudCkgPT0gbnVsbCkgJiYKKyAgICAgICAgICAgICAgICBjZWxsLkhvcml6b250YWxDZWxsQWxpZ25tZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoeGYuQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UuYXBwbHlBbGlnbm1lbnQpID09IG51bGwgJiYKKyAgICAgICAgICAgICAgICBjZWxsLkhvcml6b250YWxDZWxsQWxpZ25tZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgc3RyaW5nIGFsaWdubWVudCA9IChzdHJpbmcpeGYuRWxlbWVudChTLmFsaWdubWVudCkuQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UuaG9yaXpvbnRhbCk7CisgICAgICAgICAgICBib29sIG1hdGNoID0gYWxpZ25tZW50ID09IGNlbGwuSG9yaXpvbnRhbENlbGxBbGlnbm1lbnQuVG9TdHJpbmcoKS5Ub0xvd2VyKCk7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2g7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIE1hdGNoRm9ybWF0KFhEb2N1bWVudCBzWERvYywgWEVsZW1lbnQgeGYsIENlbGxEZm4gY2VsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChpbnQ/KXhmLkF0dHJpYnV0ZShTU05vTmFtZXNwYWNlLmFwcGx5TnVtYmVyRm9ybWF0KSAhPSAxICYmCisgICAgICAgICAgICAgICAgY2VsbC5Gb3JtYXRDb2RlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoeGYuQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UuYXBwbHlOdW1iZXJGb3JtYXQpID09IG51bGwgJiYKKyAgICAgICAgICAgICAgICBjZWxsLkZvcm1hdENvZGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpbnQgbnVtRm10SWQgPSAoaW50KXhmLkF0dHJpYnV0ZShTU05vTmFtZXNwYWNlLm51bUZtdElkKTsKKyAgICAgICAgICAgIGludD8gbmZpID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjZWxsLkZvcm1hdENvZGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQ2VsbERmbi5TdGFuZGFyZEZvcm1hdHMuQ29udGFpbnNLZXkoY2VsbC5Gb3JtYXRDb2RlKSkKKyAgICAgICAgICAgICAgICAgICAgbmZpID0gQ2VsbERmbi5TdGFuZGFyZEZvcm1hdHNbY2VsbC5Gb3JtYXRDb2RlXTsKKyAgICAgICAgICAgICAgICBpZiAobmZpID09IG51bUZtdElkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhFbGVtZW50IG51bUZtdHMgPSBzWERvYworICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnQoUy5udW1GbXRzKTsKKyAgICAgICAgICAgIGlmIChudW1GbXRzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgWEVsZW1lbnQgbnVtRm10ID0gbnVtRm10cworICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLm51bUZtdCkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQobnVtRm10RWxlbWVudCA9PgorICAgICAgICAgICAgICAgICAgICAoaW50KW51bUZtdEVsZW1lbnQuQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UubnVtRm10SWQpID09IG51bUZtdElkKTsKKyAgICAgICAgICAgIGlmIChudW1GbXQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBzdHJpbmcgc3R5bGVGb3JtYXRDb2RlID0gKHN0cmluZyludW1GbXQuQXR0cmlidXRlKFNTTm9OYW1lc3BhY2UuZm9ybWF0Q29kZSk7CisgICAgICAgICAgICBib29sIG1hdGNoID0gc3R5bGVGb3JtYXRDb2RlID09IGNlbGwuRm9ybWF0Q29kZTsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBfRW1wdHlYbHN4ID0gQCJVRXNEQkJRQUJnQUlBQUFBSVFCaTdwMW9ZUUVBQUpBRUFBQVRBQWdDVzBOdmJuUmxiblJmVkhsd1pYTmRMbmh0YkNDaUJBSW9vQUFDCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNzCitsRTFQd3pBTWh1OUkvSWNxVjlSbTQ0QVFXcmNESDBlWXhQZ0JvWEhYYUdrU3hkN1kvajF1OWlHRXlxYUpYUnExc2QvM2lXdG5ORm0zCitObHRCUk9OZEtZYkZRR1RnS3ErTm01ZmlZL2FTMzRzTVNUbXRySGRRaWcyZ21JeXZyMGF6VFFETU9OdGhLUnFpOENBbFZnMjBDZ3NmCit3UEZPN1dPcmlGL2pYQVpWTGRRYzVPMWdjQ2NyN3dnYzVkUnBpUEhvQ1dxMXRKUTlyL256bGlTQ1JaRTliZ003cjFLb0VLeXBGREdwCitYRG45eXlYZk9SU2NtV0t3TVFGdkdFUElYb2R1NTIrRFhkNGJseVlhRGRsVVJYcFZMV1BJdFpWZlBpNCt2VjhVeDBWNktIMWRtd3EwCityNVl0VjZEQUVFRnBiQUNvdFVWYWkxWVp0K2MrNHArQ1VhWmxlR0dRN254SitBUUg4ZjhHbVo3L1IwZ3lKd3lSTmhid3dxZmRpcDV5CitibFFFL1U2UkorUGlBRCsxajNGdzMweWpEOGdURk9IOEt1eEhwTXZPQXd0QkpBT0hJZWxydG9NalQ5LzVocis2SGJyNTFxQjd2R1c2CitUOGJmQUFBQS8vOERBRkJMQXdRVUFBWUFDQUFBQUNFQXRWVXdJL1VBQUFCTUFnQUFDd0FJQWw5eVpXeHpMeTV5Wld4eklLSUVBaWlnCitBQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBSXlTejA3RE1Bekc3MGk4UStUNzZtNUlDS0dsdTB4SXV5RlVIc0FrN2grMWphTWtRUGYyaEFPQ1NtUGIwZmJueno5YjN1N21hVlFmCitIR0l2VHNPNktFR3hNMko3MTJwNHJaOVdENkJpSW1kcEZNY2FqaHhoVjkzZWJGOTRwSlNiWXRmN3FMS0xpeHE2bFB3allqUWRUeFFMCis4ZXh5cFpFd1VjcGhhTkdUR2FobDNKVGxQWWEvSGxBdFBOWEJhZ2dIZXdlcVB2bzgrYkszTkUxdmVDL21mV0tYVG94QW5oTTd5M2JsCitRMllMcWMvYnFKcEN5MG1ERmZPYzB4SEoreUpqQTU0bTJseFA5UCsyT0hFaVM0blFTT0R6UE4rS2MwRHI2NEV1bjJpcCtMM09QT0tuCitoT0ZOWlBoaHdjVVBWRjhBQUFELy93TUFVRXNEQkJRQUJnQUlBQUFBSVFDQlBwU1g5QUFBQUxvQ0FBQWFBQWdCZUd3dlgzSmxiSE12CitkMjl5YTJKdmIyc3VlRzFzTG5KbGJITWdvZ1FCS0tBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ3NrczlLCit4REFReHUrQzd4RG1idE91SWlLYjdrV0V2V3A5Z0pCTW03SnRFakxqbjc2OW9hTGJoV1c5OUJMNFpzajMvVEtaN2U1ckhNUUhKdXFECitWMUFWSlFqMEp0amVkd3JlbXVlYkJ4REUybHM5Qkk4S0ppVFkxZGRYMnhjY05PZEw1UHBJSXJ0NFV1Q1k0Nk9VWkJ5T21vb1EwZWRPCitHOUtvT2N2VXlhak5RWGNvTjJWNUw5UFNBK29UVDdHM0N0TGUzb0pvcHBpVC8vY09iZHNiZkFybWZVVFBaeUlrOFRUa0I0aEdwdzVaCit3WTh1TWlQSTgvR2JOZU01andXUDZiT1U4MWxkWXFqV1pQZ002VUFPa1k4Y2Z5V1NjK2Npek4yYU1PUjBRdnZLS2EvYjhsdVc1ZC9KCit5Sk9OcTc4QkFBRC8vd01BVUVzREJCUUFCZ0FJQUFBQUlRQUVqTHhJVXdFQUFDY0NBQUFQQUFBQWVHd3ZkMjl5YTJKdmIyc3VlRzFzCitqSkhMVHNNd0VFWDNTUHlETlh1YXhJU3FWRTBxSVVCMGd5b0I3ZHJFazhhcVkwZTIwN1IvenlSUktFdFc5cnlPNTE2djF1ZGFzeE02CityNnpKSUpuRndOQVVWaXB6eU9EcjgvVnVBY3dIWWFUUTFtQUdGL1N3em05dlZwMTF4MjlyajR3QXhtZFFoZEFzbzhnWEZkYkN6MnlECitoaXFsZGJVSUZMcEQ1QnVIUXZvS01kUTY0bkU4ajJxaERJeUVwZnNQdzVhbEt2RFpGbTJOSm93UWgxb0VXdDlYcXZHUXIwcWxjVGNxCitZcUpwM2tWTmU1ODFNQzE4ZUpFcW9NemdnVUxiNFRXUkFuTnQ4OVFxVGRYSCs1aERsUCtLM0RwRzFJQnU2OVJKRkJkeUNwakVVclE2CitmSkxnNlQzSzg1VHplVC9ibTdOVDJQa3JwZy9aZWErTXRGMEdQQ1d6TDFPVXhMUlNONVQyU29hS1VPbmltbnREZGFoQ0JvczRpWHQ2Cis5QWMvV0VyUERDY3pnOTZQM21aYWNzaHRTQkxkM1ZMUnhXMWtNaENtc1VMb2dnVDJ4OURJT1UvR2p1bVA4eDhBQUFELy93TUFVRXNECitCQlFBQmdBSUFBQUFJUURRakxBTGZBQUFBSUVBQUFBVUFBQUFlR3d2YzJoaGNtVmtVM1J5YVc1bmN5NTRiV3dNeTBFS3dqQVFRTkc5Cis0QjNDN0cyaUN4RnAycDBuMEFNTXpkZ0Vra25JREtLM044dlA0OC9ydDJUem9TNnBzb2Z6NU1BUWJ6VWszajI4bm8vVERZd29jc0JjCittVHo4U0dCZGpvZFpSTTE0V1R4RTFYYTNWclpJQldXcWpYakl1L2FDT3JMdlZsb25EQktKdEdSN2NlNXFDeVlHdS93QkFBRC8vd01BCitVRXNEQkJRQUJnQUlBQUFBSVFEN1lxVnRsQVlBQUtjYkFBQVRBQUFBZUd3dmRHaGxiV1V2ZEdobGJXVXhMbmh0Yk94WlQyL2JOaFMvCitEOWgzSUhSdmJTZTJHd2QxaXRpeG02MU5HOFJ1aHg1cG1aWllVNkpBMGtsOUc5cmpnQUhEdW1HWEFidnRNR3dyMEFLN2RKOG1XNGV0CitBL29WOWtoS3NoakxTOUlHRzliVmgwUWlmM3ovMytNamRmWGFnNGloUXlJazVYSGJxMTJ1ZW9qRVBoL1RPR2g3ZDRiOVN4c2VrZ3JICitZOHg0VE5yZW5FanYydGI3NzEzRm15b2tFVUd3UHBhYnVPMkZTaVdibFlyMFlSakx5endoTWN4TnVJaXdnbGNSVk1ZQ0h3SGRpRlhXCitxdFZtSmNJMDlsQ01JeUI3ZXpLaFBrRkRUZExieW9qM0dMekdTdW9CbjRtQkprMmNGUVk3bnRZMFFzNWxsd2wwaUZuYkF6NWpmalFrCitENVNIR0pZS0p0cGUxZnk4eXRiVkN0NU1GekcxWW0xaFhkLzgwblhwZ3ZGMHpmQVV3U2huV3V2WFcxZDJjdm9Hd05ReXJ0ZnJkWHUxCituSjRCWU44SFRhMHNSWnIxL2thdGs5RXNnT3pqTXUxdXRWR3R1L2dDL2ZVbG1WdWRUcWZSU21XeFJBM0lQdGFYOEJ2VlpuMTd6Y0ViCitrTVUzbHZEMXpuYTMyM1R3Qm1UeHpTVjgvMHFyV1hmeEJoUXlHaytYME5xaC9YNUtQWWRNT05zdGhXOEFmS09hd2hjb2lJWTh1alNMCitDWS9WcWxpTDhIMHUrZ0RRUUlZVmpaR2FKMlNDZllqaUxvNUdnbUxOQUc4U1hKaXhRNzVjR3RLOGtQUUZUVlRiK3pEQmtCRUxlcStlCitmLy9xK1ZQMDZ2bVQ0NGZQamgvK2RQem8wZkhESHkwdForRXVqb1Bpd3BmZmZ2Ym4xeCtqUDU1KzgvTHhGK1Y0V2NULytzTW52L3o4CitlVGtRTW1naDBZc3ZuL3oyN01tTHJ6NzkvYnZISmZCdGdVZEYrSkJHUktKYjVBZ2Q4QWgwTTRaeEpTY2pjYjRWd3hCVFp3VU9nWFlKCis2WjRLSGVDdE9XWmx1QTV4alhkWFFQRW9BMTZmM1hka0hZUmlwbWdKNXh0aDVBRDNPR2NkTGtvTmNFUHpLbGg0T0l1RGN1WmlWc1FkCitZSHhZeHJ1TFk4ZTF2VmtDVlRNTFNzZjIzWkE0WXU0ekhDc2NrSmdvcE9mNGxKQVM3ZTVSNnRoMWovcUNTejVSNkI1RkhVeExUVEtrCitJeWVRRm90MmFRUittWmZwREs1MmJMTjNGM1U0SzlONmh4eTZTRWdJekVxRUh4TG1tUEU2bmlrY2xaRWM0b2dWRFg0VHE3Qk15TUZjCisrRVZjVHlyd2RFQVlSNzB4a2JKc3pXMEIraGFjZmdORHZTcDEreDZiUnk1U0tEb3RvM2tUYzE1RTd2QnBOOFJSVW9ZZDBEZ3NZaitRCitVd2hSalBhNUtvUHZjVGREOUR2NEFjY3IzWDJYRXNmZHB4ZUNPelJ3UkZvRWlKNlppUkpmWGlmY2lkL0JuRTB3TVZVR1NycFRxU01hCisvMTNaWmhUcXR1WHdybXkzdlczWXhNcVNaL2RFc1Y2Rit3K1c2QjA4aS9jSlpNWHlGdld1UXIrcjBONWJYNkZYNWZMRjErVkZLWVlxCityUnNTMjJ1YnpqdGEyWGhQS0dNRE5XZmtwalM5dDRRTmFOeUhRYjNPSERwSmZoQkxRbmpVbVF3TUhGd2dzRm1EQkZjZlVSVU9RcHhBCiszMTd6TkpGQXBxUURpUkl1NGJ4b2hrdHBhenowL3NxZU5odjZIR0lyaDhScWo0L3Q4TG9lem80Yk9Sa2pWV0RPdEJtamRVM2dyTXpXCityNlJFUWJmWFlWYlRRcDJaVzgySVpvcWl3eTFYV1p2WW5NdkI1TGxxTUpoYkV6b2JCUDBRV0xrSngzN05HczQ3bUpHeHRydjFVZVlXCis0NFdMZEpFTThaaWtQdEo2TC91b1pweVV4Y3FTSWxvUEd3ejY3SGlLMVFyY1dwcnNHM0E3aTVPSzdPb3IyR1hlZXhNdlpSRzg4QkpRCitPNW1PTEM0bUo0dlJVZHRyTmRZYUh2SngwdlltY0ZTR3h5Z0JyMHZkVEdJV3dIMlRyNFFOKzFPVDJXVDV3cHV0VERFM0NXcHcrMkh0Cit2cVN3VXdjU0lkVU9scUVORFRPVmhnQ0xOU2NyLzFvRHpIcFJDcFJVbzdOSnNiNEJ3ZkN2U1FGMmRGMUxKaFBpcTZLekN5UGFkdlkxCitMYVY4cG9nWWhPTWpOR0l6Y1lEQi9UcFVRWjh4bFhEallTcUNmb0hyT1cxdE0rVVc1elRwaXBkaUJtZkhNVXRDbkpaYm5hSlpKbHU0CitLVWk1RE9hdElCN29WaXE3VWU3OHFwaVV2eUJWaW1IOFAxTkY3eWR3QmJFKzFoN3c0WFpZWUtRenBlMXhvVUlPVlNnSnFkOFgwRGlZCisyZ0hSQWxlOE1BMUJCWGZVNXI4Z2gvcS96VGxMdzZRMW5DVFZBUTJRb0xBZnFWQVFzZzlseVVUZktjUnE2ZDVsU2JLVWtJbW9ncmd5CitzV0tQeUNGaFExMERtM3B2OTFBSW9XNnFTVm9HRE81ay9MbnZhUWFOQXQza0ZQUE5xV1Q1M210ejRKL3VmR3d5ZzFKdUhUWU5UV2IvCitYTVM4UFZqc3FuYTlXWjd0dlVWRjlNU2l6YXBuV1FITUNsdEJLMDM3MXhUaG5GdXRyVmhMR3E4MU11SEFpOHNhdzJEZUVDVndrWVQwCitIOWovcVBDWi9lQ2hOOVFoUDREYWl1RDdoU1lHWVFOUmZjazJIa2dYU0RzNGdzYkpEdHBnMHFTc2FkUFdTVnN0MjZ3dnVOUE4rWjR3Cit0cGJzTFA0K3A3SHo1c3hsNStUaVJSbzd0YkJqYXp1MjB0VGcyWk1wQ2tPVDdDQmpIR08rbEJVL1p2SFJmWEQwRG53Mm1ERWxUVERCCitweXFCb1ljZW1EeUE1TGNjemRLdHZ3QUFBUC8vQXdCUVN3TUVGQUFHQUFnQUFBQWhBSlEzNGUxSEFnQUE3QVFBQUEwQUFBQjRiQzl6CitkSGxzWlhNdWVHMXNwSlJmaTlzd0RNRGZCL3NPeHUrcDA2emRtcExrb08wVkRtN2pvQjNzMVUyYzFKei9CTnZwbW8xOTk4bEptcmJjCit3d2IzRWt1eS9MTWtTMGtlemxLZ0V6T1dhNVhpNlNURWlLbGNGMXhWS2Y2KzN3WUxqS3lqcXFCQ0s1YmlsbG44a0gzOGtGalhDclk3CitNdVlRSUpSTjhkRzVla21Jelk5TVVqdlJOVk93VTJvanFRUFZWTVRXaHRIQytrTlNrQ2dNUHhOSnVjSTlZU256LzRGSWFsNmJPc2kxCityS25qQnk2NGF6c1dSakpmUGxWS0czb1FFT3A1T3FQNWhkMHBiL0NTNTBaYlhib0o0SWd1UzU2enQxSEdKQ1pBeXBKU0syZFJyaHZsCitvRmFBOWpjc1g1WCtxYloreXh0N3J5eXh2OUNKQ3JCTU1jbVNYQXR0a0lQS1FHQ2RSVkhKZW84MUZmeGd1SGNycWVTaTdjMlJOM1RGCitIUHdraDlTOGtmZzRoc1hDSVM3RUdGWGtBd0JEbGtCMUhETnFDd29hNUgxYncvVUtIckxIZEg3LzhLNE1iYWZSL09ZQTZTN01rb00yCitCVFRPdFI0WFU1WUlWam9JMVBEcTZGZW5hL2dldEhOUTVTd3BPSzIwb2dKRTBrTkdBZExKbVJBNzMxdy95anYydVVTcWtWdnBub29VCitRNXY2SWx4RVNHUVFlMTZ2ZVA0dHJXZS9HNHZPNVQwZmlEZGgzd1U5WG8vOGU2ZjRtNThHQVoweklOQ2g0Y0p4ZFEvczBnZG1jYjZXCitJUFF2NEh4bjk3dVhza01sQ2xiU1Jyajl1Sm5pcS95VkZieVIwZWoxd2svYWRZZ1VYK1hlSy9aM3NMTjd0dEJlc0tMRzhCVC9mbHg5CitpVGVQMnloWWhLdEZNUHZFNWtFOFgyMkMrV3k5Mm15MmNSaUY2ejgzZy9hT01ldCtCMWtDZzdXMEFvYlJETWtPS2U2dXRoVGZLTSsrCiswYnF4SWhBMlBQc2xDV0xIMzFUMkZ3QUEvLzhEQUZCTEF3UVVBQVlBQ0FBQUFDRUE1bFdvNDJnQkFBQ0VBZ0FBR0FBQUFIaHNMM2R2CitjbXR6YUdWbGRITXZjMmhsWlhReExuaHRiSXlTeTJyRE1CQkY5NFgrZzlBK2xwTStFK0tFUWdqTm9sRDYyc3Z5MkJhUk5FYWFOTTNmCitkK3lRVXNnbU80MDBjN2ozanViTEgrL0VOOFJrTVJSeW5PVlNRREJZMmRBVTh2TmpQWHFVSXBFT2xYWVlvSkFIU0hLNXVMNmE3ekZ1CitVd3RBZ2draEZiSWw2bVpLSmRPQzF5bkREZ0svMUJpOUppNWpvMUlYUVZmRGtIZHFrdWYzeW1zYjVKRXdpNWN3c0s2dGdSV2FuWWRBCitSMGdFcDRuMXA5WjI2VVR6NWhLYzEzRzc2MFlHZmNlSTBqcExod0VxaFRlelRSTXc2dEt4NzUveHJUWW45bENjNGIwMUVSUFdsREZPCitIWVdlZTU2cXFXTFNZbDVaZHRESExpTFVoWHdhUzdXWUQrRjhXZGluZjJkQnVud0hCNGFnNGgxSjBXZGZJbTc3eGcxZjVmMm9PcHRkCitEOW0vUmxGQnJYZU8zbkQvRExacGlTRjM3S1czTktzT0swaUdzMlJNTnJuN0U3SFNwSm5hNlFaZWRHeHNTTUpCUFhROVNCR1BtRHpqCitNMkhYeno0d3NrUWk5S2VxNVcwRGJ6WFBicVNvRWVsVTlHci8vcy9pRndBQS8vOERBRkJMQXdRVUFBWUFDQUFBQUNFQW0yUVcxVDRCCitBQUJSQWdBQUVRQUlBV1J2WTFCeWIzQnpMMk52Y21VdWVHMXNJS0lFQVNpZ0FBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQWZKSlJTOE13RklYZkJmOUR5WHVhWkdORFE5dUJ5cDRjQ0U0VTMwSnkxeFdiTkNUUmJ2L2V0TjFxQjBQSVMrNDU5N3NuCitsMlNyZzY2VEgzQytha3lPV0VwUkFrWTJxakpsanQ2MmEzeUhFaCtFVWFKdURPVG9DQjZ0aXR1YlRGb3VHd2N2cnJIZ1FnVStpU1RqCit1YlE1Mm9kZ09TRmU3a0VMbjBhSGllS3VjVnFFZUhVbHNVSitpUkxJak5JbDBSQ0VFa0dRRG9qdFNFUW5wSklqMG42N3VnY29TYUFHCitEU1o0d2xKRy9yd0JuUFpYRzNwbDR0UlZPTnI0cGxQY0tWdkpRUnpkQjErTnhyWnQwM2JleDRqNUdmbllQTC8yVDhXVjZYWWxBUldaCitrbHc2RUtGeFJVYW1sN2k0V3Zpd2lUdmVWYUFlamxHL1VsT3lqenRBUUNVeEFCL2lucFgzK2VQVGRvMktib2VZM21PMjNGTEsrL1BaCitqYnpvN3dJTkJYMGEvQytSelRCbG1FYmlnalBHRi9NSjhRd1ljbDkrZ3VJWEFBRC8vd01BVUVzREJCUUFCZ0FJQUFBQUlRQjBSTXdvCitpUUVBQUJFREFBQVFBQWdCWkc5alVISnZjSE12WVhCd0xuaHRiQ0NpQkFFb29BQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFKeVNRVy9iTUF5Rjd3UDJId3pkR3psdE1ReUJyR0pJTy9Td1lRR1N0bWROcG1PaHNpU0lySkhzMTQrMmtjYlpkdHFOCis1SHQ0K2tSSjNSMDZYL1NRMGNWUWllV2lGQVVFRzJzWDlwVjQybjI5K2l3S0pCTnE0Mk9BU2h3QnhaMysrRUZ0Y2t5UXlRRVdIQkd3CitFaTFSV2ttSnRvWE80SUxsd0VvVGMyZUkyN3lYc1dtY2hmdG8zem9JSksvTDhwT0VBMEdvb2I1Szc0RmlTbHoxOUwraGRiUURIejd2Citqb21CdGZxU2tuZldFTjlTZjNjMlI0d05GUThIQzE3SnVhaVliZ3YyTFRzNjZsTEplYXUyMW5oWWM3QnVqRWRROGp4UWoyQ0dwVzJNCit5NmhWVDZzZUxNVmNvUHZGYTdzV3hVK0RNT0JVb2pmWm1VQ01OZGltWnF4OVFzcjZKZVpYYkFFSWxXVEROQnpMdVhkZXUxdTlIQTFjCitYQnFIZ0FtRWhVdkVuU01QK0tQWm1Fei9JRjdPaVVlR2lYZkMyUTU4MDVsenZ2SEtmTklmMmV2WUpST09MTHhYMzF4NHhhZTBpL2VHCis0TFRPeTZIYXRpWkR6Uzl3MHM4RDljaWJ6SDRJV2JjbTdLRStlZjRXaHNkL25uNjRYdDR1eXB1UzMzVTJVL0w4bC9WdkFBQUEvLzhECitBRkJMQVFJdEFCUUFCZ0FJQUFBQUlRQmk3cDFvWVFFQUFKQUVBQUFUQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJiUTI5dWRHVnVkRjlVCitlWEJsYzEwdWVHMXNVRXNCQWkwQUZBQUdBQWdBQUFBaEFMVlZNQ1AxQUFBQVRBSUFBQXNBQUFBQUFBQUFBQUFBQUFBQW1nTUFBRjl5CitaV3h6THk1eVpXeHpVRXNCQWkwQUZBQUdBQWdBQUFBaEFJRStsSmYwQUFBQXVnSUFBQm9BQUFBQUFBQUFBQUFBQUFBQXdBWUFBSGhzCitMMTl5Wld4ekwzZHZjbXRpYjI5ckxuaHRiQzV5Wld4elVFc0JBaTBBRkFBR0FBZ0FBQUFoQUFTTXZFaFRBUUFBSndJQUFBOEFBQUFBCitBQUFBQUFBQUFBQUE5QWdBQUhoc0wzZHZjbXRpYjI5ckxuaHRiRkJMQVFJdEFCUUFCZ0FJQUFBQUlRRFFqTEFMZkFBQUFJRUFBQUFVCitBQUFBQUFBQUFBQUFBQUFBQUhRS0FBQjRiQzl6YUdGeVpXUlRkSEpwYm1kekxuaHRiRkJMQVFJdEFCUUFCZ0FJQUFBQUlRRDdZcVZ0CitsQVlBQUtjYkFBQVRBQUFBQUFBQUFBQUFBQUFBQUNJTEFBQjRiQzkwYUdWdFpTOTBhR1Z0WlRFdWVHMXNVRXNCQWkwQUZBQUdBQWdBCitBQUFoQUpRMzRlMUhBZ0FBN0FRQUFBMEFBQUFBQUFBQUFBQUFBQUFBNXhFQUFIaHNMM04wZVd4bGN5NTRiV3hRU3dFQ0xRQVVBQVlBCitDQUFBQUNFQTVsV280MmdCQUFDRUFnQUFHQUFBQUFBQUFBQUFBQUFBQUFCWkZBQUFlR3d2ZDI5eWEzTm9aV1YwY3k5emFHVmxkREV1CitlRzFzVUVzQkFpMEFGQUFHQUFnQUFBQWhBSnRrRnRVK0FRQUFVUUlBQUJFQUFBQUFBQUFBQUFBQUFBQUE5eFVBQUdSdlkxQnliM0J6CitMMk52Y21VdWVHMXNVRXNCQWkwQUZBQUdBQWdBQUFBaEFIUkV6Q2lKQVFBQUVRTUFBQkFBQUFBQUFBQUFBQUFBQUFBQWJCZ0FBR1J2CitZMUJ5YjNCekwyRndjQzU0Yld4UVN3VUdBQUFBQUFvQUNnQ0FBZ0FBS3hzQUFBQUEiOworCisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFNwcmVhZHNoZWV0V3JpdGVySW50ZXJuYWxFeGNlcHRpb24gOiBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBTcHJlYWRzaGVldFdyaXRlckludGVybmFsRXhjZXB0aW9uKCkKKyAgICAgICAgICAgIDogYmFzZSgiSW50ZXJuYWwgZXJyb3IgLSB1bmV4cGVjdGVkIGNvbnRlbnQgaW4gX0VtcHR5WGxzeC4iKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgSW52YWxpZFNoZWV0TmFtZUV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIEludmFsaWRTaGVldE5hbWVFeGNlcHRpb24oc3RyaW5nIG5hbWUpCisgICAgICAgICAgICA6IGJhc2Uoc3RyaW5nLkZvcm1hdCgiVGhlIHN1cHBsaWVkIG5hbWUgKHswfSkgaXMgbm90IGEgdmFsaWQgWExTWCB3b3Jrc2hlZXQgbmFtZS4iLCBuYW1lKSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzL1N0cm9uZ2x5VHlwZWRCbG9jay5jcyBiL09wZW5YbWxQb3dlclRvb2xzL1N0cm9uZ2x5VHlwZWRCbG9jay5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTkxYTJiCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvU3Ryb25nbHlUeXBlZEJsb2NrLmNzCkBAIC0wLDAgKzEsNzAgQEAKKy8vCisvLyBDb3B5cmlnaHQgMjAxNyBUaG9tYXMgQmFybmVrb3cKKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiBUaGUgdGV4dCBvZiB0aGUKKy8vIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisvLworLy8gaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorLy8KKy8vIERldmVsb3BlcjogVGhvbWFzIEJhcm5la293CisvLyBFbWFpbDogdGhvbWFzQGJhcm5la293LmluZm8KKy8vCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByb3ZpZGVzIGFuIGVsZWdhbnQgd2F5IG9mIHdyYXBwaW5nIGEgc2V0IG9mIGludm9jYXRpb25zIG9mIHRoZSBzdHJvbmdseSB0eXBlZCAKKyAgICAvLy8gY2xhc3NlcyBwcm92aWRlZCBieSB0aGUgT3BlbiBYTUwgU0RLKSBpbiBhIHVzaW5nIHN0YXRlbWVudCB0aGF0IGRlbWFyY2F0ZXMgdGhvc2UKKyAgICAvLy8gaW52b2thdGlvbnMgYXMgb25lICJibG9jayIgYmVmb3JlIGFuZCBhZnRlciB3aGljaCB0aGUgUG93ZXJUb29scyBjYW4gYmUgdXNlZCBzYWZlbHkuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIDxwYXJhPgorICAgIC8vLyBUaGlzIGNsYXNzIGxlbmRzIGl0c2VsZiB0byBzY2VuYXJpb3Mgd2hlcmUgdGhlIFBvd2VyVG9vbHMgYW5kIExpbnEtdG8tWE1MIGFyZSB1c2VkIGFzCisgICAgLy8vIHRoZSBwcmltYXJ5IEFQSSBmb3Igd29ya2luZyB3aXRoIE9wZW4gWE1MIGVsZW1lbnRzLCBuZXh0IHRvIHRoZSBzdHJvbmdseSB0eXBlZCBjbGFzc2VzCisgICAgLy8vIHByb3ZpZGVkIGJ5IHRoZSBPcGVuIFhNTCBTREsuIEluIHRoZXNlIHNjZW5hcmlvcywgdGhlIGNsYXNzIHdvdWxkIGJlIHVzZWQgYXMgZm9sbG93czoKKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLyA8Y29kZT4KKyAgICAvLy8gICAgIFtZb3VyIGNvZGUgdXNpbmcgdGhlIFBvd2VyVG9vbHNdCisgICAgLy8vIAorICAgIC8vLyAgICAgdXNpbmcgKG5ldyBOb25Qb3dlclRvb2xzQmxvY2sod29yZHByb2Nlc3NpbmdEb2N1bWVudCkpCisgICAgLy8vICAgICB7CisgICAgLy8vICAgICAgICAgW1lvdXIgY29kZSB1c2luZyB0aGUgc3Ryb25nbHkgdHlwZWQgY2xhc3Nlc10KKyAgICAvLy8gICAgIH0KKyAgICAvLy8gCisgICAgLy8vICAgIFtZb3VyIGNvZGUgdXNpbmcgdGhlIFBvd2VyVG9vbHNdCisgICAgLy8vIDwvY29kZT4KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vIFVwb24gY3JlYXRpb24sIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHdpbGwgaW52b2tlIHRoZQorICAgIC8vLyA8c2VlIGNyZWY9IlBvd2VyVG9vbHNCbG9ja0V4dGVuc2lvbnMuRW5kUG93ZXJUb29sc0Jsb2NrIi8+IG1ldGhvZCBvbiB0aGUgcGFja2FnZQorICAgIC8vLyB0byBiZWdpbiB0aGUgYmxvY2suIFVwb24gZGlzcG9zYWwsIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHdpbGwgY2FsbCB0aGUKKyAgICAvLy8gPHNlZSBjcmVmPSJQb3dlclRvb2xzQmxvY2tFeHRlbnNpb25zLkJlZ2luUG93ZXJUb29sc0Jsb2NrIi8+IG1ldGhvZCBvbiB0aGUgcGFja2FnZQorICAgIC8vLyB0byBlbmQgdGhlIGJsb2NrLgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAvLy8gPHNlZWFsc28gY3JlZj0iUG93ZXJUb29sc0Jsb2NrIi8+CisgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlBvd2VyVG9vbHNCbG9ja0V4dGVuc2lvbnMuQmVnaW5Qb3dlclRvb2xzQmxvY2siLz4KKyAgICAvLy8gPHNlZWFsc28gY3JlZj0iUG93ZXJUb29sc0Jsb2NrRXh0ZW5zaW9ucy5FbmRQb3dlclRvb2xzQmxvY2siLz4KKyAgICBwdWJsaWMgY2xhc3MgU3Ryb25nbHlUeXBlZEJsb2NrIDogSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgT3BlblhtbFBhY2thZ2UgX3BhY2thZ2U7CisKKyAgICAgICAgcHVibGljIFN0cm9uZ2x5VHlwZWRCbG9jayhPcGVuWG1sUGFja2FnZSBwYWNrYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFja2FnZSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJwYWNrYWdlIik7CisKKyAgICAgICAgICAgIF9wYWNrYWdlID0gcGFja2FnZTsKKyAgICAgICAgICAgIF9wYWNrYWdlLkVuZFBvd2VyVG9vbHNCbG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfcGFja2FnZSA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIF9wYWNrYWdlLkJlZ2luUG93ZXJUb29sc0Jsb2NrKCk7CisgICAgICAgICAgICBfcGFja2FnZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9UZXN0VXRpbC5jcyBiL09wZW5YbWxQb3dlclRvb2xzL1Rlc3RVdGlsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTRmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9UZXN0VXRpbC5jcwpAQCAtMCwwICsxLDg4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVzdFV0aWwKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgRGlyZWN0b3J5SW5mbyBTb3VyY2VEaXIgPSBuZXcgRGlyZWN0b3J5SW5mbygiLi4vLi4vLi4vLi4vVGVzdEZpbGVzLyIpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sPyBzX0RlbGV0ZVRlbXBGaWxlcyA9IG51bGw7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIERlbGV0ZVRlbXBGaWxlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc19EZWxldGVUZW1wRmlsZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChib29sKXNfRGVsZXRlVGVtcEZpbGVzOworICAgICAgICAgICAgICAgIEZpbGVJbmZvIGRvbm90ZGVsZXRlID0gbmV3IEZpbGVJbmZvKCJkb25vdGRlbGV0ZS50eHQiKTsKKyAgICAgICAgICAgICAgICBzX0RlbGV0ZVRlbXBGaWxlcyA9ICFkb25vdGRlbGV0ZS5FeGlzdHM7CisgICAgICAgICAgICAgICAgcmV0dXJuIChib29sKXNfRGVsZXRlVGVtcEZpbGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGlyZWN0b3J5SW5mbyBzX1RlbXBEaXIgPSBudWxsOworICAgICAgICBwdWJsaWMgc3RhdGljIERpcmVjdG9yeUluZm8gVGVtcERpcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc19UZW1wRGlyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzX1RlbXBEaXI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5vdyA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBEaXJOYW1lID0gU3RyaW5nLkZvcm1hdCgiVGVzdC17MDowMH0tezE6MDB9LXsyOjAwfS17MzowMH17NDowMH17NTowMH0iLCBub3cuWWVhciAtIDIwMDAsIG5vdy5Nb250aCwgbm93LkRheSwgbm93LkhvdXIsIG5vdy5NaW51dGUsIG5vdy5TZWNvbmQpOworICAgICAgICAgICAgICAgICAgICBzX1RlbXBEaXIgPSBuZXcgRGlyZWN0b3J5SW5mbyhQYXRoLkNvbWJpbmUoIi4iLCB0ZW1wRGlyTmFtZSkpOworICAgICAgICAgICAgICAgICAgICBzX1RlbXBEaXIuQ3JlYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzX1RlbXBEaXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE5vdGVQYWQoc3RyaW5nIHN0cikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGd1aWROYW1lID0gR3VpZC5OZXdHdWlkKCkuVG9TdHJpbmcoKS5SZXBsYWNlKCItIiwgIiIpICsgIi50eHQiOworICAgICAgICAgICAgdmFyIGZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShUZW1wRGlyLkZ1bGxOYW1lLCBndWlkTmFtZSkpOworICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoZmkuRnVsbE5hbWUsIHN0cik7CisgICAgICAgICAgICB2YXIgbm90ZXBhZEV4ZSA9IG5ldyBGaWxlSW5mbyhAIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTm90ZXBhZCsrXG5vdGVwYWQrKy5leGUiKTsKKyAgICAgICAgICAgIGlmICghbm90ZXBhZEV4ZS5FeGlzdHMpCisgICAgICAgICAgICAgICAgbm90ZXBhZEV4ZSA9IG5ldyBGaWxlSW5mbyhAIkM6XFByb2dyYW0gRmlsZXNcTm90ZXBhZCsrXG5vdGVwYWQrKy5leGUiKTsKKyAgICAgICAgICAgIGlmICghbm90ZXBhZEV4ZS5FeGlzdHMpCisgICAgICAgICAgICAgICAgbm90ZXBhZEV4ZSA9IG5ldyBGaWxlSW5mbyhAIkM6XFdpbmRvd3NcU3lzdGVtMzJcbm90ZXBhZC5leGUiKTsKKyAgICAgICAgICAgIEV4ZWN1dGFibGVSdW5uZXIuUnVuRXhlY3V0YWJsZShub3RlcGFkRXhlLkZ1bGxOYW1lLCBmaS5GdWxsTmFtZSwgVGVtcERpci5GdWxsTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgS0RpZmYzKEZpbGVJbmZvIG9sZEZpLCBGaWxlSW5mbyBuZXdGaSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGtkaWZmRXhlID0gbmV3IEZpbGVJbmZvKEAiQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxLRGlmZjNca2RpZmYzLmV4ZSIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IEV4ZWN1dGFibGVSdW5uZXIuUnVuRXhlY3V0YWJsZShrZGlmZkV4ZS5GdWxsTmFtZSwgb2xkRmkuRnVsbE5hbWUgKyAiICIgKyBuZXdGaS5GdWxsTmFtZSwgVGVtcERpci5GdWxsTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgRXhwbG9yZXIoRGlyZWN0b3J5SW5mbyBkaSkKKyAgICAgICAgeworICAgICAgICAgICAgUHJvY2Vzcy5TdGFydChkaS5GdWxsTmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9UZXh0UmVwbGFjZXIuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9UZXh0UmVwbGFjZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxNmQzYgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzL1RleHRSZXBsYWNlci5jcwpAQCAtMCwwICsxLDQ0MyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgcGFydGlhbCBjbGFzcyBXbWxEb2N1bWVudCA6IE9wZW5YbWxQb3dlclRvb2xzRG9jdW1lbnQKKyAgICB7CisgICAgICAgIHB1YmxpYyBXbWxEb2N1bWVudCBTZWFyY2hBbmRSZXBsYWNlKHN0cmluZyBzZWFyY2gsIHN0cmluZyByZXBsYWNlLCBib29sIG1hdGNoQ2FzZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRleHRSZXBsYWNlci5TZWFyY2hBbmRSZXBsYWNlKHRoaXMsIHNlYXJjaCwgcmVwbGFjZSwgbWF0Y2hDYXNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBwYXJ0aWFsIGNsYXNzIFBtbERvY3VtZW50IDogT3BlblhtbFBvd2VyVG9vbHNEb2N1bWVudAorICAgIHsKKyAgICAgICAgcHVibGljIFBtbERvY3VtZW50IFNlYXJjaEFuZFJlcGxhY2Uoc3RyaW5nIHNlYXJjaCwgc3RyaW5nIHJlcGxhY2UsIGJvb2wgbWF0Y2hDYXNlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVGV4dFJlcGxhY2VyLlNlYXJjaEFuZFJlcGxhY2UodGhpcywgc2VhcmNoLCByZXBsYWNlLCBtYXRjaENhc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFRleHRSZXBsYWNlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBNYXRjaFNlbWFwaG9yZQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IE1hdGNoSWQ7CisgICAgICAgICAgICBwdWJsaWMgTWF0Y2hTZW1hcGhvcmUoaW50IG1hdGNoSWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWF0Y2hJZCA9IG1hdGNoSWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYT2JqZWN0IENsb25lV2l0aEFubm90YXRpb24oWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld0VsZW1lbnQgPSBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IENsb25lV2l0aEFubm90YXRpb24obikpKTsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5Bbm5vdGF0aW9uPE1hdGNoU2VtYXBob3JlPigpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuQWRkQW5ub3RhdGlvbihlbGVtZW50LkFubm90YXRpb248TWF0Y2hTZW1hcGhvcmU+KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgV21sU2VhcmNoQW5kUmVwbGFjZVRyYW5zZm9ybShYTm9kZSBub2RlLAorICAgICAgICAgICAgc3RyaW5nIHNlYXJjaCwgc3RyaW5nIHJlcGxhY2UsIGJvb2wgbWF0Y2hDYXNlKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGVudHMgPSBlbGVtZW50LkRlc2NlbmRhbnRzKFcudCkuU2VsZWN0KHQgPT4gKHN0cmluZyl0KS5TdHJpbmdDb25jYXRlbmF0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudHMuQ29udGFpbnMoc2VhcmNoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKCFtYXRjaENhc2UgJiYgY29udGVudHMuVG9VcHBlcigpLkNvbnRhaW5zKHNlYXJjaC5Ub1VwcGVyKCkpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgcGFyYWdyYXBoV2l0aFNwbGl0UnVucyA9IG5ldyBYRWxlbWVudChXLnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFdtbFNlYXJjaEFuZFJlcGxhY2VUcmFuc2Zvcm0obiwgc2VhcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlLCBtYXRjaENhc2UpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudFtdIHN1YlJ1bkFycmF5ID0gcGFyYWdyYXBoV2l0aFNwbGl0UnVucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBzdWJSdW5FbGVtZW50ID0gZS5FbGVtZW50cygpLkZpcnN0T3JEZWZhdWx0KGVsID0+IGVsLk5hbWUgIT0gVy5yUHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViUnVuRWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVy5TdWJSdW5MZXZlbENvbnRlbnQuQ29udGFpbnMoc3ViUnVuRWxlbWVudC5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyYWdyYXBoQ2hpbGRyZW5Db3VudCA9IHN1YlJ1bkFycmF5Lkxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRjaElkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYyBpbiBzdWJSdW5BcnJheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UYWtlKHBhcmFncmFwaENoaWxkcmVuQ291bnQgLSAoc2VhcmNoLkxlbmd0aCAtIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoKGMsIGkpID0+IG5ldyB7IENoaWxkID0gYywgSW5kZXggPSBpLCB9KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViU2VxdWVuY2UgPSBzdWJSdW5BcnJheS5TZXF1ZW5jZUF0KHBjLkluZGV4KS5UYWtlKHNlYXJjaC5MZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB6aXBwZWQgPSBzdWJTZXF1ZW5jZS5QdFppcChzZWFyY2gsIChwY3AsIGMpID0+IG5ldworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYWdyYXBoQ2hpbGRQcm9qZWN0aW9uID0gcGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXJUb0NvbXBhcmUgPSBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9udE1hdGNoID0gemlwcGVkLkFueSh6ID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHouUGFyYWdyYXBoQ2hpbGRQcm9qZWN0aW9uLkFubm90YXRpb248TWF0Y2hTZW1hcGhvcmU+KCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaENhc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gei5QYXJhZ3JhcGhDaGlsZFByb2plY3Rpb24uVmFsdWUgIT0gei5DaGFyYWN0ZXJUb0NvbXBhcmUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHouUGFyYWdyYXBoQ2hpbGRQcm9qZWN0aW9uLlZhbHVlLlRvVXBwZXIoKSAhPSB6LkNoYXJhY3RlclRvQ29tcGFyZS5Ub1N0cmluZygpLlRvVXBwZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaCA9ICFkb250TWF0Y2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gc3ViU2VxdWVuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLkFkZEFubm90YXRpb24obmV3IE1hdGNoU2VtYXBob3JlKG1hdGNoSWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyttYXRjaElkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGlzIGxvY2FsbHkgaW1wdXJlLCBhcyB0aGlzIGlzIHRoZSBtb3N0IGV4cHJlc3NpdmUgd2F5IHRvIHdyaXRlIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgcGFyYWdyYXBoV2l0aFJlcGxhY2VkUnVucyA9IChYRWxlbWVudClDbG9uZVdpdGhBbm5vdGF0aW9uKHBhcmFncmFwaFdpdGhTcGxpdFJ1bnMpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaWQgPSAxOyBpZCA8IG1hdGNoSWQ7ICsraWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxYRWxlbWVudD4gZWxlbWVudHNUb1JlcGxhY2UgPSBwYXJhZ3JhcGhXaXRoUmVwbGFjZWRSdW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZW0gPSBlLkFubm90YXRpb248TWF0Y2hTZW1hcGhvcmU+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VtID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbS5NYXRjaElkID09IGlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHNUb1JlcGxhY2UuRmlyc3QoKS5BZGRCZWZvcmVTZWxmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHNUb1JlcGxhY2UuRmlyc3QoKS5FbGVtZW50cyhXLnJQciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50LCByZXBsYWNlKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzVG9SZXBsYWNlLlJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwZWRBZGphY2VudFJ1bnNXaXRoSWRlbnRpY2FsRm9ybWF0dGluZyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoV2l0aFJlcGxhY2VkUnVucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoY2UgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZS5OYW1lICE9IFcucikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRG9udENvbnNvbGlkYXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlLkVsZW1lbnRzKCkuV2hlcmUoZSA9PiBlLk5hbWUgIT0gVy5yUHIpLkNvdW50KCkgIT0gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2UuRWxlbWVudChXLnQpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRvbnRDb25zb2xpZGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZS5FbGVtZW50KFcuclByKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2UuRWxlbWVudChXLnJQcikuVG9TdHJpbmcoU2F2ZU9wdGlvbnMuTm9uZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBwYXJhZ3JhcGhXaXRoQ29uc29saWRhdGVkUnVucyA9IG5ldyBYRWxlbWVudChXLnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZEFkamFjZW50UnVuc1dpdGhJZGVudGljYWxGb3JtYXR0aW5nLlNlbGVjdChnID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnLktleSA9PSAiRG9udENvbnNvbGlkYXRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iamVjdClnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRleHRWYWx1ZSA9IGcuU2VsZWN0KHIgPT4gci5FbGVtZW50KFcudCkuVmFsdWUpLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYQXR0cmlidXRlIHhzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0VmFsdWVbMF0gPT0gJyAnIHx8IHRleHRWYWx1ZVt0ZXh0VmFsdWUuTGVuZ3RoIC0gMV0gPT0gJyAnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzID0gbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWwgKyAic3BhY2UiLCAicHJlc2VydmUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuRmlyc3QoKS5FbGVtZW50cyhXLnJQciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudCwgeHMsIHRleHRWYWx1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYWdyYXBoV2l0aENvbnNvbGlkYXRlZFJ1bnM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5yICYmIGVsZW1lbnQuRWxlbWVudHMoVy50KS5BbnkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uT2ZSdW5zID0gZWxlbWVudC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgIT0gVy5yUHIpCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLk5hbWUgPT0gVy50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcyA9IChzdHJpbmcpZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlPFhFbGVtZW50PiBjb2xsZWN0aW9uT2ZTdWJSdW5zID0gcy5TZWxlY3QoYyA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld1J1biA9IG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoVy5yUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnICcgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWwgKyAic3BhY2UiLCAicHJlc2VydmUiKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1J1bjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmplY3QpY29sbGVjdGlvbk9mU3ViUnVuczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld1J1biA9IG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cyhXLnJQciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3UnVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2ZSdW5zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBXbWxTZWFyY2hBbmRSZXBsYWNlVHJhbnNmb3JtKG4sCisgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2gsIHJlcGxhY2UsIG1hdGNoQ2FzZSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBXbWxTZWFyY2hBbmRSZXBsYWNlSW5YRG9jdW1lbnQoWERvY3VtZW50IHhEb2N1bWVudCwgc3RyaW5nIHNlYXJjaCwKKyAgICAgICAgICAgIHN0cmluZyByZXBsYWNlLCBib29sIG1hdGNoQ2FzZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgbmV3Um9vdCA9IChYRWxlbWVudClXbWxTZWFyY2hBbmRSZXBsYWNlVHJhbnNmb3JtKHhEb2N1bWVudC5Sb290LAorICAgICAgICAgICAgICAgIHNlYXJjaCwgcmVwbGFjZSwgbWF0Y2hDYXNlKTsKKyAgICAgICAgICAgIHhEb2N1bWVudC5FbGVtZW50cygpLkZpcnN0KCkuUmVwbGFjZVdpdGgobmV3Um9vdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFdtbERvY3VtZW50IFNlYXJjaEFuZFJlcGxhY2UoV21sRG9jdW1lbnQgZG9jLCBzdHJpbmcgc2VhcmNoLCBzdHJpbmcgcmVwbGFjZSwgYm9vbCBtYXRjaENhc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgc3RyZWFtRG9jID0gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudChkb2MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvY3VtZW50ID0gc3RyZWFtRG9jLkdldFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNlYXJjaEFuZFJlcGxhY2UoZG9jdW1lbnQsIHNlYXJjaCwgcmVwbGFjZSwgbWF0Y2hDYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbURvYy5HZXRNb2RpZmllZFdtbERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgU2VhcmNoQW5kUmVwbGFjZShXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdvcmREb2MsIHN0cmluZyBzZWFyY2gsCisgICAgICAgICAgICBzdHJpbmcgcmVwbGFjZSwgYm9vbCBtYXRjaENhc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChSZXZpc2lvbkFjY2VwdGVyLkhhc1RyYWNrZWRSZXZpc2lvbnMod29yZERvYykpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWREYXRhRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiU2VhcmNoIGFuZCByZXBsYWNlIHdpbGwgbm90IHdvcmsgd2l0aCBkb2N1bWVudHMgIiArCisgICAgICAgICAgICAgICAgICAgICJ0aGF0IGNvbnRhaW4gcmV2aXNpb24gdHJhY2tpbmcuIik7CisgICAgICAgICAgICBYRG9jdW1lbnQgeERvYzsKKyAgICAgICAgICAgIHhEb2MgPSB3b3JkRG9jLk1haW5Eb2N1bWVudFBhcnQuRG9jdW1lbnRTZXR0aW5nc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBpZiAoeERvYy5EZXNjZW5kYW50cyhXLnRyYWNrUmV2aXNpb25zKS5BbnkoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZERhdGFFeGNlcHRpb24oIlJldmlzaW9uIHRyYWNraW5nIGlzIHR1cm5lZCBvbiBmb3IgZG9jdW1lbnQuIik7CisKKyAgICAgICAgICAgIHhEb2MgPSB3b3JkRG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBXbWxTZWFyY2hBbmRSZXBsYWNlSW5YRG9jdW1lbnQoeERvYywgc2VhcmNoLCByZXBsYWNlLCBtYXRjaENhc2UpOworICAgICAgICAgICAgd29yZERvYy5NYWluRG9jdW1lbnRQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gd29yZERvYy5NYWluRG9jdW1lbnRQYXJ0LkhlYWRlclBhcnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhEb2MgPSBwYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIFdtbFNlYXJjaEFuZFJlcGxhY2VJblhEb2N1bWVudCh4RG9jLCBzZWFyY2gsIHJlcGxhY2UsIG1hdGNoQ2FzZSk7CisgICAgICAgICAgICAgICAgcGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYXJ0IGluIHdvcmREb2MuTWFpbkRvY3VtZW50UGFydC5Gb290ZXJQYXJ0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4RG9jID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBXbWxTZWFyY2hBbmRSZXBsYWNlSW5YRG9jdW1lbnQoeERvYywgc2VhcmNoLCByZXBsYWNlLCBtYXRjaENhc2UpOworICAgICAgICAgICAgICAgIHBhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod29yZERvYy5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhEb2MgPSB3b3JkRG9jLk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIFdtbFNlYXJjaEFuZFJlcGxhY2VJblhEb2N1bWVudCh4RG9jLCBzZWFyY2gsIHJlcGxhY2UsIG1hdGNoQ2FzZSk7CisgICAgICAgICAgICAgICAgd29yZERvYy5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3b3JkRG9jLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhEb2MgPSB3b3JkRG9jLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBXbWxTZWFyY2hBbmRSZXBsYWNlSW5YRG9jdW1lbnQoeERvYywgc2VhcmNoLCByZXBsYWNlLCBtYXRjaENhc2UpOworICAgICAgICAgICAgICAgIHdvcmREb2MuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFBtbFJlcGxhY2VUZXh0VHJhbnNmb3JtKFhOb2RlIG5vZGUsIHN0cmluZyBzZWFyY2gsIHN0cmluZyByZXBsYWNlLAorICAgICAgICAgICAgYm9vbCBtYXRjaENhc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IEEucCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb250ZW50cyA9IGVsZW1lbnQuRGVzY2VuZGFudHMoQS50KS5TZWxlY3QodCA9PiAoc3RyaW5nKXQpLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50cy5Db250YWlucyhzZWFyY2gpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoIW1hdGNoQ2FzZSAmJiBjb250ZW50cy5Ub1VwcGVyKCkuQ29udGFpbnMoc2VhcmNoLlRvVXBwZXIoKSkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBwYXJhZ3JhcGhXaXRoU3BsaXRSdW5zID0gbmV3IFhFbGVtZW50KEEucCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gUG1sUmVwbGFjZVRleHRUcmFuc2Zvcm0obiwgc2VhcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlLCBtYXRjaENhc2UpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudFtdIHN1YlJ1bkFycmF5ID0gcGFyYWdyYXBoV2l0aFNwbGl0UnVucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhBLnIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHN1YlJ1bkVsZW1lbnQgPSBlLkVsZW1lbnRzKCkuRmlyc3RPckRlZmF1bHQoZWwgPT4gZWwuTmFtZSAhPSBBLnJQcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJSdW5FbGVtZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJSdW5FbGVtZW50Lk5hbWUgPT0gQS50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJhZ3JhcGhDaGlsZHJlbkNvdW50ID0gc3ViUnVuQXJyYXkuTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdGNoSWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBjIGluIHN1YlJ1bkFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRha2UocGFyYWdyYXBoQ2hpbGRyZW5Db3VudCAtIChzZWFyY2guTGVuZ3RoIC0gMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdCgoYywgaSkgPT4gbmV3IHsgQ2hpbGQgPSBjLCBJbmRleCA9IGksIH0pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJTZXF1ZW5jZSA9IHN1YlJ1bkFycmF5LlNlcXVlbmNlQXQocGMuSW5kZXgpLlRha2Uoc2VhcmNoLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHppcHBlZCA9IHN1YlNlcXVlbmNlLlB0WmlwKHNlYXJjaCwgKHBjcCwgYykgPT4gbmV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhZ3JhcGhDaGlsZFByb2plY3Rpb24gPSBwY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlclRvQ29tcGFyZSA9IGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb250TWF0Y2ggPSB6aXBwZWQuQW55KHogPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6LlBhcmFncmFwaENoaWxkUHJvamVjdGlvbi5Bbm5vdGF0aW9uPE1hdGNoU2VtYXBob3JlPigpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hDYXNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHouUGFyYWdyYXBoQ2hpbGRQcm9qZWN0aW9uLlZhbHVlICE9IHouQ2hhcmFjdGVyVG9Db21wYXJlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB6LlBhcmFncmFwaENoaWxkUHJvamVjdGlvbi5WYWx1ZS5Ub1VwcGVyKCkgIT0gei5DaGFyYWN0ZXJUb0NvbXBhcmUuVG9TdHJpbmcoKS5Ub1VwcGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2ggPSAhZG9udE1hdGNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIHN1YlNlcXVlbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5BZGRBbm5vdGF0aW9uKG5ldyBNYXRjaFNlbWFwaG9yZShtYXRjaElkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbWF0Y2hJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBsb2NhbGx5IGltcHVyZSwgYXMgdGhpcyBpcyB0aGUgbW9zdCBleHByZXNzaXZlIHdheSB0byB3cml0ZSBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHBhcmFncmFwaFdpdGhSZXBsYWNlZFJ1bnMgPSAoWEVsZW1lbnQpQ2xvbmVXaXRoQW5ub3RhdGlvbihwYXJhZ3JhcGhXaXRoU3BsaXRSdW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGlkID0gMTsgaWQgPCBtYXRjaElkOyArK2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IGVsZW1lbnRzVG9SZXBsYWNlID0gcGFyYWdyYXBoV2l0aFJlcGxhY2VkUnVucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VtID0gZS5Bbm5vdGF0aW9uPE1hdGNoU2VtYXBob3JlPigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZW0uTWF0Y2hJZCA9PSBpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzVG9SZXBsYWNlLkZpcnN0KCkuQWRkQmVmb3JlU2VsZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEEuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzVG9SZXBsYWNlLkZpcnN0KCkuRWxlbWVudHMoQS5yUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEEudCwgcmVwbGFjZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50c1RvUmVwbGFjZS5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwZWRBZGphY2VudFJ1bnNXaXRoSWRlbnRpY2FsRm9ybWF0dGluZyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoV2l0aFJlcGxhY2VkUnVucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoY2UgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZS5OYW1lICE9IEEucikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRG9udENvbnNvbGlkYXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlLkVsZW1lbnRzKCkuV2hlcmUoZSA9PiBlLk5hbWUgIT0gQS5yUHIpLkNvdW50KCkgIT0gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2UuRWxlbWVudChBLnQpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRvbnRDb25zb2xpZGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZS5FbGVtZW50KEEuclByKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2UuRWxlbWVudChBLnJQcikuVG9TdHJpbmcoU2F2ZU9wdGlvbnMuTm9uZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBwYXJhZ3JhcGhXaXRoQ29uc29saWRhdGVkUnVucyA9IG5ldyBYRWxlbWVudChBLnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZEFkamFjZW50UnVuc1dpdGhJZGVudGljYWxGb3JtYXR0aW5nLlNlbGVjdChnID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZy5LZXkgPT0gIkRvbnRDb25zb2xpZGF0ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iamVjdClnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGV4dFZhbHVlID0gZy5TZWxlY3QociA9PiByLkVsZW1lbnQoQS50KS5WYWx1ZSkuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChBLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLkZpcnN0KCkuRWxlbWVudHMoQS5yUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEEudCwgdGV4dFZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFncmFwaFdpdGhDb25zb2xpZGF0ZWRSdW5zOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gQS5yICYmIGVsZW1lbnQuRWxlbWVudHMoQS50KS5BbnkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uT2ZSdW5zID0gZWxlbWVudC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgIT0gQS5yUHIpCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5OYW1lID09IEEudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzID0gKHN0cmluZyllOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gY29sbGVjdGlvbk9mU3ViUnVucyA9IHMuU2VsZWN0KGMgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3UnVuID0gbmV3IFhFbGVtZW50KEEuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKEEuclByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQS50LCBjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3UnVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmplY3QpY29sbGVjdGlvbk9mU3ViUnVuczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3UnVuID0gbmV3IFhFbGVtZW50KEEuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoQS5yUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdSdW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2ZSdW5zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBQbWxSZXBsYWNlVGV4dFRyYW5zZm9ybShuLCBzZWFyY2gsIHJlcGxhY2UsIG1hdGNoQ2FzZSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBQbWxEb2N1bWVudCBTZWFyY2hBbmRSZXBsYWNlKFBtbERvY3VtZW50IGRvYywgc3RyaW5nIHNlYXJjaCwgc3RyaW5nIHJlcGxhY2UsIGJvb2wgbWF0Y2hDYXNlKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoZG9jKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoUHJlc2VudGF0aW9uRG9jdW1lbnQgZG9jdW1lbnQgPSBzdHJlYW1Eb2MuR2V0UHJlc2VudGF0aW9uRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNlYXJjaEFuZFJlcGxhY2UoZG9jdW1lbnQsIHNlYXJjaCwgcmVwbGFjZSwgbWF0Y2hDYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbURvYy5HZXRNb2RpZmllZFBtbERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgU2VhcmNoQW5kUmVwbGFjZShQcmVzZW50YXRpb25Eb2N1bWVudCBwRG9jLCBzdHJpbmcgc2VhcmNoLAorICAgICAgICAgICAgc3RyaW5nIHJlcGxhY2UsIGJvb2wgbWF0Y2hDYXNlKQorICAgICAgICB7CisgICAgICAgICAgICBQcmVzZW50YXRpb25QYXJ0IHByZXNlbnRhdGlvblBhcnQgPSBwRG9jLlByZXNlbnRhdGlvblBhcnQ7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgc2xpZGVQYXJ0IGluIHByZXNlbnRhdGlvblBhcnQuU2xpZGVQYXJ0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRG9jdW1lbnQgc2xpZGVYRG9jID0gc2xpZGVQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIFhFbGVtZW50IHJvb3QgPSBzbGlkZVhEb2MuUm9vdDsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdSb290ID0gKFhFbGVtZW50KVBtbFJlcGxhY2VUZXh0VHJhbnNmb3JtKHJvb3QsIHNlYXJjaCwgcmVwbGFjZSwgbWF0Y2hDYXNlKTsKKyAgICAgICAgICAgICAgICBzbGlkZVBhcnQuUHV0WERvY3VtZW50KG5ldyBYRG9jdW1lbnQobmV3Um9vdCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvVW5pY29kZU1hcHBlci5jcyBiL09wZW5YbWxQb3dlclRvb2xzL1VuaWNvZGVNYXBwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2NTRmNQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzL1VuaWNvZGVNYXBwZXIuY3MKQEAgLTAsMCArMSwzMzQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxNi4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK0RldmVsb3BlcjogVGhvbWFzIEJhcm5la293CitFbWFpbDogdGhvbWFzQGJhcm5la293LmluZm8KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgY2xhc3MgVW5pY29kZU1hcHBlcgorICAgIHsKKyAgICAgICAgLy8gVW5pY29kZSBjaGFyYWN0ZXIgdmFsdWVzLgorICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGNoYXIgU3RhcnRPZkhlYWRpbmcgPSAnXHUwMDAxJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjaGFyIEhvcml6b250YWxUYWJ1bGF0aW9uID0gJ1x1MDAwOSc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY2hhciBMaW5lRmVlZCA9ICdcdTAwMEEnOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGNoYXIgRm9ybUZlZWQgPSAnXHUwMDBDJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjaGFyIENhcnJpYWdlUmV0dXJuID0gJ1x1MDAwRCc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY2hhciBTb2Z0SHlwaGVuID0gJ1x1MDBBRCc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY2hhciBOb25CcmVha2luZ0h5cGhlbiA9ICdcdTIwMTEnOworCisgICAgICAgIC8vIFVuaWNvZGUgYXJlYSBib3VuZGFyaWVzLgorICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGNoYXIgU3RhcnRPZlByaXZhdGVVc2VBcmVhID0gJ1x1RTAwMCc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY2hhciBTdGFydE9mU3ltYm9sQXJlYSA9ICdcdUYwMDAnOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGNoYXIgRW5kT2ZQcml2YXRlVXNlQXJlYSA9ICdcdUY4RkYnOworCisgICAgICAgIC8vIERpY3Rpb25hcmllcyBmb3IgdzpzeW0gc3RyaW5naWZpY2F0aW9uLgorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEaWN0aW9uYXJ5PHN0cmluZywgY2hhcj4gU3ltU3RyaW5nVG9Vbmljb2RlQ2hhckRpY3Rpb25hcnkgPQorICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBjaGFyPigpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERpY3Rpb25hcnk8Y2hhciwgWEVsZW1lbnQ+IFVuaWNvZGVDaGFyVG9TeW1EaWN0aW9uYXJ5ID0KKyAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PGNoYXIsIFhFbGVtZW50PigpOworCisgICAgICAgIC8vIFJlcHJlc2VudHMgdGhlIFVuaWNvZGUgdmFsdWUgdGhhdCB3YXMgbGFzdCB1c2VkIHRvIG1hcCBhbiBhY3R1YWwgY2hhcmFjdGVyCisgICAgICAgIC8vIG9udG8gYSBzcGVjaWFsIHZhbHVlIGluIHRoZSBwcml2YXRlIHVzZSBhcmVhLCB3aGljaCBzdGFydHMgYXQgVStFMDAwLgorICAgICAgICAvLyBJbiBPcGVuIFhNTCwgVStGMDAwIGlzIGFkZGVkIHRvIHRoZSBhY3R1YWwgVW5pY29kZSB2YWx1ZXMsIHNvIHdlIHNob3VsZCBiZQorICAgICAgICAvLyB3ZWxsIG91dHNpZGUgdGhhdCByYW5nZSBhbmQgd291bGQgaGF2ZSB0byBtYXAgNDA5NiBkaWZmZXJlbnQgY2hhcmFjdGVycworICAgICAgICAvLyB0byBnZXQgaW50byB0aGUgYXJlYSBzdGFydGluZyBhdCBVK0YwMDAuCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNoYXIgX2xhc3RVbmljb2RlQ2hhciA9IFN0YXJ0T2ZQcml2YXRlVXNlQXJlYTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTdHJpbmdpZnkgYW4gT3BlbiBYTUwgcnVuLCB0dXJuaW5nIChhKSB3OnQsIHc6YnIsIHc6Y3IsIHc6bm9CcmVha0h5cGhlbiwKKyAgICAgICAgLy8vIHc6c29mdEh5cGhlbiwgIHc6c3ltLCBhbmQgdzp0YWIgaW50byB0aGVpciBjb3JyZXNwb25kaW5nIFVuaWNvZGUgc3RyaW5ncworICAgICAgICAvLy8gYW5kIChiKSBldmVyeXRoaW5nIGVsc2UgaW50byBVKzAwMDEuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZWxlbWVudCI+QW4gT3BlbiBYTUwgcnVuIG9yIHJ1biBjaGlsZCBlbGVtZW50LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgY29ycmVzcG9uZGluZyBVbmljb2RlIHZhbHVlIG9yIFUrMDAwMS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFJ1blRvU3RyaW5nKFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5yICYmIChlbGVtZW50LlBhcmVudCA9PSBudWxsIHx8IGVsZW1lbnQuUGFyZW50Lk5hbWUgIT0gVy5kZWwpKQorICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LkVsZW1lbnRzKCkuU2VsZWN0KFJ1blRvU3RyaW5nKS5TdHJpbmdDb25jYXRlbmF0ZSgpOworCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGlnbm9yZSBydW4gcHJvcGVydGllcy4KKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5yUHIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5FbXB0eTsKKworICAgICAgICAgICAgLy8gRm9yIHc6dCBlbGVtZW50cywgd2Ugb2J2aW91c2x5IHdhbnQgdGhlIGVsZW1lbnQncyB2YWx1ZS4KKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy50KQorICAgICAgICAgICAgICAgIHJldHVybiAoc3RyaW5nKSBlbGVtZW50OworCisgICAgICAgICAgICAvLyBUdXJuIGVsZW1lbnRzIHJlcHJlc2VudGluZyBzcGVjaWFsIGNoYXJhY3RlcnMgaW50byB0aGVpciBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAvLyB1bmljb2RlIGNoYXJhY3RlcnMuCisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuYnIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEF0dHJpYnV0ZSB0eXBlQXR0cmlidXRlID0gZWxlbWVudC5BdHRyaWJ1dGUoVy50eXBlKTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdHlwZSA9IHR5cGVBdHRyaWJ1dGUgIT0gbnVsbCA/IHR5cGVBdHRyaWJ1dGUuVmFsdWUgOiBudWxsOworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwgfHwgdHlwZSA9PSAidGV4dFdyYXBwaW5nIikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENhcnJpYWdlUmV0dXJuLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gInBhZ2UiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm9ybUZlZWQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLmNyKQorICAgICAgICAgICAgICAgIHJldHVybiBDYXJyaWFnZVJldHVybi5Ub1N0cmluZygpOworICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLm5vQnJlYWtIeXBoZW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbkJyZWFraW5nSHlwaGVuLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuc29mdEh5cGhlbikKKyAgICAgICAgICAgICAgICByZXR1cm4gU29mdEh5cGhlbi5Ub1N0cmluZygpOworICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRhYikKKyAgICAgICAgICAgICAgICByZXR1cm4gSG9yaXpvbnRhbFRhYnVsYXRpb24uVG9TdHJpbmcoKTsKKworICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLmZsZENoYXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZsZENoYXJUeXBlID0gZWxlbWVudC5BdHRyaWJ1dGVzKFcuZmxkQ2hhclR5cGUpLlNlbGVjdChhID0+IGEuVmFsdWUpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChmbGRDaGFyVHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgImJlZ2luIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAieyI7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIn0iOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJfIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5pbnN0clRleHQpCisgICAgICAgICAgICAgICAgcmV0dXJuICJfIjsKKworICAgICAgICAgICAgLy8gVHVybiB3OnN5bSBlbGVtZW50cyBpbnRvIFVuaWNvZGUgY2hhcmFjdGVyIHZhbHVlcy4gQSB3OmNoYXIgYXR0cmlidXRlCisgICAgICAgICAgICAvLyB2YWx1ZSBjYW4gYmUgc3RvcmVkIChhKSBkaXJlY3RseSBpbiBpdHMgVW5pY29kZSBjaGFyYWN0ZXIgdmFsdWUgZnJvbQorICAgICAgICAgICAgLy8gdGhlIGZvbnQgZ2x5cGggb3IgKGIpIGluIGEgVW5pY29kZSBjaGFyYWN0ZXIgdmFsdWUgY3JlYXRlZCBieSBhZGRpbmcKKyAgICAgICAgICAgIC8vIFUrRjAwMCB0byB0aGUgY2hhcmFjdGVyIHZhbHVlLCB0aGVyZWJ5IHNoaWZ0aW5nIHRoZSB2YWx1ZSBpbnRvIHRoZQorICAgICAgICAgICAgLy8gVW5pY29kZSBwcml2YXRlIHVzZSBhcmVhLgorICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnN5bSkKKyAgICAgICAgICAgICAgICByZXR1cm4gU3ltVG9DaGFyKGVsZW1lbnQpLlRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIC8vIEVsZW1lbnRzIHdlIGRvbid0IHJlY29nbml6ZSB3aWxsIGJlIHR1cm5lZCBpbnRvIGEgY2hhcmFjdGVyIHRoYXQKKyAgICAgICAgICAgIC8vIGRvZXNuJ3QgdHlwaWNhbGx5IGFwcGVhciBpbiBkb2N1bWVudHMuCisgICAgICAgICAgICByZXR1cm4gU3RhcnRPZkhlYWRpbmcuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRyYW5zbGF0ZSBhIHN5bWJvbCBpbnRvIGEgVW5pY29kZSBjaGFyYWN0ZXIsIHVzaW5nIHRoZSBzcGVjaWZpZWQgdzpmb250IGF0dHJpYnV0ZQorICAgICAgICAvLy8gdmFsdWUgYW5kIHVuaWNvZGUgdmFsdWUgKHJlcHJlc2VudGVkIGJ5IHRoZSB3OnN5bSBlbGVtZW50J3MgdzpjaGFyIGF0dHJpYnV0ZSksCisgICAgICAgIC8vLyB1c2luZyBhIHN1YnN0aXR1dGUgdmFsdWUgZm9yIHRoZSBhY3R1YWwgVW5pY29kZSB2YWx1ZSBpZiB0aGUgc2FtZSBVbmljb2RlIHZhbHVlCisgICAgICAgIC8vLyBpcyBhbHJlYWR5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCB3OmZvbnQgYXR0cmlidXRlIHZhbHVlLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIEFkZCBVK0YwMDAgdG8gdGhlIFVuaWNvZGUgdmFsdWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBsZXNzIHRoYW4gVSsxMDAwLCB3aGljaAorICAgICAgICAvLy8gc2hpZnRzIHRoZSB2YWx1ZSBpbnRvIHRoZSBVbmljb2RlIHByaXZhdGUgdXNlIGFyZWEgKHdoaWNoIGlzIGFsc28gZG9uZSBieSBNUyBXb3JkKS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gRm9yIHc6c3ltIGVsZW1lbnRzLCB0aGUgdzpjaGFyIGF0dHJpYnV0ZSB2YWx1ZSBpcyB0eXBpY2FsbHkgZ3JlYXRlciB0aGFuICJGMDAwIiwKKyAgICAgICAgLy8vIGJlY2F1c2UgVStGMDAwIGlzIGFkZGVkIHRvIHRoZSBhY3R1YWwgVW5pY29kZSB2YWx1ZSB0byBzaGlmdCB0aGUgdmFsdWUgaW50bworICAgICAgICAvLy8gdGhlIFVuaWNvZGUgcHJpdmF0ZSB1c2UgYXJlYS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmb250QXR0cmlidXRlVmFsdWUiPlRoZSB3OmZvbnQgYXR0cmlidXRlIHZhbHVlLCBlLmcuLCAiV2luZ2RpbmdzIi48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVuaWNvZGVWYWx1ZSI+VGhlIHVuaWNvZGUgdmFsdWUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBVbmljb2RlIGNoYXJhY3RlciB1c2VkIHRvIHJlcHJlc2VudCB0aGUgc3ltYm9sLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBjaGFyIFN5bVRvQ2hhcihzdHJpbmcgZm9udEF0dHJpYnV0ZVZhbHVlLCBjaGFyIHVuaWNvZGVWYWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN5bVRvQ2hhcihmb250QXR0cmlidXRlVmFsdWUsIChpbnQpIHVuaWNvZGVWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUcmFuc2xhdGUgYSBzeW1ib2wgaW50byBhIFVuaWNvZGUgY2hhcmFjdGVyLCB1c2luZyB0aGUgc3BlY2lmaWVkIHc6Zm9udCBhdHRyaWJ1dGUKKyAgICAgICAgLy8vIHZhbHVlIGFuZCB1bmljb2RlIHZhbHVlIChyZXByZXNlbnRlZCBieSB0aGUgdzpzeW0gZWxlbWVudCdzIHc6Y2hhciBhdHRyaWJ1dGUpLAorICAgICAgICAvLy8gdXNpbmcgYSBzdWJzdGl0dXRlIHZhbHVlIGZvciB0aGUgYWN0dWFsIFVuaWNvZGUgdmFsdWUgaWYgdGhlIHNhbWUgVW5pY29kZSB2YWx1ZQorICAgICAgICAvLy8gaXMgYWxyZWFkeSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnQgdzpmb250IGF0dHJpYnV0ZSB2YWx1ZS4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBBZGQgVStGMDAwIHRvIHRoZSBVbmljb2RlIHZhbHVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgbGVzcyB0aGFuIFUrMTAwMCwgd2hpY2gKKyAgICAgICAgLy8vIHNoaWZ0cyB0aGUgdmFsdWUgaW50byB0aGUgVW5pY29kZSBwcml2YXRlIHVzZSBhcmVhICh3aGljaCBpcyBhbHNvIGRvbmUgYnkgTVMgV29yZCkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIEZvciB3OnN5bSBlbGVtZW50cywgdGhlIHc6Y2hhciBhdHRyaWJ1dGUgdmFsdWUgaXMgdHlwaWNhbGx5IGdyZWF0ZXIgdGhhbiAiRjAwMCIsCisgICAgICAgIC8vLyBiZWNhdXNlIFUrRjAwMCBpcyBhZGRlZCB0byB0aGUgYWN0dWFsIFVuaWNvZGUgdmFsdWUgdG8gc2hpZnQgdGhlIHZhbHVlIGludG8KKyAgICAgICAgLy8vIHRoZSBVbmljb2RlIHByaXZhdGUgdXNlIGFyZWEuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZm9udEF0dHJpYnV0ZVZhbHVlIj5UaGUgdzpmb250IGF0dHJpYnV0ZSB2YWx1ZSwgZS5nLiwgIldpbmdkaW5ncyIuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1bmljb2RlVmFsdWUiPlRoZSB1bmljb2RlIHZhbHVlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgVW5pY29kZSBjaGFyYWN0ZXIgdXNlZCB0byByZXByZXNlbnQgdGhlIHN5bWJvbC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2hhciBTeW1Ub0NoYXIoc3RyaW5nIGZvbnRBdHRyaWJ1dGVWYWx1ZSwgaW50IHVuaWNvZGVWYWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGVmZmVjdGl2ZVVuaWNvZGVWYWx1ZSA9IHVuaWNvZGVWYWx1ZSA8IDB4MTAwMCA/IDB4RjAwMCArIHVuaWNvZGVWYWx1ZSA6IHVuaWNvZGVWYWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBTeW1Ub0NoYXIoZm9udEF0dHJpYnV0ZVZhbHVlLCBlZmZlY3RpdmVVbmljb2RlVmFsdWUuVG9TdHJpbmcoIlg0IikpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJhbnNsYXRlIGEgc3ltYm9sIGludG8gYSBVbmljb2RlIGNoYXJhY3RlciwgdXNpbmcgdGhlIHNwZWNpZmllZCB3OmZvbnQgYW5kCisgICAgICAgIC8vLyB3OmNoYXIgYXR0cmlidXRlIHZhbHVlcywgdXNpbmcgYSBzdWJzdGl0dXRlIHZhbHVlIGZvciB0aGUgYWN0dWFsIFVuaWNvZGUKKyAgICAgICAgLy8vIHZhbHVlIGlmIHRoZSBzYW1lIFVuaWNvZGUgdmFsdWUgaXMgYWxyZWFkeSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnQKKyAgICAgICAgLy8vIHc6Zm9udCBhdHRyaWJ1dGUgdmFsdWUuCisgICAgICAgIC8vLworICAgICAgICAvLy8gRG8gbm90IGFsdGVyIHRoZSB3OmNoYXIgYXR0cmlidXRlIHZhbHVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBGb3IgdzpzeW0gZWxlbWVudHMsIHRoZSB3OmNoYXIgYXR0cmlidXRlIHZhbHVlIGlzIHR5cGljYWxseSBncmVhdGVyIHRoYW4gIkYwMDAiLAorICAgICAgICAvLy8gYmVjYXVzZSBVK0YwMDAgaXMgYWRkZWQgdG8gdGhlIGFjdHVhbCBVbmljb2RlIHZhbHVlIHRvIHNoaWZ0IHRoZSB2YWx1ZSBpbnRvCisgICAgICAgIC8vLyB0aGUgVW5pY29kZSBwcml2YXRlIHVzZSBhcmVhLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZvbnRBdHRyaWJ1dGVWYWx1ZSI+VGhlIHc6Zm9udCBhdHRyaWJ1dGUgdmFsdWUsIGUuZy4sICJXaW5nZGluZ3MiLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2hhckF0dHJpYnV0ZVZhbHVlIj5UaGUgdzpjaGFyIGF0dHJpYnV0ZSB2YWx1ZSwgZS5nLiwgIkYwMjgiLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgVW5pY29kZSBjaGFyYWN0ZXIgdXNlZCB0byByZXByZXNlbnQgdGhlIHN5bWJvbC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2hhciBTeW1Ub0NoYXIoc3RyaW5nIGZvbnRBdHRyaWJ1dGVWYWx1ZSwgc3RyaW5nIGNoYXJBdHRyaWJ1dGVWYWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGZvbnRBdHRyaWJ1dGVWYWx1ZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJBcmd1bWVudCBpcyBudWxsIG9yIGVtcHR5LiIsICJmb250QXR0cmlidXRlVmFsdWUiKTsKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShjaGFyQXR0cmlidXRlVmFsdWUpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQXJndW1lbnQgaXMgbnVsbCBvciBlbXB0eS4iLCAiY2hhckF0dHJpYnV0ZVZhbHVlIik7CisKKyAgICAgICAgICAgIHJldHVybiBTeW1Ub0NoYXIobmV3IFhFbGVtZW50KFcuc3ltLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuZm9udCwgZm9udEF0dHJpYnV0ZVZhbHVlKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLl9jaGFyLCBjaGFyQXR0cmlidXRlVmFsdWUpLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidyIsIFcudykpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlcHJlc2VudCBhIHc6c3ltIGVsZW1lbnQgYXMgYSBVbmljb2RlIHZhbHVlLCBtYXBwaW5nIHRoZSBVbmljb2RlIHZhbHVlCisgICAgICAgIC8vLyBzcGVjaWZpZWQgaW4gdGhlIHc6Y2hhciBhdHRyaWJ1dGUgdG8gYSBzdWJzdGl0dXRlIHZhbHVlIHRvIGJlIGFibGUgdG8KKyAgICAgICAgLy8vIHVzZSBhIFVuaWNvZGUgdmFsdWUgaW4gY29uanVuY3Rpb24gd2l0aCBkaWZmZXJlbnQgZm9udHMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3ltIj5UaGUgdzpzeW0gZWxlbWVudCB0byBiZSBzdHJpbmdpZmllZC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+QSBzaW5nbGUtY2hhcmFjdGVyIFVuaWNvZGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdzpzeW0gZWxlbWVudC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2hhciBTeW1Ub0NoYXIoWEVsZW1lbnQgc3ltKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3ltID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigic3ltIik7CisgICAgICAgICAgICBpZiAoc3ltLk5hbWUgIT0gVy5zeW0pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIk5vdCBhIHc6c3ltOiB7MH0iLCBzeW0uTmFtZSksICJzeW0iKTsKKworICAgICAgICAgICAgWEF0dHJpYnV0ZSBmb250QXR0cmlidXRlID0gc3ltLkF0dHJpYnV0ZShXLmZvbnQpOworICAgICAgICAgICAgc3RyaW5nIGZvbnRBdHRyaWJ1dGVWYWx1ZSA9IGZvbnRBdHRyaWJ1dGUgIT0gbnVsbCA/IGZvbnRBdHRyaWJ1dGUuVmFsdWUgOiBudWxsOworICAgICAgICAgICAgaWYgKGZvbnRBdHRyaWJ1dGVWYWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigidzpzeW0gZWxlbWVudCBoYXMgbm8gdzpmb250IGF0dHJpYnV0ZS4iLCAic3ltIik7CisKKyAgICAgICAgICAgIFhBdHRyaWJ1dGUgY2hhckF0dHJpYnV0ZSA9IHN5bS5BdHRyaWJ1dGUoVy5fY2hhcik7CisgICAgICAgICAgICBzdHJpbmcgY2hhckF0dHJpYnV0ZVZhbHVlID0gY2hhckF0dHJpYnV0ZSAhPSBudWxsID8gY2hhckF0dHJpYnV0ZS5WYWx1ZSA6IG51bGw7CisgICAgICAgICAgICBpZiAoY2hhckF0dHJpYnV0ZVZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJ3OnN5bSBlbGVtZW50IGhhcyBubyB3OmNoYXIgYXR0cmlidXRlLiIsICJzeW0iKTsKKworICAgICAgICAgICAgLy8gUmV0dXJuIFVuaWNvZGUgdmFsdWUgaWYgaXQgaXMgaW4gdGhlIGRpY3Rpb25hcnkuCisgICAgICAgICAgICB2YXIgc3RhbmRhcmRpemVkU3ltID0gbmV3IFhFbGVtZW50KFcuc3ltLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuZm9udCwgZm9udEF0dHJpYnV0ZVZhbHVlKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLl9jaGFyLCBjaGFyQXR0cmlidXRlVmFsdWUpLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidyIsIFcudykpOworICAgICAgICAgICAgc3RyaW5nIHN0YW5kYXJkaXplZFN5bVN0cmluZyA9IHN0YW5kYXJkaXplZFN5bS5Ub1N0cmluZyhTYXZlT3B0aW9ucy5Ob25lKTsKKyAgICAgICAgICAgIGlmIChTeW1TdHJpbmdUb1VuaWNvZGVDaGFyRGljdGlvbmFyeS5Db250YWluc0tleShzdGFuZGFyZGl6ZWRTeW1TdHJpbmcpKQorICAgICAgICAgICAgICAgIHJldHVybiBTeW1TdHJpbmdUb1VuaWNvZGVDaGFyRGljdGlvbmFyeVtzdGFuZGFyZGl6ZWRTeW1TdHJpbmddOworCisgICAgICAgICAgICAvLyBEZXRlcm1pbmUgVW5pY29kZSB2YWx1ZSB0byBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY3VycmVudCB3OnN5bSBlbGVtZW50LgorICAgICAgICAgICAgLy8gVXNlIHRoZSBhY3R1YWwgVW5pY29kZSB2YWx1ZSBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHVzZWQgd2l0aCBhbm90aGVyIGZvbnQuCisgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSBhIHNwZWNpYWwgVW5pY29kZSB2YWx1ZSBpbiB0aGUgcHJpdmF0ZSB1c2UgYXJlYSB0byByZXByZXNlbnQKKyAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHc6c3ltIGVsZW1lbnQuCisgICAgICAgICAgICB2YXIgdW5pY29kZUNoYXIgPSAoY2hhcikgQ29udmVydC5Ub0ludDMyKGNoYXJBdHRyaWJ1dGVWYWx1ZSwgMTYpOworICAgICAgICAgICAgaWYgKFVuaWNvZGVDaGFyVG9TeW1EaWN0aW9uYXJ5LkNvbnRhaW5zS2V5KHVuaWNvZGVDaGFyKSkKKyAgICAgICAgICAgICAgICB1bmljb2RlQ2hhciA9ICsrX2xhc3RVbmljb2RlQ2hhcjsKKworICAgICAgICAgICAgU3ltU3RyaW5nVG9Vbmljb2RlQ2hhckRpY3Rpb25hcnkuQWRkKHN0YW5kYXJkaXplZFN5bVN0cmluZywgdW5pY29kZUNoYXIpOworICAgICAgICAgICAgVW5pY29kZUNoYXJUb1N5bURpY3Rpb25hcnkuQWRkKHVuaWNvZGVDaGFyLCBzdGFuZGFyZGl6ZWRTeW0pOworICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGVDaGFyOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHVybiB0aGUgc3BlY2lmaWVkIHRleHQgdmFsdWUgaW50byBhIGxpc3Qgb2YgcnVucyB3aXRoIGNvYWxlc2NlZCB0ZXh0IGVsZW1lbnRzLgorICAgICAgICAvLy8gRWFjaCBydW4gd2lsbCBoYXZlIHRoZSBzcGVjaWZpZWQgcnVuIHByb3BlcnRpZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGV4dFZhbHVlIj5UaGUgdGV4dCB2YWx1ZSB0byB0cmFuc2Zvcm0uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJydW5Qcm9wZXJ0aWVzIj5UaGUgcnVuIHByb3BlcnRpZXMgdG8gYXBwbHkuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPkEgbGlzdCBvZiBydW5zIHJlcHJlc2VudGluZyB0aGUgdGV4dCB2YWx1ZS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxYRWxlbWVudD4gU3RyaW5nVG9Db2FsZXNjZWRSdW5MaXN0KHN0cmluZyB0ZXh0VmFsdWUsIFhFbGVtZW50IHJ1blByb3BlcnRpZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXh0VmFsdWUKKyAgICAgICAgICAgICAgICAuU2VsZWN0KENoYXJUb1J1bkNoaWxkKQorICAgICAgICAgICAgICAgIC5Hcm91cEFkamFjZW50KGUgPT4gZS5OYW1lID09IFcudCkKKyAgICAgICAgICAgICAgICAuU2VsZWN0TWFueShncm91cGluZyA9PiBncm91cGluZy5LZXkKKyAgICAgICAgICAgICAgICAgICAgPyBTdHJpbmdUb1NpbmdsZVJ1bkxpc3QoZ3JvdXBpbmcuU2VsZWN0KHQgPT4gKHN0cmluZykgdCkuU3RyaW5nQ29uY2F0ZW5hdGUoKSwgcnVuUHJvcGVydGllcykKKyAgICAgICAgICAgICAgICAgICAgOiBncm91cGluZy5TZWxlY3QoZSA9PiBuZXcgWEVsZW1lbnQoVy5yLCBydW5Qcm9wZXJ0aWVzLCBlKSkpCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHVybiB0aGUgc3BlY2lmaWVkIHRleHQgdmFsdWUgaW50byBhIGxpc3QgY29uc2lzdGluZyBvZiBhIHNpbmdsZSBydW4gaGF2aW5nIG9uZQorICAgICAgICAvLy8gdGV4dCBlbGVtZW50IHdpdGggdGhhdCB0ZXh0IHZhbHVlLiBUaGUgcnVuIHdpbGwgaGF2ZSB0aGUgc3BlY2lmaWVkIHJ1biBwcm9wZXJ0aWVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRleHRWYWx1ZSI+VGhlIHRleHQgdmFsdWUgdG8gdHJhbnNmb3JtLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icnVuUHJvcGVydGllcyI+VGhlIHJ1biBwcm9wZXJ0aWVzIHRvIGFwcGx5LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5BIGxpc3Qgd2l0aCBhIHNpbmdsZSBydW4uPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIElFbnVtZXJhYmxlPFhFbGVtZW50PiBTdHJpbmdUb1NpbmdsZVJ1bkxpc3Qoc3RyaW5nIHRleHRWYWx1ZSwgWEVsZW1lbnQgcnVuUHJvcGVydGllcykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJ1biA9IG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgcnVuUHJvcGVydGllcywKKyAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50LCBYbWxVdGlsLkdldFhtbFNwYWNlQXR0cmlidXRlKHRleHRWYWx1ZSksIHRleHRWYWx1ZSkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0PFhFbGVtZW50PiB7IHJ1biB9OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHVybiB0aGUgc3BlY2lmaWVkIHRleHQgdmFsdWUgaW50byBhIGxpc3Qgb2YgcnVucywgZWFjaCBoYXZpbmcgdGhlIHNwZWNpZmllZAorICAgICAgICAvLy8gcnVuIHByb3BlcnRpZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGV4dFZhbHVlIj5UaGUgdGV4dCB2YWx1ZSB0byB0cmFuc2Zvcm0uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJydW5Qcm9wZXJ0aWVzIj5UaGUgcnVuIHByb3BlcnRpZXMgdG8gYXBwbHkuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPkEgbGlzdCBvZiBydW5zIHJlcHJlc2VudGluZyB0aGUgdGV4dCB2YWx1ZS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxYRWxlbWVudD4gU3RyaW5nVG9SdW5MaXN0KHN0cmluZyB0ZXh0VmFsdWUsIFhFbGVtZW50IHJ1blByb3BlcnRpZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXh0VmFsdWUuU2VsZWN0KGNoYXJhY3RlciA9PiBDaGFyVG9SdW4oY2hhcmFjdGVyLCBydW5Qcm9wZXJ0aWVzKSkuVG9MaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGUgYSB3OnIgZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLCB3aGljaCB3aWxsIGJlIHR1cm5lZAorICAgICAgICAvLy8gaW50byBhIGNvcnJlc3BvbmRpbmcgT3BlbiBYTUwgZWxlbWVudCAoZS5nLiwgdzp0LCB3OmJyLCB3OnRhYikuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2hhcmFjdGVyIj5UaGUgY2hhcmFjdGVyLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icnVuUHJvcGVydGllcyI+VGhlIHc6clByIGVsZW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIHc6ciBlbGVtZW50LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgdzpyIGVsZW1lbnQuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IENoYXJUb1J1bihjaGFyIGNoYXJhY3RlciwgWEVsZW1lbnQgcnVuUHJvcGVydGllcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLnIsIHJ1blByb3BlcnRpZXMsIENoYXJUb1J1bkNoaWxkKGNoYXJhY3RlcikpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlIGFuIE9wZW4gWE1MIGVsZW1lbnQgKGUuZy4sIHc6dCwgdzpiciwgdzp0YWIpIGZyb20gdGhlIHNwZWNpZmllZAorICAgICAgICAvLy8gY2hhcmFjdGVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNoYXJhY3RlciI+VGhlIGNoYXJhY3Rlci48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIE9wZW4gWE1MIGVsZW1lbnQgb3IgbnVsbCwgaWYgdGhlIGNoYXJhY3RlciBlcXVhbHMgPHNlZSBjcmVmPSJTdGFydE9mSGVhZGluZyIgLz4gKFUrMDAwMSkuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IENoYXJUb1J1bkNoaWxkKGNoYXIgY2hhcmFjdGVyKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZ25vcmUgdGhlIHNwZWNpYWwgY2hhcmFjdGVyIHRoYXQgcmVwcmVzZW50cyB0aGUgT3BlbiBYTUwgZWxlbWVudHMgd2UKKyAgICAgICAgICAgIC8vIHdhbnRlZCB0byBpZ25vcmUuCisgICAgICAgICAgICBpZiAoY2hhcmFjdGVyID09IFN0YXJ0T2ZIZWFkaW5nKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAvLyBUcmFuc2xhdGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGludG8gdGhlaXIgY29ycmVzcG9uZGluZyBPcGVuIFhNTCBlbGVtZW50cy4KKyAgICAgICAgICAgIC8vIFR1cm4gYSBDYXJyaWFnZSBSZXR1cm4gaW50byBhbiBlbXB0eSB3OmJyIGVsZW1lbnQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorICAgICAgICAgICAgLy8gdGhlIGZvcm1lciB3YXMgY3JlYXRlZCBmcm9tIGFuIGVxdWl2YWxlbnQgdzpjciBlbGVtZW50LgorICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PSBDYXJyaWFnZVJldHVybikKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuYnIpOworICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PSBGb3JtRmVlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuYnIsIG5ldyBYQXR0cmlidXRlKFcudHlwZSwgInBhZ2UiKSk7CisgICAgICAgICAgICBpZiAoY2hhcmFjdGVyID09IEhvcml6b250YWxUYWJ1bGF0aW9uKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy50YWIpOworICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PSBOb25CcmVha2luZ0h5cGhlbikKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcubm9CcmVha0h5cGhlbik7CisgICAgICAgICAgICBpZiAoY2hhcmFjdGVyID09IFNvZnRIeXBoZW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLnNvZnRIeXBoZW4pOworCisgICAgICAgICAgICAvLyBUcmFuc2xhdGUgc3ltYm9sIGNoYXJhY3RlcnMgaW50byB0aGVpciBjb3JyZXNwb25kaW5nIHc6c3ltIGVsZW1lbnRzLgorICAgICAgICAgICAgaWYgKFVuaWNvZGVDaGFyVG9TeW1EaWN0aW9uYXJ5LkNvbnRhaW5zS2V5KGNoYXJhY3RlcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIFVuaWNvZGVDaGFyVG9TeW1EaWN0aW9uYXJ5W2NoYXJhY3Rlcl07CisKKyAgICAgICAgICAgIC8vIFR1cm4gIm5vcm1hbCIgY2hhcmFjdGVycyBpbnRvIHRleHQgZWxlbWVudHMuCisgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcudCwgWG1sVXRpbC5HZXRYbWxTcGFjZUF0dHJpYnV0ZShjaGFyYWN0ZXIpLCBjaGFyYWN0ZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvV21sQ29tcGFyZXIuY3MgYi9PcGVuWG1sUG93ZXJUb29scy9XbWxDb21wYXJlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmRiMTlkCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvV21sQ29tcGFyZXIuY3MKQEAgLTAsMCArMSw3NDE1IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgRXJpYyBXaGl0ZSAyMDE2LgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworUHVibGlzaGVkIGF0IGh0dHA6Ly9FcmljV2hpdGUuY29tCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9lcmljd2hpdGUuY29tL2Jsb2cvYmxvZy9vcGVuLXhtbC1wb3dlcnRvb2xzLWRldmVsb3Blci1jZW50ZXIvCisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLklPLlBhY2thZ2luZzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHk7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKKworLy8gSXQgaXMgcG9zc2libGUgdG8gb3B0aW1pemUgRGVzY2VuZGFudENvbnRlbnRBdG9tcworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vIEN1cnJlbnRseSwgdGhlIHVuaWQgaXMgc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFsZ29yaXRobS4gIEl0IGlzIHVzZWQgYnkgdGhlIGNvZGUgdGhhdCBlc3RhYmxpc2hlcyBjb3JyZWxhdGlvbiBiYXNlZCBvbiBmaXJzdCByZWplY3RpbmcKKy8vLyB0cmFja2VkIHJldmlzaW9ucywgdGhlbiBjb3JyZWxhdGluZyBwYXJhZ3JhcGhzL3RhYmxlcy4gIEl0IGlzIHJlcXVyZWQgZm9yIHRoaXMgYWxnb3JpdGhtIC0gYWZ0ZXIgZmluZGluZyBhIGNvcnJlbGF0ZWQgc2VxdWVuY2UgaW4gdGhlIGRvY3VtZW50IHdpdGggcmVqZWN0ZWQKKy8vLyByZXZpc2lvbnMsIGl0IHVzZXMgdGhlIHVuaWQgdG8gZmluZCB0aGUgc2FtZSBwYXJhZ3JhcGggaW4gdGhlIGRvY3VtZW50IHdpdGhvdXQgcmVqZWN0ZWQgcmV2aXNpb25zLCB0aGVuIHNldHMgdGhlIGNvcnJlbGF0ZWQgc2hhMSBoYXNoIGluIHRoYXQgZG9jdW1lbnQuCisvLy8gCisvLy8gQnV0IHRoZW4gd2hlbiBhY2NlcHRpbmcgdHJhY2tlZCByZXZpc2lvbnMsIGZvciBjZXJ0YWluIHBhcmFncmFwaHMgKHdoZXJlIHRoZXJlIGFyZSBkZWxldGVkIHBhcmFncmFwaCBtYXJrcykgaXQgaXMgZ29pbmcgdG8gbG9zZSB0aGUgdW5pZHMuICBCdXQgdGhpcyBpc24ndCBhCisvLy8gcHJvYmxlbSBiZWNhdXNlIHdoZW4gcGFyYWdyYXBoIG1hcmtzIGFyZSBkZWxldGVkLCB0aGUgY29ycmVsYXRpb24gaXMgZGVmaW5pdGVseSBubyBsb25nZXIgcG9zc2libGUuICBBbnkgcGFyYWdyYXBocyB0aGF0IGFyZSBpbiBhIHJhbmdlIG9mIHBhcmFncmFwaHMgdGhhdAorLy8vIGFyZSBjb2FsZXNjZWQgY2FuJ3QgYmUgY29ycmVsYXRlZCB0byBwYXJhZ3JhcGhzIGluIHRoZSBvdGhlciBkb2N1bWVudCB2aWEgdGhlaXIgaGFzaC4gIEF0IHRoYXQgcG9pbnQgd2Ugbm8gbG9uZ2VyIGNhcmUgd2hhdCB0aGVpciB1bmlkcyBhcmUuCisvLy8gCisvLy8gQnV0IGFmdGVyIHRoYXQgaXQgaXMgb25seSB1c2VkIHRvIHJlY29uc3RydWN0IHRoZSB0cmVlLiAgSXQgaXMgYWxzbyB1c2VkIGluIHRoZSBkZWJ1Z2dpbmcgY29kZSB0aGF0CisvLy8gcHJpbnRzIHRoZSB2YXJpb3VzIGNvcnJlbGF0ZWQgc2VxdWVuY2VzIGFuZCBjb21wYXJpc29uIHVuaXRzIC0gdGhpcyBpcyBkaXNwbGF5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8gVGhlIGtleSBpZGVhIGhlcmUgaXMgdGhhdCBhIGdpdmVuIHBhcmFncmFwaCB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIGFuY2VzdG9ycywgYW5kIGl0IGRvZXNuJ3QgbWF0dGVyIHdoZXRoZXIgdGhlIGNvbnRlbnQgd2FzIGRlbGV0ZWQgZnJvbSB0aGUgb2xkIGRvY3VtZW50LAorLy8vIGluc2VydGVkIGludG8gdGhlIG5ldyBkb2N1bWVudCwgb3Igc2V0IGFzIGVxdWFsLiAgQXQgdGhpcyBwb2ludCwgd2UgaWRlbnRpZnkgYSBwYXJhZ3JhcGggYXMgYSBzZXF1ZW50aWFsIGxpc3Qgb2YgY29udGVudCBhdG9tcywgdGVybWluYXRlZCBieSBhIHBhcmFncmFwaCBtYXJrLgorLy8vIFRoaXMgZW50aXJlIGxpc3Qgd2lsbCBmb3IgYSBzaW5nbGUgcGFyYWdyYXBoLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHBhcmFncmFwaCBpcyBhIGNoaWxkIG9mIHRoZSBib2R5LCBvciBpZiB0aGUgcGFyYWdyYXBoIGlzIGluIGEgY2VsbCBpbiBhIHRhYmxlLCBvciBpZgorLy8vIHRoZSBwYXJhZ3JhcGggaXMgaW4gYSB0ZXh0IGJveC4gIFRoZSBsaXN0IG9mIGFuY2VzdG9ycywgZnJvbSB0aGUgcGFyYWdyYXBoIHRvIHRoZSByb290IG9mIHRoZSBYTUwgdHJlZSB3aWxsIGJlIHRoZSBzYW1lIGZvciBhbGwgY29udGVudCBhdG9tcyBpbiB0aGUgcGFyYWdyYXBoLgorLy8vIAorLy8vIFRoZXJlZm9yZToKKy8vLyAKKy8vLyBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgY29udGVudCBhdG9tcyBiYWNrd2FyZHMuICBXaGVuIHRoZSBsb29wIHNlZXMgYSBwYXJhZ3JhcGggbWFyaywgaXQgZ2V0cyB0aGUgYW5jZXN0b3IgdW5pZHMgZnJvbSB0aGUgcGFyYWdyYXBoIG1hcmsgdG8gdGhlIHRvcCBvZiB0aGUKKy8vLyB0cmVlLCBhbmQgc2V0cyB0aGlzIGFzIHRoZSBzYW1lIGZvciBhbGwgY29udGVudCBhdG9tcyBpbiB0aGUgcGFyYWdyYXBoLiAgRm9yIGRlc2NlbmRhbnRzIG9mIHRoZSBwYXJhZ3JhcGggbWFyaywgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyIGlmIGNvbnRlbnQgaXMgcHV0IGludG8KKy8vLyBzZXBhcmF0ZSBydW5zIG9yIHdoYXQgbm90LiAgV2UgZG9uJ3QgbmVlZCB0byBiZSBjb25jZXJuZWQgYWJvdXQgd2hhdCB0aGUgdW5pZHMgYXJlIGZvciBkZXNjZW5kYW50cyBvZiB0aGUgcGFyYWdyYXBoLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgY2xhc3MgV21sQ29tcGFyZXJTZXR0aW5ncworICAgIHsKKyAgICAgICAgcHVibGljIGNoYXJbXSBXb3JkU2VwYXJhdG9yczsKKyAgICAgICAgcHVibGljIHN0cmluZyBBdXRob3JGb3JSZXZpc2lvbnMgPSAiT3Blbi1YbWwtUG93ZXJUb29scyI7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgRGF0ZVRpbWVGb3JSZXZpc2lvbnMgPSBEYXRlVGltZS5Ob3cuVG9TdHJpbmcoIm8iKTsKKyAgICAgICAgcHVibGljIGRvdWJsZSBEZXRhaWxUaHJlc2hvbGQgPSAwLjE1OworICAgICAgICBwdWJsaWMgYm9vbCBDYXNlSW5zZW5zaXRpdmUgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIEN1bHR1cmVJbmZvIEN1bHR1cmVJbmZvID0gbnVsbDsKKyAgICAgICAgcHVibGljIEFjdGlvbjxzdHJpbmc+IExvZ0NhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgcHVibGljIGludCBTdGFydGluZ0lkRm9yRm9vdG5vdGVzRW5kbm90ZXMgPSAxOworCisgICAgICAgIHB1YmxpYyBEaXJlY3RvcnlJbmZvIERlYnVnVGVtcEZpbGVEaTsKKworICAgICAgICBwdWJsaWMgV21sQ29tcGFyZXJTZXR0aW5ncygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGUgdGhhdCAsIGFuZCAuIGFyZSBwcm9jZXNzZWQgZXhwbGljaXRseSB0byBoYW5kbGUgY2FzZXMgd2hlcmUgdGhleSBhcmUgaW4gYSBudW1iZXIgb3Igd29yZAorICAgICAgICAgICAgV29yZFNlcGFyYXRvcnMgPSBuZXdbXSB7ICcgJywgJy0nLCAnKScsICcoJywgJzsnLCAnLCcgfTsgLy8gdG9kbyBuZWVkIHRvIGZpeCB0aGlzIGZvciBjb21wbGV0ZSBsaXN0CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgV21sQ29tcGFyZXJDb25zb2xpZGF0ZVNldHRpbmdzCisgICAgeworICAgICAgICBwdWJsaWMgYm9vbCBDb25zb2xpZGF0ZVdpdGhUYWJsZSA9IHRydWU7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFdtbFJldmlzZWREb2N1bWVudEluZm8KKyAgICB7CisgICAgICAgIHB1YmxpYyBXbWxEb2N1bWVudCBSZXZpc2VkRG9jdW1lbnQ7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgUmV2aXNvcjsKKyAgICAgICAgcHVibGljIENvbG9yIENvbG9yOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV21sQ29tcGFyZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBzX0ZhbHNlID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBzX1RydWUgPSB0cnVlOworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgc19TYXZlSW50ZXJtZWRpYXRlRmlsZXNGb3JEZWJ1Z2dpbmcgPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFdtbERvY3VtZW50IENvbXBhcmUoV21sRG9jdW1lbnQgc291cmNlMSwgV21sRG9jdW1lbnQgc291cmNlMiwgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENvbXBhcmVJbnRlcm5hbChzb3VyY2UxLCBzb3VyY2UyLCBzZXR0aW5ncywgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBXbWxEb2N1bWVudCBDb21wYXJlSW50ZXJuYWwoV21sRG9jdW1lbnQgc291cmNlMSwgV21sRG9jdW1lbnQgc291cmNlMiwgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncywKKyAgICAgICAgICAgIGJvb2wgcHJlUHJvY2Vzc01hcmt1cEluT3JpZ2luYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwcmVQcm9jZXNzTWFya3VwSW5PcmlnaW5hbCkKKyAgICAgICAgICAgICAgICBzb3VyY2UxID0gUHJlUHJvY2Vzc01hcmt1cChzb3VyY2UxLCBzZXR0aW5ncy5TdGFydGluZ0lkRm9yRm9vdG5vdGVzRW5kbm90ZXMgKyAxMDAwKTsKKyAgICAgICAgICAgIHNvdXJjZTIgPSBQcmVQcm9jZXNzTWFya3VwKHNvdXJjZTIsIHNldHRpbmdzLlN0YXJ0aW5nSWRGb3JGb290bm90ZXNFbmRub3RlcyArIDIwMDApOworCisgICAgICAgICAgICBpZiAoc19TYXZlSW50ZXJtZWRpYXRlRmlsZXNGb3JEZWJ1Z2dpbmcgJiYgc2V0dGluZ3MuRGVidWdUZW1wRmlsZURpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG5hbWUxID0gIlNvdXJjZTEtU3RlcDEtUHJlUHJvY2Vzcy5kb2N4IjsKKyAgICAgICAgICAgICAgICB2YXIgbmFtZTIgPSAiU291cmNlMi1TdGVwMS1QcmVQcm9jZXNzLmRvY3giOworICAgICAgICAgICAgICAgIHZhciBwcmVQcm9jRmkxID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShzZXR0aW5ncy5EZWJ1Z1RlbXBGaWxlRGkuRnVsbE5hbWUsIG5hbWUxKSk7CisgICAgICAgICAgICAgICAgc291cmNlMS5TYXZlQXMocHJlUHJvY0ZpMS5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgdmFyIHByZVByb2NGaTIgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHNldHRpbmdzLkRlYnVnVGVtcEZpbGVEaS5GdWxsTmFtZSwgbmFtZTIpKTsKKyAgICAgICAgICAgICAgICBzb3VyY2UyLlNhdmVBcyhwcmVQcm9jRmkyLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgYm90aCBzb3VyY2UxIGFuZCBzb3VyY2UyIGhhdmUgdW5pZCBvbiBldmVyeSBlbGVtZW50LiAgVGhlc2UgYXJlIHRoZSB2YWx1ZXMgdGhhdCB3aWxsIGVuYWJsZSByZWFzc2VtYmx5IG9mIHRoZSBYTUwgdHJlZS4KKyAgICAgICAgICAgIC8vIGJ1dCB3ZSBuZWVkIG90aGVyIHZhbHVlcy4KKworICAgICAgICAgICAgLy8gSW4gc291cmNlMToKKyAgICAgICAgICAgIC8vIC0gYWNjZXB0IHRyYWNrZWQgcmV2aXNpb25zCisgICAgICAgICAgICAvLyAtIGRldGVybWluZSBoYXNoIGNvZGUgZm9yIGV2ZXJ5IGJsb2NrLWxldmVsIGVsZW1lbnQKKyAgICAgICAgICAgIC8vIC0gc2F2ZSBhcyBhdHRyaWJ1dGUgb24gZXZlcnkgZWxlbWVudAorCisgICAgICAgICAgICAvLyAtIGFjY2VwdCB0cmFja2VkIHJldmlzaW9ucyBhbmQgcmVqZWN0IHRyYWNrZWQgcmV2aXNpb25zIGxlYXZlIHRoZSB1bmlkcyBhbG9uZSwgd2hlcmUgcG9zc2libGUuCisgICAgICAgICAgICAvLyAtIGFmdGVyIGFjY2VwdGluZyBhbmQgY2FsY3VsYXRpbmcgdGhlIGhhc2gsIHRoZW4gY2FuIHVzZSB0aGUgdW5pZHMgdG8gZmluZCB0aGUgcmlnaHQgYmxvY2stbGV2ZWwgZWxlbWVudCBpbiB0aGUgdW5tb2RpZmllZCBzb3VyY2UxLCBhbmQgaW5zdGFsbCB0aGUgaGFzaAorCisgICAgICAgICAgICAvLyBJbiBzb3VyY2UyOgorICAgICAgICAgICAgLy8gLSByZWplY3QgdHJhY2tlZCByZXZpc2lvbnMKKyAgICAgICAgICAgIC8vIC0gZGV0ZXJtaW5lIGhhc2ggY29kZSBmb3IgZXZlcnkgYmxvY2stbGV2ZWwgZWxlbWVudAorICAgICAgICAgICAgLy8gLSBzYXZlIGFzIGFuIGF0dHJpYnV0ZSBvbiBldmVyeSBlbGVtZW50CisKKyAgICAgICAgICAgIC8vIC0gYWZ0ZXIgcmVqZWN0aW5nIGFuZCBjYWxjdWxhdGluZyB0aGUgaGFzaCwgdGhlbiBjYW4gdXNlIHRoZSB1bmlkcyB0byBmaW5kIHRoZSByaWdodCBibG9jay1sZXZlbCBlbGVtZW50IGluIHRoZSB1bm1vZGlmaWVkIHNvdXJjZTIsIGFuZCBpbnN0YWxsIHRoZSBoYXNoCisKKyAgICAgICAgICAgIC8vIC0gc29tZXRpbWVzIGFmdGVyIGFjY2VwdGluZyBvciByZWplY3RpbmcgdHJhY2tlZCByZXZpc2lvbnMsIHNldmVyYWwgcGFyYWdyYXBocyB3aWxsIGdldCBjb2FsZXNjZWQgaW50byBhIHNpbmdsZSBwYXJhZ3JhcGggZHVlIHRvIHBhcmFncmFwaCBtYXJrcyBiZWluZyBpbnNlcnRlZCAvIGRlbGV0ZWQuCisgICAgICAgICAgICAvLyAtIGluIHRoaXMgY2FzZSwgc29tZSBwYXJhZ3JhcGhzIHdpbGwgbm90IGdldCBhIGhhc2ggaW5qZWN0ZWQgb250byB0aGVtLgorICAgICAgICAgICAgLy8gLSBpZiBhIHBhcmFncmFwaCBkb2Vzbid0IGhhdmUgYSBoYXNoLCB0aGVuIGl0IHdpbGwgbmV2ZXIgY29ycmVzcG9uZCB0byBhbm90aGVyIHBhcmFncmFwaCwgYW5kIHN1Y2ggaXNzdWVzIHdpbGwgbmVlZCB0byBiZSByZXNvbHZlZCBpbiB0aGUgbm9ybWFsIGV4ZWN1dGlvbiBvZiB0aGUgTENTIGFsZ29yaXRobS4KKyAgICAgICAgICAgIC8vIC0gbm90ZSB0aGF0IHdoZW4gd2UgZG8gcHJvcGFnYXRlIHRoZSB1bmlkIHRocm91Z2ggZm9yIHRoZSBmaXJzdCBwYXJhZ3JhcGguCisKKyAgICAgICAgICAgIC8vIEVzdGFibGlzaCBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSB0d28uCisgICAgICAgICAgICAvLyBGaW5kIHRoZSBsb25nZXN0IGNvbW1vbiBzZXF1ZW5jZSBvZiBibG9jay1sZXZlbCBlbGVtZW50cyB3aGVyZSBoYXNoIGNvZGVzIGFyZSB0aGUgc2FtZS4KKyAgICAgICAgICAgIC8vIHRoaXMgc29tZXRpbWVzIHdpbGwgYmUgZXZlcnkgYmxvY2sgbGV2ZWwgZWxlbWVudCBpbiB0aGUgZG9jdW1lbnQuICBPciBzb21ldGltZXMgd2lsbCBiZSBqdXN0IGEgZmFpciBudW1iZXIgb2YgdGhlbS4KKworICAgICAgICAgICAgLy8gYXQgdGhlIHN0YXJ0IG9mIGRvaW5nIHRoZSBMQ1MgYWxnb3JpdGhtLCB3ZSB3aWxsIG1hdGNoIHVwIGNvbnRlbnQsIGFuZCBwdXQgdGhlbSBpbiBjb3JyZXNwb25kaW5nIHVua25vd24gY29ycmVsYXRlZCBjb21wYXJpc29uIHVuaXRzLiAgVGhvc2UgcGFyYWdyYXBocyB3aWxsIG9ubHkgZXZlciBiZSBtYXRjaGVkIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgcGFyYWdyYXBoLgorICAgICAgICAgICAgLy8gdGhlbiB0aGUgYWxnb3JpdGhtIGNhbiBwcm9jZWVkIGFzIHVzdWFsLgorCisgICAgICAgICAgICAvLyBuZWVkIHRvIGNhbGwgQ2hhbmdlRm9vdG5vdGVFbmRub3RlUmVmZXJlbmNlc1RvVW5pcXVlUmFuZ2UgYmVmb3JlIGNyZWF0aW5nIHRoZSB3bWxSZXN1bHQgZG9jdW1lbnQsIHNvIHRoYXQKKyAgICAgICAgICAgIC8vIHRoZSBzYW1lIEdVSUQgaWRzIGFyZSB1c2VkIGZvciBmb290bm90ZSBhbmQgZW5kbm90ZSByZWZlcmVuY2VzIGluIGJvdGggdGhlICdhZnRlcicgZG9jdW1lbnQsIGFuZCBpbiB0aGUKKyAgICAgICAgICAgIC8vIHJlc3VsdCBkb2N1bWVudC4KKworICAgICAgICAgICAgdmFyIHNvdXJjZTFhZnRlckFjY2VwdGluZyA9IFJldmlzaW9uUHJvY2Vzc29yLkFjY2VwdFJldmlzaW9ucyhzb3VyY2UxKTsKKyAgICAgICAgICAgIHZhciBzb3VyY2UyYWZ0ZXJSZWplY3RpbmcgPSBSZXZpc2lvblByb2Nlc3Nvci5SZWplY3RSZXZpc2lvbnMoc291cmNlMik7CisKKyAgICAgICAgICAgIGlmIChzX1NhdmVJbnRlcm1lZGlhdGVGaWxlc0ZvckRlYnVnZ2luZyAmJiBzZXR0aW5ncy5EZWJ1Z1RlbXBGaWxlRGkgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbmFtZTEgPSAiU291cmNlMS1TdGVwMi1BZnRlckFjY2VwdGluZy5kb2N4IjsKKyAgICAgICAgICAgICAgICB2YXIgbmFtZTIgPSAiU291cmNlMi1TdGVwMi1BZnRlclJlamVjdGluZy5kb2N4IjsKKyAgICAgICAgICAgICAgICB2YXIgYWZ0ZXJBY2NlcHRpbmdGaTEgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHNldHRpbmdzLkRlYnVnVGVtcEZpbGVEaS5GdWxsTmFtZSwgbmFtZTEpKTsKKyAgICAgICAgICAgICAgICBzb3VyY2UxYWZ0ZXJBY2NlcHRpbmcuU2F2ZUFzKGFmdGVyQWNjZXB0aW5nRmkxLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICB2YXIgYWZ0ZXJSZWplY3RpbmdGaTIgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHNldHRpbmdzLkRlYnVnVGVtcEZpbGVEaS5GdWxsTmFtZSwgbmFtZTIpKTsKKyAgICAgICAgICAgICAgICBzb3VyY2UyYWZ0ZXJSZWplY3RpbmcuU2F2ZUFzKGFmdGVyUmVqZWN0aW5nRmkyLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdGhpcyBjcmVhdGVzIHRoZSBjb3JyZWxhdGVkIGhhc2ggY29kZXMgdGhhdCBlbmFibGUgdXMgdG8gbWF0Y2ggdXAgcmFuZ2VzIG9mIHBhcmFncmFwaHMgYmFzZWQgb24KKyAgICAgICAgICAgIC8vIGFjY2VwdGluZyBpbiBzb3VyY2UxLCByZWplY3RpbmcgaW4gc291cmNlMgorICAgICAgICAgICAgc291cmNlMSA9IEhhc2hCbG9ja0xldmVsQ29udGVudChzb3VyY2UxLCBzb3VyY2UxYWZ0ZXJBY2NlcHRpbmcsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIHNvdXJjZTIgPSBIYXNoQmxvY2tMZXZlbENvbnRlbnQoc291cmNlMiwgc291cmNlMmFmdGVyUmVqZWN0aW5nLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgIGlmIChzX1NhdmVJbnRlcm1lZGlhdGVGaWxlc0ZvckRlYnVnZ2luZyAmJiBzZXR0aW5ncy5EZWJ1Z1RlbXBGaWxlRGkgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbmFtZTEgPSAiU291cmNlMS1TdGVwMy1BZnRlckhhc2hpbmcuZG9jeCI7CisgICAgICAgICAgICAgICAgdmFyIG5hbWUyID0gIlNvdXJjZTItU3RlcDMtQWZ0ZXJIYXNoaW5nLmRvY3giOworICAgICAgICAgICAgICAgIHZhciBhZnRlckhhc2hpbmdGaTEgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHNldHRpbmdzLkRlYnVnVGVtcEZpbGVEaS5GdWxsTmFtZSwgbmFtZTEpKTsKKyAgICAgICAgICAgICAgICBzb3VyY2UxLlNhdmVBcyhhZnRlckhhc2hpbmdGaTEuRnVsbE5hbWUpOworICAgICAgICAgICAgICAgIHZhciBhZnRlckhhc2hpbmdGaTIgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHNldHRpbmdzLkRlYnVnVGVtcEZpbGVEaS5GdWxsTmFtZSwgbmFtZTIpKTsKKyAgICAgICAgICAgICAgICBzb3VyY2UyLlNhdmVBcyhhZnRlckhhc2hpbmdGaTIuRnVsbE5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBY2NlcHQgcmV2aXNpb25zIGluIGJlZm9yZSwgYW5kIGFmdGVyCisgICAgICAgICAgICBzb3VyY2UxID0gUmV2aXNpb25Qcm9jZXNzb3IuQWNjZXB0UmV2aXNpb25zKHNvdXJjZTEpOworICAgICAgICAgICAgc291cmNlMiA9IFJldmlzaW9uUHJvY2Vzc29yLkFjY2VwdFJldmlzaW9ucyhzb3VyY2UyKTsKKworICAgICAgICAgICAgaWYgKHNfU2F2ZUludGVybWVkaWF0ZUZpbGVzRm9yRGVidWdnaW5nICYmIHNldHRpbmdzLkRlYnVnVGVtcEZpbGVEaSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBuYW1lMSA9ICJTb3VyY2UxLVN0ZXA0LUFmdGVyQWNjZXB0aW5nLmRvY3giOworICAgICAgICAgICAgICAgIHZhciBuYW1lMiA9ICJTb3VyY2UyLVN0ZXA0LUFmdGVyQWNjZXB0aW5nLmRvY3giOworICAgICAgICAgICAgICAgIHZhciBhZnRlckFjY2VwdGluZ0ZpMSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoc2V0dGluZ3MuRGVidWdUZW1wRmlsZURpLkZ1bGxOYW1lLCBuYW1lMSkpOworICAgICAgICAgICAgICAgIHNvdXJjZTEuU2F2ZUFzKGFmdGVyQWNjZXB0aW5nRmkxLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICB2YXIgYWZ0ZXJBY2NlcHRpbmdGaTIgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHNldHRpbmdzLkRlYnVnVGVtcEZpbGVEaS5GdWxsTmFtZSwgbmFtZTIpKTsKKyAgICAgICAgICAgICAgICBzb3VyY2UyLlNhdmVBcyhhZnRlckFjY2VwdGluZ0ZpMi5GdWxsTmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFmdGVyIGFjY2VwdGluZyByZXZpc2lvbnMsIHNvbWUgdW5pZHMgbWF5IGhhdmUgYmVlbiByZW1vdmVkIGJ5IHJldmlzaW9uIGFjY2VwdGVyLCBhbG9uZyB3aXRoIHRoZSBjb3JyZWxhdGVkU0hBMUhhc2ggY29kZXMsCisgICAgICAgICAgICAvLyB0aGlzIGlzIGFzIGl0IHNob3VsZCBiZS4KKyAgICAgICAgICAgIC8vIGJ1dCBuZWVkIHRvIGdvIGJhY2sgaW4gYW5kIGFkZCBndWlkcyB0byBwYXJhZ3JhcGhzIHRoYXQgaGF2ZSBoYWQgdGhlbSByZW1vdmVkLgorCisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKHNvdXJjZTIuRG9jdW1lbnRCeXRlQXJyYXksIDAsIHNvdXJjZTIuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1zLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFkZFVuaWRzVG9NYXJrdXBJbkNvbnRlbnRQYXJ0cyh3RG9jKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHdtbFJlc3VsdCA9IG5ldyBXbWxEb2N1bWVudChzb3VyY2UxKTsKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXMxID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtczIgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXMxLldyaXRlKHNvdXJjZTEuRG9jdW1lbnRCeXRlQXJyYXksIDAsIHNvdXJjZTEuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtczIuV3JpdGUoc291cmNlMi5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgc291cmNlMi5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIFdtbERvY3VtZW50IHByb2R1Y2VkRG9jdW1lbnQ7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYzEgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obXMxLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jMiA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtczIsIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjZWREb2N1bWVudCA9IFByb2R1Y2VEb2N1bWVudFdpdGhUcmFja2VkUmV2aXNpb25zKHNldHRpbmdzLCB3bWxSZXN1bHQsIHdEb2MxLCB3RG9jMik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHNfRmFsc2UgJiYgc2V0dGluZ3MuRGVidWdUZW1wRmlsZURpICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZTEgPSAiU291cmNlMS1TdGVwNS1BZnRlclByb2R1Y2luZ0RvY1dpdGhSZXZUcmsuZG9jeCI7CisgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lMiA9ICJTb3VyY2UyLVN0ZXA1LUFmdGVyUHJvZHVjaW5nRG9jV2l0aFJldlRyay5kb2N4IjsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFmdGVyUHJvZHVjaW5nRmkxID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShzZXR0aW5ncy5EZWJ1Z1RlbXBGaWxlRGkuRnVsbE5hbWUsIG5hbWUxKSk7CisgICAgICAgICAgICAgICAgICAgIHZhciBhZnRlclByb2R1Y2luZ1dtbDEgPSBuZXcgV21sRG9jdW1lbnQoImFmdGVyMS5kb2N4IiwgbXMxLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIGFmdGVyUHJvZHVjaW5nV21sMS5TYXZlQXMoYWZ0ZXJQcm9kdWNpbmdGaTEuRnVsbE5hbWUpOworICAgICAgICAgICAgICAgICAgICB2YXIgYWZ0ZXJQcm9kdWNpbmdGaTIgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHNldHRpbmdzLkRlYnVnVGVtcEZpbGVEaS5GdWxsTmFtZSwgbmFtZTIpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFmdGVyUHJvZHVjaW5nV21sMiA9IG5ldyBXbWxEb2N1bWVudCgiYWZ0ZXIyLmRvY3giLCBtczIuVG9BcnJheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQcm9kdWNpbmdXbWwyLlNhdmVBcyhhZnRlclByb2R1Y2luZ0ZpMi5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHNfRmFsc2UgJiYgc2V0dGluZ3MuRGVidWdUZW1wRmlsZURpICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY2xlYW5lZFNvdXJjZSA9IENsZWFuUG93ZXJUb29sc0FuZFJzaWQoc291cmNlMSk7CisgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lMSA9ICJDbGVhbmVkLVNvdXJjZS5kb2N4IjsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNsZWFuZWRTb3VyY2VGaTEgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHNldHRpbmdzLkRlYnVnVGVtcEZpbGVEaS5GdWxsTmFtZSwgbmFtZTEpKTsKKyAgICAgICAgICAgICAgICAgICAgY2xlYW5lZFNvdXJjZS5TYXZlQXMoY2xlYW5lZFNvdXJjZUZpMS5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNsZWFuZWRQcm9kdWNlZCA9IENsZWFuUG93ZXJUb29sc0FuZFJzaWQocHJvZHVjZWREb2N1bWVudCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lMiA9ICJDbGVhbmVkLVByb2R1Y2VkLmRvY3giOworICAgICAgICAgICAgICAgICAgICB2YXIgY2xlYW5lZFByb2R1Y2VkRmkxID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShzZXR0aW5ncy5EZWJ1Z1RlbXBGaWxlRGkuRnVsbE5hbWUsIG5hbWUyKSk7CisgICAgICAgICAgICAgICAgICAgIGNsZWFuZWRQcm9kdWNlZC5TYXZlQXMoY2xlYW5lZFByb2R1Y2VkRmkxLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvZHVjZWREb2N1bWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFdtbERvY3VtZW50IENsZWFuUG93ZXJUb29sc0FuZFJzaWQoV21sRG9jdW1lbnQgcHJvZHVjZWREb2N1bWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtcy5Xcml0ZShwcm9kdWNlZERvY3VtZW50LkRvY3VtZW50Qnl0ZUFycmF5LCAwLCBwcm9kdWNlZERvY3VtZW50LkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtcywgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY3AgaW4gd0RvYy5Db250ZW50UGFydHMoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhkID0gY3AuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Um9vdCA9IENsZWFuUGFydFRyYW5zZm9ybSh4ZC5Sb290KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhkLlJvb3QuUmVwbGFjZVdpdGgobmV3Um9vdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjcC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgY2xlYW5lZCA9IG5ldyBXbWxEb2N1bWVudCgiY2xlYW5lZC5kb2N4IiwgbXMuVG9BcnJheSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5lZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFdtbERvY3VtZW50IEhhc2hCbG9ja0xldmVsQ29udGVudChXbWxEb2N1bWVudCBzb3VyY2UsIFdtbERvY3VtZW50IHNvdXJjZTFhZnRlclByb2Nlc3NpbmdSZXZUcmFja2luZywgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBtc1NvdXJjZSA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXNBZnRlclByb2MgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXNTb3VyY2UuV3JpdGUoc291cmNlLkRvY3VtZW50Qnl0ZUFycmF5LCAwLCBzb3VyY2UuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtc0FmdGVyUHJvYy5Xcml0ZShzb3VyY2UxYWZ0ZXJQcm9jZXNzaW5nUmV2VHJhY2tpbmcuRG9jdW1lbnRCeXRlQXJyYXksIDAsIHNvdXJjZTFhZnRlclByb2Nlc3NpbmdSZXZUcmFja2luZy5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2NTb3VyY2UgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obXNTb3VyY2UsIHRydWUpKQorICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2NBZnRlclByb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obXNBZnRlclByb2MsIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIFVuaWQgZGljdGlvbmFyeSBmb3Igc291cmNlCisgICAgICAgICAgICAgICAgICAgIHZhciBzb3VyY2VNYWluWERvYyA9IHdEb2NTb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC5NYWluRG9jdW1lbnRQYXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZVVuaWREaWN0ID0gc291cmNlTWFpblhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGQgPT4gZC5OYW1lID09IFcucCB8fCBkLk5hbWUgPT0gVy50YmwgfHwgZC5OYW1lID09IFcudHIpCisgICAgICAgICAgICAgICAgICAgICAgICAuVG9EaWN0aW9uYXJ5KGQgPT4gKHN0cmluZylkLkF0dHJpYnV0ZShQdE9wZW5YbWwuVW5pZCkpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhZnRlclByb2NNYWluWERvYyA9IHdEb2NBZnRlclByb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5NYWluRG9jdW1lbnRQYXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGJsb2NrTGV2ZWxDb250ZW50IGluIGFmdGVyUHJvY01haW5YRG9jLlJvb3QuRGVzY2VuZGFudHMoKS5XaGVyZShkID0+IGQuTmFtZSA9PSBXLnAgfHwgZC5OYW1lID09IFcudGJsIHx8IGQuTmFtZSA9PSBXLnRyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lQmxvY2tMZXZlbENvbnRlbnRGb3JIYXNoaW5nID0gKFhFbGVtZW50KUNsb25lQmxvY2tMZXZlbENvbnRlbnRGb3JIYXNoaW5nKHdEb2NBZnRlclByb2MuTWFpbkRvY3VtZW50UGFydCwgYmxvY2tMZXZlbENvbnRlbnQsIHRydWUsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaGFTdHJpbmcgPSBjbG9uZUJsb2NrTGV2ZWxDb250ZW50Rm9ySGFzaGluZy5Ub1N0cmluZyhTYXZlT3B0aW9ucy5EaXNhYmxlRm9ybWF0dGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUmVwbGFjZSgiIHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluXCIiLCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hhMUhhc2ggPSBXbWxDb21wYXJlclV0aWwuU0hBMUhhc2hTdHJpbmdGb3JVVEY4U3RyaW5nKHNoYVN0cmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGhpc1VuaWQgPSAoc3RyaW5nKWJsb2NrTGV2ZWxDb250ZW50LkF0dHJpYnV0ZShQdE9wZW5YbWwuVW5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1VuaWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlVW5pZERpY3QuQ29udGFpbnNLZXkodGhpc1VuaWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvcnJlbGF0ZWRCbG9ja0xldmVsQ29udGVudCA9IHNvdXJjZVVuaWREaWN0W3RoaXNVbmlkXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRlZEJsb2NrTGV2ZWxDb250ZW50LkFkZChuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuQ29ycmVsYXRlZFNIQTFIYXNoLCBzaGExSGFzaCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHdEb2NTb3VyY2UuTWFpbkRvY3VtZW50UGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgV21sRG9jdW1lbnQgc291cmNlV2l0aENvcnJlbGF0ZWRTSEExSGFzaCA9IG5ldyBXbWxEb2N1bWVudChzb3VyY2UuRmlsZU5hbWUsIG1zU291cmNlLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZVdpdGhDb3JyZWxhdGVkU0hBMUhhc2g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBXbWxEb2N1bWVudCBQcmVQcm9jZXNzTWFya3VwKFdtbERvY3VtZW50IHNvdXJjZSwgaW50IHN0YXJ0aW5nSWRGb3JGb290bm90ZXNFbmRub3RlcykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gb3BlbiBhbmQgY2xvc2UgdG8gZ2V0IHJpZCBvZiBNQyBjb250ZW50CisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKHNvdXJjZS5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgc291cmNlLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgT3BlblNldHRpbmdzIG9zID0gbmV3IE9wZW5TZXR0aW5ncygpOworICAgICAgICAgICAgICAgIG9zLk1hcmt1cENvbXBhdGliaWxpdHlQcm9jZXNzU2V0dGluZ3MgPSBuZXcgTWFya3VwQ29tcGF0aWJpbGl0eVByb2Nlc3NTZXR0aW5ncyhNYXJrdXBDb21wYXRpYmlsaXR5UHJvY2Vzc01vZGUuUHJvY2Vzc0FsbFBhcnRzLAorICAgICAgICAgICAgICAgICAgICBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLkZpbGVGb3JtYXRWZXJzaW9ucy5PZmZpY2UyMDA3KTsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1zLCB0cnVlLCBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZG9jID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LlJvb3RFbGVtZW50OworICAgICAgICAgICAgICAgICAgICBpZiAod0RvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udHJhcnkgdG8gd2hhdCB5b3UgbWlnaHQgdGhpbmssIGxvb2tpbmcgYXQgdGhlIEFQSSwgaXQgaXMgbmVjZXNzYXJ5IHRvIGFjY2VzcyB0aGUgcm9vdCBlbGVtZW50IG9mIGVhY2ggcGFydCB0byBjYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFNESyB0byBwcm9jZXNzIE1DIG1hcmt1cC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LlJvb3RFbGVtZW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh3RG9jLk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbiA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQuUm9vdEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc291cmNlID0gbmV3IFdtbERvY3VtZW50KHNvdXJjZS5GaWxlTmFtZSwgbXMuVG9BcnJheSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gb3BlbiBhbmQgY2xvc2UgdG8gZ2V0IHJpZCBvZiBNQyBjb250ZW50CisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKHNvdXJjZS5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgc291cmNlLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgT3BlblNldHRpbmdzIG9zID0gbmV3IE9wZW5TZXR0aW5ncygpOworICAgICAgICAgICAgICAgIG9zLk1hcmt1cENvbXBhdGliaWxpdHlQcm9jZXNzU2V0dGluZ3MgPSBuZXcgTWFya3VwQ29tcGF0aWJpbGl0eVByb2Nlc3NTZXR0aW5ncyhNYXJrdXBDb21wYXRpYmlsaXR5UHJvY2Vzc01vZGUuUHJvY2Vzc0FsbFBhcnRzLAorICAgICAgICAgICAgICAgICAgICBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLkZpbGVGb3JtYXRWZXJzaW9ucy5PZmZpY2UyMDA3KTsKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1zLCB0cnVlLCBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUZXN0Rm9ySW52YWxpZENvbnRlbnQod0RvYyk7CisgICAgICAgICAgICAgICAgICAgIFJlbW92ZUV4aXN0aW5nUG93ZXJUb29sc01hcmt1cCh3RG9jKTsKKyAgICAgICAgICAgICAgICAgICAgU2ltcGxpZnlNYXJrdXBTZXR0aW5ncyBtc1NldHRpbmdzID0gbmV3IFNpbXBsaWZ5TWFya3VwU2V0dGluZ3MoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVCb29rbWFya3MgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0UmV2aXNpb25zID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVDb21tZW50cyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVDb250ZW50Q29udHJvbHMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlRmllbGRDb2RlcyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVHb0JhY2tCb29rbWFyayA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVMYXN0UmVuZGVyZWRQYWdlQnJlYWsgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlUGVybWlzc2lvbnMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlUHJvb2YgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlU21hcnRUYWdzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZVNvZnRIeXBoZW5zID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZUh5cGVybGlua3MgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBNYXJrdXBTaW1wbGlmaWVyLlNpbXBsaWZ5TWFya3VwKHdEb2MsIG1zU2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICBDaGFuZ2VGb290bm90ZUVuZG5vdGVSZWZlcmVuY2VzVG9VbmlxdWVSYW5nZSh3RG9jLCBzdGFydGluZ0lkRm9yRm9vdG5vdGVzRW5kbm90ZXMpOworICAgICAgICAgICAgICAgICAgICBBZGRVbmlkc1RvTWFya3VwSW5Db250ZW50UGFydHMod0RvYyk7CisgICAgICAgICAgICAgICAgICAgIEFkZEZvb3Rub3Rlc0VuZG5vdGVzUGFydHMod0RvYyk7CisgICAgICAgICAgICAgICAgICAgIEZpbGxJbkVtcHR5Rm9vdG5vdGVzRW5kbm90ZXMod0RvYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV21sRG9jdW1lbnQoc291cmNlLkZpbGVOYW1lLCBtcy5Ub0FycmF5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gc29tZWhvdywgc29tZXRpbWVzIGEgZm9vdG5vdGUgb3IgZW5kbm90ZSBjb250YWlucyBhYnNvbHV0ZWx5IG5vdGhpbmcgLSBubyBwYXJhZ3JhcGggLSBub3RoaW5nLgorICAgICAgICAvLyBUaGlzIG1lc3NlcyB1cCB0aGUgYWxnb3JpdGhtLCBzbyBpbiB0aGlzIGNhc2UsIGluc2VydCBhbiBlbXB0eSBwYXJhZ3JhcGguCisgICAgICAgIC8vIFRoaXMgaXMgcHJldHR5IHdhY2t5IG1hcmt1cCB0byBmaW5kLCBhbmQgSSBkb24ndCBrbm93IGhvdyB0aGlzIG1hcmt1cCBjb21lcyBpbnRvIGV4aXN0ZW5jZSwgYnV0IHRoaXMgaXMgYW4gaW5ub2N1b3VzIGZpeC4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBGaWxsSW5FbXB0eUZvb3Rub3Rlc0VuZG5vdGVzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYykKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZW1wdHlGb290bm90ZSA9IFhFbGVtZW50LlBhcnNlKAorQCI8dzpwIHhtbG5zOnc9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbic+CisgIDx3OnBQcj4KKyAgICA8dzpwU3R5bGUgdzp2YWw9J0Zvb3Rub3RlVGV4dCcvPgorICA8L3c6cFByPgorICA8dzpyPgorICAgIDx3OnJQcj4KKyAgICAgIDx3OnJTdHlsZSB3OnZhbD0nRm9vdG5vdGVSZWZlcmVuY2UnLz4KKyAgICA8L3c6clByPgorICAgIDx3OmZvb3Rub3RlUmVmLz4KKyAgPC93OnI+Cis8L3c6cD4iKTsKKworICAgICAgICAgICAgWEVsZW1lbnQgZW1wdHlFbmRub3RlID0gWEVsZW1lbnQuUGFyc2UoCitAIjx3OnAgeG1sbnM6dz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluJz4KKyAgPHc6cFByPgorICAgIDx3OnBTdHlsZSB3OnZhbD0nRW5kbm90ZVRleHQnLz4KKyAgPC93OnBQcj4KKyAgPHc6cj4KKyAgICA8dzpyUHI+CisgICAgICA8dzpyU3R5bGUgdzp2YWw9J0VuZG5vdGVSZWZlcmVuY2UnLz4KKyAgICA8L3c6clByPgorICAgIDx3OmVuZG5vdGVSZWYvPgorICA8L3c6cj4KKzwvdzpwPiIpOworCisgICAgICAgICAgICB2YXIgZm9vdG5vdGVQYXJ0ID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQ7CisgICAgICAgICAgICBpZiAoZm9vdG5vdGVQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZuWERvYyA9IGZvb3Rub3RlUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZm4gaW4gZm5YRG9jLlJvb3QuRWxlbWVudHMoVy5mb290bm90ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWZuLkhhc0VsZW1lbnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgZm4uQWRkKGVtcHR5Rm9vdG5vdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb290bm90ZVBhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBlbmRub3RlUGFydCA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQ7CisgICAgICAgICAgICBpZiAoZW5kbm90ZVBhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZm5YRG9jID0gZW5kbm90ZVBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZuIGluIGZuWERvYy5Sb290LkVsZW1lbnRzKFcuZW5kbm90ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWZuLkhhc0VsZW1lbnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgZm4uQWRkKGVtcHR5RW5kbm90ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVuZG5vdGVQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBDb250ZW50Q29udGFpbnNGb290bm90ZUVuZG5vdGVSZWZlcmVuY2VzVGhhdEhhdmVSZXZpc2lvbnMoWEVsZW1lbnQgZWxlbWVudCwgV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jRGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmb290bm90ZUVuZG5vdGVSZWZlcmVuY2VzID0gZWxlbWVudC5EZXNjZW5kYW50cygpLldoZXJlKGQgPT4gZC5OYW1lID09IFcuZm9vdG5vdGVSZWZlcmVuY2UgfHwgZC5OYW1lID09IFcuZW5kbm90ZVJlZmVyZW5jZSk7CisgICAgICAgICAgICBpZiAoIWZvb3Rub3RlRW5kbm90ZVJlZmVyZW5jZXMuQW55KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgdmFyIGZvb3Rub3RlWERvYyA9IHdEb2NEZWx0YS5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICB2YXIgZW5kbm90ZVhEb2MgPSB3RG9jRGVsdGEuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgbm90ZSBpbiBmb290bm90ZUVuZG5vdGVSZWZlcmVuY2VzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IGZuZW4gPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChub3RlLk5hbWUgPT0gVy5mb290bm90ZVJlZmVyZW5jZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IChpbnQpbm90ZS5BdHRyaWJ1dGUoVy5pZCk7CisgICAgICAgICAgICAgICAgICAgIGZuZW4gPSBmb290bm90ZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5mb290bm90ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChuID0+IChpbnQpbi5BdHRyaWJ1dGUoVy5pZCkgPT0gaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoZm5lbi5EZXNjZW5kYW50cygpLldoZXJlKGQgPT4gZC5OYW1lID09IFcuaW5zIHx8IGQuTmFtZSA9PSBXLmRlbCkuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5vdGUuTmFtZSA9PSBXLmVuZG5vdGVSZWZlcmVuY2UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSAoaW50KW5vdGUuQXR0cmlidXRlKFcuaWQpOworICAgICAgICAgICAgICAgICAgICBmbmVuID0gZW5kbm90ZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5lbmRub3RlKQorICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KG4gPT4gKGludCluLkF0dHJpYnV0ZShXLmlkKSA9PSBpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmbmVuLkRlc2NlbmRhbnRzKCkuV2hlcmUoZCA9PiBkLk5hbWUgPT0gVy5pbnMgfHwgZC5OYW1lID09IFcuZGVsKS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkVW5pZHNUb01hcmt1cEluQ29udGVudFBhcnRzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG1kcCA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIEFzc2lnblVuaWRUb0FsbEVsZW1lbnRzKG1kcC5Sb290KTsKKyAgICAgICAgICAgIElnbm9yZVB0MTROYW1lc3BhY2UobWRwLlJvb3QpOworICAgICAgICAgICAgd0RvYy5NYWluRG9jdW1lbnRQYXJ0LlB1dFhEb2N1bWVudCgpOworCisgICAgICAgICAgICBpZiAod0RvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcCA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIEFzc2lnblVuaWRUb0FsbEVsZW1lbnRzKHAuUm9vdCk7CisgICAgICAgICAgICAgICAgSWdub3JlUHQxNE5hbWVzcGFjZShwLlJvb3QpOworICAgICAgICAgICAgICAgIHdEb2MuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod0RvYy5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBBc3NpZ25VbmlkVG9BbGxFbGVtZW50cyhwLlJvb3QpOworICAgICAgICAgICAgICAgIElnbm9yZVB0MTROYW1lc3BhY2UocC5Sb290KTsKKyAgICAgICAgICAgICAgICB3RG9jLk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBDb25zb2xpZGF0aW9uSW5mbworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIFJldmlzb3I7CisgICAgICAgICAgICBwdWJsaWMgQ29sb3IgQ29sb3I7CisgICAgICAgICAgICBwdWJsaWMgWEVsZW1lbnQgUmV2aXNpb25FbGVtZW50OworICAgICAgICAgICAgcHVibGljIGJvb2wgSW5zZXJ0QmVmb3JlID0gZmFsc2U7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIFJldmlzaW9uSGFzaDsKKyAgICAgICAgICAgIHB1YmxpYyBYRWxlbWVudFtdIEZvb3Rub3RlczsKKyAgICAgICAgICAgIHB1YmxpYyBYRWxlbWVudFtdIEVuZG5vdGVzOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBSZXZpc2lvblN0cmluZzsgLy8gZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgbmwgPSBFbnZpcm9ubWVudC5OZXdMaW5lOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLy8gQ29uc29saWRhdGUgcHJvY2Vzc2VzIGZvb3Rub3RlcyBhbmQgZW5kbm90ZXMgaW4gYSBwYXJ0aWN1bGFyIGZhc2hpb24gLSBpZiB0aGUgdW5tb2RpZmllZCBkb2N1bWVudCBoYXMgYSBmb290bm90ZQorICAgICAgICAvLyByZWZlcmVuY2UsIGFuZCBhIGRlbHRhIGhhcyBhIGZvb3Rub3RlIHJlZmVyZW5jZSwgd2UgZW5kIHVwIHdpdGggdHdvIGZvb3Rub3RlcyAtIG9uZSBpcyB1bm1vZGlmaWVkLCBhbmQgaXMgcmVmZXJlZCB0bworICAgICAgICAvLyBmcm9tIHRoZSB1bm1vZGlmaWVkIGNvbnRlbnQuICBUaGUgZm9vdG5vdGUgcmVmZXJlbmNlIGluIHRoZSBkZWx0YSByZWZlcnMgdG8gdGhlIG1vZGlmaWVkIGZvb3Rub3RlLiAgVGhpcyBpcyBhcyBpdAorICAgICAgICAvLyBzaG91bGQgYmUuCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBXbWxEb2N1bWVudCBDb25zb2xpZGF0ZShXbWxEb2N1bWVudCBvcmlnaW5hbCwKKyAgICAgICAgICAgIExpc3Q8V21sUmV2aXNlZERvY3VtZW50SW5mbz4gcmV2aXNlZERvY3VtZW50SW5mb0xpc3QsCisgICAgICAgICAgICBXbWxDb21wYXJlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29uc29saWRhdGVTZXR0aW5ncyA9IG5ldyBXbWxDb21wYXJlckNvbnNvbGlkYXRlU2V0dGluZ3MoKTsKKyAgICAgICAgICAgIHJldHVybiBDb25zb2xpZGF0ZShvcmlnaW5hbCwgcmV2aXNlZERvY3VtZW50SW5mb0xpc3QsIHNldHRpbmdzLCBjb25zb2xpZGF0ZVNldHRpbmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgV21sRG9jdW1lbnQgQ29uc29saWRhdGUoV21sRG9jdW1lbnQgb3JpZ2luYWwsCisgICAgICAgICAgICBMaXN0PFdtbFJldmlzZWREb2N1bWVudEluZm8+IHJldmlzZWREb2N1bWVudEluZm9MaXN0LAorICAgICAgICAgICAgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncywgV21sQ29tcGFyZXJDb25zb2xpZGF0ZVNldHRpbmdzIGNvbnNvbGlkYXRlU2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHByZS1wcm9jZXNzIHRoZSBvcmlnaW5hbCwgc28gdGhhdCBpdCBhbHJlYWR5IGhhcyB1bmlkcyBmb3IgYWxsIGVsZW1lbnRzCisgICAgICAgICAgICAvLyB0aGVuIHdoZW4gY29tcGFyaW5nIGFsbCBkb2N1bWVudHMgdG8gdGhlIG9yaWdpbmFsLCBlYWNoIG9uZSB3aWxsIGhhdmUgdGhlIHVuaWQgYXMgYXBwcm9wcmlhdGUKKyAgICAgICAgICAgIC8vIGZvciBhbGwgcmV2aXNpb24gYmxvY2stbGV2ZWwgY29udGVudAorICAgICAgICAgICAgLy8gICBzZXQgdW5pZCB0byBsb29rIGZvcgorICAgICAgICAgICAgLy8gICB3aGlsZSB0cnVlCisgICAgICAgICAgICAvLyAgICAgZGV0ZXJtaW5lIHdoZXJlIHRvIGluc2VydAorICAgICAgICAgICAgLy8gICAgICAgZ2V0IHRoZSB1bmlkIGZvciB0aGUgcmV2aXNpb24KKyAgICAgICAgICAgIC8vICAgICAgIGxvb2sgaXQgdXAgaW4gdGhlIG9yaWdpbmFsLiAgaWYgZmluZCBpdCwgdGhlbiBpbnNlcnQgYWZ0ZXIgdGhhdCBlbGVtZW50CisgICAgICAgICAgICAvLyAgICAgICBpZiBub3QgaW4gdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAvLyAgICAgICAgIGxvb2sgYmFja3dhcmRzIGluIHJldmlzZWQgZG9jdW1lbnQsIHNldCB1bmlkIHRvIGxvb2sgZm9yLCBkbyB0aGUgbG9vcCBhZ2FpbgorICAgICAgICAgICAgLy8gICAgICAgaWYgZ2V0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50CisgICAgICAgICAgICAvLyAgICAgICAgIGluc2VydCBhdCBiZWdpbm5pbmcgb2YgZG9jdW1lbnQKKworICAgICAgICAgICAgc2V0dGluZ3MuU3RhcnRpbmdJZEZvckZvb3Rub3Rlc0VuZG5vdGVzID0gMzAwMDsKKyAgICAgICAgICAgIHZhciBvcmlnaW5hbFdpdGhVbmlkcyA9IFByZVByb2Nlc3NNYXJrdXAob3JpZ2luYWwsIHNldHRpbmdzLlN0YXJ0aW5nSWRGb3JGb290bm90ZXNFbmRub3Rlcyk7CisgICAgICAgICAgICBXbWxEb2N1bWVudCBjb25zb2xpZGF0ZWQgPSBuZXcgV21sRG9jdW1lbnQob3JpZ2luYWxXaXRoVW5pZHMpOworCisgICAgICAgICAgICBpZiAoc19TYXZlSW50ZXJtZWRpYXRlRmlsZXNGb3JEZWJ1Z2dpbmcgJiYgc2V0dGluZ3MuRGVidWdUZW1wRmlsZURpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG5hbWUxID0gIk9yaWdpbmFsLXdpdGgtVW5pZHMuZG9jeCI7CisgICAgICAgICAgICAgICAgdmFyIHByZVByb2NGaTEgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHNldHRpbmdzLkRlYnVnVGVtcEZpbGVEaS5GdWxsTmFtZSwgbmFtZTEpKTsKKyAgICAgICAgICAgICAgICBvcmlnaW5hbFdpdGhVbmlkcy5TYXZlQXMocHJlUHJvY0ZpMS5GdWxsTmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZXZpc2VkRG9jdW1lbnRJbmZvTGlzdENvdW50ID0gcmV2aXNlZERvY3VtZW50SW5mb0xpc3QuQ291bnQoKTsKKworICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBjb25zb2xpZGF0ZWRNcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zb2xpZGF0ZWRNcy5Xcml0ZShjb25zb2xpZGF0ZWQuRG9jdW1lbnRCeXRlQXJyYXksIDAsIGNvbnNvbGlkYXRlZC5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGNvbnNvbGlkYXRlZFdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oY29uc29saWRhdGVkTXMsIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnNvbGlkYXRlZE1haW5Eb2NQYXJ0ID0gY29uc29saWRhdGVkV0RvYy5NYWluRG9jdW1lbnRQYXJ0OworICAgICAgICAgICAgICAgICAgICB2YXIgY29uc29saWRhdGVkTWFpbkRvY1BhcnRYRG9jID0gY29uc29saWRhdGVkTWFpbkRvY1BhcnQuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBhd2F5IGxhc3Qgc2VjdFByCisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHNhdmVkU2VjdFByID0gY29uc29saWRhdGVkTWFpbkRvY1BhcnRYRG9jCisgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQoVy5ib2R5KQorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc2VjdFByKQorICAgICAgICAgICAgICAgICAgICAgICAgLkxhc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc29saWRhdGVkTWFpbkRvY1BhcnRYRG9jCisgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQoVy5ib2R5KQorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc2VjdFByKQorICAgICAgICAgICAgICAgICAgICAgICAgLlJlbW92ZSgpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBjb25zb2xpZGF0ZWRCeVVuaWQgPSBjb25zb2xpZGF0ZWRNYWluRG9jUGFydFhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiAoZC5OYW1lID09IFcucCB8fCBkLk5hbWUgPT0gVy50YmwpICYmIGQuQXR0cmlidXRlKFB0T3BlblhtbC5VbmlkKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgLlRvRGljdGlvbmFyeShkID0+IChzdHJpbmcpZC5BdHRyaWJ1dGUoUHRPcGVuWG1sLlVuaWQpKTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFOYnIgPSAxOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcmV2aXNlZERvY3VtZW50SW5mbyBpbiByZXZpc2VkRG9jdW1lbnRJbmZvTGlzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuU3RhcnRpbmdJZEZvckZvb3Rub3Rlc0VuZG5vdGVzID0gKGRlbHRhTmJyICogMjAwMCkgKyAzMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbHRhID0gV21sQ29tcGFyZXIuQ29tcGFyZUludGVybmFsKG9yaWdpbmFsV2l0aFVuaWRzLCByZXZpc2VkRG9jdW1lbnRJbmZvLlJldmlzZWREb2N1bWVudCwgc2V0dGluZ3MsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNfU2F2ZUludGVybWVkaWF0ZUZpbGVzRm9yRGVidWdnaW5nICYmIHNldHRpbmdzLkRlYnVnVGVtcEZpbGVEaSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lMSA9IHN0cmluZy5Gb3JtYXQoIkRlbHRhLXswfS5kb2N4IiwgZGVsdGFOYnIrKyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbHRhRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHNldHRpbmdzLkRlYnVnVGVtcEZpbGVEaS5GdWxsTmFtZSwgbmFtZTEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YS5TYXZlQXMoZGVsdGFGaS5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xvclJnYiA9IHJldmlzZWREb2N1bWVudEluZm8uQ29sb3IuVG9BcmdiKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sb3JTdHJpbmcgPSBjb2xvclJnYi5Ub1N0cmluZygiWCIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yU3RyaW5nLkxlbmd0aCA9PSA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3RyaW5nID0gY29sb3JTdHJpbmcuU3Vic3RyaW5nKDIpOworCisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zT3JpZ2luYWxXaXRoVW5pZHMgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zRGVsdGEgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNPcmlnaW5hbFdpdGhVbmlkcy5Xcml0ZShvcmlnaW5hbFdpdGhVbmlkcy5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgb3JpZ2luYWxXaXRoVW5pZHMuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc0RlbHRhLldyaXRlKGRlbHRhLkRvY3VtZW50Qnl0ZUFycmF5LCAwLCBkZWx0YS5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2NPcmlnaW5hbFdpdGhVbmlkcyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3Blbihtc09yaWdpbmFsV2l0aFVuaWRzLCB0cnVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jRGVsdGEgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obXNEZWx0YSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9kTWFpbkRvY1BhcnQgPSB3RG9jRGVsdGEuTWFpbkRvY3VtZW50UGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZE1haW5Eb2NQYXJ0WERvYyA9IG1vZE1haW5Eb2NQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmxvY2tMZXZlbENvbnRlbnRUb01vdmUgPSBtb2RNYWluRG9jUGFydFhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNUcmltbWVkKGQgPT4gZC5OYW1lID09IFcudHhieENvbnRlbnQgfHwgZC5OYW1lID09IFcudHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBkLk5hbWUgPT0gVy5wIHx8IGQuTmFtZSA9PSBXLnRibCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShkID0+IGQuRGVzY2VuZGFudHMoKS5BbnkoeiA9PiB6Lk5hbWUgPT0gVy5pbnMgfHwgei5OYW1lID09IFcuZGVsKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRDb250YWluc0Zvb3Rub3RlRW5kbm90ZVJlZmVyZW5jZXNUaGF0SGF2ZVJldmlzaW9ucyhkLCB3RG9jRGVsdGEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciByZXZpc2lvbiBpbiBibG9ja0xldmVsQ29udGVudFRvTW92ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRMb29raW5nQXQgPSByZXZpc2lvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmlkID0gKHN0cmluZyllbGVtZW50TG9va2luZ0F0LkF0dHJpYnV0ZShQdE9wZW5YbWwuVW5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuaWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudFRvSW5zZXJ0QWZ0ZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xpZGF0ZWRCeVVuaWQuQ29udGFpbnNLZXkodW5pZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0luc2VydEFmdGVyID0gY29uc29saWRhdGVkQnlVbmlkW3VuaWRdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRUb0luc2VydEFmdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xpZGF0aW9uSW5mbyBjaSA9IG5ldyBDb25zb2xpZGF0aW9uSW5mbygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaS5SZXZpc29yID0gcmV2aXNlZERvY3VtZW50SW5mby5SZXZpc29yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaS5Db2xvciA9IHJldmlzZWREb2N1bWVudEluZm8uQ29sb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLlJldmlzaW9uRWxlbWVudCA9IHJldmlzaW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaS5Gb290bm90ZXMgPSByZXZpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKFcuZm9vdG5vdGVSZWZlcmVuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGZyID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gKGludClmci5BdHRyaWJ1dGUoVy5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZuWERvYyA9IHdEb2NEZWx0YS5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvb3Rub3RlID0gZm5YRG9jLlJvb3QuRWxlbWVudHMoVy5mb290bm90ZSkuRmlyc3RPckRlZmF1bHQoZm4gPT4gKGludClmbi5BdHRyaWJ1dGUoVy5pZCkgPT0gaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb290bm90ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIEVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvb3Rub3RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLkVuZG5vdGVzID0gcmV2aXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cyhXLmVuZG5vdGVSZWZlcmVuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGVyID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gKGludCllci5BdHRyaWJ1dGUoVy5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuWERvYyA9IHdEb2NEZWx0YS5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5kbm90ZSA9IGVuWERvYy5Sb290LkVsZW1lbnRzKFcuZW5kbm90ZSkuRmlyc3RPckRlZmF1bHQoZW4gPT4gKGludCllbi5BdHRyaWJ1dGUoVy5pZCkgPT0gaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRub3RlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5kbm90ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRUb0Fubm90YXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3RG9jRGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xpZGF0ZWRXRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvSW5zZXJ0QWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgYW4gZWxlbWVudCB0byBpbnNlcnQgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRCZWZvcmVSZXZpc2lvbiA9IGVsZW1lbnRMb29raW5nQXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TaWJsaW5nc0JlZm9yZVNlbGZSZXZlcnNlRG9jdW1lbnRPcmRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoZSA9PiBlLkF0dHJpYnV0ZShQdE9wZW5YbWwuVW5pZCkgIT0gbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50QmVmb3JlUmV2aXNpb24gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0RWxlbWVudCA9IGNvbnNvbGlkYXRlZE1haW5Eb2NQYXJ0WERvYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQoVy5ib2R5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGUgPT4gZS5OYW1lID09IFcucCB8fCBlLk5hbWUgPT0gVy50YmwpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xpZGF0aW9uSW5mbyBjaSA9IG5ldyBDb25zb2xpZGF0aW9uSW5mbygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2kuUmV2aXNvciA9IHJldmlzZWREb2N1bWVudEluZm8uUmV2aXNvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLkNvbG9yID0gcmV2aXNlZERvY3VtZW50SW5mby5Db2xvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLlJldmlzaW9uRWxlbWVudCA9IHJldmlzaW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2kuSW5zZXJ0QmVmb3JlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLkZvb3Rub3RlcyA9IHJldmlzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKFcuZm9vdG5vdGVSZWZlcmVuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChmciA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gKGludClmci5BdHRyaWJ1dGUoVy5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmblhEb2MgPSB3RG9jRGVsdGEuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9vdG5vdGUgPSBmblhEb2MuUm9vdC5FbGVtZW50cyhXLmZvb3Rub3RlKS5GaXJzdE9yRGVmYXVsdChmbiA9PiAoaW50KWZuLkF0dHJpYnV0ZShXLmlkKSA9PSBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb290bm90ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9vdG5vdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2kuRW5kbm90ZXMgPSByZXZpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cyhXLmVuZG5vdGVSZWZlcmVuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChlciA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gKGludCllci5BdHRyaWJ1dGUoVy5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlblhEb2MgPSB3RG9jRGVsdGEuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbmRub3RlID0gZW5YRG9jLlJvb3QuRWxlbWVudHMoVy5lbmRub3RlKS5GaXJzdE9yRGVmYXVsdChlbiA9PiAoaW50KWVuLkF0dHJpYnV0ZShXLmlkKSA9PSBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRub3RlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIEVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRub3RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFRvQW5ub3RhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3RG9jRGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29saWRhdGVkV0RvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TG9va2luZ0F0ID0gZWxlbWVudEJlZm9yZVJldmlzaW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weU1pc3NpbmdTdHlsZXNGcm9tT25lRG9jVG9Bbm90aGVyKHdEb2NEZWx0YSwgY29uc29saWRhdGVkV0RvYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgZXZlcnl0aGluZyBpcyBhZGRlZCBhcyBhbiBhbm5vdGF0aW9uLCBmcm9tIGFsbCBkb2N1bWVudHMgdG8gYmUgbWVyZ2VkLgorICAgICAgICAgICAgICAgICAgICAvLyBzbyBub3cgdGhlIHByb2Nlc3MgaXMgdG8gZ28gdGhyb3VnaCBhbmQgYWRkIHRoZSBhbm5vdGF0aW9ucyB0byB0aGUgZG9jdW1lbnQKKyAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRzVG9Qcm9jZXNzID0gY29uc29saWRhdGVkTWFpbkRvY1BhcnRYRG9jCisgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShkID0+IGQuQW5ub3RhdGlvbjxMaXN0PENvbnNvbGlkYXRpb25JbmZvPj4oKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBlbXB0eVBhcmFncmFwaCA9IG5ldyBYRWxlbWVudChXLnAsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5wUHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuc3BhY2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5hZnRlciwgIjAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5saW5lLCAiMjQwIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcubGluZVJ1bGUsICJhdXRvIikpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVsZSBpbiBlbGVtZW50c1RvUHJvY2VzcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxjaSA9IGVsZS5Bbm5vdGF0aW9uPExpc3Q8Q29uc29saWRhdGlvbkluZm8+PigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRlbnRUb0FkZEJlZm9yZSA9IGxjaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShjaSA9PiBjaS5JbnNlcnRCZWZvcmUgPT0gdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR3JvdXBBZGphY2VudChjaSA9PiBjaS5SZXZpc29yICsgY2kuQ29sb3IuVG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KChncm91cGVkQ2ksIGlkeCkgPT4gQXNzZW1ibGVkQ29uam9pbmVkUmV2aXNpb25Db250ZW50KGVtcHR5UGFyYWdyYXBoLCBncm91cGVkQ2ksIGlkeCwgY29uc29saWRhdGVkV0RvYywgY29uc29saWRhdGVTZXR0aW5ncykpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxlLkFkZEJlZm9yZVNlbGYoY29udGVudFRvQWRkQmVmb3JlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgYWxsIHJldmlzaW9ucyBmcm9tIGFsbCByZXZpc29ycyBhcmUgZXhhY3RseSB0aGUgc2FtZSwgdGhlbiBpbnN0ZWFkIG9mIGFkZGluZyBtdWx0aXBsZSB0YWJsZXMgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgY29udGFpbnMgdGhlIHJldmlzaW9ucywgdGhlbiBzaW1wbHkgcmVwbGFjZSB0aGUgcGFyYWdyYXBoIHdpdGggdGhlIG9uZSB3aXRoIHRoZSByZXZpc2lvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSQzAwNCBkb2N1bWVudHMgY29udGFpbiB0aGUgdGVzdCBkYXRhIHRvIGV4ZXJjaXNlIHRoaXMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsY2lDb3VudCA9IGxjaS5XaGVyZShjaSA9PiBjaS5JbnNlcnRCZWZvcmUgPT0gZmFsc2UpLkNvdW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsY2lDb3VudCA+IDEgJiYgbGNpQ291bnQgPT0gcmV2aXNlZERvY3VtZW50SW5mb0xpc3RDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjb2RlIHRoYXQgZGV0ZXJtaW5lcyBpZiByZXZpc2lvbnMgc2hvdWxkIGJlIGNvbnNvbGlkYXRlZCBpbnRvIG9uZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmlxdWVSZXZpc2lvbnMgPSBsY2kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGNpID0+IGNpLkluc2VydEJlZm9yZSA9PSBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQnkoY2kgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGEgaGFzaCBhZnRlciBmaXJzdCBhY2NlcHRpbmcgcmV2aXNpb25zIGFuZCBjb21wcmVzc2luZyB0aGUgdGV4dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY2NlcHRlZFJldmlzaW9uRWxlbWVudCA9IFJldmlzaW9uUHJvY2Vzc29yLkFjY2VwdFJldmlzaW9uc0ZvckVsZW1lbnQoY2kuUmV2aXNpb25FbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaGExSGFzaCA9IFdtbENvbXBhcmVyVXRpbC5TSEExSGFzaFN0cmluZ0ZvclVURjhTdHJpbmcoYWNjZXB0ZWRSZXZpc2lvbkVsZW1lbnQuVmFsdWUuUmVwbGFjZSgiICIsICIiKS5SZXBsYWNlKCLCoCIsICIiKS5SZXBsYWNlKCLigIMiLCAiIikuUmVwbGFjZSgiXG4iLCAiIikuUmVwbGFjZSgiLiIsICIiKS5SZXBsYWNlKCIsIiwgIiIpLlRvVXBwZXIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hhMUhhc2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5PcmRlckJ5RGVzY2VuZGluZyhnID0+IGcuQ291bnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmlxdWVSZXZpc2lvbkNvdW50ID0gdW5pcXVlUmV2aXNpb25zLkNvdW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmlxdWVSZXZpc2lvbkNvdW50ID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZlRm9vdG5vdGVzRW5kbm90ZXNGb3JDb25zb2xpZGF0ZWRSZXZpc2lvbnMobGNpLkZpcnN0KCksIGNvbnNvbGlkYXRlZFdEb2MpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdW1teUVsZW1lbnQgPSBuZXcgWEVsZW1lbnQoImR1bW15IiwgbGNpLkZpcnN0KCkuUmV2aXNpb25FbGVtZW50KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcmV2IGluIGR1bW15RWxlbWVudC5EZXNjZW5kYW50cygpLldoZXJlKGQgPT4gZC5BdHRyaWJ1dGUoVy5hdXRob3IpICE9IG51bGwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXV0ID0gcmV2LkF0dHJpYnV0ZShXLmF1dGhvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXQuVmFsdWUgPSAiSVRVIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5SZXBsYWNlV2l0aChkdW1teUVsZW1lbnQuRWxlbWVudHMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGxvY2F0aW9uIHdoZXJlIHdlIGhhdmUgZGV0ZXJtaW5lZCB0aGF0IHRoZXJlIGFyZSB0aGUgc2FtZSBudW1iZXIgb2YgcmV2aXNpb25zIGZvciB0aGlzIHBhcmFncmFwaCBhcyB0aGVyZSBhcmUgcmV2aXNpb24gZG9jdW1lbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhvd2V2ZXIsIHRoZSBoYXNoIGZvciBhbGwgb2YgdGhlbSB3ZXJlIG5vdCB0aGUgc2FtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZWZvcmUsIHRoZXkgd291bGQgYmUgYWRkZWQgdG8gdGhlIGNvbnNvbGlkYXRlZCBkb2N1bWVudCBhcyBzZXBhcmF0ZSByZXZpc2lvbnMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBsb2cgdGhhdCBzaG93cyB3aGF0IGlzIGRpZmZlcmVudCwgaW4gZGV0YWlsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5Mb2dDYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIgKyBubCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiTm9uLUNvbnNvbGlkYXRlZCBSZXZpc2lvbiIgKyBubCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIgKyBubCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB1ckxpc3QgaW4gdW5pcXVlUmV2aXNpb25zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV2aXNvckxpc3QgPSB1ckxpc3QuU2VsZWN0KHVyID0+IHVyLlJldmlzb3IgKyAiIDogIikuU3RyaW5nQ29uY2F0ZW5hdGUoKS5UcmltRW5kKCcgJywgJzonKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiUmV2aXNvcnM6ICIgKyByZXZpc29yTGlzdCArIG5sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSBSZXZpc2lvblRvTG9nRm9ybVRyYW5zZm9ybSh1ckxpc3QuRmlyc3QoKS5SZXZpc2lvbkVsZW1lbnQsIDAsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChzdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCI9PT09PT09PT09PT09PT09PT09PT09PT09IiArIG5sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQobmwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5Mb2dDYWxsYmFjayhzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50VG9BZGRBZnRlciA9IGxjaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShjaSA9PiBjaS5JbnNlcnRCZWZvcmUgPT0gZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoY2kgPT4gY2kuUmV2aXNvciArIGNpLkNvbG9yLlRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdCgoZ3JvdXBlZENpLCBpZHgpID0+IEFzc2VtYmxlZENvbmpvaW5lZFJldmlzaW9uQ29udGVudChlbXB0eVBhcmFncmFwaCwgZ3JvdXBlZENpLCBpZHgsIGNvbnNvbGlkYXRlZFdEb2MsIGNvbnNvbGlkYXRlU2V0dGluZ3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5BZGRBZnRlclNlbGYoY29udGVudFRvQWRkQWZ0ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyNpZiBmYWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBvbGQgY29kZQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZWxlIGluIGVsZW1lbnRzVG9Qcm9jZXNzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGNpID0gZWxlLkFubm90YXRpb248TGlzdDxDb25zb2xpZGF0aW9uSW5mbz4+KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFsbCByZXZpc2lvbnMgZnJvbSBhbGwgcmV2aXNvcnMgYXJlIGV4YWN0bHkgdGhlIHNhbWUsIHRoZW4gaW5zdGVhZCBvZiBhZGRpbmcgbXVsdGlwbGUgdGFibGVzIGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGNvbnRhaW5zIHRoZSByZXZpc2lvbnMsIHRoZW4gc2ltcGx5IHJlcGxhY2UgdGhlIHBhcmFncmFwaCB3aXRoIHRoZSBvbmUgd2l0aCB0aGUgcmV2aXNpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkMwMDQgZG9jdW1lbnRzIGNvbnRhaW4gdGhlIHRlc3QgZGF0YSB0byBleGVyY2lzZSB0aGlzLgorCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGNpQ291bnQgPSBsY2kuQ291bnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxjaS5Db3VudCgpID4gMSAmJiBsY2lDb3VudCA9PSByZXZpc2VkRG9jdW1lbnRJbmZvTGlzdENvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNvZGUgdGhhdCBkZXRlcm1pbmVzIGlmIHJldmlzaW9ucyBzaG91bGQgYmUgY29uc29saWRhdGVkIGludG8gb25lLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVuaXF1ZVJldmlzaW9ucyA9IGxjaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR3JvdXBCeShjaSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgYSBoYXNoIGFmdGVyIGZpcnN0IGFjY2VwdGluZyByZXZpc2lvbnMgYW5kIGNvbXByZXNzaW5nIHRoZSB0ZXh0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNpeiA9IGNpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWNjZXB0ZWRSZXZpc2lvbkVsZW1lbnQgPSBSZXZpc2lvblByb2Nlc3Nvci5BY2NlcHRSZXZpc2lvbnNGb3JFbGVtZW50KGNpLlJldmlzaW9uRWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGFjY2VwdGVkUmV2aXNpb25FbGVtZW50LlZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJlcGxhY2UoIiAiLCAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUmVwbGFjZSgiwqAiLCAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUmVwbGFjZSgi4oCDIiwgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJlcGxhY2UoIlxuIiwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoYTFIYXNoID0gV21sQ29tcGFyZXJVdGlsLlNIQTFIYXNoU3RyaW5nRm9yVVRGOFN0cmluZyh0ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaS5JbnNlcnRCZWZvcmUuVG9TdHJpbmcoKSArIHNoYTFIYXNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuT3JkZXJCeURlc2NlbmRpbmcoZyA9PiBnLkNvdW50KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5pcXVlUmV2aXNpb25Db3VudCA9IHVuaXF1ZVJldmlzaW9ucy5Db3VudCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlUmV2aXNpb25Db3VudCA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW92ZUZvb3Rub3Rlc0VuZG5vdGVzRm9yQ29uc29saWRhdGVkUmV2aXNpb25zKGxjaS5GaXJzdCgpLCBjb25zb2xpZGF0ZWRXRG9jKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHVtbXlFbGVtZW50ID0gbmV3IFhFbGVtZW50KCJkdW1teSIsIGxjaS5GaXJzdCgpLlJldmlzaW9uRWxlbWVudCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCh2YXIgcmV2IGluIGR1bW15RWxlbWVudC5EZXNjZW5kYW50cygpLldoZXJlKGQgPT4gZC5BdHRyaWJ1dGUoVy5hdXRob3IpICE9IG51bGwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXV0ID0gcmV2LkF0dHJpYnV0ZShXLmF1dGhvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXQuVmFsdWUgPSAiSVRVIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5SZXBsYWNlV2l0aChkdW1teUVsZW1lbnQuRWxlbWVudHMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGxvY2F0aW9uIHdoZXJlIHdlIGhhdmUgZGV0ZXJtaW5lZCB0aGF0IHRoZXJlIGFyZSB0aGUgc2FtZSBudW1iZXIgb2YgcmV2aXNpb25zIGZvciB0aGlzIHBhcmFncmFwaCBhcyB0aGVyZSBhcmUgcmV2aXNpb24gZG9jdW1lbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhvd2V2ZXIsIHRoZSBoYXNoIGZvciBhbGwgb2YgdGhlbSB3ZXJlIG5vdCB0aGUgc2FtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZWZvcmUsIHRoZXkgd291bGQgYmUgYWRkZWQgdG8gdGhlIGNvbnNvbGlkYXRlZCBkb2N1bWVudCBhcyBzZXBhcmF0ZSByZXZpc2lvbnMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBsb2cgdGhhdCBzaG93cyB3aGF0IGlzIGRpZmZlcmVudCwgaW4gZGV0YWlsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5Mb2dDYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIgKyBubCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiTm9uLUNvbnNvbGlkYXRlZCBSZXZpc2lvbiIgKyBubCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIgKyBubCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB1ckxpc3QgaW4gdW5pcXVlUmV2aXNpb25zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV2aXNvckxpc3QgPSB1ckxpc3QuU2VsZWN0KHVyID0+IHVyLlJldmlzb3IgKyAiIDogIikuU3RyaW5nQ29uY2F0ZW5hdGUoKS5UcmltRW5kKCcgJywgJzonKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiUmV2aXNvcnM6ICIgKyByZXZpc29yTGlzdCArIG5sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSBSZXZpc2lvblRvTG9nRm9ybVRyYW5zZm9ybSh1ckxpc3QuRmlyc3QoKS5SZXZpc2lvbkVsZW1lbnQsIDAsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChzdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCI9PT09PT09PT09PT09PT09PT09PT09PT09IiArIG5sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQobmwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5Mb2dDYWxsYmFjayhzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50VG9BZGRCZWZvcmUgPSBsY2kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoY2kgPT4gY2kuSW5zZXJ0QmVmb3JlID09IHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoY2kgPT4gY2kuUmV2aXNvciArIGNpLkNvbG9yLlRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdCgoZ3JvdXBlZENpLCBpZHgpID0+IEFzc2VtYmxlZENvbmpvaW5lZFJldmlzaW9uQ29udGVudChlbXB0eVBhcmFncmFwaCwgZ3JvdXBlZENpLCBpZHgsIGNvbnNvbGlkYXRlZFdEb2MsIGNvbnNvbGlkYXRlU2V0dGluZ3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50VG9BZGRBZnRlciA9IGxjaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShjaSA9PiBjaS5JbnNlcnRCZWZvcmUgPT0gZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoY2kgPT4gY2kuUmV2aXNvciArIGNpLkNvbG9yLlRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdCgoZ3JvdXBlZENpLCBpZHgpID0+IEFzc2VtYmxlZENvbmpvaW5lZFJldmlzaW9uQ29udGVudChlbXB0eVBhcmFncmFwaCwgZ3JvdXBlZENpLCBpZHgsIGNvbnNvbGlkYXRlZFdEb2MsIGNvbnNvbGlkYXRlU2V0dGluZ3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5BZGRCZWZvcmVTZWxmKGNvbnRlbnRUb0FkZEJlZm9yZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGUuQWRkQWZ0ZXJTZWxmKGNvbnRlbnRUb0FkZEFmdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgY29uc29saWRhdGVkTWFpbkRvY1BhcnRYRG9jCisgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQoVy5ib2R5KQorICAgICAgICAgICAgICAgICAgICAgICAgLkFkZChzYXZlZFNlY3RQcik7CisKKyAgICAgICAgICAgICAgICAgICAgQWRkVGFibGVHcmlkU3R5bGVUb1N0eWxlc1BhcnQoY29uc29saWRhdGVkV0RvYy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgRml4VXBSZXZpc2lvbklkcyhjb25zb2xpZGF0ZWRXRG9jLCBjb25zb2xpZGF0ZWRNYWluRG9jUGFydFhEb2MpOworICAgICAgICAgICAgICAgICAgICBJZ25vcmVQdDE0TmFtZXNwYWNlRm9yRm9vdG5vdGVzRW5kbm90ZXMoY29uc29saWRhdGVkV0RvYyk7CisgICAgICAgICAgICAgICAgICAgIEZpeFVwRG9jUHJJZHMoY29uc29saWRhdGVkV0RvYyk7CisgICAgICAgICAgICAgICAgICAgIEZpeFVwU2hhcGVJZHMoY29uc29saWRhdGVkV0RvYyk7CisgICAgICAgICAgICAgICAgICAgIEZpeFVwR3JvdXBJZHMoY29uc29saWRhdGVkV0RvYyk7CisgICAgICAgICAgICAgICAgICAgIEZpeFVwU2hhcGVUeXBlSWRzKGNvbnNvbGlkYXRlZFdEb2MpOworICAgICAgICAgICAgICAgICAgICBXbWxDb21wYXJlci5JZ25vcmVQdDE0TmFtZXNwYWNlKGNvbnNvbGlkYXRlZE1haW5Eb2NQYXJ0WERvYy5Sb290KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc29saWRhdGVkV0RvYy5NYWluRG9jdW1lbnRQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBBZGRGb290bm90ZXNFbmRub3Rlc1N0eWxlcyhjb25zb2xpZGF0ZWRXRG9jKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgbmV3Q29uc29saWRhdGVkRG9jdW1lbnQgPSBuZXcgV21sRG9jdW1lbnQoImNvbnNvbGlkYXRlZC5kb2N4IiwgY29uc29saWRhdGVkTXMuVG9BcnJheSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q29uc29saWRhdGVkRG9jdW1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIE1vdmVGb290bm90ZXNFbmRub3Rlc0ZvckNvbnNvbGlkYXRlZFJldmlzaW9ucyhDb25zb2xpZGF0aW9uSW5mbyBjaSwgV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jQ29uc29saWRhdGVkKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29uc29saWRhdGVkRm9vdG5vdGVYRG9jID0gd0RvY0NvbnNvbGlkYXRlZC5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICB2YXIgY29uc29saWRhdGVkRW5kbm90ZVhEb2MgPSB3RG9jQ29uc29saWRhdGVkLk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICBpbnQgbWF4Rm9vdG5vdGVJZCA9IDE7CisgICAgICAgICAgICBpZiAoY29uc29saWRhdGVkRm9vdG5vdGVYRG9jLlJvb3QuRWxlbWVudHMoVy5mb290bm90ZSkuQW55KCkpCisgICAgICAgICAgICAgICAgbWF4Rm9vdG5vdGVJZCA9IGNvbnNvbGlkYXRlZEZvb3Rub3RlWERvYy5Sb290LkVsZW1lbnRzKFcuZm9vdG5vdGUpLlNlbGVjdChlID0+IChpbnQpZS5BdHRyaWJ1dGUoVy5pZCkpLk1heCgpOworICAgICAgICAgICAgaW50IG1heEVuZG5vdGVJZCA9IDE7CisgICAgICAgICAgICBpZiAoY29uc29saWRhdGVkRW5kbm90ZVhEb2MuUm9vdC5FbGVtZW50cyhXLmVuZG5vdGUpLkFueSgpKQorICAgICAgICAgICAgICAgIG1heEVuZG5vdGVJZCA9IGNvbnNvbGlkYXRlZEVuZG5vdGVYRG9jLlJvb3QuRWxlbWVudHMoVy5lbmRub3RlKS5TZWxlY3QoZSA9PiAoaW50KWUuQXR0cmlidXRlKFcuaWQpKS5NYXgoKTsgOworCisgICAgICAgICAgICAvLy8gQXQgdGhpcyBwb2ludCwgY29udGVudCBtaWdodCBjb250YWluIGEgZm9vdG5vdGUgb3IgZW5kbm90ZSByZWZlcmVuY2UuCisgICAgICAgICAgICAvLy8gTmVlZCB0byBhZGQgdGhlIGZvb3Rub3RlIC8gZW5kbm90ZSBpbnRvIHRoZSBjb25zb2xpZGF0ZWQgZG9jdW1lbnQgKHdpdGggdGhlIHNhbWUgZ3VpZCBpZCkKKyAgICAgICAgICAgIC8vLyBCZWNhdXNlIG9mIHByZXByb2Nlc3Npbmcgb2YgdGhlIGRvY3VtZW50cywgYWxsIGZvb3Rub3RlIGFuZCBlbmRub3RlIHJlZmVyZW5jZXMgd2lsbCBiZSB1bmlxdWUgYXQgdGhpcyBwb2ludAorCisgICAgICAgICAgICBpZiAoY2kuUmV2aXNpb25FbGVtZW50LkRlc2NlbmRhbnRzKFcuZm9vdG5vdGVSZWZlcmVuY2UpLkFueSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmb290bm90ZVhEb2MgPSB3RG9jQ29uc29saWRhdGVkLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZm9vdG5vdGVSZWZlcmVuY2UgaW4gY2kuUmV2aXNpb25FbGVtZW50LkRlc2NlbmRhbnRzKFcuZm9vdG5vdGVSZWZlcmVuY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gKGludClmb290bm90ZVJlZmVyZW5jZS5BdHRyaWJ1dGUoVy5pZCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBmb290bm90ZSA9IGNpLkZvb3Rub3Rlcy5GaXJzdE9yRGVmYXVsdChmbiA9PiAoaW50KWZuLkF0dHJpYnV0ZShXLmlkKSA9PSBpZCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdJZCA9IG1heEZvb3Rub3RlSWQgKyAxOworICAgICAgICAgICAgICAgICAgICBtYXhGb290bm90ZUlkKys7CisgICAgICAgICAgICAgICAgICAgIGZvb3Rub3RlUmVmZXJlbmNlLkF0dHJpYnV0ZShXLmlkKS5WYWx1ZSA9IG5ld0lkLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZWRGb290bm90ZSA9IG5ldyBYRWxlbWVudChmb290bm90ZSk7CisgICAgICAgICAgICAgICAgICAgIGNsb25lZEZvb3Rub3RlLkF0dHJpYnV0ZShXLmlkKS5WYWx1ZSA9IG5ld0lkLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZvb3Rub3RlWERvYy5Sb290LkFkZChjbG9uZWRGb290bm90ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdEb2NDb25zb2xpZGF0ZWQuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2kuUmV2aXNpb25FbGVtZW50LkRlc2NlbmRhbnRzKFcuZW5kbm90ZVJlZmVyZW5jZSkuQW55KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGVuZG5vdGVYRG9jID0gd0RvY0NvbnNvbGlkYXRlZC5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZW5kbm90ZVJlZmVyZW5jZSBpbiBjaS5SZXZpc2lvbkVsZW1lbnQuRGVzY2VuZGFudHMoVy5lbmRub3RlUmVmZXJlbmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IChpbnQpZW5kbm90ZVJlZmVyZW5jZS5BdHRyaWJ1dGUoVy5pZCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBlbmRub3RlID0gY2kuRW5kbm90ZXMuRmlyc3RPckRlZmF1bHQoZm4gPT4gKGludClmbi5BdHRyaWJ1dGUoVy5pZCkgPT0gaWQpOworICAgICAgICAgICAgICAgICAgICB2YXIgbmV3SWQgPSBtYXhFbmRub3RlSWQgKyAxOworICAgICAgICAgICAgICAgICAgICBtYXhFbmRub3RlSWQrKzsKKyAgICAgICAgICAgICAgICAgICAgZW5kbm90ZVJlZmVyZW5jZS5BdHRyaWJ1dGUoVy5pZCkuVmFsdWUgPSBuZXdJZC5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB2YXIgY2xvbmVkRW5kbm90ZSA9IG5ldyBYRWxlbWVudChlbmRub3RlKTsKKyAgICAgICAgICAgICAgICAgICAgY2xvbmVkRW5kbm90ZS5BdHRyaWJ1dGUoVy5pZCkuVmFsdWUgPSBuZXdJZC5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBlbmRub3RlWERvYy5Sb290LkFkZChjbG9uZWRFbmRub3RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd0RvY0NvbnNvbGlkYXRlZC5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBDbGVhblBhcnRUcmFuc2Zvcm0oWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCkuV2hlcmUoYSA9PiBhLk5hbWUuTmFtZXNwYWNlICE9IFB0T3BlblhtbC5wdCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIWEuTmFtZS5Mb2NhbE5hbWUuVG9Mb3dlcigpLkNvbnRhaW5zKCJyc2lkIikpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gQ2xlYW5QYXJ0VHJhbnNmb3JtKG4pKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBSZXZpc2lvblRvTG9nRm9ybVRyYW5zZm9ybShYRWxlbWVudCBlbGVtZW50LCBpbnQgZGVwdGgsIGJvb2wgaW5zZXJ0aW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcucCkKKyAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFncmFwaCIgKyBubCArIGVsZW1lbnQuRWxlbWVudHMoKS5TZWxlY3QoZSA9PiBSZXZpc2lvblRvTG9nRm9ybVRyYW5zZm9ybShlLCBkZXB0aCArIDIsIGZhbHNlKSkuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5wUHIgfHwgZWxlbWVudC5OYW1lID09IFcuclByKQorICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5yKQorICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LkVsZW1lbnRzKCkuU2VsZWN0KGUgPT4gUmV2aXNpb25Ub0xvZ0Zvcm1UcmFuc2Zvcm0oZSwgZGVwdGgsIGluc2VydGluZykpLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW5nKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIuUGFkUmlnaHQoZGVwdGgpICsgIkluc2VydGVkIFRleHQ6IiArIFF1b3RlSXQoKHN0cmluZyllbGVtZW50KSArIG5sOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiLlBhZFJpZ2h0KGRlcHRoKSArICJUZXh0OiIgKyBRdW90ZUl0KChzdHJpbmcpZWxlbWVudCkgKyBubDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5kZWxUZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiAiIi5QYWRSaWdodChkZXB0aCkgKyAiRGVsZXRlZCBUZXh0OiIgKyBRdW90ZUl0KChzdHJpbmcpZWxlbWVudCkgKyBubDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5pbnMpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuRWxlbWVudHMoKS5TZWxlY3QoZSA9PiBSZXZpc2lvblRvTG9nRm9ybVRyYW5zZm9ybShlLCBkZXB0aCwgdHJ1ZSkpLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuZGVsKQorICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LkVsZW1lbnRzKCkuU2VsZWN0KGUgPT4gUmV2aXNpb25Ub0xvZ0Zvcm1UcmFuc2Zvcm0oZSwgZGVwdGgsIGZhbHNlKSkuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBRdW90ZUl0KHN0cmluZyBzdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBxdW90ZVN0cmluZyA9ICJcIiI7CisgICAgICAgICAgICBpZiAoc3RyLkNvbnRhaW5zKCdcIicpKQorICAgICAgICAgICAgICAgIHF1b3RlU3RyaW5nID0gIlwnIjsKKyAgICAgICAgICAgIHJldHVybiBxdW90ZVN0cmluZyArIHN0ciArIHF1b3RlU3RyaW5nOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBJZ25vcmVQdDE0TmFtZXNwYWNlRm9yRm9vdG5vdGVzRW5kbm90ZXMoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZm9vdG5vdGVzUGFydCA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0OworICAgICAgICAgICAgdmFyIGVuZG5vdGVzUGFydCA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQ7CisKKyAgICAgICAgICAgIFhEb2N1bWVudCBmb290bm90ZXNQYXJ0WERvYyA9IG51bGw7CisgICAgICAgICAgICBpZiAoZm9vdG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvb3Rub3Rlc1BhcnRYRG9jID0gZm9vdG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBXbWxDb21wYXJlci5JZ25vcmVQdDE0TmFtZXNwYWNlKGZvb3Rub3Rlc1BhcnRYRG9jLlJvb3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBYRG9jdW1lbnQgZW5kbm90ZXNQYXJ0WERvYyA9IG51bGw7CisgICAgICAgICAgICBpZiAoZW5kbm90ZXNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5kbm90ZXNQYXJ0WERvYyA9IGVuZG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBXbWxDb21wYXJlci5JZ25vcmVQdDE0TmFtZXNwYWNlKGVuZG5vdGVzUGFydFhEb2MuUm9vdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb290bm90ZXNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgZm9vdG5vdGVzUGFydC5QdXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgaWYgKGVuZG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGVuZG5vdGVzUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50W10gQXNzZW1ibGVkQ29uam9pbmVkUmV2aXNpb25Db250ZW50KFhFbGVtZW50IGVtcHR5UGFyYWdyYXBoLCBJR3JvdXBpbmc8c3RyaW5nLCBDb25zb2xpZGF0aW9uSW5mbz4gZ3JvdXBlZENpLCBpbnQgaWR4LCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2NDb25zb2xpZGF0ZWQsCisgICAgICAgICAgICBXbWxDb21wYXJlckNvbnNvbGlkYXRlU2V0dGluZ3MgY29uc29saWRhdGVTZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbnNvbGlkYXRlZEZvb3Rub3RlWERvYyA9IHdEb2NDb25zb2xpZGF0ZWQuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgdmFyIGNvbnNvbGlkYXRlZEVuZG5vdGVYRG9jID0gd0RvY0NvbnNvbGlkYXRlZC5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgaW50IG1heEZvb3Rub3RlSWQgPSAxOworICAgICAgICAgICAgaWYgKGNvbnNvbGlkYXRlZEZvb3Rub3RlWERvYy5Sb290LkVsZW1lbnRzKFcuZm9vdG5vdGUpLkFueSgpKQorICAgICAgICAgICAgICAgIG1heEZvb3Rub3RlSWQgPSBjb25zb2xpZGF0ZWRGb290bm90ZVhEb2MuUm9vdC5FbGVtZW50cyhXLmZvb3Rub3RlKS5TZWxlY3QoZSA9PiAoaW50KWUuQXR0cmlidXRlKFcuaWQpKS5NYXgoKTsKKyAgICAgICAgICAgIGludCBtYXhFbmRub3RlSWQgPSAxOworICAgICAgICAgICAgaWYgKGNvbnNvbGlkYXRlZEVuZG5vdGVYRG9jLlJvb3QuRWxlbWVudHMoVy5lbmRub3RlKS5BbnkoKSkKKyAgICAgICAgICAgICAgICBtYXhFbmRub3RlSWQgPSBjb25zb2xpZGF0ZWRFbmRub3RlWERvYy5Sb290LkVsZW1lbnRzKFcuZW5kbm90ZSkuU2VsZWN0KGUgPT4gKGludCllLkF0dHJpYnV0ZShXLmlkKSkuTWF4KCk7IDsKKworICAgICAgICAgICAgdmFyIHJldmlzb3IgPSBncm91cGVkQ2kuRmlyc3QoKS5SZXZpc29yOworCisgICAgICAgICAgICB2YXIgY2FwdGlvblBhcmFncmFwaCA9IG5ldyBYRWxlbWVudChXLnAsCisgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcucFByLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5qYywgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJib3RoIikpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yUHIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLmJDcykpKSwKKyAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yUHIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLmJDcykpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50LCByZXZpc29yKSkpOworCisgICAgICAgICAgICB2YXIgY29sb3JSZ2IgPSBncm91cGVkQ2kuRmlyc3QoKS5Db2xvci5Ub0FyZ2IoKTsKKyAgICAgICAgICAgIHZhciBjb2xvclN0cmluZyA9IGNvbG9yUmdiLlRvU3RyaW5nKCJYIik7CisgICAgICAgICAgICBpZiAoY29sb3JTdHJpbmcuTGVuZ3RoID09IDgpCisgICAgICAgICAgICAgICAgY29sb3JTdHJpbmcgPSBjb2xvclN0cmluZy5TdWJzdHJpbmcoMik7CisKKyAgICAgICAgICAgIGlmIChjb25zb2xpZGF0ZVNldHRpbmdzLkNvbnNvbGlkYXRlV2l0aFRhYmxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IG5ldyBYRWxlbWVudChXLnRibCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudGJsUHIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50YmxTdHlsZSwgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJUYWJsZUdyaWRGb3JSZXZpc2lvbnMiKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50YmxXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuX3csICIwIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy50eXBlLCAiYXV0byIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnNoZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgImNsZWFyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5jb2xvciwgImF1dG8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmZpbGwsIGNvbG9yU3RyaW5nKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50YmxMb29rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuZmlyc3RSb3csICIwIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5sYXN0Um93LCAiMCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuZmlyc3RDb2x1bW4sICIwIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5sYXN0Q29sdW1uLCAiMCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcubm9IQmFuZCwgIjAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLm5vVkJhbmQsICIwIikpKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudGJsR3JpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLmdyaWRDb2wsIG5ldyBYQXR0cmlidXRlKFcuX3csICI5NTc2IikpKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudHIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50Y1ByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnNoZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJjbGVhciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmNvbG9yLCAiYXV0byIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmZpbGwsIGNvbG9yU3RyaW5nKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHRpb25QYXJhZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZENpLlNlbGVjdChjaSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgcGFyYUFmdGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNpLlJldmlzaW9uRWxlbWVudC5OYW1lID09IFcudGJsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYUFmdGVyID0gZW1wdHlQYXJhZ3JhcGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXZpc2lvbkluVGFibGUgPSBuZXdbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaS5SZXZpc2lvbkVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhQWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBBdCB0aGlzIHBvaW50LCBjb250ZW50IG1pZ2h0IGNvbnRhaW4gYSBmb290bm90ZSBvciBlbmRub3RlIHJlZmVyZW5jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vIE5lZWQgdG8gYWRkIHRoZSBmb290bm90ZSAvIGVuZG5vdGUgaW50byB0aGUgY29uc29saWRhdGVkIGRvY3VtZW50ICh3aXRoIHRoZSBzYW1lIGd1aWQgaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBCZWNhdXNlIG9mIHByZXByb2Nlc3Npbmcgb2YgdGhlIGRvY3VtZW50cywgYWxsIGZvb3Rub3RlIGFuZCBlbmRub3RlIHJlZmVyZW5jZXMgd2lsbCBiZSB1bmlxdWUgYXQgdGhpcyBwb2ludAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaS5SZXZpc2lvbkVsZW1lbnQuRGVzY2VuZGFudHMoVy5mb290bm90ZVJlZmVyZW5jZSkuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvb3Rub3RlWERvYyA9IHdEb2NDb25zb2xpZGF0ZWQuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmb290bm90ZVJlZmVyZW5jZSBpbiBjaS5SZXZpc2lvbkVsZW1lbnQuRGVzY2VuZGFudHMoVy5mb290bm90ZVJlZmVyZW5jZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSAoaW50KWZvb3Rub3RlUmVmZXJlbmNlLkF0dHJpYnV0ZShXLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvb3Rub3RlID0gY2kuRm9vdG5vdGVzLkZpcnN0T3JEZWZhdWx0KGZuID0+IChpbnQpZm4uQXR0cmlidXRlKFcuaWQpID09IGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0lkID0gbWF4Rm9vdG5vdGVJZCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEZvb3Rub3RlSWQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vdG5vdGVSZWZlcmVuY2UuQXR0cmlidXRlKFcuaWQpLlZhbHVlID0gbmV3SWQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lZEZvb3Rub3RlID0gbmV3IFhFbGVtZW50KGZvb3Rub3RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkRm9vdG5vdGUuQXR0cmlidXRlKFcuaWQpLlZhbHVlID0gbmV3SWQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vdG5vdGVYRG9jLlJvb3QuQWRkKGNsb25lZEZvb3Rub3RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0RvY0NvbnNvbGlkYXRlZC5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaS5SZXZpc2lvbkVsZW1lbnQuRGVzY2VuZGFudHMoVy5lbmRub3RlUmVmZXJlbmNlKS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5kbm90ZVhEb2MgPSB3RG9jQ29uc29saWRhdGVkLk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlbmRub3RlUmVmZXJlbmNlIGluIGNpLlJldmlzaW9uRWxlbWVudC5EZXNjZW5kYW50cyhXLmVuZG5vdGVSZWZlcmVuY2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gKGludCllbmRub3RlUmVmZXJlbmNlLkF0dHJpYnV0ZShXLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZG5vdGUgPSBjaS5FbmRub3Rlcy5GaXJzdE9yRGVmYXVsdChmbiA9PiAoaW50KWZuLkF0dHJpYnV0ZShXLmlkKSA9PSBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdJZCA9IG1heEVuZG5vdGVJZCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEVuZG5vdGVJZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRub3RlUmVmZXJlbmNlLkF0dHJpYnV0ZShXLmlkKS5WYWx1ZSA9IG5ld0lkLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZWRFbmRub3RlID0gbmV3IFhFbGVtZW50KGVuZG5vdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRFbmRub3RlLkF0dHJpYnV0ZShXLmlkKS5WYWx1ZSA9IG5ld0lkLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG5vdGVYRG9jLlJvb3QuQWRkKGNsb25lZEVuZG5vdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3RG9jQ29uc29saWRhdGVkLk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV2aXNpb25JblRhYmxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpKTsKKworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsYXN0IHBhcmFncmFwaCBoYXMgYSBkZWxldGVkIHBhcmFncmFwaCBtYXJrLCB0aGVuIHJlbW92ZSB0aGUgZGVsZXRpb24gZnJvbSB0aGUgcGFyYWdyYXBoIG1hcmsuICBUaGlzIGlzIHRvIHByZXZlbnQgV29yZCBmcm9tIG1pc2JlaGF2aW5nLgorICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IHBhcmFncmFwaCBpbiBhIGNlbGwgbXVzdCBub3QgaGF2ZSBhIGRlbGV0ZWQgcGFyYWdyYXBoIG1hcmsuCisgICAgICAgICAgICAgICAgdmFyIHRoZUNlbGwgPSB0YWJsZQorICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoVy50YykKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgdmFyIGxhc3RQYXJhID0gdGhlQ2VsbAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5wKQorICAgICAgICAgICAgICAgICAgICAuTGFzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmIChsYXN0UGFyYSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGlzRGVsZXRlZCA9IGxhc3RQYXJhCisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5wUHIpCisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5yUHIpCisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5kZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAuQW55KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0RlbGV0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UGFyYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnBQcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5yUHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuZGVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IG5ld1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9PSAwID8gZW1wdHlQYXJhZ3JhcGggOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eVBhcmFncmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IGdyb3VwZWRDaS5TZWxlY3QoY2kgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHBhcmFBZnRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaS5SZXZpc2lvbkVsZW1lbnQuTmFtZSA9PSBXLnRibCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFBZnRlciA9IGVtcHR5UGFyYWdyYXBoOworICAgICAgICAgICAgICAgICAgICB2YXIgcmV2aXNpb25JblRhYmxlID0gbmV3W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2kuUmV2aXNpb25FbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYUFmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICAvLy8gQXQgdGhpcyBwb2ludCwgY29udGVudCBtaWdodCBjb250YWluIGEgZm9vdG5vdGUgb3IgZW5kbm90ZSByZWZlcmVuY2UuCisgICAgICAgICAgICAgICAgICAgIC8vLyBOZWVkIHRvIGFkZCB0aGUgZm9vdG5vdGUgLyBlbmRub3RlIGludG8gdGhlIGNvbnNvbGlkYXRlZCBkb2N1bWVudCAod2l0aCB0aGUgc2FtZSBndWlkIGlkKQorICAgICAgICAgICAgICAgICAgICAvLy8gQmVjYXVzZSBvZiBwcmVwcm9jZXNzaW5nIG9mIHRoZSBkb2N1bWVudHMsIGFsbCBmb290bm90ZSBhbmQgZW5kbm90ZSByZWZlcmVuY2VzIHdpbGwgYmUgdW5pcXVlIGF0IHRoaXMgcG9pbnQKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2kuUmV2aXNpb25FbGVtZW50LkRlc2NlbmRhbnRzKFcuZm9vdG5vdGVSZWZlcmVuY2UpLkFueSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9vdG5vdGVYRG9jID0gd0RvY0NvbnNvbGlkYXRlZC5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZm9vdG5vdGVSZWZlcmVuY2UgaW4gY2kuUmV2aXNpb25FbGVtZW50LkRlc2NlbmRhbnRzKFcuZm9vdG5vdGVSZWZlcmVuY2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IChpbnQpZm9vdG5vdGVSZWZlcmVuY2UuQXR0cmlidXRlKFcuaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb290bm90ZSA9IGNpLkZvb3Rub3Rlcy5GaXJzdE9yRGVmYXVsdChmbiA9PiAoaW50KWZuLkF0dHJpYnV0ZShXLmlkKSA9PSBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0lkID0gbWF4Rm9vdG5vdGVJZCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Rm9vdG5vdGVJZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvb3Rub3RlUmVmZXJlbmNlLkF0dHJpYnV0ZShXLmlkKS5WYWx1ZSA9IG5ld0lkLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lZEZvb3Rub3RlID0gbmV3IFhFbGVtZW50KGZvb3Rub3RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRGb290bm90ZS5BdHRyaWJ1dGUoVy5pZCkuVmFsdWUgPSBuZXdJZC5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvb3Rub3RlWERvYy5Sb290LkFkZChjbG9uZWRGb290bm90ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB3RG9jQ29uc29saWRhdGVkLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChjaS5SZXZpc2lvbkVsZW1lbnQuRGVzY2VuZGFudHMoVy5lbmRub3RlUmVmZXJlbmNlKS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZG5vdGVYRG9jID0gd0RvY0NvbnNvbGlkYXRlZC5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlbmRub3RlUmVmZXJlbmNlIGluIGNpLlJldmlzaW9uRWxlbWVudC5EZXNjZW5kYW50cyhXLmVuZG5vdGVSZWZlcmVuY2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IChpbnQpZW5kbm90ZVJlZmVyZW5jZS5BdHRyaWJ1dGUoVy5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZG5vdGUgPSBjaS5FbmRub3Rlcy5GaXJzdE9yRGVmYXVsdChmbiA9PiAoaW50KWZuLkF0dHJpYnV0ZShXLmlkKSA9PSBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0lkID0gbWF4RW5kbm90ZUlkICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhFbmRub3RlSWQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRub3RlUmVmZXJlbmNlLkF0dHJpYnV0ZShXLmlkKS5WYWx1ZSA9IG5ld0lkLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lZEVuZG5vdGUgPSBuZXcgWEVsZW1lbnQoZW5kbm90ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkRW5kbm90ZS5BdHRyaWJ1dGUoVy5pZCkuVmFsdWUgPSBuZXdJZC5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG5vdGVYRG9jLlJvb3QuQWRkKGNsb25lZEVuZG5vdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgd0RvY0NvbnNvbGlkYXRlZC5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXZpc2lvbkluVGFibGU7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICB2YXIgZHVtbXlFbGVtZW50ID0gbmV3IFhFbGVtZW50KCJkdW1teSIsCisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuU2VsZWN0TWFueShtID0+IG0pKTsKKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciByZXYgaW4gZHVtbXlFbGVtZW50LkRlc2NlbmRhbnRzKCkuV2hlcmUoZCA9PiBkLkF0dHJpYnV0ZShXLmF1dGhvcikgIT0gbnVsbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYXV0ID0gcmV2LkF0dHJpYnV0ZShXLmF1dGhvcik7CisgICAgICAgICAgICAgICAgICAgIGF1dC5WYWx1ZSA9IHJldmlzb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGR1bW15RWxlbWVudC5FbGVtZW50cygpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkVG9Bbm5vdGF0aW9uKAorICAgICAgICAgICAgV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jRGVsdGEsCisgICAgICAgICAgICBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGNvbnNvbGlkYXRlZFdEb2MsCisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50VG9JbnNlcnRBZnRlciwKKyAgICAgICAgICAgIENvbnNvbGlkYXRpb25JbmZvIGNvbnNvbGlkYXRpb25JbmZvLAorICAgICAgICAgICAgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgUGFja2FnZSBwYWNrYWdlT2ZEZWxldGVkQ29udGVudCA9IHdEb2NEZWx0YS5NYWluRG9jdW1lbnRQYXJ0Lk9wZW5YbWxQYWNrYWdlLlBhY2thZ2U7CisgICAgICAgICAgICBQYWNrYWdlIHBhY2thZ2VPZk5ld0NvbnRlbnQgPSBjb25zb2xpZGF0ZWRXRG9jLk1haW5Eb2N1bWVudFBhcnQuT3BlblhtbFBhY2thZ2UuUGFja2FnZTsKKyAgICAgICAgICAgIFBhY2thZ2VQYXJ0IHBhcnRJbkRlbGV0ZWREb2N1bWVudCA9IHBhY2thZ2VPZkRlbGV0ZWRDb250ZW50LkdldFBhcnQod0RvY0RlbHRhLk1haW5Eb2N1bWVudFBhcnQuVXJpKTsKKyAgICAgICAgICAgIFBhY2thZ2VQYXJ0IHBhcnRJbk5ld0RvY3VtZW50ID0gcGFja2FnZU9mTmV3Q29udGVudC5HZXRQYXJ0KGNvbnNvbGlkYXRlZFdEb2MuTWFpbkRvY3VtZW50UGFydC5VcmkpOworICAgICAgICAgICAgY29uc29saWRhdGlvbkluZm8uUmV2aXNpb25FbGVtZW50ID0gTW92ZVJlbGF0ZWRQYXJ0c1RvRGVzdGluYXRpb24ocGFydEluRGVsZXRlZERvY3VtZW50LCBwYXJ0SW5OZXdEb2N1bWVudCwgY29uc29saWRhdGlvbkluZm8uUmV2aXNpb25FbGVtZW50KTsKKworICAgICAgICAgICAgdmFyIGNsb25lZEZvckhhc2hpbmcgPSAoWEVsZW1lbnQpQ2xvbmVCbG9ja0xldmVsQ29udGVudEZvckhhc2hpbmcoY29uc29saWRhdGVkV0RvYy5NYWluRG9jdW1lbnRQYXJ0LCBjb25zb2xpZGF0aW9uSW5mby5SZXZpc2lvbkVsZW1lbnQsIGZhbHNlLCBzZXR0aW5ncyk7CisgICAgICAgICAgICBjbG9uZWRGb3JIYXNoaW5nLkRlc2NlbmRhbnRzKCkuV2hlcmUoZCA9PiBkLk5hbWUgPT0gVy5pbnMgfHwgZC5OYW1lID09IFcuZGVsKS5BdHRyaWJ1dGVzKFcuaWQpLlJlbW92ZSgpOworICAgICAgICAgICAgdmFyIHNoYVN0cmluZyA9IGNsb25lZEZvckhhc2hpbmcuVG9TdHJpbmcoU2F2ZU9wdGlvbnMuRGlzYWJsZUZvcm1hdHRpbmcpCisgICAgICAgICAgICAgICAgLlJlcGxhY2UoIiB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpblwiIiwgIiIpOworICAgICAgICAgICAgdmFyIHNoYTFIYXNoID0gV21sQ29tcGFyZXJVdGlsLlNIQTFIYXNoU3RyaW5nRm9yVVRGOFN0cmluZyhzaGFTdHJpbmcpOworICAgICAgICAgICAgY29uc29saWRhdGlvbkluZm8uUmV2aXNpb25TdHJpbmcgPSBzaGFTdHJpbmc7CisgICAgICAgICAgICBjb25zb2xpZGF0aW9uSW5mby5SZXZpc2lvbkhhc2ggPSBzaGExSGFzaDsKKworICAgICAgICAgICAgdmFyIGFubm90YXRpb25MaXN0ID0gZWxlbWVudFRvSW5zZXJ0QWZ0ZXIuQW5ub3RhdGlvbjxMaXN0PENvbnNvbGlkYXRpb25JbmZvPj4oKTsKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uTGlzdCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFubm90YXRpb25MaXN0ID0gbmV3IExpc3Q8Q29uc29saWRhdGlvbkluZm8+KCk7CisgICAgICAgICAgICAgICAgZWxlbWVudFRvSW5zZXJ0QWZ0ZXIuQWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uTGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbm5vdGF0aW9uTGlzdC5BZGQoY29uc29saWRhdGlvbkluZm8pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRUYWJsZUdyaWRTdHlsZVRvU3R5bGVzUGFydChTdHlsZURlZmluaXRpb25zUGFydCBzdHlsZURlZmluaXRpb25zUGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNYRG9jID0gc3R5bGVEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICB2YXIgdGFibGVHcmlkU3R5bGUgPSBzWERvYworICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KHMgPT4gKHN0cmluZylzLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09ICJUYWJsZUdyaWRGb3JSZXZpc2lvbnMiKTsKKyAgICAgICAgICAgIGlmICh0YWJsZUdyaWRTdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0YWJsZUdyaWRGb3JSZXZpc2lvbnNTdHlsZU1hcmt1cCA9CitAIjx3OnN0eWxlIHc6dHlwZT0iInRhYmxlIiIKKyAgICAgICAgIHc6c3R5bGVJZD0iIlRhYmxlR3JpZEZvclJldmlzaW9ucyIiCisgICAgICAgICB4bWxuczp3PSIiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluIiI+CisgIDx3Om5hbWUgdzp2YWw9IiJUYWJsZSBHcmlkIEZvciBSZXZpc2lvbnMiIi8+CisgIDx3OmJhc2VkT24gdzp2YWw9IiJUYWJsZU5vcm1hbCIiLz4KKyAgPHc6cnNpZCB3OnZhbD0iIjAwOTIxMjFBIiIvPgorICA8dzpyUHI+CisgICAgPHc6ckZvbnRzIHc6YXNjaWlUaGVtZT0iIm1pbm9ySEFuc2kiIgorICAgICAgICAgICAgICB3OmVhc3RBc2lhVGhlbWU9IiJtaW5vckVhc3RBc2lhIiIKKyAgICAgICAgICAgICAgdzpoQW5zaVRoZW1lPSIibWlub3JIQW5zaSIiCisgICAgICAgICAgICAgIHc6Y3N0aGVtZT0iIm1pbm9yQmlkaSIiLz4KKyAgICA8dzpzeiB3OnZhbD0iIjIyIiIvPgorICAgIDx3OnN6Q3Mgdzp2YWw9IiIyMiIiLz4KKyAgPC93OnJQcj4KKyAgPHc6dGJsUHI+CisgICAgPHc6dGJsQm9yZGVycz4KKyAgICAgIDx3OnRvcCB3OnZhbD0iInNpbmdsZSIiCisgICAgICAgICAgICAgdzpzej0iIjQiIgorICAgICAgICAgICAgIHc6c3BhY2U9IiIwIiIKKyAgICAgICAgICAgICB3OmNvbG9yPSIiYXV0byIiLz4KKyAgICAgIDx3OmxlZnQgdzp2YWw9IiJzaW5nbGUiIgorICAgICAgICAgICAgICB3OnN6PSIiNCIiCisgICAgICAgICAgICAgIHc6c3BhY2U9IiIwIiIKKyAgICAgICAgICAgICAgdzpjb2xvcj0iImF1dG8iIi8+CisgICAgICA8dzpib3R0b20gdzp2YWw9IiJzaW5nbGUiIgorICAgICAgICAgICAgICAgIHc6c3o9IiI0IiIKKyAgICAgICAgICAgICAgICB3OnNwYWNlPSIiMCIiCisgICAgICAgICAgICAgICAgdzpjb2xvcj0iImF1dG8iIi8+CisgICAgICA8dzpyaWdodCB3OnZhbD0iInNpbmdsZSIiCisgICAgICAgICAgICAgICB3OnN6PSIiNCIiCisgICAgICAgICAgICAgICB3OnNwYWNlPSIiMCIiCisgICAgICAgICAgICAgICB3OmNvbG9yPSIiYXV0byIiLz4KKyAgICAgIDx3Omluc2lkZUggdzp2YWw9IiJzaW5nbGUiIgorICAgICAgICAgICAgICAgICB3OnN6PSIiNCIiCisgICAgICAgICAgICAgICAgIHc6c3BhY2U9IiIwIiIKKyAgICAgICAgICAgICAgICAgdzpjb2xvcj0iImF1dG8iIi8+CisgICAgICA8dzppbnNpZGVWIHc6dmFsPSIic2luZ2xlIiIKKyAgICAgICAgICAgICAgICAgdzpzej0iIjQiIgorICAgICAgICAgICAgICAgICB3OnNwYWNlPSIiMCIiCisgICAgICAgICAgICAgICAgIHc6Y29sb3I9IiJhdXRvIiIvPgorICAgIDwvdzp0YmxCb3JkZXJzPgorICA8L3c6dGJsUHI+Cis8L3c6c3R5bGU+IjsKKyAgICAgICAgICAgICAgICB2YXIgdGdzRWxlbWVudCA9IFhFbGVtZW50LlBhcnNlKHRhYmxlR3JpZEZvclJldmlzaW9uc1N0eWxlTWFya3VwKTsKKyAgICAgICAgICAgICAgICBzWERvYy5Sb290LkFkZCh0Z3NFbGVtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciB0YWJsZU5vcm1hbFN0eWxlID0gc1hEb2MKKyAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChzID0+IChzdHJpbmcpcy5BdHRyaWJ1dGUoVy5zdHlsZUlkKSA9PSAiVGFibGVOb3JtYWwiKTsKKyAgICAgICAgICAgIGlmICh0YWJsZU5vcm1hbFN0eWxlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHRhYmxlTm9ybWFsU3R5bGVNYXJrdXAgPQorQCI8dzpzdHlsZSB3OnR5cGU9IiJ0YWJsZSIiCisgICAgICAgICAgIHc6ZGVmYXVsdD0iIjEiIgorICAgICAgICAgICB3OnN0eWxlSWQ9IiJUYWJsZU5vcm1hbCIiCisgICAgICAgICAgIHhtbG5zOnc9IiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4iIj4KKyAgICA8dzpuYW1lIHc6dmFsPSIiTm9ybWFsIFRhYmxlIiIvPgorICAgIDx3OnVpUHJpb3JpdHkgdzp2YWw9IiI5OSIiLz4KKyAgICA8dzpzZW1pSGlkZGVuLz4KKyAgICA8dzp1bmhpZGVXaGVuVXNlZC8+CisgICAgPHc6dGJsUHI+CisgICAgICA8dzp0YmxJbmQgdzp3PSIiMCIiCisgICAgICAgICAgICAgICAgdzp0eXBlPSIiZHhhIiIvPgorICAgICAgPHc6dGJsQ2VsbE1hcj4KKyAgICAgICAgPHc6dG9wIHc6dz0iIjAiIgorICAgICAgICAgICAgICAgdzp0eXBlPSIiZHhhIiIvPgorICAgICAgICA8dzpsZWZ0IHc6dz0iIjEwOCIiCisgICAgICAgICAgICAgICAgdzp0eXBlPSIiZHhhIiIvPgorICAgICAgICA8dzpib3R0b20gdzp3PSIiMCIiCisgICAgICAgICAgICAgICAgICB3OnR5cGU9IiJkeGEiIi8+CisgICAgICAgIDx3OnJpZ2h0IHc6dz0iIjEwOCIiCisgICAgICAgICAgICAgICAgIHc6dHlwZT0iImR4YSIiLz4KKyAgICAgIDwvdzp0YmxDZWxsTWFyPgorICAgIDwvdzp0YmxQcj4KKyAgPC93OnN0eWxlPiI7CisgICAgICAgICAgICAgICAgdmFyIHRuc0VsZW1lbnQgPSBYRWxlbWVudC5QYXJzZSh0YWJsZU5vcm1hbFN0eWxlTWFya3VwKTsKKyAgICAgICAgICAgICAgICBzWERvYy5Sb290LkFkZCh0bnNFbGVtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0eWxlRGVmaW5pdGlvbnNQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEF0dHJpYnV0ZVtdIE5hbWVzcGFjZUF0dHJpYnV0ZXMgPQorICAgICAgICB7CisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgIndwYyIsIFdQQy53cGMpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJtYyIsIE1DLm1jKSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAibyIsIE8ubyksCisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInIiLCBSLnIpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJtIiwgTS5tKSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidiIsIFZNTC52bWwpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3cDE0IiwgV1AxNC53cDE0KSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAid3AiLCBXUC53cCksCisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgIncxMCIsIFcxMC53MTApLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3IiwgVy53KSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidzE0IiwgVzE0LncxNCksCisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgIndwZyIsIFdQRy53cGcpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3cGkiLCBXUEkud3BpKSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAid25lIiwgV05FLnduZSksCisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgIndwcyIsIFdQUy53cHMpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTUMuSWdub3JhYmxlLCAidzE0IHdwMTQiKSwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZEZvb3Rub3Rlc0VuZG5vdGVzUGFydHMoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbWRwID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0OworICAgICAgICAgICAgaWYgKG1kcC5Gb290bm90ZXNQYXJ0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWRwLkFkZE5ld1BhcnQ8Rm9vdG5vdGVzUGFydD4oKTsKKyAgICAgICAgICAgICAgICB2YXIgbmV3Rm9vdG5vdGVzID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgbmV3Rm9vdG5vdGVzLkRlY2xhcmF0aW9uLlN0YW5kYWxvbmUgPSAieWVzIjsKKyAgICAgICAgICAgICAgICBuZXdGb290bm90ZXMuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgIG5ld0Zvb3Rub3Rlcy5BZGQobmV3IFhFbGVtZW50KFcuZm9vdG5vdGVzLCBOYW1lc3BhY2VBdHRyaWJ1dGVzKSk7CisgICAgICAgICAgICAgICAgbWRwLkZvb3Rub3Rlc1BhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWRwLkVuZG5vdGVzUGFydCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1kcC5BZGROZXdQYXJ0PEVuZG5vdGVzUGFydD4oKTsKKyAgICAgICAgICAgICAgICB2YXIgbmV3RW5kbm90ZXMgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIG5ld0VuZG5vdGVzLkRlY2xhcmF0aW9uLlN0YW5kYWxvbmUgPSAieWVzIjsKKyAgICAgICAgICAgICAgICBuZXdFbmRub3Rlcy5EZWNsYXJhdGlvbi5FbmNvZGluZyA9ICJVVEYtOCI7CisgICAgICAgICAgICAgICAgbmV3RW5kbm90ZXMuQWRkKG5ldyBYRWxlbWVudChXLmVuZG5vdGVzLCBOYW1lc3BhY2VBdHRyaWJ1dGVzKSk7CisgICAgICAgICAgICAgICAgbWRwLkVuZG5vdGVzUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ2hhbmdlRm9vdG5vdGVFbmRub3RlUmVmZXJlbmNlc1RvVW5pcXVlUmFuZ2UoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jLCBpbnQgc3RhcnRpbmdJZEZvckZvb3Rub3Rlc0VuZG5vdGVzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbWFpbkRvY1BhcnQgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQ7CisgICAgICAgICAgICB2YXIgZm9vdG5vdGVzUGFydCA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0OworICAgICAgICAgICAgdmFyIGVuZG5vdGVzUGFydCA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQ7CisKKyAgICAgICAgICAgIHZhciBtYWluRG9jdW1lbnRYRG9jID0gbWFpbkRvY1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBYRG9jdW1lbnQgZm9vdG5vdGVzUGFydFhEb2MgPSBudWxsOworICAgICAgICAgICAgaWYgKGZvb3Rub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmb290bm90ZXNQYXJ0WERvYyA9IGZvb3Rub3Rlc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBYRG9jdW1lbnQgZW5kbm90ZXNQYXJ0WERvYyA9IG51bGw7CisgICAgICAgICAgICBpZiAoZW5kbm90ZXNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgZW5kbm90ZXNQYXJ0WERvYyA9IGVuZG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgdmFyIHJlZmVyZW5jZXMgPSBtYWluRG9jdW1lbnRYRG9jCisgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgIC5XaGVyZShkID0+IGQuTmFtZSA9PSBXLmZvb3Rub3RlUmVmZXJlbmNlIHx8IGQuTmFtZSA9PSBXLmVuZG5vdGVSZWZlcmVuY2UpOworCisgICAgICAgICAgICB2YXIgcm5kID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHIgaW4gcmVmZXJlbmNlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgb2xkSWQgPSAoc3RyaW5nKXIuQXR0cmlidXRlKFcuaWQpOworICAgICAgICAgICAgICAgIHZhciBuZXdJZCA9IHN0YXJ0aW5nSWRGb3JGb290bm90ZXNFbmRub3Rlcy5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIHN0YXJ0aW5nSWRGb3JGb290bm90ZXNFbmRub3RlcysrOworICAgICAgICAgICAgICAgIHIuQXR0cmlidXRlKFcuaWQpLlZhbHVlID0gbmV3SWQ7CisgICAgICAgICAgICAgICAgaWYgKHIuTmFtZSA9PSBXLmZvb3Rub3RlUmVmZXJlbmNlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0gZm9vdG5vdGVzUGFydFhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGUgPT4gKHN0cmluZyllLkF0dHJpYnV0ZShXLmlkKSA9PSBvbGRJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmbiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnZhbGlkIGRvY3VtZW50Iik7CisgICAgICAgICAgICAgICAgICAgIGZuLkF0dHJpYnV0ZShXLmlkKS5WYWx1ZSA9IG5ld0lkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZW4gPSBlbmRub3Rlc1BhcnRYRG9jCisgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy5pZCkgPT0gb2xkSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW52YWxpZCBkb2N1bWVudCIpOworICAgICAgICAgICAgICAgICAgICBlbi5BdHRyaWJ1dGUoVy5pZCkuVmFsdWUgPSBuZXdJZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1haW5Eb2NQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgaWYgKGZvb3Rub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmb290bm90ZXNQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgaWYgKGVuZG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGVuZG5vdGVzUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFdtbERvY3VtZW50IFByb2R1Y2VEb2N1bWVudFdpdGhUcmFja2VkUmV2aXNpb25zKFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MsIFdtbERvY3VtZW50IHdtbFJlc3VsdCwgV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jMSwgV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jMikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2F2ZSBhd2F5IHNlY3RQciBzbyB0aGF0IGNhbiBzZXQgaW4gdGhlIG5ld2x5IHByb2R1Y2VkIGRvY3VtZW50LgorICAgICAgICAgICAgdmFyIHNhdmVkU2VjdFByID0gd0RvYzEKKyAgICAgICAgICAgICAgICAuTWFpbkRvY3VtZW50UGFydAorICAgICAgICAgICAgICAgIC5HZXRYRG9jdW1lbnQoKQorICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnQoVy5ib2R5KQorICAgICAgICAgICAgICAgIC5FbGVtZW50KFcuc2VjdFByKTsKKworICAgICAgICAgICAgdmFyIGNvbnRlbnRQYXJlbnQxID0gd0RvYzEuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKS5Sb290LkVsZW1lbnQoVy5ib2R5KTsKKyAgICAgICAgICAgIEFkZFNoYTFIYXNoVG9CbG9ja0xldmVsQ29udGVudCh3RG9jMS5NYWluRG9jdW1lbnRQYXJ0LCBjb250ZW50UGFyZW50MSwgc2V0dGluZ3MpOworICAgICAgICAgICAgdmFyIGNvbnRlbnRQYXJlbnQyID0gd0RvYzIuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKS5Sb290LkVsZW1lbnQoVy5ib2R5KTsKKyAgICAgICAgICAgIEFkZFNoYTFIYXNoVG9CbG9ja0xldmVsQ29udGVudCh3RG9jMi5NYWluRG9jdW1lbnRQYXJ0LCBjb250ZW50UGFyZW50Miwgc2V0dGluZ3MpOworCisgICAgICAgICAgICB2YXIgY2FsMSA9IFdtbENvbXBhcmVyLkNyZWF0ZUNvbXBhcmlzb25Vbml0QXRvbUxpc3Qod0RvYzEuTWFpbkRvY3VtZW50UGFydCwgd0RvYzEuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKS5Sb290LkVsZW1lbnQoVy5ib2R5KSwgc2V0dGluZ3MpOworCisgICAgICAgICAgICBpZiAoc19GYWxzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGNhbDEpCisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpdGVtLlRvU3RyaW5nKCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBUZXN0VXRpbC5Ob3RlUGFkKHNicyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBjdXMxID0gR2V0Q29tcGFyaXNvblVuaXRMaXN0KGNhbDEsIHNldHRpbmdzKTsKKworICAgICAgICAgICAgaWYgKHNfRmFsc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNicyA9IENvbXBhcmlzb25Vbml0LkNvbXBhcmlzb25Vbml0TGlzdFRvU3RyaW5nKGN1czEpOworICAgICAgICAgICAgICAgIFRlc3RVdGlsLk5vdGVQYWQoc2JzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGNhbDIgPSBXbWxDb21wYXJlci5DcmVhdGVDb21wYXJpc29uVW5pdEF0b21MaXN0KHdEb2MyLk1haW5Eb2N1bWVudFBhcnQsIHdEb2MyLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCkuUm9vdC5FbGVtZW50KFcuYm9keSksIHNldHRpbmdzKTsKKworICAgICAgICAgICAgaWYgKHNfRmFsc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBjYWwyKQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaXRlbS5Ub1N0cmluZygpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgdmFyIHNicyA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgVGVzdFV0aWwuTm90ZVBhZChzYnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgY3VzMiA9IEdldENvbXBhcmlzb25Vbml0TGlzdChjYWwyLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgIGlmIChzX0ZhbHNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzYnMgPSBDb21wYXJpc29uVW5pdC5Db21wYXJpc29uVW5pdExpc3RUb1N0cmluZyhjdXMyKTsKKyAgICAgICAgICAgICAgICBUZXN0VXRpbC5Ob3RlUGFkKHNicyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzX0ZhbHNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzYjMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIHNiMy5BcHBlbmQoIkNvbXBhcmlzb25Vbml0TGlzdCAxID09PT09IiArIEVudmlyb25tZW50Lk5ld0xpbmUgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICBzYjMuQXBwZW5kKENvbXBhcmlzb25Vbml0LkNvbXBhcmlzb25Vbml0TGlzdFRvU3RyaW5nKGN1czEpKTsKKyAgICAgICAgICAgICAgICBzYjMuQXBwZW5kKEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgIHNiMy5BcHBlbmQoIkNvbXBhcmlzb25Vbml0TGlzdCAyID09PT09IiArIEVudmlyb25tZW50Lk5ld0xpbmUgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICBzYjMuQXBwZW5kKENvbXBhcmlzb25Vbml0LkNvbXBhcmlzb25Vbml0TGlzdFRvU3RyaW5nKGN1czIpKTsKKyAgICAgICAgICAgICAgICB2YXIgc2JzMyA9IHNiMy5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIFRlc3RVdGlsLk5vdGVQYWQoc2JzMyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBjb3JyZWxhdGVkU2VxdWVuY2UgPSBMY3MoY3VzMSwgY3VzMiwgc2V0dGluZ3MpOworCisgICAgICAgICAgICBpZiAoc19GYWxzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGNvcnJlbGF0ZWRTZXF1ZW5jZSkKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0uVG9TdHJpbmcoKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgIHZhciBzYnMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIFRlc3RVdGlsLk5vdGVQYWQoc2JzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZm9yIGFueSBkZWxldGVkIG9yIGluc2VydGVkIHJvd3MsIHdlIGdvIGludG8gdGhlIHc6dHJQciBwcm9wZXJ0aWVzLCBhbmQgYWRkIHRoZSBhcHByb3ByaWF0ZSB3OmlucyBvciB3OmRlbCBlbGVtZW50LCBhbmQgdGhlcmVmb3JlCisgICAgICAgICAgICAvLyB3aGVuIGdlbmVyYXRpbmcgdGhlIGRvY3VtZW50LCB0aGUgYXBwcm9wcmlhdGUgcm93IHdpbGwgYmUgbWFya2VkIGFzIGRlbGV0ZWQgb3IgaW5zZXJ0ZWQuCisgICAgICAgICAgICBNYXJrUm93c0FzRGVsZXRlZE9ySW5zZXJ0ZWQoc2V0dGluZ3MsIGNvcnJlbGF0ZWRTZXF1ZW5jZSk7CisKKyAgICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgZ2V0cyBhIGZsYXR0ZW5lZCBsaXN0IG9mIENvbXBhcmlzb25Vbml0QXRvbXMsIHdpdGggc3RhdHVzIGluZGljYXRlZCBpbiBlYWNoIENvbXBhcmlzb25Vbml0QXRvbTogRGVsZXRlZCwgSW5zZXJ0ZWQsIG9yIEVxdWFsCisgICAgICAgICAgICB2YXIgbGlzdE9mQ29tcGFyaXNvblVuaXRBdG9tcyA9IEZsYXR0ZW5Ub0NvbXBhcmlzb25Vbml0QXRvbUxpc3QoY29ycmVsYXRlZFNlcXVlbmNlLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgIGlmIChzX0ZhbHNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gbGlzdE9mQ29tcGFyaXNvblVuaXRBdG9tcykKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0uVG9TdHJpbmcoKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgIHZhciBzYnMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIFRlc3RVdGlsLk5vdGVQYWQoc2JzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbm90ZSAtIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhlIGhhY2sgdW50aWwgYWZ0ZXIgZmxhdHRlbmluZyBhbGwgb2YgdGhlIGdyb3Vwcy4gIEF0IHRoZSBlbmQgb2YgdGhlIGZsYXR0ZW5pbmcsIHdlIHNob3VsZCBzaW1wbHkKKyAgICAgICAgICAgIC8vIGhhdmUgYSBsaXN0IG9mIENvbXBhcmlzb25Vbml0QXRvbXMsIGFwcHJvcHJpYXRlbHkgbWFya2VkIGFzIGVxdWFsLCBpbnNlcnRlZCwgb3IgZGVsZXRlZC4KKworICAgICAgICAgICAgLy8gdGhlIHRhYmxlIGlkIHdpbGwgYmUgaGFja2VkIGluIHRoZSBub3JtYWwgY291cnNlIG9mIGV2ZW50cy4KKyAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIHdoZXJlIGEgcm93IGlzIGRlbGV0ZWQsIG5vdCBuZWNlc3NhcnkgdG8gaGFjayAtIHRoZSBkZWxldGVkIHJvdyBJRCB3aWxsIGRvLgorICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugd2hlcmUgYSByb3cgaXMgaW5zZXJ0ZWQsIG5vdCBuZWNlc3NhcnkgdG8gaGFjayAtIHRoZSBpbnNlcnRlZCByb3cgSUQgd2lsbCBkbyBhcyB3ZWxsLgorICAgICAgICAgICAgQXNzZW1ibGVBbmNlc3RvclVuaWRzSW5PcmRlclRvUmVidWlsZFhtbFRyZWVQcm9wZXJseShsaXN0T2ZDb21wYXJpc29uVW5pdEF0b21zKTsKKworICAgICAgICAgICAgaWYgKHNfRmFsc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBsaXN0T2ZDb21wYXJpc29uVW5pdEF0b21zKQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaXRlbS5Ub1N0cmluZ0FuY2VzdG9yVW5pZHMoKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgIHZhciBzYnMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIFRlc3RVdGlsLk5vdGVQYWQoc2JzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYW5kIHRoZW4gZmluYWxseSBjYW4gZ2VuZXJhdGUgdGhlIGRvY3VtZW50IHdpdGggcmV2aXNpb25zCisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKHdtbFJlc3VsdC5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgd21sUmVzdWx0LkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvY1dpdGhSZXZpc2lvbnMgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obXMsIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHhEb2MgPSB3RG9jV2l0aFJldmlzaW9ucy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdE5hbWVzcGFjZUF0dHJpYnV0ZXMgPSB4RG9jCisgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGEgPT4gYS5Jc05hbWVzcGFjZURlY2xhcmF0aW9uIHx8IGEuTmFtZS5OYW1lc3BhY2UgPT0gTUMubWMpCisgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBwcm9kdWNlcyBhIG5ldyB2YWxpZCBXb3JkcHJvY2Vzc2luZ01MIGRvY3VtZW50IGZyb20gdGhlIGxpc3RPZkNvbXBhcmlzb25Vbml0QXRvbXMKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0JvZHlDaGlsZHJlbiA9IFByb2R1Y2VOZXdXbWxNYXJrdXBGcm9tQ29ycmVsYXRlZFNlcXVlbmNlKHdEb2NXaXRoUmV2aXNpb25zLk1haW5Eb2N1bWVudFBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0T2ZDb21wYXJpc29uVW5pdEF0b21zLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgICAgICAgICAgWERvY3VtZW50IG5ld1hEb2MgPSBuZXcgWERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIG5ld1hEb2MuQWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdE5hbWVzcGFjZUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuYm9keSwgbmV3Qm9keUNoaWxkcmVuKSkpOworICAgICAgICAgICAgICAgICAgICBNYXJrQ29udGVudEFzRGVsZXRlZE9ySW5zZXJ0ZWQobmV3WERvYywgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICBDb2FsZXNjZUFkamFjZW50UnVuc1dpdGhJZGVudGljYWxGb3JtYXR0aW5nKG5ld1hEb2MpOworICAgICAgICAgICAgICAgICAgICBJZ25vcmVQdDE0TmFtZXNwYWNlKG5ld1hEb2MuUm9vdCk7CisKKyAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc0Zvb3Rub3RlRW5kbm90ZShzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RPZkNvbXBhcmlzb25Vbml0QXRvbXMsCisgICAgICAgICAgICAgICAgICAgICAgICB3RG9jMS5NYWluRG9jdW1lbnRQYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgd0RvYzIuTWFpbkRvY3VtZW50UGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1hEb2MpOworCisgICAgICAgICAgICAgICAgICAgIFJlY3RpZnlGb290bm90ZUVuZG5vdGVJZHMoCisgICAgICAgICAgICAgICAgICAgICAgICB3RG9jMS5NYWluRG9jdW1lbnRQYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgd0RvYzIuTWFpbkRvY3VtZW50UGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdEb2NXaXRoUmV2aXNpb25zLk1haW5Eb2N1bWVudFBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdYRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOworCisgICAgICAgICAgICAgICAgICAgIENvbmpvaW5EZWxldGVkSW5zZXJ0ZWRQYXJhZ3JhcGhNYXJrcyh3RG9jV2l0aFJldmlzaW9ucy5NYWluRG9jdW1lbnRQYXJ0LCBuZXdYRG9jKTsKKworICAgICAgICAgICAgICAgICAgICBGaXhVcFJldmlzaW9uSWRzKHdEb2NXaXRoUmV2aXNpb25zLCBuZXdYRG9jKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBsaXR0bGUgYml0IG9mIGNsZWFudXAKKyAgICAgICAgICAgICAgICAgICAgTW92ZUxhc3RTZWN0UHJUb0NoaWxkT2ZCb2R5KG5ld1hEb2MpOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdYRG9jMlJvb3QgPSAoWEVsZW1lbnQpV29yZHByb2Nlc3NpbmdNTFV0aWwuV21sT3JkZXJFbGVtZW50c1BlclN0YW5kYXJkKG5ld1hEb2MuUm9vdCk7CisgICAgICAgICAgICAgICAgICAgIHhEb2MuUm9vdC5SZXBsYWNlV2l0aChuZXdYRG9jMlJvb3QpOworCisgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wb3JhcnkgY29kZSB0byByZW1vdmUgc2VjdGlvbnMuICBXaGVuIHJlbW92ZSB0aGlzIGNvZGUsIGdldCB2YWxpZGF0aW9uIGVycm9ycyBmb3Igc29tZSBJVFUgZG9jdW1lbnRzLgorICAgICAgICAgICAgICAgICAgICB4RG9jLlJvb3QuRGVzY2VuZGFudHMoVy5zZWN0UHIpLlJlbW92ZSgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgdzpzZWN0UHIgZnJvbSBzb3VyY2UgZG9jdW1lbnQgaW50byBuZXdseSBnZW5lcmF0ZWQgZG9jdW1lbnQuCisgICAgICAgICAgICAgICAgICAgIGlmIChzYXZlZFNlY3RQciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeGQgPSB3RG9jV2l0aFJldmlzaW9ucy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGV2ZXJ5dGhpbmcgYnV0IGhlYWRlcnMvZm9vdGVycworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lZFNlY3RQciA9IG5ldyBYRWxlbWVudChXLnNlY3RQciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZFNlY3RQci5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRTZWN0UHIuRWxlbWVudChXLnR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkU2VjdFByLkVsZW1lbnQoVy5wZ1N6KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZFNlY3RQci5FbGVtZW50KFcucGdNYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkU2VjdFByLkVsZW1lbnQoVy5jb2xzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZFNlY3RQci5FbGVtZW50KFcudGl0bGVQZykpOworICAgICAgICAgICAgICAgICAgICAgICAgeGQuUm9vdC5FbGVtZW50KFcuYm9keSkuQWRkKGNsb25lZFNlY3RQcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgICAgICAgICAgd0RvY1dpdGhSZXZpc2lvbnMuTWFpbkRvY3VtZW50UGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgRml4VXBGb290bm90ZXNFbmRub3Rlc1dpdGhDdXN0b21NYXJrZXJzKHdEb2NXaXRoUmV2aXNpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgRml4VXBSZXZNYXJrSWRzKHdEb2NXaXRoUmV2aXNpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgRml4VXBEb2NQcklkcyh3RG9jV2l0aFJldmlzaW9ucyk7CisgICAgICAgICAgICAgICAgICAgIEZpeFVwU2hhcGVJZHMod0RvY1dpdGhSZXZpc2lvbnMpOworICAgICAgICAgICAgICAgICAgICBGaXhVcFNoYXBlVHlwZUlkcyh3RG9jV2l0aFJldmlzaW9ucyk7CisgICAgICAgICAgICAgICAgICAgIEFkZEZvb3Rub3Rlc0VuZG5vdGVzU3R5bGVzKHdEb2NXaXRoUmV2aXNpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgQ29weU1pc3NpbmdTdHlsZXNGcm9tT25lRG9jVG9Bbm90aGVyKHdEb2MyLCB3RG9jV2l0aFJldmlzaW9ucyk7CisgICAgICAgICAgICAgICAgICAgIERlbGV0ZUZvb3Rub3RlUHJvcGVydGllc0luU2V0dGluZ3Mod0RvY1dpdGhSZXZpc2lvbnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFydCBpbiB3RG9jMS5Db250ZW50UGFydHMoKSkKKyAgICAgICAgICAgICAgICAgICAgcGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFydCBpbiB3RG9jMi5Db250ZW50UGFydHMoKSkKKyAgICAgICAgICAgICAgICAgICAgcGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICB2YXIgdXBkYXRlZFdtbFJlc3VsdCA9IG5ldyBXbWxEb2N1bWVudCgiRHVtbXkuZG9jeCIsIG1zLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWRXbWxSZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIERlbGV0ZUZvb3Rub3RlUHJvcGVydGllc0luU2V0dGluZ3MoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jV2l0aFJldmlzaW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNldHRpbmdzUGFydCA9IHdEb2NXaXRoUmV2aXNpb25zLk1haW5Eb2N1bWVudFBhcnQuRG9jdW1lbnRTZXR0aW5nc1BhcnQ7CisgICAgICAgICAgICBpZiAoc2V0dGluZ3NQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHN4RG9jID0gc2V0dGluZ3NQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIHN4RG9jLlJvb3QuRWxlbWVudHMoKS5XaGVyZShlID0+IGUuTmFtZSA9PSBXLmZvb3Rub3RlUHIgfHwgZS5OYW1lID09IFcuZW5kbm90ZVByKS5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBzZXR0aW5nc1BhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEZpeFVwRm9vdG5vdGVzRW5kbm90ZXNXaXRoQ3VzdG9tTWFya2VycyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2NXaXRoUmV2aXNpb25zKQorICAgICAgICB7CisjaWYgRkFMU0UKKyAgICAgIC8vIHRoaXMgbmVlZHMgdG8gY2hhbmdlCisgICAgICA8dzpkZWwgdzphdXRob3I9Ik9wZW4tWG1sLVBvd2VyVG9vbHMiCisgICAgICAgICAgICAgdzppZD0iNyIKKyAgICAgICAgICAgICB3OmRhdGU9IjIwMTctMDYtMDdUMTI6MjM6MjIuODYwMTI4NS0wNzowMCI+CisgICAgICAgIDx3OnI+CisgICAgICAgICAgPHc6clByIHB0MTQ6VW5pZD0iZWM3NWE3MTM2MWM4NDU2MmE3NTdlZWU4YjI4ZmMyMjkiPgorICAgICAgICAgICAgPHc6ckZvbnRzIHc6Y3M9IlRpbWVzIE5ldyBSb21hbiBCb2xkIgorICAgICAgICAgICAgICAgICAgICAgIHB0MTQ6VW5pZD0iMTZiYjM1NWRmNTk2NGJhMDk4NTRmOTE1MmM5NzI0MmIiIC8+CisgICAgICAgICAgICA8dzpiIHc6dmFsPSIwIgorICAgICAgICAgICAgICAgICBwdDE0OlVuaWQ9IjlhYmNlYzU0YWQ0MTQ3OTFhNTYyN2NiYjE5OGU4YWE5IiAvPgorICAgICAgICAgICAgPHc6YkNzIHB0MTQ6VW5pZD0iNzFlY2QyZWJhODVlNGJmYWE5MmIzZDYxOGUyZjg4MjkiIC8+CisgICAgICAgICAgICA8dzpwb3NpdGlvbiB3OnZhbD0iNiIKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0MTQ6VW5pZD0iNjE3OTNmNmE1ZjQ5NDcwMGI3ZjJhM2E3NTNjZTkwNTUiIC8+CisgICAgICAgICAgICA8dzpzeiB3OnZhbD0iMTYiCisgICAgICAgICAgICAgICAgICBwdDE0OlVuaWQ9IjYwYjNjZDAyMGMyMTRkMGVhMDdlNWE2OGFlMGU0ZWZlIiAvPgorICAgICAgICAgICAgPHc6c3pDcyB3OnZhbD0iMTYiCisgICAgICAgICAgICAgICAgICAgIHB0MTQ6VW5pZD0iOWFlNjFhNzI0ZGU0NGE3NTg2ODE4MGFhYzQ0ZWEzODAiIC8+CisgICAgICAgICAgPC93OnJQcj4KKyAgICAgICAgICA8dzpmb290bm90ZVJlZmVyZW5jZSB3OmN1c3RvbU1hcmtGb2xsb3dzPSIxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6aWQ9IjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQxNDpTdGF0dXM9IkRlbGV0ZWQiIC8+CisgICAgICAgIDwvdzpyPgorICAgICAgPC93OmRlbD4KKyAgICAgIDx3OmRlbCB3OmF1dGhvcj0iT3Blbi1YbWwtUG93ZXJUb29scyIKKyAgICAgICAgICAgICB3OmlkPSI4IgorICAgICAgICAgICAgIHc6ZGF0ZT0iMjAxNy0wNi0wN1QxMjoyMzoyMi44NjAxMjg1LTA3OjAwIj4KKyAgICAgICAgPHc6cj4KKyAgICAgICAgICA8dzpyUHIgcHQxNDpVbmlkPSI0NDVjYWVmNzRhNjI0ZTU4OGU3YWRhYTZkNzc3NTYzOSI+CisgICAgICAgICAgICA8dzpyRm9udHMgdzpjcz0iVGltZXMgTmV3IFJvbWFuIEJvbGQiCisgICAgICAgICAgICAgICAgICAgICAgcHQxNDpVbmlkPSI1OTIwODg1ZjhlYzQ0YzUzYmNhZWNlMmRlN2VhZmRhMiIgLz4KKyAgICAgICAgICAgIDx3OmIgdzp2YWw9IjAiCisgICAgICAgICAgICAgICAgIHB0MTQ6VW5pZD0iMDIzYTI5ZTJlNmQ0NGMzYjhjNWRmNDczMTdhY2U0YzYiIC8+CisgICAgICAgICAgICA8dzpiQ3MgcHQxNDpVbmlkPSJlOTZlMzdkYWY5MTc0YjI2OGVmNDczMWRmODMxZGY3ZCIgLz4KKyAgICAgICAgICAgIDx3OnBvc2l0aW9uIHc6dmFsPSI2IgorICAgICAgICAgICAgICAgICAgICAgICAgcHQxNDpVbmlkPSJiZTNmOGZmN2VkMDc0NWFlOTM0MGJiMjcwNmIyOGIxZiIgLz4KKyAgICAgICAgICAgIDx3OnN6IHc6dmFsPSIxNiIKKyAgICAgICAgICAgICAgICAgIHB0MTQ6VW5pZD0iNmZiYmRlMDI0ZTdjNDZiOWI3MjQzNWFlNTAwNjU0NTkiIC8+CisgICAgICAgICAgICA8dzpzekNzIHc6dmFsPSIxNiIKKyAgICAgICAgICAgICAgICAgICAgcHQxNDpVbmlkPSJjYzgyZTdiZDc1ZjQ0MWYyYjYwOWVhZTA2NzJmYjI4NSIgLz4KKyAgICAgICAgICA8L3c6clByPgorICAgICAgICAgIDx3OmRlbFRleHQ+MTwvdzpkZWxUZXh0PgorICAgICAgICA8L3c6cj4KKyAgICAgIDwvdzpkZWw+CisKKyAgICAgIC8vIHRvIHRoaXMKKyAgICAgIDx3OmRlbCB3OmF1dGhvcj0iT3Blbi1YbWwtUG93ZXJUb29scyIKKyAgICAgICAgICAgICB3OmlkPSI3IgorICAgICAgICAgICAgIHc6ZGF0ZT0iMjAxNy0wNi0wN1QxMjoyMzoyMi44NjAxMjg1LTA3OjAwIj4KKyAgICAgICAgPHc6cj4KKyAgICAgICAgICA8dzpyUHIgcHQxNDpVbmlkPSJlYzc1YTcxMzYxYzg0NTYyYTc1N2VlZThiMjhmYzIyOSI+CisgICAgICAgICAgICA8dzpyRm9udHMgdzpjcz0iVGltZXMgTmV3IFJvbWFuIEJvbGQiCisgICAgICAgICAgICAgICAgICAgICAgcHQxNDpVbmlkPSIxNmJiMzU1ZGY1OTY0YmEwOTg1NGY5MTUyYzk3MjQyYiIgLz4KKyAgICAgICAgICAgIDx3OmIgdzp2YWw9IjAiCisgICAgICAgICAgICAgICAgIHB0MTQ6VW5pZD0iOWFiY2VjNTRhZDQxNDc5MWE1NjI3Y2JiMTk4ZThhYTkiIC8+CisgICAgICAgICAgICA8dzpiQ3MgcHQxNDpVbmlkPSI3MWVjZDJlYmE4NWU0YmZhYTkyYjNkNjE4ZTJmODgyOSIgLz4KKyAgICAgICAgICAgIDx3OnBvc2l0aW9uIHc6dmFsPSI2IgorICAgICAgICAgICAgICAgICAgICAgICAgcHQxNDpVbmlkPSI2MTc5M2Y2YTVmNDk0NzAwYjdmMmEzYTc1M2NlOTA1NSIgLz4KKyAgICAgICAgICAgIDx3OnN6IHc6dmFsPSIxNiIKKyAgICAgICAgICAgICAgICAgIHB0MTQ6VW5pZD0iNjBiM2NkMDIwYzIxNGQwZWEwN2U1YTY4YWUwZTRlZmUiIC8+CisgICAgICAgICAgICA8dzpzekNzIHc6dmFsPSIxNiIKKyAgICAgICAgICAgICAgICAgICAgcHQxNDpVbmlkPSI5YWU2MWE3MjRkZTQ0YTc1ODY4MTgwYWFjNDRlYTM4MCIgLz4KKyAgICAgICAgICA8L3c6clByPgorICAgICAgICAgIDx3OmZvb3Rub3RlUmVmZXJlbmNlIHc6Y3VzdG9tTWFya0ZvbGxvd3M9IjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzppZD0iMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDE0OlN0YXR1cz0iRGVsZXRlZCIgLz4KKyAgICAgICAgICA8dzpkZWxUZXh0PjE8L3c6ZGVsVGV4dD4KKyAgICAgICAgPC93OnI+CisgICAgICA8L3c6ZGVsPgorI2VuZGlmCisgICAgICAgICAgICAvLyB0aGlzIGlzIHByZXR0eSByYW5kb20gLSBhIGJ1ZyBpbiBXb3JkIHByZXZlbnRzIGRpc3BsYXkgb2YgYSBkb2N1bWVudCBpZiB0aGUgZGVsVGV4dCBlbGVtZW50IGRvZXMgbm90IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgZm9vdG5vdGVSZWZlcmVuY2UgZWxlbWVudCwgaW4gdGhlIHNhbWUgcnVuLgorICAgICAgICAgICAgdmFyIG1haW5YRG9jID0gd0RvY1dpdGhSZXZpc2lvbnMuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciBuZXdSb290ID0gKFhFbGVtZW50KUZvb3Rub3RlRW5kbm90ZVJlZmVyZW5jZUNsZWFudXBUcmFuc2Zvcm0obWFpblhEb2MuUm9vdCk7CisgICAgICAgICAgICBtYWluWERvYy5Sb290LlJlcGxhY2VXaXRoKG5ld1Jvb3QpOworICAgICAgICAgICAgd0RvY1dpdGhSZXZpc2lvbnMuTWFpbkRvY3VtZW50UGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBGb290bm90ZUVuZG5vdGVSZWZlcmVuY2VDbGVhbnVwVHJhbnNmb3JtKFhOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc21hbGwgb3B0aW1pemF0aW9uIHRvIGVsaW1pbmF0ZSB0aGUgd29yayBmb3IgbW9zdCBlbGVtZW50cworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LkVsZW1lbnQoVy5kZWwpICE9IG51bGwgfHwgZWxlbWVudC5FbGVtZW50KFcuaW5zKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGhhc0Zvb3Rub3RlRW5kbm90ZVJlZmVyZW5jZXNUaGF0TmVlZENsZWFuZWRVcCA9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgPT0gVy5kZWwgfHwgZS5OYW1lID09IFcuaW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgPT0gVy5mb290bm90ZVJlZmVyZW5jZSB8fCBlLk5hbWUgPT0gVy5lbmRub3RlUmVmZXJlbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy5jdXN0b21NYXJrRm9sbG93cykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5BbnkoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRm9vdG5vdGVFbmRub3RlUmVmZXJlbmNlc1RoYXROZWVkQ2xlYW5lZFVwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xvbmUgPSBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBGb290bm90ZUVuZG5vdGVSZWZlcmVuY2VDbGVhbnVwVHJhbnNmb3JtKG4pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9vdG5vdGVFbmRub3RlUmVmZXJlbmNlc1RvQWRqdXN0ID0gY2xvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShkID0+IGQuTmFtZSA9PSBXLmZvb3Rub3RlUmVmZXJlbmNlIHx8IGQuTmFtZSA9PSBXLmVuZG5vdGVSZWZlcmVuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGQgPT4gZC5BdHRyaWJ1dGUoVy5jdXN0b21NYXJrRm9sbG93cykgIT0gbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZm5lbnIgaW4gZm9vdG5vdGVFbmRub3RlUmVmZXJlbmNlc1RvQWRqdXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXIgPSBmbmVuci5QYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdwID0gZm5lbnIuUGFyZW50LlBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyLk5hbWUgPT0gVy5yICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwLk5hbWUgPT0gVy5kZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyLkVsZW1lbnQoVy5kZWxUZXh0KSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZnRlckdwID0gZ3AuRWxlbWVudHNBZnRlclNlbGYoKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJHcCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZnRlckdwRGVsVGV4dCA9IGFmdGVyR3AuRWxlbWVudHMoVy5yKS5FbGVtZW50cyhXLmRlbFRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJHcERlbFRleHQuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhci5BZGQoYWZ0ZXJHcERlbFRleHQpOyAgLy8gdGhpcyB3aWxsIGNsb25lIGFuZCBhZGQgdG8gcnVuIHRoYXQgY29udGFpbnMgdGhlIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJHcERlbFRleHQuUmVtb3ZlKCk7ICAvLyB0aGlzIGxlYXZlcyBhbiBlbXB0eSBydW4sIGRvZXMgbm90IG1hdHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyLk5hbWUgPT0gVy5yICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwLk5hbWUgPT0gVy5pbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyLkVsZW1lbnQoVy50KSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZnRlckdwID0gZ3AuRWxlbWVudHNBZnRlclNlbGYoKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJHcCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZnRlckdwVGV4dCA9IGFmdGVyR3AuRWxlbWVudHMoVy5yKS5FbGVtZW50cyhXLnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJHcFRleHQuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhci5BZGQoYWZ0ZXJHcFRleHQpOyAgLy8gdGhpcyB3aWxsIGNsb25lIGFuZCBhZGQgdG8gcnVuIHRoYXQgY29udGFpbnMgdGhlIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJHcFRleHQuUmVtb3ZlKCk7ICAvLyB0aGlzIGxlYXZlcyBhbiBlbXB0eSBydW4sIGRvZXMgbm90IG1hdHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IEZvb3Rub3RlRW5kbm90ZVJlZmVyZW5jZUNsZWFudXBUcmFuc2Zvcm0obikpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weU1pc3NpbmdTdHlsZXNGcm9tT25lRG9jVG9Bbm90aGVyKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvY0Zyb20sIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvY1RvKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmV2aXNpb25zU3R5bGVzWERvYyA9IHdEb2NUby5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgdmFyIGFmdGVyU3R5bGVzWERvYyA9IHdEb2NGcm9tLk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgc3R5bGUgaW4gYWZ0ZXJTdHlsZXNYRG9jLlJvb3QuRWxlbWVudHMoVy5zdHlsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSAoc3RyaW5nKXN0eWxlLkF0dHJpYnV0ZShXLnR5cGUpOworICAgICAgICAgICAgICAgIHZhciBzdHlsZUlkID0gKHN0cmluZylzdHlsZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKTsKKyAgICAgICAgICAgICAgICB2YXIgc3R5bGVJblJldkRvYyA9IHJldmlzaW9uc1N0eWxlc1hEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChzdCA9PiAoc3RyaW5nKXN0LkF0dHJpYnV0ZShXLnR5cGUpID09IHR5cGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmcpc3QuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gc3R5bGVJZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0eWxlSW5SZXZEb2MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgdmFyIGNsb25lZCA9IG5ldyBYRWxlbWVudChzdHlsZSk7CisgICAgICAgICAgICAgICAgaWYgKGNsb25lZC5BdHRyaWJ1dGUoVy5fZGVmYXVsdCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY2xvbmVkLkF0dHJpYnV0ZShXLl9kZWZhdWx0KS5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICByZXZpc2lvbnNTdHlsZXNYRG9jLlJvb3QuQWRkKGNsb25lZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3RG9jVG8uTWFpbkRvY3VtZW50UGFydC5TdHlsZURlZmluaXRpb25zUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkRm9vdG5vdGVzRW5kbm90ZXNTdHlsZXMoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jV2l0aFJldmlzaW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG1haW5YRG9jID0gd0RvY1dpdGhSZXZpc2lvbnMuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciBoYXNGb290bm90ZXMgPSBtYWluWERvYy5EZXNjZW5kYW50cyhXLmZvb3Rub3RlUmVmZXJlbmNlKS5BbnkoKTsKKyAgICAgICAgICAgIHZhciBoYXNFbmRub3RlcyA9IG1haW5YRG9jLkRlc2NlbmRhbnRzKFcuZW5kbm90ZVJlZmVyZW5jZSkuQW55KCk7CisgICAgICAgICAgICB2YXIgc3R5bGVEZWZpbml0aW9uc1BhcnQgPSB3RG9jV2l0aFJldmlzaW9ucy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0OworICAgICAgICAgICAgdmFyIHNYRG9jID0gc3R5bGVEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBpZiAoaGFzRm9vdG5vdGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmb290bm90ZVRleHRTdHlsZSA9IHNYRG9jCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQocyA9PiAoc3RyaW5nKXMuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gIkZvb3Rub3RlVGV4dCIpOworICAgICAgICAgICAgICAgIGlmIChmb290bm90ZVRleHRTdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZvb3Rub3RlVGV4dFN0eWxlTWFya3VwID0KK0AiPHc6c3R5bGUgdzp0eXBlPSIicGFyYWdyYXBoIiIKKyAgICAgICAgICAgdzpzdHlsZUlkPSIiRm9vdG5vdGVUZXh0IiIKKyAgICAgICAgICAgeG1sbnM6dz0iImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbiIiPgorICAgIDx3Om5hbWUgdzp2YWw9IiJmb290bm90ZSB0ZXh0IiIvPgorICAgIDx3OmJhc2VkT24gdzp2YWw9IiJOb3JtYWwiIi8+CisgICAgPHc6bGluayB3OnZhbD0iIkZvb3Rub3RlVGV4dENoYXIiIi8+CisgICAgPHc6dWlQcmlvcml0eSB3OnZhbD0iIjk5IiIvPgorICAgIDx3OnNlbWlIaWRkZW4vPgorICAgIDx3OnVuaGlkZVdoZW5Vc2VkLz4KKyAgICA8dzpwUHI+CisgICAgICA8dzpzcGFjaW5nIHc6YWZ0ZXI9IiIwIiIKKyAgICAgICAgICAgICAgICAgdzpsaW5lPSIiMjQwIiIKKyAgICAgICAgICAgICAgICAgdzpsaW5lUnVsZT0iImF1dG8iIi8+CisgICAgPC93OnBQcj4KKyAgICA8dzpyUHI+CisgICAgICA8dzpzeiB3OnZhbD0iIjIwIiIvPgorICAgICAgPHc6c3pDcyB3OnZhbD0iIjIwIiIvPgorICAgIDwvdzpyUHI+CisgIDwvdzpzdHlsZT4iOworICAgICAgICAgICAgICAgICAgICB2YXIgZnRzRWxlbWVudCA9IFhFbGVtZW50LlBhcnNlKGZvb3Rub3RlVGV4dFN0eWxlTWFya3VwKTsKKyAgICAgICAgICAgICAgICAgICAgc1hEb2MuUm9vdC5BZGQoZnRzRWxlbWVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciBmb290bm90ZVRleHRDaGFyU3R5bGUgPSBzWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KHMgPT4gKHN0cmluZylzLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09ICJGb290bm90ZVRleHRDaGFyIik7CisgICAgICAgICAgICAgICAgaWYgKGZvb3Rub3RlVGV4dENoYXJTdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZvb3Rub3RlVGV4dENoYXJTdHlsZU1hcmt1cCA9CitAIjx3OnN0eWxlIHc6dHlwZT0iImNoYXJhY3RlciIiCisgICAgICAgICAgIHc6Y3VzdG9tU3R5bGU9IiIxIiIKKyAgICAgICAgICAgdzpzdHlsZUlkPSIiRm9vdG5vdGVUZXh0Q2hhciIiCisgICAgICAgICAgIHhtbG5zOnc9IiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4iIj4KKyAgICA8dzpuYW1lIHc6dmFsPSIiRm9vdG5vdGUgVGV4dCBDaGFyIiIvPgorICAgIDx3OmJhc2VkT24gdzp2YWw9IiJEZWZhdWx0UGFyYWdyYXBoRm9udCIiLz4KKyAgICA8dzpsaW5rIHc6dmFsPSIiRm9vdG5vdGVUZXh0IiIvPgorICAgIDx3OnVpUHJpb3JpdHkgdzp2YWw9IiI5OSIiLz4KKyAgICA8dzpzZW1pSGlkZGVuLz4KKyAgICA8dzpyUHI+CisgICAgICA8dzpzeiB3OnZhbD0iIjIwIiIvPgorICAgICAgPHc6c3pDcyB3OnZhbD0iIjIwIiIvPgorICAgIDwvdzpyUHI+CisgIDwvdzpzdHlsZT4iOworICAgICAgICAgICAgICAgICAgICB2YXIgZm50Y3NFbGVtZW50ID0gWEVsZW1lbnQuUGFyc2UoZm9vdG5vdGVUZXh0Q2hhclN0eWxlTWFya3VwKTsKKyAgICAgICAgICAgICAgICAgICAgc1hEb2MuUm9vdC5BZGQoZm50Y3NFbGVtZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFyIGZvb3Rub3RlUmVmZXJlbmNlU3R5bGUgPSBzWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KHMgPT4gKHN0cmluZylzLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09ICJGb290bm90ZVJlZmVyZW5jZSIpOworICAgICAgICAgICAgICAgIGlmIChmb290bm90ZVJlZmVyZW5jZVN0eWxlID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZm9vdG5vdGVSZWZlcmVuY2VTdHlsZU1hcmt1cCA9CitAIjx3OnN0eWxlIHc6dHlwZT0iImNoYXJhY3RlciIiCisgICAgICAgICAgIHc6c3R5bGVJZD0iIkZvb3Rub3RlUmVmZXJlbmNlIiIKKyAgICAgICAgICAgeG1sbnM6dz0iImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbiIiPgorICAgIDx3Om5hbWUgdzp2YWw9IiJmb290bm90ZSByZWZlcmVuY2UiIi8+CisgICAgPHc6YmFzZWRPbiB3OnZhbD0iIkRlZmF1bHRQYXJhZ3JhcGhGb250IiIvPgorICAgIDx3OnVpUHJpb3JpdHkgdzp2YWw9IiI5OSIiLz4KKyAgICA8dzpzZW1pSGlkZGVuLz4KKyAgICA8dzp1bmhpZGVXaGVuVXNlZC8+CisgICAgPHc6clByPgorICAgICAgPHc6dmVydEFsaWduIHc6dmFsPSIic3VwZXJzY3JpcHQiIi8+CisgICAgPC93OnJQcj4KKyAgPC93OnN0eWxlPiI7CisgICAgICAgICAgICAgICAgICAgIHZhciBmbnJzRWxlbWVudCA9IFhFbGVtZW50LlBhcnNlKGZvb3Rub3RlUmVmZXJlbmNlU3R5bGVNYXJrdXApOworICAgICAgICAgICAgICAgICAgICBzWERvYy5Sb290LkFkZChmbnJzRWxlbWVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhc0VuZG5vdGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBlbmRub3RlVGV4dFN0eWxlID0gc1hEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChzID0+IChzdHJpbmcpcy5BdHRyaWJ1dGUoVy5zdHlsZUlkKSA9PSAiRW5kbm90ZVRleHQiKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kbm90ZVRleHRTdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGVuZG5vdGVUZXh0U3R5bGVNYXJrdXAgPQorQCI8dzpzdHlsZSB3OnR5cGU9IiJwYXJhZ3JhcGgiIgorICAgICAgICAgICB3OnN0eWxlSWQ9IiJFbmRub3RlVGV4dCIiCisgICAgICAgICAgIHhtbG5zOnc9IiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4iIj4KKyAgICA8dzpuYW1lIHc6dmFsPSIiZW5kbm90ZSB0ZXh0IiIvPgorICAgIDx3OmJhc2VkT24gdzp2YWw9IiJOb3JtYWwiIi8+CisgICAgPHc6bGluayB3OnZhbD0iIkVuZG5vdGVUZXh0Q2hhciIiLz4KKyAgICA8dzp1aVByaW9yaXR5IHc6dmFsPSIiOTkiIi8+CisgICAgPHc6c2VtaUhpZGRlbi8+CisgICAgPHc6dW5oaWRlV2hlblVzZWQvPgorICAgIDx3OnBQcj4KKyAgICAgIDx3OnNwYWNpbmcgdzphZnRlcj0iIjAiIgorICAgICAgICAgICAgICAgICB3OmxpbmU9IiIyNDAiIgorICAgICAgICAgICAgICAgICB3OmxpbmVSdWxlPSIiYXV0byIiLz4KKyAgICA8L3c6cFByPgorICAgIDx3OnJQcj4KKyAgICAgIDx3OnN6IHc6dmFsPSIiMjAiIi8+CisgICAgICA8dzpzekNzIHc6dmFsPSIiMjAiIi8+CisgICAgPC93OnJQcj4KKyAgPC93OnN0eWxlPiI7CisgICAgICAgICAgICAgICAgICAgIHZhciBldHNFbGVtZW50ID0gWEVsZW1lbnQuUGFyc2UoZW5kbm90ZVRleHRTdHlsZU1hcmt1cCk7CisgICAgICAgICAgICAgICAgICAgIHNYRG9jLlJvb3QuQWRkKGV0c0VsZW1lbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgZW5kbm90ZVRleHRDaGFyU3R5bGUgPSBzWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KHMgPT4gKHN0cmluZylzLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09ICJFbmRub3RlVGV4dENoYXIiKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kbm90ZVRleHRDaGFyU3R5bGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBlbmRub3RlVGV4dENoYXJTdHlsZU1hcmt1cCA9CitAIjx3OnN0eWxlIHc6dHlwZT0iImNoYXJhY3RlciIiCisgICAgICAgICAgIHc6Y3VzdG9tU3R5bGU9IiIxIiIKKyAgICAgICAgICAgdzpzdHlsZUlkPSIiRW5kbm90ZVRleHRDaGFyIiIKKyAgICAgICAgICAgeG1sbnM6dz0iImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbiIiPgorICAgIDx3Om5hbWUgdzp2YWw9IiJFbmRub3RlIFRleHQgQ2hhciIiLz4KKyAgICA8dzpiYXNlZE9uIHc6dmFsPSIiRGVmYXVsdFBhcmFncmFwaEZvbnQiIi8+CisgICAgPHc6bGluayB3OnZhbD0iIkVuZG5vdGVUZXh0IiIvPgorICAgIDx3OnVpUHJpb3JpdHkgdzp2YWw9IiI5OSIiLz4KKyAgICA8dzpzZW1pSGlkZGVuLz4KKyAgICA8dzpyUHI+CisgICAgICA8dzpzeiB3OnZhbD0iIjIwIiIvPgorICAgICAgPHc6c3pDcyB3OnZhbD0iIjIwIiIvPgorICAgIDwvdzpyUHI+CisgIDwvdzpzdHlsZT4iOworICAgICAgICAgICAgICAgICAgICB2YXIgZW50Y3NFbGVtZW50ID0gWEVsZW1lbnQuUGFyc2UoZW5kbm90ZVRleHRDaGFyU3R5bGVNYXJrdXApOworICAgICAgICAgICAgICAgICAgICBzWERvYy5Sb290LkFkZChlbnRjc0VsZW1lbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgZW5kbm90ZVJlZmVyZW5jZVN0eWxlID0gc1hEb2MKKyAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChzID0+IChzdHJpbmcpcy5BdHRyaWJ1dGUoVy5zdHlsZUlkKSA9PSAiRW5kbm90ZVJlZmVyZW5jZSIpOworICAgICAgICAgICAgICAgIGlmIChlbmRub3RlUmVmZXJlbmNlU3R5bGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBlbmRub3RlUmVmZXJlbmNlU3R5bGVNYXJrdXAgPQorQCI8dzpzdHlsZSB3OnR5cGU9IiJjaGFyYWN0ZXIiIgorICAgICAgICAgICB3OnN0eWxlSWQ9IiJFbmRub3RlUmVmZXJlbmNlIiIKKyAgICAgICAgICAgeG1sbnM6dz0iImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbiIiPgorICAgIDx3Om5hbWUgdzp2YWw9IiJlbmRub3RlIHJlZmVyZW5jZSIiLz4KKyAgICA8dzpiYXNlZE9uIHc6dmFsPSIiRGVmYXVsdFBhcmFncmFwaEZvbnQiIi8+CisgICAgPHc6dWlQcmlvcml0eSB3OnZhbD0iIjk5IiIvPgorICAgIDx3OnNlbWlIaWRkZW4vPgorICAgIDx3OnVuaGlkZVdoZW5Vc2VkLz4KKyAgICA8dzpyUHI+CisgICAgICA8dzp2ZXJ0QWxpZ24gdzp2YWw9IiJzdXBlcnNjcmlwdCIiLz4KKyAgICA8L3c6clByPgorICA8L3c6c3R5bGU+IjsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGVucnNFbGVtZW50ID0gWEVsZW1lbnQuUGFyc2UoZW5kbm90ZVJlZmVyZW5jZVN0eWxlTWFya3VwKTsKKyAgICAgICAgICAgICAgICAgICAgc1hEb2MuUm9vdC5BZGQoZW5yc0VsZW1lbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNGb290bm90ZXMgfHwgaGFzRW5kbm90ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3R5bGVEZWZpbml0aW9uc1BhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSwgcGVyIHRoZSBhbGdvcml0aG0sIGZvciB0aGUgYWxnb3JpdGhtIHRvIGZpbmQgdGhhdCB0aGUgcGFyYWdyYXBoIG1hcmsgZm9yIGEgc2luZ2xlIHBhcmFncmFwaCBoYXMgYmVlbgorICAgICAgICAvLyBpbnNlcnRlZCBhbmQgZGVsZXRlZC4gIElmIHRoZSBhbGdvcml0aG0gc2V0cyB0aGVtIHRvIGVxdWFsLCB0aGVuIHNvbWV0aW1lcyBpdCB3aWxsIGVxdWF0ZSBwYXJhZ3JhcGggbWFya3MgdGhhdCBzaG91bGQKKyAgICAgICAgLy8gbm90IGJlIGVxdWF0ZWQuICAKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb25qb2luRGVsZXRlZEluc2VydGVkUGFyYWdyYXBoTWFya3MoTWFpbkRvY3VtZW50UGFydCBtYWluRG9jdW1lbnRQYXJ0LCBYRG9jdW1lbnQgbmV3WERvYykKKyAgICAgICAgeworICAgICAgICAgICAgQ29uam9pbk11bHRpcGxlUGFyYWdyYXBoTWFya3MobmV3WERvYyk7CisgICAgICAgICAgICBpZiAobWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZuWERvYyA9IG1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBDb25qb2luTXVsdGlwbGVQYXJhZ3JhcGhNYXJrcyhmblhEb2MpOworICAgICAgICAgICAgICAgIG1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmblhEb2MgPSBtYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBDb25qb2luTXVsdGlwbGVQYXJhZ3JhcGhNYXJrcyhmblhEb2MpOworICAgICAgICAgICAgICAgIG1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb25qb2luTXVsdGlwbGVQYXJhZ3JhcGhNYXJrcyhYRG9jdW1lbnQgeERvYykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG5ld1Jvb3QgPSBDb25qb2luVHJhbnNmb3JtKHhEb2MuUm9vdCk7CisgICAgICAgICAgICB4RG9jLlJvb3QuUmVwbGFjZVdpdGgobmV3Um9vdCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQ29uam9pblRyYW5zZm9ybShYTm9kZSBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5wICYmIGVsZW1lbnQuRWxlbWVudHMoVy5wUHIpLkNvdW50KCkgPj0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwUHIgPSBuZXcgWEVsZW1lbnQoZWxlbWVudC5FbGVtZW50KFcucFByKSk7CisgICAgICAgICAgICAgICAgICAgIHBQci5FbGVtZW50cyhXLnJQcikuRWxlbWVudHMoKS5XaGVyZShyID0+IHIuTmFtZSA9PSBXLmlucyB8fCByLk5hbWUgPT0gVy5kZWwpLlJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICBwUHIuQXR0cmlidXRlcyhQdE9wZW5YbWwuU3RhdHVzKS5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1BhcmEgPSBuZXcgWEVsZW1lbnQoVy5wLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBwUHIsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKCkuV2hlcmUoYyA9PiBjLk5hbWUgIT0gVy5wUHIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1BhcmE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gQ29uam9pblRyYW5zZm9ybShuKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIE1hcmtDb250ZW50QXNEZWxldGVkT3JJbnNlcnRlZChYRG9jdW1lbnQgbmV3WERvYywgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG5ld1Jvb3QgPSBNYXJrQ29udGVudEFzRGVsZXRlZE9ySW5zZXJ0ZWRUcmFuc2Zvcm0obmV3WERvYy5Sb290LCBzZXR0aW5ncyk7CisgICAgICAgICAgICBuZXdYRG9jLlJvb3QuUmVwbGFjZVdpdGgobmV3Um9vdCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgTWFya0NvbnRlbnRBc0RlbGV0ZWRPckluc2VydGVkVHJhbnNmb3JtKFhOb2RlIG5vZGUsIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcucikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXNMaXN0ID0gZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzVHJpbW1lZChXLnR4YnhDb250ZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGQgPT4gZC5OYW1lID09IFcudCB8fCBkLk5hbWUgPT0gVy5kZWxUZXh0IHx8IEFsbG93YWJsZVJ1bkNoaWxkcmVuLkNvbnRhaW5zKGQuTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhQdE9wZW5YbWwuU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChhID0+IChzdHJpbmcpYSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5EaXN0aW5jdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXNMaXN0LkNvdW50KCkgPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciAtIGhhdmUgYm90aCBkZWxldGVkIGFuZCBpbnNlcnRlZCB0ZXh0IGVsZW1lbnRzIGluIHRoZSBzYW1lIHJ1bi4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1c0xpc3QuQ291bnQoKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IE1hcmtDb250ZW50QXNEZWxldGVkT3JJbnNlcnRlZFRyYW5zZm9ybShuLCBzZXR0aW5ncykpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1c0xpc3QuRmlyc3QoKSA9PSAiRGVsZXRlZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5hdXRob3IsIHNldHRpbmdzLkF1dGhvckZvclJldmlzaW9ucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5pZCwgc19NYXhJZCsrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmRhdGUsIHNldHRpbmdzLkRhdGVUaW1lRm9yUmV2aXNpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBNYXJrQ29udGVudEFzRGVsZXRlZE9ySW5zZXJ0ZWRUcmFuc2Zvcm0obiwgc2V0dGluZ3MpKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXR1c0xpc3QuRmlyc3QoKSA9PSAiSW5zZXJ0ZWQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcuaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuYXV0aG9yLCBzZXR0aW5ncy5BdXRob3JGb3JSZXZpc2lvbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuaWQsIHNfTWF4SWQrKyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5kYXRlLCBzZXR0aW5ncy5EYXRlVGltZUZvclJldmlzaW9ucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gTWFya0NvbnRlbnRBc0RlbGV0ZWRPckluc2VydGVkVHJhbnNmb3JtKG4sIHNldHRpbmdzKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5wUHIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gKHN0cmluZyllbGVtZW50LkF0dHJpYnV0ZShQdE9wZW5YbWwuU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLnBQciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gTWFya0NvbnRlbnRBc0RlbGV0ZWRPckluc2VydGVkVHJhbnNmb3JtKG4sIHNldHRpbmdzKSkpOworICAgICAgICAgICAgICAgICAgICB2YXIgcFByID0gbmV3IFhFbGVtZW50KGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09ICJEZWxldGVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgclByID0gcFByLkVsZW1lbnQoVy5yUHIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJQciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJQciA9IG5ldyBYRWxlbWVudChXLnJQcik7CisgICAgICAgICAgICAgICAgICAgICAgICByUHIuQWRkKG5ldyBYRWxlbWVudChXLmRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmF1dGhvciwgc2V0dGluZ3MuQXV0aG9yRm9yUmV2aXNpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmlkLCBzX01heElkKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuZGF0ZSwgc2V0dGluZ3MuRGF0ZVRpbWVGb3JSZXZpc2lvbnMpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFByLkVsZW1lbnQoVy5yUHIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByLkVsZW1lbnQoVy5yUHIpLlJlcGxhY2VXaXRoKHJQcik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByLkFkZEZpcnN0KHJQcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdHVzID09ICJJbnNlcnRlZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHJQciA9IHBQci5FbGVtZW50KFcuclByKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyUHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByUHIgPSBuZXcgWEVsZW1lbnQoVy5yUHIpOworICAgICAgICAgICAgICAgICAgICAgICAgclByLkFkZChuZXcgWEVsZW1lbnQoVy5pbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5hdXRob3IsIHNldHRpbmdzLkF1dGhvckZvclJldmlzaW9ucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5pZCwgc19NYXhJZCsrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmRhdGUsIHNldHRpbmdzLkRhdGVUaW1lRm9yUmV2aXNpb25zKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQci5FbGVtZW50KFcuclByKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQci5FbGVtZW50KFcuclByKS5SZXBsYWNlV2l0aChyUHIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQci5BZGRGaXJzdChyUHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBQcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBNYXJrQ29udGVudEFzRGVsZXRlZE9ySW5zZXJ0ZWRUcmFuc2Zvcm0obiwgc2V0dGluZ3MpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRml4VXBSZXZpc2lvbklkcyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2NXaXRoUmV2aXNpb25zLCBYRG9jdW1lbnQgbmV3WERvYykKKyAgICAgICAgeworICAgICAgICAgICAgSUVudW1lcmFibGU8WEVsZW1lbnQ+IGZvb3Rub3RlUmV2aXNpb25zID0gRW51bWVyYWJsZS5FbXB0eTxYRWxlbWVudD4oKTsKKyAgICAgICAgICAgIGlmICh3RG9jV2l0aFJldmlzaW9ucy5NYWluRG9jdW1lbnRQYXJ0LkZvb3Rub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZm54ZCA9IHdEb2NXaXRoUmV2aXNpb25zLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBmb290bm90ZVJldmlzaW9ucyA9IGZueGQKKyAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGQgPT4gZC5OYW1lID09IFcuaW5zIHx8IGQuTmFtZSA9PSBXLmRlbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gZW5kbm90ZVJldmlzaW9ucyA9IEVudW1lcmFibGUuRW1wdHk8WEVsZW1lbnQ+KCk7CisgICAgICAgICAgICBpZiAod0RvY1dpdGhSZXZpc2lvbnMuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZm54ZCA9IHdEb2NXaXRoUmV2aXNpb25zLk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIGVuZG5vdGVSZXZpc2lvbnMgPSBmbnhkCisgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cygpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShkID0+IGQuTmFtZSA9PSBXLmlucyB8fCBkLk5hbWUgPT0gVy5kZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIG1haW5SZXZpc2lvbnMgPSBuZXdYRG9jCisgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBkLk5hbWUgPT0gVy5pbnMgfHwgZC5OYW1lID09IFcuZGVsKTsKKyAgICAgICAgICAgIHZhciBhbGxSZXZpc2lvbnMgPSBtYWluUmV2aXNpb25zCisgICAgICAgICAgICAgICAgLkNvbmNhdChmb290bm90ZVJldmlzaW9ucykKKyAgICAgICAgICAgICAgICAuQ29uY2F0KGVuZG5vdGVSZXZpc2lvbnMpCisgICAgICAgICAgICAgICAgLlNlbGVjdCgociwgaSkgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUmV2ID0gciwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkeCA9IGkgKyAxLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gYWxsUmV2aXNpb25zKQorICAgICAgICAgICAgICAgIGl0ZW0uUmV2LkF0dHJpYnV0ZShXLmlkKS5WYWx1ZSA9IGl0ZW0uSWR4LlRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAod0RvY1dpdGhSZXZpc2lvbnMuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgd0RvY1dpdGhSZXZpc2lvbnMuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgaWYgKHdEb2NXaXRoUmV2aXNpb25zLk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgd0RvY1dpdGhSZXZpc2lvbnMuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIElnbm9yZVB0MTROYW1lc3BhY2UoWEVsZW1lbnQgcm9vdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJvb3QuQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAicHQxNCIpID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm9vdC5BZGQobmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJwdDE0IiwgUHRPcGVuWG1sLnB0Lk5hbWVzcGFjZU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBpZ25vcmFibGUgPSAoc3RyaW5nKXJvb3QuQXR0cmlidXRlKE1DLklnbm9yYWJsZSk7CisgICAgICAgICAgICBpZiAoaWdub3JhYmxlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBpZ25vcmFibGUuU3BsaXQoJyAnKTsKKyAgICAgICAgICAgICAgICBpZiAoIWxpc3QuQ29udGFpbnMoInB0MTQiKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlnbm9yYWJsZSArPSAiIHB0MTQiOworICAgICAgICAgICAgICAgICAgICByb290LkF0dHJpYnV0ZShNQy5JZ25vcmFibGUpLlZhbHVlID0gaWdub3JhYmxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb290LkFkZChuZXcgWEF0dHJpYnV0ZShNQy5JZ25vcmFibGUsICJwdDE0IikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb2FsZXNjZUFkamFjZW50UnVuc1dpdGhJZGVudGljYWxGb3JtYXR0aW5nKFhEb2N1bWVudCB4RG9jKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyYXMgPSB4RG9jLlJvb3QuRGVzY2VuZGFudHNUcmltbWVkKFcudHhieENvbnRlbnQpLldoZXJlKGQgPT4gZC5OYW1lID09IFcucCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFyYSBpbiBwYXJhcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbmV3UGFyYSA9IFdvcmRwcm9jZXNzaW5nTUxVdGlsLkNvYWxlc2NlQWRqYWNlbnRSdW5zV2l0aElkZW50aWNhbEZvcm1hdHRpbmcocGFyYSk7CisgICAgICAgICAgICAgICAgcGFyYS5SZXBsYWNlTm9kZXMobmV3UGFyYS5Ob2RlcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHJvY2Vzc0Zvb3Rub3RlRW5kbm90ZSgKKyAgICAgICAgICAgIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MsCisgICAgICAgICAgICBMaXN0PENvbXBhcmlzb25Vbml0QXRvbT4gbGlzdE9mQ29tcGFyaXNvblVuaXRBdG9tcywKKyAgICAgICAgICAgIE1haW5Eb2N1bWVudFBhcnQgbWFpbkRvY3VtZW50UGFydEJlZm9yZSwKKyAgICAgICAgICAgIE1haW5Eb2N1bWVudFBhcnQgbWFpbkRvY3VtZW50UGFydEFmdGVyLAorICAgICAgICAgICAgWERvY3VtZW50IG1haW5Eb2N1bWVudFhEb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmb290bm90ZXNQYXJ0QmVmb3JlID0gbWFpbkRvY3VtZW50UGFydEJlZm9yZS5Gb290bm90ZXNQYXJ0OworICAgICAgICAgICAgdmFyIGVuZG5vdGVzUGFydEJlZm9yZSA9IG1haW5Eb2N1bWVudFBhcnRCZWZvcmUuRW5kbm90ZXNQYXJ0OworICAgICAgICAgICAgdmFyIGZvb3Rub3Rlc1BhcnRBZnRlciA9IG1haW5Eb2N1bWVudFBhcnRBZnRlci5Gb290bm90ZXNQYXJ0OworICAgICAgICAgICAgdmFyIGVuZG5vdGVzUGFydEFmdGVyID0gbWFpbkRvY3VtZW50UGFydEFmdGVyLkVuZG5vdGVzUGFydDsKKworICAgICAgICAgICAgWERvY3VtZW50IGZvb3Rub3Rlc1BhcnRCZWZvcmVYRG9jID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChmb290bm90ZXNQYXJ0QmVmb3JlICE9IG51bGwpCisgICAgICAgICAgICAgICAgZm9vdG5vdGVzUGFydEJlZm9yZVhEb2MgPSBmb290bm90ZXNQYXJ0QmVmb3JlLkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgWERvY3VtZW50IGZvb3Rub3Rlc1BhcnRBZnRlclhEb2MgPSBudWxsOworICAgICAgICAgICAgaWYgKGZvb3Rub3Rlc1BhcnRBZnRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZvb3Rub3Rlc1BhcnRBZnRlclhEb2MgPSBmb290bm90ZXNQYXJ0QWZ0ZXIuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBYRG9jdW1lbnQgZW5kbm90ZXNQYXJ0QmVmb3JlWERvYyA9IG51bGw7CisgICAgICAgICAgICBpZiAoZW5kbm90ZXNQYXJ0QmVmb3JlICE9IG51bGwpCisgICAgICAgICAgICAgICAgZW5kbm90ZXNQYXJ0QmVmb3JlWERvYyA9IGVuZG5vdGVzUGFydEJlZm9yZS5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFhEb2N1bWVudCBlbmRub3Rlc1BhcnRBZnRlclhEb2MgPSBudWxsOworICAgICAgICAgICAgaWYgKGVuZG5vdGVzUGFydEFmdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgZW5kbm90ZXNQYXJ0QWZ0ZXJYRG9jID0gZW5kbm90ZXNQYXJ0QWZ0ZXIuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIHZhciBwb3NzaWJseU1vZGlmaWVkRm9vdG5vdGVzRW5kTm90ZXMgPSBsaXN0T2ZDb21wYXJpc29uVW5pdEF0b21zCisgICAgICAgICAgICAgICAgLldoZXJlKGN1YSA9PgorICAgICAgICAgICAgICAgICAgICBjdWEuQ29udGVudEVsZW1lbnQuTmFtZSA9PSBXLmZvb3Rub3RlUmVmZXJlbmNlIHx8CisgICAgICAgICAgICAgICAgICAgIGN1YS5Db250ZW50RWxlbWVudC5OYW1lID09IFcuZW5kbm90ZVJlZmVyZW5jZSkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmbiBpbiBwb3NzaWJseU1vZGlmaWVkRm9vdG5vdGVzRW5kTm90ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGJlZm9yZUlkID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoZm4uQ29udGVudEVsZW1lbnRCZWZvcmUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYmVmb3JlSWQgPSAoc3RyaW5nKWZuLkNvbnRlbnRFbGVtZW50QmVmb3JlLkF0dHJpYnV0ZShXLmlkKTsKKyAgICAgICAgICAgICAgICB2YXIgYWZ0ZXJJZCA9IChzdHJpbmcpZm4uQ29udGVudEVsZW1lbnQuQXR0cmlidXRlKFcuaWQpOworCisgICAgICAgICAgICAgICAgWEVsZW1lbnQgZm9vdG5vdGVFbmRub3RlQmVmb3JlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBmb290bm90ZUVuZG5vdGVBZnRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgT3BlblhtbFBhcnQgcGFydFRvVXNlQmVmb3JlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBPcGVuWG1sUGFydCBwYXJ0VG9Vc2VBZnRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IHBhcnRUb1VzZUJlZm9yZVhEb2MgPSBudWxsOworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBwYXJ0VG9Vc2VBZnRlclhEb2MgPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKGZuLkNvcnJlbGF0aW9uU3RhdHVzID09IENvcnJlbGF0aW9uU3RhdHVzLkVxdWFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZuLkNvbnRlbnRFbGVtZW50Lk5hbWUgPT0gVy5mb290bm90ZVJlZmVyZW5jZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9vdG5vdGVFbmRub3RlQmVmb3JlID0gZm9vdG5vdGVzUGFydEJlZm9yZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGZubiA9PiAoc3RyaW5nKWZubi5BdHRyaWJ1dGUoVy5pZCkgPT0gYmVmb3JlSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9vdG5vdGVFbmRub3RlQWZ0ZXIgPSBmb290bm90ZXNQYXJ0QWZ0ZXJYRG9jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChmbm4gPT4gKHN0cmluZylmbm4uQXR0cmlidXRlKFcuaWQpID09IGFmdGVySWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFydFRvVXNlQmVmb3JlID0gZm9vdG5vdGVzUGFydEJlZm9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRUb1VzZUFmdGVyID0gZm9vdG5vdGVzUGFydEFmdGVyOworICAgICAgICAgICAgICAgICAgICAgICAgcGFydFRvVXNlQmVmb3JlWERvYyA9IGZvb3Rub3Rlc1BhcnRCZWZvcmVYRG9jOworICAgICAgICAgICAgICAgICAgICAgICAgcGFydFRvVXNlQWZ0ZXJYRG9jID0gZm9vdG5vdGVzUGFydEFmdGVyWERvYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvb3Rub3RlRW5kbm90ZUJlZm9yZSA9IGVuZG5vdGVzUGFydEJlZm9yZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGZubiA9PiAoc3RyaW5nKWZubi5BdHRyaWJ1dGUoVy5pZCkgPT0gYmVmb3JlSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9vdG5vdGVFbmRub3RlQWZ0ZXIgPSBlbmRub3Rlc1BhcnRBZnRlclhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGZubiA9PiAoc3RyaW5nKWZubi5BdHRyaWJ1dGUoVy5pZCkgPT0gYWZ0ZXJJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0VG9Vc2VCZWZvcmUgPSBlbmRub3Rlc1BhcnRCZWZvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0VG9Vc2VBZnRlciA9IGVuZG5vdGVzUGFydEFmdGVyOworICAgICAgICAgICAgICAgICAgICAgICAgcGFydFRvVXNlQmVmb3JlWERvYyA9IGVuZG5vdGVzUGFydEJlZm9yZVhEb2M7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0VG9Vc2VBZnRlclhEb2MgPSBlbmRub3Rlc1BhcnRBZnRlclhEb2M7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQWRkU2hhMUhhc2hUb0Jsb2NrTGV2ZWxDb250ZW50KHBhcnRUb1VzZUJlZm9yZSwgZm9vdG5vdGVFbmRub3RlQmVmb3JlLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIEFkZFNoYTFIYXNoVG9CbG9ja0xldmVsQ29udGVudChwYXJ0VG9Vc2VBZnRlciwgZm9vdG5vdGVFbmRub3RlQWZ0ZXIsIHNldHRpbmdzKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgZm5jYWwxID0gV21sQ29tcGFyZXIuQ3JlYXRlQ29tcGFyaXNvblVuaXRBdG9tTGlzdChwYXJ0VG9Vc2VCZWZvcmUsIGZvb3Rub3RlRW5kbm90ZUJlZm9yZSwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICB2YXIgZm5jdXMxID0gR2V0Q29tcGFyaXNvblVuaXRMaXN0KGZuY2FsMSwgc2V0dGluZ3MpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBmbmNhbDIgPSBXbWxDb21wYXJlci5DcmVhdGVDb21wYXJpc29uVW5pdEF0b21MaXN0KHBhcnRUb1VzZUFmdGVyLCBmb290bm90ZUVuZG5vdGVBZnRlciwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICB2YXIgZm5jdXMyID0gR2V0Q29tcGFyaXNvblVuaXRMaXN0KGZuY2FsMiwgc2V0dGluZ3MpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghIChmbmN1czEuTGVuZ3RoID09IDAgJiYgZm5jdXMyLkxlbmd0aCA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZuQ29ycmVsYXRlZFNlcXVlbmNlID0gTGNzKGZuY3VzMSwgZm5jdXMyLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzX0ZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gZm5Db3JyZWxhdGVkU2VxdWVuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpdGVtLlRvU3RyaW5nKCkpLkFwcGVuZChFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbC5Ob3RlUGFkKHNicyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhbnkgZGVsZXRlZCBvciBpbnNlcnRlZCByb3dzLCB3ZSBnbyBpbnRvIHRoZSB3OnRyUHIgcHJvcGVydGllcywgYW5kIGFkZCB0aGUgYXBwcm9wcmlhdGUgdzppbnMgb3IgdzpkZWwgZWxlbWVudCwgYW5kIHRoZXJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudCwgdGhlIGFwcHJvcHJpYXRlIHJvdyB3aWxsIGJlIG1hcmtlZCBhcyBkZWxldGVkIG9yIGluc2VydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgTWFya1Jvd3NBc0RlbGV0ZWRPckluc2VydGVkKHNldHRpbmdzLCBmbkNvcnJlbGF0ZWRTZXF1ZW5jZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgZ2V0cyBhIGZsYXR0ZW5lZCBsaXN0IG9mIENvbXBhcmlzb25Vbml0QXRvbXMsIHdpdGggc3RhdHVzIGluZGljYXRlZCBpbiBlYWNoIENvbXBhcmlzb25Vbml0QXRvbTogRGVsZXRlZCwgSW5zZXJ0ZWQsIG9yIEVxdWFsCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm5MaXN0T2ZDb21wYXJpc29uVW5pdEF0b21zID0gRmxhdHRlblRvQ29tcGFyaXNvblVuaXRBdG9tTGlzdChmbkNvcnJlbGF0ZWRTZXF1ZW5jZSwgc2V0dGluZ3MpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc19GYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGZuTGlzdE9mQ29tcGFyaXNvblVuaXRBdG9tcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0uVG9TdHJpbmcoKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYnMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLk5vdGVQYWQoc2JzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFjayA9IHNldCB0aGUgZ3VpZCBJRCBvZiB0aGUgdGFibGUsIHJvdywgb3IgY2VsbCBmcm9tIHRoZSAnYmVmb3JlJyBkb2N1bWVudCB0byBiZSBlcXVhbCB0byB0aGUgJ2FmdGVyJyBkb2N1bWVudC4KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSAtIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhlIGhhY2sgdW50aWwgYWZ0ZXIgZmxhdHRlbmluZyBhbGwgb2YgdGhlIGdyb3Vwcy4gIEF0IHRoZSBlbmQgb2YgdGhlIGZsYXR0ZW5pbmcsIHdlIHNob3VsZCBzaW1wbHkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgYSBsaXN0IG9mIENvbXBhcmlzb25Vbml0QXRvbXMsIGFwcHJvcHJpYXRlbHkgbWFya2VkIGFzIGVxdWFsLCBpbnNlcnRlZCwgb3IgZGVsZXRlZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhYmxlIGlkIHdpbGwgYmUgaGFja2VkIGluIHRoZSBub3JtYWwgY291cnNlIG9mIGV2ZW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIHdoZXJlIGEgcm93IGlzIGRlbGV0ZWQsIG5vdCBuZWNlc3NhcnkgdG8gaGFjayAtIHRoZSBkZWxldGVkIHJvdyBJRCB3aWxsIGRvLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugd2hlcmUgYSByb3cgaXMgaW5zZXJ0ZWQsIG5vdCBuZWNlc3NhcnkgdG8gaGFjayAtIHRoZSBpbnNlcnRlZCByb3cgSUQgd2lsbCBkbyBhcyB3ZWxsLgorICAgICAgICAgICAgICAgICAgICAgICAgQXNzZW1ibGVBbmNlc3RvclVuaWRzSW5PcmRlclRvUmVidWlsZFhtbFRyZWVQcm9wZXJseShmbkxpc3RPZkNvbXBhcmlzb25Vbml0QXRvbXMpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Rm9vdG5vdGVFbmRub3RlQ2hpbGRyZW4gPSBQcm9kdWNlTmV3V21sTWFya3VwRnJvbUNvcnJlbGF0ZWRTZXF1ZW5jZShwYXJ0VG9Vc2VBZnRlciwgZm5MaXN0T2ZDb21wYXJpc29uVW5pdEF0b21zLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEVsZW1lbnQgPSBuZXcgWEVsZW1lbnQoVy5ib2R5LCBuZXdGb290bm90ZUVuZG5vdGVDaGlsZHJlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGFzRm9vdG5vdGVSZWZlcmVuY2UgPSB0ZW1wRWxlbWVudC5EZXNjZW5kYW50cyhXLnIpLkFueShyID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmluZylyLkVsZW1lbnRzKFcuclByKS5FbGVtZW50cyhXLnJTdHlsZSkuQXR0cmlidXRlcyhXLnZhbCkuRmlyc3RPckRlZmF1bHQoKSA9PSAiRm9vdG5vdGVSZWZlcmVuY2UiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5EZXNjZW5kYW50cyhXLmZvb3Rub3RlUmVmKS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzRm9vdG5vdGVSZWZlcmVuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0UGFyYSA9IHRlbXBFbGVtZW50LkRlc2NlbmRhbnRzKFcucCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RQYXJhICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RSdW4gPSBmaXJzdFBhcmEuRWxlbWVudChXLnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RSdW4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZuLkNvbnRlbnRFbGVtZW50Lk5hbWUgPT0gVy5mb290bm90ZVJlZmVyZW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJ1bi5BZGRCZWZvcmVTZWxmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuclByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnJTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJGb290bm90ZVJlZmVyZW5jZSIpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5mb290bm90ZVJlZikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJ1bi5BZGRCZWZvcmVTZWxmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuclByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnJTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJFbmRub3RlUmVmZXJlbmNlIikpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLmVuZG5vdGVSZWYpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdUZW1wRWxlbWVudCA9IChYRWxlbWVudClXb3JkcHJvY2Vzc2luZ01MVXRpbC5XbWxPcmRlckVsZW1lbnRzUGVyU3RhbmRhcmQodGVtcEVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NvbnRlbnRFbGVtZW50ID0gbmV3VGVtcEVsZW1lbnQuRGVzY2VuZGFudHMoKS5GaXJzdE9yRGVmYXVsdChkID0+IGQuTmFtZSA9PSBXLmZvb3Rub3RlIHx8IGQuTmFtZSA9PSBXLmVuZG5vdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnRFbGVtZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9vdG5vdGVFbmRub3RlQWZ0ZXIuUmVwbGFjZU5vZGVzKG5ld0NvbnRlbnRFbGVtZW50Lk5vZGVzKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZuLkNvcnJlbGF0aW9uU3RhdHVzID09IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZuLkNvbnRlbnRFbGVtZW50Lk5hbWUgPT0gVy5mb290bm90ZVJlZmVyZW5jZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9vdG5vdGVFbmRub3RlQWZ0ZXIgPSBmb290bm90ZXNQYXJ0QWZ0ZXJYRG9jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChmbm4gPT4gKHN0cmluZylmbm4uQXR0cmlidXRlKFcuaWQpID09IGFmdGVySWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFydFRvVXNlQWZ0ZXIgPSBmb290bm90ZXNQYXJ0QWZ0ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0VG9Vc2VBZnRlclhEb2MgPSBmb290bm90ZXNQYXJ0QWZ0ZXJYRG9jOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9vdG5vdGVFbmRub3RlQWZ0ZXIgPSBlbmRub3Rlc1BhcnRBZnRlclhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGZubiA9PiAoc3RyaW5nKWZubi5BdHRyaWJ1dGUoVy5pZCkgPT0gYWZ0ZXJJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0VG9Vc2VBZnRlciA9IGVuZG5vdGVzUGFydEFmdGVyOworICAgICAgICAgICAgICAgICAgICAgICAgcGFydFRvVXNlQWZ0ZXJYRG9jID0gZW5kbm90ZXNQYXJ0QWZ0ZXJYRG9jOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQWRkU2hhMUhhc2hUb0Jsb2NrTGV2ZWxDb250ZW50KHBhcnRUb1VzZUFmdGVyLCBmb290bm90ZUVuZG5vdGVBZnRlciwgc2V0dGluZ3MpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBmbmNhbDIgPSBXbWxDb21wYXJlci5DcmVhdGVDb21wYXJpc29uVW5pdEF0b21MaXN0KHBhcnRUb1VzZUFmdGVyLCBmb290bm90ZUVuZG5vdGVBZnRlciwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICB2YXIgZm5jdXMyID0gR2V0Q29tcGFyaXNvblVuaXRMaXN0KGZuY2FsMiwgc2V0dGluZ3MpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRlZENvcnJTZXF1ID0gbmV3IExpc3Q8Q29ycmVsYXRlZFNlcXVlbmNlPigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmlzb25Vbml0QXJyYXkxID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJpc29uVW5pdEFycmF5MiA9IGZuY3VzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc19GYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGluc2VydGVkQ29yclNlcXUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0uVG9TdHJpbmcoKSkuQXBwZW5kKEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNicyA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbC5Ob3RlUGFkKHNicyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBNYXJrUm93c0FzRGVsZXRlZE9ySW5zZXJ0ZWQoc2V0dGluZ3MsIGluc2VydGVkQ29yclNlcXUpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBmbkxpc3RPZkNvbXBhcmlzb25Vbml0QXRvbXMgPSBGbGF0dGVuVG9Db21wYXJpc29uVW5pdEF0b21MaXN0KGluc2VydGVkQ29yclNlcXUsIHNldHRpbmdzKTsKKworICAgICAgICAgICAgICAgICAgICBBc3NlbWJsZUFuY2VzdG9yVW5pZHNJbk9yZGVyVG9SZWJ1aWxkWG1sVHJlZVByb3Blcmx5KGZuTGlzdE9mQ29tcGFyaXNvblVuaXRBdG9tcyk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0Zvb3Rub3RlRW5kbm90ZUNoaWxkcmVuID0gUHJvZHVjZU5ld1dtbE1hcmt1cEZyb21Db3JyZWxhdGVkU2VxdWVuY2UocGFydFRvVXNlQWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBmbkxpc3RPZkNvbXBhcmlzb25Vbml0QXRvbXMsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBFbGVtZW50ID0gbmV3IFhFbGVtZW50KFcuYm9keSwgbmV3Rm9vdG5vdGVFbmRub3RlQ2hpbGRyZW4pOworICAgICAgICAgICAgICAgICAgICB2YXIgaGFzRm9vdG5vdGVSZWZlcmVuY2UgPSB0ZW1wRWxlbWVudC5EZXNjZW5kYW50cyhXLnIpLkFueShyID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmluZylyLkVsZW1lbnRzKFcuclByKS5FbGVtZW50cyhXLnJTdHlsZSkuQXR0cmlidXRlcyhXLnZhbCkuRmlyc3RPckRlZmF1bHQoKSA9PSAiRm9vdG5vdGVSZWZlcmVuY2UiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuRGVzY2VuZGFudHMoVy5mb290bm90ZVJlZikuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaGFzRm9vdG5vdGVSZWZlcmVuY2UpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdFBhcmEgPSB0ZW1wRWxlbWVudC5EZXNjZW5kYW50cyhXLnApLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RQYXJhICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0UnVuID0gZmlyc3RQYXJhLkRlc2NlbmRhbnRzKFcucikuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RSdW4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbi5Db250ZW50RWxlbWVudC5OYW1lID09IFcuZm9vdG5vdGVSZWZlcmVuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJ1bi5BZGRCZWZvcmVTZWxmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnJQciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnJTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgIkZvb3Rub3RlUmVmZXJlbmNlIikpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuZm9vdG5vdGVSZWYpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UnVuLkFkZEJlZm9yZVNlbGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuclByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuclN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcudmFsLCAiRW5kbm90ZVJlZmVyZW5jZSIpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLmVuZG5vdGVSZWYpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld1RlbXBFbGVtZW50ID0gKFhFbGVtZW50KVdvcmRwcm9jZXNzaW5nTUxVdGlsLldtbE9yZGVyRWxlbWVudHNQZXJTdGFuZGFyZCh0ZW1wRWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDb250ZW50RWxlbWVudCA9IG5ld1RlbXBFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGQgPT4gZC5OYW1lID09IFcuZm9vdG5vdGUgfHwgZC5OYW1lID09IFcuZW5kbm90ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250ZW50RWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworICAgICAgICAgICAgICAgICAgICBmb290bm90ZUVuZG5vdGVBZnRlci5SZXBsYWNlTm9kZXMobmV3Q29udGVudEVsZW1lbnQuTm9kZXMoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZuLkNvcnJlbGF0aW9uU3RhdHVzID09IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZm4uQ29udGVudEVsZW1lbnQuTmFtZSA9PSBXLmZvb3Rub3RlUmVmZXJlbmNlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb290bm90ZUVuZG5vdGVCZWZvcmUgPSBmb290bm90ZXNQYXJ0QmVmb3JlWERvYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoZm5uID0+IChzdHJpbmcpZm5uLkF0dHJpYnV0ZShXLmlkKSA9PSBhZnRlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRUb1VzZUFmdGVyID0gZm9vdG5vdGVzUGFydEFmdGVyOworICAgICAgICAgICAgICAgICAgICAgICAgcGFydFRvVXNlQWZ0ZXJYRG9jID0gZm9vdG5vdGVzUGFydEFmdGVyWERvYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvb3Rub3RlRW5kbm90ZUJlZm9yZSA9IGVuZG5vdGVzUGFydEJlZm9yZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGZubiA9PiAoc3RyaW5nKWZubi5BdHRyaWJ1dGUoVy5pZCkgPT0gYWZ0ZXJJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0VG9Vc2VCZWZvcmUgPSBlbmRub3Rlc1BhcnRCZWZvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0VG9Vc2VCZWZvcmVYRG9jID0gZW5kbm90ZXNQYXJ0QmVmb3JlWERvYzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEFkZFNoYTFIYXNoVG9CbG9ja0xldmVsQ29udGVudChwYXJ0VG9Vc2VCZWZvcmUsIGZvb3Rub3RlRW5kbm90ZUJlZm9yZSwgc2V0dGluZ3MpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBmbmNhbDIgPSBXbWxDb21wYXJlci5DcmVhdGVDb21wYXJpc29uVW5pdEF0b21MaXN0KHBhcnRUb1VzZUJlZm9yZSwgZm9vdG5vdGVFbmRub3RlQmVmb3JlLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIHZhciBmbmN1czIgPSBHZXRDb21wYXJpc29uVW5pdExpc3QoZm5jYWwyLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRlbGV0ZWRDb3JyU2VxdSA9IG5ldyBMaXN0PENvcnJlbGF0ZWRTZXF1ZW5jZT4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJpc29uVW5pdEFycmF5MSA9IGZuY3VzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJpc29uVW5pdEFycmF5MiA9IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5EZWxldGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc19GYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGRlbGV0ZWRDb3JyU2VxdSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaXRlbS5Ub1N0cmluZygpKS5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLk5vdGVQYWQoc2JzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIE1hcmtSb3dzQXNEZWxldGVkT3JJbnNlcnRlZChzZXR0aW5ncywgZGVsZXRlZENvcnJTZXF1KTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgZm5MaXN0T2ZDb21wYXJpc29uVW5pdEF0b21zID0gRmxhdHRlblRvQ29tcGFyaXNvblVuaXRBdG9tTGlzdChkZWxldGVkQ29yclNlcXUsIHNldHRpbmdzKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZm5MaXN0T2ZDb21wYXJpc29uVW5pdEF0b21zLkFueSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlbWJsZUFuY2VzdG9yVW5pZHNJbk9yZGVyVG9SZWJ1aWxkWG1sVHJlZVByb3Blcmx5KGZuTGlzdE9mQ29tcGFyaXNvblVuaXRBdG9tcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdGb290bm90ZUVuZG5vdGVDaGlsZHJlbiA9IFByb2R1Y2VOZXdXbWxNYXJrdXBGcm9tQ29ycmVsYXRlZFNlcXVlbmNlKHBhcnRUb1VzZUJlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbkxpc3RPZkNvbXBhcmlzb25Vbml0QXRvbXMsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wRWxlbWVudCA9IG5ldyBYRWxlbWVudChXLmJvZHksIG5ld0Zvb3Rub3RlRW5kbm90ZUNoaWxkcmVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoYXNGb290bm90ZVJlZmVyZW5jZSA9IHRlbXBFbGVtZW50LkRlc2NlbmRhbnRzKFcucikuQW55KHIgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyaW5nKXIuRWxlbWVudHMoVy5yUHIpLkVsZW1lbnRzKFcuclN0eWxlKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpID09ICJGb290bm90ZVJlZmVyZW5jZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLkRlc2NlbmRhbnRzKFcuZm9vdG5vdGVSZWYpLkFueSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNGb290bm90ZVJlZmVyZW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RQYXJhID0gdGVtcEVsZW1lbnQuRGVzY2VuZGFudHMoVy5wKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFBhcmEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdFJ1biA9IGZpcnN0UGFyYS5EZXNjZW5kYW50cyhXLnIpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFJ1biAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm4uQ29udGVudEVsZW1lbnQuTmFtZSA9PSBXLmZvb3Rub3RlUmVmZXJlbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UnVuLkFkZEJlZm9yZVNlbGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yUHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuclN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgIkZvb3Rub3RlUmVmZXJlbmNlIikpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLmZvb3Rub3RlUmVmKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UnVuLkFkZEJlZm9yZVNlbGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yUHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuclN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgIkVuZG5vdGVSZWZlcmVuY2UiKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuZW5kbm90ZVJlZikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld1RlbXBFbGVtZW50ID0gKFhFbGVtZW50KVdvcmRwcm9jZXNzaW5nTUxVdGlsLldtbE9yZGVyRWxlbWVudHNQZXJTdGFuZGFyZCh0ZW1wRWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q29udGVudEVsZW1lbnQgPSBuZXdUZW1wRWxlbWVudC5EZXNjZW5kYW50cygpLkZpcnN0T3JEZWZhdWx0KGQgPT4gZC5OYW1lID09IFcuZm9vdG5vdGUgfHwgZC5OYW1lID09IFcuZW5kbm90ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29udGVudEVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb290bm90ZUVuZG5vdGVCZWZvcmUuUmVwbGFjZU5vZGVzKG5ld0NvbnRlbnRFbGVtZW50Lk5vZGVzKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZWN0aWZ5Rm9vdG5vdGVFbmRub3RlSWRzKAorICAgICAgICAgICAgTWFpbkRvY3VtZW50UGFydCBtYWluRG9jdW1lbnRQYXJ0QmVmb3JlLAorICAgICAgICAgICAgTWFpbkRvY3VtZW50UGFydCBtYWluRG9jdW1lbnRQYXJ0QWZ0ZXIsCisgICAgICAgICAgICBNYWluRG9jdW1lbnRQYXJ0IG1haW5Eb2N1bWVudFBhcnRXaXRoUmV2aXNpb25zLAorICAgICAgICAgICAgWERvY3VtZW50IG1haW5Eb2N1bWVudFhEb2MsCisgICAgICAgICAgICBXbWxDb21wYXJlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZm9vdG5vdGVzUGFydEJlZm9yZSA9IG1haW5Eb2N1bWVudFBhcnRCZWZvcmUuRm9vdG5vdGVzUGFydDsKKyAgICAgICAgICAgIHZhciBlbmRub3Rlc1BhcnRCZWZvcmUgPSBtYWluRG9jdW1lbnRQYXJ0QmVmb3JlLkVuZG5vdGVzUGFydDsKKyAgICAgICAgICAgIHZhciBmb290bm90ZXNQYXJ0QWZ0ZXIgPSBtYWluRG9jdW1lbnRQYXJ0QWZ0ZXIuRm9vdG5vdGVzUGFydDsKKyAgICAgICAgICAgIHZhciBlbmRub3Rlc1BhcnRBZnRlciA9IG1haW5Eb2N1bWVudFBhcnRBZnRlci5FbmRub3Rlc1BhcnQ7CisgICAgICAgICAgICB2YXIgZm9vdG5vdGVzUGFydFdpdGhSZXZpc2lvbnMgPSBtYWluRG9jdW1lbnRQYXJ0V2l0aFJldmlzaW9ucy5Gb290bm90ZXNQYXJ0OworICAgICAgICAgICAgdmFyIGVuZG5vdGVzUGFydFdpdGhSZXZpc2lvbnMgPSBtYWluRG9jdW1lbnRQYXJ0V2l0aFJldmlzaW9ucy5FbmRub3Rlc1BhcnQ7CisKKyAgICAgICAgICAgIFhEb2N1bWVudCBmb290bm90ZXNQYXJ0QmVmb3JlWERvYyA9IG51bGw7CisgICAgICAgICAgICBpZiAoZm9vdG5vdGVzUGFydEJlZm9yZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZvb3Rub3Rlc1BhcnRCZWZvcmVYRG9jID0gZm9vdG5vdGVzUGFydEJlZm9yZS5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgWERvY3VtZW50IGZvb3Rub3Rlc1BhcnRBZnRlclhEb2MgPSBudWxsOworICAgICAgICAgICAgaWYgKGZvb3Rub3Rlc1BhcnRBZnRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZvb3Rub3Rlc1BhcnRBZnRlclhEb2MgPSBmb290bm90ZXNQYXJ0QWZ0ZXIuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIFhEb2N1bWVudCBmb290bm90ZXNQYXJ0V2l0aFJldmlzaW9uc1hEb2MgPSBudWxsOworICAgICAgICAgICAgaWYgKGZvb3Rub3Rlc1BhcnRXaXRoUmV2aXNpb25zICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9vdG5vdGVzUGFydFdpdGhSZXZpc2lvbnNYRG9jID0gZm9vdG5vdGVzUGFydFdpdGhSZXZpc2lvbnMuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgZm9vdG5vdGVzUGFydFdpdGhSZXZpc2lvbnNYRG9jCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmZvb3Rub3RlKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuaWQpICE9ICItMSIgJiYgKHN0cmluZyllLkF0dHJpYnV0ZShXLmlkKSAhPSAiMCIpCisgICAgICAgICAgICAgICAgICAgIC5SZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgWERvY3VtZW50IGVuZG5vdGVzUGFydEJlZm9yZVhEb2MgPSBudWxsOworICAgICAgICAgICAgaWYgKGVuZG5vdGVzUGFydEJlZm9yZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGVuZG5vdGVzUGFydEJlZm9yZVhEb2MgPSBlbmRub3Rlc1BhcnRCZWZvcmUuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIFhEb2N1bWVudCBlbmRub3Rlc1BhcnRBZnRlclhEb2MgPSBudWxsOworICAgICAgICAgICAgaWYgKGVuZG5vdGVzUGFydEFmdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgZW5kbm90ZXNQYXJ0QWZ0ZXJYRG9jID0gZW5kbm90ZXNQYXJ0QWZ0ZXIuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIFhEb2N1bWVudCBlbmRub3Rlc1BhcnRXaXRoUmV2aXNpb25zWERvYyA9IG51bGw7CisgICAgICAgICAgICBpZiAoZW5kbm90ZXNQYXJ0V2l0aFJldmlzaW9ucyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVuZG5vdGVzUGFydFdpdGhSZXZpc2lvbnNYRG9jID0gZW5kbm90ZXNQYXJ0V2l0aFJldmlzaW9ucy5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBlbmRub3Rlc1BhcnRXaXRoUmV2aXNpb25zWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5lbmRub3RlKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuaWQpICE9ICItMSIgJiYgKHN0cmluZyllLkF0dHJpYnV0ZShXLmlkKSAhPSAiMCIpCisgICAgICAgICAgICAgICAgICAgIC5SZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGZvb3Rub3Rlc1JlZnMgPSBtYWluRG9jdW1lbnRYRG9jCisgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKFcuZm9vdG5vdGVSZWZlcmVuY2UpCisgICAgICAgICAgICAgICAgLlNlbGVjdCgoZm4sIGlkeCkgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRm9vdE5vdGUgPSBmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkeCA9IGlkeCwKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZuIGluIGZvb3Rub3Rlc1JlZnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG9sZElkID0gKHN0cmluZylmbi5Gb290Tm90ZS5BdHRyaWJ1dGUoVy5pZCk7CisgICAgICAgICAgICAgICAgdmFyIG5ld0lkID0gKGZuLklkeCArIDEpLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgZm4uRm9vdE5vdGUuQXR0cmlidXRlKFcuaWQpLlZhbHVlID0gbmV3SWQ7CisgICAgICAgICAgICAgICAgdmFyIGZvb3Rub3RlID0gZm9vdG5vdGVzUGFydEFmdGVyWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuaWQpID09IG9sZElkKTsKKyAgICAgICAgICAgICAgICBpZiAoZm9vdG5vdGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvb3Rub3RlID0gZm9vdG5vdGVzUGFydEJlZm9yZVhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGUgPT4gKHN0cmluZyllLkF0dHJpYnV0ZShXLmlkKSA9PSBvbGRJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmb290bm90ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIGVycm9yIik7CisgICAgICAgICAgICAgICAgdmFyIGNsb25lZCA9IG5ldyBYRWxlbWVudChmb290bm90ZSk7CisgICAgICAgICAgICAgICAgY2xvbmVkLkF0dHJpYnV0ZShXLmlkKS5WYWx1ZSA9IG5ld0lkOworICAgICAgICAgICAgICAgIGZvb3Rub3Rlc1BhcnRXaXRoUmV2aXNpb25zWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuQWRkKGNsb25lZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBlbmRub3Rlc1JlZnMgPSBtYWluRG9jdW1lbnRYRG9jCisgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKFcuZW5kbm90ZVJlZmVyZW5jZSkKKyAgICAgICAgICAgICAgICAuU2VsZWN0KChmbiwgaWR4KSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFbmRub3RlID0gZm4sCisgICAgICAgICAgICAgICAgICAgICAgICBJZHggPSBpZHgsCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmbiBpbiBlbmRub3Rlc1JlZnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG9sZElkID0gKHN0cmluZylmbi5FbmRub3RlLkF0dHJpYnV0ZShXLmlkKTsKKyAgICAgICAgICAgICAgICB2YXIgbmV3SWQgPSAoZm4uSWR4ICsgMSkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBmbi5FbmRub3RlLkF0dHJpYnV0ZShXLmlkKS5WYWx1ZSA9IG5ld0lkOworICAgICAgICAgICAgICAgIHZhciBlbmRub3RlID0gZW5kbm90ZXNQYXJ0QWZ0ZXJYRG9jCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChlID0+IChzdHJpbmcpZS5BdHRyaWJ1dGUoVy5pZCkgPT0gb2xkSWQpOworICAgICAgICAgICAgICAgIGlmIChlbmRub3RlID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbmRub3RlID0gZW5kbm90ZXNQYXJ0QmVmb3JlWERvYworICAgICAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoZSA9PiAoc3RyaW5nKWUuQXR0cmlidXRlKFcuaWQpID09IG9sZElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVuZG5vdGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworICAgICAgICAgICAgICAgIHZhciBjbG9uZWQgPSBuZXcgWEVsZW1lbnQoZW5kbm90ZSk7CisgICAgICAgICAgICAgICAgY2xvbmVkLkF0dHJpYnV0ZShXLmlkKS5WYWx1ZSA9IG5ld0lkOworICAgICAgICAgICAgICAgIGVuZG5vdGVzUGFydFdpdGhSZXZpc2lvbnNYRG9jCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5BZGQoY2xvbmVkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvb3Rub3Rlc1BhcnRXaXRoUmV2aXNpb25zWERvYyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1hcmtDb250ZW50QXNEZWxldGVkT3JJbnNlcnRlZChmb290bm90ZXNQYXJ0V2l0aFJldmlzaW9uc1hEb2MsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICBDb2FsZXNjZUFkamFjZW50UnVuc1dpdGhJZGVudGljYWxGb3JtYXR0aW5nKGZvb3Rub3Rlc1BhcnRXaXRoUmV2aXNpb25zWERvYyk7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3WERvY1Jvb3QgPSAoWEVsZW1lbnQpV29yZHByb2Nlc3NpbmdNTFV0aWwuV21sT3JkZXJFbGVtZW50c1BlclN0YW5kYXJkKGZvb3Rub3Rlc1BhcnRXaXRoUmV2aXNpb25zWERvYy5Sb290KTsKKyAgICAgICAgICAgICAgICBmb290bm90ZXNQYXJ0V2l0aFJldmlzaW9uc1hEb2MuUm9vdC5SZXBsYWNlV2l0aChuZXdYRG9jUm9vdCk7CisgICAgICAgICAgICAgICAgSWdub3JlUHQxNE5hbWVzcGFjZShmb290bm90ZXNQYXJ0V2l0aFJldmlzaW9uc1hEb2MuUm9vdCk7CisgICAgICAgICAgICAgICAgZm9vdG5vdGVzUGFydFdpdGhSZXZpc2lvbnMuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW5kbm90ZXNQYXJ0V2l0aFJldmlzaW9uc1hEb2MgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNYXJrQ29udGVudEFzRGVsZXRlZE9ySW5zZXJ0ZWQoZW5kbm90ZXNQYXJ0V2l0aFJldmlzaW9uc1hEb2MsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICBDb2FsZXNjZUFkamFjZW50UnVuc1dpdGhJZGVudGljYWxGb3JtYXR0aW5nKGVuZG5vdGVzUGFydFdpdGhSZXZpc2lvbnNYRG9jKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdYRG9jUm9vdCA9IChYRWxlbWVudClXb3JkcHJvY2Vzc2luZ01MVXRpbC5XbWxPcmRlckVsZW1lbnRzUGVyU3RhbmRhcmQoZW5kbm90ZXNQYXJ0V2l0aFJldmlzaW9uc1hEb2MuUm9vdCk7CisgICAgICAgICAgICAgICAgZW5kbm90ZXNQYXJ0V2l0aFJldmlzaW9uc1hEb2MuUm9vdC5SZXBsYWNlV2l0aChuZXdYRG9jUm9vdCk7CisgICAgICAgICAgICAgICAgSWdub3JlUHQxNE5hbWVzcGFjZShlbmRub3Rlc1BhcnRXaXRoUmV2aXNpb25zWERvYy5Sb290KTsKKyAgICAgICAgICAgICAgICBlbmRub3Rlc1BhcnRXaXRoUmV2aXNpb25zLlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIEhlcmUgaXMgdGhlIGNydXggb2YgdGhlIGZpeCB0byB0aGUgYWxnb3JpdGhtLiAgQWZ0ZXIgYXNzZW1ibGluZyB0aGUgZW50aXJlIGxpc3Qgb2YgQ29tcGFyaXNvblVuaXRBdG9tcywgd2UgZG8gdGhlIGZvbGxvd2luZzoKKyAgICAgICAgLy8vIC0gRmlyc3QsIGZpZ3VyZSBvdXQgdGhlIG1heGltdW0gaGllcmFyY2h5IGRlcHRoLCBjb25zaWRlcmluZyBvbmx5IHBhcmFncmFwaHMsIHR4YngsIHR4YnhDb250ZW50LCB0YWJsZXMsIHJvd3MsIGNlbGxzLCBhbmQgY29udGVudCBjb250cm9scy4KKyAgICAgICAgLy8vIC0gRm9yIGRvY3VtZW50cyB0aGF0IGRvIG5vdCBjb250YWluIHRhYmxlcywgbm9yIHRleHQgYm94ZXMsIHRoaXMgbWF4aW11bSBoaWVyYXJjaHkgZGVwdGggd2lsbCBhbHdheXMgYmUgMS4KKyAgICAgICAgLy8vIC0gRm9yIGF0b21zIHdpdGhpbiBhIHRhYmxlLCB0aGUgZGVwdGggd2lsbCBiZSA0LiAgVGhlIGZpcnN0IGxldmVsIGlzIHRoZSB0YWJsZSwgdGhlIHNlY29uZCBsZXZlbCBpcyByb3csIHRoaXJkIGlzIGNlbGwsIGZvdXJ0aCBpcyBwYXJhZ3JhcGguCisgICAgICAgIC8vLyAtIEZvciBhdG9tcyB3aXRoaW4gYSBuZXN0ZWQgdGFibGUsIHRoZSBkZXB0aCB3aWxsIGJlIDc6ICBUYWJsZSAvIFJvdyAvIENlbGwgLyBUYWJsZSAvIFJvdyAvIENlbGwgLyBQYXJhZ3JhcGgKKyAgICAgICAgLy8vIC0gRm9yIGF0b21zIHdpdGhpbiBhIHRleHQgYm94LCB0aGUgZGVwdGggd2lsbCBiZSAzOiBQYXJhZ3JhcGggLyB0eGJ4Q29udGVudCAvIFBhcmFncmFwaAorICAgICAgICAvLy8gLSBGb3IgYXRvbXMgd2l0aGluIGEgdGFibGUgaW4gYSB0ZXh0IGJveCwgdGhlIGRlcHRoIHdpbGwgYmUgNTogIFBhcmFncmFwaCAvIHR4YnhDb250ZW50IC8gVGFibGUgLyBSb3cgLyBDZWxsIC8gUGFyYWdyYXBoCisgICAgICAgIC8vLyBJbiBhbnkgY2FzZSwgd2UgZmlndXJlIG91dCB0aGUgbWF4aW11bSBkZXB0aC4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gVGhlbiB3ZSBpdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgY29udGVudCBhdG9tcyBiYWNrd2FyZHMuICBXZSBkbyB0aGlzIG4gdGltZXMsIHdoZXJlIG4gaXMgdGhlIG1heGltdW0gZGVwdGguCisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIEF0IGVhY2ggbGV2ZWwsIHdlIGZpbmQgYSBwYXJhZ3JhcGggbWFyaywgYW5kIHdvcmtpbmcgYmFja3dhcmRzLCB3ZSBzZXQgdGhlIGd1aWRzIGluIHRoZSBoaWVyYXJjaHkgc28gdGhhdCB0aGUgY29udGVudCB3aWxsIGJlIGFzc2VtYmxlZCB0b2dldGhlciBjb3JyZWN0bHkuCisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIEZvciBlYWNoIGl0ZXJhdGlvbiwgd2Ugb25seSBzZXQgdW5pZHMgYXQgdGhlIGxldmVsIHRoYXQgd2UgYXJlIHdvcmtpbmcgYXQuCisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIFNvIGZpcnN0IHdlIHdpbGwgc2V0IGFsbCB1bmlkcyBhdCBsZXZlbCAxLiAgV2hlbiB3ZSBmaW5kIGEgcGFyYWdyYXBoIG1hcmssIHdlIGdldCB0aGUgdW5pZCBmb3IgdGhhdCBsZXZlbCwgYW5kIHRoZW4gd29ya2luZyBiYWNrd2FyZHMsIHVudGlsIHdlIGZpbmQgYW5vdGhlcgorICAgICAgICAvLy8gcGFyYWdyYXBoIG1hcmssIHdlIHNldCBhbGwgdW5pZHMgYXQgbGV2ZWwgMSB0byB0aGUgc2FtZSB1bmlkIGFzIGxldmVsIDEgb2YgdGhlIHBhcmFncmFwaCBtYXJrLgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyBUaGVuIHdlIHNldCBhbGwgdW5pZHMgYXQgbGV2ZWwgMi4gIFdoZW4gd2UgZmluZCBhIHBhcmFncmFwaCBtYXJrLCB3ZSBnZXQgdGhlIHVuaWQgZm9yIHRoYXQgbGV2ZWwsIGFuZCB0aGVuIHdvcmtpbmcgYmFja3dhcmRzLCB1bnRpbCB3ZSBmaW5kIGFub3RoZXIgcGFyYWdyYXBoCisgICAgICAgIC8vLyBtYXJrLCB3ZSBzZXQgYWxsIHVuaWRzIGF0IGxldmVsIDIgdG8gdGhlIHNhbWUgdW5pZCBhcyBsZXZlbCAyIG9mIHRoZSBwYXJhZ3JhcGggbWFyay4gIEF0IHNvbWUgcG9pbnQsIHdlIHdpbGwgZmluZCBhIHBhcmFncmFwaCBtYXJrIHdpdGggbm8gbGV2ZWwgMi4gIFRoaXMgaXMKKyAgICAgICAgLy8vIG5vdCBhIHByb2JsZW0uICBXZSBzdG9wIHNldHRpbmcgYW55dGhpbmcgdW50aWwgd2UgZmluZCBhbm90aGVyIHBhcmFncmFwaCBtYXJrIHRoYXQgaGFzIGEgbGV2ZWwgMiwgYXQgd2hpY2ggcG9pbnQgd2UgcmVzdW1lIHNldHRpbmcgdmFsdWVzIGF0IGxldmVsIDIuCisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIFNhbWUgcHJvY2VzcyBmb3IgbGV2ZWwgMywgYW5kIHNvIG9uLCB1bnRpbCB3ZSBoYXZlIHByb2Nlc3NlZCB0byB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgaGllcmFyY2h5LgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyBBdCB0aGUgZW5kIG9mIHRoaXMgcHJvY2Vzcywgd2Ugd2lsbCBiZSBhYmxlIHRvIGRvIHRoZSBjb2Fsc2NlIHJlY3Vyc2UgYWxnb3JpdGhtLCBhbmQgdGhlIGNvbnRlbnQgYXRvbSBsaXN0IHdpbGwgYmUgcHV0IGJhY2sgdG9nZXRoZXIgaW50byBhIGJlYXV0aWZ1bCB0cmVlLAorICAgICAgICAvLy8gd2hlcmUgZXZlcnkgZWxlbWVudCBpcyBjb3JyZWN0bHkgcG9zaXRpb25lZCBpbiB0aGUgaGllcmFyY2h5LgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyBUaGlzIHNob3VsZCBhbHNvIHByb3Blcmx5IGFzc2VtYmxlIHRoZSB0ZXN0IHdoZXJlIGp1c3QgdGhlIHBhcmFncmFwaCBtYXJrcyBoYXZlIGJlZW4gZGVsZXRlZCBmb3IgYSByYW5nZSBvZiBwYXJhZ3JhcGhzLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIFRoZXJlIGlzIGFuIGludGVyZXN0aW5nIHRob3VnaHQgLSBpdCBpcyBwb3NzaWJsZSB0aGF0IEkgaGF2ZSBzZXQgdHdvIHJ1bnMgb2YgdGV4dCB0aGF0IHdlcmUgaW5pdGlhbGx5IGluIHRoZSBzYW1lIHBhcmFncmFwaCwgYnV0IHRoZW4gYWZ0ZXIKKyAgICAgICAgLy8vIHByb2Nlc3NpbmcsIHRoZXkgbWF0Y2ggdXAgdG8gdGV4dCBpbiBkaWZmZXJlbnQgcGFyYWdyYXBocy4gIFRoZXJlZm9yZSB0aGlzIHdpbGwgbm90IHdvcmsuICBXZSBuZWVkIHRvIGFjdHVhbGx5IGtlZXAgYSBsaXN0IG9mIHJlY29uc3RydWN0ZWQgYW5jZXN0b3IKKyAgICAgICAgLy8vIFVuaWRzLCBiZWNhdXNlIHRoZSBzYW1lIHBhcmFncmFwaCB3b3VsZCBnZXQgc2V0IHRvIHR3byBkaWZmZXJlbnQgSURzIC0gdHdvIENvbXBhcmlzb25Vbml0QXRvbXMgbmVlZCB0byBiZSBpbiBzZXBhcmF0ZSBwYXJhZ3JhcGhzIGluIHRoZSByZWNvbnN0cnVjdGVkCisgICAgICAgIC8vLyBkb2N1bWVudCwgYnV0IHRoZWlyIGFuY2VzdG9ycyBhY3R1YWxseSBwb2ludCB0byB0aGUgc2FtZSBwYXJhZ3JhcGguCisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIEZpeCB0aGlzIGluIHRoZSBhbGdvcml0aG0sIGFuZCBhbHNvIGtlZXAgdGhlIGFwcHJvcHJpYXRlIGxpc3QgaW4gQ29tcGFyaXNvblVuaXRBdG9tIGNsYXNzLgorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXNzZW1ibGVBbmNlc3RvclVuaWRzSW5PcmRlclRvUmVidWlsZFhtbFRyZWVQcm9wZXJseShMaXN0PENvbXBhcmlzb25Vbml0QXRvbT4gY29tcGFyaXNvblVuaXRBdG9tTGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNfRmFsc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBjb21wYXJpc29uVW5pdEF0b21MaXN0KQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaXRlbS5Ub1N0cmluZygpKS5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgdmFyIHNicyA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgVGVzdFV0aWwuTm90ZVBhZChzYnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGxvb3Agc2V0cyBhbGwgYW5jZXN0b3IgdW5pZHMgaW4gdGhlIGFmdGVyIGRvY3VtZW50IHRvIHRoZSB1bmlkcyBpbiB0aGUgYmVmb3JlIGRvY3VtZW50IGZvciBhbGwgcFByIHdoZXJlIHRoZSBzdGF0dXMgaXMgZXF1YWwuCisgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBhbHdheXMgYmUgdHJ1ZS4KKworICAgICAgICAgICAgLy8gb25lIGFkZGl0aW9uYWwgbW9kaWZpY2F0aW9uIHRvIG1ha2UgdG8gdGhpcyBsb29wIC0gd2hlcmUgd2UgZmluZCBhIHBQciBpbiBhIHRleHQgYm94LCB3ZSB3YW50IHRvIGRvIHRoaXMgYXMgd2VsbCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzdGF0dXMgaXMgZXF1YWwsIGluc2VydGVkLCBvciBkZWxldGVkLgorICAgICAgICAgICAgLy8gcmVhc29uIGJlaW5nIHRoYXQgdGhpcyBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBpbnNlcnRpb24gLyBkZWxldGlvbiBvZiB0ZXh0IGJveGVzIHRoZW1zZWx2ZXMuICBJZiBhIHRleHQgYm94IGlzIGluIHRoZSBiZWZvcmUgb3IgYWZ0ZXIgZG9jdW1lbnQsIGl0IHdpbGwgYmUgaW4gdGhlIGRvY3VtZW50IHRoYXQKKyAgICAgICAgICAgIC8vIGNvbnRhaW5zIGRlbHRhcy4gIEl0IG1heSBoYXZlIGluc2VydGVkIG9yIGRlbGV0ZWQgdGV4dCwgYnV0IHJlZ2FyZGxlc3MsIGl0IHdpbGwgYmUgaW4gdGhlIHJlc3VsdCBkb2N1bWVudC4KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjdWEgaW4gY29tcGFyaXNvblVuaXRBdG9tTGlzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZG9TZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoY3VhLkNvbnRlbnRFbGVtZW50Lk5hbWUgPT0gVy5wUHIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3VhLkFuY2VzdG9yRWxlbWVudHMuQW55KGFlID0+IGFlLk5hbWUgPT0gVy50eGJ4Q29udGVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBkb1NldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdWEuQ29ycmVsYXRpb25TdGF0dXMgPT0gQ29ycmVsYXRpb25TdGF0dXMuRXF1YWwpCisgICAgICAgICAgICAgICAgICAgICAgICBkb1NldCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkb1NldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjdWFCZWZvcmUgPSBjdWEuQ29tcGFyaXNvblVuaXRBdG9tQmVmb3JlOworICAgICAgICAgICAgICAgICAgICB2YXIgYW5jZXN0b3JzQWZ0ZXIgPSBjdWEuQW5jZXN0b3JFbGVtZW50czsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1YUJlZm9yZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYW5jZXN0b3JzQmVmb3JlID0gY3VhQmVmb3JlLkFuY2VzdG9yRWxlbWVudHM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JzQWZ0ZXIuTGVuZ3RoID09IGFuY2VzdG9yc0JlZm9yZS5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHppcHBlZCA9IGFuY2VzdG9yc0JlZm9yZS5aaXAoYW5jZXN0b3JzQWZ0ZXIsIChiLCBhKSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWZ0ZXIgPSBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVmb3JlID0gYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgeiBpbiB6aXBwZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWZ0ZXJVbmlkQXR0ID0gei5BZnRlci5BdHRyaWJ1dGUoUHRPcGVuWG1sLlVuaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmVmb3JlVW5pZEF0dCA9IHouQmVmb3JlLkF0dHJpYnV0ZShQdE9wZW5YbWwuVW5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlclVuaWRBdHQgIT0gbnVsbCAmJiBiZWZvcmVVbmlkQXR0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclVuaWRBdHQuVmFsdWUgPSBiZWZvcmVVbmlkQXR0LlZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNfRmFsc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBjb21wYXJpc29uVW5pdEF0b21MaXN0KQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaXRlbS5Ub1N0cmluZygpKS5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgdmFyIHNicyA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgVGVzdFV0aWwuTm90ZVBhZChzYnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgckNvbXBhcmlzb25Vbml0QXRvbUxpc3QgPSAoKElFbnVtZXJhYmxlPENvbXBhcmlzb25Vbml0QXRvbT4pY29tcGFyaXNvblVuaXRBdG9tTGlzdCkuUmV2ZXJzZSgpLlRvTGlzdCgpOworCisgICAgICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHNob3VsZCBhbHdheXMgc3VjY2VlZCwgYmVjYXVzZSB0aGVyZSB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiByQ29tcGFyaXNvblVuaXRBdG9tTGlzdCwgYW5kIHRoZXJlIHdpbGwgYWx3YXlzIGJlIGF0IGxlYXN0IG9uZQorICAgICAgICAgICAgLy8gYW5jZXN0b3IgaW4gQW5jZXN0b3JFbGVtZW50cworICAgICAgICAgICAgdmFyIGRlZXBlc3RBbmNlc3RvciA9IHJDb21wYXJpc29uVW5pdEF0b21MaXN0LkZpcnN0KCkuQW5jZXN0b3JFbGVtZW50cy5GaXJzdCgpOworICAgICAgICAgICAgdmFyIGRlZXBlc3RBbmNlc3Rvck5hbWUgPSBkZWVwZXN0QW5jZXN0b3IuTmFtZTsKKyAgICAgICAgICAgIHN0cmluZyBkZWVwZXN0QW5jZXN0b3JVbmlkID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChkZWVwZXN0QW5jZXN0b3JOYW1lID09IFcuZm9vdG5vdGUgfHwgZGVlcGVzdEFuY2VzdG9yTmFtZSA9PSBXLmVuZG5vdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVlcGVzdEFuY2VzdG9yVW5pZCA9IChzdHJpbmcpZGVlcGVzdEFuY2VzdG9yLkF0dHJpYnV0ZShQdE9wZW5YbWwuVW5pZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBJZiB0aGUgZm9sbG93aW5nIGxvb3AgZmluZHMgYSBwUHIgdGhhdCBpcyBpbiBhIHRleHQgYm94LCB0aGVuIGNvbnRpbnVlIG9uLCBwcm9jZXNzaW5nIHRoZSBwUHIgYW5kIGFsbCBvZiBpdHMgY29udGVudHMgYXMgdGhvdWdoIGl0IHdlcmUKKyAgICAgICAgICAgIC8vLyBjb250ZW50IGluIHRoZSBjb250YWluaW5nIHRleHQgYm94LiAgVGhpcyBpcyBnb2luZyB0byBsZWF2ZSBpdCBhZnRlciB0aGlzIGxvb3Agd2hlcmUgdGhlIEFuY2VzdG9yVW5pZHMgZm9yIHRoZSBjb250ZW50IGluIHRoZSB0ZXh0IGJveCB3aWxsIGJlCisgICAgICAgICAgICAvLy8gaW5jb21wbGV0ZS4gIFdlIHRoZW4gd2lsbCBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHJDb21wYXJpc29uVW5pdEF0b21MaXN0IGEgc2Vjb25kIHRpbWUsIHByb2Nlc3NpbmcgYWxsIG9mIHRoZSB0ZXh0IGJveGVzLgorCisgICAgICAgICAgICAvLy8gTm90ZSB0aGF0IHRoaXMgbWFrZXMgdGhlIGJhc2ljIGFzc3VtcHRpb24gdGhhdCBhIHRleHQgYm94IGNhbid0IGJlIG5lc3RlZCBpbnNpZGUgb2YgYSB0ZXh0IGJveCwgd2hpY2gsIGFzIGZhciBhcyBJIGtub3csIGlzIGEgZ29vZCBhc3N1bXB0aW9uLgorCisgICAgICAgICAgICAvLy8gVGhpcyBhbHNvIG1ha2VzIHRoZSBiYXNpYyBhc3N1bXB0aW9uIHRoYXQgYW4gZW5kbm90ZSAvIGZvb3Rub3RlIGNhbid0IGNvbnRhaW4gYSB0ZXh0IGJveCwgd2hpY2ggSSBiZWxpZXZlIGlzIGEgZ29vZCBhc3N1bXB0aW9uLgorCisKKyAgICAgICAgICAgIHN0cmluZ1tdIGN1cnJlbnRBbmNlc3RvclVuaWRzID0gbnVsbDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjdWEgaW4gckNvbXBhcmlzb25Vbml0QXRvbUxpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGN1YS5Db250ZW50RWxlbWVudC5OYW1lID09IFcucFByKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBQcl9pblRleHRCb3ggPSBjdWEKKyAgICAgICAgICAgICAgICAgICAgICAgIC5BbmNlc3RvckVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAuQW55KGFlID0+IGFlLk5hbWUgPT0gVy50eGJ4Q29udGVudCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwUHJfaW5UZXh0Qm94KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgY29sbGVjdCB0aGUgYW5jZXN0b3IgdW5pZHMgZm9yIHRoZSBwYXJhZ3JhcGguCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBteSBoeXBvdGhlc2lzIGlzIHRoYXQgdGhlc2UgYW5jZXN0b3IgdW5pZHMgc2hvdWxkIGJlIHRoZSBzYW1lIGZvciBhbGwgY29udGVudCB1bml0IGF0b21zIHdpdGhpbiB0aGF0IHBhcmFncmFwaC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRBbmNlc3RvclVuaWRzID0gY3VhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFuY2VzdG9yRWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGFlID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGhpc1VuaWQgPSAoc3RyaW5nKWFlLkF0dHJpYnV0ZShQdE9wZW5YbWwuVW5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzVW5pZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1VuaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VhLkFuY2VzdG9yVW5pZHMgPSBjdXJyZW50QW5jZXN0b3JVbmlkczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWVwZXN0QW5jZXN0b3JVbmlkICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VhLkFuY2VzdG9yVW5pZHNbMF0gPSBkZWVwZXN0QW5jZXN0b3JVbmlkOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgdGhpc0RlcHRoID0gY3VhLkFuY2VzdG9yRWxlbWVudHMuTGVuZ3RoOworICAgICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsQW5jZXN0b3JVbmlkcyA9IGN1YQorICAgICAgICAgICAgICAgICAgICAuQW5jZXN0b3JFbGVtZW50cworICAgICAgICAgICAgICAgICAgICAuU2tpcChjdXJyZW50QW5jZXN0b3JVbmlkcy5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoYWUgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRoaXNVbmlkID0gKHN0cmluZylhZS5BdHRyaWJ1dGUoUHRPcGVuWG1sLlVuaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNVbmlkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3VpZC5OZXdHdWlkKCkuVG9TdHJpbmcoKS5SZXBsYWNlKCItIiwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNVbmlkOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB2YXIgdGhpc0FuY2VzdG9yVW5pZHMgPSBjdXJyZW50QW5jZXN0b3JVbmlkcworICAgICAgICAgICAgICAgICAgICAuQ29uY2F0KGFkZGl0aW9uYWxBbmNlc3RvclVuaWRzKQorICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgICAgIGN1YS5BbmNlc3RvclVuaWRzID0gdGhpc0FuY2VzdG9yVW5pZHM7CisgICAgICAgICAgICAgICAgaWYgKGRlZXBlc3RBbmNlc3RvclVuaWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY3VhLkFuY2VzdG9yVW5pZHNbMF0gPSBkZWVwZXN0QW5jZXN0b3JVbmlkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc19GYWxzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGNvbXBhcmlzb25Vbml0QXRvbUxpc3QpCisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpdGVtLlRvU3RyaW5nKCkpLkFwcGVuZChFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBUZXN0VXRpbC5Ob3RlUGFkKHNicyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIHNlY29uZCBsb29wIHRoYXQgcHJvY2Vzc2VzIGFsbCB0ZXh0IGJveGVzLgorICAgICAgICAgICAgY3VycmVudEFuY2VzdG9yVW5pZHMgPSBudWxsOworICAgICAgICAgICAgYm9vbCBza2lwVW50aWxOZXh0UHByID0gZmFsc2U7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgY3VhIGluIHJDb21wYXJpc29uVW5pdEF0b21MaXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QW5jZXN0b3JVbmlkcyAhPSBudWxsICYmIGN1YS5BbmNlc3RvckVsZW1lbnRzLkxlbmd0aCA8IGN1cnJlbnRBbmNlc3RvclVuaWRzLkxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNraXBVbnRpbE5leHRQcHIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50QW5jZXN0b3JVbmlkcyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY3VhLkNvbnRlbnRFbGVtZW50Lk5hbWUgPT0gVy5wUHIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2lmIChzX1RydWUpCisgICAgICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgICAgICAvLyAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAvLyAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBjb21wYXJpc29uVW5pdEF0b21MaXN0KQorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgc2IuQXBwZW5kKGl0ZW0uVG9TdHJpbmcoKSkuQXBwZW5kKEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICAvLyAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgVGVzdFV0aWwuTm90ZVBhZChzYnMpOworICAgICAgICAgICAgICAgICAgICAvL30KKworICAgICAgICAgICAgICAgICAgICB2YXIgcFByX2luVGV4dEJveCA9IGN1YQorICAgICAgICAgICAgICAgICAgICAgICAgLkFuY2VzdG9yRWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5BbnkoYWUgPT4gYWUuTmFtZSA9PSBXLnR4YnhDb250ZW50KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXBQcl9pblRleHRCb3gpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBVbnRpbE5leHRQcHIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEFuY2VzdG9yVW5pZHMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwVW50aWxOZXh0UHByID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRBbmNlc3RvclVuaWRzID0gY3VhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFuY2VzdG9yRWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGFlID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGhpc1VuaWQgPSAoc3RyaW5nKWFlLkF0dHJpYnV0ZShQdE9wZW5YbWwuVW5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzVW5pZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1VuaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VhLkFuY2VzdG9yVW5pZHMgPSBjdXJyZW50QW5jZXN0b3JVbmlkczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHNraXBVbnRpbE5leHRQcHIpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgdmFyIHRoaXNEZXB0aCA9IGN1YS5BbmNlc3RvckVsZW1lbnRzLkxlbmd0aDsKKyAgICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbEFuY2VzdG9yVW5pZHMgPSBjdWEKKyAgICAgICAgICAgICAgICAgICAgLkFuY2VzdG9yRWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgLlNraXAoY3VycmVudEFuY2VzdG9yVW5pZHMuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGFlID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aGlzVW5pZCA9IChzdHJpbmcpYWUuQXR0cmlidXRlKFB0T3BlblhtbC5VbmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzVW5pZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCkuUmVwbGFjZSgiLSIsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzVW5pZDsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgdmFyIHRoaXNBbmNlc3RvclVuaWRzID0gY3VycmVudEFuY2VzdG9yVW5pZHMKKyAgICAgICAgICAgICAgICAgICAgLkNvbmNhdChhZGRpdGlvbmFsQW5jZXN0b3JVbmlkcykKKyAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBjdWEuQW5jZXN0b3JVbmlkcyA9IHRoaXNBbmNlc3RvclVuaWRzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc19GYWxzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGNvbXBhcmlzb25Vbml0QXRvbUxpc3QpCisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpdGVtLlRvU3RyaW5nQW5jZXN0b3JVbmlkcygpKS5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgdmFyIHNicyA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgVGVzdFV0aWwuTm90ZVBhZChzYnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBnZXRzIGEgZmxhdHRlbmVkIGxpc3Qgb2YgQ29tcGFyaXNvblVuaXRBdG9tcywgd2l0aCBzdGF0dXMgaW5kaWNhdGVkIGluIGVhY2ggQ29tcGFyaXNvblVuaXRBdG9tOiBEZWxldGVkLCBJbnNlcnRlZCwgb3IgRXF1YWwKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDb21wYXJpc29uVW5pdEF0b20+IEZsYXR0ZW5Ub0NvbXBhcmlzb25Vbml0QXRvbUxpc3QoTGlzdDxDb3JyZWxhdGVkU2VxdWVuY2U+IGNvcnJlbGF0ZWRTZXF1ZW5jZSwgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGxpc3RPZkNvbXBhcmlzb25Vbml0QXRvbXMgPSBjb3JyZWxhdGVkU2VxdWVuY2UKKyAgICAgICAgICAgICAgICAuU2VsZWN0KGNzID0+CisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gd3JpdGUgc29tZSBjb2RlIGhlcmUgdG8gZmluZCBvdXQgaWYgd2UgYXJlIGFzc2VtYmxpbmcgYSBwYXJhZ3JhcGggKG9yIGFueXRoaW5nKSB0aGF0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgdW5pZC4KKyAgICAgICAgICAgICAgICAgICAgLy8gd2h5IGRvIGFyZSB3ZSBkcm9wcGluZyBjb250ZW50Pz8/Pz8/PworICAgICAgICAgICAgICAgICAgICAvL3N0cmluZyBzZWFyY2hGb3IgPSAiMGVjYjkxODQiOworCisKKworCisKKworCisKKworCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNzLkNvcnJlbGF0aW9uU3RhdHVzID09IENvcnJlbGF0aW9uU3RhdHVzLkVxdWFsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudEF0b21zQmVmb3JlID0gY3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGNhID0+IGNhLkRlc2NlbmRhbnRDb250ZW50QXRvbXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0TWFueShtID0+IG0pOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudEF0b21zQWZ0ZXIgPSBjcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoY2EgPT4gY2EuRGVzY2VuZGFudENvbnRlbnRBdG9tcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3RNYW55KG0gPT4gbSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb21wYXJpc29uVW5pdEF0b21MaXN0ID0gY29udGVudEF0b21zQmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlppcChjb250ZW50QXRvbXNBZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJlZm9yZSwgYWZ0ZXIpID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFyaXNvblVuaXRBdG9tKGFmdGVyLkNvbnRlbnRFbGVtZW50LCBhZnRlci5BbmNlc3RvckVsZW1lbnRzLCBhZnRlci5QYXJ0LCBzZXR0aW5ncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkVxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRFbGVtZW50QmVmb3JlID0gYmVmb3JlLkNvbnRlbnRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmlzb25Vbml0QXRvbUJlZm9yZSA9IGJlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmlzb25Vbml0QXRvbUxpc3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3MuQ29ycmVsYXRpb25TdGF0dXMgPT0gQ29ycmVsYXRpb25TdGF0dXMuRGVsZXRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbXBhcmlzb25Vbml0QXRvbUxpc3QgPSBjcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoY2EgPT4gY2EuRGVzY2VuZGFudENvbnRlbnRBdG9tcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3RNYW55KG0gPT4gbSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGNhID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wYXJpc29uVW5pdEF0b20oY2EuQ29udGVudEVsZW1lbnQsIGNhLkFuY2VzdG9yRWxlbWVudHMsIGNhLlBhcnQsIHNldHRpbmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyaXNvblVuaXRBdG9tTGlzdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjcy5Db3JyZWxhdGlvblN0YXR1cyA9PSBDb3JyZWxhdGlvblN0YXR1cy5JbnNlcnRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbXBhcmlzb25Vbml0QXRvbUxpc3QgPSBjcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoY2EgPT4gY2EuRGVzY2VuZGFudENvbnRlbnRBdG9tcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3RNYW55KG0gPT4gbSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGNhID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wYXJpc29uVW5pdEF0b20oY2EuQ29udGVudEVsZW1lbnQsIGNhLkFuY2VzdG9yRWxlbWVudHMsIGNhLlBhcnQsIHNldHRpbmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJpc29uVW5pdEF0b21MaXN0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5TZWxlY3RNYW55KG0gPT4gbSkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIGlmIChzX0ZhbHNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gbGlzdE9mQ29tcGFyaXNvblVuaXRBdG9tcykKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0uVG9TdHJpbmcoKSkuQXBwZW5kKEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgIHZhciBzYnMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIFRlc3RVdGlsLk5vdGVQYWQoc2JzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGxpc3RPZkNvbXBhcmlzb25Vbml0QXRvbXM7CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3IgYW55IGRlbGV0ZWQgb3IgaW5zZXJ0ZWQgcm93cywgd2UgZ28gaW50byB0aGUgdzp0clByIHByb3BlcnRpZXMsIGFuZCBhZGQgdGhlIGFwcHJvcHJpYXRlIHc6aW5zIG9yIHc6ZGVsIGVsZW1lbnQsIGFuZCB0aGVyZWZvcmUKKyAgICAgICAgLy8gd2hlbiBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudCwgdGhlIGFwcHJvcHJpYXRlIHJvdyB3aWxsIGJlIG1hcmtlZCBhcyBkZWxldGVkIG9yIGluc2VydGVkLgorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIE1hcmtSb3dzQXNEZWxldGVkT3JJbnNlcnRlZChXbWxDb21wYXJlclNldHRpbmdzIHNldHRpbmdzLCBMaXN0PENvcnJlbGF0ZWRTZXF1ZW5jZT4gY29ycmVsYXRlZFNlcXVlbmNlKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZGNzIGluIGNvcnJlbGF0ZWRTZXF1ZW5jZS5XaGVyZShjcyA9PgorICAgICAgICAgICAgICAgIGNzLkNvcnJlbGF0aW9uU3RhdHVzID09IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQgfHwgY3MuQ29ycmVsYXRpb25TdGF0dXMgPT0gQ29ycmVsYXRpb25TdGF0dXMuSW5zZXJ0ZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBhbGwgZGVsZXRlZC9pbnNlcnRlZCBpdGVtcyBpbiBkY3MuQ29tcGFyaXNvblVuaXRBcnJheTEvQ29tcGFyaXNvblVuaXRBcnJheTIKKyAgICAgICAgICAgICAgICB2YXIgdG9JdGVyYXRlVGhyb3VnaCA9IGRjcy5Db21wYXJpc29uVW5pdEFycmF5MTsKKyAgICAgICAgICAgICAgICBpZiAoZGNzLkNvcnJlbGF0aW9uU3RhdHVzID09IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkKQorICAgICAgICAgICAgICAgICAgICB0b0l0ZXJhdGVUaHJvdWdoID0gZGNzLkNvbXBhcmlzb25Vbml0QXJyYXkyOworCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNhIGluIHRvSXRlcmF0ZVRocm91Z2gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY3VnID0gY2EgYXMgQ29tcGFyaXNvblVuaXRHcm91cDsKKworICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdvcmtzIGJlY2F1c2Ugd2Ugd2lsbCBuZXZlciBzZWUgYSB0YWJsZSBpbiB0aGlzIGxpc3QsIG9ubHkgcm93cy4gIElmIHRhYmxlcyB3ZXJlIGluIHRoaXMgbGlzdCwgd291bGQgbmVlZCB0byByZWN1cnNpdmVseQorICAgICAgICAgICAgICAgICAgICAvLyBnbyBpbnRvIGNoaWxkcmVuLCBidXQgdGFibGVzIGFyZSBhbHdheXMgZmxhdHRlbmVkIGluIHRoZSBMQ1MgcHJvY2Vzcy4KKworICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHdlIGhhdmUgYSByb3csIGl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRvIGZpbmQgdGhlIGZpcnN0IGNvbnRlbnQgYXRvbSBvZiB0aGUgcm93LCB0aGVuIGZpbmQgdGhlIHJvdyBhbmNlc3RvciwgYW5kIHRoZW4gdHdlYWsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHc6dHJQcgorCisgICAgICAgICAgICAgICAgICAgIGlmIChjdWcgIT0gbnVsbCAmJiBjdWcuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUgPT0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuUm93KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RDb250ZW50QXRvbSA9IGN1Zy5EZXNjZW5kYW50Q29udGVudEF0b21zKCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbnRlbnRBdG9tID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyID0gZmlyc3RDb250ZW50QXRvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BbmNlc3RvckVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJldmVyc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChhID0+IGEuTmFtZSA9PSBXLnRyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyUHIgPSB0ci5FbGVtZW50KFcudHJQcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJQciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyUHIgPSBuZXcgWEVsZW1lbnQoVy50clByKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ci5BZGRGaXJzdCh0clByKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhOYW1lIHJldlRyYWNrRWxlbWVudE5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRjcy5Db3JyZWxhdGlvblN0YXR1cyA9PSBDb3JyZWxhdGlvblN0YXR1cy5EZWxldGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldlRyYWNrRWxlbWVudE5hbWUgPSBXLmRlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRjcy5Db3JyZWxhdGlvblN0YXR1cyA9PSBDb3JyZWxhdGlvblN0YXR1cy5JbnNlcnRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZUcmFja0VsZW1lbnROYW1lID0gVy5pbnM7CisgICAgICAgICAgICAgICAgICAgICAgICB0clByLkFkZChuZXcgWEVsZW1lbnQocmV2VHJhY2tFbGVtZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmF1dGhvciwgc2V0dGluZ3MuQXV0aG9yRm9yUmV2aXNpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmlkLCBzX01heElkKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuZGF0ZSwgc2V0dGluZ3MuRGF0ZVRpbWVGb3JSZXZpc2lvbnMpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZW51bSBXbWxDb21wYXJlclJldmlzaW9uVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBJbnNlcnRlZCwKKyAgICAgICAgICAgIERlbGV0ZWQsCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgV21sQ29tcGFyZXJSZXZpc2lvbgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgV21sQ29tcGFyZXJSZXZpc2lvblR5cGUgUmV2aXNpb25UeXBlOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBUZXh0OworICAgICAgICAgICAgcHVibGljIHN0cmluZyBBdXRob3I7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIERhdGU7CisgICAgICAgICAgICBwdWJsaWMgWEVsZW1lbnQgQ29udGVudFhFbGVtZW50OworICAgICAgICAgICAgcHVibGljIFhFbGVtZW50IFJldmlzaW9uWEVsZW1lbnQ7CisgICAgICAgICAgICBwdWJsaWMgVXJpIFBhcnRVcmk7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIFBhcnRDb250ZW50VHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhOYW1lW10gUmV2RWxlbWVudHNXaXRoTm9UZXh0ID0gbmV3IFhOYW1lW10geworICAgICAgICAgICAgTS5vTWF0aCwKKyAgICAgICAgICAgIE0ub01hdGhQYXJhLAorICAgICAgICAgICAgVy5kcmF3aW5nLAorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxXbWxDb21wYXJlclJldmlzaW9uPiBHZXRSZXZpc2lvbnMoV21sRG9jdW1lbnQgc291cmNlLCBXbWxDb21wYXJlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKHNvdXJjZS5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgc291cmNlLkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtcywgdHJ1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUZXN0Rm9ySW52YWxpZENvbnRlbnQod0RvYyk7CisgICAgICAgICAgICAgICAgICAgIFJlbW92ZUV4aXN0aW5nUG93ZXJUb29sc01hcmt1cCh3RG9jKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudFBhcmVudCA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKS5Sb290LkVsZW1lbnQoVy5ib2R5KTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGF0b21MaXN0ID0gV21sQ29tcGFyZXIuQ3JlYXRlQ29tcGFyaXNvblVuaXRBdG9tTGlzdCh3RG9jLk1haW5Eb2N1bWVudFBhcnQsIGNvbnRlbnRQYXJlbnQsIHNldHRpbmdzKS5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNfRmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBhdG9tTGlzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaXRlbS5Ub1N0cmluZygpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLk5vdGVQYWQoc2JzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhciBncm91cGVkID0gYXRvbUxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Hcm91cEFkamFjZW50KGEgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYS5Db3JyZWxhdGlvblN0YXR1cy5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLkNvcnJlbGF0aW9uU3RhdHVzICE9IENvcnJlbGF0aW9uU3RhdHVzLkVxdWFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJ0ID0gbmV3IFhFbGVtZW50KGEuUmV2VHJhY2tFbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInciLCAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLlJldlRyYWNrRWxlbWVudC5BdHRyaWJ1dGVzKCkuV2hlcmUoYTIgPT4gYTIuTmFtZSAhPSBXLmlkICYmIGEyLk5hbWUgIT0gUHRPcGVuWG1sLlVuaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ICs9IHJ0LlRvU3RyaW5nKFNhdmVPcHRpb25zLkRpc2FibGVGb3JtYXR0aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJldmlzaW9ucyA9IGdyb3VwZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShrID0+IGsuS2V5ICE9ICJFcXVhbCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNfRmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiByZXZpc2lvbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0uS2V5ICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLk5vdGVQYWQoc2JzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhciBtYWluRG9jUGFydFJldmlzaW9uTGlzdCA9IHJldmlzaW9ucworICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChyZyA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXYgPSBuZXcgV21sQ29tcGFyZXJSZXZpc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZy5LZXkuU3RhcnRzV2l0aCgiSW5zZXJ0ZWQiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2LlJldmlzaW9uVHlwZSA9IFdtbENvbXBhcmVyUmV2aXNpb25UeXBlLkluc2VydGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJnLktleS5TdGFydHNXaXRoKCJEZWxldGVkIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldi5SZXZpc2lvblR5cGUgPSBXbWxDb21wYXJlclJldmlzaW9uVHlwZS5EZWxldGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXZUcmFja0VsZW1lbnQgPSByZy5GaXJzdCgpLlJldlRyYWNrRWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXYuUmV2aXNpb25YRWxlbWVudCA9IHJldlRyYWNrRWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXYuQXV0aG9yID0gKHN0cmluZylyZXZUcmFja0VsZW1lbnQuQXR0cmlidXRlKFcuYXV0aG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXYuQ29udGVudFhFbGVtZW50ID0gcmcuRmlyc3QoKS5Db250ZW50RWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXYuRGF0ZSA9IChzdHJpbmcpcmV2VHJhY2tFbGVtZW50LkF0dHJpYnV0ZShXLmRhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldi5QYXJ0VXJpID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LlVyaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXYuUGFydENvbnRlbnRUeXBlID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LkNvbnRlbnRUeXBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUmV2RWxlbWVudHNXaXRoTm9UZXh0LkNvbnRhaW5zKHJldi5Db250ZW50WEVsZW1lbnQuTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXYuVGV4dCA9IHJnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHJnYyA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZ2MuQ29udGVudEVsZW1lbnQuTmFtZSA9PSBXLnBQcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVudmlyb25tZW50Lk5ld0xpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJnYy5Db250ZW50RWxlbWVudC5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZvb3Rub3Rlc1JldmlzaW9uTGlzdCA9IEdldEZvb3Rub3RlRW5kbm90ZVJldmlzaW9uTGlzdCh3RG9jLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydCwgVy5mb290bm90ZSwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICB2YXIgZW5kbm90ZXNSZXZpc2lvbkxpc3QgPSBHZXRGb290bm90ZUVuZG5vdGVSZXZpc2lvbkxpc3Qod0RvYy5NYWluRG9jdW1lbnRQYXJ0LkVuZG5vdGVzUGFydCwgVy5lbmRub3RlLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIHZhciBmaW5hbFJldmlzaW9uTGlzdCA9IG1haW5Eb2NQYXJ0UmV2aXNpb25MaXN0LkNvbmNhdChmb290bm90ZXNSZXZpc2lvbkxpc3QpLkNvbmNhdChlbmRub3Rlc1JldmlzaW9uTGlzdCkuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaW5hbFJldmlzaW9uTGlzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBJRW51bWVyYWJsZTxXbWxDb21wYXJlclJldmlzaW9uPiBHZXRGb290bm90ZUVuZG5vdGVSZXZpc2lvbkxpc3QoT3BlblhtbFBhcnQgZm9vdG5vdGVzRW5kbm90ZXNQYXJ0LAorICAgICAgICAgICAgWE5hbWUgZm9vdG5vdGVFbmRub3RlRWxlbWVudE5hbWUsCisgICAgICAgICAgICBXbWxDb21wYXJlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZm9vdG5vdGVzRW5kbm90ZXNQYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVudW1lcmFibGUuRW1wdHk8V21sQ29tcGFyZXJSZXZpc2lvbj4oKTsKKworICAgICAgICAgICAgdmFyIHhEb2MgPSBmb290bm90ZXNFbmRub3Rlc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICB2YXIgZm9vdG5vdGVzRW5kbm90ZXMgPSB4RG9jLlJvb3QuRWxlbWVudHMoZm9vdG5vdGVFbmRub3RlRWxlbWVudE5hbWUpOworICAgICAgICAgICAgTGlzdDxXbWxDb21wYXJlclJldmlzaW9uPiByZXZpc2lvbnNGb3JQYXJ0ID0gbmV3IExpc3Q8V21sQ29tcGFyZXJSZXZpc2lvbj4oKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmbiBpbiBmb290bm90ZXNFbmRub3RlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYXRvbUxpc3QgPSBXbWxDb21wYXJlci5DcmVhdGVDb21wYXJpc29uVW5pdEF0b21MaXN0KGZvb3Rub3Rlc0VuZG5vdGVzUGFydCwgZm4sIHNldHRpbmdzKS5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc19GYWxzZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGF0b21MaXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0uVG9TdHJpbmcoKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuTm90ZVBhZChzYnMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBncm91cGVkID0gYXRvbUxpc3QKKyAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoYSA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYS5Db3JyZWxhdGlvblN0YXR1cy5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuQ29ycmVsYXRpb25TdGF0dXMgIT0gQ29ycmVsYXRpb25TdGF0dXMuRXF1YWwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJ0ID0gbmV3IFhFbGVtZW50KGEuUmV2VHJhY2tFbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidyIsICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5SZXZUcmFja0VsZW1lbnQuQXR0cmlidXRlcygpLldoZXJlKGEyID0+IGEyLk5hbWUgIT0gVy5pZCAmJiBhMi5OYW1lICE9IFB0T3BlblhtbC5VbmlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ICs9IHJ0LlRvU3RyaW5nKFNhdmVPcHRpb25zLkRpc2FibGVGb3JtYXR0aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKworICAgICAgICAgICAgICAgIHZhciByZXZpc2lvbnMgPSBncm91cGVkCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShrID0+IGsuS2V5ICE9ICJFcXVhbCIpCisgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKworICAgICAgICAgICAgICAgIHZhciB0aGlzTm90ZVJldmlzaW9uTGlzdCA9IHJldmlzaW9ucworICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHJnID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXYgPSBuZXcgV21sQ29tcGFyZXJSZXZpc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJnLktleS5TdGFydHNXaXRoKCJJbnNlcnRlZCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldi5SZXZpc2lvblR5cGUgPSBXbWxDb21wYXJlclJldmlzaW9uVHlwZS5JbnNlcnRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJnLktleS5TdGFydHNXaXRoKCJEZWxldGVkIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2LlJldmlzaW9uVHlwZSA9IFdtbENvbXBhcmVyUmV2aXNpb25UeXBlLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV2VHJhY2tFbGVtZW50ID0gcmcuRmlyc3QoKS5SZXZUcmFja0VsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXYuUmV2aXNpb25YRWxlbWVudCA9IHJldlRyYWNrRWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldi5BdXRob3IgPSAoc3RyaW5nKXJldlRyYWNrRWxlbWVudC5BdHRyaWJ1dGUoVy5hdXRob3IpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV2LkNvbnRlbnRYRWxlbWVudCA9IHJnLkZpcnN0KCkuQ29udGVudEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXYuRGF0ZSA9IChzdHJpbmcpcmV2VHJhY2tFbGVtZW50LkF0dHJpYnV0ZShXLmRhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV2LlBhcnRVcmkgPSBmb290bm90ZXNFbmRub3Rlc1BhcnQuVXJpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV2LlBhcnRDb250ZW50VHlwZSA9IGZvb3Rub3Rlc0VuZG5vdGVzUGFydC5Db250ZW50VHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUmV2RWxlbWVudHNXaXRoTm9UZXh0LkNvbnRhaW5zKHJldi5Db250ZW50WEVsZW1lbnQuTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2LlRleHQgPSByZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHJnYyA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmdjLkNvbnRlbnRFbGVtZW50Lk5hbWUgPT0gVy5wUHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVudmlyb25tZW50Lk5ld0xpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmdjLkNvbnRlbnRFbGVtZW50LlZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXY7CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gdGhpc05vdGVSZXZpc2lvbkxpc3QpCisgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uc0ZvclBhcnQuQWRkKGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldmlzaW9uc0ZvclBhcnQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9oaWJpdAorICAgICAgICAvLyAtIGFsdENodW5rCisgICAgICAgIC8vIC0gc3ViRG9jCisgICAgICAgIC8vIC0gY29udGVudFBhcnQKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBUZXN0Rm9ySW52YWxpZENvbnRlbnQoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFydCBpbiB3RG9jLkNvbnRlbnRQYXJ0cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB4RG9jID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoeERvYy5EZXNjZW5kYW50cyhXLmFsdENodW5rKS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBkb2N1bWVudCwgY29udGFpbnMgdzphbHRDaHVuayIpOworICAgICAgICAgICAgICAgIGlmICh4RG9jLkRlc2NlbmRhbnRzKFcuc3ViRG9jKS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBkb2N1bWVudCwgY29udGFpbnMgdzpzdWJEb2MiKTsKKyAgICAgICAgICAgICAgICBpZiAoeERvYy5EZXNjZW5kYW50cyhXLmNvbnRlbnRQYXJ0KS5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBkb2N1bWVudCwgY29udGFpbnMgdzpjb250ZW50UGFydCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZW1vdmVFeGlzdGluZ1Bvd2VyVG9vbHNNYXJrdXAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jKQorICAgICAgICB7CisgICAgICAgICAgICB3RG9jLk1haW5Eb2N1bWVudFBhcnQKKyAgICAgICAgICAgICAgICAuR2V0WERvY3VtZW50KCkKKyAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cygpCisgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgIC5XaGVyZShhID0+IGEuTmFtZS5OYW1lc3BhY2UgPT0gUHRPcGVuWG1sLnB0KQorICAgICAgICAgICAgICAgIC5XaGVyZShhID0+IGEuTmFtZSAhPSBQdE9wZW5YbWwuVW5pZCkKKyAgICAgICAgICAgICAgICAuUmVtb3ZlKCk7CisgICAgICAgICAgICB3RG9jLk1haW5Eb2N1bWVudFBhcnQuUHV0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIHZhciBmblBhcnQgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydDsKKyAgICAgICAgICAgIGlmIChmblBhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZm5YRG9jID0gZm5QYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIGZuWERvYworICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShhID0+IGEuTmFtZS5OYW1lc3BhY2UgPT0gUHRPcGVuWG1sLnB0KQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoYSA9PiBhLk5hbWUgIT0gUHRPcGVuWG1sLlVuaWQpCisgICAgICAgICAgICAgICAgICAgIC5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBmblBhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBlblBhcnQgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0OworICAgICAgICAgICAgaWYgKGVuUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBlblhEb2MgPSBlblBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgZW5YRG9jCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cygpCisgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGEgPT4gYS5OYW1lLk5hbWVzcGFjZSA9PSBQdE9wZW5YbWwucHQpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShhID0+IGEuTmFtZSAhPSBQdE9wZW5YbWwuVW5pZCkKKyAgICAgICAgICAgICAgICAgICAgLlJlbW92ZSgpOworICAgICAgICAgICAgICAgIGVuUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkU2hhMUhhc2hUb0Jsb2NrTGV2ZWxDb250ZW50KE9wZW5YbWxQYXJ0IHBhcnQsIFhFbGVtZW50IGNvbnRlbnRQYXJlbnQsIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBibG9ja0xldmVsQ29udGVudFRvQW5ub3RhdGUgPSBjb250ZW50UGFyZW50CisgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBFbGVtZW50c1RvSGF2ZVNoYTFIYXNoLkNvbnRhaW5zKGQuTmFtZSkpOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgYmxvY2tMZXZlbENvbnRlbnQgaW4gYmxvY2tMZXZlbENvbnRlbnRUb0Fubm90YXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjbG9uZUJsb2NrTGV2ZWxDb250ZW50Rm9ySGFzaGluZyA9IChYRWxlbWVudClDbG9uZUJsb2NrTGV2ZWxDb250ZW50Rm9ySGFzaGluZyhwYXJ0LCBibG9ja0xldmVsQ29udGVudCwgdHJ1ZSwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIHZhciBzaGFTdHJpbmcgPSBjbG9uZUJsb2NrTGV2ZWxDb250ZW50Rm9ySGFzaGluZy5Ub1N0cmluZyhTYXZlT3B0aW9ucy5EaXNhYmxlRm9ybWF0dGluZykKKyAgICAgICAgICAgICAgICAgICAgLlJlcGxhY2UoIiB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpblwiIiwgIiIpOworICAgICAgICAgICAgICAgIHZhciBzaGExSGFzaCA9IFdtbENvbXBhcmVyVXRpbC5TSEExSGFzaFN0cmluZ0ZvclVURjhTdHJpbmcoc2hhU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBibG9ja0xldmVsQ29udGVudC5BZGQobmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLlNIQTFIYXNoLCBzaGExSGFzaCkpOworCisgICAgICAgICAgICAgICAgaWYgKGJsb2NrTGV2ZWxDb250ZW50Lk5hbWUgPT0gVy50YmwgfHwKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tMZXZlbENvbnRlbnQuTmFtZSA9PSBXLnRyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lZEZvclN0cnVjdHVyZUhhc2ggPSAoWEVsZW1lbnQpQ2xvbmVGb3JTdHJ1Y3R1cmVIYXNoKGNsb25lQmxvY2tMZXZlbENvbnRlbnRGb3JIYXNoaW5nKTsKKworICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgY29udmVuaWVudCBwbGFjZSB0byBsb29rIGF0IHdoeSB0YWJsZXMgYXJlIGJlaW5nIGNvbXBhcmVkIGFzIGRpZmZlcmVudC4KKworICAgICAgICAgICAgICAgICAgICAvL2lmIChibG9ja0xldmVsQ29udGVudC5OYW1lID09IFcudGJsKQorICAgICAgICAgICAgICAgICAgICAvLyAgICBDb25zb2xlLldyaXRlTGluZSgpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBzaGFTdHJpbmcyID0gY2xvbmVkRm9yU3RydWN0dXJlSGFzaC5Ub1N0cmluZyhTYXZlT3B0aW9ucy5EaXNhYmxlRm9ybWF0dGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5SZXBsYWNlKCIgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW5cIiIsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNoYTFIYXNoMiA9IFdtbENvbXBhcmVyVXRpbC5TSEExSGFzaFN0cmluZ0ZvclVURjhTdHJpbmcoc2hhU3RyaW5nMik7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrTGV2ZWxDb250ZW50LkFkZChuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuU3RydWN0dXJlU0hBMUhhc2gsIHNoYTFIYXNoMikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgc3RyaXBzIGFsbCB0ZXh0IG5vZGVzIGZyb20gdGhlIFhNTCB0cmVlLCB0aGVyZWJ5IGxlYXZpbmcgb25seSB0aGUgc3RydWN0dXJlLgorICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQ2xvbmVGb3JTdHJ1Y3R1cmVIYXNoKFhOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoKS5TZWxlY3QoZSA9PiBDbG9uZUZvclN0cnVjdHVyZUhhc2goZSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIFhOYW1lW10gQXR0cmlidXRlc1RvVHJpbVdoZW5DbG9uaW5nID0gbmV3IFhOYW1lW10geworICAgICAgICAgICAgV1AxNC5hbmNob3JJZCwKKyAgICAgICAgICAgIFdQMTQuZWRpdElkLAorICAgICAgICAgICAgIk9iamVjdElEIiwKKyAgICAgICAgICAgICJTaGFwZUlEIiwKKyAgICAgICAgICAgICJpZCIsCisgICAgICAgICAgICAidHlwZSIsCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IENsb25lQmxvY2tMZXZlbENvbnRlbnRGb3JIYXNoaW5nKE9wZW5YbWxQYXJ0IG1haW5Eb2N1bWVudFBhcnQsIFhOb2RlIG5vZGUsIGJvb2wgaW5jbHVkZVJlbGF0ZWRQYXJ0cywgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuYm9va21hcmtTdGFydCB8fAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgPT0gVy5ib29rbWFya0VuZCB8fAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5hbWUgPT0gVy5wUHIgfHwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5OYW1lID09IFcuclByKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lZFBhcmEgPSBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCkuV2hlcmUoYSA9PiBhLk5hbWUgIT0gVy5yc2lkICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuTmFtZSAhPSBXLnJzaWREZWwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5OYW1lICE9IFcucnNpZFAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5OYW1lICE9IFcucnNpZFIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5OYW1lICE9IFcucnNpZFJEZWZhdWx0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuTmFtZSAhPSBXLnJzaWRSUHIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5OYW1lICE9IFcucnNpZFNlY3QgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5OYW1lICE9IFcucnNpZFRyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuTmFtZS5OYW1lc3BhY2UgIT0gUHRPcGVuWG1sLnB0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBDbG9uZUJsb2NrTGV2ZWxDb250ZW50Rm9ySGFzaGluZyhtYWluRG9jdW1lbnRQYXJ0LCBuLCBpbmNsdWRlUmVsYXRlZFBhcnRzLCBzZXR0aW5ncykpKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgZ3JvdXBlZFJ1bnMgPSBjbG9uZWRQYXJhCisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoZSA9PiBlLk5hbWUgPT0gVy5yICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5FbGVtZW50cygpLkNvdW50KCkgPT0gMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuRWxlbWVudChXLnQpICE9IG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZWRQYXJhV2l0aEdyb3VwZWRSdW5zID0gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSdW5zLlNlbGVjdChnID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuS2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSBnLlNlbGVjdCh0ID0+IHQuVmFsdWUpLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5DYXNlSW5zZW5zaXRpdmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5Ub1VwcGVyKHNldHRpbmdzLkN1bHR1cmVJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1J1biA9IChvYmplY3QpbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3UnVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xvbmVkUGFyYVdpdGhHcm91cGVkUnVuczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcucikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZWRSdW5zID0gZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IGUuTmFtZSAhPSBXLnJQcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QocmMgPT4gbmV3IFhFbGVtZW50KFcuciwgQ2xvbmVCbG9ja0xldmVsQ29udGVudEZvckhhc2hpbmcobWFpbkRvY3VtZW50UGFydCwgcmMsIGluY2x1ZGVSZWxhdGVkUGFydHMsIHNldHRpbmdzKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xvbmVkUnVuczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcudGJsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lZFRhYmxlID0gbmV3IFhFbGVtZW50KFcudGJsLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cyhXLnRyKS5TZWxlY3QobiA9PiBDbG9uZUJsb2NrTGV2ZWxDb250ZW50Rm9ySGFzaGluZyhtYWluRG9jdW1lbnRQYXJ0LCBuLCBpbmNsdWRlUmVsYXRlZFBhcnRzLCBzZXR0aW5ncykpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsb25lZFRhYmxlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy50cikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZWRSb3cgPSBuZXcgWEVsZW1lbnQoVy50ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoVy50YykuU2VsZWN0KG4gPT4gQ2xvbmVCbG9ja0xldmVsQ29udGVudEZvckhhc2hpbmcobWFpbkRvY3VtZW50UGFydCwgbiwgaW5jbHVkZVJlbGF0ZWRQYXJ0cywgc2V0dGluZ3MpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZWRSb3c7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRjKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lZENlbGwgPSBuZXcgWEVsZW1lbnQoVy50YywKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoKS5TZWxlY3QobiA9PiBDbG9uZUJsb2NrTGV2ZWxDb250ZW50Rm9ySGFzaGluZyhtYWluRG9jdW1lbnRQYXJ0LCBuLCBpbmNsdWRlUmVsYXRlZFBhcnRzLCBzZXR0aW5ncykpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsb25lZENlbGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRjUHIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY2xvbmVkQ2VsbFByb3BzID0gbmV3IFhFbGVtZW50KFcudGNQciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoVy5ncmlkU3BhbikuU2VsZWN0KG4gPT4gQ2xvbmVCbG9ja0xldmVsQ29udGVudEZvckhhc2hpbmcobWFpbkRvY3VtZW50UGFydCwgbiwgaW5jbHVkZVJlbGF0ZWRQYXJ0cywgc2V0dGluZ3MpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZWRDZWxsUHJvcHM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLmdyaWRTcGFuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lZEdyaWRTcGFuID0gbmV3IFhFbGVtZW50KFcuZ3JpZFNwYW4sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgidmFsIiwgKHN0cmluZyllbGVtZW50LkF0dHJpYnV0ZShXLnZhbCkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsb25lZEdyaWRTcGFuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy50eGJ4Q29udGVudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZWRUZXh0Ym94ID0gbmV3IFhFbGVtZW50KFcudHhieENvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKCkuU2VsZWN0KG4gPT4gQ2xvbmVCbG9ja0xldmVsQ29udGVudEZvckhhc2hpbmcobWFpbkRvY3VtZW50UGFydCwgbiwgaW5jbHVkZVJlbGF0ZWRQYXJ0cywgc2V0dGluZ3MpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZWRUZXh0Ym94OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlUmVsYXRlZFBhcnRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKENvbXBhcmlzb25Vbml0V29yZC5zX0VsZW1lbnRzV2l0aFJlbGF0aW9uc2hpcElkcy5Db250YWlucyhlbGVtZW50Lk5hbWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGEgPT4gYS5OYW1lLk5hbWVzcGFjZSAhPSBQdE9wZW5YbWwucHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShhID0+ICFBdHRyaWJ1dGVzVG9UcmltV2hlbkNsb25pbmcuQ29udGFpbnMoYS5OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChhID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ29tcGFyaXNvblVuaXRXb3JkLnNfUmVsYXRpb25zaGlwQXR0cmlidXRlTmFtZXMuQ29udGFpbnMoYS5OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBySWQgPSAoc3RyaW5nKWE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdWxkIGJlIGFuIGh5cGVybGluayByZWxhdGlvbnNoaXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxQYXJ0IG94cCA9IG1haW5Eb2N1bWVudFBhcnQuR2V0UGFydEJ5SWQocklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3hwID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIFdvcmRwcm9jZXNzaW5nTUwgRG9jdW1lbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYW5ubyA9IG94cC5Bbm5vdGF0aW9uPFBhcnRTSEExSGFzaEFubm90YXRpb24+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFubm8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYQXR0cmlidXRlKGEuTmFtZSwgYW5uby5IYXNoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3hwLkNvbnRlbnRUeXBlLkVuZHNXaXRoKCJ4bWwiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyID0gb3hwLkdldFN0cmVhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYmE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoQmluYXJ5UmVhZGVyIGJyID0gbmV3IEJpbmFyeVJlYWRlcihzdHIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhID0gYnIuUmVhZEJ5dGVzKChpbnQpc3RyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hhMSA9IFdtbENvbXBhcmVyVXRpbC5TSEExSGFzaFN0cmluZ0ZvckJ5dGVBcnJheShiYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBveHAuQWRkQW5ub3RhdGlvbihuZXcgUGFydFNIQTFIYXNoQW5ub3RhdGlvbihzaGExKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhBdHRyaWJ1dGUoYS5OYW1lLCBzaGExKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHlwZXJsaW5rUmVsYXRpb25zaGlwIGhyID0gbWFpbkRvY3VtZW50UGFydC5IeXBlcmxpbmtSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KHogPT4gei5JZCA9PSBySWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChociAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IGhyLlVyaS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhBdHRyaWJ1dGUoYS5OYW1lLCBzdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VsZCBiZSBhbiBleHRlcm5hbCByZWxhdGlvbnNoaXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbFJlbGF0aW9uc2hpcCBlciA9IG1haW5Eb2N1bWVudFBhcnQuRXh0ZXJuYWxSZWxhdGlvbnNoaXBzLkZpcnN0T3JEZWZhdWx0KHogPT4gei5JZCA9PSBySWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IGVyLlVyaS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhBdHRyaWJ1dGUoYS5OYW1lLCBzdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhBdHRyaWJ1dGUoYS5OYW1lLCAiTlVMTCBSZWxhdGlvbnNoaXAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBDbG9uZUJsb2NrTGV2ZWxDb250ZW50Rm9ySGFzaGluZyhtYWluRG9jdW1lbnRQYXJ0LCBuLCBpbmNsdWRlUmVsYXRlZFBhcnRzLCBzZXR0aW5ncykpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBWTUwuc2hhcGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGEgPT4gYS5OYW1lLk5hbWVzcGFjZSAhPSBQdE9wZW5YbWwucHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGEgPT4gYS5OYW1lICE9ICJzdHlsZSIgJiYgYS5OYW1lICE9ICJpZCIgJiYgYS5OYW1lICE9ICJ0eXBlIiksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gQ2xvbmVCbG9ja0xldmVsQ29udGVudEZvckhhc2hpbmcobWFpbkRvY3VtZW50UGFydCwgbiwgaW5jbHVkZVJlbGF0ZWRQYXJ0cywgc2V0dGluZ3MpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBPLk9MRU9iamVjdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGEgPT4gYS5OYW1lLk5hbWVzcGFjZSAhPSBQdE9wZW5YbWwucHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGEgPT4gYS5OYW1lICE9ICJPYmplY3RJRCIgJiYgYS5OYW1lICE9IFIuaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IENsb25lQmxvY2tMZXZlbENvbnRlbnRGb3JIYXNoaW5nKG1haW5Eb2N1bWVudFBhcnQsIG4sIGluY2x1ZGVSZWxhdGVkUGFydHMsIHNldHRpbmdzKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuX29iamVjdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGEgPT4gYS5OYW1lLk5hbWVzcGFjZSAhPSBQdE9wZW5YbWwucHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IENsb25lQmxvY2tMZXZlbENvbnRlbnRGb3JIYXNoaW5nKG1haW5Eb2N1bWVudFBhcnQsIG4sIGluY2x1ZGVSZWxhdGVkUGFydHMsIHNldHRpbmdzKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFdQLmRvY1ByKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShhID0+IGEuTmFtZS5OYW1lc3BhY2UgIT0gUHRPcGVuWG1sLnB0ICYmIGEuTmFtZSAhPSAiaWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBDbG9uZUJsb2NrTGV2ZWxDb250ZW50Rm9ySGFzaGluZyhtYWluRG9jdW1lbnRQYXJ0LCBuLCBpbmNsdWRlUmVsYXRlZFBhcnRzLCBzZXR0aW5ncykpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShhID0+IGEuTmFtZS5OYW1lc3BhY2UgIT0gUHRPcGVuWG1sLnB0KQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGEgPT4gIUF0dHJpYnV0ZXNUb1RyaW1XaGVuQ2xvbmluZy5Db250YWlucyhhLk5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IENsb25lQmxvY2tMZXZlbENvbnRlbnRGb3JIYXNoaW5nKG1haW5Eb2N1bWVudFBhcnQsIG4sIGluY2x1ZGVSZWxhdGVkUGFydHMsIHNldHRpbmdzKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldHRpbmdzLkNhc2VJbnNlbnNpdGl2ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgeHQgPSBub2RlIGFzIFhUZXh0OworICAgICAgICAgICAgICAgIGlmICh4dCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1RleHQgPSB4dC5WYWx1ZS5Ub1VwcGVyKHNldHRpbmdzLkN1bHR1cmVJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYVGV4dChuZXdUZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q29ycmVsYXRlZFNlcXVlbmNlPiBGaW5kQ29tbW9uQXRCZWdpbm5pbmdBbmRFbmQoQ29ycmVsYXRlZFNlcXVlbmNlIHVua25vd24sIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZW5ndGhUb0NvbXBhcmUgPSBNYXRoLk1pbih1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxLkxlbmd0aCwgdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5Mi5MZW5ndGgpOworCisgICAgICAgICAgICB2YXIgY291bnRDb21tb25BdEJlZ2lubmluZyA9IHVua25vd24KKyAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTEKKyAgICAgICAgICAgICAgICAuVGFrZShsZW5ndGhUb0NvbXBhcmUpCisgICAgICAgICAgICAgICAgLlppcCh1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLAorICAgICAgICAgICAgICAgICAgICAocHUxLCBwdTIpID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdTEgPSBwdTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHUyID0gcHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgLlRha2VXaGlsZShwYWlyID0+IHBhaXIuUHUxLlNIQTFIYXNoID09IHBhaXIuUHUyLlNIQTFIYXNoKQorICAgICAgICAgICAgICAgICAgICAuQ291bnQoKTsKKworICAgICAgICAgICAgaWYgKGNvdW50Q29tbW9uQXRCZWdpbm5pbmcgIT0gMCAmJiAoKGRvdWJsZSljb3VudENvbW1vbkF0QmVnaW5uaW5nIC8gKGRvdWJsZSlsZW5ndGhUb0NvbXBhcmUpIDwgc2V0dGluZ3MuRGV0YWlsVGhyZXNob2xkKQorICAgICAgICAgICAgICAgIGNvdW50Q29tbW9uQXRCZWdpbm5pbmcgPSAwOworCisgICAgICAgICAgICBpZiAoY291bnRDb21tb25BdEJlZ2lubmluZyAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBuZXdTZXF1ZW5jZSA9IG5ldyBMaXN0PENvcnJlbGF0ZWRTZXF1ZW5jZT4oKTsKKworICAgICAgICAgICAgICAgIENvcnJlbGF0ZWRTZXF1ZW5jZSBjc0VxdWFsID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgIGNzRXF1YWwuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5FcXVhbDsKKyAgICAgICAgICAgICAgICBjc0VxdWFsLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gdW5rbm93bgorICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTEKKyAgICAgICAgICAgICAgICAgICAgLlRha2UoY291bnRDb21tb25BdEJlZ2lubmluZykKKyAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBjc0VxdWFsLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gdW5rbm93bgorICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTIKKyAgICAgICAgICAgICAgICAgICAgLlRha2UoY291bnRDb21tb25BdEJlZ2lubmluZykKKyAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBuZXdTZXF1ZW5jZS5BZGQoY3NFcXVhbCk7CisKKyAgICAgICAgICAgICAgICB2YXIgcmVtYWluaW5nTGVmdCA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTEuTGVuZ3RoIC0gY291bnRDb21tb25BdEJlZ2lubmluZzsKKyAgICAgICAgICAgICAgICB2YXIgcmVtYWluaW5nUmlnaHQgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLkxlbmd0aCAtIGNvdW50Q29tbW9uQXRCZWdpbm5pbmc7CisKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nTGVmdCAhPSAwICYmIHJlbWFpbmluZ1JpZ2h0ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb3JyZWxhdGVkU2VxdWVuY2UgY3NEZWxldGVkID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICBjc0RlbGV0ZWQuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5EZWxldGVkOworICAgICAgICAgICAgICAgICAgICBjc0RlbGV0ZWQuQ29tcGFyaXNvblVuaXRBcnJheTEgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxLlNraXAoY291bnRDb21tb25BdEJlZ2lubmluZykuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICBjc0RlbGV0ZWQuQ29tcGFyaXNvblVuaXRBcnJheTIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBuZXdTZXF1ZW5jZS5BZGQoY3NEZWxldGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVtYWluaW5nTGVmdCA9PSAwICYmIHJlbWFpbmluZ1JpZ2h0ICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb3JyZWxhdGVkU2VxdWVuY2UgY3NJbnNlcnRlZCA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgY3NJbnNlcnRlZC5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkOworICAgICAgICAgICAgICAgICAgICBjc0luc2VydGVkLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgY3NJbnNlcnRlZC5Db21wYXJpc29uVW5pdEFycmF5MiA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTIuU2tpcChjb3VudENvbW1vbkF0QmVnaW5uaW5nKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgIG5ld1NlcXVlbmNlLkFkZChjc0luc2VydGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVtYWluaW5nTGVmdCAhPSAwICYmIHJlbWFpbmluZ1JpZ2h0ICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QxID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MVswXSBhcyBDb21wYXJpc29uVW5pdFdvcmQ7CisgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdDIgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyWzBdIGFzIENvbXBhcmlzb25Vbml0V29yZDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QxICE9IG51bGwgJiYgZmlyc3QyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG9wZXJhdGluZyBhdCB0aGUgd29yZCBsZXZlbCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgaWYgdGhlIGxhc3Qgd29yZCBvbiB0aGUgbGVmdCAhPSBwUHIgJiYgbGFzdCB3b3JkIG9uIHJpZ2h0ICE9IHBQcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoZW4gY3JlYXRlIGFuIHVua25vd24gZm9yIHRoZSByZXN0IG9mIHRoZSBwYXJhZ3JhcGgsIGFuZCBjcmVhdGUgYW4gdW5rbm93biBmb3IgdGhlIHJlc3Qgb2YgdGhlIHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgaWYgdGhlIGxhc3Qgd29yZCBvbiB0aGUgbGVmdCAhPSBwUHIgYW5kIGxhc3Qgd29yZCBvbiByaWdodCA9PSBwUHIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGVuIGNyZWF0ZSBkZWxldGVkIGZvciB0aGUgbGVmdCwgYW5kIGNyZWF0ZSBhbiB1bmtub3duIGZvciB0aGUgcmVzdCBvZiB0aGUgdW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBpZiB0aGUgbGFzdCB3b3JkIG9uIHRoZSBsZWZ0ID09IHBQciBhbmQgbGFzdCB3b3JkIG9uIHJpZ2h0ICE9IHBQcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoZW4gY3JlYXRlIGluc2VydGVkIGZvciB0aGUgcmlnaHQsIGFuZCBjcmVhdGUgYW4gdW5rbm93biBmb3IgdGhlIHJlc3Qgb2YgdGhlIHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgaWYgdGhlIGxhc3Qgd29yZCBvbiB0aGUgbGVmdCA9PSBwUHIgYW5kIGxhc3Qgd29yZCBvbiByaWdodCA9PSBwUHIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGVuIGNyZWF0ZSBhbiB1bmtub3duIGZvciB0aGUgcmVzdCBvZiB0aGUgdW5rbm93bgorCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtYWluaW5nSW5MZWZ0ID0gdW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ta2lwKGNvdW50Q29tbW9uQXRCZWdpbm5pbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbWFpbmluZ0luUmlnaHQgPSB1bmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkNvbXBhcmlzb25Vbml0QXJyYXkyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNraXAoY291bnRDb21tb25BdEJlZ2lubmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdENvbnRlbnRBdG9tTGVmdCA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTFbY291bnRDb21tb25BdEJlZ2lubmluZyAtIDFdLkRlc2NlbmRhbnRDb250ZW50QXRvbXMoKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RDb250ZW50QXRvbVJpZ2h0ID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5Mltjb3VudENvbW1vbkF0QmVnaW5uaW5nIC0gMV0uRGVzY2VuZGFudENvbnRlbnRBdG9tcygpLkZpcnN0T3JEZWZhdWx0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Q29udGVudEF0b21MZWZ0LkNvbnRlbnRFbGVtZW50Lk5hbWUgIT0gVy5wUHIgJiYgbGFzdENvbnRlbnRBdG9tUmlnaHQuQ29udGVudEVsZW1lbnQuTmFtZSAhPSBXLnBQcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3BsaXQxID0gU3BsaXRBdFBhcmFncmFwaE1hcmsocmVtYWluaW5nSW5MZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3BsaXQyID0gU3BsaXRBdFBhcmFncmFwaE1hcmsocmVtYWluaW5nSW5SaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0MS5Db3VudCgpID09IDEgJiYgc3BsaXQyLkNvdW50KCkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcnJlbGF0ZWRTZXF1ZW5jZSBjc1Vua25vd24yID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1Vua25vd24yLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NVbmtub3duMi5Db21wYXJpc29uVW5pdEFycmF5MSA9IHNwbGl0MS5GaXJzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1Vua25vd24yLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gc3BsaXQyLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NlcXVlbmNlLkFkZChjc1Vua25vd24yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1NlcXVlbmNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzcGxpdDEuQ291bnQgPT0gMiAmJiBzcGxpdDIuQ291bnQgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcnJlbGF0ZWRTZXF1ZW5jZSBjc1Vua25vd24yID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1Vua25vd24yLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NVbmtub3duMi5Db21wYXJpc29uVW5pdEFycmF5MSA9IHNwbGl0MS5GaXJzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1Vua25vd24yLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gc3BsaXQyLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NlcXVlbmNlLkFkZChjc1Vua25vd24yKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JyZWxhdGVkU2VxdWVuY2UgY3NVbmtub3duMyA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NVbmtub3duMy5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLlVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzVW5rbm93bjMuQ29tcGFyaXNvblVuaXRBcnJheTEgPSBzcGxpdDEuU2tpcCgxKS5GaXJzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1Vua25vd24zLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gc3BsaXQyLlNraXAoMSkuRmlyc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2VxdWVuY2UuQWRkKGNzVW5rbm93bjMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdTZXF1ZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDb3JyZWxhdGVkU2VxdWVuY2UgY3NVbmtub3duID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICBjc1Vua25vd24uQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5Vbmtub3duOworICAgICAgICAgICAgICAgICAgICBjc1Vua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTEgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxLlNraXAoY291bnRDb21tb25BdEJlZ2lubmluZykuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICBjc1Vua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTIgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLlNraXAoY291bnRDb21tb25BdEJlZ2lubmluZykuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICBuZXdTZXF1ZW5jZS5BZGQoY3NVbmtub3duKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVtYWluaW5nTGVmdCA9PSAwICYmIHJlbWFpbmluZ1JpZ2h0ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXdTZXF1ZW5jZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgd2UgZ2V0IHRvIGhlcmUsIHRoZW4gY291bnRDb21tb25BdEJlZ2lubmluZyA9PSAwCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhciBjb3VudENvbW1vbkF0RW5kID0gdW5rbm93bgorICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MQorICAgICAgICAgICAgICAgIC5SZXZlcnNlKCkKKyAgICAgICAgICAgICAgICAuVGFrZShsZW5ndGhUb0NvbXBhcmUpCisgICAgICAgICAgICAgICAgLlppcCh1bmtub3duCisgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MgorICAgICAgICAgICAgICAgICAgICAuUmV2ZXJzZSgpCisgICAgICAgICAgICAgICAgICAgIC5UYWtlKGxlbmd0aFRvQ29tcGFyZSksCisgICAgICAgICAgICAgICAgICAgIChwdTEsIHB1MikgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1MSA9IHB1MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdTIgPSBwdTIsCisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAuVGFrZVdoaWxlKHBhaXIgPT4gcGFpci5QdTEuU0hBMUhhc2ggPT0gcGFpci5QdTIuU0hBMUhhc2gpCisgICAgICAgICAgICAgICAgICAgIC5Db3VudCgpOworCisgICAgICAgICAgICAvLyBuZXZlciBzdGFydCBhIGNvbW1vbiBzZWN0aW9uIHdpdGggYSBwYXJhZ3JhcGggbWFyay4gIEhvd2V2ZXIsIGl0IGlzIE9LIHRvIHNldCB0d28gcGFyYWdyYXBoIG1hcmtzIGFzIGVxdWFsLgorICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50Q29tbW9uQXRFbmQgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3RDb21tb24gPSB1bmtub3duCisgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MQorICAgICAgICAgICAgICAgICAgICAuUmV2ZXJzZSgpCisgICAgICAgICAgICAgICAgICAgIC5UYWtlKGNvdW50Q29tbW9uQXRFbmQpCisgICAgICAgICAgICAgICAgICAgIC5MYXN0T3JEZWZhdWx0KCk7CisKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3RDb21tb25Xb3JkID0gZmlyc3RDb21tb24gYXMgQ29tcGFyaXNvblVuaXRXb3JkOworICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbW1vbldvcmQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgd29yZCBjb250YWlucyBtb3JlIHRoYW4gb25lIGF0b20sIHRoZW4gbm90IGEgcGFyYWdyYXBoIG1hcmsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb21tb25Xb3JkLkNvbnRlbnRzLkNvdW50KCkgIT0gMSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3RDb21tb25BdG9tID0gZmlyc3RDb21tb25Xb3JkLkNvbnRlbnRzLkZpcnN0KCkgYXMgQ29tcGFyaXNvblVuaXRBdG9tOworICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbW1vbkF0b20gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb21tb25BdG9tLkNvbnRlbnRFbGVtZW50Lk5hbWUgIT0gVy5wUHIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY291bnRDb21tb25BdEVuZC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIGlzT25seVBhcmFncmFwaE1hcmsgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChjb3VudENvbW1vbkF0RW5kID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0Q29tbW9uID0gdW5rbm93bgorICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTEKKyAgICAgICAgICAgICAgICAgICAgLlJldmVyc2UoKQorICAgICAgICAgICAgICAgICAgICAuVGFrZShjb3VudENvbW1vbkF0RW5kKQorICAgICAgICAgICAgICAgICAgICAuTGFzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgdmFyIGZpcnN0Q29tbW9uV29yZCA9IGZpcnN0Q29tbW9uIGFzIENvbXBhcmlzb25Vbml0V29yZDsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb21tb25Xb3JkICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgd29yZCBjb250YWlucyBtb3JlIHRoYW4gb25lIGF0b20sIHRoZW4gbm90IGEgcGFyYWdyYXBoIG1hcmsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29tbW9uV29yZC5Db250ZW50cy5Db3VudCgpID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdENvbW1vbkF0b20gPSBmaXJzdENvbW1vbldvcmQuQ29udGVudHMuRmlyc3QoKSBhcyBDb21wYXJpc29uVW5pdEF0b207CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb21tb25BdG9tICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29tbW9uQXRvbS5Db250ZW50RWxlbWVudC5OYW1lID09IFcucFByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09ubHlQYXJhZ3JhcGhNYXJrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb3VudENvbW1vbkF0RW5kID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0Q29tbW9uID0gdW5rbm93bgorICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTEKKyAgICAgICAgICAgICAgICAgICAgLlJldmVyc2UoKQorICAgICAgICAgICAgICAgICAgICAuVGFrZShjb3VudENvbW1vbkF0RW5kKQorICAgICAgICAgICAgICAgICAgICAuTGFzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgdmFyIHNlY29uZENvbW1vbiA9IHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgLkNvbXBhcmlzb25Vbml0QXJyYXkxCisgICAgICAgICAgICAgICAgICAgIC5SZXZlcnNlKCkKKyAgICAgICAgICAgICAgICAgICAgLlRha2UoY291bnRDb21tb25BdEVuZCkKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3RDb21tb25Xb3JkID0gZmlyc3RDb21tb24gYXMgQ29tcGFyaXNvblVuaXRXb3JkOworICAgICAgICAgICAgICAgIHZhciBzZWNvbmRDb21tb25Xb3JkID0gc2Vjb25kQ29tbW9uIGFzIENvbXBhcmlzb25Vbml0V29yZDsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb21tb25Xb3JkICE9IG51bGwgJiYgc2Vjb25kQ29tbW9uV29yZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHdvcmQgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBhdG9tLCB0aGVuIG5vdCBhIHBhcmFncmFwaCBtYXJrCisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbW1vbldvcmQuQ29udGVudHMuQ291bnQoKSA9PSAxICYmIHNlY29uZENvbW1vbldvcmQuQ29udGVudHMuQ291bnQoKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RDb21tb25BdG9tID0gZmlyc3RDb21tb25Xb3JkLkNvbnRlbnRzLkZpcnN0KCkgYXMgQ29tcGFyaXNvblVuaXRBdG9tOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlY29uZENvbW1vbkF0b20gPSBzZWNvbmRDb21tb25Xb3JkLkNvbnRlbnRzLkZpcnN0KCkgYXMgQ29tcGFyaXNvblVuaXRBdG9tOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29tbW9uQXRvbSAhPSBudWxsICYmIHNlY29uZENvbW1vbkF0b20gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kQ29tbW9uQXRvbS5Db250ZW50RWxlbWVudC5OYW1lID09IFcucFByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09ubHlQYXJhZ3JhcGhNYXJrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFpc09ubHlQYXJhZ3JhcGhNYXJrICYmIGNvdW50Q29tbW9uQXRFbmQgIT0gMCAmJiAoKGRvdWJsZSljb3VudENvbW1vbkF0RW5kIC8gKGRvdWJsZSlsZW5ndGhUb0NvbXBhcmUpIDwgc2V0dGluZ3MuRGV0YWlsVGhyZXNob2xkKQorICAgICAgICAgICAgICAgIGNvdW50Q29tbW9uQXRFbmQgPSAwOworCisgICAgICAgICAgICAvLyBJZiB0aGUgZm9sbG93aW5nIHRlc3QgaXMgbm90IHRoZXJlLCB0aGUgdGVzdCBiZWxvdyBzZXRzIHRoZSBlbmQgcGFyYWdyYXBoIG1hcmsgb2YgdGhlIGVudGlyZSBkb2N1bWVudCBlcXVhbCB0byB0aGUgZW5kIHBhcmFncmFwaAorICAgICAgICAgICAgLy8gbWFyayBvZiB0aGUgZmlyc3QgcGFyYWdyYXBoIGluIHRoZSBvdGhlciBkb2N1bWVudCwgY2F1c2luZyBsaW5lcyB0byBiZSBvdXQgb2Ygb3JkZXIuCisgICAgICAgICAgICAvLyBbSW5saW5lRGF0YSgiV0MwMTAtUGFyYS1CZWZvcmUtVGFibGUtVW5tb2RpZmllZC5kb2N4IiwgIldDMDEwLVBhcmEtQmVmb3JlLVRhYmxlLU1vZC5kb2N4IiwgMyldCisgICAgICAgICAgICBpZiAoaXNPbmx5UGFyYWdyYXBoTWFyaykKKyAgICAgICAgICAgICAgICBjb3VudENvbW1vbkF0RW5kID0gMDsKKworICAgICAgICAgICAgaWYgKGNvdW50Q29tbW9uQXRFbmQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgLy8gaWYgY291bnRDb21tb25BdEVuZCAhPSAwLCBhbmQgaWYgaXQgY29udGFpbnMgYSBwYXJhZ3JhcGggbWFyaywgdGhlbiBpZiB0aGVyZSBhcmUgY29tcGFyaXNvbiB1bml0cyBpbiB0aGUgc2FtZSBwYXJhZ3JhcGggYmVmb3JlIHRoZSBjb21tb24gYXQgZW5kIChpbiBlaXRoZXIgdmVyc2lvbikKKyAgICAgICAgICAgIC8vIHRoZW4gd2Ugd2FudCB0byBwdXQgYWxsIG9mIHRob3NlIGNvbXBhcmlzb24gdW5pdHMgaW50byBhIHNpbmdsZSB1bmtub3duLCB3aGVyZSB0aGV5IG11c3QgYmUgcmVzb2x2ZWQgYWdhaW5zdCBlYWNoIG90aGVyLiAgV2UgZG9uJ3Qgd2FudCB0aG9zZSBjb21wYXJpc29uIHVuaXRzIHRvIGdvIGludG8gdGhlIG1pZGRsZSB1bmtub3duIGNvbXBhcmlzb24gdW5pdC4KKworICAgICAgICAgICAgaWYgKGNvdW50Q29tbW9uQXRFbmQgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nSW5MZWZ0UGFyYWdyYXBoID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nSW5SaWdodFBhcmFncmFwaCA9IDA7CisKKyAgICAgICAgICAgICAgICB2YXIgY29tbW9uRW5kU2VxID0gdW5rbm93bgorICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTEKKyAgICAgICAgICAgICAgICAgICAgLlJldmVyc2UoKQorICAgICAgICAgICAgICAgICAgICAuVGFrZShjb3VudENvbW1vbkF0RW5kKQorICAgICAgICAgICAgICAgICAgICAuUmV2ZXJzZSgpCisgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3RPZkNvbW1vbkVuZFNlcSA9IGNvbW1vbkVuZFNlcS5GaXJzdCgpOworICAgICAgICAgICAgICAgIGlmIChmaXJzdE9mQ29tbW9uRW5kU2VxIGlzIENvbXBhcmlzb25Vbml0V29yZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB0aGVyZSBhbnkgcGFyYWdyYXBoIG1hcmtzIGluIHRoZSBjb21tb24gc2VxIGF0IGVuZD8KKyAgICAgICAgICAgICAgICAgICAgLy9pZiAoY29tbW9uRW5kU2VxLkFueShjdSA9PiBjdS5Db250ZW50cy5PZlR5cGU8Q29tcGFyaXNvblVuaXRBdG9tPigpLkZpcnN0KCkuQ29udGVudEVsZW1lbnQuTmFtZSA9PSBXLnBQcikpCisgICAgICAgICAgICAgICAgICAgIGlmIChjb21tb25FbmRTZXEuQW55KGN1ID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdENvbXBhcmlzb25Vbml0QXRvbSA9IGN1LkNvbnRlbnRzLk9mVHlwZTxDb21wYXJpc29uVW5pdEF0b20+KCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbXBhcmlzb25Vbml0QXRvbSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdENvbXBhcmlzb25Vbml0QXRvbS5Db250ZW50RWxlbWVudC5OYW1lID09IFcucFByOworICAgICAgICAgICAgICAgICAgICB9KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nSW5MZWZ0UGFyYWdyYXBoID0gdW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgLkNvbXBhcmlzb25Vbml0QXJyYXkxCisgICAgICAgICAgICAgICAgICAgICAgICAuUmV2ZXJzZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcChjb3VudENvbW1vbkF0RW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgLlRha2VXaGlsZShjdSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGN1IGlzIENvbXBhcmlzb25Vbml0V29yZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RDb21wYXJpc29uVW5pdEF0b20gPSBjdS5Db250ZW50cy5PZlR5cGU8Q29tcGFyaXNvblVuaXRBdG9tPigpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29tcGFyaXNvblVuaXRBdG9tID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdENvbXBhcmlzb25Vbml0QXRvbS5Db250ZW50RWxlbWVudC5OYW1lICE9IFcucFByOworICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Db3VudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nSW5SaWdodFBhcmFncmFwaCA9IHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUmV2ZXJzZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNraXAoY291bnRDb21tb25BdEVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVGFrZVdoaWxlKGN1ID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShjdSBpcyBDb21wYXJpc29uVW5pdFdvcmQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RDb21wYXJpc29uVW5pdEF0b20gPSBjdS5Db250ZW50cy5PZlR5cGU8Q29tcGFyaXNvblVuaXRBdG9tPigpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbXBhcmlzb25Vbml0QXRvbSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdENvbXBhcmlzb25Vbml0QXRvbS5Db250ZW50RWxlbWVudC5OYW1lICE9IFcucFByOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkNvdW50KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgbmV3U2VxdWVuY2UgPSBuZXcgTGlzdDxDb3JyZWxhdGVkU2VxdWVuY2U+KCk7CisKKyAgICAgICAgICAgICAgICBpbnQgYmVmb3JlQ29tbW9uUGFyYWdyYXBoTGVmdCA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTEuTGVuZ3RoIC0gcmVtYWluaW5nSW5MZWZ0UGFyYWdyYXBoIC0gY291bnRDb21tb25BdEVuZDsKKyAgICAgICAgICAgICAgICBpbnQgYmVmb3JlQ29tbW9uUGFyYWdyYXBoUmlnaHQgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLkxlbmd0aCAtIHJlbWFpbmluZ0luUmlnaHRQYXJhZ3JhcGggLSBjb3VudENvbW1vbkF0RW5kOworCisgICAgICAgICAgICAgICAgaWYgKGJlZm9yZUNvbW1vblBhcmFncmFwaExlZnQgIT0gMCAmJiBiZWZvcmVDb21tb25QYXJhZ3JhcGhSaWdodCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29ycmVsYXRlZFNlcXVlbmNlIGNzRGVsZXRlZCA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgY3NEZWxldGVkLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuRGVsZXRlZDsKKyAgICAgICAgICAgICAgICAgICAgY3NEZWxldGVkLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MS5UYWtlKGJlZm9yZUNvbW1vblBhcmFncmFwaExlZnQpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgY3NEZWxldGVkLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbmV3U2VxdWVuY2UuQWRkKGNzRGVsZXRlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZUNvbW1vblBhcmFncmFwaExlZnQgPT0gMCAmJiBiZWZvcmVDb21tb25QYXJhZ3JhcGhSaWdodCAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29ycmVsYXRlZFNlcXVlbmNlIGNzSW5zZXJ0ZWQgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIGNzSW5zZXJ0ZWQuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5JbnNlcnRlZDsKKyAgICAgICAgICAgICAgICAgICAgY3NJbnNlcnRlZC5Db21wYXJpc29uVW5pdEFycmF5MSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGNzSW5zZXJ0ZWQuQ29tcGFyaXNvblVuaXRBcnJheTIgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLlRha2UoYmVmb3JlQ29tbW9uUGFyYWdyYXBoUmlnaHQpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3U2VxdWVuY2UuQWRkKGNzSW5zZXJ0ZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChiZWZvcmVDb21tb25QYXJhZ3JhcGhMZWZ0ICE9IDAgJiYgYmVmb3JlQ29tbW9uUGFyYWdyYXBoUmlnaHQgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvcnJlbGF0ZWRTZXF1ZW5jZSBjc1Vua25vd24gPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIGNzVW5rbm93bi5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLlVua25vd247CisgICAgICAgICAgICAgICAgICAgIGNzVW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MSA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTEuVGFrZShiZWZvcmVDb21tb25QYXJhZ3JhcGhMZWZ0KS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgIGNzVW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MiA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTIuVGFrZShiZWZvcmVDb21tb25QYXJhZ3JhcGhSaWdodCkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICBuZXdTZXF1ZW5jZS5BZGQoY3NVbmtub3duKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYmVmb3JlQ29tbW9uUGFyYWdyYXBoTGVmdCA9PSAwICYmIGJlZm9yZUNvbW1vblBhcmFncmFwaFJpZ2h0ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ0luTGVmdFBhcmFncmFwaCAhPSAwICYmIHJlbWFpbmluZ0luUmlnaHRQYXJhZ3JhcGggPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvcnJlbGF0ZWRTZXF1ZW5jZSBjc0RlbGV0ZWQgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIGNzRGVsZXRlZC5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgIGNzRGVsZXRlZC5Db21wYXJpc29uVW5pdEFycmF5MSA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTEuU2tpcChiZWZvcmVDb21tb25QYXJhZ3JhcGhMZWZ0KS5UYWtlKHJlbWFpbmluZ0luTGVmdFBhcmFncmFwaCkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICBjc0RlbGV0ZWQuQ29tcGFyaXNvblVuaXRBcnJheTIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBuZXdTZXF1ZW5jZS5BZGQoY3NEZWxldGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVtYWluaW5nSW5MZWZ0UGFyYWdyYXBoID09IDAgJiYgcmVtYWluaW5nSW5SaWdodFBhcmFncmFwaCAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29ycmVsYXRlZFNlcXVlbmNlIGNzSW5zZXJ0ZWQgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIGNzSW5zZXJ0ZWQuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5JbnNlcnRlZDsKKyAgICAgICAgICAgICAgICAgICAgY3NJbnNlcnRlZC5Db21wYXJpc29uVW5pdEFycmF5MSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGNzSW5zZXJ0ZWQuQ29tcGFyaXNvblVuaXRBcnJheTIgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLlNraXAoYmVmb3JlQ29tbW9uUGFyYWdyYXBoUmlnaHQpLlRha2UocmVtYWluaW5nSW5SaWdodFBhcmFncmFwaCkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICBuZXdTZXF1ZW5jZS5BZGQoY3NJbnNlcnRlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlbWFpbmluZ0luTGVmdFBhcmFncmFwaCAhPSAwICYmIHJlbWFpbmluZ0luUmlnaHRQYXJhZ3JhcGggIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvcnJlbGF0ZWRTZXF1ZW5jZSBjc1Vua25vd24gPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIGNzVW5rbm93bi5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLlVua25vd247CisgICAgICAgICAgICAgICAgICAgIGNzVW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MSA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTEuU2tpcChiZWZvcmVDb21tb25QYXJhZ3JhcGhMZWZ0KS5UYWtlKHJlbWFpbmluZ0luTGVmdFBhcmFncmFwaCkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICBjc1Vua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTIgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLlNraXAoYmVmb3JlQ29tbW9uUGFyYWdyYXBoUmlnaHQpLlRha2UocmVtYWluaW5nSW5SaWdodFBhcmFncmFwaCkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICBuZXdTZXF1ZW5jZS5BZGQoY3NVbmtub3duKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVtYWluaW5nSW5MZWZ0UGFyYWdyYXBoID09IDAgJiYgcmVtYWluaW5nSW5SaWdodFBhcmFncmFwaCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENvcnJlbGF0ZWRTZXF1ZW5jZSBjc0VxdWFsID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgIGNzRXF1YWwuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5FcXVhbDsKKyAgICAgICAgICAgICAgICBjc0VxdWFsLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MS5Ta2lwKHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTEuTGVuZ3RoIC0gY291bnRDb21tb25BdEVuZCkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgIGNzRXF1YWwuQ29tcGFyaXNvblVuaXRBcnJheTIgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLlNraXAodW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5Mi5MZW5ndGggLSBjb3VudENvbW1vbkF0RW5kKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgbmV3U2VxdWVuY2UuQWRkKGNzRXF1YWwpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1NlcXVlbmNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyNpZiBmYWxzZQorICAgICAgICAgICAgdmFyIG1pZGRsZUxlZnQgPSB1bmtub3duCisgICAgICAgICAgICAgICAgLkNvbXBhcmlzb25Vbml0QXJyYXkxCisgICAgICAgICAgICAgICAgLlNraXAoY291bnRDb21tb25BdEJlZ2lubmluZykKKyAgICAgICAgICAgICAgICAuU2tpcExhc3QocmVtYWluaW5nSW5MZWZ0UGFyYWdyYXBoKQorICAgICAgICAgICAgICAgIC5Ta2lwTGFzdChjb3VudENvbW1vbkF0RW5kKQorICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIHZhciBtaWRkbGVSaWdodCA9IHVua25vd24KKyAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTIKKyAgICAgICAgICAgICAgICAuU2tpcChjb3VudENvbW1vbkF0QmVnaW5uaW5nKQorICAgICAgICAgICAgICAgIC5Ta2lwTGFzdChyZW1haW5pbmdJblJpZ2h0UGFyYWdyYXBoKQorICAgICAgICAgICAgICAgIC5Ta2lwTGFzdChjb3VudENvbW1vbkF0RW5kKQorICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIGlmIChtaWRkbGVMZWZ0Lkxlbmd0aCA+IDAgJiYgbWlkZGxlUmlnaHQuTGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29ycmVsYXRlZFNlcXVlbmNlIGNzID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgIGNzLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuRGVsZXRlZDsKKyAgICAgICAgICAgICAgICBjcy5Db21wYXJpc29uVW5pdEFycmF5MSA9IG1pZGRsZUxlZnQ7CisgICAgICAgICAgICAgICAgY3MuQ29tcGFyaXNvblVuaXRBcnJheTIgPSBudWxsOworICAgICAgICAgICAgICAgIG5ld1NlcXVlbmNlLkFkZChjcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtaWRkbGVMZWZ0Lkxlbmd0aCA9PSAwICYmIG1pZGRsZVJpZ2h0Lkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29ycmVsYXRlZFNlcXVlbmNlIGNzID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgIGNzLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuSW5zZXJ0ZWQ7CisgICAgICAgICAgICAgICAgY3MuQ29tcGFyaXNvblVuaXRBcnJheTEgPSBudWxsOworICAgICAgICAgICAgICAgIGNzLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gbWlkZGxlUmlnaHQ7CisgICAgICAgICAgICAgICAgbmV3U2VxdWVuY2UuQWRkKGNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG1pZGRsZUxlZnQuTGVuZ3RoID4gMCAmJiBtaWRkbGVSaWdodC5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvcnJlbGF0ZWRTZXF1ZW5jZSBjcyA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICBjcy5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLlVua25vd247CisgICAgICAgICAgICAgICAgY3MuQ29tcGFyaXNvblVuaXRBcnJheTEgPSBtaWRkbGVMZWZ0OworICAgICAgICAgICAgICAgIGNzLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gbWlkZGxlUmlnaHQ7CisgICAgICAgICAgICAgICAgbmV3U2VxdWVuY2UuQWRkKGNzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJlbWFpbmluZ0luUGFyYUxlZnQgPSB1bmtub3duCisgICAgICAgICAgICAgICAgLkNvbXBhcmlzb25Vbml0QXJyYXkxCisgICAgICAgICAgICAgICAgLlNraXAoY291bnRDb21tb25BdEJlZ2lubmluZykKKyAgICAgICAgICAgICAgICAuU2tpcChtaWRkbGVMZWZ0Lkxlbmd0aCkKKyAgICAgICAgICAgICAgICAuVGFrZShyZW1haW5pbmdJbkxlZnRQYXJhZ3JhcGgpCisgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgdmFyIHJlbWFpbmluZ0luUGFyYVJpZ2h0ID0gdW5rbm93bgorICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MgorICAgICAgICAgICAgICAgIC5Ta2lwKGNvdW50Q29tbW9uQXRCZWdpbm5pbmcpCisgICAgICAgICAgICAgICAgLlNraXAobWlkZGxlUmlnaHQuTGVuZ3RoKQorICAgICAgICAgICAgICAgIC5UYWtlKHJlbWFpbmluZ0luUmlnaHRQYXJhZ3JhcGgpCisgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgaWYgKHJlbWFpbmluZ0luUGFyYUxlZnQuTGVuZ3RoID4gMCAmJiByZW1haW5pbmdJblBhcmFSaWdodC5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb3JyZWxhdGVkU2VxdWVuY2UgY3MgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgY3MuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5EZWxldGVkOworICAgICAgICAgICAgICAgIGNzLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gcmVtYWluaW5nSW5QYXJhTGVmdDsKKyAgICAgICAgICAgICAgICBjcy5Db21wYXJpc29uVW5pdEFycmF5MiA9IG51bGw7CisgICAgICAgICAgICAgICAgbmV3U2VxdWVuY2UuQWRkKGNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHJlbWFpbmluZ0luUGFyYUxlZnQuTGVuZ3RoID09IDAgJiYgcmVtYWluaW5nSW5QYXJhUmlnaHQuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb3JyZWxhdGVkU2VxdWVuY2UgY3MgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgY3MuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5JbnNlcnRlZDsKKyAgICAgICAgICAgICAgICBjcy5Db21wYXJpc29uVW5pdEFycmF5MSA9IG51bGw7CisgICAgICAgICAgICAgICAgY3MuQ29tcGFyaXNvblVuaXRBcnJheTIgPSByZW1haW5pbmdJblBhcmFSaWdodDsKKyAgICAgICAgICAgICAgICBuZXdTZXF1ZW5jZS5BZGQoY3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocmVtYWluaW5nSW5QYXJhTGVmdC5MZW5ndGggPiAwICYmIHJlbWFpbmluZ0luUGFyYVJpZ2h0Lkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29ycmVsYXRlZFNlcXVlbmNlIGNzID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgIGNzLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuVW5rbm93bjsKKyAgICAgICAgICAgICAgICBjcy5Db21wYXJpc29uVW5pdEFycmF5MSA9IHJlbWFpbmluZ0luUGFyYUxlZnQ7CisgICAgICAgICAgICAgICAgY3MuQ29tcGFyaXNvblVuaXRBcnJheTIgPSByZW1haW5pbmdJblBhcmFSaWdodDsKKyAgICAgICAgICAgICAgICBuZXdTZXF1ZW5jZS5BZGQoY3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY291bnRDb21tb25BdEVuZCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvcnJlbGF0ZWRTZXF1ZW5jZSBjcyA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICBjcy5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkVxdWFsOworCisgICAgICAgICAgICAgICAgY3MuQ29tcGFyaXNvblVuaXRBcnJheTEgPSB1bmtub3duCisgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MQorICAgICAgICAgICAgICAgICAgICAuU2tpcChjb3VudENvbW1vbkF0QmVnaW5uaW5nICsgbWlkZGxlTGVmdC5MZW5ndGggKyByZW1haW5pbmdJblBhcmFMZWZ0Lkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgICAgIGNzLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gdW5rbm93bgorICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTIKKyAgICAgICAgICAgICAgICAgICAgLlNraXAoY291bnRDb21tb25BdEJlZ2lubmluZyArIG1pZGRsZVJpZ2h0Lkxlbmd0aCArIHJlbWFpbmluZ0luUGFyYVJpZ2h0Lkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgICAgIGlmIChjcy5Db21wYXJpc29uVW5pdEFycmF5MS5MZW5ndGggIT0gY3MuQ29tcGFyaXNvblVuaXRBcnJheTIuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIGVycm9yIik7CisKKyAgICAgICAgICAgICAgICBuZXdTZXF1ZW5jZS5BZGQoY3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ld1NlcXVlbmNlOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENvbXBhcmlzb25Vbml0W10+IFNwbGl0QXRQYXJhZ3JhcGhNYXJrKENvbXBhcmlzb25Vbml0W10gY3VhKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdWEuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGF0b20gPSBjdWFbaV0uRGVzY2VuZGFudENvbnRlbnRBdG9tcygpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKGF0b20gIT0gbnVsbCAmJiBhdG9tLkNvbnRlbnRFbGVtZW50Lk5hbWUgPT0gVy5wUHIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gY3VhLkxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExpc3Q8Q29tcGFyaXNvblVuaXRbXT4oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3VhCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgTGlzdDxDb21wYXJpc29uVW5pdFtdPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VhLlRha2UoaSkuVG9BcnJheSgpLAorICAgICAgICAgICAgICAgIGN1YS5Ta2lwKGkpLlRvQXJyYXkoKSwKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIE1vdmVMYXN0U2VjdFByVG9DaGlsZE9mQm9keShYRG9jdW1lbnQgbmV3WERvYykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGxhc3RQYXJhV2l0aFNlY3RQciA9IG5ld1hEb2MKKyAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmJvZHkpCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucCkKKyAgICAgICAgICAgICAgICAuV2hlcmUocCA9PiBwLkVsZW1lbnRzKFcucFByKS5FbGVtZW50cyhXLnNlY3RQcikuQW55KCkpCisgICAgICAgICAgICAgICAgLkxhc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChsYXN0UGFyYVdpdGhTZWN0UHIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXdYRG9jLlJvb3QuRWxlbWVudChXLmJvZHkpLkFkZChsYXN0UGFyYVdpdGhTZWN0UHIuRWxlbWVudHMoVy5wUHIpLkVsZW1lbnRzKFcuc2VjdFByKSk7CisgICAgICAgICAgICAgICAgbGFzdFBhcmFXaXRoU2VjdFByLkVsZW1lbnRzKFcucFByKS5FbGVtZW50cyhXLnNlY3RQcikuUmVtb3ZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgc19NYXhJZCA9IDA7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFByb2R1Y2VOZXdXbWxNYXJrdXBGcm9tQ29ycmVsYXRlZFNlcXVlbmNlKE9wZW5YbWxQYXJ0IHBhcnQsCisgICAgICAgICAgICBJRW51bWVyYWJsZTxDb21wYXJpc29uVW5pdEF0b20+IGNvbXBhcmlzb25Vbml0QXRvbUxpc3QsCisgICAgICAgICAgICBXbWxDb21wYXJlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBmYWJyaWNhdGUgbmV3IE1haW5Eb2N1bWVudFBhcnQgZnJvbSBjb3JyZWxhdGVkU2VxdWVuY2UKKyAgICAgICAgICAgIHNfTWF4SWQgPSAwOworICAgICAgICAgICAgdmFyIG5ld0JvZHlDaGlsZHJlbiA9IENvYWxlc2NlUmVjdXJzZShwYXJ0LCBjb21wYXJpc29uVW5pdEF0b21MaXN0LCAwLCBzZXR0aW5ncyk7CisgICAgICAgICAgICByZXR1cm4gbmV3Qm9keUNoaWxkcmVuOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBGaXhVcERvY1BySWRzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVsZW1lbnRUb0ZpbmQgPSBXUC5kb2NQcjsKKyAgICAgICAgICAgIHZhciBkb2NQclRvQ2hhbmdlID0gd0RvYworICAgICAgICAgICAgICAgIC5Db250ZW50UGFydHMoKQorICAgICAgICAgICAgICAgIC5TZWxlY3QoY3AgPT4gY3AuR2V0WERvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgLlNlbGVjdCh4ZCA9PiB4ZC5EZXNjZW5kYW50cygpLldoZXJlKGQgPT4gZC5OYW1lID09IGVsZW1lbnRUb0ZpbmQpKQorICAgICAgICAgICAgICAgIC5TZWxlY3RNYW55KG0gPT4gbSk7CisgICAgICAgICAgICB2YXIgbmV4dElkID0gMTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGRvY1ByVG9DaGFuZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGlkQXR0ID0gaXRlbS5BdHRyaWJ1dGUoImlkIik7CisgICAgICAgICAgICAgICAgaWYgKGlkQXR0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGlkQXR0LlZhbHVlID0gKG5leHRJZCsrKS5Ub1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNwIGluIHdEb2MuQ29udGVudFBhcnRzKCkpCisgICAgICAgICAgICAgICAgY3AuUHV0WERvY3VtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEZpeFVwUmV2TWFya0lkcyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXZNYXJrc1RvQ2hhbmdlID0gd0RvYworICAgICAgICAgICAgICAgIC5Db250ZW50UGFydHMoKQorICAgICAgICAgICAgICAgIC5TZWxlY3QoY3AgPT4gY3AuR2V0WERvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgLlNlbGVjdCh4ZCA9PiB4ZC5EZXNjZW5kYW50cygpLldoZXJlKGQgPT4gZC5OYW1lID09IFcuaW5zIHx8IGQuTmFtZSA9PSBXLmRlbCkpCisgICAgICAgICAgICAgICAgLlNlbGVjdE1hbnkobSA9PiBtKTsKKyAgICAgICAgICAgIHZhciBuZXh0SWQgPSAwOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gcmV2TWFya3NUb0NoYW5nZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaWRBdHQgPSBpdGVtLkF0dHJpYnV0ZShXLmlkKTsKKyAgICAgICAgICAgICAgICBpZiAoaWRBdHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgaWRBdHQuVmFsdWUgPSAobmV4dElkKyspLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgY3AgaW4gd0RvYy5Db250ZW50UGFydHMoKSkKKyAgICAgICAgICAgICAgICBjcC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRml4VXBTaGFwZUlkcyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50VG9GaW5kID0gVk1MLnNoYXBlOworICAgICAgICAgICAgdmFyIHNoYXBlSWRzVG9DaGFuZ2UgPSB3RG9jCisgICAgICAgICAgICAgICAgLkNvbnRlbnRQYXJ0cygpCisgICAgICAgICAgICAgICAgLlNlbGVjdChjcCA9PiBjcC5HZXRYRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICAuU2VsZWN0KHhkID0+IHhkLkRlc2NlbmRhbnRzKCkuV2hlcmUoZCA9PiBkLk5hbWUgPT0gZWxlbWVudFRvRmluZCkpCisgICAgICAgICAgICAgICAgLlNlbGVjdE1hbnkobSA9PiBtKTsKKyAgICAgICAgICAgIHZhciBuZXh0SWQgPSAxOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gc2hhcGVJZHNUb0NoYW5nZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdGhpc0lkID0gbmV4dElkKys7CisKKyAgICAgICAgICAgICAgICB2YXIgaWRBdHQgPSBpdGVtLkF0dHJpYnV0ZSgiaWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoaWRBdHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgaWRBdHQuVmFsdWUgPSB0aGlzSWQuVG9TdHJpbmcoKTsKKworICAgICAgICAgICAgICAgIHZhciBvbGVPYmplY3QgPSBpdGVtLlBhcmVudC5FbGVtZW50KE8uT0xFT2JqZWN0KTsKKyAgICAgICAgICAgICAgICBpZiAob2xlT2JqZWN0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgc2hhcGVJZEF0dCA9IG9sZU9iamVjdC5BdHRyaWJ1dGUoIlNoYXBlSUQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNoYXBlSWRBdHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlSWRBdHQuVmFsdWUgPSB0aGlzSWQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgY3AgaW4gd0RvYy5Db250ZW50UGFydHMoKSkKKyAgICAgICAgICAgICAgICBjcC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRml4VXBHcm91cElkcyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50VG9GaW5kID0gVk1MLmdyb3VwOworICAgICAgICAgICAgdmFyIGdyb3VwSWRzVG9DaGFuZ2UgPSB3RG9jCisgICAgICAgICAgICAgICAgLkNvbnRlbnRQYXJ0cygpCisgICAgICAgICAgICAgICAgLlNlbGVjdChjcCA9PiBjcC5HZXRYRG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICAuU2VsZWN0KHhkID0+IHhkLkRlc2NlbmRhbnRzKCkuV2hlcmUoZCA9PiBkLk5hbWUgPT0gZWxlbWVudFRvRmluZCkpCisgICAgICAgICAgICAgICAgLlNlbGVjdE1hbnkobSA9PiBtKTsKKyAgICAgICAgICAgIHZhciBuZXh0SWQgPSAxOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gZ3JvdXBJZHNUb0NoYW5nZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdGhpc0lkID0gbmV4dElkKys7CisKKyAgICAgICAgICAgICAgICB2YXIgaWRBdHQgPSBpdGVtLkF0dHJpYnV0ZSgiaWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoaWRBdHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgaWRBdHQuVmFsdWUgPSB0aGlzSWQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjcCBpbiB3RG9jLkNvbnRlbnRQYXJ0cygpKQorICAgICAgICAgICAgICAgIGNwLlB1dFhEb2N1bWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBGaXhVcFNoYXBlVHlwZUlkcyhXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50VG9GaW5kID0gVk1MLnNoYXBldHlwZTsKKyAgICAgICAgICAgIHZhciBzaGFwZVR5cGVJZHNUb0NoYW5nZSA9IHdEb2MKKyAgICAgICAgICAgICAgICAuQ29udGVudFBhcnRzKCkKKyAgICAgICAgICAgICAgICAuU2VsZWN0KGNwID0+IGNwLkdldFhEb2N1bWVudCgpKQorICAgICAgICAgICAgICAgIC5TZWxlY3QoeGQgPT4geGQuRGVzY2VuZGFudHMoKS5XaGVyZShkID0+IGQuTmFtZSA9PSBlbGVtZW50VG9GaW5kKSkKKyAgICAgICAgICAgICAgICAuU2VsZWN0TWFueShtID0+IG0pOworICAgICAgICAgICAgdmFyIG5leHRJZCA9IDE7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBzaGFwZVR5cGVJZHNUb0NoYW5nZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdGhpc0lkID0gbmV4dElkKys7CisKKyAgICAgICAgICAgICAgICB2YXIgaWRBdHQgPSBpdGVtLkF0dHJpYnV0ZSgiaWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoaWRBdHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgaWRBdHQuVmFsdWUgPSB0aGlzSWQuVG9TdHJpbmcoKTsKKworICAgICAgICAgICAgICAgIHZhciBzaGFwZSA9IGl0ZW0uUGFyZW50LkVsZW1lbnQoVk1MLnNoYXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoc2hhcGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB0eXBlQXR0ID0gc2hhcGUuQXR0cmlidXRlKCJ0eXBlIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlQXR0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXR0LlZhbHVlID0gdGhpc0lkLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNwIGluIHdEb2MuQ29udGVudFBhcnRzKCkpCisgICAgICAgICAgICAgICAgY3AuUHV0WERvY3VtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQ29hbGVzY2VSZWN1cnNlKE9wZW5YbWxQYXJ0IHBhcnQsIElFbnVtZXJhYmxlPENvbXBhcmlzb25Vbml0QXRvbT4gbGlzdCwgaW50IGxldmVsLCBXbWxDb21wYXJlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZ3JvdXBlZCA9IGxpc3QuR3JvdXBCeShjYSA9PgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+PSBjYS5BbmNlc3RvckVsZW1lbnRzLkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgICAgIHJldHVybiBjYS5BbmNlc3RvclVuaWRzW2xldmVsXTsKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLldoZXJlKGcgPT4gZy5LZXkgIT0gIiIpOworCisgICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gZGVlcGVyIGNoaWxkcmVuLCB0aGVuIHdlJ3JlIGRvbmUuCisgICAgICAgICAgICBpZiAoIWdyb3VwZWQuQW55KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGlmIChzX0ZhbHNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGdyb3VwIGluIGdyb3VwZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIkdyb3VwIEtleTogezB9IiwgZ3JvdXAuS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZ3JvdXBDaGlsZEl0ZW0gaW4gZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChncm91cENoaWxkSXRlbS5Ub1N0cmluZygwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBUZXN0VXRpbC5Ob3RlUGFkKHNicyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBlbGVtZW50TGlzdCA9IGdyb3VwZWQKKyAgICAgICAgICAgICAgICAuU2VsZWN0KGcgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQgPSBnLkZpcnN0KCkuQW5jZXN0b3JFbGVtZW50c1tsZXZlbF07IC8vIHRoZXNlIHdpbGwgYWxsIGJlIHRoZSBzYW1lLCBieSBkZWZpbml0aW9uCisKKyAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBncm91cCBieSBjb3JyIHN0YXQKKyAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwZWRDaGlsZHJlbiA9IGcKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Hcm91cEFkamFjZW50KGdjID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IChnYy5BbmNlc3RvckVsZW1lbnRzLkxlbmd0aCAtIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gZ2MuQW5jZXN0b3JVbmlkc1tsZXZlbCArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2MuQW5jZXN0b3JFbGVtZW50cy5Ta2lwKGxldmVsKS5BbnkoYWUgPT4gYWUuTmFtZSA9PSBXLnR4YnhDb250ZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ICs9ICJ8IiArIENvcnJlbGF0aW9uU3RhdHVzLkVxdWFsLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgKz0gInwiICsgZ2MuQ29ycmVsYXRpb25TdGF0dXMuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5OworICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLk5hbWUgPT0gVy5wKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q2hpbGRFbGVtZW50cyA9IGdyb3VwZWRDaGlsZHJlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZ2MgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcGwgPSBnYy5LZXkuU3BsaXQoJ3wnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwbFswXSA9PSAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqZWN0KWdjLlNlbGVjdChnY2MgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHVwID0gbmV3IFhFbGVtZW50KGdjYy5Db250ZW50RWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwbFsxXSA9PSAiRGVsZXRlZCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cC5BZGQobmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLlN0YXR1cywgIkRlbGV0ZWQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3BsWzFdID09ICJJbnNlcnRlZCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cC5BZGQobmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLlN0YXR1cywgIkluc2VydGVkIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkdXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29hbGVzY2VSZWN1cnNlKHBhcnQsIGdjLCBsZXZlbCArIDEsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UGFyYSA9IG5ldyBYRWxlbWVudChXLnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLkF0dHJpYnV0ZXMoKS5XaGVyZShhID0+IGEuTmFtZS5OYW1lc3BhY2UgIT0gUHRPcGVuWG1sLnB0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuVW5pZCwgZy5LZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkRWxlbWVudHMpOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3UGFyYTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQuTmFtZSA9PSBXLnIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDaGlsZEVsZW1lbnRzID0gZ3JvdXBlZENoaWxkcmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChnYyA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNwbCA9IGdjLktleS5TcGxpdCgnfCcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BsWzBdID09ICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmplY3QpZ2MuU2VsZWN0KGdjYyA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdXAgPSBuZXcgWEVsZW1lbnQoZ2NjLkNvbnRlbnRFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BsWzFdID09ICJEZWxldGVkIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwLkFkZChuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuU3RhdHVzLCAiRGVsZXRlZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzcGxbMV0gPT0gIkluc2VydGVkIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwLkFkZChuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuU3RhdHVzLCAiSW5zZXJ0ZWQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGR1cDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2FsZXNjZVJlY3Vyc2UocGFydCwgZ2MsIGxldmVsICsgMSwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHJQciA9IGFuY2VzdG9yQmVpbmdDb25zdHJ1Y3RlZC5FbGVtZW50KFcuclByKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdSdW4gPSBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yQmVpbmdDb25zdHJ1Y3RlZC5BdHRyaWJ1dGVzKCkuV2hlcmUoYSA9PiBhLk5hbWUuTmFtZXNwYWNlICE9IFB0T3BlblhtbC5wdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgclByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkRWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1J1bjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQuTmFtZSA9PSBXLnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDaGlsZEVsZW1lbnRzID0gZ3JvdXBlZENoaWxkcmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChnYyA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHRPZlRleHRFbGVtZW50ID0gZ2MuU2VsZWN0KGdjZSA9PiBnY2UuQ29udGVudEVsZW1lbnQuVmFsdWUpLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWwgPSBnYy5GaXJzdCgpLkNvcnJlbGF0aW9uU3RhdHVzID09IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnMgPSBnYy5GaXJzdCgpLkNvcnJlbGF0aW9uU3RhdHVzID09IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmplY3QpKG5ldyBYRWxlbWVudChXLmRlbFRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLlN0YXR1cywgIkRlbGV0ZWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRYbWxTcGFjZUF0dHJpYnV0ZSh0ZXh0T2ZUZXh0RWxlbWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE9mVGV4dEVsZW1lbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmplY3QpKG5ldyBYRWxlbWVudChXLnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLlN0YXR1cywgIkluc2VydGVkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0WG1sU3BhY2VBdHRyaWJ1dGUodGV4dE9mVGV4dEVsZW1lbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRPZlRleHRFbGVtZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqZWN0KShuZXcgWEVsZW1lbnQoVy50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFhtbFNwYWNlQXR0cmlidXRlKHRleHRPZlRleHRFbGVtZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T2ZUZXh0RWxlbWVudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0NoaWxkRWxlbWVudHM7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLk5hbWUgPT0gVy5kcmF3aW5nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q2hpbGRFbGVtZW50cyA9IGdyb3VwZWRDaGlsZHJlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZ2MgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWwgPSBnYy5GaXJzdCgpLkNvcnJlbGF0aW9uU3RhdHVzID09IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnMgPSBnYy5GaXJzdCgpLkNvcnJlbGF0aW9uU3RhdHVzID09IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iamVjdClnYy5TZWxlY3QoZ2NjID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0RyYXdpbmcgPSBuZXcgWEVsZW1lbnQoZ2NjLkNvbnRlbnRFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEcmF3aW5nLkFkZChuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuU3RhdHVzLCAiRGVsZXRlZCIpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcGVuWG1sUGFydE9mRGVsZXRlZENvbnRlbnQgPSBnYy5GaXJzdCgpLlBhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9wZW5YbWxQYXJ0SW5OZXdEb2N1bWVudCA9IHBhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdjLlNlbGVjdChnY2UgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2UgcGFja2FnZU9mRGVsZXRlZENvbnRlbnQgPSBvcGVuWG1sUGFydE9mRGVsZXRlZENvbnRlbnQuT3BlblhtbFBhY2thZ2UuUGFja2FnZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZSBwYWNrYWdlT2ZOZXdDb250ZW50ID0gb3BlblhtbFBhcnRJbk5ld0RvY3VtZW50Lk9wZW5YbWxQYWNrYWdlLlBhY2thZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VQYXJ0IHBhcnRJbkRlbGV0ZWREb2N1bWVudCA9IHBhY2thZ2VPZkRlbGV0ZWRDb250ZW50LkdldFBhcnQocGFydC5VcmkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlUGFydCBwYXJ0SW5OZXdEb2N1bWVudCA9IHBhY2thZ2VPZk5ld0NvbnRlbnQuR2V0UGFydChwYXJ0LlVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNb3ZlUmVsYXRlZFBhcnRzVG9EZXN0aW5hdGlvbihwYXJ0SW5EZWxldGVkRG9jdW1lbnQsIHBhcnRJbk5ld0RvY3VtZW50LCBuZXdEcmF3aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdjLlNlbGVjdChnY2MgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RHJhd2luZyA9IG5ldyBYRWxlbWVudChnY2MuQ29udGVudEVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RyYXdpbmcuQWRkKG5ldyBYQXR0cmlidXRlKFB0T3BlblhtbC5TdGF0dXMsICJJbnNlcnRlZCIpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcGVuWG1sUGFydE9mSW5zZXJ0ZWRDb250ZW50ID0gZ2MuRmlyc3QoKS5QYXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcGVuWG1sUGFydEluTmV3RG9jdW1lbnQgPSBwYXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnYy5TZWxlY3QoZ2NlID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlIHBhY2thZ2VPZlNvdXJjZUNvbnRlbnQgPSBvcGVuWG1sUGFydE9mSW5zZXJ0ZWRDb250ZW50Lk9wZW5YbWxQYWNrYWdlLlBhY2thZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2UgcGFja2FnZU9mTmV3Q29udGVudCA9IG9wZW5YbWxQYXJ0SW5OZXdEb2N1bWVudC5PcGVuWG1sUGFja2FnZS5QYWNrYWdlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlUGFydCBwYXJ0SW5EZWxldGVkRG9jdW1lbnQgPSBwYWNrYWdlT2ZTb3VyY2VDb250ZW50LkdldFBhcnQocGFydC5VcmkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlUGFydCBwYXJ0SW5OZXdEb2N1bWVudCA9IHBhY2thZ2VPZk5ld0NvbnRlbnQuR2V0UGFydChwYXJ0LlVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNb3ZlUmVsYXRlZFBhcnRzVG9EZXN0aW5hdGlvbihwYXJ0SW5EZWxldGVkRG9jdW1lbnQsIHBhcnRJbk5ld0RvY3VtZW50LCBuZXdEcmF3aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdjLlNlbGVjdChnY2MgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2NjLkNvbnRlbnRFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdDaGlsZEVsZW1lbnRzOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yQmVpbmdDb25zdHJ1Y3RlZC5OYW1lID09IE0ub01hdGggfHwgYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLk5hbWUgPT0gTS5vTWF0aFBhcmEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDaGlsZEVsZW1lbnRzID0gZ3JvdXBlZENoaWxkcmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChnYyA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbCA9IGdjLkZpcnN0KCkuQ29ycmVsYXRpb25TdGF0dXMgPT0gQ29ycmVsYXRpb25TdGF0dXMuRGVsZXRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlucyA9IGdjLkZpcnN0KCkuQ29ycmVsYXRpb25TdGF0dXMgPT0gQ29ycmVsYXRpb25TdGF0dXMuSW5zZXJ0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnYy5TZWxlY3QoZ2NjID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLmRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5hdXRob3IsIHNldHRpbmdzLkF1dGhvckZvclJldmlzaW9ucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuaWQsIHNfTWF4SWQrKyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuZGF0ZSwgc2V0dGluZ3MuRGF0ZVRpbWVGb3JSZXZpc2lvbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2MuQ29udGVudEVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2MuU2VsZWN0KGdjYyA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoVy5pbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuYXV0aG9yLCBzZXR0aW5ncy5BdXRob3JGb3JSZXZpc2lvbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmlkLCBzX01heElkKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmRhdGUsIHNldHRpbmdzLkRhdGVUaW1lRm9yUmV2aXNpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NjLkNvbnRlbnRFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdjLlNlbGVjdChnY2MgPT4gZ2NjLkNvbnRlbnRFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0NoaWxkRWxlbWVudHM7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoQWxsb3dhYmxlUnVuQ2hpbGRyZW4uQ29udGFpbnMoYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLk5hbWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q2hpbGRFbGVtZW50cyA9IGdyb3VwZWRDaGlsZHJlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZ2MgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWwgPSBnYy5GaXJzdCgpLkNvcnJlbGF0aW9uU3RhdHVzID09IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnMgPSBnYy5GaXJzdCgpLkNvcnJlbGF0aW9uU3RhdHVzID09IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2MuU2VsZWN0KGdjYyA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdXAgPSBuZXcgWEVsZW1lbnQoYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yQmVpbmdDb25zdHJ1Y3RlZC5BdHRyaWJ1dGVzKCkuV2hlcmUoYSA9PiBhLk5hbWUuTmFtZXNwYWNlICE9IFB0T3BlblhtbC5wdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFB0T3BlblhtbC5TdGF0dXMsICJEZWxldGVkIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkdXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnYy5TZWxlY3QoZ2NjID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1cCA9IG5ldyBYRWxlbWVudChhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLkF0dHJpYnV0ZXMoKS5XaGVyZShhID0+IGEuTmFtZS5OYW1lc3BhY2UgIT0gUHRPcGVuWG1sLnB0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLlN0YXR1cywgIkluc2VydGVkIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkdXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnYy5TZWxlY3QoZ2NjID0+IGdjYy5Db250ZW50RWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdDaGlsZEVsZW1lbnRzOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yQmVpbmdDb25zdHJ1Y3RlZC5OYW1lID09IFcudGJsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlY29uc3RydWN0RWxlbWVudChwYXJ0LCBnLCBhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQsIFcudGJsUHIsIFcudGJsR3JpZCwgbnVsbCwgbGV2ZWwsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yQmVpbmdDb25zdHJ1Y3RlZC5OYW1lID09IFcudHIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVjb25zdHJ1Y3RFbGVtZW50KHBhcnQsIGcsIGFuY2VzdG9yQmVpbmdDb25zdHJ1Y3RlZCwgVy50clByLCBudWxsLCBudWxsLCBsZXZlbCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLk5hbWUgPT0gVy50YykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWNvbnN0cnVjdEVsZW1lbnQocGFydCwgZywgYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLCBXLnRjUHIsIG51bGwsIG51bGwsIGxldmVsLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQuTmFtZSA9PSBXLnNkdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWNvbnN0cnVjdEVsZW1lbnQocGFydCwgZywgYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLCBXLnNkdFByLCBXLnNkdEVuZFByLCBudWxsLCBsZXZlbCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLk5hbWUgPT0gVy5waWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlY29uc3RydWN0RWxlbWVudChwYXJ0LCBnLCBhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQsIFZNTC5zaGFwZXR5cGUsIG51bGwsIG51bGwsIGxldmVsLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQuTmFtZSA9PSBWTUwuc2hhcGUpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVjb25zdHJ1Y3RFbGVtZW50KHBhcnQsIGcsIGFuY2VzdG9yQmVpbmdDb25zdHJ1Y3RlZCwgVzEwLndyYXAsIG51bGwsIG51bGwsIGxldmVsLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQuTmFtZSA9PSBXLl9vYmplY3QpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVjb25zdHJ1Y3RFbGVtZW50KHBhcnQsIGcsIGFuY2VzdG9yQmVpbmdDb25zdHJ1Y3RlZCwgVk1MLnNoYXBldHlwZSwgVk1MLnNoYXBlLCBPLk9MRU9iamVjdCwgbGV2ZWwsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yQmVpbmdDb25zdHJ1Y3RlZC5OYW1lID09IFcucnVieSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWNvbnN0cnVjdEVsZW1lbnQocGFydCwgZywgYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLCBXLnJ1YnlQciwgbnVsbCwgbnVsbCwgbGV2ZWwsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmplY3QpUmVjb25zdHJ1Y3RFbGVtZW50KHBhcnQsIGcsIGFuY2VzdG9yQmVpbmdDb25zdHJ1Y3RlZCwgbnVsbCwgbnVsbCwgbnVsbCwgbGV2ZWwsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50TGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IE1vdmVSZWxhdGVkUGFydHNUb0Rlc3RpbmF0aW9uKFBhY2thZ2VQYXJ0IHBhcnRPZkRlbGV0ZWRDb250ZW50LCBQYWNrYWdlUGFydCBwYXJ0SW5OZXdEb2N1bWVudCwKKyAgICAgICAgICAgIFhFbGVtZW50IGNvbnRlbnRFbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZWxlbWVudHNUb1VwZGF0ZSA9IGNvbnRlbnRFbGVtZW50CisgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBkLkF0dHJpYnV0ZXMoKS5BbnkoYSA9PiBDb21wYXJpc29uVW5pdFdvcmQuc19SZWxhdGlvbnNoaXBBdHRyaWJ1dGVOYW1lcy5Db250YWlucyhhLk5hbWUpKSkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZWxlbWVudCBpbiBlbGVtZW50c1RvVXBkYXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzVG9VcGRhdGUgPSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGEgPT4gQ29tcGFyaXNvblVuaXRXb3JkLnNfUmVsYXRpb25zaGlwQXR0cmlidXRlTmFtZXMuQ29udGFpbnMoYS5OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhdHQgaW4gYXR0cmlidXRlc1RvVXBkYXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJJZCA9IChzdHJpbmcpYXR0OworCisgICAgICAgICAgICAgICAgICAgIHZhciByZWxhdGlvbnNoaXBGb3JEZWxldGVkUGFydCA9IHBhcnRPZkRlbGV0ZWRDb250ZW50LkdldFJlbGF0aW9uc2hpcChySWQpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwRm9yRGVsZXRlZFBhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIGRvY3VtZW50Iik7CisKKyAgICAgICAgICAgICAgICAgICAgVXJpIHRhcmdldFVyaSA9IFBhY2tVcmlIZWxwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5SZXNvbHZlUGFydFVyaSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVcmkocGFydE9mRGVsZXRlZENvbnRlbnQuVXJpLlRvU3RyaW5nKCksIFVyaUtpbmQuUmVsYXRpdmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwRm9yRGVsZXRlZFBhcnQuVGFyZ2V0VXJpKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVsYXRlZFBhY2thZ2VQYXJ0ID0gcGFydE9mRGVsZXRlZENvbnRlbnQuUGFja2FnZS5HZXRQYXJ0KHRhcmdldFVyaSk7CisgICAgICAgICAgICAgICAgICAgIHZhciB1cmlTcGxpdCA9IHJlbGF0ZWRQYWNrYWdlUGFydC5VcmkuVG9TdHJpbmcoKS5TcGxpdCgnLycpOworICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdCA9IHVyaVNwbGl0W3VyaVNwbGl0Lkxlbmd0aCAtIDFdLlNwbGl0KCcuJyk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyB1cmlTdHJpbmcgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdC5MZW5ndGggPT0gMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXJpU3RyaW5nID0gdXJpU3BsaXQuU2tpcExhc3QoMSkuU2VsZWN0KHAgPT4gcCArICIvIikuU3RyaW5nQ29uY2F0ZW5hdGUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlAiICsgR3VpZC5OZXdHdWlkKCkuVG9TdHJpbmcoKS5SZXBsYWNlKCItIiwgIiIpICsgIi4iICsgbGFzdFsxXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaVN0cmluZyA9IHVyaVNwbGl0LlNraXBMYXN0KDEpLlNlbGVjdChwID0+IHAgKyAiLyIpLlN0cmluZ0NvbmNhdGVuYXRlKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQIiArIEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCkuUmVwbGFjZSgiLSIsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBVcmkgdXJpID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRQYWNrYWdlUGFydC5VcmkuSXNBYnNvbHV0ZVVyaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaSA9IG5ldyBVcmkodXJpU3RyaW5nLCBVcmlLaW5kLkFic29sdXRlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdXJpID0gbmV3IFVyaSh1cmlTdHJpbmcsIFVyaUtpbmQuUmVsYXRpdmUpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdQYXJ0ID0gcGFydEluTmV3RG9jdW1lbnQuUGFja2FnZS5DcmVhdGVQYXJ0KHVyaSwgcmVsYXRlZFBhY2thZ2VQYXJ0LkNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBvbGRQYXJ0U3RyZWFtID0gcmVsYXRlZFBhY2thZ2VQYXJ0LkdldFN0cmVhbSgpKQorICAgICAgICAgICAgICAgICAgICB1c2luZyAodmFyIG5ld1BhcnRTdHJlYW0gPSBuZXdQYXJ0LkdldFN0cmVhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLkNvcHlTdHJlYW0ob2xkUGFydFN0cmVhbSwgbmV3UGFydFN0cmVhbSk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1JpZCA9ICJSIiArIEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCkuUmVwbGFjZSgiLSIsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgcGFydEluTmV3RG9jdW1lbnQuQ3JlYXRlUmVsYXRpb25zaGlwKG5ld1BhcnQuVXJpLCBUYXJnZXRNb2RlLkludGVybmFsLCByZWxhdGlvbnNoaXBGb3JEZWxldGVkUGFydC5SZWxhdGlvbnNoaXBUeXBlLCBuZXdSaWQpOworICAgICAgICAgICAgICAgICAgICBhdHQuVmFsdWUgPSBuZXdSaWQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhcnQuQ29udGVudFR5cGUuRW5kc1dpdGgoInhtbCIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgbmV3UGFydFhEb2MgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSBuZXdQYXJ0LkdldFN0cmVhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnRYRG9jID0gWERvY3VtZW50LkxvYWQoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZlUmVsYXRlZFBhcnRzVG9EZXN0aW5hdGlvbihyZWxhdGVkUGFja2FnZVBhcnQsIG5ld1BhcnQsIG5ld1BhcnRYRG9jLlJvb3QpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSBuZXdQYXJ0LkdldFN0cmVhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnRYRG9jLlNhdmUoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb250ZW50RWxlbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhBdHRyaWJ1dGUgR2V0WG1sU3BhY2VBdHRyaWJ1dGUoc3RyaW5nIHRleHRPZlRleHRFbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2hhci5Jc1doaXRlU3BhY2UodGV4dE9mVGV4dEVsZW1lbnRbMF0pIHx8CisgICAgICAgICAgICAgICAgY2hhci5Jc1doaXRlU3BhY2UodGV4dE9mVGV4dEVsZW1lbnRbdGV4dE9mVGV4dEVsZW1lbnQuTGVuZ3RoIC0gMV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbCArICJzcGFjZSIsICJwcmVzZXJ2ZSIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBSZWNvbnN0cnVjdEVsZW1lbnQoT3BlblhtbFBhcnQgcGFydCwgSUdyb3VwaW5nPHN0cmluZywgQ29tcGFyaXNvblVuaXRBdG9tPiBnLCBYRWxlbWVudCBhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQsIFhOYW1lIHByb3BzMVhOYW1lLAorICAgICAgICAgICAgWE5hbWUgcHJvcHMyWE5hbWUsIFhOYW1lIHByb3BzM1hOYW1lLCBpbnQgbGV2ZWwsIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBuZXdDaGlsZEVsZW1lbnRzID0gQ29hbGVzY2VSZWN1cnNlKHBhcnQsIGcsIGxldmVsICsgMSwgc2V0dGluZ3MpOworCisgICAgICAgICAgICBvYmplY3QgcHJvcHMxID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChwcm9wczFYTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHByb3BzMSA9IGFuY2VzdG9yQmVpbmdDb25zdHJ1Y3RlZC5FbGVtZW50cyhwcm9wczFYTmFtZSk7CisKKyAgICAgICAgICAgIG9iamVjdCBwcm9wczIgPSBudWxsOworICAgICAgICAgICAgaWYgKHByb3BzMlhOYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgcHJvcHMyID0gYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLkVsZW1lbnRzKHByb3BzMlhOYW1lKTsKKworICAgICAgICAgICAgb2JqZWN0IHByb3BzMyA9IG51bGw7CisgICAgICAgICAgICBpZiAocHJvcHMzWE5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwcm9wczMgPSBhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQuRWxlbWVudHMocHJvcHMzWE5hbWUpOworCisgICAgICAgICAgICB2YXIgcmVjb25zdHJ1Y3RlZEVsZW1lbnQgPSBuZXcgWEVsZW1lbnQoYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLk5hbWUsCisgICAgICAgICAgICAgICAgYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICBwcm9wczEsIHByb3BzMiwgcHJvcHMzLCBuZXdDaGlsZEVsZW1lbnRzKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlY29uc3RydWN0ZWRFbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDb3JyZWxhdGVkU2VxdWVuY2U+IExjcyhDb21wYXJpc29uVW5pdFtdIGN1MSwgQ29tcGFyaXNvblVuaXRbXSBjdTIsIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHNldCB1cCBpbml0aWFsIHN0YXRlIC0gb25lIENvcnJlbGF0ZWRTZXF1ZW5jZSwgVW5Lbm93biwgY29udGVudHMgPT0gZW50aXJlIHNlcXVlbmNlcyAoYm90aCkKKyAgICAgICAgICAgIENvcnJlbGF0ZWRTZXF1ZW5jZSBjcyA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvcnJlbGF0aW9uU3RhdHVzID0gT3BlblhtbFBvd2VyVG9vbHMuQ29ycmVsYXRpb25TdGF0dXMuVW5rbm93biwKKyAgICAgICAgICAgICAgICBDb21wYXJpc29uVW5pdEFycmF5MSA9IGN1MSwKKyAgICAgICAgICAgICAgICBDb21wYXJpc29uVW5pdEFycmF5MiA9IGN1MiwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBMaXN0PENvcnJlbGF0ZWRTZXF1ZW5jZT4gY3NMaXN0ID0gbmV3IExpc3Q8Q29ycmVsYXRlZFNlcXVlbmNlPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3MKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzX0ZhbHNlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gY3NMaXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0uVG9TdHJpbmcoKSkuQXBwZW5kKEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuTm90ZVBhZChzYnMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciB1bmtub3duID0gY3NMaXN0CisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCh6ID0+IHouQ29ycmVsYXRpb25TdGF0dXMgPT0gQ29ycmVsYXRpb25TdGF0dXMuVW5rbm93bik7CisKKyAgICAgICAgICAgICAgICBpZiAodW5rbm93biAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdW5rbm93biBjb25zaXN0cyBvZiBhIHNpbmdsZSBncm91cCBvZiB0aGUgc2FtZSB0eXBlIGluIGVhY2ggc2lkZSwgdGhlbiBjYW4gc2V0IHNvbWUgVW5pZHMgaW4gdGhlICdhZnRlcicgZG9jdW1lbnQuCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB1bmtub3duIGlzIGEgcGFpciBvZiBzaW5nbGUgdGFibGVzLCB0aGVuIGNhbiBzZXQgdGFibGUgVW5pZC4KKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHVua25vd24gaXMgYSBwYWlyIG9mIHNpbmdsZSByb3dzLCB0aGVuIGNhbiBzZXQgdGFibGUgYW5kIHJvd3MgVW5pZHMuCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB1bmtub3duIGlzIGEgcGFpciBvZiBzaW5nbGUgY2VsbHMsIHRoZW4gY2FuIHNldCB0YWJsZSwgcm93LCBhbmQgY2VsbCBVbmlkcy4KKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHVua25vd24gaXMgYSBwYWlyIG9mIHBhcmFncmFwaHMsIHRoZW4gY2FuIHNldCBwYXJhZ3JhcGggKGFuZCBhbGwgYW5jZXN0b3IpIFVuaWRzLgorICAgICAgICAgICAgICAgICAgICBTZXRBZnRlclVuaWRzKHVua25vd24pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzX0ZhbHNlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKHVua25vd24uVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLk5vdGVQYWQoc2JzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIExpc3Q8Q29ycmVsYXRlZFNlcXVlbmNlPiBuZXdTZXF1ZW5jZSA9IFByb2Nlc3NDb3JyZWxhdGVkSGFzaGVzKHVua25vd24sIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1NlcXVlbmNlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NlcXVlbmNlID0gRmluZENvbW1vbkF0QmVnaW5uaW5nQW5kRW5kKHVua25vd24sIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTZXF1ZW5jZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NlcXVlbmNlID0gRG9MY3NBbGdvcml0aG0odW5rbm93biwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4T2ZVbmtub3duID0gY3NMaXN0LkluZGV4T2YodW5rbm93bik7CisgICAgICAgICAgICAgICAgICAgIGNzTGlzdC5SZW1vdmUodW5rbm93bik7CisKKyAgICAgICAgICAgICAgICAgICAgbmV3U2VxdWVuY2UuUmV2ZXJzZSgpOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBuZXdTZXF1ZW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzTGlzdC5JbnNlcnQoaW5kZXhPZlVua25vd24sIGl0ZW0pOworCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBjc0xpc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFNldEFmdGVyVW5pZHMoQ29ycmVsYXRlZFNlcXVlbmNlIHVua25vd24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxLkxlbmd0aCA9PSAxICYmIHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTIuTGVuZ3RoID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGN1YTEgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxWzBdIGFzIENvbXBhcmlzb25Vbml0R3JvdXA7CisgICAgICAgICAgICAgICAgdmFyIGN1YTIgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyWzBdIGFzIENvbXBhcmlzb25Vbml0R3JvdXA7CisgICAgICAgICAgICAgICAgaWYgKGN1YTEgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICBjdWEyICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgY3VhMS5Db21wYXJpc29uVW5pdEdyb3VwVHlwZSA9PSBjdWEyLkNvbXBhcmlzb25Vbml0R3JvdXBUeXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwVHlwZSA9IGN1YTEuQ29tcGFyaXNvblVuaXRHcm91cFR5cGU7CisgICAgICAgICAgICAgICAgICAgIHZhciBkYTEgPSBjdWExLkRlc2NlbmRhbnRDb250ZW50QXRvbXMoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRhMiA9IGN1YTIuRGVzY2VuZGFudENvbnRlbnRBdG9tcygpOworICAgICAgICAgICAgICAgICAgICBYTmFtZSB0YWtlVGhydU5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJpc29uVW5pdEdyb3VwVHlwZS5QYXJhZ3JhcGg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVRocnVOYW1lID0gVy5wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJpc29uVW5pdEdyb3VwVHlwZS5UYWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVGhydU5hbWUgPSBXLnRibDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuUm93OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VUaHJ1TmFtZSA9IFcudHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmlzb25Vbml0R3JvdXBUeXBlLkNlbGw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVRocnVOYW1lID0gVy50YzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuVGV4dGJveDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVGhydU5hbWUgPSBXLnR4YnhDb250ZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWtlVGhydU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGV2YW50QW5jZXN0b3JzID0gbmV3IExpc3Q8WEVsZW1lbnQ+KCk7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhZSBpbiBkYTEuRmlyc3QoKS5BbmNlc3RvckVsZW1lbnRzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWUuTmFtZSAhPSB0YWtlVGhydU5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZXZhbnRBbmNlc3RvcnMuQWRkKGFlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW50QW5jZXN0b3JzLkFkZChhZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgdW5pZExpc3QgPSByZWxldmFudEFuY2VzdG9ycworICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChhID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVuaWQgPSAoc3RyaW5nKWEuQXR0cmlidXRlKFB0T3BlblhtbC5VbmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGRhIGluIGRhMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFuY2VzdG9yc1RvU2V0ID0gZGEuQW5jZXN0b3JFbGVtZW50cy5UYWtlKHVuaWRMaXN0Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgemlwcGVkID0gYW5jZXN0b3JzVG9TZXQuWmlwKHVuaWRMaXN0LCAoYSwgdSkgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuY2VzdG9yID0gYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pZCA9IHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB6IGluIHppcHBlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5pZCA9IHouQW5jZXN0b3IuQXR0cmlidXRlKFB0T3BlblhtbC5VbmlkKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6LkFuY2VzdG9yLk5hbWUgPT0gVy5mb290bm90ZXMgfHwgei5BbmNlc3Rvci5OYW1lID09IFcuZW5kbm90ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuaWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWQuVmFsdWUgPSB6LlVuaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENvcnJlbGF0ZWRTZXF1ZW5jZT4gUHJvY2Vzc0NvcnJlbGF0ZWRIYXNoZXMoQ29ycmVsYXRlZFNlcXVlbmNlIHVua25vd24sIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5ldmVyIGF0dGVtcHQgdGhpcyBvcHRpbWl6YXRpb24gaWYgdGhlcmUgYXJlIGxlc3MgdGhhbiAzIGdyb3VwcworICAgICAgICAgICAgdmFyIG1heGQgPSBNYXRoLk1pbih1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxLkxlbmd0aCwgdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5Mi5MZW5ndGgpOworICAgICAgICAgICAgaWYgKG1heGQgPCAzKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICB2YXIgZmlyc3RJbkN1MSA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTEuRmlyc3RPckRlZmF1bHQoKSBhcyBDb21wYXJpc29uVW5pdEdyb3VwOworICAgICAgICAgICAgdmFyIGZpcnN0SW5DdTIgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLkZpcnN0T3JEZWZhdWx0KCkgYXMgQ29tcGFyaXNvblVuaXRHcm91cDsKKyAgICAgICAgICAgIGlmIChmaXJzdEluQ3UxICE9IG51bGwgJiYgZmlyc3RJbkN1MiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoZmlyc3RJbkN1MS5Db21wYXJpc29uVW5pdEdyb3VwVHlwZSA9PSBDb21wYXJpc29uVW5pdEdyb3VwVHlwZS5QYXJhZ3JhcGggfHwKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RJbkN1MS5Db21wYXJpc29uVW5pdEdyb3VwVHlwZSA9PSBDb21wYXJpc29uVW5pdEdyb3VwVHlwZS5UYWJsZSB8fAorICAgICAgICAgICAgICAgICAgICBmaXJzdEluQ3UxLkNvbXBhcmlzb25Vbml0R3JvdXBUeXBlID09IENvbXBhcmlzb25Vbml0R3JvdXBUeXBlLlJvdykgJiYKKyAgICAgICAgICAgICAgICAgICAgKGZpcnN0SW5DdTIuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUgPT0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuUGFyYWdyYXBoIHx8CisgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5DdTIuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUgPT0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuVGFibGUgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RJbkN1Mi5Db21wYXJpc29uVW5pdEdyb3VwVHlwZSA9PSBDb21wYXJpc29uVW5pdEdyb3VwVHlwZS5Sb3cpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwVHlwZSA9IGZpcnN0SW5DdTEuQ29tcGFyaXNvblVuaXRHcm91cFR5cGU7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTmV4dCB3YW50IHRvIGRvIHRoZSBsY3MgYWxnb3JpdGhtIG9uIHRoaXMuCisgICAgICAgICAgICAgICAgICAgIC8vIHBvdGVudGlhbGx5LCB3ZSB3aWxsIGZpbmQgYWxsIHBhcmFncmFwaHMgYXJlIGNvcnJlbGF0ZWQsIGJ1dCB0aGV5IG1heSBub3QgYmUgZm9yIHR3byByZWFzb25zLQorICAgICAgICAgICAgICAgICAgICAvLyAtIGlmIHRoZXJlIHdlcmUgY2hhbmdlcyB0aGF0IHdlcmUgbm90IHRyYWNrZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gLSBpZiB0aGUgYW5vbW9saWVzIGluIHRoZSBjaGFuZ2UgdHJhY2tpbmcgY2F1c2UgdGhlcmUgdG8gYmUgYSBtaXNtYXRjaCBpbiB0aGUgbnVtYmVyIG9mIHBhcmFncmFwaHMKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmVmb3JlIHdlIGFyZSBnb2luZyB0byBkbyB0aGUgd2hvbGUgTENTIGFsZ29yaXRobSB0aGluZworICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYXQgdGhlIGVuZCBvZiB0aGUgcHJvY2Vzcywgd2Ugc2V0IHVwIHRoZSBjb3JyZWxhdGVkIHNlcXVlbmNlIGxpc3Qgd2hlcmUgY29ycmVsYXRlZCBwYXJhZ3JhcGhzIGFyZSB0b2dldGhlciBpbiB0aGVpcgorICAgICAgICAgICAgICAgICAgICAvLyBvd24gdW5rbm93biBjb3JyZWxhdGVkIHNlcXVlbmNlLgorCisgICAgICAgICAgICAgICAgICAgIHZhciBjdWwxID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGN1bDIgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyOworICAgICAgICAgICAgICAgICAgICBpbnQgY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCBjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlQXRvbUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGN1cnJlbnRJMSA9IC0xOworICAgICAgICAgICAgICAgICAgICBpbnQgY3VycmVudEkyID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkxID0gMDsgaTEgPCBjdWwxLkxlbmd0aDsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaTIgPSAwOyBpMiA8IGN1bDIuTGVuZ3RoOyBpMisrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aGlzU2VxdWVuY2VMZW5ndGggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aGlzU2VxdWVuY2VBdG9tQ291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aGlzSTEgPSBpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGhpc0kyID0gaTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ3JvdXAxID0gY3VsMVt0aGlzSTFdIGFzIENvbXBhcmlzb25Vbml0R3JvdXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBncm91cDIgPSBjdWwyW3RoaXNJMl0gYXMgQ29tcGFyaXNvblVuaXRHcm91cDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaCA9IGdyb3VwMSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cDIgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAxLkNvbXBhcmlzb25Vbml0R3JvdXBUeXBlID09IGdyb3VwMi5Db21wYXJpc29uVW5pdEdyb3VwVHlwZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAxLkNvcnJlbGF0ZWRTSEExSGFzaCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cDIuQ29ycmVsYXRlZFNIQTFIYXNoICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwMS5Db3JyZWxhdGVkU0hBMUhhc2ggPT0gZ3JvdXAyLkNvcnJlbGF0ZWRTSEExSGFzaDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNTZXF1ZW5jZUF0b21Db3VudCArPSBjdWwxW3RoaXNJMV0uRGVzY2VuZGFudENvbnRlbnRBdG9tc0NvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc0kxKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzSTIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNTZXF1ZW5jZUxlbmd0aCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNJMSA9PSBjdWwxLkxlbmd0aCB8fCB0aGlzSTIgPT0gY3VsMi5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNTZXF1ZW5jZUF0b21Db3VudCA+IGN1cnJlbnRMb25nZXN0Q29tbW9uU2VxdWVuY2VBdG9tQ291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoID0gdGhpc1NlcXVlbmNlTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlQXRvbUNvdW50ID0gdGhpc1NlcXVlbmNlQXRvbUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50STEgPSBpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEkyID0gaTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1NlcXVlbmNlQXRvbUNvdW50ID4gY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUF0b21Db3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoID0gdGhpc1NlcXVlbmNlTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMb25nZXN0Q29tbW9uU2VxdWVuY2VBdG9tQ291bnQgPSB0aGlzU2VxdWVuY2VBdG9tQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEkxID0gaTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEkyID0gaTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2Ugd2FudCB0byBoYXZlIHNvbWUgc29ydCBvZiB0aHJlc2hvbGQsIGFuZCBpZiB0aGUgY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUxlbmd0aCBpcyBub3QgbG9uZ2VyIHRoYW4gdGhlIHRocmVzaG9sZCwgdGhlbiBkb24ndCBkbyBhbnl0aGluZworICAgICAgICAgICAgICAgICAgICBib29sIGRvQ29ycmVsYXRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb25nZXN0Q29tbW9uU2VxdWVuY2VMZW5ndGggPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG51bWJlck9mQXRvbXMxID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MVtjdXJyZW50STFdLkRlc2NlbmRhbnRDb250ZW50QXRvbXMoKS5Db3VudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG51bWJlck9mQXRvbXMyID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MltjdXJyZW50STJdLkRlc2NlbmRhbnRDb250ZW50QXRvbXMoKS5Db3VudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlck9mQXRvbXMxID4gMTYgJiYgbnVtYmVyT2ZBdG9tczIgPiAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0NvcnJlbGF0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoID4gMSAmJiBjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoIDw9IDMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBudW1iZXJPZkF0b21zMSA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTEuU2tpcChjdXJyZW50STEpLlRha2UoY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUxlbmd0aCkuU2VsZWN0KHogPT4gei5EZXNjZW5kYW50Q29udGVudEF0b21zKCkuQ291bnQoKSkuU3VtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnVtYmVyT2ZBdG9tczIgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLlNraXAoY3VycmVudEkyKS5UYWtlKGN1cnJlbnRMb25nZXN0Q29tbW9uU2VxdWVuY2VMZW5ndGgpLlNlbGVjdCh6ID0+IHouRGVzY2VuZGFudENvbnRlbnRBdG9tcygpLkNvdW50KCkpLlN1bSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlck9mQXRvbXMxID4gMzIgJiYgbnVtYmVyT2ZBdG9tczIgPiAzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0NvcnJlbGF0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoID4gMykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvQ29ycmVsYXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoZG9Db3JyZWxhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBMaXN0PENvcnJlbGF0ZWRTZXF1ZW5jZT4oKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJMSA+IDAgJiYgY3VycmVudEkyID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MSA9IGN1bDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRha2UoY3VycmVudEkxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50STEgPT0gMCAmJiBjdXJyZW50STIgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IGN1bDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRha2UoY3VycmVudEkyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudEkxID4gMCAmJiBjdXJyZW50STIgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5Vbmtub3duOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTEgPSBjdWwxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UYWtlKGN1cnJlbnRJMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gY3VsMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVGFrZShjdXJyZW50STIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZCh1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRJMSA9PSAwICYmIGN1cnJlbnRJMiA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLlVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MSA9IGN1bDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNraXAoY3VycmVudEkxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcChpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVGFrZSgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTIgPSBjdWwyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ta2lwKGN1cnJlbnRJMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNraXAoaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRha2UoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kSTEgPSBjdXJyZW50STEgKyBjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZEkyID0gY3VycmVudEkyICsgY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUxlbmd0aDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZEkxIDwgY3VsMS5MZW5ndGggJiYgZW5kSTIgPT0gY3VsMi5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MSA9IGN1bDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNraXAoZW5kSTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZChkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVuZEkxID09IGN1bDEuTGVuZ3RoICYmIGVuZEkyIDwgY3VsMi5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuSW5zZXJ0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTEgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gY3VsMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcChlbmRJMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVuZEkxIDwgY3VsMS5MZW5ndGggJiYgZW5kSTIgPCBjdWwyLkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gY3VsMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcChlbmRJMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gY3VsMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcChlbmRJMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZW5kSTEgPT0gY3VsMS5MZW5ndGggJiYgZW5kSTIgPT0gY3VsMi5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q29ycmVsYXRlZFNlcXVlbmNlPiBEb0xjc0FsZ29yaXRobShDb3JyZWxhdGVkU2VxdWVuY2UgdW5rbm93biwgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBMaXN0PENvcnJlbGF0ZWRTZXF1ZW5jZT4oKTsKKworICAgICAgICAgICAgdmFyIGN1bDEgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxOworICAgICAgICAgICAgdmFyIGN1bDIgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyOworCisgICAgICAgICAgICAvLyBmaXJzdCB0aGluZyB0byBkbyAtIGlmIHdlIGhhdmUgYW4gdW5rbm93biB3aXRoIHplcm8gbGVuZ3RoIG9uIGxlZnQgb3IgcmlnaHQgc2lkZSwgY3JlYXRlIGFwcHJvcHJpYXRlIAorICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGNvZGUgb3B0aW1pemF0aW9uIHRoYXQgZW5hYmxlcyBlYXNpZXIgcHJvY2Vzc2luZyBvZiBjYXNlcyBlbHNld2hlcmUuCisgICAgICAgICAgICBpZiAoY3VsMS5MZW5ndGggPiAwICYmIGN1bDIuTGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MSA9IGN1bDE7CisgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IG51bGw7CisgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZChkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY3VsMS5MZW5ndGggPT0gMCAmJiBjdWwyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuSW5zZXJ0ZWQ7CisgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTEgPSBudWxsOworICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gY3VsMjsKKyAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY3VsMS5MZW5ndGggPT0gMCAmJiBjdWwyLkxlbmd0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2U7IC8vIHRoaXMgd2lsbCBlZmZlY3RpdmVseSByZW1vdmUgdGhlIHVua25vd24gd2l0aCBubyBkYXRhIG9uIGVpdGhlciBzaWRlIGZyb20gdGhlIGN1cnJlbnQgZGF0YSBtb2RlbC4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGN1cnJlbnRMb25nZXN0Q29tbW9uU2VxdWVuY2VMZW5ndGggPSAwOworICAgICAgICAgICAgaW50IGN1cnJlbnRJMSA9IC0xOworICAgICAgICAgICAgaW50IGN1cnJlbnRJMiA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaTEgPSAwOyBpMSA8IGN1bDEuTGVuZ3RoIC0gY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUxlbmd0aDsgaTErKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpMiA9IDA7IGkyIDwgY3VsMi5MZW5ndGggLSBjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoOyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRoaXNTZXF1ZW5jZUxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHZhciB0aGlzSTEgPSBpMTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRoaXNJMiA9IGkyOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1bDFbdGhpc0kxXS5TSEExSGFzaCA9PSBjdWwyW3RoaXNJMl0uU0hBMUhhc2gpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc0kxKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc0kyKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1NlcXVlbmNlTGVuZ3RoKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNJMSA9PSBjdWwxLkxlbmd0aCB8fCB0aGlzSTIgPT0gY3VsMi5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1NlcXVlbmNlTGVuZ3RoID4gY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUxlbmd0aCA9IHRoaXNTZXF1ZW5jZUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJMSA9IGkxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEkyID0gaTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzU2VxdWVuY2VMZW5ndGggPiBjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUxlbmd0aCA9IHRoaXNTZXF1ZW5jZUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEkxID0gaTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJMiA9IGkyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbmV2ZXIgc3RhcnQgYSBjb21tb24gc2VjdGlvbiB3aXRoIGEgcGFyYWdyYXBoIG1hcmsuCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUxlbmd0aCA8PSAxKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHZhciBmaXJzdENvbW1vbiA9IGN1bDFbY3VycmVudEkxXTsKKworICAgICAgICAgICAgICAgIHZhciBmaXJzdENvbW1vbldvcmQgPSBmaXJzdENvbW1vbiBhcyBDb21wYXJpc29uVW5pdFdvcmQ7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29tbW9uV29yZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB3b3JkIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYXRvbSwgdGhlbiBub3QgYSBwYXJhZ3JhcGggbWFyaworICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbW1vbldvcmQuQ29udGVudHMuQ291bnQoKSAhPSAxKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHZhciBmaXJzdENvbW1vbkF0b20gPSBmaXJzdENvbW1vbldvcmQuQ29udGVudHMuRmlyc3QoKSBhcyBDb21wYXJpc29uVW5pdEF0b207CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29tbW9uQXRvbSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbW1vbkF0b20uQ29udGVudEVsZW1lbnQuTmFtZSAhPSBXLnBQcikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAtLWN1cnJlbnRMb25nZXN0Q29tbW9uU2VxdWVuY2VMZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb25nZXN0Q29tbW9uU2VxdWVuY2VMZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJMSA9IC0xOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50STIgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytjdXJyZW50STE7CisgICAgICAgICAgICAgICAgICAgICsrY3VycmVudEkyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBpc09ubHlQYXJhZ3JhcGhNYXJrID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUxlbmd0aCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmaXJzdENvbW1vbiA9IGN1bDFbY3VycmVudEkxXTsKKworICAgICAgICAgICAgICAgIHZhciBmaXJzdENvbW1vbldvcmQgPSBmaXJzdENvbW1vbiBhcyBDb21wYXJpc29uVW5pdFdvcmQ7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29tbW9uV29yZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHdvcmQgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBhdG9tLCB0aGVuIG5vdCBhIHBhcmFncmFwaCBtYXJrCisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbW1vbldvcmQuQ29udGVudHMuQ291bnQoKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RDb21tb25BdG9tID0gZmlyc3RDb21tb25Xb3JkLkNvbnRlbnRzLkZpcnN0KCkgYXMgQ29tcGFyaXNvblVuaXRBdG9tOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29tbW9uQXRvbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbW1vbkF0b20uQ29udGVudEVsZW1lbnQuTmFtZSA9PSBXLnBQcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPbmx5UGFyYWdyYXBoTWFyayA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRvbid0IG1hdGNoIGp1c3QgYSBzaW5nbGUgY2hhcmFjdGVyCisgICAgICAgICAgICBpZiAoY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUxlbmd0aCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjdXcyID0gY3VsMltjdXJyZW50STJdIGFzIENvbXBhcmlzb25Vbml0QXRvbTsKKyAgICAgICAgICAgICAgICBpZiAoY3V3MiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1dzIuQ29udGVudEVsZW1lbnQuTmFtZSA9PSBXLnQgJiYgY3V3Mi5Db250ZW50RWxlbWVudC5WYWx1ZSA9PSAiICIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJMSA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEkyID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZG9uJ3QgbWF0Y2ggb25seSB3b3JkIGJyZWFrIGNoYXJhY3RlcnMKKyAgICAgICAgICAgIGlmIChjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoID4gMCAmJiBjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoIDw9IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNvbW1vblNlcXVlbmNlID0gY3VsMS5Ta2lwKGN1cnJlbnRJMSkuVGFrZShjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhleSBhcmUgYWxsIENvbXBhcmlzb25Vbml0V29yZCBvYmplY3RzCisgICAgICAgICAgICAgICAgdmFyIG9uZUlzTm90V29yZCA9IGNvbW1vblNlcXVlbmNlLkFueShjcyA9PiAoY3MgYXMgQ29tcGFyaXNvblVuaXRXb3JkKSA9PSBudWxsKTsKKyAgICAgICAgICAgICAgICB2YXIgYWxsQXJlV29yZHMgPSAhb25lSXNOb3RXb3JkOworICAgICAgICAgICAgICAgIGlmIChhbGxBcmVXb3JkcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50T3RoZXJUaGFuV29yZFNwbGl0Q2hhcnMgPSBjb21tb25TZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgLkNhc3Q8Q29tcGFyaXNvblVuaXRXb3JkPigpCisgICAgICAgICAgICAgICAgICAgICAgICAuQW55KGNzID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG90aGVyVGhhblRleHQgPSBjcy5EZXNjZW5kYW50Q29udGVudEF0b21zKCkuQW55KGRjYSA9PiBkY2EuQ29udGVudEVsZW1lbnQuTmFtZSAhPSBXLnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdGhlclRoYW5UZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3RoZXJUaGFuV29yZFNwbGl0ID0gY3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRDb250ZW50QXRvbXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQW55KGRjYSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hhclZhbHVlID0gZGNhLkNvbnRlbnRFbGVtZW50LlZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzV29yZFNwbGl0ID0gc2V0dGluZ3MuV29yZFNlcGFyYXRvcnMuQ29udGFpbnMoY2hhclZhbHVlWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1dvcmRTcGxpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyVGhhbldvcmRTcGxpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpZiAoISBjb250ZW50T3RoZXJUaGFuV29yZFNwbGl0Q2hhcnMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJMSA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEkyID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgd2UgYXJlIG9ubHkgbG9va2luZyBhdCB0ZXh0LCBhbmQgaWYgdGhlIGxvbmdlc3QgY29tbW9uIHN1YnNlcXVlbmNlIGlzIGxlc3MgdGhhbiAxNSUgb2YgdGhlIHdob2xlLCB0aGVuIGZvcmdldCBpdCwKKyAgICAgICAgICAgIC8vIGRvbid0IGZpbmQgdGhhdCBMQ1MuCisgICAgICAgICAgICBpZiAoIWlzT25seVBhcmFncmFwaE1hcmsgJiYgY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGFueUJ1dFdvcmQxID0gY3VsMS5BbnkoY3UgPT4gKGN1IGFzIENvbXBhcmlzb25Vbml0V29yZCkgPT0gbnVsbCk7CisgICAgICAgICAgICAgICAgdmFyIGFueUJ1dFdvcmQyID0gY3VsMi5BbnkoY3UgPT4gKGN1IGFzIENvbXBhcmlzb25Vbml0V29yZCkgPT0gbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKCFhbnlCdXRXb3JkMSAmJiAhYW55QnV0V29yZDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbWF4TGVuID0gTWF0aC5NYXgoY3VsMS5MZW5ndGgsIGN1bDIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoZG91YmxlKWN1cnJlbnRMb25nZXN0Q29tbW9uU2VxdWVuY2VMZW5ndGggLyAoZG91YmxlKW1heExlbikgPCBzZXR0aW5ncy5EZXRhaWxUaHJlc2hvbGQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJMSA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEkyID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGN1cnJlbnRJMSA9PSAtMSAmJiBjdXJyZW50STIgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGxlZnRMZW5ndGggPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxLkxlbmd0aDsKKyAgICAgICAgICAgICAgICB2YXIgbGVmdFRhYmxlcyA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTEuT2ZUeXBlPENvbXBhcmlzb25Vbml0R3JvdXA+KCkuV2hlcmUobCA9PiBsLkNvbXBhcmlzb25Vbml0R3JvdXBUeXBlID09IENvbXBhcmlzb25Vbml0R3JvdXBUeXBlLlRhYmxlKS5Db3VudCgpOworICAgICAgICAgICAgICAgIHZhciBsZWZ0Um93cyA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTEuT2ZUeXBlPENvbXBhcmlzb25Vbml0R3JvdXA+KCkuV2hlcmUobCA9PiBsLkNvbXBhcmlzb25Vbml0R3JvdXBUeXBlID09IENvbXBhcmlzb25Vbml0R3JvdXBUeXBlLlJvdykuQ291bnQoKTsKKyAgICAgICAgICAgICAgICB2YXIgbGVmdENlbGxzID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MS5PZlR5cGU8Q29tcGFyaXNvblVuaXRHcm91cD4oKS5XaGVyZShsID0+IGwuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUgPT0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuQ2VsbCkuQ291bnQoKTsKKyAgICAgICAgICAgICAgICB2YXIgbGVmdFBhcmFncmFwaHMgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxLk9mVHlwZTxDb21wYXJpc29uVW5pdEdyb3VwPigpLldoZXJlKGwgPT4gbC5Db21wYXJpc29uVW5pdEdyb3VwVHlwZSA9PSBDb21wYXJpc29uVW5pdEdyb3VwVHlwZS5QYXJhZ3JhcGgpLkNvdW50KCk7CisgICAgICAgICAgICAgICAgdmFyIGxlZnRUZXh0Ym94ZXMgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxLk9mVHlwZTxDb21wYXJpc29uVW5pdEdyb3VwPigpLldoZXJlKGwgPT4gbC5Db21wYXJpc29uVW5pdEdyb3VwVHlwZSA9PSBDb21wYXJpc29uVW5pdEdyb3VwVHlwZS5UZXh0Ym94KS5Db3VudCgpOworICAgICAgICAgICAgICAgIHZhciBsZWZ0V29yZHMgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxLk9mVHlwZTxDb21wYXJpc29uVW5pdFdvcmQ+KCkuQ291bnQoKTsKKworICAgICAgICAgICAgICAgIHZhciByaWdodExlbmd0aCA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTIuTGVuZ3RoOworICAgICAgICAgICAgICAgIHZhciByaWdodFRhYmxlcyA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTIuT2ZUeXBlPENvbXBhcmlzb25Vbml0R3JvdXA+KCkuV2hlcmUobCA9PiBsLkNvbXBhcmlzb25Vbml0R3JvdXBUeXBlID09IENvbXBhcmlzb25Vbml0R3JvdXBUeXBlLlRhYmxlKS5Db3VudCgpOworICAgICAgICAgICAgICAgIHZhciByaWdodFJvd3MgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLk9mVHlwZTxDb21wYXJpc29uVW5pdEdyb3VwPigpLldoZXJlKGwgPT4gbC5Db21wYXJpc29uVW5pdEdyb3VwVHlwZSA9PSBDb21wYXJpc29uVW5pdEdyb3VwVHlwZS5Sb3cpLkNvdW50KCk7CisgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2VsbHMgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLk9mVHlwZTxDb21wYXJpc29uVW5pdEdyb3VwPigpLldoZXJlKGwgPT4gbC5Db21wYXJpc29uVW5pdEdyb3VwVHlwZSA9PSBDb21wYXJpc29uVW5pdEdyb3VwVHlwZS5DZWxsKS5Db3VudCgpOworICAgICAgICAgICAgICAgIHZhciByaWdodFBhcmFncmFwaHMgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLk9mVHlwZTxDb21wYXJpc29uVW5pdEdyb3VwPigpLldoZXJlKGwgPT4gbC5Db21wYXJpc29uVW5pdEdyb3VwVHlwZSA9PSBDb21wYXJpc29uVW5pdEdyb3VwVHlwZS5QYXJhZ3JhcGgpLkNvdW50KCk7CisgICAgICAgICAgICAgICAgdmFyIHJpZ2h0VGV4dGJveGVzID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5Mi5PZlR5cGU8Q29tcGFyaXNvblVuaXRHcm91cD4oKS5XaGVyZShsID0+IGwuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUgPT0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuVGV4dGJveCkuQ291bnQoKTsKKyAgICAgICAgICAgICAgICB2YXIgcmlnaHRXb3JkcyA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTIuT2ZUeXBlPENvbXBhcmlzb25Vbml0V29yZD4oKS5Db3VudCgpOworCisgICAgICAgICAgICAgICAgLy8gaWYgZWl0aGVyIHNpZGUgaGFzIGJvdGggd29yZHMsIHJvd3MgYW5kIHRleHQgYm94ZXMsIHRoZW4gd2UgbmVlZCB0byBzZXBhcmF0ZSBvdXQgaW50byBzZXBhcmF0ZSB1bmtub3duIGNvcnJlbGF0ZWQgc2VxdWVuY2VzCisgICAgICAgICAgICAgICAgLy8gZ3JvdXAgYWRqYWNlbnQgYmFzZWQgb24gd2hldGhlciB3b3JkLCByb3csIG9yIHRleHRib3gKKyAgICAgICAgICAgICAgICAvLyBpbiBtb3N0IGNhc2VzLCB0aGUgY291bnQgb2YgZ3JvdXBzIHdpbGwgYmUgdGhlIHNhbWUsIGJ1dCB0aGV5IG1heSBkaWZmZXIKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZmlyc3QgZ3JvdXAgb24gZWl0aGVyIHNpZGUgaXMgd29yZCwgdGhlbiBjcmVhdGUgYSBkZWxldGVkIG9yIGluc2VydGVkIGNvcnIgc2VxdSBmb3IgaXQuCisgICAgICAgICAgICAgICAgLy8gdGhlbiBoYXZlIGNvdW50ZXIgb24gYm90aCBzaWRlcyBwb2ludGluZyB0byB0aGUgZmlyc3QgbWF0Y2hlZCBwYWlycyBvZiByb3dzCisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuIHVua25vd24gY29yciBzZXF1IGZvciBpdC4KKyAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgYm90aCBjb3VudGVycworICAgICAgICAgICAgICAgIC8vIGlmIG9uZSBpcyBhdCBlbmQgYnV0IHRoZSBvdGhlciBpcyBub3QsIHRoZW4gdGFnIHRoZSByZW1haW5pbmcgY29udGVudCBhcyBpbnNlcnRlZCBvciBkZWxldGVkLCBhbmQgZG9uZS4KKyAgICAgICAgICAgICAgICAvLyBpZiBib3RoIGFyZSBhdCB0aGUgZW5kLCB0aGVuIGRvbmUKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIG5ldyBsaXN0IG9mIGNvcnIgc2VxdQorCisgICAgICAgICAgICAgICAgdmFyIGxlZnRPbmx5V29yZHNSb3dzVGV4dGJveGVzID0gbGVmdExlbmd0aCA9PSBsZWZ0V29yZHMgKyBsZWZ0Um93cyArIGxlZnRUZXh0Ym94ZXM7CisgICAgICAgICAgICAgICAgdmFyIHJpZ2h0T25seVdvcmRzUm93c1RleHRib3hlcyA9IHJpZ2h0TGVuZ3RoID09IHJpZ2h0V29yZHMgKyByaWdodFJvd3MgKyByaWdodFRleHRib3hlczsKKyAgICAgICAgICAgICAgICBpZiAoKGxlZnRXb3JkcyA+IDAgfHwgcmlnaHRXb3JkcyA+IDApICYmCisgICAgICAgICAgICAgICAgICAgIChsZWZ0Um93cyA+IDAgfHwgcmlnaHRSb3dzID4gMCB8fCBsZWZ0VGV4dGJveGVzID4gMCB8fCByaWdodFRleHRib3hlcyA+IDApICYmCisgICAgICAgICAgICAgICAgICAgIChsZWZ0T25seVdvcmRzUm93c1RleHRib3hlcyAmJiByaWdodE9ubHlXb3Jkc1Jvd3NUZXh0Ym94ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxlZnRHcm91cGVkID0gdW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgLkNvbXBhcmlzb25Vbml0QXJyYXkxCisgICAgICAgICAgICAgICAgICAgICAgICAuR3JvdXBBZGphY2VudChjdSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdSBpcyBDb21wYXJpc29uVW5pdFdvcmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIldvcmQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VnID0gY3UgYXMgQ29tcGFyaXNvblVuaXRHcm91cDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1Zy5Db21wYXJpc29uVW5pdEdyb3VwVHlwZSA9PSBDb21wYXJpc29uVW5pdEdyb3VwVHlwZS5Sb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlJvdyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdWcuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUgPT0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuVGV4dGJveCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVGV4dGJveCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0R3JvdXBlZCA9IHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MgorICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoY3UgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3UgaXMgQ29tcGFyaXNvblVuaXRXb3JkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJXb3JkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1ZyA9IGN1IGFzIENvbXBhcmlzb25Vbml0R3JvdXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdWcuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUgPT0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuUm93KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJSb3ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VnLkNvbXBhcmlzb25Vbml0R3JvdXBUeXBlID09IENvbXBhcmlzb25Vbml0R3JvdXBUeXBlLlRleHRib3gpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlRleHRib3giOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgIGludCBpTGVmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCBpUmlnaHQgPSAwOworCisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiB1bmtub3duIGNvcnIgc2VxdSBmb3IgaXQuCisgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCBib3RoIGNvdW50ZXJzCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIG9uZSBpcyBhdCBlbmQgYnV0IHRoZSBvdGhlciBpcyBub3QsIHRoZW4gdGFnIHRoZSByZW1haW5pbmcgY29udGVudCBhcyBpbnNlcnRlZCBvciBkZWxldGVkLCBhbmQgZG9uZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgYm90aCBhcmUgYXQgdGhlIGVuZCwgdGhlbiBkb25lCisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgbmV3IGxpc3Qgb2YgY29yciBzZXF1CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0R3JvdXBlZFtpTGVmdF0uS2V5ID09IHJpZ2h0R3JvdXBlZFtpUmlnaHRdLktleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbGVmdEdyb3VwZWRbaUxlZnRdLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gcmlnaHRHcm91cGVkW2lSaWdodF0uVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5Vbmtub3duOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQodW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2lSaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0byBkZWNpZGUgd2hpY2ggb2YgdGhlIGZvbGxvd2luZyB0d28gYnJhbmNoZXMgdG8gZG8gZmlyc3QgYmFzZWQgb24gd2hldGhlciB0aGUgbGVmdCBjb250YWlucyBhIHBhcmFncmFwaCBtYXJrCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpLmUuIGNhbnQgaW5zZXJ0IGEgc3RyaW5nIG9mIGRlbGV0ZWQgdGV4dCByaWdodCBiZWZvcmUgYSB0YWJsZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGVmdEdyb3VwZWRbaUxlZnRdLktleSA9PSAiV29yZCIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0R3JvdXBlZFtpTGVmdF0uU2VsZWN0KGxnID0+IGxnLkRlc2NlbmRhbnRDb250ZW50QXRvbXMoKSkuU2VsZWN0TWFueShtID0+IG0pLkxhc3QoKS5Db250ZW50RWxlbWVudC5OYW1lICE9IFcucFByICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRHcm91cGVkW2lSaWdodF0uS2V5ID09ICJSb3ciKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTIgPSByaWdodEdyb3VwZWRbaVJpZ2h0XS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5JbnNlcnRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2lSaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJpZ2h0R3JvdXBlZFtpUmlnaHRdLktleSA9PSAiV29yZCIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodEdyb3VwZWRbaVJpZ2h0XS5TZWxlY3QobGcgPT4gbGcuRGVzY2VuZGFudENvbnRlbnRBdG9tcygpKS5TZWxlY3RNYW55KG0gPT4gbSkuTGFzdCgpLkNvbnRlbnRFbGVtZW50Lk5hbWUgIT0gVy5wUHIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0R3JvdXBlZFtpTGVmdF0uS2V5ID09ICJSb3ciKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTIgPSBsZWZ0R3JvdXBlZFtpTGVmdF0uVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuSW5zZXJ0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZChpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGVmdEdyb3VwZWRbaUxlZnRdLktleSA9PSAiV29yZCIgJiYgcmlnaHRHcm91cGVkW2lSaWdodF0uS2V5ICE9ICJXb3JkIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbGVmdEdyb3VwZWRbaUxlZnRdLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuRGVsZXRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraUxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxlZnRHcm91cGVkW2lMZWZ0XS5LZXkgIT0gIldvcmQiICYmIHJpZ2h0R3JvdXBlZFtpUmlnaHRdLktleSA9PSAiV29yZCIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IHJpZ2h0R3JvdXBlZFtpUmlnaHRdLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraVJpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaUxlZnQgPT0gbGVmdEdyb3VwZWQuTGVuZ3RoICYmIGlSaWdodCA9PSByaWdodEdyb3VwZWQuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGNvbnRlbnQgb24gdGhlIGxlZnQsIGJ1dCBub3QgY29udGVudCBvbiB0aGUgcmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpUmlnaHQgPT0gcmlnaHRHcm91cGVkLkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaUxlZnQ7IGogPCBsZWZ0R3JvdXBlZC5MZW5ndGg7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbGVmdEdyb3VwZWRbal0uVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBjb250ZW50IG9uIHRoZSByaWdodCBidXQgbm90IG9uIHRoZSBsZWZ0CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpTGVmdCA9PSBsZWZ0R3JvdXBlZC5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGlSaWdodDsgaiA8IHJpZ2h0R3JvdXBlZC5MZW5ndGg7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTEgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IHJpZ2h0R3JvdXBlZFtqXS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuSW5zZXJ0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSBjb250aW51ZSBvbiBuZXh0IHJvdW5kLgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaWYgYm90aCBzaWRlcyBjb250YWluIHRhYmxlcyBhbmQgcGFyYWdyYXBocywgdGhlbiBzcGxpdCBpbnRvIG11bHRpcGxlIHVua25vd24gY29yciBzZXF1CisgICAgICAgICAgICAgICAgaWYgKGxlZnRUYWJsZXMgPiAwICYmIHJpZ2h0VGFibGVzID4gMCAmJgorICAgICAgICAgICAgICAgICAgICBsZWZ0UGFyYWdyYXBocyA+IDAgJiYgcmlnaHRQYXJhZ3JhcGhzID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAobGVmdExlbmd0aCA+IDEgfHwgcmlnaHRMZW5ndGggPiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBsZWZ0R3JvdXBlZCA9IHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MQorICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoY3UgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VnID0gY3UgYXMgQ29tcGFyaXNvblVuaXRHcm91cDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VnLkNvbXBhcmlzb25Vbml0R3JvdXBUeXBlID09IENvbXBhcmlzb25Vbml0R3JvdXBUeXBlLlRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlRhYmxlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0R3JvdXBlZCA9IHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MgorICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoY3UgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VnID0gY3UgYXMgQ29tcGFyaXNvblVuaXRHcm91cDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VnLkNvbXBhcmlzb25Vbml0R3JvdXBUeXBlID09IENvbXBhcmlzb25Vbml0R3JvdXBUeXBlLlRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlRhYmxlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlMZWZ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlSaWdodCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuIHVua25vd24gY29yciBzZXF1IGZvciBpdC4KKyAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IGJvdGggY291bnRlcnMKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgb25lIGlzIGF0IGVuZCBidXQgdGhlIG90aGVyIGlzIG5vdCwgdGhlbiB0YWcgdGhlIHJlbWFpbmluZyBjb250ZW50IGFzIGluc2VydGVkIG9yIGRlbGV0ZWQsIGFuZCBkb25lLgorICAgICAgICAgICAgICAgICAgICAvLyBpZiBib3RoIGFyZSBhdCB0aGUgZW5kLCB0aGVuIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBuZXcgbGlzdCBvZiBjb3JyIHNlcXUKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsZWZ0R3JvdXBlZFtpTGVmdF0uS2V5ID09ICJUYWJsZSIgJiYgcmlnaHRHcm91cGVkW2lSaWdodF0uS2V5ID09ICJUYWJsZSIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlZnRHcm91cGVkW2lMZWZ0XS5LZXkgPT0gIlBhcmEiICYmIHJpZ2h0R3JvdXBlZFtpUmlnaHRdLktleSA9PSAiUGFyYSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTEgPSBsZWZ0R3JvdXBlZFtpTGVmdF0uVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTIgPSByaWdodEdyb3VwZWRbaVJpZ2h0XS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLlVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZCh1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2lMZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraVJpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGVmdEdyb3VwZWRbaUxlZnRdLktleSA9PSAiUGFyYSIgJiYgcmlnaHRHcm91cGVkW2lSaWdodF0uS2V5ID09ICJUYWJsZSIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MSA9IGxlZnRHcm91cGVkW2lMZWZ0XS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZChkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2lMZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGVmdEdyb3VwZWRbaUxlZnRdLktleSA9PSAiVGFibGUiICYmIHJpZ2h0R3JvdXBlZFtpUmlnaHRdLktleSA9PSAiUGFyYSIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IHJpZ2h0R3JvdXBlZFtpUmlnaHRdLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraVJpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaUxlZnQgPT0gbGVmdEdyb3VwZWQuTGVuZ3RoICYmIGlSaWdodCA9PSByaWdodEdyb3VwZWQuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGNvbnRlbnQgb24gdGhlIGxlZnQsIGJ1dCBub3QgY29udGVudCBvbiB0aGUgcmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpUmlnaHQgPT0gcmlnaHRHcm91cGVkLkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaUxlZnQ7IGogPCBsZWZ0R3JvdXBlZC5MZW5ndGg7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbGVmdEdyb3VwZWRbal0uVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBjb250ZW50IG9uIHRoZSByaWdodCBidXQgbm90IG9uIHRoZSBsZWZ0CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpTGVmdCA9PSBsZWZ0R3JvdXBlZC5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGlSaWdodDsgaiA8IHJpZ2h0R3JvdXBlZC5MZW5ndGg7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTEgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IHJpZ2h0R3JvdXBlZFtqXS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuSW5zZXJ0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSBjb250aW51ZSBvbiBuZXh0IHJvdW5kLgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWYgYm90aCBzaWRlcyBjb25zaXN0cyBvZiBhIHNpbmdsZSB0YWJsZSwgYW5kIGlmIHRoZSB0YWJsZSBjb250YWlucyBtZXJnZWQgY2VsbHMsIHRoZW4gbWFyayBhcyBkZWxldGVkL2luc2VydGVkCisgICAgICAgICAgICAgICAgaWYgKGxlZnRUYWJsZXMgPT0gMSAmJiBsZWZ0TGVuZ3RoID09IDEgJiYKKyAgICAgICAgICAgICAgICAgICAgcmlnaHRUYWJsZXMgPT0gMSAmJiByaWdodExlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IERvTGNzQWxnb3JpdGhtRm9yVGFibGUodW5rbm93biwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIGVpdGhlciBzaWRlIGNvbnRhaW5zIG9ubHkgcGFyYXMgb3IgdGFibGVzLCB0aGVuIGZsYXR0ZW4gYW5kIGl0ZXJhdGUuCisgICAgICAgICAgICAgICAgdmFyIGxlZnRPbmx5UGFyYXNUYWJsZXNUZXh0Ym94ZXMgPSBsZWZ0TGVuZ3RoID09IGxlZnRUYWJsZXMgKyBsZWZ0UGFyYWdyYXBocyArIGxlZnRUZXh0Ym94ZXM7CisgICAgICAgICAgICAgICAgdmFyIHJpZ2h0T25seVBhcmFzVGFibGVzVGV4dGJveGVzID0gcmlnaHRMZW5ndGggPT0gcmlnaHRUYWJsZXMgKyByaWdodFBhcmFncmFwaHMgKyByaWdodFRleHRib3hlczsKKyAgICAgICAgICAgICAgICBpZiAobGVmdE9ubHlQYXJhc1RhYmxlc1RleHRib3hlcyAmJiByaWdodE9ubHlQYXJhc1RhYmxlc1RleHRib3hlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZsYXR0ZW4gcGFyYXMgYW5kIHRhYmxlcywgYW5kIGl0ZXJhdGUKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxlZnQgPSB1bmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTEKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoY3UgPT4gY3UuQ29udGVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0TWFueShtID0+IG0pCisgICAgICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByaWdodCA9IHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MgorICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChjdSA9PiBjdS5Db250ZW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3RNYW55KG0gPT4gbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5Vbmtub3duOworICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbGVmdDsKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IHJpZ2h0OworICAgICAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaWYgZmlyc3Qgb2YgbGVmdCBpcyBhIHJvdyBhbmQgZmlyc3Qgb2YgcmlnaHQgaXMgYSByb3cKKyAgICAgICAgICAgICAgICAvLyB0aGVuIGZsYXR0ZW4gdGhlIHJvdyB0byBjZWxscyBhbmQgaXRlcmF0ZS4KKworICAgICAgICAgICAgICAgIHZhciBmaXJzdExlZnQgPSB1bmtub3duCisgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKSBhcyBDb21wYXJpc29uVW5pdEdyb3VwOworCisgICAgICAgICAgICAgICAgdmFyIGZpcnN0UmlnaHQgPSB1bmtub3duCisgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MgorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKSBhcyBDb21wYXJpc29uVW5pdEdyb3VwOworCisgICAgICAgICAgICAgICAgaWYgKGZpcnN0TGVmdCAhPSBudWxsICYmIGZpcnN0UmlnaHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdExlZnQuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUgPT0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuUm93ICYmCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJpZ2h0LkNvbXBhcmlzb25Vbml0R3JvdXBUeXBlID09IENvbXBhcmlzb25Vbml0R3JvdXBUeXBlLlJvdykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFyaXNvblVuaXRbXSBsZWZ0Q29udGVudCA9IGZpcnN0TGVmdC5Db250ZW50cy5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJpc29uVW5pdFtdIHJpZ2h0Q29udGVudCA9IGZpcnN0UmlnaHQuQ29udGVudHMuVG9BcnJheSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGVuTGVmdCA9IGxlZnRDb250ZW50Lkxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZW5SaWdodCA9IHJpZ2h0Q29udGVudC5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW5MZWZ0IDwgbGVuUmlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdENvbnRlbnQgPSBsZWZ0Q29udGVudC5Db25jYXQoRW51bWVyYWJsZS5SZXBlYXQ8Q29tcGFyaXNvblVuaXQ+KG51bGwsIGxlblJpZ2h0IC0gbGVuTGVmdCkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxlblJpZ2h0IDwgbGVuTGVmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodENvbnRlbnQgPSByaWdodENvbnRlbnQuQ29uY2F0KEVudW1lcmFibGUuUmVwZWF0PENvbXBhcmlzb25Vbml0PihudWxsLCBsZW5MZWZ0IC0gbGVuUmlnaHQpKS5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q29ycmVsYXRlZFNlcXVlbmNlPiBuZXdDcyA9IGxlZnRDb250ZW50LlppcChyaWdodENvbnRlbnQsIChsLCByKSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsICE9IG51bGwgJiYgciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTEgPSBuZXdbXSB7IGwgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IG5ld1tdIHsgciB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1tdIHsgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gci5Db250ZW50cy5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuSW5zZXJ0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdbXSB7IGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbC5Db250ZW50cy5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuRGVsZXRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1tdIHsgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdE1hbnkobSA9PiBtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNzIGluIG5ld0NzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoY3MpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtYWluZGVyTGVmdCA9IHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZW1haW5kZXJSaWdodCA9IHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5kZXJMZWZ0Lkxlbmd0aCA+IDAgJiYgcmVtYWluZGVyUmlnaHQuTGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MSA9IHJlbWFpbmRlckxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZChkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlbWFpbmRlclJpZ2h0Lkxlbmd0aCA+IDAgJiYgcmVtYWluZGVyTGVmdC5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5JbnNlcnRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTIgPSByZW1haW5kZXJSaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlbWFpbmRlckxlZnQuTGVuZ3RoID4gMCAmJiByZW1haW5kZXJSaWdodC5MZW5ndGggPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlMiA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlMi5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLlVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZTIuQ29tcGFyaXNvblVuaXRBcnJheTEgPSByZW1haW5kZXJMZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UyLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gcmVtYWluZGVyUmlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZCh1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlMik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzX0ZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaXRlbS5Ub1N0cmluZygpKS5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNicyA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuTm90ZVBhZChzYnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdExlZnQuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUgPT0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuQ2VsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RSaWdodC5Db21wYXJpc29uVW5pdEdyb3VwVHlwZSA9PSBDb21wYXJpc29uVW5pdEdyb3VwVHlwZS5DZWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IGZpcnN0TGVmdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Db250ZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByaWdodCA9IGZpcnN0UmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ29udGVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5Vbmtub3duOworICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MSA9IGxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gcmlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtYWluZGVyTGVmdCA9IHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZW1haW5kZXJSaWdodCA9IHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5kZXJMZWZ0Lkxlbmd0aCA+IDAgJiYgcmVtYWluZGVyUmlnaHQuTGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MSA9IHJlbWFpbmRlckxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZChkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlbWFpbmRlclJpZ2h0Lkxlbmd0aCA+IDAgJiYgcmVtYWluZGVyTGVmdC5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5JbnNlcnRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTIgPSByZW1haW5kZXJSaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlbWFpbmRlckxlZnQuTGVuZ3RoID4gMCAmJiByZW1haW5kZXJSaWdodC5MZW5ndGggPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlMiA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlMi5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLlVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZTIuQ29tcGFyaXNvblVuaXRBcnJheTEgPSByZW1haW5kZXJMZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UyLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gcmVtYWluZGVyUmlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZCh1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlMik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MS5BbnkoKSAmJiB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLkFueSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxlZnQgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxLkZpcnN0KCkgYXMgQ29tcGFyaXNvblVuaXRXb3JkOworICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHQgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyLkZpcnN0KCkgYXMgQ29tcGFyaXNvblVuaXRHcm91cDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUgPT0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuUm93KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UzID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UzLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuSW5zZXJ0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZTMuQ29tcGFyaXNvblVuaXRBcnJheTEgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UzLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UzID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZTMuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5EZWxldGVkOworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZTMuQ29tcGFyaXNvblVuaXRBcnJheTEgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxOworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZTMuQ29tcGFyaXNvblVuaXRBcnJheTIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZChkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlMyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdDIgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxLkZpcnN0KCkgYXMgQ29tcGFyaXNvblVuaXRHcm91cDsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0MiA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTIuRmlyc3QoKSBhcyBDb21wYXJpc29uVW5pdFdvcmQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChyaWdodDIgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDIgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDIuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUgPT0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuUm93KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZTMgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlMy5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlMy5Db21wYXJpc29uVW5pdEFycmF5MSA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTE7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlMy5Db21wYXJpc29uVW5pdEFycmF5MiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlMyA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlMy5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkOworICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UzLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlMy5Db21wYXJpc29uVW5pdEFycmF5MiA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTI7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlMyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdENvbnRlbnRBdG9tTGVmdCA9IHVua25vd24uQ29tcGFyaXNvblVuaXRBcnJheTEuU2VsZWN0KGN1ID0+IGN1LkRlc2NlbmRhbnRDb250ZW50QXRvbXMoKS5MYXN0KCkpLkxhc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RDb250ZW50QXRvbVJpZ2h0ID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5Mi5TZWxlY3QoY3UgPT4gY3UuRGVzY2VuZGFudENvbnRlbnRBdG9tcygpLkxhc3QoKSkuTGFzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdENvbnRlbnRBdG9tTGVmdCAhPSBudWxsICYmIGxhc3RDb250ZW50QXRvbVJpZ2h0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Q29udGVudEF0b21MZWZ0LkNvbnRlbnRFbGVtZW50Lk5hbWUgPT0gVy5wUHIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q29udGVudEF0b21SaWdodC5Db250ZW50RWxlbWVudC5OYW1lICE9IFcucFByKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZTUgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2U1LkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuSW5zZXJ0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2U1LkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZTUuQ29tcGFyaXNvblVuaXRBcnJheTIgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2U1KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlNSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlNS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZTUuQ29tcGFyaXNvblVuaXRBcnJheTEgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2U1LkNvbXBhcmlzb25Vbml0QXJyYXkyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2U1KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsYXN0Q29udGVudEF0b21MZWZ0LkNvbnRlbnRFbGVtZW50Lk5hbWUgIT0gVy5wUHIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q29udGVudEF0b21SaWdodC5Db250ZW50RWxlbWVudC5OYW1lID09IFcucFByKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlNSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlNS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZTUuQ29tcGFyaXNvblVuaXRBcnJheTEgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2U1LkNvbXBhcmlzb25Vbml0QXJyYXkyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2U1KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZTUgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2U1LkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuSW5zZXJ0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2U1LkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZTUuQ29tcGFyaXNvblVuaXRBcnJheTIgPSB1bmtub3duLkNvbXBhcmlzb25Vbml0QXJyYXkyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2U1KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZTQgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZTQuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5EZWxldGVkOworICAgICAgICAgICAgICAgIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2U0LkNvbXBhcmlzb25Vbml0QXJyYXkxID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MTsKKyAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlNC5Db21wYXJpc29uVW5pdEFycmF5MiA9IG51bGw7CisgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZChkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlNCk7CisKKyAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2U0ID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlNC5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkOworICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlNC5Db21wYXJpc29uVW5pdEFycmF5MSA9IG51bGw7CisgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2U0LkNvbXBhcmlzb25Vbml0QXJyYXkyID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MjsKKyAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlNCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIC8vIGhlcmUgd2UgaGF2ZSB0aGUgbG9uZ2VzdCBjb21tb24gc3Vic2VxdWVuY2UuCisgICAgICAgICAgICAvLyBidXQgaXQgbWF5IHN0YXJ0IGluIHRoZSBtaWRkbGUgb2YgYSBwYXJhZ3JhcGguCisgICAgICAgICAgICAvLyB0aGVyZWZvcmUgbmVlZCB0byBkaXNwb3NlIG9mIHRoZSBjb250ZW50IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9uZ2VzdCBjb21tb24gc3Vic2VxdWVuY2UgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyYWdyYXBoLgorICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgYmUgaW4gYSBzZXBhcmF0ZSB1bmtub3duIHJlZ2lvbgorICAgICAgICAgICAgLy8gaWYgY291bnRDb21tb25BdEVuZCAhPSAwLCBhbmQgaWYgaXQgY29udGFpbnMgYSBwYXJhZ3JhcGggbWFyaywgdGhlbiBpZiB0aGVyZSBhcmUgY29tcGFyaXNvbiB1bml0cyBpbiB0aGUgc2FtZSBwYXJhZ3JhcGggYmVmb3JlIHRoZSBjb21tb24gYXQgZW5kIChpbiBlaXRoZXIgdmVyc2lvbikKKyAgICAgICAgICAgIC8vIHRoZW4gd2Ugd2FudCB0byBwdXQgYWxsIG9mIHRob3NlIGNvbXBhcmlzb24gdW5pdHMgaW50byBhIHNpbmdsZSB1bmtub3duLCB3aGVyZSB0aGV5IG11c3QgYmUgcmVzb2x2ZWQgYWdhaW5zdCBlYWNoIG90aGVyLiAgV2UgZG9uJ3Qgd2FudCB0aG9zZQorICAgICAgICAgICAgLy8gY29tcGFyaXNvbiB1bml0cyB0byBnbyBpbnRvIHRoZSBtaWRkbGUgdW5rbm93biBjb21wYXJpc29uIHVuaXQuCisKKyAgICAgICAgICAgIGludCByZW1haW5pbmdJbkxlZnRQYXJhZ3JhcGggPSAwOworICAgICAgICAgICAgaW50IHJlbWFpbmluZ0luUmlnaHRQYXJhZ3JhcGggPSAwOworICAgICAgICAgICAgaWYgKGN1cnJlbnRMb25nZXN0Q29tbW9uU2VxdWVuY2VMZW5ndGggIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY29tbW9uU2VxID0gdW5rbm93bgorICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTEKKyAgICAgICAgICAgICAgICAgICAgLlNraXAoY3VycmVudEkxKQorICAgICAgICAgICAgICAgICAgICAuVGFrZShjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0T2ZDb21tb25TZXEgPSBjb21tb25TZXEuRmlyc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RPZkNvbW1vblNlcSBpcyBDb21wYXJpc29uVW5pdFdvcmQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBhcmUgdGhlcmUgYW55IHBhcmFncmFwaCBtYXJrcyBpbiB0aGUgY29tbW9uIHNlcSBhdCBlbmQ/CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21tb25TZXEuQW55KGN1ID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdENvbXBhcmlzb25Vbml0QXRvbSA9IGN1LkNvbnRlbnRzLk9mVHlwZTxDb21wYXJpc29uVW5pdEF0b20+KCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbXBhcmlzb25Vbml0QXRvbSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdENvbXBhcmlzb25Vbml0QXRvbS5Db250ZW50RWxlbWVudC5OYW1lID09IFcucFByOworICAgICAgICAgICAgICAgICAgICB9KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nSW5MZWZ0UGFyYWdyYXBoID0gdW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UYWtlKGN1cnJlbnRJMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUmV2ZXJzZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRha2VXaGlsZShjdSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY3UgaXMgQ29tcGFyaXNvblVuaXRXb3JkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0Q29tcGFyaXNvblVuaXRBdG9tID0gY3UuQ29udGVudHMuT2ZUeXBlPENvbXBhcmlzb25Vbml0QXRvbT4oKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb21wYXJpc29uVW5pdEF0b20gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3RDb21wYXJpc29uVW5pdEF0b20uQ29udGVudEVsZW1lbnQuTmFtZSAhPSBXLnBQcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Db3VudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nSW5SaWdodFBhcmFncmFwaCA9IHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVGFrZShjdXJyZW50STIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJldmVyc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UYWtlV2hpbGUoY3UgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGN1IGlzIENvbXBhcmlzb25Vbml0V29yZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdENvbXBhcmlzb25Vbml0QXRvbSA9IGN1LkNvbnRlbnRzLk9mVHlwZTxDb21wYXJpc29uVW5pdEF0b20+KCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29tcGFyaXNvblVuaXRBdG9tID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0Q29tcGFyaXNvblVuaXRBdG9tLkNvbnRlbnRFbGVtZW50Lk5hbWUgIT0gVy5wUHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGNvdW50QmVmb3JlQ3VycmVudFBhcmFncmFwaExlZnQgPSBjdXJyZW50STEgLSByZW1haW5pbmdJbkxlZnRQYXJhZ3JhcGg7CisgICAgICAgICAgICB2YXIgY291bnRCZWZvcmVDdXJyZW50UGFyYWdyYXBoUmlnaHQgPSBjdXJyZW50STIgLSByZW1haW5pbmdJblJpZ2h0UGFyYWdyYXBoOworCisgICAgICAgICAgICBpZiAoY291bnRCZWZvcmVDdXJyZW50UGFyYWdyYXBoTGVmdCA+IDAgJiYgY291bnRCZWZvcmVDdXJyZW50UGFyYWdyYXBoUmlnaHQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuRGVsZXRlZDsKKyAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gY3VsMQorICAgICAgICAgICAgICAgICAgICAuVGFrZShjb3VudEJlZm9yZUN1cnJlbnRQYXJhZ3JhcGhMZWZ0KQorICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgICAgIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTIgPSBudWxsOworICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjb3VudEJlZm9yZUN1cnJlbnRQYXJhZ3JhcGhMZWZ0ID09IDAgJiYgY291bnRCZWZvcmVDdXJyZW50UGFyYWdyYXBoUmlnaHQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkOworICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IGN1bDIKKyAgICAgICAgICAgICAgICAgICAgLlRha2UoY291bnRCZWZvcmVDdXJyZW50UGFyYWdyYXBoUmlnaHQpCisgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZChpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjb3VudEJlZm9yZUN1cnJlbnRQYXJhZ3JhcGhMZWZ0ID4gMCAmJiBjb3VudEJlZm9yZUN1cnJlbnRQYXJhZ3JhcGhSaWdodCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLlVua25vd247CisgICAgICAgICAgICAgICAgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MSA9IGN1bDEKKyAgICAgICAgICAgICAgICAgICAgLlRha2UoY291bnRCZWZvcmVDdXJyZW50UGFyYWdyYXBoTGVmdCkKKyAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gY3VsMgorICAgICAgICAgICAgICAgICAgICAuVGFrZShjb3VudEJlZm9yZUN1cnJlbnRQYXJhZ3JhcGhSaWdodCkKKyAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQodW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjb3VudEJlZm9yZUN1cnJlbnRQYXJhZ3JhcGhMZWZ0ID09IDAgJiYgY291bnRCZWZvcmVDdXJyZW50UGFyYWdyYXBoUmlnaHQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZW1haW5pbmdJbkxlZnRQYXJhZ3JhcGggPiAwICYmIHJlbWFpbmluZ0luUmlnaHRQYXJhZ3JhcGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuRGVsZXRlZDsKKyAgICAgICAgICAgICAgICBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gY3VsMQorICAgICAgICAgICAgICAgICAgICAuU2tpcChjb3VudEJlZm9yZUN1cnJlbnRQYXJhZ3JhcGhMZWZ0KQorICAgICAgICAgICAgICAgICAgICAuVGFrZShyZW1haW5pbmdJbkxlZnRQYXJhZ3JhcGgpCisgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IG51bGw7CisgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZChkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHJlbWFpbmluZ0luTGVmdFBhcmFncmFwaCA9PSAwICYmIHJlbWFpbmluZ0luUmlnaHRQYXJhZ3JhcGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkOworICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db21wYXJpc29uVW5pdEFycmF5MiA9IGN1bDIKKyAgICAgICAgICAgICAgICAgICAgLlNraXAoY291bnRCZWZvcmVDdXJyZW50UGFyYWdyYXBoUmlnaHQpCisgICAgICAgICAgICAgICAgICAgIC5UYWtlKHJlbWFpbmluZ0luUmlnaHRQYXJhZ3JhcGgpCisgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZChpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChyZW1haW5pbmdJbkxlZnRQYXJhZ3JhcGggPiAwICYmIHJlbWFpbmluZ0luUmlnaHRQYXJhZ3JhcGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5Vbmtub3duOworICAgICAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTEgPSBjdWwxCisgICAgICAgICAgICAgICAgICAgIC5Ta2lwKGNvdW50QmVmb3JlQ3VycmVudFBhcmFncmFwaExlZnQpCisgICAgICAgICAgICAgICAgICAgIC5UYWtlKHJlbWFpbmluZ0luTGVmdFBhcmFncmFwaCkKKyAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gY3VsMgorICAgICAgICAgICAgICAgICAgICAuU2tpcChjb3VudEJlZm9yZUN1cnJlbnRQYXJhZ3JhcGhSaWdodCkKKyAgICAgICAgICAgICAgICAgICAgLlRha2UocmVtYWluaW5nSW5SaWdodFBhcmFncmFwaCkKKyAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocmVtYWluaW5nSW5MZWZ0UGFyYWdyYXBoID09IDAgJiYgcmVtYWluaW5nSW5SaWdodFBhcmFncmFwaCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIG1pZGRsZUVxdWFsID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgbWlkZGxlRXF1YWwuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5FcXVhbDsKKyAgICAgICAgICAgIG1pZGRsZUVxdWFsLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gY3VsMQorICAgICAgICAgICAgICAgIC5Ta2lwKGN1cnJlbnRJMSkKKyAgICAgICAgICAgICAgICAuVGFrZShjdXJyZW50TG9uZ2VzdENvbW1vblNlcXVlbmNlTGVuZ3RoKQorICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisgICAgICAgICAgICBtaWRkbGVFcXVhbC5Db21wYXJpc29uVW5pdEFycmF5MiA9IGN1bDIKKyAgICAgICAgICAgICAgICAuU2tpcChjdXJyZW50STIpCisgICAgICAgICAgICAgICAgLlRha2UoY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUxlbmd0aCkKKyAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZChtaWRkbGVFcXVhbCk7CisKKworICAgICAgICAgICAgaW50IGVuZEkxID0gY3VycmVudEkxICsgY3VycmVudExvbmdlc3RDb21tb25TZXF1ZW5jZUxlbmd0aDsKKyAgICAgICAgICAgIGludCBlbmRJMiA9IGN1cnJlbnRJMiArIGN1cnJlbnRMb25nZXN0Q29tbW9uU2VxdWVuY2VMZW5ndGg7CisKKyAgICAgICAgICAgIHZhciByZW1haW5pbmcxID0gY3VsMQorICAgICAgICAgICAgICAgIC5Ta2lwKGVuZEkxKQorICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIHZhciByZW1haW5pbmcyID0gY3VsMgorICAgICAgICAgICAgICAgIC5Ta2lwKGVuZEkyKQorICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIC8vIGhlcmUgaXMgdGhlIHBvaW50IHRoYXQgd2Ugd2FudCB0byBtYWtlIGEgbmV3IHVua25vd24gZnJvbSB0aGlzIHBvaW50IHRvIHRoZSBlbmQgb2YgdGhlIHBhcmFncmFwaCB0aGF0IGNvbnRhaW5zIHRoZSBlcXVhbCBwYXJ0cy4KKyAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBuZXZlciBodXJ0IGFueXRoaW5nLCBhbmQgd2lsbCBpbiBtYW55IGNhc2VzIHJlc3VsdCBpbiBhIGJldHRlciBkaWZmZXJlbmNlLgorCisgICAgICAgICAgICB2YXIgbGVmdEN1dyA9IG1pZGRsZUVxdWFsLkNvbXBhcmlzb25Vbml0QXJyYXkxW21pZGRsZUVxdWFsLkNvbXBhcmlzb25Vbml0QXJyYXkxLkxlbmd0aCAtIDFdIGFzIENvbXBhcmlzb25Vbml0V29yZDsKKyAgICAgICAgICAgIGlmIChsZWZ0Q3V3ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGxhc3RDb250ZW50QXRvbSA9IGxlZnRDdXcuRGVzY2VuZGFudENvbnRlbnRBdG9tcygpLkxhc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbWlkZGxlRXF1YWwgZGlkIG5vdCBlbmQgd2l0aCBhIHBhcmFncmFwaCBtYXJrCisgICAgICAgICAgICAgICAgaWYgKGxhc3RDb250ZW50QXRvbSAhPSBudWxsICYmIGxhc3RDb250ZW50QXRvbS5Db250ZW50RWxlbWVudC5OYW1lICE9IFcucFByKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkeDEgPSBGaW5kSW5kZXhPZk5leHRQYXJhTWFyayhyZW1haW5pbmcxKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkeDIgPSBGaW5kSW5kZXhPZk5leHRQYXJhTWFyayhyZW1haW5pbmcyKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZVJlbWFpbmluZyA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZVJlbWFpbmluZy5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLlVua25vd247CisgICAgICAgICAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2VSZW1haW5pbmcuQ29tcGFyaXNvblVuaXRBcnJheTEgPSByZW1haW5pbmcxLlRha2UoaWR4MSkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlUmVtYWluaW5nLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gcmVtYWluaW5nMi5UYWtlKGlkeDIpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlLkFkZCh1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlUmVtYWluaW5nKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZUFmdGVyID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlQWZ0ZXIuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5Vbmtub3duOworICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlQWZ0ZXIuQ29tcGFyaXNvblVuaXRBcnJheTEgPSByZW1haW5pbmcxLlNraXAoaWR4MSkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlQWZ0ZXIuQ29tcGFyaXNvblVuaXRBcnJheTIgPSByZW1haW5pbmcyLlNraXAoaWR4MikuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2VBZnRlcik7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlMjAgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlMjAuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5Vbmtub3duOworICAgICAgICAgICAgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZTIwLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gcmVtYWluaW5nMTsKKyAgICAgICAgICAgIHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UyMC5Db21wYXJpc29uVW5pdEFycmF5MiA9IHJlbWFpbmluZzI7CisgICAgICAgICAgICBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UuQWRkKHVua25vd25Db3JyZWxhdGVkU2VxdWVuY2UyMCk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2U7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgRmluZEluZGV4T2ZOZXh0UGFyYU1hcmsoQ29tcGFyaXNvblVuaXRbXSBjdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3VsLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjdXcgPSBjdWxbaV0gYXMgQ29tcGFyaXNvblVuaXRXb3JkOworICAgICAgICAgICAgICAgIHZhciBsYXN0QXRvbSA9IGN1dy5EZXNjZW5kYW50Q29udGVudEF0b21zKCkuTGFzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmIChsYXN0QXRvbS5Db250ZW50RWxlbWVudC5OYW1lID09IFcucFByKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjdWwuTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDb3JyZWxhdGVkU2VxdWVuY2U+IERvTGNzQWxnb3JpdGhtRm9yVGFibGUoQ29ycmVsYXRlZFNlcXVlbmNlIHVua25vd24sIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8Q29ycmVsYXRlZFNlcXVlbmNlPiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2UgPSBuZXcgTGlzdDxDb3JyZWxhdGVkU2VxdWVuY2U+KCk7CisKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgdGFibGUgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cywgYW5kIGFsbCByb3dzIGhhdmUgZXF1YWwgQ29ycmVsYXRlZFNIQTFIYXNoLCB0aGVuIHdlIGNhbiBmbGF0dGVuIGFuZCBjb21wYXJlIGV2ZXJ5IGNvcnJlc3BvbmRpbmcgcm93LgorICAgICAgICAgICAgLy8gVGhpcyBpcyB0cnVlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGVyZSBhcmUgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHkgbWVyZ2VkIGNlbGxzLCBzaW5jZSB0aGF0IGNoYXJhY3RlcmlzdGljIGlzIGluY29ycG9yYXRlZCBpbnRvIHRoZSBDb3JyZXNwb25kaW5nU0hBMUhhc2guCisgICAgICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IG5vdCB2ZXJ5IGNvbW1vbiwgYnV0IGl0IHdpbGwgbmV2ZXIgZG8gYW55IGhhcm0uCisgICAgICAgICAgICB2YXIgdGJsR3JvdXAxID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5MS5GaXJzdCgpIGFzIENvbXBhcmlzb25Vbml0R3JvdXA7CisgICAgICAgICAgICB2YXIgdGJsR3JvdXAyID0gdW5rbm93bi5Db21wYXJpc29uVW5pdEFycmF5Mi5GaXJzdCgpIGFzIENvbXBhcmlzb25Vbml0R3JvdXA7CisgICAgICAgICAgICBpZiAodGJsR3JvdXAxLkNvbnRlbnRzLkNvdW50KCkgPT0gdGJsR3JvdXAyLkNvbnRlbnRzLkNvdW50KCkpIC8vIGlmIHRoZXJlIGFyZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB6aXBwZWQgPSB0YmxHcm91cDEuQ29udGVudHMuWmlwKHRibEdyb3VwMi5Db250ZW50cywgKHIxLCByMikgPT4gbmV3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSb3cxID0gcjEgYXMgQ29tcGFyaXNvblVuaXRHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgUm93MiA9IHIyIGFzIENvbXBhcmlzb25Vbml0R3JvdXAsCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgdmFyIGNhbkNvbGxhcHNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoemlwcGVkLkFueSh6ID0+IHouUm93MS5Db3JyZWxhdGVkU0hBMUhhc2ggIT0gei5Sb3cyLkNvcnJlbGF0ZWRTSEExSGFzaCkpCisgICAgICAgICAgICAgICAgICAgIGNhbkNvbGxhcHNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGNhbkNvbGxhcHNlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlID0gemlwcGVkCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHogPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbmV3W10geyB6LlJvdzEgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gbmV3W10geyB6LlJvdzIgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZmlyc3RDb250ZW50QXRvbTEgPSB0YmxHcm91cDEuRGVzY2VuZGFudENvbnRlbnRBdG9tcygpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoZmlyc3RDb250ZW50QXRvbTEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIGVycm9yIik7CisgICAgICAgICAgICB2YXIgdGJsRWxlbWVudDEgPSBmaXJzdENvbnRlbnRBdG9tMQorICAgICAgICAgICAgICAgIC5BbmNlc3RvckVsZW1lbnRzCisgICAgICAgICAgICAgICAgLlJldmVyc2UoKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChhID0+IGEuTmFtZSA9PSBXLnRibCk7CisKKyAgICAgICAgICAgIHZhciBmaXJzdENvbnRlbnRBdG9tMiA9IHRibEdyb3VwMi5EZXNjZW5kYW50Q29udGVudEF0b21zKCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChmaXJzdENvbnRlbnRBdG9tMiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgICAgIHZhciB0YmxFbGVtZW50MiA9IGZpcnN0Q29udGVudEF0b20yCisgICAgICAgICAgICAgICAgLkFuY2VzdG9yRWxlbWVudHMKKyAgICAgICAgICAgICAgICAuUmV2ZXJzZSgpCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGEgPT4gYS5OYW1lID09IFcudGJsKTsKKworICAgICAgICAgICAgdmFyIGxlZnRDb250YWluc01lcmdlZCA9IHRibEVsZW1lbnQxCisgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAuQW55KGQgPT4gZC5OYW1lID09IFcudk1lcmdlIHx8IGQuTmFtZSA9PSBXLmdyaWRTcGFuKTsKKworICAgICAgICAgICAgdmFyIHJpZ2h0Q29udGFpbnNNZXJnZWQgPSB0YmxFbGVtZW50MgorICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cygpCisgICAgICAgICAgICAgICAgLkFueShkID0+IGQuTmFtZSA9PSBXLnZNZXJnZSB8fCBkLk5hbWUgPT0gVy5ncmlkU3Bhbik7CisKKyAgICAgICAgICAgIGlmIChsZWZ0Q29udGFpbnNNZXJnZWQgfHwgcmlnaHRDb250YWluc01lcmdlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgIC8vIElmIFN0cnVjdHVyZVNoYTFIYXNoIGlzIHRoZSBzYW1lIGZvciBib3RoIHRhYmxlcywgdGhlbiB3ZSBrbm93IHRoYXQgdGhlIHN0cnVjdHVyZSBvZiB0aGUgdGFibGVzIGlzIGlkZW50aWNhbCwgc28gd2UgY2FuIGJyZWFrIGludG8gY29ycmVsYXRlZCBzZXF1ZW5jZXMgZm9yIHJvd3MuCisgICAgICAgICAgICAgICAgaWYgKHRibEdyb3VwMS5TdHJ1Y3R1cmVTSEExSGFzaCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIHRibEdyb3VwMi5TdHJ1Y3R1cmVTSEExSGFzaCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIHRibEdyb3VwMS5TdHJ1Y3R1cmVTSEExSGFzaCA9PSB0YmxHcm91cDIuU3RydWN0dXJlU0hBMUhhc2gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgemlwcGVkID0gdGJsR3JvdXAxLkNvbnRlbnRzLlppcCh0YmxHcm91cDIuQ29udGVudHMsIChyMSwgcjIpID0+IG5ldworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBSb3cxID0gcjEgYXMgQ29tcGFyaXNvblVuaXRHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJvdzIgPSByMiBhcyBDb21wYXJpc29uVW5pdEdyb3VwLAorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3TGlzdE9mQ29ycmVsYXRlZFNlcXVlbmNlID0gemlwcGVkCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHogPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZSA9IG5ldyBDb3JyZWxhdGVkU2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkxID0gbmV3W10geyB6LlJvdzEgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gbmV3W10geyB6LlJvdzIgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duQ29ycmVsYXRlZFNlcXVlbmNlLkNvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5rbm93bkNvcnJlbGF0ZWRTZXF1ZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0T2ZDb3JyZWxhdGVkU2VxdWVuY2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGZsYXR0ZW4gdG8gcm93cworICAgICAgICAgICAgICAgIHZhciBkZWxldGVkQ29ycmVsYXRlZFNlcXVlbmNlID0gbmV3IENvcnJlbGF0ZWRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTEgPSB1bmtub3duCisgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEFycmF5MQorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHogPT4gei5Db250ZW50cykKKyAgICAgICAgICAgICAgICAgICAgLlNlbGVjdE1hbnkobSA9PiBtKQorICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgICAgIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTIgPSBudWxsOworICAgICAgICAgICAgICAgIGRlbGV0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29ycmVsYXRpb25TdGF0dXMgPSBDb3JyZWxhdGlvblN0YXR1cy5EZWxldGVkOworICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoZGVsZXRlZENvcnJlbGF0ZWRTZXF1ZW5jZSk7CisKKyAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UgPSBuZXcgQ29ycmVsYXRlZFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UuQ29tcGFyaXNvblVuaXRBcnJheTEgPSBudWxsOworICAgICAgICAgICAgICAgIGluc2VydGVkQ29ycmVsYXRlZFNlcXVlbmNlLkNvbXBhcmlzb25Vbml0QXJyYXkyID0gdW5rbm93bgorICAgICAgICAgICAgICAgICAgICAuQ29tcGFyaXNvblVuaXRBcnJheTIKKyAgICAgICAgICAgICAgICAgICAgLlNlbGVjdCh6ID0+IHouQ29udGVudHMpCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3RNYW55KG0gPT4gbSkKKyAgICAgICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBpbnNlcnRlZENvcnJlbGF0ZWRTZXF1ZW5jZS5Db3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkluc2VydGVkOworICAgICAgICAgICAgICAgIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZS5BZGQoaW5zZXJ0ZWRDb3JyZWxhdGVkU2VxdWVuY2UpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0xpc3RPZkNvcnJlbGF0ZWRTZXF1ZW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWE5hbWVbXSBXb3JkQnJlYWtFbGVtZW50cyA9IG5ldyBYTmFtZVtdIHsKKyAgICAgICAgICAgIFcucFByLAorICAgICAgICAgICAgVy50YWIsCisgICAgICAgICAgICBXLmJyLAorICAgICAgICAgICAgVy5jb250aW51YXRpb25TZXBhcmF0b3IsCisgICAgICAgICAgICBXLmNyLAorICAgICAgICAgICAgVy5kYXlMb25nLAorICAgICAgICAgICAgVy5kYXlTaG9ydCwKKyAgICAgICAgICAgIFcuZHJhd2luZywKKyAgICAgICAgICAgIFcucGljdCwKKyAgICAgICAgICAgIFcuZW5kbm90ZVJlZiwKKyAgICAgICAgICAgIFcuZm9vdG5vdGVSZWYsCisgICAgICAgICAgICBXLm1vbnRoTG9uZywKKyAgICAgICAgICAgIFcubW9udGhTaG9ydCwKKyAgICAgICAgICAgIFcubm9CcmVha0h5cGhlbiwKKyAgICAgICAgICAgIFcuX29iamVjdCwKKyAgICAgICAgICAgIFcucHRhYiwKKyAgICAgICAgICAgIFcuc2VwYXJhdG9yLAorICAgICAgICAgICAgVy5zeW0sCisgICAgICAgICAgICBXLnllYXJMb25nLAorICAgICAgICAgICAgVy55ZWFyU2hvcnQsCisgICAgICAgICAgICBNLm9NYXRoUGFyYSwKKyAgICAgICAgICAgIE0ub01hdGgsCisgICAgICAgICAgICBXLmZvb3Rub3RlUmVmZXJlbmNlLAorICAgICAgICAgICAgVy5lbmRub3RlUmVmZXJlbmNlLAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgY2xhc3MgQXRnYncKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludD8gS2V5OworICAgICAgICAgICAgcHVibGljIENvbXBhcmlzb25Vbml0QXRvbSBDb21wYXJpc29uVW5pdEF0b21NZW1iZXI7CisgICAgICAgICAgICBwdWJsaWMgaW50IE5leHRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIENvbXBhcmlzb25Vbml0W10gR2V0Q29tcGFyaXNvblVuaXRMaXN0KENvbXBhcmlzb25Vbml0QXRvbVtdIGNvbXBhcmlzb25Vbml0QXRvbUxpc3QsIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZWVkID0gbmV3IEF0Z2J3KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLZXkgPSBudWxsLAorICAgICAgICAgICAgICAgIENvbXBhcmlzb25Vbml0QXRvbU1lbWJlciA9IG51bGwsCisgICAgICAgICAgICAgICAgTmV4dEluZGV4ID0gMCwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHZhciBncm91cGluZ0tleSA9IGNvbXBhcmlzb25Vbml0QXRvbUxpc3QKKyAgICAgICAgICAgICAgICAuUm9sbHVwKHNlZWQsIChzciwgcHJldkF0Z2J3LCBpKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50PyBrZXkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dEluZGV4ID0gcHJldkF0Z2J3Lk5leHRJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyLkNvbnRlbnRFbGVtZW50Lk5hbWUgPT0gVy50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2hyID0gc3IuQ29udGVudEVsZW1lbnQuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBjaHJbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy4nIHx8IGNoID09ICcsJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJlZm9yZUlzRGlnaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJldiA9IGNvbXBhcmlzb25Vbml0QXRvbUxpc3RbaSAtIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldi5Db250ZW50RWxlbWVudC5OYW1lID09IFcudCAmJiBjaGFyLklzRGlnaXQocHJldi5Db250ZW50RWxlbWVudC5WYWx1ZVswXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVJc0RpZ2l0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZnRlcklzRGlnaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGNvbXBhcmlzb25Vbml0QXRvbUxpc3QuTGVuZ3RoIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gY29tcGFyaXNvblVuaXRBdG9tTGlzdFtpICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LkNvbnRlbnRFbGVtZW50Lk5hbWUgPT0gVy50ICYmIGNoYXIuSXNEaWdpdChuZXh0LkNvbnRlbnRFbGVtZW50LlZhbHVlWzBdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVySXNEaWdpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZWZvcmVJc0RpZ2l0IHx8IGFmdGVySXNEaWdpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IG5leHRJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IG5leHRJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2V0dGluZ3MuV29yZFNlcGFyYXRvcnMuQ29udGFpbnMoY2gpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJbmRleCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IG5leHRJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBuZXh0SW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoV29yZEJyZWFrRWxlbWVudHMuQ29udGFpbnMoc3IuQ29udGVudEVsZW1lbnQuTmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJbmRleCsrOworICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gbmV4dEluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBuZXh0SW5kZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdGdidygpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleSA9IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmlzb25Vbml0QXRvbU1lbWJlciA9IHNyLAorICAgICAgICAgICAgICAgICAgICAgICAgTmV4dEluZGV4ID0gbmV4dEluZGV4LAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBpZiAoc19GYWxzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGdyb3VwaW5nS2V5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0uS2V5ICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiICAgICIgKyBpdGVtLkNvbXBhcmlzb25Vbml0QXRvbU1lbWJlci5Ub1N0cmluZygwKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBUZXN0VXRpbC5Ob3RlUGFkKHNicyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBncm91cGVkQnlXb3JkcyA9IGdyb3VwaW5nS2V5CisgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoZ2MgPT4gZ2MuS2V5KTsKKworICAgICAgICAgICAgaWYgKHNfRmFsc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZ3JvdXAgaW4gZ3JvdXBlZEJ5V29yZHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIkdyb3VwID09PT09ICIgKyBncm91cC5LZXkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGdjIGluIGdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiAgICAiICsgZ2MuQ29tcGFyaXNvblVuaXRBdG9tTWVtYmVyLlRvU3RyaW5nKDApICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFyIHNicyA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgVGVzdFV0aWwuTm90ZVBhZChzYnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgd2l0aEhpZXJhcmNoaWNhbEdyb3VwaW5nS2V5ID0gZ3JvdXBlZEJ5V29yZHMKKyAgICAgICAgICAgICAgIC5TZWxlY3QoZyA9PgorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHZhciBoaWVyYXJjaGljYWxHcm91cGluZ0FycmF5ID0gZworICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Db21wYXJpc29uVW5pdEF0b21NZW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5BbmNlc3RvckVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoYSA9PiBDb21wYXJpc29uR3JvdXBpbmdFbGVtZW50cy5Db250YWlucyhhLk5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChhID0+IGEuTmFtZS5Mb2NhbE5hbWUgKyAiOiIgKyAoc3RyaW5nKWEuQXR0cmlidXRlKFB0T3BlblhtbC5VbmlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdpdGhIaWVyYXJjaGljYWxHcm91cGluZ0tleSgpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJpc29uVW5pdFdvcmQgPSBuZXcgQ29tcGFyaXNvblVuaXRXb3JkKGcuU2VsZWN0KGdjID0+IGdjLkNvbXBhcmlzb25Vbml0QXRvbU1lbWJlcikpLAorICAgICAgICAgICAgICAgICAgICAgICBIaWVyYXJjaGljYWxHcm91cGluZ0FycmF5ID0gaGllcmFyY2hpY2FsR3JvdXBpbmdBcnJheSwKKyAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgaWYgKHNfRmFsc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZ3JvdXAgaW4gd2l0aEhpZXJhcmNoaWNhbEdyb3VwaW5nS2V5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJHcm91cGluZyBBcnJheTogIiArIGdyb3VwLkhpZXJhcmNoaWNhbEdyb3VwaW5nQXJyYXkuU2VsZWN0KGdhbSA9PiBnYW0gKyAiIC0gIikuU3RyaW5nQ29uY2F0ZW5hdGUoKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZ2MgaW4gZ3JvdXAuQ29tcGFyaXNvblVuaXRXb3JkLkNvbnRlbnRzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiAgICAiICsgZ2MuVG9TdHJpbmcoMCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgc2JzID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBUZXN0VXRpbC5Ob3RlUGFkKHNicyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBjdWwgPSBHZXRIaWVyYXJjaGljYWxDb21wYXJpc29uVW5pdHMod2l0aEhpZXJhcmNoaWNhbEdyb3VwaW5nS2V5LCAwKS5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIGlmIChzX0ZhbHNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzdHIgPSBDb21wYXJpc29uVW5pdC5Db21wYXJpc29uVW5pdExpc3RUb1N0cmluZyhjdWwpOworICAgICAgICAgICAgICAgIFRlc3RVdGlsLk5vdGVQYWQoc3RyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGN1bDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIElFbnVtZXJhYmxlPENvbXBhcmlzb25Vbml0PiBHZXRIaWVyYXJjaGljYWxDb21wYXJpc29uVW5pdHMoSUVudW1lcmFibGU8V2l0aEhpZXJhcmNoaWNhbEdyb3VwaW5nS2V5PiBpbnB1dCwgaW50IGxldmVsKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZ3JvdXBlZCA9IGlucHV0CisgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQod2hnayA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID49IHdoZ2suSGllcmFyY2hpY2FsR3JvdXBpbmdBcnJheS5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aGdrLkhpZXJhcmNoaWNhbEdyb3VwaW5nQXJyYXlbbGV2ZWxdOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgdmFyIHJldExpc3QgPSBncm91cGVkCisgICAgICAgICAgICAgICAgLlNlbGVjdChnYyA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdjLktleSA9PSAiIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChJRW51bWVyYWJsZTxDb21wYXJpc29uVW5pdD4pZ2MuU2VsZWN0KHdoZ2sgPT4gd2hnay5Db21wYXJpc29uVW5pdFdvcmQpLlRvTGlzdCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFyaXNvblVuaXRHcm91cFR5cGU/IGdyb3VwID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcGwgPSBnYy5LZXkuU3BsaXQoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGxbMF0gPT0gInAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuUGFyYWdyYXBoOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3BsWzBdID09ICJ0YmwiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuVGFibGU7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzcGxbMF0gPT0gInRyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IENvbXBhcmlzb25Vbml0R3JvdXBUeXBlLlJvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNwbFswXSA9PSAidGMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuQ2VsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNwbFswXSA9PSAidHhieENvbnRlbnQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuVGV4dGJveDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZEhpZXJhcmNoaWNhbENvbXBhcmlzb25Vbml0cyA9IEdldEhpZXJhcmNoaWNhbENvbXBhcmlzb25Vbml0cyhnYywgbGV2ZWwgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDb21wVW5pdEdyb3VwID0gbmV3IENvbXBhcmlzb25Vbml0R3JvdXAoY2hpbGRIaWVyYXJjaGljYWxDb21wYXJpc29uVW5pdHMsIChDb21wYXJpc29uVW5pdEdyb3VwVHlwZSlncm91cCwgbGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1tdIHsgbmV3Q29tcFVuaXRHcm91cCB9OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuU2VsZWN0TWFueShtID0+IG0pCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgcmV0dXJuIHJldExpc3Q7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYTmFtZVtdIEFsbG93YWJsZVJ1bkNoaWxkcmVuID0gbmV3IFhOYW1lW10geworICAgICAgICAgICAgVy5iciwKKyAgICAgICAgICAgIFcuZHJhd2luZywKKyAgICAgICAgICAgIFcuY3IsCisgICAgICAgICAgICBXLmRheUxvbmcsCisgICAgICAgICAgICBXLmRheVNob3J0LAorICAgICAgICAgICAgVy5mb290bm90ZVJlZmVyZW5jZSwKKyAgICAgICAgICAgIFcuZW5kbm90ZVJlZmVyZW5jZSwKKyAgICAgICAgICAgIFcubW9udGhMb25nLAorICAgICAgICAgICAgVy5tb250aFNob3J0LAorICAgICAgICAgICAgVy5ub0JyZWFrSHlwaGVuLAorICAgICAgICAgICAgLy9XLl9vYmplY3QsCisgICAgICAgICAgICBXLnBnTnVtLAorICAgICAgICAgICAgVy5wdGFiLAorICAgICAgICAgICAgVy5zb2Z0SHlwaGVuLAorICAgICAgICAgICAgVy5zeW0sCisgICAgICAgICAgICBXLnRhYiwKKyAgICAgICAgICAgIFcueWVhckxvbmcsCisgICAgICAgICAgICBXLnllYXJTaG9ydCwKKyAgICAgICAgICAgIE0ub01hdGhQYXJhLAorICAgICAgICAgICAgTS5vTWF0aCwKKyAgICAgICAgICAgIFcuZmxkQ2hhciwKKyAgICAgICAgICAgIFcuaW5zdHJUZXh0LAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhOYW1lW10gRWxlbWVudHNUb1Rocm93QXdheSA9IG5ldyBYTmFtZVtdIHsKKyAgICAgICAgICAgIFcuYm9va21hcmtTdGFydCwKKyAgICAgICAgICAgIFcuYm9va21hcmtFbmQsCisgICAgICAgICAgICBXLmNvbW1lbnRSYW5nZVN0YXJ0LAorICAgICAgICAgICAgVy5jb21tZW50UmFuZ2VFbmQsCisgICAgICAgICAgICBXLmxhc3RSZW5kZXJlZFBhZ2VCcmVhaywKKyAgICAgICAgICAgIFcucHJvb2ZFcnIsCisgICAgICAgICAgICBXLnRibFByLAorICAgICAgICAgICAgVy5zZWN0UHIsCisgICAgICAgICAgICBXLnBlcm1FbmQsCisgICAgICAgICAgICBXLnBlcm1TdGFydCwKKyAgICAgICAgICAgIFcuZm9vdG5vdGVSZWYsCisgICAgICAgICAgICBXLmVuZG5vdGVSZWYsCisgICAgICAgICAgICBXLnNlcGFyYXRvciwKKyAgICAgICAgICAgIFcuY29udGludWF0aW9uU2VwYXJhdG9yLAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhOYW1lW10gRWxlbWVudHNUb0hhdmVTaGExSGFzaCA9IG5ldyBYTmFtZVtdCisgICAgICAgIHsKKyAgICAgICAgICAgIFcucCwKKyAgICAgICAgICAgIFcudGJsLAorICAgICAgICAgICAgVy50ciwKKyAgICAgICAgICAgIFcudGMsCisgICAgICAgICAgICBXLmRyYXdpbmcsCisgICAgICAgICAgICBXLnBpY3QsCisgICAgICAgICAgICBXLnR4YnhDb250ZW50LAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhOYW1lW10gSW52YWxpZEVsZW1lbnRzID0gbmV3IFhOYW1lW10KKyAgICAgICAgeworICAgICAgICAgICAgVy5hbHRDaHVuaywKKyAgICAgICAgICAgIFcuY3VzdG9tWG1sLAorICAgICAgICAgICAgVy5jdXN0b21YbWxEZWxSYW5nZUVuZCwKKyAgICAgICAgICAgIFcuY3VzdG9tWG1sRGVsUmFuZ2VTdGFydCwKKyAgICAgICAgICAgIFcuY3VzdG9tWG1sSW5zUmFuZ2VFbmQsCisgICAgICAgICAgICBXLmN1c3RvbVhtbEluc1JhbmdlU3RhcnQsCisgICAgICAgICAgICBXLmN1c3RvbVhtbE1vdmVGcm9tUmFuZ2VFbmQsCisgICAgICAgICAgICBXLmN1c3RvbVhtbE1vdmVGcm9tUmFuZ2VTdGFydCwKKyAgICAgICAgICAgIFcuY3VzdG9tWG1sTW92ZVRvUmFuZ2VFbmQsCisgICAgICAgICAgICBXLmN1c3RvbVhtbE1vdmVUb1JhbmdlU3RhcnQsCisgICAgICAgICAgICBXLm1vdmVGcm9tLAorICAgICAgICAgICAgVy5tb3ZlRnJvbVJhbmdlU3RhcnQsCisgICAgICAgICAgICBXLm1vdmVGcm9tUmFuZ2VFbmQsCisgICAgICAgICAgICBXLm1vdmVUbywKKyAgICAgICAgICAgIFcubW92ZVRvUmFuZ2VTdGFydCwKKyAgICAgICAgICAgIFcubW92ZVRvUmFuZ2VFbmQsCisgICAgICAgICAgICBXLnN1YkRvYywKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGNsYXNzIFJlY3Vyc2lvbkluZm8KKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFhOYW1lIEVsZW1lbnROYW1lOworICAgICAgICAgICAgcHVibGljIFhOYW1lW10gQ2hpbGRFbGVtZW50UHJvcGVydHlOYW1lczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFJlY3Vyc2lvbkluZm9bXSBSZWN1cnNpb25FbGVtZW50cyA9IG5ldyBSZWN1cnNpb25JbmZvW10KKyAgICAgICAgeworICAgICAgICAgICAgbmV3IFJlY3Vyc2lvbkluZm8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lID0gVy5kZWwsCisgICAgICAgICAgICAgICAgQ2hpbGRFbGVtZW50UHJvcGVydHlOYW1lcyA9IG51bGwsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgbmV3IFJlY3Vyc2lvbkluZm8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lID0gVy5pbnMsCisgICAgICAgICAgICAgICAgQ2hpbGRFbGVtZW50UHJvcGVydHlOYW1lcyA9IG51bGwsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgbmV3IFJlY3Vyc2lvbkluZm8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lID0gVy50YmwsCisgICAgICAgICAgICAgICAgQ2hpbGRFbGVtZW50UHJvcGVydHlOYW1lcyA9IG5ld1tdIHsgVy50YmxQciwgVy50YmxHcmlkLCBXLnRibFByRXggfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBuZXcgUmVjdXJzaW9uSW5mbygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRWxlbWVudE5hbWUgPSBXLnRyLAorICAgICAgICAgICAgICAgIENoaWxkRWxlbWVudFByb3BlcnR5TmFtZXMgPSBuZXdbXSB7IFcudHJQciwgVy50YmxQckV4IH0sCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgbmV3IFJlY3Vyc2lvbkluZm8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lID0gVy50YywKKyAgICAgICAgICAgICAgICBDaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWVzID0gbmV3W10geyBXLnRjUHIsIFcudGJsUHJFeCB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIG5ldyBSZWN1cnNpb25JbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50TmFtZSA9IFcucGljdCwKKyAgICAgICAgICAgICAgICBDaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWVzID0gbmV3W10geyBWTUwuc2hhcGV0eXBlIH0sCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgbmV3IFJlY3Vyc2lvbkluZm8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lID0gVk1MLmdyb3VwLAorICAgICAgICAgICAgICAgIENoaWxkRWxlbWVudFByb3BlcnR5TmFtZXMgPSBudWxsLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIG5ldyBSZWN1cnNpb25JbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50TmFtZSA9IFZNTC5zaGFwZSwKKyAgICAgICAgICAgICAgICBDaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWVzID0gbnVsbCwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBuZXcgUmVjdXJzaW9uSW5mbygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRWxlbWVudE5hbWUgPSBWTUwucmVjdCwKKyAgICAgICAgICAgICAgICBDaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWVzID0gbnVsbCwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBuZXcgUmVjdXJzaW9uSW5mbygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRWxlbWVudE5hbWUgPSBWTUwudGV4dGJveCwKKyAgICAgICAgICAgICAgICBDaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWVzID0gbnVsbCwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBuZXcgUmVjdXJzaW9uSW5mbygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRWxlbWVudE5hbWUgPSBPLl9sb2NrLAorICAgICAgICAgICAgICAgIENoaWxkRWxlbWVudFByb3BlcnR5TmFtZXMgPSBudWxsLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIG5ldyBSZWN1cnNpb25JbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50TmFtZSA9IFcudHhieENvbnRlbnQsCisgICAgICAgICAgICAgICAgQ2hpbGRFbGVtZW50UHJvcGVydHlOYW1lcyA9IG51bGwsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgbmV3IFJlY3Vyc2lvbkluZm8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lID0gVzEwLndyYXAsCisgICAgICAgICAgICAgICAgQ2hpbGRFbGVtZW50UHJvcGVydHlOYW1lcyA9IG51bGwsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgbmV3IFJlY3Vyc2lvbkluZm8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lID0gVy5zZHQsCisgICAgICAgICAgICAgICAgQ2hpbGRFbGVtZW50UHJvcGVydHlOYW1lcyA9IG5ld1tdIHsgVy5zZHRQciwgVy5zZHRFbmRQciB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIG5ldyBSZWN1cnNpb25JbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50TmFtZSA9IFcuc2R0Q29udGVudCwKKyAgICAgICAgICAgICAgICBDaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWVzID0gbnVsbCwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBuZXcgUmVjdXJzaW9uSW5mbygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRWxlbWVudE5hbWUgPSBXLmh5cGVybGluaywKKyAgICAgICAgICAgICAgICBDaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWVzID0gbnVsbCwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBuZXcgUmVjdXJzaW9uSW5mbygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRWxlbWVudE5hbWUgPSBXLmZsZFNpbXBsZSwKKyAgICAgICAgICAgICAgICBDaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWVzID0gbnVsbCwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBuZXcgUmVjdXJzaW9uSW5mbygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRWxlbWVudE5hbWUgPSBWTUwuc2hhcGV0eXBlLAorICAgICAgICAgICAgICAgIENoaWxkRWxlbWVudFByb3BlcnR5TmFtZXMgPSBudWxsLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIG5ldyBSZWN1cnNpb25JbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50TmFtZSA9IFcuc21hcnRUYWcsCisgICAgICAgICAgICAgICAgQ2hpbGRFbGVtZW50UHJvcGVydHlOYW1lcyA9IG5ld1tdIHsgVy5zbWFydFRhZ1ByIH0sCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgbmV3IFJlY3Vyc2lvbkluZm8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVsZW1lbnROYW1lID0gVy5ydWJ5LAorICAgICAgICAgICAgICAgIENoaWxkRWxlbWVudFByb3BlcnR5TmFtZXMgPSBuZXdbXSB7IFcucnVieVByIH0sCisgICAgICAgICAgICB9LAorICAgICAgICB9OworCisgICAgICAgIGludGVybmFsIHN0YXRpYyBDb21wYXJpc29uVW5pdEF0b21bXSBDcmVhdGVDb21wYXJpc29uVW5pdEF0b21MaXN0KE9wZW5YbWxQYXJ0IHBhcnQsIFhFbGVtZW50IGNvbnRlbnRQYXJlbnQsIFdtbENvbXBhcmVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZlcmlmeU5vSW52YWxpZENvbnRlbnQoY29udGVudFBhcmVudCk7CisgICAgICAgICAgICBBc3NpZ25VbmlkVG9BbGxFbGVtZW50cyhjb250ZW50UGFyZW50KTsgIC8vIGFkZCB0aGUgR3VpZCBpZCB0byBldmVyeSBlbGVtZW50CisgICAgICAgICAgICBNb3ZlTGFzdFNlY3RQckludG9MYXN0UGFyYWdyYXBoKGNvbnRlbnRQYXJlbnQpOworICAgICAgICAgICAgdmFyIGNhbCA9IENyZWF0ZUNvbXBhcmlzb25Vbml0QXRvbUxpc3RJbnRlcm5hbChwYXJ0LCBjb250ZW50UGFyZW50LCBzZXR0aW5ncykuVG9BcnJheSgpOworCisgICAgICAgICAgICBpZiAoc19GYWxzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGNhbCkKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0uVG9TdHJpbmcoKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgIHZhciBzYnMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIFRlc3RVdGlsLk5vdGVQYWQoc2JzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNhbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVmVyaWZ5Tm9JbnZhbGlkQ29udGVudChYRWxlbWVudCBjb250ZW50UGFyZW50KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW52YWxpZEVsZW1lbnQgPSBjb250ZW50UGFyZW50LkRlc2NlbmRhbnRzKCkuRmlyc3RPckRlZmF1bHQoZCA9PiBJbnZhbGlkRWxlbWVudHMuQ29udGFpbnMoZC5OYW1lKSk7CisgICAgICAgICAgICBpZiAoaW52YWxpZEVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJEb2N1bWVudCBjb250YWlucyAiICsgaW52YWxpZEVsZW1lbnQuTmFtZS5Mb2NhbE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIFhEb2N1bWVudCBDb2FsZXNjZShDb21wYXJpc29uVW5pdEF0b21bXSBjb21wYXJpc29uVW5pdEF0b21MaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgbmV3WERvYyA9IG5ldyBYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciBuZXdCb2R5Q2hpbGRyZW4gPSBDb2FsZXNjZVJlY3Vyc2UoY29tcGFyaXNvblVuaXRBdG9tTGlzdCwgMCk7CisgICAgICAgICAgICBuZXdYRG9jLkFkZChuZXcgWEVsZW1lbnQoVy5kb2N1bWVudCwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInciLCBXLncuTmFtZXNwYWNlTmFtZSksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJwdDE0IiwgUHRPcGVuWG1sLnB0Lk5hbWVzcGFjZU5hbWUpLAorICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLmJvZHksIG5ld0JvZHlDaGlsZHJlbikpKTsKKworICAgICAgICAgICAgLy8gbGl0dGxlIGJpdCBvZiBjbGVhbnVwCisgICAgICAgICAgICBNb3ZlTGFzdFNlY3RQclRvQ2hpbGRPZkJvZHkobmV3WERvYyk7CisgICAgICAgICAgICBYRWxlbWVudCBuZXdYRG9jMlJvb3QgPSAoWEVsZW1lbnQpV29yZHByb2Nlc3NpbmdNTFV0aWwuV21sT3JkZXJFbGVtZW50c1BlclN0YW5kYXJkKG5ld1hEb2MuUm9vdCk7CisgICAgICAgICAgICBuZXdYRG9jLlJvb3QuUmVwbGFjZVdpdGgobmV3WERvYzJSb290KTsKKyAgICAgICAgICAgIHJldHVybiBuZXdYRG9jOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IENvYWxlc2NlUmVjdXJzZShJRW51bWVyYWJsZTxDb21wYXJpc29uVW5pdEF0b20+IGxpc3QsIGludCBsZXZlbCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGdyb3VwZWQgPSBsaXN0CisgICAgICAgICAgICAgICAgLkdyb3VwQnkoc3IgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHBlciB0aGUgYWxnb3JpdGhtLCBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbiB3aWxsIG5ldmVyIGV2YWx1YXRlIHRvIHRydWUKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgZXZhbHVhdGVzIHRvIHRydWUsIHRoZW4gdGhlIGJhc2ljIG1lY2hhbmlzbSBmb3IgYnJlYWtpbmcgYSBoaWVyYXJjaGljYWwgc3RydWN0dXJlIGludG8gZmxhdCBhbmQgYmFjayBpcyBicm9rZW4uCisKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGEgdGFibGUsIHdlIGluaXRpYWxseSBnZXQgYWxsIENvbXBhcmlzb25Vbml0QXRvbXMgZm9yIHRoZSBlbnRpcmUgdGFibGUsIHRoZW4gcHJvY2Vzcy4gIFdoZW4gcHJvY2Vzc2luZyBhIHJvdywKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gQ29tcGFyaXNvblVuaXRBdG9tcyB3aWxsIGhhdmUgYW5jZXN0b3JzIG91dHNpZGUgdGhlIHJvdy4gIERpdHRvIGZvciBjZWxscywgYW5kIG9uIGRvd24gdGhlIHRyZWUuCisgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+PSBzci5BbmNlc3RvckVsZW1lbnRzLkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IgNCAtIHdoeSBkbyB3ZSBoYXZlIENvbXBhcmlzb25Vbml0QXRvbSBvYmplY3RzIHdpdGggZmV3ZXIgYW5jZXN0b3JzIHRoYW4gaXRzIHNpYmxpbmdzPyIpOworCisgICAgICAgICAgICAgICAgICAgIHZhciB1bmlkID0gKHN0cmluZylzci5BbmNlc3RvckVsZW1lbnRzW2xldmVsXS5BdHRyaWJ1dGUoUHRPcGVuWG1sLlVuaWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5pZDsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYgKHNfRmFsc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZ3JvdXAgaW4gZ3JvdXBlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiR3JvdXAgS2V5OiB7MH0iLCBncm91cC5LZXkpOworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBncm91cENoaWxkSXRlbSBpbiBncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIgICIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGdyb3VwQ2hpbGRJdGVtLlRvU3RyaW5nKDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciBzYnMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZWxlbWVudExpc3QgPSBncm91cGVkCisgICAgICAgICAgICAgICAgLlNlbGVjdChnID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBzZWUgdGhlIGNvbW1lbnQgYWJvdmUgYXQgdGhlIGJlZ2lubmluZyBvZiBDb2FsZXNjZVJlY3Vyc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID49IGcuRmlyc3QoKS5BbmNlc3RvckVsZW1lbnRzLkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IgMyAtIHdoeSBkbyB3ZSBoYXZlIENvbXBhcmlzb25Vbml0QXRvbSBvYmplY3RzIHdpdGggZmV3ZXIgYW5jZXN0b3JzIHRoYW4gaXRzIHNpYmxpbmdzPyIpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQgPSBnLkZpcnN0KCkuQW5jZXN0b3JFbGVtZW50c1tsZXZlbF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yQmVpbmdDb25zdHJ1Y3RlZC5OYW1lID09IFcucCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwZWRDaGlsZHJlbiA9IGcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR3JvdXBBZGphY2VudChnYyA9PiBnYy5Db250ZW50RWxlbWVudC5OYW1lLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NoaWxkRWxlbWVudHMgPSBncm91cGVkQ2hpbGRyZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZ2MgPT4gZ2MuRmlyc3QoKS5Db250ZW50RWxlbWVudC5OYW1lICE9IFcucFByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZ2MgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2FsZXNjZVJlY3Vyc2UoZ2MsIGxldmVsICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UGFyYVByb3BzID0gZ3JvdXBlZENoaWxkcmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGdjID0+IGdjLkZpcnN0KCkuQ29udGVudEVsZW1lbnQuTmFtZSA9PSBXLnBQcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGdjID0+IGdjLlNlbGVjdChnY2UgPT4gZ2NlLkNvbnRlbnRFbGVtZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFcucCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcmFQcm9wcywgbmV3Q2hpbGRFbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLk5hbWUgPT0gVy5yKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ3JvdXBlZENoaWxkcmVuID0gZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Hcm91cEFkamFjZW50KGdjID0+IGdjLkNvbnRlbnRFbGVtZW50Lk5hbWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q2hpbGRFbGVtZW50cyA9IGdyb3VwZWRDaGlsZHJlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZ2MgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gZ2MuRmlyc3QoKS5Db250ZW50RWxlbWVudC5OYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBXLnQgfHwgbmFtZSA9PSBXLmRlbFRleHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0T2ZUZXh0RWxlbWVudCA9IGdjLlNlbGVjdChnY2UgPT4gZ2NlLkNvbnRlbnRFbGVtZW50LlZhbHVlKS5TdHJpbmdDb25jYXRlbmF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmplY3QpKG5ldyBYRWxlbWVudChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFhtbFNwYWNlQXR0cmlidXRlKHRleHRPZlRleHRFbGVtZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T2ZUZXh0RWxlbWVudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnYy5TZWxlY3QoZ2NlID0+IGdjZS5Db250ZW50RWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcnVuUHJvcHMgPSBhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQuRWxlbWVudHMoVy5yUHIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChXLnIsIHJ1blByb3BzLCBuZXdDaGlsZEVsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhciByZSA9IFJlY3Vyc2lvbkVsZW1lbnRzLkZpcnN0T3JEZWZhdWx0KHogPT4gei5FbGVtZW50TmFtZSA9PSBhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVjb25zdHJ1Y3RFbGVtZW50KGcsIGFuY2VzdG9yQmVpbmdDb25zdHJ1Y3RlZCwgcmUuQ2hpbGRFbGVtZW50UHJvcGVydHlOYW1lcywgbGV2ZWwpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnQgPSBuZXcgWEVsZW1lbnQoYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29hbGVzY2VSZWN1cnNlKGcsIGxldmVsICsgMSkpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50OworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRMaXN0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgUmVjb25zdHJ1Y3RFbGVtZW50KElHcm91cGluZzxzdHJpbmcsIENvbXBhcmlzb25Vbml0QXRvbT4gZywgWEVsZW1lbnQgYW5jZXN0b3JCZWluZ0NvbnN0cnVjdGVkLCBYTmFtZVtdIGNoaWxkUHJvcEVsZW1lbnROYW1lcywgaW50IGxldmVsKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbmV3Q2hpbGRFbGVtZW50cyA9IENvYWxlc2NlUmVjdXJzZShnLCBsZXZlbCArIDEpOworICAgICAgICAgICAgSUVudW1lcmFibGU8WEVsZW1lbnQ+IGNoaWxkUHJvcHMgPSBudWxsOworICAgICAgICAgICAgaWYgKGNoaWxkUHJvcEVsZW1lbnROYW1lcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNoaWxkUHJvcHMgPSBhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUoYSA9PiBjaGlsZFByb3BFbGVtZW50TmFtZXMuQ29udGFpbnMoYS5OYW1lKSk7CisKKyAgICAgICAgICAgIHZhciByZWNvbnN0cnVjdGVkRWxlbWVudCA9IG5ldyBYRWxlbWVudChhbmNlc3RvckJlaW5nQ29uc3RydWN0ZWQuTmFtZSwgY2hpbGRQcm9wcywgbmV3Q2hpbGRFbGVtZW50cyk7CisgICAgICAgICAgICByZXR1cm4gcmVjb25zdHJ1Y3RlZEVsZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIE1vdmVMYXN0U2VjdFBySW50b0xhc3RQYXJhZ3JhcGgoWEVsZW1lbnQgY29udGVudFBhcmVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGxhc3RTZWN0UHJMaXN0ID0gY29udGVudFBhcmVudC5FbGVtZW50cyhXLnNlY3RQcikuVG9MaXN0KCk7CisgICAgICAgICAgICBpZiAobGFzdFNlY3RQckxpc3QuQ291bnQoKSA+IDEpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnZhbGlkIGRvY3VtZW50Iik7CisgICAgICAgICAgICB2YXIgbGFzdFNlY3RQciA9IGxhc3RTZWN0UHJMaXN0LkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAobGFzdFNlY3RQciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBsYXN0UGFyYWdyYXBoID0gY29udGVudFBhcmVudC5FbGVtZW50cyhXLnApLkxhc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdFBhcmFncmFwaCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludmFsaWQgZG9jdW1lbnQiKTsKKyAgICAgICAgICAgICAgICB2YXIgcFByID0gbGFzdFBhcmFncmFwaC5FbGVtZW50KFcucFByKTsKKyAgICAgICAgICAgICAgICBpZiAocFByID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwUHIgPSBuZXcgWEVsZW1lbnQoVy5wUHIpOworICAgICAgICAgICAgICAgICAgICBsYXN0UGFyYWdyYXBoLkFkZEZpcnN0KFcucFByKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcFByLkFkZChsYXN0U2VjdFByKTsKKyAgICAgICAgICAgICAgICBjb250ZW50UGFyZW50LkVsZW1lbnRzKFcuc2VjdFByKS5SZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q29tcGFyaXNvblVuaXRBdG9tPiBDcmVhdGVDb21wYXJpc29uVW5pdEF0b21MaXN0SW50ZXJuYWwoT3BlblhtbFBhcnQgcGFydCwgWEVsZW1lbnQgY29udGVudFBhcmVudCwgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbXBhcmlzb25Vbml0QXRvbUxpc3QgPSBuZXcgTGlzdDxDb21wYXJpc29uVW5pdEF0b20+KCk7CisgICAgICAgICAgICBDcmVhdGVDb21wYXJpc29uVW5pdEF0b21MaXN0UmVjdXJzZShwYXJ0LCBjb250ZW50UGFyZW50LCBjb21wYXJpc29uVW5pdEF0b21MaXN0LCBzZXR0aW5ncyk7CisgICAgICAgICAgICByZXR1cm4gY29tcGFyaXNvblVuaXRBdG9tTGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhOYW1lW10gQ29tcGFyaXNvbkdyb3VwaW5nRWxlbWVudHMgPSBuZXdbXSB7CisgICAgICAgICAgICBXLnAsCisgICAgICAgICAgICBXLnRibCwKKyAgICAgICAgICAgIFcudHIsCisgICAgICAgICAgICBXLnRjLAorICAgICAgICAgICAgVy50eGJ4Q29udGVudCwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENyZWF0ZUNvbXBhcmlzb25Vbml0QXRvbUxpc3RSZWN1cnNlKE9wZW5YbWxQYXJ0IHBhcnQsIFhFbGVtZW50IGVsZW1lbnQsIExpc3Q8Q29tcGFyaXNvblVuaXRBdG9tPiBjb21wYXJpc29uVW5pdEF0b21MaXN0LCBXbWxDb21wYXJlclNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuYm9keSB8fCBlbGVtZW50Lk5hbWUgPT0gVy5mb290bm90ZSB8fCBlbGVtZW50Lk5hbWUgPT0gVy5lbmRub3RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGVsZW1lbnQuRWxlbWVudHMoKSkKKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQ29tcGFyaXNvblVuaXRBdG9tTGlzdFJlY3Vyc2UocGFydCwgaXRlbSwgY29tcGFyaXNvblVuaXRBdG9tTGlzdCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBhcmFDaGlsZHJlblRvUHJvY2VzcyA9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gZS5OYW1lICE9IFcucFByKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBwYXJhQ2hpbGRyZW5Ub1Byb2Nlc3MpCisgICAgICAgICAgICAgICAgICAgIENyZWF0ZUNvbXBhcmlzb25Vbml0QXRvbUxpc3RSZWN1cnNlKHBhcnQsIGl0ZW0sIGNvbXBhcmlzb25Vbml0QXRvbUxpc3QsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICB2YXIgcGFyYVByb3BzID0gZWxlbWVudC5FbGVtZW50KFcucFByKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYVByb3BzID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb21wYXJpc29uVW5pdEF0b20gcFByQ29tcGFyaXNvblVuaXRBdG9tID0gbmV3IENvbXBhcmlzb25Vbml0QXRvbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnBQciksCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkFuY2VzdG9yc0FuZFNlbGYoKS5UYWtlV2hpbGUoYSA9PiBhLk5hbWUgIT0gVy5ib2R5ICYmIGEuTmFtZSAhPSBXLmZvb3Rub3RlcyAmJiBhLk5hbWUgIT0gVy5lbmRub3RlcykuUmV2ZXJzZSgpLlRvQXJyYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb25Vbml0QXRvbUxpc3QuQWRkKHBQckNvbXBhcmlzb25Vbml0QXRvbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbXBhcmlzb25Vbml0QXRvbSBwUHJDb21wYXJpc29uVW5pdEF0b20gPSBuZXcgQ29tcGFyaXNvblVuaXRBdG9tKAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYVByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BbmNlc3RvcnNBbmRTZWxmKCkuVGFrZVdoaWxlKGEgPT4gYS5OYW1lICE9IFcuYm9keSAmJiBhLk5hbWUgIT0gVy5mb290bm90ZXMgJiYgYS5OYW1lICE9IFcuZW5kbm90ZXMpLlJldmVyc2UoKS5Ub0FycmF5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uVW5pdEF0b21MaXN0LkFkZChwUHJDb21wYXJpc29uVW5pdEF0b20pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBydW5DaGlsZHJlblRvUHJvY2VzcyA9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gZS5OYW1lICE9IFcuclByKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBydW5DaGlsZHJlblRvUHJvY2VzcykKKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQ29tcGFyaXNvblVuaXRBdG9tTGlzdFJlY3Vyc2UocGFydCwgaXRlbSwgY29tcGFyaXNvblVuaXRBdG9tTGlzdCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnQgfHwgZWxlbWVudC5OYW1lID09IFcuZGVsVGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdmFsID0gZWxlbWVudC5WYWx1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2ggaW4gdmFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29tcGFyaXNvblVuaXRBdG9tIHNyID0gbmV3IENvbXBhcmlzb25Vbml0QXRvbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsIGNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQW5jZXN0b3JzQW5kU2VsZigpLlRha2VXaGlsZShhID0+IGEuTmFtZSAhPSBXLmJvZHkgJiYgYS5OYW1lICE9IFcuZm9vdG5vdGVzICYmIGEuTmFtZSAhPSBXLmVuZG5vdGVzKS5SZXZlcnNlKCkuVG9BcnJheSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvblVuaXRBdG9tTGlzdC5BZGQoc3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChBbGxvd2FibGVSdW5DaGlsZHJlbi5Db250YWlucyhlbGVtZW50Lk5hbWUpIHx8IGVsZW1lbnQuTmFtZSA9PSBXLl9vYmplY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29tcGFyaXNvblVuaXRBdG9tIHNyMyA9IG5ldyBDb21wYXJpc29uVW5pdEF0b20oCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQW5jZXN0b3JzQW5kU2VsZigpLlRha2VXaGlsZShhID0+IGEuTmFtZSAhPSBXLmJvZHkgJiYgYS5OYW1lICE9IFcuZm9vdG5vdGVzICYmIGEuTmFtZSAhPSBXLmVuZG5vdGVzKS5SZXZlcnNlKCkuVG9BcnJheSgpLAorICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgY29tcGFyaXNvblVuaXRBdG9tTGlzdC5BZGQoc3IzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZSA9IFJlY3Vyc2lvbkVsZW1lbnRzLkZpcnN0T3JEZWZhdWx0KHogPT4gei5FbGVtZW50TmFtZSA9PSBlbGVtZW50Lk5hbWUpOworICAgICAgICAgICAgaWYgKHJlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQW5ub3RhdGVFbGVtZW50V2l0aFByb3BzKHBhcnQsIGVsZW1lbnQsIGNvbXBhcmlzb25Vbml0QXRvbUxpc3QsIHJlLkNoaWxkRWxlbWVudFByb3BlcnR5TmFtZXMsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChFbGVtZW50c1RvVGhyb3dBd2F5LkNvbnRhaW5zKGVsZW1lbnQuTmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBBbm5vdGF0ZUVsZW1lbnRXaXRoUHJvcHMocGFydCwgZWxlbWVudCwgY29tcGFyaXNvblVuaXRBdG9tTGlzdCwgbnVsbCwgc2V0dGluZ3MpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBbm5vdGF0ZUVsZW1lbnRXaXRoUHJvcHMoT3BlblhtbFBhcnQgcGFydCwgWEVsZW1lbnQgZWxlbWVudCwgTGlzdDxDb21wYXJpc29uVW5pdEF0b20+IGNvbXBhcmlzb25Vbml0QXRvbUxpc3QsIFhOYW1lW10gY2hpbGRFbGVtZW50UHJvcGVydHlOYW1lcywgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgSUVudW1lcmFibGU8WEVsZW1lbnQ+IHJ1bkNoaWxkcmVuVG9Qcm9jZXNzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWVzID09IG51bGwpCisgICAgICAgICAgICAgICAgcnVuQ2hpbGRyZW5Ub1Byb2Nlc3MgPSBlbGVtZW50LkVsZW1lbnRzKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcnVuQ2hpbGRyZW5Ub1Byb2Nlc3MgPSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShlID0+ICFjaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWVzLkNvbnRhaW5zKGUuTmFtZSkpOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBydW5DaGlsZHJlblRvUHJvY2VzcykKKyAgICAgICAgICAgICAgICBDcmVhdGVDb21wYXJpc29uVW5pdEF0b21MaXN0UmVjdXJzZShwYXJ0LCBpdGVtLCBjb21wYXJpc29uVW5pdEF0b21MaXN0LCBzZXR0aW5ncyk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBc3NpZ25VbmlkVG9BbGxFbGVtZW50cyhYRWxlbWVudCBjb250ZW50UGFyZW50KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29udGVudCA9IGNvbnRlbnRQYXJlbnQuRGVzY2VuZGFudHMoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkIGluIGNvbnRlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGQuQXR0cmlidXRlKFB0T3BlblhtbC5VbmlkKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHVuaWQgPSBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygpLlJlcGxhY2UoIi0iLCAiIik7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdBdHQgPSBuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuVW5pZCwgdW5pZCk7CisgICAgICAgICAgICAgICAgICAgIGQuQWRkKG5ld0F0dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaW50ZXJuYWwgY2xhc3MgV2l0aEhpZXJhcmNoaWNhbEdyb3VwaW5nS2V5CisgICAgeworICAgICAgICBwdWJsaWMgc3RyaW5nW10gSGllcmFyY2hpY2FsR3JvdXBpbmdBcnJheTsKKyAgICAgICAgcHVibGljIENvbXBhcmlzb25Vbml0V29yZCBDb21wYXJpc29uVW5pdFdvcmQ7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBhcmlzb25Vbml0CisgICAgeworICAgICAgICBwdWJsaWMgTGlzdDxDb21wYXJpc29uVW5pdD4gQ29udGVudHM7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgU0hBMUhhc2g7CisgICAgICAgIHB1YmxpYyBDb3JyZWxhdGlvblN0YXR1cyBDb3JyZWxhdGlvblN0YXR1czsKKworICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8Q29tcGFyaXNvblVuaXQ+IERlc2NlbmRhbnRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxDb21wYXJpc29uVW5pdD4gY29tcGFyaXNvblVuaXRMaXN0ID0gbmV3IExpc3Q8Q29tcGFyaXNvblVuaXQ+KCk7CisgICAgICAgICAgICBEZXNjZW5kYW50c0ludGVybmFsKHRoaXMsIGNvbXBhcmlzb25Vbml0TGlzdCk7CisgICAgICAgICAgICByZXR1cm4gY29tcGFyaXNvblVuaXRMaXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPENvbXBhcmlzb25Vbml0QXRvbT4gRGVzY2VuZGFudENvbnRlbnRBdG9tcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBEZXNjZW5kYW50cygpLk9mVHlwZTxDb21wYXJpc29uVW5pdEF0b20+KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludD8gbV9EZXNjZW5kYW50Q29udGVudEF0b21zQ291bnQgPSBudWxsOworCisgICAgICAgIHB1YmxpYyBpbnQgRGVzY2VuZGFudENvbnRlbnRBdG9tc0NvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtX0Rlc2NlbmRhbnRDb250ZW50QXRvbXNDb3VudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGludCltX0Rlc2NlbmRhbnRDb250ZW50QXRvbXNDb3VudDsKKyAgICAgICAgICAgICAgICBtX0Rlc2NlbmRhbnRDb250ZW50QXRvbXNDb3VudCA9IHRoaXMuRGVzY2VuZGFudENvbnRlbnRBdG9tcygpLkNvdW50KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQpbV9EZXNjZW5kYW50Q29udGVudEF0b21zQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRGVzY2VuZGFudHNJbnRlcm5hbChDb21wYXJpc29uVW5pdCBjb21wYXJpc29uVW5pdCwgTGlzdDxDb21wYXJpc29uVW5pdD4gY29tcGFyaXNvblVuaXRMaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgY3UgaW4gY29tcGFyaXNvblVuaXQuQ29udGVudHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29tcGFyaXNvblVuaXRMaXN0LkFkZChjdSk7CisgICAgICAgICAgICAgICAgaWYgKGN1LkNvbnRlbnRzICE9IG51bGwgJiYgY3UuQ29udGVudHMuQW55KCkpCisgICAgICAgICAgICAgICAgICAgIERlc2NlbmRhbnRzSW50ZXJuYWwoY3UsIGNvbXBhcmlzb25Vbml0TGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgc3RyaW5nIFRvU3RyaW5nKGludCBpbmRlbnQpOworCisgICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgQ29tcGFyaXNvblVuaXRMaXN0VG9TdHJpbmcoQ29tcGFyaXNvblVuaXRbXSBjdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBzYi5BcHBlbmQoIkR1bXAgQ29tcGFyaXNpb24gVW5pdCBMaXN0IFRvIFN0cmluZyIgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGN1bCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaXRlbS5Ub1N0cmluZygyKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnRlcm5hbCBjbGFzcyBDb21wYXJpc29uVW5pdFdvcmQgOiBDb21wYXJpc29uVW5pdAorICAgIHsKKyAgICAgICAgcHVibGljIENvbXBhcmlzb25Vbml0V29yZChJRW51bWVyYWJsZTxDb21wYXJpc29uVW5pdEF0b20+IGNvbXBhcmlzb25Vbml0QXRvbUxpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnRlbnRzID0gY29tcGFyaXNvblVuaXRBdG9tTGlzdC5PZlR5cGU8Q29tcGFyaXNvblVuaXQ+KCkuVG9MaXN0KCk7CisgICAgICAgICAgICB2YXIgc2hhMVN0cmluZyA9IENvbnRlbnRzCisgICAgICAgICAgICAgICAgLlNlbGVjdChjID0+IGMuU0hBMUhhc2gpCisgICAgICAgICAgICAgICAgLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICBTSEExSGFzaCA9IFdtbENvbXBhcmVyVXRpbC5TSEExSGFzaFN0cmluZ0ZvclVURjhTdHJpbmcoc2hhMVN0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFhOYW1lW10gc19FbGVtZW50c1dpdGhSZWxhdGlvbnNoaXBJZHMgPSBuZXcgWE5hbWVbXSB7CisgICAgICAgICAgICBBLmJsaXAsCisgICAgICAgICAgICBBLmhsaW5rQ2xpY2ssCisgICAgICAgICAgICBBLnJlbElkcywKKyAgICAgICAgICAgIEMuY2hhcnQsCisgICAgICAgICAgICBDLmV4dGVybmFsRGF0YSwKKyAgICAgICAgICAgIEMudXNlclNoYXBlcywKKyAgICAgICAgICAgIERHTS5yZWxJZHMsCisgICAgICAgICAgICBPLk9MRU9iamVjdCwKKyAgICAgICAgICAgIFZNTC5maWxsLAorICAgICAgICAgICAgVk1MLmltYWdlZGF0YSwKKyAgICAgICAgICAgIFZNTC5zdHJva2UsCisgICAgICAgICAgICBXLmFsdENodW5rLAorICAgICAgICAgICAgVy5hdHRhY2hlZFRlbXBsYXRlLAorICAgICAgICAgICAgVy5jb250cm9sLAorICAgICAgICAgICAgVy5kYXRhU291cmNlLAorICAgICAgICAgICAgVy5lbWJlZEJvbGQsCisgICAgICAgICAgICBXLmVtYmVkQm9sZEl0YWxpYywKKyAgICAgICAgICAgIFcuZW1iZWRJdGFsaWMsCisgICAgICAgICAgICBXLmVtYmVkUmVndWxhciwKKyAgICAgICAgICAgIFcuZm9vdGVyUmVmZXJlbmNlLAorICAgICAgICAgICAgVy5oZWFkZXJSZWZlcmVuY2UsCisgICAgICAgICAgICBXLmhlYWRlclNvdXJjZSwKKyAgICAgICAgICAgIFcuaHlwZXJsaW5rLAorICAgICAgICAgICAgVy5wcmludGVyU2V0dGluZ3MsCisgICAgICAgICAgICBXLnJlY2lwaWVudERhdGEsCisgICAgICAgICAgICBXLnNhdmVUaHJvdWdoWHNsdCwKKyAgICAgICAgICAgIFcuc291cmNlRmlsZU5hbWUsCisgICAgICAgICAgICBXLnNyYywKKyAgICAgICAgICAgIFcuc3ViRG9jLAorICAgICAgICAgICAgV05FLnRvb2xiYXJEYXRhLAorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE5hbWVbXSBzX1JlbGF0aW9uc2hpcEF0dHJpYnV0ZU5hbWVzID0gbmV3IFhOYW1lW10geworICAgICAgICAgICAgUi5lbWJlZCwKKyAgICAgICAgICAgIFIubGluaywKKyAgICAgICAgICAgIFIuaWQsCisgICAgICAgICAgICBSLmNzLAorICAgICAgICAgICAgUi5kbSwKKyAgICAgICAgICAgIFIubG8sCisgICAgICAgICAgICBSLnFzLAorICAgICAgICAgICAgUi5ocmVmLAorICAgICAgICAgICAgUi5waWN0LAorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoaW50IGluZGVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZCgiIi5QYWRSaWdodChpbmRlbnQpICsgIldvcmQgU0hBMToiICsgdGhpcy5TSEExSGFzaC5TdWJzdHJpbmcoMCwgOCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjb21wYXJpc29uVW5pdEF0b20gaW4gQ29udGVudHMpCisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGNvbXBhcmlzb25Vbml0QXRvbS5Ub1N0cmluZyhpbmRlbnQgKyAyKSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBXbWxDb21wYXJlclV0aWwKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFNIQTFIYXNoU3RyaW5nRm9yVVRGOFN0cmluZyhzdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzKTsKKyAgICAgICAgICAgIHZhciBzaGExID0gU0hBMS5DcmVhdGUoKTsKKyAgICAgICAgICAgIGJ5dGVbXSBoYXNoQnl0ZXMgPSBzaGExLkNvbXB1dGVIYXNoKGJ5dGVzKTsKKyAgICAgICAgICAgIHJldHVybiBIZXhTdHJpbmdGcm9tQnl0ZXMoaGFzaEJ5dGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFNIQTFIYXNoU3RyaW5nRm9yQnl0ZUFycmF5KGJ5dGVbXSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNoYTEgPSBTSEExLkNyZWF0ZSgpOworICAgICAgICAgICAgYnl0ZVtdIGhhc2hCeXRlcyA9IHNoYTEuQ29tcHV0ZUhhc2goYnl0ZXMpOworICAgICAgICAgICAgcmV0dXJuIEhleFN0cmluZ0Zyb21CeXRlcyhoYXNoQnl0ZXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgSGV4U3RyaW5nRnJvbUJ5dGVzKGJ5dGVbXSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGJ5dGUgYiBpbiBieXRlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaGV4ID0gYi5Ub1N0cmluZygieDIiKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIENvbXBhcmlzb25Vbml0QXRvbSA6IENvbXBhcmlzb25Vbml0CisgICAgeworICAgICAgICAvLyBBbmNlc3RvckVsZW1lbnRzIGFyZSBrZXB0IGluIG9yZGVyIGZyb20gdGhlIGJvZHkgdG8gdGhlIGxlYWYsIGJlY2F1c2UgdGhpcyBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggd2UgbmVlZCB0byBhY2Nlc3MgaW4gb3JkZXIKKyAgICAgICAgLy8gdG8gcmVhc3NlbWJsZSB0aGUgZG9jdW1lbnQuICBIb3dldmVyLCBpbiBtYW55IHBsYWNlcyBpbiB0aGUgY29kZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIGZpbmQgdGhlIG5lYXJlc3QgYW5jZXN0b3IsIGkuZS4gY2VsbAorICAgICAgICAvLyBzbyBpdCBpcyBuZWNlc3NhcnkgdG8gcmV2ZXJzZSB0aGUgb3JkZXIgd2hlbiBsb29raW5nIGZvciBpdCwgaS5lLiBsb29rIGZyb20gdGhlIGxlYWYgYmFjayB0byB0aGUgYm9keSBlbGVtZW50LgorCisgICAgICAgIHB1YmxpYyBYRWxlbWVudFtdIEFuY2VzdG9yRWxlbWVudHM7CisgICAgICAgIHB1YmxpYyBzdHJpbmdbXSBBbmNlc3RvclVuaWRzOworICAgICAgICBwdWJsaWMgWEVsZW1lbnQgQ29udGVudEVsZW1lbnQ7CisgICAgICAgIHB1YmxpYyBYRWxlbWVudCBDb250ZW50RWxlbWVudEJlZm9yZTsKKyAgICAgICAgcHVibGljIENvbXBhcmlzb25Vbml0QXRvbSBDb21wYXJpc29uVW5pdEF0b21CZWZvcmU7CisgICAgICAgIHB1YmxpYyBPcGVuWG1sUGFydCBQYXJ0OworICAgICAgICBwdWJsaWMgWEVsZW1lbnQgUmV2VHJhY2tFbGVtZW50OworCisgICAgICAgIHB1YmxpYyBDb21wYXJpc29uVW5pdEF0b20oWEVsZW1lbnQgY29udGVudEVsZW1lbnQsIFhFbGVtZW50W10gYW5jZXN0b3JFbGVtZW50cywgT3BlblhtbFBhcnQgcGFydCwgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgQ29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKKyAgICAgICAgICAgIEFuY2VzdG9yRWxlbWVudHMgPSBhbmNlc3RvckVsZW1lbnRzOworICAgICAgICAgICAgUGFydCA9IHBhcnQ7CisgICAgICAgICAgICBSZXZUcmFja0VsZW1lbnQgPSBHZXRSZXZpc2lvblRyYWNraW5nRWxlbWVudEZyb21BbmNlc3RvcnMoY29udGVudEVsZW1lbnQsIEFuY2VzdG9yRWxlbWVudHMpOworICAgICAgICAgICAgaWYgKFJldlRyYWNrRWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuRXF1YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFJldlRyYWNrRWxlbWVudC5OYW1lID09IFcuZGVsKQorICAgICAgICAgICAgICAgICAgICBDb3JyZWxhdGlvblN0YXR1cyA9IENvcnJlbGF0aW9uU3RhdHVzLkRlbGV0ZWQ7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUmV2VHJhY2tFbGVtZW50Lk5hbWUgPT0gVy5pbnMpCisgICAgICAgICAgICAgICAgICAgIENvcnJlbGF0aW9uU3RhdHVzID0gQ29ycmVsYXRpb25TdGF0dXMuSW5zZXJ0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJpbmcgc2hhMUhhc2ggPSAoc3RyaW5nKWNvbnRlbnRFbGVtZW50LkF0dHJpYnV0ZShQdE9wZW5YbWwuU0hBMUhhc2gpOworICAgICAgICAgICAgaWYgKHNoYTFIYXNoICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU0hBMUhhc2ggPSBzaGExSGFzaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2hhSGFzaFN0cmluZyA9IEdldFNoYTFIYXNoU3RyaW5nRm9yRWxlbWVudChDb250ZW50RWxlbWVudCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIFNIQTFIYXNoID0gV21sQ29tcGFyZXJVdGlsLlNIQTFIYXNoU3RyaW5nRm9yVVRGOFN0cmluZyhzaGFIYXNoU3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RyaW5nIEdldFNoYTFIYXNoU3RyaW5nRm9yRWxlbWVudChYRWxlbWVudCBjb250ZW50RWxlbWVudCwgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRleHQgPSBjb250ZW50RWxlbWVudC5WYWx1ZTsKKyAgICAgICAgICAgIGlmIChzZXR0aW5ncy5DYXNlSW5zZW5zaXRpdmUpCisgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuVG9VcHBlcihzZXR0aW5ncy5DdWx0dXJlSW5mbyk7CisgICAgICAgICAgICByZXR1cm4gY29udGVudEVsZW1lbnQuTmFtZS5Mb2NhbE5hbWUgKyB0ZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgR2V0UmV2aXNpb25UcmFja2luZ0VsZW1lbnRGcm9tQW5jZXN0b3JzKFhFbGVtZW50IGNvbnRlbnRFbGVtZW50LCBYRWxlbWVudFtdIGFuY2VzdG9ycykKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgcmV2VHJhY2tFbGVtZW50ID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKGNvbnRlbnRFbGVtZW50Lk5hbWUgPT0gVy5wUHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2VHJhY2tFbGVtZW50ID0gY29udGVudEVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuclByKQorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoZSA9PiBlLk5hbWUgPT0gVy5kZWwgfHwgZS5OYW1lID09IFcuaW5zKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV2VHJhY2tFbGVtZW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXZUcmFja0VsZW1lbnQgPSBhbmNlc3RvcnMuRmlyc3RPckRlZmF1bHQoYSA9PiBhLk5hbWUgPT0gVy5kZWwgfHwgYS5OYW1lID09IFcuaW5zKTsKKyAgICAgICAgICAgIHJldHVybiByZXZUcmFja0VsZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKGludCBpbmRlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB4TmFtZVBhZCA9IDE2OworICAgICAgICAgICAgdmFyIGluZGVudFN0cmluZyA9ICIiLlBhZFJpZ2h0KGluZGVudCk7CisKKyAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBzYi5BcHBlbmQoaW5kZW50U3RyaW5nKTsKKyAgICAgICAgICAgIHN0cmluZyBjb3JyZWxhdGlvblN0YXR1cyA9ICIiOworICAgICAgICAgICAgaWYgKENvcnJlbGF0aW9uU3RhdHVzICE9IE9wZW5YbWxQb3dlclRvb2xzLkNvcnJlbGF0aW9uU3RhdHVzLk5pbCkKKyAgICAgICAgICAgICAgICBjb3JyZWxhdGlvblN0YXR1cyA9IHN0cmluZy5Gb3JtYXQoIlt7MH1dICIsIENvcnJlbGF0aW9uU3RhdHVzLlRvU3RyaW5nKCkuUGFkUmlnaHQoOCkpOworICAgICAgICAgICAgaWYgKENvbnRlbnRFbGVtZW50Lk5hbWUgPT0gVy50IHx8IENvbnRlbnRFbGVtZW50Lk5hbWUgPT0gVy5kZWxUZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiQXRvbSB7MH06IHsxfSB7Mn0gU0hBMTp7M30gIiwgUGFkTG9jYWxOYW1lKHhOYW1lUGFkLCB0aGlzKSwgQ29udGVudEVsZW1lbnQuVmFsdWUsIGNvcnJlbGF0aW9uU3RhdHVzLCB0aGlzLlNIQTFIYXNoLlN1YnN0cmluZygwLCA4KSk7CisgICAgICAgICAgICAgICAgQXBwZW5kQW5jZXN0b3JzRHVtcChzYiwgdGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJBdG9tIHswfTogICB7MX0gU0hBMTp7Mn0gIiwgUGFkTG9jYWxOYW1lKHhOYW1lUGFkLCB0aGlzKSwgY29ycmVsYXRpb25TdGF0dXMsIHRoaXMuU0hBMUhhc2guU3Vic3RyaW5nKDAsIDgpKTsKKyAgICAgICAgICAgICAgICBBcHBlbmRBbmNlc3RvcnNEdW1wKHNiLCB0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBUb1N0cmluZ0FuY2VzdG9yVW5pZHMoaW50IGluZGVudCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHhOYW1lUGFkID0gMTY7CisgICAgICAgICAgICB2YXIgaW5kZW50U3RyaW5nID0gIiIuUGFkUmlnaHQoaW5kZW50KTsKKworICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZChpbmRlbnRTdHJpbmcpOworICAgICAgICAgICAgc3RyaW5nIGNvcnJlbGF0aW9uU3RhdHVzID0gIiI7CisgICAgICAgICAgICBpZiAoQ29ycmVsYXRpb25TdGF0dXMgIT0gT3BlblhtbFBvd2VyVG9vbHMuQ29ycmVsYXRpb25TdGF0dXMuTmlsKQorICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uU3RhdHVzID0gc3RyaW5nLkZvcm1hdCgiW3swfV0gIiwgQ29ycmVsYXRpb25TdGF0dXMuVG9TdHJpbmcoKS5QYWRSaWdodCg4KSk7CisgICAgICAgICAgICBpZiAoQ29udGVudEVsZW1lbnQuTmFtZSA9PSBXLnQgfHwgQ29udGVudEVsZW1lbnQuTmFtZSA9PSBXLmRlbFRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJBdG9tIHswfTogezF9IHsyfSBTSEExOnszfSAiLCBQYWRMb2NhbE5hbWUoeE5hbWVQYWQsIHRoaXMpLCBDb250ZW50RWxlbWVudC5WYWx1ZSwgY29ycmVsYXRpb25TdGF0dXMsIHRoaXMuU0hBMUhhc2guU3Vic3RyaW5nKDAsIDgpKTsKKyAgICAgICAgICAgICAgICBBcHBlbmRBbmNlc3RvcnNVbmlkc0R1bXAoc2IsIHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiQXRvbSB7MH06ICAgezF9IFNIQTE6ezJ9ICIsIFBhZExvY2FsTmFtZSh4TmFtZVBhZCwgdGhpcyksIGNvcnJlbGF0aW9uU3RhdHVzLCB0aGlzLlNIQTFIYXNoLlN1YnN0cmluZygwLCA4KSk7CisgICAgICAgICAgICAgICAgQXBwZW5kQW5jZXN0b3JzVW5pZHNEdW1wKHNiLCB0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUb1N0cmluZygwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgVG9TdHJpbmdBbmNlc3RvclVuaWRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nQW5jZXN0b3JVbmlkcygwKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBQYWRMb2NhbE5hbWUoaW50IHhOYW1lUGFkLCBDb21wYXJpc29uVW5pdEF0b20gaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChpdGVtLkNvbnRlbnRFbGVtZW50Lk5hbWUuTG9jYWxOYW1lICsgIiAiKS5QYWRSaWdodCh4TmFtZVBhZCwgJy0nKSArICIgIjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBBcHBlbmRBbmNlc3RvcnNEdW1wKFN0cmluZ0J1aWxkZXIgc2IsIENvbXBhcmlzb25Vbml0QXRvbSBzcikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHMgPSBzci5BbmNlc3RvckVsZW1lbnRzLlNlbGVjdChwID0+IHAuTmFtZS5Mb2NhbE5hbWUgKyBHZXRVbmlkKHApICsgIi8iKS5TdHJpbmdDb25jYXRlbmF0ZSgpLlRyaW1FbmQoJy8nKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZCgiQW5jZXN0b3JzOiIgKyBzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBBcHBlbmRBbmNlc3RvcnNVbmlkc0R1bXAoU3RyaW5nQnVpbGRlciBzYiwgQ29tcGFyaXNvblVuaXRBdG9tIHNyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgemlwcGVkID0gc3IuQW5jZXN0b3JFbGVtZW50cy5aaXAoc3IuQW5jZXN0b3JVbmlkcywgKGEsIHUpID0+IG5ldworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFuY2VzdG9yRWxlbWVudCA9IGEsCisgICAgICAgICAgICAgICAgQW5jZXN0b3JVbmlkID0gdSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgdmFyIHMgPSB6aXBwZWQuU2VsZWN0KHAgPT4gcC5BbmNlc3RvckVsZW1lbnQuTmFtZS5Mb2NhbE5hbWUgKyAiWyIgKyBwLkFuY2VzdG9yVW5pZC5TdWJzdHJpbmcoMCwgOCkgKyAiXS8iKS5TdHJpbmdDb25jYXRlbmF0ZSgpLlRyaW1FbmQoJy8nKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZCgiQW5jZXN0b3JzOiIgKyBzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RyaW5nIEdldFVuaWQoWEVsZW1lbnQgcCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHVuaWQgPSAoc3RyaW5nKXAuQXR0cmlidXRlKFB0T3BlblhtbC5VbmlkKTsKKyAgICAgICAgICAgIGlmICh1bmlkID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgcmV0dXJuICJbIiArIHVuaWQuU3Vic3RyaW5nKDAsIDgpICsgIl0iOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgQ29tcGFyaXNvblVuaXRBdG9tTGlzdFRvU3RyaW5nKExpc3Q8Q29tcGFyaXNvblVuaXRBdG9tPiBjb21wYXJpc29uVW5pdEF0b21MaXN0LCBpbnQgaW5kZW50KQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHZhciBjYWwgPSBjb21wYXJpc29uVW5pdEF0b21MaXN0CisgICAgICAgICAgICAgICAgLlNlbGVjdCgoY2EsIGkpID0+IG5ldworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29tcGFyaXNvblVuaXRBdG9tID0gY2EsCisgICAgICAgICAgICAgICAgICAgIEluZGV4ID0gaSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGNhbCkKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiIuUGFkUmlnaHQoaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgIC5BcHBlbmRGb3JtYXQoIlt7MDowMDAwMDB9XSAiLCBpdGVtLkluZGV4ICsgMSkKKyAgICAgICAgICAgICAgICAgIC5BcHBlbmQoaXRlbS5Db21wYXJpc29uVW5pdEF0b20uVG9TdHJpbmcoMCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50ZXJuYWwgZW51bSBDb21wYXJpc29uVW5pdEdyb3VwVHlwZQorICAgIHsKKyAgICAgICAgUGFyYWdyYXBoLAorICAgICAgICBUYWJsZSwKKyAgICAgICAgUm93LAorICAgICAgICBDZWxsLAorICAgICAgICBUZXh0Ym94LAorICAgIH07CisKKyAgICBpbnRlcm5hbCBjbGFzcyBDb21wYXJpc29uVW5pdEdyb3VwIDogQ29tcGFyaXNvblVuaXQKKyAgICB7CisgICAgICAgIHB1YmxpYyBDb21wYXJpc29uVW5pdEdyb3VwVHlwZSBDb21wYXJpc29uVW5pdEdyb3VwVHlwZTsKKyAgICAgICAgcHVibGljIHN0cmluZyBDb3JyZWxhdGVkU0hBMUhhc2g7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgU3RydWN0dXJlU0hBMUhhc2g7CisKKyAgICAgICAgcHVibGljIENvbXBhcmlzb25Vbml0R3JvdXAoSUVudW1lcmFibGU8Q29tcGFyaXNvblVuaXQ+IGNvbXBhcmlzb25Vbml0TGlzdCwgQ29tcGFyaXNvblVuaXRHcm91cFR5cGUgZ3JvdXBUeXBlLCBpbnQgbGV2ZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnRlbnRzID0gY29tcGFyaXNvblVuaXRMaXN0LlRvTGlzdCgpOworICAgICAgICAgICAgQ29tcGFyaXNvblVuaXRHcm91cFR5cGUgPSBncm91cFR5cGU7CisgICAgICAgICAgICB2YXIgZmlyc3QgPSBjb21wYXJpc29uVW5pdExpc3QuRmlyc3QoKTsKKyAgICAgICAgICAgIENvbXBhcmlzb25Vbml0QXRvbSBjb21wYXJpc29uVW5pdEF0b20gPSBHZXRGaXJzdENvbXBhcmlzb25Vbml0QXRvbU9mR3JvdXAoZmlyc3QpOworICAgICAgICAgICAgWE5hbWUgYW5jZXN0b3JOYW1lID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChncm91cFR5cGUgPT0gT3BlblhtbFBvd2VyVG9vbHMuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuVGFibGUpCisgICAgICAgICAgICAgICAgYW5jZXN0b3JOYW1lID0gVy50Ymw7CisgICAgICAgICAgICBlbHNlIGlmIChncm91cFR5cGUgPT0gT3BlblhtbFBvd2VyVG9vbHMuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuUm93KQorICAgICAgICAgICAgICAgIGFuY2VzdG9yTmFtZSA9IFcudHI7CisgICAgICAgICAgICBlbHNlIGlmIChncm91cFR5cGUgPT0gT3BlblhtbFBvd2VyVG9vbHMuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuQ2VsbCkKKyAgICAgICAgICAgICAgICBhbmNlc3Rvck5hbWUgPSBXLnRjOworICAgICAgICAgICAgZWxzZSBpZiAoZ3JvdXBUeXBlID09IE9wZW5YbWxQb3dlclRvb2xzLkNvbXBhcmlzb25Vbml0R3JvdXBUeXBlLlBhcmFncmFwaCkKKyAgICAgICAgICAgICAgICBhbmNlc3Rvck5hbWUgPSBXLnA7CisgICAgICAgICAgICBlbHNlIGlmIChncm91cFR5cGUgPT0gT3BlblhtbFBvd2VyVG9vbHMuQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuVGV4dGJveCkKKyAgICAgICAgICAgICAgICBhbmNlc3Rvck5hbWUgPSBXLnR4YnhDb250ZW50OworCisgICAgICAgICAgICB2YXIgYW5jZXN0b3JzVG9Mb29rQXQgPSBjb21wYXJpc29uVW5pdEF0b20uQW5jZXN0b3JFbGVtZW50cy5XaGVyZShhZSA9PiBhZS5OYW1lID09IFcudGJsIHx8IGFlLk5hbWUgPT0gVy50ciB8fCBhZS5OYW1lID09IFcudGMgfHwgYWUuTmFtZSA9PSBXLnAgfHwgYWUuTmFtZSA9PSBXLnR4YnhDb250ZW50KS5Ub0FycmF5KCk7IDsKKyAgICAgICAgICAgIHZhciBhbmNlc3RvciA9IGFuY2VzdG9yc1RvTG9va0F0W2xldmVsXTsKKworICAgICAgICAgICAgaWYgKGFuY2VzdG9yID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvcjogQ29tcGFyaXNvblVuaXRHcm91cCIpOworICAgICAgICAgICAgU0hBMUhhc2ggPSAoc3RyaW5nKWFuY2VzdG9yLkF0dHJpYnV0ZShQdE9wZW5YbWwuU0hBMUhhc2gpOworICAgICAgICAgICAgQ29ycmVsYXRlZFNIQTFIYXNoID0gKHN0cmluZylhbmNlc3Rvci5BdHRyaWJ1dGUoUHRPcGVuWG1sLkNvcnJlbGF0ZWRTSEExSGFzaCk7CisgICAgICAgICAgICBTdHJ1Y3R1cmVTSEExSGFzaCA9IChzdHJpbmcpYW5jZXN0b3IuQXR0cmlidXRlKFB0T3BlblhtbC5TdHJ1Y3R1cmVTSEExSGFzaCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIENvbXBhcmlzb25Vbml0QXRvbSBHZXRGaXJzdENvbXBhcmlzb25Vbml0QXRvbU9mR3JvdXAoQ29tcGFyaXNvblVuaXQgZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0aGlzR3JvdXAgPSBncm91cDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0ZyA9IHRoaXNHcm91cCBhcyBDb21wYXJpc29uVW5pdEdyb3VwOworICAgICAgICAgICAgICAgIGlmICh0ZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpc0dyb3VwID0gdGcuQ29udGVudHMuRmlyc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciB0dyA9IHRoaXNHcm91cCBhcyBDb21wYXJpc29uVW5pdFdvcmQ7CisgICAgICAgICAgICAgICAgaWYgKHR3ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IEdldEZpcnN0Q29tcGFyaXNvblVuaXRBdG9tT2ZHcm91cCIpOworICAgICAgICAgICAgICAgIHZhciBjYSA9IChDb21wYXJpc29uVW5pdEF0b20pdHcuQ29udGVudHMuRmlyc3QoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2E7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKGludCBpbmRlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBzYi5BcHBlbmQoIiIuUGFkUmlnaHQoaW5kZW50KSArICJHcm91cCBUeXBlOiAiICsgQ29tcGFyaXNvblVuaXRHcm91cFR5cGUuVG9TdHJpbmcoKSArICIgU0hBMToiICsgU0hBMUhhc2ggKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjb21wYXJpc29uVW5pdEF0b20gaW4gQ29udGVudHMpCisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGNvbXBhcmlzb25Vbml0QXRvbS5Ub1N0cmluZyhpbmRlbnQgKyAyKSk7CisgICAgICAgICAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBlbnVtIENvcnJlbGF0aW9uU3RhdHVzCisgICAgeworICAgICAgICBOaWwsCisgICAgICAgIE5vcm1hbCwKKyAgICAgICAgVW5rbm93biwKKyAgICAgICAgSW5zZXJ0ZWQsCisgICAgICAgIERlbGV0ZWQsCisgICAgICAgIEVxdWFsLAorICAgICAgICBHcm91cCwKKyAgICB9CisKKyAgICBjbGFzcyBQYXJ0U0hBMUhhc2hBbm5vdGF0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgc3RyaW5nIEhhc2g7CisKKyAgICAgICAgcHVibGljIFBhcnRTSEExSGFzaEFubm90YXRpb24oc3RyaW5nIGhhc2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIEhhc2ggPSBoYXNoOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgQ29ycmVsYXRlZFNlcXVlbmNlCisgICAgeworICAgICAgICBwdWJsaWMgQ29ycmVsYXRpb25TdGF0dXMgQ29ycmVsYXRpb25TdGF0dXM7CisKKyAgICAgICAgLy8gaWYgQ29tcGFyaXNvblVuaXRMaXN0MSA9PSBudWxsIGFuZCBDb21wYXJpc29uVW5pdExpc3QyIGNvbnRhaW5zIHNlcXVlbmNlLCB0aGVuIGluc2VydGVkIGNvbnRlbnQuCisgICAgICAgIC8vIGlmIENvbXBhcmlzb25Vbml0TGlzdDIgPT0gbnVsbCBhbmQgQ29tcGFyaXNvblVuaXRMaXN0MSBjb250YWlucyBzZXF1ZW5jZSwgdGhlbiBkZWxldGVkIGNvbnRlbnQuCisgICAgICAgIC8vIGlmIENvbXBhcmlzb25Vbml0TGlzdDIgY29udGFpbnMgc2VxdWVuY2UgYW5kIENvbXBhcmlzb25Vbml0TGlzdDEgY29udGFpbnMgc2VxdWVuY2UsIHRoZW4gZWl0aGVyIGlzIFVua25vd24gb3IgRXF1YWwuCisgICAgICAgIHB1YmxpYyBDb21wYXJpc29uVW5pdFtdIENvbXBhcmlzb25Vbml0QXJyYXkxOworICAgICAgICBwdWJsaWMgQ29tcGFyaXNvblVuaXRbXSBDb21wYXJpc29uVW5pdEFycmF5MjsKKyNpZiBERUJVRworICAgICAgICBwdWJsaWMgc3RyaW5nIFNvdXJjZUZpbGU7CisgICAgICAgIHB1YmxpYyBpbnQgU291cmNlTGluZTsKKyNlbmRpZgorCisgICAgICAgIHB1YmxpYyBDb3JyZWxhdGVkU2VxdWVuY2UoKQorICAgICAgICB7CisjaWYgREVCVUcKKyAgICAgICAgICAgIFNvdXJjZUZpbGUgPSBuZXcgU3lzdGVtLkRpYWdub3N0aWNzLlN0YWNrVHJhY2UodHJ1ZSkuR2V0RnJhbWUoMSkuR2V0RmlsZU5hbWUoKTsKKyAgICAgICAgICAgIFNvdXJjZUxpbmUgPSBuZXcgU3lzdGVtLkRpYWdub3N0aWNzLlN0YWNrVHJhY2UodHJ1ZSkuR2V0RnJhbWUoMSkuR2V0RmlsZUxpbmVOdW1iZXIoKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICB2YXIgaW5kZW50U3RyaW5nID0gIiAgIjsKKyAgICAgICAgICAgIHZhciBpbmRlbnRTdHJpbmc0ID0gIiAgICAiOworICAgICAgICAgICAgc2IuQXBwZW5kKCJDb3JyZWxhdGVkU2VxdWVuY2UgPT09PT0iICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisjaWYgREVCVUcKKyAgICAgICAgICAgIHNiLkFwcGVuZChpbmRlbnRTdHJpbmcgKyAiQ3JlYXRlZCBhdCBMaW5lOiAiICsgU291cmNlTGluZS5Ub1N0cmluZygpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisjZW5kaWYKKyAgICAgICAgICAgIHNiLkFwcGVuZChpbmRlbnRTdHJpbmcgKyAiQ29ycmVsYXRlZEl0ZW0gPT09PT0iICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICBzYi5BcHBlbmQoaW5kZW50U3RyaW5nNCArICJDb3JyZWxhdGlvblN0YXR1czogIiArIENvcnJlbGF0aW9uU3RhdHVzLlRvU3RyaW5nKCkgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgIGlmIChDb3JyZWxhdGlvblN0YXR1cyA9PSBPcGVuWG1sUG93ZXJUb29scy5Db3JyZWxhdGlvblN0YXR1cy5FcXVhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kZW50U3RyaW5nNCArICJDb21wYXJpc29uVW5pdExpc3QgPT09PT0iICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gQ29tcGFyaXNvblVuaXRBcnJheTIpCisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpdGVtLlRvU3RyaW5nKDYpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKENvbXBhcmlzb25Vbml0QXJyYXkxICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaW5kZW50U3RyaW5nNCArICJDb21wYXJpc29uVW5pdExpc3QxID09PT09IiArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBDb21wYXJpc29uVW5pdEFycmF5MSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpdGVtLlRvU3RyaW5nKDYpICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChDb21wYXJpc29uVW5pdEFycmF5MiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGluZGVudFN0cmluZzQgKyAiQ29tcGFyaXNvblVuaXRMaXN0MiA9PT09PSIgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gQ29tcGFyaXNvblVuaXRBcnJheTIpCisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaXRlbS5Ub1N0cmluZyg2KSArIEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9XbWxEb2N1bWVudC5jcyBiL09wZW5YbWxQb3dlclRvb2xzL1dtbERvY3VtZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTM2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9XbWxEb2N1bWVudC5jcwpAQCAtMCwwICsxLDEyMSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uSU8uUGFja2FnaW5nOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgcHVibGljIGNsYXNzIFB0TWFpbkRvY3VtZW50UGFydCA6IFhFbGVtZW50CisgICAgeworICAgICAgICBwcml2YXRlIFdtbERvY3VtZW50IFBhcmVudFdtbERvY3VtZW50OworCisgICAgICAgIHB1YmxpYyBQdFdvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0IFdvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKFBhcmVudFdtbERvY3VtZW50LkRvY3VtZW50Qnl0ZUFycmF5KSkKKyAgICAgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1zLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBXb3JkcHJvY2Vzc2luZ0NvbW1lbnRzUGFydCBjb21tZW50c1BhcnQgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuV29yZHByb2Nlc3NpbmdDb21tZW50c1BhcnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50c1BhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBwYXJ0RWxlbWVudCA9IGNvbW1lbnRzUGFydC5HZXRYRG9jdW1lbnQoKS5Sb290OworICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGROb2RlcyA9IHBhcnRFbGVtZW50Lk5vZGVzKCkuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGNoaWxkTm9kZXMpCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLlJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFB0V29yZHByb2Nlc3NpbmdDb21tZW50c1BhcnQodGhpcy5QYXJlbnRXbWxEb2N1bWVudCwgY29tbWVudHNQYXJ0LlVyaSwgcGFydEVsZW1lbnQuTmFtZSwgcGFydEVsZW1lbnQuQXR0cmlidXRlcygpLCBjaGlsZE5vZGVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUHRNYWluRG9jdW1lbnRQYXJ0KFdtbERvY3VtZW50IHdtbERvY3VtZW50LCBVcmkgdXJpLCBYTmFtZSBuYW1lLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKQorICAgICAgICAgICAgOiBiYXNlKG5hbWUsIHZhbHVlcykKKyAgICAgICAgeworICAgICAgICAgICAgUGFyZW50V21sRG9jdW1lbnQgPSB3bWxEb2N1bWVudDsKKyAgICAgICAgICAgIHRoaXMuQWRkKAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFB0T3BlblhtbC5VcmksIHVyaSksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJwdCIsIFB0T3BlblhtbC5wdCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgUHRXb3JkcHJvY2Vzc2luZ0NvbW1lbnRzUGFydCA6IFhFbGVtZW50CisgICAgeworICAgICAgICBwcml2YXRlIFdtbERvY3VtZW50IFBhcmVudFdtbERvY3VtZW50OworCisgICAgICAgIHB1YmxpYyBQdFdvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0KFdtbERvY3VtZW50IHdtbERvY3VtZW50LCBVcmkgdXJpLCBYTmFtZSBuYW1lLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKQorICAgICAgICAgICAgOiBiYXNlKG5hbWUsIHZhbHVlcykKKyAgICAgICAgeworICAgICAgICAgICAgUGFyZW50V21sRG9jdW1lbnQgPSB3bWxEb2N1bWVudDsKKyAgICAgICAgICAgIHRoaXMuQWRkKAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFB0T3BlblhtbC5VcmksIHVyaSksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJwdCIsIFB0T3BlblhtbC5wdCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgcGFydGlhbCBjbGFzcyBXbWxEb2N1bWVudAorICAgIHsKKyAgICAgICAgcHVibGljIFB0TWFpbkRvY3VtZW50UGFydCBNYWluRG9jdW1lbnRQYXJ0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKHRoaXMuRG9jdW1lbnRCeXRlQXJyYXkpKQorICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obXMsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHBhcnRFbGVtZW50ID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3Q7CisgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZE5vZGVzID0gcGFydEVsZW1lbnQuTm9kZXMoKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gY2hpbGROb2RlcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uUmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHRNYWluRG9jdW1lbnRQYXJ0KHRoaXMsIHdEb2MuTWFpbkRvY3VtZW50UGFydC5VcmksIHBhcnRFbGVtZW50Lk5hbWUsIHBhcnRFbGVtZW50LkF0dHJpYnV0ZXMoKSwgY2hpbGROb2Rlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFdtbERvY3VtZW50KFdtbERvY3VtZW50IG90aGVyLCBwYXJhbXMgWEVsZW1lbnRbXSByZXBsYWNlbWVudFBhcnRzKQorICAgICAgICAgICAgOiBiYXNlKG90aGVyKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQodGhpcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFBhY2thZ2UgcGFja2FnZSA9IHN0cmVhbURvYy5HZXRQYWNrYWdlKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcmVwbGFjZW1lbnRQYXJ0IGluIHJlcGxhY2VtZW50UGFydHMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhBdHRyaWJ1dGUgdXJpQXR0cmlidXRlID0gcmVwbGFjZW1lbnRQYXJ0LkF0dHJpYnV0ZShQdE9wZW5YbWwuVXJpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmlBdHRyaWJ1dGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIlJlcGxhY2VtZW50IHBhcnQgZG9lcyBub3QgY29udGFpbiBhIFVyaSBhcyBhbiBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSB1cmlBdHRyaWJ1dGUuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFydCA9IHBhY2thZ2UuR2V0UGFydHMoKS5GaXJzdE9yRGVmYXVsdChwID0+IHAuVXJpLlRvU3RyaW5nKCkgPT0gdXJpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gcGFydFN0cmVhbSA9IHBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoWG1sV3JpdGVyIHBhcnRYbWxXcml0ZXIgPSBYbWxXcml0ZXIuQ3JlYXRlKHBhcnRTdHJlYW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50UGFydC5TYXZlKHBhcnRYbWxXcml0ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuRG9jdW1lbnRCeXRlQXJyYXkgPSBzdHJlYW1Eb2MuR2V0TW9kaWZpZWREb2N1bWVudCgpLkRvY3VtZW50Qnl0ZUFycmF5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHMvV21sVG9IdG1sQ29udmVydGVyLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvV21sVG9IdG1sQ29udmVydGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTViYTEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9XbWxUb0h0bWxDb252ZXJ0ZXIuY3MKQEAgLTAsMCArMSwzMzM4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworVmVyc2lvbjogMy4xLjEyCisgKiBJbXByb3ZlIGxheW91dCBvZiBsaXN0IGl0ZW1zLCB1c2luZyAiZGlzcGxheTogaW5saW5lLWJsb2NrIiB3aXRoIGEgd2lkdGggcnVsZS4KKyAqIFN0cmVhbWxpbmUgSFRNTCwgb21pdHRpbmcgdW5uZWNlc3NhcnkgZm9ybWF0dGluZy1yZWxhdGVkIEhUTUwgKGUuZy4sIDxiPmJvbGQ8L2I+LCA8aT5pdGFsaWM8L2k+KS4KKyAqIFVzZSBIVE1MNSBpbnN0ZWFkIG9mIEhUTUw0IG1ldGEgdGFncyAoZS5nLiwgZm9yIGNoYXJzZXQpLgorICogUHJvZHVjZSBjb3JyZWN0bHkgZm9ybWF0dGVkIGRlY2ltYWwgbnVtYmVycyAoZS5nLiwgIjAuNWluIiBpbnN0ZWFkIG9mICIwLDVpbiIpIGFsc28gZm9yIG5vbi1VUyBsb2NhbGVzLgorICogUHJvZHVjZSBjb3JyZWN0IGNvbG9yIHJ1bGVzIChlLmcuLCAiIzAwMDAwMCIgaW5zdGVhZCBvZiAiI2F1dG8iKS4KKyAqIEFkZGVkIHF1aWNrIGZpeCB0byBDYWxjV2lkdGhPZlJ1bkluVHdpcHMgdG8gYmV0dGVyIGFjY29tbW9kYXRlICZuYnNwOyBlbnRpdGllcyBpbiB0aGUgbGF5b3V0LgorICogTWFrZSBQcm9jZXNzSW1hZ2UoKSBwdWJsaWNseSBhY2Nlc3NpYmxlLgorICogUmVmYWN0b3IgYW5kIHN0cmVhbWxpbmUgY29kZS4KKworVmVyc2lvbjogMi43LjAzCisgKiBTdXBwb3J0IGZvciBSVEwgbGFuZ3VhZ2VzLgorCitWZXJzaW9uOiAyLjcuMDAKKyAqIFVzZXMgbmV3IExpc3RJdGVtUmV0cmlldmVyLgorICogQmV0dGVyIHN1cHBvcnQgZm9yIFJUTCBsYW5ndWFnZXMuCisKK1ZlcnNpb246IDIuNi4wMQorICogQWRkIGxhbmd1YWdlQ3VsdHVyZU5hbWUgcGFyYW1ldGVyIHRvIEdldExpc3RJdGVtVGV4dCBtZXRob2RzLiAgVGhpcyBlbmFibGVzIGEgc2luZ2xlIGltcGxlbWVudGF0aW9uIHRvIGhhbmRsZQorICAgbW9yZSB0aGFuIG9uZSBsYW5ndWFnZS9jdWx0dXJlIHdoZXJlIGFwcHJvcHJpYXRlLgorCitWZXJzaW9uOiAyLjYuMDAKKyAqIFJlLXdyaXRlIHRvIHN1cHBvcnQgc3R5bGVzIGFuZCByaWNoIGNvbnRlbnQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljcy5Db2RlQW5hbHlzaXM7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5XaW5kb3dzLkZvcm1zOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7CisKKy8vIDIwMGUgbHJtIC0gTFRSCisvLyAyMDBmIHJsbSAtIFJUTAorCisvLyB0b2RvIG5lZWQgdG8gc2V0IHRoZSBIVFRQICJDb250ZW50LUxhbmd1YWdlIiBoZWFkZXIsIGZvciBpbnN0YW5jZToKKy8vIENvbnRlbnQtTGFuZ3VhZ2U6IGVuLVVTCisvLyBDb250ZW50LUxhbmd1YWdlOiBmci1GUgorCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgcGFydGlhbCBjbGFzcyBXbWxEb2N1bWVudAorICAgIHsKKyAgICAgICAgW1N1cHByZXNzTWVzc2FnZSgiUmVTaGFycGVyIiwgIlVudXNlZE1lbWJlci5HbG9iYWwiKV0KKyAgICAgICAgcHVibGljIFhFbGVtZW50IENvbnZlcnRUb0h0bWwoV21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3MgaHRtbENvbnZlcnRlclNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV21sVG9IdG1sQ29udmVydGVyLkNvbnZlcnRUb0h0bWwodGhpcywgaHRtbENvbnZlcnRlclNldHRpbmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIFtTdXBwcmVzc01lc3NhZ2UoIlJlU2hhcnBlciIsICJVbnVzZWRNZW1iZXIuR2xvYmFsIildCisgICAgICAgIHB1YmxpYyBYRWxlbWVudCBDb252ZXJ0VG9IdG1sKEh0bWxDb252ZXJ0ZXJTZXR0aW5ncyBodG1sQ29udmVydGVyU2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzID0gbmV3IFdtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzKGh0bWxDb252ZXJ0ZXJTZXR0aW5ncyk7CisgICAgICAgICAgICByZXR1cm4gV21sVG9IdG1sQ29udmVydGVyLkNvbnZlcnRUb0h0bWwodGhpcywgc2V0dGluZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgW1N1cHByZXNzTWVzc2FnZSgiUmVTaGFycGVyIiwgIkZpZWxkQ2FuQmVNYWRlUmVhZE9ubHkuR2xvYmFsIildCisgICAgcHVibGljIGNsYXNzIFdtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzCisgICAgeworICAgICAgICBwdWJsaWMgc3RyaW5nIFBhZ2VUaXRsZTsKKyAgICAgICAgcHVibGljIHN0cmluZyBDc3NDbGFzc1ByZWZpeDsKKyAgICAgICAgcHVibGljIGJvb2wgRmFicmljYXRlQ3NzQ2xhc3NlczsKKyAgICAgICAgcHVibGljIHN0cmluZyBHZW5lcmFsQ3NzOworICAgICAgICBwdWJsaWMgc3RyaW5nIEFkZGl0aW9uYWxDc3M7CisgICAgICAgIHB1YmxpYyBib29sIFJlc3RyaWN0VG9TdXBwb3J0ZWRMYW5ndWFnZXM7CisgICAgICAgIHB1YmxpYyBib29sIFJlc3RyaWN0VG9TdXBwb3J0ZWROdW1iZXJpbmdGb3JtYXRzOworICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxzdHJpbmcsIEZ1bmM8c3RyaW5nLCBpbnQsIHN0cmluZywgc3RyaW5nPj4gTGlzdEl0ZW1JbXBsZW1lbnRhdGlvbnM7CisgICAgICAgIHB1YmxpYyBGdW5jPEltYWdlSW5mbywgWEVsZW1lbnQ+IEltYWdlSGFuZGxlcjsKKworICAgICAgICBwdWJsaWMgV21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3MoKQorICAgICAgICB7CisgICAgICAgICAgICBQYWdlVGl0bGUgPSAiIjsKKyAgICAgICAgICAgIENzc0NsYXNzUHJlZml4ID0gInB0LSI7CisgICAgICAgICAgICBGYWJyaWNhdGVDc3NDbGFzc2VzID0gdHJ1ZTsKKyAgICAgICAgICAgIEdlbmVyYWxDc3MgPSAic3BhbiB7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfSI7CisgICAgICAgICAgICBBZGRpdGlvbmFsQ3NzID0gIiI7CisgICAgICAgICAgICBSZXN0cmljdFRvU3VwcG9ydGVkTGFuZ3VhZ2VzID0gZmFsc2U7CisgICAgICAgICAgICBSZXN0cmljdFRvU3VwcG9ydGVkTnVtYmVyaW5nRm9ybWF0cyA9IGZhbHNlOworICAgICAgICAgICAgTGlzdEl0ZW1JbXBsZW1lbnRhdGlvbnMgPSBMaXN0SXRlbVJldHJpZXZlclNldHRpbmdzLkRlZmF1bHRMaXN0SXRlbVRleHRJbXBsZW1lbnRhdGlvbnM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgV21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3MoSHRtbENvbnZlcnRlclNldHRpbmdzIGh0bWxDb252ZXJ0ZXJTZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgUGFnZVRpdGxlID0gaHRtbENvbnZlcnRlclNldHRpbmdzLlBhZ2VUaXRsZTsKKyAgICAgICAgICAgIENzc0NsYXNzUHJlZml4ID0gaHRtbENvbnZlcnRlclNldHRpbmdzLkNzc0NsYXNzUHJlZml4OworICAgICAgICAgICAgRmFicmljYXRlQ3NzQ2xhc3NlcyA9IGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5GYWJyaWNhdGVDc3NDbGFzc2VzOworICAgICAgICAgICAgR2VuZXJhbENzcyA9IGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5HZW5lcmFsQ3NzOworICAgICAgICAgICAgQWRkaXRpb25hbENzcyA9IGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5BZGRpdGlvbmFsQ3NzOworICAgICAgICAgICAgUmVzdHJpY3RUb1N1cHBvcnRlZExhbmd1YWdlcyA9IGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5SZXN0cmljdFRvU3VwcG9ydGVkTGFuZ3VhZ2VzOworICAgICAgICAgICAgUmVzdHJpY3RUb1N1cHBvcnRlZE51bWJlcmluZ0Zvcm1hdHMgPSBodG1sQ29udmVydGVyU2V0dGluZ3MuUmVzdHJpY3RUb1N1cHBvcnRlZE51bWJlcmluZ0Zvcm1hdHM7CisgICAgICAgICAgICBMaXN0SXRlbUltcGxlbWVudGF0aW9ucyA9IGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5MaXN0SXRlbUltcGxlbWVudGF0aW9uczsKKyAgICAgICAgICAgIEltYWdlSGFuZGxlciA9IGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5JbWFnZUhhbmRsZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBbU3VwcHJlc3NNZXNzYWdlKCJSZVNoYXJwZXIiLCAiRmllbGRDYW5CZU1hZGVSZWFkT25seS5HbG9iYWwiKV0KKyAgICBwdWJsaWMgY2xhc3MgSHRtbENvbnZlcnRlclNldHRpbmdzCisgICAgeworICAgICAgICBwdWJsaWMgc3RyaW5nIFBhZ2VUaXRsZTsKKyAgICAgICAgcHVibGljIHN0cmluZyBDc3NDbGFzc1ByZWZpeDsKKyAgICAgICAgcHVibGljIGJvb2wgRmFicmljYXRlQ3NzQ2xhc3NlczsKKyAgICAgICAgcHVibGljIHN0cmluZyBHZW5lcmFsQ3NzOworICAgICAgICBwdWJsaWMgc3RyaW5nIEFkZGl0aW9uYWxDc3M7CisgICAgICAgIHB1YmxpYyBib29sIFJlc3RyaWN0VG9TdXBwb3J0ZWRMYW5ndWFnZXM7CisgICAgICAgIHB1YmxpYyBib29sIFJlc3RyaWN0VG9TdXBwb3J0ZWROdW1iZXJpbmdGb3JtYXRzOworICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxzdHJpbmcsIEZ1bmM8c3RyaW5nLCBpbnQsIHN0cmluZywgc3RyaW5nPj4gTGlzdEl0ZW1JbXBsZW1lbnRhdGlvbnM7CisgICAgICAgIHB1YmxpYyBGdW5jPEltYWdlSW5mbywgWEVsZW1lbnQ+IEltYWdlSGFuZGxlcjsKKworICAgICAgICBwdWJsaWMgSHRtbENvbnZlcnRlclNldHRpbmdzKCkKKyAgICAgICAgeworICAgICAgICAgICAgUGFnZVRpdGxlID0gIiI7CisgICAgICAgICAgICBDc3NDbGFzc1ByZWZpeCA9ICJwdC0iOworICAgICAgICAgICAgRmFicmljYXRlQ3NzQ2xhc3NlcyA9IHRydWU7CisgICAgICAgICAgICBHZW5lcmFsQ3NzID0gInNwYW4geyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IH0iOworICAgICAgICAgICAgQWRkaXRpb25hbENzcyA9ICIiOworICAgICAgICAgICAgUmVzdHJpY3RUb1N1cHBvcnRlZExhbmd1YWdlcyA9IGZhbHNlOworICAgICAgICAgICAgUmVzdHJpY3RUb1N1cHBvcnRlZE51bWJlcmluZ0Zvcm1hdHMgPSBmYWxzZTsKKyAgICAgICAgICAgIExpc3RJdGVtSW1wbGVtZW50YXRpb25zID0gTGlzdEl0ZW1SZXRyaWV2ZXJTZXR0aW5ncy5EZWZhdWx0TGlzdEl0ZW1UZXh0SW1wbGVtZW50YXRpb25zOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIdG1sQ29udmVydGVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IENvbnZlcnRUb0h0bWwoV21sRG9jdW1lbnQgd21sRG9jLCBIdG1sQ29udmVydGVyU2V0dGluZ3MgaHRtbENvbnZlcnRlclNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBXbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBXbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyhodG1sQ29udmVydGVyU2V0dGluZ3MpOworICAgICAgICAgICAgcmV0dXJuIFdtbFRvSHRtbENvbnZlcnRlci5Db252ZXJ0VG9IdG1sKHdtbERvYywgc2V0dGluZ3MpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRWxlbWVudCBDb252ZXJ0VG9IdG1sKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYywgSHRtbENvbnZlcnRlclNldHRpbmdzIGh0bWxDb252ZXJ0ZXJTZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgV21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgV21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3MoaHRtbENvbnZlcnRlclNldHRpbmdzKTsKKyAgICAgICAgICAgIHJldHVybiBXbWxUb0h0bWxDb252ZXJ0ZXIuQ29udmVydFRvSHRtbCh3RG9jLCBzZXR0aW5ncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBbU3VwcHJlc3NNZXNzYWdlKCJSZVNoYXJwZXIiLCAiTm90QWNjZXNzZWRGaWVsZC5HbG9iYWwiKV0KKyAgICBbU3VwcHJlc3NNZXNzYWdlKCJSZVNoYXJwZXIiLCAiVW51c2VkTWVtYmVyLkdsb2JhbCIpXQorICAgIHB1YmxpYyBjbGFzcyBJbWFnZUluZm8KKyAgICB7CisgICAgICAgIHB1YmxpYyBCaXRtYXAgQml0bWFwOworICAgICAgICBwdWJsaWMgWEF0dHJpYnV0ZSBJbWdTdHlsZUF0dHJpYnV0ZTsKKyAgICAgICAgcHVibGljIHN0cmluZyBDb250ZW50VHlwZTsKKyAgICAgICAgcHVibGljIFhFbGVtZW50IERyYXdpbmdFbGVtZW50OworICAgICAgICBwdWJsaWMgc3RyaW5nIEFsdFRleHQ7CisKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBFbXVzUGVySW5jaCA9IDkxNDQwMDsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBFbXVzUGVyQ20gPSAzNjAwMDA7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXbWxUb0h0bWxDb252ZXJ0ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgWEVsZW1lbnQgQ29udmVydFRvSHRtbChXbWxEb2N1bWVudCBkb2MsIFdtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzIGh0bWxDb252ZXJ0ZXJTZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCBzdHJlYW1Eb2MgPSBuZXcgT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50KGRvYykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jdW1lbnQgPSBzdHJlYW1Eb2MuR2V0V29yZHByb2Nlc3NpbmdEb2N1bWVudCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbnZlcnRUb0h0bWwoZG9jdW1lbnQsIGh0bWxDb252ZXJ0ZXJTZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBYRWxlbWVudCBDb252ZXJ0VG9IdG1sKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYywgV21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3MgaHRtbENvbnZlcnRlclNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBSZXZpc2lvbkFjY2VwdGVyLkFjY2VwdFJldmlzaW9ucyh3b3JkRG9jKTsKKyAgICAgICAgICAgIFNpbXBsaWZ5TWFya3VwU2V0dGluZ3Mgc2ltcGxpZnlNYXJrdXBTZXR0aW5ncyA9IG5ldyBTaW1wbGlmeU1hcmt1cFNldHRpbmdzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVtb3ZlQ29tbWVudHMgPSB0cnVlLAorICAgICAgICAgICAgICAgIFJlbW92ZUNvbnRlbnRDb250cm9scyA9IHRydWUsCisgICAgICAgICAgICAgICAgUmVtb3ZlRW5kQW5kRm9vdE5vdGVzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBSZW1vdmVGaWVsZENvZGVzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgUmVtb3ZlTGFzdFJlbmRlcmVkUGFnZUJyZWFrID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBSZW1vdmVQZXJtaXNzaW9ucyA9IHRydWUsCisgICAgICAgICAgICAgICAgUmVtb3ZlUHJvb2YgPSB0cnVlLAorICAgICAgICAgICAgICAgIFJlbW92ZVJzaWRJbmZvID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBSZW1vdmVTbWFydFRhZ3MgPSB0cnVlLAorICAgICAgICAgICAgICAgIFJlbW92ZVNvZnRIeXBoZW5zID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBSZW1vdmVHb0JhY2tCb29rbWFyayA9IHRydWUsCisgICAgICAgICAgICAgICAgUmVwbGFjZVRhYnNXaXRoU3BhY2VzID0gZmFsc2UsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgTWFya3VwU2ltcGxpZmllci5TaW1wbGlmeU1hcmt1cCh3b3JkRG9jLCBzaW1wbGlmeU1hcmt1cFNldHRpbmdzKTsKKworICAgICAgICAgICAgRm9ybWF0dGluZ0Fzc2VtYmxlclNldHRpbmdzIGZvcm1hdHRpbmdBc3NlbWJsZXJTZXR0aW5ncyA9IG5ldyBGb3JtYXR0aW5nQXNzZW1ibGVyU2V0dGluZ3MKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSZW1vdmVTdHlsZU5hbWVzRnJvbVBhcmFncmFwaEFuZFJ1blByb3BlcnRpZXMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICBDbGVhclN0eWxlcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIFJlc3RyaWN0VG9TdXBwb3J0ZWRMYW5ndWFnZXMgPSBodG1sQ29udmVydGVyU2V0dGluZ3MuUmVzdHJpY3RUb1N1cHBvcnRlZExhbmd1YWdlcywKKyAgICAgICAgICAgICAgICBSZXN0cmljdFRvU3VwcG9ydGVkTnVtYmVyaW5nRm9ybWF0cyA9IGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5SZXN0cmljdFRvU3VwcG9ydGVkTnVtYmVyaW5nRm9ybWF0cywKKyAgICAgICAgICAgICAgICBDcmVhdGVIdG1sQ29udmVydGVyQW5ub3RhdGlvbkF0dHJpYnV0ZXMgPSB0cnVlLAorICAgICAgICAgICAgICAgIE9yZGVyRWxlbWVudHNQZXJTdGFuZGFyZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgIExpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3MgPQorICAgICAgICAgICAgICAgICAgICBodG1sQ29udmVydGVyU2V0dGluZ3MuTGlzdEl0ZW1JbXBsZW1lbnRhdGlvbnMgPT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgIG5ldyBMaXN0SXRlbVJldHJpZXZlclNldHRpbmdzKCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTGlzdEl0ZW1UZXh0SW1wbGVtZW50YXRpb25zID0gTGlzdEl0ZW1SZXRyaWV2ZXJTZXR0aW5ncy5EZWZhdWx0TGlzdEl0ZW1UZXh0SW1wbGVtZW50YXRpb25zLAorICAgICAgICAgICAgICAgICAgICB9IDoKKyAgICAgICAgICAgICAgICAgICAgbmV3IExpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3MoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0SXRlbVRleHRJbXBsZW1lbnRhdGlvbnMgPSBodG1sQ29udmVydGVyU2V0dGluZ3MuTGlzdEl0ZW1JbXBsZW1lbnRhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBGb3JtYXR0aW5nQXNzZW1ibGVyLkFzc2VtYmxlRm9ybWF0dGluZyh3b3JkRG9jLCBmb3JtYXR0aW5nQXNzZW1ibGVyU2V0dGluZ3MpOworCisgICAgICAgICAgICBJbnNlcnRBcHByb3ByaWF0ZU5vbmJyZWFraW5nU3BhY2VzKHdvcmREb2MpOworICAgICAgICAgICAgQ2FsY3VsYXRlU3BhbldpZHRoRm9yVGFicyh3b3JkRG9jKTsKKyAgICAgICAgICAgIFJldmVyc2VUYWJsZUJvcmRlcnNGb3JSdGxUYWJsZXMod29yZERvYyk7CisgICAgICAgICAgICBBZGp1c3RUYWJsZUJvcmRlcnMod29yZERvYyk7CisgICAgICAgICAgICBYRWxlbWVudCByb290RWxlbWVudCA9IHdvcmREb2MuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKS5Sb290OworICAgICAgICAgICAgRmllbGRSZXRyaWV2ZXIuQW5ub3RhdGVXaXRoRmllbGRJbmZvKHdvcmREb2MuTWFpbkRvY3VtZW50UGFydCk7CisgICAgICAgICAgICBBbm5vdGF0ZUZvclNlY3Rpb25zKHdvcmREb2MpOworCisgICAgICAgICAgICBYRWxlbWVudCB4aHRtbCA9IChYRWxlbWVudClDb252ZXJ0VG9IdG1sVHJhbnNmb3JtKHdvcmREb2MsIGh0bWxDb252ZXJ0ZXJTZXR0aW5ncywKKyAgICAgICAgICAgICAgICByb290RWxlbWVudCwgZmFsc2UsIDBtKTsKKworICAgICAgICAgICAgUmVpZnlTdHlsZXNBbmRDbGFzc2VzKGh0bWxDb252ZXJ0ZXJTZXR0aW5ncywgeGh0bWwpOworCisgICAgICAgICAgICAvLyBOb3RlOiB0aGUgeGh0bWwgcmV0dXJuZWQgYnkgQ29udmVydFRvSHRtbFRyYW5zZm9ybSBjb250YWlucyBvYmplY3RzIG9mIHR5cGUKKyAgICAgICAgICAgIC8vIFhFbnRpdHkuICBQdE9wZW5YbWxVdGlsLmNzIGRlZmluZSB0aGUgWEVudGl0eSBjbGFzcy4gIFNlZQorICAgICAgICAgICAgLy8gaHR0cDovL2Jsb2dzLm1zZG4uY29tL2VyaWN3aGl0ZS9hcmNoaXZlLzIwMTAvMDEvMjEvd3JpdGluZy1lbnRpdHktcmVmZXJlbmNlcy11c2luZy1saW5xLXRvLXhtbC5hc3B4CisgICAgICAgICAgICAvLyBmb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24uCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgeW91IGZ1cnRoZXIgdHJhbnNmb3JtIHRoZSBYTUwgdHJlZSByZXR1cm5lZCBieSBDb252ZXJ0VG9IdG1sVHJhbnNmb3JtLCB5b3UKKyAgICAgICAgICAgIC8vIG11c3QgZG8gaXQgY29ycmVjdGx5LCBvciBlbnRpdGllcyB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHByb3Blcmx5LgorCisgICAgICAgICAgICByZXR1cm4geGh0bWw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFJldmVyc2VUYWJsZUJvcmRlcnNGb3JSdGxUYWJsZXMoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jKQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgeGQgPSB3b3JkRG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdGJsIGluIHhkLkRlc2NlbmRhbnRzKFcudGJsKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYmlkaVZpc3VhbCA9IHRibC5FbGVtZW50cyhXLnRibFByKS5FbGVtZW50cyhXLmJpZGlWaXN1YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKGJpZGlWaXN1YWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICB2YXIgdGJsQm9yZGVycyA9IHRibC5FbGVtZW50cyhXLnRibFByKS5FbGVtZW50cyhXLnRibEJvcmRlcnMpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKHRibEJvcmRlcnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBsZWZ0ID0gdGJsQm9yZGVycy5FbGVtZW50KFcubGVmdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbmV3IFhFbGVtZW50KFcucmlnaHQsIGxlZnQuQXR0cmlidXRlcygpKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHQgPSB0YmxCb3JkZXJzLkVsZW1lbnQoVy5yaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyaWdodCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBuZXcgWEVsZW1lbnQoVy5sZWZ0LCByaWdodC5BdHRyaWJ1dGVzKCkpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdUYmxCb3JkZXJzID0gbmV3IFhFbGVtZW50KFcudGJsQm9yZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRibEJvcmRlcnMuRWxlbWVudChXLnRvcCksCisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgdGJsQm9yZGVycy5FbGVtZW50KFcuYm90dG9tKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgdGJsQm9yZGVycy5SZXBsYWNlV2l0aChuZXdUYmxCb3JkZXJzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdGMgaW4gdGJsLkVsZW1lbnRzKFcudHIpLkVsZW1lbnRzKFcudGMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRjQm9yZGVycyA9IHRjLkVsZW1lbnRzKFcudGNQcikuRWxlbWVudHMoVy50Y0JvcmRlcnMpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0Y0JvcmRlcnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlZnQgPSB0Y0JvcmRlcnMuRWxlbWVudChXLmxlZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbmV3IFhFbGVtZW50KFcucmlnaHQsIGxlZnQuQXR0cmlidXRlcygpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGNCb3JkZXJzLkVsZW1lbnQoVy5yaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IG5ldyBYRWxlbWVudChXLmxlZnQsIHJpZ2h0LkF0dHJpYnV0ZXMoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdUY0JvcmRlcnMgPSBuZXcgWEVsZW1lbnQoVy50Y0JvcmRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNCb3JkZXJzLkVsZW1lbnQoVy50b3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNCb3JkZXJzLkVsZW1lbnQoVy5ib3R0b20pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjQm9yZGVycy5SZXBsYWNlV2l0aChuZXdUY0JvcmRlcnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZWlmeVN0eWxlc0FuZENsYXNzZXMoV21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3MgaHRtbENvbnZlcnRlclNldHRpbmdzLCBYRWxlbWVudCB4aHRtbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5GYWJyaWNhdGVDc3NDbGFzc2VzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB1c2VkQ3NzQ2xhc3NOYW1lcyA9IG5ldyBIYXNoU2V0PHN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICB2YXIgZWxlbWVudHNUaGF0TmVlZENsYXNzZXMgPSB4aHRtbAorICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNBbmRTZWxmKCkKKyAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChkID0+IG5ldworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50ID0gZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlcyA9IGQuQW5ub3RhdGlvbjxEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPj4oKSwKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKHogPT4gei5TdHlsZXMgIT0gbnVsbCk7CisgICAgICAgICAgICAgICAgdmFyIGF1Z21lbnRlZCA9IGVsZW1lbnRzVGhhdE5lZWRDbGFzc2VzCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QocCA9PiBuZXcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcC5FbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgcC5TdHlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHlsZXNTdHJpbmcgPSBwLkVsZW1lbnQuTmFtZS5Mb2NhbE5hbWUgKyAifCIgKyBwLlN0eWxlcy5PcmRlckJ5KGsgPT4gay5LZXkpLlNlbGVjdChzID0+IHN0cmluZy5Gb3JtYXQoInswfTogezF9OyIsIHMuS2V5LCBzLlZhbHVlKSkuU3RyaW5nQ29uY2F0ZW5hdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgLkdyb3VwQnkocCA9PiBwLlN0eWxlc1N0cmluZykKKyAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgICAgIGludCBjbGFzc0NvdW50ZXIgPSAxMDAwMDAwOworICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKEVudmlyb25tZW50Lk5ld0xpbmUpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBncnAgaW4gYXVnbWVudGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsYXNzTmFtZVRvVXNlOworICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RPbmUgPSBncnAuRmlyc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlcyA9IGZpcnN0T25lLlN0eWxlczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlcy5Db250YWluc0tleSgiUHRTdHlsZU5hbWUiKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lVG9Vc2UgPSBodG1sQ29udmVydGVyU2V0dGluZ3MuQ3NzQ2xhc3NQcmVmaXggKyBzdHlsZXNbIlB0U3R5bGVOYW1lIl07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlZENzc0NsYXNzTmFtZXMuQ29udGFpbnMoY2xhc3NOYW1lVG9Vc2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZVRvVXNlID0gaHRtbENvbnZlcnRlclNldHRpbmdzLkNzc0NsYXNzUHJlZml4ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzWyJQdFN0eWxlTmFtZSJdICsgIi0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NDb3VudGVyLlRvU3RyaW5nKCkuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzQ291bnRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lVG9Vc2UgPSBodG1sQ29udmVydGVyU2V0dGluZ3MuQ3NzQ2xhc3NQcmVmaXggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzQ291bnRlci5Ub1N0cmluZygpLlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzQ291bnRlcisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVzZWRDc3NDbGFzc05hbWVzLkFkZChjbGFzc05hbWVUb1VzZSk7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChmaXJzdE9uZS5FbGVtZW50Lk5hbWUuTG9jYWxOYW1lICsgIi4iICsgY2xhc3NOYW1lVG9Vc2UgKyAiIHsiICsgRW52aXJvbm1lbnQuTmV3TGluZSk7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzdCBpbiBmaXJzdE9uZS5TdHlsZXMuV2hlcmUocyA9PiBzLktleSAhPSAiUHRTdHlsZU5hbWUiKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSAiICAgICIgKyBzdC5LZXkgKyAiOiAiICsgc3QuVmFsdWUgKyAiOyIgKyBFbnZpcm9ubWVudC5OZXdMaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgifSIgKyBFbnZpcm9ubWVudC5OZXdMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNsYXNzQXR0ID0gbmV3IFhBdHRyaWJ1dGUoImNsYXNzIiwgY2xhc3NOYW1lVG9Vc2UpOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZ2MgaW4gZ3JwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ2MuRWxlbWVudC5BZGQoY2xhc3NBdHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgc3R5bGVWYWx1ZSA9IGh0bWxDb252ZXJ0ZXJTZXR0aW5ncy5HZW5lcmFsQ3NzICsgc2IgKyBodG1sQ29udmVydGVyU2V0dGluZ3MuQWRkaXRpb25hbENzczsKKworICAgICAgICAgICAgICAgIFNldFN0eWxlRWxlbWVudFZhbHVlKHhodG1sLCBzdHlsZVZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBQcmV2aW91c2x5LCB0aGUgaDpzdHlsZSBlbGVtZW50IHdhcyBub3QgYWRkZWQgYXQgdGhpcyBwb2ludC4gSG93ZXZlciwKKyAgICAgICAgICAgICAgICAvLyBhdCBsZWFzdCB0aGUgR2VuZXJhbCBDU1Mgd2lsbCBjb250YWluIGltcG9ydGFudCBzZXR0aW5ncy4KKyAgICAgICAgICAgICAgICBTZXRTdHlsZUVsZW1lbnRWYWx1ZSh4aHRtbCwgaHRtbENvbnZlcnRlclNldHRpbmdzLkdlbmVyYWxDc3MgKyBodG1sQ29udmVydGVyU2V0dGluZ3MuQWRkaXRpb25hbENzcyk7CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZCBpbiB4aHRtbC5EZXNjZW5kYW50c0FuZFNlbGYoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZSA9IGQuQW5ub3RhdGlvbjxEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPj4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShwID0+IHAuS2V5ICE9ICJQdFN0eWxlTmFtZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuT3JkZXJCeShwID0+IHAuS2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChlID0+IHN0cmluZy5Gb3JtYXQoInswfTogezF9OyIsIGUuS2V5LCBlLlZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZSgpOworICAgICAgICAgICAgICAgICAgICBYQXR0cmlidXRlIHN0ID0gbmV3IFhBdHRyaWJ1dGUoInN0eWxlIiwgc3R5bGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkLkF0dHJpYnV0ZSgic3R5bGUiKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgZC5BdHRyaWJ1dGUoInN0eWxlIikuVmFsdWUgKz0gc3R5bGVWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZC5BZGQoc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgU2V0U3R5bGVFbGVtZW50VmFsdWUoWEVsZW1lbnQgeGh0bWwsIHN0cmluZyBzdHlsZVZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc3R5bGVFbGVtZW50ID0geGh0bWwKKyAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoWGh0bWwuc3R5bGUpCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoc3R5bGVFbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgc3R5bGVFbGVtZW50LlZhbHVlID0gc3R5bGVWYWx1ZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHlsZUVsZW1lbnQgPSBuZXcgWEVsZW1lbnQoWGh0bWwuc3R5bGUsIHN0eWxlVmFsdWUpOworICAgICAgICAgICAgICAgIHZhciBoZWFkID0geGh0bWwuRWxlbWVudChYaHRtbC5oZWFkKTsKKyAgICAgICAgICAgICAgICBpZiAoaGVhZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBoZWFkLkFkZChzdHlsZUVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IENvbnZlcnRUb0h0bWxUcmFuc2Zvcm0oV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jLAorICAgICAgICAgICAgV21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MsIFhOb2RlIG5vZGUsCisgICAgICAgICAgICBib29sIHN1cHByZXNzVHJhaWxpbmdXaGl0ZVNwYWNlLAorICAgICAgICAgICAgZGVjaW1hbCBjdXJyZW50TWFyZ2luTGVmdCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgdzpkb2N1bWVudCBlbGVtZW50IHRvIHRoZSBYSFRNTCBoOmh0bWwgZWxlbWVudC4KKyAgICAgICAgICAgIC8vIFRoZSBoOmhlYWQgZWxlbWVudCBpcyBsYWlkIG91dCBiYXNlZCBvbiB0aGUgVzNDJ3MgcmVjb21tZW5kZWQgbGF5b3V0LCBpLmUuLAorICAgICAgICAgICAgLy8gdGhlIGNoYXJzZXQgKHVzaW5nIHRoZSBIVE1MNS1jb21wbGlhbnQgZm9ybSksIHRoZSB0aXRsZSAod2hpY2ggaXMgYWx3YXlzCisgICAgICAgICAgICAvLyB0aGVyZSBidXQgcG9zc2libHkgZW1wdHkpLCBhbmQgb3RoZXIgbWV0YSB0YWdzLgorICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLmRvY3VtZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoWGh0bWwuaHRtbCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFhodG1sLmhlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoWGh0bWwubWV0YSwgbmV3IFhBdHRyaWJ1dGUoImNoYXJzZXQiLCAiVVRGLTgiKSksCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5QYWdlVGl0bGUgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFhFbGVtZW50KFhodG1sLnRpdGxlLCBuZXcgWFRleHQoc2V0dGluZ3MuUGFnZVRpdGxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBYRWxlbWVudChYaHRtbC50aXRsZSwgbmV3IFhUZXh0KHN0cmluZy5FbXB0eSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFhodG1sLm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIm5hbWUiLCAiR2VuZXJhdG9yIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoImNvbnRlbnQiLCAiUG93ZXJUb29scyBmb3IgT3BlbiBYTUwiKSkpLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZSA9PiBDb252ZXJ0VG9IdG1sVHJhbnNmb3JtKHdvcmREb2MsIHNldHRpbmdzLCBlLCBmYWxzZSwgY3VycmVudE1hcmdpbkxlZnQpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgdzpib2R5IGVsZW1lbnQgdG8gdGhlIFhIVE1MIGg6Ym9keSBlbGVtZW50LgorICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLmJvZHkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChYaHRtbC5ib2R5LCBDcmVhdGVTZWN0aW9uRGl2cyh3b3JkRG9jLCBzZXR0aW5ncywgZWxlbWVudCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIHc6cCBlbGVtZW50IHRvIHRoZSBYSFRNTCBoOmgxLWg2IG9yIGg6cCBlbGVtZW50IChpZiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoIGRvZXMgbm90CisgICAgICAgICAgICAvLyBoYXZlIGEgc3R5bGUgc2VwYXJhdG9yKS4KKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBQcm9jZXNzUGFyYWdyYXBoKHdvcmREb2MsIHNldHRpbmdzLCBlbGVtZW50LCBzdXBwcmVzc1RyYWlsaW5nV2hpdGVTcGFjZSwgY3VycmVudE1hcmdpbkxlZnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gaHlwZXJsaW5rcyB0byB0aGUgWEhUTUwgaDphIGVsZW1lbnQuCisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuaHlwZXJsaW5rICYmIGVsZW1lbnQuQXR0cmlidXRlKFIuaWQpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG5ldyBYRWxlbWVudChYaHRtbC5hLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoImhyZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmREb2MuTWFpbkRvY3VtZW50UGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSHlwZXJsaW5rUmVsYXRpb25zaGlwcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3QoeCA9PiB4LklkID09IChzdHJpbmcpZWxlbWVudC5BdHRyaWJ1dGUoUi5pZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5VcmkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cyhXLnIpLlNlbGVjdChydW4gPT4gQ29udmVydFJ1bih3b3JkRG9jLCBzZXR0aW5ncywgcnVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIGlmICghYS5Ob2RlcygpLkFueSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgYS5BZGQobmV3IFhUZXh0KCIiKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVXJpRm9ybWF0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuRWxlbWVudHMoKS5TZWxlY3QoZSA9PiBDb252ZXJ0VG9IdG1sVHJhbnNmb3JtKHdvcmREb2MsIHNldHRpbmdzLCBlLCBmYWxzZSwgY3VycmVudE1hcmdpbkxlZnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBoeXBlcmxpbmtzIHRvIGJvb2ttYXJrcyB0byB0aGUgWEhUTUwgaDphIGVsZW1lbnQuCisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuaHlwZXJsaW5rICYmIGVsZW1lbnQuQXR0cmlidXRlKFcuYW5jaG9yKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBQcm9jZXNzSHlwZXJsaW5rVG9Cb29rbWFyayh3b3JkRG9jLCBzZXR0aW5ncywgZWxlbWVudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBjb250ZW50cyBvZiBydW5zLgorICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbnZlcnRSdW4od29yZERvYywgc2V0dGluZ3MsIGVsZW1lbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gdzpib29rbWFya1N0YXJ0IGludG8gYW5jaG9yCisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuYm9va21hcmtTdGFydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHJvY2Vzc0Jvb2ttYXJrU3RhcnQoZWxlbWVudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBldmVyeSB3OnQgZWxlbWVudCB0byBhIHRleHQgbm9kZS4KKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gY29udmVydCBjaGFyYWN0ZXJzIHRvIGVudGl0aWVzIGluIGEgVVRGLTggZG9jdW1lbnQuCisgICAgICAgICAgICAgICAgLy8gRnVydGhlciwgd2UgZG9uJ3QgbmVlZCAmbmJzcDsgZW50aXRpZXMgZm9yIHNpZ25pZmljYW50IHdoaXRlc3BhY2UKKyAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHdlIGFyZSB3cmFwcGluZyB0aGUgdGV4dCBub2RlcyBpbiA8c3Bhbj4gZWxlbWVudHMgd2l0aGluCisgICAgICAgICAgICAgICAgLy8gd2hpY2ggYWxsIHdoaXRlc3BhY2UgaXMgc2lnbmlmaWNhbnQuCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYVGV4dChlbGVtZW50LlZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVHJhbnNmb3JtIHN5bWJvbHMgdG8gc3BhbnMKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5zeW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNzID0gKHN0cmluZyllbGVtZW50LkF0dHJpYnV0ZShXLl9jaGFyKTsKKyAgICAgICAgICAgICAgICB2YXIgYyA9IENvbnZlcnQuVG9JbnQzMihjcywgMTYpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoWGh0bWwuc3BhbiwgbmV3IFhFbnRpdHkoc3RyaW5nLkZvcm1hdCgiI3swfSIsIGMpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRyYW5zZm9ybSB0YWJzIHRoYXQgaGF2ZSB0aGUgcHQ6VGFiV2lkdGggYXR0cmlidXRlIHNldAorICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnRhYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHJvY2Vzc1RhYihlbGVtZW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVHJhbnNmb3JtIHc6YnIgdG8gaDpici4KKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5iciB8fCBlbGVtZW50Lk5hbWUgPT0gVy5jcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHJvY2Vzc0JyZWFrKGVsZW1lbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gdzpub0JyZWFrSHlwaGVuIHRvICctJworICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLm5vQnJlYWtIeXBoZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYVGV4dCgiLSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gdzp0YmwgdG8gaDp0YmwuCisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcudGJsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBQcm9jZXNzVGFibGUod29yZERvYywgc2V0dGluZ3MsIGVsZW1lbnQsIGN1cnJlbnRNYXJnaW5MZWZ0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVHJhbnNmb3JtIHc6dHIgdG8gaDp0ci4KKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy50cikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHJvY2Vzc1RhYmxlUm93KHdvcmREb2MsIHNldHRpbmdzLCBlbGVtZW50LCBjdXJyZW50TWFyZ2luTGVmdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRyYW5zZm9ybSB3OnRjIHRvIGg6dGQuCisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcudGMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFByb2Nlc3NUYWJsZUNlbGwod29yZERvYywgc2V0dGluZ3MsIGVsZW1lbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gaW1hZ2VzCisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuZHJhd2luZyB8fCBlbGVtZW50Lk5hbWUgPT0gVy5waWN0IHx8IGVsZW1lbnQuTmFtZSA9PSBXLl9vYmplY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFByb2Nlc3NJbWFnZSh3b3JkRG9jLCBlbGVtZW50LCBzZXR0aW5ncy5JbWFnZUhhbmRsZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gY29udGVudCBjb250cm9scy4KKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5zZHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFByb2Nlc3NDb250ZW50Q29udHJvbCh3b3JkRG9jLCBzZXR0aW5ncywgZWxlbWVudCwgY3VycmVudE1hcmdpbkxlZnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gc21hcnQgdGFncyBhbmQgc2ltcGxlIGZpZWxkcy4KKyAgICAgICAgICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gVy5zbWFydFRhZyB8fCBlbGVtZW50Lk5hbWUgPT0gVy5mbGRTaW1wbGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUJvcmRlckRpdnMod29yZERvYywgc2V0dGluZ3MsIGVsZW1lbnQuRWxlbWVudHMoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElnbm9yZSBlbGVtZW50LgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgUHJvY2Vzc0h5cGVybGlua1RvQm9va21hcmsoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jLCBXbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncywgWEVsZW1lbnQgZWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0eWxlID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CisgICAgICAgICAgICB2YXIgYSA9IG5ldyBYRWxlbWVudChYaHRtbC5hLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJocmVmIiwgIiMiICsgKHN0cmluZykgZWxlbWVudC5BdHRyaWJ1dGUoVy5hbmNob3IpKSwKKyAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKFcucikuU2VsZWN0KHJ1biA9PiBDb252ZXJ0UnVuKHdvcmREb2MsIHNldHRpbmdzLCBydW4pKSk7CisgICAgICAgICAgICBpZiAoIWEuTm9kZXMoKS5BbnkoKSkKKyAgICAgICAgICAgICAgICBhLkFkZChuZXcgWFRleHQoIiIpKTsKKyAgICAgICAgICAgIHN0eWxlLkFkZCgidGV4dC1kZWNvcmF0aW9uIiwgIm5vbmUiKTsKKyAgICAgICAgICAgIGEuQWRkQW5ub3RhdGlvbihzdHlsZSk7CisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBQcm9jZXNzQm9va21hcmtTdGFydChYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbmFtZSA9IChzdHJpbmcpIGVsZW1lbnQuQXR0cmlidXRlKFcubmFtZSk7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgdmFyIHN0eWxlID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CisgICAgICAgICAgICB2YXIgYSA9IG5ldyBYRWxlbWVudChYaHRtbC5hLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJpZCIsIG5hbWUpLAorICAgICAgICAgICAgICAgIG5ldyBYVGV4dCgiIikpOworICAgICAgICAgICAgaWYgKCFhLk5vZGVzKCkuQW55KCkpCisgICAgICAgICAgICAgICAgYS5BZGQobmV3IFhUZXh0KCIiKSk7CisgICAgICAgICAgICBzdHlsZS5BZGQoInRleHQtZGVjb3JhdGlvbiIsICJub25lIik7CisgICAgICAgICAgICBhLkFkZEFubm90YXRpb24oc3R5bGUpOworICAgICAgICAgICAgcmV0dXJuIGE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgUHJvY2Vzc1RhYihYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdGFiV2lkdGhBdHQgPSBlbGVtZW50LkF0dHJpYnV0ZShQdE9wZW5YbWwuVGFiV2lkdGgpOworICAgICAgICAgICAgaWYgKHRhYldpZHRoQXR0ID09IG51bGwpIHJldHVybiBudWxsOworCisgICAgICAgICAgICB2YXIgbGVhZGVyID0gKHN0cmluZykgZWxlbWVudC5BdHRyaWJ1dGUoUHRPcGVuWG1sLkxlYWRlcik7CisgICAgICAgICAgICB2YXIgdGFiV2lkdGggPSAoZGVjaW1hbCkgdGFiV2lkdGhBdHQ7CisgICAgICAgICAgICB2YXIgc3R5bGUgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKTsKKyAgICAgICAgICAgIFhFbGVtZW50IHNwYW47CisgICAgICAgICAgICBpZiAobGVhZGVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGxlYWRlckNoYXIgPSAiLiI7CisgICAgICAgICAgICAgICAgaWYgKGxlYWRlciA9PSAiaHlwaGVuIikKKyAgICAgICAgICAgICAgICAgICAgbGVhZGVyQ2hhciA9ICItIjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsZWFkZXIgPT0gImRvdCIpCisgICAgICAgICAgICAgICAgICAgIGxlYWRlckNoYXIgPSAiLiI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobGVhZGVyID09ICJ1bmRlcnNjb3JlIikKKyAgICAgICAgICAgICAgICAgICAgbGVhZGVyQ2hhciA9ICJfIjsKKworICAgICAgICAgICAgICAgIHZhciBydW5Db250YWluaW5nVGFiVG9SZXBsYWNlID0gZWxlbWVudC5BbmNlc3RvcnMoVy5yKS5GaXJzdCgpOworICAgICAgICAgICAgICAgIHZhciBmb250TmFtZUF0dCA9IHJ1bkNvbnRhaW5pbmdUYWJUb1JlcGxhY2UuQXR0cmlidXRlKFB0T3BlblhtbC5wdCArICJGb250TmFtZSIpID8/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQ29udGFpbmluZ1RhYlRvUmVwbGFjZS5BbmNlc3RvcnMoVy5wKS5GaXJzdCgpLkF0dHJpYnV0ZShQdE9wZW5YbWwucHQgKyAiRm9udE5hbWUiKTsKKworICAgICAgICAgICAgICAgIHZhciBkdW1teVJ1biA9IG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgIGZvbnROYW1lQXR0LAorICAgICAgICAgICAgICAgICAgICBydW5Db250YWluaW5nVGFiVG9SZXBsYWNlLkVsZW1lbnRzKFcuclByKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudCwgbGVhZGVyQ2hhcikpOworCisgICAgICAgICAgICAgICAgdmFyIHdpZHRoT2ZMZWFkZXJDaGFyID0gQ2FsY1dpZHRoT2ZSdW5JblR3aXBzKGR1bW15UnVuKTsKKworICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VBcmlhbCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmICh3aWR0aE9mTGVhZGVyQ2hhciA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHVtbXlSdW4gPSBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLkZvbnROYW1lLCAiQXJpYWwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkNvbnRhaW5pbmdUYWJUb1JlcGxhY2UuRWxlbWVudHMoVy5yUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudCwgbGVhZGVyQ2hhcikpOworICAgICAgICAgICAgICAgICAgICB3aWR0aE9mTGVhZGVyQ2hhciA9IENhbGNXaWR0aE9mUnVuSW5Ud2lwcyhkdW1teVJ1bik7CisgICAgICAgICAgICAgICAgICAgIGZvcmNlQXJpYWwgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh3aWR0aE9mTGVhZGVyQ2hhciAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG51bWJlck9mTGVhZGVyQ2hhcnMgPSAoaW50KSAoTWF0aC5GbG9vcigodGFiV2lkdGgqMTQ0MCkvd2lkdGhPZkxlYWRlckNoYXIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlck9mTGVhZGVyQ2hhcnMgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZMZWFkZXJDaGFycyA9IDA7CisgICAgICAgICAgICAgICAgICAgIHNwYW4gPSBuZXcgWEVsZW1lbnQoWGh0bWwuc3BhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sICsgInNwYWNlIiwgInByZXNlcnZlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAiICIgKyAiIi5QYWRSaWdodChudW1iZXJPZkxlYWRlckNoYXJzLCBsZWFkZXJDaGFyWzBdKSArICIgIik7CisgICAgICAgICAgICAgICAgICAgIHN0eWxlLkFkZCgibWFyZ2luIiwgIjAgMCAwIDAiKTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUuQWRkKCJwYWRkaW5nIiwgIjAgMCAwIDAiKTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUuQWRkKCJ3aWR0aCIsIHN0cmluZy5Gb3JtYXQoTnVtYmVyRm9ybWF0SW5mby5JbnZhcmlhbnRJbmZvLCAiezA6MC4wMH1pbiIsIHRhYldpZHRoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0eWxlLkFkZCgidGV4dC1hbGlnbiIsICJjZW50ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlQXJpYWwpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5BZGQoImZvbnQtZmFtaWx5IiwgIkFyaWFsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwYW4gPSBuZXcgWEVsZW1lbnQoWGh0bWwuc3BhbiwgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWwgKyAic3BhY2UiLCAicHJlc2VydmUiKSwgIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUuQWRkKCJtYXJnaW4iLCAiMCAwIDAgMCIpOworICAgICAgICAgICAgICAgICAgICBzdHlsZS5BZGQoInBhZGRpbmciLCAiMCAwIDAgMCIpOworICAgICAgICAgICAgICAgICAgICBzdHlsZS5BZGQoIndpZHRoIiwgc3RyaW5nLkZvcm1hdChOdW1iZXJGb3JtYXRJbmZvLkludmFyaWFudEluZm8sICJ7MDowLjAwfWluIiwgdGFiV2lkdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUuQWRkKCJ0ZXh0LWFsaWduIiwgImNlbnRlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAobGVhZGVyID09ICJ1bmRlcnNjb3JlIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuQWRkKCJ0ZXh0LWRlY29yYXRpb24iLCAidW5kZXJsaW5lIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisjaWYgZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmlkaSA9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFuY2VzdG9ycyhXLnApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UYWtlKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnBQcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuYmlkaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGIgPT4gYi5BdHRyaWJ1dGUoVy52YWwpID09IG51bGwgfHwgYi5BdHRyaWJ1dGUoVy52YWwpLlRvQm9vbGVhbigpID09IHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0JpZGkgPSBiaWRpICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQmlkaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbiA9IG5ldyBYRWxlbWVudChYaHRtbC5zcGFuLCBuZXcgWEVudGl0eSgiI3gyMDBmIikpOyAvLyBSTE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4gPSBuZXcgWEVsZW1lbnQoWGh0bWwuc3BhbiwgbmV3IFhFbnRpdHkoIiN4MjAwZSIpKTsgLy8gTFJNCisjZWxzZQorICAgICAgICAgICAgICAgIHNwYW4gPSBuZXcgWEVsZW1lbnQoWGh0bWwuc3BhbiwgbmV3IFhFbnRpdHkoIiN4MDBhMCIpKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHN0eWxlLkFkZCgibWFyZ2luIiwgc3RyaW5nLkZvcm1hdChOdW1iZXJGb3JtYXRJbmZvLkludmFyaWFudEluZm8sICIwIDAgMCB7MDowLjAwfWluIiwgdGFiV2lkdGgpKTsKKyAgICAgICAgICAgICAgICBzdHlsZS5BZGQoInBhZGRpbmciLCAiMCAwIDAgMCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3Bhbi5BZGRBbm5vdGF0aW9uKHN0eWxlKTsKKyAgICAgICAgICAgIHJldHVybiBzcGFuOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFByb2Nlc3NCcmVhayhYRWxlbWVudCBlbGVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBzcGFuID0gbnVsbDsKKyAgICAgICAgICAgIHZhciB0YWJXaWR0aCA9IChkZWNpbWFsPykgZWxlbWVudC5BdHRyaWJ1dGUoUHRPcGVuWG1sLlRhYldpZHRoKTsKKyAgICAgICAgICAgIGlmICh0YWJXaWR0aCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwYW4gPSBuZXcgWEVsZW1lbnQoWGh0bWwuc3Bhbik7CisgICAgICAgICAgICAgICAgc3Bhbi5BZGRBbm5vdGF0aW9uKG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAibWFyZ2luIiwgc3RyaW5nLkZvcm1hdChOdW1iZXJGb3JtYXRJbmZvLkludmFyaWFudEluZm8sICIwIDAgMCB7MDowLjAwfWluIiwgdGFiV2lkdGgpIH0sCisgICAgICAgICAgICAgICAgICAgIHsgInBhZGRpbmciLCAiMCAwIDAgMCIgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcGFyYWdyYXBoID0gZWxlbWVudC5BbmNlc3RvcnMoVy5wKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgdmFyIGlzQmlkaSA9IHBhcmFncmFwaCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoLkVsZW1lbnRzKFcucFByKS5FbGVtZW50cyhXLmJpZGkpLkFueShiID0+IGIuQXR0cmlidXRlKFcudmFsKSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuQXR0cmlidXRlKFcudmFsKS5Ub0Jvb2xlYW4oKSA9PSB0cnVlKTsKKyAgICAgICAgICAgIHZhciB6ZXJvV2lkdGhDaGFyID0gaXNCaWRpID8gbmV3IFhFbnRpdHkoIiN4MjAwZiIpIDogbmV3IFhFbnRpdHkoIiN4MjAwZSIpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IG9iamVjdFtdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFhodG1sLmJyKSwKKyAgICAgICAgICAgICAgICB6ZXJvV2lkdGhDaGFyLAorICAgICAgICAgICAgICAgIHNwYW4sCisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFByb2Nlc3NDb250ZW50Q29udHJvbChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdvcmREb2MsIFdtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzLAorICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCwgZGVjaW1hbCBjdXJyZW50TWFyZ2luTGVmdCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlbGV2YW50QW5jZXN0b3JzID0gZWxlbWVudC5BbmNlc3RvcnMoKS5UYWtlV2hpbGUoYSA9PiBhLk5hbWUgIT0gVy50eGJ4Q29udGVudCk7CisgICAgICAgICAgICB2YXIgaXNSdW5MZXZlbENvbnRlbnRDb250cm9sID0gcmVsZXZhbnRBbmNlc3RvcnMuQW55KGEgPT4gYS5OYW1lID09IFcucCk7CisgICAgICAgICAgICBpZiAoaXNSdW5MZXZlbENvbnRlbnRDb250cm9sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LkVsZW1lbnRzKFcuc2R0Q29udGVudCkuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGUgPT4gQ29udmVydFRvSHRtbFRyYW5zZm9ybSh3b3JkRG9jLCBzZXR0aW5ncywgZSwgZmFsc2UsIGN1cnJlbnRNYXJnaW5MZWZ0KSkKKyAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUJvcmRlckRpdnMod29yZERvYywgc2V0dGluZ3MsIGVsZW1lbnQuRWxlbWVudHMoVy5zZHRDb250ZW50KS5FbGVtZW50cygpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgdzpwIGVsZW1lbnQsIGluY2x1ZGluZyB0aGUgZm9sbG93aW5nIHNpYmxpbmcgdzpwIGVsZW1lbnQocykKKyAgICAgICAgLy8gaW4gY2FzZSB0aGUgdzpwIGVsZW1lbnQgaGFzIGEgc3R5bGUgc2VwYXJhdG9yLiBUaGUgc2libGluZyhzKSB3aWxsIGJlCisgICAgICAgIC8vIHRyYW5zZm9ybWVkIHRvIGg6c3BhbiBlbGVtZW50cyByYXRoZXIgdGhhbiBoOnAgZWxlbWVudHMgYW5kIGFkZGVkIHRvCisgICAgICAgIC8vIHRoZSBlbGVtZW50IChlLmcuLCBoOmgyKSBjcmVhdGVkIGZyb20gdGhlIHc6cCBlbGVtZW50IGhhdmluZyB0aGUgKGZpcnN0KQorICAgICAgICAvLyBzdHlsZSBzZXBhcmF0b3IgKGkuZS4sIGEgdzpzcGVjVmFuaXNoIGVsZW1lbnQpLgorICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgUHJvY2Vzc1BhcmFncmFwaChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdvcmREb2MsIFdtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzLAorICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCwgYm9vbCBzdXBwcmVzc1RyYWlsaW5nV2hpdGVTcGFjZSwgZGVjaW1hbCBjdXJyZW50TWFyZ2luTGVmdCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWdub3JlIHRoaXMgcGFyYWdyYXBoIGlmIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGggaGFzIGEgc3R5bGUgc2VwYXJhdG9yLgorICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IHRyYW5zZm9ybWVkIHRoaXMgb25lIHRvZ2V0aGVyIHdpdGggdGhlIHByZXZpb3VzIG9uZS4KKyAgICAgICAgICAgIHZhciBwcmV2aW91c1BhcmFncmFwaCA9IGVsZW1lbnQuRWxlbWVudHNCZWZvcmVTZWxmKFcucCkuTGFzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKEhhc1N0eWxlU2VwYXJhdG9yKHByZXZpb3VzUGFyYWdyYXBoKSkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHZhciBlbGVtZW50TmFtZSA9IEdldFBhcmFncmFwaEVsZW1lbnROYW1lKGVsZW1lbnQsIHdvcmREb2MpOworICAgICAgICAgICAgdmFyIGlzQmlkaSA9IElzQmlkaShlbGVtZW50KTsKKyAgICAgICAgICAgIHZhciBwYXJhZ3JhcGggPSAoWEVsZW1lbnQpIENvbnZlcnRQYXJhZ3JhcGgod29yZERvYywgc2V0dGluZ3MsIGVsZW1lbnQsIGVsZW1lbnROYW1lLAorICAgICAgICAgICAgICAgIHN1cHByZXNzVHJhaWxpbmdXaGl0ZVNwYWNlLCBjdXJyZW50TWFyZ2luTGVmdCwgaXNCaWRpKTsKKworICAgICAgICAgICAgLy8gVGhlIHBhcmFncmFwaCBjb252ZXJzaW9uIG1pZ2h0IGhhdmUgY3JlYXRlZCBlbXB0eSBzcGFucy4KKyAgICAgICAgICAgIC8vIFRoZXNlIGNhbiBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgYmVjYXVzZSBlbXB0eSBzcGFucyBhcmUKKyAgICAgICAgICAgIC8vIGludmFsaWQgaW4gSFRNTDUuCisgICAgICAgICAgICBwYXJhZ3JhcGguRWxlbWVudHMoWGh0bWwuc3BhbikuV2hlcmUoZSA9PiBlLklzRW1wdHkpLlJlbW92ZSgpOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgc3BhbiBpbiBwYXJhZ3JhcGguRWxlbWVudHMoWGh0bWwuc3BhbikuVG9MaXN0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHYgPSBzcGFuLlZhbHVlOworICAgICAgICAgICAgICAgIGlmICh2Lkxlbmd0aCA+IDAgJiYgKGNoYXIuSXNXaGl0ZVNwYWNlKHZbMF0pIHx8IGNoYXIuSXNXaGl0ZVNwYWNlKHZbdi5MZW5ndGggLSAxXSkpICYmIHNwYW4uQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sICsgInNwYWNlIikgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3Bhbi5BZGQobmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWwgKyAic3BhY2UiLCAicHJlc2VydmUiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChIYXNTdHlsZVNlcGFyYXRvcihlbGVtZW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5FbGVtZW50c0FmdGVyU2VsZihXLnApLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9IFhodG1sLnNwYW47CisgICAgICAgICAgICAgICAgaXNCaWRpID0gSXNCaWRpKGVsZW1lbnQpOworICAgICAgICAgICAgICAgIHZhciBzcGFuID0gKFhFbGVtZW50KUNvbnZlcnRQYXJhZ3JhcGgod29yZERvYywgc2V0dGluZ3MsIGVsZW1lbnQsIGVsZW1lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc1RyYWlsaW5nV2hpdGVTcGFjZSwgY3VycmVudE1hcmdpbkxlZnQsIGlzQmlkaSk7CisgICAgICAgICAgICAgICAgdmFyIHYgPSBzcGFuLlZhbHVlOworICAgICAgICAgICAgICAgIGlmICh2Lkxlbmd0aCA+IDAgJiYgKGNoYXIuSXNXaGl0ZVNwYWNlKHZbMF0pIHx8IGNoYXIuSXNXaGl0ZVNwYWNlKHZbdi5MZW5ndGggLSAxXSkpICYmIHNwYW4uQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sICsgInNwYWNlIikgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3Bhbi5BZGQobmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWwgKyAic3BhY2UiLCAicHJlc2VydmUiKSk7CisgICAgICAgICAgICAgICAgcGFyYWdyYXBoLkFkZChzcGFuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHBhcmFncmFwaDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBQcm9jZXNzVGFibGUoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jLCBXbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncywgWEVsZW1lbnQgZWxlbWVudCwgZGVjaW1hbCBjdXJyZW50TWFyZ2luTGVmdCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0eWxlID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CisgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoImJvcmRlci1jb2xsYXBzZSIsICJjb2xsYXBzZSIpOworICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJib3JkZXIiLCAibm9uZSIpOworICAgICAgICAgICAgdmFyIGJpZGlWaXN1YWwgPSBlbGVtZW50LkVsZW1lbnRzKFcudGJsUHIpLkVsZW1lbnRzKFcuYmlkaVZpc3VhbCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIHZhciB0YmxXID0gZWxlbWVudC5FbGVtZW50cyhXLnRibFByKS5FbGVtZW50cyhXLnRibFcpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAodGJsVyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0eXBlID0gKHN0cmluZyl0YmxXLkF0dHJpYnV0ZShXLnR5cGUpOworICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgdHlwZSA9PSAicGN0IikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB3ID0gKGludCl0YmxXLkF0dHJpYnV0ZShXLl93KTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJ3aWR0aCIsICh3IC8gNTApICsgIiUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgdGJsSW5kID0gZWxlbWVudC5FbGVtZW50cyhXLnRibFByKS5FbGVtZW50cyhXLnRibEluZCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmICh0YmxJbmQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdGJsSW5kVHlwZSA9IChzdHJpbmcpdGJsSW5kLkF0dHJpYnV0ZShXLnR5cGUpOworICAgICAgICAgICAgICAgIGlmICh0YmxJbmRUeXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodGJsSW5kVHlwZSA9PSAiZHhhIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gKGRlY2ltYWw/KXRibEluZC5BdHRyaWJ1dGUoVy5fdyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2lkdGggIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoIm1hcmdpbi1sZWZ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPiAwbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywgInswfXB0Iiwgd2lkdGggLyAyMG0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgdGFibGVEaXJlY3Rpb24gPSBiaWRpVmlzdWFsICE9IG51bGwgPyBuZXcgWEF0dHJpYnV0ZSgiZGlyIiwgInJ0bCIpIDogbmV3IFhBdHRyaWJ1dGUoImRpciIsICJsdHIiKTsKKyAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygibWFyZ2luLWJvdHRvbSIsICIuMDAxcHQiKTsKKyAgICAgICAgICAgIHZhciB0YWJsZSA9IG5ldyBYRWxlbWVudChYaHRtbC50YWJsZSwKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXZpc2l0IGFuZCBtYWtlIHN1cmUgdGhlIG9taXNzaW9uIGlzIGNvdmVyZWQgYnkgYXBwcm9wcmlhdGUgQ1NTLgorICAgICAgICAgICAgICAgIC8vIG5ldyBYQXR0cmlidXRlKCJib3JkZXIiLCAiMSIpLAorICAgICAgICAgICAgICAgIC8vIG5ldyBYQXR0cmlidXRlKCJjZWxsc3BhY2luZyIsIDApLAorICAgICAgICAgICAgICAgIC8vIG5ldyBYQXR0cmlidXRlKCJjZWxscGFkZGluZyIsIDApLAorICAgICAgICAgICAgICAgIHRhYmxlRGlyZWN0aW9uLAorICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoKS5TZWxlY3QoZSA9PiBDb252ZXJ0VG9IdG1sVHJhbnNmb3JtKHdvcmREb2MsIHNldHRpbmdzLCBlLCBmYWxzZSwgY3VycmVudE1hcmdpbkxlZnQpKSk7CisgICAgICAgICAgICB0YWJsZS5BZGRBbm5vdGF0aW9uKHN0eWxlKTsKKyAgICAgICAgICAgIHZhciBqYyA9IChzdHJpbmcpZWxlbWVudC5FbGVtZW50cyhXLnRibFByKS5FbGVtZW50cyhXLmpjKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpID8/ICJsZWZ0IjsKKyAgICAgICAgICAgIFhBdHRyaWJ1dGUgZGlyID0gbnVsbDsKKyAgICAgICAgICAgIFhBdHRyaWJ1dGUgamNUb1VzZSA9IG51bGw7CisgICAgICAgICAgICBpZiAoYmlkaVZpc3VhbCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpciA9IG5ldyBYQXR0cmlidXRlKCJkaXIiLCAicnRsIik7CisgICAgICAgICAgICAgICAgaWYgKGpjID09ICJsZWZ0IikKKyAgICAgICAgICAgICAgICAgICAgamNUb1VzZSA9IG5ldyBYQXR0cmlidXRlKCJhbGlnbiIsICJyaWdodCIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpjID09ICJyaWdodCIpCisgICAgICAgICAgICAgICAgICAgIGpjVG9Vc2UgPSBuZXcgWEF0dHJpYnV0ZSgiYWxpZ24iLCAibGVmdCIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpjID09ICJjZW50ZXIiKQorICAgICAgICAgICAgICAgICAgICBqY1RvVXNlID0gbmV3IFhBdHRyaWJ1dGUoImFsaWduIiwgImNlbnRlciIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpjVG9Vc2UgPSBuZXcgWEF0dHJpYnV0ZSgiYWxpZ24iLCBqYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgdGFibGVEaXYgPSBuZXcgWEVsZW1lbnQoWGh0bWwuZGl2LAorICAgICAgICAgICAgICAgIGRpciwKKyAgICAgICAgICAgICAgICBqY1RvVXNlLAorICAgICAgICAgICAgICAgIHRhYmxlKTsKKyAgICAgICAgICAgIHJldHVybiB0YWJsZURpdjsKKyAgICAgICAgfQorCisgICAgICAgIFtTdXBwcmVzc01lc3NhZ2UoIlJlU2hhcnBlciIsICJQb3NzaWJsZU51bGxSZWZlcmVuY2VFeGNlcHRpb24iKV0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFByb2Nlc3NUYWJsZUNlbGwoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jLCBXbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncywgWEVsZW1lbnQgZWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0eWxlID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CisgICAgICAgICAgICBYQXR0cmlidXRlIGNvbFNwYW4gPSBudWxsOworICAgICAgICAgICAgWEF0dHJpYnV0ZSByb3dTcGFuID0gbnVsbDsKKworICAgICAgICAgICAgdmFyIHRjUHIgPSBlbGVtZW50LkVsZW1lbnQoVy50Y1ByKTsKKyAgICAgICAgICAgIGlmICh0Y1ByICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChzdHJpbmcpIHRjUHIuRWxlbWVudHMoVy52TWVyZ2UpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCkgPT0gInJlc3RhcnQiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRSb3cgPSBlbGVtZW50LlBhcmVudC5FbGVtZW50c0JlZm9yZVNlbGYoVy50cikuQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRDZWxsID0gZWxlbWVudC5FbGVtZW50c0JlZm9yZVNlbGYoVy50YykuQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRibCA9IGVsZW1lbnQuUGFyZW50LlBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJvd1NwYW5Db3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSb3cgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSB0YmwuRWxlbWVudHMoVy50cikuU2tpcChjdXJyZW50Um93KS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGwyID0gcm93LkVsZW1lbnRzKFcudGMpLlNraXAoY3VycmVudENlbGwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbDIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsMi5FbGVtZW50cyhXLnRjUHIpLkVsZW1lbnRzKFcudk1lcmdlKS5GaXJzdE9yRGVmYXVsdCgpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmluZykgY2VsbDIuRWxlbWVudHMoVy50Y1ByKS5FbGVtZW50cyhXLnZNZXJnZSkuQXR0cmlidXRlcyhXLnZhbCkuRmlyc3RPckRlZmF1bHQoKSA9PSAicmVzdGFydCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Um93ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICByb3dTcGFuQ291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByb3dTcGFuID0gbmV3IFhBdHRyaWJ1dGUoInJvd3NwYW4iLCByb3dTcGFuQ291bnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0Y1ByLkVsZW1lbnQoVy52TWVyZ2UpICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgKHN0cmluZykgdGNQci5FbGVtZW50cyhXLnZNZXJnZSkuQXR0cmlidXRlcyhXLnZhbCkuRmlyc3RPckRlZmF1bHQoKSAhPSAicmVzdGFydCIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKHRjUHIuRWxlbWVudChXLnZBbGlnbikgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB2QWxpZ25WYWwgPSAoc3RyaW5nKSB0Y1ByLkVsZW1lbnRzKFcudkFsaWduKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodkFsaWduVmFsID09ICJ0b3AiKQorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJ2ZXJ0aWNhbC1hbGlnbiIsICJ0b3AiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodkFsaWduVmFsID09ICJjZW50ZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJ2ZXJ0aWNhbC1hbGlnbiIsICJtaWRkbGUiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodkFsaWduVmFsID09ICJib3R0b20iKQorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJ2ZXJ0aWNhbC1hbGlnbiIsICJib3R0b20iKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJ2ZXJ0aWNhbC1hbGlnbiIsICJtaWRkbGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJ2ZXJ0aWNhbC1hbGlnbiIsICJ0b3AiKTsKKworICAgICAgICAgICAgICAgIGlmICgoc3RyaW5nKSB0Y1ByLkVsZW1lbnRzKFcudGNXKS5BdHRyaWJ1dGVzKFcudHlwZSkuRmlyc3RPckRlZmF1bHQoKSA9PSAiZHhhIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgd2lkdGggPSAoaW50KSB0Y1ByLkVsZW1lbnRzKFcudGNXKS5BdHRyaWJ1dGVzKFcuX3cpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygid2lkdGgiLCBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywgInswfXB0Iiwgd2lkdGgvMjBtKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoc3RyaW5nKSB0Y1ByLkVsZW1lbnRzKFcudGNXKS5BdHRyaWJ1dGVzKFcudHlwZSkuRmlyc3RPckRlZmF1bHQoKSA9PSAicGN0IikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgd2lkdGggPSAoaW50KSB0Y1ByLkVsZW1lbnRzKFcudGNXKS5BdHRyaWJ1dGVzKFcuX3cpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygid2lkdGgiLCBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywgInswOjAuMH0lIiwgd2lkdGgvNTBtKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHRjQm9yZGVycyA9IHRjUHIuRWxlbWVudChXLnRjQm9yZGVycyk7CisgICAgICAgICAgICAgICAgR2VuZXJhdGVCb3JkZXJTdHlsZSh0Y0JvcmRlcnMsIFcudG9wLCBzdHlsZSwgQm9yZGVyVHlwZS5DZWxsKTsKKyAgICAgICAgICAgICAgICBHZW5lcmF0ZUJvcmRlclN0eWxlKHRjQm9yZGVycywgVy5yaWdodCwgc3R5bGUsIEJvcmRlclR5cGUuQ2VsbCk7CisgICAgICAgICAgICAgICAgR2VuZXJhdGVCb3JkZXJTdHlsZSh0Y0JvcmRlcnMsIFcuYm90dG9tLCBzdHlsZSwgQm9yZGVyVHlwZS5DZWxsKTsKKyAgICAgICAgICAgICAgICBHZW5lcmF0ZUJvcmRlclN0eWxlKHRjQm9yZGVycywgVy5sZWZ0LCBzdHlsZSwgQm9yZGVyVHlwZS5DZWxsKTsKKworICAgICAgICAgICAgICAgIENyZWF0ZVN0eWxlRnJvbVNoZChzdHlsZSwgdGNQci5FbGVtZW50KFcuc2hkKSk7CisKKyAgICAgICAgICAgICAgICB2YXIgZ3JpZFNwYW4gPSB0Y1ByLkVsZW1lbnRzKFcuZ3JpZFNwYW4pLkF0dHJpYnV0ZXMoVy52YWwpLlNlbGVjdChhID0+IChpbnQ/KSBhKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmIChncmlkU3BhbiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb2xTcGFuID0gbmV3IFhBdHRyaWJ1dGUoImNvbHNwYW4iLCAoaW50KSBncmlkU3Bhbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoInBhZGRpbmctdG9wIiwgIjAiKTsKKyAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygicGFkZGluZy1ib3R0b20iLCAiMCIpOworCisgICAgICAgICAgICB2YXIgY2VsbCA9IG5ldyBYRWxlbWVudChYaHRtbC50ZCwKKyAgICAgICAgICAgICAgICByb3dTcGFuLAorICAgICAgICAgICAgICAgIGNvbFNwYW4sCisgICAgICAgICAgICAgICAgQ3JlYXRlQm9yZGVyRGl2cyh3b3JkRG9jLCBzZXR0aW5ncywgZWxlbWVudC5FbGVtZW50cygpKSk7CisgICAgICAgICAgICBjZWxsLkFkZEFubm90YXRpb24oc3R5bGUpOworICAgICAgICAgICAgcmV0dXJuIGNlbGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgUHJvY2Vzc1RhYmxlUm93KFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYywgV21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MsIFhFbGVtZW50IGVsZW1lbnQsCisgICAgICAgICAgICBkZWNpbWFsIGN1cnJlbnRNYXJnaW5MZWZ0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc3R5bGUgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKTsKKyAgICAgICAgICAgIGludD8gdHJIZWlnaHQgPSAoaW50PykgZWxlbWVudC5FbGVtZW50cyhXLnRyUHIpLkVsZW1lbnRzKFcudHJIZWlnaHQpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAodHJIZWlnaHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoImhlaWdodCIsCisgICAgICAgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoTnVtYmVyRm9ybWF0SW5mby5JbnZhcmlhbnRJbmZvLCAiezA6MC4wMH1pbiIsIChkZWNpbWFsKSB0ckhlaWdodC8xNDQwbSkpOworICAgICAgICAgICAgdmFyIGh0bWxSb3cgPSBuZXcgWEVsZW1lbnQoWGh0bWwudHIsCisgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cygpLlNlbGVjdChlID0+IENvbnZlcnRUb0h0bWxUcmFuc2Zvcm0od29yZERvYywgc2V0dGluZ3MsIGUsIGZhbHNlLCBjdXJyZW50TWFyZ2luTGVmdCkpKTsKKyAgICAgICAgICAgIGlmIChzdHlsZS5BbnkoKSkKKyAgICAgICAgICAgICAgICBodG1sUm93LkFkZEFubm90YXRpb24oc3R5bGUpOworICAgICAgICAgICAgcmV0dXJuIGh0bWxSb3c7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIEhhc1N0eWxlU2VwYXJhdG9yKFhFbGVtZW50IGVsZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5FbGVtZW50cyhXLnBQcikuRWxlbWVudHMoVy5yUHIpLkFueShlID0+IEdldEJvb2xQcm9wKGUsIFcuc3BlY1ZhbmlzaCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBJc0JpZGkoWEVsZW1lbnQgZWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5wUHIpCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuYmlkaSkKKyAgICAgICAgICAgICAgICAuQW55KGIgPT4gYi5BdHRyaWJ1dGUoVy52YWwpID09IG51bGwgfHwgYi5BdHRyaWJ1dGUoVy52YWwpLlRvQm9vbGVhbigpID09IHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWE5hbWUgR2V0UGFyYWdyYXBoRWxlbWVudE5hbWUoWEVsZW1lbnQgZWxlbWVudCwgV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZWxlbWVudE5hbWUgPSBYaHRtbC5wOworCisgICAgICAgICAgICB2YXIgc3R5bGVJZCA9IChzdHJpbmcpIGVsZW1lbnQuRWxlbWVudHMoVy5wUHIpLkVsZW1lbnRzKFcucFN0eWxlKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKHN0eWxlSWQgPT0gbnVsbCkgcmV0dXJuIGVsZW1lbnROYW1lOworCisgICAgICAgICAgICB2YXIgc3R5bGUgPSBHZXRTdHlsZShzdHlsZUlkLCB3b3JkRG9jKTsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSBudWxsKSByZXR1cm4gZWxlbWVudE5hbWU7CisKKyAgICAgICAgICAgIHZhciBvdXRsaW5lTGV2ZWwgPQorICAgICAgICAgICAgICAgIChpbnQ/KSBzdHlsZS5FbGVtZW50cyhXLnBQcikuRWxlbWVudHMoVy5vdXRsaW5lTHZsKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKG91dGxpbmVMZXZlbCAhPSBudWxsICYmIG91dGxpbmVMZXZlbCA8PSA1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gWGh0bWwueGh0bWwgKyBzdHJpbmcuRm9ybWF0KCJoezB9Iiwgb3V0bGluZUxldmVsICsgMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50TmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEdldFN0eWxlKHN0cmluZyBzdHlsZUlkLCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdvcmREb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzdHlsZXNQYXJ0ID0gd29yZERvYy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0OworICAgICAgICAgICAgaWYgKHN0eWxlc1BhcnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHZhciBzdHlsZXMgPSBzdHlsZXNQYXJ0LkdldFhEb2N1bWVudCgpLlJvb3Q7CisgICAgICAgICAgICByZXR1cm4gc3R5bGVzICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IHN0eWxlcy5FbGVtZW50cyhXLnN0eWxlKS5GaXJzdE9yRGVmYXVsdChzID0+IChzdHJpbmcpIHMuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gc3R5bGVJZCkKKyAgICAgICAgICAgICAgICA6IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQ3JlYXRlU2VjdGlvbkRpdnMoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jLCBXbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncywgWEVsZW1lbnQgZWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90ZTogd2hlbiBidWlsZGluZyBhIHBhZ2luZyBodG1sIGNvbnZlcnRlciwgbmVlZCB0byBhdHRlbmQgdG8gbmV3IHNlY3Rpb25zIHdpdGggcGFnZSBicmVha3MgaGVyZS4KKyAgICAgICAgICAgIC8vIFRoaXMgY29kZSBjb25mbGF0ZXMgYWRqYWNlbnQgc2VjdGlvbnMgaWYgdGhleSBoYXZlIGlkZW50aWNhbCBmb3JtYXR0aW5nLCB3aGljaCBpcyBub3QgYW4gaXNzdWUKKyAgICAgICAgICAgIC8vIGZvciB0aGUgbm9uLXBhZ2luZyB0cmFuc2Zvcm0uCisgICAgICAgICAgICB2YXIgZ3JvdXBlZEludG9EaXZzID0gZWxlbWVudAorICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQoZSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzZWN0QW5ub3RhdGlvbiA9IGUuQW5ub3RhdGlvbjxTZWN0aW9uQW5ub3RhdGlvbj4oKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlY3RBbm5vdGF0aW9uICE9IG51bGwgPyBzZWN0QW5ub3RhdGlvbi5TZWN0aW9uRWxlbWVudC5Ub1N0cmluZygpIDogIiI7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIG5vdGU6IHdoZW4gY3JlYXRpbmcgYSBwYWdpbmcgaHRtbCBjb252ZXJ0ZXIsIG5lZWQgdG8gcGF5IGF0dGVudGlvbiB0byB3OnJ0bEd1dHRlciBlbGVtZW50LgorICAgICAgICAgICAgdmFyIGRpdkxpc3QgPSBncm91cGVkSW50b0RpdnMKKyAgICAgICAgICAgICAgICAuU2VsZWN0KGcgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzZWN0UHIgPSBnLkZpcnN0KCkuQW5ub3RhdGlvbjxTZWN0aW9uQW5ub3RhdGlvbj4oKTsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgYmlkaSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZWN0UHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmlkaSA9IHNlY3RQcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWN0aW9uRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLmJpZGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGIgPT4gYi5BdHRyaWJ1dGUoVy52YWwpID09IG51bGwgfHwgYi5BdHRyaWJ1dGUoVy52YWwpLlRvQm9vbGVhbigpID09IHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzZWN0UHIgPT0gbnVsbCB8fCBiaWRpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXYgPSBuZXcgWEVsZW1lbnQoWGh0bWwuZGl2LCBDcmVhdGVCb3JkZXJEaXZzKHdvcmREb2MsIHNldHRpbmdzLCBnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGl2OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpdiA9IG5ldyBYRWxlbWVudChYaHRtbC5kaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoImRpciIsICJydGwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCb3JkZXJEaXZzKHdvcmREb2MsIHNldHRpbmdzLCBnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGl2OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGl2TGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZW51bSBCb3JkZXJUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcmFncmFwaCwKKyAgICAgICAgICAgIENlbGwsCisgICAgICAgIH07CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTm90ZXMgb24gbGluZSBzcGFjaW5nCisgICAgICAgICAqCisgICAgICAgICAqIHRoZSB3OmxpbmUgYW5kIHc6bGluZVJ1bGUgYXR0cmlidXRlcyBjb250cm9sIHNwYWNpbmcgYmV0d2VlbiBsaW5lcyAtIGluY2x1ZGluZyBiZXR3ZWVuIGxpbmVzIHdpdGhpbiBhIHBhcmFncmFwaAorICAgICAgICAgKgorICAgICAgICAgKiBJZiB3OnNwYWNpbmcgdzpsaW5lUnVsZT0iYXV0byIgdGhlbgorICAgICAgICAgKiAgIHc6c3BhY2luZyB3OmxpbmUgaXMgYSBwZXJjZW50YWdlIHdoZXJlIDI0MCA9PSAxMDAlCisgICAgICAgICAqCisgICAgICAgICAqICAgKGxpbmUgdmFsdWUgLyAyNDApICogMTAwID0gcGVyY2VudGFnZSBvZiBsaW5lCisgICAgICAgICAqCisgICAgICAgICAqIElmIHc6c3BhY2luZyB3OmxpbmVSdWxlPSJleGFjdCIgb3IgdzpsaW5lUnVsZT0iYXRMZWFzdCIgdGhlbgorICAgICAgICAgKiAgIHc6c3BhY2luZyB3OmxpbmUgaXMgaW4gdHdpcHMKKyAgICAgICAgICogICAxNDQwID0gZXhhY3RseSBvbmUgaW5jaCBmcm9tIGxpbmUgdG8gbGluZQorICAgICAgICAgKgorICAgICAgICAgKiBIYW5kbGUKKyAgICAgICAgICogLSBpbmQKKyAgICAgICAgICogLSBqYworICAgICAgICAgKiAtIG51bVByCisgICAgICAgICAqIC0gcEJkcgorICAgICAgICAgKiAtIHNoZAorICAgICAgICAgKiAtIHNwYWNpbmcKKyAgICAgICAgICogLSB0ZXh0QWxpZ25tZW50CisgICAgICAgICAqCisgICAgICAgICAqIERvbid0IEhhbmRsZSAoeWV0KQorICAgICAgICAgKiAtIGFkanVzdFJpZ2h0SW5kPworICAgICAgICAgKiAtIGF1dG9TcGFjZURFCisgICAgICAgICAqIC0gYXV0b1NwYWNlRE4KKyAgICAgICAgICogLSBiaWRpCisgICAgICAgICAqIC0gY29udGV4dHVhbFNwYWNpbmcKKyAgICAgICAgICogLSBkaXZJZAorICAgICAgICAgKiAtIGZyYW1lUHIKKyAgICAgICAgICogLSBrZWVwTGluZXMKKyAgICAgICAgICogLSBrZWVwTmV4dAorICAgICAgICAgKiAtIGtpbnNva3UKKyAgICAgICAgICogLSBtaXJyb3JJbmRlbnRzCisgICAgICAgICAqIC0gb3ZlcmZsb3dQdW5jdAorICAgICAgICAgKiAtIHBhZ2VCcmVha0JlZm9yZQorICAgICAgICAgKiAtIHNuYXBUb0dyaWQKKyAgICAgICAgICogLSBzdXBwcmVzc0F1dG9IeXBoZW5zCisgICAgICAgICAqIC0gc3VwcHJlc3NMaW5lTnVtYmVycworICAgICAgICAgKiAtIHN1cHByZXNzT3ZlcmxhcAorICAgICAgICAgKiAtIHRhYnMKKyAgICAgICAgICogLSB0ZXh0Qm94VGlnaHRXcmFwCisgICAgICAgICAqIC0gdGV4dERpcmVjdGlvbgorICAgICAgICAgKiAtIHRvcExpbmVQdW5jdAorICAgICAgICAgKiAtIHdpZG93Q29udHJvbAorICAgICAgICAgKiAtIHdvcmRXcmFwCisgICAgICAgICAqCisgICAgICAgICAqLworCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBDb252ZXJ0UGFyYWdyYXBoKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYywgV21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MsCisgICAgICAgICAgICBYRWxlbWVudCBwYXJhZ3JhcGgsIFhOYW1lIGVsZW1lbnROYW1lLCBib29sIHN1cHByZXNzVHJhaWxpbmdXaGl0ZVNwYWNlLCBkZWNpbWFsIGN1cnJlbnRNYXJnaW5MZWZ0LCBib29sIGlzQmlkaSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0eWxlID0gRGVmaW5lUGFyYWdyYXBoU3R5bGUocGFyYWdyYXBoLCBlbGVtZW50TmFtZSwgc3VwcHJlc3NUcmFpbGluZ1doaXRlU3BhY2UsIGN1cnJlbnRNYXJnaW5MZWZ0LCBpc0JpZGkpOworICAgICAgICAgICAgdmFyIHJ0bCA9IGlzQmlkaSA/IG5ldyBYQXR0cmlidXRlKCJkaXIiLCAicnRsIikgOiBuZXcgWEF0dHJpYnV0ZSgiZGlyIiwgImx0ciIpOworICAgICAgICAgICAgdmFyIGZpcnN0TWFyayA9IGlzQmlkaSA/IG5ldyBYRW50aXR5KCIjeDIwMGYiKSA6IG51bGw7CisKKyAgICAgICAgICAgIC8vIEFuYWx5emUgaW5pdGlhbCBydW5zIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgYSB0YWIsIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCByZW5kZXIKKyAgICAgICAgICAgIC8vIGEgc3BhbiB3aXRoIGEgZGVmaW5lZCB3aWR0aCBhbmQgaWdub3JlIHRoZSB0YWIgcmF0aGVyIHRoYW4gcmVuZGVyaW5nIHRoZSB0ZXh0CisgICAgICAgICAgICAvLyBwcmVjZWRpbmcgdGhlIHRhYiBhbmQgdGhlIHRhYiBhcyBhIHNwYW4gd2l0aCBhIGNvbXB1dGVkIHdpZHRoLgorICAgICAgICAgICAgdmFyIGZpcnN0VGFiUnVuID0gcGFyYWdyYXBoCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucikKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQocnVuID0+IHJ1bi5FbGVtZW50cyhXLnRhYikuQW55KCkpOworICAgICAgICAgICAgdmFyIGVsZW1lbnRzUHJlY2VkaW5nVGFiID0gZmlyc3RUYWJSdW4gIT0gbnVsbAorICAgICAgICAgICAgICAgID8gcGFyYWdyYXBoLkVsZW1lbnRzKFcucikuVGFrZVdoaWxlKGUgPT4gZSAhPSBmaXJzdFRhYlJ1bikKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gZS5FbGVtZW50cygpLkFueShjID0+IGMuQXR0cmlidXRlcyhQdE9wZW5YbWwuVGFiV2lkdGgpLkFueSgpKSkuVG9MaXN0KCkKKyAgICAgICAgICAgICAgICA6IEVudW1lcmFibGUuRW1wdHk8WEVsZW1lbnQ+KCkuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFJldmlzaXQKKyAgICAgICAgICAgIC8vIEZvciB0aGUgdGltZSBiZWluZywgaWYgYSBoeXBlcmxpbmsgZmllbGQgcHJlY2VkZXMgdGhlIHRhYiwgd2UnbGwgcmVuZGVyIGl0IGFzIGJlZm9yZS4KKyAgICAgICAgICAgIHZhciBoeXBlcmxpbmtQcmVjZWRlc1RhYiA9IGVsZW1lbnRzUHJlY2VkaW5nVGFiCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucikKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5pbnN0clRleHQpCisgICAgICAgICAgICAgICAgLlNlbGVjdChlID0+IGUuVmFsdWUpCisgICAgICAgICAgICAgICAgLkFueSh2YWx1ZSA9PiB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLlRyaW1TdGFydCgpLlRvVXBwZXIoKS5TdGFydHNXaXRoKCJIWVBFUkxJTksiKSk7CisgICAgICAgICAgICBpZiAoaHlwZXJsaW5rUHJlY2VkZXNUYWIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBhcmFFbGVtZW50MSA9IG5ldyBYRWxlbWVudChlbGVtZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcnRsLAorICAgICAgICAgICAgICAgICAgICBmaXJzdE1hcmssCisgICAgICAgICAgICAgICAgICAgIENvbnZlcnRDb250ZW50VGhhdENhbkNvbnRhaW5GaWVsZHMod29yZERvYywgc2V0dGluZ3MsIHBhcmFncmFwaC5FbGVtZW50cygpKSk7CisgICAgICAgICAgICAgICAgcGFyYUVsZW1lbnQxLkFkZEFubm90YXRpb24oc3R5bGUpOworICAgICAgICAgICAgICAgIHJldHVybiBwYXJhRWxlbWVudDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciB0eEVsZW1lbnRzUHJlY2VkaW5nVGFiID0gVHJhbnNmb3JtRWxlbWVudHNQcmVjZWRpbmdUYWIod29yZERvYywgc2V0dGluZ3MsIGVsZW1lbnRzUHJlY2VkaW5nVGFiLCBmaXJzdFRhYlJ1bik7CisgICAgICAgICAgICB2YXIgZWxlbWVudHNTdWNjZWVkaW5nVGFiID0gZmlyc3RUYWJSdW4gIT0gbnVsbAorICAgICAgICAgICAgICAgID8gcGFyYWdyYXBoLkVsZW1lbnRzKCkuU2tpcFdoaWxlKGUgPT4gZSAhPSBmaXJzdFRhYlJ1bikuU2tpcCgxKQorICAgICAgICAgICAgICAgIDogcGFyYWdyYXBoLkVsZW1lbnRzKCk7CisgICAgICAgICAgICB2YXIgcGFyYUVsZW1lbnQgPSBuZXcgWEVsZW1lbnQoZWxlbWVudE5hbWUsCisgICAgICAgICAgICAgICAgcnRsLAorICAgICAgICAgICAgICAgIGZpcnN0TWFyaywKKyAgICAgICAgICAgICAgICB0eEVsZW1lbnRzUHJlY2VkaW5nVGFiLAorICAgICAgICAgICAgICAgIENvbnZlcnRDb250ZW50VGhhdENhbkNvbnRhaW5GaWVsZHMod29yZERvYywgc2V0dGluZ3MsIGVsZW1lbnRzU3VjY2VlZGluZ1RhYikpOworICAgICAgICAgICAgcGFyYUVsZW1lbnQuQWRkQW5ub3RhdGlvbihzdHlsZSk7CisKKyAgICAgICAgICAgIHJldHVybiBwYXJhRWxlbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8b2JqZWN0PiBUcmFuc2Zvcm1FbGVtZW50c1ByZWNlZGluZ1RhYihXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdvcmREb2MsIFdtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzLAorICAgICAgICAgICAgTGlzdDxYRWxlbWVudD4gZWxlbWVudHNQcmVjZWRpbmdUYWIsIFhFbGVtZW50IGZpcnN0VGFiUnVuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdGFiV2lkdGggPSBmaXJzdFRhYlJ1biAhPSBudWxsCisgICAgICAgICAgICAgICAgPyAoZGVjaW1hbD8pIGZpcnN0VGFiUnVuLkVsZW1lbnRzKFcudGFiKS5BdHRyaWJ1dGVzKFB0T3BlblhtbC5UYWJXaWR0aCkuRmlyc3RPckRlZmF1bHQoKSA/PyAwbQorICAgICAgICAgICAgICAgIDogMG07CisgICAgICAgICAgICB2YXIgcHJlY2VkaW5nRWxlbWVudHNXaWR0aCA9IGVsZW1lbnRzUHJlY2VkaW5nVGFiCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoYyA9PiBjLkF0dHJpYnV0ZXMoUHRPcGVuWG1sLlRhYldpZHRoKS5BbnkoKSkKKyAgICAgICAgICAgICAgICAuU2VsZWN0KGUgPT4gKGRlY2ltYWwpIGUuQXR0cmlidXRlKFB0T3BlblhtbC5UYWJXaWR0aCkpCisgICAgICAgICAgICAgICAgLlN1bSgpOworICAgICAgICAgICAgdmFyIHRvdGFsV2lkdGggPSBwcmVjZWRpbmdFbGVtZW50c1dpZHRoICsgdGFiV2lkdGg7CisKKyAgICAgICAgICAgIHZhciB0eEVsZW1lbnRzUHJlY2VkaW5nVGFiID0gZWxlbWVudHNQcmVjZWRpbmdUYWIKKyAgICAgICAgICAgICAgICAuU2VsZWN0KGUgPT4gQ29udmVydFRvSHRtbFRyYW5zZm9ybSh3b3JkRG9jLCBzZXR0aW5ncywgZSwgZmFsc2UsIDBtKSkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICBpZiAodHhFbGVtZW50c1ByZWNlZGluZ1RhYi5Db3VudCA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNwYW4gPSBuZXcgWEVsZW1lbnQoWGh0bWwuc3BhbiwgdHhFbGVtZW50c1ByZWNlZGluZ1RhYik7CisgICAgICAgICAgICAgICAgdmFyIHNwYW5TdHlsZSA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siIH0sCisgICAgICAgICAgICAgICAgICAgIHsgInRleHQtaW5kZW50IiwgIjAiIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIndpZHRoIiwgc3RyaW5nLkZvcm1hdChOdW1iZXJGb3JtYXRJbmZvLkludmFyaWFudEluZm8sICJ7MDowLjAwMH1pbiIsIHRvdGFsV2lkdGgpIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHNwYW4uQWRkQW5ub3RhdGlvbihzcGFuU3R5bGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodHhFbGVtZW50c1ByZWNlZGluZ1RhYi5Db3VudCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gdHhFbGVtZW50c1ByZWNlZGluZ1RhYi5GaXJzdCgpIGFzIFhFbGVtZW50OworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgc3BhblN0eWxlID0gZWxlbWVudC5Bbm5vdGF0aW9uPERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+PigpOworICAgICAgICAgICAgICAgICAgICBzcGFuU3R5bGUuQWRkSWZNaXNzaW5nKCJkaXNwbGF5IiwgImlubGluZS1ibG9jayIpOworICAgICAgICAgICAgICAgICAgICBzcGFuU3R5bGUuQWRkSWZNaXNzaW5nKCJ0ZXh0LWluZGVudCIsICIwIik7CisgICAgICAgICAgICAgICAgICAgIHNwYW5TdHlsZS5BZGRJZk1pc3NpbmcoIndpZHRoIiwgc3RyaW5nLkZvcm1hdChOdW1iZXJGb3JtYXRJbmZvLkludmFyaWFudEluZm8sICJ7MDowLjAwMH1pbiIsIHRvdGFsV2lkdGgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHhFbGVtZW50c1ByZWNlZGluZ1RhYjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IERlZmluZVBhcmFncmFwaFN0eWxlKFhFbGVtZW50IHBhcmFncmFwaCwgWE5hbWUgZWxlbWVudE5hbWUsCisgICAgICAgICAgICBib29sIHN1cHByZXNzVHJhaWxpbmdXaGl0ZVNwYWNlLCBkZWNpbWFsIGN1cnJlbnRNYXJnaW5MZWZ0LCBib29sIGlzQmlkaSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0eWxlID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CisKKyAgICAgICAgICAgIHZhciBzdHlsZU5hbWUgPSAoc3RyaW5nKSBwYXJhZ3JhcGguQXR0cmlidXRlKFB0T3BlblhtbC5TdHlsZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0eWxlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHN0eWxlLkFkZCgiUHRTdHlsZU5hbWUiLCBzdHlsZU5hbWUpOworCisgICAgICAgICAgICB2YXIgcFByID0gcGFyYWdyYXBoLkVsZW1lbnQoVy5wUHIpOworICAgICAgICAgICAgaWYgKHBQciA9PSBudWxsKSByZXR1cm4gc3R5bGU7CisKKyAgICAgICAgICAgIENyZWF0ZVN0eWxlRnJvbVNwYWNpbmcoc3R5bGUsIHBQci5FbGVtZW50KFcuc3BhY2luZyksIGVsZW1lbnROYW1lLCBzdXBwcmVzc1RyYWlsaW5nV2hpdGVTcGFjZSk7CisgICAgICAgICAgICBDcmVhdGVTdHlsZUZyb21JbmQoc3R5bGUsIHBQci5FbGVtZW50KFcuaW5kKSwgZWxlbWVudE5hbWUsIGN1cnJlbnRNYXJnaW5MZWZ0LCBpc0JpZGkpOworCisgICAgICAgICAgICAvLyB0b2RvIG5lZWQgdG8gaGFuZGxlCisgICAgICAgICAgICAvLyAtIGJvdGgKKyAgICAgICAgICAgIC8vIC0gbWVkaXVtS2FzaGlkYQorICAgICAgICAgICAgLy8gLSBkaXN0cmlidXRlCisgICAgICAgICAgICAvLyAtIG51bVRhYgorICAgICAgICAgICAgLy8gLSBoaWdoS2FzaGlkYQorICAgICAgICAgICAgLy8gLSBsb3dLYXNoaWRhCisgICAgICAgICAgICAvLyAtIHRoYWlEaXN0cmlidXRlCisKKyAgICAgICAgICAgIENyZWF0ZVN0eWxlRnJvbUpjKHN0eWxlLCBwUHIuRWxlbWVudChXLmpjKSwgaXNCaWRpKTsKKyAgICAgICAgICAgIENyZWF0ZVN0eWxlRnJvbVNoZChzdHlsZSwgcFByLkVsZW1lbnQoVy5zaGQpKTsKKworICAgICAgICAgICAgLy8gUHQuRm9udE5hbWUKKyAgICAgICAgICAgIHZhciBmb250ID0gKHN0cmluZykgcGFyYWdyYXBoLkF0dHJpYnV0ZXMoUHRPcGVuWG1sLkZvbnROYW1lKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGZvbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBDcmVhdGVGb250Q3NzUHJvcGVydHkoZm9udCwgc3R5bGUpOworCisgICAgICAgICAgICBEZWZpbmVGb250U2l6ZShzdHlsZSwgcGFyYWdyYXBoKTsKKyAgICAgICAgICAgIERlZmluZUxpbmVIZWlnaHQoc3R5bGUsIHBhcmFncmFwaCk7CisKKyAgICAgICAgICAgIC8vIHZlcnRpY2FsIHRleHQgYWxpZ25tZW50IGFzIG9mIERlY2VtYmVyIDIwMTMgZG9lcyBub3Qgd29yayBpbiBhbnkgbWFqb3IgYnJvd3NlcnMuCisgICAgICAgICAgICBDcmVhdGVTdHlsZUZyb21UZXh0QWxpZ25tZW50KHN0eWxlLCBwUHIuRWxlbWVudChXLnRleHRBbGlnbm1lbnQpKTsKKworICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJtYXJnaW4tdG9wIiwgIjAiKTsKKyAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygibWFyZ2luLWxlZnQiLCAiMCIpOworICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJtYXJnaW4tcmlnaHQiLCAiMCIpOworICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJtYXJnaW4tYm90dG9tIiwgIi4wMDFwdCIpOworCisgICAgICAgICAgICByZXR1cm4gc3R5bGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENyZWF0ZVN0eWxlRnJvbUluZChEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBzdHlsZSwgWEVsZW1lbnQgaW5kLCBYTmFtZSBlbGVtZW50TmFtZSwKKyAgICAgICAgICAgIGRlY2ltYWwgY3VycmVudE1hcmdpbkxlZnQsIGJvb2wgaXNCaWRpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5kID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgdmFyIGxlZnQgPSAoZGVjaW1hbD8pIGluZC5BdHRyaWJ1dGUoVy5sZWZ0KTsKKyAgICAgICAgICAgIGlmIChsZWZ0ICE9IG51bGwgJiYgZWxlbWVudE5hbWUgIT0gWGh0bWwuc3BhbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbGVmdEluSW5jaGVzID0gKGRlY2ltYWwpIGxlZnQvMTQ0MCAtIGN1cnJlbnRNYXJnaW5MZWZ0OworICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZyhpc0JpZGkgPyAibWFyZ2luLXJpZ2h0IiA6ICJtYXJnaW4tbGVmdCIsCisgICAgICAgICAgICAgICAgICAgIGxlZnRJbkluY2hlcyA+IDBtCisgICAgICAgICAgICAgICAgICAgICAgICA/IHN0cmluZy5Gb3JtYXQoTnVtYmVyRm9ybWF0SW5mby5JbnZhcmlhbnRJbmZvLCAiezA6MC4wMH1pbiIsIGxlZnRJbkluY2hlcykKKyAgICAgICAgICAgICAgICAgICAgICAgIDogIjAiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJpZ2h0ID0gKGRlY2ltYWw/KSBpbmQuQXR0cmlidXRlKFcucmlnaHQpOworICAgICAgICAgICAgaWYgKHJpZ2h0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJpZ2h0SW5JbmNoZXMgPSAoZGVjaW1hbCkgcmlnaHQvMTQ0MDsKKyAgICAgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoaXNCaWRpID8gIm1hcmdpbi1sZWZ0IiA6ICJtYXJnaW4tcmlnaHQiLAorICAgICAgICAgICAgICAgICAgICByaWdodEluSW5jaGVzID4gMG0KKyAgICAgICAgICAgICAgICAgICAgICAgID8gc3RyaW5nLkZvcm1hdChOdW1iZXJGb3JtYXRJbmZvLkludmFyaWFudEluZm8sICJ7MDowLjAwfWluIiwgcmlnaHRJbkluY2hlcykKKyAgICAgICAgICAgICAgICAgICAgICAgIDogIjAiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGZpcnN0TGluZSA9IChkZWNpbWFsPykgaW5kLkF0dHJpYnV0ZShXLmZpcnN0TGluZSk7CisgICAgICAgICAgICBpZiAoZmlyc3RMaW5lICE9IG51bGwgJiYgZWxlbWVudE5hbWUgIT0gWGh0bWwuc3BhbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3RMaW5lSW5JbmNoZXMgPSAoZGVjaW1hbCkgZmlyc3RMaW5lLzE0NDBtOworICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygidGV4dC1pbmRlbnQiLAorICAgICAgICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywgInswOjAuMDB9aW4iLCBmaXJzdExpbmVJbkluY2hlcykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaGFuZ2luZyA9IChkZWNpbWFsPykgaW5kLkF0dHJpYnV0ZShXLmhhbmdpbmcpOworICAgICAgICAgICAgaWYgKGhhbmdpbmcgIT0gbnVsbCAmJiBlbGVtZW50TmFtZSAhPSBYaHRtbC5zcGFuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBoYW5naW5nSW5JbmNoZXMgPSAoZGVjaW1hbCkgLWhhbmdpbmcvMTQ0MG07CisgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJ0ZXh0LWluZGVudCIsCisgICAgICAgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoTnVtYmVyRm9ybWF0SW5mby5JbnZhcmlhbnRJbmZvLCAiezA6MC4wMH1pbiIsIGhhbmdpbmdJbkluY2hlcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDcmVhdGVTdHlsZUZyb21KYyhEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBzdHlsZSwgWEVsZW1lbnQgamMsIGJvb2wgaXNCaWRpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoamMgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgamNWYWwgPSAoc3RyaW5nKWpjLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCkgPz8gImxlZnQiOworICAgICAgICAgICAgICAgIGlmIChqY1ZhbCA9PSAibGVmdCIpCisgICAgICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygidGV4dC1hbGlnbiIsIGlzQmlkaSA/ICJyaWdodCIgOiAibGVmdCIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpjVmFsID09ICJyaWdodCIpCisgICAgICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygidGV4dC1hbGlnbiIsIGlzQmlkaSA/ICJsZWZ0IiA6ICJyaWdodCIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpjVmFsID09ICJjZW50ZXIiKQorICAgICAgICAgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoInRleHQtYWxpZ24iLCAiY2VudGVyIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoamNWYWwgPT0gImJvdGgiKQorICAgICAgICAgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoInRleHQtYWxpZ24iLCAianVzdGlmeSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDcmVhdGVTdHlsZUZyb21TcGFjaW5nKERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHN0eWxlLCBYRWxlbWVudCBzcGFjaW5nLCBYTmFtZSBlbGVtZW50TmFtZSwKKyAgICAgICAgICAgIGJvb2wgc3VwcHJlc3NUcmFpbGluZ1doaXRlU3BhY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzcGFjaW5nID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgdmFyIHNwYWNpbmdCZWZvcmUgPSAoZGVjaW1hbD8pIHNwYWNpbmcuQXR0cmlidXRlKFcuYmVmb3JlKTsKKyAgICAgICAgICAgIGlmIChzcGFjaW5nQmVmb3JlICE9IG51bGwgJiYgZWxlbWVudE5hbWUgIT0gWGh0bWwuc3BhbikKKyAgICAgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoIm1hcmdpbi10b3AiLAorICAgICAgICAgICAgICAgICAgICBzcGFjaW5nQmVmb3JlID4gMG0KKyAgICAgICAgICAgICAgICAgICAgICAgID8gc3RyaW5nLkZvcm1hdChOdW1iZXJGb3JtYXRJbmZvLkludmFyaWFudEluZm8sICJ7MH1wdCIsIHNwYWNpbmdCZWZvcmUvMjAuMG0pCisgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIik7CisKKyAgICAgICAgICAgIHZhciBsaW5lUnVsZSA9IChzdHJpbmcpIHNwYWNpbmcuQXR0cmlidXRlKFcubGluZVJ1bGUpOworICAgICAgICAgICAgaWYgKGxpbmVSdWxlID09ICJhdXRvIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbGluZSA9IChkZWNpbWFsKSBzcGFjaW5nLkF0dHJpYnV0ZShXLmxpbmUpOworICAgICAgICAgICAgICAgIGlmIChsaW5lICE9IDI0MG0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcGN0ID0gKGxpbmUvMjQwbSkqMTAwbTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUuQWRkKCJsaW5lLWhlaWdodCIsIHN0cmluZy5Gb3JtYXQoTnVtYmVyRm9ybWF0SW5mby5JbnZhcmlhbnRJbmZvLCAiezA6MC4wfSUiLCBwY3QpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGluZVJ1bGUgPT0gImV4YWN0IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbGluZSA9IChkZWNpbWFsKSBzcGFjaW5nLkF0dHJpYnV0ZShXLmxpbmUpOworICAgICAgICAgICAgICAgIHZhciBwb2ludHMgPSBsaW5lLzIwbTsKKyAgICAgICAgICAgICAgICBzdHlsZS5BZGQoImxpbmUtaGVpZ2h0Iiwgc3RyaW5nLkZvcm1hdChOdW1iZXJGb3JtYXRJbmZvLkludmFyaWFudEluZm8sICJ7MDowLjB9cHQiLCBwb2ludHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaW5lUnVsZSA9PSAiYXRMZWFzdCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGxpbmUgPSAoZGVjaW1hbCkgc3BhY2luZy5BdHRyaWJ1dGUoVy5saW5lKTsKKyAgICAgICAgICAgICAgICB2YXIgcG9pbnRzID0gbGluZS8yMG07CisgICAgICAgICAgICAgICAgaWYgKHBvaW50cyA+PSAxNG0pCisgICAgICAgICAgICAgICAgICAgIHN0eWxlLkFkZCgibGluZS1oZWlnaHQiLCBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywgInswOjAuMH1wdCIsIHBvaW50cykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc3BhY2luZ0FmdGVyID0gc3VwcHJlc3NUcmFpbGluZ1doaXRlU3BhY2UgPyAwbSA6IChkZWNpbWFsPykgc3BhY2luZy5BdHRyaWJ1dGUoVy5hZnRlcik7CisgICAgICAgICAgICBpZiAoc3BhY2luZ0FmdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJtYXJnaW4tYm90dG9tIiwKKyAgICAgICAgICAgICAgICAgICAgc3BhY2luZ0FmdGVyID4gMG0KKyAgICAgICAgICAgICAgICAgICAgICAgID8gc3RyaW5nLkZvcm1hdChOdW1iZXJGb3JtYXRJbmZvLkludmFyaWFudEluZm8sICJ7MH1wdCIsIHNwYWNpbmdBZnRlci8yMC4wbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogIjAiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ3JlYXRlU3R5bGVGcm9tVGV4dEFsaWdubWVudChEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBzdHlsZSwgWEVsZW1lbnQgdGV4dEFsaWdubWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRleHRBbGlnbm1lbnQgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICB2YXIgdmVydGljYWxUZXh0QWxpZ25tZW50ID0gKHN0cmluZyl0ZXh0QWxpZ25tZW50LkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAodmVydGljYWxUZXh0QWxpZ25tZW50ID09IG51bGwgfHwgdmVydGljYWxUZXh0QWxpZ25tZW50ID09ICJhdXRvIikgcmV0dXJuOworCisgICAgICAgICAgICBpZiAodmVydGljYWxUZXh0QWxpZ25tZW50ID09ICJ0b3AiKQorICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygidmVydGljYWwtYWxpZ24iLCAidG9wIik7CisgICAgICAgICAgICBlbHNlIGlmICh2ZXJ0aWNhbFRleHRBbGlnbm1lbnQgPT0gImNlbnRlciIpCisgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJ2ZXJ0aWNhbC1hbGlnbiIsICJtaWRkbGUiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHZlcnRpY2FsVGV4dEFsaWdubWVudCA9PSAiYmFzZWxpbmUiKQorICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygidmVydGljYWwtYWxpZ24iLCAiYmFzZWxpbmUiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHZlcnRpY2FsVGV4dEFsaWdubWVudCA9PSAiYm90dG9tIikKKyAgICAgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoInZlcnRpY2FsLWFsaWduIiwgImJvdHRvbSIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBEZWZpbmVGb250U2l6ZShEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBzdHlsZSwgWEVsZW1lbnQgcGFyYWdyYXBoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc3ogPSBwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNUcmltbWVkKFcudHhieENvbnRlbnQpCisgICAgICAgICAgICAgICAgLldoZXJlKGUgPT4gZS5OYW1lID09IFcucikKKyAgICAgICAgICAgICAgICAuU2VsZWN0KHIgPT4gR2V0Rm9udFNpemUocikpCisgICAgICAgICAgICAgICAgLk1heCgpOworICAgICAgICAgICAgaWYgKHN6ICE9IG51bGwpCisgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJmb250LXNpemUiLCBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywgInswfXB0Iiwgc3ogLyAyLjBtKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIERlZmluZUxpbmVIZWlnaHQoRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gc3R5bGUsIFhFbGVtZW50IHBhcmFncmFwaCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGFsbFJ1bnNBcmVVbmlEaXJlY3Rpb25hbCA9IHBhcmFncmFwaAorICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50c1RyaW1tZWQoVy50eGJ4Q29udGVudCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgPT0gVy5yKQorICAgICAgICAgICAgICAgIC5TZWxlY3QocnVuID0+IChzdHJpbmcpcnVuLkF0dHJpYnV0ZShQdE9wZW5YbWwuTGFuZ3VhZ2VUeXBlKSkKKyAgICAgICAgICAgICAgICAuQWxsKGx0ID0+IGx0ICE9ICJiaWRpIik7CisgICAgICAgICAgICBpZiAoYWxsUnVuc0FyZVVuaURpcmVjdGlvbmFsKQorICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygibGluZS1oZWlnaHQiLCAiMTA4JSIpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSGFuZGxlOgorICAgICAgICAgKiAtIGIKKyAgICAgICAgICogLSBiZHIKKyAgICAgICAgICogLSBjYXBzCisgICAgICAgICAqIC0gY29sb3IKKyAgICAgICAgICogLSBkc3RyaWtlCisgICAgICAgICAqIC0gaGlnaGxpZ2h0CisgICAgICAgICAqIC0gaQorICAgICAgICAgKiAtIHBvc2l0aW9uCisgICAgICAgICAqIC0gckZvbnRzCisgICAgICAgICAqIC0gc2hkCisgICAgICAgICAqIC0gc21hbGxDYXBzCisgICAgICAgICAqIC0gc3BhY2luZworICAgICAgICAgKiAtIHN0cmlrZQorICAgICAgICAgKiAtIHN6CisgICAgICAgICAqIC0gdQorICAgICAgICAgKiAtIHZhbmlzaAorICAgICAgICAgKiAtIHZlcnRBbGlnbgorICAgICAgICAgKgorICAgICAgICAgKiBEb24ndCBoYW5kbGU6CisgICAgICAgICAqIC0gZW0KKyAgICAgICAgICogLSBlbWJvc3MKKyAgICAgICAgICogLSBmaXRUZXh0CisgICAgICAgICAqIC0gaW1wcmludAorICAgICAgICAgKiAtIGtlcm4KKyAgICAgICAgICogLSBvdXRsaW5lCisgICAgICAgICAqIC0gc2hhZG93CisgICAgICAgICAqIC0gdworICAgICAgICAgKgorICAgICAgICAgKi8KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQ29udmVydFJ1bihXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdvcmREb2MsIFdtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzLCBYRWxlbWVudCBydW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByUHIgPSBydW4uRWxlbWVudChXLnJQcik7CisgICAgICAgICAgICBpZiAoclByID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bi5FbGVtZW50cygpLlNlbGVjdChlID0+IENvbnZlcnRUb0h0bWxUcmFuc2Zvcm0od29yZERvYywgc2V0dGluZ3MsIGUsIGZhbHNlLCAwbSkpOworCisgICAgICAgICAgICAvLyBoaWRlIGFsbCBjb250ZW50IHRoYXQgY29udGFpbnMgdGhlIHc6clByL3c6d2ViSGlkZGVuIGVsZW1lbnQKKyAgICAgICAgICAgIGlmIChyUHIuRWxlbWVudChXLndlYkhpZGRlbikgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgdmFyIHN0eWxlID0gRGVmaW5lUnVuU3R5bGUocnVuKTsKKyAgICAgICAgICAgIG9iamVjdCBjb250ZW50ID0gcnVuLkVsZW1lbnRzKCkuU2VsZWN0KGUgPT4gQ29udmVydFRvSHRtbFRyYW5zZm9ybSh3b3JkRG9jLCBzZXR0aW5ncywgZSwgZmFsc2UsIDBtKSk7CisKKyAgICAgICAgICAgIC8vIFdyYXAgY29udGVudCBpbiBoOnN1cCBvciBoOnN1YiBlbGVtZW50cyBhcyBuZWNlc3NhcnkuCisgICAgICAgICAgICBpZiAoclByLkVsZW1lbnQoVy52ZXJ0QWxpZ24pICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3Q29udGVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgdmFyIHZlcnRBbGlnblZhbCA9IChzdHJpbmcpclByLkVsZW1lbnRzKFcudmVydEFsaWduKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIHN3aXRjaCAodmVydEFsaWduVmFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAic3VwZXJzY3JpcHQiOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudCA9IG5ldyBYRWxlbWVudChYaHRtbC5zdXAsIGNvbnRlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgInN1YnNjcmlwdCI6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50ID0gbmV3IFhFbGVtZW50KFhodG1sLnN1YiwgY29udGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5ld0NvbnRlbnQgIT0gbnVsbCAmJiBuZXdDb250ZW50Lk5vZGVzKCkuQW55KCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBuZXdDb250ZW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbGFuZ0F0dHJpYnV0ZSA9IEdldExhbmdBdHRyaWJ1dGUocnVuKTsKKworICAgICAgICAgICAgWEVudGl0eSBydW5TdGFydE1hcms7CisgICAgICAgICAgICBYRW50aXR5IHJ1bkVuZE1hcms7CisgICAgICAgICAgICBEZXRlcm1pbmVSdW5NYXJrcyhydW4sIHJQciwgc3R5bGUsIG91dCBydW5TdGFydE1hcmssIG91dCBydW5FbmRNYXJrKTsKKworICAgICAgICAgICAgaWYgKHN0eWxlLkFueSgpIHx8IGxhbmdBdHRyaWJ1dGUgIT0gbnVsbCB8fCBydW5TdGFydE1hcmsgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoIm1hcmdpbiIsICIwIik7CisgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJwYWRkaW5nIiwgIjAiKTsKKyAgICAgICAgICAgICAgICB2YXIgeGUgPSBuZXcgWEVsZW1lbnQoWGh0bWwuc3BhbiwKKyAgICAgICAgICAgICAgICAgICAgbGFuZ0F0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRNYXJrLAorICAgICAgICAgICAgICAgICAgICBjb250ZW50LAorICAgICAgICAgICAgICAgICAgICBydW5FbmRNYXJrKTsKKworICAgICAgICAgICAgICAgIHhlLkFkZEFubm90YXRpb24oc3R5bGUpOworICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB4ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb250ZW50OworICAgICAgICB9CisKKyAgICAgICAgW1N1cHByZXNzTWVzc2FnZSgiUmVTaGFycGVyIiwgIkZ1bmN0aW9uQ29tcGxleGl0eU92ZXJmbG93IildCisgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IERlZmluZVJ1blN0eWxlKFhFbGVtZW50IHJ1bikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0eWxlID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CisKKyAgICAgICAgICAgIHZhciByUHIgPSBydW4uRWxlbWVudHMoVy5yUHIpLkZpcnN0KCk7CisKKyAgICAgICAgICAgIHZhciBzdHlsZU5hbWUgPSAoc3RyaW5nKSBydW4uQXR0cmlidXRlKFB0T3BlblhtbC5TdHlsZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0eWxlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHN0eWxlLkFkZCgiUHRTdHlsZU5hbWUiLCBzdHlsZU5hbWUpOworCisgICAgICAgICAgICAvLyBXLmJkcgorICAgICAgICAgICAgaWYgKHJQci5FbGVtZW50KFcuYmRyKSAhPSBudWxsICYmIChzdHJpbmcpIHJQci5FbGVtZW50cyhXLmJkcikuQXR0cmlidXRlcyhXLnZhbCkuRmlyc3RPckRlZmF1bHQoKSAhPSAibm9uZSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJib3JkZXIiLCAic29saWQgd2luZG93dGV4dCAxLjBwdCIpOworICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygicGFkZGluZyIsICIwIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFcuY29sb3IKKyAgICAgICAgICAgIHZhciBjb2xvciA9IChzdHJpbmcpIHJQci5FbGVtZW50cyhXLmNvbG9yKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGNvbG9yICE9IG51bGwpCisgICAgICAgICAgICAgICAgQ3JlYXRlQ29sb3JQcm9wZXJ0eSgiY29sb3IiLCBjb2xvciwgc3R5bGUpOworCisgICAgICAgICAgICAvLyBXLmhpZ2hsaWdodAorICAgICAgICAgICAgdmFyIGhpZ2hsaWdodCA9IChzdHJpbmcpIHJQci5FbGVtZW50cyhXLmhpZ2hsaWdodCkuQXR0cmlidXRlcyhXLnZhbCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChoaWdobGlnaHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBDcmVhdGVDb2xvclByb3BlcnR5KCJiYWNrZ3JvdW5kIiwgaGlnaGxpZ2h0LCBzdHlsZSk7CisKKyAgICAgICAgICAgIC8vIFcuc2hkCisgICAgICAgICAgICB2YXIgc2hhZGUgPSAoc3RyaW5nKSByUHIuRWxlbWVudHMoVy5zaGQpLkF0dHJpYnV0ZXMoVy5maWxsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKHNoYWRlICE9IG51bGwpCisgICAgICAgICAgICAgICAgQ3JlYXRlQ29sb3JQcm9wZXJ0eSgiYmFja2dyb3VuZCIsIHNoYWRlLCBzdHlsZSk7CisKKyAgICAgICAgICAgIC8vIFB0LkZvbnROYW1lCisgICAgICAgICAgICB2YXIgc3ltID0gcnVuLkVsZW1lbnQoVy5zeW0pOworICAgICAgICAgICAgdmFyIGZvbnQgPSBzeW0gIT0gbnVsbAorICAgICAgICAgICAgICAgID8gKHN0cmluZykgc3ltLkF0dHJpYnV0ZXMoVy5mb250KS5GaXJzdE9yRGVmYXVsdCgpCisgICAgICAgICAgICAgICAgOiAoc3RyaW5nKSBydW4uQXR0cmlidXRlcyhQdE9wZW5YbWwuRm9udE5hbWUpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoZm9udCAhPSBudWxsKQorICAgICAgICAgICAgICAgIENyZWF0ZUZvbnRDc3NQcm9wZXJ0eShmb250LCBzdHlsZSk7CisKKyAgICAgICAgICAgIC8vIFcuc3oKKyAgICAgICAgICAgIHZhciBsYW5ndWFnZVR5cGUgPSAoc3RyaW5nKXJ1bi5BdHRyaWJ1dGUoUHRPcGVuWG1sLkxhbmd1YWdlVHlwZSk7CisgICAgICAgICAgICB2YXIgc3ogPSBHZXRGb250U2l6ZShsYW5ndWFnZVR5cGUsIHJQcik7CisgICAgICAgICAgICBpZiAoc3ogIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoImZvbnQtc2l6ZSIsIHN0cmluZy5Gb3JtYXQoTnVtYmVyRm9ybWF0SW5mby5JbnZhcmlhbnRJbmZvLCAiezB9cHQiLCBzei8yLjBtKSk7CisKKyAgICAgICAgICAgIC8vIFcuY2FwcworICAgICAgICAgICAgaWYgKEdldEJvb2xQcm9wKHJQciwgVy5jYXBzKSkKKyAgICAgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoInRleHQtdHJhbnNmb3JtIiwgInVwcGVyY2FzZSIpOworCisgICAgICAgICAgICAvLyBXLnNtYWxsQ2FwcworICAgICAgICAgICAgaWYgKEdldEJvb2xQcm9wKHJQciwgVy5zbWFsbENhcHMpKQorICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygiZm9udC12YXJpYW50IiwgInNtYWxsLWNhcHMiKTsKKworICAgICAgICAgICAgLy8gVy5zcGFjaW5nCisgICAgICAgICAgICB2YXIgc3BhY2luZ0luVHdpcHMgPSAoZGVjaW1hbD8pIHJQci5FbGVtZW50cyhXLnNwYWNpbmcpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoc3BhY2luZ0luVHdpcHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoImxldHRlci1zcGFjaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgc3BhY2luZ0luVHdpcHMgPiAwbQorICAgICAgICAgICAgICAgICAgICAgICAgPyBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywgInswfXB0Iiwgc3BhY2luZ0luVHdpcHMvMjApCisgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIik7CisKKyAgICAgICAgICAgIC8vIFcucG9zaXRpb24KKyAgICAgICAgICAgIHZhciBwb3NpdGlvbiA9IChkZWNpbWFsPykgclByLkVsZW1lbnRzKFcucG9zaXRpb24pLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CisgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJ0b3AiLCBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywgInswfXB0IiwgLShwb3NpdGlvbi8yKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXLnZhbmlzaAorICAgICAgICAgICAgaWYgKEdldEJvb2xQcm9wKHJQciwgVy52YW5pc2gpICYmICFHZXRCb29sUHJvcChyUHIsIFcuc3BlY1ZhbmlzaCkpCisgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJkaXNwbGF5IiwgIm5vbmUiKTsKKworICAgICAgICAgICAgLy8gVy51CisgICAgICAgICAgICBpZiAoclByLkVsZW1lbnQoVy51KSAhPSBudWxsICYmIChzdHJpbmcpIHJQci5FbGVtZW50cyhXLnUpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCkgIT0gIm5vbmUiKQorICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygidGV4dC1kZWNvcmF0aW9uIiwgInVuZGVybGluZSIpOworCisgICAgICAgICAgICAvLyBXLmkKKyAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygiZm9udC1zdHlsZSIsIEdldEJvb2xQcm9wKHJQciwgVy5pKSA/ICJpdGFsaWMiIDogIm5vcm1hbCIpOworCisgICAgICAgICAgICAvLyBXLmIKKyAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygiZm9udC13ZWlnaHQiLCBHZXRCb29sUHJvcChyUHIsIFcuYikgPyAiYm9sZCIgOiAibm9ybWFsIik7CisKKyAgICAgICAgICAgIC8vIFcuc3RyaWtlCisgICAgICAgICAgICBpZiAoR2V0Qm9vbFByb3AoclByLCBXLnN0cmlrZSkgfHwgR2V0Qm9vbFByb3AoclByLCBXLmRzdHJpa2UpKQorICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygidGV4dC1kZWNvcmF0aW9uIiwgImxpbmUtdGhyb3VnaCIpOworCisgICAgICAgICAgICByZXR1cm4gc3R5bGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBkZWNpbWFsPyBHZXRGb250U2l6ZShYRWxlbWVudCBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbGFuZ3VhZ2VUeXBlID0gKHN0cmluZyllLkF0dHJpYnV0ZShQdE9wZW5YbWwuTGFuZ3VhZ2VUeXBlKTsKKyAgICAgICAgICAgIGlmIChlLk5hbWUgPT0gVy5wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRGb250U2l6ZShsYW5ndWFnZVR5cGUsIGUuRWxlbWVudHMoVy5wUHIpLkVsZW1lbnRzKFcuclByKS5GaXJzdE9yRGVmYXVsdCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlLk5hbWUgPT0gVy5yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRGb250U2l6ZShsYW5ndWFnZVR5cGUsIGUuRWxlbWVudChXLnJQcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBkZWNpbWFsPyBHZXRGb250U2l6ZShzdHJpbmcgbGFuZ3VhZ2VUeXBlLCBYRWxlbWVudCByUHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyUHIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gbGFuZ3VhZ2VUeXBlID09ICJiaWRpIgorICAgICAgICAgICAgICAgID8gKGRlY2ltYWw/KSByUHIuRWxlbWVudHMoVy5zekNzKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpCisgICAgICAgICAgICAgICAgOiAoZGVjaW1hbD8pIHJQci5FbGVtZW50cyhXLnN6KS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBEZXRlcm1pbmVSdW5NYXJrcyhYRWxlbWVudCBydW4sIFhFbGVtZW50IHJQciwgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gc3R5bGUsIG91dCBYRW50aXR5IHJ1blN0YXJ0TWFyaywgb3V0IFhFbnRpdHkgcnVuRW5kTWFyaykKKyAgICAgICAgeworICAgICAgICAgICAgcnVuU3RhcnRNYXJrID0gbnVsbDsKKyAgICAgICAgICAgIHJ1bkVuZE1hcmsgPSBudWxsOworCisgICAgICAgICAgICAvLyBPbmx5IGRvIHRoZSBmb2xsb3dpbmcgZm9yIHRleHQgcnVucy4KKyAgICAgICAgICAgIGlmIChydW4uRWxlbWVudChXLnQpID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgLy8gQ2FuJ3QgYWRkIGRpcmVjdGlvbmFsIG1hcmtzIGlmIHRoZSBmb250LWZhbWlseSBpcyBzeW1ib2wgLSB0aGV5IGFyZSB2aXNpYmxlLCBhbmQgZGlzcGxheSBhcyBhID8KKyAgICAgICAgICAgIHZhciBhZGREaXJlY3Rpb25hbE1hcmtzID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChzdHlsZS5Db250YWluc0tleSgiZm9udC1mYW1pbHkiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3R5bGVbImZvbnQtZmFtaWx5Il0uVG9Mb3dlcigpID09ICJzeW1ib2wiKQorICAgICAgICAgICAgICAgICAgICBhZGREaXJlY3Rpb25hbE1hcmtzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWFkZERpcmVjdGlvbmFsTWFya3MpIHJldHVybjsKKworICAgICAgICAgICAgdmFyIGlzUnRsID0gclByLkVsZW1lbnQoVy5ydGwpICE9IG51bGw7CisgICAgICAgICAgICBpZiAoaXNSdGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcnVuU3RhcnRNYXJrID0gbmV3IFhFbnRpdHkoIiN4MjAwZiIpOyAvLyBSTE0KKyAgICAgICAgICAgICAgICBydW5FbmRNYXJrID0gbmV3IFhFbnRpdHkoIiN4MjAwZiIpOyAvLyBSTE0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcGFyYWdyYXBoID0gcnVuLkFuY2VzdG9ycyhXLnApLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgdmFyIHBhcmFJc0JpZGkgPSBwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcucFByKQorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5iaWRpKQorICAgICAgICAgICAgICAgICAgICAuQW55KGIgPT4gYi5BdHRyaWJ1dGUoVy52YWwpID09IG51bGwgfHwgYi5BdHRyaWJ1dGUoVy52YWwpLlRvQm9vbGVhbigpID09IHRydWUpOworCisgICAgICAgICAgICAgICAgaWYgKHBhcmFJc0JpZGkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBydW5TdGFydE1hcmsgPSBuZXcgWEVudGl0eSgiI3gyMDBlIik7IC8vIExSTQorICAgICAgICAgICAgICAgICAgICBydW5FbmRNYXJrID0gbmV3IFhFbnRpdHkoIiN4MjAwZSIpOyAvLyBMUk0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYQXR0cmlidXRlIEdldExhbmdBdHRyaWJ1dGUoWEVsZW1lbnQgcnVuKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgZGVmYXVsdExhbmd1YWdlID0gImVuLVVTIjsgLy8gdG9kbyBuZWVkIHRvIGdldCBkZWZhdWx0TGFuZ3VhZ2UKKworICAgICAgICAgICAgdmFyIHJQciA9IHJ1bi5FbGVtZW50cyhXLnJQcikuRmlyc3QoKTsKKyAgICAgICAgICAgIHZhciBsYW5ndWFnZVR5cGUgPSAoc3RyaW5nKXJ1bi5BdHRyaWJ1dGUoUHRPcGVuWG1sLkxhbmd1YWdlVHlwZSk7CisKKyAgICAgICAgICAgIHN0cmluZyBsYW5nID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChsYW5ndWFnZVR5cGUgPT0gIndlc3Rlcm4iKQorICAgICAgICAgICAgICAgIGxhbmcgPSAoc3RyaW5nKSByUHIuRWxlbWVudHMoVy5sYW5nKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgZWxzZSBpZiAobGFuZ3VhZ2VUeXBlID09ICJiaWRpIikKKyAgICAgICAgICAgICAgICBsYW5nID0gKHN0cmluZykgclByLkVsZW1lbnRzKFcubGFuZykuQXR0cmlidXRlcyhXLmJpZGkpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBlbHNlIGlmIChsYW5ndWFnZVR5cGUgPT0gImVhc3RBc2lhIikKKyAgICAgICAgICAgICAgICBsYW5nID0gKHN0cmluZykgclByLkVsZW1lbnRzKFcubGFuZykuQXR0cmlidXRlcyhXLmVhc3RBc2lhKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGxhbmcgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsYW5nID0gZGVmYXVsdExhbmd1YWdlOworCisgICAgICAgICAgICByZXR1cm4gbGFuZyAhPSBkZWZhdWx0TGFuZ3VhZ2UgPyBuZXcgWEF0dHJpYnV0ZSgibGFuZyIsIGxhbmcpIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRqdXN0VGFibGVCb3JkZXJzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogd2hlbiBpbXBsZW1lbnRpbmcgYSBwYWdpbmcgdmVyc2lvbiBvZiB0aGUgSFRNTCB0cmFuc2Zvcm0sIHRoaXMgbmVlZHMgdG8gYmUgZG9uZQorICAgICAgICAgICAgLy8gZm9yIGFsbCBjb250ZW50IHBhcnRzLCBub3QganVzdCB0aGUgbWFpbiBkb2N1bWVudCBwYXJ0LgorCisgICAgICAgICAgICB2YXIgeGQgPSB3b3JkRG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdGJsIGluIHhkLkRlc2NlbmRhbnRzKFcudGJsKSkKKyAgICAgICAgICAgICAgICBBZGp1c3RUYWJsZUJvcmRlcnModGJsKTsKKyAgICAgICAgICAgIHdvcmREb2MuTWFpbkRvY3VtZW50UGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRqdXN0VGFibGVCb3JkZXJzKFhFbGVtZW50IHRibCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRhID0gdGJsCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcudHIpCisgICAgICAgICAgICAgICAgLlNlbGVjdChyID0+IHIKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcudGMpCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3RNYW55KGMgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVudW1lcmFibGUuUmVwZWF0KGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludD8pIGMuRWxlbWVudHMoVy50Y1ByKS5FbGVtZW50cyhXLmdyaWRTcGFuKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpID8/IDEpKQorICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpKQorICAgICAgICAgICAgICAgIC5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgdGEuTGVuZ3RoOyB5KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0YVt5XS5MZW5ndGg7IHgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB0aGlzQ2VsbCA9IHRhW3ldW3hdOworICAgICAgICAgICAgICAgICAgICBGaXhUb3BCb3JkZXIodGEsIHRoaXNDZWxsLCB4LCB5KTsKKyAgICAgICAgICAgICAgICAgICAgRml4TGVmdEJvcmRlcih0YSwgdGhpc0NlbGwsIHgsIHkpOworICAgICAgICAgICAgICAgICAgICBGaXhCb3R0b21Cb3JkZXIodGEsIHRoaXNDZWxsLCB4LCB5KTsKKyAgICAgICAgICAgICAgICAgICAgRml4UmlnaHRCb3JkZXIodGEsIHRoaXNDZWxsLCB4LCB5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEZpeFRvcEJvcmRlcihYRWxlbWVudFtdW10gdGEsIFhFbGVtZW50IHRoaXNDZWxsLCBpbnQgeCwgaW50IHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh5ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcm93QWJvdmUgPSB0YVt5IC0gMV07CisgICAgICAgICAgICAgICAgaWYgKHggPCByb3dBYm92ZS5MZW5ndGggLSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgY2VsbEFib3ZlID0gdGFbeSAtIDFdW3hdOworICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbEFib3ZlICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNDZWxsLkVsZW1lbnRzKFcudGNQcikuRWxlbWVudHMoVy50Y0JvcmRlcnMpLkZpcnN0T3JEZWZhdWx0KCkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY2VsbEFib3ZlLkVsZW1lbnRzKFcudGNQcikuRWxlbWVudHMoVy50Y0JvcmRlcnMpLkZpcnN0T3JEZWZhdWx0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZUNlbGxCb3JkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc0NlbGwuRWxlbWVudHMoVy50Y1ByKS5FbGVtZW50cyhXLnRjQm9yZGVycykuRWxlbWVudHMoVy50b3ApLkZpcnN0T3JEZWZhdWx0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbEFib3ZlLkVsZW1lbnRzKFcudGNQcikuRWxlbWVudHMoVy50Y0JvcmRlcnMpLkVsZW1lbnRzKFcuYm90dG9tKS5GaXJzdE9yRGVmYXVsdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRml4TGVmdEJvcmRlcihYRWxlbWVudFtdW10gdGEsIFhFbGVtZW50IHRoaXNDZWxsLCBpbnQgeCwgaW50IHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh4ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBjZWxsTGVmdCA9IHRhW3ldW3ggLSAxXTsKKyAgICAgICAgICAgICAgICBpZiAoY2VsbExlZnQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICB0aGlzQ2VsbC5FbGVtZW50cyhXLnRjUHIpLkVsZW1lbnRzKFcudGNCb3JkZXJzKS5GaXJzdE9yRGVmYXVsdCgpICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgY2VsbExlZnQuRWxlbWVudHMoVy50Y1ByKS5FbGVtZW50cyhXLnRjQm9yZGVycykuRmlyc3RPckRlZmF1bHQoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZUNlbGxCb3JkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzQ2VsbC5FbGVtZW50cyhXLnRjUHIpLkVsZW1lbnRzKFcudGNCb3JkZXJzKS5FbGVtZW50cyhXLmxlZnQpLkZpcnN0T3JEZWZhdWx0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBjZWxsTGVmdC5FbGVtZW50cyhXLnRjUHIpLkVsZW1lbnRzKFcudGNCb3JkZXJzKS5FbGVtZW50cyhXLnJpZ2h0KS5GaXJzdE9yRGVmYXVsdCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEZpeEJvdHRvbUJvcmRlcihYRWxlbWVudFtdW10gdGEsIFhFbGVtZW50IHRoaXNDZWxsLCBpbnQgeCwgaW50IHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh5IDwgdGEuTGVuZ3RoIC0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcm93QmVsb3cgPSB0YVt5ICsgMV07CisgICAgICAgICAgICAgICAgaWYgKHggPCByb3dCZWxvdy5MZW5ndGggLSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgY2VsbEJlbG93ID0gdGFbeSArIDFdW3hdOworICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbEJlbG93ICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNDZWxsLkVsZW1lbnRzKFcudGNQcikuRWxlbWVudHMoVy50Y0JvcmRlcnMpLkZpcnN0T3JEZWZhdWx0KCkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY2VsbEJlbG93LkVsZW1lbnRzKFcudGNQcikuRWxlbWVudHMoVy50Y0JvcmRlcnMpLkZpcnN0T3JEZWZhdWx0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZUNlbGxCb3JkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc0NlbGwuRWxlbWVudHMoVy50Y1ByKS5FbGVtZW50cyhXLnRjQm9yZGVycykuRWxlbWVudHMoVy5ib3R0b20pLkZpcnN0T3JEZWZhdWx0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbEJlbG93LkVsZW1lbnRzKFcudGNQcikuRWxlbWVudHMoVy50Y0JvcmRlcnMpLkVsZW1lbnRzKFcudG9wKS5GaXJzdE9yRGVmYXVsdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRml4UmlnaHRCb3JkZXIoWEVsZW1lbnRbXVtdIHRhLCBYRWxlbWVudCB0aGlzQ2VsbCwgaW50IHgsIGludCB5KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoeCA8IHRhW3ldLkxlbmd0aCAtIDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgY2VsbFJpZ2h0ID0gdGFbeV1beCArIDFdOworICAgICAgICAgICAgICAgIGlmIChjZWxsUmlnaHQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICB0aGlzQ2VsbC5FbGVtZW50cyhXLnRjUHIpLkVsZW1lbnRzKFcudGNCb3JkZXJzKS5GaXJzdE9yRGVmYXVsdCgpICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgY2VsbFJpZ2h0LkVsZW1lbnRzKFcudGNQcikuRWxlbWVudHMoVy50Y0JvcmRlcnMpLkZpcnN0T3JEZWZhdWx0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJlc29sdmVDZWxsQm9yZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpc0NlbGwuRWxlbWVudHMoVy50Y1ByKS5FbGVtZW50cyhXLnRjQm9yZGVycykuRWxlbWVudHMoVy5yaWdodCkuRmlyc3RPckRlZmF1bHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxSaWdodC5FbGVtZW50cyhXLnRjUHIpLkVsZW1lbnRzKFcudGNCb3JkZXJzKS5FbGVtZW50cyhXLmxlZnQpLkZpcnN0T3JEZWZhdWx0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+IEJvcmRlclR5cGVQcmlvcml0eSA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgaW50PigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgInNpbmdsZSIsIDEgfSwKKyAgICAgICAgICAgIHsgInRoaWNrIiwgMiB9LAorICAgICAgICAgICAgeyAiZG91YmxlIiwgMyB9LAorICAgICAgICAgICAgeyAiZG90dGVkIiwgNCB9LAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+IEJvcmRlck51bWJlciA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgaW50PigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHsic2luZ2xlIiwgMSB9LAorICAgICAgICAgICAgeyJ0aGljayIsIDIgfSwKKyAgICAgICAgICAgIHsiZG91YmxlIiwgMyB9LAorICAgICAgICAgICAgeyJkb3R0ZWQiLCA0IH0sCisgICAgICAgICAgICB7ImRhc2hlZCIsIDUgfSwKKyAgICAgICAgICAgIHsiZG90RGFzaCIsIDUgfSwKKyAgICAgICAgICAgIHsiZG90RG90RGFzaCIsIDUgfSwKKyAgICAgICAgICAgIHsidHJpcGxlIiwgNiB9LAorICAgICAgICAgICAgeyJ0aGluVGhpY2tTbWFsbEdhcCIsIDYgfSwKKyAgICAgICAgICAgIHsidGhpY2tUaGluU21hbGxHYXAiLCA2IH0sCisgICAgICAgICAgICB7InRoaW5UaGlja1RoaW5TbWFsbEdhcCIsIDYgfSwKKyAgICAgICAgICAgIHsidGhpblRoaWNrTWVkaXVtR2FwIiwgNiB9LAorICAgICAgICAgICAgeyJ0aGlja1RoaW5NZWRpdW1HYXAiLCA2IH0sCisgICAgICAgICAgICB7InRoaW5UaGlja1RoaW5NZWRpdW1HYXAiLCA2IH0sCisgICAgICAgICAgICB7InRoaW5UaGlja0xhcmdlR2FwIiwgNiB9LAorICAgICAgICAgICAgeyJ0aGlja1RoaW5MYXJnZUdhcCIsIDYgfSwKKyAgICAgICAgICAgIHsidGhpblRoaWNrVGhpbkxhcmdlR2FwIiwgNiB9LAorICAgICAgICAgICAgeyJ3YXZlIiwgNyB9LAorICAgICAgICAgICAgeyJkb3VibGVXYXZlIiwgNyB9LAorICAgICAgICAgICAgeyJkYXNoU21hbGxHYXAiLCA1IH0sCisgICAgICAgICAgICB7ImRhc2hEb3RTdHJva2VkIiwgNSB9LAorICAgICAgICAgICAgeyJ0aHJlZURFbWJvc3MiLCA3IH0sCisgICAgICAgICAgICB7InRocmVlREVuZ3JhdmUiLCA3IH0sCisgICAgICAgICAgICB7Im91dHNldCIsIDcgfSwKKyAgICAgICAgICAgIHsiaW5zZXQiLCA3IH0sCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZXNvbHZlQ2VsbEJvcmRlcihYRWxlbWVudCBib3JkZXIxLCBYRWxlbWVudCBib3JkZXIyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYm9yZGVyMSA9PSBudWxsIHx8IGJvcmRlcjIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiAoKHN0cmluZylib3JkZXIxLkF0dHJpYnV0ZShXLnZhbCkgPT0gIm5pbCIgfHwgKHN0cmluZylib3JkZXIyLkF0dHJpYnV0ZShXLnZhbCkgPT0gIm5pbCIpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKChzdHJpbmcpYm9yZGVyMS5BdHRyaWJ1dGUoVy5zeikgPT0gIm5pbCIgfHwgKHN0cmluZylib3JkZXIyLkF0dHJpYnV0ZShXLnN6KSA9PSAibmlsIikKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHZhciBib3JkZXIxVmFsID0gKHN0cmluZylib3JkZXIxLkF0dHJpYnV0ZShXLnZhbCk7CisgICAgICAgICAgICB2YXIgYm9yZGVyMVdlaWdodCA9IDE7CisgICAgICAgICAgICBpZiAoQm9yZGVyTnVtYmVyLkNvbnRhaW5zS2V5KGJvcmRlcjFWYWwpKQorICAgICAgICAgICAgICAgIGJvcmRlcjFXZWlnaHQgPSBCb3JkZXJOdW1iZXJbYm9yZGVyMVZhbF07CisKKyAgICAgICAgICAgIHZhciBib3JkZXIyVmFsID0gKHN0cmluZylib3JkZXIyLkF0dHJpYnV0ZShXLnZhbCk7CisgICAgICAgICAgICB2YXIgYm9yZGVyMldlaWdodCA9IDE7CisgICAgICAgICAgICBpZiAoQm9yZGVyTnVtYmVyLkNvbnRhaW5zS2V5KGJvcmRlcjJWYWwpKQorICAgICAgICAgICAgICAgIGJvcmRlcjJXZWlnaHQgPSBCb3JkZXJOdW1iZXJbYm9yZGVyMlZhbF07CisKKyAgICAgICAgICAgIGlmIChib3JkZXIxV2VpZ2h0ICE9IGJvcmRlcjJXZWlnaHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJvcmRlcjFXZWlnaHQgPCBib3JkZXIyV2VpZ2h0KQorICAgICAgICAgICAgICAgICAgICBCb3JkZXJPdmVycmlkZShib3JkZXIyLCBib3JkZXIxKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIEJvcmRlck92ZXJyaWRlKGJvcmRlcjEsIGJvcmRlcjIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGRlY2ltYWwpYm9yZGVyMS5BdHRyaWJ1dGUoVy5zeikgPiAoZGVjaW1hbClib3JkZXIyLkF0dHJpYnV0ZShXLnN6KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCb3JkZXJPdmVycmlkZShib3JkZXIxLCBib3JkZXIyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZGVjaW1hbClib3JkZXIxLkF0dHJpYnV0ZShXLnN6KSA8IChkZWNpbWFsKWJvcmRlcjIuQXR0cmlidXRlKFcuc3opKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJvcmRlck92ZXJyaWRlKGJvcmRlcjIsIGJvcmRlcjEpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJvcmRlcjFUeXBlID0gKHN0cmluZylib3JkZXIxLkF0dHJpYnV0ZShXLnZhbCk7CisgICAgICAgICAgICB2YXIgYm9yZGVyMlR5cGUgPSAoc3RyaW5nKWJvcmRlcjIuQXR0cmlidXRlKFcudmFsKTsKKyAgICAgICAgICAgIGlmIChCb3JkZXJUeXBlUHJpb3JpdHkuQ29udGFpbnNLZXkoYm9yZGVyMVR5cGUpICYmCisgICAgICAgICAgICAgICAgQm9yZGVyVHlwZVByaW9yaXR5LkNvbnRhaW5zS2V5KGJvcmRlcjJUeXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYm9yZGVyMVByaSA9IEJvcmRlclR5cGVQcmlvcml0eVtib3JkZXIxVHlwZV07CisgICAgICAgICAgICAgICAgdmFyIGJvcmRlcjJQcmkgPSBCb3JkZXJUeXBlUHJpb3JpdHlbYm9yZGVyMlR5cGVdOworICAgICAgICAgICAgICAgIGlmIChib3JkZXIxUHJpIDwgYm9yZGVyMlByaSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJvcmRlck92ZXJyaWRlKGJvcmRlcjIsIGJvcmRlcjEpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChib3JkZXIyUHJpIDwgYm9yZGVyMVByaSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJvcmRlck92ZXJyaWRlKGJvcmRlcjEsIGJvcmRlcjIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgY29sb3IxU3RyID0gKHN0cmluZylib3JkZXIxLkF0dHJpYnV0ZShXLmNvbG9yKTsKKyAgICAgICAgICAgIGlmIChjb2xvcjFTdHIgPT0gImF1dG8iKQorICAgICAgICAgICAgICAgIGNvbG9yMVN0ciA9ICIwMDAwMDAiOworICAgICAgICAgICAgdmFyIGNvbG9yMlN0ciA9IChzdHJpbmcpYm9yZGVyMi5BdHRyaWJ1dGUoVy5jb2xvcik7CisgICAgICAgICAgICBpZiAoY29sb3IyU3RyID09ICJhdXRvIikKKyAgICAgICAgICAgICAgICBjb2xvcjJTdHIgPSAiMDAwMDAwIjsKKyAgICAgICAgICAgIGlmIChjb2xvcjFTdHIgIT0gbnVsbCAmJiBjb2xvcjJTdHIgIT0gbnVsbCAmJiBjb2xvcjFTdHIgIT0gY29sb3IyU3RyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNvbG9yMSA9IENvbnZlcnQuVG9JbnQzMihjb2xvcjFTdHIsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNvbG9yMiA9IENvbnZlcnQuVG9JbnQzMihjb2xvcjJTdHIsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yMSA8IGNvbG9yMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQm9yZGVyT3ZlcnJpZGUoYm9yZGVyMSwgYm9yZGVyMik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yMiA8IGNvbG9yMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQm9yZGVyT3ZlcnJpZGUoYm9yZGVyMiwgYm9yZGVyMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGFib3ZlIHRocm93cyBBcmd1bWVudEV4Y2VwdGlvbiwgRm9ybWF0RXhjZXB0aW9uLCBvciBPdmVyZmxvd0V4Y2VwdGlvbiwgdGhlbiBhYm9ydAorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEJvcmRlck92ZXJyaWRlKFhFbGVtZW50IGZyb21Cb3JkZXIsIFhFbGVtZW50IHRvQm9yZGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0b0JvcmRlci5BdHRyaWJ1dGUoVy52YWwpLlZhbHVlID0gZnJvbUJvcmRlci5BdHRyaWJ1dGUoVy52YWwpLlZhbHVlOworICAgICAgICAgICAgaWYgKGZyb21Cb3JkZXIuQXR0cmlidXRlKFcuY29sb3IpICE9IG51bGwpCisgICAgICAgICAgICAgICAgdG9Cb3JkZXIuU2V0QXR0cmlidXRlVmFsdWUoVy5jb2xvciwgZnJvbUJvcmRlci5BdHRyaWJ1dGUoVy5jb2xvcikuVmFsdWUpOworICAgICAgICAgICAgaWYgKGZyb21Cb3JkZXIuQXR0cmlidXRlKFcuc3opICE9IG51bGwpCisgICAgICAgICAgICAgICAgdG9Cb3JkZXIuU2V0QXR0cmlidXRlVmFsdWUoVy5zeiwgZnJvbUJvcmRlci5BdHRyaWJ1dGUoVy5zeikuVmFsdWUpOworICAgICAgICAgICAgaWYgKGZyb21Cb3JkZXIuQXR0cmlidXRlKFcudGhlbWVDb2xvcikgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0b0JvcmRlci5TZXRBdHRyaWJ1dGVWYWx1ZShXLnRoZW1lQ29sb3IsIGZyb21Cb3JkZXIuQXR0cmlidXRlKFcudGhlbWVDb2xvcikuVmFsdWUpOworICAgICAgICAgICAgaWYgKGZyb21Cb3JkZXIuQXR0cmlidXRlKFcudGhlbWVUaW50KSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRvQm9yZGVyLlNldEF0dHJpYnV0ZVZhbHVlKFcudGhlbWVUaW50LCBmcm9tQm9yZGVyLkF0dHJpYnV0ZShXLnRoZW1lVGludCkuVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDYWxjdWxhdGVTcGFuV2lkdGhGb3JUYWJzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogd2hlbiBpbXBsZW1lbnRpbmcgYSBwYWdpbmcgdmVyc2lvbiBvZiB0aGUgSFRNTCB0cmFuc2Zvcm0sIHRoaXMgbmVlZHMgdG8gYmUgZG9uZQorICAgICAgICAgICAgLy8gZm9yIGFsbCBjb250ZW50IHBhcnRzLCBub3QganVzdCB0aGUgbWFpbiBkb2N1bWVudCBwYXJ0LgorCisgICAgICAgICAgICAvLyB3OmRlZmF1bHRUYWJTdG9wIGluIHNldHRpbmdzCisgICAgICAgICAgICB2YXIgc3hkID0gd29yZERvYy5NYWluRG9jdW1lbnRQYXJ0LkRvY3VtZW50U2V0dGluZ3NQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgdmFyIGRlZmF1bHRUYWJTdG9wID0gKGludD8pc3hkLkRlc2NlbmRhbnRzKFcuZGVmYXVsdFRhYlN0b3ApLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCkgPz8gNzIwOworCisgICAgICAgICAgICB2YXIgcHhkID0gd29yZERvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgdmFyIHJvb3QgPSBweGQuUm9vdDsKKyAgICAgICAgICAgIGlmIChyb290ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgdmFyIG5ld1Jvb3QgPSAoWEVsZW1lbnQpQ2FsY3VsYXRlU3BhbldpZHRoVHJhbnNmb3JtKHJvb3QsIGRlZmF1bHRUYWJTdG9wKTsKKyAgICAgICAgICAgIHJvb3QuUmVwbGFjZVdpdGgobmV3Um9vdCk7CisgICAgICAgICAgICB3b3JkRG9jLk1haW5Eb2N1bWVudFBhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBSZWZhY3Rvci4gVGhpcyBtZXRob2QgaXMgd2F5IHRvbyBsb25nLgorICAgICAgICBbU3VwcHJlc3NNZXNzYWdlKCJSZVNoYXJwZXIiLCAiRnVuY3Rpb25Db21wbGV4aXR5T3ZlcmZsb3ciKV0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IENhbGN1bGF0ZVNwYW5XaWR0aFRyYW5zZm9ybShYTm9kZSBub2RlLCBpbnQgZGVmYXVsdFRhYlN0b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBub2RlOworCisgICAgICAgICAgICAvLyBpZiBpdCBpcyBub3QgYSBwYXJhZ3JhcGggb3IgaWYgdGhlcmUgYXJlIG5vIHRhYnMgaW4gdGhlIHBhcmFncmFwaCwKKyAgICAgICAgICAgIC8vIHRoZW4gbm8gbmVlZCB0byBjb250aW51ZSBwcm9jZXNzaW5nLgorICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSAhPSBXLnAgfHwKKyAgICAgICAgICAgICAgICAhZWxlbWVudC5EZXNjZW5kYW50c1RyaW1tZWQoVy50eGJ4Q29udGVudCkuV2hlcmUoZCA9PiBkLk5hbWUgPT0gVy5yKS5FbGVtZW50cyhXLnRhYikuQW55KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogUmV2aXNpdC4gQ2FuIHdlIGp1c3QgcmV0dXJuIHRoZSBub2RlIGlmIGl0IGlzIGEgcGFyYWdyYXBoIHRoYXQgZG9lcyBub3QgaGF2ZSBhbnkgdGFiPworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IENhbGN1bGF0ZVNwYW5XaWR0aFRyYW5zZm9ybShuLCBkZWZhdWx0VGFiU3RvcCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGNsb25lZFBhcmEgPSBuZXcgWEVsZW1lbnQoZWxlbWVudCk7CisKKyAgICAgICAgICAgIHZhciBsZWZ0SW5Ud2lwcyA9IDA7CisgICAgICAgICAgICB2YXIgZmlyc3RJblR3aXBzID0gMDsKKworICAgICAgICAgICAgdmFyIGluZCA9IGNsb25lZFBhcmEuRWxlbWVudHMoVy5wUHIpLkVsZW1lbnRzKFcuaW5kKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGluZCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHRvZG8gbmVlZCB0byBoYW5kbGUgc3RhcnQgYW5kIGVuZCBhdHRyaWJ1dGVzCisKKyAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IChpbnQ/KWluZC5BdHRyaWJ1dGUoVy5sZWZ0KTsKKyAgICAgICAgICAgICAgICBpZiAobGVmdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBsZWZ0SW5Ud2lwcyA9IChpbnQpbGVmdDsKKworICAgICAgICAgICAgICAgIHZhciBmaXJzdExpbmUgPSAwOworICAgICAgICAgICAgICAgIHZhciBmaXJzdExpbmVBdHQgPSAoaW50PylpbmQuQXR0cmlidXRlKFcuZmlyc3RMaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RMaW5lQXR0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGZpcnN0TGluZSA9IChpbnQpZmlyc3RMaW5lQXR0OworCisgICAgICAgICAgICAgICAgdmFyIGhhbmdpbmdBdHQgPSAoaW50PylpbmQuQXR0cmlidXRlKFcuaGFuZ2luZyk7CisgICAgICAgICAgICAgICAgaWYgKGhhbmdpbmdBdHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RMaW5lID0gLShpbnQpaGFuZ2luZ0F0dDsKKworICAgICAgICAgICAgICAgIGZpcnN0SW5Ud2lwcyA9IGxlZnRJblR3aXBzICsgZmlyc3RMaW5lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHRhYiBzdG9wcywgaW4gdHdpcHMKKyAgICAgICAgICAgIHZhciB0YWJzID0gY2xvbmVkUGFyYQorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnBQcikKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy50YWJzKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICBpZiAodGFicyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChsZWZ0SW5Ud2lwcyA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGFicyA9IG5ldyBYRWxlbWVudChXLnRhYnMsCisgICAgICAgICAgICAgICAgICAgICAgICBFbnVtZXJhYmxlLlJhbmdlKDEsIDEwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHIgPT4gbmV3IFhFbGVtZW50KFcudGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgImxlZnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5wb3MsIHIgKiBkZWZhdWx0VGFiU3RvcCkpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRhYnMgPSBuZXcgWEVsZW1lbnQoVy50YWJzLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcudmFsLCAibGVmdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcucG9zLCBsZWZ0SW5Ud2lwcykpKTsKKyAgICAgICAgICAgICAgICAgICAgdGFicyA9IEFkZERlZmF1bHRUYWJzQWZ0ZXJMYXN0VGFiKHRhYnMsIGRlZmF1bHRUYWJTdG9wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGxlZnRJblR3aXBzICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0YWJzLkFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgImxlZnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnBvcywgbGVmdEluVHdpcHMpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRhYnMgPSBBZGREZWZhdWx0VGFic0FmdGVyTGFzdFRhYih0YWJzLCBkZWZhdWx0VGFiU3RvcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciB0d2lwQ291bnRlciA9IGZpcnN0SW5Ud2lwczsKKyAgICAgICAgICAgIHZhciBjb250ZW50VG9NZWFzdXJlID0gZWxlbWVudC5EZXNjZW5kYW50c1RyaW1tZWQoeiA9PiB6Lk5hbWUgPT0gVy50eGJ4Q29udGVudCB8fCB6Lk5hbWUgPT0gVy5wUHIgfHwgei5OYW1lID09IFcuclByKS5Ub0FycmF5KCk7CisgICAgICAgICAgICB2YXIgY3VycmVudEVsZW1lbnRJZHggPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRFbGVtZW50ID0gY29udGVudFRvTWVhc3VyZVtjdXJyZW50RWxlbWVudElkeF07CisKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuTmFtZSA9PSBXLmJyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHdpcENvdW50ZXIgPSBsZWZ0SW5Ud2lwczsKKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5BZGQobmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLlRhYldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdChOdW1iZXJGb3JtYXRJbmZvLkludmFyaWFudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInswOjAuMDAwfSIsIChkZWNpbWFsKWZpcnN0SW5Ud2lwcyAvIDE0NDBtKSkpOworCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50SWR4Kys7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudElkeCA+PSBjb250ZW50VG9NZWFzdXJlLkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyB3ZSdyZSBkb25lCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lk5hbWUgPT0gVy50YWIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcnVuQ29udGFpbmluZ1RhYlRvUmVwbGFjZSA9IGN1cnJlbnRFbGVtZW50LlBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZvbnROYW1lQXR0ID0gcnVuQ29udGFpbmluZ1RhYlRvUmVwbGFjZS5BdHRyaWJ1dGUoUHRPcGVuWG1sLnB0ICsgIkZvbnROYW1lIikgPz8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQ29udGFpbmluZ1RhYlRvUmVwbGFjZS5BbmNlc3RvcnMoVy5wKS5GaXJzdCgpLkF0dHJpYnV0ZShQdE9wZW5YbWwucHQgKyAiRm9udE5hbWUiKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdGVzdEFtb3VudCA9IHR3aXBDb3VudGVyOworCisgICAgICAgICAgICAgICAgICAgIHZhciB0YWJBZnRlclRleHQgPSB0YWJzCisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy50YWIpCisgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQodCA9PiAoaW50KXQuQXR0cmlidXRlKFcucG9zKSA+IHRlc3RBbW91bnQpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh0YWJBZnRlclRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGhhcyBnb25lIHdyb25nLCBzbyBwdXQgMS8yIGluY2ggaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5BdHRyaWJ1dGUoUHRPcGVuWG1sLlRhYldpZHRoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LkFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLlRhYldpZHRoLCA3MjBtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhciB0YWJWYWwgPSAoc3RyaW5nKXRhYkFmdGVyVGV4dC5BdHRyaWJ1dGUoVy52YWwpOworICAgICAgICAgICAgICAgICAgICBpZiAodGFiVmFsID09ICJyaWdodCIgfHwgdGFiVmFsID09ICJlbmQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dEFmdGVyRWxlbWVudHMgPSBjb250ZW50VG9NZWFzdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNraXAoY3VycmVudEVsZW1lbnRJZHggKyAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBhbGwgdGhlIGNvbnRlbnQgdW50aWwgYW5vdGhlciB0YWIsIGJyLCBvciBjcgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHRFbGVtZW50c1RvTWVhc3VyZSA9IHRleHRBZnRlckVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRha2VXaGlsZSh6ID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouTmFtZSAhPSBXLnRhYiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Lk5hbWUgIT0gVy5iciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Lk5hbWUgIT0gVy5jcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0QWZ0ZXJUYWIgPSB0ZXh0RWxlbWVudHNUb01lYXN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoeiA9PiB6Lk5hbWUgPT0gVy50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QodCA9PiAoc3RyaW5nKXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdW1teVJ1bjIgPSBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnROYW1lQXR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkNvbnRhaW5pbmdUYWJUb1JlcGxhY2UuRWxlbWVudHMoVy5yUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnQsIHRleHRBZnRlclRhYikpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGhPZlRleHRBZnRlclRhYiA9IENhbGNXaWR0aE9mUnVuSW5Ud2lwcyhkdW1teVJ1bjIpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbHRhMiA9IChpbnQpdGFiQWZ0ZXJUZXh0LkF0dHJpYnV0ZShXLnBvcykgLSB3aWR0aE9mVGV4dEFmdGVyVGFiIC0gdHdpcENvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YTIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuQWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFB0T3BlblhtbC5UYWJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdChOdW1iZXJGb3JtYXRJbmZvLkludmFyaWFudEluZm8sICJ7MDowLjAwMH0iLCAoZGVjaW1hbClkZWx0YTIgLyAxNDQwbSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExlYWRlcih0YWJBZnRlclRleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR3aXBDb3VudGVyID0gTWF0aC5NYXgoKGludCl0YWJBZnRlclRleHQuQXR0cmlidXRlKFcucG9zKSwgdHdpcENvdW50ZXIgKyB3aWR0aE9mVGV4dEFmdGVyVGFiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RFbGVtZW50ID0gdGV4dEVsZW1lbnRzVG9NZWFzdXJlLkxhc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0RWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyB3ZSdyZSBkb25lCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50SWR4ID0gQXJyYXkuSW5kZXhPZihjb250ZW50VG9NZWFzdXJlLCBsYXN0RWxlbWVudCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50SWR4ID49IGNvbnRlbnRUb01lYXN1cmUuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyB3ZSdyZSBkb25lCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWJWYWwgPT0gImRlY2ltYWwiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dEFmdGVyRWxlbWVudHMgPSBjb250ZW50VG9NZWFzdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNraXAoY3VycmVudEVsZW1lbnRJZHggKyAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBhbGwgdGhlIGNvbnRlbnQgdW50aWwgYW5vdGhlciB0YWIsIGJyLCBvciBjcgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHRFbGVtZW50c1RvTWVhc3VyZSA9IHRleHRBZnRlckVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRha2VXaGlsZSh6ID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouTmFtZSAhPSBXLnRhYiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Lk5hbWUgIT0gVy5iciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Lk5hbWUgIT0gVy5jcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0QWZ0ZXJUYWIgPSB0ZXh0RWxlbWVudHNUb01lYXN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoeiA9PiB6Lk5hbWUgPT0gVy50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QodCA9PiAoc3RyaW5nKXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0QWZ0ZXJUYWIuQ29udGFpbnMoIi4iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFudGlzc2EgPSB0ZXh0QWZ0ZXJUYWIuU3BsaXQoJy4nKVswXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdW1teVJ1bjQgPSBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250TmFtZUF0dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQ29udGFpbmluZ1RhYlRvUmVwbGFjZS5FbGVtZW50cyhXLnJQciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnQsIG1hbnRpc3NhKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGhPZk1hbnRpc3NhID0gQ2FsY1dpZHRoT2ZSdW5JblR3aXBzKGR1bW15UnVuNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbHRhMiA9IChpbnQpdGFiQWZ0ZXJUZXh0LkF0dHJpYnV0ZShXLnBvcykgLSB3aWR0aE9mTWFudGlzc2EgLSB0d2lwQ291bnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5BZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFB0T3BlblhtbC5UYWJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoTnVtYmVyRm9ybWF0SW5mby5JbnZhcmlhbnRJbmZvLCAiezA6MC4wMDB9IiwgKGRlY2ltYWwpZGVsdGEyIC8gMTQ0MG0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGVhZGVyKHRhYkFmdGVyVGV4dCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlY2ltcyA9IHRleHRBZnRlclRhYi5TdWJzdHJpbmcodGV4dEFmdGVyVGFiLkluZGV4T2YoJy4nKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtbXlSdW40ID0gbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udE5hbWVBdHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkNvbnRhaW5pbmdUYWJUb1JlcGxhY2UuRWxlbWVudHMoVy5yUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50LCBkZWNpbXMpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aWR0aE9mRGVjaW1zID0gQ2FsY1dpZHRoT2ZSdW5JblR3aXBzKGR1bW15UnVuNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdpcENvdW50ZXIgPSBNYXRoLk1heCgoaW50KXRhYkFmdGVyVGV4dC5BdHRyaWJ1dGUoVy5wb3MpICsgd2lkdGhPZkRlY2ltcywgdHdpcENvdW50ZXIgKyB3aWR0aE9mTWFudGlzc2EgKyB3aWR0aE9mRGVjaW1zKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYXN0RWxlbWVudCA9IHRleHRFbGVtZW50c1RvTWVhc3VyZS5MYXN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RFbGVtZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyB3ZSdyZSBkb25lCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudElkeCA9IEFycmF5LkluZGV4T2YoY29udGVudFRvTWVhc3VyZSwgbGFzdEVsZW1lbnQpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnRJZHggPj0gY29udGVudFRvTWVhc3VyZS5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyB3ZSdyZSBkb25lCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHVtbXlSdW4yID0gbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udE5hbWVBdHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkNvbnRhaW5pbmdUYWJUb1JlcGxhY2UuRWxlbWVudHMoVy5yUHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50LCB0ZXh0QWZ0ZXJUYWIpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aWR0aE9mVGV4dEFmdGVyVGFiID0gQ2FsY1dpZHRoT2ZSdW5JblR3aXBzKGR1bW15UnVuMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbHRhMiA9IChpbnQpdGFiQWZ0ZXJUZXh0LkF0dHJpYnV0ZShXLnBvcykgLSB3aWR0aE9mVGV4dEFmdGVyVGFiIC0gdHdpcENvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhMiA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhMiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuQWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuVGFiV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywgInswOjAuMDAwfSIsIChkZWNpbWFsKWRlbHRhMiAvIDE0NDBtKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExlYWRlcih0YWJBZnRlclRleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d2lwQ291bnRlciA9IE1hdGguTWF4KChpbnQpdGFiQWZ0ZXJUZXh0LkF0dHJpYnV0ZShXLnBvcyksIHR3aXBDb3VudGVyICsgd2lkdGhPZlRleHRBZnRlclRhYik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdEVsZW1lbnQgPSB0ZXh0RWxlbWVudHNUb01lYXN1cmUuTGFzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0RWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gd2UncmUgZG9uZQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRJZHggPSBBcnJheS5JbmRleE9mKGNvbnRlbnRUb01lYXN1cmUsIGxhc3RFbGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50SWR4ID49IGNvbnRlbnRUb01lYXN1cmUuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gd2UncmUgZG9uZQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJpbmcpdGFiQWZ0ZXJUZXh0LkF0dHJpYnV0ZShXLnZhbCkgPT0gImNlbnRlciIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0QWZ0ZXJFbGVtZW50cyA9IGNvbnRlbnRUb01lYXN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2tpcChjdXJyZW50RWxlbWVudElkeCArIDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIGFsbCB0aGUgY29udGVudCB1bnRpbCBhbm90aGVyIHRhYiwgYnIsIG9yIGNyCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dEVsZW1lbnRzVG9NZWFzdXJlID0gdGV4dEFmdGVyRWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVGFrZVdoaWxlKHogPT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgei5OYW1lICE9IFcudGFiICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouTmFtZSAhPSBXLmJyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouTmFtZSAhPSBXLmNyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHRBZnRlclRhYiA9IHRleHRFbGVtZW50c1RvTWVhc3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZSh6ID0+IHouTmFtZSA9PSBXLnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdCh0ID0+IChzdHJpbmcpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1bW15UnVuNCA9IG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udE5hbWVBdHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQ29udGFpbmluZ1RhYlRvUmVwbGFjZS5FbGVtZW50cyhXLnJQciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudCwgdGV4dEFmdGVyVGFiKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aWR0aE9mVGV4dCA9IENhbGNXaWR0aE9mUnVuSW5Ud2lwcyhkdW1teVJ1bjQpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbHRhMiA9IChpbnQpdGFiQWZ0ZXJUZXh0LkF0dHJpYnV0ZShXLnBvcykgLSAod2lkdGhPZlRleHQgLyAyKSAtIHR3aXBDb3VudGVyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhMiA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LkFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuVGFiV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoTnVtYmVyRm9ybWF0SW5mby5JbnZhcmlhbnRJbmZvLCAiezA6MC4wMDB9IiwgKGRlY2ltYWwpZGVsdGEyIC8gMTQ0MG0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRMZWFkZXIodGFiQWZ0ZXJUZXh0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0d2lwQ291bnRlciA9IE1hdGguTWF4KChpbnQpdGFiQWZ0ZXJUZXh0LkF0dHJpYnV0ZShXLnBvcykgKyB3aWR0aE9mVGV4dCAvIDIsIHR3aXBDb3VudGVyICsgd2lkdGhPZlRleHQpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdEVsZW1lbnQgPSB0ZXh0RWxlbWVudHNUb01lYXN1cmUuTGFzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RFbGVtZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIHdlJ3JlIGRvbmUKKworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRJZHggPSBBcnJheS5JbmRleE9mKGNvbnRlbnRUb01lYXN1cmUsIGxhc3RFbGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnRJZHggPj0gY29udGVudFRvTWVhc3VyZS5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIHdlJ3JlIGRvbmUKKworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhYlZhbCA9PSAibGVmdCIgfHwgdGFiVmFsID09ICJzdGFydCIgfHwgdGFiVmFsID09ICJudW0iKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsdGEgPSAoaW50KXRhYkFmdGVyVGV4dC5BdHRyaWJ1dGUoVy5wb3MpIC0gdHdpcENvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5BZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLlRhYldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywgInswOjAuMDAwfSIsIChkZWNpbWFsKWRlbHRhIC8gMTQ0MG0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRMZWFkZXIodGFiQWZ0ZXJUZXh0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0d2lwQ291bnRlciA9IChpbnQpdGFiQWZ0ZXJUZXh0LkF0dHJpYnV0ZShXLnBvcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50SWR4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnRJZHggPj0gY29udGVudFRvTWVhc3VyZS5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIHdlJ3JlIGRvbmUKKworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuTmFtZSA9PSBXLnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXZpc2l0LiBUaGlzIGlzIGEgcXVpY2sgZml4IGJlY2F1c2UgaXQgZG9lc24ndCB3b3JrIG9uIEF6dXJlLgorICAgICAgICAgICAgICAgICAgICAvLyBHaXZlbiB0aGUgY2hhbmdlcyB3ZSd2ZSBtYWRlIGVsc2V3aGVyZSwgdGhvdWdoLCB0aGlzIGlzIG5vdCByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIGZpcnN0IHRhYiBhdCBsZWFzdC4gV2UgY291bGQgYWxzbyBlbmhhbmNlIHRoYXQgb3RoZXIgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIGRlYWwgd2l0aCBhbGwgdGFicy4KKyAgICAgICAgICAgICAgICAgICAgLy92YXIgcnVuQ29udGFpbmluZ1RhYlRvUmVwbGFjZSA9IGN1cnJlbnRFbGVtZW50LlBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgLy92YXIgcGFyYWdyYXBoRm9yUnVuID0gcnVuQ29udGFpbmluZ1RhYlRvUmVwbGFjZS5BbmNlc3RvcnMoVy5wKS5GaXJzdCgpOworICAgICAgICAgICAgICAgICAgICAvL3ZhciBmb250TmFtZUF0dCA9IHJ1bkNvbnRhaW5pbmdUYWJUb1JlcGxhY2UuQXR0cmlidXRlKFB0T3BlblhtbC5Gb250TmFtZSkgPz8KKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICBwYXJhZ3JhcGhGb3JSdW4uQXR0cmlidXRlKFB0T3BlblhtbC5Gb250TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIC8vdmFyIGxhbmd1YWdlVHlwZUF0dCA9IHJ1bkNvbnRhaW5pbmdUYWJUb1JlcGxhY2UuQXR0cmlidXRlKFB0T3BlblhtbC5MYW5ndWFnZVR5cGUpID8/CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaEZvclJ1bi5BdHRyaWJ1dGUoUHRPcGVuWG1sLkxhbmd1YWdlVHlwZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy92YXIgZHVtbXlSdW4zID0gbmV3IFhFbGVtZW50KFcuciwgZm9udE5hbWVBdHQsIGxhbmd1YWdlVHlwZUF0dCwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgcnVuQ29udGFpbmluZ1RhYlRvUmVwbGFjZS5FbGVtZW50cyhXLnJQciksCisgICAgICAgICAgICAgICAgICAgIC8vICAgIGN1cnJlbnRFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgLy92YXIgd2lkdGhPZlRleHQgPSBDYWxjV2lkdGhPZlJ1bkluVHdpcHMoZHVtbXlSdW4zKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHdpZHRoT2ZUZXh0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuQWRkKG5ldyBYQXR0cmlidXRlKFB0T3BlblhtbC5UYWJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoTnVtYmVyRm9ybWF0SW5mby5JbnZhcmlhbnRJbmZvLCAiezA6MC4wMDB9IiwgKGRlY2ltYWwpIHdpZHRoT2ZUZXh0LzE0NDBtKSkpOworICAgICAgICAgICAgICAgICAgICB0d2lwQ291bnRlciArPSB3aWR0aE9mVGV4dDsKKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudElkeCsrOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnRJZHggPj0gY29udGVudFRvTWVhc3VyZS5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gd2UncmUgZG9uZQorCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50SWR4Kys7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50SWR4ID49IGNvbnRlbnRUb01lYXN1cmUuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gd2UncmUgZG9uZQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICBlbGVtZW50LkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gQ2FsY3VsYXRlU3BhbldpZHRoVHJhbnNmb3JtKG4sIGRlZmF1bHRUYWJTdG9wKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEF0dHJpYnV0ZSBHZXRMZWFkZXIoWEVsZW1lbnQgdGFiQWZ0ZXJUZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbGVhZGVyID0gKHN0cmluZyl0YWJBZnRlclRleHQuQXR0cmlidXRlKFcubGVhZGVyKTsKKyAgICAgICAgICAgIGlmIChsZWFkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuTGVhZGVyLCBsZWFkZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgQWRkRGVmYXVsdFRhYnNBZnRlckxhc3RUYWIoWEVsZW1lbnQgdGFicywgaW50IGRlZmF1bHRUYWJTdG9wKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbGFzdFRhYkVsZW1lbnQgPSB0YWJzCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcudGFiKQorICAgICAgICAgICAgICAgIC5XaGVyZSh0ID0+IChzdHJpbmcpdC5BdHRyaWJ1dGUoVy52YWwpICE9ICJjbGVhciIgJiYgKHN0cmluZyl0LkF0dHJpYnV0ZShXLnZhbCkgIT0gImJhciIpCisgICAgICAgICAgICAgICAgLk9yZGVyQnkodCA9PiAoaW50KXQuQXR0cmlidXRlKFcucG9zKSkKKyAgICAgICAgICAgICAgICAuTGFzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGxhc3RUYWJFbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRUYWJTdG9wID09IDApCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUYWJTdG9wID0gNzIwOworICAgICAgICAgICAgICAgIHZhciByYW5nZVN0YXJ0ID0gKGludClsYXN0VGFiRWxlbWVudC5BdHRyaWJ1dGUoVy5wb3MpIC8gZGVmYXVsdFRhYlN0b3AgKyAxOworICAgICAgICAgICAgICAgIHZhciB0ZW1wVGFicyA9IG5ldyBYRWxlbWVudChXLnRhYnMsCisgICAgICAgICAgICAgICAgICAgIHRhYnMuRWxlbWVudHMoKS5XaGVyZSh0ID0+IChzdHJpbmcpdC5BdHRyaWJ1dGUoVy52YWwpICE9ICJjbGVhciIgJiYgKHN0cmluZyl0LkF0dHJpYnV0ZShXLnZhbCkgIT0gImJhciIpLAorICAgICAgICAgICAgICAgICAgICBFbnVtZXJhYmxlLlJhbmdlKHJhbmdlU3RhcnQsIDEwMCkKKyAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChyID0+IG5ldyBYRWxlbWVudChXLnRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcudmFsLCAibGVmdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5wb3MsIHIgKiBkZWZhdWx0VGFiU3RvcCkpKSk7CisgICAgICAgICAgICAgICAgdGVtcFRhYnMgPSBuZXcgWEVsZW1lbnQoVy50YWJzLAorICAgICAgICAgICAgICAgICAgICB0ZW1wVGFicy5FbGVtZW50cygpLk9yZGVyQnkodCA9PiAoaW50KXQuQXR0cmlidXRlKFcucG9zKSkpOworICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wVGFiczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YWJzID0gbmV3IFhFbGVtZW50KFcudGFicywKKyAgICAgICAgICAgICAgICAgICAgRW51bWVyYWJsZS5SYW5nZSgxLCAxMDApCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QociA9PiBuZXcgWEVsZW1lbnQoVy50YWIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgImxlZnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcucG9zLCByICogZGVmYXVsdFRhYlN0b3ApKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRhYnM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBIYXNoU2V0PHN0cmluZz4gVW5rbm93bkZvbnRzID0gbmV3IEhhc2hTZXQ8c3RyaW5nPigpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBIYXNoU2V0PHN0cmluZz4gX2tub3duRmFtaWxpZXM7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaFNldDxzdHJpbmc+IEtub3duRmFtaWxpZXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9rbm93bkZhbWlsaWVzID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfa25vd25GYW1pbGllcyA9IG5ldyBIYXNoU2V0PHN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZhbWlsaWVzID0gRm9udEZhbWlseS5GYW1pbGllczsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZhbSBpbiBmYW1pbGllcykKKyAgICAgICAgICAgICAgICAgICAgICAgIF9rbm93bkZhbWlsaWVzLkFkZChmYW0uTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfa25vd25GYW1pbGllczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBDYWxjV2lkdGhPZlJ1bkluVHdpcHMoWEVsZW1lbnQgcikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZvbnROYW1lID0gKHN0cmluZylyLkF0dHJpYnV0ZShQdE9wZW5YbWwucHQgKyAiRm9udE5hbWUiKSA/PworICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZylyLkFuY2VzdG9ycyhXLnApLkZpcnN0KCkuQXR0cmlidXRlKFB0T3BlblhtbC5wdCArICJGb250TmFtZSIpOworICAgICAgICAgICAgaWYgKGZvbnROYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvciwgc2hvdWxkIGhhdmUgRm9udE5hbWUgYXR0cmlidXRlIik7CisgICAgICAgICAgICBpZiAoVW5rbm93bkZvbnRzLkNvbnRhaW5zKGZvbnROYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgdmFyIHJQciA9IHIuRWxlbWVudChXLnJQcik7CisgICAgICAgICAgICBpZiAoclByID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvciwgc2hvdWxkIGhhdmUgcnVuIHByb3BlcnRpZXMiKTsKKworICAgICAgICAgICAgdmFyIHN6ID0gR2V0Rm9udFNpemUocikgPz8gMjJtOworCisgICAgICAgICAgICAvLyB1bmtub3duIGZvbnQgZmFtaWxpZXMgd2lsbCB0aHJvdyBBcmd1bWVudEV4Y2VwdGlvbiwgaW4gd2hpY2ggY2FzZSBqdXN0IHJldHVybiAwCisgICAgICAgICAgICBpZiAoIUtub3duRmFtaWxpZXMuQ29udGFpbnMoZm9udE5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAvLyBpbiB0aGVvcnksIGFsbCB1bmtub3duIGZvbnRzIGFyZSBmb3VuZCBieSB0aGUgYWJvdmUgdGVzdCwgYnV0IGlmIG5vdC4uLgorICAgICAgICAgICAgRm9udEZhbWlseSBmZjsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZmID0gbmV3IEZvbnRGYW1pbHkoZm9udE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEFyZ3VtZW50RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVua25vd25Gb250cy5BZGQoZm9udE5hbWUpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBmcyA9IEZvbnRTdHlsZS5SZWd1bGFyOworICAgICAgICAgICAgaWYgKEdldEJvb2xQcm9wKHJQciwgVy5iKSB8fCBHZXRCb29sUHJvcChyUHIsIFcuYkNzKSkKKyAgICAgICAgICAgICAgICBmcyB8PSBGb250U3R5bGUuQm9sZDsKKyAgICAgICAgICAgIGlmIChHZXRCb29sUHJvcChyUHIsIFcuaSkgfHwgR2V0Qm9vbFByb3AoclByLCBXLmlDcykpCisgICAgICAgICAgICAgICAgZnMgfD0gRm9udFN0eWxlLkl0YWxpYzsKKworICAgICAgICAgICAgLy8gQXBwZW5kZWQgYmxhbmsgYXMgYSBxdWljayBmaXggdG8gYWNjb21tb2RhdGUgJm5ic3A7IHRoYXQgd2lsbCBnZXQKKyAgICAgICAgICAgIC8vIGFwcGVuZGVkIHRvIHNvbWUgbGF5b3V0LWNyaXRpY2FsIHJ1bnMgc3VjaCBhcyBsaXN0IGl0ZW0gbnVtYmVycy4KKyAgICAgICAgICAgIC8vIEluIHNvbWUgY2FzZXMsIHRoaXMgbWlnaHQgbm90IGJlIHJlcXVpcmVkIG9yIGV2ZW4gd3JvbmcsIHNvIHRoaXMKKyAgICAgICAgICAgIC8vIG11c3QgYmUgcmV2aXNpdGVkLgorICAgICAgICAgICAgLy8gVE9ETzogUmV2aXNpdC4KKyAgICAgICAgICAgIHZhciBydW5UZXh0ID0gci5EZXNjZW5kYW50c1RyaW1tZWQoVy50eGJ4Q29udGVudCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgPT0gVy50KQorICAgICAgICAgICAgICAgIC5TZWxlY3QodCA9PiAoc3RyaW5nKSB0KQorICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZSgpICsgIiAiOworCisgICAgICAgICAgICB2YXIgdGFiTGVuZ3RoID0gci5EZXNjZW5kYW50c1RyaW1tZWQoVy50eGJ4Q29udGVudCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgPT0gVy50YWIpCisgICAgICAgICAgICAgICAgLlNlbGVjdCh0ID0+IChkZWNpbWFsKXQuQXR0cmlidXRlKFB0T3BlblhtbC5UYWJXaWR0aCkpCisgICAgICAgICAgICAgICAgLlN1bSgpOworCisgICAgICAgICAgICBpZiAocnVuVGV4dC5MZW5ndGggPT0gMCAmJiB0YWJMZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgaW50IG11bHRpcGxpZXIgPSAxOworICAgICAgICAgICAgaWYgKHJ1blRleHQuTGVuZ3RoIDw9IDIpCisgICAgICAgICAgICAgICAgbXVsdGlwbGllciA9IDEwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJ1blRleHQuTGVuZ3RoIDw9IDQpCisgICAgICAgICAgICAgICAgbXVsdGlwbGllciA9IDUwOworICAgICAgICAgICAgZWxzZSBpZiAocnVuVGV4dC5MZW5ndGggPD0gOCkKKyAgICAgICAgICAgICAgICBtdWx0aXBsaWVyID0gMjU7CisgICAgICAgICAgICBlbHNlIGlmIChydW5UZXh0Lkxlbmd0aCA8PSAxNikKKyAgICAgICAgICAgICAgICBtdWx0aXBsaWVyID0gMTI7CisgICAgICAgICAgICBlbHNlIGlmIChydW5UZXh0Lkxlbmd0aCA8PSAzMikKKyAgICAgICAgICAgICAgICBtdWx0aXBsaWVyID0gNjsKKyAgICAgICAgICAgIGlmIChtdWx0aXBsaWVyICE9IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdWx0aXBsaWVyOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChydW5UZXh0KTsKKyAgICAgICAgICAgICAgICBydW5UZXh0ID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKEZvbnQgZiA9IG5ldyBGb250KGZmLCAoZmxvYXQpIHN6LzJmLCBmcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXh0Rm9ybWF0RmxhZ3MgdGZmID0gVGV4dEZvcm1hdEZsYWdzLk5vUGFkZGluZzsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3Bvc2VkU2l6ZSA9IG5ldyBTaXplKGludC5NYXhWYWx1ZSwgaW50Lk1heFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNmID0gVGV4dFJlbmRlcmVyLk1lYXN1cmVUZXh0KHJ1blRleHQsIGYsIHByb3Bvc2VkU2l6ZSwgdGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNmIHJldHVybnMgc2l6ZSBpbiBwaXhlbHMKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjaW1hbCBkcGkgPSA5Nm07CisgICAgICAgICAgICAgICAgICAgIHZhciB0d2lwID0gKGludCkgKCgoc2YuV2lkdGgvZHBpKSoxNDQwbSkvbXVsdGlwbGllciArIHRhYkxlbmd0aCoxNDQwbSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0d2lwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChBcmd1bWVudEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvbnRTdHlsZSBmczIgPSBGb250U3R5bGUuUmVndWxhcjsKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKEZvbnQgZiA9IG5ldyBGb250KGZmLCAoZmxvYXQpIHN6LzJmLCBmczIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXh0Rm9ybWF0RmxhZ3MgdGZmID0gVGV4dEZvcm1hdEZsYWdzLk5vUGFkZGluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wb3NlZFNpemUgPSBuZXcgU2l6ZShpbnQuTWF4VmFsdWUsIGludC5NYXhWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2YgPSBUZXh0UmVuZGVyZXIuTWVhc3VyZVRleHQocnVuVGV4dCwgZiwgcHJvcG9zZWRTaXplLCB0ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNmIHJldHVybnMgc2l6ZSBpbiBwaXhlbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY2ltYWwgZHBpID0gOTZtOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHR3aXAgPSAoaW50KSAoKChzZi5XaWR0aC9kcGkpKjE0NDBtKS9tdWx0aXBsaWVyICsgdGFiTGVuZ3RoKjE0NDBtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0d2lwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChBcmd1bWVudEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvbnRTdHlsZSBmczIgPSBGb250U3R5bGUuQm9sZDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgZiA9IG5ldyBGb250KGZmLCAoZmxvYXQpIHN6LzJmLCBmczIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRleHRGb3JtYXRGbGFncyB0ZmYgPSBUZXh0Rm9ybWF0RmxhZ3MuTm9QYWRkaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wb3NlZFNpemUgPSBuZXcgU2l6ZShpbnQuTWF4VmFsdWUsIGludC5NYXhWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNmID0gVGV4dFJlbmRlcmVyLk1lYXN1cmVUZXh0KHJ1blRleHQsIGYsIHByb3Bvc2VkU2l6ZSwgdGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2YgcmV0dXJucyBzaXplIGluIHBpeGVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY2ltYWwgZHBpID0gOTZtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0d2lwID0gKGludCkgKCgoc2YuV2lkdGgvZHBpKSoxNDQwbSkvbXVsdGlwbGllciArIHRhYkxlbmd0aCoxNDQwbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR3aXA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEFyZ3VtZW50RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBib3RoIHJlZ3VsYXIgYW5kIGJvbGQgZmFpbCwgdGhlbiBnZXQgbWV0cmljcyBmb3IgVGltZXMgTmV3IFJvbWFuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIG9yaWdpbmFsIEZvbnRTdHlsZSAoaW4gZnMpCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmYyID0gbmV3IEZvbnRGYW1pbHkoIlRpbWVzIE5ldyBSb21hbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBmID0gbmV3IEZvbnQoZmYyLCAoZmxvYXQpIHN6LzJmLCBmcykpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGV4dEZvcm1hdEZsYWdzIHRmZiA9IFRleHRGb3JtYXRGbGFncy5Ob1BhZGRpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3Bvc2VkU2l6ZSA9IG5ldyBTaXplKGludC5NYXhWYWx1ZSwgaW50Lk1heFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2YgPSBUZXh0UmVuZGVyZXIuTWVhc3VyZVRleHQocnVuVGV4dCwgZiwgcHJvcG9zZWRTaXplLCB0ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZiByZXR1cm5zIHNpemUgaW4gcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjaW1hbCBkcGkgPSA5Nm07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHR3aXAgPSAoaW50KSAoKChzZi5XaWR0aC9kcGkpKjE0NDBtKS9tdWx0aXBsaWVyICsgdGFiTGVuZ3RoKjE0NDBtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHdpcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChPdmVyZmxvd0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGhhcHBlbmVkIG9uIEF6dXJlIGJ1dCBpbnRlcmVzdGluZ2x5IGVub3VnaCBub3Qgd2hpbGUgdGVzdGluZyBsb2NhbGx5LgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBJbnNlcnRBcHByb3ByaWF0ZU5vbmJyZWFraW5nU3BhY2VzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gd29yZERvYy5Db250ZW50UGFydHMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcHhkID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IHB4ZC5Sb290OworICAgICAgICAgICAgICAgIGlmIChyb290ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgICAgIHZhciBuZXdSb290ID0gKFhFbGVtZW50KUluc2VydEFwcHJvcHJpYXRlTm9uYnJlYWtpbmdTcGFjZXNUcmFuc2Zvcm0ocm9vdCk7CisgICAgICAgICAgICAgICAgcm9vdC5SZXBsYWNlV2l0aChuZXdSb290KTsKKyAgICAgICAgICAgICAgICBwYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm9uLWJyZWFraW5nIHNwYWNlcyBhcmUgbm90IHJlcXVpcmVkIGlmIHdlIHVzZSBhcHByb3ByaWF0ZSBDU1MsIGkuZS4sICJ3aGl0ZS1zcGFjZTogcHJlLXdyYXA7Ii4KKyAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGVtcHR5IHc6cCBlbGVtZW50cyBhcmUgdHJhbnNsYXRlZCBpbnRvIG5vbi1lbXB0eSBoOnAgZWxlbWVudHMsCisgICAgICAgIC8vIGJlY2F1c2UgZW1wdHkgaDpwIGVsZW1lbnRzIHdvdWxkIGJlIGlnbm9yZWQgYnkgYnJvd3NlcnMuCisgICAgICAgIC8vIEZ1cnRoZXIsIGluIGFkZGl0aW9uIHRvIG5vdCBiZWluZyByZXF1aXJlZCwgbm9uLWJyZWFraW5nIHNwYWNlcyB3b3VsZCBjaGFuZ2UgdGhlIGxheW91dCBiZWhhdmlvcgorICAgICAgICAvLyBvZiBzcGFucyBoYXZpbmcgY29uc2VjdXRpdmUgc3BhY2VzLiBUaGVyZWZvcmUsIGF2b2lkaW5nIG5vbi1icmVha2luZyBzcGFjZXMgaGFzIHRoZSBhZGRpdGlvbmFsCisgICAgICAgIC8vIGJlbmVmaXQgb2YgbGVhZGluZyB0byBhIG1vcmUgZmFpdGhmdWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIFdvcmQgZG9jdW1lbnQgaW4gSFRNTC4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IEluc2VydEFwcHJvcHJpYXRlTm9uYnJlYWtpbmdTcGFjZXNUcmFuc2Zvcm0oWE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IG5vZGUgYXMgWEVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNoaWxkIGNvbnRlbnQgb2YgcnVuIHRvIGxvb2sgZm9yCisgICAgICAgICAgICAgICAgLy8gVy5icgorICAgICAgICAgICAgICAgIC8vIFcuY3IKKyAgICAgICAgICAgICAgICAvLyBXLmRheUxvbmcKKyAgICAgICAgICAgICAgICAvLyBXLmRheVNob3J0CisgICAgICAgICAgICAgICAgLy8gVy5kcmF3aW5nCisgICAgICAgICAgICAgICAgLy8gVy5tb250aExvbmcKKyAgICAgICAgICAgICAgICAvLyBXLm1vbnRoU2hvcnQKKyAgICAgICAgICAgICAgICAvLyBXLm5vQnJlYWtIeXBoZW4KKyAgICAgICAgICAgICAgICAvLyBXLm9iamVjdAorICAgICAgICAgICAgICAgIC8vIFcucGdOdW0KKyAgICAgICAgICAgICAgICAvLyBXLnBUYWIKKyAgICAgICAgICAgICAgICAvLyBXLnNlcGFyYXRvcgorICAgICAgICAgICAgICAgIC8vIFcuc29mdEh5cGhlbgorICAgICAgICAgICAgICAgIC8vIFcuc3ltCisgICAgICAgICAgICAgICAgLy8gVy50CisgICAgICAgICAgICAgICAgLy8gVy50YWIKKyAgICAgICAgICAgICAgICAvLyBXLnllYXJMb25nCisgICAgICAgICAgICAgICAgLy8gVy55ZWFyU2hvcnQKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcucCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zbGF0ZSBlbXB0eSBwYXJhZ3JhcGhzIHRvIHBhcmFncmFwaHMgaGF2aW5nIG9uZSBydW4gd2l0aAorICAgICAgICAgICAgICAgICAgICAvLyBhIG5vcm1hbCBzcGFjZS4gQSBub24tYnJlYWtpbmcgc3BhY2UsIGkuZS4sIFx4MDBBMCwgaXMgbm90CisgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmVkIGlmIHdlIHVzZSBhcHByb3ByaWF0ZSBDU1MuCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzQ29udGVudCA9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoZSA9PiBlLk5hbWUgIT0gVy5wUHIpCisgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNBbmRTZWxmKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5BbnkoZSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLmRheUxvbmcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLk5hbWUgPT0gVy5kYXlTaG9ydCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLmRyYXdpbmcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLk5hbWUgPT0gVy5tb250aExvbmcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLk5hbWUgPT0gVy5tb250aFNob3J0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5OYW1lID09IFcubm9CcmVha0h5cGhlbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLl9vYmplY3QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLk5hbWUgPT0gVy5wZ051bSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLnB0YWIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLk5hbWUgPT0gVy5zZXBhcmF0b3IgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLk5hbWUgPT0gVy5zb2Z0SHlwaGVuIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5OYW1lID09IFcuc3ltIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5OYW1lID09IFcudCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLnRhYiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuTmFtZSA9PSBXLnllYXJMb25nIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5OYW1lID09IFcueWVhclNob3J0CisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQ29udGVudCA9PSBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoZWxlbWVudC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBJbnNlcnRBcHByb3ByaWF0ZU5vbmJyZWFraW5nU3BhY2VzVHJhbnNmb3JtKG4pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LkVsZW1lbnRzKFcucFByKS5FbGVtZW50cyhXLnJQciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnQsICIgIikpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBJbnNlcnRBcHByb3ByaWF0ZU5vbmJyZWFraW5nU3BhY2VzVHJhbnNmb3JtKG4pKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgU2VjdGlvbkFubm90YXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFhFbGVtZW50IFNlY3Rpb25FbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBbm5vdGF0ZUZvclNlY3Rpb25zKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHhkID0gd29yZERvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICB2YXIgZG9jdW1lbnQgPSB4ZC5Sb290OworICAgICAgICAgICAgaWYgKGRvY3VtZW50ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgdmFyIGJvZHkgPSBkb2N1bWVudC5FbGVtZW50KFcuYm9keSk7CisgICAgICAgICAgICBpZiAoYm9keSA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIC8vIG1vdmUgbGFzdCBzZWN0UHIgaW50byBsYXN0IHBhcmFncmFwaAorICAgICAgICAgICAgdmFyIGxhc3RTZWN0UHIgPSBib2R5LkVsZW1lbnRzKFcuc2VjdFByKS5MYXN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAobGFzdFNlY3RQciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsYXN0IHRoaW5nIGluIHRoZSBkb2N1bWVudCBpcyBhIHRhYmxlLCBXb3JkIHdpbGwgYWx3YXlzIGluc2VydCBhIHBhcmFncmFwaCBmb2xsb3dpbmcgdGhhdC4KKyAgICAgICAgICAgICAgICB2YXIgbGFzdFBhcmEgPSBib2R5CisgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50c1RyaW1tZWQoVy50eGJ4Q29udGVudCkKKyAgICAgICAgICAgICAgICAgICAgLkxhc3RPckRlZmF1bHQocCA9PiBwLk5hbWUgPT0gVy5wKTsKKworICAgICAgICAgICAgICAgIGlmIChsYXN0UGFyYSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RQYXJhUHJvcHMgPSBsYXN0UGFyYS5FbGVtZW50KFcucFByKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXJhUHJvcHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQYXJhUHJvcHMuQWRkKGxhc3RTZWN0UHIpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UGFyYS5BZGQobmV3IFhFbGVtZW50KFcucFByLCBsYXN0U2VjdFByKSk7CisKKyAgICAgICAgICAgICAgICAgICAgbGFzdFNlY3RQci5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZXZlcnNlRGVzY2VuZGFudHMgPSB4ZC5EZXNjZW5kYW50cygpLlJldmVyc2UoKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIHZhciBjdXJyZW50U2VjdGlvbiA9IEluaXRpYWxpemVTZWN0aW9uQW5ub3RhdGlvbihyZXZlcnNlRGVzY2VuZGFudHMpOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZCBpbiByZXZlcnNlRGVzY2VuZGFudHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGQuTmFtZSA9PSBXLnNlY3RQcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkLkF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInciKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgZC5BZGQobmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3IiwgVy53KSk7CisKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlY3Rpb24gPSBuZXcgU2VjdGlvbkFubm90YXRpb24oKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uRWxlbWVudCA9IGQKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkLkFkZEFubm90YXRpb24oY3VycmVudFNlY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU2VjdGlvbkFubm90YXRpb24gSW5pdGlhbGl6ZVNlY3Rpb25Bbm5vdGF0aW9uKElFbnVtZXJhYmxlPFhFbGVtZW50PiByZXZlcnNlRGVzY2VuZGFudHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjdXJyZW50U2VjdGlvbiA9IG5ldyBTZWN0aW9uQW5ub3RhdGlvbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2VjdGlvbkVsZW1lbnQgPSByZXZlcnNlRGVzY2VuZGFudHMuRmlyc3RPckRlZmF1bHQoZSA9PiBlLk5hbWUgPT0gVy5zZWN0UHIpCisgICAgICAgICAgICB9OworICAgICAgICAgICAgaWYgKGN1cnJlbnRTZWN0aW9uLlNlY3Rpb25FbGVtZW50ICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICBjdXJyZW50U2VjdGlvbi5TZWN0aW9uRWxlbWVudC5BdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3IikgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjdXJyZW50U2VjdGlvbi5TZWN0aW9uRWxlbWVudC5BZGQobmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3IiwgVy53KSk7CisKKyAgICAgICAgICAgIC8vIHRvZG8gd2hhdCBzaG91bGQgdGhlIGRlZmF1bHQgc2VjdGlvbiBwcm9wcyBiZT8KKyAgICAgICAgICAgIGlmIChjdXJyZW50U2VjdGlvbi5TZWN0aW9uRWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uID0gbmV3IFNlY3Rpb25Bbm5vdGF0aW9uKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25FbGVtZW50ID0gbmV3IFhFbGVtZW50KFcuc2VjdFByLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3IiwgVy53KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnBnU3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5fdywgMTIyNDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuaCwgMTU4NDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnBnTWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcudG9wLCAxNDQwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnJpZ2h0LCAxNDQwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmJvdHRvbSwgMTQ0MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5sZWZ0LCAxNDQwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmhlYWRlciwgNzIwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmZvb3RlciwgNzIwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmd1dHRlciwgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnNwYWNlLCA3MjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLmRvY0dyaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy5saW5lUGl0Y2gsIDM2MCkpKQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2VjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBDcmVhdGVCb3JkZXJEaXZzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYywgV21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MsIElFbnVtZXJhYmxlPFhFbGVtZW50PiBlbGVtZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzLkdyb3VwQWRqYWNlbnQoZSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBCZHIgPSBlLkVsZW1lbnRzKFcucFByKS5FbGVtZW50cyhXLnBCZHIpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQmRyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRTdHIgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kID0gZS5FbGVtZW50cyhXLnBQcikuRWxlbWVudHMoVy5pbmQpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kU3RyID0gaW5kLlRvU3RyaW5nKFNhdmVPcHRpb25zLkRpc2FibGVGb3JtYXR0aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwQmRyLlRvU3RyaW5nKFNhdmVPcHRpb25zLkRpc2FibGVGb3JtYXR0aW5nKSArIGluZFN0cjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5OYW1lID09IFcudGJsID8gInRhYmxlIiA6IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5TZWxlY3QoZyA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGcuS2V5ID09IHN0cmluZy5FbXB0eSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmplY3QpIEdyb3VwQW5kVmVydGljYWxseVNwYWNlTnVtYmVyZWRQYXJhZ3JhcGhzKHdvcmREb2MsIHNldHRpbmdzLCBnLCAwbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGcuS2V5ID09ICJ0YWJsZSIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnLlNlbGVjdChnYyA9PiBDb252ZXJ0VG9IdG1sVHJhbnNmb3JtKHdvcmREb2MsIHNldHRpbmdzLCBnYywgZmFsc2UsIDApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgcFByID0gZy5GaXJzdCgpLkVsZW1lbnRzKFcucFByKS5GaXJzdCgpOworICAgICAgICAgICAgICAgICAgICB2YXIgcEJkciA9IHBQci5FbGVtZW50KFcucEJkcik7CisgICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZSA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpOworICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZUJvcmRlclN0eWxlKHBCZHIsIFcudG9wLCBzdHlsZSwgQm9yZGVyVHlwZS5QYXJhZ3JhcGgpOworICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZUJvcmRlclN0eWxlKHBCZHIsIFcucmlnaHQsIHN0eWxlLCBCb3JkZXJUeXBlLlBhcmFncmFwaCk7CisgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlQm9yZGVyU3R5bGUocEJkciwgVy5ib3R0b20sIHN0eWxlLCBCb3JkZXJUeXBlLlBhcmFncmFwaCk7CisgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlQm9yZGVyU3R5bGUocEJkciwgVy5sZWZ0LCBzdHlsZSwgQm9yZGVyVHlwZS5QYXJhZ3JhcGgpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TWFyZ2luTGVmdCA9IDBtOworICAgICAgICAgICAgICAgICAgICB2YXIgaW5kID0gcFByLkVsZW1lbnQoVy5pbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZWZ0SW5JbmNoZXMgPSAoZGVjaW1hbD8pIGluZC5BdHRyaWJ1dGUoVy5sZWZ0KS8xNDQwbSA/PyAwOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhhbmdpbmdJbkluY2hlcyA9IC0oZGVjaW1hbD8pIGluZC5BdHRyaWJ1dGUoVy5oYW5naW5nKS8xNDQwbSA/PyAwOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1hcmdpbkxlZnQgPSBsZWZ0SW5JbmNoZXMgKyBoYW5naW5nSW5JbmNoZXM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZygibWFyZ2luLWxlZnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNYXJnaW5MZWZ0ID4gMG0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywgInswOjAuMDB9aW4iLCBjdXJyZW50TWFyZ2luTGVmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiMCIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRpdiA9IG5ldyBYRWxlbWVudChYaHRtbC5kaXYsCisgICAgICAgICAgICAgICAgICAgICAgICBHcm91cEFuZFZlcnRpY2FsbHlTcGFjZU51bWJlcmVkUGFyYWdyYXBocyh3b3JkRG9jLCBzZXR0aW5ncywgZywgY3VycmVudE1hcmdpbkxlZnQpKTsKKyAgICAgICAgICAgICAgICAgICAgZGl2LkFkZEFubm90YXRpb24oc3R5bGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGl2OworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBJRW51bWVyYWJsZTxvYmplY3Q+IEdyb3VwQW5kVmVydGljYWxseVNwYWNlTnVtYmVyZWRQYXJhZ3JhcGhzKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYywgV21sVG9IdG1sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MsCisgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gZWxlbWVudHMsIGRlY2ltYWwgY3VycmVudE1hcmdpbkxlZnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBncm91cGVkID0gZWxlbWVudHMKKyAgICAgICAgICAgICAgICAuR3JvdXBBZGphY2VudChlID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYWJzdHJhY3ROdW1JZCA9IChzdHJpbmcpZS5BdHRyaWJ1dGUoUHRPcGVuWG1sLnB0ICsgIkFic3RyYWN0TnVtSWQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFic3RyYWN0TnVtSWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAibnVtOiIgKyBhYnN0cmFjdE51bUlkOworICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dHVhbFNwYWNpbmcgPSBlLkVsZW1lbnRzKFcucFByKS5FbGVtZW50cyhXLmNvbnRleHR1YWxTcGFjaW5nKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dHVhbFNwYWNpbmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlTmFtZSA9IChzdHJpbmcpZS5FbGVtZW50cyhXLnBQcikuRWxlbWVudHMoVy5wU3R5bGUpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVOYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdHk6IiArIHN0eWxlTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgICAgICB2YXIgbmV3Q29udGVudCA9IGdyb3VwZWQKKyAgICAgICAgICAgICAgICAuU2VsZWN0KGcgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChnLktleSA9PSAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnLlNlbGVjdChlID0+IENvbnZlcnRUb0h0bWxUcmFuc2Zvcm0od29yZERvYywgc2V0dGluZ3MsIGUsIGZhbHNlLCBjdXJyZW50TWFyZ2luTGVmdCkpOworICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdCA9IGcuQ291bnQoKSAtIDE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnLlNlbGVjdCgoZSwgaSkgPT4gQ29udmVydFRvSHRtbFRyYW5zZm9ybSh3b3JkRG9jLCBzZXR0aW5ncywgZSwgaSAhPSBsYXN0LCBjdXJyZW50TWFyZ2luTGVmdCkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIChJRW51bWVyYWJsZTxvYmplY3Q+KW5ld0NvbnRlbnQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIEJvcmRlck1hcHBpbmdJbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgQ3NzTmFtZTsKKyAgICAgICAgICAgIHB1YmxpYyBkZWNpbWFsIENzc1NpemU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEaWN0aW9uYXJ5PHN0cmluZywgQm9yZGVyTWFwcGluZ0luZm8+IEJvcmRlclN0eWxlTWFwID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBCb3JkZXJNYXBwaW5nSW5mbz4oKQorICAgICAgICB7CisgICAgICAgICAgICB7ICJzaW5nbGUiLCBuZXcgQm9yZGVyTWFwcGluZ0luZm8oKSB7IENzc05hbWUgPSAic29saWQiLCBDc3NTaXplID0gMS4wbSB9fSwKKyAgICAgICAgICAgIHsgImRvdHRlZCIsIG5ldyBCb3JkZXJNYXBwaW5nSW5mbygpIHsgQ3NzTmFtZSA9ICJkb3R0ZWQiLCBDc3NTaXplID0gMS4wbSB9fSwKKyAgICAgICAgICAgIHsgImRhc2hTbWFsbEdhcCIsIG5ldyBCb3JkZXJNYXBwaW5nSW5mbygpIHsgQ3NzTmFtZSA9ICJkYXNoZWQiLCBDc3NTaXplID0gMS4wbSB9fSwKKyAgICAgICAgICAgIHsgImRhc2hlZCIsIG5ldyBCb3JkZXJNYXBwaW5nSW5mbygpIHsgQ3NzTmFtZSA9ICJkYXNoZWQiLCBDc3NTaXplID0gMS4wbSB9fSwKKyAgICAgICAgICAgIHsgImRvdERhc2giLCBuZXcgQm9yZGVyTWFwcGluZ0luZm8oKSB7IENzc05hbWUgPSAiZGFzaGVkIiwgQ3NzU2l6ZSA9IDEuMG0gfX0sCisgICAgICAgICAgICB7ICJkb3REb3REYXNoIiwgbmV3IEJvcmRlck1hcHBpbmdJbmZvKCkgeyBDc3NOYW1lID0gImRhc2hlZCIsIENzc1NpemUgPSAxLjBtIH19LAorICAgICAgICAgICAgeyAiZG91YmxlIiwgbmV3IEJvcmRlck1hcHBpbmdJbmZvKCkgeyBDc3NOYW1lID0gImRvdWJsZSIsIENzc1NpemUgPSAyLjVtIH19LAorICAgICAgICAgICAgeyAidHJpcGxlIiwgbmV3IEJvcmRlck1hcHBpbmdJbmZvKCkgeyBDc3NOYW1lID0gImRvdWJsZSIsIENzc1NpemUgPSAyLjVtIH19LAorICAgICAgICAgICAgeyAidGhpblRoaWNrU21hbGxHYXAiLCBuZXcgQm9yZGVyTWFwcGluZ0luZm8oKSB7IENzc05hbWUgPSAiZG91YmxlIiwgQ3NzU2l6ZSA9IDQuNW0gfX0sCisgICAgICAgICAgICB7ICJ0aGlja1RoaW5TbWFsbEdhcCIsIG5ldyBCb3JkZXJNYXBwaW5nSW5mbygpIHsgQ3NzTmFtZSA9ICJkb3VibGUiLCBDc3NTaXplID0gNC41bSB9fSwKKyAgICAgICAgICAgIHsgInRoaW5UaGlja1RoaW5TbWFsbEdhcCIsIG5ldyBCb3JkZXJNYXBwaW5nSW5mbygpIHsgQ3NzTmFtZSA9ICJkb3VibGUiLCBDc3NTaXplID0gNi4wbSB9fSwKKyAgICAgICAgICAgIHsgInRoaWNrVGhpbk1lZGl1bUdhcCIsIG5ldyBCb3JkZXJNYXBwaW5nSW5mbygpIHsgQ3NzTmFtZSA9ICJkb3VibGUiLCBDc3NTaXplID0gNi4wbSB9fSwKKyAgICAgICAgICAgIHsgInRoaW5UaGlja01lZGl1bUdhcCIsIG5ldyBCb3JkZXJNYXBwaW5nSW5mbygpIHsgQ3NzTmFtZSA9ICJkb3VibGUiLCBDc3NTaXplID0gNi4wbSB9fSwKKyAgICAgICAgICAgIHsgInRoaW5UaGlja1RoaW5NZWRpdW1HYXAiLCBuZXcgQm9yZGVyTWFwcGluZ0luZm8oKSB7IENzc05hbWUgPSAiZG91YmxlIiwgQ3NzU2l6ZSA9IDkuMG0gfX0sCisgICAgICAgICAgICB7ICJ0aGluVGhpY2tMYXJnZUdhcCIsIG5ldyBCb3JkZXJNYXBwaW5nSW5mbygpIHsgQ3NzTmFtZSA9ICJkb3VibGUiLCBDc3NTaXplID0gNS4yNW0gfX0sCisgICAgICAgICAgICB7ICJ0aGlja1RoaW5MYXJnZUdhcCIsIG5ldyBCb3JkZXJNYXBwaW5nSW5mbygpIHsgQ3NzTmFtZSA9ICJkb3VibGUiLCBDc3NTaXplID0gNS4yNW0gfX0sCisgICAgICAgICAgICB7ICJ0aGluVGhpY2tUaGluTGFyZ2VHYXAiLCBuZXcgQm9yZGVyTWFwcGluZ0luZm8oKSB7IENzc05hbWUgPSAiZG91YmxlIiwgQ3NzU2l6ZSA9IDkuMG0gfX0sCisgICAgICAgICAgICB7ICJ3YXZlIiwgbmV3IEJvcmRlck1hcHBpbmdJbmZvKCkgeyBDc3NOYW1lID0gInNvbGlkIiwgQ3NzU2l6ZSA9IDMuMG0gfX0sCisgICAgICAgICAgICB7ICJkb3VibGVXYXZlIiwgbmV3IEJvcmRlck1hcHBpbmdJbmZvKCkgeyBDc3NOYW1lID0gImRvdWJsZSIsIENzc1NpemUgPSA1LjI1bSB9fSwKKyAgICAgICAgICAgIHsgImRhc2hEb3RTdHJva2VkIiwgbmV3IEJvcmRlck1hcHBpbmdJbmZvKCkgeyBDc3NOYW1lID0gInNvbGlkIiwgQ3NzU2l6ZSA9IDMuMG0gfX0sCisgICAgICAgICAgICB7ICJ0aHJlZURFbWJvc3MiLCBuZXcgQm9yZGVyTWFwcGluZ0luZm8oKSB7IENzc05hbWUgPSAicmlkZ2UiLCBDc3NTaXplID0gNi4wbSB9fSwKKyAgICAgICAgICAgIHsgInRocmVlREVuZ3JhdmUiLCBuZXcgQm9yZGVyTWFwcGluZ0luZm8oKSB7IENzc05hbWUgPSAiZ3Jvb3ZlIiwgQ3NzU2l6ZSA9IDYuMG0gfX0sCisgICAgICAgICAgICB7ICJvdXRzZXQiLCBuZXcgQm9yZGVyTWFwcGluZ0luZm8oKSB7IENzc05hbWUgPSAib3V0c2V0IiwgQ3NzU2l6ZSA9IDQuNW0gfX0sCisgICAgICAgICAgICB7ICJpbnNldCIsIG5ldyBCb3JkZXJNYXBwaW5nSW5mbygpIHsgQ3NzTmFtZSA9ICJpbnNldCIsIENzc1NpemUgPSA0LjVtIH19LAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgR2VuZXJhdGVCb3JkZXJTdHlsZShYRWxlbWVudCBwQmRyLCBYTmFtZSBzaWRlWE5hbWUsIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHN0eWxlLCBCb3JkZXJUeXBlIGJvcmRlclR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB3aGljaFNpZGU7CisgICAgICAgICAgICBpZiAoc2lkZVhOYW1lID09IFcudG9wKQorICAgICAgICAgICAgICAgIHdoaWNoU2lkZSA9ICJ0b3AiOworICAgICAgICAgICAgZWxzZSBpZiAoc2lkZVhOYW1lID09IFcucmlnaHQpCisgICAgICAgICAgICAgICAgd2hpY2hTaWRlID0gInJpZ2h0IjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNpZGVYTmFtZSA9PSBXLmJvdHRvbSkKKyAgICAgICAgICAgICAgICB3aGljaFNpZGUgPSAiYm90dG9tIjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3aGljaFNpZGUgPSAibGVmdCI7CisgICAgICAgICAgICBpZiAocEJkciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0eWxlLkFkZCgiYm9yZGVyLSIgKyB3aGljaFNpZGUsICJub25lIik7CisgICAgICAgICAgICAgICAgaWYgKGJvcmRlclR5cGUgPT0gQm9yZGVyVHlwZS5DZWxsICYmCisgICAgICAgICAgICAgICAgICAgICh3aGljaFNpZGUgPT0gImxlZnQiIHx8IHdoaWNoU2lkZSA9PSAicmlnaHQiKSkKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUuQWRkKCJwYWRkaW5nLSIgKyB3aGljaFNpZGUsICI1LjRwdCIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHNpZGUgPSBwQmRyLkVsZW1lbnQoc2lkZVhOYW1lKTsKKyAgICAgICAgICAgIGlmIChzaWRlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3R5bGUuQWRkKCJib3JkZXItIiArIHdoaWNoU2lkZSwgIm5vbmUiKTsKKyAgICAgICAgICAgICAgICBpZiAoYm9yZGVyVHlwZSA9PSBCb3JkZXJUeXBlLkNlbGwgJiYKKyAgICAgICAgICAgICAgICAgICAgKHdoaWNoU2lkZSA9PSAibGVmdCIgfHwgd2hpY2hTaWRlID09ICJyaWdodCIpKQorICAgICAgICAgICAgICAgICAgICBzdHlsZS5BZGQoInBhZGRpbmctIiArIHdoaWNoU2lkZSwgIjUuNHB0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHR5cGUgPSAoc3RyaW5nKXNpZGUuQXR0cmlidXRlKFcudmFsKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09ICJuaWwiIHx8IHR5cGUgPT0gIm5vbmUiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0eWxlLkFkZCgiYm9yZGVyLSIgKyB3aGljaFNpZGUgKyAiLXN0eWxlIiwgIm5vbmUiKTsKKworICAgICAgICAgICAgICAgIHZhciBzcGFjZSA9IChkZWNpbWFsPylzaWRlLkF0dHJpYnV0ZShXLnNwYWNlKSA/PyAwOworICAgICAgICAgICAgICAgIGlmIChib3JkZXJUeXBlID09IEJvcmRlclR5cGUuQ2VsbCAmJgorICAgICAgICAgICAgICAgICAgICAod2hpY2hTaWRlID09ICJsZWZ0IiB8fCB3aGljaFNpZGUgPT0gInJpZ2h0IikpCisgICAgICAgICAgICAgICAgICAgIGlmIChzcGFjZSA8IDUuNG0pCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZSA9IDUuNG07CisgICAgICAgICAgICAgICAgc3R5bGUuQWRkKCJwYWRkaW5nLSIgKyB3aGljaFNpZGUsCisgICAgICAgICAgICAgICAgICAgIHNwYWNlID09IDAgPyAiMCIgOiBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywgInswOjAuMH1wdCIsIHNwYWNlKSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc3ogPSAoaW50KXNpZGUuQXR0cmlidXRlKFcuc3opOworICAgICAgICAgICAgICAgIHZhciBzcGFjZSA9IChkZWNpbWFsPylzaWRlLkF0dHJpYnV0ZShXLnNwYWNlKSA/PyAwOworICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IChzdHJpbmcpc2lkZS5BdHRyaWJ1dGUoVy5jb2xvcik7CisgICAgICAgICAgICAgICAgaWYgKGNvbG9yID09IG51bGwgfHwgY29sb3IgPT0gImF1dG8iKQorICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aW5kb3d0ZXh0IjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gQ29udmVydENvbG9yKGNvbG9yKTsKKworICAgICAgICAgICAgICAgIGRlY2ltYWwgYm9yZGVyV2lkdGhJblBvaW50cyA9IE1hdGguTWF4KDFtLCBNYXRoLk1pbig5Nm0sIE1hdGguTWF4KDJtLCBzeikpIC8gOG0pOworCisgICAgICAgICAgICAgICAgdmFyIGJvcmRlclN0eWxlID0gInNvbGlkIjsKKyAgICAgICAgICAgICAgICBpZiAoQm9yZGVyU3R5bGVNYXAuQ29udGFpbnNLZXkodHlwZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYm9yZGVySW5mbyA9IEJvcmRlclN0eWxlTWFwW3R5cGVdOworICAgICAgICAgICAgICAgICAgICBib3JkZXJTdHlsZSA9IGJvcmRlckluZm8uQ3NzTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gImRvdWJsZSIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzeiA8PSA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoSW5Qb2ludHMgPSAyLjVtOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3ogPD0gMTgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyV2lkdGhJblBvaW50cyA9IDYuNzVtOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoSW5Qb2ludHMgPSBzeiAvIDNtOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInRyaXBsZSIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzeiA8PSA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoSW5Qb2ludHMgPSA4bTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN6IDw9IDE4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoSW5Qb2ludHMgPSAxMS4yNW07CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyV2lkdGhJblBvaW50cyA9IDExLjI1bTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlLlRvTG93ZXIoKS5Db250YWlucygiZGFzaCIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ogPD0gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJXaWR0aEluUG9pbnRzID0gMW07CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzeiA8PSAxMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJXaWR0aEluUG9pbnRzID0gMS41bTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJXaWR0aEluUG9pbnRzID0gMm07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSAhPSAic2luZ2xlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoSW5Qb2ludHMgPSBib3JkZXJJbmZvLkNzc1NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0eXBlID09ICJvdXRzZXQiIHx8IHR5cGUgPT0gImluc2V0IikKKyAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIjsKKyAgICAgICAgICAgICAgICB2YXIgYm9yZGVyV2lkdGggPSBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywgInswOjAuMH1wdCIsIGJvcmRlcldpZHRoSW5Qb2ludHMpOworCisgICAgICAgICAgICAgICAgc3R5bGUuQWRkKCJib3JkZXItIiArIHdoaWNoU2lkZSwgYm9yZGVyU3R5bGUgKyAiICIgKyBjb2xvciArICIgIiArIGJvcmRlcldpZHRoKTsKKyAgICAgICAgICAgICAgICBpZiAoYm9yZGVyVHlwZSA9PSBCb3JkZXJUeXBlLkNlbGwgJiYKKyAgICAgICAgICAgICAgICAgICAgKHdoaWNoU2lkZSA9PSAibGVmdCIgfHwgd2hpY2hTaWRlID09ICJyaWdodCIpKQorICAgICAgICAgICAgICAgICAgICBpZiAoc3BhY2UgPCA1LjRtKQorICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2UgPSA1LjRtOworCisgICAgICAgICAgICAgICAgc3R5bGUuQWRkKCJwYWRkaW5nLSIgKyB3aGljaFNpZGUsCisgICAgICAgICAgICAgICAgICAgIHNwYWNlID09IDAgPyAiMCIgOiBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywgInswOjAuMH1wdCIsIHNwYWNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEaWN0aW9uYXJ5PHN0cmluZywgRnVuYzxzdHJpbmcsIHN0cmluZywgc3RyaW5nPj4gU2hhZGVNYXBwZXIgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsRnVuYzxzdHJpbmcsIHN0cmluZywgc3RyaW5nPj4oKQorICAgICAgICB7CisgICAgICAgICAgICB7ICJhdXRvIiwgKGMsIGYpID0+IGMgfSwKKyAgICAgICAgICAgIHsgImNsZWFyIiwgKGMsIGYpID0+IGYgfSwKKyAgICAgICAgICAgIHsgIm5pbCIsIChjLCBmKSA9PiBmIH0sCisgICAgICAgICAgICB7ICJzb2xpZCIsIChjLCBmKSA9PiBjIH0sCisgICAgICAgICAgICB7ICJkaWFnQ3Jvc3MiLCAoYywgZikgPT4gQ29udmVydENvbG9yRmlsbFBjdChjLCBmLCAuNzUpIH0sCisgICAgICAgICAgICB7ICJkaWFnU3RyaXBlIiwgKGMsIGYpID0+IENvbnZlcnRDb2xvckZpbGxQY3QoYywgZiwgLjc1KSB9LAorICAgICAgICAgICAgeyAiaG9yekNyb3NzIiwgKGMsIGYpID0+IENvbnZlcnRDb2xvckZpbGxQY3QoYywgZiwgLjUpIH0sCisgICAgICAgICAgICB7ICJob3J6U3RyaXBlIiwgKGMsIGYpID0+IENvbnZlcnRDb2xvckZpbGxQY3QoYywgZiwgLjUpIH0sCisgICAgICAgICAgICB7ICJwY3QxMCIsIChjLCBmKSA9PiBDb252ZXJ0Q29sb3JGaWxsUGN0KGMsIGYsIC4xKSB9LAorICAgICAgICAgICAgeyAicGN0MTIiLCAoYywgZikgPT4gQ29udmVydENvbG9yRmlsbFBjdChjLCBmLCAuMTI1KSB9LAorICAgICAgICAgICAgeyAicGN0MTUiLCAoYywgZikgPT4gQ29udmVydENvbG9yRmlsbFBjdChjLCBmLCAuMTUpIH0sCisgICAgICAgICAgICB7ICJwY3QyMCIsIChjLCBmKSA9PiBDb252ZXJ0Q29sb3JGaWxsUGN0KGMsIGYsIC4yKSB9LAorICAgICAgICAgICAgeyAicGN0MjUiLCAoYywgZikgPT4gQ29udmVydENvbG9yRmlsbFBjdChjLCBmLCAuMjUpIH0sCisgICAgICAgICAgICB7ICJwY3QzMCIsIChjLCBmKSA9PiBDb252ZXJ0Q29sb3JGaWxsUGN0KGMsIGYsIC4zKSB9LAorICAgICAgICAgICAgeyAicGN0MzUiLCAoYywgZikgPT4gQ29udmVydENvbG9yRmlsbFBjdChjLCBmLCAuMzUpIH0sCisgICAgICAgICAgICB7ICJwY3QzNyIsIChjLCBmKSA9PiBDb252ZXJ0Q29sb3JGaWxsUGN0KGMsIGYsIC4zNzUpIH0sCisgICAgICAgICAgICB7ICJwY3Q0MCIsIChjLCBmKSA9PiBDb252ZXJ0Q29sb3JGaWxsUGN0KGMsIGYsIC40KSB9LAorICAgICAgICAgICAgeyAicGN0NDUiLCAoYywgZikgPT4gQ29udmVydENvbG9yRmlsbFBjdChjLCBmLCAuNDUpIH0sCisgICAgICAgICAgICB7ICJwY3Q1MCIsIChjLCBmKSA9PiBDb252ZXJ0Q29sb3JGaWxsUGN0KGMsIGYsIC41MCkgfSwKKyAgICAgICAgICAgIHsgInBjdDU1IiwgKGMsIGYpID0+IENvbnZlcnRDb2xvckZpbGxQY3QoYywgZiwgLjU1KSB9LAorICAgICAgICAgICAgeyAicGN0NjAiLCAoYywgZikgPT4gQ29udmVydENvbG9yRmlsbFBjdChjLCBmLCAuNjApIH0sCisgICAgICAgICAgICB7ICJwY3Q2MiIsIChjLCBmKSA9PiBDb252ZXJ0Q29sb3JGaWxsUGN0KGMsIGYsIC42MjUpIH0sCisgICAgICAgICAgICB7ICJwY3Q2NSIsIChjLCBmKSA9PiBDb252ZXJ0Q29sb3JGaWxsUGN0KGMsIGYsIC42NSkgfSwKKyAgICAgICAgICAgIHsgInBjdDcwIiwgKGMsIGYpID0+IENvbnZlcnRDb2xvckZpbGxQY3QoYywgZiwgLjcpIH0sCisgICAgICAgICAgICB7ICJwY3Q3NSIsIChjLCBmKSA9PiBDb252ZXJ0Q29sb3JGaWxsUGN0KGMsIGYsIC43NSkgfSwKKyAgICAgICAgICAgIHsgInBjdDgwIiwgKGMsIGYpID0+IENvbnZlcnRDb2xvckZpbGxQY3QoYywgZiwgLjgpIH0sCisgICAgICAgICAgICB7ICJwY3Q4NSIsIChjLCBmKSA9PiBDb252ZXJ0Q29sb3JGaWxsUGN0KGMsIGYsIC44NSkgfSwKKyAgICAgICAgICAgIHsgInBjdDg3IiwgKGMsIGYpID0+IENvbnZlcnRDb2xvckZpbGxQY3QoYywgZiwgLjg3NSkgfSwKKyAgICAgICAgICAgIHsgInBjdDkwIiwgKGMsIGYpID0+IENvbnZlcnRDb2xvckZpbGxQY3QoYywgZiwgLjkpIH0sCisgICAgICAgICAgICB7ICJwY3Q5NSIsIChjLCBmKSA9PiBDb252ZXJ0Q29sb3JGaWxsUGN0KGMsIGYsIC45NSkgfSwKKyAgICAgICAgICAgIHsgInJldmVyc2VEaWFnU3RyaXBlIiwgKGMsIGYpID0+IENvbnZlcnRDb2xvckZpbGxQY3QoYywgZiwgLjUpIH0sCisgICAgICAgICAgICB7ICJ0aGluRGlhZ0Nyb3NzIiwgKGMsIGYpID0+IENvbnZlcnRDb2xvckZpbGxQY3QoYywgZiwgLjUpIH0sCisgICAgICAgICAgICB7ICJ0aGluRGlhZ1N0cmlwZSIsIChjLCBmKSA9PiBDb252ZXJ0Q29sb3JGaWxsUGN0KGMsIGYsIC4yNSkgfSwKKyAgICAgICAgICAgIHsgInRoaW5Ib3J6Q3Jvc3MiLCAoYywgZikgPT4gQ29udmVydENvbG9yRmlsbFBjdChjLCBmLCAuMykgfSwKKyAgICAgICAgICAgIHsgInRoaW5Ib3J6U3RyaXBlIiwgKGMsIGYpID0+IENvbnZlcnRDb2xvckZpbGxQY3QoYywgZiwgLjI1KSB9LAorICAgICAgICAgICAgeyAidGhpblJldmVyc2VEaWFnU3RyaXBlIiwgKGMsIGYpID0+IENvbnZlcnRDb2xvckZpbGxQY3QoYywgZiwgLjI1KSB9LAorICAgICAgICAgICAgeyAidGhpblZlcnRTdHJpcGUiLCAoYywgZikgPT4gQ29udmVydENvbG9yRmlsbFBjdChjLCBmLCAuMjUpIH0sCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gU2hhZGVDYWNoZSA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpOworCisgICAgICAgIC8vIGZpbGwgaXMgdGhlIGJhY2tncm91bmQsIGNvbG9yIGlzIHRoZSBmb3JlZ3JvdW5kCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBDb252ZXJ0Q29sb3JGaWxsUGN0KHN0cmluZyBjb2xvciwgc3RyaW5nIGZpbGwsIGRvdWJsZSBwY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb2xvciA9PSAiYXV0byIpCisgICAgICAgICAgICAgICAgY29sb3IgPSAiMDAwMDAwIjsKKyAgICAgICAgICAgIGlmIChmaWxsID09ICJhdXRvIikKKyAgICAgICAgICAgICAgICBmaWxsID0gImZmZmZmZiI7CisgICAgICAgICAgICB2YXIga2V5ID0gY29sb3IgKyBmaWxsICsgcGN0LlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgaWYgKFNoYWRlQ2FjaGUuQ29udGFpbnNLZXkoa2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gU2hhZGVDYWNoZVtrZXldOworICAgICAgICAgICAgdmFyIGZpbGxSZWQgPSBDb252ZXJ0LlRvSW50MzIoZmlsbC5TdWJzdHJpbmcoMCwgMiksIDE2KTsKKyAgICAgICAgICAgIHZhciBmaWxsR3JlZW4gPSBDb252ZXJ0LlRvSW50MzIoZmlsbC5TdWJzdHJpbmcoMiwgMiksIDE2KTsKKyAgICAgICAgICAgIHZhciBmaWxsQmx1ZSA9IENvbnZlcnQuVG9JbnQzMihmaWxsLlN1YnN0cmluZyg0LCAyKSwgMTYpOworICAgICAgICAgICAgdmFyIGNvbG9yUmVkID0gQ29udmVydC5Ub0ludDMyKGNvbG9yLlN1YnN0cmluZygwLCAyKSwgMTYpOworICAgICAgICAgICAgdmFyIGNvbG9yR3JlZW4gPSBDb252ZXJ0LlRvSW50MzIoY29sb3IuU3Vic3RyaW5nKDIsIDIpLCAxNik7CisgICAgICAgICAgICB2YXIgY29sb3JCbHVlID0gQ29udmVydC5Ub0ludDMyKGNvbG9yLlN1YnN0cmluZyg0LCAyKSwgMTYpOworICAgICAgICAgICAgdmFyIGZpbmFsUmVkID0gKGludCkoZmlsbFJlZCAtIChmaWxsUmVkIC0gY29sb3JSZWQpICogcGN0KTsKKyAgICAgICAgICAgIHZhciBmaW5hbEdyZWVuID0gKGludCkoZmlsbEdyZWVuIC0gKGZpbGxHcmVlbiAtIGNvbG9yR3JlZW4pICogcGN0KTsKKyAgICAgICAgICAgIHZhciBmaW5hbEJsdWUgPSAoaW50KShmaWxsQmx1ZSAtIChmaWxsQmx1ZSAtIGNvbG9yQmx1ZSkgKiBwY3QpOworICAgICAgICAgICAgdmFyIHJldHVyblZhbHVlID0gc3RyaW5nLkZvcm1hdCgiezA6eDJ9ezE6eDJ9ezI6eDJ9IiwgZmluYWxSZWQsIGZpbmFsR3JlZW4sIGZpbmFsQmx1ZSk7CisgICAgICAgICAgICBTaGFkZUNhY2hlLkFkZChrZXksIHJldHVyblZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ3JlYXRlU3R5bGVGcm9tU2hkKERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHN0eWxlLCBYRWxlbWVudCBzaGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaGQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB2YXIgc2hhZGVUeXBlID0gKHN0cmluZylzaGQuQXR0cmlidXRlKFcudmFsKTsKKyAgICAgICAgICAgIHZhciBjb2xvciA9IChzdHJpbmcpc2hkLkF0dHJpYnV0ZShXLmNvbG9yKTsKKyAgICAgICAgICAgIHZhciBmaWxsID0gKHN0cmluZylzaGQuQXR0cmlidXRlKFcuZmlsbCk7CisgICAgICAgICAgICBpZiAoU2hhZGVNYXBwZXIuQ29udGFpbnNLZXkoc2hhZGVUeXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb2xvciA9IFNoYWRlTWFwcGVyW3NoYWRlVHlwZV0oY29sb3IsIGZpbGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbG9yICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGN2dENvbG9yID0gQ29udmVydENvbG9yKGNvbG9yKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGN2dENvbG9yKSkKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUuQWRkSWZNaXNzaW5nKCJiYWNrZ3JvdW5kIiwgY3Z0Q29sb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gTmFtZWRDb2xvcnMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKQorICAgICAgICB7CisgICAgICAgICAgICB7ImJsYWNrIiwgImJsYWNrIn0sCisgICAgICAgICAgICB7ImJsdWUiLCAiYmx1ZSIgfSwKKyAgICAgICAgICAgIHsiY3lhbiIsICJhcXVhIiB9LAorICAgICAgICAgICAgeyJncmVlbiIsICJncmVlbiIgfSwKKyAgICAgICAgICAgIHsibWFnZW50YSIsICJmdWNoc2lhIiB9LAorICAgICAgICAgICAgeyJyZWQiLCAicmVkIiB9LAorICAgICAgICAgICAgeyJ5ZWxsb3ciLCAieWVsbG93IiB9LAorICAgICAgICAgICAgeyJ3aGl0ZSIsICJ3aGl0ZSIgfSwKKyAgICAgICAgICAgIHsiZGFya0JsdWUiLCAiIzAwMDA4QiIgfSwKKyAgICAgICAgICAgIHsiZGFya0N5YW4iLCAiIzAwOEI4QiIgfSwKKyAgICAgICAgICAgIHsiZGFya0dyZWVuIiwgIiMwMDY0MDAiIH0sCisgICAgICAgICAgICB7ImRhcmtNYWdlbnRhIiwgIiM4MDAwODAiIH0sCisgICAgICAgICAgICB7ImRhcmtSZWQiLCAiIzhCMDAwMCIgfSwKKyAgICAgICAgICAgIHsiZGFya1llbGxvdyIsICIjODA4MDAwIiB9LAorICAgICAgICAgICAgeyJkYXJrR3JheSIsICIjQTlBOUE5IiB9LAorICAgICAgICAgICAgeyJsaWdodEdyYXkiLCAiI0QzRDNEMyIgfSwKKyAgICAgICAgICAgIHsibm9uZSIsICIiIH0sCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDcmVhdGVDb2xvclByb3BlcnR5KHN0cmluZyBwcm9wZXJ0eU5hbWUsIHN0cmluZyBjb2xvciwgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gc3R5bGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb2xvciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gImF1dG8iIGNvbG9yIGlzIGJsYWNrIGZvciAiY29sb3IiIGFuZCB3aGl0ZSBmb3IgImJhY2tncm91bmQiIHByb3BlcnR5LgorICAgICAgICAgICAgaWYgKGNvbG9yID09ICJhdXRvIikKKyAgICAgICAgICAgICAgICBjb2xvciA9IHByb3BlcnR5TmFtZSA9PSAiY29sb3IiID8gImJsYWNrIiA6ICJ3aGl0ZSI7CisKKyAgICAgICAgICAgIGlmIChOYW1lZENvbG9ycy5Db250YWluc0tleShjb2xvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGxjID0gTmFtZWRDb2xvcnNbY29sb3JdOworICAgICAgICAgICAgICAgIGlmIChsYyA9PSAiIikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIHN0eWxlLkFkZElmTWlzc2luZyhwcm9wZXJ0eU5hbWUsIGxjKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcocHJvcGVydHlOYW1lLCAiIyIgKyBjb2xvcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgQ29udmVydENvbG9yKHN0cmluZyBjb2xvcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gImF1dG8iIGNvbG9yIGlzIGJsYWNrIGZvciAiY29sb3IiIGFuZCB3aGl0ZSBmb3IgImJhY2tncm91bmQiIHByb3BlcnR5LgorICAgICAgICAgICAgLy8gQXMgdGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgZm9yICJiYWNrZ3JvdW5kIiBjb2xvcnMsICJhdXRvIiBpcyB0cmFuc2xhdGVkCisgICAgICAgICAgICAvLyB0byAid2hpdGUiIGFuZCBuZXZlciAiYmxhY2siLgorICAgICAgICAgICAgaWYgKGNvbG9yID09ICJhdXRvIikKKyAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSI7CisKKyAgICAgICAgICAgIGlmIChOYW1lZENvbG9ycy5Db250YWluc0tleShjb2xvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGxjID0gTmFtZWRDb2xvcnNbY29sb3JdOworICAgICAgICAgICAgICAgIGlmIChsYyA9PSAiIikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJibGFjayI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICIjIiArIGNvbG9yOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gRm9udEZhbGxiYWNrID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCkKKyAgICAgICAgeworICAgICAgICAgICAgeyAiQXJpYWwiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJBcmlhbCBOYXJyb3ciLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJBcmlhbCBSb3VuZGVkIE1UIEJvbGQiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJBcmlhbCBVbmljb2RlIE1TIiwgQCInezB9JywgJ3NhbnMtc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiQmFza2VydmlsbGUgT2xkIEZhY2UiLCBAIid7MH0nLCAnc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiQmVybGluIFNhbnMgRkIiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJCZXJsaW4gU2FucyBGQiBEZW1pIiwgQCInezB9JywgJ3NhbnMtc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiQ2FsaWJyaSBMaWdodCIsIEAiJ3swfScsICdzYW5zLXNlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIkdpbGwgU2FucyBNVCIsIEAiJ3swfScsICdzYW5zLXNlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIkdpbGwgU2FucyBNVCBDb25kZW5zZWQiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJMdWNpZGEgU2FucyIsIEAiJ3swfScsICdzYW5zLXNlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIkx1Y2lkYSBTYW5zIFVuaWNvZGUiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJTZWdvZSBVSSIsIEAiJ3swfScsICdzYW5zLXNlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIlNlZ29lIFVJIExpZ2h0IiwgQCInezB9JywgJ3NhbnMtc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiU2Vnb2UgVUkgU2VtaWJvbGQiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJUYWhvbWEiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJUcmVidWNoZXQgTVMiLCBAIid7MH0nLCAnc2Fucy1zZXJpZiciIH0sCisgICAgICAgICAgICB7ICJWZXJkYW5hIiwgQCInezB9JywgJ3NhbnMtc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiQm9vayBBbnRpcXVhIiwgQCInezB9JywgJ3NlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIkJvb2ttYW4gT2xkIFN0eWxlIiwgQCInezB9JywgJ3NlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIkNhbGlmb3JuaWFuIEZCIiwgQCInezB9JywgJ3NlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIkNhbWJyaWEiLCBAIid7MH0nLCAnc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiQ29uc3RhbnRpYSIsIEAiJ3swfScsICdzZXJpZiciIH0sCisgICAgICAgICAgICB7ICJHYXJhbW9uZCIsIEAiJ3swfScsICdzZXJpZiciIH0sCisgICAgICAgICAgICB7ICJMdWNpZGEgQnJpZ2h0IiwgQCInezB9JywgJ3NlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIkx1Y2lkYSBGYXgiLCBAIid7MH0nLCAnc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiUGFsYXRpbm8gTGlub3R5cGUiLCBAIid7MH0nLCAnc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgQCInezB9JywgJ3NlcmlmJyIgfSwKKyAgICAgICAgICAgIHsgIldpZGUgTGF0aW4iLCBAIid7MH0nLCAnc2VyaWYnIiB9LAorICAgICAgICAgICAgeyAiQ291cmllciBOZXciLCBAIid7MH0nIiB9LAorICAgICAgICAgICAgeyAiTHVjaWRhIENvbnNvbGUiLCBAIid7MH0nIiB9LAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ3JlYXRlRm9udENzc1Byb3BlcnR5KHN0cmluZyBmb250LCBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBzdHlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEZvbnRGYWxsYmFjay5Db250YWluc0tleShmb250KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoImZvbnQtZmFtaWx5Iiwgc3RyaW5nLkZvcm1hdChGb250RmFsbGJhY2tbZm9udF0sIGZvbnQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHlsZS5BZGRJZk1pc3NpbmcoImZvbnQtZmFtaWx5IiwgZm9udCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIEdldEJvb2xQcm9wKFhFbGVtZW50IHJ1blByb3BzLCBYTmFtZSB4TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHAgPSBydW5Qcm9wcy5FbGVtZW50KHhOYW1lKTsKKyAgICAgICAgICAgIGlmIChwID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgdmFyIHYgPSBwLkF0dHJpYnV0ZShXLnZhbCk7CisgICAgICAgICAgICBpZiAodiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgdmFyIHMgPSB2LlZhbHVlLlRvTG93ZXIoKTsKKyAgICAgICAgICAgIGlmIChzID09ICIwIiB8fCBzID09ICJmYWxzZSIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKHMgPT0gIjEiIHx8IHMgPT0gInRydWUiKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IENvbnZlcnRDb250ZW50VGhhdENhbkNvbnRhaW5GaWVsZHMoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3b3JkRG9jLCBXbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncywKKyAgICAgICAgICAgIElFbnVtZXJhYmxlPFhFbGVtZW50PiBlbGVtZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGdyb3VwZWQgPSBlbGVtZW50cworICAgICAgICAgICAgICAgIC5Hcm91cEFkamFjZW50KGUgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzdGFjayA9IGUuQW5ub3RhdGlvbjxTdGFjazxGaWVsZFJldHJpZXZlci5GaWVsZEVsZW1lbnRUeXBlSW5mbz4+KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjayA9PSBudWxsIHx8ICFzdGFjay5BbnkoKSA/IChpbnQ/KW51bGwgOiBzdGFjay5TZWxlY3Qoc3QgPT4gc3QuSWQpLk1pbigpOworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICB2YXIgdHhmb3JtZWQgPSBncm91cGVkCisgICAgICAgICAgICAgICAgLlNlbGVjdChnID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZy5LZXk7CisgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqZWN0KWcuU2VsZWN0KG4gPT4gQ29udmVydFRvSHRtbFRyYW5zZm9ybSh3b3JkRG9jLCBzZXR0aW5ncywgbiwgZmFsc2UsIDBtKSk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGluc3RyVGV4dCA9IEZpZWxkUmV0cmlldmVyLkluc3RyVGV4dChnLkZpcnN0KCkuQW5jZXN0b3JzKCkuTGFzdCgpLCAoaW50KWtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5UcmltU3RhcnQoJ3snKS5UcmltRW5kKCd9Jyk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnNlZCA9IEZpZWxkUmV0cmlldmVyLlBhcnNlRmllbGQoaW5zdHJUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5GaWVsZFR5cGUgIT0gIkhZUEVSTElOSyIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZy5TZWxlY3QobiA9PiBDb252ZXJ0VG9IdG1sVHJhbnNmb3JtKHdvcmREb2MsIHNldHRpbmdzLCBuLCBmYWxzZSwgMG0pKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IGcuRGVzY2VuZGFudHNBbmRTZWxmKFcucikuU2VsZWN0KHJ1biA9PiBDb252ZXJ0UnVuKHdvcmREb2MsIHNldHRpbmdzLCBydW4pKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBwYXJzZWQuQXJndW1lbnRzLkxlbmd0aCA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFhFbGVtZW50KFhodG1sLmEsIG5ldyBYQXR0cmlidXRlKCJocmVmIiwgcGFyc2VkLkFyZ3VtZW50c1swXSksIGNvbnRlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBYRWxlbWVudChYaHRtbC5hLCBjb250ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGEyID0gYSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhMi5Ob2RlcygpLkFueSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhMi5BZGQobmV3IFhUZXh0KCIiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIHJldHVybiB0eGZvcm1lZDsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gSW1hZ2UgUHJvY2Vzc2luZworCisgICAgICAgIC8vIERvbid0IHByb2Nlc3Mgd21mIGZpbGVzICh3aXRoIGNvbnRlbnRUeXBlID09ICJpbWFnZS94LXdtZiIpIGJlY2F1c2UgR0RJIGNvbnN1bWVzIGh1Z2UgYW1vdW50cworICAgICAgICAvLyBvZiBtZW1vcnkgd2hlbiBkZWFsaW5nIHdpdGggd21mIHBlcmhhcHMgYmVjYXVzZSBpdCBsb2FkcyBhIERMTCB0byBkbyB0aGUgcmVuZGVyaW5nPworICAgICAgICAvLyBJdCBhY3R1YWxseSB3b3JrcywgYnV0IGlzIG5vdCByZWNvbW1lbmRlZC4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTGlzdDxzdHJpbmc+IEltYWdlQ29udGVudFR5cGVzID0gbmV3IExpc3Q8c3RyaW5nPgorICAgICAgICB7CisgICAgICAgICAgICAiaW1hZ2UvcG5nIiwgImltYWdlL2dpZiIsICJpbWFnZS90aWZmIiwgImltYWdlL2pwZWciCisgICAgICAgIH07CisKKworICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IFByb2Nlc3NJbWFnZShXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdvcmREb2MsCisgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50LCBGdW5jPEltYWdlSW5mbywgWEVsZW1lbnQ+IGltYWdlSGFuZGxlcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGltYWdlSGFuZGxlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLmRyYXdpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFByb2Nlc3NEcmF3aW5nKHdvcmREb2MsIGVsZW1lbnQsIGltYWdlSGFuZGxlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcucGljdCB8fCBlbGVtZW50Lk5hbWUgPT0gVy5fb2JqZWN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBQcm9jZXNzUGljdHVyZU9yT2JqZWN0KHdvcmREb2MsIGVsZW1lbnQsIGltYWdlSGFuZGxlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IFByb2Nlc3NEcmF3aW5nKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYywKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQsIEZ1bmM8SW1hZ2VJbmZvLCBYRWxlbWVudD4gaW1hZ2VIYW5kbGVyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29udGFpbmVyRWxlbWVudCA9IGVsZW1lbnQuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChlID0+IGUuTmFtZSA9PSBXUC5pbmxpbmUgfHwgZS5OYW1lID09IFdQLmFuY2hvcik7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyRWxlbWVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgc3RyaW5nIGh5cGVybGlua1VyaSA9IG51bGw7CisgICAgICAgICAgICB2YXIgaHlwZXJsaW5rRWxlbWVudCA9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoV1AuaW5saW5lKQorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXUC5kb2NQcikKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoQS5obGlua0NsaWNrKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGh5cGVybGlua0VsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcklkID0gKHN0cmluZyloeXBlcmxpbmtFbGVtZW50LkF0dHJpYnV0ZShSLmlkKTsKKyAgICAgICAgICAgICAgICBpZiAocklkICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgaHlwZXJsaW5rUmVsID0gd29yZERvYy5NYWluRG9jdW1lbnRQYXJ0Lkh5cGVybGlua1JlbGF0aW9uc2hpcHMuRmlyc3RPckRlZmF1bHQoaGxyID0+IGhsci5JZCA9PSBySWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoaHlwZXJsaW5rUmVsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGh5cGVybGlua1VyaSA9IGh5cGVybGlua1JlbC5VcmkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGV4dGVudEN4ID0gKGludD8pY29udGFpbmVyRWxlbWVudC5FbGVtZW50cyhXUC5leHRlbnQpCisgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoTm9OYW1lc3BhY2UuY3gpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICB2YXIgZXh0ZW50Q3kgPSAoaW50Pyljb250YWluZXJFbGVtZW50LkVsZW1lbnRzKFdQLmV4dGVudCkKKyAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhOb05hbWVzcGFjZS5jeSkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIHZhciBhbHRUZXh0ID0gKHN0cmluZyljb250YWluZXJFbGVtZW50LkVsZW1lbnRzKFdQLmRvY1ByKS5BdHRyaWJ1dGVzKE5vTmFtZXNwYWNlLmRlc2NyKS5GaXJzdE9yRGVmYXVsdCgpID8/CisgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3RyaW5nKWNvbnRhaW5lckVsZW1lbnQuRWxlbWVudHMoV1AuZG9jUHIpLkF0dHJpYnV0ZXMoTm9OYW1lc3BhY2UubmFtZSkuRmlyc3RPckRlZmF1bHQoKSA/PyAiIik7CisKKyAgICAgICAgICAgIHZhciBibGlwRmlsbCA9IGNvbnRhaW5lckVsZW1lbnQuRWxlbWVudHMoQS5ncmFwaGljKQorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhBLmdyYXBoaWNEYXRhKQorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhQaWMuX3BpYykuRWxlbWVudHMoUGljLmJsaXBGaWxsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGJsaXBGaWxsID09IG51bGwpIHJldHVybiBudWxsOworCisgICAgICAgICAgICB2YXIgaW1hZ2VSaWQgPSAoc3RyaW5nKWJsaXBGaWxsLkVsZW1lbnRzKEEuYmxpcCkuQXR0cmlidXRlcyhSLmVtYmVkKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGltYWdlUmlkID09IG51bGwpIHJldHVybiBudWxsOworCisgICAgICAgICAgICB2YXIgcHAzID0gd29yZERvYy5NYWluRG9jdW1lbnRQYXJ0LlBhcnRzLkZpcnN0T3JEZWZhdWx0KHBwID0+IHBwLlJlbGF0aW9uc2hpcElkID09IGltYWdlUmlkKTsKKyAgICAgICAgICAgIGlmIChwcDMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHZhciBpbWFnZVBhcnQgPSAoSW1hZ2VQYXJ0KXBwMy5PcGVuWG1sUGFydDsKKyAgICAgICAgICAgIGlmIChpbWFnZVBhcnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBpbWFnZSBtYXJrdXAgcG9pbnRzIHRvIGEgTlVMTCBpbWFnZSwgdGhlbiBmb2xsb3dpbmcgd2lsbCB0aHJvdyBhbiBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGltYWdlUGFydCA9IChJbWFnZVBhcnQpd29yZERvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFBhcnRCeUlkKGltYWdlUmlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBjb250ZW50VHlwZSA9IGltYWdlUGFydC5Db250ZW50VHlwZTsKKyAgICAgICAgICAgIGlmICghSW1hZ2VDb250ZW50VHlwZXMuQ29udGFpbnMoY29udGVudFR5cGUpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICB1c2luZyAodmFyIHBhcnRTdHJlYW0gPSBpbWFnZVBhcnQuR2V0U3RyZWFtKCkpCisgICAgICAgICAgICB1c2luZyAodmFyIGJpdG1hcCA9IG5ldyBCaXRtYXAocGFydFN0cmVhbSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4dGVudEN4ICE9IG51bGwgJiYgZXh0ZW50Q3kgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBpbWFnZUluZm8gPSBuZXcgSW1hZ2VJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwID0gYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1nU3R5bGVBdHRyaWJ1dGUgPSBuZXcgWEF0dHJpYnV0ZSgic3R5bGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoTnVtYmVyRm9ybWF0SW5mby5JbnZhcmlhbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2lkdGg6IHswfWluOyBoZWlnaHQ6IHsxfWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KWV4dGVudEN4IC8gKGZsb2F0KUltYWdlSW5mby5FbXVzUGVySW5jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KWV4dGVudEN5IC8gKGZsb2F0KUltYWdlSW5mby5FbXVzUGVySW5jaCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPSBjb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERyYXdpbmdFbGVtZW50ID0gZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsdFRleHQgPSBhbHRUZXh0LAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICB2YXIgaW1nRWxlbWVudDIgPSBpbWFnZUhhbmRsZXIoaW1hZ2VJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGh5cGVybGlua1VyaSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KFhodG1sTm9OYW1lc3BhY2UuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYaHRtbE5vTmFtZXNwYWNlLmhyZWYsIGh5cGVybGlua1VyaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nRWxlbWVudDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbWdFbGVtZW50MjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgaW1hZ2VJbmZvMiA9IG5ldyBJbWFnZUluZm8oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwID0gYml0bWFwLAorICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICBEcmF3aW5nRWxlbWVudCA9IGVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgIEFsdFRleHQgPSBhbHRUZXh0LAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgdmFyIGltZ0VsZW1lbnQgPSBpbWFnZUhhbmRsZXIoaW1hZ2VJbmZvMik7CisgICAgICAgICAgICAgICAgaWYgKGh5cGVybGlua1VyaSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChYaHRtbE5vTmFtZXNwYWNlLmEsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYaHRtbE5vTmFtZXNwYWNlLmhyZWYsIGh5cGVybGlua1VyaSksCisgICAgICAgICAgICAgICAgICAgICAgICBpbWdFbGVtZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGltZ0VsZW1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBQcm9jZXNzUGljdHVyZU9yT2JqZWN0KFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd29yZERvYywKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQsIEZ1bmM8SW1hZ2VJbmZvLCBYRWxlbWVudD4gaW1hZ2VIYW5kbGVyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW1hZ2VSaWQgPSAoc3RyaW5nKWVsZW1lbnQuRWxlbWVudHMoVk1MLnNoYXBlKS5FbGVtZW50cyhWTUwuaW1hZ2VkYXRhKS5BdHRyaWJ1dGVzKFIuaWQpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoaW1hZ2VSaWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwcCA9IHdvcmREb2MuTWFpbkRvY3VtZW50UGFydC5QYXJ0cy5GaXJzdE9yRGVmYXVsdChwcDIgPT4gcHAyLlJlbGF0aW9uc2hpcElkID09IGltYWdlUmlkKTsKKyAgICAgICAgICAgICAgICBpZiAocHAgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICB2YXIgaW1hZ2VQYXJ0ID0gKEltYWdlUGFydClwcC5PcGVuWG1sUGFydDsKKyAgICAgICAgICAgICAgICBpZiAoaW1hZ2VQYXJ0ID09IG51bGwpIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgdmFyIGNvbnRlbnRUeXBlID0gaW1hZ2VQYXJ0LkNvbnRlbnRUeXBlOworICAgICAgICAgICAgICAgIGlmICghSW1hZ2VDb250ZW50VHlwZXMuQ29udGFpbnMoY29udGVudFR5cGUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgcGFydFN0cmVhbSA9IGltYWdlUGFydC5HZXRTdHJlYW0oKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAodmFyIGJpdG1hcCA9IG5ldyBCaXRtYXAocGFydFN0cmVhbSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGltYWdlSW5mbyA9IG5ldyBJbWFnZUluZm8oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwID0gYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcmF3aW5nRWxlbWVudCA9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlID0gKHN0cmluZyllbGVtZW50LkVsZW1lbnRzKFZNTC5zaGFwZSkuQXR0cmlidXRlcygic3R5bGUiKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PSBudWxsKSByZXR1cm4gaW1hZ2VIYW5kbGVyKGltYWdlSW5mbyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc3R5bGUuU3BsaXQoJzsnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGhJblBvaW50cyA9IFdpZHRoSW5Qb2ludHModG9rZW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0SW5Qb2ludHMgPSBIZWlnaHRJblBvaW50cyh0b2tlbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aEluUG9pbnRzICE9IG51bGwgJiYgaGVpZ2h0SW5Qb2ludHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5JbWdTdHlsZUF0dHJpYnV0ZSA9IG5ldyBYQXR0cmlidXRlKCJzdHlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KE51bWJlckZvcm1hdEluZm8uSW52YXJpYW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2lkdGg6IHswfXB0OyBoZWlnaHQ6IHsxfXB0Iiwgd2lkdGhJblBvaW50cywgaGVpZ2h0SW5Qb2ludHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltYWdlSGFuZGxlcihpbWFnZUluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChPdXRPZk1lbW9yeUV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIEJpdG1hcCBjbGFzcyBjYW4gdGhyb3cgT3V0T2ZNZW1vcnlFeGNlcHRpb24sIHdoaWNoIG1lYW5zIHRoZSBiaXRtYXAgaXMgbWVzc2VkIHVwLCBzbyBwdW50LgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEFyZ3VtZW50RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmbG9hdD8gSGVpZ2h0SW5Qb2ludHMoSUVudW1lcmFibGU8c3RyaW5nPiB0b2tlbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTaXplSW5Qb2ludHModG9rZW5zLCAiaGVpZ2h0Iik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmbG9hdD8gV2lkdGhJblBvaW50cyhJRW51bWVyYWJsZTxzdHJpbmc+IHRva2VucykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFNpemVJblBvaW50cyh0b2tlbnMsICJ3aWR0aCIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQ/IFNpemVJblBvaW50cyhJRW51bWVyYWJsZTxzdHJpbmc+IHRva2Vucywgc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzaXplU3RyaW5nID0gdG9rZW5zCisgICAgICAgICAgICAgICAgLlNlbGVjdCh0ID0+IG5ldworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmFtZSA9IHQuU3BsaXQoJzonKS5GaXJzdCgpLAorICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IHQuU3BsaXQoJzonKS5Ta2lwKDEpLlRha2UoMSkuRmlyc3RPckRlZmF1bHQoKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLldoZXJlKHAgPT4gcC5OYW1lID09IG5hbWUpCisgICAgICAgICAgICAgICAgLlNlbGVjdChwID0+IHAuVmFsdWUpCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisKKyAgICAgICAgICAgIGlmIChzaXplU3RyaW5nICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICBzaXplU3RyaW5nLkxlbmd0aCA+IDIgJiYKKyAgICAgICAgICAgICAgICBzaXplU3RyaW5nLlN1YnN0cmluZyhzaXplU3RyaW5nLkxlbmd0aCAtIDIpID09ICJwdCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoZmxvYXQuVHJ5UGFyc2Uoc2l6ZVN0cmluZy5TdWJzdHJpbmcoMCwgc2l6ZVN0cmluZy5MZW5ndGggLSAyKSwgb3V0IHNpemUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSHRtbENvbnZlcnRlckV4dGVuc2lvbnMKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRJZk1pc3NpbmcodGhpcyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBzdHlsZSwgc3RyaW5nIHByb3BOYW1lLCBzdHJpbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHlsZS5Db250YWluc0tleShwcm9wTmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgc3R5bGUuQWRkKHByb3BOYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9XbWxUb1htbC5jcyBiL09wZW5YbWxQb3dlclRvb2xzL1dtbFRvWG1sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZTlhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29scy9XbWxUb1htbC5jcwpAQCAtMCwwICsxLDIwMDMgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBFcmljIFdoaXRlIDIwMTYuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiAgU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vRXJpY1doaXRlLmNvbQorUmVzb3VyY2UgQ2VudGVyIGFuZCBEb2N1bWVudGF0aW9uOiBodHRwOi8vZXJpY3doaXRlLmNvbS8KKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ29udGVudFR5cGVSdWxlCisgICAgeworICAgICAgICBwdWJsaWMgc3RyaW5nIENvbnRlbnRUeXBlOworICAgICAgICBwdWJsaWMgc3RyaW5nIFN0eWxlTmFtZTsKKyAgICAgICAgcHVibGljIFJlZ2V4IFN0eWxlTmFtZVJlZ2V4OworICAgICAgICBwdWJsaWMgUmVnZXhbXSBSZWdleEFycmF5OworICAgICAgICBwdWJsaWMgRnVuYzxYRWxlbWVudCwgQ29udGVudFR5cGVSdWxlLCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50LCBXbWxUb1htbFNldHRpbmdzLCBib29sPiBNYXRjaExhbWJkYTsKKyAgICAgICAgcHVibGljIGJvb2wgQXBwbHlSdW5Db250ZW50VHlwZXMgPSB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBHbG9iYWxWYWxpZGF0aW9uUnVsZQorICAgIHsKKyAgICAgICAgcHVibGljIHN0cmluZ1tdIFJ1bGVOYW1lczsKKyAgICAgICAgcHVibGljIHN0cmluZ1tdIFJ1bGVEZXNjcmlwdGlvbnM7CisgICAgICAgIHB1YmxpYyBGdW5jPEdsb2JhbFZhbGlkYXRpb25SdWxlLCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50LCBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50LCBYRWxlbWVudCwgV21sVG9YbWxTZXR0aW5ncywgTGlzdDxXbWxUb1htbFZhbGlkYXRpb25FcnJvcj4+IEdsb2JhbFJ1bGVMYW1iZGE7CisgICAgICAgIHB1YmxpYyBib29sIElzT25seVdhcm5pbmc7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTWVzc2FnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQmxvY2tMZXZlbENvbnRlbnRWYWxpZGF0aW9uUnVsZQorICAgIHsKKyAgICAgICAgcHVibGljIHN0cmluZ1tdIFJ1bGVOYW1lczsKKyAgICAgICAgcHVibGljIHN0cmluZ1tdIFJ1bGVEZXNjcmlwdGlvbnM7CisgICAgICAgIHB1YmxpYyBSZWdleCBTdHlsZU5hbWVSZWdleDsKKyAgICAgICAgcHVibGljIEZ1bmM8WEVsZW1lbnQsIEJsb2NrTGV2ZWxDb250ZW50VmFsaWRhdGlvblJ1bGUsIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQsIFhFbGVtZW50LCBXbWxUb1htbFNldHRpbmdzLCBMaXN0PFdtbFRvWG1sVmFsaWRhdGlvbkVycm9yPj4gQmxvY2tMZXZlbENvbnRlbnRSdWxlTGFtYmRhOworICAgICAgICBwdWJsaWMgYm9vbCBJc09ubHlXYXJuaW5nOworICAgICAgICBwdWJsaWMgc3RyaW5nIE1lc3NhZ2U7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFdtbFRvWG1sVmFsaWRhdGlvbkVycm9yCisgICAgeworICAgICAgICBwdWJsaWMgc3RyaW5nIFJ1bGVOYW1lOworICAgICAgICBwdWJsaWMgc3RyaW5nIEVycm9yTWVzc2FnZTsKKyAgICAgICAgcHVibGljIHN0cmluZyBCbG9ja0xldmVsQ29udGVudElkZW50aWZpZXI7ICAvLyB0aGlzIHN0cmluZyBpcyB0aGUgc2FtZSBhcyB0aGUgdW5pZCB0aGF0IGlzIGluIHRoZSBzb3VyY2UgZG9jdW1lbnQuICBUaGlzIHN0cmluZyBzaG91bGQgYmUgc3VmZmljaWVudCB0byBpZGVudGlmeSBhbmQgZmluZCBhbnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIHBhcmFncmFwaCwgdGFibGUsIHJvdywgY2VsbCwgb3IgYW55dGhpbmcgZWxzZSBpbiB0aGUgc291cmNlIGRvY3VtZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub3csIGkgYW0gcHV0dGluZyBhbiBpbnRlZ2VyIGludG8gdGhpcyBhdHRyaWJ1dGUgLyBpZCwgYnV0IEkgZXhwZWN0IHRoYXQgdGhpcyB3aWxsIGJlIG1vcmUgZWxhYm9yYXRlIHRoYW4gdGhpcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJIG5lZWQgdG8gYWdhaW4gcmVzZWFyY2ggZXhhY3RseSBob3cgdG8gbW92ZSB0byBhIHNwZWNpZmljIHBhcmFncmFwaCBvciB0YWJsZSBpbiBhIGRvY3VtZW50LCBpbiBhIFZTVE8gYXBwLgorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBXbWxUb1htbFByb2dyZXNzSW5mbworICAgIHsKKyAgICAgICAgcHVibGljIGludCBDb250ZW50Q291bnQ7CisgICAgICAgIHB1YmxpYyBpbnQgQ29udGVudFRvdGFsOworICAgICAgICBwdWJsaWMgc3RyaW5nIEluUHJvZ3Jlc3NNZXNzYWdlOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1JbmZvCisgICAgeworICAgICAgICBwdWJsaWMgc3RyaW5nIERlZmF1bHRMYW5nRnJvbVN0eWxlc1BhcnQ7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFdtbFRvWG1sU2V0dGluZ3MKKyAgICB7CisgICAgICAgIHB1YmxpYyBMaXN0PENvbnRlbnRUeXBlUnVsZT4gR2xvYmFsQ29udGVudFR5cGVSdWxlczsKKyAgICAgICAgcHVibGljIExpc3Q8Q29udGVudFR5cGVSdWxlPiBEb2N1bWVudFR5cGVDb250ZW50VHlwZVJ1bGVzOworICAgICAgICBwdWJsaWMgTGlzdDxDb250ZW50VHlwZVJ1bGU+IERvY3VtZW50Q29udGVudFR5cGVSdWxlczsKKyAgICAgICAgcHVibGljIExpc3Q8Q29udGVudFR5cGVSdWxlPiBSdW5Db250ZW50VHlwZVJ1bGVzOworICAgICAgICBwdWJsaWMgTGlzdDxHbG9iYWxWYWxpZGF0aW9uUnVsZT4gR2xvYmFsVmFsaWRhdGlvblJ1bGVzOworICAgICAgICBwdWJsaWMgTGlzdDxCbG9ja0xldmVsQ29udGVudFZhbGlkYXRpb25SdWxlPiBCbG9ja0xldmVsQ29udGVudFZhbGlkYXRpb25SdWxlczsKKyAgICAgICAgcHVibGljIExpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3MgTGlzdEl0ZW1SZXRyaWV2ZXJTZXR0aW5nczsKKyAgICAgICAgcHVibGljIGJvb2w/IEluamVjdENvbW1lbnRGb3JDb250ZW50VHlwZXM7CisgICAgICAgIHB1YmxpYyBYRWxlbWVudCBDb250ZW50VHlwZUhpZXJhcmNoeURlZmluaXRpb247CisgICAgICAgIHB1YmxpYyBGdW5jPFhFbGVtZW50LCBXbWxUb1htbFNldHRpbmdzLCBib29sPiBDb250ZW50VHlwZUhpZXJhcmNoeUxhbWJkYTsKKyAgICAgICAgcHVibGljIERpY3Rpb25hcnk8c3RyaW5nLCBGdW5jPHN0cmluZywgT3BlblhtbFBhcnQsIFhFbGVtZW50LCBXbWxUb1htbFNldHRpbmdzLCBvYmplY3Q+PiBYbWxHZW5lcmF0aW9uTGFtYmRhczsKKyAgICAgICAgcHVibGljIERpcmVjdG9yeUluZm8gSW1hZ2VCYXNlOworICAgICAgICBwdWJsaWMgYm9vbCBXcml0ZUltYWdlRmlsZXMgPSB0cnVlOworICAgICAgICBwdWJsaWMgQWN0aW9uPFdtbFRvWG1sUHJvZ3Jlc3NJbmZvPiBQcm9ncmVzc0Z1bmN0aW9uOworICAgICAgICBwdWJsaWMgWERvY3VtZW50IENvbnRlbnRUeXBlUmVnZXhFeHRlbnNpb247CisgICAgICAgIHB1YmxpYyBzdHJpbmcgRGVmYXVsdExhbmc7CisgICAgICAgIHB1YmxpYyBvYmplY3QgVXNlckRhdGE7CisKKyAgICAgICAgcHVibGljIFdtbFRvWG1sU2V0dGluZ3MoCisgICAgICAgICAgICBMaXN0PENvbnRlbnRUeXBlUnVsZT4gZ2xvYmFsQ29udGVudFR5cGVSdWxlcywKKyAgICAgICAgICAgIExpc3Q8Q29udGVudFR5cGVSdWxlPiBkb2N1bWVudFR5cGVDb250ZW50VHlwZVJ1bGVzLAorICAgICAgICAgICAgTGlzdDxDb250ZW50VHlwZVJ1bGU+IGRvY3VtZW50Q29udGVudFR5cGVSdWxlcywKKyAgICAgICAgICAgIExpc3Q8Q29udGVudFR5cGVSdWxlPiBydW5Db250ZW50VHlwZVJ1bGVzLAorICAgICAgICAgICAgTGlzdDxHbG9iYWxWYWxpZGF0aW9uUnVsZT4gZ2xvYmFsVmFsaWRhdGlvblJ1bGVzLAorICAgICAgICAgICAgTGlzdDxCbG9ja0xldmVsQ29udGVudFZhbGlkYXRpb25SdWxlPiBibG9ja0xldmVsQ29udGVudFZhbGlkYXRpb25SdWxlcywKKyAgICAgICAgICAgIFhFbGVtZW50IGNvbnRlbnRUeXBlSGllcmFyY2h5RGVmaW5pdGlvbiwKKyAgICAgICAgICAgIEZ1bmM8WEVsZW1lbnQsIFdtbFRvWG1sU2V0dGluZ3MsIGJvb2w+IGNvbnRlbnRUeXBlSGllcmFyY2h5TGFtYmRhLAorICAgICAgICAgICAgRGljdGlvbmFyeTxzdHJpbmcsIEZ1bmM8c3RyaW5nLCBPcGVuWG1sUGFydCwgWEVsZW1lbnQsIFdtbFRvWG1sU2V0dGluZ3MsIG9iamVjdD4+IHhtbEdlbmVyYXRpb25MYW1iZGFzLAorICAgICAgICAgICAgRGlyZWN0b3J5SW5mbyBpbWFnZUJhc2UsCisgICAgICAgICAgICBYRG9jdW1lbnQgY29udGVudFR5cGVSZWdleEV4dGVuc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgR2xvYmFsQ29udGVudFR5cGVSdWxlcyA9IGdsb2JhbENvbnRlbnRUeXBlUnVsZXM7CisgICAgICAgICAgICBEb2N1bWVudFR5cGVDb250ZW50VHlwZVJ1bGVzID0gZG9jdW1lbnRUeXBlQ29udGVudFR5cGVSdWxlczsKKyAgICAgICAgICAgIERvY3VtZW50Q29udGVudFR5cGVSdWxlcyA9IGRvY3VtZW50Q29udGVudFR5cGVSdWxlczsKKyAgICAgICAgICAgIFJ1bkNvbnRlbnRUeXBlUnVsZXMgPSBydW5Db250ZW50VHlwZVJ1bGVzOworICAgICAgICAgICAgR2xvYmFsVmFsaWRhdGlvblJ1bGVzID0gZ2xvYmFsVmFsaWRhdGlvblJ1bGVzOworICAgICAgICAgICAgQmxvY2tMZXZlbENvbnRlbnRWYWxpZGF0aW9uUnVsZXMgPSBibG9ja0xldmVsQ29udGVudFZhbGlkYXRpb25SdWxlczsKKyAgICAgICAgICAgIExpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3MgPSBuZXcgTGlzdEl0ZW1SZXRyaWV2ZXJTZXR0aW5ncygpOworICAgICAgICAgICAgQ29udGVudFR5cGVIaWVyYXJjaHlEZWZpbml0aW9uID0gY29udGVudFR5cGVIaWVyYXJjaHlEZWZpbml0aW9uOworICAgICAgICAgICAgQ29udGVudFR5cGVIaWVyYXJjaHlMYW1iZGEgPSBjb250ZW50VHlwZUhpZXJhcmNoeUxhbWJkYTsKKyAgICAgICAgICAgIFhtbEdlbmVyYXRpb25MYW1iZGFzID0geG1sR2VuZXJhdGlvbkxhbWJkYXM7CisgICAgICAgICAgICBJbWFnZUJhc2UgPSBpbWFnZUJhc2U7CisgICAgICAgICAgICBDb250ZW50VHlwZVJlZ2V4RXh0ZW5zaW9uID0gY29udGVudFR5cGVSZWdleEV4dGVuc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBXbWxUb1htbFNldHRpbmdzKAorICAgICAgICAgICAgTGlzdDxDb250ZW50VHlwZVJ1bGU+IGdsb2JhbENvbnRlbnRUeXBlUnVsZXMsCisgICAgICAgICAgICBMaXN0PENvbnRlbnRUeXBlUnVsZT4gZG9jdW1lbnRUeXBlQ29udGVudFR5cGVSdWxlcywKKyAgICAgICAgICAgIExpc3Q8Q29udGVudFR5cGVSdWxlPiBkb2N1bWVudENvbnRlbnRUeXBlUnVsZXMsCisgICAgICAgICAgICBMaXN0PENvbnRlbnRUeXBlUnVsZT4gcnVuQ29udGVudFR5cGVSdWxlcywKKyAgICAgICAgICAgIExpc3Q8R2xvYmFsVmFsaWRhdGlvblJ1bGU+IGdsb2JhbFZhbGlkYXRpb25SdWxlcywKKyAgICAgICAgICAgIExpc3Q8QmxvY2tMZXZlbENvbnRlbnRWYWxpZGF0aW9uUnVsZT4gYmxvY2tMZXZlbENvbnRlbnRWYWxpZGF0aW9uUnVsZXMsCisgICAgICAgICAgICBGdW5jPFhFbGVtZW50LCBXbWxUb1htbFNldHRpbmdzLCBib29sPiBjb250ZW50VHlwZUhpZXJhcmNoeUxhbWJkYSwKKyAgICAgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBGdW5jPHN0cmluZywgT3BlblhtbFBhcnQsIFhFbGVtZW50LCBXbWxUb1htbFNldHRpbmdzLCBvYmplY3Q+PiB4bWxHZW5lcmF0aW9uTGFtYmRhcywKKyAgICAgICAgICAgIExpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3MgbGlzdEl0ZW1SZXRyaWV2ZXJTZXR0aW5ncywKKyAgICAgICAgICAgIERpcmVjdG9yeUluZm8gaW1hZ2VCYXNlLAorICAgICAgICAgICAgWERvY3VtZW50IGNvbnRlbnRUeXBlUmVnZXhFeHRlbnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIEdsb2JhbENvbnRlbnRUeXBlUnVsZXMgPSBnbG9iYWxDb250ZW50VHlwZVJ1bGVzOworICAgICAgICAgICAgRG9jdW1lbnRUeXBlQ29udGVudFR5cGVSdWxlcyA9IGRvY3VtZW50VHlwZUNvbnRlbnRUeXBlUnVsZXM7CisgICAgICAgICAgICBEb2N1bWVudENvbnRlbnRUeXBlUnVsZXMgPSBkb2N1bWVudENvbnRlbnRUeXBlUnVsZXM7CisgICAgICAgICAgICBSdW5Db250ZW50VHlwZVJ1bGVzID0gcnVuQ29udGVudFR5cGVSdWxlczsKKyAgICAgICAgICAgIEdsb2JhbFZhbGlkYXRpb25SdWxlcyA9IGdsb2JhbFZhbGlkYXRpb25SdWxlczsKKyAgICAgICAgICAgIEJsb2NrTGV2ZWxDb250ZW50VmFsaWRhdGlvblJ1bGVzID0gYmxvY2tMZXZlbENvbnRlbnRWYWxpZGF0aW9uUnVsZXM7CisgICAgICAgICAgICBMaXN0SXRlbVJldHJpZXZlclNldHRpbmdzID0gbGlzdEl0ZW1SZXRyaWV2ZXJTZXR0aW5nczsKKyAgICAgICAgICAgIENvbnRlbnRUeXBlSGllcmFyY2h5TGFtYmRhID0gY29udGVudFR5cGVIaWVyYXJjaHlMYW1iZGE7CisgICAgICAgICAgICBYbWxHZW5lcmF0aW9uTGFtYmRhcyA9IHhtbEdlbmVyYXRpb25MYW1iZGFzOworICAgICAgICAgICAgSW1hZ2VCYXNlID0gaW1hZ2VCYXNlOworICAgICAgICAgICAgQ29udGVudFR5cGVSZWdleEV4dGVuc2lvbiA9IGNvbnRlbnRUeXBlUmVnZXhFeHRlbnNpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdtbFRvWG1sCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIFdtbERvY3VtZW50IEFwcGx5Q29udGVudFR5cGVzKFdtbERvY3VtZW50IGRvY3VtZW50LCBXbWxUb1htbFNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoZG9jdW1lbnQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYyA9IHN0cmVhbURvYy5HZXRXb3JkcHJvY2Vzc2luZ0RvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBcHBseUNvbnRlbnRUeXBlcyhkb2MsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbURvYy5HZXRNb2RpZmllZFdtbERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQXBwbHlDb250ZW50VHlwZXMoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jLCBXbWxUb1htbFNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisjaWYgZmFsc2UKKzxFeHRlbnNpb25zPgorICA8RXh0ZW5zaW9uIENvbnRlbnRUeXBlPSdJbnRyb2R1Y3Rpb24nPgorICAgIDxSZWdleEV4dGVuc2lvbj4KKyAgICAgIDxSZWdleD4uKkluZnJvZHVjdGlvbi4qPC9SZWdleD4KKyAgICAgIDxSZWdleD4uKkVudHJvZHVjdGlvbi4qPC9SZWdleD4KKyAgICA8L1JlZ2V4RXh0ZW5zaW9uPgorICA8L0V4dGVuc2lvbj4KKzwvRXh0ZW5zaW9ucz4KKyNlbmRpZgorICAgICAgICAgICAgaWYgKHNldHRpbmdzLkNvbnRlbnRUeXBlUmVnZXhFeHRlbnNpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZXh0IGluIHNldHRpbmdzLkNvbnRlbnRUeXBlUmVnZXhFeHRlbnNpb24uUm9vdC5FbGVtZW50cygiRXh0ZW5zaW9uIikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY3QgPSAoc3RyaW5nKWV4dC5BdHRyaWJ1dGUoIkNvbnRlbnRUeXBlIik7CisgICAgICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHNldHRpbmdzLkRvY3VtZW50Q29udGVudFR5cGVSdWxlcy5Db25jYXQoc2V0dGluZ3MuRG9jdW1lbnRUeXBlQ29udGVudFR5cGVSdWxlcykuQ29uY2F0KHNldHRpbmdzLkdsb2JhbENvbnRlbnRUeXBlUnVsZXMpOworICAgICAgICAgICAgICAgICAgICB2YXIgcnVsZVRvVXBkYXRlID0gcnVsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChyID0+IHIuQ29udGVudFR5cGUgPT0gY3QpOworICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRvVXBkYXRlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkNvbnRlbnRUeXBlUmV4ZXhFeHRlbnNpb24gcmVmZXJzIHRvIGNvbnRlbnQgdHlwZSB0aGF0IGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgICAgICAgICAgICAgIHZhciBvbGRSZWdleFJ1bGVzID0gcnVsZVRvVXBkYXRlLlJlZ2V4QXJyYXkuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdSZWdleFJ1bGVzID0gZXh0LkVsZW1lbnRzKCJSZWdleEV4dGVuc2lvbiIpLkVsZW1lbnRzKCJSZWdleCIpLlNlbGVjdCh6ID0+IG5ldyBSZWdleCh6LlZhbHVlKSkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICB2YXIgcmVnZXhBcnJheSA9IG9sZFJlZ2V4UnVsZXMuQ29uY2F0KG5ld1JlZ2V4UnVsZXMpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZVRvVXBkYXRlLlJlZ2V4QXJyYXkgPSByZWdleEFycmF5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNldHRpbmdzLlByb2dyZXNzRnVuY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXbWxUb1htbFByb2dyZXNzSW5mbyBwaSA9IG5ldyBXbWxUb1htbFByb2dyZXNzSW5mbygpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb250ZW50Q291bnQgPSAwLAorICAgICAgICAgICAgICAgICAgICBDb250ZW50VG90YWwgPSAwLAorICAgICAgICAgICAgICAgICAgICBJblByb2dyZXNzTWVzc2FnZSA9ICJTaW1wbGlmeSBtYXJrdXAiICsgRW52aXJvbm1lbnQuTmV3TGluZSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHNldHRpbmdzLlByb2dyZXNzRnVuY3Rpb24ocGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTaW1wbGlmeU1hcmt1cFNldHRpbmdzIG1hcmt1cFNpbXBsaWZpZXJTZXR0aW5ncyA9IG5ldyBTaW1wbGlmeU1hcmt1cFNldHRpbmdzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBY2NlcHRSZXZpc2lvbnMgPSB0cnVlLAorICAgICAgICAgICAgICAgIE5vcm1hbGl6ZVhtbCA9IHRydWUsCisgICAgICAgICAgICAgICAgUmVtb3ZlQm9va21hcmtzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgUmVtb3ZlQ29tbWVudHMgPSB0cnVlLAorICAgICAgICAgICAgICAgIFJlbW92ZUNvbnRlbnRDb250cm9scyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIFJlbW92ZUVuZEFuZEZvb3ROb3RlcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIFJlbW92ZUZpZWxkQ29kZXMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICBSZW1vdmVHb0JhY2tCb29rbWFyayA9IHRydWUsCisgICAgICAgICAgICAgICAgUmVtb3ZlSHlwZXJsaW5rcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIFJlbW92ZUxhc3RSZW5kZXJlZFBhZ2VCcmVhayA9IHRydWUsCisgICAgICAgICAgICAgICAgUmVtb3ZlTWFya3VwRm9yRG9jdW1lbnRDb21wYXJpc29uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgUmVtb3ZlUGVybWlzc2lvbnMgPSB0cnVlLAorICAgICAgICAgICAgICAgIFJlbW92ZVByb29mID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBSZW1vdmVSc2lkSW5mbyA9IHRydWUsCisgICAgICAgICAgICAgICAgUmVtb3ZlU21hcnRUYWdzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBSZW1vdmVTb2Z0SHlwaGVucyA9IGZhbHNlLAorICAgICAgICAgICAgICAgIFJlbW92ZVdlYkhpZGRlbiA9IHRydWUsCisgICAgICAgICAgICAgICAgUmVwbGFjZVRhYnNXaXRoU3BhY2VzID0gZmFsc2UsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgTWFya3VwU2ltcGxpZmllci5TaW1wbGlmeU1hcmt1cCh3RG9jLCBtYXJrdXBTaW1wbGlmaWVyU2V0dGluZ3MpOworCisgICAgICAgICAgICBpZiAoc2V0dGluZ3MuUHJvZ3Jlc3NGdW5jdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdtbFRvWG1sUHJvZ3Jlc3NJbmZvIHBpID0gbmV3IFdtbFRvWG1sUHJvZ3Jlc3NJbmZvKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnRlbnRDb3VudCA9IDAsCisgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUb3RhbCA9IDAsCisgICAgICAgICAgICAgICAgICAgIEluUHJvZ3Jlc3NNZXNzYWdlID0gIkFzc2VtYmxlIGZvcm1hdHRpbmciICsgRW52aXJvbm1lbnQuTmV3TGluZSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHNldHRpbmdzLlByb2dyZXNzRnVuY3Rpb24ocGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGb3JtYXR0aW5nQXNzZW1ibGVyU2V0dGluZ3MgZm9ybWF0dGluZ0Fzc2VtYmxlclNldHRpbmdzID0gbmV3IEZvcm1hdHRpbmdBc3NlbWJsZXJTZXR0aW5ncygpOworICAgICAgICAgICAgZm9ybWF0dGluZ0Fzc2VtYmxlclNldHRpbmdzLlJlbW92ZVN0eWxlTmFtZXNGcm9tUGFyYWdyYXBoQW5kUnVuUHJvcGVydGllcyA9IGZhbHNlOworICAgICAgICAgICAgZm9ybWF0dGluZ0Fzc2VtYmxlclNldHRpbmdzLlJlc3RyaWN0VG9TdXBwb3J0ZWRMYW5ndWFnZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvcm1hdHRpbmdBc3NlbWJsZXJTZXR0aW5ncy5SZXN0cmljdFRvU3VwcG9ydGVkTnVtYmVyaW5nRm9ybWF0cyA9IGZhbHNlOworICAgICAgICAgICAgRm9ybWF0dGluZ0Fzc2VtYmxlci5Bc3NlbWJsZUZvcm1hdHRpbmcod0RvYywgZm9ybWF0dGluZ0Fzc2VtYmxlclNldHRpbmdzKTsKKworICAgICAgICAgICAgQ29udGVudFR5cGVBcHBsaWVySW5mbyBjdGFpID0gbmV3IENvbnRlbnRUeXBlQXBwbGllckluZm8oKTsKKworICAgICAgICAgICAgWERvY3VtZW50IHNYRG9jID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgWEVsZW1lbnQgZGVmYXVsdFBhcmFncmFwaFN0eWxlID0gc1hEb2MKKyAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnN0eWxlKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChzdCA9PiBzdC5BdHRyaWJ1dGUoVy5fZGVmYXVsdCkuVG9Cb29sZWFuKCkgPT0gdHJ1ZSAmJgorICAgICAgICAgICAgICAgICAgICAoc3RyaW5nKXN0LkF0dHJpYnV0ZShXLnR5cGUpID09ICJwYXJhZ3JhcGgiKTsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0UGFyYWdyYXBoU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjdGFpLkRlZmF1bHRQYXJhZ3JhcGhTdHlsZU5hbWUgPSAoc3RyaW5nKWRlZmF1bHRQYXJhZ3JhcGhTdHlsZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGRlZmF1bHRDaGFyYWN0ZXJTdHlsZSA9IHNYRG9jCisgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoc3QgPT4gc3QuQXR0cmlidXRlKFcuX2RlZmF1bHQpLlRvQm9vbGVhbigpID09IHRydWUgJiYKKyAgICAgICAgICAgICAgICAgICAgKHN0cmluZylzdC5BdHRyaWJ1dGUoVy50eXBlKSA9PSAiY2hhcmFjdGVyIik7CisgICAgICAgICAgICBpZiAoZGVmYXVsdENoYXJhY3RlclN0eWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgY3RhaS5EZWZhdWx0Q2hhcmFjdGVyU3R5bGVOYW1lID0gKHN0cmluZylkZWZhdWx0Q2hhcmFjdGVyU3R5bGUuQXR0cmlidXRlKFcuc3R5bGVJZCk7CisgICAgICAgICAgICBYRWxlbWVudCBkZWZhdWx0VGFibGVTdHlsZSA9IHNYRG9jCisgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoc3QgPT4gc3QuQXR0cmlidXRlKFcuX2RlZmF1bHQpLlRvQm9vbGVhbigpID09IHRydWUgJiYKKyAgICAgICAgICAgICAgICAgICAgKHN0cmluZylzdC5BdHRyaWJ1dGUoVy50eXBlKSA9PSAidGFibGUiKTsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0VGFibGVTdHlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGN0YWkuRGVmYXVsdFRhYmxlU3R5bGVOYW1lID0gKHN0cmluZylkZWZhdWx0VGFibGVTdHlsZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKTsKKworICAgICAgICAgICAgaWYgKHNldHRpbmdzLlByb2dyZXNzRnVuY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXbWxUb1htbFByb2dyZXNzSW5mbyBwaSA9IG5ldyBXbWxUb1htbFByb2dyZXNzSW5mbygpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb250ZW50Q291bnQgPSAwLAorICAgICAgICAgICAgICAgICAgICBDb250ZW50VG90YWwgPSAwLAorICAgICAgICAgICAgICAgICAgICBJblByb2dyZXNzTWVzc2FnZSA9ICJBc3NlbWJsZSBsaXN0IGl0ZW0gaW5mb3JtYXRpb24iICsgRW52aXJvbm1lbnQuTmV3TGluZSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHNldHRpbmdzLlByb2dyZXNzRnVuY3Rpb24ocGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMaXN0SXRlbVJldHJpZXZlclNldHRpbmdzIGxpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3MgPSBuZXcgTGlzdEl0ZW1SZXRyaWV2ZXJTZXR0aW5ncygpOworICAgICAgICAgICAgQXNzZW1ibGVMaXN0SXRlbUluZm9ybWF0aW9uKHdEb2MsIHNldHRpbmdzLkxpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3MpOworICAgICAgICAgICAgQXBwbHlDb250ZW50VHlwZXNGb3JSdWxlU2V0KHNldHRpbmdzLCBjdGFpLCB3RG9jKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWEVsZW1lbnQgUHJvZHVjZUNvbnRlbnRUeXBlWG1sKFdtbERvY3VtZW50IGRvY3VtZW50LCBXbWxUb1htbFNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoZG9jdW1lbnQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYyA9IHN0cmVhbURvYy5HZXRXb3JkcHJvY2Vzc2luZ0RvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvZHVjZUNvbnRlbnRUeXBlWG1sKGRvYywgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWEVsZW1lbnQgUHJvZHVjZUNvbnRlbnRUeXBlWG1sKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYywgV21sVG9YbWxTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG1haW5QYXJ0ID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0OworICAgICAgICAgICAgdmFyIG1haW5YRG9jID0gbWFpblBhcnQuR2V0WERvY3VtZW50KCk7CisKKyNpZiBmYWxzZQorPHc6c3R5bGVzIHhtbG5zOm1jPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvbWFya3VwLWNvbXBhdGliaWxpdHkvMjAwNiIgeG1sbnM6cj0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcyIgeG1sbnM6dz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluIiB4bWxuczp3MTQ9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3dvcmQvMjAxMC93b3JkbWwiIHhtbG5zOncxNT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDEyL3dvcmRtbCIgeG1sbnM6dzE2c2U9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3dvcmQvMjAxNS93b3JkbWwvc3ltZXgiIG1jOklnbm9yYWJsZT0idzE0IHcxNSB3MTZzZSI+CisJPHc6ZG9jRGVmYXVsdHM+CisJCTx3OnJQckRlZmF1bHQ+CisJCQk8dzpyUHI+CisJCQkJPHc6ckZvbnRzIHc6YXNjaWk9Ikdlb3JnaWEiIHc6ZWFzdEFzaWFUaGVtZT0ibWlub3JIQW5zaSIgdzpoQW5zaT0iR2VvcmdpYSIgdzpjcz0iVGltZXMgTmV3IFJvbWFuIi8+CisJCQkJPHc6bGFuZyB3OnZhbD0iZW4tVVMiIHc6ZWFzdEFzaWE9ImVuLVVTIiB3OmJpZGk9ImFyLVNBIi8+CisJCQk8L3c6clByPgorCQk8L3c6clByRGVmYXVsdD4KKwkJPHc6cFByRGVmYXVsdC8+CisJPC93OmRvY0RlZmF1bHRzPgorI2VuZGlmCisKKyAgICAgICAgICAgIEFzc2lnbkxldmVsc1RvQ29udGVudChtYWluWERvYywgc2V0dGluZ3MpOworCisgICAgICAgICAgICAvLyBDYWxsIFJldHJpZXZlTGlzdEl0ZW0gc28gdGhhdCBhbGwgcGFyYWdyYXBocyBhcmUgaW5pdGlhbGl6ZWQgd2l0aCBMaXN0SXRlbUluZm8KKyAgICAgICAgICAgIHZhciBmaXJzdFBhcmFncmFwaCA9IG1haW5YRG9jLkRlc2NlbmRhbnRzKFcucCkuRmlyc3RPckRlZmF1bHQoKTsKKworICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gY29udGVudCwgdGhlbiByZXR1cm4gYW4gZW1wdHkgZG9jdW1lbnQuCisgICAgICAgICAgICBpZiAoZmlyc3RQYXJhZ3JhcGggPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KCJDb250ZW50VHlwZVhtbCIpOworCisgICAgICAgICAgICB2YXIgbGlzdEl0ZW0gPSBMaXN0SXRlbVJldHJpZXZlci5SZXRyaWV2ZUxpc3RJdGVtKHdEb2MsIGZpcnN0UGFyYWdyYXBoKTsKKworICAgICAgICAgICAgLy8gQW5ub3RhdGUgcnVucyBhc3NvY2lhdGVkIHdpdGggZmllbGRzLCBzbyB0aGF0IGNhbiByZXRyaWV2ZSBoeXBlcmxpbmtzIHRoYXQgYXJlIHN0b3JlZCBhcyBmaWVsZHMuCisgICAgICAgICAgICBGaWVsZFJldHJpZXZlci5Bbm5vdGF0ZVdpdGhGaWVsZEluZm8od0RvYy5NYWluRG9jdW1lbnRQYXJ0KTsKKworICAgICAgICAgICAgQW5ub3RhdGVSdW5zVGhhdFVzZUZpZWxkc0Zvck51bWJlcmluZyhtYWluWERvYyk7CisKKyAgICAgICAgICAgIHZhciBuZXdSb290ID0gKFhFbGVtZW50KUFubm90YXRlUnVuc1RoYXRVc2VGbGRTaW1wbGUobWFpblhEb2MuUm9vdCk7CisgICAgICAgICAgICBtYWluWERvYy5Sb290LlJlcGxhY2VXaXRoKG5ld1Jvb3QpOworCisgICAgICAgICAgICB3RG9jLk1haW5Eb2N1bWVudFBhcnQuUHV0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIC8vIEFubm90YXRlIHJ1bnMgYXNzb2NpYXRlZCB3aXRoIGZpZWxkcywgc28gdGhhdCBjYW4gcmV0cmlldmUgaHlwZXJsaW5rcyB0aGF0IGFyZSBzdG9yZWQgYXMgZmllbGRzLgorICAgICAgICAgICAgRmllbGRSZXRyaWV2ZXIuQW5ub3RhdGVXaXRoRmllbGRJbmZvKHdEb2MuTWFpbkRvY3VtZW50UGFydCk7CisKKyAgICAgICAgICAgIG1haW5YRG9jID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICB2YXIgYm9keSA9IG1haW5YRG9jLlJvb3QuRGVzY2VuZGFudHMoVy5ib2R5KS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGJvZHkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBpbnZhbGlkIGRvY3VtZW50Iik7CisKKyAgICAgICAgICAgIHZhciBjb250ZW50TGlzdCA9IGJvZHkuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IGUuQXR0cmlidXRlKFB0T3BlblhtbC5MZXZlbCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIHZhciByb290TGV2ZWxDb250ZW50TGlzdCA9IGNvbnRlbnRMaXN0CisgICAgICAgICAgICAgICAgLldoZXJlKGggPT4gKGludCloLkF0dHJpYnV0ZShQdE9wZW5YbWwuTGV2ZWwpID09IDEpCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICB2YXIgY29udGVudFR5cGVYbWwgPSBuZXcgWEVsZW1lbnQoIkNvbnRlbnRUeXBlWG1sIiwKKyAgICAgICAgICAgICAgICByb290TGV2ZWxDb250ZW50TGlzdAorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGggPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkcmVuSGVhZGluZ3MgPSBHZXRDaGlsZHJlbkhlYWRpbmdzKG1haW5QYXJ0LCBjb250ZW50TGlzdCwgaCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgeG1sID0gKFhFbGVtZW50KVByb2R1Y2VYbWxUcmFuc2Zvcm0obWFpblBhcnQsIGgsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWwuQWRkKGNoaWxkcmVuSGVhZGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhtbDsKKyAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICBjb250ZW50VHlwZVhtbCA9IEhpZXJhcmNoeVBlclNldHRpbmdzKGNvbnRlbnRUeXBlWG1sLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgIHJldHVybiBjb250ZW50VHlwZVhtbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEhpZXJhcmNoeVBlclNldHRpbmdzKFhFbGVtZW50IGNvbnRlbnRUeXBlWG1sLCBXbWxUb1htbFNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaGllcmFyY2h5RGVmaW5pdGlvbiA9IHNldHRpbmdzLkNvbnRlbnRUeXBlSGllcmFyY2h5RGVmaW5pdGlvbjsKKyAgICAgICAgICAgIEhhc2hTZXQ8WE5hbWU+IGhpZXJhcmNoeUVsZW1lbnRzID0gbmV3IEhhc2hTZXQ8WE5hbWU+KGhpZXJhcmNoeURlZmluaXRpb24uRGVzY2VuZGFudHNBbmRTZWxmKCkuU2VsZWN0KGQgPT4gZC5OYW1lKS5EaXN0aW5jdCgpKTsKKworICAgICAgICAgICAgU3RhY2s8WEVsZW1lbnQ+IHN0YWNrID0gbmV3IFN0YWNrPFhFbGVtZW50PigpOworICAgICAgICAgICAgdmFyIHJvb3RFbGVtZW50ID0gaGllcmFyY2h5RGVmaW5pdGlvbgorICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGUgPT4gKGJvb2wpZS5BdHRyaWJ1dGUoIklzUm9vdCIpKTsKKyAgICAgICAgICAgIGlmIChyb290RWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW52YWxpZCBjb250ZW50IHR5cGUgaGllcmFyY2h5IGRlZmluaXRpb24gLSBubyByb290IGVsZW1lbnQiKTsKKyAgICAgICAgICAgIHN0YWNrLlB1c2gocm9vdEVsZW1lbnQpOworCisgICAgICAgICAgICB2YXIgY3VycmVudGx5TG9va2luZ0F0ID0gaGllcmFyY2h5RGVmaW5pdGlvbi5FbGVtZW50KHJvb3RFbGVtZW50Lk5hbWUpOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBjb250ZW50VHlwZVhtbC5FbGVtZW50cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaGllcmFyY2h5RWxlbWVudHMuQ29udGFpbnMoaXRlbS5OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIkludmFsaWQgQ29udGVudCBUeXBlIEhpZXJhcmNoeSBEZWZpbml0aW9uIC0gbWlzc2luZyBkZWYgZm9yIHswfSIsIGl0ZW0uTmFtZSkpOworCisgICAgICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHZhciBwb3NzaWJsZUNoaWxkSXRlbSA9IGN1cnJlbnRseUxvb2tpbmdBdC5FbGVtZW50KGl0ZW0uTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHBvc3NpYmxlQ2hpbGRJdGVtICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXBvc3NpYmxlQ2hpbGRJdGVtLkhhc0F0dHJpYnV0ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbnlNaXNtYXRjaCA9IHBvc3NpYmxlQ2hpbGRJdGVtLkF0dHJpYnV0ZXMoKS5BbnkoYSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwxID0gYS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYTIgPSBpdGVtLkF0dHJpYnV0ZShhLk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhMiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsMiA9IGEyLlZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwxICE9IHZhbDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbnlNaXNtYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5BZGQobmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLkluZGVudExldmVsLCBzdGFjay5Db3VudCgpKSk7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrLlB1c2goaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseUxvb2tpbmdBdCA9IEZpbmRDdXJyZW50bHlMb29raW5nQXQoaGllcmFyY2h5RGVmaW5pdGlvbiwgaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGllcmFyY2h5RWxlbWVudHMuQ29udGFpbnMoaXRlbS5OYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2suQ291bnQoKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgZW5jb3VudGVyZWQgYW4gdW5leHBlY3RlZCBoaWVyYXJjaHkgZWxlbWVudC4gIGhhdmUgZ29uZSB1cCB0aGUgc3RhY2ssIGFuZCBubyBlbGVtZW50IHVwIHRoZSBzdGFjayBhbGxvd3MgZm9yIHRoaXMgYXMgYSBjaGlsZCBlbGVtZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgcHV0IGl0IGF0IGxldmVsIG9uZSwgYW5kIGxldCB0aGUgTmFycmRvYyB0cmFuc2Zvcm0gZ2VuZXJhdGUgaW52YWxpZCBuYXJyZG9jLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uQWRkKG5ldyBYQXR0cmlidXRlKFB0T3BlblhtbC5JbmRlbnRMZXZlbCwgc3RhY2suQ291bnQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suUG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdCA9IHN0YWNrLlBlZWsoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseUxvb2tpbmdBdCA9IEZpbmRDdXJyZW50bHlMb29raW5nQXQoaGllcmFyY2h5RGVmaW5pdGlvbiwgbGFzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvdW5kMiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvc3NpYmxlQ2hpbGRJdGVtMiA9IGN1cnJlbnRseUxvb2tpbmdBdC5FbGVtZW50KGl0ZW0uTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zc2libGVDaGlsZEl0ZW0yICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3NzaWJsZUNoaWxkSXRlbTIuSGFzQXR0cmlidXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbnlNaXNtYXRjaDIgPSBwb3NzaWJsZUNoaWxkSXRlbTIuQXR0cmlidXRlcygpLkFueShhID0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwxID0gYS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhMiA9IGl0ZW0uQXR0cmlidXRlKGEuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYTIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwyID0gYTIuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsMSAhPSB2YWwyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbnlNaXNtYXRjaDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZDIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZDIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5BZGQobmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLkluZGVudExldmVsLCBzdGFjay5Db3VudCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suUHVzaChpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlMb29raW5nQXQgPSBGaW5kQ3VycmVudGx5TG9va2luZ0F0KGhpZXJhcmNoeURlZmluaXRpb24sIGl0ZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLkNvdW50KCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIGVycm9yID0gcmVhY2hlZCB0b3Agb2YgaGllcmFyY2h5IC0gcHJvYiBub3QgYW4gaW50ZXJuYWwgZXJyb3IgLSBzb21lIG90aGVyIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBjb250aW51ZSBvbiB0byBuZXh0IGl0ZW0uCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBoaWVyYXJjaGljYWxDb250ZW50VHlwZVhtbCA9IG5ldyBYRWxlbWVudCgiQ29udGVudFR5cGVYbWwiLAorICAgICAgICAgICAgICAgIEhpZXJhcmNoeVBlclNldHRpbmdzVHJhbnNmb3JtKGNvbnRlbnRUeXBlWG1sLkVsZW1lbnRzKCksIDEpKTsKKworICAgICAgICAgICAgaGllcmFyY2hpY2FsQ29udGVudFR5cGVYbWwuRGVzY2VuZGFudHNBbmRTZWxmKCkuQXR0cmlidXRlcyhQdE9wZW5YbWwuSW5kZW50TGV2ZWwpLlJlbW92ZSgpOworCisgICAgICAgICAgICByZXR1cm4gaGllcmFyY2hpY2FsQ29udGVudFR5cGVYbWw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBGaW5kQ3VycmVudGx5TG9va2luZ0F0KFhFbGVtZW50IGhpZXJhcmNoeURlZmluaXRpb24sIFhFbGVtZW50IGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjYW5kaWRhdGVzID0gaGllcmFyY2h5RGVmaW5pdGlvbgorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhpdGVtLk5hbWUpCisgICAgICAgICAgICAgICAgLk9yZGVyQnlEZXNjZW5kaW5nKGUgPT4gZS5BdHRyaWJ1dGVzKCkuQ291bnQoKSk7CisKKyAgICAgICAgICAgIHZhciB0aGVPbmUgPSBjYW5kaWRhdGVzCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGMgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYy5IYXNBdHRyaWJ1dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHZhciBhbnlNaXNtYXRjaDIgPSBjLkF0dHJpYnV0ZXMoKS5BbnkoYSA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsMSA9IGEuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYTIgPSBpdGVtLkF0dHJpYnV0ZShhLk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsMiA9IGEyLlZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbDEgIT0gdmFsMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbnlNaXNtYXRjaDIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBpZiAodGhlT25lID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworCisgICAgICAgICAgICByZXR1cm4gdGhlT25lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IEhpZXJhcmNoeVBlclNldHRpbmdzVHJhbnNmb3JtKElFbnVtZXJhYmxlPFhFbGVtZW50PiBsaXN0LCBpbnQgbGV2ZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHNtYWxsIG9wdGltaXphdGlvbiAtIG90aGVyIGNvZGUgaW4gdGhpcyBtZXRob2Qgd291bGQgaGF2ZSBzYW1lIGVmZmVjdCwgYnV0IHRoaXMgaXMgbW9yZSBlZmZpY2llbnQuCisgICAgICAgICAgICBpZiAoIWxpc3QuQW55KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIExpc3Q8aW50PiBncm91cGluZ0tleXMgPSBuZXcgTGlzdDxpbnQ+KCk7CisgICAgICAgICAgICBpbnQgY3VycmVudEdyb3VwaW5nS2V5ID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGxpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0uQXR0cmlidXRlKFB0T3BlblhtbC5JbmRlbnRMZXZlbCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIkludmFsaWQgQ29udGVudCBUeXBlIEhpZXJhcmNoeSBEZWZpbml0aW9uIC0gbWlzc2luZyBkZWYgZm9yIHswfSIsIGl0ZW0uTmFtZSkpOworICAgICAgICAgICAgICAgIGlmICgoaW50KWl0ZW0uQXR0cmlidXRlKFB0T3BlblhtbC5JbmRlbnRMZXZlbCkgPT0gbGV2ZWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXBpbmdLZXkgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ3JvdXBpbmdLZXlzLkFkZChjdXJyZW50R3JvdXBpbmdLZXkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgemlwcGVkID0gbGlzdAorICAgICAgICAgICAgICAgIC5aaXAoZ3JvdXBpbmdLZXlzLCAoaXRlbSwga2V5KSA9PiBuZXcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEl0ZW0gPSBpdGVtLAorICAgICAgICAgICAgICAgICAgICBLZXkgPSBrZXksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuR3JvdXBCeSh6ID0+IHouS2V5KQorICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKworICAgICAgICAgICAgdmFyIG5ld0NvbnRlbnQgPSB6aXBwZWQKKyAgICAgICAgICAgICAgICAuU2VsZWN0KHogPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IHouRmlyc3QoKS5JdGVtOworICAgICAgICAgICAgICAgICAgICB2YXIgbmV3SXRlbSA9IG5ldyBYRWxlbWVudChmaXJzdC5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QuRWxlbWVudHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhpZXJhcmNoeVBlclNldHRpbmdzVHJhbnNmb3JtKHouU2tpcCgxKS5TZWxlY3QociA9PiByLkl0ZW0pLCBsZXZlbCArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0l0ZW07CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXdDb250ZW50OworICAgICAgICB9CisKKworICAgICAgICAvLyB0aGlzIGlzIHdoZXJlIHdlIG5lZWQgdG8gZG8gdGhlIHNhbWUgdHlwZSBvZiBydW4gYW5ub3RhdGlvbiBhcyBmb3IgY29tcGxleCBmaWVsZHMsIGJ1dCBmb3Igc2ltcGxlIGZpZWxkcy4KKyAgICAgICAgLy8gSSB0aGluayB0aGF0IHdlIG1heSBuZWVkIHRvIHNwbGl0IHVwIHRoZSBydW4gZm9sbG93aW5nIHRoZSBzaW1wbGUgZmllbGQKKworI2lmIGZhbHNlCis8dzpwIHB0OlN0eWxlTmFtZT0iQ2FwdGlvbiIgcHQ6Q29udGVudFR5cGU9IkNhcHRpb24iIHB0OkxldmVsPSIyIj4KKyAgPHc6ciBwdDpDb250ZW50VHlwZT0iU3BhbiI+CisgICAgPHc6dCB4bWw6c3BhY2U9InByZXNlcnZlIj5UYWJsZSA8L3c6dD4KKyAgPC93OnI+CisgIDx3OnI+CisgICAgPHc6ZmxkQ2hhciB3OmZsZENoYXJUeXBlPSJiZWdpbiIgLz4KKyAgPC93OnI+CisgIDx3OnI+CisgICAgPHc6aW5zdHJUZXh0IHhtbDpzcGFjZT0icHJlc2VydmUiPiBTVFlMRVJFRiAxIFxzIDwvdzppbnN0clRleHQ+CisgIDwvdzpyPgorICA8dzpyPgorICAgIDx3OmZsZENoYXIgdzpmbGRDaGFyVHlwZT0ic2VwYXJhdGUiIC8+CisgIDwvdzpyPgorICA8dzpyIHB0OkNvbnRlbnRUeXBlPSJTcGFuIj4KKyAgICA8dzp0PjE8L3c6dD4KKyAgPC93OnI+CisgIDx3OnI+CisgICAgPHc6ZmxkQ2hhciB3OmZsZENoYXJUeXBlPSJlbmQiIC8+CisgIDwvdzpyPgorICA8dzpyIHB0OkNvbnRlbnRUeXBlPSJTcGFuIj4KKyAgICA8dzp0Pi48L3c6dD4KKyAgPC93OnI+CisgIDx3OnI+CisgICAgPHc6ZmxkQ2hhciB3OmZsZENoYXJUeXBlPSJiZWdpbiIgLz4KKyAgPC93OnI+CisgIDx3OnI+CisgICAgPHc6aW5zdHJUZXh0IHhtbDpzcGFjZT0icHJlc2VydmUiPiBTRVEgVGFibGUgXCogQVJBQklDIDwvdzppbnN0clRleHQ+CisgIDwvdzpyPgorICA8dzpyPgorICAgIDx3OmZsZENoYXIgdzpmbGRDaGFyVHlwZT0ic2VwYXJhdGUiIC8+CisgIDwvdzpyPgorICA8dzpyIHB0OkNvbnRlbnRUeXBlPSJTcGFuIj4KKyAgICA8dzp0PjE8L3c6dD4KKyAgPC93OnI+CisgIDx3OnI+CisgICAgPHc6ZmxkQ2hhciB3OmZsZENoYXJUeXBlPSJlbmQiIC8+CisgIDwvdzpyPgorICA8dzpyIHB0OkNvbnRlbnRUeXBlPSJTcGFuIj4KKyAgICA8dzp0PlR5cGUgdGhlIHRpdGxlIGhlcmU8L3c6dD4KKyAgPC93OnI+Cis8L3c6cD4KKyNlbmRpZgorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQW5ub3RhdGVSdW5zVGhhdFVzZUZpZWxkc0Zvck51bWJlcmluZyhYRG9jdW1lbnQgbWFpblhEb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjYWNoZWRBbm5vdGF0aW9uSW5mb3JtYXRpb24gPSBtYWluWERvYy5Sb290LkFubm90YXRpb248RGljdGlvbmFyeTxpbnQsIExpc3Q8WEVsZW1lbnQ+Pj4oKTsKKyAgICAgICAgICAgIGlmIChjYWNoZWRBbm5vdGF0aW9uSW5mb3JtYXRpb24gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gY2FjaGVkQW5ub3RhdGlvbkluZm9ybWF0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBpbnN0clRleHQgPSBGaWVsZFJldHJpZXZlci5JbnN0clRleHQobWFpblhEb2MuUm9vdCwgaXRlbS5LZXkpLlRyaW1TdGFydCgneycpLlRyaW1FbmQoJ30nKTsKKyAgICAgICAgICAgICAgICB2YXIgZmkgPSBGaWVsZFJldHJpZXZlci5QYXJzZUZpZWxkKGluc3RyVGV4dCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZmkuRmllbGRUeXBlLlRvVXBwZXIoKSA9PSAiU0VRIiB8fCBmaS5GaWVsZFR5cGUuVG9VcHBlcigpID09ICJTVFlMRVJFRiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcnVuc0ZvckZpZWxkID0gbWFpblhEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKGQgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFjazxGaWVsZFJldHJpZXZlci5GaWVsZEVsZW1lbnRUeXBlSW5mbz4gc3RhY2sgPSBkLkFubm90YXRpb248U3RhY2s8RmllbGRSZXRyaWV2ZXIuRmllbGRFbGVtZW50VHlwZUluZm8+PigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjayA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLkFueShzdGFja0l0ZW0gPT4gc3RhY2tJdGVtLklkID09IGl0ZW0uS2V5ICYmIHN0YWNrSXRlbS5GaWVsZEVsZW1lbnRUeXBlID09IEZpZWxkUmV0cmlldmVyLkZpZWxkRWxlbWVudFR5cGVFbnVtLlJlc3VsdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGQgPT4gZC5BbmNlc3RvcnNBbmRTZWxmKFcucikuRmlyc3RPckRlZmF1bHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZSh6OSA9PiB6OSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgLkdyb3VwQWRqYWNlbnQobyA9PiBvKQorICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChnID0+IGcuRmlyc3QoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShyID0+IHIuRWxlbWVudChXLnQpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFydW5zRm9yRmllbGQuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdFJ1biA9IHJ1bnNGb3JGaWVsZC5MYXN0T3JEZWZhdWx0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmEgPSBsYXN0UnVuCisgICAgICAgICAgICAgICAgICAgICAgICAuQW5jZXN0b3JzKFcucCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkludGVybmFsIGVycm9yIC0gaW52YWxpZCBkb2N1bWVudCIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFscmVhZHkgcHJvY2Vzc2VkCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhLkRlc2NlbmRhbnRzKFcucikuQW55KHIgPT4gci5BdHRyaWJ1dGUoUHRPcGVuWG1sLkxpc3RJdGVtUnVuKSAhPSBudWxsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIHZhciBsYXN0RmxkQ2hhclJ1biA9IHBhcmEKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnIpCisgICAgICAgICAgICAgICAgICAgICAgICAuTGFzdE9yRGVmYXVsdChyID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuRWxlbWVudChXLmZsZENoYXIpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFjazxGaWVsZFJldHJpZXZlci5GaWVsZEVsZW1lbnRUeXBlSW5mbz4gc3RhY2sgPSByLkFubm90YXRpb248U3RhY2s8RmllbGRSZXRyaWV2ZXIuRmllbGRFbGVtZW50VHlwZUluZm8+PigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjayA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2suQW55KHN0YWNrSXRlbSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zdHJUZXh0MiA9IEZpZWxkUmV0cmlldmVyLkluc3RyVGV4dChtYWluWERvYy5Sb290LCBzdGFja0l0ZW0uSWQpLlRyaW1TdGFydCgneycpLlRyaW1FbmQoJ30nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaTIgPSBGaWVsZFJldHJpZXZlci5QYXJzZUZpZWxkKGluc3RyVGV4dDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpMi5GaWVsZFR5cGUuVG9VcHBlcigpID09ICJTRVEiIHx8IGZpMi5GaWVsZFR5cGUuVG9VcHBlcigpID09ICJTVFlMRVJFRiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudEFmdGVyID0gbGFzdEZsZENoYXJSdW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50c0FmdGVyU2VsZihXLnIpCisgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50QWZ0ZXIgbWF5IGJlIG51bGwgLSB0aGF0IGlzIG9rIC0gdGhlIHJlc3Qgb2YgdGhlIHJvdXRpbmUgd29ya3MgcHJvcGVybHkgaW4gdGhpcyBjYXNlLgorCisgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0SXRlbVRleHQgPSBwYXJhCisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5yKQorICAgICAgICAgICAgICAgICAgICAgICAgLlRha2VXaGlsZShlID0+IGUgIT0gZWxlbWVudEFmdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChyMSA9PiByMS5EZXNjZW5kYW50cyhXLnQpLlNlbGVjdCh0ID0+IChzdHJpbmcpdCkuU3RyaW5nQ29uY2F0ZW5hdGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TdHJpbmdDb25jYXRlbmF0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuVHJpbSgpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0UnVuID0gbGFzdEZsZENoYXJSdW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50c0FmdGVyU2VsZihXLnIpCisgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQobnIgPT4gbnIuRWxlbWVudChXLnQpICE9IG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBsYXN0RmxkQ2hhclJ1blRleHQgPSBsYXN0RmxkQ2hhclJ1bgorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzQmVmb3JlU2VsZihXLnIpCisgICAgICAgICAgICAgICAgICAgICAgICAuUmV2ZXJzZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3QociA9PiByLkVsZW1lbnQoVy50KSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQoVy50KTsKKworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc2VwQ2hhcnNTdHJpbmcgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRSdW4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRSdW5UZXh0RWxlbWVudCA9IG5leHRSdW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudChXLnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFJ1blRleHQgPSBuZXh0UnVuVGV4dEVsZW1lbnQuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VwQ2hhcnMgPSBuZXh0UnVuVGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UYWtlV2hpbGUoY2ggPT4gY2ggPT0gJy4nIHx8IGNoID09ICcgJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcENoYXJzU3RyaW5nID0gbmV4dFJ1blRleHQuU3Vic3RyaW5nKDAsIHNlcENoYXJzLkNvdW50KCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UnVuVGV4dCA9IG5leHRSdW5UZXh0LlN1YnN0cmluZyhzZXBDaGFycy5Db3VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSdW5UZXh0RWxlbWVudC5WYWx1ZSA9IG5leHRSdW5UZXh0OworCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RmxkQ2hhclJ1blRleHQuVmFsdWUgPSBsYXN0RmxkQ2hhclJ1blRleHQuVmFsdWUgKyBzZXBDaGFyc1N0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFJlZ2V4IHJlID0gbmV3IFJlZ2V4KCJbQS1GMC05Ll0rJCIpOworICAgICAgICAgICAgICAgICAgICBNYXRjaCBtID0gcmUuTWF0Y2gobGlzdEl0ZW1UZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hdGNoZWRWYWx1ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChtLlN1Y2Nlc3MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRWYWx1ZSA9IG0uVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZFZhbHVlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRWYWx1ZSArPSBzZXBDaGFyc1N0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRWYWx1ZSA9IG1hdGNoZWRWYWx1ZS5UcmltU3RhcnQoJy4nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRWYWx1ZSA9IG1hdGNoZWRWYWx1ZS5UcmltRW5kKCcuJywgJyAnKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJ1biBpbiBwYXJhLkVsZW1lbnRzKFcucikuVGFrZVdoaWxlKGUgPT4gZSAhPSBlbGVtZW50QWZ0ZXIpLldoZXJlKGUgPT4gZS5FbGVtZW50KFcudCkgIT0gbnVsbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLkFkZChuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuTGlzdEl0ZW1SdW4sIG1hdGNoZWRWYWx1ZSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyNpZiBmYWxzZQorICAgICAgICAgICAgICAgIC8vIG9sZCBjb2RlCisgICAgICAgICAgICAgICAgaWYgKGZpLkZpZWxkVHlwZS5Ub1VwcGVyKCkgPT0gIlNFUSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIGl0CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJ1bnNGb3JGaWVsZCA9IG1haW5YRG9jCisgICAgICAgICAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZShkID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhY2s8RmllbGRSZXRyaWV2ZXIuRmllbGRFbGVtZW50VHlwZUluZm8+IHN0YWNrID0gZC5Bbm5vdGF0aW9uPFN0YWNrPEZpZWxkUmV0cmlldmVyLkZpZWxkRWxlbWVudFR5cGVJbmZvPj4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2sgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5Bbnkoc3RhY2tJdGVtID0+IHN0YWNrSXRlbS5JZCA9PSBpdGVtLktleSAmJiBzdGFja0l0ZW0uRmllbGRFbGVtZW50VHlwZSA9PSBGaWVsZFJldHJpZXZlci5GaWVsZEVsZW1lbnRUeXBlRW51bS5SZXN1bHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChkID0+IGQuQW5jZXN0b3JzQW5kU2VsZihXLnIpLkZpcnN0T3JEZWZhdWx0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoejkgPT4gejkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Hcm91cEFkamFjZW50KG8gPT4gbykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoZyA9PiBnLkZpcnN0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUociA9PiByLkVsZW1lbnQoVy50KSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghcnVuc0ZvckZpZWxkLkFueSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RSdW4gPSBydW5zRm9yRmllbGQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5MYXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RSdW5UZXh0RWxlbWVudCA9IGxhc3RSdW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50KFcudCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RSdW5UZXh0ID0gbGFzdFJ1blRleHRFbGVtZW50LlZhbHVlOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRSdW4gPSBsYXN0UnVuCisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHNBZnRlclNlbGYoVy5yKQorICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KHIgPT4gci5FbGVtZW50KFcudCkgIT0gbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRSdW4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRSdW5UZXh0RWxlbWVudCA9IG5leHRSdW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudChXLnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFJ1blRleHQgPSBuZXh0UnVuVGV4dEVsZW1lbnQuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VwQ2hhcnMgPSBuZXh0UnVuVGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UYWtlV2hpbGUoY2ggPT4gY2ggPT0gJy4nIHx8IGNoID09ICcgJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSdW5UZXh0ID0gbmV4dFJ1blRleHQuU3Vic3RyaW5nKHNlcENoYXJzLkNvdW50KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFJ1blRleHRFbGVtZW50LlZhbHVlID0gbmV4dFJ1blRleHQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RSdW5UZXh0ID0gbGFzdFJ1blRleHRFbGVtZW50LlZhbHVlICsgc2VwQ2hhcnMuU2VsZWN0KGNoID0+IGNoLlRvU3RyaW5nKCkpLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UnVuVGV4dEVsZW1lbnQuVmFsdWUgPSBsYXN0UnVuVGV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxhc3RSdW4uQWRkKG5ldyBYQXR0cmlidXRlKFB0T3BlblhtbC5MaXN0SXRlbVJ1biwgbGFzdFJ1blRleHQpKTsKKworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcnVuYmVmb3JlIGluIGxhc3RSdW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50c0JlZm9yZVNlbGYoVy5yKQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKHJ6ID0+IHJ6LkVsZW1lbnQoVy50KSAhPSBudWxsKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcnVuYmVmb3JlLkFkZChuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuTGlzdEl0ZW1SdW4sIGxhc3RSdW5UZXh0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisjaWYgZmFsc2UKKzx3OnAgcHQxNDpTdHlsZU5hbWU9IkNhcHRpb24iPgorICA8dzpyPgorICAgIDx3OnQgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Qm94IDwvdzp0PgorICA8L3c6cj4KKyAgPHc6ZmxkU2ltcGxlIHc6aW5zdHI9IiBTRVEgQm94IFwqIEFSQUJJQyAiPgorICAgIDx3OnI+CisgICAgICA8dzp0PjE8L3c6dD4KKyAgICA8L3c6cj4KKyAgPC93OmZsZFNpbXBsZT4KKyAgPHc6cj4KKyAgICA8dzp0Pi4gVHlwZSB0aGUgdGl0bGUgaGVyZTwvdzp0PgorICA8L3c6cj4KKzwvdzpwPgorI2VuZGlmCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBBbm5vdGF0ZVJ1bnNUaGF0VXNlRmxkU2ltcGxlKFhOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnAgJiYKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5FbGVtZW50cyhXLmZsZFNpbXBsZSkuQW55KGZzID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnN0clRleHQgPSAoKHN0cmluZylmcy5BdHRyaWJ1dGUoVy5pbnN0cikpLlRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0clRleHQuU3RhcnRzV2l0aCgiU0VRIik7CisgICAgICAgICAgICAgICAgICAgIH0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZsZFNpbXBsZSA9IGVsZW1lbnQuRWxlbWVudHMoVy5mbGRTaW1wbGUpLkZpcnN0T3JEZWZhdWx0KGZzID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnN0clRleHQgPSAoKHN0cmluZylmcy5BdHRyaWJ1dGUoVy5pbnN0cikpLlRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0clRleHQuU3RhcnRzV2l0aCgiU0VRIik7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB2YXIgaW5zdHIgPSAoKHN0cmluZylmbGRTaW1wbGUuQXR0cmlidXRlKFcuaW5zdHIpKS5UcmltKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBkbyBzb21lIGZ1bm55IGJ1c2luZXNzIGhlcmUgYmVjYXVzZSBXb3JkIHB1dHMgdGhlICIuICIgYXMgcGFydCBvZiB0aGUgdGV4dCBmb2xsb3dpbmcgdGhlIGZsZFNpbXBsZSwgYW5kIHdlIHdhbnQgdGhhdCB0ZXh0IHRvIGJlIHBhcnQgb2YgdGhlIGxpc3QgaXRlbS4KKyAgICAgICAgICAgICAgICAgICAgdmFyIHJ1bkFmdGVyID0gZmxkU2ltcGxlLkVsZW1lbnRzQWZ0ZXJTZWxmKFcucikuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJ1bkFmdGVyVGV4dCA9IHJ1bkFmdGVyLkVsZW1lbnRzKFcudCkuU2VsZWN0KHQgPT4gKHN0cmluZyl0KS5TdHJpbmdDb25jYXRlbmF0ZSgpOworICAgICAgICAgICAgICAgICAgICB2YXIgcnVuQWZ0ZXJUZXh0VHJpbW1lZCA9IHJ1bkFmdGVyVGV4dC5UcmltU3RhcnQoJy4nLCAnICcpOworICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdEl0ZW1OdW0gPSBmbGRTaW1wbGUuRWxlbWVudHMoVy5yKS5FbGVtZW50cyhXLnQpLlNlbGVjdCh0ID0+IChzdHJpbmcpdCkuU3RyaW5nQ29uY2F0ZW5hdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJ1bnNCZWZvcmUgPSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLlRha2VXaGlsZShmcyA9PiBmcy5OYW1lICE9IFcuZmxkU2ltcGxlIHx8IChmcy5OYW1lID09IFcuZmxkU2ltcGxlICYmICEoKHN0cmluZylmcy5BdHRyaWJ1dGUoVy5pbnN0cikpLlRyaW0oKS5TdGFydHNXaXRoKCJTRVEiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGUgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyNpZiBmYWxzZQorPHc6ciBwdDE0OlN0eWxlTmFtZT0iRGVmYXVsdFBhcmFncmFwaEZvbnQiIHB0MTQ6Rm9udE5hbWU9IkNhbGlicmkiIHB0MTQ6TGFuZ3VhZ2VUeXBlPSJ3ZXN0ZXJuIiBwdDE0Okxpc3RJdGVtUnVuPSIzIiB4bWxuczpwdDE0PSJodHRwOi8vcG93ZXJ0b29scy5jb2RlcGxleC5jb20vMjAxMSIgeG1sbnM6dz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluIj4KKyAgPHc6clByPgorICAgIDx3OnJGb250cyB3OmFzY2lpVGhlbWU9Im1pbm9ySEFuc2kiIHc6aEFuc2lUaGVtZT0ibWlub3JIQW5zaSIgdzplYXN0QXNpYVRoZW1lPSJtaW5vckhBbnNpIiB3OmNzdGhlbWU9Im1pbm9yQmlkaSIgdzphc2NpaT0iQ2FsaWJyaSIgdzpoQW5zaT0iQ2FsaWJyaSIgdzplYXN0QXNpYT0iQ2FsaWJyaSIgdzpjcz0iIiAvPgorICAgIDx3OmJDcyAvPgorICAgIDx3OnN6IHc6dmFsPSIyMiIgLz4KKyAgICA8dzpzekNzIHc6dmFsPSIyMiIgLz4KKyAgICA8dzpsYW5nIHc6YmlkaT0iYXItU0EiIHc6ZWFzdEFzaWE9ImVuLVVTIiB3OnZhbD0iZW4tVVMiIC8+CisgIDwvdzpyUHI+CisgIDx3OnQ+My48L3c6dD4KKzwvdzpyPgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0UgPSBuZXcgWEVsZW1lbnQoZSk7IC8vIGNsb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuVmFsdWUgIT0gIiIgJiYgZS5BdHRyaWJ1dGUoUHRPcGVuWG1sLkxpc3RJdGVtUnVuKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFLkFkZChuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuTGlzdEl0ZW1SdW4sIGxpc3RJdGVtTnVtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgICAgICAgICB2YXIgZmxkU2ltcGxlUnVucyA9IGZsZFNpbXBsZS5FbGVtZW50cygpLlNlbGVjdChlID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0UgPSBuZXcgWEVsZW1lbnQoZS5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLkxpc3RJdGVtUnVuLCBsaXN0SXRlbU51bSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuRWxlbWVudHMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJ1bkFmdGVyVGV4dFRyaW1tZWRMZW5ndGggPSBydW5BZnRlclRleHQuTGVuZ3RoIC0gcnVuQWZ0ZXJUZXh0VHJpbW1lZC5MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHJ1bkFmdGVyTGlzdEl0ZW1FbGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bkFmdGVyVGV4dFRyaW1tZWRMZW5ndGggIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcnVuQWZ0ZXJMaXN0SXRlbUVsZW1lbnQgPSBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkFmdGVyLkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuTGlzdEl0ZW1SdW4sIGxpc3RJdGVtTnVtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5BZnRlci5FbGVtZW50cyhXLnJQciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudCwgcnVuQWZ0ZXJUZXh0LlN1YnN0cmluZygwLCBydW5BZnRlclRleHRUcmltbWVkTGVuZ3RoKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHJ1bkFmdGVyUmVtYWluZGVyRWxlbWVudCA9IG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgICAgICBydW5BZnRlci5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBydW5BZnRlci5FbGVtZW50cyhXLnJQciksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50LCBydW5BZnRlclRleHQuU3Vic3RyaW5nKHJ1bkFmdGVyVGV4dFRyaW1tZWRMZW5ndGgpKSk7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdQYXJhID0gbmV3IFhFbGVtZW50KFcucCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcnVuc0JlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsZFNpbXBsZVJ1bnMsCisgICAgICAgICAgICAgICAgICAgICAgICBydW5BZnRlckxpc3RJdGVtRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkFmdGVyUmVtYWluZGVyRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsZFNpbXBsZS5FbGVtZW50c0FmdGVyU2VsZihXLnIpLlNraXAoMSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3UGFyYTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBBbm5vdGF0ZVJ1bnNUaGF0VXNlRmxkU2ltcGxlKG4pKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgbWV0aG9kIHByb2R1Y2VzIHRoZSBYTUwgZm9yIGFuIGVuZG5vdGUgb3IgZm9vdG5vdGUgLSB0aGUgYmxvY2tMZXZlbENvbnRlbnRDb250YWluZXIgaXMgdGhlIHc6ZW5kbm90ZSBvciB3OmZvb3Rub3RlIGVsZW1lbnQsIGFuZCBpdCBwcm9kdWNlcyB0aGUgY29udGVudCB0eXBlIFhNTCBmb3IgdGhlCisgICAgICAgIC8vIGNvbnRlbnRzIG9mIHRoZSBlbmRub3RlIG9yIGZvb3Rub3RlLCB0byBiZSBpbnNlcnRlZCBlbiBzaXR1IGluIHRoZSBDb250ZW50VHlwZVhtbC4KKyAgICAgICAgcHVibGljIHN0YXRpYyBvYmplY3QgUHJvZHVjZUNvbnRlbnRUeXBlWG1sRm9yQmxvY2tMZXZlbENvbnRlbnRDb250YWluZXIoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jLCBXbWxUb1htbFNldHRpbmdzIHNldHRpbmdzLCBPcGVuWG1sUGFydCBwYXJ0LCBYRWxlbWVudCBibG9ja0xldmVsQ29udGVudENvbnRhaW5lcikKKyAgICAgICAgeworICAgICAgICAgICAgQXNzaWduTGV2ZWxzVG9Db250ZW50Rm9yRW5kRm9vdE5vdGUoYmxvY2tMZXZlbENvbnRlbnRDb250YWluZXIsIHNldHRpbmdzKTsKKworICAgICAgICAgICAgLy8gQ2FsbCBSZXRyaWV2ZUxpc3RJdGVtIHNvIHRoYXQgYWxsIHBhcmFncmFwaHMgYXJlIGluaXRpYWxpemVkIHdpdGggTGlzdEl0ZW1JbmZvCisgICAgICAgICAgICB2YXIgZmlyc3RQYXJhZ3JhcGggPSBibG9ja0xldmVsQ29udGVudENvbnRhaW5lci5EZXNjZW5kYW50cyhXLnApLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICB2YXIgbGlzdEl0ZW0gPSBMaXN0SXRlbVJldHJpZXZlci5SZXRyaWV2ZUxpc3RJdGVtKHdEb2MsIGZpcnN0UGFyYWdyYXBoKTsKKworICAgICAgICAgICAgdmFyIGNvbnRlbnRMaXN0ID0gYmxvY2tMZXZlbENvbnRlbnRDb250YWluZXIuRWxlbWVudHMoKQorICAgICAgICAgICAgICAgIC5XaGVyZShlID0+IGUuQXR0cmlidXRlKFB0T3BlblhtbC5MZXZlbCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIHZhciByb290TGV2ZWxDb250ZW50TGlzdCA9IGNvbnRlbnRMaXN0CisgICAgICAgICAgICAgICAgLldoZXJlKGggPT4gKGludCloLkF0dHJpYnV0ZShQdE9wZW5YbWwuTGV2ZWwpID09IDEpCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICB2YXIgY29udGVudFR5cGVYbWwgPSByb290TGV2ZWxDb250ZW50TGlzdAorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGggPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkcmVuSGVhZGluZ3MgPSBHZXRDaGlsZHJlbkhlYWRpbmdzKHBhcnQsIGNvbnRlbnRMaXN0LCBoLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCB4bWwgPSAoWEVsZW1lbnQpUHJvZHVjZVhtbFRyYW5zZm9ybShwYXJ0LCBoLCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeG1sICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sLkFkZChjaGlsZHJlbkhlYWRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4bWw7CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gY29udGVudFR5cGVYbWw7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBHZXRDaGlsZHJlbkhlYWRpbmdzKE9wZW5YbWxQYXJ0IHBhcnQsIExpc3Q8WEVsZW1lbnQ+IGNvbnRlbnRMaXN0LCBYRWxlbWVudCBwYXJlbnQsIFdtbFRvWG1sU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZW50TGlzdAorICAgICAgICAgICAgICAgICAgICAuU2tpcFdoaWxlKGggPT4gaCAhPSBwYXJlbnQpCisgICAgICAgICAgICAgICAgICAgIC5Ta2lwKDEpCisgICAgICAgICAgICAgICAgICAgIC5UYWtlV2hpbGUoaCA9PiAoaW50KWguQXR0cmlidXRlKFB0T3BlblhtbC5MZXZlbCkgPiAoaW50KXBhcmVudC5BdHRyaWJ1dGUoUHRPcGVuWG1sLkxldmVsKSkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKGggPT4gKGludCloLkF0dHJpYnV0ZShQdE9wZW5YbWwuTGV2ZWwpID09IChpbnQpcGFyZW50LkF0dHJpYnV0ZShQdE9wZW5YbWwuTGV2ZWwpICsgMSkKKyAgICAgICAgICAgICAgICAgICAgLlNlbGVjdChoID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbkhlYWRpbmdzID0gR2V0Q2hpbGRyZW5IZWFkaW5ncyhwYXJ0LCBjb250ZW50TGlzdCwgaCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgeG1sID0gKFhFbGVtZW50KVByb2R1Y2VYbWxUcmFuc2Zvcm0ocGFydCwgaCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhtbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbC5BZGQoY2hpbGRyZW5IZWFkaW5ncyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geG1sOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIG9iamVjdCBQcm9kdWNlWG1sVHJhbnNmb3JtKE9wZW5YbWxQYXJ0IHBhcnQsIFhOb2RlIG5vZGUsIFdtbFRvWG1sU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLlhtbEdlbmVyYXRpb25MYW1iZGFzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlhtbCBHZW5lcmF0aW9uIExhbWJkYXMgYXJlIHJlcXVpcmVkIik7CisKKyAgICAgICAgICAgICAgICB2YXIgY29udGVudFR5cGUgPSAoc3RyaW5nKWVsZW1lbnQuQXR0cmlidXRlKFB0T3BlblhtbC5Db250ZW50VHlwZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcudCB8fCBlbGVtZW50Lk5hbWUgPT0gVy5mbGRTaW1wbGUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KHogPT4gUHJvZHVjZVhtbFRyYW5zZm9ybShwYXJ0LCB6LCBzZXR0aW5ncykpOworCisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwgJiYgZWxlbWVudC5OYW1lID09IFcucikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5YbWxHZW5lcmF0aW9uTGFtYmRhcy5Db250YWluc0tleSgiUnVuIikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYW1kYSA9IHNldHRpbmdzLlhtbEdlbmVyYXRpb25MYW1iZGFzWyJSdW4iXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdFbGVtZW50ID0gbGFtZGEoY29udGVudFR5cGUsIHBhcnQsIGVsZW1lbnQsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJFbnRyeSBmb3IgUnVuIGNvbnRlbnQgdHlwZSBpbiBYTUwgZ2VuZXJhdGlvbiBsYW1iZGFzIGlzIHJlcXVpcmVkIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5OYW1lID09IFcuaHlwZXJsaW5rKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLlhtbEdlbmVyYXRpb25MYW1iZGFzLkNvbnRhaW5zS2V5KCJIeXBlcmxpbmsiKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhbWRhID0gc2V0dGluZ3MuWG1sR2VuZXJhdGlvbkxhbWJkYXNbIkh5cGVybGluayJdOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnQgPSBsYW1kYShjb250ZW50VHlwZSwgcGFydCwgZWxlbWVudCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIkVudHJ5IGZvciBIeXBlcmxpbmsgY29udGVudCB0eXBlIGluIFhNTCBnZW5lcmF0aW9uIGxhbWJkYXMgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuWG1sR2VuZXJhdGlvbkxhbWJkYXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLlhtbEdlbmVyYXRpb25MYW1iZGFzLkNvbnRhaW5zS2V5KGNvbnRlbnRUeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFtZGEgPSBzZXR0aW5ncy5YbWxHZW5lcmF0aW9uTGFtYmRhc1tjb250ZW50VHlwZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnQgPSBsYW1kYShjb250ZW50VHlwZSwgcGFydCwgZWxlbWVudCwgc2V0dGluZ3MpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxhbmcgPSAoc3RyaW5nKWVsZW1lbnQuRWxlbWVudHMoVy5wUHIpLkVsZW1lbnRzKFcuclByKS5FbGVtZW50cyhXLmxhbmcpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmcgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZyA9IHNldHRpbmdzLkRlZmF1bHRMYW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYW5nICE9IG51bGwgJiYgISBsYW5nLlN0YXJ0c1dpdGgoImVuIikpICAvLyBUT0RPIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBsYW5nIGlmIEVuZ2xpc2gsIGJ1dCB0aGlzIG5lZWRzIHJldmlzZWQgYWZ0ZXIgYW5hbHlzaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbmV3RWxlbWVudCBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5BZGQobmV3IFhBdHRyaWJ1dGUoIkxhbmciLCBsYW5nKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5BdHRyaWJ1dGUoUHRPcGVuWG1sLlVuaWQpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5BZGQobmV3IFhBdHRyaWJ1dGUoIlVuaWQiLCBlbGVtZW50LkF0dHJpYnV0ZShQdE9wZW5YbWwuVW5pZCkuVmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4yID0gbmV3RWxlbWVudCBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobjIgIT0gbnVsbCAmJiBlbGVtZW50LkF0dHJpYnV0ZShQdE9wZW5YbWwuVW5pZCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4yLkFkZChuZXcgWEF0dHJpYnV0ZSgiVW5pZCIsIGVsZW1lbnQuQXR0cmlidXRlKFB0T3BlblhtbC5VbmlkKS5WYWx1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIGdlbmVyYXRpb24gcnVsZXMgYXJlIHNldCwgb3IgaWYgdGhlcmUgaXMgbm8gcnVsZSBmb3IgdGhpcyBjb250ZW50IHR5cGUsIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIGRlZmF1bHQsIGZvciBub3cuCisKKyAgICAgICAgICAgICAgICAgICAgLy8gdG9kbyB0aGlzIGlzIG5vdCBpZGVhbCBpbiBteSBtaW5kLiAgTmVlZCB0byB0aGluayBhYm91dCB0aGlzIG1vcmUuICBNYXliZSBldmVyeSBjb250ZW50IHR5cGUKKyAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGEgZ2VuZXJhdGlvbiBsYW1iZGEuCisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChjb250ZW50VHlwZSwgbmV3IFhFbGVtZW50KCJDb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuRWxlbWVudHMoKS5TZWxlY3QocmNlID0+IFByb2R1Y2VYbWxUcmFuc2Zvcm0ocGFydCwgcmNlLCBzZXR0aW5ncykpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaWdub3JlIGFueSBvdGhlciBlbGVtZW50cworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisjaWYgZmFsc2UKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBpbnNlcnRzIGFuIFhNTCBjb21tZW50IGZvciB1bmljb2RlIGNoYXJhY3RlcnMgYWJvdmUgMjU2CisKKyAgICAgICAgICAgIC8vIFRoaXMgY291bGQgYmUgbWFkZSBtb3JlIGVmZmljaWVudCAtIGdyb3VwIGNoYXJhY3RlcnMgdG9nZXRoZXIgYW5kIGNyZWF0ZSBmZXdlciBYVGV4dCBub2Rlcy4KKyAgICAgICAgICAgIC8vIEFzIGl0IGlzLCBpdCBpcyBwcmV0dHkgc2xvdywgc28gc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgZGVidWdnaW5nLgorCisgICAgICAgICAgICB2YXIgeHQgPSBub2RlIGFzIFhUZXh0OworICAgICAgICAgICAgaWYgKHh0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG5ld0NvbnRlbnQgPSB4dC5WYWx1ZS5TZWxlY3QoYyA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGljID0gKGludCljOworICAgICAgICAgICAgICAgICAgICBpZiAoaWMgPCAyNTYpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iamVjdCluZXcgWFRleHQoYy5Ub1N0cmluZygpKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3W10geworICAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdCluZXcgWFRleHQoYy5Ub1N0cmluZygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQ29tbWVudChpYy5Ub1N0cmluZygiWCIpKSwKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q29udGVudDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXNzaWduTGV2ZWxzVG9Db250ZW50KFhEb2N1bWVudCBtYWluWERvYywgV21sVG9YbWxTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbnRlbnRXaXRoQ29udGVudFR5cGUgPSBtYWluWERvYworICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzKCkKKyAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBkLk5hbWUgPT0gVy5wIHx8IGQuTmFtZSA9PSBXLnRibCB8fCBkLk5hbWUgPT0gVy50ciB8fCBkLk5hbWUgPT0gVy50YykKKyAgICAgICAgICAgICAgICAuV2hlcmUoZCA9PiBkLkF0dHJpYnV0ZShQdE9wZW5YbWwuQ29udGVudFR5cGUpICE9IG51bGwpCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICBpbnQgY3VycmVudExldmVsID0gMTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjb250ZW50IGluIGNvbnRlbnRXaXRoQ29udGVudFR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHRoaXNMZXZlbCA9IEdldEluZGVudExldmVsKGNvbnRlbnQsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAodGhpc0xldmVsID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb250ZW50LkFkZChuZXcgWEF0dHJpYnV0ZShQdE9wZW5YbWwuTGV2ZWwsIGN1cnJlbnRMZXZlbCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5BdHRyaWJ1dGUoUHRPcGVuWG1sLkxldmVsKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5BZGQobmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLkxldmVsLCB0aGlzTGV2ZWwpKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudExldmVsID0gKGludCl0aGlzTGV2ZWwgKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXNzaWduTGV2ZWxzVG9Db250ZW50Rm9yRW5kRm9vdE5vdGUoWEVsZW1lbnQgYmxvY2tMZXZlbENvbnRlbnRDb250YWluZXIsIFdtbFRvWG1sU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb250ZW50V2l0aENvbnRlbnRUeXBlID0gYmxvY2tMZXZlbENvbnRlbnRDb250YWluZXIKKyAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgIC5XaGVyZShkID0+IGQuTmFtZSA9PSBXLnAgfHwgZC5OYW1lID09IFcudGJsIHx8IGQuTmFtZSA9PSBXLnRyIHx8IGQuTmFtZSA9PSBXLnRjKQorICAgICAgICAgICAgICAgIC5XaGVyZShkID0+IGQuQXR0cmlidXRlKFB0T3BlblhtbC5Db250ZW50VHlwZSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjb250ZW50IGluIGNvbnRlbnRXaXRoQ29udGVudFR5cGUpCisgICAgICAgICAgICAgICAgY29udGVudC5BZGQobmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLkxldmVsLCAxKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQ/IEdldEluZGVudExldmVsKFhFbGVtZW50IGJsb2NrTGV2ZWxDb250ZW50LCBXbWxUb1htbFNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2V0dGluZ3MuQ29udGVudFR5cGVIaWVyYXJjaHlMYW1iZGEoYmxvY2tMZXZlbENvbnRlbnQsIHNldHRpbmdzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXBwbHkgdGhlIERvY3VtZW50IHJ1bGVzIGZpcnN0LCB0aGVuIGFwcGx5IHRoZSBEb2N1bWVudFR5cGUgcnVsZXMsIHRoZW4gYXBwbHkgdGhlIEdsb2JhbCBydWxlcy4gIEZpcnN0IG9uZSB0aGF0IG1hdGNoZXMsIHdpbnMuCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXBwbHlDb250ZW50VHlwZXNGb3JSdWxlU2V0KFdtbFRvWG1sU2V0dGluZ3Mgc2V0dGluZ3MsIENvbnRlbnRUeXBlQXBwbGllckluZm8gY3RhaSwgV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jKQorICAgICAgICB7CisgICAgICAgICAgICBBcHBseVJ1bGVzVG9QYXJ0KHNldHRpbmdzLCBjdGFpLCB3RG9jLCB3RG9jLk1haW5Eb2N1bWVudFBhcnQpOworICAgICAgICAgICAgaWYgKHdEb2MuTWFpbkRvY3VtZW50UGFydC5FbmRub3Rlc1BhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBBcHBseVJ1bGVzVG9QYXJ0KHNldHRpbmdzLCBjdGFpLCB3RG9jLCB3RG9jLk1haW5Eb2N1bWVudFBhcnQuRW5kbm90ZXNQYXJ0KTsKKyAgICAgICAgICAgIGlmICh3RG9jLk1haW5Eb2N1bWVudFBhcnQuRm9vdG5vdGVzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgIEFwcGx5UnVsZXNUb1BhcnQoc2V0dGluZ3MsIGN0YWksIHdEb2MsIHdEb2MuTWFpbkRvY3VtZW50UGFydC5Gb290bm90ZXNQYXJ0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXBwbHlSdWxlc1RvUGFydChXbWxUb1htbFNldHRpbmdzIHNldHRpbmdzLCBDb250ZW50VHlwZUFwcGxpZXJJbmZvIGN0YWksIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYywgT3BlblhtbFBhcnQgcGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhcnRYRG9jID0gcGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciBzdHlsZVhEb2MgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICB2YXIgYmxvY2tDb250ZW50ID0gcGFydFhEb2MuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgIC5XaGVyZShkID0+IGQuTmFtZSA9PSBXLnAgfHwgZC5OYW1lID09IFcudGJsIHx8IGQuTmFtZSA9PSBXLnRyIHx8IGQuTmFtZSA9PSBXLnRjKTsKKworICAgICAgICAgICAgaW50IHRvdGFsQ291bnQgPSAwOworICAgICAgICAgICAgaWYgKHNldHRpbmdzLlByb2dyZXNzRnVuY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0b3RhbENvdW50ID0gYmxvY2tDb250ZW50LkNvdW50KCk7CisgICAgICAgICAgICAgICAgc3RyaW5nIG1lc3NhZ2U7CisgICAgICAgICAgICAgICAgaWYgKHBhcnQgaXMgTWFpbkRvY3VtZW50UGFydCkKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJBcHBseSBydWxlcyB0byBtYWluIGRvY3VtZW50IHBhcnQiOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcnQgaXMgRW5kbm90ZXNQYXJ0KQorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIkFwcGx5IHJ1bGVzIHRvIGVuZG5vdGVzIHBhcnQiOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJBcHBseSBydWxlcyB0byBmb290bm90ZXMgcGFydCI7CisgICAgICAgICAgICAgICAgV21sVG9YbWxQcm9ncmVzc0luZm8gcGkgPSBuZXcgV21sVG9YbWxQcm9ncmVzc0luZm8oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGVudFRvdGFsID0gdG90YWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgQ29udGVudENvdW50ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgSW5Qcm9ncmVzc01lc3NhZ2UgPSBtZXNzYWdlICsgRW52aXJvbm1lbnQuTmV3TGluZSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHNldHRpbmdzLlByb2dyZXNzRnVuY3Rpb24ocGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgY291bnQgPSAwOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGJsYyBpbiBibG9ja0NvbnRlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLlByb2dyZXNzRnVuY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICsrY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA8IDUwIHx8IChjb3VudCkgJSAxMCA9PSAwIHx8IGNvdW50ID09IHRvdGFsQ291bnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtc2cgPSBzdHJpbmcuRm9ybWF0KCIgIHswfSBvZiB7MX0iLCBjb3VudCwgdG90YWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gIiIuUGFkUmlnaHQobXNnLkxlbmd0aCwgJ1xiJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBXbWxUb1htbFByb2dyZXNzSW5mbyBwaTIgPSBuZXcgV21sVG9YbWxQcm9ncmVzc0luZm8oKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUb3RhbCA9IHRvdGFsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudENvdW50ID0gY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5Qcm9ncmVzc01lc3NhZ2UgPSBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuUHJvZ3Jlc3NGdW5jdGlvbihwaTIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlT2ZCbGMgPSBudWxsOworICAgICAgICAgICAgICAgIHN0cmluZyBzdHlsZU9mQmxjVUMgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChibGMuTmFtZSA9PSBXLnApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVJZE9mQmxjID0gKHN0cmluZylibGMuRWxlbWVudHMoVy5wUHIpLkVsZW1lbnRzKFcucFN0eWxlKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVJZE9mQmxjICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlT2ZCbGMgPSAoc3RyaW5nKXN0eWxlWERvYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKHMgPT4gKHN0cmluZylzLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09IHN0eWxlSWRPZkJsYyAmJiAoc3RyaW5nKXMuQXR0cmlidXRlKFcudHlwZSkgPT0gInBhcmFncmFwaCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVPZkJsYyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVPZkJsYyA9IGN0YWkuRGVmYXVsdFBhcmFncmFwaFN0eWxlTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGVPZkJsY1VDID0gc3R5bGVPZkJsYy5Ub1VwcGVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJsYy5OYW1lID09IFcudGJsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlSWRPZkJsYyA9IChzdHJpbmcpYmxjLkVsZW1lbnRzKFcudGJsUHIpLkVsZW1lbnRzKFcudGJsU3R5bGUpLkF0dHJpYnV0ZXMoVy52YWwpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUlkT2ZCbGMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVPZkJsYyA9IChzdHJpbmcpc3R5bGVYRG9jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUocyA9PiAoc3RyaW5nKXMuQXR0cmlidXRlKFcuc3R5bGVJZCkgPT0gc3R5bGVJZE9mQmxjICYmIChzdHJpbmcpcy5BdHRyaWJ1dGUoVy50eXBlKSA9PSAidGFibGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy52YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlT2ZCbGMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlT2ZCbGMgPSBjdGFpLkRlZmF1bHRUYWJsZVN0eWxlTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGVPZkJsY1VDID0gc3R5bGVPZkJsYy5Ub1VwcGVyKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgdXNlZnVsIHRvIGdldCBhIGxpc3Qgb2YgYWxsIGNvbnRlbnQgdHlwZXMgYW5kIHRoZSBjb2RlIGdlbiBsaXN0CisKKyAgICAgICAgICAgICAgICAvL3ZhciBjb250ZW50VHlwZUxpc3QgPSBzZXR0aW5ncworICAgICAgICAgICAgICAgIC8vICAgIC5Eb2N1bWVudENvbnRlbnRUeXBlUnVsZXMKKyAgICAgICAgICAgICAgICAvLyAgICAuQ29uY2F0KHNldHRpbmdzLkRvY3VtZW50VHlwZUNvbnRlbnRUeXBlUnVsZXMpCisgICAgICAgICAgICAgICAgLy8gICAgLkNvbmNhdChzZXR0aW5ncy5HbG9iYWxDb250ZW50VHlwZVJ1bGVzKQorICAgICAgICAgICAgICAgIC8vICAgIC5TZWxlY3QoY3QgPT4gY3QuQ29udGVudFR5cGUpCisgICAgICAgICAgICAgICAgLy8gICAgLkRpc3RpbmN0KCkKKyAgICAgICAgICAgICAgICAvLyAgICAuT3JkZXJCeShuID0+IG4pCisgICAgICAgICAgICAgICAgLy8gICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICAgICAgLy92YXIgY29udGVudFR5cGVDb2RlR2VuTGlzdCA9IHNldHRpbmdzCisgICAgICAgICAgICAgICAgLy8gICAgLlhtbEdlbmVyYXRpb25MYW1iZGFzCisgICAgICAgICAgICAgICAgLy8gICAgLlNlbGVjdCh4Z2wgPT4geGdsLktleSkKKyAgICAgICAgICAgICAgICAvLyAgICAuT3JkZXJCeShuID0+IG4pCisgICAgICAgICAgICAgICAgLy8gICAgLlRvTGlzdCgpOworCisgICAgICAgICAgICAgICAgLy92YXIgcnVsZXNXaXRob3V0R2VuQ29kZSA9IGNvbnRlbnRUeXBlTGlzdAorICAgICAgICAgICAgICAgIC8vICAgIC5FeGNlcHQoY29udGVudFR5cGVDb2RlR2VuTGlzdCkKKyAgICAgICAgICAgICAgICAvLyAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgICAvL3ZhciBjb2RlR2VuV2l0aG91dFJ1bGVzID0gY29udGVudFR5cGVDb2RlR2VuTGlzdAorICAgICAgICAgICAgICAgIC8vICAgIC5FeGNlcHQoY29udGVudFR5cGVMaXN0KQorICAgICAgICAgICAgICAgIC8vICAgIC5Ub0xpc3QoKTsKKworICAgICAgICAgICAgICAgIC8vdmFyIHMxMCA9IGNvZGVHZW5XaXRob3V0UnVsZXMuU2VsZWN0KG0gPT4gbSArIEVudmlyb25tZW50Lk5ld0xpbmUpLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICAgICAgLy9Db25zb2xlLldyaXRlTGluZShzMTApOworCisgICAgICAgICAgICAgICAgLy92YXIgczkgPSBjb250ZW50VHlwZUxpc3QuU2VsZWN0KG0gPT4gbSArIEVudmlyb25tZW50Lk5ld0xpbmUpLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICAgICAgLy9Db25zb2xlLldyaXRlTGluZShzOSk7CisKKyAgICAgICAgICAgICAgICAvLyBBcHBseSB0aGUgRG9jdW1lbnQgcnVsZXMgZmlyc3QsIHRoZW4gYXBwbHkgdGhlIERvY3VtZW50VHlwZSBydWxlcywgdGhlbiBhcHBseSB0aGUgR2xvYmFsIHJ1bGVzLiAgRmlyc3Qgb25lIHRoYXQgbWF0Y2hlcywgd2lucy4KKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcnVsZSBpbiBzZXR0aW5ncy5Eb2N1bWVudENvbnRlbnRUeXBlUnVsZXMuQ29uY2F0KHNldHRpbmdzLkRvY3VtZW50VHlwZUNvbnRlbnRUeXBlUnVsZXMpLkNvbmNhdChzZXR0aW5ncy5HbG9iYWxDb250ZW50VHlwZVJ1bGVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgc3R5bGVQYXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgc3R5bGVSZWdleFBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCByZWdleFBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaExhbWJkYVBhc3MgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICBzdHlsZVBhc3MgPSBydWxlLlN0eWxlTmFtZSA9PSBudWxsIHx8IHJ1bGUuU3R5bGVOYW1lLlRvVXBwZXIoKSA9PSBzdHlsZU9mQmxjVUM7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUGFzcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVSZWdleFBhc3MgPSBydWxlLlN0eWxlTmFtZVJlZ2V4ID09IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5TdHlsZU5hbWVSZWdleCAhPSBudWxsICYmIHN0eWxlT2ZCbGMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVJlZ2V4UGFzcyA9IHJ1bGUuU3R5bGVOYW1lUmVnZXguSXNNYXRjaChzdHlsZU9mQmxjKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVBhc3MgJiYgc3R5bGVSZWdleFBhc3MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4UGFzcyA9IHJ1bGUuUmVnZXhBcnJheSA9PSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuUmVnZXhBcnJheSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVsZS5SZWdleEFycmF5Lkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvbmUgdGhlIGJsYyBiZWNhdXNlIE9wZW5YbWxSZWdleC5NYXRjaCByZXBsYWNlcyBjb250ZW50LCBtdWNrcyB3aXRoIHRoZSBydW4sIHByb2JhYmx5IHNob3VsZCBub3QgaWYgaXQgb25seSBpcyB1c2VkIHRvIGZpbmQgY29udGVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lZEJsYyA9IG5ldyBYRWxlbWVudChibGMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2luZyByZW1vdmVzIHRoZSBzdWJ0aXRsZSBjcmVhdGVkIGJ5IGEgc29mdCBicmVhaywgc28gdGhhdCB0aGUgcGF0dGVybiBtYXRjaGVzIGFwcHJvcHJpYXRlbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZEJsYyA9IFJlbW92ZUNvbnRlbnRBZnRlckJSKGNsb25lZEJsYyk7CisKKyNpZiBmYWxzZQorPHAgcDE6Rm9udE5hbWU9Ikdlb3JnaWEiIHAxOkxhbmd1YWdlVHlwZT0id2VzdGVybiIgcDE6QWJzdHJhY3ROdW1JZD0iMjgiIHhtbG5zOnAxPSJodHRwOi8vcG93ZXJ0b29scy5jb2RlcGxleC5jb20vMjAxMSIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbiI+CisgIDxyIHAxOkxpc3RJdGVtUnVuPSIxLjEiIHAxOkZvbnROYW1lPSJHZW9yZ2lhIiBwMTpMYW5ndWFnZVR5cGU9Indlc3Rlcm4iPgorICAgIDx0IHhtbDpzcGFjZT0icHJlc2VydmUiPjEuMTwvdD4KKyAgPC9yPgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBsaXN0IGl0ZW0gcnVucyBzbyB0aGF0IHRoZXkgYXJlIG5vdCBtYXRjaGVkIGluIHRoZSBjb250ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZEJsYy5FbGVtZW50cyhXLnIpLldoZXJlKHIgPT4gci5BdHRyaWJ1dGUoUHRPcGVuWG1sLkxpc3RJdGVtUnVuKSAhPSBudWxsKS5SZW1vdmUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3BlblhtbFJlZ2V4Lk1hdGNoKG5ld1tdIHsgY2xvbmVkQmxjIH0sIHJ1bGUuUmVnZXhBcnJheVtpXSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhQYXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUGFzcyAmJiBzdHlsZVJlZ2V4UGFzcyAmJiByZWdleFBhc3MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoTGFtYmRhUGFzcyA9IHJ1bGUuTWF0Y2hMYW1iZGEgPT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLk1hdGNoTGFtYmRhICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuTWF0Y2hMYW1iZGEoYmxjLCBydWxlLCB3RG9jLCBzZXR0aW5ncykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoTGFtYmRhUGFzcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVQYXNzICYmIHN0eWxlUmVnZXhQYXNzICYmIHJlZ2V4UGFzcyAmJiBtYXRjaExhbWJkYVBhc3MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZENvbnRlbnRUeXBlVG9CbG9ja0NvbnRlbnQoc2V0dGluZ3MsIHBhcnQsIGJsYywgcnVsZS5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5BcHBseVJ1bkNvbnRlbnRUeXBlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBseVJ1bkNvbnRlbnRUeXBlcyhzZXR0aW5ncywgY3RhaSwgd0RvYywgYmxjLCBzZXR0aW5ncy5SdW5Db250ZW50VHlwZVJ1bGVzLCBwYXJ0LCBwYXJ0WERvYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNldHRpbmdzLlByb2dyZXNzRnVuY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXbWxUb1htbFByb2dyZXNzSW5mbyBwaSA9IG5ldyBXbWxUb1htbFByb2dyZXNzSW5mbygpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb250ZW50VG90YWwgPSB0b3RhbENvdW50LAorICAgICAgICAgICAgICAgICAgICBDb250ZW50Q291bnQgPSB0b3RhbENvdW50LAorICAgICAgICAgICAgICAgICAgICBJblByb2dyZXNzTWVzc2FnZSA9IEVudmlyb25tZW50Lk5ld0xpbmUgKyAiICBEb25lIiArIEVudmlyb25tZW50Lk5ld0xpbmUsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5Qcm9ncmVzc0Z1bmN0aW9uKHBpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciBtYWluUGFydCA9IHBhcnQgYXMgTWFpbkRvY3VtZW50UGFydDsKKyAgICAgICAgICAgIGlmIChtYWluUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtYWluUGFydC5Xb3JkcHJvY2Vzc2luZ0NvbW1lbnRzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBtYWluUGFydC5Xb3JkcHJvY2Vzc2luZ0NvbW1lbnRzUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IFJlbW92ZUNvbnRlbnRBZnRlckJSKFhFbGVtZW50IGNsb25lZEJsYykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsb25lZEJsYy5OYW1lICE9IFcucCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xvbmVkQmxjOworICAgICAgICAgICAgdmFyIGNsb25lZDIgPSBuZXcgWEVsZW1lbnQoY2xvbmVkQmxjLk5hbWUsCisgICAgICAgICAgICAgICAgY2xvbmVkQmxjLkF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICBjbG9uZWRCbGMuRWxlbWVudHMoKS5UYWtlV2hpbGUociA9PiByLkVsZW1lbnQoVy5icikgPT0gbnVsbCkpOworICAgICAgICAgICAgcmV0dXJuIGNsb25lZDI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFwcGx5UnVuQ29udGVudFR5cGVzKFdtbFRvWG1sU2V0dGluZ3Mgc2V0dGluZ3MsIENvbnRlbnRUeXBlQXBwbGllckluZm8gY3RhaSwgV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jLAorICAgICAgICAgICAgWEVsZW1lbnQgYmxvY2tMZXZlbENvbnRlbnQsIExpc3Q8Q29udGVudFR5cGVSdWxlPiBydW5Db250ZW50VHlwZVJ1bGVMaXN0LCBPcGVuWG1sUGFydCBwYXJ0LCBYRG9jdW1lbnQgbWFpblhEb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBydW5Db250ZW50ID0gYmxvY2tMZXZlbENvbnRlbnQuRGVzY2VuZGFudHMoKQorICAgICAgICAgICAgICAgIC5XaGVyZShkID0+IGQuTmFtZSA9PSBXLnIgfHwgZC5OYW1lID09IFcuaHlwZXJsaW5rIHx8IGQuTmFtZSA9PSBXLnNkdCB8fCBkLk5hbWUgPT0gVy5ib29rbWFya1N0YXJ0KTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBybGMgaW4gcnVuQ29udGVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmxjLk5hbWUgPT0gVy5yIHx8IHJsYy5OYW1lID09IFcuc2R0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJ1blN0eWxlID0gKHN0cmluZylybGMuRWxlbWVudHMoVy5yUHIpLkVsZW1lbnRzKFcuclN0eWxlKS5BdHRyaWJ1dGVzKFcudmFsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocnVuU3R5bGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0eWxlID0gY3RhaS5EZWZhdWx0Q2hhcmFjdGVyU3R5bGVOYW1lOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcnVsZSBpbiBydW5Db250ZW50VHlwZVJ1bGVMaXN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5TdHlsZU5hbWUgIT0gbnVsbCAmJiBydWxlLlN0eWxlTmFtZSAhPSBydW5TdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuUmVnZXhBcnJheSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiSW52YWxpZCBSdW4gQ29udGVudFR5cGUgUnVsZSAtIFJlZ2V4IG5vdCBhbGxvd2VkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5NYXRjaExhbWJkYSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLk1hdGNoTGFtYmRhKHJsYywgcnVsZSwgd0RvYywgc2V0dGluZ3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkQ29udGVudFR5cGVUb1J1bkNvbnRlbnQoc2V0dGluZ3MsIHBhcnQsIHJsYywgcnVsZS5Db250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZENvbnRlbnRUeXBlVG9SdW5Db250ZW50KHNldHRpbmdzLCBwYXJ0LCBybGMsIHJ1bGUuQ29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmxjLk5hbWUgPT0gVy5oeXBlcmxpbmspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcnVuIGluIHJsYy5EZXNjZW5kYW50cyhXLnIpKQorICAgICAgICAgICAgICAgICAgICAgICAgQWRkQ29udGVudFR5cGVUb1J1bkNvbnRlbnQoc2V0dGluZ3MsIHBhcnQsIHJ1biwgIkh5cGVybGluayIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChybGMuTmFtZSA9PSBXLmJvb2ttYXJrU3RhcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBZGRDb250ZW50VHlwZVRvUnVuQ29udGVudChzZXR0aW5ncywgcGFydCwgcmxjLCAiQW5jaG9yIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEF0dHJpYnV0ZVtdIE5hbWVzcGFjZUF0dHJpYnV0ZXMgPQorICAgICAgICB7CisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgIndwYyIsIFdQQy53cGMpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJtYyIsIE1DLm1jKSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAibyIsIE8ubyksCisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInIiLCBSLnIpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJtIiwgTS5tKSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidiIsIFZNTC52bWwpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3cDE0IiwgV1AxNC53cDE0KSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAid3AiLCBXUC53cCksCisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgIncxMCIsIFcxMC53MTApLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3IiwgVy53KSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAidzE0IiwgVzE0LncxNCksCisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgIncxNSIsIFcxNS53MTUpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3MTZzZSIsIFcxNlNFLncxNnNlKSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAid3BnIiwgV1BHLndwZyksCisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgIndwaSIsIFdQSS53cGkpLAorICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJ3bmUiLCBXTkUud25lKSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAid3BzIiwgV1BTLndwcyksCisgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInB0IiwgUHRPcGVuWG1sLnB0KSwKKyAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE1DLklnbm9yYWJsZSwgIncxNCB3cDE0IHcxNSB3MTZzZSBwdCIpLAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkQ29udGVudFR5cGVUb0Jsb2NrQ29udGVudChXbWxUb1htbFNldHRpbmdzIHNldHRpbmdzLCBPcGVuWG1sUGFydCBwYXJ0LCBYRWxlbWVudCBibGMsIHN0cmluZyBjb250ZW50VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gYWRkIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIGJsb2NrIGNvbnRlbnQKKyAgICAgICAgICAgIGJsYy5BZGQobmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLkNvbnRlbnRUeXBlLCBjb250ZW50VHlwZSkpOworCisgICAgICAgICAgICB2YXIgbWFpblBhcnQgPSBwYXJ0IGFzIE1haW5Eb2N1bWVudFBhcnQ7CisgICAgICAgICAgICBpZiAobWFpblBhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSBjb21tZW50LCBpZiBhcHByb3ByaWF0ZQorICAgICAgICAgICAgICAgIGludCBjb21tZW50TnVtYmVyID0gMTsKKyAgICAgICAgICAgICAgICBYRG9jdW1lbnQgbmV3Q29tbWVudHMgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmplY3RDb21tZW50Rm9yQ29udGVudFR5cGVzICE9IG51bGwgJiYgKGJvb2wpc2V0dGluZ3MuSW5qZWN0Q29tbWVudEZvckNvbnRlbnRUeXBlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYWluUGFydC5Xb3JkcHJvY2Vzc2luZ0NvbW1lbnRzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21tZW50cyA9IG1haW5QYXJ0LldvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tbWVudHMuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tbWVudHMuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IG5ld0NvbW1lbnRzLlJvb3QuRWxlbWVudHMoVy5jb21tZW50KS5TZWxlY3QoZiA9PiAoaW50KWYuQXR0cmlidXRlKFcuaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHMuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudE51bWJlciA9IGlkcy5NYXgoKSArIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LkFkZE5ld1BhcnQ8V29yZHByb2Nlc3NpbmdDb21tZW50c1BhcnQ+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21tZW50cyA9IG1haW5QYXJ0LldvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tbWVudHMuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tbWVudHMuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tbWVudHMuQWRkKG5ldyBYRWxlbWVudChXLmNvbW1lbnRzLCBOYW1lc3BhY2VBdHRyaWJ1dGVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50TnVtYmVyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2lmIGZhbHNlCisgIDx3OmNvbW1lbnQgdzppZD0iMTIiCisgICAgICAgICAgICAgdzphdXRob3I9IkVyaWMgV2hpdGUiCisgICAgICAgICAgICAgdzpkYXRlPSIyMDE2LTAzLTIwVDE4OjUwOjAwWiIKKyAgICAgICAgICAgICB3OmluaXRpYWxzPSJFVyI+CisgICAgPHc6cCB3MTQ6cGFyYUlkPSI3RTIyN0I5OCIKKyAgICAgICAgIHcxNDp0ZXh0SWQ9IjZGQTJCRTZCIgorICAgICAgICAgdzpyc2lkUj0iMDA0MjU4ODkiCisgICAgICAgICB3OnJzaWRSRGVmYXVsdD0iMDA0MjU4ODkiPgorICAgICAgPHc6cFByPgorICAgICAgICA8dzpwU3R5bGUgdzp2YWw9IkNvbW1lbnRUZXh0Ii8+CisgICAgICA8L3c6cFByPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6clByPgorICAgICAgICAgIDx3OnJTdHlsZSB3OnZhbD0iQ29tbWVudFJlZmVyZW5jZSIvPgorICAgICAgICA8L3c6clByPgorICAgICAgICA8dzphbm5vdGF0aW9uUmVmLz4KKyAgICAgIDwvdzpyPgorICAgICAgPHc6cj4KKyAgICAgICAgPHc6dD5OaWw8L3c6dD4KKyAgICAgIDwvdzpyPgorICAgIDwvdzpwPgorICA8L3c6Y29tbWVudD4KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBuZXdFbGVtZW50ID0gbmV3IFhFbGVtZW50KFcuY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuaWQsIGNvbW1lbnROdW1iZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcucCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5wUHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnBTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcudmFsLCAiQ29tbWVudFRleHQiKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnJQciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnJTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgIkNvbW1lbnRSZWZlcmVuY2UiKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLmFubm90YXRpb25SZWYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhUZXh0KGNvbnRlbnRUeXBlKSkpKSk7CisgICAgICAgICAgICAgICAgICAgIG5ld0NvbW1lbnRzLlJvb3QuQWRkKG5ld0VsZW1lbnQpOworCisjaWYgZmFsc2UKKyAgICAgIDx3OnI+CisgICAgICAgIDx3OnJQcj4KKyAgICAgICAgICA8dzpyU3R5bGUgdzp2YWw9IkNvbW1lbnRSZWZlcmVuY2UiLz4KKyAgICAgICAgPC93OnJQcj4KKyAgICAgICAgPHc6Y29tbWVudFJlZmVyZW5jZSB3OmlkPSIxMiIvPgorICAgICAgPC93OnI+CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBjb21tZW50UnVuID0gbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnJQciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yU3R5bGUsIG5ldyBYQXR0cmlidXRlKFcudmFsLCAiQ29tbWVudFJlZmVyZW5jZSIpKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5jb21tZW50UmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFcuaWQsIGNvbW1lbnROdW1iZXIpKSk7CisgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdFJ1bkluUGFyYWdyYXBoID0gYmxjCisgICAgICAgICAgICAgICAgICAgICAgICAuRGVzY2VuZGFudHNUcmltbWVkKFcudHhieENvbnRlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUociA9PiByLk5hbWUgPT0gVy5yKQorICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFJ1bkluUGFyYWdyYXBoICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub3csIG9ubHkgZG8gdGhlIHdvcmsgb2YgaW5zZXJ0aW5nIGEgY29tbWVudCBpZiBpdCBpcyBlYXN5LiAgRm9yIGNvbnRlbnQgdHlwZXMgZm9yIHRhYmxlcywgcm93cyBhbmQgY2VsbHMsIG5vdCBpbnNlcnRpbmcgYSBjb21tZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0UnVuSW5QYXJhZ3JhcGguUGFyZW50Lk5hbWUgPT0gVy5wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UnVuSW5QYXJhZ3JhcGguQWRkQmVmb3JlU2VsZihjb21tZW50UnVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub3csIG9ubHkgZG8gdGhlIHdvcmsgb2YgaW5zZXJ0aW5nIGEgY29tbWVudCBpZiBpdCBpcyBlYXN5LiAgRm9yIGNvbnRlbnQgdHlwZXMgZm9yIHRhYmxlcywgcm93cyBhbmQgY2VsbHMsIG5vdCBpbnNlcnRpbmcgYSBjb21tZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsYy5OYW1lID09IFcucCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGMuQWRkKGNvbW1lbnRSdW4pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1haW5QYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb250ZW50QXBwbGllckV4Y2VwdGlvbigiRG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBzdHlsZXMgZGVmaW5pdGlvbiBwYXJ0Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgWERvY3VtZW50IHN0eWxlc1hEb2MgPSBtYWluUGFydC5TdHlsZURlZmluaXRpb25zUGFydC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGUgPQorQCI8dzpzdHlsZSB3OnR5cGU9IiJwYXJhZ3JhcGgiIgorICAgICAgICAgICB3OnN0eWxlSWQ9IiJDb21tZW50VGV4dCIiCisgICAgICAgICAgIHhtbG5zOnc9IiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4iIj4KKyAgICA8dzpuYW1lIHc6dmFsPSIiYW5ub3RhdGlvbiB0ZXh0IiIvPgorICAgIDx3OmJhc2VkT24gdzp2YWw9IiJOb3JtYWwiIi8+CisgICAgPHc6bGluayB3OnZhbD0iIkNvbW1lbnRUZXh0Q2hhciIiLz4KKyAgICA8dzpzZW1pSGlkZGVuLz4KKyAgICA8dzpyUHI+CisgICAgICA8dzpzeiB3OnZhbD0iIjIwIiIvPgorICAgICAgPHc6c3pDcyB3OnZhbD0iIjIwIiIvPgorICAgIDwvdzpyUHI+CisgIDwvdzpzdHlsZT4KKyI7CisgICAgICAgICAgICAgICAgICAgIEFkZElmTWlzc2luZyhzdHlsZXNYRG9jLCBzdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIHN0eWxlID0KK0AiPHc6c3R5bGUgdzp0eXBlPSIicGFyYWdyYXBoIiIKKyAgICAgICAgICAgdzpzdHlsZUlkPSIiQ29tbWVudFN1YmplY3QiIgorICAgICAgICAgICB4bWxuczp3PSIiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluIiI+CisgICAgPHc6bmFtZSB3OnZhbD0iImFubm90YXRpb24gc3ViamVjdCIiLz4KKyAgICA8dzpiYXNlZE9uIHc6dmFsPSIiQ29tbWVudFRleHQiIi8+CisgICAgPHc6bmV4dCB3OnZhbD0iIkNvbW1lbnRUZXh0IiIvPgorICAgIDx3OnNlbWlIaWRkZW4vPgorICAgIDx3OnJQcj4KKyAgICAgIDx3OmIvPgorICAgICAgPHc6YkNzLz4KKyAgICA8L3c6clByPgorICA8L3c6c3R5bGU+CisiOworICAgICAgICAgICAgICAgICAgICBBZGRJZk1pc3Npbmcoc3R5bGVzWERvYywgc3R5bGUpOworICAgICAgICAgICAgICAgICAgICBzdHlsZSA9CitAIjx3OnN0eWxlIHc6dHlwZT0iImNoYXJhY3RlciIiCisgICAgICAgICAgIHc6c3R5bGVJZD0iIkNvbW1lbnRSZWZlcmVuY2UiIgorICAgICAgICAgICB4bWxuczp3PSIiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluIiI+CisgICAgPHc6bmFtZSB3OnZhbD0iImFubm90YXRpb24gcmVmZXJlbmNlIiIvPgorICAgIDx3OmJhc2VkT24gdzp2YWw9IiJEZWZhdWx0UGFyYWdyYXBoRm9udCIiLz4KKyAgICA8dzp1aVByaW9yaXR5IHc6dmFsPSIiOTkiIi8+CisgICAgPHc6c2VtaUhpZGRlbi8+CisgICAgPHc6dW5oaWRlV2hlblVzZWQvPgorICAgIDx3OnJzaWQgdzp2YWw9IiIwMDg3MjcyOSIiLz4KKyAgICA8dzpyUHI+CisgICAgICA8dzpzeiB3OnZhbD0iIjE2IiIvPgorICAgICAgPHc6c3pDcyB3OnZhbD0iIjE2IiIvPgorICAgIDwvdzpyUHI+CisgIDwvdzpzdHlsZT4KKyI7CisgICAgICAgICAgICAgICAgICAgIEFkZElmTWlzc2luZyhzdHlsZXNYRG9jLCBzdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIHN0eWxlID0KK0AiPHc6c3R5bGUgdzp0eXBlPSIiY2hhcmFjdGVyIiIKKyAgICAgICAgICAgdzpjdXN0b21TdHlsZT0iIjEiIgorICAgICAgICAgICB3OnN0eWxlSWQ9IiJDb21tZW50VGV4dENoYXIiIgorICAgICAgICAgICB4bWxuczp3PSIiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3dvcmRwcm9jZXNzaW5nbWwvMjAwNi9tYWluIiI+CisgICAgPHc6bmFtZSB3OnZhbD0iIkNvbW1lbnQgVGV4dCBDaGFyIiIvPgorICAgIDx3OmJhc2VkT24gdzp2YWw9IiJEZWZhdWx0UGFyYWdyYXBoRm9udCIiLz4KKyAgICA8dzpsaW5rIHc6dmFsPSIiQ29tbWVudFRleHQiIi8+CisgICAgPHc6c2VtaUhpZGRlbi8+CisgICAgPHc6cnNpZCB3OnZhbD0iIjAwQTQzQ0VDIiIvPgorICAgIDx3OnJQcj4KKyAgICAgIDx3Omxhbmcgdzp2YWw9IiJlbi1HQiIiCisgICAgICAgICAgICAgIHc6ZWFzdEFzaWE9IiJ6aC1DTiIiLz4KKyAgICA8L3c6clByPgorICA8L3c6c3R5bGU+CisiOworICAgICAgICAgICAgICAgICAgICBBZGRJZk1pc3Npbmcoc3R5bGVzWERvYywgc3R5bGUpOworICAgICAgICAgICAgICAgICAgICBtYWluUGFydC5TdHlsZURlZmluaXRpb25zUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByb290ID0gYmxjLkFuY2VzdG9ycygpLkxhc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChyb290ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnRlbnRBcHBsaWVyRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpOworICAgICAgICAgICAgdmFyIHB0TmFtZXNwYWNlID0gcm9vdC5BdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJwdCIpOworICAgICAgICAgICAgaWYgKHB0TmFtZXNwYWNlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm9vdC5BZGQobmV3IFhBdHRyaWJ1dGUoWE5hbWVzcGFjZS5YbWxucyArICJwdCIsIFB0T3BlblhtbC5wdC5OYW1lc3BhY2VOYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgaWdub3JhYmxlID0gKHN0cmluZylyb290LkF0dHJpYnV0ZShNQy5JZ25vcmFibGUpOworICAgICAgICAgICAgaWYgKGlnbm9yYWJsZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gaWdub3JhYmxlLlNwbGl0KCcgJyk7CisgICAgICAgICAgICAgICAgaWYgKCFsaXN0LkNvbnRhaW5zKCJwdCIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWdub3JhYmxlICs9ICIgcHQiOworICAgICAgICAgICAgICAgICAgICByb290LkF0dHJpYnV0ZShNQy5JZ25vcmFibGUpLlZhbHVlID0gaWdub3JhYmxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb290LkFkZChuZXcgWEF0dHJpYnV0ZShNQy5JZ25vcmFibGUsICJwdCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkQ29udGVudFR5cGVUb1J1bkNvbnRlbnQoV21sVG9YbWxTZXR0aW5ncyBzZXR0aW5ncywgT3BlblhtbFBhcnQgcGFydCwgWEVsZW1lbnQgcmxjLCBzdHJpbmcgY29udGVudFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBjb250ZW50IHR5cGUgZm9yIHRoaXMgcnVuIGxldmVsIGNvbnRlbnQsIHRoZW4gbm90aGluZyB0byBkby4gIEZpcnN0IG9uZSB3aW5zLgorICAgICAgICAgICAgaWYgKHJsYy5BdHRyaWJ1dGUoUHRPcGVuWG1sLkNvbnRlbnRUeXBlKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gYWRkIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIGJsb2NrIGxldmVsIGNvbnRlbnQKKyAgICAgICAgICAgIHJsYy5BZGQobmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLkNvbnRlbnRUeXBlLCBjb250ZW50VHlwZSkpOworCisgICAgICAgICAgICB2YXIgbWFpblBhcnQgPSBwYXJ0IGFzIE1haW5Eb2N1bWVudFBhcnQ7CisgICAgICAgICAgICBpZiAobWFpblBhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSBjb21tZW50LCBpZiBhcHByb3ByaWF0ZQorICAgICAgICAgICAgICAgIGludCBjb21tZW50TnVtYmVyID0gMTsKKyAgICAgICAgICAgICAgICBYRG9jdW1lbnQgbmV3Q29tbWVudHMgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmplY3RDb21tZW50Rm9yQ29udGVudFR5cGVzICE9IG51bGwgJiYgKGJvb2wpc2V0dGluZ3MuSW5qZWN0Q29tbWVudEZvckNvbnRlbnRUeXBlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYWluUGFydC5Xb3JkcHJvY2Vzc2luZ0NvbW1lbnRzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21tZW50cyA9IG1haW5QYXJ0LldvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tbWVudHMuRGVjbGFyYXRpb24uU3RhbmRhbG9uZSA9ICJ5ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tbWVudHMuRGVjbGFyYXRpb24uRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IG5ld0NvbW1lbnRzLlJvb3QuRWxlbWVudHMoVy5jb21tZW50KS5TZWxlY3QoZiA9PiAoaW50KWYuQXR0cmlidXRlKFcuaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHMuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudE51bWJlciA9IGlkcy5NYXgoKSArIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYWluUGFydC5BZGROZXdQYXJ0PFdvcmRwcm9jZXNzaW5nQ29tbWVudHNQYXJ0PigpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tbWVudHMgPSBtYWluUGFydC5Xb3JkcHJvY2Vzc2luZ0NvbW1lbnRzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbW1lbnRzLkRlY2xhcmF0aW9uLlN0YW5kYWxvbmUgPSAieWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbW1lbnRzLkRlY2xhcmF0aW9uLkVuY29kaW5nID0gIlVURi04IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbW1lbnRzLkFkZChuZXcgWEVsZW1lbnQoVy5jb21tZW50cywgTmFtZXNwYWNlQXR0cmlidXRlcykpOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudE51bWJlciA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgbmV3RWxlbWVudCA9IG5ldyBYRWxlbWVudChXLmNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmlkLCBjb21tZW50TnVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChXLnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcucFByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5wU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgIkNvbW1lbnRUZXh0IikpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yUHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoVy52YWwsICJDb21tZW50UmVmZXJlbmNlIikpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5hbm5vdGF0aW9uUmVmKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYVGV4dChjb250ZW50VHlwZSkpKSkpOworICAgICAgICAgICAgICAgICAgICBuZXdDb21tZW50cy5Sb290LkFkZChuZXdFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgY29tbWVudFJ1biA9IG5ldyBYRWxlbWVudChXLnIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoVy5yUHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuclN0eWxlLCBuZXcgWEF0dHJpYnV0ZShXLnZhbCwgIkNvbW1lbnRSZWZlcmVuY2UiKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KFcuY29tbWVudFJlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShXLmlkLCBjb21tZW50TnVtYmVyKSkpOworICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RSdW5JblBhcmFncmFwaCA9IHJsYworICAgICAgICAgICAgICAgICAgICAgICAgLkRlc2NlbmRhbnRzVHJpbW1lZChXLnR4YnhDb250ZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKHIgPT4gci5OYW1lID09IFcucikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub3csIG9ubHkgZG8gdGhlIHdvcmsgb2YgaW5zZXJ0aW5nIGEgY29tbWVudCBpZiBpdCBpcyBlYXN5LiAgRm9yIGNvbnRlbnQgdHlwZXMgZm9yIHRhYmxlcywgcm93cyBhbmQgY2VsbHMsIG5vdCBpbnNlcnRpbmcgYSBjb21tZW50LgorICAgICAgICAgICAgICAgICAgICBpZiAocmxjLlBhcmVudC5OYW1lID09IFcucCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJsYy5BZGRCZWZvcmVTZWxmKGNvbW1lbnRSdW4pOworICAgICAgICAgICAgICAgICAgICBpZiAobWFpblBhcnQuU3R5bGVEZWZpbml0aW9uc1BhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnRlbnRBcHBsaWVyRXhjZXB0aW9uKCJEb2N1bWVudCBkb2VzIG5vdCBoYXZlIHN0eWxlcyBkZWZpbml0aW9uIHBhcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgc3R5bGVzWERvYyA9IG1haW5QYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZSA9CitAIjx3OnN0eWxlIHc6dHlwZT0iInBhcmFncmFwaCIiCisgICAgICAgICAgIHc6c3R5bGVJZD0iIkNvbW1lbnRUZXh0IiIKKyAgICAgICAgICAgeG1sbnM6dz0iImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbiIiPgorICAgIDx3Om5hbWUgdzp2YWw9IiJhbm5vdGF0aW9uIHRleHQiIi8+CisgICAgPHc6YmFzZWRPbiB3OnZhbD0iIk5vcm1hbCIiLz4KKyAgICA8dzpsaW5rIHc6dmFsPSIiQ29tbWVudFRleHRDaGFyIiIvPgorICAgIDx3OnNlbWlIaWRkZW4vPgorICAgIDx3OnJQcj4KKyAgICAgIDx3OnN6IHc6dmFsPSIiMjAiIi8+CisgICAgICA8dzpzekNzIHc6dmFsPSIiMjAiIi8+CisgICAgPC93OnJQcj4KKyAgPC93OnN0eWxlPgorIjsKKyAgICAgICAgICAgICAgICAgICAgQWRkSWZNaXNzaW5nKHN0eWxlc1hEb2MsIHN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUgPQorQCI8dzpzdHlsZSB3OnR5cGU9IiJwYXJhZ3JhcGgiIgorICAgICAgICAgICB3OnN0eWxlSWQ9IiJDb21tZW50U3ViamVjdCIiCisgICAgICAgICAgIHhtbG5zOnc9IiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4iIj4KKyAgICA8dzpuYW1lIHc6dmFsPSIiYW5ub3RhdGlvbiBzdWJqZWN0IiIvPgorICAgIDx3OmJhc2VkT24gdzp2YWw9IiJDb21tZW50VGV4dCIiLz4KKyAgICA8dzpuZXh0IHc6dmFsPSIiQ29tbWVudFRleHQiIi8+CisgICAgPHc6c2VtaUhpZGRlbi8+CisgICAgPHc6clByPgorICAgICAgPHc6Yi8+CisgICAgICA8dzpiQ3MvPgorICAgIDwvdzpyUHI+CisgIDwvdzpzdHlsZT4KKyI7CisgICAgICAgICAgICAgICAgICAgIEFkZElmTWlzc2luZyhzdHlsZXNYRG9jLCBzdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIHN0eWxlID0KK0AiPHc6c3R5bGUgdzp0eXBlPSIiY2hhcmFjdGVyIiIKKyAgICAgICAgICAgdzpzdHlsZUlkPSIiQ29tbWVudFJlZmVyZW5jZSIiCisgICAgICAgICAgIHhtbG5zOnc9IiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4iIj4KKyAgICA8dzpuYW1lIHc6dmFsPSIiYW5ub3RhdGlvbiByZWZlcmVuY2UiIi8+CisgICAgPHc6YmFzZWRPbiB3OnZhbD0iIkRlZmF1bHRQYXJhZ3JhcGhGb250IiIvPgorICAgIDx3OnVpUHJpb3JpdHkgdzp2YWw9IiI5OSIiLz4KKyAgICA8dzpzZW1pSGlkZGVuLz4KKyAgICA8dzp1bmhpZGVXaGVuVXNlZC8+CisgICAgPHc6cnNpZCB3OnZhbD0iIjAwODcyNzI5IiIvPgorICAgIDx3OnJQcj4KKyAgICAgIDx3OnN6IHc6dmFsPSIiMTYiIi8+CisgICAgICA8dzpzekNzIHc6dmFsPSIiMTYiIi8+CisgICAgPC93OnJQcj4KKyAgPC93OnN0eWxlPgorIjsKKyAgICAgICAgICAgICAgICAgICAgQWRkSWZNaXNzaW5nKHN0eWxlc1hEb2MsIHN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUgPQorQCI8dzpzdHlsZSB3OnR5cGU9IiJjaGFyYWN0ZXIiIgorICAgICAgICAgICB3OmN1c3RvbVN0eWxlPSIiMSIiCisgICAgICAgICAgIHc6c3R5bGVJZD0iIkNvbW1lbnRUZXh0Q2hhciIiCisgICAgICAgICAgIHhtbG5zOnc9IiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvd29yZHByb2Nlc3NpbmdtbC8yMDA2L21haW4iIj4KKyAgICA8dzpuYW1lIHc6dmFsPSIiQ29tbWVudCBUZXh0IENoYXIiIi8+CisgICAgPHc6YmFzZWRPbiB3OnZhbD0iIkRlZmF1bHRQYXJhZ3JhcGhGb250IiIvPgorICAgIDx3Omxpbmsgdzp2YWw9IiJDb21tZW50VGV4dCIiLz4KKyAgICA8dzpzZW1pSGlkZGVuLz4KKyAgICA8dzpyc2lkIHc6dmFsPSIiMDBBNDNDRUMiIi8+CisgICAgPHc6clByPgorICAgICAgPHc6bGFuZyB3OnZhbD0iImVuLUdCIiIKKyAgICAgICAgICAgICAgdzplYXN0QXNpYT0iInpoLUNOIiIvPgorICAgIDwvdzpyUHI+CisgIDwvdzpzdHlsZT4KKyI7CisgICAgICAgICAgICAgICAgICAgIEFkZElmTWlzc2luZyhzdHlsZXNYRG9jLCBzdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIG1haW5QYXJ0LlN0eWxlRGVmaW5pdGlvbnNQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJvb3QgPSBybGMuQW5jZXN0b3JzKCkuTGFzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udGVudEFwcGxpZXJFeGNlcHRpb24oIkludGVybmFsIGVycm9yIik7CisgICAgICAgICAgICB2YXIgcHROYW1lc3BhY2UgPSByb290LkF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInB0Iik7CisgICAgICAgICAgICBpZiAocHROYW1lc3BhY2UgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb290LkFkZChuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInB0IiwgUHRPcGVuWG1sLnB0Lk5hbWVzcGFjZU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBpZ25vcmFibGUgPSAoc3RyaW5nKXJvb3QuQXR0cmlidXRlKE1DLklnbm9yYWJsZSk7CisgICAgICAgICAgICBpZiAoaWdub3JhYmxlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBpZ25vcmFibGUuU3BsaXQoJyAnKTsKKyAgICAgICAgICAgICAgICBpZiAoIWxpc3QuQ29udGFpbnMoInB0IikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZ25vcmFibGUgKz0gIiBwdCI7CisgICAgICAgICAgICAgICAgICAgIHJvb3QuQXR0cmlidXRlKE1DLklnbm9yYWJsZSkuVmFsdWUgPSBpZ25vcmFibGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvb3QuQWRkKG5ldyBYQXR0cmlidXRlKE1DLklnbm9yYWJsZSwgInB0IikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRJZk1pc3NpbmcoWERvY3VtZW50IHN0eWxlc1hEb2MsIHN0cmluZyBjb21tZW50U3R5bGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGUxID0gWEVsZW1lbnQuUGFyc2UoY29tbWVudFN0eWxlKTsKKyNpZiBmYWxzZQorICA8dzpzdHlsZSB3OnR5cGU9IiJjaGFyYWN0ZXIiIgorICAgICAgICAgICB3OmN1c3RvbVN0eWxlPSIiMSIiCisgICAgICAgICAgIHc6c3R5bGVJZD0iIkNvbW1lbnRUZXh0Q2hhciIiCisjZW5kaWYKKyAgICAgICAgICAgIHZhciBleGlzdGluZ1N0eWxlID0gc3R5bGVzWERvYworICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KGUyID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYTmFtZSBuYW1lID0gVy50eXBlOworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdjEgPSAoc3RyaW5nKWUxLkF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHYyID0gKHN0cmluZyllMi5BdHRyaWJ1dGUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2MSAhPSB2MikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IFcuY3VzdG9tU3R5bGU7CisgICAgICAgICAgICAgICAgICAgIHYxID0gKHN0cmluZyllMS5BdHRyaWJ1dGUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHYyID0gKHN0cmluZyllMi5BdHRyaWJ1dGUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2MSAhPSB2MikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IFcuc3R5bGVJZDsKKyAgICAgICAgICAgICAgICAgICAgdjEgPSAoc3RyaW5nKWUxLkF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdjIgPSAoc3RyaW5nKWUyLkF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYxICE9IHYyKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChleGlzdGluZ1N0eWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgc3R5bGVzWERvYy5Sb290LkFkZChlMSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFzc2VtYmxlTGlzdEl0ZW1JbmZvcm1hdGlvbihXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdvcmREb2MsIExpc3RJdGVtUmV0cmlldmVyU2V0dGluZ3Mgc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCB4RG9jID0gd29yZERvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcmEgaW4geERvYy5EZXNjZW5kYW50cyhXLnApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExpc3RJdGVtUmV0cmlldmVyLlJldHJpZXZlTGlzdEl0ZW0od29yZERvYywgcGFyYSwgc2V0dGluZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBDb250ZW50VHlwZUFwcGxpZXJJbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRGVmYXVsdFBhcmFncmFwaFN0eWxlTmFtZTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRGVmYXVsdENoYXJhY3RlclN0eWxlTmFtZTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRGVmYXVsdFRhYmxlU3R5bGVOYW1lOworICAgICAgICAgICAgcHVibGljIENvbnRlbnRUeXBlQXBwbGllckluZm8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIENvbnRlbnRBcHBsaWVyRXhjZXB0aW9uIDogRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBDb250ZW50QXBwbGllckV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkgOiBiYXNlKG1lc3NhZ2UpIHsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0PFdtbFRvWG1sVmFsaWRhdGlvbkVycm9yPiBWYWxpZGF0ZUNvbnRlbnRUeXBlWG1sKFdtbERvY3VtZW50IHdtbFJhd1NvdXJjZURvY3VtZW50LCBXbWxEb2N1bWVudCB3bWxXaXRoQ29udGVudFR5cGVBcHBsaWVkLCBYRWxlbWVudCBjb250ZW50VHlwZVhtbCwgV21sVG9YbWxTZXR0aW5ncyBzZXR0aW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxXbWxUb1htbFZhbGlkYXRpb25FcnJvcj4gZXJyb3JMaXN0ID0gbmV3IExpc3Q8V21sVG9YbWxWYWxpZGF0aW9uRXJyb3I+KCk7CisKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXNDb250ZW50VHlwZUFwcGxpZWQgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zUmF3U291cmNlRG9jdW1lbnQgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXNDb250ZW50VHlwZUFwcGxpZWQuV3JpdGUod21sV2l0aENvbnRlbnRUeXBlQXBwbGllZC5Eb2N1bWVudEJ5dGVBcnJheSwgMCwgd21sV2l0aENvbnRlbnRUeXBlQXBwbGllZC5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIG1zUmF3U291cmNlRG9jdW1lbnQuV3JpdGUod21sUmF3U291cmNlRG9jdW1lbnQuRG9jdW1lbnRCeXRlQXJyYXksIDAsIHdtbFJhd1NvdXJjZURvY3VtZW50LkRvY3VtZW50Qnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvY0NvbnRlbnRUeXBlQXBwbGllZCA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3Blbihtc0NvbnRlbnRUeXBlQXBwbGllZCwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvY1Jhd1NvdXJjZURvY3VtZW50ID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1zUmF3U291cmNlRG9jdW1lbnQsIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHZyIGluIHNldHRpbmdzLkdsb2JhbFZhbGlkYXRpb25SdWxlcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZyLkdsb2JhbFJ1bGVMYW1iZGEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsRXJyb3JzID0gdnIuR2xvYmFsUnVsZUxhbWJkYSh2ciwgd0RvY1Jhd1NvdXJjZURvY3VtZW50LCB3RG9jQ29udGVudFR5cGVBcHBsaWVkLCBjb250ZW50VHlwZVhtbCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxFcnJvcnMgIT0gbnVsbCAmJiB2YWxFcnJvcnMuQW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmUgaW4gdmFsRXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3QuQWRkKHZlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgbVhEb2MgPSB3RG9jQ29udGVudFR5cGVBcHBsaWVkLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBzWERvYyA9IHdEb2NDb250ZW50VHlwZUFwcGxpZWQuTWFpbkRvY3VtZW50UGFydC5TdHlsZURlZmluaXRpb25zUGFydC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgZGVmYXVsdFBhcmFncmFwaFN0eWxlID0gc1hEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdChzID0+IChzdHJpbmcpcy5BdHRyaWJ1dGUoVy5fZGVmYXVsdCkgPT0gIjEiKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZGVmYXVsdFBhcmFncmFwaFN0eWxlTmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0UGFyYWdyYXBoU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQYXJhZ3JhcGhTdHlsZU5hbWUgPSAoc3RyaW5nKWRlZmF1bHRQYXJhZ3JhcGhTdHlsZS5BdHRyaWJ1dGUoVy5zdHlsZUlkKTsKKworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgYmxjIGluIG1YRG9jLlJvb3QuRGVzY2VuZGFudHMoKS5XaGVyZShkID0+IGQuTmFtZSA9PSBXLnAgfHwgZC5OYW1lID09IFcudGJsIHx8IGQuTmFtZSA9PSBXLnRyIHx8IGQuTmFtZSA9PSBXLnRjKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlSWQgPSAoc3RyaW5nKWJsYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnBQcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5wU3R5bGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy52YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVOYW1lID0gKHN0cmluZylzWERvYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcuc3R5bGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldoZXJlKHMgPT4gKHN0cmluZylzLkF0dHJpYnV0ZShXLnN0eWxlSWQpID09IHN0eWxlSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFcubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcyhXLnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlTmFtZSA9PSBudWxsICYmIGJsYy5OYW1lID09IFcucCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZU5hbWUgPSBkZWZhdWx0UGFyYWdyYXBoU3R5bGVOYW1lOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdnIgaW4gc2V0dGluZ3MuQmxvY2tMZXZlbENvbnRlbnRWYWxpZGF0aW9uUnVsZXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaFN0eWxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnIuU3R5bGVOYW1lUmVnZXggIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hTdHlsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gdnIuU3R5bGVOYW1lUmVnZXguTWF0Y2goc3R5bGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoU3R5bGUgPSBtYXRjaC5TdWNjZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaFN0eWxlICYmIHZyLkJsb2NrTGV2ZWxDb250ZW50UnVsZUxhbWJkYSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbEVycm9ycyA9IHZyLkJsb2NrTGV2ZWxDb250ZW50UnVsZUxhbWJkYShibGMsIHZyLCB3RG9jQ29udGVudFR5cGVBcHBsaWVkLCBjb250ZW50VHlwZVhtbCwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsRXJyb3JzICE9IG51bGwgJiYgdmFsRXJyb3JzLkFueSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmUgaW4gdmFsRXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTGlzdC5BZGQodmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZXJyb3JMaXN0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXbWxUb1htbFV0aWwKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgV21sRG9jdW1lbnQgQXNzaWduVW5pZFRvQmxjKFdtbERvY3VtZW50IGRvY3VtZW50KQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKGRvY3VtZW50LkRvY3VtZW50Qnl0ZUFycmF5LCAwLCBkb2N1bWVudC5Eb2N1bWVudEJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obXMsIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHhEb2MgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IGVsZW1lbnRzSW5PcmRlciA9IG5ldyBMaXN0PFhFbGVtZW50PigpOworICAgICAgICAgICAgICAgICAgICBEZXRlcm1pbmVFbGVtZW50T3JkZXIoeERvYy5Sb290LkRlc2NlbmRhbnRzKFcuYm9keSkuRmlyc3RPckRlZmF1bHQoKSwgZWxlbWVudHNJbk9yZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHVuaWQgPSAxOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgYiBpbiBlbGVtZW50c0luT3JkZXIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmlkU3RyaW5nID0gdW5pZC5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuQXR0cmlidXRlKFB0T3BlblhtbC5VbmlkKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuQXR0cmlidXRlKFB0T3BlblhtbC5VbmlkKS5WYWx1ZSA9IHVuaWRTdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5BZGQobmV3IFhBdHRyaWJ1dGUoUHRPcGVuWG1sLlVuaWQsIHVuaWRTdHJpbmcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaWQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBJZ25vcmVQdDE0TmFtZXNwYWNlKHhEb2MuUm9vdCk7CisgICAgICAgICAgICAgICAgICAgIHdEb2MuTWFpbkRvY3VtZW50UGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBXbWxEb2N1bWVudChkb2N1bWVudC5GaWxlTmFtZSwgbXMuVG9BcnJheSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBEZXRlcm1pbmVFbGVtZW50T3JkZXIoWEVsZW1lbnQgZWxlbWVudCwgTGlzdDxYRWxlbWVudD4gZWxlbWVudExpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjaGlsZEVsZW1lbnQgaW4gZWxlbWVudC5FbGVtZW50cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjaGlsZEVsZW1lbnQuTmFtZSA9PSBXLnApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5BZGQoY2hpbGRFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkRWxlbWVudC5OYW1lID09IFcudGJsIHx8IGNoaWxkRWxlbWVudC5OYW1lID09IFcudGMgfHwgY2hpbGRFbGVtZW50Lk5hbWUgPT0gVy5zZHQgfHwKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50Lk5hbWUgPT0gVy5zZHRDb250ZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGV0ZXJtaW5lRWxlbWVudE9yZGVyKGNoaWxkRWxlbWVudCwgZWxlbWVudExpc3QpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGRFbGVtZW50Lk5hbWUgPT0gVy50cikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0YyBpbiBjaGlsZEVsZW1lbnQuRWxlbWVudHMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIERldGVybWluZUVsZW1lbnRPcmRlcih0YywgZWxlbWVudExpc3QpOworICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5BZGQoY2hpbGRFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBJZ25vcmVQdDE0TmFtZXNwYWNlKFhFbGVtZW50IHJvb3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyb290LkF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInB0MTQiKSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvb3QuQWRkKG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAicHQxNCIsIFB0T3BlblhtbC5wdC5OYW1lc3BhY2VOYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgaWdub3JhYmxlID0gKHN0cmluZylyb290LkF0dHJpYnV0ZShNQy5JZ25vcmFibGUpOworICAgICAgICAgICAgaWYgKGlnbm9yYWJsZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gaWdub3JhYmxlLlNwbGl0KCcgJyk7CisgICAgICAgICAgICAgICAgaWYgKCFsaXN0LkNvbnRhaW5zKCJwdDE0IikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZ25vcmFibGUgKz0gIiBwdDE0IjsKKyAgICAgICAgICAgICAgICAgICAgcm9vdC5BdHRyaWJ1dGUoTUMuSWdub3JhYmxlKS5WYWx1ZSA9IGlnbm9yYWJsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm9vdC5BZGQobmV3IFhBdHRyaWJ1dGUoTUMuSWdub3JhYmxlLCAicHQxNCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzL1dvcmtzaGVldEFjY2Vzc29yLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvV29ya3NoZWV0QWNjZXNzb3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhOWY2ZgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzL1dvcmtzaGVldEFjY2Vzc29yLmNzCkBAIC0wLDAgKzEsMjIwMCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgRXhjZWxGb3JtdWxhOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICAvLyBDbGFzc2VzIGZvciAiYnVsayBsb2FkIiBvZiBhIHNwcmVhZHNoZWV0CisgICAgcHVibGljIGNsYXNzIE1lbW9yeVNwcmVhZHNoZWV0CisgICAgeworICAgICAgICBwcml2YXRlIFNvcnRlZExpc3Q8aW50LCBNZW1vcnlSb3c+IHJvd0xpc3Q7CisKKyAgICAgICAgcHVibGljIE1lbW9yeVNwcmVhZHNoZWV0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcm93TGlzdCA9IG5ldyBTb3J0ZWRMaXN0PGludCwgTWVtb3J5Um93PigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2V0Q2VsbFZhbHVlKGludCByb3csIGludCBjb2x1bW4sIG9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFyb3dMaXN0LkNvbnRhaW5zS2V5KHJvdykpCisgICAgICAgICAgICAgICAgcm93TGlzdC5BZGQocm93LCBuZXcgTWVtb3J5Um93KHJvdykpOworICAgICAgICAgICAgTWVtb3J5Um93IG1yID0gcm93TGlzdFtyb3ddOworICAgICAgICAgICAgbXIuU2V0Q2VsbChuZXcgTWVtb3J5Q2VsbChjb2x1bW4sIHZhbHVlKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTZXRDZWxsVmFsdWUoaW50IHJvdywgaW50IGNvbHVtbiwgb2JqZWN0IHZhbHVlLCBpbnQgc3R5bGVJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFyb3dMaXN0LkNvbnRhaW5zS2V5KHJvdykpCisgICAgICAgICAgICAgICAgcm93TGlzdC5BZGQocm93LCBuZXcgTWVtb3J5Um93KHJvdykpOworICAgICAgICAgICAgTWVtb3J5Um93IG1yID0gcm93TGlzdFtyb3ddOworICAgICAgICAgICAgbXIuU2V0Q2VsbChuZXcgTWVtb3J5Q2VsbChjb2x1bW4sIHZhbHVlLCBzdHlsZUluZGV4KSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb2JqZWN0IEdldENlbGxWYWx1ZShpbnQgcm93LCBpbnQgY29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXJvd0xpc3QuQ29udGFpbnNLZXkocm93KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIE1lbW9yeUNlbGwgY2VsbCA9IHJvd0xpc3Rbcm93XS5HZXRDZWxsKGNvbHVtbik7CisgICAgICAgICAgICBpZiAoY2VsbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIGNlbGwuR2V0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYRWxlbWVudCBHZXRFbGVtZW50cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IHJvb3QgPSBuZXcgWEVsZW1lbnQoUy5zaGVldERhdGEpOworICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPGludCwgTWVtb3J5Um93PiBpdGVtIGluIHJvd0xpc3QpCisgICAgICAgICAgICAgICAgcm9vdC5BZGQoaXRlbS5WYWx1ZS5HZXRFbGVtZW50cygpKTsKKyAgICAgICAgICAgIHJldHVybiByb290OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE1lbW9yeVJvdworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcm93OworICAgICAgICBwcml2YXRlIFNvcnRlZExpc3Q8aW50LCBNZW1vcnlDZWxsPiBjZWxsTGlzdDsKKworICAgICAgICBwdWJsaWMgTWVtb3J5Um93KGludCBSb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJvdyA9IFJvdzsKKyAgICAgICAgICAgIGNlbGxMaXN0ID0gbmV3IFNvcnRlZExpc3Q8aW50LCBNZW1vcnlDZWxsPigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lbW9yeUNlbGwgR2V0Q2VsbChpbnQgY29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWNlbGxMaXN0LkNvbnRhaW5zS2V5KGNvbHVtbikpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gY2VsbExpc3RbY29sdW1uXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFNldENlbGwoTWVtb3J5Q2VsbCBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2VsbExpc3QuQ29udGFpbnNLZXkoY2VsbC5HZXRDb2x1bW4oKSkpCisgICAgICAgICAgICAgICAgY2VsbExpc3QuUmVtb3ZlKGNlbGwuR2V0Q29sdW1uKCkpOworICAgICAgICAgICAgY2VsbExpc3QuQWRkKGNlbGwuR2V0Q29sdW1uKCksIGNlbGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhFbGVtZW50IEdldEVsZW1lbnRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgcm9vdCA9IG5ldyBYRWxlbWVudChTLnJvdywgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2Uuciwgcm93KSk7CisgICAgICAgICAgICBmb3JlYWNoIChLZXlWYWx1ZVBhaXI8aW50LCBNZW1vcnlDZWxsPiBpdGVtIGluIGNlbGxMaXN0KQorICAgICAgICAgICAgICAgIHJvb3QuQWRkKGl0ZW0uVmFsdWUuR2V0RWxlbWVudHMocm93KSk7CisgICAgICAgICAgICByZXR1cm4gcm9vdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBNZW1vcnlDZWxsCisgICAgeworICAgICAgICBwcml2YXRlIGludCBjb2x1bW47CisgICAgICAgIHByaXZhdGUgb2JqZWN0IGNlbGxWYWx1ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgc3R5bGVJbmRleDsKKworICAgICAgICBwdWJsaWMgTWVtb3J5Q2VsbChpbnQgY29sLCBvYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbHVtbiA9IGNvbDsKKyAgICAgICAgICAgIGNlbGxWYWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lbW9yeUNlbGwoaW50IGNvbCwgb2JqZWN0IHZhbHVlLCBpbnQgc3R5bGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbHVtbiA9IGNvbDsKKyAgICAgICAgICAgIGNlbGxWYWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgc3R5bGVJbmRleCA9IHN0eWxlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBHZXRDb2x1bW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY29sdW1uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvYmplY3QgR2V0VmFsdWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY2VsbFZhbHVlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgR2V0U3R5bGVJbmRleCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHlsZUluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhFbGVtZW50IEdldEVsZW1lbnRzKGludCByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBjZWxsUmVmZXJlbmNlID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0Q29sdW1uSWQoY29sdW1uKSArIHJvdy5Ub1N0cmluZygpOworICAgICAgICAgICAgWEVsZW1lbnQgbmV3Q2VsbCA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChjZWxsVmFsdWUgaXMgaW50IHx8IGNlbGxWYWx1ZSBpcyBkb3VibGUpCisgICAgICAgICAgICAgICAgbmV3Q2VsbCA9IG5ldyBYRWxlbWVudChTLmMsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnIsIGNlbGxSZWZlcmVuY2UpLCBuZXcgWEVsZW1lbnQoUy52LCBjZWxsVmFsdWUuVG9TdHJpbmcoKSkpOworICAgICAgICAgICAgZWxzZSBpZiAoY2VsbFZhbHVlIGlzIGJvb2wpCisgICAgICAgICAgICAgICAgbmV3Q2VsbCA9IG5ldyBYRWxlbWVudChTLmMsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnIsIGNlbGxSZWZlcmVuY2UpLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS50LCAiYiIpLCBuZXcgWEVsZW1lbnQoUy52LCAoYm9vbCljZWxsVmFsdWUgPyAiMSIgOiAiMCIpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNlbGxWYWx1ZSBpcyBzdHJpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3Q2VsbCA9IG5ldyBYRWxlbWVudChTLmMsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnIsIGNlbGxSZWZlcmVuY2UpLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS50LCAiaW5saW5lU3RyIiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChTLl9pcywgbmV3IFhFbGVtZW50KFMudCwgY2VsbFZhbHVlLlRvU3RyaW5nKCkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3Q2VsbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBjZWxsIHR5cGUuIik7CisgICAgICAgICAgICBpZiAoc3R5bGVJbmRleCAhPSAwKQorICAgICAgICAgICAgICAgIG5ld0NlbGwuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnMsIHN0eWxlSW5kZXgpKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ld0NlbGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTdGF0aWMgbWV0aG9kcyB0byBtb2RpZnkgd29ya3NoZWV0cyBpbiBTcHJlYWRzaGVldE1MCisgICAgcHVibGljIGNsYXNzIFdvcmtzaGVldEFjY2Vzc29yCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBYTmFtZXNwYWNlIG5zID0gImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIFhOYW1lc3BhY2UgcmVsYXRpb25zaGlwc25zID0gImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMiOworCisgICAgICAgIC8vIEZpbmRzIHRoZSBXb3Jrc2hlZXRQYXJ0IGJ5IHNoZWV0IG5hbWUKKyAgICAgICAgcHVibGljIHN0YXRpYyBXb3Jrc2hlZXRQYXJ0IEdldFdvcmtzaGVldChTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50LCBzdHJpbmcgd29ya3NoZWV0TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IHdvcmtib29rID0gZG9jdW1lbnQuV29ya2Jvb2tQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIChXb3Jrc2hlZXRQYXJ0KWRvY3VtZW50Lldvcmtib29rUGFydC5HZXRQYXJ0QnlJZCgKKyAgICAgICAgICAgICAgICB3b3JrYm9vay5Sb290LkVsZW1lbnQoUy5zaGVldHMpLkVsZW1lbnRzKFMuc2hlZXQpLldoZXJlKAorICAgICAgICAgICAgICAgICAgICBzID0+IHMuQXR0cmlidXRlKE5vTmFtZXNwYWNlLm5hbWUpLlZhbHVlLlRvTG93ZXIoKS5FcXVhbHMod29ya3NoZWV0TmFtZS5Ub0xvd2VyKCkpKQorICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpLkF0dHJpYnV0ZShSLmlkKS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGVzIGEgbmV3IHdvcmtzaGVldCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQorICAgICAgICBwdWJsaWMgc3RhdGljIFdvcmtzaGVldFBhcnQgQWRkV29ya3NoZWV0KFNwcmVhZHNoZWV0RG9jdW1lbnQgZG9jdW1lbnQsIHN0cmluZyB3b3Jrc2hlZXROYW1lKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGVtcHR5IHNoZWV0CisgICAgICAgICAgICBXb3Jrc2hlZXRQYXJ0IHdvcmtzaGVldFBhcnQgPSBkb2N1bWVudC5Xb3JrYm9va1BhcnQuQWRkTmV3UGFydDxXb3Jrc2hlZXRQYXJ0PigpOworICAgICAgICAgICAgd29ya3NoZWV0UGFydC5QdXRYRG9jdW1lbnQobmV3IFhEb2N1bWVudCgKKyAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUy53b3Jrc2hlZXQsIG5ldyBYQXR0cmlidXRlKCJ4bWxucyIsIFMucyksIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAiciIsIFIuciksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChTLnNoZWV0RGF0YSkpKSk7CisgICAgICAgICAgICBYRG9jdW1lbnQgd2IgPSBkb2N1bWVudC5Xb3JrYm9va1BhcnQuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIC8vIEdlbmVyYXRlIGEgdW5pcXVlIHNoZWV0IElEIG51bWJlcgorICAgICAgICAgICAgaW50IHNoZWV0SWQgPSAxOworICAgICAgICAgICAgaWYgKHdiLlJvb3QuRWxlbWVudChTLnNoZWV0cykuRWxlbWVudHMoUy5zaGVldCkuQ291bnQoKSAhPSAwKQorICAgICAgICAgICAgICAgIHNoZWV0SWQgPSB3Yi5Sb290LkVsZW1lbnQoUy5zaGVldHMpLkVsZW1lbnRzKFMuc2hlZXQpLk1heChuID0+IENvbnZlcnQuVG9JbnQzMihuLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5zaGVldElkKS5WYWx1ZSkpICsgMTsKKworICAgICAgICAgICAgLy8gSWYgbmFtZSBpcyBudWxsLCBnZW5lcmF0ZSBhIG5hbWUgYmFzZWQgb24gdGhlIHNoZWV0IElECisgICAgICAgICAgICBpZiAod29ya3NoZWV0TmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHdvcmtzaGVldE5hbWUgPSAiU2hlZXQiICsgc2hlZXRJZC5Ub1N0cmluZygpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG5ldyBzaGVldCBlbGVtZW50IGluIHRoZSB3b3JrYm9vaworICAgICAgICAgICAgd2IuUm9vdC5FbGVtZW50KFMuc2hlZXRzKS5BZGQobmV3IFhFbGVtZW50KFMuc2hlZXQsCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UubmFtZSwgd29ya3NoZWV0TmFtZSksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2Uuc2hlZXRJZCwgc2hlZXRJZCksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoUi5pZCwgZG9jdW1lbnQuV29ya2Jvb2tQYXJ0LkdldElkT2ZQYXJ0KHdvcmtzaGVldFBhcnQpKSkpOworICAgICAgICAgICAgZG9jdW1lbnQuV29ya2Jvb2tQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIHdvcmtzaGVldFBhcnQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGVzIGEgbmV3IHdvcmtzaGVldCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgY29udGVudHMgZnJvbSBhIG1lbW9yeSBzcHJlYWRzaGVldAorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgU2V0U2hlZXRDb250ZW50cyhTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50LCBXb3Jrc2hlZXRQYXJ0IHdvcmtzaGVldCwgTWVtb3J5U3ByZWFkc2hlZXQgY29udGVudHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCB3b3Jrc2hlZXRYRG9jdW1lbnQgPSB3b3Jrc2hlZXQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICB3b3Jrc2hlZXRYRG9jdW1lbnQuUm9vdC5FbGVtZW50KFMuc2hlZXREYXRhKS5SZXBsYWNlV2l0aChjb250ZW50cy5HZXRFbGVtZW50cygpKTsKKyAgICAgICAgICAgIHdvcmtzaGVldC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyYW5zbGF0ZXMgdGhlIGNvbHVtbiBudW1iZXIgdG8gdGhlIGNvbHVtbiByZWZlcmVuY2Ugc3RyaW5nIChlLmcuIDEgLT4gQSwgMi0+IEIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldENvbHVtbklkKGludCBjb2x1bW5OdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKChjaGFyKSgoY29sdW1uTnVtYmVyIC0gMSkgJSAyNiArIChpbnQpJ0EnKSkuVG9TdHJpbmcoKSArIHJlc3VsdDsKKyAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXIgPSAoY29sdW1uTnVtYmVyIC0gMSkgLyAyNjsKKyAgICAgICAgICAgIH0gd2hpbGUgKGNvbHVtbk51bWJlciAhPSAwKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKKyAgICAgICAgLy8gUmV0dXJuZWQgb2JqZWN0IGNhbiBiZSBkb3VibGUvRG91YmxlLCBpbnQvSW50MzIsIGJvb2wvQm9vbGVhbiBvciBzdHJpbmcvU3RyaW5nIHR5cGVzCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb2JqZWN0IEdldENlbGxWYWx1ZShTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50LCBXb3Jrc2hlZXRQYXJ0IHdvcmtzaGVldCwgaW50IGNvbHVtbiwgaW50IHJvdykKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IHdvcmtzaGVldFhEb2N1bWVudCA9IHdvcmtzaGVldC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGNlbGxWYWx1ZSA9IEdldENlbGwod29ya3NoZWV0WERvY3VtZW50LCBjb2x1bW4sIHJvdyk7CisKKyAgICAgICAgICAgIGlmIChjZWxsVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2VsbFZhbHVlLkF0dHJpYnV0ZShOb05hbWVzcGFjZS50KSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZhbHVlID0gY2VsbFZhbHVlLkVsZW1lbnQoUy52KS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLkNvbnRhaW5zKCIuIikpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29udmVydC5Ub0RvdWJsZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb252ZXJ0LlRvSW50MzIodmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNlbGxWYWx1ZS5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UudCkuVmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlICJiIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2VsbFZhbHVlLkVsZW1lbnQoUy52KS5WYWx1ZSA9PSAiMSIpOworICAgICAgICAgICAgICAgICAgICBjYXNlICJzIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRTaGFyZWRTdHJpbmcoZG9jdW1lbnQsIFN5c3RlbS5Db252ZXJ0LlRvSW50MzIoY2VsbFZhbHVlLkVsZW1lbnQoUy52KS5WYWx1ZSkpOworICAgICAgICAgICAgICAgICAgICBjYXNlICJpbmxpbmVTdHIiOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGxWYWx1ZS5FbGVtZW50KFMuX2lzKS5FbGVtZW50KFMudCkuVmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5kcyB0aGUgc2hhcmVkIHN0cmluZyB1c2luZyBpdHMgaW5kZXgKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEdldFNoYXJlZFN0cmluZyhTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCBzaGFyZWRTdHJpbmdzWERvY3VtZW50ID0gZG9jdW1lbnQuV29ya2Jvb2tQYXJ0LlNoYXJlZFN0cmluZ1RhYmxlUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBzaGFyZWRTdHJpbmdzWERvY3VtZW50LlJvb3QuRWxlbWVudHMoKS5FbGVtZW50QXQ8WEVsZW1lbnQ+KGluZGV4KS5WYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldHMgdGhlIGNlbGwgZWxlbWVudCAoYykgZm9yIHRoZSBzcGVjaWZpZWQgY2VsbAorICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZXRDZWxsKFhEb2N1bWVudCB3b3Jrc2hlZXQsIGludCBjb2x1bW4sIGludCByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBjZWxsUmVmZXJlbmNlID0gR2V0Q29sdW1uSWQoY29sdW1uKSArIHJvdy5Ub1N0cmluZygpOworICAgICAgICAgICAgWEVsZW1lbnQgcm93RWxlbWVudCA9IHdvcmtzaGVldC5Sb290CisgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQoUy5zaGVldERhdGEpCisgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFMucm93KQorICAgICAgICAgICAgICAgICAgIC5XaGVyZShyID0+IHIuQXR0cmlidXRlKE5vTmFtZXNwYWNlLnIpLlZhbHVlLkVxdWFscyhyb3cuVG9TdHJpbmcoKSkpLkZpcnN0T3JEZWZhdWx0PFhFbGVtZW50PigpOworICAgICAgICAgICAgaWYgKHJvd0VsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiByb3dFbGVtZW50LkVsZW1lbnRzKFMuYykuV2hlcmUoYyA9PiBjLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5yKS5WYWx1ZS5FcXVhbHMoY2VsbFJlZmVyZW5jZSkpLkZpcnN0T3JEZWZhdWx0PFhFbGVtZW50PigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY2VsbAorICAgICAgICAvLyBUaGUgInZhbHVlIiBtdXN0IGJlIGRvdWJsZS9Eb3VibGUsIGludC9JbnQzMiwgYm9vbC9Cb29sZWFuIG9yIHN0cmluZy9TdHJpbmcgdHlwZQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgU2V0Q2VsbFZhbHVlKFNwcmVhZHNoZWV0RG9jdW1lbnQgZG9jdW1lbnQsIFdvcmtzaGVldFBhcnQgd29ya3NoZWV0LCBpbnQgcm93LCBpbnQgY29sdW1uLCBvYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCB3b3Jrc2hlZXRYRG9jdW1lbnQgPSB3b3Jrc2hlZXQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBzdHJpbmcgY2VsbFJlZmVyZW5jZSA9IEdldENvbHVtbklkKGNvbHVtbikgKyByb3cuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFhFbGVtZW50IG5ld0NlbGwgPSBudWxsOworCisgICAgICAgICAgICBpZiAodmFsdWUgaXMgaW50IHx8IHZhbHVlIGlzIGRvdWJsZSkKKyAgICAgICAgICAgICAgICBuZXdDZWxsID0gbmV3IFhFbGVtZW50KFMuYywgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuciwgY2VsbFJlZmVyZW5jZSksIG5ldyBYRWxlbWVudChTLnYsIHZhbHVlLlRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGlzIGJvb2wpCisgICAgICAgICAgICAgICAgbmV3Q2VsbCA9IG5ldyBYRWxlbWVudChTLmMsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnIsIGNlbGxSZWZlcmVuY2UpLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS50LCAiYiIpLCBuZXcgWEVsZW1lbnQoUy52LCAoYm9vbCl2YWx1ZSA/ICIxIiA6ICIwIikpOworICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaXMgc3RyaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ld0NlbGwgPSBuZXcgWEVsZW1lbnQoUy5jLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5yLCBjZWxsUmVmZXJlbmNlKSwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UudCwgImlubGluZVN0ciIpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUy5faXMsIG5ldyBYRWxlbWVudChTLnQsIHZhbHVlLlRvU3RyaW5nKCkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3Q2VsbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBjZWxsIHR5cGUuIik7CisKKyAgICAgICAgICAgIFNldENlbGwod29ya3NoZWV0WERvY3VtZW50LCBuZXdDZWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldHMgdGhlIHNwZWNpZmllZCBjZWxsCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgU2V0Q2VsbChYRG9jdW1lbnQgd29ya3NoZWV0WERvY3VtZW50LCBYRWxlbWVudCBuZXdDZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcm93OworICAgICAgICAgICAgaW50IGNvbHVtbjsKKyAgICAgICAgICAgIHN0cmluZyBjZWxsUmVmZXJlbmNlID0gbmV3Q2VsbC5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UucikuVmFsdWU7CisgICAgICAgICAgICBHZXRSb3dDb2x1bW4oY2VsbFJlZmVyZW5jZSwgb3V0IHJvdywgb3V0IGNvbHVtbik7CisKKyAgICAgICAgICAgIC8vIEZpbmQgdGhlIHJvdyBjb250YWluaW5nIHRoZSBjZWxsIHRvIGFkZCB0aGUgdmFsdWUgdG8KKyAgICAgICAgICAgIFhFbGVtZW50IHJvd0VsZW1lbnQgPSB3b3Jrc2hlZXRYRG9jdW1lbnQuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50KFMuc2hlZXREYXRhKQorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnJvdykKKyAgICAgICAgICAgICAgICAuV2hlcmUodCA9PiB0LkF0dHJpYnV0ZShOb05hbWVzcGFjZS5yKS5WYWx1ZSA9PSByb3cuVG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKworICAgICAgICAgICAgaWYgKHJvd0VsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3JvdyBlbGVtZW50IGRvZXMgbm90IGV4aXN0CisgICAgICAgICAgICAgICAgLy9jcmVhdGUgYSBuZXcgb25lCisgICAgICAgICAgICAgICAgcm93RWxlbWVudCA9IENyZWF0ZUVtcHR5Um93KHJvdyk7CisKKyAgICAgICAgICAgICAgICAvL3JvdyBlbGVtZW50cyBtdXN0IGFwcGVhciBpbiBvcmRlciBpbnNpZGUgc2hlZXREYXRhIGVsZW1lbnQKKyAgICAgICAgICAgICAgICBpZiAod29ya3NoZWV0WERvY3VtZW50LlJvb3QuRWxlbWVudChTLnNoZWV0RGF0YSkuSGFzRWxlbWVudHMpCisgICAgICAgICAgICAgICAgeyAgIC8vaWYgdGhlcmUgYXJlIG1vcmUgcm93cyBhbHJlYWR5IGRlZmluZWQgYXQgc2hlZXREYXRhIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLy9maW5kIHRoZSByb3cgd2l0aCB0aGUgaW5tZWRpYXRlIGhpZ2hlciBpbmRleCBmb3IgdGhlIHJvdyBjb250YWluaW5nIHRoZSBjZWxsIHRvIHNldCB0aGUgdmFsdWUgdG8KKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgcm93QWZ0ZXJFbGVtZW50ID0gRmluZFJvd0FmdGVyKHdvcmtzaGVldFhEb2N1bWVudCwgcm93KTsKKyAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSBpcyBhIHJvdyB3aXRoIGFuIGlubWVkaWF0ZSBoaWdoZXIgaW5kZXggYWxyZWFkeSBkZWZpbmVkIGF0IHNoZWV0RGF0YQorICAgICAgICAgICAgICAgICAgICBpZiAocm93QWZ0ZXJFbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYWRkIHRoZSBuZXcgcm93IGJlZm9yZSB0aGUgcm93IHdpdGggYW4gaW5tZWRpYXRlIGhpZ2hlciBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgcm93QWZ0ZXJFbGVtZW50LkFkZEJlZm9yZVNlbGYocm93RWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7ICAgLy90aGlzIHJvdyBpcyBnb2luZyB0byBiZSB0aGUgb25lIHdpdGggdGhlIGhpZ2hlc3QgaW5kZXggKGFkZCBpdCBhcyB0aGUgbGFzdCBlbGVtZW50IGZvciBzaGVldERhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXRYRG9jdW1lbnQuUm9vdC5FbGVtZW50KFMuc2hlZXREYXRhKS5FbGVtZW50cyhTLnJvdykuTGFzdCgpLkFkZEFmdGVyU2VsZihyb3dFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeyAgIC8vdGhlcmUgYXJlIG5vIG90aGVyIHJvd3MgYWxyZWFkeSBkZWZpbmVkIGF0IHNoZWV0RGF0YQorICAgICAgICAgICAgICAgICAgICAvL0FkZCBhIG5ldyByb3cgZWxlbWVudG8gdG8gc2hlZXREYXRhCisgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldFhEb2N1bWVudC5Sb290LkVsZW1lbnQoUy5zaGVldERhdGEpLkFkZChyb3dFbGVtZW50KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL0FkZCB0aGUgbmV3IGNlbGwgdG8gdGhlIHJvdyBFbGVtZW50CisgICAgICAgICAgICAgICAgcm93RWxlbWVudC5BZGQobmV3Q2VsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9yb3cgY29udGFpbmluZyB0aGUgY2VsbCB0byBzZXQgdGhlIHZhbHVlIHRvIGlzIGFscmVhZHkgZGVmaW5lZCBhdCBzaGVldERhdGEKKyAgICAgICAgICAgICAgICAvL2xvb2sgaWYgY2VsbCBhbHJlYWR5IGV4aXN0IGF0IHRoYXQgcm93CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgY3VycmVudENlbGwgPSByb3dFbGVtZW50CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLmMpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZSh0ID0+IHQuQXR0cmlidXRlKE5vTmFtZXNwYWNlLnIpLlZhbHVlID09IGNlbGxSZWZlcmVuY2UpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxsID09IG51bGwpCisgICAgICAgICAgICAgICAgeyAgIC8vY2VsbCBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGF0IHJvdyBpbmRpY2F0ZWQgYXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgIC8vZmluZCB0aGUgaW5tZWRpYXRlIHJpZ2h0IGNvbHVtbiBmb3IgdGhlIGNlbGwgdG8gc2V0IHRoZSB2YWx1ZSB0bworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBjb2x1bW5BZnRlclhFbGVtZW50ID0gRmluZENvbHVtQWZ0ZXIod29ya3NoZWV0WERvY3VtZW50LCByb3csIGNvbHVtbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5BZnRlclhFbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSW5zZXJ0IHRoZSBuZXcgY2VsbCBiZWZvcmUgdGhlIGlubWVkaWF0ZSByaWdodCBjb2x1bW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkFmdGVyWEVsZW1lbnQuQWRkQmVmb3JlU2VsZihuZXdDZWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsgICAvL1RoZXJlIGlzIG5vIGlubWVkaWF0ZSByaWdodCBjZWxsIAorICAgICAgICAgICAgICAgICAgICAgICAgLy9BZGQgdGhlIG5ldyBjZWxsIGFzIHRoZSBsYXN0IGVsZW1lbnQgZm9yIHRoZSByb3cKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd0VsZW1lbnQuQWRkKG5ld0NlbGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vY2VsbCBhbHJlYXkgZXhpc3QKKyAgICAgICAgICAgICAgICAgICAgLy9yZXBsYWNlIHRoZSBjdXJyZW50IGNlbGwgd2l0aCB0aGF0IHdpdGggdGhlIG5ldyB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2VsbC5SZXBsYWNlV2l0aChuZXdDZWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5kcyB0aGUgcm93IGVsZW1lbnQgKHIpIHdpdGggYSBoaWdoZXIgbnVtYmVyIHRoYW4gdGhlIHNwZWNpZmllZCAicm93IiBudW1iZXIKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgRmluZFJvd0FmdGVyKFhEb2N1bWVudCB3b3Jrc2hlZXQsIGludCByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB3b3Jrc2hlZXQuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50KFMuc2hlZXREYXRhKQorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnJvdykKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQociA9PiBTeXN0ZW0uQ29udmVydC5Ub0ludDMyKHIuQXR0cmlidXRlKE5vTmFtZXNwYWNlLnIpLlZhbHVlKSA+IHJvdyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5kcyB0aGUgY2VsbCBlbGVtZW50IChjKSBpbiB0aGUgc3BlY2lmaWVkIHJvdyB0aGF0IGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgImNvbHVtbiIgbnVtYmVyCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEZpbmRDb2x1bUFmdGVyKFhEb2N1bWVudCB3b3Jrc2hlZXQsIGludCByb3csIGludCBjb2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB3b3Jrc2hlZXQuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50KFMuc2hlZXREYXRhKQorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnJvdykKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQociA9PiBTeXN0ZW0uQ29udmVydC5Ub0ludDMyKHIuQXR0cmlidXRlKE5vTmFtZXNwYWNlLnIpLlZhbHVlKSA9PSByb3cpCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKFMuYykKKyAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoYyA9PiBHZXRDb2x1bW5OdW1iZXIoYy5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UucikuVmFsdWUpID4gR2V0Q29sdW1uTnVtYmVyKEdldENvbHVtbklkKGNvbHVtbikgKyByb3cpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnRzIHRoZSBjb2x1bW4gcmVmZXJlbmNlIHN0cmluZyB0byBhIGNvbHVtbiBudW1iZXIgKGUuZy4gQSAtPiAxLCBCIC0+IDIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEdldENvbHVtbk51bWJlcihzdHJpbmcgY2VsbFJlZmVyZW5jZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvbHVtbk51bWJlciA9IDA7CisgICAgICAgICAgICBmb3JlYWNoIChjaGFyIGMgaW4gY2VsbFJlZmVyZW5jZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQ2hhci5Jc0xldHRlcihjKSkKKyAgICAgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyID0gY29sdW1uTnVtYmVyICogMjYgKyBTeXN0ZW0uQ29udmVydC5Ub0ludDMyKGMpIC0gU3lzdGVtLkNvbnZlcnQuVG9JbnQzMignQScpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb2x1bW5OdW1iZXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0cyBhIGNlbGwgcmVmZXJlbmNlIHN0cmluZyBpbnRvIHRoZSByb3cgYW5kIGNvbHVtbiBudW1iZXJzIGZvciB0aGF0IGNlbGwKKyAgICAgICAgLy8gZS5nLiBHNSAtPiBbcm93ID0gNSwgY29sdW1uID0gN10KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBHZXRSb3dDb2x1bW4oc3RyaW5nIGNlbGxSZWZlcmVuY2UsIG91dCBpbnQgcm93LCBvdXQgaW50IGNvbHVtbikKKyAgICAgICAgeworICAgICAgICAgICAgcm93ID0gMDsKKyAgICAgICAgICAgIGNvbHVtbiA9IDA7CisgICAgICAgICAgICBmb3JlYWNoIChjaGFyIGMgaW4gY2VsbFJlZmVyZW5jZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQ2hhci5Jc0xldHRlcihjKSkKKyAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gY29sdW1uICogMjYgKyBTeXN0ZW0uQ29udmVydC5Ub0ludDMyKGMpIC0gU3lzdGVtLkNvbnZlcnQuVG9JbnQzMignQScpICsgMTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJvdyA9IHJvdyAqIDEwICsgU3lzdGVtLkNvbnZlcnQuVG9JbnQzMihjKSAtIFN5c3RlbS5Db252ZXJ0LlRvSW50MzIoJzAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybnMgdGhlIHJvdyBhbmQgY29sdW1uIG51bWJlcnMgYW5kIHdvcmtzaGVldCBwYXJ0IGZvciB0aGUgbmFtZWQgcmFuZ2UKKyAgICAgICAgcHVibGljIHN0YXRpYyBXb3Jrc2hlZXRQYXJ0IEdldFJhbmdlKFNwcmVhZHNoZWV0RG9jdW1lbnQgZG9jLCBzdHJpbmcgcmFuZ2VOYW1lLCBvdXQgaW50IHN0YXJ0Um93LCBvdXQgaW50IHN0YXJ0Q29sdW1uLCBvdXQgaW50IGVuZFJvdywgb3V0IGludCBlbmRDb2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCBib29rID0gZG9jLldvcmtib29rUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChib29rLlJvb3QuRWxlbWVudChTLmRlZmluZWROYW1lcykgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlJhbmdlIG5hbWUgbm90IGZvdW5kOiAiICsgcmFuZ2VOYW1lKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBib29rLlJvb3QuRWxlbWVudChTLmRlZmluZWROYW1lcykuRWxlbWVudHMoUy5kZWZpbmVkTmFtZSkKKyAgICAgICAgICAgICAgICAuV2hlcmUodCA9PiB0LkF0dHJpYnV0ZShOb05hbWVzcGFjZS5uYW1lKS5WYWx1ZSA9PSByYW5nZU5hbWUpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiUmFuZ2UgbmFtZSBub3QgZm91bmQ6ICIgKyByYW5nZU5hbWUpOworICAgICAgICAgICAgc3RyaW5nIHNoZWV0TmFtZSA9IGVsZW1lbnQuVmFsdWUuU3Vic3RyaW5nKDAsIGVsZW1lbnQuVmFsdWUuSW5kZXhPZignIScpKTsKKyAgICAgICAgICAgIHN0cmluZyByYW5nZSA9IGVsZW1lbnQuVmFsdWUuU3Vic3RyaW5nKGVsZW1lbnQuVmFsdWUuSW5kZXhPZignIScpICsgMSkuUmVwbGFjZSgiJCIsIiIpOworICAgICAgICAgICAgaW50IGNvbG9uSW5kZXggPSByYW5nZS5JbmRleE9mKCc6Jyk7CisgICAgICAgICAgICBHZXRSb3dDb2x1bW4ocmFuZ2UuU3Vic3RyaW5nKDAsIGNvbG9uSW5kZXgpLCBvdXQgc3RhcnRSb3csIG91dCBzdGFydENvbHVtbik7CisgICAgICAgICAgICBHZXRSb3dDb2x1bW4ocmFuZ2UuU3Vic3RyaW5nKGNvbG9uSW5kZXggKyAxKSwgb3V0IGVuZFJvdywgb3V0IGVuZENvbHVtbik7CisgICAgICAgICAgICByZXR1cm4gR2V0V29ya3NoZWV0KGRvYywgc2hlZXROYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldHMgdGhlIG5hbWVkIHJhbmdlIHdpdGggdGhlIHNwZWNpZmllZCByYW5nZSBvZiByb3cgYW5kIGNvbHVtbiBudW1iZXJzCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBTZXRSYW5nZShTcHJlYWRzaGVldERvY3VtZW50IGRvYywgc3RyaW5nIHJhbmdlTmFtZSwgc3RyaW5nIHNoZWV0TmFtZSwgaW50IHN0YXJ0Um93LCBpbnQgc3RhcnRDb2x1bW4sIGludCBlbmRSb3csIGludCBlbmRDb2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEb2N1bWVudCBib29rID0gZG9jLldvcmtib29rUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChib29rLlJvb3QuRWxlbWVudChTLmRlZmluZWROYW1lcykgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBib29rLlJvb3QuQWRkKG5ldyBYRWxlbWVudChTLmRlZmluZWROYW1lcykpOworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IGJvb2suUm9vdC5FbGVtZW50KFMuZGVmaW5lZE5hbWVzKS5FbGVtZW50cyhTLmRlZmluZWROYW1lKQorICAgICAgICAgICAgICAgIC5XaGVyZSh0ID0+IHQuQXR0cmlidXRlKE5vTmFtZXNwYWNlLm5hbWUpLlZhbHVlID09IHJhbmdlTmFtZSkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBYRWxlbWVudChTLmRlZmluZWROYW1lLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5uYW1lLCByYW5nZU5hbWUpKTsKKyAgICAgICAgICAgICAgICBib29rLlJvb3QuRWxlbWVudChTLmRlZmluZWROYW1lcykuQWRkKGVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxlbWVudC5TZXRWYWx1ZShTdHJpbmcuRm9ybWF0KCJ7MH0hJHsxfSR7Mn06JHszfSR7NH0iLCBzaGVldE5hbWUsIEdldENvbHVtbklkKHN0YXJ0Q29sdW1uKSwgc3RhcnRSb3csIEdldENvbHVtbklkKGVuZENvbHVtbiksIGVuZFJvdykpOworICAgICAgICAgICAgZG9jLldvcmtib29rUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldHMgdGhlIGVuZCByb3cgZm9yIHRoZSBuYW1lZCByYW5nZQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVXBkYXRlUmFuZ2VFbmRSb3coU3ByZWFkc2hlZXREb2N1bWVudCBkb2MsIHN0cmluZyByYW5nZU5hbWUsIGludCBsYXN0Um93KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBVcGRhdGUgbmFtZWQgcmFuZ2UgdXNlZCBieSBwaXZvdCB0YWJsZQorICAgICAgICAgICAgWERvY3VtZW50IGJvb2sgPSBkb2MuV29ya2Jvb2tQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgWEVsZW1lbnQgZWxlbWVudCA9IGJvb2suUm9vdC5FbGVtZW50KFMuZGVmaW5lZE5hbWVzKS5FbGVtZW50cyhTLmRlZmluZWROYW1lKQorICAgICAgICAgICAgICAgIC5XaGVyZSh0ID0+IHQuQXR0cmlidXRlKE5vTmFtZXNwYWNlLm5hbWUpLlZhbHVlID09IHJhbmdlTmFtZSkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIG9yaWdpbmFsID0gZWxlbWVudC5WYWx1ZTsKKyAgICAgICAgICAgICAgICBlbGVtZW50LlNldFZhbHVlKG9yaWdpbmFsLlN1YnN0cmluZygwLCBvcmlnaW5hbC5MZW5ndGggLSAxKSArIGxhc3RSb3cuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkb2MuV29ya2Jvb2tQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlcyBhbiBlbXB0eSByb3cgZWxlbWVudCAocikgd2l0aCB0aGUgc3BlY2lmaWVkIHJvdyBudW1iZXIKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWEVsZW1lbnQgQ3JlYXRlRW1wdHlSb3coaW50IHJvdykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChTLnJvdywgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2Uuciwgcm93LlRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBGb3JjZUNhbGN1bGF0ZU9uTG9hZChTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgYm9vayA9IGRvY3VtZW50Lldvcmtib29rUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBib29rLlJvb3QuRWxlbWVudChTLmNhbGNQcik7CisgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2suUm9vdC5BZGQobmV3IFhFbGVtZW50KFMuY2FsY1ByKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbGVtZW50LlNldEF0dHJpYnV0ZVZhbHVlKE5vTmFtZXNwYWNlLmZ1bGxDYWxjT25Mb2FkLCAiMSIpOworICAgICAgICAgICAgZG9jdW1lbnQuV29ya2Jvb2tQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEZvcm11bGFSZXBsYWNlU2hlZXROYW1lKFNwcmVhZHNoZWV0RG9jdW1lbnQgZG9jdW1lbnQsIHN0cmluZyBvbGROYW1lLCBzdHJpbmcgbmV3TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAoV29ya3NoZWV0UGFydCBzaGVldFBhcnQgaW4gZG9jdW1lbnQuV29ya2Jvb2tQYXJ0LldvcmtzaGVldFBhcnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhEb2N1bWVudCBzaGVldERvYyA9IHNoZWV0UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCBmb3JtdWxhIGluIHNoZWV0RG9jLkRlc2NlbmRhbnRzKFMuZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQYXJzZUZvcm11bGEgcGFyc2VyID0gbmV3IFBhcnNlRm9ybXVsYShmb3JtdWxhLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5ld0Zvcm11bGEgPSBwYXJzZXIuUmVwbGFjZVNoZWV0TmFtZShvbGROYW1lLCBuZXdOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0Zvcm11bGEgIT0gZm9ybXVsYS5WYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXVsYS5TZXRWYWx1ZShuZXdGb3JtdWxhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2hlZXRQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBGb3JjZUNhbGN1bGF0ZU9uTG9hZChkb2N1bWVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBhbGwgY2VsbHMgaW4gdGhlIHNwZWNpZmllZCByYW5nZSB0byBhIG5ldyBsb2NhdGlvbgorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQ29weUNlbGxSYW5nZShTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50LCBXb3Jrc2hlZXRQYXJ0IHdvcmtzaGVldCwgaW50IHN0YXJ0Um93LCBpbnQgc3RhcnRDb2x1bW4sIGludCBlbmRSb3csIGludCBlbmRDb2x1bW4sCisgICAgICAgICAgICBpbnQgdG9Sb3csIGludCB0b0NvbHVtbikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHJvd09mZnNldCA9IHRvUm93IC0gc3RhcnRSb3c7CisgICAgICAgICAgICBpbnQgY29sdW1uT2Zmc2V0ID0gdG9Db2x1bW4gLSBzdGFydENvbHVtbjsKKyAgICAgICAgICAgIFhEb2N1bWVudCB3b3Jrc2hlZXRYRG9jdW1lbnQgPSB3b3Jrc2hlZXQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBmb3IgKGludCByb3cgPSBzdGFydFJvdzsgcm93IDw9IGVuZFJvdzsgcm93KyspCisgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sdW1uID0gc3RhcnRDb2x1bW47IGNvbHVtbiA8PSBlbmRDb2x1bW47IGNvbHVtbisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgb2xkQ2VsbCA9IEdldENlbGwod29ya3NoZWV0WERvY3VtZW50LCBjb2x1bW4sIHJvdyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbGRDZWxsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IG5ld0NlbGwgPSBuZXcgWEVsZW1lbnQob2xkQ2VsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDZWxsLlNldEF0dHJpYnV0ZVZhbHVlKE5vTmFtZXNwYWNlLnIsIEdldENvbHVtbklkKGNvbHVtbiArIGNvbHVtbk9mZnNldCkgKyAocm93ICsgcm93T2Zmc2V0KS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGZvcm11bGEgPSBuZXdDZWxsLkVsZW1lbnQoUy5mKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtdWxhICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VGb3JtdWxhIHBhcnNlciA9IG5ldyBQYXJzZUZvcm11bGEoZm9ybXVsYS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXVsYS5TZXRWYWx1ZShwYXJzZXIuUmVwbGFjZVJlbGF0aXZlQ2VsbChyb3dPZmZzZXQsIGNvbHVtbk9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgU2V0Q2VsbCh3b3Jrc2hlZXRYRG9jdW1lbnQsIG5ld0NlbGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgd29ya3NoZWV0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgRm9yY2VDYWxjdWxhdGVPbkxvYWQoZG9jdW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlcyBhIHBpdm90IHRhYmxlIGluIHRoZSBzcGVjaWZpZWQgc2hlZXQgdXNpbmcgdGhlIHNwZWNpZmllZCByYW5nZSBuYW1lCisgICAgICAgIC8vIFRoZSBuZXcgcGl2b3QgdGFibGUgd2lsbCBub3QgYmUgY29uZmlndXJlZCB3aXRoIGFueSBmaWVsZHMgaW4gdGhlIHJvd3MsIGNvbHVtbnMsIGZpbHRlcnMgb3IgdmFsdWVzCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGl2b3RUYWJsZVBhcnQgQ3JlYXRlUGl2b3RUYWJsZShTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50LCBzdHJpbmcgcmFuZ2VOYW1lLCBXb3Jrc2hlZXRQYXJ0IHNoZWV0KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbjsKKyAgICAgICAgICAgIFdvcmtzaGVldFBhcnQgc291cmNlU2hlZXQgPSBHZXRSYW5nZShkb2N1bWVudCwgcmFuZ2VOYW1lLCBvdXQgc3RhcnRSb3csIG91dCBzdGFydENvbHVtbiwgb3V0IGVuZFJvdywgb3V0IGVuZENvbHVtbik7CisKKyAgICAgICAgICAgIC8vIEZpbGwgb3V0IHBpdm90RmllbGRzIGVsZW1lbnQgKGZvciBQaXZvdFRhYmxlUGFydCkgYW5kIGNhY2hlRmllbGRzIGVsZW1lbnQgKGZvciBQaXZvdFRhYmxlQ2FjaGVEZWZpbml0aW9uUGFydCkKKyAgICAgICAgICAgIC8vIHdpdGggYW4gZWxlbWVudCBmb3IgZWFjaCBjb2x1bW4gaW4gdGhlIHNvdXJjZSByYW5nZQorICAgICAgICAgICAgWEVsZW1lbnQgcGl2b3RGaWVsZHMgPSBuZXcgWEVsZW1lbnQoUy5waXZvdEZpZWxkcywgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuY291bnQsIChlbmRDb2x1bW4gLSBzdGFydENvbHVtbiArIDEpLlRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGNhY2hlRmllbGRzID0gbmV3IFhFbGVtZW50KFMuY2FjaGVGaWVsZHMsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmNvdW50LCAoZW5kQ29sdW1uIC0gc3RhcnRDb2x1bW4gKyAxKS5Ub1N0cmluZygpKSk7CisgICAgICAgICAgICBmb3IgKGludCBjb2x1bW4gPSBzdGFydENvbHVtbjsgY29sdW1uIDw9IGVuZENvbHVtbjsgY29sdW1uKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGl2b3RGaWVsZHMuQWRkKG5ldyBYRWxlbWVudChTLnBpdm90RmllbGQsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnNob3dBbGwsICIwIikpKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBzaGFyZWRJdGVtcyA9IG5ldyBYRWxlbWVudChTLnNoYXJlZEl0ZW1zKTsKKyAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgbnVtZXJpYyBzaGFyZWRJdGVtcyB2YWx1ZXMsIGlmIGFueQorICAgICAgICAgICAgICAgIG9iamVjdCB2YWx1ZSA9IEdldENlbGxWYWx1ZShkb2N1bWVudCwgc291cmNlU2hlZXQsIGNvbHVtbiwgc3RhcnRSb3cgKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgaXMgZG91YmxlIHx8IHZhbHVlIGlzIEludDMyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNEb3VibGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pblZhbHVlID0gQ29udmVydC5Ub0RvdWJsZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXhWYWx1ZSA9IENvbnZlcnQuVG9Eb3VibGUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaXMgZG91YmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgaGFzRG91YmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gc3RhcnRSb3cgKyAxOyByb3cgPD0gZW5kUm93OyByb3crKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBHZXRDZWxsVmFsdWUoZG9jdW1lbnQsIHNvdXJjZVNoZWV0LCBjb2x1bW4sIHJvdyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaXMgZG91YmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0RvdWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29udmVydC5Ub0RvdWJsZSh2YWx1ZSkgPCBtaW5WYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IENvbnZlcnQuVG9Eb3VibGUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbnZlcnQuVG9Eb3VibGUodmFsdWUpID4gbWF4VmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBDb252ZXJ0LlRvRG91YmxlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzaGFyZWRJdGVtcy5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuY29udGFpbnNTZW1pTWl4ZWRUeXBlcywgIjAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmNvbnRhaW5zU3RyaW5nLCAiMCIpLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5jb250YWluc051bWJlciwgIjEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLm1pblZhbHVlLCBtaW5WYWx1ZS5Ub1N0cmluZygpKSwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UubWF4VmFsdWUsIG1heFZhbHVlLlRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNEb3VibGUpCisgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRJdGVtcy5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuY29udGFpbnNJbnRlZ2VyLCAiMSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FjaGVGaWVsZHMuQWRkKG5ldyBYRWxlbWVudChTLmNhY2hlRmllbGQsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLm5hbWUsIEdldENlbGxWYWx1ZShkb2N1bWVudCwgc291cmNlU2hlZXQsIGNvbHVtbiwgc3RhcnRSb3cpLlRvU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5udW1GbXRJZCwgIjAiKSwgc2hhcmVkSXRlbXMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmlsbCBvdXQgcGl2b3RDYWNoZVJlY29yZHMgZWxlbWVudCAoZm9yIFBpdm90VGFibGVDYWNoZVJlY29yZHNQYXJ0KSB3aXRoIGFuIGVsZW1lbnQKKyAgICAgICAgICAgIC8vIGZvciBlYWNoIHJvdyBpbiB0aGUgc291cmNlIHJhbmdlCisgICAgICAgICAgICBYRWxlbWVudCBwaXZvdENhY2hlUmVjb3JkcyA9IG5ldyBYRWxlbWVudChTLnBpdm90Q2FjaGVSZWNvcmRzLCBuZXcgWEF0dHJpYnV0ZSgieG1sbnMiLCBTLnMpLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAiciIsIFIuciksIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmNvdW50LCAoZW5kUm93IC0gc3RhcnRSb3cpLlRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IHN0YXJ0Um93ICsgMTsgcm93IDw9IGVuZFJvdzsgcm93KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgciA9IG5ldyBYRWxlbWVudChTLnIpOworCisgICAgICAgICAgICAgICAgLy8gRmlsbCB0aGUgcmVjb3JkIGVsZW1lbnQgd2l0aCBhIHZhbHVlIGZyb20gZWFjaCBjb2x1bW4gaW4gdGhlIHNvdXJjZSByb3cKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjb2x1bW4gPSBzdGFydENvbHVtbjsgY29sdW1uIDw9IGVuZENvbHVtbjsgY29sdW1uKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYmplY3QgdmFsdWUgPSBHZXRDZWxsVmFsdWUoZG9jdW1lbnQsIHNvdXJjZVNoZWV0LCBjb2x1bW4sIHJvdyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpcyBTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICByLkFkZChuZXcgWEVsZW1lbnQoUy5fcywgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UudiwgdmFsdWUuVG9TdHJpbmcoKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgci5BZGQobmV3IFhFbGVtZW50KFMubiwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UudiwgdmFsdWUuVG9TdHJpbmcoKSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGl2b3RDYWNoZVJlY29yZHMuQWRkKHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDcmVhdGUgcGl2b3QgdGFibGUgcGFydHMgd2l0aCBwcm9wZXIgbGlua3MKKyAgICAgICAgICAgIFBpdm90VGFibGVQYXJ0IHBpdm90VGFibGUgPSBzaGVldC5BZGROZXdQYXJ0PFBpdm90VGFibGVQYXJ0PigpOworICAgICAgICAgICAgUGl2b3RUYWJsZUNhY2hlRGVmaW5pdGlvblBhcnQgY2FjaGVEZWYgPSBwaXZvdFRhYmxlLkFkZE5ld1BhcnQ8UGl2b3RUYWJsZUNhY2hlRGVmaW5pdGlvblBhcnQ+KCk7CisgICAgICAgICAgICBQaXZvdFRhYmxlQ2FjaGVSZWNvcmRzUGFydCByZWNvcmRzID0gY2FjaGVEZWYuQWRkTmV3UGFydDxQaXZvdFRhYmxlQ2FjaGVSZWNvcmRzUGFydD4oKTsKKyAgICAgICAgICAgIGRvY3VtZW50Lldvcmtib29rUGFydC5BZGRQYXJ0PFBpdm90VGFibGVDYWNoZURlZmluaXRpb25QYXJ0PihjYWNoZURlZik7CisKKyAgICAgICAgICAgIC8vIFNldCBjb250ZW50IGZvciB0aGUgUGl2b3RUYWJsZUNhY2hlUmVjb3Jkc1BhcnQgYW5kIFBpdm90VGFibGVDYWNoZURlZmluaXRpb25QYXJ0CisgICAgICAgICAgICByZWNvcmRzLlB1dFhEb2N1bWVudChuZXcgWERvY3VtZW50KHBpdm90Q2FjaGVSZWNvcmRzKSk7CisgICAgICAgICAgICBjYWNoZURlZi5QdXRYRG9jdW1lbnQobmV3IFhEb2N1bWVudChuZXcgWEVsZW1lbnQoUy5waXZvdENhY2hlRGVmaW5pdGlvbiwgbmV3IFhBdHRyaWJ1dGUoInhtbG5zIiwgUy5zKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInIiLCBSLnIpLCBuZXcgWEF0dHJpYnV0ZShSLmlkLCBjYWNoZURlZi5HZXRJZE9mUGFydChyZWNvcmRzKSksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucmVjb3JkQ291bnQsIChlbmRSb3cgLSBzdGFydFJvdykuVG9TdHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChTLmNhY2hlU291cmNlLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS50eXBlLCAid29ya3NoZWV0IiksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoUy53b3Jrc2hlZXRTb3VyY2UsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLm5hbWUsIHJhbmdlTmFtZSkpKSwKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVGaWVsZHMpKSk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcGl2b3RDYWNoZSBlbnRyeSBpbiB0aGUgd29ya2Jvb2sgcGFydAorICAgICAgICAgICAgaW50IGNhY2hlSWQgPSAxOworICAgICAgICAgICAgWERvY3VtZW50IHdiID0gZG9jdW1lbnQuV29ya2Jvb2tQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgaWYgKHdiLlJvb3QuRWxlbWVudChTLnBpdm90Q2FjaGVzKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHdiLlJvb3QuQWRkKG5ldyBYRWxlbWVudChTLnBpdm90Q2FjaGVzKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdiLlJvb3QuRWxlbWVudChTLnBpdm90Q2FjaGVzKS5FbGVtZW50cyhTLnBpdm90Q2FjaGUpLkNvdW50KCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVJZCA9IHdiLlJvb3QuRWxlbWVudChTLnBpdm90Q2FjaGVzKS5FbGVtZW50cyhTLnBpdm90Q2FjaGUpLk1heChuID0+IENvbnZlcnQuVG9JbnQzMihuLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5jYWNoZUlkKS5WYWx1ZSkpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdiLlJvb3QuRWxlbWVudChTLnBpdm90Q2FjaGVzKS5BZGQobmV3IFhFbGVtZW50KFMucGl2b3RDYWNoZSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5jYWNoZUlkLCBjYWNoZUlkKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShSLmlkLCBkb2N1bWVudC5Xb3JrYm9va1BhcnQuR2V0SWRPZlBhcnQoY2FjaGVEZWYpKSkpOworICAgICAgICAgICAgZG9jdW1lbnQuV29ya2Jvb2tQYXJ0LlB1dFhEb2N1bWVudCgpOworCisgICAgICAgICAgICAvLyBTZXQgdGhlIGNvbnRlbnQgZm9yIHRoZSBQaXZvdFRhYmxlUGFydAorICAgICAgICAgICAgcGl2b3RUYWJsZS5QdXRYRG9jdW1lbnQobmV3IFhEb2N1bWVudChuZXcgWEVsZW1lbnQoUy5waXZvdFRhYmxlRGVmaW5pdGlvbiwgbmV3IFhBdHRyaWJ1dGUoInhtbG5zIiwgUy5zKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5uYW1lLCAiUGl2b3RUYWJsZTEiKSwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuY2FjaGVJZCwgY2FjaGVJZC5Ub1N0cmluZygpKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5kYXRhQ2FwdGlvbiwgIlZhbHVlcyIpLAorICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChTLmxvY2F0aW9uLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5fcmVmLCAiQTM6QzIwIiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmZpcnN0SGVhZGVyUm93LCAiMSIpLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5maXJzdERhdGFSb3csICIxIiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmZpcnN0RGF0YUNvbCwgIjAiKSksIHBpdm90RmllbGRzKSkpOworCisgICAgICAgICAgICByZXR1cm4gcGl2b3RUYWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBlbnVtIFBpdm90QXhpcyB7IFJvdywgQ29sdW1uLCBQYWdlIH07CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRQaXZvdEF4aXMoU3ByZWFkc2hlZXREb2N1bWVudCBkb2N1bWVudCwgV29ya3NoZWV0UGFydCBzaGVldCwgc3RyaW5nIGZpZWxkTmFtZSwgUGl2b3RBeGlzIGF4aXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBpbmRleGVkIGl0ZW1zIGluIGNhY2hlIGFuZCBkZWZpbml0aW9uCisgICAgICAgICAgICBQaXZvdFRhYmxlUGFydCBwaXZvdFRhYmxlUGFydCA9IHNoZWV0LkdldFBhcnRzT2ZUeXBlPFBpdm90VGFibGVQYXJ0PigpLkZpcnN0KCk7CisgICAgICAgICAgICBQaXZvdFRhYmxlQ2FjaGVEZWZpbml0aW9uUGFydCBjYWNoZURlZlBhcnQgPSBwaXZvdFRhYmxlUGFydC5HZXRQYXJ0c09mVHlwZTxQaXZvdFRhYmxlQ2FjaGVEZWZpbml0aW9uUGFydD4oKS5GaXJzdCgpOworICAgICAgICAgICAgUGl2b3RUYWJsZUNhY2hlUmVjb3Jkc1BhcnQgcmVjb3Jkc1BhcnQgPSBjYWNoZURlZlBhcnQuR2V0UGFydHNPZlR5cGU8UGl2b3RUYWJsZUNhY2hlUmVjb3Jkc1BhcnQ+KCkuRmlyc3QoKTsKKyAgICAgICAgICAgIFhEb2N1bWVudCBjYWNoZURlZiA9IGNhY2hlRGVmUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IEFycmF5LkZpbmRJbmRleChjYWNoZURlZi5EZXNjZW5kYW50cyhTLmNhY2hlRmllbGQpLlRvQXJyYXkoKSwKKyAgICAgICAgICAgICAgICB6ID0+IHouQXR0cmlidXRlKE5vTmFtZXNwYWNlLm5hbWUpLlZhbHVlID09IGZpZWxkTmFtZSk7CisgICAgICAgICAgICBYRG9jdW1lbnQgcmVjb3JkcyA9IHJlY29yZHNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgTGlzdDxYRWxlbWVudD4gdmFsdWVzID0gbmV3IExpc3Q8WEVsZW1lbnQ+KCk7CisgICAgICAgICAgICBmb3JlYWNoIChYRWxlbWVudCByZWMgaW4gcmVjb3Jkcy5EZXNjZW5kYW50cyhTLnIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IHZhbCA9IHJlYy5FbGVtZW50cygpLlNraXAoaW5kZXgpLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgaW50IHggPSBBcnJheS5GaW5kSW5kZXgodmFsdWVzLlRvQXJyYXkoKSwgeiA9PiBYRWxlbWVudC5EZWVwRXF1YWxzKHosIHZhbCkpOworICAgICAgICAgICAgICAgIGlmICh4ID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLkFkZCh2YWwpOworICAgICAgICAgICAgICAgICAgICB4ID0gdmFsdWVzLkNvdW50KCkgLSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWwuUmVwbGFjZVdpdGgobmV3IFhFbGVtZW50KFMueCwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UudiwgeCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhFbGVtZW50IHNoYXJlZEl0ZW1zID0gY2FjaGVEZWYuRGVzY2VuZGFudHMoUy5jYWNoZUZpZWxkKS5Ta2lwKGluZGV4KS5GaXJzdCgpLkVsZW1lbnQoUy5zaGFyZWRJdGVtcyk7CisgICAgICAgICAgICBzaGFyZWRJdGVtcy5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuY291bnQsIHZhbHVlcy5Db3VudCgpKSwgdmFsdWVzKTsKKyAgICAgICAgICAgIHJlY29yZHNQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgY2FjaGVEZWZQYXJ0LlB1dFhEb2N1bWVudCgpOworCisgICAgICAgICAgICAvLyBBZGQgYXhpcyBkZWZpbml0aW9uIHRvIHBpdm90IHRhYmxlIGZpZWxkCisgICAgICAgICAgICBYRG9jdW1lbnQgcGl2b3RUYWJsZSA9IHBpdm90VGFibGVQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgWEVsZW1lbnQgcGl2b3RGaWVsZCA9IHBpdm90VGFibGUuRGVzY2VuZGFudHMoUy5waXZvdEZpZWxkKS5Ta2lwKGluZGV4KS5GaXJzdCgpOworICAgICAgICAgICAgWEVsZW1lbnQgaXRlbXMgPSBuZXcgWEVsZW1lbnQoUy5pdGVtcywgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuY291bnQsIHZhbHVlcy5Db3VudCgpICsgMSksCisgICAgICAgICAgICAgICAgdmFsdWVzLk9yZGVyQnkoeiA9PiB6LkF0dHJpYnV0ZShOb05hbWVzcGFjZS52KS5WYWx1ZSkuU2VsZWN0KHogPT4gbmV3IFhFbGVtZW50KFMuaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UueCwgQXJyYXkuRmluZEluZGV4KHZhbHVlcy5Ub0FycmF5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBhID0+IGEuQXR0cmlidXRlKE5vTmFtZXNwYWNlLnYpLlZhbHVlID09IHouQXR0cmlidXRlKE5vTmFtZXNwYWNlLnYpLlZhbHVlKSkpKSk7CisgICAgICAgICAgICBpdGVtcy5BZGQobmV3IFhFbGVtZW50KFMuaXRlbSwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UudCwgImRlZmF1bHQiKSkpOworICAgICAgICAgICAgc3dpdGNoIChheGlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgUGl2b3RBeGlzLkNvbHVtbjoKKyAgICAgICAgICAgICAgICAgICAgcGl2b3RGaWVsZC5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYXhpcywgImF4aXNDb2wiKSwgaXRlbXMpOworICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdG8gY29sRmllbGRzCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGZpZWxkcyA9IHBpdm90VGFibGUuRWxlbWVudChTLnBpdm90VGFibGVEZWZpbml0aW9uKS5FbGVtZW50KFMuY29sRmllbGRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMgPSBuZXcgWEVsZW1lbnQoUy5jb2xGaWVsZHMsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmNvdW50LCAwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgcm93RmllbGRzID0gcGl2b3RUYWJsZS5FbGVtZW50KFMucGl2b3RUYWJsZURlZmluaXRpb24pLkVsZW1lbnQoUy5yb3dGaWVsZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dGaWVsZHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl2b3RUYWJsZS5FbGVtZW50KFMucGl2b3RUYWJsZURlZmluaXRpb24pLkVsZW1lbnQoUy5waXZvdEZpZWxkcykuQWRkQWZ0ZXJTZWxmKGZpZWxkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dGaWVsZHMuQWRkQWZ0ZXJTZWxmKGZpZWxkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMuQWRkKG5ldyBYRWxlbWVudChTLmZpZWxkLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS54LCBpbmRleCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuY291bnQpLlZhbHVlID0gZmllbGRzLkVsZW1lbnRzKFMuZmllbGQpLkNvdW50KCkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBpdm90QXhpcy5Sb3c6CisgICAgICAgICAgICAgICAgICAgIHBpdm90RmllbGQuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmF4aXMsICJheGlzUm93IiksIGl0ZW1zKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRvIHJvd0ZpZWxkcworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBmaWVsZHMgPSBwaXZvdFRhYmxlLkVsZW1lbnQoUy5waXZvdFRhYmxlRGVmaW5pdGlvbikuRWxlbWVudChTLnJvd0ZpZWxkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzID0gbmV3IFhFbGVtZW50KFMucm93RmllbGRzLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5jb3VudCwgMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpdm90VGFibGUuRWxlbWVudChTLnBpdm90VGFibGVEZWZpbml0aW9uKS5FbGVtZW50KFMucGl2b3RGaWVsZHMpLkFkZEFmdGVyU2VsZihmaWVsZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzLkFkZChuZXcgWEVsZW1lbnQoUy5maWVsZCwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UueCwgaW5kZXgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMuQXR0cmlidXRlKE5vTmFtZXNwYWNlLmNvdW50KS5WYWx1ZSA9IGZpZWxkcy5FbGVtZW50cyhTLmZpZWxkKS5Db3VudCgpLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQaXZvdEF4aXMuUGFnZToKKyAgICAgICAgICAgICAgICAgICAgcGl2b3RGaWVsZC5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYXhpcywgImF4aXNQYWdlIiksIGl0ZW1zKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRvIHBhZ2VGaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgZmllbGRzID0gcGl2b3RUYWJsZS5FbGVtZW50KFMucGl2b3RUYWJsZURlZmluaXRpb24pLkVsZW1lbnQoUy5wYWdlRmllbGRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMgPSBuZXcgWEVsZW1lbnQoUy5wYWdlRmllbGRzLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5jb3VudCwgMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHByZXYgPSBwaXZvdFRhYmxlLkVsZW1lbnQoUy5waXZvdFRhYmxlRGVmaW5pdGlvbikuRWxlbWVudChTLmNvbEZpZWxkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IHBpdm90VGFibGUuRWxlbWVudChTLnBpdm90VGFibGVEZWZpbml0aW9uKS5FbGVtZW50KFMucm93RmllbGRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXZvdFRhYmxlLkVsZW1lbnQoUy5waXZvdFRhYmxlRGVmaW5pdGlvbikuRWxlbWVudChTLnBpdm90RmllbGRzKS5BZGRBZnRlclNlbGYoZmllbGRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYuQWRkQWZ0ZXJTZWxmKGZpZWxkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMuQWRkKG5ldyBYRWxlbWVudChTLnBhZ2VGaWVsZCwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuZmxkLCBpbmRleCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuY291bnQpLlZhbHVlID0gZmllbGRzLkVsZW1lbnRzKFMuZmllbGQpLkNvdW50KCkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpdm90VGFibGVQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgRm9yY2VQaXZvdFJlZnJlc2goY2FjaGVEZWZQYXJ0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGREYXRhVmFsdWVMYWJlbChTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50LCBXb3Jrc2hlZXRQYXJ0IHNoZWV0LCBQaXZvdEF4aXMgYXhpcykKKyAgICAgICAgeworICAgICAgICAgICAgUGl2b3RUYWJsZVBhcnQgcGl2b3RUYWJsZVBhcnQgPSBzaGVldC5HZXRQYXJ0c09mVHlwZTxQaXZvdFRhYmxlUGFydD4oKS5GaXJzdCgpOworICAgICAgICAgICAgWERvY3VtZW50IHBpdm90VGFibGUgPSBwaXZvdFRhYmxlUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHN3aXRjaCAoYXhpcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBpdm90QXhpcy5Db2x1bW46CisgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0byBjb2xGaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgZmllbGRzID0gcGl2b3RUYWJsZS5FbGVtZW50KFMucGl2b3RUYWJsZURlZmluaXRpb24pLkVsZW1lbnQoUy5jb2xGaWVsZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcyA9IG5ldyBYRWxlbWVudChTLmNvbEZpZWxkcywgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuY291bnQsIDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCByb3dGaWVsZHMgPSBwaXZvdFRhYmxlLkVsZW1lbnQoUy5waXZvdFRhYmxlRGVmaW5pdGlvbikuRWxlbWVudChTLnJvd0ZpZWxkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvd0ZpZWxkcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXZvdFRhYmxlLkVsZW1lbnQoUy5waXZvdFRhYmxlRGVmaW5pdGlvbikuRWxlbWVudChTLnBpdm90RmllbGRzKS5BZGRBZnRlclNlbGYoZmllbGRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0ZpZWxkcy5BZGRBZnRlclNlbGYoZmllbGRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5BZGQobmV3IFhFbGVtZW50KFMuZmllbGQsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLngsIC0yKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5jb3VudCkuVmFsdWUgPSBmaWVsZHMuRWxlbWVudHMoUy5maWVsZCkuQ291bnQoKS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUGl2b3RBeGlzLlJvdzoKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRvIHJvd0ZpZWxkcworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBmaWVsZHMgPSBwaXZvdFRhYmxlLkVsZW1lbnQoUy5waXZvdFRhYmxlRGVmaW5pdGlvbikuRWxlbWVudChTLnJvd0ZpZWxkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzID0gbmV3IFhFbGVtZW50KFMucm93RmllbGRzLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5jb3VudCwgMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpdm90VGFibGUuRWxlbWVudChTLnBpdm90VGFibGVEZWZpbml0aW9uKS5FbGVtZW50KFMucGl2b3RGaWVsZHMpLkFkZEFmdGVyU2VsZihmaWVsZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzLkFkZChuZXcgWEVsZW1lbnQoUy5maWVsZCwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UueCwgLTIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMuQXR0cmlidXRlKE5vTmFtZXNwYWNlLmNvdW50KS5WYWx1ZSA9IGZpZWxkcy5FbGVtZW50cyhTLmZpZWxkKS5Db3VudCgpLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQaXZvdEF4aXMuUGFnZToKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRvIHBhZ2VGaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgZmllbGRzID0gcGl2b3RUYWJsZS5FbGVtZW50KFMucGl2b3RUYWJsZURlZmluaXRpb24pLkVsZW1lbnQoUy5wYWdlRmllbGRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMgPSBuZXcgWEVsZW1lbnQoUy5wYWdlRmllbGRzLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5jb3VudCwgMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IHByZXYgPSBwaXZvdFRhYmxlLkVsZW1lbnQoUy5waXZvdFRhYmxlRGVmaW5pdGlvbikuRWxlbWVudChTLmNvbEZpZWxkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IHBpdm90VGFibGUuRWxlbWVudChTLnBpdm90VGFibGVEZWZpbml0aW9uKS5FbGVtZW50KFMucm93RmllbGRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXZvdFRhYmxlLkVsZW1lbnQoUy5waXZvdFRhYmxlRGVmaW5pdGlvbikuRWxlbWVudChTLnBpdm90RmllbGRzKS5BZGRBZnRlclNlbGYoZmllbGRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYuQWRkQWZ0ZXJTZWxmKGZpZWxkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMuQWRkKG5ldyBYRWxlbWVudChTLnBhZ2VGaWVsZCwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuZmxkLCAtMikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuY291bnQpLlZhbHVlID0gZmllbGRzLkVsZW1lbnRzKFMuZmllbGQpLkNvdW50KCkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpdm90VGFibGVQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgUGl2b3RUYWJsZUNhY2hlRGVmaW5pdGlvblBhcnQgY2FjaGVEZWZQYXJ0ID0gcGl2b3RUYWJsZVBhcnQuR2V0UGFydHNPZlR5cGU8UGl2b3RUYWJsZUNhY2hlRGVmaW5pdGlvblBhcnQ+KCkuRmlyc3QoKTsKKyAgICAgICAgICAgIEZvcmNlUGl2b3RSZWZyZXNoKGNhY2hlRGVmUGFydCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkRGF0YVZhbHVlKFNwcmVhZHNoZWV0RG9jdW1lbnQgZG9jdW1lbnQsIFdvcmtzaGVldFBhcnQgc2hlZXQsIHN0cmluZyBmaWVsZE5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBpdm90VGFibGVQYXJ0IHBpdm90VGFibGVQYXJ0ID0gc2hlZXQuR2V0UGFydHNPZlR5cGU8UGl2b3RUYWJsZVBhcnQ+KCkuRmlyc3QoKTsKKyAgICAgICAgICAgIFBpdm90VGFibGVDYWNoZURlZmluaXRpb25QYXJ0IGNhY2hlRGVmUGFydCA9IHBpdm90VGFibGVQYXJ0LkdldFBhcnRzT2ZUeXBlPFBpdm90VGFibGVDYWNoZURlZmluaXRpb25QYXJ0PigpLkZpcnN0KCk7CisgICAgICAgICAgICBYRG9jdW1lbnQgY2FjaGVEZWYgPSBjYWNoZURlZlBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBBcnJheS5GaW5kSW5kZXgoY2FjaGVEZWYuRGVzY2VuZGFudHMoUy5jYWNoZUZpZWxkKS5Ub0FycmF5KCksCisgICAgICAgICAgICAgICAgeiA9PiB6LkF0dHJpYnV0ZShOb05hbWVzcGFjZS5uYW1lKS5WYWx1ZSA9PSBmaWVsZE5hbWUpOworICAgICAgICAgICAgWERvY3VtZW50IHBpdm90VGFibGUgPSBwaXZvdFRhYmxlUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFhFbGVtZW50IHBpdm90RmllbGQgPSBwaXZvdFRhYmxlLkRlc2NlbmRhbnRzKFMucGl2b3RGaWVsZCkuU2tpcChpbmRleCkuRmlyc3QoKTsKKyAgICAgICAgICAgIHBpdm90RmllbGQuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmRhdGFGaWVsZCwgIjEiKSk7CisgICAgICAgICAgICBYRWxlbWVudCBmaWVsZHMgPSBwaXZvdFRhYmxlLkVsZW1lbnQoUy5waXZvdFRhYmxlRGVmaW5pdGlvbikuRWxlbWVudChTLmRhdGFGaWVsZHMpOworICAgICAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkcyA9IG5ldyBYRWxlbWVudChTLmRhdGFGaWVsZHMsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmNvdW50LCAwKSk7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgcHJldiA9IHBpdm90VGFibGUuRWxlbWVudChTLnBpdm90VGFibGVEZWZpbml0aW9uKS5FbGVtZW50KFMucGFnZUZpZWxkcyk7CisgICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IHBpdm90VGFibGUuRWxlbWVudChTLnBpdm90VGFibGVEZWZpbml0aW9uKS5FbGVtZW50KFMuY29sRmllbGRzKTsKKyAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBwcmV2ID0gcGl2b3RUYWJsZS5FbGVtZW50KFMucGl2b3RUYWJsZURlZmluaXRpb24pLkVsZW1lbnQoUy5yb3dGaWVsZHMpOworICAgICAgICAgICAgICAgIGlmIChwcmV2ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHByZXYgPSBwaXZvdFRhYmxlLkVsZW1lbnQoUy5waXZvdFRhYmxlRGVmaW5pdGlvbikuRWxlbWVudChTLnBpdm90RmllbGRzKTsKKyAgICAgICAgICAgICAgICBwcmV2LkFkZEFmdGVyU2VsZihmaWVsZHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmllbGRzLkFkZChuZXcgWEVsZW1lbnQoUy5kYXRhRmllbGQsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLm5hbWUsICJTdW0gb2YgIiArIGZpZWxkTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5mbGQsIGluZGV4KSwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYmFzZUZpZWxkLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmJhc2VJdGVtLCAwKSkpOworICAgICAgICAgICAgaW50IGNvdW50ID0gZmllbGRzLkVsZW1lbnRzKFMuZGF0YUZpZWxkKS5Db3VudCgpOworICAgICAgICAgICAgZmllbGRzLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5jb3VudCkuVmFsdWUgPSBjb3VudC5Ub1N0cmluZygpOworICAgICAgICAgICAgaWYgKGNvdW50ID09IDIpCisgICAgICAgICAgICB7ICAgLy8gT25seSB3aGVuIGRhdGEgZmllbGQgY291bnQgZ29lcyBmcm9tIDEgdG8gMiBkbyB3ZSBhZGQgYSBzcGVjaWFsIGNvbHVtbiB0byBsYWJlbCB0aGUgZGF0YSBmaWVsZHMKKyAgICAgICAgICAgICAgICBBZGREYXRhVmFsdWVMYWJlbChkb2N1bWVudCwgc2hlZXQsIFBpdm90QXhpcy5Db2x1bW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGl2b3RUYWJsZVBhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICBGb3JjZVBpdm90UmVmcmVzaChjYWNoZURlZlBhcnQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBGb3JjZVBpdm90UmVmcmVzaChQaXZvdFRhYmxlQ2FjaGVEZWZpbml0aW9uUGFydCBjYWNoZURlZikKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IGRvYyA9IGNhY2hlRGVmLkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgWEVsZW1lbnQgZGVmID0gZG9jLkVsZW1lbnQoUy5waXZvdENhY2hlRGVmaW5pdGlvbik7CisgICAgICAgICAgICBpZiAoZGVmLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5yZWZyZXNoT25Mb2FkKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGRlZi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucmVmcmVzaE9uTG9hZCwgMSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRlZi5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UucmVmcmVzaE9uTG9hZCkuVmFsdWUgPSAiMSI7CisgICAgICAgICAgICBjYWNoZURlZi5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBDaGVja051bWJlckZvcm1hdChTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50LCBpbnQgZm10SUQsIHN0cmluZyBmb3JtYXRDb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBudW1GbXQgPSBuZXcgWEVsZW1lbnQoUy5udW1GbXQsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLm51bUZtdElkLCBmbXRJRC5Ub1N0cmluZygpKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5mb3JtYXRDb2RlLCBmb3JtYXRDb2RlKSk7CisgICAgICAgICAgICBYRG9jdW1lbnQgc3R5bGVzID0gZG9jdW1lbnQuV29ya2Jvb2tQYXJ0Lldvcmtib29rU3R5bGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFhFbGVtZW50IG51bUZtdHMgPSBzdHlsZXMuUm9vdC5FbGVtZW50KFMubnVtRm10cyk7CisgICAgICAgICAgICBpZiAobnVtRm10cyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0eWxlcy5Sb290LkVsZW1lbnQoUy5mb250cykuQWRkQmVmb3JlU2VsZihuZXcgWEVsZW1lbnQoUy5udW1GbXRzLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5jb3VudCwgIjAiKSkpOworICAgICAgICAgICAgICAgIG51bUZtdHMgPSBzdHlsZXMuUm9vdC5FbGVtZW50KFMubnVtRm10cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgaW5kZXggPSBBcnJheS5GaW5kSW5kZXgobnVtRm10cy5FbGVtZW50cyhTLm51bUZtdCkuVG9BcnJheSgpLAorICAgICAgICAgICAgICAgIHogPT4gWEVsZW1lbnQuRGVlcEVxdWFscyh6LCBudW1GbXQpKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBudW1GbXRzLkFkZChudW1GbXQpOworICAgICAgICAgICAgICAgIG51bUZtdHMuQXR0cmlidXRlKE5vTmFtZXNwYWNlLmNvdW50KS5WYWx1ZSA9IG51bUZtdHMuRWxlbWVudHMoUy5udW1GbXQpLkNvdW50KCkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBkb2N1bWVudC5Xb3JrYm9va1BhcnQuV29ya2Jvb2tTdHlsZXNQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIENvbG9ySW5mbworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgZW51bSBDb2xvclR5cGUgeyBUaGVtZSwgSW5kZXhlZCB9OworCisgICAgICAgICAgICBwcml2YXRlIGJvb2wgQXV0bzsKKyAgICAgICAgICAgIHByaXZhdGUgc3RyaW5nIFJHQjsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IEluZGV4ZWQ7CisgICAgICAgICAgICBwcml2YXRlIGludCBUaGVtZTsKKyAgICAgICAgICAgIHByaXZhdGUgZG91YmxlIFRpbnQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBDb2xvckluZm8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEF1dG8gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIENvbG9ySW5mbyhDb2xvclR5cGUgdHlwZSwgaW50IHZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IENvbG9yVHlwZS5JbmRleGVkKQorICAgICAgICAgICAgICAgICAgICBJbmRleGVkID0gdmFsdWU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBDb2xvclR5cGUuVGhlbWUpCisgICAgICAgICAgICAgICAgICAgIFRoZW1lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgQ29sb3JJbmZvKGludCB0aGVtZSwgZG91YmxlIHRpbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGhlbWUgPSB0aGVtZTsKKyAgICAgICAgICAgICAgICBUaW50ID0gdGludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBDb2xvckluZm8oc3RyaW5nIHJnYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSR0IgPSByZ2I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYRWxlbWVudCBHZXRYRWxlbWVudChYTmFtZSBjb2xvck5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgY29sb3IgPSBuZXcgWEVsZW1lbnQoY29sb3JOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoQXV0bykKKyAgICAgICAgICAgICAgICAgICAgY29sb3IuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmF1dG8sICIxIikpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFJHQiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb2xvci5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucmdiLCBSR0IpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChJbmRleGVkICE9IDApCisgICAgICAgICAgICAgICAgICAgIGNvbG9yLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5pbmRleGVkLCBJbmRleGVkKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjb2xvci5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UudGhlbWUsIFRoZW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKFRpbnQgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29sb3IuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnRpbnQsIFRpbnQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgRm9udAorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgZW51bSBTY2hlbWVUeXBlIHsgTm9uZSwgTWFqb3IsIE1pbm9yIH07CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIEJvbGQgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIENvbG9ySW5mbyBDb2xvciB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBDb25kZW5zZSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBFeHRlbmQgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIGludCBGYW1pbHkgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIGJvb2wgSXRhbGljIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBPdXRsaW5lIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBTY2hlbWVUeXBlIFNjaGVtZSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBTaGFkb3cgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIGJvb2wgU3RyaWtlVGhyb3VnaCB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgaW50IFNpemUgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIGJvb2wgVW5kZXJsaW5lIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAgICAgcHVibGljIFhFbGVtZW50IEdldFhFbGVtZW50KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBmb250ID0gbmV3IFhFbGVtZW50KFMuZm9udCk7CisgICAgICAgICAgICAgICAgaWYgKEJvbGQpCisgICAgICAgICAgICAgICAgICAgIGZvbnQuQWRkKG5ldyBYRWxlbWVudChTLmIpKTsKKyAgICAgICAgICAgICAgICBpZiAoSXRhbGljKQorICAgICAgICAgICAgICAgICAgICBmb250LkFkZChuZXcgWEVsZW1lbnQoUy5pKSk7CisgICAgICAgICAgICAgICAgaWYgKFVuZGVybGluZSkKKyAgICAgICAgICAgICAgICAgICAgZm9udC5BZGQobmV3IFhFbGVtZW50KFMudSkpOworICAgICAgICAgICAgICAgIGlmIChTdHJpa2VUaHJvdWdoKQorICAgICAgICAgICAgICAgICAgICBmb250LkFkZChuZXcgWEVsZW1lbnQoUy5zdHJpa2UpKTsKKyAgICAgICAgICAgICAgICBpZiAoQ29uZGVuc2UpCisgICAgICAgICAgICAgICAgICAgIGZvbnQuQWRkKG5ldyBYRWxlbWVudChTLmNvbmRlbnNlKSk7CisgICAgICAgICAgICAgICAgaWYgKEV4dGVuZCkKKyAgICAgICAgICAgICAgICAgICAgZm9udC5BZGQobmV3IFhFbGVtZW50KFMuZXh0ZW5kKSk7CisgICAgICAgICAgICAgICAgaWYgKE91dGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGZvbnQuQWRkKG5ldyBYRWxlbWVudChTLm91dGxpbmUpKTsKKyAgICAgICAgICAgICAgICBpZiAoU2hhZG93KQorICAgICAgICAgICAgICAgICAgICBmb250LkFkZChuZXcgWEVsZW1lbnQoUy5zaGFkb3cpKTsKKyAgICAgICAgICAgICAgICBpZiAoU2l6ZSAhPSAwKQorICAgICAgICAgICAgICAgICAgICBmb250LkFkZChuZXcgWEVsZW1lbnQoUy5zeiwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UudmFsLCBTaXplLlRvU3RyaW5nKCkpKSk7CisgICAgICAgICAgICAgICAgaWYgKENvbG9yICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGZvbnQuQWRkKENvbG9yLkdldFhFbGVtZW50KFMuY29sb3IpKTsKKyAgICAgICAgICAgICAgICBpZiAoTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBmb250LkFkZChuZXcgWEVsZW1lbnQoUy5uYW1lLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS52YWwsIE5hbWUpKSk7CisgICAgICAgICAgICAgICAgaWYgKEZhbWlseSAhPSAwKQorICAgICAgICAgICAgICAgICAgICBmb250LkFkZChuZXcgWEVsZW1lbnQoUy5mYW1pbHksIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnZhbCwgRmFtaWx5LlRvU3RyaW5nKCkpKSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChTY2hlbWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtZVR5cGUuTWFqb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBmb250LkFkZChuZXcgWEVsZW1lbnQoUy5zY2hlbWUsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnZhbCwgIm1ham9yIikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtZVR5cGUuTWlub3I6CisgICAgICAgICAgICAgICAgICAgICAgICBmb250LkFkZChuZXcgWEVsZW1lbnQoUy5zY2hlbWUsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnZhbCwgIm1pbm9yIikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZm9udDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEdldEZvbnRJbmRleChTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50LCBGb250IGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGZvbnQgPSBmLkdldFhFbGVtZW50KCk7CisgICAgICAgICAgICBYRG9jdW1lbnQgc3R5bGVzID0gZG9jdW1lbnQuV29ya2Jvb2tQYXJ0Lldvcmtib29rU3R5bGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGZvbnRzID0gc3R5bGVzLlJvb3QuRWxlbWVudChTLmZvbnRzKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IEFycmF5LkZpbmRJbmRleChmb250cy5FbGVtZW50cyhTLmZvbnQpLlRvQXJyYXkoKSwKKyAgICAgICAgICAgICAgICB6ID0+IFhFbGVtZW50LkRlZXBFcXVhbHMoeiwgZm9udCkpOworICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgICAgIGZvbnRzLkFkZChmb250KTsKKyAgICAgICAgICAgIGZvbnRzLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5jb3VudCkuVmFsdWUgPSBmb250cy5FbGVtZW50cyhTLmZvbnQpLkNvdW50KCkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGRvY3VtZW50Lldvcmtib29rUGFydC5Xb3JrYm9va1N0eWxlc1BhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gZm9udHMuRWxlbWVudHMoUy5mb250KS5Db3VudCgpIC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBQYXR0ZXJuRmlsbAorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgZW51bSBQYXR0ZXJuVHlwZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5vbmUsIFNvbGlkLCBEYXJrRG93biwgRGFya0dyYXksIERhcmtHcmlkLCBEYXJrSG9yaXpvbnRhbCwgRGFya1RyZWxsaXMsIERhcmtVcCwgRGFya1ZlcnRpY2FsLAorICAgICAgICAgICAgICAgIEdyYXkwNjI1LCBHcmF5MTI1LCBMaWdodERvd24sIExpZ2h0R3JheSwgTGlnaHRHcmlkLCBMaWdodEhvcml6b250YWwsIExpZ2h0VHJlbGxpcywgTGlnaHRVcCwgTGlnaHRWZXJ0aWNhbCwgTWVkaXVtR3JheQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgcHJpdmF0ZSBQYXR0ZXJuVHlwZSBQYXR0ZXJuOworICAgICAgICAgICAgcHJpdmF0ZSBDb2xvckluZm8gQmdDb2xvcjsKKyAgICAgICAgICAgIHByaXZhdGUgQ29sb3JJbmZvIEZnQ29sb3I7CisKKyAgICAgICAgICAgIHB1YmxpYyBQYXR0ZXJuRmlsbChQYXR0ZXJuVHlwZSBwYXR0ZXJuLCBDb2xvckluZm8gYmdDb2xvciwgQ29sb3JJbmZvIGZnQ29sb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUGF0dGVybiA9IHBhdHRlcm47CisgICAgICAgICAgICAgICAgQmdDb2xvciA9IGJnQ29sb3I7CisgICAgICAgICAgICAgICAgRmdDb2xvciA9IGZnQ29sb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYRWxlbWVudCBHZXRYRWxlbWVudCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgcGF0dGVybiA9IG5ldyBYRWxlbWVudChTLnBhdHRlcm5GaWxsKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKFBhdHRlcm4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdHRlcm5UeXBlLkRhcmtEb3duOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucGF0dGVyblR5cGUsICJkYXJrRG93biIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdHRlcm5UeXBlLkRhcmtHcmF5OgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucGF0dGVyblR5cGUsICJkYXJrR3JheSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdHRlcm5UeXBlLkRhcmtHcmlkOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucGF0dGVyblR5cGUsICJkYXJrR3JpZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdHRlcm5UeXBlLkRhcmtIb3Jpem9udGFsOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucGF0dGVyblR5cGUsICJkYXJrSG9yaXpvbnRhbCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdHRlcm5UeXBlLkRhcmtUcmVsbGlzOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucGF0dGVyblR5cGUsICJkYXJrVHJlbGxpcyIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdHRlcm5UeXBlLkRhcmtVcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4uQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnBhdHRlcm5UeXBlLCAiZGFya1VwIikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUGF0dGVyblR5cGUuRGFya1ZlcnRpY2FsOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucGF0dGVyblR5cGUsICJkYXJrVmVydGljYWwiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXR0ZXJuVHlwZS5HcmF5MDYyNToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4uQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnBhdHRlcm5UeXBlLCAiZ3JheTA2MjUiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXR0ZXJuVHlwZS5HcmF5MTI1OgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucGF0dGVyblR5cGUsICJncmF5MTI1IikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUGF0dGVyblR5cGUuTGlnaHREb3duOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucGF0dGVyblR5cGUsICJsaWdodERvd24iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXR0ZXJuVHlwZS5MaWdodEdyYXk6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5wYXR0ZXJuVHlwZSwgImxpZ2h0R3JheSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdHRlcm5UeXBlLkxpZ2h0R3JpZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4uQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnBhdHRlcm5UeXBlLCAibGlnaHRHcmlkIikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUGF0dGVyblR5cGUuTGlnaHRIb3Jpem9udGFsOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucGF0dGVyblR5cGUsICJsaWdodEhvcml6b250YWwiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXR0ZXJuVHlwZS5MaWdodFRyZWxsaXM6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5wYXR0ZXJuVHlwZSwgImxpZ2h0VHJlbGxpcyIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdHRlcm5UeXBlLkxpZ2h0VXA6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5wYXR0ZXJuVHlwZSwgImxpZ2h0VXAiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXR0ZXJuVHlwZS5MaWdodFZlcnRpY2FsOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UucGF0dGVyblR5cGUsICJsaWdodFZlcnRpY2FsIikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUGF0dGVyblR5cGUuTWVkaXVtR3JheToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4uQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnBhdHRlcm5UeXBlLCAibWVkaXVtR3JheSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdHRlcm5UeXBlLk5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5wYXR0ZXJuVHlwZSwgIm5vbmUiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXR0ZXJuVHlwZS5Tb2xpZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4uQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnBhdHRlcm5UeXBlLCAic29saWQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKEZnQ29sb3IgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5BZGQoRmdDb2xvci5HZXRYRWxlbWVudChTLmZnQ29sb3IpKTsKKyAgICAgICAgICAgICAgICBpZiAoQmdDb2xvciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLkFkZChCZ0NvbG9yLkdldFhFbGVtZW50KFMuYmdDb2xvcikpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWEVsZW1lbnQoUy5maWxsLCBwYXR0ZXJuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBHcmFkaWVudFN0b3AKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBkb3VibGUgUG9zaXRpb247CisgICAgICAgICAgICBwcml2YXRlIENvbG9ySW5mbyBDb2xvcjsKKworICAgICAgICAgICAgcHVibGljIEdyYWRpZW50U3RvcChkb3VibGUgcG9zaXRpb24sIENvbG9ySW5mbyBjb2xvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICAgICAgICAgIENvbG9yID0gY29sb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYRWxlbWVudCBHZXRYRWxlbWVudCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChTLnN0b3AsIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnBvc2l0aW9uLCBQb3NpdGlvbiksIENvbG9yLkdldFhFbGVtZW50KFMuY29sb3IpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBHcmFkaWVudEZpbGwKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBib29sIFBhdGhHcmFkaWVudDsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IExpbmVhckRlZ3JlZTsKKyAgICAgICAgICAgIHByaXZhdGUgZG91YmxlIFBhdGhUb3A7CisgICAgICAgICAgICBwcml2YXRlIGRvdWJsZSBQYXRoTGVmdDsKKyAgICAgICAgICAgIHByaXZhdGUgZG91YmxlIFBhdGhCb3R0b207CisgICAgICAgICAgICBwcml2YXRlIGRvdWJsZSBQYXRoUmlnaHQ7CisgICAgICAgICAgICBwcml2YXRlIExpc3Q8R3JhZGllbnRTdG9wPiBTdG9wczsKKworICAgICAgICAgICAgcHVibGljIEdyYWRpZW50RmlsbChpbnQgZGVncmVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBhdGhHcmFkaWVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIExpbmVhckRlZ3JlZSA9IGRlZ3JlZTsKKyAgICAgICAgICAgICAgICBTdG9wcyA9IG5ldyBMaXN0PEdyYWRpZW50U3RvcD4oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEdyYWRpZW50RmlsbChkb3VibGUgdG9wLCBkb3VibGUgbGVmdCwgZG91YmxlIGJvdHRvbSwgZG91YmxlIHJpZ2h0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBhdGhHcmFkaWVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgUGF0aFRvcCA9IHRvcDsKKyAgICAgICAgICAgICAgICBQYXRoTGVmdCA9IGxlZnQ7CisgICAgICAgICAgICAgICAgUGF0aEJvdHRvbSA9IGJvdHRvbTsKKyAgICAgICAgICAgICAgICBQYXRoUmlnaHQgPSByaWdodDsKKyAgICAgICAgICAgICAgICBTdG9wcyA9IG5ldyBMaXN0PEdyYWRpZW50U3RvcD4oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgQWRkU3RvcChHcmFkaWVudFN0b3Agc3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdG9wcy5BZGQoc3RvcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYRWxlbWVudCBHZXRYRWxlbWVudCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgZ3JhZGllbnQgPSBuZXcgWEVsZW1lbnQoUy5ncmFkaWVudEZpbGwpOworICAgICAgICAgICAgICAgIGlmIChQYXRoR3JhZGllbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBncmFkaWVudC5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UudHlwZSwgInBhdGgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmxlZnQsIFBhdGhMZWZ0LlRvU3RyaW5nKCkpLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5yaWdodCwgUGF0aFJpZ2h0LlRvU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UudG9wLCBQYXRoVG9wLlRvU3RyaW5nKCkpLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5ib3R0b20sIFBhdGhCb3R0b20uVG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBncmFkaWVudC5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuZGVncmVlLCBMaW5lYXJEZWdyZWUuVG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChHcmFkaWVudFN0b3Agc3RvcCBpbiBTdG9wcykKKyAgICAgICAgICAgICAgICAgICAgZ3JhZGllbnQuQWRkKHN0b3AuR2V0WEVsZW1lbnQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChTLmZpbGwsIGdyYWRpZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEdldEZpbGxJbmRleChTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50LCBQYXR0ZXJuRmlsbCBwYXR0ZXJuRmlsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldEZpbGxJbmRleChkb2N1bWVudCwgcGF0dGVybkZpbGwuR2V0WEVsZW1lbnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBHZXRGaWxsSW5kZXgoU3ByZWFkc2hlZXREb2N1bWVudCBkb2N1bWVudCwgR3JhZGllbnRGaWxsIGdyYWRpZW50RmlsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldEZpbGxJbmRleChkb2N1bWVudCwgZ3JhZGllbnRGaWxsLkdldFhFbGVtZW50KCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEdldEZpbGxJbmRleChTcHJlYWRzaGVldERvY3VtZW50IGRvY3VtZW50LCBYRWxlbWVudCBmaWxsKQorICAgICAgICB7CisgICAgICAgICAgICBYRG9jdW1lbnQgc3R5bGVzID0gZG9jdW1lbnQuV29ya2Jvb2tQYXJ0Lldvcmtib29rU3R5bGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGZpbGxzID0gc3R5bGVzLlJvb3QuRWxlbWVudChTLmZpbGxzKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IEFycmF5LkZpbmRJbmRleChmaWxscy5FbGVtZW50cyhTLmZpbGwpLlRvQXJyYXkoKSwKKyAgICAgICAgICAgICAgICB6ID0+IFhFbGVtZW50LkRlZXBFcXVhbHMoeiwgZmlsbCkpOworICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgICAgIGZpbGxzLkFkZChmaWxsKTsKKyAgICAgICAgICAgIGZpbGxzLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5jb3VudCkuVmFsdWUgPSBmaWxscy5FbGVtZW50cyhTLmZpbGwpLkNvdW50KCkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGRvY3VtZW50Lldvcmtib29rUGFydC5Xb3JrYm9va1N0eWxlc1BhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gZmlsbHMuRWxlbWVudHMoUy5maWxsKS5Db3VudCgpIC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBCb3JkZXJMaW5lCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBlbnVtIExpbmVTdHlsZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5vbmUsIERhc2hEb3QsIERhc2hEb3REb3QsIERhc2hlZCwgRG90dGVkLCBEb3VibGUsIEhhaXIsCisgICAgICAgICAgICAgICAgTWVkaXVtLCBNZWRpdW1EYXNoRG90LCBNZWRpdW1EYXNoRG90RG90LCBNZWRpdW1EYXNoZWQsIFNsYW50RGFzaERvdCwgVGhpY2ssIFRoaW4KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBwcml2YXRlIExpbmVTdHlsZSBTdHlsZTsKKyAgICAgICAgICAgIHByaXZhdGUgQ29sb3JJbmZvIENvbG9yOworCisgICAgICAgICAgICBwdWJsaWMgQm9yZGVyTGluZShMaW5lU3R5bGUgc3R5bGUsIENvbG9ySW5mbyBjb2xvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHlsZSA9IHN0eWxlOworICAgICAgICAgICAgICAgIENvbG9yID0gY29sb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYRWxlbWVudCBHZXRYRWxlbWVudChYTmFtZSBuYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IGxpbmUgPSBuZXcgWEVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChTdHlsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTGluZVN0eWxlLkRhc2hEb3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5zdHlsZSwgImRhc2hEb3QiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMaW5lU3R5bGUuRGFzaERvdERvdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnN0eWxlLCAiZGFzaERvdERvdCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIExpbmVTdHlsZS5EYXNoZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5zdHlsZSwgImRhc2hlZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIExpbmVTdHlsZS5Eb3R0ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5zdHlsZSwgImRvdHRlZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIExpbmVTdHlsZS5Eb3VibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5zdHlsZSwgImRvdWJsZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIExpbmVTdHlsZS5IYWlyOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2Uuc3R5bGUsICJoYWlyIikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTGluZVN0eWxlLk1lZGl1bToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnN0eWxlLCAibWVkaXVtIikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTGluZVN0eWxlLk1lZGl1bURhc2hEb3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5zdHlsZSwgIm1lZGl1bURhc2hEb3QiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMaW5lU3R5bGUuTWVkaXVtRGFzaERvdERvdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnN0eWxlLCAibWVkaXVtRGFzaERvdERvdCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIExpbmVTdHlsZS5NZWRpdW1EYXNoZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5zdHlsZSwgIm1lZGl1bURhc2hlZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIExpbmVTdHlsZS5TbGFudERhc2hEb3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5zdHlsZSwgInNsYW50RGFzaERvdCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIExpbmVTdHlsZS5UaGljazoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnN0eWxlLCAidGhpY2siKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMaW5lU3R5bGUuVGhpbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnN0eWxlLCAidGhpbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lLkFkZChDb2xvci5HZXRYRWxlbWVudChTLmNvbG9yKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgQm9yZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBCb3JkZXJMaW5lIFRvcCB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgQm9yZGVyTGluZSBCb3R0b20geyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIEJvcmRlckxpbmUgTGVmdCB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgQm9yZGVyTGluZSBSaWdodCB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgQm9yZGVyTGluZSBIb3Jpem9udGFsIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBCb3JkZXJMaW5lIFZlcnRpY2FsIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBCb3JkZXJMaW5lIERpYWdvbmFsIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBib29sIERpYWdvbmFsRG93biB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBEaWFnb25hbFVwIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBib29sIE91dGxpbmUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgICAgICBwdWJsaWMgWEVsZW1lbnQgR2V0WEVsZW1lbnQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IGJvcmRlciA9IG5ldyBYRWxlbWVudChTLmJvcmRlcik7CisgICAgICAgICAgICAgICAgaWYgKERpYWdvbmFsRG93bikKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5kaWFnb25hbERvd24sICIxIikpOworICAgICAgICAgICAgICAgIGlmIChEaWFnb25hbFVwKQorICAgICAgICAgICAgICAgICAgICBib3JkZXIuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmRpYWdvbmFsVXAsICIxIikpOworICAgICAgICAgICAgICAgIGlmIChPdXRsaW5lKQorICAgICAgICAgICAgICAgICAgICBib3JkZXIuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLm91dGxpbmUsICIxIikpOworICAgICAgICAgICAgICAgIGlmIChMZWZ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJvcmRlci5BZGQobmV3IFhFbGVtZW50KFMubGVmdCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyLkFkZChMZWZ0LkdldFhFbGVtZW50KFMubGVmdCkpOworICAgICAgICAgICAgICAgIGlmIChSaWdodCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBib3JkZXIuQWRkKG5ldyBYRWxlbWVudChTLnJpZ2h0KSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBib3JkZXIuQWRkKFJpZ2h0LkdldFhFbGVtZW50KFMucmlnaHQpKTsKKyAgICAgICAgICAgICAgICBpZiAoVG9wID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJvcmRlci5BZGQobmV3IFhFbGVtZW50KFMudG9wKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBib3JkZXIuQWRkKFRvcC5HZXRYRWxlbWVudChTLnRvcCkpOworICAgICAgICAgICAgICAgIGlmIChCb3R0b20gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyLkFkZChuZXcgWEVsZW1lbnQoUy5ib3R0b20pKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJvcmRlci5BZGQoQm90dG9tLkdldFhFbGVtZW50KFMuYm90dG9tKSk7CisgICAgICAgICAgICAgICAgaWYgKERpYWdvbmFsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJvcmRlci5BZGQobmV3IFhFbGVtZW50KFMuZGlhZ29uYWwpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJvcmRlci5BZGQoRGlhZ29uYWwuR2V0WEVsZW1lbnQoUy5kaWFnb25hbCkpOworICAgICAgICAgICAgICAgIGlmIChIb3Jpem9udGFsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJvcmRlci5BZGQoSG9yaXpvbnRhbC5HZXRYRWxlbWVudChTLmhvcml6b250YWwpKTsKKyAgICAgICAgICAgICAgICBpZiAoVmVydGljYWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyLkFkZChWZXJ0aWNhbC5HZXRYRWxlbWVudChTLnZlcnRpY2FsKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJvcmRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEdldEJvcmRlckluZGV4KFNwcmVhZHNoZWV0RG9jdW1lbnQgZG9jdW1lbnQsIEJvcmRlciBiKQorICAgICAgICB7CisgICAgICAgICAgICBYRWxlbWVudCBib3JkZXIgPSBiLkdldFhFbGVtZW50KCk7CisgICAgICAgICAgICBYRG9jdW1lbnQgc3R5bGVzID0gZG9jdW1lbnQuV29ya2Jvb2tQYXJ0Lldvcmtib29rU3R5bGVzUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGJvcmRlcnMgPSBzdHlsZXMuUm9vdC5FbGVtZW50KFMuYm9yZGVycyk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBBcnJheS5GaW5kSW5kZXgoYm9yZGVycy5FbGVtZW50cyhTLmJvcmRlcikuVG9BcnJheSgpLAorICAgICAgICAgICAgICAgIHogPT4gWEVsZW1lbnQuRGVlcEVxdWFscyh6LCBib3JkZXIpKTsKKyAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgICAgICBib3JkZXJzLkFkZChib3JkZXIpOworICAgICAgICAgICAgYm9yZGVycy5BdHRyaWJ1dGUoTm9OYW1lc3BhY2UuY291bnQpLlZhbHVlID0gYm9yZGVycy5FbGVtZW50cyhTLmJvcmRlcikuQ291bnQoKS5Ub1N0cmluZygpOworICAgICAgICAgICAgZG9jdW1lbnQuV29ya2Jvb2tQYXJ0Lldvcmtib29rU3R5bGVzUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBib3JkZXJzLkVsZW1lbnRzKFMuYm9yZGVyKS5Db3VudCgpIC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEdldFN0eWxlSW5kZXgoU3ByZWFkc2hlZXREb2N1bWVudCBkb2N1bWVudCwgc3RyaW5nIHN0eWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IHN0eWxlcyA9IGRvY3VtZW50Lldvcmtib29rUGFydC5Xb3JrYm9va1N0eWxlc1BhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICBzdHJpbmcgeGZJZCA9IHN0eWxlcy5Sb290LkVsZW1lbnQoUy5jZWxsU3R5bGVzKS5FbGVtZW50cyhTLmNlbGxTdHlsZSkKKyAgICAgICAgICAgICAgICAuV2hlcmUodCA9PiB0LkF0dHJpYnV0ZShOb05hbWVzcGFjZS5uYW1lKS5WYWx1ZSA9PSBzdHlsZU5hbWUpCisgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCkuQXR0cmlidXRlKE5vTmFtZXNwYWNlLnhmSWQpLlZhbHVlOworICAgICAgICAgICAgWEVsZW1lbnQgY2VsbFhmcyA9IHN0eWxlcy5Sb290LkVsZW1lbnQoUy5jZWxsWGZzKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IEFycmF5LkZpbmRJbmRleChjZWxsWGZzLkVsZW1lbnRzKFMueGYpLlRvQXJyYXkoKSwKKyAgICAgICAgICAgICAgICB6ID0+IHouQXR0cmlidXRlKE5vTmFtZXNwYWNlLnhmSWQpLlZhbHVlID09IHhmSWQpOworICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgICAgIFhFbGVtZW50IGNlbGxTdHlsZVhmID0gc3R5bGVzLlJvb3QuRWxlbWVudChTLmNlbGxTdHlsZVhmcykuRWxlbWVudHMoUy54ZikuVG9BcnJheSgpW0NvbnZlcnQuVG9JbnQzMih4ZklkKV07CisgICAgICAgICAgICBpZiAoY2VsbFN0eWxlWGYgIT0gbnVsbCkKKyAgICAgICAgICAgIHsgICAvLyBDcmVhdGUgbmV3IHhmIGVsZW1lbnQgdW5kZXIgY2VsbFhmcworICAgICAgICAgICAgICAgIGNlbGxYZnMuQWRkKG5ldyBYRWxlbWVudChTLnhmLCBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5udW1GbXRJZCwgY2VsbFN0eWxlWGYuQXR0cmlidXRlKE5vTmFtZXNwYWNlLm51bUZtdElkKS5WYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmZvbnRJZCwgY2VsbFN0eWxlWGYuQXR0cmlidXRlKE5vTmFtZXNwYWNlLmZvbnRJZCkuVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5maWxsSWQsIGNlbGxTdHlsZVhmLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5maWxsSWQpLlZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYm9yZGVySWQsIGNlbGxTdHlsZVhmLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5ib3JkZXJJZCkuVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS54ZklkLCB4ZklkKSkpOworICAgICAgICAgICAgICAgIGNlbGxYZnMuQXR0cmlidXRlKE5vTmFtZXNwYWNlLmNvdW50KS5WYWx1ZSA9IGNlbGxYZnMuRWxlbWVudHMoUy54ZikuQ291bnQoKS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIGRvY3VtZW50Lldvcmtib29rUGFydC5Xb3JrYm9va1N0eWxlc1BhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGxYZnMuRWxlbWVudHMoUy54ZikuQ291bnQoKSAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIENlbGxBbGlnbm1lbnQKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGVudW0gSG9yaXpvbnRhbCB7IEdlbmVyYWwsIENlbnRlciwgQ2VudGVyQ29udGludW91cywgRGlzdHJpYnV0ZWQsIEZpbGwsIEp1c3RpZnksIExlZnQsIFJpZ2h0IH07CisgICAgICAgICAgICBwdWJsaWMgZW51bSBWZXJ0aWNhbCB7IEJvdHRvbSwgQ2VudGVyLCBEaXN0cmlidXRlZCwgSnVzdGlmeSwgVG9wIH07CisKKyAgICAgICAgICAgIHB1YmxpYyBIb3Jpem9udGFsIEhvcml6b250YWxBbGlnbm1lbnQgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIGludCBJbmRlbnQgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIGJvb2wgSnVzdGlmeUxhc3RMaW5lIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgUmVhZGluZ09yZGVyIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBib29sIFNocmlua1RvRml0IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgVGV4dFJvdGF0aW9uIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBWZXJ0aWNhbCBWZXJ0aWNhbEFsaWdubWVudCB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBXcmFwVGV4dCB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDZWxsQWxpZ25tZW50KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBIb3Jpem9udGFsQWxpZ25tZW50ID0gSG9yaXpvbnRhbC5HZW5lcmFsOworICAgICAgICAgICAgICAgIEluZGVudCA9IDA7CisgICAgICAgICAgICAgICAgSnVzdGlmeUxhc3RMaW5lID0gZmFsc2U7CisgICAgICAgICAgICAgICAgUmVhZGluZ09yZGVyID0gMDsKKyAgICAgICAgICAgICAgICBTaHJpbmtUb0ZpdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIFRleHRSb3RhdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgVmVydGljYWxBbGlnbm1lbnQgPSBWZXJ0aWNhbC5Cb3R0b207CisgICAgICAgICAgICAgICAgV3JhcFRleHQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFhFbGVtZW50IEdldFhFbGVtZW50KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBhbGlnbiA9IG5ldyBYRWxlbWVudChTLmFsaWdubWVudCk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChIb3Jpem9udGFsQWxpZ25tZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsLkNlbnRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5ob3Jpem9udGFsLCAiY2VudGVyIikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSG9yaXpvbnRhbC5DZW50ZXJDb250aW51b3VzOgorICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24uQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmhvcml6b250YWwsICJjZW50ZXJDb250aW51b3VzIikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSG9yaXpvbnRhbC5EaXN0cmlidXRlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5ob3Jpem9udGFsLCAiZGlzdHJpYnV0ZWQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsLkZpbGw6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaG9yaXpvbnRhbCwgImZpbGwiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsLkp1c3RpZnk6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaG9yaXpvbnRhbCwgImp1c3RpZnkiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsLkxlZnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuaG9yaXpvbnRhbCwgImxlZnQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsLlJpZ2h0OgorICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24uQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmhvcml6b250YWwsICJyaWdodCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoSW5kZW50ICE9IDApCisgICAgICAgICAgICAgICAgICAgIGFsaWduLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5pbmRlbnQsIEluZGVudCkpOworICAgICAgICAgICAgICAgIGlmIChKdXN0aWZ5TGFzdExpbmUpCisgICAgICAgICAgICAgICAgICAgIGFsaWduLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5qdXN0aWZ5TGFzdExpbmUsIHRydWUpKTsKKyAgICAgICAgICAgICAgICBpZiAoUmVhZGluZ09yZGVyICE9IDApCisgICAgICAgICAgICAgICAgICAgIGFsaWduLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5yZWFkaW5nT3JkZXIsIFJlYWRpbmdPcmRlcikpOworICAgICAgICAgICAgICAgIGlmIChTaHJpbmtUb0ZpdCkKKyAgICAgICAgICAgICAgICAgICAgYWxpZ24uQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnNocmlua1RvRml0LCB0cnVlKSk7CisgICAgICAgICAgICAgICAgaWYgKFRleHRSb3RhdGlvbiAhPSAwKQorICAgICAgICAgICAgICAgICAgICBhbGlnbi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UudGV4dFJvdGF0aW9uLCBUZXh0Um90YXRpb24pKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKFZlcnRpY2FsQWxpZ25tZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbC5DZW50ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UudmVydGljYWwsICJjZW50ZXIiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbC5EaXN0cmlidXRlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS52ZXJ0aWNhbCwgImRpc3RyaWJ1dGVkIikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWwuSnVzdGlmeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS52ZXJ0aWNhbCwgImp1c3RpZnkiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbC5Ub3A6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UudmVydGljYWwsICJ0b3AiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFdyYXBUZXh0KQorICAgICAgICAgICAgICAgICAgICBhbGlnbi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2Uud3JhcFRleHQsIHRydWUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWxpZ247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBHZXRTdHlsZUluZGV4KFNwcmVhZHNoZWV0RG9jdW1lbnQgZG9jdW1lbnQsIGludCBudW1GbXQsIGludCBmb250LCBpbnQgZmlsbCwgaW50IGJvcmRlciwgQ2VsbEFsaWdubWVudCBhbGlnbm1lbnQsIGJvb2wgaGlkZGVuLCBib29sIGxvY2tlZCkKKyAgICAgICAgeworICAgICAgICAgICAgWEVsZW1lbnQgeGYgPSBuZXcgWEVsZW1lbnQoUy54ZiwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UubnVtRm10SWQsIG51bUZtdCksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuZm9udElkLCBmb250KSwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuZmlsbElkLCBmaWxsKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5ib3JkZXJJZCwgYm9yZGVyKSwgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UueGZJZCwgMCksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYXBwbHlOdW1iZXJGb3JtYXQsIChudW1GbXQgPT0gMCkgPyAwIDogMSksCisgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYXBwbHlGb250LCAoZm9udCA9PSAwKSA/IDAgOiAxKSwKKyAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5hcHBseUZpbGwsIChmaWxsID09IDApID8gMCA6IDEpLAorICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmFwcGx5Qm9yZGVyLCAoYm9yZGVyID09IDApID8gMCA6IDEpKTsKKyAgICAgICAgICAgIGlmIChhbGlnbm1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4Zi5BZGQobmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYXBwbHlBbGlnbm1lbnQsICIxIikpOworICAgICAgICAgICAgICAgIHhmLkFkZChhbGlnbm1lbnQuR2V0WEVsZW1lbnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeGYuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmFwcGx5QWxpZ25tZW50LCAiMCIpKTsKKyAgICAgICAgICAgIGlmIChoaWRkZW4gfHwgbG9ja2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhFbGVtZW50IHByb3QgPSBuZXcgWEVsZW1lbnQoUy5wcm90ZWN0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoaGlkZGVuKQorICAgICAgICAgICAgICAgICAgICBwcm90LkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5oaWRkZW4sIHRydWUpKTsKKyAgICAgICAgICAgICAgICBpZiAobG9ja2VkKQorICAgICAgICAgICAgICAgICAgICBwcm90LkFkZChuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5sb2NrZWQsIHRydWUpKTsKKyAgICAgICAgICAgICAgICB4Zi5BZGQocHJvdCk7CisgICAgICAgICAgICAgICAgeGYuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmFwcGx5UHJvdGVjdGlvbiwgIjEiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeGYuQWRkKG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmFwcGx5UHJvdGVjdGlvbiwgIjAiKSk7CisKKyAgICAgICAgICAgIFhEb2N1bWVudCBzdHlsZXMgPSBkb2N1bWVudC5Xb3JrYm9va1BhcnQuV29ya2Jvb2tTdHlsZXNQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgWEVsZW1lbnQgY2VsbFhmcyA9IHN0eWxlcy5Sb290LkVsZW1lbnQoUy5jZWxsWGZzKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IEFycmF5LkZpbmRJbmRleChjZWxsWGZzLkVsZW1lbnRzKFMueGYpLlRvQXJyYXkoKSwKKyAgICAgICAgICAgICAgICB6ID0+IFhFbGVtZW50LkRlZXBFcXVhbHMoeiwgeGYpKTsKKyAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgICAgICBjZWxsWGZzLkFkZCh4Zik7CisgICAgICAgICAgICBjZWxsWGZzLkF0dHJpYnV0ZShOb05hbWVzcGFjZS5jb3VudCkuVmFsdWUgPSBjZWxsWGZzLkVsZW1lbnRzKFMueGYpLkNvdW50KCkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGRvY3VtZW50Lldvcmtib29rUGFydC5Xb3JrYm9va1N0eWxlc1BhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gY2VsbFhmcy5FbGVtZW50cyhTLnhmKS5Db3VudCgpIC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBDcmVhdGVEZWZhdWx0U3R5bGVzKFNwcmVhZHNoZWV0RG9jdW1lbnQgZG9jdW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc3R5bGUgcGFydAorICAgICAgICAgICAgV29ya2Jvb2tTdHlsZXNQYXJ0IHN0eWxlc1BhcnQgPSBkb2N1bWVudC5Xb3JrYm9va1BhcnQuQWRkTmV3UGFydDxXb3JrYm9va1N0eWxlc1BhcnQ+KCk7CisgICAgICAgICAgICBzdHlsZXNQYXJ0LlB1dFhEb2N1bWVudChuZXcgWERvY3VtZW50KFhFbGVtZW50LlBhcnNlKAorQCI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgc3RhbmRhbG9uZT0neWVzJz8+Cis8c3R5bGVTaGVldCB4bWxucz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluJz4KKyAgPGZvbnRzIGNvdW50PScxOCc+CisgICAgPGZvbnQ+CisgICAgICA8c3ogdmFsPScxMScvPgorICAgICAgPGNvbG9yIHRoZW1lPScxJy8+CisgICAgICA8bmFtZSB2YWw9J0NhbGlicmknLz4KKyAgICAgIDxmYW1pbHkgdmFsPScyJy8+CisgICAgICA8c2NoZW1lIHZhbD0nbWlub3InLz4KKyAgICA8L2ZvbnQ+CisgICAgPGZvbnQ+CisgICAgICA8c3ogdmFsPScxMScvPgorICAgICAgPGNvbG9yIHRoZW1lPScxJy8+CisgICAgICA8bmFtZSB2YWw9J0NhbGlicmknLz4KKyAgICAgIDxmYW1pbHkgdmFsPScyJy8+CisgICAgICA8c2NoZW1lIHZhbD0nbWlub3InLz4KKyAgICA8L2ZvbnQ+CisgICAgPGZvbnQ+CisgICAgICA8Yi8+CisgICAgICA8c3ogdmFsPScxOCcvPgorICAgICAgPGNvbG9yIHRoZW1lPSczJy8+CisgICAgICA8bmFtZSB2YWw9J0NhbWJyaWEnLz4KKyAgICAgIDxmYW1pbHkgdmFsPScyJy8+CisgICAgICA8c2NoZW1lIHZhbD0nbWFqb3InLz4KKyAgICA8L2ZvbnQ+CisgICAgPGZvbnQ+CisgICAgICA8Yi8+CisgICAgICA8c3ogdmFsPScxNScvPgorICAgICAgPGNvbG9yIHRoZW1lPSczJy8+CisgICAgICA8bmFtZSB2YWw9J0NhbGlicmknLz4KKyAgICAgIDxmYW1pbHkgdmFsPScyJy8+CisgICAgICA8c2NoZW1lIHZhbD0nbWlub3InLz4KKyAgICA8L2ZvbnQ+CisgICAgPGZvbnQ+CisgICAgICA8Yi8+CisgICAgICA8c3ogdmFsPScxMycvPgorICAgICAgPGNvbG9yIHRoZW1lPSczJy8+CisgICAgICA8bmFtZSB2YWw9J0NhbGlicmknLz4KKyAgICAgIDxmYW1pbHkgdmFsPScyJy8+CisgICAgICA8c2NoZW1lIHZhbD0nbWlub3InLz4KKyAgICA8L2ZvbnQ+CisgICAgPGZvbnQ+CisgICAgICA8Yi8+CisgICAgICA8c3ogdmFsPScxMScvPgorICAgICAgPGNvbG9yIHRoZW1lPSczJy8+CisgICAgICA8bmFtZSB2YWw9J0NhbGlicmknLz4KKyAgICAgIDxmYW1pbHkgdmFsPScyJy8+CisgICAgICA8c2NoZW1lIHZhbD0nbWlub3InLz4KKyAgICA8L2ZvbnQ+CisgICAgPGZvbnQ+CisgICAgICA8c3ogdmFsPScxMScvPgorICAgICAgPGNvbG9yIHJnYj0nRkYwMDYxMDAnLz4KKyAgICAgIDxuYW1lIHZhbD0nQ2FsaWJyaScvPgorICAgICAgPGZhbWlseSB2YWw9JzInLz4KKyAgICAgIDxzY2hlbWUgdmFsPSdtaW5vcicvPgorICAgIDwvZm9udD4KKyAgICA8Zm9udD4KKyAgICAgIDxzeiB2YWw9JzExJy8+CisgICAgICA8Y29sb3IgcmdiPSdGRjlDMDAwNicvPgorICAgICAgPG5hbWUgdmFsPSdDYWxpYnJpJy8+CisgICAgICA8ZmFtaWx5IHZhbD0nMicvPgorICAgICAgPHNjaGVtZSB2YWw9J21pbm9yJy8+CisgICAgPC9mb250PgorICAgIDxmb250PgorICAgICAgPHN6IHZhbD0nMTEnLz4KKyAgICAgIDxjb2xvciByZ2I9J0ZGOUM2NTAwJy8+CisgICAgICA8bmFtZSB2YWw9J0NhbGlicmknLz4KKyAgICAgIDxmYW1pbHkgdmFsPScyJy8+CisgICAgICA8c2NoZW1lIHZhbD0nbWlub3InLz4KKyAgICA8L2ZvbnQ+CisgICAgPGZvbnQ+CisgICAgICA8c3ogdmFsPScxMScvPgorICAgICAgPGNvbG9yIHJnYj0nRkYzRjNGNzYnLz4KKyAgICAgIDxuYW1lIHZhbD0nQ2FsaWJyaScvPgorICAgICAgPGZhbWlseSB2YWw9JzInLz4KKyAgICAgIDxzY2hlbWUgdmFsPSdtaW5vcicvPgorICAgIDwvZm9udD4KKyAgICA8Zm9udD4KKyAgICAgIDxiLz4KKyAgICAgIDxzeiB2YWw9JzExJy8+CisgICAgICA8Y29sb3IgcmdiPSdGRjNGM0YzRicvPgorICAgICAgPG5hbWUgdmFsPSdDYWxpYnJpJy8+CisgICAgICA8ZmFtaWx5IHZhbD0nMicvPgorICAgICAgPHNjaGVtZSB2YWw9J21pbm9yJy8+CisgICAgPC9mb250PgorICAgIDxmb250PgorICAgICAgPGIvPgorICAgICAgPHN6IHZhbD0nMTEnLz4KKyAgICAgIDxjb2xvciByZ2I9J0ZGRkE3RDAwJy8+CisgICAgICA8bmFtZSB2YWw9J0NhbGlicmknLz4KKyAgICAgIDxmYW1pbHkgdmFsPScyJy8+CisgICAgICA8c2NoZW1lIHZhbD0nbWlub3InLz4KKyAgICA8L2ZvbnQ+CisgICAgPGZvbnQ+CisgICAgICA8c3ogdmFsPScxMScvPgorICAgICAgPGNvbG9yIHJnYj0nRkZGQTdEMDAnLz4KKyAgICAgIDxuYW1lIHZhbD0nQ2FsaWJyaScvPgorICAgICAgPGZhbWlseSB2YWw9JzInLz4KKyAgICAgIDxzY2hlbWUgdmFsPSdtaW5vcicvPgorICAgIDwvZm9udD4KKyAgICA8Zm9udD4KKyAgICAgIDxiLz4KKyAgICAgIDxzeiB2YWw9JzExJy8+CisgICAgICA8Y29sb3IgdGhlbWU9JzAnLz4KKyAgICAgIDxuYW1lIHZhbD0nQ2FsaWJyaScvPgorICAgICAgPGZhbWlseSB2YWw9JzInLz4KKyAgICAgIDxzY2hlbWUgdmFsPSdtaW5vcicvPgorICAgIDwvZm9udD4KKyAgICA8Zm9udD4KKyAgICAgIDxzeiB2YWw9JzExJy8+CisgICAgICA8Y29sb3IgcmdiPSdGRkZGMDAwMCcvPgorICAgICAgPG5hbWUgdmFsPSdDYWxpYnJpJy8+CisgICAgICA8ZmFtaWx5IHZhbD0nMicvPgorICAgICAgPHNjaGVtZSB2YWw9J21pbm9yJy8+CisgICAgPC9mb250PgorICAgIDxmb250PgorICAgICAgPGkvPgorICAgICAgPHN6IHZhbD0nMTEnLz4KKyAgICAgIDxjb2xvciByZ2I9J0ZGN0Y3RjdGJy8+CisgICAgICA8bmFtZSB2YWw9J0NhbGlicmknLz4KKyAgICAgIDxmYW1pbHkgdmFsPScyJy8+CisgICAgICA8c2NoZW1lIHZhbD0nbWlub3InLz4KKyAgICA8L2ZvbnQ+CisgICAgPGZvbnQ+CisgICAgICA8Yi8+CisgICAgICA8c3ogdmFsPScxMScvPgorICAgICAgPGNvbG9yIHRoZW1lPScxJy8+CisgICAgICA8bmFtZSB2YWw9J0NhbGlicmknLz4KKyAgICAgIDxmYW1pbHkgdmFsPScyJy8+CisgICAgICA8c2NoZW1lIHZhbD0nbWlub3InLz4KKyAgICA8L2ZvbnQ+CisgICAgPGZvbnQ+CisgICAgICA8c3ogdmFsPScxMScvPgorICAgICAgPGNvbG9yIHRoZW1lPScwJy8+CisgICAgICA8bmFtZSB2YWw9J0NhbGlicmknLz4KKyAgICAgIDxmYW1pbHkgdmFsPScyJy8+CisgICAgICA8c2NoZW1lIHZhbD0nbWlub3InLz4KKyAgICA8L2ZvbnQ+CisgIDwvZm9udHM+CisgIDxmaWxscyBjb3VudD0nMzMnPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdub25lJy8+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdncmF5MTI1Jy8+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHJnYj0nRkZDNkVGQ0UnLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHJnYj0nRkZGRkM3Q0UnLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHJnYj0nRkZGRkVCOUMnLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHJnYj0nRkZGRkNDOTknLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHJnYj0nRkZGMkYyRjInLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHJnYj0nRkZBNUE1QTUnLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHJnYj0nRkZGRkZGQ0MnLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHRoZW1lPSc0Jy8+CisgICAgICA8L3BhdHRlcm5GaWxsPgorICAgIDwvZmlsbD4KKyAgICA8ZmlsbD4KKyAgICAgIDxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0nc29saWQnPgorICAgICAgICA8ZmdDb2xvciB0aGVtZT0nNCcgdGludD0nMC43OTk5ODE2ODg4OTQzMTQ0MicvPgorICAgICAgICA8YmdDb2xvciBpbmRleGVkPSc2NScvPgorICAgICAgPC9wYXR0ZXJuRmlsbD4KKyAgICA8L2ZpbGw+CisgICAgPGZpbGw+CisgICAgICA8cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9J3NvbGlkJz4KKyAgICAgICAgPGZnQ29sb3IgdGhlbWU9JzQnIHRpbnQ9JzAuNTk5OTkzODk2Mjk4MTA0ODUnLz4KKyAgICAgICAgPGJnQ29sb3IgaW5kZXhlZD0nNjUnLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHRoZW1lPSc0JyB0aW50PScwLjM5OTk3NTU4NTE5MjQxOTIxJy8+CisgICAgICAgIDxiZ0NvbG9yIGluZGV4ZWQ9JzY1Jy8+CisgICAgICA8L3BhdHRlcm5GaWxsPgorICAgIDwvZmlsbD4KKyAgICA8ZmlsbD4KKyAgICAgIDxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0nc29saWQnPgorICAgICAgICA8ZmdDb2xvciB0aGVtZT0nNScvPgorICAgICAgPC9wYXR0ZXJuRmlsbD4KKyAgICA8L2ZpbGw+CisgICAgPGZpbGw+CisgICAgICA8cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9J3NvbGlkJz4KKyAgICAgICAgPGZnQ29sb3IgdGhlbWU9JzUnIHRpbnQ9JzAuNzk5OTgxNjg4ODk0MzE0NDInLz4KKyAgICAgICAgPGJnQ29sb3IgaW5kZXhlZD0nNjUnLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHRoZW1lPSc1JyB0aW50PScwLjU5OTk5Mzg5NjI5ODEwNDg1Jy8+CisgICAgICAgIDxiZ0NvbG9yIGluZGV4ZWQ9JzY1Jy8+CisgICAgICA8L3BhdHRlcm5GaWxsPgorICAgIDwvZmlsbD4KKyAgICA8ZmlsbD4KKyAgICAgIDxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0nc29saWQnPgorICAgICAgICA8ZmdDb2xvciB0aGVtZT0nNScgdGludD0nMC4zOTk5NzU1ODUxOTI0MTkyMScvPgorICAgICAgICA8YmdDb2xvciBpbmRleGVkPSc2NScvPgorICAgICAgPC9wYXR0ZXJuRmlsbD4KKyAgICA8L2ZpbGw+CisgICAgPGZpbGw+CisgICAgICA8cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9J3NvbGlkJz4KKyAgICAgICAgPGZnQ29sb3IgdGhlbWU9JzYnLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHRoZW1lPSc2JyB0aW50PScwLjc5OTk4MTY4ODg5NDMxNDQyJy8+CisgICAgICAgIDxiZ0NvbG9yIGluZGV4ZWQ9JzY1Jy8+CisgICAgICA8L3BhdHRlcm5GaWxsPgorICAgIDwvZmlsbD4KKyAgICA8ZmlsbD4KKyAgICAgIDxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0nc29saWQnPgorICAgICAgICA8ZmdDb2xvciB0aGVtZT0nNicgdGludD0nMC41OTk5OTM4OTYyOTgxMDQ4NScvPgorICAgICAgICA8YmdDb2xvciBpbmRleGVkPSc2NScvPgorICAgICAgPC9wYXR0ZXJuRmlsbD4KKyAgICA8L2ZpbGw+CisgICAgPGZpbGw+CisgICAgICA8cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9J3NvbGlkJz4KKyAgICAgICAgPGZnQ29sb3IgdGhlbWU9JzYnIHRpbnQ9JzAuMzk5OTc1NTg1MTkyNDE5MjEnLz4KKyAgICAgICAgPGJnQ29sb3IgaW5kZXhlZD0nNjUnLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHRoZW1lPSc3Jy8+CisgICAgICA8L3BhdHRlcm5GaWxsPgorICAgIDwvZmlsbD4KKyAgICA8ZmlsbD4KKyAgICAgIDxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0nc29saWQnPgorICAgICAgICA8ZmdDb2xvciB0aGVtZT0nNycgdGludD0nMC43OTk5ODE2ODg4OTQzMTQ0MicvPgorICAgICAgICA8YmdDb2xvciBpbmRleGVkPSc2NScvPgorICAgICAgPC9wYXR0ZXJuRmlsbD4KKyAgICA8L2ZpbGw+CisgICAgPGZpbGw+CisgICAgICA8cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9J3NvbGlkJz4KKyAgICAgICAgPGZnQ29sb3IgdGhlbWU9JzcnIHRpbnQ9JzAuNTk5OTkzODk2Mjk4MTA0ODUnLz4KKyAgICAgICAgPGJnQ29sb3IgaW5kZXhlZD0nNjUnLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHRoZW1lPSc3JyB0aW50PScwLjM5OTk3NTU4NTE5MjQxOTIxJy8+CisgICAgICAgIDxiZ0NvbG9yIGluZGV4ZWQ9JzY1Jy8+CisgICAgICA8L3BhdHRlcm5GaWxsPgorICAgIDwvZmlsbD4KKyAgICA8ZmlsbD4KKyAgICAgIDxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0nc29saWQnPgorICAgICAgICA8ZmdDb2xvciB0aGVtZT0nOCcvPgorICAgICAgPC9wYXR0ZXJuRmlsbD4KKyAgICA8L2ZpbGw+CisgICAgPGZpbGw+CisgICAgICA8cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9J3NvbGlkJz4KKyAgICAgICAgPGZnQ29sb3IgdGhlbWU9JzgnIHRpbnQ9JzAuNzk5OTgxNjg4ODk0MzE0NDInLz4KKyAgICAgICAgPGJnQ29sb3IgaW5kZXhlZD0nNjUnLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHRoZW1lPSc4JyB0aW50PScwLjU5OTk5Mzg5NjI5ODEwNDg1Jy8+CisgICAgICAgIDxiZ0NvbG9yIGluZGV4ZWQ9JzY1Jy8+CisgICAgICA8L3BhdHRlcm5GaWxsPgorICAgIDwvZmlsbD4KKyAgICA8ZmlsbD4KKyAgICAgIDxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0nc29saWQnPgorICAgICAgICA8ZmdDb2xvciB0aGVtZT0nOCcgdGludD0nMC4zOTk5NzU1ODUxOTI0MTkyMScvPgorICAgICAgICA8YmdDb2xvciBpbmRleGVkPSc2NScvPgorICAgICAgPC9wYXR0ZXJuRmlsbD4KKyAgICA8L2ZpbGw+CisgICAgPGZpbGw+CisgICAgICA8cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9J3NvbGlkJz4KKyAgICAgICAgPGZnQ29sb3IgdGhlbWU9JzknLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICAgIDxmaWxsPgorICAgICAgPHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSdzb2xpZCc+CisgICAgICAgIDxmZ0NvbG9yIHRoZW1lPSc5JyB0aW50PScwLjc5OTk4MTY4ODg5NDMxNDQyJy8+CisgICAgICAgIDxiZ0NvbG9yIGluZGV4ZWQ9JzY1Jy8+CisgICAgICA8L3BhdHRlcm5GaWxsPgorICAgIDwvZmlsbD4KKyAgICA8ZmlsbD4KKyAgICAgIDxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0nc29saWQnPgorICAgICAgICA8ZmdDb2xvciB0aGVtZT0nOScgdGludD0nMC41OTk5OTM4OTYyOTgxMDQ4NScvPgorICAgICAgICA8YmdDb2xvciBpbmRleGVkPSc2NScvPgorICAgICAgPC9wYXR0ZXJuRmlsbD4KKyAgICA8L2ZpbGw+CisgICAgPGZpbGw+CisgICAgICA8cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9J3NvbGlkJz4KKyAgICAgICAgPGZnQ29sb3IgdGhlbWU9JzknIHRpbnQ9JzAuMzk5OTc1NTg1MTkyNDE5MjEnLz4KKyAgICAgICAgPGJnQ29sb3IgaW5kZXhlZD0nNjUnLz4KKyAgICAgIDwvcGF0dGVybkZpbGw+CisgICAgPC9maWxsPgorICA8L2ZpbGxzPgorICA8Ym9yZGVycyBjb3VudD0nMTAnPgorICAgIDxib3JkZXI+CisgICAgICA8bGVmdC8+CisgICAgICA8cmlnaHQvPgorICAgICAgPHRvcC8+CisgICAgICA8Ym90dG9tLz4KKyAgICAgIDxkaWFnb25hbC8+CisgICAgPC9ib3JkZXI+CisgICAgPGJvcmRlcj4KKyAgICAgIDxsZWZ0Lz4KKyAgICAgIDxyaWdodC8+CisgICAgICA8dG9wLz4KKyAgICAgIDxib3R0b20gc3R5bGU9J3RoaWNrJz4KKyAgICAgICAgPGNvbG9yIHRoZW1lPSc0Jy8+CisgICAgICA8L2JvdHRvbT4KKyAgICAgIDxkaWFnb25hbC8+CisgICAgPC9ib3JkZXI+CisgICAgPGJvcmRlcj4KKyAgICAgIDxsZWZ0Lz4KKyAgICAgIDxyaWdodC8+CisgICAgICA8dG9wLz4KKyAgICAgIDxib3R0b20gc3R5bGU9J3RoaWNrJz4KKyAgICAgICAgPGNvbG9yIHRoZW1lPSc0JyB0aW50PScwLjQ5OTk4NDc0MDc0NTI2MicvPgorICAgICAgPC9ib3R0b20+CisgICAgICA8ZGlhZ29uYWwvPgorICAgIDwvYm9yZGVyPgorICAgIDxib3JkZXI+CisgICAgICA8bGVmdC8+CisgICAgICA8cmlnaHQvPgorICAgICAgPHRvcC8+CisgICAgICA8Ym90dG9tIHN0eWxlPSdtZWRpdW0nPgorICAgICAgICA8Y29sb3IgdGhlbWU9JzQnIHRpbnQ9JzAuMzk5OTc1NTg1MTkyNDE5MjEnLz4KKyAgICAgIDwvYm90dG9tPgorICAgICAgPGRpYWdvbmFsLz4KKyAgICA8L2JvcmRlcj4KKyAgICA8Ym9yZGVyPgorICAgICAgPGxlZnQgc3R5bGU9J3RoaW4nPgorICAgICAgICA8Y29sb3IgcmdiPSdGRjdGN0Y3RicvPgorICAgICAgPC9sZWZ0PgorICAgICAgPHJpZ2h0IHN0eWxlPSd0aGluJz4KKyAgICAgICAgPGNvbG9yIHJnYj0nRkY3RjdGN0YnLz4KKyAgICAgIDwvcmlnaHQ+CisgICAgICA8dG9wIHN0eWxlPSd0aGluJz4KKyAgICAgICAgPGNvbG9yIHJnYj0nRkY3RjdGN0YnLz4KKyAgICAgIDwvdG9wPgorICAgICAgPGJvdHRvbSBzdHlsZT0ndGhpbic+CisgICAgICAgIDxjb2xvciByZ2I9J0ZGN0Y3RjdGJy8+CisgICAgICA8L2JvdHRvbT4KKyAgICAgIDxkaWFnb25hbC8+CisgICAgPC9ib3JkZXI+CisgICAgPGJvcmRlcj4KKyAgICAgIDxsZWZ0IHN0eWxlPSd0aGluJz4KKyAgICAgICAgPGNvbG9yIHJnYj0nRkYzRjNGM0YnLz4KKyAgICAgIDwvbGVmdD4KKyAgICAgIDxyaWdodCBzdHlsZT0ndGhpbic+CisgICAgICAgIDxjb2xvciByZ2I9J0ZGM0YzRjNGJy8+CisgICAgICA8L3JpZ2h0PgorICAgICAgPHRvcCBzdHlsZT0ndGhpbic+CisgICAgICAgIDxjb2xvciByZ2I9J0ZGM0YzRjNGJy8+CisgICAgICA8L3RvcD4KKyAgICAgIDxib3R0b20gc3R5bGU9J3RoaW4nPgorICAgICAgICA8Y29sb3IgcmdiPSdGRjNGM0YzRicvPgorICAgICAgPC9ib3R0b20+CisgICAgICA8ZGlhZ29uYWwvPgorICAgIDwvYm9yZGVyPgorICAgIDxib3JkZXI+CisgICAgICA8bGVmdC8+CisgICAgICA8cmlnaHQvPgorICAgICAgPHRvcC8+CisgICAgICA8Ym90dG9tIHN0eWxlPSdkb3VibGUnPgorICAgICAgICA8Y29sb3IgcmdiPSdGRkZGODAwMScvPgorICAgICAgPC9ib3R0b20+CisgICAgICA8ZGlhZ29uYWwvPgorICAgIDwvYm9yZGVyPgorICAgIDxib3JkZXI+CisgICAgICA8bGVmdCBzdHlsZT0nZG91YmxlJz4KKyAgICAgICAgPGNvbG9yIHJnYj0nRkYzRjNGM0YnLz4KKyAgICAgIDwvbGVmdD4KKyAgICAgIDxyaWdodCBzdHlsZT0nZG91YmxlJz4KKyAgICAgICAgPGNvbG9yIHJnYj0nRkYzRjNGM0YnLz4KKyAgICAgIDwvcmlnaHQ+CisgICAgICA8dG9wIHN0eWxlPSdkb3VibGUnPgorICAgICAgICA8Y29sb3IgcmdiPSdGRjNGM0YzRicvPgorICAgICAgPC90b3A+CisgICAgICA8Ym90dG9tIHN0eWxlPSdkb3VibGUnPgorICAgICAgICA8Y29sb3IgcmdiPSdGRjNGM0YzRicvPgorICAgICAgPC9ib3R0b20+CisgICAgICA8ZGlhZ29uYWwvPgorICAgIDwvYm9yZGVyPgorICAgIDxib3JkZXI+CisgICAgICA8bGVmdCBzdHlsZT0ndGhpbic+CisgICAgICAgIDxjb2xvciByZ2I9J0ZGQjJCMkIyJy8+CisgICAgICA8L2xlZnQ+CisgICAgICA8cmlnaHQgc3R5bGU9J3RoaW4nPgorICAgICAgICA8Y29sb3IgcmdiPSdGRkIyQjJCMicvPgorICAgICAgPC9yaWdodD4KKyAgICAgIDx0b3Agc3R5bGU9J3RoaW4nPgorICAgICAgICA8Y29sb3IgcmdiPSdGRkIyQjJCMicvPgorICAgICAgPC90b3A+CisgICAgICA8Ym90dG9tIHN0eWxlPSd0aGluJz4KKyAgICAgICAgPGNvbG9yIHJnYj0nRkZCMkIyQjInLz4KKyAgICAgIDwvYm90dG9tPgorICAgICAgPGRpYWdvbmFsLz4KKyAgICA8L2JvcmRlcj4KKyAgICA8Ym9yZGVyPgorICAgICAgPGxlZnQvPgorICAgICAgPHJpZ2h0Lz4KKyAgICAgIDx0b3Agc3R5bGU9J3RoaW4nPgorICAgICAgICA8Y29sb3IgdGhlbWU9JzQnLz4KKyAgICAgIDwvdG9wPgorICAgICAgPGJvdHRvbSBzdHlsZT0nZG91YmxlJz4KKyAgICAgICAgPGNvbG9yIHRoZW1lPSc0Jy8+CisgICAgICA8L2JvdHRvbT4KKyAgICAgIDxkaWFnb25hbC8+CisgICAgPC9ib3JkZXI+CisgIDwvYm9yZGVycz4KKyAgPGNlbGxTdHlsZVhmcyBjb3VudD0nNDInPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPScwJyBmaWxsSWQ9JzAnIGJvcmRlcklkPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzInIGZpbGxJZD0nMCcgYm9yZGVySWQ9JzAnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUZpbGw9JzAnIGFwcGx5Qm9yZGVyPScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzMnIGZpbGxJZD0nMCcgYm9yZGVySWQ9JzEnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUZpbGw9JzAnIGFwcGx5QWxpZ25tZW50PScwJyBhcHBseVByb3RlY3Rpb249JzAnLz4KKyAgICA8eGYgbnVtRm10SWQ9JzAnIGZvbnRJZD0nNCcgZmlsbElkPScwJyBib3JkZXJJZD0nMicgYXBwbHlOdW1iZXJGb3JtYXQ9JzAnIGFwcGx5RmlsbD0nMCcgYXBwbHlBbGlnbm1lbnQ9JzAnIGFwcGx5UHJvdGVjdGlvbj0nMCcvPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPSc1JyBmaWxsSWQ9JzAnIGJvcmRlcklkPSczJyBhcHBseU51bWJlckZvcm1hdD0nMCcgYXBwbHlGaWxsPScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzUnIGZpbGxJZD0nMCcgYm9yZGVySWQ9JzAnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUZpbGw9JzAnIGFwcGx5Qm9yZGVyPScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzYnIGZpbGxJZD0nMicgYm9yZGVySWQ9JzAnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUJvcmRlcj0nMCcgYXBwbHlBbGlnbm1lbnQ9JzAnIGFwcGx5UHJvdGVjdGlvbj0nMCcvPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPSc3JyBmaWxsSWQ9JzMnIGJvcmRlcklkPScwJyBhcHBseU51bWJlckZvcm1hdD0nMCcgYXBwbHlCb3JkZXI9JzAnIGFwcGx5QWxpZ25tZW50PScwJyBhcHBseVByb3RlY3Rpb249JzAnLz4KKyAgICA8eGYgbnVtRm10SWQ9JzAnIGZvbnRJZD0nOCcgZmlsbElkPSc0JyBib3JkZXJJZD0nMCcgYXBwbHlOdW1iZXJGb3JtYXQ9JzAnIGFwcGx5Qm9yZGVyPScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzknIGZpbGxJZD0nNScgYm9yZGVySWQ9JzQnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzEwJyBmaWxsSWQ9JzYnIGJvcmRlcklkPSc1JyBhcHBseU51bWJlckZvcm1hdD0nMCcgYXBwbHlBbGlnbm1lbnQ9JzAnIGFwcGx5UHJvdGVjdGlvbj0nMCcvPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPScxMScgZmlsbElkPSc2JyBib3JkZXJJZD0nNCcgYXBwbHlOdW1iZXJGb3JtYXQ9JzAnIGFwcGx5QWxpZ25tZW50PScwJyBhcHBseVByb3RlY3Rpb249JzAnLz4KKyAgICA8eGYgbnVtRm10SWQ9JzAnIGZvbnRJZD0nMTInIGZpbGxJZD0nMCcgYm9yZGVySWQ9JzYnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUZpbGw9JzAnIGFwcGx5QWxpZ25tZW50PScwJyBhcHBseVByb3RlY3Rpb249JzAnLz4KKyAgICA8eGYgbnVtRm10SWQ9JzAnIGZvbnRJZD0nMTMnIGZpbGxJZD0nNycgYm9yZGVySWQ9JzcnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzE0JyBmaWxsSWQ9JzAnIGJvcmRlcklkPScwJyBhcHBseU51bWJlckZvcm1hdD0nMCcgYXBwbHlGaWxsPScwJyBhcHBseUJvcmRlcj0nMCcgYXBwbHlBbGlnbm1lbnQ9JzAnIGFwcGx5UHJvdGVjdGlvbj0nMCcvPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPScxJyBmaWxsSWQ9JzgnIGJvcmRlcklkPSc4JyBhcHBseU51bWJlckZvcm1hdD0nMCcgYXBwbHlGb250PScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzE1JyBmaWxsSWQ9JzAnIGJvcmRlcklkPScwJyBhcHBseU51bWJlckZvcm1hdD0nMCcgYXBwbHlGaWxsPScwJyBhcHBseUJvcmRlcj0nMCcgYXBwbHlBbGlnbm1lbnQ9JzAnIGFwcGx5UHJvdGVjdGlvbj0nMCcvPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPScxNicgZmlsbElkPScwJyBib3JkZXJJZD0nOScgYXBwbHlOdW1iZXJGb3JtYXQ9JzAnIGFwcGx5RmlsbD0nMCcgYXBwbHlBbGlnbm1lbnQ9JzAnIGFwcGx5UHJvdGVjdGlvbj0nMCcvPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPScxNycgZmlsbElkPSc5JyBib3JkZXJJZD0nMCcgYXBwbHlOdW1iZXJGb3JtYXQ9JzAnIGFwcGx5Qm9yZGVyPScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzEnIGZpbGxJZD0nMTAnIGJvcmRlcklkPScwJyBhcHBseU51bWJlckZvcm1hdD0nMCcgYXBwbHlCb3JkZXI9JzAnIGFwcGx5QWxpZ25tZW50PScwJyBhcHBseVByb3RlY3Rpb249JzAnLz4KKyAgICA8eGYgbnVtRm10SWQ9JzAnIGZvbnRJZD0nMScgZmlsbElkPScxMScgYm9yZGVySWQ9JzAnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUJvcmRlcj0nMCcgYXBwbHlBbGlnbm1lbnQ9JzAnIGFwcGx5UHJvdGVjdGlvbj0nMCcvPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPScxNycgZmlsbElkPScxMicgYm9yZGVySWQ9JzAnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUJvcmRlcj0nMCcgYXBwbHlBbGlnbm1lbnQ9JzAnIGFwcGx5UHJvdGVjdGlvbj0nMCcvPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPScxNycgZmlsbElkPScxMycgYm9yZGVySWQ9JzAnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUJvcmRlcj0nMCcgYXBwbHlBbGlnbm1lbnQ9JzAnIGFwcGx5UHJvdGVjdGlvbj0nMCcvPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPScxJyBmaWxsSWQ9JzE0JyBib3JkZXJJZD0nMCcgYXBwbHlOdW1iZXJGb3JtYXQ9JzAnIGFwcGx5Qm9yZGVyPScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzEnIGZpbGxJZD0nMTUnIGJvcmRlcklkPScwJyBhcHBseU51bWJlckZvcm1hdD0nMCcgYXBwbHlCb3JkZXI9JzAnIGFwcGx5QWxpZ25tZW50PScwJyBhcHBseVByb3RlY3Rpb249JzAnLz4KKyAgICA8eGYgbnVtRm10SWQ9JzAnIGZvbnRJZD0nMTcnIGZpbGxJZD0nMTYnIGJvcmRlcklkPScwJyBhcHBseU51bWJlckZvcm1hdD0nMCcgYXBwbHlCb3JkZXI9JzAnIGFwcGx5QWxpZ25tZW50PScwJyBhcHBseVByb3RlY3Rpb249JzAnLz4KKyAgICA8eGYgbnVtRm10SWQ9JzAnIGZvbnRJZD0nMTcnIGZpbGxJZD0nMTcnIGJvcmRlcklkPScwJyBhcHBseU51bWJlckZvcm1hdD0nMCcgYXBwbHlCb3JkZXI9JzAnIGFwcGx5QWxpZ25tZW50PScwJyBhcHBseVByb3RlY3Rpb249JzAnLz4KKyAgICA8eGYgbnVtRm10SWQ9JzAnIGZvbnRJZD0nMScgZmlsbElkPScxOCcgYm9yZGVySWQ9JzAnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUJvcmRlcj0nMCcgYXBwbHlBbGlnbm1lbnQ9JzAnIGFwcGx5UHJvdGVjdGlvbj0nMCcvPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPScxJyBmaWxsSWQ9JzE5JyBib3JkZXJJZD0nMCcgYXBwbHlOdW1iZXJGb3JtYXQ9JzAnIGFwcGx5Qm9yZGVyPScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzE3JyBmaWxsSWQ9JzIwJyBib3JkZXJJZD0nMCcgYXBwbHlOdW1iZXJGb3JtYXQ9JzAnIGFwcGx5Qm9yZGVyPScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzE3JyBmaWxsSWQ9JzIxJyBib3JkZXJJZD0nMCcgYXBwbHlOdW1iZXJGb3JtYXQ9JzAnIGFwcGx5Qm9yZGVyPScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzEnIGZpbGxJZD0nMjInIGJvcmRlcklkPScwJyBhcHBseU51bWJlckZvcm1hdD0nMCcgYXBwbHlCb3JkZXI9JzAnIGFwcGx5QWxpZ25tZW50PScwJyBhcHBseVByb3RlY3Rpb249JzAnLz4KKyAgICA8eGYgbnVtRm10SWQ9JzAnIGZvbnRJZD0nMScgZmlsbElkPScyMycgYm9yZGVySWQ9JzAnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUJvcmRlcj0nMCcgYXBwbHlBbGlnbm1lbnQ9JzAnIGFwcGx5UHJvdGVjdGlvbj0nMCcvPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPScxNycgZmlsbElkPScyNCcgYm9yZGVySWQ9JzAnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUJvcmRlcj0nMCcgYXBwbHlBbGlnbm1lbnQ9JzAnIGFwcGx5UHJvdGVjdGlvbj0nMCcvPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPScxNycgZmlsbElkPScyNScgYm9yZGVySWQ9JzAnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUJvcmRlcj0nMCcgYXBwbHlBbGlnbm1lbnQ9JzAnIGFwcGx5UHJvdGVjdGlvbj0nMCcvPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPScxJyBmaWxsSWQ9JzI2JyBib3JkZXJJZD0nMCcgYXBwbHlOdW1iZXJGb3JtYXQ9JzAnIGFwcGx5Qm9yZGVyPScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzEnIGZpbGxJZD0nMjcnIGJvcmRlcklkPScwJyBhcHBseU51bWJlckZvcm1hdD0nMCcgYXBwbHlCb3JkZXI9JzAnIGFwcGx5QWxpZ25tZW50PScwJyBhcHBseVByb3RlY3Rpb249JzAnLz4KKyAgICA8eGYgbnVtRm10SWQ9JzAnIGZvbnRJZD0nMTcnIGZpbGxJZD0nMjgnIGJvcmRlcklkPScwJyBhcHBseU51bWJlckZvcm1hdD0nMCcgYXBwbHlCb3JkZXI9JzAnIGFwcGx5QWxpZ25tZW50PScwJyBhcHBseVByb3RlY3Rpb249JzAnLz4KKyAgICA8eGYgbnVtRm10SWQ9JzAnIGZvbnRJZD0nMTcnIGZpbGxJZD0nMjknIGJvcmRlcklkPScwJyBhcHBseU51bWJlckZvcm1hdD0nMCcgYXBwbHlCb3JkZXI9JzAnIGFwcGx5QWxpZ25tZW50PScwJyBhcHBseVByb3RlY3Rpb249JzAnLz4KKyAgICA8eGYgbnVtRm10SWQ9JzAnIGZvbnRJZD0nMScgZmlsbElkPSczMCcgYm9yZGVySWQ9JzAnIGFwcGx5TnVtYmVyRm9ybWF0PScwJyBhcHBseUJvcmRlcj0nMCcgYXBwbHlBbGlnbm1lbnQ9JzAnIGFwcGx5UHJvdGVjdGlvbj0nMCcvPgorICAgIDx4ZiBudW1GbXRJZD0nMCcgZm9udElkPScxJyBmaWxsSWQ9JzMxJyBib3JkZXJJZD0nMCcgYXBwbHlOdW1iZXJGb3JtYXQ9JzAnIGFwcGx5Qm9yZGVyPScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzE3JyBmaWxsSWQ9JzMyJyBib3JkZXJJZD0nMCcgYXBwbHlOdW1iZXJGb3JtYXQ9JzAnIGFwcGx5Qm9yZGVyPScwJyBhcHBseUFsaWdubWVudD0nMCcgYXBwbHlQcm90ZWN0aW9uPScwJy8+CisgIDwvY2VsbFN0eWxlWGZzPgorICA8Y2VsbFhmcyBjb3VudD0nMSc+CisgICAgPHhmIG51bUZtdElkPScwJyBmb250SWQ9JzAnIGZpbGxJZD0nMCcgYm9yZGVySWQ9JzAnIHhmSWQ9JzAnLz4KKyAgPC9jZWxsWGZzPgorICA8Y2VsbFN0eWxlcyBjb3VudD0nNDInPgorICAgIDxjZWxsU3R5bGUgbmFtZT0nMjAlIC0gQWNjZW50MScgeGZJZD0nMTknIGJ1aWx0aW5JZD0nMzAnIGN1c3RvbUJ1aWx0aW49JzEnLz4KKyAgICA8Y2VsbFN0eWxlIG5hbWU9JzIwJSAtIEFjY2VudDInIHhmSWQ9JzIzJyBidWlsdGluSWQ9JzM0JyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPScyMCUgLSBBY2NlbnQzJyB4ZklkPScyNycgYnVpbHRpbklkPSczOCcgY3VzdG9tQnVpbHRpbj0nMScvPgorICAgIDxjZWxsU3R5bGUgbmFtZT0nMjAlIC0gQWNjZW50NCcgeGZJZD0nMzEnIGJ1aWx0aW5JZD0nNDInIGN1c3RvbUJ1aWx0aW49JzEnLz4KKyAgICA8Y2VsbFN0eWxlIG5hbWU9JzIwJSAtIEFjY2VudDUnIHhmSWQ9JzM1JyBidWlsdGluSWQ9JzQ2JyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPScyMCUgLSBBY2NlbnQ2JyB4ZklkPSczOScgYnVpbHRpbklkPSc1MCcgY3VzdG9tQnVpbHRpbj0nMScvPgorICAgIDxjZWxsU3R5bGUgbmFtZT0nNDAlIC0gQWNjZW50MScgeGZJZD0nMjAnIGJ1aWx0aW5JZD0nMzEnIGN1c3RvbUJ1aWx0aW49JzEnLz4KKyAgICA8Y2VsbFN0eWxlIG5hbWU9JzQwJSAtIEFjY2VudDInIHhmSWQ9JzI0JyBidWlsdGluSWQ9JzM1JyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPSc0MCUgLSBBY2NlbnQzJyB4ZklkPScyOCcgYnVpbHRpbklkPSczOScgY3VzdG9tQnVpbHRpbj0nMScvPgorICAgIDxjZWxsU3R5bGUgbmFtZT0nNDAlIC0gQWNjZW50NCcgeGZJZD0nMzInIGJ1aWx0aW5JZD0nNDMnIGN1c3RvbUJ1aWx0aW49JzEnLz4KKyAgICA8Y2VsbFN0eWxlIG5hbWU9JzQwJSAtIEFjY2VudDUnIHhmSWQ9JzM2JyBidWlsdGluSWQ9JzQ3JyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPSc0MCUgLSBBY2NlbnQ2JyB4ZklkPSc0MCcgYnVpbHRpbklkPSc1MScgY3VzdG9tQnVpbHRpbj0nMScvPgorICAgIDxjZWxsU3R5bGUgbmFtZT0nNjAlIC0gQWNjZW50MScgeGZJZD0nMjEnIGJ1aWx0aW5JZD0nMzInIGN1c3RvbUJ1aWx0aW49JzEnLz4KKyAgICA8Y2VsbFN0eWxlIG5hbWU9JzYwJSAtIEFjY2VudDInIHhmSWQ9JzI1JyBidWlsdGluSWQ9JzM2JyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPSc2MCUgLSBBY2NlbnQzJyB4ZklkPScyOScgYnVpbHRpbklkPSc0MCcgY3VzdG9tQnVpbHRpbj0nMScvPgorICAgIDxjZWxsU3R5bGUgbmFtZT0nNjAlIC0gQWNjZW50NCcgeGZJZD0nMzMnIGJ1aWx0aW5JZD0nNDQnIGN1c3RvbUJ1aWx0aW49JzEnLz4KKyAgICA8Y2VsbFN0eWxlIG5hbWU9JzYwJSAtIEFjY2VudDUnIHhmSWQ9JzM3JyBidWlsdGluSWQ9JzQ4JyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPSc2MCUgLSBBY2NlbnQ2JyB4ZklkPSc0MScgYnVpbHRpbklkPSc1MicgY3VzdG9tQnVpbHRpbj0nMScvPgorICAgIDxjZWxsU3R5bGUgbmFtZT0nQWNjZW50MScgeGZJZD0nMTgnIGJ1aWx0aW5JZD0nMjknIGN1c3RvbUJ1aWx0aW49JzEnLz4KKyAgICA8Y2VsbFN0eWxlIG5hbWU9J0FjY2VudDInIHhmSWQ9JzIyJyBidWlsdGluSWQ9JzMzJyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPSdBY2NlbnQzJyB4ZklkPScyNicgYnVpbHRpbklkPSczNycgY3VzdG9tQnVpbHRpbj0nMScvPgorICAgIDxjZWxsU3R5bGUgbmFtZT0nQWNjZW50NCcgeGZJZD0nMzAnIGJ1aWx0aW5JZD0nNDEnIGN1c3RvbUJ1aWx0aW49JzEnLz4KKyAgICA8Y2VsbFN0eWxlIG5hbWU9J0FjY2VudDUnIHhmSWQ9JzM0JyBidWlsdGluSWQ9JzQ1JyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPSdBY2NlbnQ2JyB4ZklkPSczOCcgYnVpbHRpbklkPSc0OScgY3VzdG9tQnVpbHRpbj0nMScvPgorICAgIDxjZWxsU3R5bGUgbmFtZT0nQmFkJyB4ZklkPSc3JyBidWlsdGluSWQ9JzI3JyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPSdDYWxjdWxhdGlvbicgeGZJZD0nMTEnIGJ1aWx0aW5JZD0nMjInIGN1c3RvbUJ1aWx0aW49JzEnLz4KKyAgICA8Y2VsbFN0eWxlIG5hbWU9J0NoZWNrIENlbGwnIHhmSWQ9JzEzJyBidWlsdGluSWQ9JzIzJyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPSdFeHBsYW5hdG9yeSBUZXh0JyB4ZklkPScxNicgYnVpbHRpbklkPSc1MycgY3VzdG9tQnVpbHRpbj0nMScvPgorICAgIDxjZWxsU3R5bGUgbmFtZT0nR29vZCcgeGZJZD0nNicgYnVpbHRpbklkPScyNicgY3VzdG9tQnVpbHRpbj0nMScvPgorICAgIDxjZWxsU3R5bGUgbmFtZT0nSGVhZGluZyAxJyB4ZklkPScyJyBidWlsdGluSWQ9JzE2JyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPSdIZWFkaW5nIDInIHhmSWQ9JzMnIGJ1aWx0aW5JZD0nMTcnIGN1c3RvbUJ1aWx0aW49JzEnLz4KKyAgICA8Y2VsbFN0eWxlIG5hbWU9J0hlYWRpbmcgMycgeGZJZD0nNCcgYnVpbHRpbklkPScxOCcgY3VzdG9tQnVpbHRpbj0nMScvPgorICAgIDxjZWxsU3R5bGUgbmFtZT0nSGVhZGluZyA0JyB4ZklkPSc1JyBidWlsdGluSWQ9JzE5JyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPSdJbnB1dCcgeGZJZD0nOScgYnVpbHRpbklkPScyMCcgY3VzdG9tQnVpbHRpbj0nMScvPgorICAgIDxjZWxsU3R5bGUgbmFtZT0nTGlua2VkIENlbGwnIHhmSWQ9JzEyJyBidWlsdGluSWQ9JzI0JyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPSdOZXV0cmFsJyB4ZklkPSc4JyBidWlsdGluSWQ9JzI4JyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPSdOb3JtYWwnIHhmSWQ9JzAnIGJ1aWx0aW5JZD0nMCcvPgorICAgIDxjZWxsU3R5bGUgbmFtZT0nTm90ZScgeGZJZD0nMTUnIGJ1aWx0aW5JZD0nMTAnIGN1c3RvbUJ1aWx0aW49JzEnLz4KKyAgICA8Y2VsbFN0eWxlIG5hbWU9J091dHB1dCcgeGZJZD0nMTAnIGJ1aWx0aW5JZD0nMjEnIGN1c3RvbUJ1aWx0aW49JzEnLz4KKyAgICA8Y2VsbFN0eWxlIG5hbWU9J1RpdGxlJyB4ZklkPScxJyBidWlsdGluSWQ9JzE1JyBjdXN0b21CdWlsdGluPScxJy8+CisgICAgPGNlbGxTdHlsZSBuYW1lPSdUb3RhbCcgeGZJZD0nMTcnIGJ1aWx0aW5JZD0nMjUnIGN1c3RvbUJ1aWx0aW49JzEnLz4KKyAgICA8Y2VsbFN0eWxlIG5hbWU9J1dhcm5pbmcgVGV4dCcgeGZJZD0nMTQnIGJ1aWx0aW5JZD0nMTEnIGN1c3RvbUJ1aWx0aW49JzEnLz4KKyAgPC9jZWxsU3R5bGVzPgorICA8ZHhmcyBjb3VudD0nMCcvPgorICA8dGFibGVTdHlsZXMgY291bnQ9JzAnIGRlZmF1bHRUYWJsZVN0eWxlPSdUYWJsZVN0eWxlTWVkaXVtOScgZGVmYXVsdFBpdm90U3R5bGU9J1Bpdm90U3R5bGVMaWdodDE2Jy8+Cis8L3N0eWxlU2hlZXQ+IikpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSB3b3Jrc2hlZXQgZG9jdW1lbnQgYW5kIGluc2VydHMgZGF0YSBpbnRvIGl0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaGVhZGVyTGlzdCI+TGlzdCBvZiB2YWx1ZXMgdGhhdCB3aWxsIGFjdCBhcyB0aGUgaGVhZGVyPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZVRhYmxlIj5WYWx1ZXMgZm9yIHdvcmtzaGVldCBjb250ZW50PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJoZWFkZXJSb3ciPkhlYWRlciByb3c8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgV29ya3NoZWV0UGFydCBDcmVhdGUoU3ByZWFkc2hlZXREb2N1bWVudCBkb2N1bWVudCwgTGlzdDxzdHJpbmc+IGhlYWRlckxpc3QsIHN0cmluZ1tdW10gdmFsdWVUYWJsZSwgaW50IGhlYWRlclJvdykKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IHhEb2N1bWVudCA9IENyZWF0ZUVtcHR5V29ya3NoZWV0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyTGlzdC5Db3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFkZFZhbHVlKHhEb2N1bWVudCwgaGVhZGVyUm93LCBpICsgMSwgaGVhZGVyTGlzdFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcm93cyA9IHZhbHVlVGFibGUuR2V0TGVuZ3RoKDApOworICAgICAgICAgICAgaW50IGNvbHMgPSB2YWx1ZVRhYmxlWzBdLkdldExlbmd0aCgwKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBZGRWYWx1ZSh4RG9jdW1lbnQsIGkgKyBoZWFkZXJSb3cgKyAxLCBqICsgMSwgdmFsdWVUYWJsZVtpXVtqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgV29ya3NoZWV0UGFydCBwYXJ0ID0gQWRkKGRvY3VtZW50LCB4RG9jdW1lbnQpOworICAgICAgICAgICAgcmV0dXJuIHBhcnQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGVsZW1lbnQgc3RydWN0dXJlIG5lZWRlZCB0byBkZXNjcmliZSBhbiBlbXB0eSB3b3Jrc2hlZXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPkRvY3VtZW50IHdpdGggY29udGVudHMgZm9yIGFuIGVtcHR5IHdvcmtzaGVldDwvcmV0dXJucz4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWERvY3VtZW50IENyZWF0ZUVtcHR5V29ya3NoZWV0KCkKKyAgICAgICAgeworICAgICAgICAgICAgWERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICBuZXcgWERvY3VtZW50KAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQobnMgKyAid29ya3NoZWV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJ4bWxucyIsIG5zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKFhOYW1lc3BhY2UuWG1sbnMgKyAiciIsIHJlbGF0aW9uc2hpcHNucyksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQobnMgKyAic2hlZXREYXRhIikKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGEgdmFsdWUgdG8gYSBjZWxsIGluc2lkZSBhIHdvcmtzaGVldCBkb2N1bWVudAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+ZG9jdW1lbnQgdG8gYWRkIHZhbHVlczwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij5Sb3c8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+Q29sdW1uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VmFsdWUgdG8gYWRkPC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRWYWx1ZShYRG9jdW1lbnQgd29ya3NoZWV0LCBpbnQgcm93LCBpbnQgY29sdW1uLCBzdHJpbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU2V0IHRoZSBjZWxsIHJlZmVyZW5jZQorICAgICAgICAgICAgc3RyaW5nIGNlbGxSZWZlcmVuY2UgPSBHZXRDb2x1bW5JZChjb2x1bW4pICsgcm93LlRvU3RyaW5nKCk7CisgICAgICAgICAgICBkb3VibGUgbnVtZXJpY1ZhbHVlOworICAgICAgICAgICAgLy9EZXRlcm1pbmluZyBpZiB2YWx1ZSBmb3IgY2VsbCBpcyB0ZXh0IG9yIG51bWVyaWMKKyAgICAgICAgICAgIGJvb2wgdmFsdWVJc051bWVyaWMgPSBkb3VibGUuVHJ5UGFyc2UodmFsdWUsIG91dCBudW1lcmljVmFsdWUpOworCisgICAgICAgICAgICAvL0NyZWF0aW5nIHRoZSBuZXcgY2VsbCBlbGVtZW50IChtYXJrdXApCisgICAgICAgICAgICBYRWxlbWVudCBuZXdDZWxsWEVsZW1lbnQgPSB2YWx1ZUlzTnVtZXJpYyA/CisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChucyArICJjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJyIiwgY2VsbFJlZmVyZW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQobnMgKyAidiIsIG51bWVyaWNWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KG5zICsgImMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoInIiLCBjZWxsUmVmZXJlbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJ0IiwgImlubGluZVN0ciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KG5zICsgImlzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQobnMgKyAidCIsIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAvLyBGaW5kIHRoZSByb3cgY29udGFpbmluZyB0aGUgY2VsbCB0byBhZGQgdGhlIHZhbHVlIHRvCisgICAgICAgICAgICBYTmFtZSByb3dOYW1lID0gInIiOworICAgICAgICAgICAgWEVsZW1lbnQgcm93RWxlbWVudCA9CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LlJvb3QKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnQobnMgKyAic2hlZXREYXRhIikKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKG5zICsgInJvdyIpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHQgPT4gdC5BdHRyaWJ1dGUocm93TmFtZSkuVmFsdWUgPT0gcm93LlRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKworICAgICAgICAgICAgaWYgKHJvd0VsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3JvdyBlbGVtZW50IGRvZXMgbm90IGV4aXN0CisgICAgICAgICAgICAgICAgLy9jcmVhdGUgYSBuZXcgb25lCisgICAgICAgICAgICAgICAgcm93RWxlbWVudCA9IENyZWF0ZUVtcHR5Um93KHJvdyk7CisKKyAgICAgICAgICAgICAgICAvL3JvdyBlbGVtZW50cyBtdXN0IGFwcGVhciBpbiBvcmRlciBpbnNpZGUgc2hlZXREYXRhIGVsZW1lbnQKKyAgICAgICAgICAgICAgICBpZiAod29ya3NoZWV0LlJvb3QKKyAgICAgICAgICAgICAgICAgLkVsZW1lbnQobnMgKyAic2hlZXREYXRhIikuSGFzRWxlbWVudHMpCisgICAgICAgICAgICAgICAgeyAgIC8vaWYgdGhlcmUgYXJlIG1vcmUgcm93cyBhbHJlYWR5IGRlZmluZWQgYXQgc2hlZXREYXRhIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLy9maW5kIHRoZSByb3cgd2l0aCB0aGUgaW5tZWRpYXRlIGhpZ2hlciBpbmRleCBmb3IgdGhlIHJvdyBjb250YWluaW5nIHRoZSBjZWxsIHRvIHNldCB0aGUgdmFsdWUgdG8KKyAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgcm93QWZ0ZXJFbGVtZW50ID0gRmluZFJvd0FmdGVyKHdvcmtzaGVldCwgcm93KTsKKyAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSBpcyBhIHJvdyB3aXRoIGFuIGlubWVkaWF0ZSBoaWdoZXIgaW5kZXggYWxyZWFkeSBkZWZpbmVkIGF0IHNoZWV0RGF0YQorICAgICAgICAgICAgICAgICAgICBpZiAocm93QWZ0ZXJFbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYWRkIHRoZSBuZXcgcm93IGJlZm9yZSB0aGUgcm93IHdpdGggYW4gaW5tZWRpYXRlIGhpZ2hlciBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgcm93QWZ0ZXJFbGVtZW50LkFkZEJlZm9yZVNlbGYocm93RWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7ICAgLy90aGlzIHJvdyBpcyBnb2luZyB0byBiZSB0aGUgb25lIHdpdGggdGhlIGhpZ2hlc3QgaW5kZXggKGFkZCBpdCBhcyB0aGUgbGFzdCBlbGVtZW50IGZvciBzaGVldERhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuUm9vdC5FbGVtZW50KG5zICsgInNoZWV0RGF0YSIpLkVsZW1lbnRzKG5zICsgInJvdyIpLkxhc3QoKS5BZGRBZnRlclNlbGYocm93RWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgICAvL3RoZXJlIGFyZSBubyBvdGhlciByb3dzIGFscmVhZHkgZGVmaW5lZCBhdCBzaGVldERhdGEKKyAgICAgICAgICAgICAgICAgICAgLy9BZGQgYSBuZXcgcm93IGVsZW1lbnRvIHRvIHNoZWV0RGF0YQorICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudChucyArICJzaGVldERhdGEiKQorICAgICAgICAgICAgICAgICAgICAgICAgLkFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dFbGVtZW50IC8vPSBDcmVhdGVFbXB0eVJvdyhyb3cpCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vQWRkIHRoZSBuZXcgY2VsbCB0byB0aGUgcm93IEVsZW1lbnQKKyAgICAgICAgICAgICAgICByb3dFbGVtZW50LkFkZChuZXdDZWxsWEVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcm93IGNvbnRhaW5pbmcgdGhlIGNlbGwgdG8gc2V0IHRoZSB2YWx1ZSB0byBpcyBhbHJlYWR5IGRlZmluZWQgYXQgc2hlZXREYXRhCisgICAgICAgICAgICAgICAgLy9sb29rIGlmIGNlbGwgYWxyZWFkeSBleGlzdCBhdCB0aGF0IHJvdworICAgICAgICAgICAgICAgIFhFbGVtZW50IGN1cnJlbnRDZWxsWEVsZW1lbnQgPSByb3dFbGVtZW50CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhucyArICJjIikKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgdCA9PiB0LkF0dHJpYnV0ZSgiciIpLlZhbHVlID09IGNlbGxSZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgKS5GaXJzdE9yRGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxsWEVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7ICAgLy9jZWxsIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgYXQgcm93IGluZGljYXRlZCBhcyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgLy9maW5kIHRoZSBpbm1lZGlhdGUgcmlnaHQgY29sdW1uIGZvciB0aGUgY2VsbCB0byBzZXQgdGhlIHZhbHVlIHRvCisgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGNvbHVtbkFmdGVyWEVsZW1lbnQgPSBGaW5kQ29sdW1BZnRlcih3b3Jrc2hlZXQsIHJvdywgY29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkFmdGVyWEVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnNlcnQgdGhlIG5ldyBjZWxsIGJlZm9yZSB0aGUgaW5tZWRpYXRlIHJpZ2h0IGNvbHVtbgorICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uQWZ0ZXJYRWxlbWVudC5BZGRCZWZvcmVTZWxmKG5ld0NlbGxYRWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7ICAgLy9UaGVyZSBpcyBubyBpbm1lZGlhdGUgcmlnaHQgY2VsbCAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vQWRkIHRoZSBuZXcgY2VsbCBhcyB0aGUgbGFzdCBlbGVtZW50IGZvciB0aGUgcm93CisgICAgICAgICAgICAgICAgICAgICAgICByb3dFbGVtZW50LkFkZChuZXdDZWxsWEVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vY2VsbCBhbHJlYXkgZXhpc3QKKyAgICAgICAgICAgICAgICAgICAgLy9yZXBsYWNlIHRoZSBjdXJyZW50IGNlbGwgd2l0aCB0aGF0IHdpdGggdGhlIG5ldyB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2VsbFhFbGVtZW50LlJlcGxhY2VXaXRoKG5ld0NlbGxYRWxlbWVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyBhIGdpdmVuIHdvcmtzaGVldCB0byB0aGUgZG9jdW1lbnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPldvcmtzaGVldCBkb2N1bWVudCB0byBhZGQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+V29ya3NoZWV0IHBhcnQganVzdCBhZGRlZDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBXb3Jrc2hlZXRQYXJ0IEFkZChTcHJlYWRzaGVldERvY3VtZW50IGRvYywgWERvY3VtZW50IHdvcmtzaGVldCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXNzb2NpYXRlcyBiYXNlIGNvbnRlbnQgdG8gYSBuZXcgd29ya3NoZWV0IHBhcnQKKyAgICAgICAgICAgIFdvcmtib29rUGFydCB3b3JrYm9vayA9IGRvYy5Xb3JrYm9va1BhcnQ7CisgICAgICAgICAgICBXb3Jrc2hlZXRQYXJ0IHdvcmtzaGVldFBhcnQgPSB3b3JrYm9vay5BZGROZXdQYXJ0PFdvcmtzaGVldFBhcnQ+KCk7CisgICAgICAgICAgICB3b3Jrc2hlZXRQYXJ0LlB1dFhEb2N1bWVudCh3b3Jrc2hlZXQpOworCisgICAgICAgICAgICAvLyBBc3NvY2lhdGVzIHRoZSB3b3Jrc2hlZXQgcGFydCB0byB0aGUgd29ya2Jvb2sgcGFydAorICAgICAgICAgICAgWERvY3VtZW50IGRvY3VtZW50ID0gZG9jLldvcmtib29rUGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIGludCBzaGVldElkID0KKyAgICAgICAgICAgICAgICBkb2N1bWVudC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnQobnMgKyAic2hlZXRzIikKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMobnMgKyAic2hlZXQiKQorICAgICAgICAgICAgICAgIC5Db3VudCgpICsgMTsKKworICAgICAgICAgICAgaW50IHdvcmtzaGVldENvdW50ID0KKyAgICAgICAgICAgICAgICBkb2N1bWVudC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnQobnMgKyAic2hlZXRzIikKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMobnMgKyAic2hlZXQiKQorICAgICAgICAgICAgICAgIC5XaGVyZSgKKyAgICAgICAgICAgICAgICAgICAgdCA9PgorICAgICAgICAgICAgICAgICAgICAgICAgdC5BdHRyaWJ1dGUoIm5hbWUiKS5WYWx1ZS5TdGFydHNXaXRoKCJzaGVldCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC5Db3VudCgpICsgMTsKKworICAgICAgICAgICAgLy8gQWRkcyBjb250ZW50IHRvIHdvcmtib29rIGRvY3VtZW50IHRvIHJlZmVyZW5jZSB3b3Jrc2hlZXQgZG9jdW1lbnQKKyAgICAgICAgICAgIGRvY3VtZW50LlJvb3QKKyAgICAgICAgICAgICAgICAuRWxlbWVudChucyArICJzaGVldHMiKQorICAgICAgICAgICAgICAgIC5BZGQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChucyArICJzaGVldCIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgibmFtZSIsIHN0cmluZy5Gb3JtYXQoInNoZWV0ezB9Iiwgd29ya3NoZWV0Q291bnQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJzaGVldElkIiwgc2hlZXRJZCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShyZWxhdGlvbnNoaXBzbnMgKyAiaWQiLCB3b3JrYm9vay5HZXRJZE9mUGFydCh3b3Jrc2hlZXRQYXJ0KSkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBkb2MuV29ya2Jvb2tQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIHdvcmtzaGVldFBhcnQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29scy9YbHN4VGFibGVzLmNzIGIvT3BlblhtbFBvd2VyVG9vbHMvWGxzeFRhYmxlcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODc5MThkCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHMvWGxzeFRhYmxlcy5jcwpAQCAtMCwwICsxLDQ3OCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEyLTIwMTUuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCitQdWJsaXNoZWQgYXQgaHR0cDovL09wZW5YbWxEZXZlbG9wZXIub3JnCitSZXNvdXJjZSBDZW50ZXIgYW5kIERvY3VtZW50YXRpb246IGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4CisKK0RldmVsb3BlcjogRXJpYyBXaGl0ZQorQmxvZzogaHR0cDovL3d3dy5lcmljd2hpdGUuY29tCitUd2l0dGVyOiBARXJpY1doaXRlRGV2CitFbWFpbDogZXJpY0Blcmljd2hpdGUuY29tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBTeXN0ZW0uSU87CisKK25hbWVzcGFjZSBPcGVuWG1sUG93ZXJUb29scworeworICAgIHB1YmxpYyBjbGFzcyBUYWJsZQorICAgIHsKKyAgICAgICAgcHVibGljIGludCBJZCB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBzdHJpbmcgVGFibGVOYW1lIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIHN0cmluZyBEaXNwbGF5TmFtZSB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBYRWxlbWVudCBUYWJsZVN0eWxlSW5mbyB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBzdHJpbmcgUmVmIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIGludCBMZWZ0Q29sdW1uIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIGludCBSaWdodENvbHVtbiB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBpbnQgVG9wUm93IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIGludCBCb3R0b21Sb3cgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgaW50PyBIZWFkZXJSb3dDb3VudCB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBpbnQ/IFRvdGFsc1Jvd0NvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIHN0cmluZyBUYWJsZVR5cGUgeyBnZXQ7IHNldDsgfSAgLy8gZXh0ZXJuYWwgZGF0YSBxdWVyeSwgZGF0YSBpbiB3b3Jrc2hlZXQsIG9yIFhNTCBkYXRhCisgICAgICAgIHB1YmxpYyBUYWJsZURlZmluaXRpb25QYXJ0IFRhYmxlRGVmaW5pdGlvblBhcnQgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgV29ya3NoZWV0UGFydCBQYXJlbnQgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgVGFibGUoV29ya3NoZWV0UGFydCBwYXJlbnQpIHsgUGFyZW50ID0gcGFyZW50OyB9CisgICAgICAgIHB1YmxpYyBJRW51bWVyYWJsZTxUYWJsZUNvbHVtbj4gVGFibGVDb2x1bW5zKCkKKyAgICAgICAgeworICAgICAgICAgICAgWE5hbWVzcGFjZSB4ID0gImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiI7CisgICAgICAgICAgICByZXR1cm4gVGFibGVEZWZpbml0aW9uUGFydAorICAgICAgICAgICAgICAgIC5HZXRYRG9jdW1lbnQoKQorICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnQoeCArICJ0YWJsZUNvbHVtbnMiKQorICAgICAgICAgICAgICAgIC5FbGVtZW50cyh4ICsgInRhYmxlQ29sdW1uIikKKyAgICAgICAgICAgICAgICAuU2VsZWN0KChjLCBpKSA9PgorICAgICAgICAgICAgICAgICAgICBuZXcgVGFibGVDb2x1bW4odGhpcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSWQgPSAoaW50KWMuQXR0cmlidXRlKCJpZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTnVtYmVyID0gdGhpcy5MZWZ0Q29sdW1uICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAoc3RyaW5nKWMuQXR0cmlidXRlKCJuYW1lIiksCisgICAgICAgICAgICAgICAgICAgICAgICBEYXRhRHhmSWQgPSAoaW50PyljLkF0dHJpYnV0ZSgiZGF0YUR4ZklkIiksCisgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeVRhYmxlRmllbGRJZCA9IChpbnQ/KWMuQXR0cmlidXRlKCJxdWVyeVRhYmxlRmllbGRJZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgVW5pcXVlTmFtZSA9IChzdHJpbmcpYy5BdHRyaWJ1dGUoInVuaXF1ZU5hbWUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkluZGV4ID0gaSwKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPFRhYmxlUm93PiBUYWJsZVJvd3MoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgcmVmU3RhcnQgPSBSZWYuU3BsaXQoJzonKS5GaXJzdCgpOworICAgICAgICAgICAgaW50IHJvd1N0YXJ0ID0gSW50MzIuUGFyc2UoWGxzeFRhYmxlcy5TcGxpdEFkZHJlc3MocmVmU3RhcnQpWzFdKTsKKyAgICAgICAgICAgIHN0cmluZyByZWZFbmQgPSBSZWYuU3BsaXQoJzonKS5FbGVtZW50QXQoMSk7CisgICAgICAgICAgICBpbnQgcm93RW5kID0gSW50MzIuUGFyc2UoWGxzeFRhYmxlcy5TcGxpdEFkZHJlc3MocmVmRW5kKVsxXSk7CisgICAgICAgICAgICBpbnQgaGVhZGVyUm93c0NvdW50ID0gSGVhZGVyUm93Q291bnQgPT0gbnVsbCA/IDAgOiAoaW50KUhlYWRlclJvd0NvdW50OworICAgICAgICAgICAgaW50IHRvdGFsUm93c0NvdW50ID0gVG90YWxzUm93Q291bnQgPT0gbnVsbCA/IDAgOiAoaW50KVRvdGFsc1Jvd0NvdW50OworICAgICAgICAgICAgcmV0dXJuIFBhcmVudAorICAgICAgICAgICAgICAgIC5Sb3dzKCkKKyAgICAgICAgICAgICAgICAuU2tpcChoZWFkZXJSb3dzQ291bnQpCisgICAgICAgICAgICAgICAgLlNraXBMYXN0KHRvdGFsUm93c0NvdW50KQorICAgICAgICAgICAgICAgIC5XaGVyZShyID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgcm93SWQgPSBJbnQzMi5QYXJzZShyLlJvd0lkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvd0lkID49IHJvd1N0YXJ0ICYmIHJvd0lkIDw9IHJvd0VuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC5TZWxlY3QociA9PiBuZXcgVGFibGVSb3codGhpcykgeyBSb3cgPSByIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFRhYmxlQ29sdW1uCisgICAgeworICAgICAgICBwdWJsaWMgaW50IElkIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIGludD8gRGF0YUR4ZklkIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIGludD8gUXVlcnlUYWJsZUZpZWxkSWQgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgc3RyaW5nIFVuaXF1ZU5hbWUgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgaW50IENvbHVtbk51bWJlciB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBpbnQgQ29sdW1uSW5kZXggeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgVGFibGUgUGFyZW50IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIFRhYmxlQ29sdW1uKFRhYmxlIHBhcmVudCkgeyBQYXJlbnQgPSBwYXJlbnQ7IH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgVGFibGVSb3cKKyAgICB7CisgICAgICAgIHB1YmxpYyBSb3cgUm93IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIFRhYmxlIFBhcmVudCB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBUYWJsZVJvdyhUYWJsZSBwYXJlbnQpIHsgUGFyZW50ID0gcGFyZW50OyB9CisgICAgICAgIHB1YmxpYyBUYWJsZUNlbGwgdGhpc1tzdHJpbmcgY29sdW1uTmFtZV0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGFibGVDb2x1bW4gdGMgPSBQYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgLlRhYmxlQ29sdW1ucygpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZSh4ID0+IHguTmFtZS5Ub0xvd2VyKCkgPT0gY29sdW1uTmFtZS5Ub0xvd2VyKCkpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmICh0YyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIGNvbHVtbiBuYW1lOiAiICsgY29sdW1uTmFtZSk7CisgICAgICAgICAgICAgICAgc3RyaW5nW10gcmVmcyA9IFBhcmVudC5SZWYuU3BsaXQoJzonKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdbXSBzdGFydFJlZnMgPSBYbHN4VGFibGVzLlNwbGl0QWRkcmVzcyhyZWZzWzBdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgY29sdW1uQWRkcmVzcyA9IFhsc3hUYWJsZXMuSW5kZXhUb0NvbHVtbkFkZHJlc3MoWGxzeFRhYmxlcy5Db2x1bW5BZGRyZXNzVG9JbmRleChzdGFydFJlZnNbMF0pICsgdGMuQ29sdW1uSW5kZXgpOworICAgICAgICAgICAgICAgIENlbGwgY2VsbCA9IFJvdy5DZWxscygpLldoZXJlKGMgPT4gYy5Db2x1bW5BZGRyZXNzID09IGNvbHVtbkFkZHJlc3MpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKGNlbGwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsLlR5cGUgPT0gInMiKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUNlbGwoY2VsbC5TaGFyZWRTdHJpbmcpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlQ2VsbChjZWxsLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlQ2VsbCgiIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgVGFibGVDZWxsIDogSUVxdWF0YWJsZTxUYWJsZUNlbGw+CisgICAgeworICAgICAgICBwdWJsaWMgc3RyaW5nIFZhbHVlIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIFRhYmxlQ2VsbChzdHJpbmcgdikKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSB2OworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLlZhbHVlID09ICgoVGFibGVDZWxsKW9iaikuVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBJRXF1YXRhYmxlPFRhYmxlQ2VsbD4uRXF1YWxzKFRhYmxlQ2VsbCBvdGhlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuVmFsdWUgPT0gb3RoZXIuVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLlZhbHVlLkdldEhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIG9wZXJhdG9yID09KFRhYmxlQ2VsbCBsZWZ0LCBUYWJsZUNlbGwgcmlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgob2JqZWN0KWxlZnQgIT0gKG9iamVjdClyaWdodCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGxlZnQuVmFsdWUgPT0gcmlnaHQuVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIG9wZXJhdG9yICE9KFRhYmxlQ2VsbCBsZWZ0LCBUYWJsZUNlbGwgcmlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgob2JqZWN0KWxlZnQgIT0gKG9iamVjdClyaWdodCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGxlZnQuVmFsdWUgIT0gcmlnaHQuVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBleHBsaWNpdCBvcGVyYXRvciBzdHJpbmcoVGFibGVDZWxsIGNlbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjZWxsID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIGNlbGwuVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBleHBsaWNpdCBvcGVyYXRvciBib29sKFRhYmxlQ2VsbCBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2VsbCA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJUYWJsZUNlbGwiKTsKKyAgICAgICAgICAgIHJldHVybiBjZWxsLlZhbHVlID09ICIxIjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2w/KFRhYmxlQ2VsbCBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2VsbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBjZWxsLlZhbHVlID09ICIxIjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIGV4cGxpY2l0IG9wZXJhdG9yIGludChUYWJsZUNlbGwgY2VsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNlbGwgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiVGFibGVDZWxsIik7CisgICAgICAgICAgICByZXR1cm4gSW50MzIuUGFyc2UoY2VsbC5WYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBleHBsaWNpdCBvcGVyYXRvciBpbnQ/KFRhYmxlQ2VsbCBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2VsbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBJbnQzMi5QYXJzZShjZWxsLlZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIGV4cGxpY2l0IG9wZXJhdG9yIHVpbnQoVGFibGVDZWxsIGNlbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjZWxsID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oIlRhYmxlQ2VsbCIpOworICAgICAgICAgICAgcmV0dXJuIFVJbnQzMi5QYXJzZShjZWxsLlZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIGV4cGxpY2l0IG9wZXJhdG9yIHVpbnQ/KFRhYmxlQ2VsbCBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2VsbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBVSW50MzIuUGFyc2UoY2VsbC5WYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBleHBsaWNpdCBvcGVyYXRvciBsb25nKFRhYmxlQ2VsbCBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2VsbCA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJUYWJsZUNlbGwiKTsKKyAgICAgICAgICAgIHJldHVybiBJbnQ2NC5QYXJzZShjZWxsLlZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIGV4cGxpY2l0IG9wZXJhdG9yIGxvbmc/KFRhYmxlQ2VsbCBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2VsbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBJbnQ2NC5QYXJzZShjZWxsLlZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIGV4cGxpY2l0IG9wZXJhdG9yIHVsb25nKFRhYmxlQ2VsbCBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2VsbCA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJUYWJsZUNlbGwiKTsKKyAgICAgICAgICAgIHJldHVybiBVSW50NjQuUGFyc2UoY2VsbC5WYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBleHBsaWNpdCBvcGVyYXRvciB1bG9uZz8oVGFibGVDZWxsIGNlbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjZWxsID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIFVJbnQ2NC5QYXJzZShjZWxsLlZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIGV4cGxpY2l0IG9wZXJhdG9yIGZsb2F0KFRhYmxlQ2VsbCBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2VsbCA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJUYWJsZUNlbGwiKTsKKyAgICAgICAgICAgIHJldHVybiBTaW5nbGUuUGFyc2UoY2VsbC5WYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBleHBsaWNpdCBvcGVyYXRvciBmbG9hdD8oVGFibGVDZWxsIGNlbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjZWxsID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIFNpbmdsZS5QYXJzZShjZWxsLlZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIGV4cGxpY2l0IG9wZXJhdG9yIGRvdWJsZShUYWJsZUNlbGwgY2VsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNlbGwgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiVGFibGVDZWxsIik7CisgICAgICAgICAgICByZXR1cm4gRG91YmxlLlBhcnNlKGNlbGwuVmFsdWUpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZXhwbGljaXQgb3BlcmF0b3IgZG91YmxlPyhUYWJsZUNlbGwgY2VsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNlbGwgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gRG91YmxlLlBhcnNlKGNlbGwuVmFsdWUpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZXhwbGljaXQgb3BlcmF0b3IgZGVjaW1hbChUYWJsZUNlbGwgY2VsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNlbGwgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiVGFibGVDZWxsIik7CisgICAgICAgICAgICByZXR1cm4gRGVjaW1hbC5QYXJzZShjZWxsLlZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIGV4cGxpY2l0IG9wZXJhdG9yIGRlY2ltYWw/KFRhYmxlQ2VsbCBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2VsbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBEZWNpbWFsLlBhcnNlKGNlbGwuVmFsdWUpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW1wbGljaXQgb3BlcmF0b3IgRGF0ZVRpbWUoVGFibGVDZWxsIGNlbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjZWxsID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oIlRhYmxlQ2VsbCIpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSgxOTAwLCAxLCAxKS5BZGREYXlzKEludDMyLlBhcnNlKGNlbGwuVmFsdWUpIC0gMik7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbXBsaWNpdCBvcGVyYXRvciBEYXRlVGltZT8oVGFibGVDZWxsIGNlbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjZWxsID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSgxOTAwLCAxLCAxKS5BZGREYXlzKEludDMyLlBhcnNlKGNlbGwuVmFsdWUpIC0gMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgUm93CisgICAgeworICAgICAgICBwdWJsaWMgWEVsZW1lbnQgUm93RWxlbWVudCB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBzdHJpbmcgUm93SWQgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgc3RyaW5nIFNwYW5zIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIExpc3Q8Q2VsbD4gQ2VsbHMoKQorICAgICAgICB7CisgICAgICAgICAgICBYTmFtZXNwYWNlIHMgPSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIjsKKyAgICAgICAgICAgIFNwcmVhZHNoZWV0RG9jdW1lbnQgZG9jID0gKFNwcmVhZHNoZWV0RG9jdW1lbnQpUGFyZW50Lk9wZW5YbWxQYWNrYWdlOworICAgICAgICAgICAgU2hhcmVkU3RyaW5nVGFibGVQYXJ0IHNoYXJlZFN0cmluZ1RhYmxlID0gZG9jLldvcmtib29rUGFydC5TaGFyZWRTdHJpbmdUYWJsZVBhcnQ7CisgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gY2VsbHMgPSB0aGlzLlJvd0VsZW1lbnQuRWxlbWVudHMoUy5jKTsKKyAgICAgICAgICAgIHZhciByID0gY2VsbHMKKyAgICAgICAgICAgICAgICAuU2VsZWN0KGNlbGwgPT4geworICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbFR5cGUgPSAoc3RyaW5nKWNlbGwuQXR0cmlidXRlKCJ0Iik7CisgICAgICAgICAgICAgICAgICAgIHZhciBzaGFyZWRTdHJpbmcgPSBjZWxsVHlwZSA9PSAicyIgPworICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkU3RyaW5nVGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5HZXRYRG9jdW1lbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhzICsgInNpIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5Ta2lwKChpbnQpY2VsbC5FbGVtZW50KHMgKyAidiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cyhzICsgInQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLlN0cmluZ0NvbmNhdGVuYXRlKGUgPT4gKHN0cmluZyllKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsOworICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uID0gKHN0cmluZyljZWxsLkF0dHJpYnV0ZSgiciIpOworICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uQWRkcmVzcyA9IGNvbHVtbi5TcGxpdCgnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScpLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5JbmRleCA9IFhsc3hUYWJsZXMuQ29sdW1uQWRkcmVzc1RvSW5kZXgoY29sdW1uQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDZWxsID0gbmV3IENlbGwodGhpcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbEVsZW1lbnQgPSBjZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgUm93ID0gKHN0cmluZylSb3dFbGVtZW50LkF0dHJpYnV0ZSgiciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uID0gY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uQWRkcmVzcyA9IGNvbHVtbkFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5JbmRleCA9IGNvbHVtbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IGNlbGxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgRm9ybXVsYSA9IChzdHJpbmcpY2VsbC5FbGVtZW50KFMuZiksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHlsZSA9IChpbnQ/KWNlbGwuQXR0cmlidXRlKCJzIiksCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IChzdHJpbmcpY2VsbC5FbGVtZW50KFMudiksCisgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWRTdHJpbmcgPSBzaGFyZWRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0NlbGw7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB2YXIgcmEgPSByLlRvTGlzdCgpOworICAgICAgICAgICAgcmV0dXJuIHJhOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBXb3Jrc2hlZXRQYXJ0IFBhcmVudCB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBSb3coV29ya3NoZWV0UGFydCBwYXJlbnQpIHsgUGFyZW50ID0gcGFyZW50OyB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIENlbGwKKyAgICB7CisgICAgICAgIHB1YmxpYyBYRWxlbWVudCBDZWxsRWxlbWVudCB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBzdHJpbmcgUm93IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIHN0cmluZyBDb2x1bW4geyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgc3RyaW5nIENvbHVtbkFkZHJlc3MgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgaW50IENvbHVtbkluZGV4IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIHN0cmluZyBUeXBlIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIHN0cmluZyBWYWx1ZSB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBzdHJpbmcgRm9ybXVsYSB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBpbnQ/IFN0eWxlIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIHN0cmluZyBTaGFyZWRTdHJpbmcgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgUm93IFBhcmVudCB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBDZWxsKFJvdyBwYXJlbnQpIHsgUGFyZW50ID0gcGFyZW50OyB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBYbHN4VGFibGVzCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIElFbnVtZXJhYmxlPFRhYmxlPiBUYWJsZXModGhpcyBTcHJlYWRzaGVldERvY3VtZW50IHNwcmVhZHNoZWV0KQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgd29ya3NoZWV0UGFydCBpbiBzcHJlYWRzaGVldC5Xb3JrYm9va1BhcnQuV29ya3NoZWV0UGFydHMpCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRhYmxlIGluIHdvcmtzaGVldFBhcnQuVGFibGVEZWZpbml0aW9uUGFydHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgdGFibGVEZWZEb2MgPSB0YWJsZS5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICBUYWJsZSB0ID0gbmV3IFRhYmxlKHdvcmtzaGVldFBhcnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElkID0gKGludCl0YWJsZURlZkRvYy5Sb290LkF0dHJpYnV0ZSgiaWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTmFtZSA9IChzdHJpbmcpdGFibGVEZWZEb2MuUm9vdC5BdHRyaWJ1dGUoIm5hbWUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0gKHN0cmluZyl0YWJsZURlZkRvYy5Sb290LkF0dHJpYnV0ZSgiZGlzcGxheU5hbWUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlU3R5bGVJbmZvID0gdGFibGVEZWZEb2MuUm9vdC5FbGVtZW50KFMudGFibGVTdHlsZUluZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVmID0gKHN0cmluZyl0YWJsZURlZkRvYy5Sb290LkF0dHJpYnV0ZSgicmVmIiksCisgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbHNSb3dDb3VudCA9IChpbnQ/KXRhYmxlRGVmRG9jLlJvb3QuQXR0cmlidXRlKCJ0b3RhbHNSb3dDb3VudCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgLy9IZWFkZXJSb3dDb3VudCA9IChpbnQ/KXRhYmxlRGVmRG9jLlJvb3QuQXR0cmlidXRlKCJoZWFkZXJSb3dDb3VudCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyUm93Q291bnQgPSAxLCAgLy8gY3VycmVudGx5IHRoZXJlIGFsd2F5cyBpcyBhIGhlYWRlciByb3cKKyAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlVHlwZSA9IChzdHJpbmcpdGFibGVEZWZEb2MuUm9vdC5BdHRyaWJ1dGUoInRhYmxlVHlwZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVEZWZpbml0aW9uUGFydCA9IHRhYmxlCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0Q29sdW1uLCB0b3BSb3csIHJpZ2h0Q29sdW1uLCBib3R0b21Sb3c7CisgICAgICAgICAgICAgICAgICAgIFBhcnNlUmFuZ2UodC5SZWYsIG91dCBsZWZ0Q29sdW1uLCBvdXQgdG9wUm93LCBvdXQgcmlnaHRDb2x1bW4sIG91dCBib3R0b21Sb3cpOworICAgICAgICAgICAgICAgICAgICB0LkxlZnRDb2x1bW4gPSBsZWZ0Q29sdW1uOworICAgICAgICAgICAgICAgICAgICB0LlRvcFJvdyA9IHRvcFJvdzsKKyAgICAgICAgICAgICAgICAgICAgdC5SaWdodENvbHVtbiA9IHJpZ2h0Q29sdW1uOworICAgICAgICAgICAgICAgICAgICB0LkJvdHRvbVJvdyA9IGJvdHRvbVJvdzsKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFBhcnNlUmFuZ2Uoc3RyaW5nIHRoZVJlZiwgb3V0IGludCBsZWZ0Q29sdW1uLCBvdXQgaW50IHRvcFJvdywgb3V0IGludCByaWdodENvbHVtbiwgb3V0IGludCBib3R0b21Sb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEM1OkU3CisgICAgICAgICAgICB2YXIgc3BsID0gdGhlUmVmLlNwbGl0KCc6Jyk7CisgICAgICAgICAgICBzdHJpbmcgcmVmU3RhcnQgPSBzcGwuRmlyc3QoKTsKKyAgICAgICAgICAgIHZhciByZWZTdGFydFNwbGl0ID0gWGxzeFRhYmxlcy5TcGxpdEFkZHJlc3MocmVmU3RhcnQpOworICAgICAgICAgICAgbGVmdENvbHVtbiA9IFhsc3hUYWJsZXMuQ29sdW1uQWRkcmVzc1RvSW5kZXgocmVmU3RhcnRTcGxpdFswXSk7CisgICAgICAgICAgICB0b3BSb3cgPSBJbnQzMi5QYXJzZShyZWZTdGFydFNwbGl0WzFdKTsKKworICAgICAgICAgICAgc3RyaW5nIHJlZkVuZCA9IHNwbC5FbGVtZW50QXQoMSk7CisgICAgICAgICAgICB2YXIgcmVmRW5kU3BsaXQgPSBYbHN4VGFibGVzLlNwbGl0QWRkcmVzcyhyZWZFbmQpOworICAgICAgICAgICAgcmlnaHRDb2x1bW4gPSBYbHN4VGFibGVzLkNvbHVtbkFkZHJlc3NUb0luZGV4KHJlZkVuZFNwbGl0WzBdKTsKKyAgICAgICAgICAgIGJvdHRvbVJvdyA9IEludDMyLlBhcnNlKHJlZkVuZFNwbGl0WzFdKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVGFibGUgVGFibGUodGhpcyBTcHJlYWRzaGVldERvY3VtZW50IHNwcmVhZHNoZWV0LAorICAgICAgICAgICAgc3RyaW5nIHRhYmxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNwcmVhZHNoZWV0LlRhYmxlcygpLldoZXJlKHQgPT4gdC5UYWJsZU5hbWUuVG9Mb3dlcigpID09IHRhYmxlTmFtZS5Ub0xvd2VyKCkpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIElFbnVtZXJhYmxlPFJvdz4gUm93cyh0aGlzIFdvcmtzaGVldFBhcnQgd29ya3NoZWV0UGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgWE5hbWVzcGFjZSBzID0gImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiI7CisgICAgICAgICAgICB2YXIgcm93cyA9IHdvcmtzaGVldFBhcnQKKyAgICAgICAgICAgICAgICAuR2V0WERvY3VtZW50KCkKKyAgICAgICAgICAgICAgICAuUm9vdAorICAgICAgICAgICAgICAgIC5FbGVtZW50cyhTLnNoZWV0RGF0YSkKKyAgICAgICAgICAgICAgICAuRWxlbWVudHMoUy5yb3cpCisgICAgICAgICAgICAgICAgLlNlbGVjdChyID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcm93ID0gbmV3IFJvdyh3b3Jrc2hlZXRQYXJ0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBSb3dFbGVtZW50ID0gciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJvd0lkID0gKHN0cmluZylyLkF0dHJpYnV0ZSgiciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3BhbnMgPSAoc3RyaW5nKXIuQXR0cmlidXRlKCJzcGFucyIpCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByb3c7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gcm93czsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nW10gU3BsaXRBZGRyZXNzKHN0cmluZyBhZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhZGRyZXNzLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzW2ldID49ICcwJyAmJiBhZGRyZXNzW2ldIDw9ICc5JykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoaSA9PSBhZGRyZXNzLkxlbmd0aCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZUZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBzcHJlYWRzaGVldC4gIEJhZCBjZWxsIGFkZHJlc3MuIik7CisgICAgICAgICAgICByZXR1cm4gbmV3W10geworICAgICAgICAgICAgICAgIGFkZHJlc3MuU3Vic3RyaW5nKDAsIGkpLAorICAgICAgICAgICAgICAgIGFkZHJlc3MuU3Vic3RyaW5nKGkpCisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgSW5kZXhUb0NvbHVtbkFkZHJlc3MoaW50IGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAyNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikoKGludCknQScgKyBpbmRleCk7CisgICAgICAgICAgICAgICAgc3RyaW5nIHMgPSBuZXcgc3RyaW5nKGMsIDEpOworICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZGV4IDwgNzAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpID0gaW5kZXggLSAyNjsKKyAgICAgICAgICAgICAgICBpbnQgaTEgPSAoaW50KShpIC8gMjYpOworICAgICAgICAgICAgICAgIGludCBpMiA9IGkgJSAyNjsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcyA9IG5ldyBzdHJpbmcoKGNoYXIpKChpbnQpJ0EnICsgaTEpLCAxKSArCisgICAgICAgICAgICAgICAgICAgIG5ldyBzdHJpbmcoKGNoYXIpKChpbnQpJ0EnICsgaTIpLCAxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbmRleCA8IDE4Mjc4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpID0gaW5kZXggLSA3MDI7CisgICAgICAgICAgICAgICAgaW50IGkxID0gKGludCkoaSAvIDY3Nik7CisgICAgICAgICAgICAgICAgaSA9IGkgLSBpMSAqIDY3NjsKKyAgICAgICAgICAgICAgICBpbnQgaTIgPSAoaW50KShpIC8gMjYpOworICAgICAgICAgICAgICAgIGludCBpMyA9IGkgJSAyNjsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcyA9IG5ldyBzdHJpbmcoKGNoYXIpKChpbnQpJ0EnICsgaTEpLCAxKSArCisgICAgICAgICAgICAgICAgICAgIG5ldyBzdHJpbmcoKGNoYXIpKChpbnQpJ0EnICsgaTIpLCAxKSArCisgICAgICAgICAgICAgICAgICAgIG5ldyBzdHJpbmcoKGNoYXIpKChpbnQpJ0EnICsgaTMpLCAxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgY29sdW1uIGFkZHJlc3MiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbHVtbkFkZHJlc3NUb0luZGV4KHN0cmluZyBjb2x1bW5BZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29sdW1uQWRkcmVzcy5MZW5ndGggPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBjb2x1bW5BZGRyZXNzWzBdOworICAgICAgICAgICAgICAgIGludCBpID0gYyAtICdBJzsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2x1bW5BZGRyZXNzLkxlbmd0aCA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgYzEgPSBjb2x1bW5BZGRyZXNzWzBdOworICAgICAgICAgICAgICAgIGNoYXIgYzIgPSBjb2x1bW5BZGRyZXNzWzFdOworICAgICAgICAgICAgICAgIGludCBpMSA9IGMxIC0gJ0EnOworICAgICAgICAgICAgICAgIGludCBpMiA9IGMyIC0gJ0EnOworICAgICAgICAgICAgICAgIHJldHVybiAoaTEgKyAxKSAqIDI2ICsgaTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29sdW1uQWRkcmVzcy5MZW5ndGggPT0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMxID0gY29sdW1uQWRkcmVzc1swXTsKKyAgICAgICAgICAgICAgICBjaGFyIGMyID0gY29sdW1uQWRkcmVzc1sxXTsKKyAgICAgICAgICAgICAgICBjaGFyIGMzID0gY29sdW1uQWRkcmVzc1syXTsKKyAgICAgICAgICAgICAgICBpbnQgaTEgPSBjMSAtICdBJzsKKyAgICAgICAgICAgICAgICBpbnQgaTIgPSBjMiAtICdBJzsKKyAgICAgICAgICAgICAgICBpbnQgaTMgPSBjMyAtICdBJzsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGkxICsgMSkgKiA2NzYgKyAoaTIgKyAxKSAqIDI2ICsgaTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZUZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBzcHJlYWRzaGVldDogSW52YWxpZCBjb2x1bW4gYWRkcmVzcy4iKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDEuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2I3YTMwCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1DYWNoZWQtRGF0YS0wMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDIuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGFiZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1DYWNoZWQtRGF0YS0wMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDMuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDk1ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1DYWNoZWQtRGF0YS0wMy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDQuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODJlZGFjCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1DYWNoZWQtRGF0YS0wNC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDUuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTE5MDY4Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1DYWNoZWQtRGF0YS0wNS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDYuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDYuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2Q1OTFhCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1DYWNoZWQtRGF0YS0wNi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDcuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDcuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2E4ODdkCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1DYWNoZWQtRGF0YS0wNy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDguZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtMDguZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjhmNzRlCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1DYWNoZWQtRGF0YS0wOC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtNDEucHB0eCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtQ2FjaGVkLURhdGEtNDEucHB0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTgwMzg0Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1DYWNoZWQtRGF0YS00MS5wcHR4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wMS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1FbWJlZGRlZC1YbHN4LTAxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxM2EwNQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wMi5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1FbWJlZGRlZC1YbHN4LTAyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0YmJlZgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wMy5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1FbWJlZGRlZC1YbHN4LTAzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzljOGM2MgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wMy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNC5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1FbWJlZGRlZC1YbHN4LTA0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1NzhiYwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1FbWJlZGRlZC1YbHN4LTA1LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0YmVmZAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNi5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1FbWJlZGRlZC1YbHN4LTA2LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3NmY3ZAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNy5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1FbWJlZGRlZC1YbHN4LTA3LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzMjEwMgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wOC5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1FbWJlZGRlZC1YbHN4LTA4LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlM2QzMgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0wOC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0xMC5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1FbWJlZGRlZC1YbHN4LTEwLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2MGJhNAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC0xMC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC00MS5wcHR4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydC1FbWJlZGRlZC1YbHN4LTQxLnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5NjIxMgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnQtRW1iZWRkZWQtWGxzeC00MS5wcHR4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnRVcGRhdGVyMDEuY3MgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0NoYXJ0VXBkYXRlcjAxL0NoYXJ0VXBkYXRlcjAxLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZTg4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0NoYXJ0VXBkYXRlcjAxL0NoYXJ0VXBkYXRlcjAxLmNzCkBAIC0wLDAgKzEsMjE2IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBuID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgdmFyIHRlbXBEaSA9IG5ldyBEaXJlY3RvcnlJbmZvKHN0cmluZy5Gb3JtYXQoIkV4YW1wbGVPdXRwdXQtezA6MDB9LXsxOjAwfS17MjowMH0tezM6MDB9ezQ6MDB9ezU6MDB9Iiwgbi5ZZWFyIC0gMjAwMCwgbi5Nb250aCwgbi5EYXksIG4uSG91ciwgbi5NaW51dGUsIG4uU2Vjb25kKSk7CisgICAgICAgICAgICB0ZW1wRGkuQ3JlYXRlKCk7CisKKyAgICAgICAgICAgIHZhciBzb3VyY2VEaSA9IG5ldyBEaXJlY3RvcnlJbmZvKCIuLi8uLi8iKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmaWxlIGluIHNvdXJjZURpLkdldEZpbGVzKCIqLmRvY3giKSkKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoZmlsZS5GdWxsTmFtZSwgUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgZmlsZS5OYW1lKSk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZmlsZSBpbiBzb3VyY2VEaS5HZXRGaWxlcygiKi5wcHR4IikpCisgICAgICAgICAgICAgICAgRmlsZS5Db3B5KGZpbGUuRnVsbE5hbWUsIFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsIGZpbGUuTmFtZSkpOworCisgICAgICAgICAgICB2YXIgZmlsZUxpc3QgPSBEaXJlY3RvcnkuR2V0RmlsZXModGVtcERpLkZ1bGxOYW1lLCAiKi5kb2N4Iik7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZmlsZSBpbiBmaWxlTGlzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmkgPSBuZXcgRmlsZUluZm8oZmlsZSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZmkuTmFtZSk7CisgICAgICAgICAgICAgICAgdmFyIG5ld0ZpbGVOYW1lID0gIlVwZGF0ZWQtIiArIGZpLk5hbWU7CisgICAgICAgICAgICAgICAgdmFyIGZpMiA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCBuZXdGaWxlTmFtZSkpOworICAgICAgICAgICAgICAgIEZpbGUuQ29weShmaS5GdWxsTmFtZSwgZmkyLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihmaTIuRnVsbE5hbWUsIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJ0MURhdGEgPSBuZXcgQ2hhcnREYXRhCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcmllc05hbWVzID0gbmV3W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcnVjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJpa2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb2F0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeURhdGFUeXBlID0gQ2hhcnREYXRhVHlwZS5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeU5hbWVzID0gbmV3W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRNCIsCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzID0gbmV3IGRvdWJsZVtdW10geworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGRvdWJsZVtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIDMxMCwgMjIwLCA0NTAsCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGRvdWJsZVtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsIDMwMCwgMzUwLCA0MTEsCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGRvdWJsZVtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MCwgMTIwLCAxNDAsIDYwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZG91YmxlW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMCwgMTAwLCAxNDAsIDQwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZG91YmxlW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCwgMjEwLCAyMTAsIDQ4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VXBkYXRlci5VcGRhdGVDaGFydCh3RG9jLCAiQ2hhcnQxIiwgY2hhcnQxRGF0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJ0MkRhdGEgPSBuZXcgQ2hhcnREYXRhCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcmllc05hbWVzID0gbmV3W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJpZXMiCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlEYXRhVHlwZSA9IENoYXJ0RGF0YVR5cGUuU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlOYW1lcyA9IG5ld1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRydWNrcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb2F0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzID0gbmV3IGRvdWJsZVtdW10geworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGRvdWJsZVtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAsIDExMiwgNjQsIDgwLAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcnRVcGRhdGVyLlVwZGF0ZUNoYXJ0KHdEb2MsICJDaGFydDIiLCBjaGFydDJEYXRhKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcnQzRGF0YSA9IG5ldyBDaGFydERhdGEKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWVzTmFtZXMgPSBuZXdbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlgxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlg0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWDUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYNiIsCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlEYXRhVHlwZSA9IENoYXJ0RGF0YVR5cGUuU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlOYW1lcyA9IG5ld1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlkzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlk2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgPSBuZXcgZG91YmxlW11bXSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZG91YmxlW10geyAgICAgIDMuMCwgICAgICAyLjEsICAgICAgIC43LCAgICAgIC43LCAgICAgIDIuMSwgICAgICAzLjAsICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7ICAgICAgMy4wLCAgICAgIDIuMSwgICAgICAgLjgsICAgICAgLjgsICAgICAgMi4xLCAgICAgIDMuMCwgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGRvdWJsZVtdIHsgICAgICAzLjAsICAgICAgMi40LCAgICAgIDEuMiwgICAgIDEuMiwgICAgICAyLjQsICAgICAgMy4wLCAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZG91YmxlW10geyAgICAgIDMuMCwgICAgICAyLjcsICAgICAgMS43LCAgICAgMS43LCAgICAgIDIuNywgICAgICAzLjAsICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7ICAgICAgMy4wLCAgICAgIDIuOSwgICAgICAyLjUsICAgICAyLjUsICAgICAgMi45LCAgICAgIDMuMCwgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGRvdWJsZVtdIHsgICAgICAzLjAsICAgICAgMy4wLCAgICAgIDMuMCwgICAgIDMuMCwgICAgICAzLjAsICAgICAgMy4wLCAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VXBkYXRlci5VcGRhdGVDaGFydCh3RG9jLCAiQ2hhcnQzIiwgY2hhcnQzRGF0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJ0NERhdGEgPSBuZXcgQ2hhcnREYXRhCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcmllc05hbWVzID0gbmV3W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcnVjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlEYXRhVHlwZSA9IENoYXJ0RGF0YVR5cGUuRGF0ZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeUZvcm1hdENvZGUgPSAxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5TmFtZXMgPSBuZXdbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvRXhjZWxJbnRlZ2VyKG5ldyBEYXRlVGltZSgyMDEzLCA5LCAzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgNSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvRXhjZWxJbnRlZ2VyKG5ldyBEYXRlVGltZSgyMDEzLCA5LCA2KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0V4Y2VsSW50ZWdlcihuZXcgRGF0ZVRpbWUoMjAxMywgOSwgOCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvRXhjZWxJbnRlZ2VyKG5ldyBEYXRlVGltZSgyMDEzLCA5LCA5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDEwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDExKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDEyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDEzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDE0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDE1KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDE2KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDE3KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDE4KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDE5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9FeGNlbEludGVnZXIobmV3IERhdGVUaW1lKDIwMTMsIDksIDIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzID0gbmV3IGRvdWJsZVtdW10geworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGRvdWJsZVtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAyLCAzLCAyLCAzLCA0LCA1LCA0LCA1LCA2LCA1LCA0LCA1LCA2LCA3LCA4LCA3LCA4LCA4LCA5LAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMywgMywgNCwgNCwgNSwgNiwgNywgOCwgNywgOCwgOSwgOSwgOSwgNywgOCwgOSwgOSwgMTAsIDExLAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMywgMywgMywgMywgMiwgMiwgMiwgMywgMiwgMywgMywgNCwgNCwgNCwgMywgNCwgNSwgNSwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VXBkYXRlci5VcGRhdGVDaGFydCh3RG9jLCAiQ2hhcnQ0IiwgY2hhcnQ0RGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaWxlTGlzdCA9IERpcmVjdG9yeS5HZXRGaWxlcyh0ZW1wRGkuRnVsbE5hbWUsICIqLnBwdHgiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmaWxlIGluIGZpbGVMaXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmaSA9IG5ldyBGaWxlSW5mbyhmaWxlKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShmaS5OYW1lKTsKKyAgICAgICAgICAgICAgICB2YXIgbmV3RmlsZU5hbWUgPSAiVXBkYXRlZC0iICsgZmkuTmFtZTsKKyAgICAgICAgICAgICAgICB2YXIgZmkyID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsIG5ld0ZpbGVOYW1lKSk7CisgICAgICAgICAgICAgICAgRmlsZS5Db3B5KGZpLkZ1bGxOYW1lLCBmaTIuRnVsbE5hbWUpOworCisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBwRG9jID0gUHJlc2VudGF0aW9uRG9jdW1lbnQuT3BlbihmaTIuRnVsbE5hbWUsIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJ0MURhdGEgPSBuZXcgQ2hhcnREYXRhCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcmllc05hbWVzID0gbmV3W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcnVjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlEYXRhVHlwZSA9IENoYXJ0RGF0YVR5cGUuU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlOYW1lcyA9IG5ld1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyA9IG5ldyBkb3VibGVbXVtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwLCAzMTAsIDMyMCwgMzMwLAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxLCAyMjQsIDIzMCwgMjIxLAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgwLCAyMDAsIDIyMCwgMjMwLAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcnRVcGRhdGVyLlVwZGF0ZUNoYXJ0KHBEb2MsIDEsIGNoYXJ0MURhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBUb0V4Y2VsSW50ZWdlcihEYXRlVGltZSBkYXRlVGltZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRhdGVUaW1lLlRvT0FEYXRlKCkuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnRVcGRhdGVyMDEuY3Nwcm9qIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9DaGFydFVwZGF0ZXIwMS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjOTRkOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvQ2hhcnRVcGRhdGVyMDEvQ2hhcnRVcGRhdGVyMDEuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0NoYXJ0VXBkYXRlcjAxL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODg4MWMxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9DaGFydFVwZGF0ZXIwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKQEAgLTAsMCArMSwzIEBACitFeGFtcGxlIG91dHB1dCBmaWxlcyBhcmUgaW4gYSBEYXRlVGltZSBzdGFtcGVkIGRpcmVjdG9yeSBpbiAuL2Jpbi9kZWJ1Zy4gIFRoZSBkaXJlY3RvcnkgbmFtZSBpcyBFeGFtcGxlT3V0cHV0LXl5LW1tLWRkLWhobW1zcy4KKworSWYgeW91IGFyZSBidWlsZGluZyBpbiByZWxlYXNlIG1vZGUsIHRoZXkgd2lsbCwgb2YgY291cnNlLCBiZSBpbiAuL2Jpbi9yZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIvRGF0YS54bWwgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyL0RhdGEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Y2MyMWUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyL0RhdGEueG1sCkBAIC0wLDAgKzEsMTggQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8Q3VzdG9tZXI+CisgIDxDdXN0b21lcklEPjE8L0N1c3RvbWVySUQ+CisgIDxOYW1lPlRhaSBZZWU8L05hbWU+CisgIDxIaWdoVmFsdWVDdXN0b21lcj5UcnVlPC9IaWdoVmFsdWVDdXN0b21lcj4KKyAgPE9yZGVycz4KKyAgICA8T3JkZXIgTnVtYmVyPSIxIj4KKyAgICAgIDxQcm9kdWN0RGVzY3JpcHRpb24+VW5pY3ljbGU8L1Byb2R1Y3REZXNjcmlwdGlvbj4KKyAgICAgIDxRdWFudGl0eT4zPC9RdWFudGl0eT4KKyAgICAgIDxPcmRlckRhdGU+U2VwdGVtYmVyIDUsIDIwMDE8L09yZGVyRGF0ZT4KKyAgICA8L09yZGVyPgorICAgIDxPcmRlciBOdW1iZXI9IjIiPgorICAgICAgPFByb2R1Y3REZXNjcmlwdGlvbj5UcmljeWNsZTwvUHJvZHVjdERlc2NyaXB0aW9uPgorICAgICAgPFF1YW50aXR5Pjg8L1F1YW50aXR5PgorICAgICAgPE9yZGVyRGF0ZT5TZXB0ZW1iZXIgMjYsIDIwMDE8L09yZGVyRGF0ZT4KKyAgICA8L09yZGVyPgorICA8L09yZGVycz4KKzwvQ3VzdG9tZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEFzc2VtYmxlci9Eb2N1bWVudEFzc2VtYmxlci5jcyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIvRG9jdW1lbnRBc3NlbWJsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkODJhMAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIvRG9jdW1lbnRBc3NlbWJsZXIuY3MKQEAgLTAsMCArMSw1NyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhcmdzLkxlbmd0aCAhPSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5FeGl0KDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGaWxlSW5mbyB0ZW1wbGF0ZURvYyA9IG5ldyBGaWxlSW5mbyhhcmdzWzBdKTsKKyAgICAgICAgICAgIGlmICghdGVtcGxhdGVEb2MuRXhpc3RzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciwgezB9IGRvZXMgbm90IGV4aXN0LiIsIGFyZ3NbMF0pOworICAgICAgICAgICAgICAgIFByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5FeGl0KDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZUluZm8gZGF0YUZpbGUgPSBuZXcgRmlsZUluZm8oYXJnc1sxXSk7CisgICAgICAgICAgICBpZiAoIWRhdGFGaWxlLkV4aXN0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3IsIHswfSBkb2VzIG5vdCBleGlzdC4iLCBhcmdzWzFdKTsKKyAgICAgICAgICAgICAgICBQcmludFVzYWdlKCk7CisgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuRXhpdCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGVJbmZvIGFzc2VtYmxlZERvYyA9IG5ldyBGaWxlSW5mbyhhcmdzWzJdKTsKKyAgICAgICAgICAgIGlmIChhc3NlbWJsZWREb2MuRXhpc3RzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciwgezB9IGV4aXN0cy4iLCBhcmdzWzJdKTsKKyAgICAgICAgICAgICAgICBQcmludFVzYWdlKCk7CisgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuRXhpdCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgV21sRG9jdW1lbnQgd21sRG9jID0gbmV3IFdtbERvY3VtZW50KHRlbXBsYXRlRG9jLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIFhFbGVtZW50IGRhdGEgPSBYRWxlbWVudC5Mb2FkKGRhdGFGaWxlLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIGJvb2wgdGVtcGxhdGVFcnJvcjsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHdtbEFzc2VtYmxlZERvYyA9IERvY3VtZW50QXNzZW1ibGVyLkFzc2VtYmxlRG9jdW1lbnQod21sRG9jLCBkYXRhLCBvdXQgdGVtcGxhdGVFcnJvcik7CisgICAgICAgICAgICBpZiAodGVtcGxhdGVFcnJvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3JzIGluIHRlbXBsYXRlLiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTZWUgezB9IHRvIGRldGVybWluZSB0aGUgZXJyb3JzIGluIHRoZSB0ZW1wbGF0ZS4iLCBhc3NlbWJsZWREb2MuTmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdtbEFzc2VtYmxlZERvYy5TYXZlQXMoYXNzZW1ibGVkRG9jLkZ1bGxOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIFByaW50VXNhZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNhZ2U6IERvY3VtZW50QXNzZW1ibGVyIFRlbXBsYXRlRG9jdW1lbnQuZG9jeCBEYXRhLnhtbCBBc3NlbWJsZWREb2MuZG9jeCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEFzc2VtYmxlci9Eb2N1bWVudEFzc2VtYmxlci5jc3Byb2ogYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyL0RvY3VtZW50QXNzZW1ibGVyLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM5NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEFzc2VtYmxlci9Eb2N1bWVudEFzc2VtYmxlci5jc3Byb2oKQEAgLTAsMCArMSwxNSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldDQ1PC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXE9wZW5YbWxQb3dlclRvb2xzXE9wZW5YbWxQb3dlclRvb2xzLmNzcHJvaiIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJEb2N1bWVudEZvcm1hdC5PcGVuWG1sIiBWZXJzaW9uPSIyLjguMSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IldpbmRvd3NCYXNlIiAvPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyL1RlbXBsYXRlRG9jdW1lbnQuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIvVGVtcGxhdGVEb2N1bWVudC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYWJjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyL1RlbXBsYXRlRG9jdW1lbnQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDEvRGF0YS54bWwgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDEvRGF0YS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjYzIxZQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMS9EYXRhLnhtbApAQCAtMCwwICsxLDE4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPEN1c3RvbWVyPgorICA8Q3VzdG9tZXJJRD4xPC9DdXN0b21lcklEPgorICA8TmFtZT5UYWkgWWVlPC9OYW1lPgorICA8SGlnaFZhbHVlQ3VzdG9tZXI+VHJ1ZTwvSGlnaFZhbHVlQ3VzdG9tZXI+CisgIDxPcmRlcnM+CisgICAgPE9yZGVyIE51bWJlcj0iMSI+CisgICAgICA8UHJvZHVjdERlc2NyaXB0aW9uPlVuaWN5Y2xlPC9Qcm9kdWN0RGVzY3JpcHRpb24+CisgICAgICA8UXVhbnRpdHk+MzwvUXVhbnRpdHk+CisgICAgICA8T3JkZXJEYXRlPlNlcHRlbWJlciA1LCAyMDAxPC9PcmRlckRhdGU+CisgICAgPC9PcmRlcj4KKyAgICA8T3JkZXIgTnVtYmVyPSIyIj4KKyAgICAgIDxQcm9kdWN0RGVzY3JpcHRpb24+VHJpY3ljbGU8L1Byb2R1Y3REZXNjcmlwdGlvbj4KKyAgICAgIDxRdWFudGl0eT44PC9RdWFudGl0eT4KKyAgICAgIDxPcmRlckRhdGU+U2VwdGVtYmVyIDI2LCAyMDAxPC9PcmRlckRhdGU+CisgICAgPC9PcmRlcj4KKyAgPC9PcmRlcnM+Cis8L0N1c3RvbWVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMS9Eb2N1bWVudEFzc2VtYmxlcjAxLmNzIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEFzc2VtYmxlcjAxL0RvY3VtZW50QXNzZW1ibGVyMDEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5YzcyMwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMS9Eb2N1bWVudEFzc2VtYmxlcjAxLmNzCkBAIC0wLDAgKzEsMzggQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBuID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgdmFyIHRlbXBEaSA9IG5ldyBEaXJlY3RvcnlJbmZvKHN0cmluZy5Gb3JtYXQoIkV4YW1wbGVPdXRwdXQtezA6MDB9LXsxOjAwfS17MjowMH0tezM6MDB9ezQ6MDB9ezU6MDB9Iiwgbi5ZZWFyIC0gMjAwMCwgbi5Nb250aCwgbi5EYXksIG4uSG91ciwgbi5NaW51dGUsIG4uU2Vjb25kKSk7CisgICAgICAgICAgICB0ZW1wRGkuQ3JlYXRlKCk7CisKKyAgICAgICAgICAgIEZpbGVJbmZvIHRlbXBsYXRlRG9jID0gbmV3IEZpbGVJbmZvKCIuLi8uLi9UZW1wbGF0ZURvY3VtZW50LmRvY3giKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIGRhdGFGaWxlID0gbmV3IEZpbGVJbmZvKCIuLi8uLi9EYXRhLnhtbCIpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCB3bWxEb2MgPSBuZXcgV21sRG9jdW1lbnQodGVtcGxhdGVEb2MuRnVsbE5hbWUpOworICAgICAgICAgICAgWEVsZW1lbnQgZGF0YSA9IFhFbGVtZW50LkxvYWQoZGF0YUZpbGUuRnVsbE5hbWUpOworICAgICAgICAgICAgYm9vbCB0ZW1wbGF0ZUVycm9yOworICAgICAgICAgICAgV21sRG9jdW1lbnQgd21sQXNzZW1ibGVkRG9jID0gRG9jdW1lbnRBc3NlbWJsZXIuQXNzZW1ibGVEb2N1bWVudCh3bWxEb2MsIGRhdGEsIG91dCB0ZW1wbGF0ZUVycm9yKTsKKyAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUVycm9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvcnMgaW4gdGVtcGxhdGUuIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNlZSBBc3NlbWJsZWREb2MuZG9jeCB0byBkZXRlcm1pbmUgdGhlIGVycm9ycyBpbiB0aGUgdGVtcGxhdGUuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZpbGVJbmZvIGFzc2VtYmxlZERvYyA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiQXNzZW1ibGVkRG9jLmRvY3giKSk7CisgICAgICAgICAgICB3bWxBc3NlbWJsZWREb2MuU2F2ZUFzKGFzc2VtYmxlZERvYy5GdWxsTmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDEvRG9jdW1lbnRBc3NlbWJsZXIwMS5jc3Byb2ogYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDEvRG9jdW1lbnRBc3NlbWJsZXIwMS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjOTRkOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMS9Eb2N1bWVudEFzc2VtYmxlcjAxLmNzcHJvagpAQCAtMCwwICsxLDE1IEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0NDU8L1RhcmdldEZyYW1ld29yaz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cT3BlblhtbFBvd2VyVG9vbHNcT3BlblhtbFBvd2VyVG9vbHMuY3Nwcm9qIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkRvY3VtZW50Rm9ybWF0Lk9wZW5YbWwiIFZlcnNpb249IjIuOC4xIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iV2luZG93c0Jhc2UiIC8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODgxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0CkBAIC0wLDAgKzEsMyBAQAorRXhhbXBsZSBvdXRwdXQgZmlsZXMgYXJlIGluIGEgRGF0ZVRpbWUgc3RhbXBlZCBkaXJlY3RvcnkgaW4gLi9iaW4vZGVidWcuICBUaGUgZGlyZWN0b3J5IG5hbWUgaXMgRXhhbXBsZU91dHB1dC15eS1tbS1kZC1oaG1tc3MuCisKK0lmIHlvdSBhcmUgYnVpbGRpbmcgaW4gcmVsZWFzZSBtb2RlLCB0aGV5IHdpbGwsIG9mIGNvdXJzZSwgYmUgaW4gLi9iaW4vcmVsZWFzZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDEvVGVtcGxhdGVEb2N1bWVudC5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEFzc2VtYmxlcjAxL1RlbXBsYXRlRG9jdW1lbnQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTNmYWQwCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEFzc2VtYmxlcjAxL1RlbXBsYXRlRG9jdW1lbnQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDIvQXNzZW1ibGVkRG9jLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDIvQXNzZW1ibGVkRG9jLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3NWUyMgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMi9Bc3NlbWJsZWREb2MuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDIvRGF0YS54bWwgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDIvRGF0YS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjYzIxZQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMi9EYXRhLnhtbApAQCAtMCwwICsxLDE4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPEN1c3RvbWVyPgorICA8Q3VzdG9tZXJJRD4xPC9DdXN0b21lcklEPgorICA8TmFtZT5UYWkgWWVlPC9OYW1lPgorICA8SGlnaFZhbHVlQ3VzdG9tZXI+VHJ1ZTwvSGlnaFZhbHVlQ3VzdG9tZXI+CisgIDxPcmRlcnM+CisgICAgPE9yZGVyIE51bWJlcj0iMSI+CisgICAgICA8UHJvZHVjdERlc2NyaXB0aW9uPlVuaWN5Y2xlPC9Qcm9kdWN0RGVzY3JpcHRpb24+CisgICAgICA8UXVhbnRpdHk+MzwvUXVhbnRpdHk+CisgICAgICA8T3JkZXJEYXRlPlNlcHRlbWJlciA1LCAyMDAxPC9PcmRlckRhdGU+CisgICAgPC9PcmRlcj4KKyAgICA8T3JkZXIgTnVtYmVyPSIyIj4KKyAgICAgIDxQcm9kdWN0RGVzY3JpcHRpb24+VHJpY3ljbGU8L1Byb2R1Y3REZXNjcmlwdGlvbj4KKyAgICAgIDxRdWFudGl0eT44PC9RdWFudGl0eT4KKyAgICAgIDxPcmRlckRhdGU+U2VwdGVtYmVyIDI2LCAyMDAxPC9PcmRlckRhdGU+CisgICAgPC9PcmRlcj4KKyAgPC9PcmRlcnM+Cis8L0N1c3RvbWVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMi9Eb2N1bWVudEFzc2VtYmxlcjAyLmNzIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEFzc2VtYmxlcjAyL0RvY3VtZW50QXNzZW1ibGVyMDIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5YzcyMwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMi9Eb2N1bWVudEFzc2VtYmxlcjAyLmNzCkBAIC0wLDAgKzEsMzggQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBuID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgdmFyIHRlbXBEaSA9IG5ldyBEaXJlY3RvcnlJbmZvKHN0cmluZy5Gb3JtYXQoIkV4YW1wbGVPdXRwdXQtezA6MDB9LXsxOjAwfS17MjowMH0tezM6MDB9ezQ6MDB9ezU6MDB9Iiwgbi5ZZWFyIC0gMjAwMCwgbi5Nb250aCwgbi5EYXksIG4uSG91ciwgbi5NaW51dGUsIG4uU2Vjb25kKSk7CisgICAgICAgICAgICB0ZW1wRGkuQ3JlYXRlKCk7CisKKyAgICAgICAgICAgIEZpbGVJbmZvIHRlbXBsYXRlRG9jID0gbmV3IEZpbGVJbmZvKCIuLi8uLi9UZW1wbGF0ZURvY3VtZW50LmRvY3giKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIGRhdGFGaWxlID0gbmV3IEZpbGVJbmZvKCIuLi8uLi9EYXRhLnhtbCIpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCB3bWxEb2MgPSBuZXcgV21sRG9jdW1lbnQodGVtcGxhdGVEb2MuRnVsbE5hbWUpOworICAgICAgICAgICAgWEVsZW1lbnQgZGF0YSA9IFhFbGVtZW50LkxvYWQoZGF0YUZpbGUuRnVsbE5hbWUpOworICAgICAgICAgICAgYm9vbCB0ZW1wbGF0ZUVycm9yOworICAgICAgICAgICAgV21sRG9jdW1lbnQgd21sQXNzZW1ibGVkRG9jID0gRG9jdW1lbnRBc3NlbWJsZXIuQXNzZW1ibGVEb2N1bWVudCh3bWxEb2MsIGRhdGEsIG91dCB0ZW1wbGF0ZUVycm9yKTsKKyAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUVycm9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvcnMgaW4gdGVtcGxhdGUuIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNlZSBBc3NlbWJsZWREb2MuZG9jeCB0byBkZXRlcm1pbmUgdGhlIGVycm9ycyBpbiB0aGUgdGVtcGxhdGUuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZpbGVJbmZvIGFzc2VtYmxlZERvYyA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiQXNzZW1ibGVkRG9jLmRvY3giKSk7CisgICAgICAgICAgICB3bWxBc3NlbWJsZWREb2MuU2F2ZUFzKGFzc2VtYmxlZERvYy5GdWxsTmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDIvRG9jdW1lbnRBc3NlbWJsZXIwMi5jc3Byb2ogYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDIvRG9jdW1lbnRBc3NlbWJsZXIwMi5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjOTRkOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMi9Eb2N1bWVudEFzc2VtYmxlcjAyLmNzcHJvagpAQCAtMCwwICsxLDE1IEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0NDU8L1RhcmdldEZyYW1ld29yaz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cT3BlblhtbFBvd2VyVG9vbHNcT3BlblhtbFBvd2VyVG9vbHMuY3Nwcm9qIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkRvY3VtZW50Rm9ybWF0Lk9wZW5YbWwiIFZlcnNpb249IjIuOC4xIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iV2luZG93c0Jhc2UiIC8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMi9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDIvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODgxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDIvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0CkBAIC0wLDAgKzEsMyBAQAorRXhhbXBsZSBvdXRwdXQgZmlsZXMgYXJlIGluIGEgRGF0ZVRpbWUgc3RhbXBlZCBkaXJlY3RvcnkgaW4gLi9iaW4vZGVidWcuICBUaGUgZGlyZWN0b3J5IG5hbWUgaXMgRXhhbXBsZU91dHB1dC15eS1tbS1kZC1oaG1tc3MuCisKK0lmIHlvdSBhcmUgYnVpbGRpbmcgaW4gcmVsZWFzZSBtb2RlLCB0aGV5IHdpbGwsIG9mIGNvdXJzZSwgYmUgaW4gLi9iaW4vcmVsZWFzZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDIvVGVtcGxhdGVEb2N1bWVudC5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEFzc2VtYmxlcjAyL1RlbXBsYXRlRG9jdW1lbnQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWU4Yzk5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEFzc2VtYmxlcjAyL1RlbXBsYXRlRG9jdW1lbnQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDMvRG9jdW1lbnRBc3NlbWJsZXIwMy5jcyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMy9Eb2N1bWVudEFzc2VtYmxlcjAzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOGVlMjcKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QXNzZW1ibGVyMDMvRG9jdW1lbnRBc3NlbWJsZXIwMy5jcwpAQCAtMCwwICsxLDgzIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbiA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgIHZhciB0ZW1wRGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhzdHJpbmcuRm9ybWF0KCJFeGFtcGxlT3V0cHV0LXswOjAwfS17MTowMH0tezI6MDB9LXszOjAwfXs0OjAwfXs1OjAwfSIsIG4uWWVhciAtIDIwMDAsIG4uTW9udGgsIG4uRGF5LCBuLkhvdXIsIG4uTWludXRlLCBuLlNlY29uZCkpOworICAgICAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgICAgICBGaWxlSW5mbyB0ZW1wbGF0ZURvYyA9IG5ldyBGaWxlSW5mbygiLi4vLi4vVGVtcGxhdGVEb2N1bWVudC5kb2N4Iik7CisgICAgICAgICAgICBGaWxlSW5mbyBkYXRhRmlsZSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiRGF0YS54bWwiKSk7CisKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kIGdlbmVyYXRlcyBhIGxhcmdlIGRhdGEgZmlsZSB3aXRoIHJhbmRvbSBkYXRhLgorICAgICAgICAgICAgLy8gSW4gYSByZWFsIHdvcmxkIHNjZW5hcmlvLCB0aGlzIGlzIHdoZXJlIHlvdSB3b3VsZCBxdWVyeSB5b3VyIGRhdGEgc291cmNlIGFuZCBwcm9kdWNlIFhNTCB0aGF0IHdpbGwgZHJpdmUgeW91ciBkb2N1bWVudCBnZW5lcmF0aW9uIHByb2Nlc3MuCisgICAgICAgICAgICBYRWxlbWVudCBkYXRhID0gR2VuZXJhdGVEYXRhRnJvbURhdGFTb3VyY2UoZGF0YUZpbGUpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCB3bWxEb2MgPSBuZXcgV21sRG9jdW1lbnQodGVtcGxhdGVEb2MuRnVsbE5hbWUpOworICAgICAgICAgICAgaW50IGNvdW50ID0gMTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjdXN0b21lciBpbiBkYXRhLkVsZW1lbnRzKCJDdXN0b21lciIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGVJbmZvIGFzc2VtYmxlZERvYyA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCBzdHJpbmcuRm9ybWF0KCJMZXR0ZXItezA6MDAwMH0uZG9jeCIsIGNvdW50KyspKSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoYXNzZW1ibGVkRG9jLk5hbWUpOworICAgICAgICAgICAgICAgIGJvb2wgdGVtcGxhdGVFcnJvcjsKKyAgICAgICAgICAgICAgICBXbWxEb2N1bWVudCB3bWxBc3NlbWJsZWREb2MgPSBEb2N1bWVudEFzc2VtYmxlci5Bc3NlbWJsZURvY3VtZW50KHdtbERvYywgY3VzdG9tZXIsIG91dCB0ZW1wbGF0ZUVycm9yKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVFcnJvcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvcnMgaW4gdGVtcGxhdGUuIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTZWUgezB9IHRvIGRldGVybWluZSB0aGUgZXJyb3JzIGluIHRoZSB0ZW1wbGF0ZS4iLCBhc3NlbWJsZWREb2MuTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdtbEFzc2VtYmxlZERvYy5TYXZlQXMoYXNzZW1ibGVkRG9jLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ1tdIHNfcHJvZHVjdE5hbWVzID0gbmV3W10geworICAgICAgICAgICAgIlVuaWN5Y2xlIiwKKyAgICAgICAgICAgICJCaWN5Y2xlIiwKKyAgICAgICAgICAgICJUcmljeWNsZSIsCisgICAgICAgICAgICAiU2thdGVib2FyZCIsCisgICAgICAgICAgICAiUm9sbGVyIEJsYWRlcyIsCisgICAgICAgICAgICAiSGFuZyBHbGlkZXIiLAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IEdlbmVyYXRlRGF0YUZyb21EYXRhU291cmNlKEZpbGVJbmZvIGRhdGFGaSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG51bWJlck9mRG9jdW1lbnRzVG9HZW5lcmF0ZSA9IDUwMDsKKyAgICAgICAgICAgIHZhciBjdXN0b21lcnMgPSBuZXcgWEVsZW1lbnQoIkN1c3RvbWVycyIpOworICAgICAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mRG9jdW1lbnRzVG9HZW5lcmF0ZTsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjdXN0b21lciA9IG5ldyBYRWxlbWVudCgiQ3VzdG9tZXIiLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoIkN1c3RvbWVySUQiLCBpICsgMSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudCgiTmFtZSIsICJFcmljIFdoaXRlIiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudCgiSGlnaFZhbHVlQ3VzdG9tZXIiLCByLk5leHQoMikgPT0gMCA/ICJUcnVlIiA6ICJGYWxzZSIpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoIk9yZGVycyIpKTsKKyAgICAgICAgICAgICAgICB2YXIgb3JkZXJzID0gY3VzdG9tZXIuRWxlbWVudCgiT3JkZXJzIik7CisgICAgICAgICAgICAgICAgaW50IG51bWJlck9mT3JkZXJzID0gci5OZXh0KDEwKSArIDE7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1iZXJPZk9yZGVyczsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG9yZGVyID0gbmV3IFhFbGVtZW50KCJPcmRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgiTnVtYmVyIiwgaiArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KCJQcm9kdWN0RGVzY3JpcHRpb24iLCBzX3Byb2R1Y3ROYW1lc1tyLk5leHQoc19wcm9kdWN0TmFtZXMuTGVuZ3RoKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KCJRdWFudGl0eSIsIHIuTmV4dCgxMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KCJPcmRlckRhdGUiLCAiU2VwdGVtYmVyIDI2LCAyMDE1IikpOworICAgICAgICAgICAgICAgICAgICBvcmRlcnMuQWRkKG9yZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VzdG9tZXJzLkFkZChjdXN0b21lcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXN0b21lcnMuU2F2ZShkYXRhRmkuRnVsbE5hbWUpOworICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWVyczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMy9Eb2N1bWVudEFzc2VtYmxlcjAzLmNzcHJvaiBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMy9Eb2N1bWVudEFzc2VtYmxlcjAzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM5NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEFzc2VtYmxlcjAzL0RvY3VtZW50QXNzZW1ibGVyMDMuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEFzc2VtYmxlcjAzL1RlbXBsYXRlRG9jdW1lbnQuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMy9UZW1wbGF0ZURvY3VtZW50LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2NTU2OQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRBc3NlbWJsZXIwMy9UZW1wbGF0ZURvY3VtZW50LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMS9Eb2N1bWVudEJ1aWxkZXIwMS5jcyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDEvRG9jdW1lbnRCdWlsZGVyMDEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5NGUzOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDEvRG9jdW1lbnRCdWlsZGVyMDEuY3MKQEAgLTAsMCArMSw3MiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlZhbGlkYXRpb247Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKKworbmFtZXNwYWNlIERvY3VtZW50QnVpbGRlckV4YW1wbGUKK3sKKyAgICBjbGFzcyBEb2N1bWVudEJ1aWxkZXJFeGFtcGxlCisgICAgeworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBuID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgdmFyIHRlbXBEaSA9IG5ldyBEaXJlY3RvcnlJbmZvKHN0cmluZy5Gb3JtYXQoIkV4YW1wbGVPdXRwdXQtezA6MDB9LXsxOjAwfS17MjowMH0tezM6MDB9ezQ6MDB9ezU6MDB9Iiwgbi5ZZWFyIC0gMjAwMCwgbi5Nb250aCwgbi5EYXksIG4uSG91ciwgbi5NaW51dGUsIG4uU2Vjb25kKSk7CisgICAgICAgICAgICB0ZW1wRGkuQ3JlYXRlKCk7CisKKyAgICAgICAgICAgIHN0cmluZyBzb3VyY2UxID0gIi4uLy4uL1NvdXJjZTEuZG9jeCI7CisgICAgICAgICAgICBzdHJpbmcgc291cmNlMiA9ICIuLi8uLi9Tb3VyY2UyLmRvY3giOworICAgICAgICAgICAgc3RyaW5nIHNvdXJjZTMgPSAiLi4vLi4vU291cmNlMy5kb2N4IjsKKyAgICAgICAgICAgIExpc3Q8U291cmNlPiBzb3VyY2VzID0gbnVsbDsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBkb2N1bWVudCBmcm9tIDEwIHBhcmFncmFwaHMgc3RhcnRpbmcgYXQgcGFyYWdyYXBoIDUgb2YgU291cmNlMS5kb2N4CisgICAgICAgICAgICBzb3VyY2VzID0gbmV3IExpc3Q8U291cmNlPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMSksIDUsIDEwLCB0cnVlKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIuQnVpbGREb2N1bWVudChzb3VyY2VzLCBQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiT3V0MS5kb2N4IikpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGRvY3VtZW50IGZyb20gcGFyYWdyYXBoIDEsIGFuZCBwYXJhZ3JhcGhzIDUgdGhyb3VnaCBlbmQgb2YgU291cmNlMy5kb2N4LgorICAgICAgICAgICAgLy8gVGhpcyBlZmZlY3RpdmVseSAnZGVsZXRlcycgcGFyYWdyYXBocyAyLTQKKyAgICAgICAgICAgIHNvdXJjZXMgPSBuZXcgTGlzdDxTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChzb3VyY2UzKSwgMCwgMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KHNvdXJjZTMpLCA0LCBmYWxzZSksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyLkJ1aWxkRG9jdW1lbnQoc291cmNlcywgUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIk91dDIuZG9jeCIpKTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRvY3VtZW50IHRoYXQgY29uc2lzdHMgb2YgdGhlIGVudGlyZXR5IG9mIFNvdXJjZTEuZG9jeCBhbmQgU291cmNlMi5kb2N4LiAgVXNlCisgICAgICAgICAgICAvLyB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbiAoaGVhZGluZ3MgYW5kIGZvb3RlcnMpIGZyb20gc291cmNlMS4KKyAgICAgICAgICAgIHNvdXJjZXMgPSBuZXcgTGlzdDxTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChzb3VyY2UxKSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMiksIGZhbHNlKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIuQnVpbGREb2N1bWVudChzb3VyY2VzLCBQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiT3V0My5kb2N4IikpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgZG9jdW1lbnQgdGhhdCBjb25zaXN0cyBvZiB0aGUgZW50aXJldHkgb2YgU291cmNlMS5kb2N4IGFuZCBTb3VyY2UyLmRvY3guICBVc2UKKyAgICAgICAgICAgIC8vIHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uIChoZWFkaW5ncyBhbmQgZm9vdGVycykgZnJvbSBzb3VyY2UyLgorICAgICAgICAgICAgc291cmNlcyA9IG5ldyBMaXN0PFNvdXJjZT4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KHNvdXJjZTEpLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMiksIHRydWUpLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlci5CdWlsZERvY3VtZW50KHNvdXJjZXMsIFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsICJPdXQ0LmRvY3giKSk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBkb2N1bWVudCB0aGF0IGNvbnNpc3RzIG9mIHRoZSBmaXJzdCA1IHBhcmFncmFwaHMgb2YgU291cmNlMS5kb2N4IGFuZCB0aGUgZmlyc3QKKyAgICAgICAgICAgIC8vIGZpdmUgcGFyYWdyYXBocyBvZiBTb3VyY2UyLmRvY3guICBUaGlzIGV4YW1wbGUgcmV0dXJucyBhIG5ldyBXbWxEb2N1bWVudCwgd2hlbiB5b3UgdGhlbiBjYW4KKyAgICAgICAgICAgIC8vIHNlcmlhbGl6ZSB0byBhIFNoYXJlUG9pbnQgZG9jdW1lbnQgbGlicmFyeSwgb3IgdXNlIGluIHNvbWUgb3RoZXIgaW50ZXJlc3Rpbmcgc2NlbmFyaW8uCisgICAgICAgICAgICBzb3VyY2VzID0gbmV3IExpc3Q8U291cmNlPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoc291cmNlMSksIDAsIDUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChzb3VyY2UyKSwgMCwgNSwgdHJ1ZSksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgV21sRG9jdW1lbnQgb3V0NSA9IERvY3VtZW50QnVpbGRlci5CdWlsZERvY3VtZW50KHNvdXJjZXMpOworICAgICAgICAgICAgb3V0NS5TYXZlQXMoUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIk91dDUuZG9jeCIpKTsgIC8vIHNhdmUgaXQgdG8gdGhlIGZpbGUgc3lzdGVtLCBidXQgd2UgY291bGQganVzdCBhcyBlYXNpbHkgZG9uZSBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHdpdGggaXQuCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAxL0RvY3VtZW50QnVpbGRlcjAxLmNzcHJvaiBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDEvRG9jdW1lbnRCdWlsZGVyMDEuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzk0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAxL0RvY3VtZW50QnVpbGRlcjAxLmNzcHJvagpAQCAtMCwwICsxLDE1IEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0NDU8L1RhcmdldEZyYW1ld29yaz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cT3BlblhtbFBvd2VyVG9vbHNcT3BlblhtbFBvd2VyVG9vbHMuY3Nwcm9qIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkRvY3VtZW50Rm9ybWF0Lk9wZW5YbWwiIFZlcnNpb249IjIuOC4xIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iV2luZG93c0Jhc2UiIC8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4ODFjMQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0CkBAIC0wLDAgKzEsMyBAQAorRXhhbXBsZSBvdXRwdXQgZmlsZXMgYXJlIGluIGEgRGF0ZVRpbWUgc3RhbXBlZCBkaXJlY3RvcnkgaW4gLi9iaW4vZGVidWcuICBUaGUgZGlyZWN0b3J5IG5hbWUgaXMgRXhhbXBsZU91dHB1dC15eS1tbS1kZC1oaG1tc3MuCisKK0lmIHlvdSBhcmUgYnVpbGRpbmcgaW4gcmVsZWFzZSBtb2RlLCB0aGV5IHdpbGwsIG9mIGNvdXJzZSwgYmUgaW4gLi9iaW4vcmVsZWFzZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAxL1NvdXJjZTEuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDEvU291cmNlMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjA2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAxL1NvdXJjZTEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAxL1NvdXJjZTIuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDEvU291cmNlMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzZmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAxL1NvdXJjZTIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAxL1NvdXJjZTMuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDEvU291cmNlMy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMTE0NDkKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAxL1NvdXJjZTMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAyL0Fic3RyYWN0LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAyL0Fic3RyYWN0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkYmYxYQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDIvQWJzdHJhY3QuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAyL0F1dGhvckJpb2dyYXBoeS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMi9BdXRob3JCaW9ncmFwaHkuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmI0YWE1Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMi9BdXRob3JCaW9ncmFwaHkuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAyL0RvY3VtZW50QnVpbGRlcjAyLmNzIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMi9Eb2N1bWVudEJ1aWxkZXIwMi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTI5YTM5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMi9Eb2N1bWVudEJ1aWxkZXIwMi5jcwpAQCAtMCwwICsxLDEyOSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKKworLy8gSW5zZXJ0IGNvbnRlbnQgaW50byBhIGRvY3VtZW50CisvLyBEZWxldGUgY29udGVudCBmcm9tIGEgZG9jdW1lbnQKKy8vIFNocmVkIGEgZG9jdW1lbnQKKy8vIEFzc2VtYmxlIGl0IGFnYWluLCBpbnNlcnQgVE9DCisKK2NsYXNzIERvY3VtZW50QnVpbGRlckV4YW1wbGUwMgoreworICAgIHByaXZhdGUgY2xhc3MgRG9jdW1lbnRJbmZvCisgICAgeworICAgICAgICBwdWJsaWMgaW50IERvY3VtZW50TnVtYmVyOworICAgICAgICBwdWJsaWMgaW50IFN0YXJ0OworICAgICAgICBwdWJsaWMgaW50IENvdW50OworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICB7CisgICAgICAgIHZhciBuID0gRGF0ZVRpbWUuTm93OworICAgICAgICB2YXIgdGVtcERpID0gbmV3IERpcmVjdG9yeUluZm8oc3RyaW5nLkZvcm1hdCgiRXhhbXBsZU91dHB1dC17MDowMH0tezE6MDB9LXsyOjAwfS17MzowMH17NDowMH17NTowMH0iLCBuLlllYXIgLSAyMDAwLCBuLk1vbnRoLCBuLkRheSwgbi5Ib3VyLCBuLk1pbnV0ZSwgbi5TZWNvbmQpKTsKKyAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgIC8vIEluc2VydCBhbiBhYnN0cmFjdCBhbmQgYXV0aG9yIGJpb2dyYXBoeSBpbnRvIGEgd2hpdGUgcGFwZXIuCisgICAgICAgIExpc3Q8U291cmNlPiBzb3VyY2VzID0gbnVsbDsKKworICAgICAgICBzb3VyY2VzID0gbmV3IExpc3Q8U291cmNlPigpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KCIuLi8uLi9XaGl0ZVBhcGVyLmRvY3giKSwgMCwgMSwgdHJ1ZSksCisgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudCgiLi4vLi4vQWJzdHJhY3QuZG9jeCIpLCBmYWxzZSksCisgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudCgiLi4vLi4vQXV0aG9yQmlvZ3JhcGh5LmRvY3giKSwgZmFsc2UpLAorICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoIi4uLy4uL1doaXRlUGFwZXIuZG9jeCIpLCAxLCBmYWxzZSksCisgICAgICAgIH07CisgICAgICAgIERvY3VtZW50QnVpbGRlci5CdWlsZERvY3VtZW50KHNvdXJjZXMsIFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsICJBc3NlbWJsZWRQYXBlci5kb2N4IikpOworCisgICAgICAgIC8vIERlbGV0ZSBhbGwgcGFyYWdyYXBocyB3aXRoIGEgc3BlY2lmaWMgc3R5bGUuCisgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYyA9CisgICAgICAgICAgICBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oIi4uLy4uL05vdGVzLmRvY3giLCBmYWxzZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNvdXJjZXMgPSBkb2MKKyAgICAgICAgICAgICAgICAuTWFpbkRvY3VtZW50UGFydAorICAgICAgICAgICAgICAgIC5HZXRYRG9jdW1lbnQoKQorICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgLkVsZW1lbnQoVy5ib2R5KQorICAgICAgICAgICAgICAgIC5FbGVtZW50cygpCisgICAgICAgICAgICAgICAgLlNlbGVjdCgocCwgaSkgPT4gbmV3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQYXJhZ3JhcGggPSBwLAorICAgICAgICAgICAgICAgICAgICBJbmRleCA9IGksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuR3JvdXBBZGphY2VudChwaSA9PiAoc3RyaW5nKXBpLlBhcmFncmFwaAorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5wUHIpCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnBTdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy52YWwpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpICE9ICJOb3RlIikKKyAgICAgICAgICAgICAgICAuV2hlcmUoZyA9PiBnLktleSA9PSB0cnVlKQorICAgICAgICAgICAgICAgIC5TZWxlY3QoZyA9PiBuZXcgU291cmNlKAorICAgICAgICAgICAgICAgICAgICBuZXcgV21sRG9jdW1lbnQoIi4uLy4uL05vdGVzLmRvY3giKSwgZy5GaXJzdCgpLkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgZy5MYXN0KCkuSW5kZXggLSBnLkZpcnN0KCkuSW5kZXggKyAxLCB0cnVlKSkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyLkJ1aWxkRG9jdW1lbnQoc291cmNlcywgUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIk5ld05vdGVzLmRvY3giKSk7CisKKyAgICAgICAgLy8gU2hyZWQgYSBkb2N1bWVudCBpbnRvIG11bHRpcGxlIHBhcnRzIGZvciBlYWNoIHNlY3Rpb24KKyAgICAgICAgTGlzdDxEb2N1bWVudEluZm8+IGRvY3VtZW50TGlzdDsKKyAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jID0KKyAgICAgICAgICAgIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbigiLi4vLi4vU3BlYy5kb2N4IiwgZmFsc2UpKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2VjdGlvbkNvdW50cyA9IGRvYworICAgICAgICAgICAgICAgIC5NYWluRG9jdW1lbnRQYXJ0CisgICAgICAgICAgICAgICAgLkdldFhEb2N1bWVudCgpCisgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAuRWxlbWVudChXLmJvZHkpCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAuUm9sbHVwKDAsIChwaSwgbGFzdCkgPT4gKHN0cmluZylwaQorICAgICAgICAgICAgICAgICAgICAuRWxlbWVudHMoVy5wUHIpCisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50cyhXLnBTdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgLkF0dHJpYnV0ZXMoVy52YWwpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpID09ICJIZWFkaW5nMSIgPyBsYXN0ICsgMSA6IGxhc3QpOworICAgICAgICAgICAgdmFyIGJlZm9yZVppcHBlZCA9IGRvYworICAgICAgICAgICAgICAgIC5NYWluRG9jdW1lbnRQYXJ0CisgICAgICAgICAgICAgICAgLkdldFhEb2N1bWVudCgpCisgICAgICAgICAgICAgICAgLlJvb3QKKyAgICAgICAgICAgICAgICAuRWxlbWVudChXLmJvZHkpCisgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAuU2VsZWN0KChwLCBpKSA9PiBuZXcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBhcmFncmFwaCA9IHAsCisgICAgICAgICAgICAgICAgICAgIEluZGV4ID0gaSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHZhciB6aXBwZWQgPSBQdEV4dGVuc2lvbnMuUHRaaXAoYmVmb3JlWmlwcGVkLCBzZWN0aW9uQ291bnRzLCAocGksIHNjKSA9PiBuZXcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBhcmFncmFwaCA9IHBpLlBhcmFncmFwaCwKKyAgICAgICAgICAgICAgICAgICAgSW5kZXggPSBwaS5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgU2VjdGlvbkluZGV4ID0gc2MsCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBkb2N1bWVudExpc3QgPSB6aXBwZWQKKyAgICAgICAgICAgICAgICAuR3JvdXBBZGphY2VudChwID0+IHAuU2VjdGlvbkluZGV4KQorICAgICAgICAgICAgICAgIC5TZWxlY3QoZyA9PiBuZXcgRG9jdW1lbnRJbmZvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEb2N1bWVudE51bWJlciA9IGcuS2V5LAorICAgICAgICAgICAgICAgICAgICBTdGFydCA9IGcuRmlyc3QoKS5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgQ291bnQgPSBnLkxhc3QoKS5JbmRleCAtIGcuRmlyc3QoKS5JbmRleCArIDEsCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yZWFjaCAodmFyIGRvYyBpbiBkb2N1bWVudExpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBmaWxlTmFtZSA9IFN0cmluZy5Gb3JtYXQoIlNlY3Rpb257MDowMDB9LmRvY3giLCBkb2MuRG9jdW1lbnROdW1iZXIpOworICAgICAgICAgICAgTGlzdDxTb3VyY2U+IGRvY3VtZW50U291cmNlID0gbmV3IExpc3Q8U291cmNlPiB7CisgICAgICAgICAgICAgICAgbmV3IFNvdXJjZShuZXcgV21sRG9jdW1lbnQoIi4uLy4uL1NwZWMuZG9jeCIpLCBkb2MuU3RhcnQsIGRvYy5Db3VudCwgdHJ1ZSkKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIuQnVpbGREb2N1bWVudChkb2N1bWVudFNvdXJjZSwgUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgZmlsZU5hbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlLWFzc2VtYmxlIHRoZSBwYXJ0cyBpbnRvIGEgc2luZ2xlIGRvY3VtZW50LgorICAgICAgICBzb3VyY2VzID0gdGVtcERpCisgICAgICAgICAgICAuR2V0RmlsZXMoIlNlY3Rpb24qLmRvY3giKQorICAgICAgICAgICAgLlNlbGVjdChkID0+IG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KGQuRnVsbE5hbWUpLCB0cnVlKSkKKyAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyLkJ1aWxkRG9jdW1lbnQoc291cmNlcywgUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIlJlYXNzZW1ibGVkU3BlYy5kb2N4IikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDIvRG9jdW1lbnRCdWlsZGVyMDIuY3Nwcm9qIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMi9Eb2N1bWVudEJ1aWxkZXIwMi5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjOTRkOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDIvRG9jdW1lbnRCdWlsZGVyMDIuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMi9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAyL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODg4MWMxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMi9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKQEAgLTAsMCArMSwzIEBACitFeGFtcGxlIG91dHB1dCBmaWxlcyBhcmUgaW4gYSBEYXRlVGltZSBzdGFtcGVkIGRpcmVjdG9yeSBpbiAuL2Jpbi9kZWJ1Zy4gIFRoZSBkaXJlY3RvcnkgbmFtZSBpcyBFeGFtcGxlT3V0cHV0LXl5LW1tLWRkLWhobW1zcy4KKworSWYgeW91IGFyZSBidWlsZGluZyBpbiByZWxlYXNlIG1vZGUsIHRoZXkgd2lsbCwgb2YgY291cnNlLCBiZSBpbiAuL2Jpbi9yZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDIvTm90ZXMuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDIvTm90ZXMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjVmNzkxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMi9Ob3Rlcy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDIvU3BlYy5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMi9TcGVjLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0MDk2MAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDIvU3BlYy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDIvV2hpdGVQYXBlci5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMi9XaGl0ZVBhcGVyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkYmFhYQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDIvV2hpdGVQYXBlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDMvRG9jdW1lbnRCdWlsZGVyMDMuY3MgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAzL0RvY3VtZW50QnVpbGRlcjAzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YzE3NmEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAzL0RvY3VtZW50QnVpbGRlcjAzLmNzCkBAIC0wLDAgKzEsNTQgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5WYWxpZGF0aW9uOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7CisKK2NsYXNzIFByb2dyYW0KK3sKKyAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgeworICAgICAgICB2YXIgbiA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgdmFyIHRlbXBEaSA9IG5ldyBEaXJlY3RvcnlJbmZvKHN0cmluZy5Gb3JtYXQoIkV4YW1wbGVPdXRwdXQtezA6MDB9LXsxOjAwfS17MjowMH0tezM6MDB9ezQ6MDB9ezU6MDB9Iiwgbi5ZZWFyIC0gMjAwMCwgbi5Nb250aCwgbi5EYXksIG4uSG91ciwgbi5NaW51dGUsIG4uU2Vjb25kKSk7CisgICAgICAgIHRlbXBEaS5DcmVhdGUoKTsKKworICAgICAgICBXbWxEb2N1bWVudCBkb2MxID0gbmV3IFdtbERvY3VtZW50KEAiLi5cLi5cVGVtcGxhdGUuZG9jeCIpOworICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1lbSA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtLldyaXRlKGRvYzEuRG9jdW1lbnRCeXRlQXJyYXksIDAsIGRvYzEuRG9jdW1lbnRCeXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihtZW0sIHRydWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhEb2N1bWVudCB4RG9jID0gZG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgZnJvbnRNYXR0ZXJQYXJhID0geERvYy5Sb290LkRlc2NlbmRhbnRzKFcudHhieENvbnRlbnQpLkVsZW1lbnRzKFcucCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBmcm9udE1hdHRlclBhcmEuUmVwbGFjZVdpdGgoCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChQdE9wZW5YbWwuSW5zZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIklkIiwgIkZyb250IikpKTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCB0YmwgPSB4RG9jLlJvb3QuRWxlbWVudChXLmJvZHkpLkVsZW1lbnRzKFcudGJsKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIFhFbGVtZW50IGZpcnN0Q2VsbCA9IHRibC5EZXNjZW5kYW50cyhXLnRyKS5GaXJzdCgpLkRlc2NlbmRhbnRzKFcucCkuRmlyc3QoKTsKKyAgICAgICAgICAgICAgICBmaXJzdENlbGwuUmVwbGFjZVdpdGgoCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChQdE9wZW5YbWwuSW5zZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIklkIiwgIkxpeiIpKSk7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgc2Vjb25kQ2VsbCA9IHRibC5EZXNjZW5kYW50cyhXLnRyKS5Ta2lwKDEpLkZpcnN0KCkuRGVzY2VuZGFudHMoVy5wKS5GaXJzdCgpOworICAgICAgICAgICAgICAgIHNlY29uZENlbGwuUmVwbGFjZVdpdGgoCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChQdE9wZW5YbWwuSW5zZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIklkIiwgIkVyaWMiKSkpOworICAgICAgICAgICAgICAgIGRvYy5NYWluRG9jdW1lbnRQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG9jMS5Eb2N1bWVudEJ5dGVBcnJheSA9IG1lbS5Ub0FycmF5KCk7CisgICAgICAgIH0KKworICAgICAgICBzdHJpbmcgb3V0RmlsZU5hbWUgPSBQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiT3V0LmRvY3giKTsKKyAgICAgICAgTGlzdDxTb3VyY2U+IHNvdXJjZXMgPSBuZXcgTGlzdDxTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKGRvYzEsIHRydWUpLAorICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KEAiLi5cLi5cSW5zZXJ0LTAxLmRvY3giKSwgIkxpeiIpLAorICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UobmV3IFdtbERvY3VtZW50KEAiLi5cLi5cSW5zZXJ0LTAyLmRvY3giKSwgIkVyaWMiKSwKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlKG5ldyBXbWxEb2N1bWVudChAIi4uXC4uXEZyb250TWF0dGVyLmRvY3giKSwgIkZyb250IiksCisgICAgICAgICAgICB9OworICAgICAgICBEb2N1bWVudEJ1aWxkZXIuQnVpbGREb2N1bWVudChzb3VyY2VzLCBvdXRGaWxlTmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMy9Eb2N1bWVudEJ1aWxkZXIwMy5jc3Byb2ogYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAzL0RvY3VtZW50QnVpbGRlcjAzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM5NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMy9Eb2N1bWVudEJ1aWxkZXIwMy5jc3Byb2oKQEAgLTAsMCArMSwxNSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldDQ1PC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXE9wZW5YbWxQb3dlclRvb2xzXE9wZW5YbWxQb3dlclRvb2xzLmNzcHJvaiIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJEb2N1bWVudEZvcm1hdC5PcGVuWG1sIiBWZXJzaW9uPSIyLjguMSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IldpbmRvd3NCYXNlIiAvPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAzL0Zyb250TWF0dGVyLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAzL0Zyb250TWF0dGVyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1NWJjYQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDMvRnJvbnRNYXR0ZXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAzL0luc2VydC0wMS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMy9JbnNlcnQtMDEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzk0ODM3Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMy9JbnNlcnQtMDEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAzL0luc2VydC0wMi5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMy9JbnNlcnQtMDIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTY0NmZiCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMy9JbnNlcnQtMDIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAzL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDMvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODgxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAzL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApAQCAtMCwwICsxLDMgQEAKK0V4YW1wbGUgb3V0cHV0IGZpbGVzIGFyZSBpbiBhIERhdGVUaW1lIHN0YW1wZWQgZGlyZWN0b3J5IGluIC4vYmluL2RlYnVnLiAgVGhlIGRpcmVjdG9yeSBuYW1lIGlzIEV4YW1wbGVPdXRwdXQteXktbW0tZGQtaGhtbXNzLgorCitJZiB5b3UgYXJlIGJ1aWxkaW5nIGluIHJlbGVhc2UgbW9kZSwgdGhleSB3aWxsLCBvZiBjb3Vyc2UsIGJlIGluIC4vYmluL3JlbGVhc2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMy9UZW1wbGF0ZS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwMy9UZW1wbGF0ZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNWQwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjAzL1RlbXBsYXRlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9Eb2N1bWVudEJ1aWxkZXIwNC5jcyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDQvRG9jdW1lbnRCdWlsZGVyMDQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAyODVlMAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDQvRG9jdW1lbnRCdWlsZGVyMDQuY3MKQEAgLTAsMCArMSwxMTAgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOworCituYW1lc3BhY2UgRXhhbXBsZURvY3VtZW50QnVpbGRlcjA0Cit7CisgICAgY2xhc3MgQ29udGVudENvbnRyb2xzRXhhbXBsZQorICAgIHsKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbiA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgIHZhciB0ZW1wRGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhzdHJpbmcuRm9ybWF0KCJFeGFtcGxlT3V0cHV0LXswOjAwfS17MTowMH0tezI6MDB9LXszOjAwfXs0OjAwfXs1OjAwfSIsIG4uWWVhciAtIDIwMDAsIG4uTW9udGgsIG4uRGF5LCBuLkhvdXIsIG4uTWludXRlLCBuLlNlY29uZCkpOworICAgICAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCBzb2xhclN5c3RlbURvYyA9IG5ldyBXbWxEb2N1bWVudCgiLi4vLi4vc29sYXItc3lzdGVtLmRvY3giKTsKKyAgICAgICAgICAgIHVzaW5nIChPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgc3RyZWFtRG9jID0gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudChzb2xhclN5c3RlbURvYykpCisgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBzb2xhclN5c3RlbSA9IHN0cmVhbURvYy5HZXRXb3JkcHJvY2Vzc2luZ0RvY3VtZW50KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IGNoaWxkcmVuIGVsZW1lbnRzIG9mIHRoZSA8dzpib2R5PiBlbGVtZW50CisgICAgICAgICAgICAgICAgdmFyIHExID0gc29sYXJTeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgLk1haW5Eb2N1bWVudFBhcnQKKyAgICAgICAgICAgICAgICAgICAgLkdldFhEb2N1bWVudCgpCisgICAgICAgICAgICAgICAgICAgIC5Sb290CisgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50KFcuYm9keSkKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCk7CisKKyAgICAgICAgICAgICAgICAvLyBwcm9qZWN0IGNvbGxlY3Rpb24gb2YgdHVwbGVzIGNvbnRhaW5pbmcgZWxlbWVudCBhbmQgdHlwZQorICAgICAgICAgICAgICAgIHZhciBxMiA9IHExCisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoCisgICAgICAgICAgICAgICAgICAgICAgICBlID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtleUZvckdyb3VwQWRqYWNlbnQgPSAiLk5vbkNvbnRlbnRDb250cm9sIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5OYW1lID09IFcuc2R0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlGb3JHcm91cEFkamFjZW50ID0gZS5FbGVtZW50KFcuc2R0UHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudChXLnRhZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGUoVy52YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuTmFtZSA9PSBXLnNlY3RQcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Rm9yR3JvdXBBZGphY2VudCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCA9IGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUZvckdyb3VwQWRqYWNlbnQgPSBrZXlGb3JHcm91cEFkamFjZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKS5XaGVyZShlID0+IGUuS2V5Rm9yR3JvdXBBZGphY2VudCAhPSBudWxsKTsKKworICAgICAgICAgICAgICAgIC8vIGdyb3VwIGJ5IHR5cGUKKyAgICAgICAgICAgICAgICB2YXIgcTMgPSBxMi5Hcm91cEFkamFjZW50KGUgPT4gZS5LZXlGb3JHcm91cEFkamFjZW50KTsKKworICAgICAgICAgICAgICAgIC8vIHRlbXBvcmFyeSBjb2RlIHRvIGR1bXAgcTMKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZyBpbiBxMykKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInswfTogIHsxfSIsIGcuS2V5LCBnLkNvdW50KCkpOworICAgICAgICAgICAgICAgIC8vRW52aXJvbm1lbnQuRXhpdCgwKTsKKworCisgICAgICAgICAgICAgICAgLy8gdmFsaWRhdGUgZXhpc3RlbmNlIG9mIGZpbGVzIHJlZmVyZW5jZWQgaW4gY29udGVudCBjb250cm9scworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmIGluIHEzLldoZXJlKGcgPT4gZy5LZXkgIT0gIi5Ob25Db250ZW50Q29udHJvbCIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpbGVuYW1lID0gIi4uLy4uLyIgKyBmLktleSArICIuZG9jeCI7CisgICAgICAgICAgICAgICAgICAgIEZpbGVJbmZvIGZpID0gbmV3IEZpbGVJbmZvKGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmaS5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ7MH0gZG9lc24ndCBleGlzdC4iLCBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5FeGl0KDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcHJvamVjdCBjb2xsZWN0aW9uIHdpdGggb3BlbmVkIFdvcmRQcm9jZXNzaW5nRG9jdW1lbnQKKyAgICAgICAgICAgICAgICB2YXIgcTQgPSBxMworICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGcgPT4gbmV3CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwID0gZywKKyAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50ID0gZy5LZXkgIT0gIi5Ob25Db250ZW50Q29udHJvbCIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXbWxEb2N1bWVudCgiLi4vLi4vIiArIGcuS2V5ICsgIi5kb2N4IikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbGFyU3lzdGVtRG9jCisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgLy8gcHJvamVjdCBjb2xsZWN0aW9uIG9mIE9wZW5YbWwuUG93ZXJUb29scy5Tb3VyY2UKKyAgICAgICAgICAgICAgICB2YXIgc291cmNlcyA9IHE0CisgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoCisgICAgICAgICAgICAgICAgICAgICAgICBnID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuR3JvdXAuS2V5ID09ICIuTm9uQ29udGVudENvbnRyb2wiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLkdyb3VwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FbGVtZW50c0JlZm9yZVNlbGYoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Db3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5Hcm91cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Db3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2UoZy5Eb2N1bWVudCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICApLlRvTGlzdCgpOworCisgICAgICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyLkJ1aWxkRG9jdW1lbnQoc291cmNlcywgUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgInNvbGFyLXN5c3RlbS1uZXcuZG9jeCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDQvRG9jdW1lbnRCdWlsZGVyMDQuY3Nwcm9qIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9Eb2N1bWVudEJ1aWxkZXIwNC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjOTRkOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDQvRG9jdW1lbnRCdWlsZGVyMDQuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9FYXJ0aC5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9FYXJ0aC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOGY0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjA0L0VhcnRoLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9KdXBpdGVyLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjA0L0p1cGl0ZXIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWVlMzExCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9KdXBpdGVyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9NYXJzLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjA0L01hcnMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTBiYTM2Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9NYXJzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9NZXJjdXJ5LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjA0L01lcmN1cnkuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDZmMjI4Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9NZXJjdXJ5LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9OZXB0dW5lLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjA0L05lcHR1bmUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGExOTZlCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9OZXB0dW5lLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjA0L05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODg4MWMxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKQEAgLTAsMCArMSwzIEBACitFeGFtcGxlIG91dHB1dCBmaWxlcyBhcmUgaW4gYSBEYXRlVGltZSBzdGFtcGVkIGRpcmVjdG9yeSBpbiAuL2Jpbi9kZWJ1Zy4gIFRoZSBkaXJlY3RvcnkgbmFtZSBpcyBFeGFtcGxlT3V0cHV0LXl5LW1tLWRkLWhobW1zcy4KKworSWYgeW91IGFyZSBidWlsZGluZyBpbiByZWxlYXNlIG1vZGUsIHRoZXkgd2lsbCwgb2YgY291cnNlLCBiZSBpbiAuL2Jpbi9yZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDQvUGx1dG8uZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDQvUGx1dG8uZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2U5OTg3Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9QbHV0by5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDQvU2F0dXJuLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjA0L1NhdHVybi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYjhjMzcKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjA0L1NhdHVybi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDQvU29sYXJPdmVydmlldy5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9Tb2xhck92ZXJ2aWV3LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwOTNkOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDQvU29sYXJPdmVydmlldy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDQvU3VuLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjA0L1N1bi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxN2M0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjA0L1N1bi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDQvVXJhbnVzLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjA0L1VyYW51cy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYzBhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjA0L1VyYW51cy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDQvVmVudXMuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDQvVmVudXMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODlmNWZhCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Eb2N1bWVudEJ1aWxkZXIwNC9WZW51cy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRG9jdW1lbnRCdWlsZGVyMDQvc29sYXItc3lzdGVtLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjA0L3NvbGFyLXN5c3RlbS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OGJiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0RvY3VtZW50QnVpbGRlcjA0L3NvbGFyLXN5c3RlbS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRmllbGRSZXRyaWV2ZXIwMS9Eb2NXaXRoRm9vdGVyMS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9GaWVsZFJldHJpZXZlcjAxL0RvY1dpdGhGb290ZXIxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwNmMyMwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRmllbGRSZXRyaWV2ZXIwMS9Eb2NXaXRoRm9vdGVyMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRmllbGRSZXRyaWV2ZXIwMS9Eb2NXaXRoRm9vdGVyMi5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9GaWVsZFJldHJpZXZlcjAxL0RvY1dpdGhGb290ZXIyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1OTc1ZQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRmllbGRSZXRyaWV2ZXIwMS9Eb2NXaXRoRm9vdGVyMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRmllbGRSZXRyaWV2ZXIwMS9GaWVsZFJldHJpZXZlcjAxLmNzIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9GaWVsZFJldHJpZXZlcjAxL0ZpZWxkUmV0cmlldmVyMDEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhMmE5NgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRmllbGRSZXRyaWV2ZXIwMS9GaWVsZFJldHJpZXZlcjAxLmNzCkBAIC0wLDAgKzEsOTIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7CisKK2NsYXNzIEZpZWxkUmV0cmlldmVyMDEKK3sKKyAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgeworICAgICAgICB2YXIgbiA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgdmFyIHRlbXBEaSA9IG5ldyBEaXJlY3RvcnlJbmZvKHN0cmluZy5Gb3JtYXQoIkV4YW1wbGVPdXRwdXQtezA6MDB9LXsxOjAwfS17MjowMH0tezM6MDB9ezQ6MDB9ezU6MDB9Iiwgbi5ZZWFyIC0gMjAwMCwgbi5Nb250aCwgbi5EYXksIG4uSG91ciwgbi5NaW51dGUsIG4uU2Vjb25kKSk7CisgICAgICAgIHRlbXBEaS5DcmVhdGUoKTsKKworICAgICAgICB2YXIgZG9jV2l0aEZvb3RlciA9IG5ldyBGaWxlSW5mbygiLi4vLi4vRG9jV2l0aEZvb3RlcjEuZG9jeCIpOworICAgICAgICB2YXIgc2NydWJiZWREb2N1bWVudCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiRG9jV2l0aEZvb3RlclNjcnViYmVkMS5kb2N4IikpOworICAgICAgICBGaWxlLkNvcHkoZG9jV2l0aEZvb3Rlci5GdWxsTmFtZSwgc2NydWJiZWREb2N1bWVudC5GdWxsTmFtZSk7CisgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oc2NydWJiZWREb2N1bWVudC5GdWxsTmFtZSwgdHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjcnViRm9vdGVyKHdEb2MsIG5ldyBbXSB7ICJQQUdFIiB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGRvY1dpdGhGb290ZXIgPSBuZXcgRmlsZUluZm8oIi4uLy4uL0RvY1dpdGhGb290ZXIyLmRvY3giKTsKKyAgICAgICAgc2NydWJiZWREb2N1bWVudCA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiRG9jV2l0aEZvb3RlclNjcnViYmVkMi5kb2N4IikpOworICAgICAgICBGaWxlLkNvcHkoZG9jV2l0aEZvb3Rlci5GdWxsTmFtZSwgc2NydWJiZWREb2N1bWVudC5GdWxsTmFtZSk7CisgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oc2NydWJiZWREb2N1bWVudC5GdWxsTmFtZSwgdHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjcnViRm9vdGVyKHdEb2MsIG5ld1tdIHsgIlBBR0UiLCAiREFURSIgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFNjcnViRm9vdGVyKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYywgc3RyaW5nW10gZmllbGRUeXBlc1RvS2VlcCkKKyAgICB7CisgICAgICAgIGZvcmVhY2ggKHZhciBmb290ZXIgaW4gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LkZvb3RlclBhcnRzKQorICAgICAgICB7CisgICAgICAgICAgICBGaWVsZFJldHJpZXZlci5Bbm5vdGF0ZVdpdGhGaWVsZEluZm8oZm9vdGVyKTsKKyAgICAgICAgICAgIFhFbGVtZW50IHJvb3QgPSBmb290ZXIuR2V0WERvY3VtZW50KCkuUm9vdDsKKyAgICAgICAgICAgIFJlbW92ZUFsbEJ1dFNwZWNpZmljRmllbGRzKHJvb3QsIGZpZWxkVHlwZXNUb0tlZXApOworICAgICAgICAgICAgZm9vdGVyLlB1dFhEb2N1bWVudCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZW1vdmVBbGxCdXRTcGVjaWZpY0ZpZWxkcyhYRWxlbWVudCByb290LCBzdHJpbmdbXSBmaWVsZFR5cGVzVG9SZXRhaW4pCisgICAgeworICAgICAgICB2YXIgY2FjaGVkQW5ub3RhdGlvbkluZm9ybWF0aW9uID0gcm9vdC5Bbm5vdGF0aW9uPERpY3Rpb25hcnk8aW50LCBMaXN0PFhFbGVtZW50Pj4+KCk7CisgICAgICAgIExpc3Q8WEVsZW1lbnQ+IHJ1bnNUb0tlZXAgPSBuZXcgTGlzdDxYRWxlbWVudD4oKTsKKyAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gY2FjaGVkQW5ub3RhdGlvbkluZm9ybWF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcnVuc0ZvckZpZWxkID0gcm9vdAorICAgICAgICAgICAgICAgIC5EZXNjZW5kYW50cygpCisgICAgICAgICAgICAgICAgLldoZXJlKGQgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YWNrPEZpZWxkUmV0cmlldmVyLkZpZWxkRWxlbWVudFR5cGVJbmZvPiBzdGFjayA9IGQuQW5ub3RhdGlvbjxTdGFjazxGaWVsZFJldHJpZXZlci5GaWVsZEVsZW1lbnRUeXBlSW5mbz4+KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjayA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2suQW55KHN0YWNrSXRlbSA9PiBzdGFja0l0ZW0uSWQgPT0gaXRlbS5LZXkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5TZWxlY3QoZCA9PiBkLkFuY2VzdG9yc0FuZFNlbGYoVy5yKS5GaXJzdE9yRGVmYXVsdCgpKQorICAgICAgICAgICAgICAgIC5Hcm91cEFkamFjZW50KG8gPT4gbykKKyAgICAgICAgICAgICAgICAuU2VsZWN0KGcgPT4gZy5GaXJzdCgpKQorICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciByIGluIHJ1bnNGb3JGaWVsZCkKKyAgICAgICAgICAgICAgICBydW5zVG9LZWVwLkFkZChyKTsKKyAgICAgICAgfQorICAgICAgICBmb3JlYWNoICh2YXIgcGFyYWdyYXBoIGluIHJvb3QuRGVzY2VuZGFudHMoVy5wKS5Ub0xpc3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcmFncmFwaC5FbGVtZW50cyhXLnIpLkFueShyID0+IHJ1bnNUb0tlZXAuQ29udGFpbnMocikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcmFncmFwaC5FbGVtZW50cyhXLnIpCisgICAgICAgICAgICAgICAgICAgIC5XaGVyZShyID0+ICFydW5zVG9LZWVwLkNvbnRhaW5zKHIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhci5FbGVtZW50cyhXLnRhYikuQW55KCkpCisgICAgICAgICAgICAgICAgICAgIC5SZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBwYXJhZ3JhcGguRWxlbWVudHMoVy5yKQorICAgICAgICAgICAgICAgICAgICAuV2hlcmUociA9PiAhcnVuc1RvS2VlcC5Db250YWlucyhyKSkKKyAgICAgICAgICAgICAgICAgICAgLkVsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgLldoZXJlKHJjID0+IHJjLk5hbWUgIT0gVy5yUHIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjLk5hbWUgIT0gVy50YWIpCisgICAgICAgICAgICAgICAgICAgIC5SZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXJhZ3JhcGguUmVtb3ZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcm9vdC5EZXNjZW5kYW50cyhXLnRibCkuUmVtb3ZlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9GaWVsZFJldHJpZXZlcjAxL0ZpZWxkUmV0cmlldmVyMDEuY3Nwcm9qIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9GaWVsZFJldHJpZXZlcjAxL0ZpZWxkUmV0cmlldmVyMDEuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzk0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0ZpZWxkUmV0cmlldmVyMDEvRmllbGRSZXRyaWV2ZXIwMS5jc3Byb2oKQEAgLTAsMCArMSwxNSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldDQ1PC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXE9wZW5YbWxQb3dlclRvb2xzXE9wZW5YbWxQb3dlclRvb2xzLmNzcHJvaiIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJEb2N1bWVudEZvcm1hdC5PcGVuWG1sIiBWZXJzaW9uPSIyLjguMSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IldpbmRvd3NCYXNlIiAvPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0ZpZWxkUmV0cmlldmVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9GaWVsZFJldHJpZXZlcjAxL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODg4MWMxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9GaWVsZFJldHJpZXZlcjAxL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApAQCAtMCwwICsxLDMgQEAKK0V4YW1wbGUgb3V0cHV0IGZpbGVzIGFyZSBpbiBhIERhdGVUaW1lIHN0YW1wZWQgZGlyZWN0b3J5IGluIC4vYmluL2RlYnVnLiAgVGhlIGRpcmVjdG9yeSBuYW1lIGlzIEV4YW1wbGVPdXRwdXQteXktbW0tZGQtaGhtbXNzLgorCitJZiB5b3UgYXJlIGJ1aWxkaW5nIGluIHJlbGVhc2UgbW9kZSwgdGhleSB3aWxsLCBvZiBjb3Vyc2UsIGJlIGluIC4vYmluL3JlbGVhc2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Gb3JtYXR0aW5nQXNzZW1ibGVyMDEvRm9ybWF0dGluZ0Fzc2VtYmxlcjAxLmNzIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Gb3JtYXR0aW5nQXNzZW1ibGVyMDEvRm9ybWF0dGluZ0Fzc2VtYmxlcjAxLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTI1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0Zvcm1hdHRpbmdBc3NlbWJsZXIwMS9Gb3JtYXR0aW5nQXNzZW1ibGVyMDEuY3MKQEAgLTAsMCArMSw0MSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKKworbmFtZXNwYWNlIEZvcm1hdHRpbmdBc3NlbWJsZXIwMQoreworICAgIGNsYXNzIEZvcm1hdHRpbmdBc3NlbWJsZXIwMQorICAgIHsKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbiA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgIHZhciB0ZW1wRGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhzdHJpbmcuRm9ybWF0KCJFeGFtcGxlT3V0cHV0LXswOjAwfS17MTowMH0tezI6MDB9LXszOjAwfXs0OjAwfXs1OjAwfSIsIG4uWWVhciAtIDIwMDAsIG4uTW9udGgsIG4uRGF5LCBuLkhvdXIsIG4uTWludXRlLCBuLlNlY29uZCkpOworICAgICAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgICAgICBEaXJlY3RvcnlJbmZvIGRpID0gbmV3IERpcmVjdG9yeUluZm8oIi4uLy4uLyIpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZpbGUgaW4gZGkuR2V0RmlsZXMoIiouZG9jeCIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGZpbGUuTmFtZSk7CisgICAgICAgICAgICAgICAgdmFyIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgZmlsZS5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIm91dC5kb2N4IikpKTsKKyAgICAgICAgICAgICAgICBGaWxlLkNvcHkoZmlsZS5GdWxsTmFtZSwgbmV3RmlsZS5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihuZXdGaWxlLkZ1bGxOYW1lLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZvcm1hdHRpbmdBc3NlbWJsZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBGb3JtYXR0aW5nQXNzZW1ibGVyU2V0dGluZ3MoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDbGVhclN0eWxlcyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVTdHlsZU5hbWVzRnJvbVBhcmFncmFwaEFuZFJ1blByb3BlcnRpZXMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlSHRtbENvbnZlcnRlckFubm90YXRpb25BdHRyaWJ1dGVzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9yZGVyRWxlbWVudHNQZXJTdGFuZGFyZCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN0cmljdFRvU3VwcG9ydGVkTGFuZ3VhZ2VzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RyaWN0VG9TdXBwb3J0ZWROdW1iZXJpbmdGb3JtYXRzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGluZ0Fzc2VtYmxlci5Bc3NlbWJsZUZvcm1hdHRpbmcod0RvYywgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybWF0dGluZ0Fzc2VtYmxlcjAxL0Zvcm1hdHRpbmdBc3NlbWJsZXIwMS5jc3Byb2ogYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0Zvcm1hdHRpbmdBc3NlbWJsZXIwMS9Gb3JtYXR0aW5nQXNzZW1ibGVyMDEuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzk0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0Zvcm1hdHRpbmdBc3NlbWJsZXIwMS9Gb3JtYXR0aW5nQXNzZW1ibGVyMDEuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Gb3JtYXR0aW5nQXNzZW1ibGVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Gb3JtYXR0aW5nQXNzZW1ibGVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODgxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0Zvcm1hdHRpbmdBc3NlbWJsZXIwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKQEAgLTAsMCArMSwzIEBACitFeGFtcGxlIG91dHB1dCBmaWxlcyBhcmUgaW4gYSBEYXRlVGltZSBzdGFtcGVkIGRpcmVjdG9yeSBpbiAuL2Jpbi9kZWJ1Zy4gIFRoZSBkaXJlY3RvcnkgbmFtZSBpcyBFeGFtcGxlT3V0cHV0LXl5LW1tLWRkLWhobW1zcy4KKworSWYgeW91IGFyZSBidWlsZGluZyBpbiByZWxlYXNlIG1vZGUsIHRoZXkgd2lsbCwgb2YgY291cnNlLCBiZSBpbiAuL2Jpbi9yZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybWF0dGluZ0Fzc2VtYmxlcjAxL1Rlc3QwMS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Gb3JtYXR0aW5nQXNzZW1ibGVyMDEvVGVzdDAxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlNGRkMQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybWF0dGluZ0Fzc2VtYmxlcjAxL1Rlc3QwMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybWF0dGluZ0Fzc2VtYmxlcjAxL1Rlc3QwMi5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Gb3JtYXR0aW5nQXNzZW1ibGVyMDEvVGVzdDAyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliMzNjZAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybWF0dGluZ0Fzc2VtYmxlcjAxL1Rlc3QwMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybWF0dGluZ0Fzc2VtYmxlcjAxL1Rlc3QwMy5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Gb3JtYXR0aW5nQXNzZW1ibGVyMDEvVGVzdDAzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0NTI0OQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybWF0dGluZ0Fzc2VtYmxlcjAxL1Rlc3QwMy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybXVsYXMwMS9Gb3JtdWxhcy54bHN4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Gb3JtdWxhczAxL0Zvcm11bGFzLnhsc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzNWQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybXVsYXMwMS9Gb3JtdWxhcy54bHN4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybXVsYXMwMS9Gb3JtdWxhczAxLmNzIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Gb3JtdWxhczAxL0Zvcm11bGFzMDEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlNTkwMwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybXVsYXMwMS9Gb3JtdWxhczAxLmNzCkBAIC0wLDAgKzEsNDQgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIEV4Y2VsRm9ybXVsYTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7CisKK25hbWVzcGFjZSBFeGFtcGxlRm9ybXVsYXMKK3sKKyAgICBjbGFzcyBFeGFtcGxlRm9ybXVsYXMKKyAgICB7CisgICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG4gPSBEYXRlVGltZS5Ob3c7CisgICAgICAgICAgICB2YXIgdGVtcERpID0gbmV3IERpcmVjdG9yeUluZm8oc3RyaW5nLkZvcm1hdCgiRXhhbXBsZU91dHB1dC17MDowMH0tezE6MDB9LXsyOjAwfS17MzowMH17NDowMH17NTowMH0iLCBuLlllYXIgLSAyMDAwLCBuLk1vbnRoLCBuLkRheSwgbi5Ib3VyLCBuLk1pbnV0ZSwgbi5TZWNvbmQpKTsKKyAgICAgICAgICAgIHRlbXBEaS5DcmVhdGUoKTsKKworICAgICAgICAgICAgLy8gQ2hhbmdlIHNoZWV0IG5hbWUgaW4gZm9ybXVsYXMKKyAgICAgICAgICAgIHVzaW5nIChPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgc3RyZWFtRG9jID0gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCgKKyAgICAgICAgICAgICAgICBTbWxEb2N1bWVudC5Gcm9tRmlsZU5hbWUoIi4uLy4uL0Zvcm11bGFzLnhsc3giKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFNwcmVhZHNoZWV0RG9jdW1lbnQgZG9jID0gc3RyZWFtRG9jLkdldFNwcmVhZHNoZWV0RG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldEFjY2Vzc29yLkZvcm11bGFSZXBsYWNlU2hlZXROYW1lKGRvYywgIlNvdXJjZSIsICInU291cmNlIDInIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmVhbURvYy5HZXRNb2RpZmllZFNtbERvY3VtZW50KCkuU2F2ZUFzKFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsICJGb3JtdWxhc1VwZGF0ZWQueGxzeCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hhbmdlIHNoZWV0IG5hbWUgaW4gZm9ybXVsYXMKKyAgICAgICAgICAgIHVzaW5nIChPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgc3RyZWFtRG9jID0gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCgKKyAgICAgICAgICAgICAgICBTbWxEb2N1bWVudC5Gcm9tRmlsZU5hbWUoIi4uLy4uL0Zvcm11bGFzLnhsc3giKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFNwcmVhZHNoZWV0RG9jdW1lbnQgZG9jID0gc3RyZWFtRG9jLkdldFNwcmVhZHNoZWV0RG9jdW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldFBhcnQgc2hlZXQgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRXb3Jrc2hlZXQoZG9jLCAiUmVmZXJlbmNlcyIpOworICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXRBY2Nlc3Nvci5Db3B5Q2VsbFJhbmdlKGRvYywgc2hlZXQsIDEsIDEsIDcsIDUsIDQsIDgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJlYW1Eb2MuR2V0TW9kaWZpZWRTbWxEb2N1bWVudCgpLlNhdmVBcyhQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiRm9ybXVsYXNDb3BpZWQueGxzeCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybXVsYXMwMS9Gb3JtdWxhczAxLmNzcHJvaiBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybXVsYXMwMS9Gb3JtdWxhczAxLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM5NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Gb3JtdWxhczAxL0Zvcm11bGFzMDEuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Gb3JtdWxhczAxL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybXVsYXMwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4ODFjMQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvRm9ybXVsYXMwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKQEAgLTAsMCArMSwzIEBACitFeGFtcGxlIG91dHB1dCBmaWxlcyBhcmUgaW4gYSBEYXRlVGltZSBzdGFtcGVkIGRpcmVjdG9yeSBpbiAuL2Jpbi9kZWJ1Zy4gIFRoZSBkaXJlY3RvcnkgbmFtZSBpcyBFeGFtcGxlT3V0cHV0LXl5LW1tLWRkLWhobW1zcy4KKworSWYgeW91IGFyZSBidWlsZGluZyBpbiByZWxlYXNlIG1vZGUsIHRoZXkgd2lsbCwgb2YgY291cnNlLCBiZSBpbiAuL2Jpbi9yZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxLzVEYXlUb3VyUGxhblRlbXBsYXRlLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS81RGF5VG91clBsYW5UZW1wbGF0ZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDc2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS81RGF5VG91clBsYW5UZW1wbGF0ZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL0NvbnRyYWN0LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9Db250cmFjdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YTg5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9Db250cmFjdC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL0hlYnJldy0wMS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sQ29udmVydGVyMDEvSGVicmV3LTAxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4OTIwMAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL0hlYnJldy0wMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL0hlYnJldy0wMi5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sQ29udmVydGVyMDEvSGVicmV3LTAyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4MGQ2NwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL0hlYnJldy0wMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL0h0bWxDb252ZXJ0ZXIwMS5jcyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL0h0bWxDb252ZXJ0ZXIwMS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjc3N2U4Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sQ29udmVydGVyMDEvSHRtbENvbnZlcnRlcjAxLmNzCkBAIC0wLDAgKzEsMTY3IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTAuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZQorY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTVBPUlRBTlQgTk9URToKKyAqIAorICogV2l0aCB2ZXJzaW9ucyA0LjEgYW5kIGxhdGVyLCB0aGUgbmFtZSBvZiB0aGUgSHRtbENvbnZlcnRlciBjbGFzcyBoYXMgYmVlbgorICogY2hhbmdlZCB0byBXbWxUb0h0bWxDb252ZXJ0ZXIsIHRvIG1ha2UgaXQgb3J0aG9nb25hbCB3aXRoIEh0bWxUb1dtbENvbnZlcnRlci4KKyAqIAorICogVGhlcmUgYXJlIHRoaW4gd3JhcHBlciBjbGFzc2VzLCBIdG1sQ29udmVydGVyLCBhbmQgSHRtbENvbnZlcnRlclNldHRpbmdzLAorICogd2hpY2ggbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdCBmb3IgY29kZSB0aGF0IHVzZXMgdGhlIG9sZCBuYW1lLgorICogCisgKiBPdGhlciB0aGFuIHRoZSBuYW1lIGNoYW5nZSBvZiB0aGUgY2xhc3NlcyB0aGVtc2VsdmVzLCB0aGUgZnVuY3Rpb25hbGl0eQorICogaW4gV21sVG9IdG1sQ29udmVydGVyIGlzIGlkZW50aWNhbCB0byB0aGUgb2xkIEh0bWxDb252ZXJ0ZXIgY2xhc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nLkltYWdpbmc7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKKworY2xhc3MgSHRtbENvbnZlcnRlckhlbHBlcgoreworICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICB7CisgICAgICAgIHZhciBuID0gRGF0ZVRpbWUuTm93OworICAgICAgICB2YXIgdGVtcERpID0gbmV3IERpcmVjdG9yeUluZm8oc3RyaW5nLkZvcm1hdCgiRXhhbXBsZU91dHB1dC17MDowMH0tezE6MDB9LXsyOjAwfS17MzowMH17NDowMH17NTowMH0iLCBuLlllYXIgLSAyMDAwLCBuLk1vbnRoLCBuLkRheSwgbi5Ib3VyLCBuLk1pbnV0ZSwgbi5TZWNvbmQpKTsKKyAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFRoaXMgZXhhbXBsZSBsb2FkcyBlYWNoIGRvY3VtZW50IGludG8gYSBieXRlIGFycmF5LCB0aGVuIGludG8gYSBtZW1vcnkgc3RyZWFtLCBzbyB0aGF0IHRoZSBkb2N1bWVudCBjYW4gYmUgb3BlbmVkIGZvciB3cml0aW5nIHdpdGhvdXQKKyAgICAgICAgICogbW9kaWZ5aW5nIHRoZSBzb3VyY2UgZG9jdW1lbnQuCisgICAgICAgICAqLworICAgICAgICBmb3JlYWNoICh2YXIgZmlsZSBpbiBEaXJlY3RvcnkuR2V0RmlsZXMoIi4uLy4uLyIsICIqLmRvY3giKSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29udmVydFRvSHRtbChmaWxlLCB0ZW1wRGkuRnVsbE5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIENvbnZlcnRUb0h0bWwoc3RyaW5nIGZpbGUsIHN0cmluZyBvdXRwdXREaXJlY3RvcnkpCisgICAgeworICAgICAgICB2YXIgZmkgPSBuZXcgRmlsZUluZm8oZmlsZSk7CisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGZpLk5hbWUpOworICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0gRmlsZS5SZWFkQWxsQnl0ZXMoZmkuRnVsbE5hbWUpOworICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1lbW9yeVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtb3J5U3RyZWFtLldyaXRlKGJ5dGVBcnJheSwgMCwgYnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1lbW9yeVN0cmVhbSwgdHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRlc3RGaWxlTmFtZSA9IG5ldyBGaWxlSW5mbyhmaS5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi5odG1sIikpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXREaXJlY3RvcnkgIT0gbnVsbCAmJiBvdXRwdXREaXJlY3RvcnkgIT0gc3RyaW5nLkVtcHR5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5SW5mbyBkaSA9IG5ldyBEaXJlY3RvcnlJbmZvKG91dHB1dERpcmVjdG9yeSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZGkuRXhpc3RzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIk91dHB1dCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZXN0RmlsZU5hbWUgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKGRpLkZ1bGxOYW1lLCBkZXN0RmlsZU5hbWUuTmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgaW1hZ2VEaXJlY3RvcnlOYW1lID0gZGVzdEZpbGVOYW1lLkZ1bGxOYW1lLlN1YnN0cmluZygwLCBkZXN0RmlsZU5hbWUuRnVsbE5hbWUuTGVuZ3RoIC0gNSkgKyAiX2ZpbGVzIjsKKyAgICAgICAgICAgICAgICBpbnQgaW1hZ2VDb3VudGVyID0gMDsKKworICAgICAgICAgICAgICAgIHZhciBwYWdlVGl0bGUgPSBmaS5GdWxsTmFtZTsKKyAgICAgICAgICAgICAgICB2YXIgcGFydCA9IHdEb2MuQ29yZUZpbGVQcm9wZXJ0aWVzUGFydDsKKyAgICAgICAgICAgICAgICBpZiAocGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlID0gKHN0cmluZykgcGFydC5HZXRYRG9jdW1lbnQoKS5EZXNjZW5kYW50cyhEQy50aXRsZSkuRmlyc3RPckRlZmF1bHQoKSA/PyBmaS5GdWxsTmFtZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBEZXRlcm1pbmUgbWF4LXdpZHRoIGZyb20gc2l6ZSBvZiBjb250ZW50IGFyZWEuCisgICAgICAgICAgICAgICAgSHRtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzID0gbmV3IEh0bWxDb252ZXJ0ZXJTZXR0aW5ncygpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsQ3NzID0gImJvZHkgeyBtYXJnaW46IDFjbSBhdXRvOyBtYXgtd2lkdGg6IDIwY207IHBhZGRpbmc6IDA7IH0iLAorICAgICAgICAgICAgICAgICAgICBQYWdlVGl0bGUgPSBwYWdlVGl0bGUsCisgICAgICAgICAgICAgICAgICAgIEZhYnJpY2F0ZUNzc0NsYXNzZXMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICBDc3NDbGFzc1ByZWZpeCA9ICJwdC0iLAorICAgICAgICAgICAgICAgICAgICBSZXN0cmljdFRvU3VwcG9ydGVkTGFuZ3VhZ2VzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIFJlc3RyaWN0VG9TdXBwb3J0ZWROdW1iZXJpbmdGb3JtYXRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlciA9IGltYWdlSW5mbyA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnlJbmZvIGxvY2FsRGlySW5mbyA9IG5ldyBEaXJlY3RvcnlJbmZvKGltYWdlRGlyZWN0b3J5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsRGlySW5mby5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEaXJJbmZvLkNyZWF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgKytpbWFnZUNvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXh0ZW5zaW9uID0gaW1hZ2VJbmZvLkNvbnRlbnRUeXBlLlNwbGl0KCcvJylbMV0uVG9Mb3dlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VGb3JtYXQgaW1hZ2VGb3JtYXQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSAicG5nIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LlBuZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dGVuc2lvbiA9PSAiZ2lmIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkdpZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dGVuc2lvbiA9PSAiYm1wIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkJtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dGVuc2lvbiA9PSAianBlZyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGb3JtYXQgPSBJbWFnZUZvcm1hdC5KcGVnOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJ0aWZmIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRpZmYgdG8gZ2lmLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9ICJnaWYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuR2lmOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJ4LXdtZiIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gIndtZiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGb3JtYXQgPSBJbWFnZUZvcm1hdC5XbWY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbWFnZSBmb3JtYXQgaXNuJ3Qgb25lIHRoYXQgd2UgZXhwZWN0LCBpZ25vcmUgaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgZG9uJ3QgcmV0dXJuIG1hcmt1cCBmb3IgdGhlIGxpbmsuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2VGb3JtYXQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGltYWdlRmlsZU5hbWUgPSBpbWFnZURpcmVjdG9yeU5hbWUgKyAiL2ltYWdlIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb3VudGVyLlRvU3RyaW5nKCkgKyAiLiIgKyBleHRlbnNpb247CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uQml0bWFwLlNhdmUoaW1hZ2VGaWxlTmFtZSwgaW1hZ2VGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5FeHRlcm5hbEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbWFnZVNvdXJjZSA9IGxvY2FsRGlySW5mby5OYW1lICsgIi9pbWFnZSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlQ291bnRlci5Ub1N0cmluZygpICsgIi4iICsgZXh0ZW5zaW9uOworCisgICAgICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBpbWcgPSBuZXcgWEVsZW1lbnQoWGh0bWwuaW1nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnNyYywgaW1hZ2VTb3VyY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5JbWdTdHlsZUF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uQWx0VGV4dCAhPSBudWxsID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYWx0LCBpbWFnZUluZm8uQWx0VGV4dCkgOiBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbWc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIFhFbGVtZW50IGh0bWxFbGVtZW50ID0gSHRtbENvbnZlcnRlci5Db252ZXJ0VG9IdG1sKHdEb2MsIHNldHRpbmdzKTsKKworICAgICAgICAgICAgICAgIC8vIFByb2R1Y2UgSFRNTCBkb2N1bWVudCB3aXRoIDwhRE9DVFlQRSBodG1sID4gZGVjbGFyYXRpb24gdG8gdGVsbCB0aGUgYnJvd3NlcgorICAgICAgICAgICAgICAgIC8vIHdlIGFyZSB1c2luZyBIVE1MNS4KKyAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IG5ldyBYRG9jdW1lbnQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRG9jdW1lbnRUeXBlKCJodG1sIiwgbnVsbCwgbnVsbCwgbnVsbCksCisgICAgICAgICAgICAgICAgICAgIGh0bWxFbGVtZW50KTsKKworICAgICAgICAgICAgICAgIC8vIE5vdGU6IHRoZSB4aHRtbCByZXR1cm5lZCBieSBDb252ZXJ0VG9IdG1sVHJhbnNmb3JtIGNvbnRhaW5zIG9iamVjdHMgb2YgdHlwZQorICAgICAgICAgICAgICAgIC8vIFhFbnRpdHkuICBQdE9wZW5YbWxVdGlsLmNzIGRlZmluZSB0aGUgWEVudGl0eSBjbGFzcy4gIFNlZQorICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9lcmljd2hpdGUvYXJjaGl2ZS8yMDEwLzAxLzIxL3dyaXRpbmctZW50aXR5LXJlZmVyZW5jZXMtdXNpbmctbGlucS10by14bWwuYXNweAorICAgICAgICAgICAgICAgIC8vIGZvciBkZXRhaWxlZCBleHBsYW5hdGlvbi4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIElmIHlvdSBmdXJ0aGVyIHRyYW5zZm9ybSB0aGUgWE1MIHRyZWUgcmV0dXJuZWQgYnkgQ29udmVydFRvSHRtbFRyYW5zZm9ybSwgeW91CisgICAgICAgICAgICAgICAgLy8gbXVzdCBkbyBpdCBjb3JyZWN0bHksIG9yIGVudGl0aWVzIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgcHJvcGVybHkuCisKKyAgICAgICAgICAgICAgICB2YXIgaHRtbFN0cmluZyA9IGh0bWwuVG9TdHJpbmcoU2F2ZU9wdGlvbnMuRGlzYWJsZUZvcm1hdHRpbmcpOworICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KGRlc3RGaWxlTmFtZS5GdWxsTmFtZSwgaHRtbFN0cmluZywgRW5jb2RpbmcuVVRGOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9IdG1sQ29udmVydGVyMDEuY3Nwcm9qIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sQ29udmVydGVyMDEvSHRtbENvbnZlcnRlcjAxLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM5NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sQ29udmVydGVyMDEvSHRtbENvbnZlcnRlcjAxLmNzcHJvagpAQCAtMCwwICsxLDE1IEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0NDU8L1RhcmdldEZyYW1ld29yaz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cT3BlblhtbFBvd2VyVG9vbHNcT3BlblhtbFBvd2VyVG9vbHMuY3Nwcm9qIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkRvY3VtZW50Rm9ybWF0Lk9wZW5YbWwiIFZlcnNpb249IjIuOC4xIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iV2luZG93c0Jhc2UiIC8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODg4MWMxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sQ29udmVydGVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0CkBAIC0wLDAgKzEsMyBAQAorRXhhbXBsZSBvdXRwdXQgZmlsZXMgYXJlIGluIGEgRGF0ZVRpbWUgc3RhbXBlZCBkaXJlY3RvcnkgaW4gLi9iaW4vZGVidWcuICBUaGUgZGlyZWN0b3J5IG5hbWUgaXMgRXhhbXBsZU91dHB1dC15eS1tbS1kZC1oaG1tc3MuCisKK0lmIHlvdSBhcmUgYnVpbGRpbmcgaW4gcmVsZWFzZSBtb2RlLCB0aGV5IHdpbGwsIG9mIGNvdXJzZSwgYmUgaW4gLi9iaW4vcmVsZWFzZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9SZXN1bWVUZW1wbGF0ZS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sQ29udmVydGVyMDEvUmVzdW1lVGVtcGxhdGUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWU1MGZlCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sQ29udmVydGVyMDEvUmVzdW1lVGVtcGxhdGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UYXNrUGxhblRlbXBsYXRlLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UYXNrUGxhblRlbXBsYXRlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5MzJmNgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL1Rhc2tQbGFuVGVtcGxhdGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTAxLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTAxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlZDQxYQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTAyLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTAyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2MjhjYQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTAzLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTAzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc2YzhjYgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA0LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3ZDY5NAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA1LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA1LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmNjI4NAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA2LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA2LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ1NjYwMgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDYuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA3LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA3LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3MTA2MQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDcuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA4LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA4LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyMWFiZQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDguZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxLzVEYXlUb3VyUGxhblRlbXBsYXRlLmh0bWwgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxLzVEYXlUb3VyUGxhblRlbXBsYXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkODVjMwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvNURheVRvdXJQbGFuVGVtcGxhdGUuaHRtbApAQCAtMCwwICsxLDE0OCBAQAor77u/PCFET0NUWVBFIGh0bWwgPjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz48dGl0bGU+PC90aXRsZT48bWV0YSBuYW1lPSJHZW5lcmF0b3IiIGNvbnRlbnQ9IlBvd2VyVG9vbHMgZm9yIE9wZW4gWE1MIiAvPjxzdHlsZT5zcGFuIHsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CitwLnB0LVRpdGxlIHsKKyAgICBtYXJnaW4tYm90dG9tOiAyNnB0OworICAgIGZvbnQtZmFtaWx5OiBNaWNyb3NvZnQgWWFIZWkgVUk7CisgICAgZm9udC1zaXplOiAzM3B0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udCB7CisgICAgY29sb3I6ICNGQTVBMDA7CisgICAgZm9udC1mYW1pbHk6IE1pY3Jvc29mdCBZYUhlaSBVSTsKKyAgICBmb250LXNpemU6IDMzcHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGFibGUucHQtMDAwMDAwIHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIGJvcmRlcjogbm9uZTsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9Cit0ZC5wdC0wMDAwMDEgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDUzLjg1cHQ7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNEQURBREEgMi4zcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQoraDEucHQtSGVhZGluZzEgeworICAgIGxpbmUtaGVpZ2h0OiA5MC4wJTsKKyAgICBmb250LWZhbWlseTogTWljcm9zb2Z0IFlhSGVpIFVJOworICAgIGZvbnQtc2l6ZTogMjZwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiB7CisgICAgY29sb3I6ICNGQTVBMDA7CisgICAgZm9udC1mYW1pbHk6IE1pY3Jvc29mdCBZYUhlaSBVSTsKKyAgICBmb250LXNpemU6IDI2cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDAzIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAzMjAuNDVwdDsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjREFEQURBIDIuM3B0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitwLnB0LU5vcm1hbCB7CisgICAgZm9udC1mYW1pbHk6IE1pY3Jvc29mdCBZYUhlaSBVSTsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQgeworICAgIGNvbG9yOiAjNDA0MDQwOworICAgIGZvbnQtZmFtaWx5OiBNaWNyb3NvZnQgWWFIZWkgVUk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDA1IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAxMzMuMTVwdDsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNiB7CisgICAgY29sb3I6ICM0MDQwNDA7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordHIucHQtMDAwMDA3IHsKKyAgICBoZWlnaHQ6IDAuNDRpbjsKK30KK3RkLnB0LTAwMDAwOCB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogNTMuODVwdDsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitzcGFuLnB0LTAwMDAwOSB7CisgICAgY29sb3I6ICNGQTVBMDA7CisgICAgZm9udC1zaXplOiAyNnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAxMCB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMzIwLjQ1cHQ7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQorc3Bhbi5wdC0wMDAwMTEgeworICAgIGNvbG9yOiAjNDA0MDQwOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK2JvZHkgeyBtYXJnaW46IDFjbSBhdXRvOyBtYXgtd2lkdGg6IDIwY207IHBhZGRpbmc6IDA7IH08L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2PjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGl0bGUiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPjUg5pel5ri46KGM56iL6K6h5YiSPC9zcGFuPjwvcD48ZGl2IGFsaWduPSJsZWZ0Ij48dGFibGUgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDAiPjx0cj48dGQgY2xhc3M9InB0LTAwMDAwMSI+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj7nrKw8L3NwYW4+PC9oMT48aDEgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMSI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPjEg5aSpPC9zcGFuPjwvaDE+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwMyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7nm67nmoTlnLA8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPu+8mls8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPuaCqOimgeWOu+WTquWEvzwvc3Bhbj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+77yfXTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7lnKjlk6rph4zlkIPppa3vvJpb5pep6aSQ5ZCD5LuA5LmI77yfXTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7lronmjpLku4DkuYjmtLvliqjvvJpb5piv5ZCm6KaB5Lmw5ryU5Ye655qE56Wo77yfXTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7lvoXlnKjlk6rph4w8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPu+8mlvmspnmu6nlsYvov5jmmK/mnIvlj4vnmoTmspnlj5HvvJ9dPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPuaKtei+vuaWueW8j++8mlvpo57mnLrjgIHngavovabov5jmmK8gR1BTIOiHqumpvu+8n108L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA2Ij48aW1nIHNyYz0iNURheVRvdXJQbGFuVGVtcGxhdGVfZmlsZXMvaW1hZ2UxLmpwZWciIHN0eWxlPSJ3aWR0aDogMS44NDkzMDZpbjsgaGVpZ2h0OiAxLjI0OTMwNmluIiBhbHQ9IuWbvueJhyA0IiAvPjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDA3Ij48dGQgY2xhc3M9InB0LTAwMDAwOCI+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDkiPiA8L3NwYW4+PC9oMT48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDEwIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTEiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMDEiPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcxIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+56ysPC9zcGFuPjwvaDE+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj4yIOWkqTwvc3Bhbj48L2gxPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDMiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+W+imgeabv+aNouS7u+S9leWNoOS9jeespuaWh+acrO+8iOS+i+WmguatpOaWh+acrO+8ie+8jOWPqumcgOmAieS4reS4gOihjOaIluS4gOauteaWh+acrOW5tuW8gOWni+mUruWFpeOAguS4uui+vuWIsOacgOS9s+aViOaenO+8jOivt+WLv+WcqOaCqOmAieS4reeahOWtl+espuW3puS+p+aIluWPs+S+p+WMheWQq+epuuagvOOAgl08L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA2Ij48aW1nIHNyYz0iNURheVRvdXJQbGFuVGVtcGxhdGVfZmlsZXMvaW1hZ2UyLmpwZWciIHN0eWxlPSJ3aWR0aDogMS44NDkzMDZpbjsgaGVpZ2h0OiAxLjI0OTMwNmluIiBhbHQ9IuWbvueJhyA1IiAvPjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDA3Ij48dGQgY2xhc3M9InB0LTAwMDAwOCI+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDkiPiA8L3NwYW4+PC9oMT48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDEwIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTEiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMDEiPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcxIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+56ysPC9zcGFuPjwvaDE+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj4zIOWkqTwvc3Bhbj48L2gxPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDMiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+W+imgeWwhuS7u+S9leWNoOS9jeespueFp+eJh+abv+aNouS4uuaCqOiHquW3seeahOeFp+eJh++8jOivt+WIoOmZpOWug++8jOeEtuWQjuWcqOWKn+iDveWMuueahOKAnOaPkuWFpeKAnemAiemhueWNoeS4iuWNleWHu+KAnOWbvueJh+KAneOAgl08L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA2Ij48aW1nIHNyYz0iNURheVRvdXJQbGFuVGVtcGxhdGVfZmlsZXMvaW1hZ2UzLmpwZWciIHN0eWxlPSJ3aWR0aDogMS44NDkzMDZpbjsgaGVpZ2h0OiAxLjI0OTMwNmluIiBhbHQ9IuWbvueJhyA2IiAvPjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDA3Ij48dGQgY2xhc3M9InB0LTAwMDAwOCI+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDkiPiA8L3NwYW4+PC9oMT48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDEwIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTEiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMDEiPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcxIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+56ysPC9zcGFuPjwvaDE+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj40IOWkqTwvc3Bhbj48L2gxPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDMiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+55uu55qE5Zyw77yaPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPuWcqOWTqumHjOWQg+mlre+8mjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7lronmjpLku4DkuYjmtLvliqjvvJo8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+5b6F5Zyo5ZOq6YeMPC9zcGFuPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7vvJo8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+5oq16L6+5pa55byP77yaPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNiI+PGltZyBzcmM9IjVEYXlUb3VyUGxhblRlbXBsYXRlX2ZpbGVzL2ltYWdlNC5qcGVnIiBzdHlsZT0id2lkdGg6IDEuODQ5MzA2aW47IGhlaWdodDogMS4yNDkzMDZpbiIgYWx0PSLlm77niYcgNyIgLz48L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAwNyI+PHRkIGNsYXNzPSJwdC0wMDAwMDgiPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcxIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA5Ij4gPC9zcGFuPjwvaDE+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxMCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTEiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDExIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDAxIj48aDEgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMSI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPuesrDwvc3Bhbj48L2gxPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcxIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+NSDlpKk8L3NwYW4+PC9oMT48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDAzIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPuebrueahOWcsO+8mjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7lnKjlk6rph4zlkIPppa3vvJo8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+5a6J5o6S5LuA5LmI5rS75Yqo77yaPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPuW+heWcqOWTqumHjDwvc3Bhbj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+77yaPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPuaKtei+vuaWueW8j++8mjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDYiPjxpbWcgc3JjPSI1RGF5VG91clBsYW5UZW1wbGF0ZV9maWxlcy9pbWFnZTUuanBlZyIgc3R5bGU9IndpZHRoOiAxLjg0OTMwNmluOyBoZWlnaHQ6IDEuMjQ5MzA2aW4iIGFsdD0i5Zu+54mHIDgiIC8+PC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMSI+IDwvc3Bhbj48L3A+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxLzVEYXlUb3VyUGxhblRlbXBsYXRlX2ZpbGVzL2ltYWdlMS5qcGVnIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS81RGF5VG91clBsYW5UZW1wbGF0ZV9maWxlcy9pbWFnZTEuanBlZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTFiMjhmCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS81RGF5VG91clBsYW5UZW1wbGF0ZV9maWxlcy9pbWFnZTEuanBlZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxLzVEYXlUb3VyUGxhblRlbXBsYXRlX2ZpbGVzL2ltYWdlMi5qcGVnIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS81RGF5VG91clBsYW5UZW1wbGF0ZV9maWxlcy9pbWFnZTIuanBlZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmQyZWMxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS81RGF5VG91clBsYW5UZW1wbGF0ZV9maWxlcy9pbWFnZTIuanBlZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxLzVEYXlUb3VyUGxhblRlbXBsYXRlX2ZpbGVzL2ltYWdlMy5qcGVnIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS81RGF5VG91clBsYW5UZW1wbGF0ZV9maWxlcy9pbWFnZTMuanBlZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTExZjNlCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS81RGF5VG91clBsYW5UZW1wbGF0ZV9maWxlcy9pbWFnZTMuanBlZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxLzVEYXlUb3VyUGxhblRlbXBsYXRlX2ZpbGVzL2ltYWdlNC5qcGVnIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS81RGF5VG91clBsYW5UZW1wbGF0ZV9maWxlcy9pbWFnZTQuanBlZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWQ0NDhiCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS81RGF5VG91clBsYW5UZW1wbGF0ZV9maWxlcy9pbWFnZTQuanBlZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxLzVEYXlUb3VyUGxhblRlbXBsYXRlX2ZpbGVzL2ltYWdlNS5qcGVnIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS81RGF5VG91clBsYW5UZW1wbGF0ZV9maWxlcy9pbWFnZTUuanBlZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWRmYmViCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS81RGF5VG91clBsYW5UZW1wbGF0ZV9maWxlcy9pbWFnZTUuanBlZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL0NvbnRyYWN0Lmh0bWwgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL0NvbnRyYWN0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2MjY1YgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvQ29udHJhY3QuaHRtbApAQCAtMCwwICsxLDE3NCBAQAor77u/PCFET0NUWVBFIGh0bWwgPjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz48dGl0bGU+QzpcVXNlcnNcRXJpY1xEb2N1bWVudHNcT3Blbi1YbWwtUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzXEh0bWxDb252ZXJ0ZXIwMVxDb250cmFjdC5kb2N4PC90aXRsZT48bWV0YSBuYW1lPSJHZW5lcmF0b3IiIGNvbnRlbnQ9IlBvd2VyVG9vbHMgZm9yIE9wZW4gWE1MIiAvPjxzdHlsZT5zcGFuIHsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CitwLnB0LTAwMDAwMCB7CisgICAgbWFyZ2luLXRvcDogMTJwdDsKKyAgICBtYXJnaW4tYm90dG9tOiAxMnB0OworICAgIG1hcmdpbi1sZWZ0OiAwLjUwaW47CisgICAgdGV4dC1pbmRlbnQ6IC0wLjUwaW47CisgICAgZm9udC1mYW1pbHk6IFRpbWVzIE5ldyBSb21hbiBCb2xkOworICAgIGZvbnQtc2l6ZTogMTRwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LTAwMDAwMSB7CisgICAgZm9udC1mYW1pbHk6IFRpbWVzIE5ldyBSb21hbiBCb2xkOworICAgIGZvbnQtc2l6ZTogMTRwdDsKKyAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdGV4dC1pbmRlbnQ6IDA7CisgICAgd2lkdGg6IDAuNTAwaW47Cit9CithLnB0LTAwMDAwMiB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udCB7CisgICAgZm9udC1mYW1pbHk6IFRpbWVzIE5ldyBSb21hbiBCb2xkOworICAgIGZvbnQtc2l6ZTogMTRwdDsKKyAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtMDAwMDAzIHsKKyAgICBtYXJnaW4tdG9wOiA2cHQ7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICBtYXJnaW4tbGVmdDogMC41MGluOworICAgIHRleHQtaW5kZW50OiAtMC4zNWluOworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC0wMDAwMDQgeworICAgIGNvbG9yOiBibGFjazsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICB0ZXh0LWluZGVudDogMDsKKyAgICB3aWR0aDogMC4zNTBpbjsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1IHsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDYgeworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgZm9udC1zdHlsZTogaXRhbGljOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNyB7CisgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCB7CisgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtMDAwMDA5IHsKKyAgICBtYXJnaW4tdG9wOiA2cHQ7CisgICAgbWFyZ2luLWJvdHRvbTogNnB0OworICAgIG1hcmdpbi1sZWZ0OiAwLjUwaW47CisgICAgdGV4dC1pbmRlbnQ6IC0wLjM1aW47CisgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitwLnB0LVRhYmxlVGV4dCB7CisgICAgbWFyZ2luLXRvcDogNnB0OworICAgIG1hcmdpbi1ib3R0b206IDZwdDsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtMDAwMDEwIHsKKyAgICBmb250LWZhbWlseTogVGltZXMgTmV3IFJvbWFuIEJvbGQ7CisgICAgZm9udC1zaXplOiAxNHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdGV4dC1pbmRlbnQ6IDA7CisgICAgd2lkdGg6IDAuNTAwaW47Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMSB7CisgICAgZm9udC1mYW1pbHk6IFRpbWVzIE5ldyBSb21hbiBCb2xkOworICAgIGZvbnQtc2l6ZTogMTRwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LTAwMDAxMiB7CisgICAgY29sb3I6ICMwMDAwMDA7CisgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBsZXR0ZXItc3BhY2luZzogMDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgdG9wOiAwcHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIHRleHQtaW5kZW50OiAwOworICAgIHdpZHRoOiAwLjM1MGluOworfQorcC5wdC1UYWJsZUxldmVsM051bWJlcmVkIHsKKyAgICBtYXJnaW4tdG9wOiA2cHQ7CisgICAgbWFyZ2luLWJvdHRvbTogNnB0OworICAgIG1hcmdpbi1sZWZ0OiAwLjQ5aW47CisgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitwLnB0LTAwMDAxMyB7CisgICAgbWFyZ2luLXRvcDogNnB0OworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgbWFyZ2luLWxlZnQ6IDAuOTBpbjsKKyAgICB0ZXh0LWluZGVudDogLTAuNzVpbjsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtMDAwMDE0IHsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICB0ZXh0LWluZGVudDogMDsKKyAgICB3aWR0aDogMC43NTBpbjsKK30KK2JvZHkgeyBtYXJnaW46IDFjbSBhdXRvOyBtYXgtd2lkdGg6IDIwY207IHBhZGRpbmc6IDA7IH08L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2PjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAwIj48c3BhbiBjbGFzcz0icHQtMDAwMDAxIj4xLjA8L3NwYW4+PGEgaWQ9Il9Ub2MzNTc1ODU4MTIiIGNsYXNzPSJwdC0wMDAwMDIiPjwvYT48YSBpZD0iX1RvYzM1MTI5NjIyMCIgY2xhc3M9InB0LTAwMDAwMiI+PC9hPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPkVJTkxFSVRVTkc8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAzIj48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LTAwMDAwNCI+MS48L3NwYW4+PHNwYW4gbGFuZz0iZGUtREUiIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPkRlciBJVC1ESUVOU1RMRUlTVEVSIGJlc3TDpHRpZ3QsIGRhc3MgZXIg4oCTIGZhbGxzIG5pY2h0IGFuZGVycyBhbmdlZ2ViZW4g4oCTIGVpbmUgPC9zcGFuPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA2Ij5Mw7ZzdW5nPC9zcGFuPjxzcGFuIGxhbmc9ImRlLURFIiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4gYmVyZWl0c3RlbGxlbiB3aXJkLCBkaWUgYWxsZSBpbiBkaWVzZXIgTEVJU1RVTkdTQkVTQ0hSRUlCVU5HIChTdGF0ZW1lbnQgb2YgV29yayAtIFNPVykgdW5kIGlocmVuIEFuaMOkbmdlbiBhbmdlZsO8aHJ0ZW4gPC9zcGFuPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA3Ij5HZXNjaMOkZnRzcHJvemVzc2U8L3NwYW4+PHNwYW4gbGFuZz0iZGUtREUiIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiB1bnRlcnN0w7x0enQgdW5kIGRhc3MgYWxsZSBTRVJWSUNFUyAtIGZhbGxzIG5pY2h0IGF1c2Ryw7xja2xpY2ggYW5kZXJ3ZWl0aWcgZmVzdGdlbGVndCAtIGluIGRlbiBCQVNFIENIQVJHRVMgZW50aGFsdGVuIHNpbmQuIERlciBJVC1ESUVOU1RMRUlTVEVSIHZlcnBmbGljaHRldCBzaWNoIHp1IGRlbSBBbnNhdHogZWluZXIga29udGludWllcmxpY2hlbiA8L3NwYW4+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPlZlcmJlc3NlcnVuZzwvc3Bhbj48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+Ljwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDMiPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtMDAwMDA0Ij4yLjwvc3Bhbj48c3BhbiBsYW5nPSJkZS1ERSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+RGVyIElULURJRU5TVExFSVNURVIgcmVhZ2llcnQgYXVmIGRlcnplaXRpZ2UgdW5kIGvDvG5mdGlnZSBBbmZvcmRlcnVuZ2VuIHZvbiBLVU5ERSwgc2Now6R0enQgcHJvYWt0aXYgZGVuIGvDvG5mdGlnZW4gQmVkYXJmIHVuZCB3aXJkIHNlaW5lIERpZW5zdGxlaXN0dW5nZW4gaW5uZXJoYWxiIGRlciBCQVNFIENIQVJHRVMgZW50c3ByZWNoZW5kIGFkanVzdGllcmVuLiBBbmZvcmRlcnVuZ2VuIGJlesO8Z2xpY2ggbmV1ZXIgRGllbnN0bGVpc3R1bmdlbiA8L3NwYW4+PHNwYW4gbGFuZz0iZGUtQVQiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPm9kZXIgZ3JhdmllcmVuZGVyIMOEbmRlcnVuZyBkZXIgUmFobWVuYmVkaW5ndW5nZW48L3NwYW4+PHNwYW4gbGFuZz0iZGUtREUiIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiB3ZXJkZW4gaW5uZXJoYWxiIGRlcyBDSEFOR0UgQ09OVFJPTCBWRVJGQUhSRU5TIGJlaGFuZGVsdCwgd29iZWkgZGVyIElULURJRU5TVExFSVNURVIgaW4gWnVzYW1tZW5hcmJlaXQgbWl0IEtVTkRFIGRpZSBBdXN3aXJrdW5nZW4gZWluZXIgc29sY2hlbiBBbmZvcmRlcnVuZyBhdWYgZGllIEJldHJpZWJzdW1nZWJ1bmcgdm9uIEtVTkRFIGJldXJ0ZWlsdC48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDA5Ij48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LTAwMDAwNCI+My48L3NwYW4+PHNwYW4gbGFuZz0iZGUtREUiIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPkFiIGRlbSBBTkZBTkdTREFUVU0gd2lyZCBkZXIgSVQtRElFTlNUTEVJU1RFUiBmw7xyIGRpZSBBdXNmw7xocnVuZyBkZXIgaW4gZGllc2VyIExFSVNUVU5HU0JFU0NIUkVJQlVORyBmZXN0Z2VsZWd0ZW4gQXBwbGljYXRpb24gRGV2ZWxvcG1lbnQgdW5kIE1haW50ZW5hbmNlIFNlcnZpY2UgKEFETSBTRVJWSUNFUykgdmVyYW50d29ydGxpY2ggc2Vpbi4gRGVyIElULURJRU5TVExFSVNURVIgPC9zcGFuPjxzcGFuIGxhbmc9ImRlLUFUIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij53aXJkIGRlbiBpbiBBbmhhbmcgWCBmZXN0Z2VsZWd0ZW4gVW1mYW5nIGRlciBBRE0gU2VydmljZXMgZsO8ciBkaWUgQU5XRU5EVU5HU1NPRlRXQVJFIGVyYnJpbmdlbi48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAwIj48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LTAwMDAwMSI+Mi4wPC9zcGFuPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPkJlaXNwaWVsLcOcYmVyc2NocmlmdDwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1UYWJsZVRleHQiPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij5LVU5ERSBwZmxlZ3QgdW5kIHZlcndlbmRldCBtZWhyZXJlIEVudHdpY2tsdW5ncy1NZXRob2RlbiwgZGllIGdydW5kc8OkdHpsaWNoIGJlaSBkZXIgTGVpc3R1bmdzZXJicmluZ3VuZyB6dSBiZXLDvGNrc2ljaHRpZ2VuIHNpbmQuIERlciBJVC1ESUVOU1RMRUlTVEVSIGhhdCBkaWVzZSBNZXRob2RlbiB6dSB2ZXJ3ZW5kZW4sIGthbm4gYWJlciBiZWkgYmVyZWNodGlndGVuIEdyw7xuZGVuIGVpbmUgYWx0ZXJuYXRpdmUgTWV0aG9kZSB2b3JzY2hsYWdlbiwgZGllIGRhbm4gdm9uIEtVTkRFIGdlcHLDvGZ0IHVuZCBnZW5laG1pZ3Qgd2VyZGVuIG11c3MuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwMCI+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC0wMDAwMTAiPjIuMTwvc3Bhbj48YSBpZD0iX1RvYzM1NzU4NTgxNCIgY2xhc3M9InB0LTAwMDAwMiI+PC9hPjxhIGlkPSJfVG9jMTQwNTU3MDIiIGNsYXNzPSJwdC0wMDAwMDIiPjwvYT48YSBpZD0iX1RvYzE3NzI5MjM3NCIgY2xhc3M9InB0LTAwMDAwMiI+PC9hPjxhIGlkPSJfVG9jMjU1MTA0NzM0IiBjbGFzcz0icHQtMDAwMDAyIj48L2E+PGEgaWQ9Il9Ub2MzNTEyOTYyMjIiIGNsYXNzPSJwdC0wMDAwMDIiPjwvYT48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMSI+TWV0aG9kaWssIFdlcmt6ZXVnZSB1bmQgVmVyZmFocmVuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRhYmxlVGV4dCI+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPlp1IGRlbiBBdWZnYWJlbiBkZXMgSVQtRElFTlNUTEVJU1RFUlMgZ2Vow7ZyZW4gdW50ZXIgRWluaGFsdHVuZyBkZXIgS1VOREUgU3RhbmRhcmRzOjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDMiPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtMDAwMDA0Ij4xLjwvc3Bhbj48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+RGllIERva3VtZW50YXRpb24gdW5kIFZlcmZlaW5lcnVuZyBkZXIgQU5XRU5EVU5HUy1FbnR3aWNrbHVuZ3NtZXRob2Rlbjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDMiPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtMDAwMDA0Ij4yLjwvc3Bhbj48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+RGllIFdlaXRlcmVudHdpY2tsdW5nIHZvbiBNZXRob2RlbiwgQWJsw6R1ZmVuIHVuZCBWZXJmYWhyZW4gZsO8ciBkaWUgRXJicmluZ3VuZyB2b24gU2VydmljZXMgaW4gZGVyICBBTldFTkRVTkdTLUVudHdpY2tsdW5nc21ldGhvZGVuIHVuZCAtYmV0cmllYi48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDA5Ij48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LTAwMDAwNCI+My48L3NwYW4+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPkRpZSBLb29yZGluYXRpb24gZGVyIEltcGxlbWVudGllcnVuZyB2b24gTWV0aG9kZW4sIEFibMOkdWZlbiB1bmQgVmVyZmFocmVuLjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDAiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTAiPjIuMjwvc3Bhbj48YSBpZD0iX1RvYzM1NzU4NTgxNSIgY2xhc3M9InB0LTAwMDAwMiI+PC9hPjxhIGlkPSJfVG9jMTQwNTU3MDMiIGNsYXNzPSJwdC0wMDAwMDIiPjwvYT48YSBpZD0iX1RvYzE3NzI5MjM3NSIgY2xhc3M9InB0LTAwMDAwMiI+PC9hPjxhIGlkPSJfVG9jMjU1MTA0NzM1IiBjbGFzcz0icHQtMDAwMDAyIj48L2E+PGEgaWQ9Il9Ub2MzNTEyOTYyMjMiIGNsYXNzPSJwdC0wMDAwMDIiPjwvYT48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMSI+QW53ZW5kdW5nc3N0YW5kYXJkczwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1UYWJsZVRleHQiPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij5adSBkZW4gQXVmZ2FiZW4gZGVzIElULURJRU5TVExFSVNURVJTIGdlaMO2cmVuOjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDMiPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtMDAwMDA0Ij4xLjwvc3Bhbj48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+RGllIEVpbmhhbHR1bmcgZGVyIFN0YW5kYXJkcyBmw7xyIEJlbnV0emVyb2JlcmZsw6RjaGUsIE1hc2NoaW5lbnNjaG5pdHRzdGVsbGUgdW5kIFByb2dyYW1taWVydW5nIHZvbiBLVU5ERSAoei5CLiBHVUksIEVESSB1bmQgSVApIGJlaSBhbGxlbiBFbnR3aWNrbHVuZ3MtLCBFcndlaXRlcnVuZ3MtIHVuZCBXYXJ0dW5nc2FrdGl2aXTDpHRlbi4gQXVmYmF1ZW5kIGF1ZiBmcsO8aGVyZW4gRXJmYWhydW5nZW4ga2FubiBkZXIgSVQtRElFTlNUTEVJU1RFUiBWZXJiZXNzZXJ1bmdlbiBhbiBkZW4gQU5XRU5EVU5HUy1TdGFuZGFyZHMgdm9yc2NobGFnZW4sIHVuZCAgaW0gRmFsbGUgZWluZXIgQW5uYWhtZSB1bmQgR2VuZWhtaWd1bmcgZGllc2VyIFZvcnNjaGzDpGdlIGR1cmNoIEtVTkRFLCAgZGllIEFOV0VORFVOR1MtU3RhbmRhcmRzIMO8YmVyYXJiZWl0ZW4uPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwOSI+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC0wMDAwMDQiPjIuPC9zcGFuPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij5EaWUgRW50d2lja2x1bmcgdW5kIEtvbW11bmlrYXRpb24gZGllc2VyIEFOV0VORFVOR1MtU3RhbmRhcmRzLjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDAiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTAiPjIuMzwvc3Bhbj48YSBpZD0iX1RvYzM1NzU4NTgzMiIgY2xhc3M9InB0LTAwMDAwMiI+PC9hPjxhIGlkPSJfVG9jMTQwNTU3MTkiIGNsYXNzPSJwdC0wMDAwMDIiPjwvYT48YSBpZD0iX1RvYzE3NzI5MjM4OSIgY2xhc3M9InB0LTAwMDAwMiI+PC9hPjxhIGlkPSJfVG9jMjU1MTA0NzQ5IiBjbGFzcz0icHQtMDAwMDAyIj48L2E+PGEgaWQ9Il9Ub2MzNTEyOTYyNDAiIGNsYXNzPSJwdC0wMDAwMDIiPjwvYT48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMSI+RmVobGVya29ycmVrdHVyPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRhYmxlVGV4dCI+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPlp1IGRlbiBBdWZnYWJlbiBkZXMgSVQtRElFTlNUTEVJU1RFUlMgZ2Vow7ZyZW46PC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwMyI+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC0wMDAwMDQiPjEuPC9zcGFuPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij5EaWUgQmVoZWJ1bmcgYWxsZXIgQU5XRU5EVU5HUy1JbmNpZGVudHMgYnp3LiAtUHJvYmxlbWUsIGRpZSDDhG5kZXJ1bmdlbiBkZXIgRGF0ZW5iYW5rLCBkZXMgQU5XRU5EVU5HUy1Db2RlcyB1bmQvb2RlciBkZXMgQmV0cmllYnNhYmxhdWZzIGVyZm9yZGVybiwgZGllIGF1cyBkZXIgRmVobGVya29ycmVrdHVyIHJlc3VsdGllcmVuLjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDMiPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtMDAwMDA0Ij4yLjwvc3Bhbj48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+RGllIMOcYmVybmFobWUgZGVyIFp1c3TDpG5kaWdrZWl0IGbDvHIgdm9tIElULURJRU5TVExFSVNURVIgZ2V3YXJ0ZXRlIFNPRlRXQVJFLCBUSElSRCBQQVJUWSBTT0ZUV0FSRSB2b24gS1VOREUgdW5kIFRISVJEIFBBUlRZIFNPRlRXQVJFIGRlcyBJVC1ESUVOU1RMRUlTVEVSUyBkdXJjaCBmb2xnZW5kZSBNYcOfbmFobWVuIGluIEFic3RpbW11bmcgdW5kIEZyZWlnYWJlIGR1cmNoIEtVTkRFOjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDMiPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtMDAwMDEyIj4yLjEuPC9zcGFuPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij5EaWUgRXJrZW5udW5nIHZvbiBBTldFTkRVTkdTLSB1bmQvb2RlciBEYXRlbmJhbmtwcm9ibGVtZW4uPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwMyI+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC0wMDAwMTIiPjIuMi48L3NwYW4+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPkRpZSBCZW5hY2hyaWNodGlndW5nIGRlcyB6dXN0w6RuZGlnZW4gSVQtRElFTlNUTEVJU1RFUlMuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwMyI+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC0wMDAwMTIiPjIuMy48L3NwYW4+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPkRpZSBWZXJhbmxhc3N1bmcgZGVyIGR1cmNoenVmw7xocmVuZGVuIEtvcnJla3R1cmVuLjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDMiPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtMDAwMDA0Ij4zLjwvc3Bhbj48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+RGllIEJlcmVpdHN0ZWxsdW5nIGVpbmVzIE5vdGZhbGxzdXBwb3J0cyBtaXQgZm9sZ2VuZGVuIFppZWxlbjo8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAzIj48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LTAwMDAxMiI+My4xLjwvc3Bhbj48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+RGllIFZlcm1laWR1bmcgYWJub3JtYWxlciBQcm9ncmFtbWF1c2bDpGxsZSBpbiBkZXIgUHJvZHVrdGlvbnN1bWdlYnVuZy48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDA5Ij48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LTAwMDAxMiI+My4yLjwvc3Bhbj48c3BhbiBsYW5nPSJkZS1ERSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+RGllIEJlaGVidW5nIGFsbGVyIGFuZGVyZW4gUHJvYmxlbWUsIGRpZSBpbiBWZXJiaW5kdW5nIG1pdCBlaW5lciBBTldFTkRVTkcsIERhdGVuYmFuayB1bmQsIGZhbGxzIHp1dHJlZmZlbmQsIFNZU1RFTSBTT0ZUV0FSRSBhdWZ0cmV0ZW4ga8O2bm5lbiAo4oCeS29ycmVrdHVyIGltIEZlaGxlcmZhbGzigJwpLiA8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGFibGVMZXZlbDNOdW1iZXJlZCI+PHNwYW4gbGFuZz0iZGUtREUiIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPkVzIG3DvHNzZW4gV29ya2Fyb3VuZHMvWndpc2NoZW5sw7ZzdW5nZW4gZ2VzY2hhZmZlbiBiencuIGltcGxlbWVudGllcnQgd2VyZGVuLCB6dXIgRWluZ3Jlbnp1bmcgbcO2Z2xpY2hlciBCdXNpbmVzcyBCZWVpbnRyw6RjaHRpZ3VuZ2VuLiA8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGFibGVMZXZlbDNOdW1iZXJlZCI+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPkRpZXMgc2NobGllw590IGFsbGUgQWt0aW9uZW4gZWluLCBkaWUgZXJmb3JkZXJsaWNoIHNpbmQsIHVtIHNvd29obCBkaWUgQU5XRU5EVU5HIGFscyBhdWNoIGFsbGUgU0VSVklDRVMgZsO8ciBLVU5ERSB3aWVkZXJoZXJ6dXN0ZWxsZW4sIGVpbnNjaGxpZcOfbGljaCBkZXIgS29vcmRpbmF0aW9uIGRlciBCZXRyaWVic2FibMOkdWZlIG1pdCBkZW4gQmV0cmllYnN2ZXJhbnR3b3J0bGljaGVuIGRlcyBBTldFTkRVTkdTLSB1bmQgSVQtSW5mcmFzdHJ1a3R1cmJldHJpZWJzLCB1bSBQcm9kdWt0aW9uc3Bsw6RuZSBpbiBmb2xnZW5kZW4gRsOkbGxlbiBuZXUgYXVmenVzZXR6ZW4gb2RlciB6dSBlcmfDpG56ZW46PC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAxMyI+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC0wMDAwMTQiPjMuMi4xLjwvc3Bhbj48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+RGllIGVpbmdlc2NocsOkbmt0ZSBWRVJGw5xHQkFSS0VJVCB2b24ga3JpdGlzY2hlbiBTY2huaXR0c3RlbGxlbiBiencuIEFOV0VORFVOR0VOLCBEYXRlbmJhbmtlbiBvZGVyIFNZU1RFTSBTT0ZUV0FSRS48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDEzIj48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LTAwMDAxNCI+My4yLjIuPC9zcGFuPjxzcGFuIGxhbmc9ImRlLURFIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij5Qcm9ibGVtZSBtaXQgRVFVSVBNRU5UIG9kZXIgTkVUWldFUksgS29tbXVuaWthdGlvbi48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAzIj48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LTAwMDAwNCI+NC48L3NwYW4+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPkRpZSBlbmdlIFp1c2FtbWVuYXJiZWl0IG1pdCB6dXN0w6RuZGlnZW4gTUlUQVJCRUlURVJOIHZvbiBLVU5ERSwgdW0gZWluZSBhbmdlbWVzc2VuZSBCZXJpY2h0ZXJzdGF0dHVuZyDDvGJlciBGb3J0c2Nocml0dGUgdW5kIGVpbmUgZWZmZWt0aXZlIEzDtnN1bmcgdm9uIFByb2R1a3Rpb25zcHJvYmxlbWVuIHNpY2hlcnp1c3RlbGxlbi48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDA5Ij48c3BhbiBsYW5nPSJkZS1ERSIgY2xhc3M9InB0LTAwMDAwNCI+NS48L3NwYW4+PHNwYW4gbGFuZz0iZGUtREUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPkRpZSBEdXJjaGbDvGhydW5nIHZvbiBBa3Rpdml0w6R0ZW4genVyIEZlaGxlcmtvcnJla3R1ciBpbiDDnGJlcmVpbnN0aW1tdW5nIG1pdCBTRVJWSUNFIExFVkVMLUFuZm9yZGVydW5nZW4uPC9zcGFuPjwvcD48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvSGVicmV3LTAxLmh0bWwgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL0hlYnJldy0wMS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYmI3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL0hlYnJldy0wMS5odG1sCkBAIC0wLDAgKzEsMTQzIEBACivvu788IURPQ1RZUEUgaHRtbCA+PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPjx0aXRsZT4gPC90aXRsZT48bWV0YSBuYW1lPSJHZW5lcmF0b3IiIGNvbnRlbnQ9IlBvd2VyVG9vbHMgZm9yIE9wZW4gWE1MIiAvPjxzdHlsZT5zcGFuIHsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CitwLnB0LU5vcm1hbCB7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC0wMDAwMDAgeworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQgeworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtTm9ybWFsLTAwMDAwMSB7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIgeworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitwLnB0LU5vcm1hbC0wMDAwMDMgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBmb250LWZhbWlseTogRGF2aWQ7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3AucHQtTm9ybWFsLTAwMDAwNCB7CisgICAgZm9udC1mYW1pbHk6IERhdmlkOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSB7CisgICAgZm9udC1mYW1pbHk6IERhdmlkOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtTm9ybWFsLTAwMDAwNiB7CisgICAgZm9udC1mYW1pbHk6IERhdmlkOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNyB7CisgICAgZm9udC1mYW1pbHk6IERhdmlkOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdGV4dC1pbmRlbnQ6IDA7CisgICAgd2lkdGg6IDAuNTAwaW47Cit9CitzcGFuLnB0LTAwMDAwOCB7CisgICAgbWFyZ2luOiAwIDAgMCAwLjUwaW47CisgICAgcGFkZGluZzogMCAwIDAgMDsKK30KK3AucHQtTm9ybWFsLTAwMDAwOSB7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGZvbnQtZmFtaWx5OiAnQXJpYWwnLCAnc2Fucy1zZXJpZic7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIHsKKyAgICBjb2xvcjogIzAwMDAwMDsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMSB7CisgICAgY29sb3I6ICMwMDAwMDA7CisgICAgZm9udC1mYW1pbHk6IERhdmlkOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEyIHsKKyAgICBjb2xvcjogIzAwMDAwMDsKKyAgICBmb250LWZhbWlseTogJ0FyaWFsJywgJ3NhbnMtc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEzIHsKKyAgICBmb250LWZhbWlseTogRGF2aWQ7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3NwYW4ucHQtMDAwMDE0IHsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorYm9keSB7IG1hcmdpbjogMWNtIGF1dG87IG1heC13aWR0aDogMjBjbTsgcGFkZGluZzogMDsgfTwvc3R5bGU+PC9oZWFkPjxib2R5PjxkaXYgZGlyPSJydGwiPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsIj4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbCI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPjxpbWcgc3JjPSJIZWJyZXctMDFfZmlsZXMvaW1hZ2UxLnBuZyIgc3R5bGU9IndpZHRoOiAxLjg0Mzc1aW47IGhlaWdodDogMi40MjcwODNpbiIgYWx0PSJQaWN0dXJlIDEiIC8+PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbCI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDAxIj4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj4mI3gyMDBmO9eY15nXldecINec15nXpNefINeQ16TXqNeZ15wgMjAxNCYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDMiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXqdec15XXnSDXqNeRLCYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXkdeX16jXqtedINec16bXkNeqINeV15zXqteV16gg15DXqiAi15DXqNelINeU16nXntepINeU16LXldec15QiLCDXlNec15Ag15TXmdeQINeZ16TXny4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7157XqNeS16Ig16DXl9eZ16rXqteb150g15HXkNeZINeU15XXoNep15UgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7INep15TXldeQINeU15DXmSDXlNeS15PXldecINee15HXmdefINeQ16jXkdei16og15DXmdeZINeZ16TXnyDXlNei15nXp9eo15nXmdedLCDXqteR15nXoNeVINep15nXpNefINeU15nXkCDXnNeQINeo16cgIteh15XXoNeZIiwgIteY15nXldeY15QiLCAi157Xmdem15XXkdeZ16nXmSIg15XXm9eVJyDXkNec15Ag157Xk9eZ16DXlCDXnteo16rXp9eqLCDXmdek15Qg15XXnteS15XXldeg16ouJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9eU15TXqteo15LXqdeV16og15zXp9eo15DXqiDXlNeg16HXmdei15Qg15TXldec15vXqiDXldeS15XXkdeo16og16LXnSDXlNeq16fXqNeRINee15XXoteTINeU15nXpteZ15DXlCwg15XXmdeX15Mg16LXnSDXlteQ16og15nXqdeg158g16nXkNec15XXqiDXqdei15zXmdeU158g15TXoNeb150g157Xl9eb15nXnSDXnNen15HXnCDXqtep15XXkdeV16ouJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9ee16fXldeV15Qg16nXk9ejINee15nXk9eiINeW15Qg15nXlNeZ15Qg15zXm9edINec16LXlteoLiDXkNedINec15DXl9eoINee16TXktepINeU16fXkdeV16bXlCDXlden16jXmdeQ16og15TXnteZ15PXoiDXlNee15XXkdeQINeb15DXnyDXqteq16LXldeo16jXoNeUINep15DXnNeV16osINeU16jXkteZ16nXlSDXl9eV16TXqdeZ15nXnSDXnNeZ16bXldeoINei157XmSDXp9ep16gg16LXldeTINeR15jXqNedINeU15nXpteZ15DXlCDXnNeY15nXldecLiDXkNep16rXk9ecINec16rXqiDXnNeb150g15DXqiDXlNeQ15nXoNek15XXqNee16bXmdeUINeU16DXk9eo16nXqi4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY715zXlNec158g157Xodek16jXmSDXlNeY15zXpNeV158g16nXnNeZICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY715HXmdeqICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyAwOS03NDI1NzMzJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXoNeZ15nXkyAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsgMDUyLTIyMzE1MjUgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9ee15bXkiDXkNeV15nXqCAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsg15DXkdeZ15HXmSAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsgKNeb15PXkNeZINeV16jXpteV15kg15zXkdeT15XXpyDXkdeQ15nXoNeY16jXoNeYINec16TXoNeZINeU15nXpteZ15DXlCDXnNeY15nXldecKSYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7157XmNeR16Ig157Xp9eV157XmSAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsg15nXmdefICgmI3gyMDBmOzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj4mI3gyMDBlO0pQWSYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyApJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXqdei16gg15fXnNeZ16TXmdefICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDciPiYjeDIwMGY7ICAgICAgICAgICAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsxJD0gMTAyLjMgINeZ15nXnyYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij48c3BhbiBjbGFzcz0icHQtMDAwMDA4Ij4mI3gwMGEwOzwvc3Bhbj48L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7MdepIteXPTI5LjQxINeZ15nXnyYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7KNep16LXqCDXlNeU157XqNeUINeg15vXldefINecICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyA5LzQvMjAxNCkgICAgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXlNeV16bXkNeUINeZ15XXnteZ16og15zXkNeT150gJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7INebLSAyNSQmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY715HXkdeq15kg16LXodenINeV15HXkdeq15kg15TXntec15XXnyDXoNeZ16rXnyDXnNeU16nXqtee16kg15HXm9eo15jXmdeh15kg15DXqdeo15DXmS4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY715TXpNeo16nXmSDXlNep16LXldeqINeR15nXnyDXmdep16jXkNecINec15nXpNefICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyAgNisgKNeZ16TXnyDXnten15PXmdee15Qg15DXqiDXmdep16jXkNecINeRICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyA2INep16LXldeqKS4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9eq16fXqdeV16jXqiAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsg15TXp9eZ15PXldee16og15zXmdek158g15TXmdeQIDgxICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY715jXnNek15XXnyDXnteZ16TXnyDXnNeQ16jXpTog16fXldeTINeS15nXqdeUINeR15nXoNec15DXldee15k7ICYjeDIwMGY7PC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPiYjeDIwMGU7SkRDIDAwMTtLREQgMDA0MTtKVCAwMDYxICYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyArOTcyICvXp9eZ15PXldee16og15TXkNeW15XXqCDXkdec15kgIjAiJyYjeDIwMGY7PC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPiYjeDIwMGU7ICYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyvXnteh16TXqCDXlNeY15zXpNeV158uJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXnNeR16LXnNeZINeh157XkNeo15gg16TXldefINee157XnNeZ16bXlCDXnNeU15XXqNeZ15Mg15DXqiDXlNeq15XXm9eg15QgJiN4MjAwZjs8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+JiN4MjAwZTtCUEhPTiYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyDXqdecINeR15bXpy4gKNeo16cg15HXotec15kg16fXlSDXkdeW16cg15HXkdeZ16rXnSDXmdeb15XXnNeZ150g15zXlNeV16jXmdeTINeq15XXm9eg15Qg15bXlSkuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9eR15nXpNefINeg15nXqtefINec15TXqdeq157XqSDXqNenINeR16TXnNek15XXoNeZ150g157XlNeT15XXqCDXlNep15zXmdep15kg15XXntei15zXlC4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY716rXp9ep15XXqNeqINeQ15nXoNeY16jXoNeY15nXqiDXkdeo15XXkSDXkdeq15kg15TXntec15XXny4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDkiPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA3Ij4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj48c3BhbiBjbGFzcz0icHQtMDAwMDA4Ij4mI3gwMGEwOzwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+PGltZyBzcmM9IkhlYnJldy0wMV9maWxlcy9pbWFnZTIuanBlZyIgc3R5bGU9IndpZHRoOiAxLjMyMjkxN2luOyBoZWlnaHQ6IDAuNDg5NTgzM2luIiBhbHQ9ImliMjIyNSIgLz48L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMSI+JiN4MjAwZjvXl9ep157XnCAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMSI+JiN4MjAwZjsg15TXodek16cgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTEiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTEiPiYjeDIwMGY7IDEwMCYjeDIwMGY7PC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTIiPiYjeDIwMGU7ViYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIj4mI3gyMDBmOyAu15vXmiDXoNeo15DXlCDXqten16Ig15nXpNeQ16DXmSDXldec15Ug15nXqSDXnNeU16rXkNeZ150g157XoteR15nXqC4mI3gyMDBmOzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEyIj4mI3gyMDBlOyAmI3gyMDBlOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY715zXkdeV16kg15XXpteZ15XXkyAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsg15HXkteT15nXnSDXnteq15DXmdee15nXnSDXnNee15bXkiDXlNeQ15XXmdeoLiDXoNeb15XXnyDXnNeZ157XmdedINeQ15zXlCDXlNeY157XpCcg15TXmdeQICDXkdeh15HXmdeR15XXqiAyMCsg157Xotec15XXqiDXkdee15TXnNeaINeU15nXldedLteZ16kg15zXlNeR15nXkCDXntei15nXnCAs16bXoteZ16Ms157XmNeo15nXlCwg16DXotec15kg15TXnNeZ15vXlCDXoNeV15fXldeqLCDXoNei15zXmdedINec15TXl9ec16TXlC4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEzIj4mI3gyMDBmO9ep15nXnteVINec15EgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTMiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTMiPiYjeDIwMGY7INeR15HXmden15XXqCDXkdeU16gg16fXldeZ15Qg16LXqdeV15kg15zXlNeZ15XXqiDXp9eoINeZ15XXqteoINee15DXqdeoINeR15nXqteoINeX15zXp9eZINeU15jXmdeV15wuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXp9eo150g15TXkteg15QmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9ee16nXp9ek15kg16fXqNeZ15DXlCDXqNeW16jXkdeZ15nXnSYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7157Xqden16TXmSDXqdee16kmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9eq16jXldek15XXqiAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsg15zXoteW16jXlCDXqNeQ16nXldeg15QsINeb157XlSDXp9eV15zXk9en16EsINeh15jXldekINeQ15nXmCwg15PXp9eh157XldecINeV157XoteV16jXqCDXpNei15XXnNeqINee16LXmdedLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY716bXmdec15XXnSDXqdecINeU15PXqNeb15XXnyDXldep15wg15vXqNeY15nXoSDXlNeY15nXodeULiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAxNCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMyI+JiN4MjAwZjvXkdeQ150g15nXqSDXnNeaINeh16TXldeoINee16LXoNeZ15nXny/XnteV16HXmden15Qg15jXldeR15QvINeo16LXmdeV158g15zXntep15fXpyAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMyI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMyI+JiN4MjAwZjsg16DXl9ee15Mg15HXkNedINeS150g16TXqNeZ15jXmdedINeQ15zXlCDXmdeU15nXlSDXkdeZ158g15TXk9eR16jXmdedINep15TXoNeaINee15HXmdeQL9eUINec15jXmdeV15wuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9ee15bXldeV15PXlCAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsg157XlteV15XXk9eqINeU157XmNei158g15zXkCDXqtei15zXlCDXotecICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOzIwINenIteSJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7INec16DXldeh16IuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9eq15nXpyDXmdeTICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyAo157XlteV15XXk9eqINeZ15MpICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyDXm9eT15DXmSDXldeo16bXldeZINec15DXqNeV15Yg15fXnNeZ16TXqiDXkdeS15PXmdedINeV15HXkteT15nXnSDXqteX16rXldeg15nXnTvXqteo15XXpNeV16og15zXqdeZ157XldepINeZ15XXnSDXmdeV157XmS4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9eR16rXmdenINeU15nXkyDXoNeZ16rXnyDXnNeU15vXoNeZ16Eg157Xmdeb15zXmdedINep15TXqteb15XXnNeUINep15zXlNedINec15Ag16LXldec15Qg16LXnCA1MCDXniLXnC4g15DXoNeQINeU16fXpNeZ15PXlSDXotecINeS15XXk9ecINeW15QuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXm9ee15Ug15vXnyDXmdepINec15TXldem15nXkCDXm9ecINee15vXqdeZ16gg15fXkyDXnteq15nXpyDXlNeZ15MuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEzIj4mI3gyMDBmO9ee15HXp9ep16og157Xm9ecINeX15HXqNeZINeU16fXkdeV16bXlCDXnNeU15LXmdeiINeR15nXldedINeo15HXmdei15kg15QtIDE2LzQvMjAxNCDXkdep16LXlCAwOTozMCDXnNep16LXqCDXntehJyAzMiDXqdeR16nXk9eUINeU16rXoteV16TXlC4g15DXldeT15Qg15zXm9eV15zXnSDXkdeQ150g16rXotee15PXlSDXkdec15XXlyDXltee16DXmdedINeW15QuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDE0Ij4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEzIj4mI3gyMDBmO9eo16cg15zXkNeX16gg16nXlNeV15PXoteq150g15zXmSDXotecINeU15LXoteq15vXnSDXqteq15fXmdec15Ug15HXqteU15zXmdeaINeU16Yn15DXpyDXkNeZ158uINeQ16og157XlteV15XXk9eqINeU157XmNei158g15nXqSDXnNep15zXlyDXmdep15nXqNeV16og15zXmNeV16fXmdeVLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAxNCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMyI+JiN4MjAwZjvXotec15nXoNeVINec15bXm9eV16gg16nXlNem15zXl9eqINeU15jXmdeV15wg16rXnNeV15nXlCDXkdeb15wg15DXl9eTINee15DXqteg15UuINeQ15fXkyDXlNeb15zXnNeZ150g15TXl9ep15HXldeZ150g15TXldeQINei157XmdeT15Qg15HXnNeV15cg15bXnteg15nXnSAhISEhJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDE0Ij4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMTQiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTMiPiYjeDIwMGY715HXqNem15XXoNeZINec15DXl9ecINec15vXnSDXldec15Ei15Eg15fXkiDXkNeR15nXkSDXpteR16LXldeg15kg15XXqdee15cgISEhJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY715HXkdeo15vXlCwmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY716nXqNeUINek16jXmSYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9IZWJyZXctMDFfZmlsZXMvaW1hZ2UxLnBuZyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvSGVicmV3LTAxX2ZpbGVzL2ltYWdlMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBkZWViMAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvSGVicmV3LTAxX2ZpbGVzL2ltYWdlMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9IZWJyZXctMDFfZmlsZXMvaW1hZ2UyLmpwZWcgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL0hlYnJldy0wMV9maWxlcy9pbWFnZTIuanBlZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjVjNjNiCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9IZWJyZXctMDFfZmlsZXMvaW1hZ2UyLmpwZWcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9IZWJyZXctMDIuaHRtbCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvSGVicmV3LTAyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyMWFlMAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvSGVicmV3LTAyLmh0bWwKQEAgLTAsMCArMSwyMTUgQEAKK++7vzwhRE9DVFlQRSBodG1sID48aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+PHRpdGxlPiA8L3RpdGxlPjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29udGVudD0iUG93ZXJUb29scyBmb3IgT3BlbiBYTUwiIC8+PHN0eWxlPnNwYW4geyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IH0KK3AucHQtTm9ybWFsIHsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9CitzcGFuLnB0LTAwMDAwMCB7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udCB7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDAxIHsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgZm9udC1mYW1pbHk6IEd1dHRtYW4gWWFkLUJydXNoOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9CitzcGFuLnB0LTAwMDAwMiB7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtTm9ybWFsLTAwMDAwMyB7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGZvbnQtZmFtaWx5OiBEYXZpZDsKKyAgICBmb250LXNpemU6IDE2cHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQgeworICAgIGZvbnQtZmFtaWx5OiBEYXZpZDsKKyAgICBmb250LXNpemU6IDE2cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDA1IHsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgZm9udC1mYW1pbHk6IERhdmlkOworICAgIGZvbnQtc2l6ZTogMTZwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9CitzcGFuLnB0LTAwMDAwNiB7CisgICAgZm9udC1zaXplOiAxNnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtTm9ybWFsLTAwMDAwNyB7CisgICAgZm9udC1mYW1pbHk6IEFoYXJvbmk7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4IHsKKyAgICBmb250LWZhbWlseTogQWhhcm9uaTsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitwLnB0LU5vcm1hbC0wMDAwMDkgeworICAgIGZvbnQtZmFtaWx5OiBBaGFyb25pOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCB7CisgICAgZm9udC1mYW1pbHk6IEFoYXJvbmk7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtMDAwMDExIHsKKyAgICBtYXJnaW4tcmlnaHQ6IDAuNTBpbjsKKyAgICB0ZXh0LWluZGVudDogLTAuMjVpbjsKKyAgICBmb250LWZhbWlseTogQWhhcm9uaTsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9CitzcGFuLnB0LTAwMDAxMiB7CisgICAgZm9udC1mYW1pbHk6IEFoYXJvbmk7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICB0ZXh0LWluZGVudDogMDsKKyAgICB3aWR0aDogMC4yNTBpbjsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEzIHsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorc3Bhbi5wdC0wMDAwMTQgeworICAgIG1hcmdpbjogMCAwIDAgMC41MGluOworICAgIHBhZGRpbmc6IDAgMCAwIDA7Cit9CitwLnB0LU5vcm1hbC0wMDAwMTUgeworICAgIG1hcmdpbi1yaWdodDogMC4wMmluOworICAgIGZvbnQtZmFtaWx5OiBBaGFyb25pOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3AucHQtTm9ybWFsLTAwMDAxNiB7CisgICAgbWFyZ2luLXJpZ2h0OiAwLjAyaW47CisgICAgZm9udC1mYW1pbHk6IEFoYXJvbmk7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC0wMDAwMTcgeworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIHRleHQtaW5kZW50OiAwOworICAgIHdpZHRoOiAwLjI1MGluOworfQorc3Bhbi5wdC0wMDAwMTggeworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICB0ZXh0LWluZGVudDogMDsKKyAgICB3aWR0aDogMC4yNTBpbjsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE5IHsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtTm9ybWFsLTAwMDAyMCB7CisgICAgbWFyZ2luLXJpZ2h0OiAwLjI1aW47CisgICAgZm9udC1mYW1pbHk6IEFoYXJvbmk7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorcC5wdC1Ob3JtYWwtMDAwMDIxIHsKKyAgICBtYXJnaW4tbGVmdDogMC4wMmluOworICAgIGZvbnQtZmFtaWx5OiBBaGFyb25pOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9CitwLnB0LU5vcm1hbC0wMDAwMjIgeworICAgIG1hcmdpbi1sZWZ0OiAwLjAyaW47CisgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9Citib2R5IHsgbWFyZ2luOiAxY20gYXV0bzsgbWF4LXdpZHRoOiAyMGNtOyBwYWRkaW5nOiAwOyB9PC9zdHlsZT48L2hlYWQ+PGJvZHk+PGRpdiBkaXI9InJ0bCI+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZTsgJiN4MjAwZTs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsIj4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+PGltZyBzcmM9IkhlYnJldy0wMl9maWxlcy9pbWFnZTEuZ2lmIiBzdHlsZT0id2lkdGg6IDIuMTU2MjVpbjsgaGVpZ2h0OiAyLjM3NWluIiBhbHQ9Ik1NajAyODMxMDEwMDAwWzFdIiAvPjwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwMSI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAyIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDAzIj4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij4mI3gyMDBmO9eY15nXldecINec15TXldeT15Ug16DXpNeQ15wg16TXkdeo15XXkNeoIDIwMTMgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNSI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDA2Ij4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9ec16DXldeh16LXmdedINep15zXldedLCYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDkiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNyI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXnteV16LXkyDXlNeY15nXldecINeU15XXnNeaINeV157Xqten16jXkS4g15DXqtedINei15XXnteT15nXnSDXnNem15DXqiDXnNeX15HXnCDXkNeo16Ug15HXqteV15og16rXqiDXlNeZ15HXqdeqINeU15TXldeT15nXqi4g15TXmNeZ15XXnCDXlNeg15Ug15jXmdeV15wg157XqNeq16cuINeY15nXldecINep15nXpNei15nXnCDXkNeqINeb15wg15TXl9eV16nXmdedLiDXlteUINec15Ag16LXldeTINeY15nXldecLCDXkNec15Ag15fXldeV15nXlCDXqdeQ15kt15DXpNep16gg15zXl9eW15XXqCDXntee16DXlCDXkNeT15nXqdeZ150uICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY7157Xp9eV150g16nXntei15XXqNeoINee15fXqdeR15XXqiDXqNeR15XXqi4g157Xotec15Qg15TXqNeR15Qg157XkNeV15Mg16HXmdee16DXmSDXqdeQ15zXlCDXldeZ15fXkyDXotedINeW15DXqiDXqNeR15nXnSDXnteU16DXldeh16LXmdedINeX15XXlteo15nXnSDXlNeR15nXqteUINei150g16rXl9eV16nXlCDXqdeU150g16jXldem15nXnSDXnNeX15bXldeoINeV15zXqteV16gg15HXlCDXpNei150g16DXldeh16TXqi4g157Xp9eV15XXlCDXqdeQ16rXnSDXqtep15XXkdeVINei150g15TXqNeS16nXlCDXk9eV157XlC4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA5Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY715zXlNec158g157Xodek16gg16LXpteV16og15zXoNeV16HXoteZ1506JiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwOSI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9eU15vXoNeV16og15jXqNeV150g16DXodeZ16LXlCAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9eb15PXkNeZINec16TXoNeV16og15zXnNep15vXqiDXlNeR16jXmdeQ15XXqiDXlNen16jXldeR15Qg15zXnten15XXnSDXnteS15XXqNeZ15vXnSwg15HXm9eT15kg15zXlNeq15nXmdei16Ug16LXnSDXlNee15fXnNen15Qg15zXmNeZ15XXnNeZ150g15XXnNen15HXnCDXlNeT16jXm9eUINec15LXkdeZINeU15fXmdeh15XXoNeZ150g15TXk9eo15XXqdeZ150g15zXpNeZINee16bXkSDXlNeR16jXmdeQ15XXqiDXqdec15vXnS4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA5Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY715XXmdeW15XXqizXk9eo15vXldeg15nXnSzXkdeZ15jXldeXINeV16rXmden15kg15nXkyAtJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDExIj4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtMDAwMDEyIj4mI3gyMDBmOzEuJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY716rXlden16Mg15TXk9eo15vXldefINec16TXl9eV16og15fXpteZINep16DXlC4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMTEiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC0wMDAwMTIiPiYjeDIwMGY7Mi4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXldeZ15bXlCDXnNeU15XXk9eVICjXm9eg15nXodeUINeb16TXldec15QpLiDXlNeV15nXlteUINec16DXpNeQ15wg16DXotep15nXqiDXkdeb16DXmdeh15Qg15zXoNek15DXnCwg15nXqSDXnNeU16bXmNeZ15nXkyDXkdep16rXmSDXqtee15XXoNeV16og16TXodek15XXqNeYINec15TXldem15DXqiDXlNeV15nXlteULiAgICAgICAgICAgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY716LXnNeV16og15XXmdeW15Qg15TXldeQIDI1JCDXnNeg15XXodeiLiDXmyLXkCDXnteU16DXldeh16LXmdedINeZ16nXnNedINeh15vXldedINeW15Qg15HXm9eg15nXodeULiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAxMSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAxMiI+JiN4MjAwZjszLiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9eR15nXmNeV15cg16jXpNeV15DXmSDXldee15jXotefOiDXm9eT15DXmSDXnNei16nXldeqINeR15nXmNeV15cg16jXpNeV15DXmSDXlNeb15XXnNecINek15nXoNeV15kg15HXlNeZ15jXoSDXldec15Ag15zXlNeh16rXpNenINeR15HXmdeY15XXlyDXodeY16DXk9eo15jXmSDXqdecINeX15HXqNeV16og15vXqNeY15nXodeZINeU15DXqdeo15DXmS4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMTEiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC0wMDAwMTIiPiYjeDIwMGY7NC4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXmdepINec16bXnNedINeQ16og15TXotee15XXk9eZ150g15TXqNec15XXldeg15jXmdedINee15TXk9eo15vXldefICjXpNeo15jXmdedINeV15XXmdeW15QpINeV15vXnyDXpteZ15zXldedINep15wg15vXqNeY15nXodeZINeU15jXmdeh15Qg15XXnNeU15jXnteZ16DXnSDXkdee15bXldeV15PXlC4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMTEiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC0wMDAwMTIiPiYjeDIwMGY7NS4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXkdeq15nXpyDXlNeZ15Mv157XlteV15XXk9eqINeU15nXkyDXqNem15XXmSDXnNeU15vXoNeZ16Eg15fXnNeZ16TXqiDXkdeS15PXmdedINec15TXl9ec16TXlCDXldeq16jXldek15XXqi4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMTEiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC0wMDAwMTIiPiYjeDIwMGY7Ni4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXkdeq15nXp9eZINeU15nXkyDXmdepINec16fXl9eqINee15nXm9ec15nXnSAo16nXpNeV16jXpNeo15XXqiDXldeR16fXkdeV16fXmdedKSDXlNee15vXmdec15nXnSDXoteTIDUwINee154i15wuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDExIj4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtMDAwMDEyIj4mI3gyMDBmOzcuJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY7157Xqden15wg157XlteV15XXk9eqINeU157XmNei158g15zXkCDXmdei15zXlCDXotecIDIwINenIteSLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDkiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNyI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXlNeY15nXodeUINee16DXqteRIteSINeRICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmOyAyNS8yLzIwMTMsINee16HXpNeoINeY15nXodeUICYjeDIwMGY7PC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTMiPiYjeDIwMGU7VEsgJiN4MjAwZTs8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMyI+JiN4MjAwZTvigJMmI3gyMDBlOzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEzIj4mI3gyMDBlOyA3ODcgJiN4MjAwZTs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9eQ16og15TXnteY16LXnyDXmdepINec16nXnNeV15cg15nXqdeZ16jXldeqINec157XldeR15DXmS4gJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwOSI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAyIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9eZ16kg15zXlNeS15nXoiDXnNepIteqIDMg15zXpNeg15kg16nXoteqINeU15TXnteo15DXlC4g15vXnNeV157XqCzXkdep16LXlCAxMjozMC4g15DXnteq15nXnyDXnNeb150g15HXqdei16ggMzIgKNei15wg15nXkyDXlNeT15zXpNenINep157XpteV15nXmdefINeb16DXp9eV15PXqiDXntek15LXqSDXnNen15HXldem15XXqikuINee15HXp9ep16og157Xm9ecINeU16DXldeh16LXmdedINec15TXkteZ16Ig15zXoNen15XXk9eqINeU157XpNeS16kg16LXldeTINeY16jXnSDXqteX15nXnNeqINeq15TXnNeZ15og15TXpifXpyDXkNeZ158uJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwOSI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAyIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9eb16HXoyDXldeU15XXpteQ15XXqiAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9eb15PXkNeZINec15TXpteY15nXmdeTINeR15PXldec16gg15DXnteo15nXp9eQ15kg16jXpteV15kg16nXlNep15jXqNeV16og15nXlNeZ15Ug15fXk9ep15nXnSwg15vXnteVINeb158g157Xldee15zXpSDXnNeU16bXmNeZ15nXkyDXkdep15jXqNeV16og15TXp9eY16DXmdedINeeICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmOyAxMDAkLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY715TXlNeV16bXkNeV16og15TXmdeV157XmdeV16og15TXqdeV15jXpNeV16og15zXkNeT150g15TXnyDXmy0gMjAkICjXkNeg15fXoNeVINee16fXkdec15nXnSDXkNeo15XXl9eqINeR15XXp9eoINeV16LXqNeRKS4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjsg16HXm9eV150g15bXlCDXkNeZ16DXoNeVINeb15XXnNecINen16DXmdeV16ouJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNyI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXkdeg15XXodejINec16HXm9eV150g15TXoCLXnCAtJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNyI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXm9ecINeg15XXodeiINeZ16nXnNedIDI1JCDXoteR15XXqCDXldeZ15bXlCDXnNeg16TXkNecLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY715vXnCDXoNeV16HXoiDXmdep15zXnSAzMCQg157XoSDXoNee15wg15HXp9eY157XoNeT15UuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwOSI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9eo16bXldeZINec16nXnteV16gg15DXqiDXkNeX16og157Xp9eR15zXldeqINeU157XqNeqINeU15vXodek15nXnSDXldeW15DXqiDXkdeb15PXmSDXqdeQ16TXqdeoINeZ15TXmdeUINec15TXl9ec15nXoyDXkNeqINeU15vXodejINeU16LXldeT16Mg16LXnSDXodeZ15XXnSDXlNeY15nXldecLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY716nXoteo15kg15TXlNee16jXlDomI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIj4jeDIwMGbXmy0gNTMuOSDXqNeV16TXmSDXlNeV15PXmSAgICDXnCAjeDIwMGY8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiPiN4MjAwZuKAkyN4MjAwZjwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCI+I3gyMDBmIDEkLiN4MjAwZjwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTQiPiYjeDAwYTA7PC9zcGFuPjwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjsxNC42NiDXqNeV16TXmSDXlNeV15PXmSAgID0gMSDXqSLXlyYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiPiN4MjAwZtebLSA4Ni42OCAg16jXldek15kg16DXpNeQ15zXmSDXnCAjeDIwMGY8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiPiN4MjAwZuKAkyN4MjAwZjwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCI+I3gyMDBmIDEkLiN4MjAwZjwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTQiPiYjeDAwYTA7PC9zcGFuPjwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjsyMy43NSDXqNeV16TXmSDXoNek15zXkNeZID0gMSDigqomI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAyIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE1Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9eU16TXqNep15kg15bXnteg15nXnSAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE1Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9ep16LXldefINeg16TXkNecICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9ee16fXk9eZ150mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjsg15DXqiDXmdep16jXkNecINeRLSAzINep16LXldeqINeVLSA0NSDXk9en15XXqiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY716nXoteV158g15TXldeT15UgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY7157Xp9eT15nXnSYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmOyDXkNeqINep16LXldefINeZ16nXqNeQ15wg15EgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY7ICAzINep16LXldeqINeVICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmOyAzMCDXk9en15XXqiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNyI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXqten16nXldeo16ogJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAxMSI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDE3Ij4mI3gyMDBlOy0mI3gyMDBlOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXkNeZ16DXmNeo16DXmCYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAxMSI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDE3Ij4mI3gyMDBlOy0mI3gyMDBlOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXmNec16TXldeg15nXnSDXpteZ15HXldeo15nXmdedJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDExIj4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMTciPiYjeDIwMGU7LSYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9eY15zXpNeV16DXmdedINeh15zXldec16jXmdeZ150gJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY7INeU16nXmdee15XXqSDXmden16gu15nXqdeg150g15DXlteV16jXmdedINep15HXlNedINeQ15nXnyDXm9eZ16HXldeZINec15jXnNek15XXoNeZ150uJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDExIj4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMTciPiYjeDIwMGU7LSYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9ec15HXotec15kg15TXodee15DXqNeYINek15XXnyDXldeR16LXnNeZINen15Ug15HXltenINeR15HXmdeqLCDXntee15zXmdem15Qg15zXlNeV16jXmdeTINeQ16og15TXkNek15zXmden16bXmdeUINep15wg15HXltenINep16DXp9eo15DXqiDXkdeZLdek15XXnyAtICYjeDIwMGY7PC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTMiPiYjeDIwMGU7QlBIT05FJiN4MjAwZTs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDExIj4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMTgiPiYjeDIwMGU7LSYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9em15zXnteVINeQ16og16jXqdeZ157XqiDXkdeq15kg15TXntec15XXnyDXldee16HXpNeo15kg15TXmNec16TXldefINep16rXp9eR15zXlSDXldeU16nXkCYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9eZ16jXlSDXkNeqINeU16jXqdeZ157XlCDXnNee16nXpNeX15QuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwOSI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAyIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9eX16nXntecOiAyMjAgJiN4MjAwZjs8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxOSI+JiN4MjAwZTtXJiN4MjAwZTs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwOSI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAyIj4mI3gyMDBlOyAmI3gyMDBlOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDIwIj4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY716rXqNeV16TXldeqINeV15TXmdeS15nXmdegJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY715QmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXnNee16nXqtee16nXmdedINeR16rXqNeV16TXldeqINeR15DXldek158g16fXkdeV16Ig15nXqSDXnNen15fXqiDXkNeV16rXnyDXkdeq15nXpyDXlNeZ15MuINeo16bXldeZINec16fXl9eqINeq16jXldek15XXqiDXnNep15nXnteV16kg15DXmdep15kg15vXkteV1586INeQ16fXldee15XXnCwg15DXp9eV157XldecINen15XXnNeTLCDXqteo15XXpNeUINeg15LXkyDXlNeo16LXnNeqINen15nXkdeULCDXldeb15PXldeo15nXnSDXntei15XXqNeo15kg16fXmdeR15QsINeQ15LXk9eZ150g16DXk9eR16fXmdedLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY7157Xntec15nXpteUINec16fXl9eqINee15jXnNeZ15XXqiDXnNeX15XXqiDXldeSJ9ecINec15fXmdeY15XXmSDXlNeZ15PXmdeZ150uJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAyIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY715DXldeb15wg15XXnteZ150gJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXkNek16nXqCDXnNeU15HXmdeQINee16LXmCDXl9eY15nXpNeZ150sINek15nXqNeV16og15nXkdep15nXnSDXldeb15UnINec16DXqdeg15XXqSDXkdeZ158g15TXkNeo15XXl9eV16ouICjXkNecINeq16LXnteZ16HXlSDXlNeo15HXlCDXnteT15kgISEpLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY715zXntei15XXoNeZ15nXoNeZJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY7150mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjsg15HXkNeV15vXnCDXptee15fXldeg15kg15HXmNeZ16HXldeqINeZ16kg15zXoteT15vXnyDXnteR16LXldeTINee15XXoteTINeQ16og16HXldeb158g15TXoNeh15nXoteV16og16nXkNem15zXlSDXqNeb16nXqtedINeQ16og15TXmNeZ15XXnC4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE1Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9ee15nXnSAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY715nXqSDXnNep16rXldeqINee15kgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY7INek15XXnNeQ16jXmSYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9ehJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY7LiDXkdei16og16fXoNeZ15nXqiDXkden15HXldenINee15nXnSDXmdepINec15HXk9eV16cg16nXlNek16fXpyDXlNeV15Ag157Xp9eV16jXmS4g16DXmdeq158g15zXqNeb15XXqSDXnteZ150g15HXm9ecINee16fXldedLiDXkNeZ158g16bXldeo15og15zXp9eX16og157XlNeQ16jXpS4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMiI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXpteZ15XXkyDXkNeZ16nXmSAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE1Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9eg16LXnNeZINeU15zXmdeb15QsINeb15XXkdeiINee16nXp9ek15kg16nXntepLCDXntep16fXpNeZINeo15DXmdeUINeo15bXqNeR15nXmdedLCDXp9eo150g15TXkteg15QsINee16LXmdecLCDXnteY16jXmdeULiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY7157XkdeX15nXoNeq15zXkdeV16kg15vXk9eQ15kg15zXlNem15jXmdeZ15Mg15HXnNeR15XXqSDXlNeT15XXnteUINec15bXlCDXqdeQ16DXlSDXnteq15zXkdep15nXnSDXkdeZ157XmdedINeQ15zXlCDXkdeQ16jXpS4g15TXkdeV16fXqCDXl9ee15nXnSDXldeR16LXqNeRINei16nXldeZINec15TXmdeV16og16fXqNeZ16gv16fXqC4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY716DXl9ee15Mg15nXlNeZ15Qg15HXkNedINeq15HXmdeQ15Ug16LXnteb150g157Xodek16gg16rXp9ec15nXmNeV16jXmSDXnteV16HXmden15QsINeh16TXldeoL9ee16nXl9enINeV15vXlScuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAyIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE1Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9eU16bXnNeX16og15TXmNeZ15XXnCDXqtec15XXmdeUINeR15vXnCDXkNeX15Mg15XXkNeX16og157XkNeq16DXlS4g15fXnNenINee15TXlNem15zXl9eUINeU15XXkCDXotee15nXk9eUINeR15zXldeX15XXqiDXltee16DXmdedINeV15LXmdec15XXmSDXodeR15zXoNeV16og15XXodeV15HXnNeg15XXqiAuICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMiI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXl9ep15XXkSDXnNeU16nXkNeZ16gg15DXqiDXmNeo15PXldeqINeU15nXldedINeZ15XXnSDXkdeR15nXqiwg15zXlNeS15nXoiDXnNeY15nXldecINei150g15zXkSDXpNeq15XXlywg15DXldeW158g16fXqdeV15HXlCDXldei15nXnyDXpNen15XXl9eULCDXkdeb15PXmSDXqdeU15jXmdeV15wg15nXlNeZ15Qg157Xqdee16LXldeq15kg15XXl9eV15nXmdeq15kuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAyIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY715HXqten15XXldeUINep16DXpteQINeR16nXnNeV150g15XXoNep15XXkSDXm9eV15zXoNeVINec16nXnNeV150uJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAyIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE1Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9eR15HXqNeb15QsJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE1Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9ep16jXlCDXpNeo15kmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMjEiPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9eY15zXpNeV16DXmdedOiDXkdeR15nXqiAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjsgMDktNzQyNTczMyA6INeg15nXmdeTICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmOyAwNTItMjIzMTUyNTImI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDIyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAwIj4gPC9zcGFuPjwvcD48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvSGVicmV3LTAyX2ZpbGVzL2ltYWdlMS5naWYgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL0hlYnJldy0wMl9maWxlcy9pbWFnZTEuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNTEzN2YKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL0hlYnJldy0wMl9maWxlcy9pbWFnZTEuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvSHRtbFRvV21sQ29udmVydGVyMDEuY3MgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL0h0bWxUb1dtbENvbnZlcnRlcjAxLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ODk4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL0h0bWxUb1dtbENvbnZlcnRlcjAxLmNzCkBAIC0wLDAgKzEsMjIwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNS4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKK1B1Ymxpc2hlZCBhdCBodHRwOi8vT3BlblhtbERldmVsb3Blci5vcmcKK1Jlc291cmNlIENlbnRlciBhbmQgRG9jdW1lbnRhdGlvbjogaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3Bvd2VydG9vbHMtZm9yLW9wZW4teG1sLmFzcHgKKworRGV2ZWxvcGVyOiBFcmljIFdoaXRlCitCbG9nOiBodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20KK1R3aXR0ZXI6IEBFcmljV2hpdGVEZXYKK0VtYWlsOiBlcmljQGVyaWN3aGl0ZS5jb20KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5WYWxpZGF0aW9uOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29scy5IdG1sVG9XbWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIdG1sVG9XbWxDb252ZXJ0ZXIgZXhwZWN0cyB0aGUgSFRNTCB0byBiZSBwYXNzZWQgYXMgYW4gWEVsZW1lbnQsIGkuZS4gYXMgWE1MLiAgV2hpbGUgdGhlIEhUTUwgdGVzdCBmaWxlcyB0aGF0CisgKiBhcmUgaW5jbHVkZWQgaW4gT3Blbi1YbWwtUG93ZXJUb29scyBhcmUgYWJsZSB0byBiZSByZWFkIGFzIFhNTCwgbW9zdCBIVE1MIGlzIG5vdCBhYmxlIHRvIGJlIHJlYWQgYXMgWE1MLgorICogVGhlIGJlc3Qgc29sdXRpb24gaXMgdG8gdXNlIHRoZSBIdG1sQWdpbGl0eVBhY2ssIHdoaWNoIGNhbiBwYXJzZSBIVE1MIGFuZCBzYXZlIGFzIFhNTC4gIFRoZSBIdG1sQWdpbGl0eVBhY2sKKyAqIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNcy1QTCAoc2FtZSBhcyBPcGVuLVhtbC1Qb3dlclRvb2xzKSBzbyBpdCBpcyBjb252ZW5pZW50IHRvIGluY2x1ZGUgaXQgaW4geW91ciBzb2x1dGlvbiwKKyAqIGFuZCB0aGVyZWJ5IHlvdSBjYW4gY29udmVydCBIVE1MIHRvIFhNTCB0aGF0IGNhbiBiZSBwcm9jZXNzZWQgYnkgdGhlIEh0bWxUb1dtbENvbnZlcnRlci4KKyAqIAorICogQSBjb252ZW5pZW50IHdheSB0byBnZXQgdGhlIERMTCB0aGF0IGhhcyBiZWVuIGNoZWNrZWQgb3V0IHdpdGggSHRtbFRvV21sQ29udmVydGVyIGlzIHRvIGNsb25lIHRoZSByZXBvIGF0CisgKiBodHRwczovL2dpdGh1Yi5jb20vRXJpY1doaXRlRGV2L0h0bWxBZ2lsaXR5UGFjaworICogCisgKiBUaGF0IHJlcG8gY29udGFpbnMgb25seSB0aGUgRExMIHRoYXQgaGFzIGJlZW4gY2hlY2tlZCBvdXQgd2l0aCBIdG1sVG9XbWxDb252ZXJ0ZXIuCisgKiAKKyAqIE9mIGNvdXJzZSwgeW91IGNhbiBhbHNvIGdldCB0aGUgSHRtbEFnaWxpdHlQYWNrIHNvdXJjZSBhbmQgY29tcGlsZSBpdCB0byBnZXQgdGhlIERMTC4gIFlvdSBjYW4gZmluZCBpdCBhdAorICogaHR0cDovL2NvZGVwbGV4LmNvbS9IdG1sQWdpbGl0eVBhY2sKKyAqIAorICogV2UgZG9uJ3QgaW5jbHVkZSB0aGUgSHRtbEFnaWxpdHlQYWNrIGluIE9wZW4tWG1sLVBvd2VyVG9vbHMsIHRvIHNpbXBsaWZ5IGluc3RhbGxhdGlvbi4gIFRoZSBleGFtcGxlIGZpbGVzCisgKiBpbiB0aGlzIG1vZHVsZSBkbyBub3QgcmVxdWlyZSBIdG1sQWdpbGl0eVBhY2sgdG8gcnVuLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY2xhc3MgSHRtbFRvV21sQ29udmVydGVyRXhhbXBsZQoreworICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICB7CisgICAgICAgIHZhciBuID0gRGF0ZVRpbWUuTm93OworICAgICAgICB2YXIgdGVtcERpID0gbmV3IERpcmVjdG9yeUluZm8oc3RyaW5nLkZvcm1hdCgiRXhhbXBsZU91dHB1dC17MDowMH0tezE6MDB9LXsyOjAwfS17MzowMH17NDowMH17NTowMH0iLCBuLlllYXIgLSAyMDAwLCBuLk1vbnRoLCBuLkRheSwgbi5Ib3VyLCBuLk1pbnV0ZSwgbi5TZWNvbmQpKTsKKyAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgIGZvcmVhY2ggKHZhciBmaWxlIGluIERpcmVjdG9yeS5HZXRGaWxlcygiLi4vLi4vIiwgIiouaHRtbCIpIC8qIC5XaGVyZShmID0+IGYuQ29udGFpbnMoIlRlc3QtMDEiKSkgKi8gKQorICAgICAgICB7CisgICAgICAgICAgICBDb252ZXJ0VG9Eb2N4KGZpbGUsIHRlbXBEaS5GdWxsTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvbnZlcnRUb0RvY3goc3RyaW5nIGZpbGUsIHN0cmluZyBkZXN0aW5hdGlvbkRpcikKKyAgICB7CisgICAgICAgIGJvb2wgc19Qcm9kdWNlQW5ub3RhdGVkSHRtbCA9IHRydWU7CisKKyAgICAgICAgdmFyIHNvdXJjZUh0bWxGaSA9IG5ldyBGaWxlSW5mbyhmaWxlKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNvbnZlcnRpbmcgIiArIHNvdXJjZUh0bWxGaS5OYW1lKTsKKyAgICAgICAgdmFyIHNvdXJjZUltYWdlRGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhkZXN0aW5hdGlvbkRpcik7CisKKyAgICAgICAgdmFyIGRlc3RDc3NGaSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoZGVzdGluYXRpb25EaXIsIHNvdXJjZUh0bWxGaS5OYW1lLlJlcGxhY2UoIi5odG1sIiwgIi0yLmNzcyIpKSk7CisgICAgICAgIHZhciBkZXN0RG9jeEZpID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShkZXN0aW5hdGlvbkRpciwgc291cmNlSHRtbEZpLk5hbWUuUmVwbGFjZSgiLmh0bWwiLCAiLTMtQ29udmVydGVkQnlIdG1sVG9XbWwuZG9jeCIpKSk7CisgICAgICAgIHZhciBhbm5vdGF0ZWRIdG1sRmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKGRlc3RpbmF0aW9uRGlyLCBzb3VyY2VIdG1sRmkuTmFtZS5SZXBsYWNlKCIuaHRtbCIsICItNC1Bbm5vdGF0ZWQudHh0IikpKTsKKworICAgICAgICBYRWxlbWVudCBodG1sID0gSHRtbFRvV21sUmVhZEFzWEVsZW1lbnQuUmVhZEFzWEVsZW1lbnQoc291cmNlSHRtbEZpKTsKKyAgICAgICAgCisgICAgICAgIHN0cmluZyB1c2VkQXV0aG9yQ3NzID0gSHRtbFRvV21sQ29udmVydGVyLkNsZWFuVXBDc3MoKHN0cmluZylodG1sLkRlc2NlbmRhbnRzKCkuRmlyc3RPckRlZmF1bHQoZCA9PiBkLk5hbWUuTG9jYWxOYW1lLlRvTG93ZXIoKSA9PSAic3R5bGUiKSk7CisgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KGRlc3RDc3NGaS5GdWxsTmFtZSwgdXNlZEF1dGhvckNzcyk7CisKKyAgICAgICAgSHRtbFRvV21sQ29udmVydGVyU2V0dGluZ3Mgc2V0dGluZ3MgPSBIdG1sVG9XbWxDb252ZXJ0ZXIuR2V0RGVmYXVsdFNldHRpbmdzKCk7CisgICAgICAgIC8vIGltYWdlIHJlZmVyZW5jZXMgaW4gSFRNTCBmaWxlcyBjb250YWluIHRoZSBwYXRoIHRvIHRoZSBzdWJkaXIgdGhhdCBjb250YWlucyB0aGUgaW1hZ2VzLCBzbyBiYXNlIFVSSSBpcyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisgICAgICAgIC8vIHRoYXQgY29udGFpbnMgdGhlIEhUTUwgZmlsZXMKKyAgICAgICAgc2V0dGluZ3MuQmFzZVVyaUZvckltYWdlcyA9IHNvdXJjZUh0bWxGaS5EaXJlY3RvcnlOYW1lOworCisgICAgICAgIFdtbERvY3VtZW50IGRvYyA9IEh0bWxUb1dtbENvbnZlcnRlci5Db252ZXJ0SHRtbFRvV21sKGRlZmF1bHRDc3MsIHVzZWRBdXRob3JDc3MsIHVzZXJDc3MsIGh0bWwsIHNldHRpbmdzLCBudWxsLCBzX1Byb2R1Y2VBbm5vdGF0ZWRIdG1sID8gYW5ub3RhdGVkSHRtbEZpLkZ1bGxOYW1lIDogbnVsbCk7CisgICAgICAgIGRvYy5TYXZlQXMoZGVzdERvY3hGaS5GdWxsTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIEh0bWxUb1dtbFJlYWRBc1hFbGVtZW50CisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIFhFbGVtZW50IFJlYWRBc1hFbGVtZW50KEZpbGVJbmZvIHNvdXJjZUh0bWxGaSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGh0bWxTdHJpbmcgPSBGaWxlLlJlYWRBbGxUZXh0KHNvdXJjZUh0bWxGaS5GdWxsTmFtZSk7CisgICAgICAgICAgICBYRWxlbWVudCBodG1sID0gbnVsbDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGh0bWwgPSBYRWxlbWVudC5QYXJzZShodG1sU3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyNpZiBVU0VfSFRNTEFHSUxJVFlQQUNLCisgICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEh0bWxEb2N1bWVudCBoZG9jID0gbmV3IEh0bWxEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIGhkb2MuTG9hZChzb3VyY2VIdG1sRmkuRnVsbE5hbWUsIEVuY29kaW5nLkRlZmF1bHQpOworICAgICAgICAgICAgICAgIGhkb2MuT3B0aW9uT3V0cHV0QXNYbWwgPSB0cnVlOworICAgICAgICAgICAgICAgIGhkb2MuU2F2ZShzb3VyY2VIdG1sRmkuRnVsbE5hbWUsIEVuY29kaW5nLkRlZmF1bHQpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihGaWxlLlJlYWRBbGxUZXh0KHNvdXJjZUh0bWxGaS5GdWxsTmFtZSwgRW5jb2RpbmcuRGVmYXVsdCkpOworICAgICAgICAgICAgICAgIHNiLlJlcGxhY2UoIiZhbXA7IiwgIiYiKTsKKyAgICAgICAgICAgICAgICBzYi5SZXBsYWNlKCImbmJzcDsiLCAiXHhBMCIpOworICAgICAgICAgICAgICAgIHNiLlJlcGxhY2UoIiZxdW90OyIsICJcIiIpOworICAgICAgICAgICAgICAgIHNiLlJlcGxhY2UoIiZsdDsiLCAifmx0OyIpOworICAgICAgICAgICAgICAgIHNiLlJlcGxhY2UoIiZndDsiLCAifmd0OyIpOworICAgICAgICAgICAgICAgIHNiLlJlcGxhY2UoIiYjIiwgIn4jIik7CisgICAgICAgICAgICAgICAgc2IuUmVwbGFjZSgiJiIsICImYW1wOyIpOworICAgICAgICAgICAgICAgIHNiLlJlcGxhY2UoIn5sdDsiLCAiJmx0OyIpOworICAgICAgICAgICAgICAgIHNiLlJlcGxhY2UoIn5ndDsiLCAiJmd0OyIpOworICAgICAgICAgICAgICAgIHNiLlJlcGxhY2UoIn4jIiwgIiYjIik7CisgICAgICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoc291cmNlSHRtbEZpLkZ1bGxOYW1lLCBzYi5Ub1N0cmluZygpLCBFbmNvZGluZy5EZWZhdWx0KTsKKyAgICAgICAgICAgICAgICBodG1sID0gWEVsZW1lbnQuUGFyc2Uoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIC8vIEh0bWxUb1dtbENvbnZlcnRlciBleHBlY3RzIHRoZSBIVE1MIGVsZW1lbnRzIHRvIGJlIGluIG5vIG5hbWVzcGFjZSwgc28gY29udmVydCBhbGwgZWxlbWVudHMgdG8gbm8gbmFtZXNwYWNlLgorICAgICAgICAgICAgaHRtbCA9IChYRWxlbWVudClDb252ZXJ0VG9Ob05hbWVzcGFjZShodG1sKTsKKyAgICAgICAgICAgIHJldHVybiBodG1sOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IENvbnZlcnRUb05vTmFtZXNwYWNlKFhOb2RlIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhFbGVtZW50IGVsZW1lbnQgPSBub2RlIGFzIFhFbGVtZW50OworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhFbGVtZW50KGVsZW1lbnQuTmFtZS5Mb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuQXR0cmlidXRlcygpLldoZXJlKGEgPT4gIWEuSXNOYW1lc3BhY2VEZWNsYXJhdGlvbiksCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBDb252ZXJ0VG9Ob05hbWVzcGFjZShuKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgc3RyaW5nIGRlZmF1bHRDc3MgPQorICAgICAgICBAImh0bWwsIGFkZHJlc3MsCitibG9ja3F1b3RlLAorYm9keSwgZGQsIGRpdiwKK2RsLCBkdCwgZmllbGRzZXQsIGZvcm0sCitmcmFtZSwgZnJhbWVzZXQsCitoMSwgaDIsIGgzLCBoNCwKK2g1LCBoNiwgbm9mcmFtZXMsCitvbCwgcCwgdWwsIGNlbnRlciwKK2RpciwgaHIsIG1lbnUsIHByZSB7IGRpc3BsYXk6IGJsb2NrOyB1bmljb2RlLWJpZGk6IGVtYmVkIH0KK2xpIHsgZGlzcGxheTogbGlzdC1pdGVtIH0KK2hlYWQgeyBkaXNwbGF5OiBub25lIH0KK3RhYmxlIHsgZGlzcGxheTogdGFibGUgfQordHIgeyBkaXNwbGF5OiB0YWJsZS1yb3cgfQordGhlYWQgeyBkaXNwbGF5OiB0YWJsZS1oZWFkZXItZ3JvdXAgfQordGJvZHkgeyBkaXNwbGF5OiB0YWJsZS1yb3ctZ3JvdXAgfQordGZvb3QgeyBkaXNwbGF5OiB0YWJsZS1mb290ZXItZ3JvdXAgfQorY29sIHsgZGlzcGxheTogdGFibGUtY29sdW1uIH0KK2NvbGdyb3VwIHsgZGlzcGxheTogdGFibGUtY29sdW1uLWdyb3VwIH0KK3RkLCB0aCB7IGRpc3BsYXk6IHRhYmxlLWNlbGwgfQorY2FwdGlvbiB7IGRpc3BsYXk6IHRhYmxlLWNhcHRpb24gfQordGggeyBmb250LXdlaWdodDogYm9sZGVyOyB0ZXh0LWFsaWduOiBjZW50ZXIgfQorY2FwdGlvbiB7IHRleHQtYWxpZ246IGNlbnRlciB9Citib2R5IHsgbWFyZ2luOiBhdXRvOyB9CitoMSB7IGZvbnQtc2l6ZTogMmVtOyBtYXJnaW46IGF1dG87IH0KK2gyIHsgZm9udC1zaXplOiAxLjVlbTsgbWFyZ2luOiBhdXRvOyB9CitoMyB7IGZvbnQtc2l6ZTogMS4xN2VtOyBtYXJnaW46IGF1dG87IH0KK2g0LCBwLAorYmxvY2txdW90ZSwgdWwsCitmaWVsZHNldCwgZm9ybSwKK29sLCBkbCwgZGlyLAorbWVudSB7IG1hcmdpbjogYXV0byB9CithIHsgY29sb3I6IGJsdWU7IH0KK2g1IHsgZm9udC1zaXplOiAuODNlbTsgbWFyZ2luOiBhdXRvIH0KK2g2IHsgZm9udC1zaXplOiAuNzVlbTsgbWFyZ2luOiBhdXRvIH0KK2gxLCBoMiwgaDMsIGg0LAoraDUsIGg2LCBiLAorc3Ryb25nIHsgZm9udC13ZWlnaHQ6IGJvbGRlciB9CitibG9ja3F1b3RlIHsgbWFyZ2luLWxlZnQ6IDQwcHg7IG1hcmdpbi1yaWdodDogNDBweCB9CitpLCBjaXRlLCBlbSwKK3ZhciwgYWRkcmVzcyB7IGZvbnQtc3R5bGU6IGl0YWxpYyB9CitwcmUsIHR0LCBjb2RlLAora2JkLCBzYW1wIHsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSB9CitwcmUgeyB3aGl0ZS1zcGFjZTogcHJlIH0KK2J1dHRvbiwgdGV4dGFyZWEsCitpbnB1dCwgc2VsZWN0IHsgZGlzcGxheTogaW5saW5lLWJsb2NrIH0KK2JpZyB7IGZvbnQtc2l6ZTogMS4xN2VtIH0KK3NtYWxsLCBzdWIsIHN1cCB7IGZvbnQtc2l6ZTogLjgzZW0gfQorc3ViIHsgdmVydGljYWwtYWxpZ246IHN1YiB9CitzdXAgeyB2ZXJ0aWNhbC1hbGlnbjogc3VwZXIgfQordGFibGUgeyBib3JkZXItc3BhY2luZzogMnB4OyB9Cit0aGVhZCwgdGJvZHksCit0Zm9vdCB7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGUgfQordGQsIHRoLCB0ciB7IHZlcnRpY2FsLWFsaWduOiBpbmhlcml0IH0KK3MsIHN0cmlrZSwgZGVsIHsgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2ggfQoraHIgeyBib3JkZXI6IDFweCBpbnNldCB9CitvbCwgdWwsIGRpciwKK21lbnUsIGRkIHsgbWFyZ2luLWxlZnQ6IDQwcHggfQorb2wgeyBsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWwgfQorb2wgdWwsIHVsIG9sLAordWwgdWwsIG9sIG9sIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMCB9Cit1LCBpbnMgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSB9CiticjpiZWZvcmUgeyBjb250ZW50OiAiIlxBIiI7IHdoaXRlLXNwYWNlOiBwcmUtbGluZSB9CitjZW50ZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXIgfQorOmxpbmssIDp2aXNpdGVkIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgfQorOmZvY3VzIHsgb3V0bGluZTogdGhpbiBkb3R0ZWQgaW52ZXJ0IH0KKy8qIEJlZ2luIGJpZGlyZWN0aW9uYWxpdHkgc2V0dGluZ3MgKGRvIG5vdCBjaGFuZ2UpICovCitCRE9bRElSPSIibHRyIiJdIHsgZGlyZWN0aW9uOiBsdHI7IHVuaWNvZGUtYmlkaTogYmlkaS1vdmVycmlkZSB9CitCRE9bRElSPSIicnRsIiJdIHsgZGlyZWN0aW9uOiBydGw7IHVuaWNvZGUtYmlkaTogYmlkaS1vdmVycmlkZSB9CisqW0RJUj0iImx0ciIiXSB7IGRpcmVjdGlvbjogbHRyOyB1bmljb2RlLWJpZGk6IGVtYmVkIH0KKypbRElSPSIicnRsIiJdIHsgZGlyZWN0aW9uOiBydGw7IHVuaWNvZGUtYmlkaTogZW1iZWQgfQorCisiOworCisgICAgc3RhdGljIHN0cmluZyB1c2VyQ3NzID0gQCIiOworfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9IdG1sVG9XbWxDb252ZXJ0ZXIwMS5jc3Byb2ogYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL0h0bWxUb1dtbENvbnZlcnRlcjAxLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM5NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9IdG1sVG9XbWxDb252ZXJ0ZXIwMS5jc3Byb2oKQEAgLTAsMCArMSwxNSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldDQ1PC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXE9wZW5YbWxQb3dlclRvb2xzXE9wZW5YbWxQb3dlclRvb2xzLmNzcHJvaiIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJEb2N1bWVudEZvcm1hdC5PcGVuWG1sIiBWZXJzaW9uPSIyLjguMSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IldpbmRvd3NCYXNlIiAvPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODgxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApAQCAtMCwwICsxLDMgQEAKK0V4YW1wbGUgb3V0cHV0IGZpbGVzIGFyZSBpbiBhIERhdGVUaW1lIHN0YW1wZWQgZGlyZWN0b3J5IGluIC4vYmluL2RlYnVnLiAgVGhlIGRpcmVjdG9yeSBuYW1lIGlzIEV4YW1wbGVPdXRwdXQteXktbW0tZGQtaGhtbXNzLgorCitJZiB5b3UgYXJlIGJ1aWxkaW5nIGluIHJlbGVhc2UgbW9kZSwgdGhleSB3aWxsLCBvZiBjb3Vyc2UsIGJlIGluIC4vYmluL3JlbGVhc2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9SZXN1bWVUZW1wbGF0ZS5odG1sIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9SZXN1bWVUZW1wbGF0ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YzlkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL1Jlc3VtZVRlbXBsYXRlLmh0bWwKQEAgLTAsMCArMSwxNTYgQEAKK++7vzwhRE9DVFlQRSBodG1sID48aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+PHRpdGxlPjwvdGl0bGU+PG1ldGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJQb3dlclRvb2xzIGZvciBPcGVuIFhNTCIgLz48c3R5bGU+c3BhbiB7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQorcC5wdC1UaXRsZSB7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBsaW5lLWhlaWdodDogMTUwLjAlOworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgZm9udC1mYW1pbHk6IE1pY3Jvc29mdCBZYUhlaSBVSTsKKyAgICBmb250LXNpemU6IDIwcHQ7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1hIHsKKyAgICBjb2xvcjogIzAwMDAwMDsKKyAgICBmb250LWZhbWlseTogTWljcm9zb2Z0IFlhSGVpIFVJOworICAgIGZvbnQtc2l6ZTogMjBwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQgeworICAgIGNvbG9yOiAjN0Y3RjdGOworICAgIGZvbnQtZmFtaWx5OiBNaWNyb3NvZnQgWWFIZWkgVUk7CisgICAgZm9udC1zaXplOiAxNnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1hMSB7CisgICAgbGluZS1oZWlnaHQ6IDE1MC4wJTsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIGZvbnQtZmFtaWx5OiBNaWNyb3NvZnQgWWFIZWkgVUk7CisgICAgZm9udC1zaXplOiA1cHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LTAwMDAwMCB7CisgICAgY29sb3I6ICM0MDQwNDA7CisgICAgZm9udC1zaXplOiA1cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitwLnB0LWEwIHsKKyAgICBsaW5lLWhlaWdodDogMTUwLjAlOworICAgIG1hcmdpbi1ib3R0b206IDEwcHQ7CisgICAgZm9udC1mYW1pbHk6IE1pY3Jvc29mdCBZYUhlaSBVSTsKKyAgICBmb250LXNpemU6IDlwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIHsKKyAgICBjb2xvcjogIzQwNDA0MDsKKyAgICBmb250LWZhbWlseTogTWljcm9zb2Z0IFlhSGVpIFVJOworICAgIGZvbnQtc2l6ZTogOXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQoraDEucHQtSGVhZGluZzEgeworICAgIG1hcmdpbi10b3A6IDEwcHQ7CisgICAgbGluZS1oZWlnaHQ6IDE1MC4wJTsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIGZvbnQtZmFtaWx5OiBNaWNyb3NvZnQgWWFIZWkgVUk7CisgICAgZm9udC1zaXplOiAxN3B0OworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIHsKKyAgICBjb2xvcjogIzAwMDAwMDsKKyAgICBmb250LWZhbWlseTogTWljcm9zb2Z0IFlhSGVpIFVJOworICAgIGZvbnQtc2l6ZTogMTdwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RhYmxlLnB0LTAwMDAwMyB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQordGQucHQtMDAwMDA0IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiA0MjUuMjVwdDsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitoMi5wdC1IZWFkaW5nMiB7CisgICAgbWFyZ2luLXRvcDogMXB0OworICAgIGxpbmUtaGVpZ2h0OiAxNTAuMCU7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICBmb250LWZhbWlseTogTWljcm9zb2Z0IFlhSGVpIFVJOworICAgIGZvbnQtc2l6ZTogOXB0OworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtU3Ryb25nIHsKKyAgICBjb2xvcjogIzQwNDA0MDsKKyAgICBmb250LWZhbWlseTogTWljcm9zb2Z0IFlhSGVpIFVJOworICAgIGZvbnQtc2l6ZTogOXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtTm9ybWFsIHsKKyAgICBsaW5lLWhlaWdodDogMTUwLjAlOworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgZm9udC1mYW1pbHk6IE1pY3Jvc29mdCBZYUhlaSBVSTsKKyAgICBmb250LXNpemU6IDlwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3RkLnB0LTAwMDAwNSB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogNzguNzVwdDsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitwLnB0LURhdGUgeworICAgIG1hcmdpbi10b3A6IDFwdDsKKyAgICBsaW5lLWhlaWdodDogMTUwLjAlOworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgZm9udC1mYW1pbHk6IE1pY3Jvc29mdCBZYUhlaSBVSTsKKyAgICBmb250LXNpemU6IDlwdDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LTAwMDAwNiB7CisgICAgY29sb3I6ICM0MDQwNDA7CisgICAgZm9udC1zaXplOiA5cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Citib2R5IHsgbWFyZ2luOiAxY20gYXV0bzsgbWF4LXdpZHRoOiAyMGNtOyBwYWRkaW5nOiAwOyB9PC9zdHlsZT48L2hlYWQ+PGJvZHk+PGRpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRpdGxlIj48c3BhbiBsYW5nPSJ6aC1DTiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LWEiPlvmgqjnmoTlp5PlkI1dIMKgwqB8wqDCoCA8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+5Liq5Lq65bGl5Y6GPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LWExIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAwIj4gPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LWEwIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+W+mCruaUv+e8luegge+8jOecgS/luIIv6Ieq5rK75Yy677yM5biCL+WOv++8jOWcsOWdgF3CoMKgwqBb55S16K+dXcKgwqDCoFvnlLXlrZDpgq7ku7blnLDlnYBdPC9zcGFuPjwvcD48aDEgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMSI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPuaVmeWtpue7j+mqjDwvc3Bhbj48L2gxPjxkaXYgYWxpZ249ImxlZnQiPjx0YWJsZSBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwMyI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDA0Ij48aDIgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMiI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1TdHJvbmciPls8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1TdHJvbmciPuiBjOWKoTwvc3Bhbj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LVN0cm9uZyI+XTwvc3Bhbj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj4gLSBb6K++56iL5oiW5a2m6Zmi5ZCN56ewXTwvc3Bhbj48L2gyPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+W+WcqOatpOWkhOa3u+WKoOeugOefreivtOaYjl08L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZSI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlvotbfmraLlubTku71dPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDA0Ij48aDIgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMiI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1TdHJvbmciPls8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1TdHJvbmciPuiBjOWKoTwvc3Bhbj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LVN0cm9uZyI+XSAtPC9zcGFuPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPiBb6K++56iL5oiW5a2m6Zmi5ZCN56ewXTwvc3Bhbj48L2gyPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+W+imgeabv+aNouWNoOS9jeespuaWh+acrO+8iOS+i+WmguatpOaWh+acrO+8ie+8jOWPqumcgOmAieaLqeWug+W5tuW8gOWni+mUruWFpeOAguivt+WLv+WMheaLrOaCqOeahOaJgOmAieWGheWuueW3puS+p+aIluWPs+S+p+eahOepuuagvOOAgl08L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZSI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlvotbfmraLlubTku71dPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDA0Ij48aDIgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMiI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1TdHJvbmciPls8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1TdHJvbmciPuiBjOWKoTwvc3Bhbj48c3BhbiBsYW5nPSJ6aC1DTiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LVN0cm9uZyI+XSAtIDwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5b6K++56iL5oiW5a2m6Zmi5ZCN56ewXTwvc3Bhbj48L2gyPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+W+imgeWcqOatpOeugOWOhueahOS7u+S9leihqOagvOS4rea3u+WKoOaIluWIoOmZpOihjO+8jOWPqumcgOWNleWHu+afkOihjO+8jOeEtuWQjuWcqOWKn+iDveWMuueahOKAnOihqOagvOW3peWFt+KAneS4i+eahOKAnOW4g+WxgOKAnemAiemhueWNoeS4iu+8jOWNleWHu+KAnOaPkuWFpeKAneaIluKAnOWIoOmZpOKAnemAiemhueOAgl08L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZSI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlvotbfmraLlubTku71dPC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48aDEgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMSI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPuaVmeiCsjwvc3Bhbj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+6IOM5pmvPC9zcGFuPjwvaDE+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAzIj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMDQiPjxoMiBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcyIj48c3BhbiBsYW5nPSJ6aC1DTiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LVN0cm9uZyI+W+iOt+W+l+eahOWtpuS9jV0gLSA8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+W+WtpumZou+8jOS9jee9rl08L3NwYW4+PC9oMj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlvlj6rpnIDku47igJzlvIDlp4vigJ3pgInpobnljaHnmoTigJzmoLflvI/igJ3nu4TkuK3ljZXlh7vvvIzljbPlj6/lupTnlKjmgqjlnKjmraTnroDljobkuK3nnIvliLDnmoTku7vkvZXmlofmnKzmoLzlvI/jgIJdPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGUiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5b6LW35q2i5bm05Lu9XTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAwNCI+PGgyIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzIiPjxzcGFuIGxhbmc9InpoLUNOIiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtU3Ryb25nIj5b6I635b6X55qE5a2m5L2NXSAtIDwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5b5a2m6Zmi77yM5L2N572uXTwvc3Bhbj48L2gyPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+W+iKguagh+mimOS9v+eUqOKAnOagh+mimCAx4oCd5qC35byP44CC5q+P5Liq57uP6aqM5oiW5pWZ6IKy5p2h55uu55qE5qCH6aKY5L2/55So4oCc5qCH6aKYIDLigJ3moLflvI/jgILmraTmlofmnKzkvb/nlKjigJzmma7pgJrigJ3moLflvI/jgILlj7Plr7npvZDmlofmnKzkvb/nlKjigJzml6XmnJ/igJ3moLflvI/jgIJdPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGUiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5b6LW35q2i5bm05Lu9XTwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj7lj5HooajkvZzlk4E8L3NwYW4+PC9oMT48ZGl2IGFsaWduPSJsZWZ0Ij48dGFibGUgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDMiPjx0cj48dGQgY2xhc3M9InB0LTAwMDAwNCI+PGgyIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzIiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtU3Ryb25nIj5bPC9zcGFuPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtU3Ryb25nIj7lj5HooajkvZzlk4E8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1TdHJvbmciPuWQjeensF08L3NwYW4+PC9oMj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlvlnKjmraTlpITmt7vliqDnroDnn63or7TmmI5dPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGUiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5bPC9zcGFuPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj7lj5Hooag8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPuaXpeacn108L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMDQiPjxoMiBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcyIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LVN0cm9uZyI+Wzwvc3Bhbj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LVN0cm9uZyI+5Y+R6KGo5L2c5ZOBPC9zcGFuPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtU3Ryb25nIj7lkI3np7BdPC9zcGFuPjwvaDI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5b5Zyo5q2k5aSE5re75Yqg566A55+t6K+05piOXTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+Wzwvc3Bhbj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+5Y+R6KGoPC9zcGFuPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj7ml6XmnJ9dPC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48aDEgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMSI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPuiOt+Wllue7j+WOhjwvc3Bhbj48L2gxPjxkaXYgYWxpZ249ImxlZnQiPjx0YWJsZSBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwMyI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDA0Ij48aDIgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMiI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1TdHJvbmciPlvlpZY8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1TdHJvbmciPumhuTwvc3Bhbj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LVN0cm9uZyI+5ZCN56ewXe+8jDwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5b5a2m6ZmiXTwvc3Bhbj48L2gyPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZSI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPls8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPuiOt+Wlljwvc3Bhbj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+5pel5pyfXTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAwNCI+PGgyIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzIiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtU3Ryb25nIj5b5aWWPC9zcGFuPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtU3Ryb25nIj7pobk8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1TdHJvbmciPuWQjeensF3vvIw8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+W+WtpumZol08L3NwYW4+PC9oMj48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGUiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5bPC9zcGFuPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj7ojrflpZY8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPuaXpeacn108L3NwYW4+PC9wPjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcxIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+55u45YWz57uP6aqMPC9zcGFuPjwvaDE+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAzIj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMDQiPjxoMiBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcyIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LVN0cm9uZyI+Wzwvc3Bhbj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LVN0cm9uZyI+6IGM5YqhPC9zcGFuPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtU3Ryb25nIj5dIC08L3NwYW4+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+IFs8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPue7hOe7h+WQjeensO+8jOWcsOeCuTwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5dPC9zcGFuPjwvaDI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5b5Zyo5q2k5aSE5re75Yqg566A55+t6K+05piOXTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+W+i1t+atouW5tOS7vV08L3NwYW4+PC9wPjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA2Ij4gPC9zcGFuPjwvcD48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvVGFza1BsYW5UZW1wbGF0ZS5odG1sIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9UYXNrUGxhblRlbXBsYXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyNDE1ZQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvVGFza1BsYW5UZW1wbGF0ZS5odG1sCkBAIC0wLDAgKzEsNDgzIEBACivvu788IURPQ1RZUEUgaHRtbCA+PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPjx0aXRsZT48L3RpdGxlPjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29udGVudD0iUG93ZXJUb29scyBmb3IgT3BlbiBYTUwiIC8+PHN0eWxlPnNwYW4geyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IH0KK3AucHQtYSB7CisgICAgbWFyZ2luLWJvdHRvbTogMjhwdDsKKyAgICBmb250LWZhbWlseTogTWljcm9zb2Z0IFlhSGVpIFVJOworICAgIGZvbnQtc2l6ZTogMTBwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQgeworICAgIGNvbG9yOiAjMDAwMDAwOworICAgIGZvbnQtZmFtaWx5OiBNaWNyb3NvZnQgWWFIZWkgVUk7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGFibGUucHQtMDAwMDAwIHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIGJvcmRlcjogbm9uZTsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9Cit0ZC5wdC0wMDAwMDEgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDQ4MS45cHQ7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogZG91YmxlICMxRkIxRTYgNS4zcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKK30KK3AucHQtVGl0bGUgeworICAgIG1hcmdpbi1ib3R0b206IDRwdDsKKyAgICBmb250LWZhbWlseTogTWljcm9zb2Z0IFlhSGVpIFVJOworICAgIGZvbnQtc2l6ZTogMjRwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIHsKKyAgICBjb2xvcjogIzFGQjFFNjsKKyAgICBmb250LWZhbWlseTogTWljcm9zb2Z0IFlhSGVpIFVJOworICAgIGZvbnQtc2l6ZTogMjRwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtU3VidGl0bGUgeworICAgIG1hcmdpbi10b3A6IDJwdDsKKyAgICBsaW5lLWhlaWdodDogMTIwLjAlOworICAgIG1hcmdpbi1ib3R0b206IDE0cHQ7CisgICAgZm9udC1mYW1pbHk6IE1pY3Jvc29mdCBZYUhlaSBVSTsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorcC5wdC1Ob3JtYWwgeworICAgIGxpbmUtaGVpZ2h0OiAxMjAuMCU7CisgICAgbWFyZ2luLWJvdHRvbTogMTRwdDsKKyAgICBmb250LWZhbWlseTogTWljcm9zb2Z0IFlhSGVpIFVJOworICAgIGZvbnQtc2l6ZTogOC41cHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyB7CisgICAgY29sb3I6ICM1OTU5NTk7CisgICAgZm9udC1mYW1pbHk6IE1pY3Jvc29mdCBZYUhlaSBVSTsKKyAgICBmb250LXNpemU6IDguNXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGFibGUucHQtMDAwMDA0IHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIGJvcmRlcjogbm9uZTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9Cit0ZC5wdC0wMDAwMDUgeworICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CisgICAgd2lkdGg6IDI4Ny45NXB0OworICAgIGJvcmRlci10b3Atc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICM4RkI5MzEgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjOEZCOTMxOworfQorcC5wdC1Ob3JtYWwtMDAwMDA2IHsKKyAgICBtYXJnaW4tdG9wOiA0cHQ7CisgICAgbWFyZ2luLWJvdHRvbTogNHB0OworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBmb250LWZhbWlseTogTWljcm9zb2Z0IFlhSGVpIFVJOworICAgIGZvbnQtc2l6ZTogOXB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA3IHsKKyAgICBjb2xvcjogI0ZGRkZGRjsKKyAgICBmb250LWZhbWlseTogTWljcm9zb2Z0IFlhSGVpIFVJOworICAgIGZvbnQtc2l6ZTogOXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAwOCB7CisgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICB3aWR0aDogNzkuMTVwdDsKKyAgICBib3JkZXItdG9wLXN0eWxlOiBub25lOworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0Y3ODMwMzsKK30KK3RkLnB0LTAwMDAwOSB7CisgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICB3aWR0aDogNTcuNTVwdDsKKyAgICBib3JkZXItdG9wLXN0eWxlOiBub25lOworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0Y3ODMwMzsKK30KK3RkLnB0LTAwMDAxMCB7CisgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICB3aWR0aDogNTcuMjVwdDsKKyAgICBib3JkZXItdG9wLXN0eWxlOiBub25lOworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0YwNjI4QiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0YwNjI4QjsKK30KK3RkLnB0LTAwMDAxMSB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMjg3Ljk1cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNGMkYyRjI7Cit9CitwLnB0LU5vcm1hbC0wMDAwMTIgeworICAgIG1hcmdpbi10b3A6IDRwdDsKKyAgICBsaW5lLWhlaWdodDogMTIwLjAlOworICAgIG1hcmdpbi1ib3R0b206IDRwdDsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgZm9udC1mYW1pbHk6IE1pY3Jvc29mdCBZYUhlaSBVSTsKKyAgICBmb250LXNpemU6IDguNXB0OworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtMDAwMDEzIHsKKyAgICBjb2xvcjogIzU5NTk1OTsKKyAgICBmb250LXNpemU6IDguNXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDE0IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiA3OS4xNXB0OworICAgIGJvcmRlci10b3A6IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjRjJGMkYyOworfQordGQucHQtMDAwMDE1IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiA1Ny41NXB0OworICAgIGJvcmRlci10b3A6IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjRjJGMkYyOworfQorcC5wdC1Ob3JtYWwtMDAwMDE2IHsKKyAgICBtYXJnaW4tdG9wOiA0cHQ7CisgICAgbGluZS1oZWlnaHQ6IDEyMC4wJTsKKyAgICBtYXJnaW4tYm90dG9tOiA0cHQ7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGZvbnQtZmFtaWx5OiBNaWNyb3NvZnQgWWFIZWkgVUk7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtMDAwMDE3IHsKKyAgICBjb2xvcjogIzQwNDA0MDsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Cit0ZC5wdC0wMDAwMTggeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDU3LjI1cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNGMkYyRjI7Cit9Cit0ZC5wdC0wMDAwMTkgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDI4Ny45NXB0OworICAgIGJvcmRlci10b3A6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKK30KK3RkLnB0LTAwMDAyMCB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogNzkuMTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7Cit9Cit0ZC5wdC0wMDAwMjEgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDU3LjU1cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworfQordGQucHQtMDAwMDIyIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiA1Ny4yNXB0OworICAgIGJvcmRlci10b3A6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKK30KK3RkLnB0LTAwMDAyMyB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMjg3Ljk1cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNGMkYyRjI7Cit9Cit0ZC5wdC0wMDAwMjQgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDc5LjE1cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNGMkYyRjI7Cit9Cit0ZC5wdC0wMDAwMjUgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDU3LjU1cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNGMkYyRjI7Cit9Cit0ZC5wdC0wMDAwMjYgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDU3LjI1cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNGMkYyRjI7Cit9Cit0ZC5wdC0wMDAwMjcgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDI4Ny45NXB0OworICAgIGJvcmRlci10b3A6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICM3RjdGN0YgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKK30KK3RkLnB0LTAwMDAyOCB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogNzkuMTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7Cit9Cit0ZC5wdC0wMDAwMjkgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDU3LjU1cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgIzdGN0Y3RiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworfQordGQucHQtMDAwMDMwIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAyODcuOTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgIzdGN0Y3RiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0YyRjJGMjsKK30KK3RkLnB0LTAwMDAzMSB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogNzkuMTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgIzdGN0Y3RiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0YyRjJGMjsKK30KK3RkLnB0LTAwMDAzMiB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogNTcuNTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgIzdGN0Y3RiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0YyRjJGMjsKK30KK3RkLnB0LTAwMDAzMyB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogNTcuMjVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgIzdGN0Y3RiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0YyRjJGMjsKK30KK3RkLnB0LTAwMDAzNCB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMjg3Ljk1cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgIzdGN0Y3RiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICM3RjdGN0YgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgIzdGN0Y3RiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgIzdGN0Y3RiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworfQordGQucHQtMDAwMDM1IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiA3OS4xNXB0OworICAgIGJvcmRlci10b3A6IHNvbGlkICM3RjdGN0YgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICM3RjdGN0YgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICM3RjdGN0YgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKK30KK3RkLnB0LTAwMDAzNiB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogNTcuNTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgIzdGN0Y3RiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjN0Y3RjdGIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7Cit9Cit0ZC5wdC0wMDAwMzcgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDU3LjI1cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgIzdGN0Y3RiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICM3RjdGN0YgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgIzdGN0Y3RiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgIzdGN0Y3RiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworfQorYm9keSB7IG1hcmdpbjogMWNtIGF1dG87IG1heC13aWR0aDogMjBjbTsgcGFkZGluZzogMDsgfTwvc3R5bGU+PC9oZWFkPjxib2R5PjxkaXY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1hIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5b5pel5pyfXTwvc3Bhbj48L3A+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAwIj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMDEiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGl0bGUiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj5b6aG555uu5ZCN56ewXTwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1TdWJ0aXRsZSI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+W+WtpueUn+Wnk+WQjV08L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+IDwvc3Bhbj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij58PC9zcGFuPjxzcGFuIGxhbmc9InpoLUNOIiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPiA8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+W+ivvueoi+WQjeensF08L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+IDwvc3Bhbj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij58PC9zcGFuPjxzcGFuIGxhbmc9InpoLUNOIiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPiA8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+W+aVmeW4iOWnk+WQjS/kuIror77ml7bpl7Qv6K++5pe2XTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGxhbmc9InpoLUNOIiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj7pnIDopoHlnKjku7vliqHooajkuK3mt7vliqDmm7TlpJrooYzvvJ/msqHpl67popjjgILlj6rpnIDljZXlh7vooajmoLznmoTmnIDlkI7kuIDkuKrljZXlhYPmoLzvvIznhLblkI7mjIkgVGFiIOmUruWNs+WPr+OAgiA8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+5oiW6ICF77yM6KaB5Zyo6KGo5qC85Lit6Ze05re75Yqg6KGM77yM6K+35Y2V5Ye75p+Q5LiA6KGM77yM54S25ZCO5Zyo5Yqf6IO95Yy655qE4oCc6KGo5qC85bel5YW34oCd5LiL55qE4oCc5biD5bGA4oCd6YCJ6aG55Y2h5Lit5Y2V5Ye74oCc5Zyo5LiK5pa55o+S5YWl4oCd5oiW4oCc5Zyo5LiL5pa55o+S5YWl4oCd44CCPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMiPuimgeWwhu+8iOWDj+i/meagt+eahO+8ieWNoOS9jeespuaWh+acrOabv+aNouS4uuaCqOiHquW3seeahOaWh+acrO+8jOWPqumcgOmAieS4reW5tuW8gOWni+mUruWFpeWNs+WPr+OAguivt+WLv+WcqOaCqOmAieS4reeahOWtl+espuWPs+S+p+aIluW3puS+p+WMheWQq+epuuagvOOAgjwvc3Bhbj48L3A+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDA0Ij48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDciPuS7u+WKoTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNyI+5Yiw5pyf5pelPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDYiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA3Ij7lt7LlrozmiJA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDciPuetvuWQjTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxMSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxNyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDE5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMjAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAyMSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE3Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDIyIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMjMiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAyNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDI1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTYiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTciPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMjYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMyI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDIwIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMjEiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxNyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAyMiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDIzIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMjQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAyNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE3Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDI2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMTkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAyMCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDIxIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTYiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTciPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMjIiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMyI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAyMyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDI0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMjUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxNyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAyNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDE5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMjAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAyMSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE3Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDIyIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMjMiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAyNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDI1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTYiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTciPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMjYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMyI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAyNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDI4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMjkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxNyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAyMiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDMwIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzEiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzMiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE3Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDMzIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMzQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTYiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTciPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMyI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAzMCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDMxIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzIiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxNyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzMyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDM0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE3Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTMiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDEzIj4gPC9zcGFuPjwvcD48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvVGVzdC0wMS5odG1sIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9UZXN0LTAxLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0MjM3YgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvVGVzdC0wMS5odG1sCkBAIC0wLDAgKzEsMjU1IEBACivvu788IURPQ1RZUEUgaHRtbCA+PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPjx0aXRsZT48L3RpdGxlPjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29udGVudD0iUG93ZXJUb29scyBmb3IgT3BlbiBYTUwiIC8+PHN0eWxlPnNwYW4geyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IH0KK3RhYmxlLnB0LTAwMDAwMCB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQordHIucHQtMDAwMDAxIHsKKyAgICBoZWlnaHQ6IDAuNzBpbjsKK30KK3RkLnB0LTAwMDAwMiB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogNDguMjVwdDsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitwLnB0LU5vU3BhY2luZyB7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBmb250LWZhbWlseTogRnJhbmtsaW4gR290aGljIE1lZGl1bTsKKyAgICBmb250LXNpemU6IDlwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC0wMDAwMDMgeworICAgIGNvbG9yOiAjMjcxMzBFOworICAgIGZvbnQtc2l6ZTogOXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDA0IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgIHdpZHRoOiA3LjlwdDsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitwLnB0LU5vcm1hbCB7CisgICAgbWFyZ2luLXRvcDogNnB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDUuMCU7CisgICAgZm9udC1mYW1pbHk6IEZyYW5rbGluIEdvdGhpYyBNZWRpdW07CisgICAgZm9udC1zaXplOiA5cHQ7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3RkLnB0LTAwMDAwNSB7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICB3aWR0aDogNDQ3Ljg1cHQ7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQordGFibGUucHQtMDAwMDA2IHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIGJvcmRlcjogbm9uZTsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9Cit0ci5wdC0wMDAwMDcgeworICAgIGhlaWdodDogMC4wNmluOworfQordGQucHQtMDAwMDA4IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAxMDAuMCU7CisgICAgYm9yZGVyLXRvcDogc29saWQgIzRGMjcxQyAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgIzRGMjcxQyAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworfQordHIucHQtMDAwMDA5IHsKKyAgICBoZWlnaHQ6IDAuNTBpbjsKK30KK3RkLnB0LTAwMDAxMCB7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICB3aWR0aDogMTAwLjAlOworICAgIGJvcmRlci10b3A6IHNvbGlkICM0RjI3MUMgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK3AucHQtVGl0bGUgeworICAgIG1hcmdpbi10b3A6IDJwdDsKKyAgICBsaW5lLWhlaWdodDogODUuMCU7CisgICAgbWFyZ2luLWxlZnQ6IDAuMTBpbjsKKyAgICBmb250LWZhbWlseTogRnJhbmtsaW4gR290aGljIE1lZGl1bTsKKyAgICBmb250LXNpemU6IDMycHQ7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQgeworICAgIGNvbG9yOiAjMzg5MUE3OworICAgIGZvbnQtZmFtaWx5OiBGcmFua2xpbiBHb3RoaWMgTWVkaXVtOworICAgIGZvbnQtc2l6ZTogMzJwdDsKKyAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICAgIGxldHRlci1zcGFjaW5nOiAwLjVwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RyLnB0LTAwMDAxMSB7CisgICAgaGVpZ2h0OiAwLjEwaW47Cit9Cit0ZC5wdC0wMDAwMTIgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDEwMC4wJTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzRGMjcxQzsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK2Rpdi5wdC0wMDAwMTMgeworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgYm9yZGVyLXJpZ2h0OiBub25lOworICAgIGJvcmRlci1ib3R0b206IGRvdWJsZSAjNEYyNzFDIDUuM3B0OworICAgIHBhZGRpbmctYm90dG9tOiAxLjBwdDsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBtYXJnaW4tbGVmdDogMDsKK30KK2gxLnB0LTAwMDAxNCB7CisgICAgbWFyZ2luLXRvcDogMzFwdDsKKyAgICBsaW5lLWhlaWdodDogMTA1LjAlOworICAgIG1hcmdpbi1ib3R0b206IDNwdDsKKyAgICBtYXJnaW4tbGVmdDogMC4yNWluOworICAgIHRleHQtaW5kZW50OiAtMC4yNWluOworICAgIGZvbnQtZmFtaWx5OiBGcmFua2xpbiBHb3RoaWMgTWVkaXVtOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LTAwMDAxNSB7CisgICAgY29sb3I6ICMzODkxQTc7CisgICAgZm9udC1mYW1pbHk6IEZyYW5rbGluIEdvdGhpYyBNZWRpdW07CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIHRleHQtaW5kZW50OiAwOworICAgIHdpZHRoOiAwLjI1MGluOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTYgeworICAgIGNvbG9yOiAjMzg5MUE3OworICAgIGZvbnQtZmFtaWx5OiBGcmFua2xpbiBHb3RoaWMgTWVkaXVtOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDE3IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiA0LjQlOworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgYm9yZGVyLXJpZ2h0OiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK3AucHQtQ2hlY2tib3ggeworICAgIG1hcmdpbi10b3A6IDNwdDsKKyAgICBsaW5lLWhlaWdodDogMTA1LjAlOworICAgIGZvbnQtZmFtaWx5OiBTZWdvZSBVSSBTeW1ib2w7CisgICAgZm9udC1zaXplOiAxMC41cHQ7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE4IHsKKyAgICBjb2xvcjogIzJBNkM3RDsKKyAgICBmb250LWZhbWlseTogU2Vnb2UgVUkgU3ltYm9sOworICAgIGZvbnQtc2l6ZTogMTAuNXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDE5IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiA5NS42JTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitwLnB0LUxpc3QgeworICAgIG1hcmdpbi10b3A6IDZwdDsKKyAgICBsaW5lLWhlaWdodDogMTA1LjAlOworICAgIG1hcmdpbi1yaWdodDogMC41MGluOworICAgIGZvbnQtZmFtaWx5OiBGcmFua2xpbiBHb3RoaWMgTWVkaXVtOworICAgIGZvbnQtc2l6ZTogOXB0OworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIHsKKyAgICBjb2xvcjogIzI3MTMwRTsKKyAgICBmb250LWZhbWlseTogRnJhbmtsaW4gR290aGljIE1lZGl1bTsKKyAgICBmb250LXNpemU6IDlwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK2gxLnB0LTAwMDAyMSB7CisgICAgbWFyZ2luLXRvcDogMjBwdDsKKyAgICBsaW5lLWhlaWdodDogMTA1LjAlOworICAgIG1hcmdpbi1ib3R0b206IDNwdDsKKyAgICBtYXJnaW4tbGVmdDogMC4yNWluOworICAgIHRleHQtaW5kZW50OiAtMC4yNWluOworICAgIGZvbnQtZmFtaWx5OiBGcmFua2xpbiBHb3RoaWMgTWVkaXVtOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9Citib2R5IHsgbWFyZ2luOiAxY20gYXV0bzsgbWF4LXdpZHRoOiAyMGNtOyBwYWRkaW5nOiAwOyB9PC9zdHlsZT48L2hlYWQ+PGJvZHk+PGRpdj48ZGl2IGFsaWduPSJyaWdodCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAwIj48dHIgY2xhc3M9InB0LTAwMDAwMSI+PHRkIGNsYXNzPSJwdC0wMDAwMDIiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9TcGFjaW5nIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwNSI+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDA2Ij48dHIgY2xhc3M9InB0LTAwMDAwNyI+PHRkIGNsYXNzPSJwdC0wMDAwMDgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9TcGFjaW5nIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMDkiPjx0ZCBjbGFzcz0icHQtMDAwMDEwIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRpdGxlIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPkJ1c2luZXNzIFRyaXAgQ2hlY2tsaXN0PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMTEiPjx0ZCBjbGFzcz0icHQtMDAwMDEyIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vU3BhY2luZyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjxkaXYgY2xhc3M9InB0LTAwMDAxMyI+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDE0Ij48c3BhbiBjbGFzcz0icHQtMDAwMDE1Ij4xLjwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE2Ij5XaGlsZSBZb3UgQXJlIEF3YXk6IFByZXBhcmluZyB0aGUgT2ZmaWNlPC9zcGFuPjwvaDE+PC9kaXY+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDA2Ij48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMTciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQ2hlY2tib3giPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTgiPuKYkjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1MaXN0Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj5Pcmdhbml6ZSBhbnkgbmVjZXNzYXJ5IG1lZXRpbmdzIHRvIHRha2UgcGxhY2Ugb24geW91ciB0cmlwOyBib29rIGFwcG9pbnRtZW50cyBhbmQgbWVldGluZyByb29tcy48L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMTciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQ2hlY2tib3giPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTgiPuKYkDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1MaXN0Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj5JZiB0cmF2ZWxpbmcgaW50ZXJuYXRpb25hbGx5LCBvYnRhaW4gYW55IG5lY2Vzc2FyeSBwYXBlcndvcmsgYW5kIHZhY2NpbmF0aW9ucy48L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMTciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQ2hlY2tib3giPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTgiPuKYkDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1MaXN0Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj5GYW1pbGlhcml6ZSB5b3Vyc2VsZiB3aXRoIGxvY2FsIGJ1c2luZXNzIGN1c3RvbXMgY29tbW9uIGF0IGRlc3RpbmF0aW9uLjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1DaGVja2JveCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxOCI+4piQPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUxpc3QiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPkNvbmZpcm0gYXBwb2ludG1lbnRzLCBzY2hlZHVsZXMsIHJlc2VydmF0aW9ucywgZXRjLjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1DaGVja2JveCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxOCI+4piQPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUxpc3QiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPlRpZSB1cCBhbnkgbG9vc2UgZW5kcyBhdCB0aGUgb2ZmaWNlIChmaW5pc2ggdXAgcHJvamVjdHM7IHNldCB1cCBvdXQtb2Ytb2ZmaWNlIHJlcGxpZXM7IG5vdGlmeSBvciByZW1pbmQgY293b3JrZXJzIGFib3V0IHlvdXIgZGVwYXJ0dXJlKS48L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMTciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQ2hlY2tib3giPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTgiPuKYkDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1MaXN0Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj5QcmludCBvdXQgaGFyZCBjb3BpZXMgb2YgcHJlc2VudGF0aW9ucywgYWdlbmRhcywgYW5kIGltcG9ydGFudCBkb2N1bWVudHMuPC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48ZGl2IGNsYXNzPSJwdC0wMDAwMTMiPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAyMSI+PHNwYW4gY2xhc3M9InB0LTAwMDAxNSI+Mi48L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNiI+V2hpbGUgWW91IEFyZSBBd2F5OiBQcmVwYXJpbmcgdGhlIEhvbWU8L3NwYW4+PC9oMT48L2Rpdj48ZGl2IGFsaWduPSJsZWZ0Ij48dGFibGUgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDYiPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1DaGVja2JveCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxOCI+4piQPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUxpc3QiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPkFycmFuZ2UgZm9yIGNoaWxkLCBwZXQsIGFuZCBwbGFudCBjYXJlOyBjb21tdW5pY2F0ZSBuZWVkcyBhbmQgc2NoZWR1bGVzLjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1DaGVja2JveCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxOCI+4piQPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUxpc3QiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPlBhdXNlIHJvdXRpbmUgZGVsaXZlcmllcy48L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMTciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQ2hlY2tib3giPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTgiPuKYkDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1MaXN0Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj5NYWtlIHlvdXIgaG9tZSBzZWVtIGxpdmVkLWluIHdoaWxlIGF3YXkgYnkgcHV0dGluZyBsaWdodHMgYW5kIGEgcmFkaW8gb24gdGltZXJzLjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1DaGVja2JveCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxOCI+4piQPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUxpc3QiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPlR1cm4gZG93biB0aGVybW9zdGF0Ljwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1DaGVja2JveCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxOCI+4piQPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUxpc3QiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPkxlYXZlIGhvdXNlIGFuZCBjYXIga2V5cywgYW5kIHlvdXIgY29tcGxldGUgaXRpbmVyYXJ5LCB3aXRoIGEgdHJ1c3RlZCBmcmllbmQuPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDE3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUNoZWNrYm94Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE4Ij7imJA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTGlzdCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+TG9jayB3aW5kb3dzLCBnYXJhZ2VzLCBhbmQgZG9vcnMuPC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48ZGl2IGNsYXNzPSJwdC0wMDAwMTMiPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAyMSI+PHNwYW4gY2xhc3M9InB0LTAwMDAxNSI+My48L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNiI+UGFja2luZyBmb3IgdGhlIFRyaXA8L3NwYW4+PC9oMT48L2Rpdj48ZGl2IGFsaWduPSJsZWZ0Ij48dGFibGUgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDYiPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1DaGVja2JveCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxOCI+4piQPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUxpc3QiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPk1ha2UgYSBsaXN0IG9mIHRoZSBzcGVjaWZpYyBpdGVtcyBvZiBjbG90aGluZyB5b3XigJlsbCBuZWVkIHRvIHBhY2sgZm9yIHlvdXIgdHJpcCB0byBzdWl0IHRoZSB2YXJpb3VzIGZ1bmN0aW9ucyB5b3XigJlsbCBhdHRlbmQuPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDE3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUNoZWNrYm94Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE4Ij7imJA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTGlzdCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+VHJ5IHRvIHBhY2sgZXZlcnl0aGluZyB5b3UgbmVlZCBpbiBhIGNhcnJ5LW9uIGJhZywgdG8gYXZvaWQgdGhlIHBvc3NpYmlsaXR5IG9mIGxvc3QgbHVnZ2FnZS48L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMTciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQ2hlY2tib3giPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTgiPuKYkDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1MaXN0Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj5JZiB5b3UgY2hlY2sgeW91ciBiYWcsIHBhY2sgYSBzZWNvbmQgc2V0IG9mIGJ1c2luZXNzIGNsb3RoZXMgYW5kIHRvaWxldHJpZXMgaW4gYSBjYXJyeS1vbiBiYWcsIGluIGNhc2Ugb2YgbG9zdCBsdWdnYWdlLjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1DaGVja2JveCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxOCI+4piQPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUxpc3QiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPlByaW50IHNldmVyYWwgY29waWVzIG9mIHRoaXMgY2hlY2tsaXN0LCBhbmQgc2F2ZSBhIGNvcHkgb24geW91ciBjb21wdXRlcuKAmXMgaGFyZCBkcml2ZSB0byByZWZlciB0byB3aGVuIHBsYW5uaW5nIHlvdXIgbmV4dCB0cmlwLiBTdG9yaW5nIHRoZSBjaGVja2xpc3Qgb24geW91ciBjb21wdXRlciBpcyB0aGUgZWFzaWVzdCB3YXkgdG8gbWFrZSB1cGRhdGVzIHRvIGl0IHdoZW4gbmVjZXNzYXJ5Ljwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PGRpdiBjbGFzcz0icHQtMDAwMDEzIj48aDEgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMjEiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTUiPjQuPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTYiPldoYXQgdG8gTGVhdmUgZm9yIEZhbWlseSBhbmQgQ2FyZWdpdmVycyBhdCBIb21lPC9zcGFuPjwvaDE+PC9kaXY+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDA2Ij48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMTciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQ2hlY2tib3giPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTgiPuKYkDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1MaXN0Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj5MZWF2ZSB5b3VyIGNvbnRhY3QgaW5mb3JtYXRpb27igJRpbmNsdWRpbmcgdGhlIG5hbWVzLCBhZGRyZXNzZXMsIGFuZCBwaG9uZSBudW1iZXJzIG9mIHRoZSBob3RlbHMgd2hlcmUgeW91IGFyZSBzdGF5aW5n4oCUd2l0aCBhIGZhbWlseSBtZW1iZXIsIHNvIHRoZXkgY2FuIHJlYWNoIHlvdSB3aGlsZSB5b3XigJlyZSBhd2F5Ljwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1DaGVja2JveCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxOCI+4piQPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUxpc3QiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPlBob25lIG51bWJlcnMgKGFsbCBjb250YWN0IG51bWJlcnMgZm9yIHlvdTsgZG9jdG9yL3ZldDsgcGhhcm1hY3k7IG1lY2hhbmljOyBzY2hvb2wvZGF5Y2FyZTsgaGVscGZ1bCBmcmllbmRzL25laWdoYm9yczsgYWxhcm0gY29tcGFueSkuPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDE3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUNoZWNrYm94Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE4Ij7imJA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTGlzdCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+Q2FzaCBmb3IgZ3JvY2VyaWVzIGFuZCBlbWVyZ2VuY2llcy48L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMTciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQ2hlY2tib3giPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTgiPuKYkDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1MaXN0Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj5Db25zZW50IGZvciBtZWRpY2FsIHRyZWF0bWVudCBmb3JtcyBhbmQgaW5zdXJhbmNlIGNhcmRzLjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1DaGVja2JveCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxOCI+4piQPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUxpc3QiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPllvdXIgdHJhdmVsIGl0aW5lcmFyeS48L3NwYW4+PC9wPjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvVGVzdC0wMi5odG1sIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9UZXN0LTAyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1NWQ5NgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvVGVzdC0wMi5odG1sCkBAIC0wLDAgKzEsNjg2IEBACivvu788IURPQ1RZUEUgaHRtbCA+PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPjx0aXRsZT48L3RpdGxlPjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29udGVudD0iUG93ZXJUb29scyBmb3IgT3BlbiBYTUwiIC8+PHN0eWxlPnNwYW4geyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IH0KK3AucHQtU3VidGl0bGUgeworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogMjVwdDsKKyAgICBmb250LWZhbWlseTogQ2VudHVyeSBHb3RoaWM7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQgeworICAgIGNvbG9yOiAjNUE1QTVBOworICAgIGZvbnQtZmFtaWx5OiBDZW50dXJ5IEdvdGhpYzsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RhYmxlLnB0LTAwMDAwMCB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgd2lkdGg6IDEwMCU7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQordGQucHQtMDAwMDAxIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAxMi42JTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBkb3VibGUgIzAwMDAwMCA1LjNwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIHBhZGRpbmctdG9wOiAwOworfQorcC5wdC1UaXRsZSB7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiA0cHQ7CisgICAgZm9udC1mYW1pbHk6IENlbnR1cnkgR290aGljOworICAgIGZvbnQtc2l6ZTogMTZwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiB7CisgICAgY29sb3I6ICMwMDAwMDA7CisgICAgZm9udC1mYW1pbHk6IENlbnR1cnkgR290aGljOworICAgIGZvbnQtc2l6ZTogMTZwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAwMyB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMzIuNiU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogZG91YmxlICMwMDAwMDAgNS4zcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKK30KK3RkLnB0LTAwMDAwNCB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTQuMCU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogZG91YmxlICMwMDAwMDAgNS4zcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKK30KK3RkLnB0LTAwMDAwNSB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTguNSU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogZG91YmxlICMwMDAwMDAgNS4zcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKK30KK3RkLnB0LTAwMDAwNiB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTAuNSU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogZG91YmxlICMwMDAwMDAgNS4zcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKK30KK3RkLnB0LTAwMDAwNyB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTEuNyU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogZG91YmxlICMwMDAwMDAgNS4zcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKK30KK3AucHQtTm9ybWFsIHsKKyAgICBtYXJnaW4tdG9wOiAycHQ7CisgICAgbWFyZ2luLWJvdHRvbTogMnB0OworICAgIGZvbnQtZmFtaWx5OiBDZW50dXJ5IEdvdGhpYzsKKyAgICBmb250LXNpemU6IDguNXB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtMDAwMDA4IHsKKyAgICBjb2xvcjogIzU5NTk1OTsKKyAgICBmb250LXNpemU6IDguNXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDA5IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworICAgIHdpZHRoOiAyMC4xJTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9Cit0YWJsZS5wdC0wMDAwMTAgeworICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisgICAgYm9yZGVyOiBub25lOworICAgIHdpZHRoOiA2MSU7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQordGQucHQtMDAwMDExIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworICAgIHdpZHRoOiA0OC4xJTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitwLnB0LURheXMgeworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICBmb250LWZhbWlseTogQ2VudHVyeSBHb3RoaWM7CisgICAgZm9udC1zaXplOiA5cHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTIgeworICAgIGNvbG9yOiAjNTk1OTU5OworICAgIGZvbnQtZmFtaWx5OiBDZW50dXJ5IEdvdGhpYzsKKyAgICBmb250LXNpemU6IDlwdDsKKyAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDEzIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworICAgIHdpZHRoOiA1MS45JTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgcGFkZGluZy10b3A6IDA7Cit9CitwLnB0LURheXMtMDAwMDE0IHsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGZvbnQtZmFtaWx5OiBDZW50dXJ5IEdvdGhpYzsKKyAgICBmb250LXNpemU6IDlwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LTAwMDAxNSB7CisgICAgY29sb3I6ICM1OTU5NTk7CisgICAgZm9udC1zaXplOiA5cHQ7CisgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAxNiB7CisgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICB3aWR0aDogMjAuMCU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQordGFibGUucHQtMDAwMDE3IHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIGJvcmRlcjogbm9uZTsKKyAgICB3aWR0aDogNTglOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3RkLnB0LTAwMDAxOCB7CisgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICB3aWR0aDogNDUuOSU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQordGQucHQtMDAwMDE5IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworICAgIHdpZHRoOiA1NC4xJTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgcGFkZGluZy10b3A6IDA7Cit9Cit0YWJsZS5wdC0wMDAwMjAgeworICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisgICAgYm9yZGVyOiBub25lOworICAgIHdpZHRoOiA1OSU7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQordGQucHQtMDAwMDIxIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworICAgIHdpZHRoOiA0Ny4xJTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9Cit0ZC5wdC0wMDAwMjIgeworICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CisgICAgd2lkdGg6IDUyLjklOworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgYm9yZGVyLXJpZ2h0OiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKK30KK3RhYmxlLnB0LTAwMDAyMyB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgd2lkdGg6IDUwJTsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9Cit0ZC5wdC0wMDAwMjQgeworICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CisgICAgd2lkdGg6IDM3LjYlOworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgYm9yZGVyLXJpZ2h0OiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK3RkLnB0LTAwMDAyNSB7CisgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICB3aWR0aDogNjIuNCU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIHBhZGRpbmctdG9wOiAwOworfQordGFibGUucHQtMDAwMDI2IHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIGJvcmRlcjogbm9uZTsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9Cit0ZC5wdC0wMDAwMjcgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDIwLjElOworICAgIGJvcmRlci10b3Atc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNEOUQ5RDkgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICMxRkIxRTYgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjMUZCMUU2OworfQorcC5wdC1Ob3JtYWwtMDAwMDI4IHsKKyAgICBtYXJnaW4tdG9wOiA0cHQ7CisgICAgbWFyZ2luLWJvdHRvbTogNHB0OworICAgIGZvbnQtZmFtaWx5OiBDZW50dXJ5IEdvdGhpYzsKKyAgICBmb250LXNpemU6IDlwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyOSB7CisgICAgY29sb3I6ICNGRkZGRkY7CisgICAgZm9udC1mYW1pbHk6IENlbnR1cnkgR290aGljOworICAgIGZvbnQtc2l6ZTogOXB0OworICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDMwIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAyMC4wJTsKKyAgICBib3JkZXItdG9wLXN0eWxlOiBub25lOworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRDlEOUQ5IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzFGQjFFNjsKK30KK3AucHQtTm9ybWFsLTAwMDAzMSB7CisgICAgbWFyZ2luLXRvcDogNHB0OworICAgIG1hcmdpbi1ib3R0b206IDRwdDsKKyAgICBmb250LWZhbWlseTogQ2VudHVyeSBHb3RoaWM7CisgICAgZm9udC1zaXplOiA4LjVwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LTAwMDAzMiB7CisgICAgY29sb3I6ICM1OTU5NTk7CisgICAgZm9udC1zaXplOiA4LjVwdDsKKyAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAzMyB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMjAuMCU7CisgICAgYm9yZGVyLXRvcC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICMxRkIxRTYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0Q5RDlEOSAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICMxRkIxRTY7Cit9Cit0ZC5wdC0wMDAwMzQgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDIwLjElOworICAgIGJvcmRlci10b3A6IHNvbGlkICNEOUQ5RDkgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNEOUQ5RDkgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDM1IHsKKyAgICBjb2xvcjogIzU5NTk1OTsKKyAgICBmb250LWZhbWlseTogQ2VudHVyeSBHb3RoaWM7CisgICAgZm9udC1zaXplOiA4LjVwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAzNiB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMjAuMCU7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0Q5RDlEOSAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNGMkYyRjI7Cit9Cit0ZC5wdC0wMDAwMzcgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDIwLjAlOworICAgIGJvcmRlci10b3A6IHNvbGlkICNEOUQ5RDkgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNEOUQ5RDkgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKK30KK3RkLnB0LTAwMDAzOCB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMjAuMCU7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNGMkYyRjI7Cit9Cit0ZC5wdC0wMDAwMzkgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDIwLjElOworICAgIGJvcmRlci10b3A6IHNvbGlkICNEOUQ5RDkgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjQTZBNkE2IDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKK30KK3RkLnB0LTAwMDA0MCB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMjAuMCU7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0Q5RDlEOSAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNBNkE2QTYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0E2QTZBNiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworfQorcC5wdC1UYWJsZVNwYWNlIHsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIGxpbmUtaGVpZ2h0OiAzLjZwdDsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIGZvbnQtZmFtaWx5OiBDZW50dXJ5IEdvdGhpYzsKKyAgICBmb250LXNpemU6IDguNXB0OworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3RkLnB0LTAwMDA0MSB7CisgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICB3aWR0aDogMjAuMSU7CisgICAgYm9yZGVyLXRvcDogc29saWQgIzhGQjkzMSAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0Q5RDlEOSAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgIzhGQjkzMSAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICM4RkI5MzE7Cit9Cit0ZC5wdC0wMDAwNDIgeworICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CisgICAgd2lkdGg6IDIwLjAlOworICAgIGJvcmRlci10b3A6IHNvbGlkICM4RkI5MzEgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNEOUQ5RDkgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjOEZCOTMxOworfQordGQucHQtMDAwMDQzIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworICAgIHdpZHRoOiAyMC4wJTsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjOEZCOTMxIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgIzhGQjkzMSAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRDlEOUQ5IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzhGQjkzMTsKK30KK3RkLnB0LTAwMDA0NCB7CisgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICB3aWR0aDogMjAuMSU7CisgICAgYm9yZGVyLXRvcC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0Q5RDlEOSAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0Y3ODMwMyAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNGNzgzMDM7Cit9Cit0ZC5wdC0wMDAwNDUgeworICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CisgICAgd2lkdGg6IDIwLjAlOworICAgIGJvcmRlci10b3Atc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNEOUQ5RDkgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjRjc4MzAzOworfQordGQucHQtMDAwMDQ2IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworICAgIHdpZHRoOiAyMC4wJTsKKyAgICBib3JkZXItdG9wLXN0eWxlOiBub25lOworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0Y3ODMwMyAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRDlEOUQ5IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0Y3ODMwMzsKK30KK3RkLnB0LTAwMDA0NyB7CisgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICB3aWR0aDogMjAuMSU7CisgICAgYm9yZGVyLXRvcC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0Q5RDlEOSAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0YwNjI4QiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNGMDYyOEI7Cit9Cit0ZC5wdC0wMDAwNDggeworICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CisgICAgd2lkdGg6IDIwLjAlOworICAgIGJvcmRlci10b3Atc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNEOUQ5RDkgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjRjA2MjhCOworfQordGQucHQtMDAwMDQ5IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworICAgIHdpZHRoOiAyMC4wJTsKKyAgICBib3JkZXItdG9wLXN0eWxlOiBub25lOworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0YwNjI4QiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRDlEOUQ5IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0YwNjI4QjsKK30KK3RkLnB0LTAwMDA1MCB7CisgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICB3aWR0aDogMjAuMSU7CisgICAgYm9yZGVyLXRvcC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0Q5RDlEOSAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0EwNTNBNSAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNBMDUzQTU7Cit9Cit0ZC5wdC0wMDAwNTEgeworICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CisgICAgd2lkdGg6IDIwLjAlOworICAgIGJvcmRlci10b3Atc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNEOUQ5RDkgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjQTA1M0E1OworfQordGQucHQtMDAwMDUyIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworICAgIHdpZHRoOiAyMC4wJTsKKyAgICBib3JkZXItdG9wLXN0eWxlOiBub25lOworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0EwNTNBNSAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRDlEOUQ5IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0EwNTNBNTsKK30KK3RkLnB0LTAwMDA1MyB7CisgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICB3aWR0aDogMjAuMSU7CisgICAgYm9yZGVyLXRvcC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0Q5RDlEOSAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgIzgwODA4MCAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICM4MDgwODA7Cit9Cit0ZC5wdC0wMDAwNTQgeworICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CisgICAgd2lkdGg6IDIwLjAlOworICAgIGJvcmRlci10b3Atc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNEOUQ5RDkgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjODA4MDgwOworfQordGQucHQtMDAwMDU1IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworICAgIHdpZHRoOiAyMC4wJTsKKyAgICBib3JkZXItdG9wLXN0eWxlOiBub25lOworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgIzgwODA4MCAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRDlEOUQ5IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzgwODA4MDsKK30KK2JvZHkgeyBtYXJnaW46IDFjbSBhdXRvOyBtYXgtd2lkdGg6IDIwY207IHBhZGRpbmc6IDA7IH08L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2PjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtU3VidGl0bGUiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+V2Vla2x5IEFzc2lnbm1lbnRzPC9zcGFuPjwvcD48ZGl2IGFsaWduPSJsZWZ0Ij48dGFibGUgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDAiPjx0cj48dGQgY2xhc3M9InB0LTAwMDAwMSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1UaXRsZSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+TkFNRTo8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDMiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGl0bGUiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPkVyaWMgV2hpdGU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGl0bGUiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPk1PTlRIOiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGl0bGUiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPkphbnVhcnk8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGl0bGUiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPllFQVI6PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRpdGxlIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj4yMDE0PC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAwIj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMDkiPjxkaXYgYWxpZ249ImNlbnRlciI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDEwIj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMTEiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF5cyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMiI+TW9uOjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxMyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXlzLTAwMDAxNCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMiI+MS8yNzwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXlzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE1Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48ZGl2IGFsaWduPSJjZW50ZXIiPjx0YWJsZSBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAxNyI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURheXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTIiPlR1ZXM6PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURheXMtMDAwMDE0Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEyIj4xLzI4PC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURheXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTUiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxkaXYgYWxpZ249ImNlbnRlciI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDE3Ij48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF5cyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMiI+V2VkOjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXlzLTAwMDAxNCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMiI+MS8yOTwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXlzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE1Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48ZGl2IGFsaWduPSJjZW50ZXIiPjx0YWJsZSBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAyMCI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDIxIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURheXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTIiPlRodXI6PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDIyIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURheXMtMDAwMDE0Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEyIj4xLzMwPC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURheXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTUiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxkaXYgYWxpZ249ImNlbnRlciI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDIzIj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMjQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF5cyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMiI+RnJpOjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAyNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXlzLTAwMDAxNCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMiI+MS8zMTwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXlzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE1Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDI2Ij48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMjciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAyOCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyOSI+TWF0aDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzMCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDMxIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDMyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDMwIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMzEiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMzIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAzMSI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAzMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzMyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDMxIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDMyIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDM0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAzNSI+UmVhZCBwYWdlcyAyNC01MDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDM1Ij5SZWFkIEJvb2syIDEtMjQ8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAzNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMzUiPlByb2JsZW1zIG9uIHBhZ2UgNTE8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAzNSI+V29yZCBwcm9ibGVtIG9uIDI1PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMzQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAzNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDM5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwNDAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDA0MCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGFibGVTcGFjZSI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDI2Ij48dHI+PHRkIGNsYXNzPSJwdC0wMDAwNDEiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAyOCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyOSI+RW5nbGlzaDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDA0MiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDMxIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDMyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDQyIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMzEiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMzIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwNDIiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAzMSI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAzMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDA0MyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDMxIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDMyIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDM0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMzUiPlJlcG9ydCBvbiBXaW5kIGluIHRoZSB3aWxsb3dzPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMzUiPlJlYWQgQ2F0Y2hlciBpbiB0aGUgUnllPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAzNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDM0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMzQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAzOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDQwIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwNDAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRhYmxlU3BhY2UiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjxkaXYgYWxpZ249ImxlZnQiPjx0YWJsZSBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAyNiI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDQ0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMjgiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjkiPlNPQ0lBTCBTVFVESUVTPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDQ1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMzEiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMzIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwNDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAzMSI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAzMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDA0NSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDMxIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDMyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDQ2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMzEiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMzIiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMzQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDM1Ij5DdXJyZW50IG5ld3MgcmVwb3J0PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAzNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDM0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMzQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAzOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDQwIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwNDAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRhYmxlU3BhY2UiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjxkaXYgYWxpZ249ImxlZnQiPjx0YWJsZSBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAyNiI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDQ3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMjgiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjkiPlNjaWVuY2U8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwNDgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAzMSI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAzMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDA0OCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDMxIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDMyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDQ4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMzEiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMzIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwNDkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAzMSI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAzMiI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAzNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMzUiPkxhYiAzLTU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAzNSI+TGFiIDMtNTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDM1Ij5MYWIgMy01PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDM0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMzQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAzNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDM5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwNDAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDA0MCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGFibGVTcGFjZSI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDI2Ij48dHI+PHRkIGNsYXNzPSJwdC0wMDAwNTAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAyOCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyOSI+R2VvZ3JhcGh5PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDUxIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMzEiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMzIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwNTEiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAzMSI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAzMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDA1MSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDMxIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDMyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDUyIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMzEiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMzIiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMzQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAzNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDM0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMzQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAzOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDQwIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwNDAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRhYmxlU3BhY2UiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjxkaXYgYWxpZ249ImxlZnQiPjx0YWJsZSBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAyNiI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDUzIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMjgiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjkiPkZyZW5jaDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDA1NCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDMxIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDMyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDU0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMzEiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMzIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwNTQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAzMSI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAzMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDA1NSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDMxIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDMyIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDM0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMzQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAzNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDM0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAzNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMzkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDM4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDA0MCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMzgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA4Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDQwIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOCI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDgiPiA8L3NwYW4+PC9wPjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9UZXN0LTAzLmh0bWwgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL1Rlc3QtMDMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2NkZDEwCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9UZXN0LTAzLmh0bWwKQEAgLTAsMCArMSwzMzUgQEAKK++7vzwhRE9DVFlQRSBodG1sID48aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+PHRpdGxlPjwvdGl0bGU+PG1ldGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJQb3dlclRvb2xzIGZvciBPcGVuIFhNTCIgLz48c3R5bGU+c3BhbiB7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQordGFibGUucHQtMDAwMDAwIHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIGJvcmRlcjogbm9uZTsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9Cit0ci5wdC0wMDAwMDEgeworICAgIGhlaWdodDogMC4yMGluOworfQordGQucHQtMDAwMDAyIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAzNS41JTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzg4QzU4OTsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK3AucHQtTm9TcGFjaW5nIHsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiA4cHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC0wMDAwMDMgeworICAgIGNvbG9yOiAjNTk1OTU5OworICAgIGZvbnQtc2l6ZTogOHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDA0IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiA2NC41JTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzg4QzU4OTsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK3RkLnB0LTAwMDAwNSB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMzUuNSU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNGRkZGRkY7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitwLnB0LVRhYmxlU3BhY2luZyB7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBsaW5lLWhlaWdodDogMi4wcHQ7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDJwdDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LTAwMDAwNiB7CisgICAgY29sb3I6ICM1OTU5NTk7CisgICAgZm9udC1zaXplOiAycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Cit0ZC5wdC0wMDAwMDcgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDY0LjUlOworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgYm9yZGVyLXJpZ2h0OiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjRkZGRkZGOworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQordHIucHQtMDAwMDA4IHsKKyAgICBoZWlnaHQ6IDEuNjBpbjsKK30KK3RkLnB0LTAwMDAwOSB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMzUuNSU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNEN0VCRDc7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250IHsKKyAgICBjb2xvcjogIzU5NTk1OTsKKyAgICBmb250LXNpemU6IDhwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAxMCB7CisgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICB3aWR0aDogNjQuNSU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNEN0VCRDc7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitwLnB0LU1vbnRoWWVhciB7CisgICAgbWFyZ2luLXRvcDogMnB0OworICAgIG1hcmdpbi1ib3R0b206IDEycHQ7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogNDRwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LU1vbnRoIHsKKyAgICBjb2xvcjogIzIzNDgyNDsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDQ0cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMSB7CisgICAgY29sb3I6ICMzNTZEMzY7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAzNnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordHIucHQtMDAwMDEyIHsKKyAgICBoZWlnaHQ6IDAuMjVpbjsKK30KK3RhYmxlLnB0LTAwMDAxMyB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgd2lkdGg6IDEwMCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQordHIucHQtMDAwMDE0IHsKKyAgICBoZWlnaHQ6IDAuNDBpbjsKK30KK3RkLnB0LTAwMDAxNSB7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICB3aWR0aDogMTQuMyU7CisgICAgYm9yZGVyLXRvcC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICM0NzkyNDk7Cit9CitwLnB0LURheXMgeworICAgIG1hcmdpbi10b3A6IDJwdDsKKyAgICBtYXJnaW4tYm90dG9tOiAycHQ7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTRwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNiB7CisgICAgY29sb3I6ICNGRkZGRkY7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxNHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordHIucHQtMDAwMDE3IHsKKyAgICBoZWlnaHQ6IDAuMzBpbjsKK30KK3RkLnB0LTAwMDAxOCB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTQuMyU7CisgICAgYm9yZGVyLXRvcDogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICM4OEM1ODkgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworfQorcC5wdC1EYXRlcyB7CisgICAgbWFyZ2luLXRvcDogNnB0OworICAgIG1hcmdpbi1ib3R0b206IDJwdDsKKyAgICBtYXJnaW4tcmlnaHQ6IDAuMTBpbjsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7Cit9CitzcGFuLnB0LTAwMDAxOSB7CisgICAgY29sb3I6ICMyNjI2MjY7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAgeworICAgIGNvbG9yOiAjMjYyNjI2OworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RyLnB0LTAwMDAyMSB7CisgICAgaGVpZ2h0OiAwLjcwaW47Cit9CitwLnB0LU5vcm1hbCB7CisgICAgbWFyZ2luLXRvcDogMnB0OworICAgIG1hcmdpbi1ib3R0b206IDJwdDsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDhwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMiB7CisgICAgY29sb3I6ICM1OTU5NTk7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiA4cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Cit0ci5wdC0wMDAwMjMgeworICAgIGhlaWdodDogMS4wMGluOworfQordGQucHQtMDAwMDI0IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAzMi40cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6IHdoaXRlOworfQorcC5wdC1Ob3RlSGVhZGluZyB7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDE4cHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjUgeworICAgIGNvbG9yOiAjNDc5MjQ5OworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMThwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAyNiB7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICB3aWR0aDogNDgyLjRwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjODhDNTg5IDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjODhDNTg5IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogd2hpdGU7Cit9CitwLnB0LU5vdGVzIHsKKyAgICBtYXJnaW4tdG9wOiAzcHQ7CisgICAgbGluZS1oZWlnaHQ6IDExNS4wJTsKKyAgICBtYXJnaW4tYm90dG9tOiAzcHQ7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiA5cHQ7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjcgeworICAgIGNvbG9yOiAjNTk1OTU5OworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogOXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorYm9keSB7IG1hcmdpbjogMWNtIGF1dG87IG1heC13aWR0aDogMjBjbTsgcGFkZGluZzogMDsgfTwvc3R5bGU+PC9oZWFkPjxib2R5PjxkaXY+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAwIj48dHIgY2xhc3M9InB0LTAwMDAwMSI+PHRkIGNsYXNzPSJwdC0wMDAwMDIiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9TcGFjaW5nIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vU3BhY2luZyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAwNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1UYWJsZVNwYWNpbmciPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDYiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGFibGVTcGFjaW5nIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA2Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMDgiPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vU3BhY2luZyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij48aW1nIHNyYz0iVGVzdC0wM19maWxlcy9pbWFnZTEuanBlZyIgc3R5bGU9IndpZHRoOiAyLjMzMzMzM2luOyBoZWlnaHQ6IDEuNjAwNzFpbiIgYWx0PSJTYW1wbGUgUGhvdG8iIC8+PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDEwIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU1vbnRoWWVhciI+PHNwYW4gY2xhc3M9InB0LU1vbnRoIj5KYW51YXJ5PC9zcGFuPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTEiPiA8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMSI+MjAxNDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAwNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1UYWJsZVNwYWNpbmciPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDYiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGFibGVTcGFjaW5nIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA2Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMTIiPjx0ZCBjbGFzcz0icHQtMDAwMDAyIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vU3BhY2luZyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob1NwYWNpbmciPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGFibGVTcGFjaW5nIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA2Ij4gPC9zcGFuPjwvcD48ZGl2IGFsaWduPSJsZWZ0Ij48dGFibGUgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMTMiPjx0ciBjbGFzcz0icHQtMDAwMDE0Ij48dGQgY2xhc3M9InB0LTAwMDAxNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXlzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE2Ij5TdW4uPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURheXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTYiPk1vbi48L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF5cyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNiI+VHVlLjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXlzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE2Ij5XZWQuPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURheXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTYiPlRodS48L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF5cyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNiI+RnJpLjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXlzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE2Ij5TYXQuPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMTciPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE5Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE5Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE5Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4xPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4yPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4zPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj40PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMjEiPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDE3Ij48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+NTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+Njwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+Nzwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+ODwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+OTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MTA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjExPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMjEiPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMiI+TGl0dGxlIExlYWd1ZTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMiI+SmFuZeKAmXMgQmlydGhkYXk8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAxNyI+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjEyPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4xMzwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MTQ8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjE1PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4xNjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MTc8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjE4PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMjEiPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjIiPlBhcmVudCBUZWFjaGVyIENvbmZlcmVuY2U8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDE3Ij48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MTk8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjIwPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4yMTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MjI8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjIzPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4yNDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MjU8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAyMSI+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIyIj5SdW4gZm9yIExpZmUgNUs8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAxNyI+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjI2PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4yNzwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+Mjg8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjI5PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4zMDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MzE8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTkiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAyMSI+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMTciPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE5Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE5Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE5Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE5Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE5Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE5Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE5Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMjEiPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1UYWJsZVNwYWNpbmciPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDYiPiA8L3NwYW4+PC9wPjxkaXYgYWxpZ249ImxlZnQiPjx0YWJsZSBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwMCI+PHRyIGNsYXNzPSJwdC0wMDAwMjMiPjx0ZCBjbGFzcz0icHQtMDAwMDI0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vdGVIZWFkaW5nIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDI1Ij5ub3Rlczwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAyNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3RlcyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyNyI+VG8gcmVwbGFjZSB0aGUgcGljdHVyZSB3aXRoIHlvdXIgb3duLCByaWdodC1jbGljayBpdCBhbmQgdGhlbiBjbGljayBDaGFuZ2UgUGljdHVyZS4gPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vdGVzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDI3Ij5UbyBzZWxlY3QgbmV3IGRhdGVzIG9yIGNoYW5nZSB0aGUgY2FsZW5kYXIgY29sb3IsIGNsaWNrIHRoZSBDYWxlbmRhciB0YWIgb24gdGhlIHJpYmJvbi4gPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDI3Ij5UbyB0cnkgb3V0IGEgZGlmZmVyZW50IHNldCBvZiBmb250cyBvciBjb2xvcnMsIG9uIHRoZSBDYWxlbmRhciB0YWIgb3IgRGVzaWduIHRhYiwgY2xpY2sgRm9udHMgb3IgQ29sb3JzLjwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1UYWJsZVNwYWNpbmciPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDYiPiA8L3NwYW4+PC9wPjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9UZXN0LTAzX2ZpbGVzL2ltYWdlMS5qcGVnIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9UZXN0LTAzX2ZpbGVzL2ltYWdlMS5qcGVnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOGM5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL1Rlc3QtMDNfZmlsZXMvaW1hZ2UxLmpwZWcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9UZXN0LTA0Lmh0bWwgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL1Rlc3QtMDQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNThhNjkyCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9UZXN0LTA0Lmh0bWwKQEAgLTAsMCArMSwyMTUgQEAKK++7vzwhRE9DVFlQRSBodG1sID48aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+PHRpdGxlPkM6XFVzZXJzXEVyaWNcRG9jdW1lbnRzXE9wZW4tWG1sLVBvd2VyVG9vbHNcT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlc1xIdG1sQ29udmVydGVyMDFcVGVzdC0wNC5kb2N4PC90aXRsZT48bWV0YSBuYW1lPSJHZW5lcmF0b3IiIGNvbnRlbnQ9IlBvd2VyVG9vbHMgZm9yIE9wZW4gWE1MIiAvPjxzdHlsZT5zcGFuIHsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CitoMS5wdC1IZWFkaW5nMSB7CisgICAgbWFyZ2luLXRvcDogMThwdDsKKyAgICBtYXJnaW4tYm90dG9tOiA2cHQ7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgZm9udC1mYW1pbHk6ICdBcmlhbCcsICdzYW5zLXNlcmlmJzsKKyAgICBmb250LXNpemU6IDE4cHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udCB7CisgICAgY29sb3I6IGJsYWNrOworICAgIGZvbnQtZmFtaWx5OiAnQXJpYWwnLCAnc2Fucy1zZXJpZic7CisgICAgZm9udC1zaXplOiAxOHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQoraDIucHQtSGVhZGluZzIgeworICAgIG1hcmdpbi10b3A6IDI0cHQ7CisgICAgZm9udC1mYW1pbHk6ICdBcmlhbCcsICdzYW5zLXNlcmlmJzsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAwIHsKKyAgICBjb2xvcjogIzM0M0U1RjsKKyAgICBmb250LWZhbWlseTogJ0FyaWFsJywgJ3NhbnMtc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBsZXR0ZXItc3BhY2luZzogMC4xcHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1Cb2R5VGV4dCB7CisgICAgbWFyZ2luLWJvdHRvbTogNnB0OworICAgIGZvbnQtZmFtaWx5OiAnQXJpYWwnLCAnc2Fucy1zZXJpZic7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEgeworICAgIGZvbnQtZmFtaWx5OiAnQXJpYWwnLCAnc2Fucy1zZXJpZic7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQoraDYucHQtSGVhZGluZzYgeworICAgIG1hcmdpbi10b3A6IDEycHQ7CisgICAgbWFyZ2luLWJvdHRvbTogMnB0OworICAgIGZvbnQtZmFtaWx5OiAnQXJpYWwnLCAnc2Fucy1zZXJpZic7CisgICAgZm9udC1zaXplOiA4cHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIgeworICAgIGZvbnQtZmFtaWx5OiAnQXJpYWwnLCAnc2Fucy1zZXJpZic7CisgICAgZm9udC1zaXplOiA4cHQ7CisgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKKyAgICBsZXR0ZXItc3BhY2luZzogMC44cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC0wMDAwMDMgeworICAgIG1hcmdpbi10b3A6IDNwdDsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwLjc1aW47CisgICAgdGV4dC1pbmRlbnQ6IC0wLjI1aW47CisgICAgZm9udC1mYW1pbHk6ICdBcmlhbCcsICdzYW5zLXNlcmlmJzsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC0wMDAwMDQgeworICAgIGZvbnQtZmFtaWx5OiBXaW5nZGluZ3M7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICB0ZXh0LWluZGVudDogMDsKKyAgICB3aWR0aDogMC4yNTBpbjsKK30KK3AucHQtMDAwMDA1IHsKKyAgICBtYXJnaW4tdG9wOiAzcHQ7CisgICAgbWFyZ2luLWJvdHRvbTogM3B0OworICAgIG1hcmdpbi1sZWZ0OiAwLjc1aW47CisgICAgdGV4dC1pbmRlbnQ6IC0wLjI1aW47CisgICAgZm9udC1mYW1pbHk6ICdBcmlhbCcsICdzYW5zLXNlcmlmJzsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorcC5wdC0wMDAwMDYgeworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgbWFyZ2luLWxlZnQ6IDAuNTBpbjsKKyAgICB0ZXh0LWluZGVudDogLTAuMjVpbjsKKyAgICBmb250LWZhbWlseTogJ0FyaWFsJywgJ3NhbnMtc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTBwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtMDAwMDA3IHsKKyAgICBmb250LWZhbWlseTogJ0FyaWFsJywgJ3NhbnMtc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTBwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdGV4dC1pbmRlbnQ6IDA7CisgICAgd2lkdGg6IDAuMjUwaW47Cit9CitwLnB0LTAwMDAwOCB7CisgICAgbWFyZ2luLWJvdHRvbTogNnB0OworICAgIG1hcmdpbi1sZWZ0OiAwLjUwaW47CisgICAgdGV4dC1pbmRlbnQ6IC0wLjI1aW47CisgICAgZm9udC1mYW1pbHk6ICdBcmlhbCcsICdzYW5zLXNlcmlmJzsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOSB7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorc3Bhbi5wdC0wMDAwMTAgeworICAgIG1hcmdpbjogMCAwIDAgMC41MGluOworICAgIHBhZGRpbmc6IDAgMCAwIDA7Cit9CithLnB0LTAwMDAxMSB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorcC5wdC1MaXN0QnVsbGV0MiB7CisgICAgbWFyZ2luLXRvcDogM3B0OworICAgIG1hcmdpbi1ib3R0b206IDNwdDsKKyAgICBtYXJnaW4tbGVmdDogMC43NWluOworICAgIHRleHQtaW5kZW50OiAtMC4yNWluOworICAgIGZvbnQtZmFtaWx5OiAnQXJpYWwnLCAnc2Fucy1zZXJpZic7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtMDAwMDEyIHsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitoMy5wdC1IZWFkaW5nMyB7CisgICAgbWFyZ2luLXRvcDogMTJwdDsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIGZvbnQtZmFtaWx5OiAnQXJpYWwnLCAnc2Fucy1zZXJpZic7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEzIHsKKyAgICBmb250LWZhbWlseTogJ0FyaWFsJywgJ3NhbnMtc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTBwdDsKKyAgICBsZXR0ZXItc3BhY2luZzogMC41cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1Cb2R5VGV4dDMgeworICAgIG1hcmdpbi10b3A6IDI0cHQ7CisgICAgZm9udC1mYW1pbHk6ICdBcmlhbCcsICdzYW5zLXNlcmlmJzsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE0IHsKKyAgICBmb250LWZhbWlseTogJ0FyaWFsJywgJ3NhbnMtc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTBwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdGV4dC1pbmRlbnQ6IDA7CisgICAgd2lkdGg6IDQuMDAwaW47Cit9CitwLnB0LUJvZHlUZXh0My0wMDAwMTUgeworICAgIG1hcmdpbi10b3A6IDFwdDsKKyAgICBmb250LWZhbWlseTogJ0FyaWFsJywgJ3NhbnMtc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTBwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorYm9keSB7IG1hcmdpbjogMWNtIGF1dG87IG1heC13aWR0aDogMjBjbTsgcGFkZGluZzogMDsgfTwvc3R5bGU+PC9oZWFkPjxib2R5PjxkaXY+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+VGVhbSBPcGVyYXRpbmcgQWdyZWVtZW50PC9zcGFuPjwvaDE+PGgyIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDAiPlB1cnBvc2Ugb2YgdGhlIFRlYW0gT3BlcmF0aW5nIEFncmVlbWVudCAoVE9BKTwvc3Bhbj48L2gyPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQm9keVRleHQiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPltEZXNjcmliZSB0aGUgcHVycG9zZSBvZiB0aGUgZG9jdW1lbnQuIERlcGVuZGluZyBvbiB0aGUgbmF0dXJlIG9mIHRoZSBwcm9qZWN0IG9yIGN1bHR1cmUgb2YgdGhlIGNvbXBhbnksIG90aGVyIHNlY3Rpb25zIG1heSBiZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQuXTwvc3Bhbj48L3A+PGg2IGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzYiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPlNhbXBsZSB0ZXh0Ojwvc3Bhbj48L2g2PjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQm9keVRleHQiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlRoaXMgVE9BIHNlcnZlcyBhcyB0aGUgZ3VpZGVsaW5lcyBhbmQgZ3JvdW5kIHJ1bGVzIHRvIGhlbHAgdGhlIHByb2plY3QgdGVhbSB3b3JrIG1vc3QgcHJvZHVjdGl2ZWx5IHRvZ2V0aGVyIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcHJvamVjdC4gVGhlIFRPQSBpcyBhIGxpdmluZyBkb2N1bWVudCBhbmQgbWF5IGJlIHVwZGF0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzIHRocm91Z2hvdXQgdGhlIHByb2plY3QuIEFueSB1cGRhdGVzIHdpbGwgYmUgZGlzY3Vzc2VkIHdpdGggYW5kIHJhdGlmaWVkIGJ5IHRoZSBwcm9qZWN0IHRlYW0gbWVtYmVycy48L3NwYW4+PC9wPjxoMiBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcyIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAwIj5UZWFtIENvbW11bmljYXRpb25zPC9zcGFuPjwvaDI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Cb2R5VGV4dCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+W0Rlc2NyaWJlIGhvdyBwcm9qZWN0IHRlYW0gbWVtYmVycyB3aWxsIGNvbW11bmljYXRlIHdpdGggZWFjaCBvdGhlci4gSW5jbHVkZSB3aGVyZSBwcm9qZWN0IGRvY3VtZW50cyB3aWxsIGJlIHN0b3JlZCBhbmQgaG93IHRoZXkgbWF5IGJlIGFjY2Vzc2VkLCBob3cgYW5kIHdoZW4gbWVldGluZyBhZ2VuZGFzIGFuZCBtaW51dGVzIHdpbGwgYmUgZGlzdHJpYnV0ZWQsIGFuZCBob3cgY29uZmlkZW50aWFsIGluZm9ybWF0aW9uIHdpbGwgYmUgaGFuZGxlZC5dPC9zcGFuPjwvcD48aDYgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nNiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+U2FtcGxlIHRleHQ6PC9zcGFuPjwvaDY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDMiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMDQiPu+Cpzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5UaGUgcHJvamVjdOKAmXMgU2hhcmVQb2ludCBzaXRlIHdpbGwgaG91c2UgdGhlIG1vc3QgdXAtdG8tZGF0ZSB2ZXJzaW9uIG9mIHByb2plY3QgZG9jdW1lbnRzLiBBbGwgdGVhbSBtZW1iZXJzIHdpbGwgYmUgZ2l2ZW4gYWNjZXNzLjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDMiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMDQiPu+Cpzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5NZWV0aW5nIGFnZW5kYXMgd2lsbCBiZSBlLW1haWxlZCB0byBwcm9qZWN0IHRlYW0gbWVtYmVycyBhdCBsZWFzdCAyNCBob3VycyBwcmlvciB0byBtZWV0aW5ncy4gTWVldGluZyBtaW51dGVzIHdpbGwgYmUgcG9zdGVkIHRvIHRoZSBwcm9qZWN0IFNoYXJlUG9pbnQgc2l0ZSB3aXRoaW4gNDggaG91cnMgYWZ0ZXIgbWVldGluZ3MuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwMyI+PHNwYW4gY2xhc3M9InB0LTAwMDAwNCI+74KnPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlRlYW0gbWVtYmVycyB3aWxsIGFwcHJlY2lhdGUgdGhlIHNlbnNpdGl2ZSBuYXR1cmUgb2YgaW5mb3JtYXRpb24gZGlzY3Vzc2VkIGR1cmluZyB0aGlzIHByb2plY3QgYW5kIHdpbGwgc2hhcmUgd2l0aCBjYXJlLiBXaGVyZSBhcHBsaWNhYmxlLCBkb2N1bWVudHMgd2lsbCBpbmNsdWRlIGEgZm9vdGVyIGluZGljYXRpbmcgdGhhdCBpbmZvcm1hdGlvbiBpcyBjb25maWRlbnRpYWwuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwMyI+PHNwYW4gY2xhc3M9InB0LTAwMDAwNCI+74KnPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPuKAnFNpZGViYXLigJ0gY29udmVyc2F0aW9ucyBiZXR3ZWVuIHRlYW0gbWVtYmVycyBkdXJpbmcgdGVhbSBtZWV0aW5ncyB3aWxsIG5vdCBiZSBhbGxvd2VkLjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDMiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMDQiPu+Cpzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5BbGwgY29tbXVuaWNhdGlvbiB3aWxsIGJlIG9wZW4gYW5kIGNvdXJ0ZW91cy4gTm8g4oCcb3ZlcnRhbGtpbmfigJ0gb3IgaW50ZXJydXB0aW5nLjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDUiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMDQiPu+Cpzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5UZWFtIG1lbWJlcnMgd2lsbCBrZWVwIGVhY2ggb3RoZXIgaW5mb3JtZWQuPC9zcGFuPjwvcD48aDIgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMCI+RGVjaXNpb24gTWFraW5nPC9zcGFuPjwvaDI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Cb2R5VGV4dCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+W0Rlc2NyaWJlIGhvdyBwcm9qZWN0IHRlYW0gbWVtYmVycyB3aWxsIG1ha2UgZGVjaXNpb25zLiBFdmVyeW9uZSBtdXN0IGFncmVlIG9uIGhvdyBkZWNpc2lvbnMgd2lsbCBiZSBtYWRlIHRvIGVuc3VyZSB0aGF0IGV2ZXJ5b25lIGNhbiBsaXZlIHdpdGggdGhlIGRlY2lzaW9ucyBtYWRlIGFuZCB0byBlbnN1cmUgdGhhdCB0aGUgcHJvamVjdCBjYW4gbW92ZSBmb3J3YXJkLiBJbmNsdWRlIGd1aWRlbGluZXMgZm9yIHZvdGluZyBvbiBkZWNpc2lvbnMsIGhvdyBkZWNpc2lvbnMgd2lsbCBiZSBkb2N1bWVudGVkLCBkZWZpbml0aW9ucyBvZiBrZXkgdGVybXMsIGFuZCB3aGF0IGhhcHBlbnMgaWYgdGhlIHRlYW0gY2Fubm90IGNvbWUgdG8gYSBkZWNpc2lvbiAoZm9yIGV4YW1wbGUsIGVzY2FsYXRpb24gdG8gdGhlIHByb2plY3Qgc3BvbnNvciBvciB0byBhIGdvdmVybmluZyBib2R5KS5dPC9zcGFuPjwvcD48aDYgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nNiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+U2FtcGxlIHRleHQ6PC9zcGFuPjwvaDY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDYiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMDciPjEuPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPkNvbnNlbnN1cyBtZWFucyB0aGF0IGV2ZXJ5b25lIGNhbiBsaXZlIHdpdGggdGhlIGRlY2lzaW9uLiBJdCBkb2VzbuKAmXQgbWVhbiBldmVyeW9uZSBoYXMgdG8gYWdyZWUgMTAwJS48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDA4Ij48c3BhbiBjbGFzcz0icHQtMDAwMDA3Ij4yLjwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5UaGUgdGVhbSB3aWxsIHVzZSB0aHVtYnMgdXAvdGh1bWJzIGRvd24gdm90aW5nIHRvIG1ha2UgZGVjaXNpb25zIHF1aWNrbHkgYW5kIG1vdmUgb24uPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwMyI+PHNwYW4gY2xhc3M9InB0LTAwMDAwNCI+74KnPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlRodW1icyB1cCA9IGFncmVlIHdpdGggbm8gZnVydGhlciBkaXNjdXNzaW9uLjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDMiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMDQiPu+Cpzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5UaHVtYnMgc2lkZXdheXMgPSBhZ3JlZSwgYnV0IGhhdmUgZnVydGhlciBxdWVzdGlvbnMuIChRdWVzdGlvbnMgd2lsbCBiZSBhc2tlZCBhbmQgYW5zd2VyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHZvdGUuKTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDUiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMDQiPu+Cpzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5UaHVtYnMgZG93biA9IGNhbm5vdCBhZ3JlZSB0byB0aGUgc29sdXRpb24gcHJvcG9zZWQuIChCZSBwcmVwYXJlZCB0byBhbnN3ZXIgdGhlIHF1ZXN0aW9uOiBXaGF0IHdvdWxkIGl0IHRha2UgZm9yIHlvdSB0byBnbyB0byB0aHVtYnMgc2lkZXdheXMgb3IgdGh1bWJzIHVwPyk8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOSI+PGJyIC8+JiN4MjAwZTs8c3BhbiBjbGFzcz0icHQtMDAwMDEwIiAvPjwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5BbnlvbmUgb24gdGhlIHRlYW0gbWF5IGNhbGwgZm9yIGEgdm90ZSBhdCBhbnkgdGltZS48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDA2Ij48c3BhbiBjbGFzcz0icHQtMDAwMDA3Ij4zLjwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5NZW1iZXJzIG1heSBhYnN0YWluIGZyb20gdm90aW5nLjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDYiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMDciPjQuPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPk5vIGRlY2lzaW9uIGlzIG1hZGUgaWYgdGhlcmUgYXJlIGFueSB0aHVtYnMtZG93biB2b3Rlcy48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDA4Ij48c3BhbiBjbGFzcz0icHQtMDAwMDA3Ij41Ljwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5NZWV0aW5nIG1pbnV0ZXMgd2lsbCBkb2N1bWVudCB0aGUgZGVjaXNpb25zIG1hZGUuIElmIHlvdSBoYXZlIHF1ZXN0aW9ucyBhZnRlciByZXZpZXdpbmcgdGhlIG1pbnV0ZXMsIGNvbnRhY3QgdGhlIHByb2plY3QgbWFuYWdlciBhbmQgZGV0ZXJtaW5lIHRoZSBjb3Vyc2Ugb2YgYWN0aW9uLCBzdWNoIGFzIHRvIGJyaW5nIHF1ZXN0aW9ucyB0byB0aGUgdGVhbSBmb3IgZGlzY3Vzc2lvbiBhZ2Fpbi48L3NwYW4+PC9wPjxoMiBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcyIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAwIj5NZWV0aW5nczwvc3Bhbj48L2gyPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQm9keVRleHQiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPltTbyBtdWNoIHByb2plY3Qgd29yayBhbmQgZGVjaXNpb24tbWFraW5nIGhhcHBlbnMgZHVyaW5nIG1lZXRpbmdzIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGVzdGFibGlzaCBob3cgcHJvamVjdCB0ZWFtIG1lZXRpbmdzIHdpbGwgd29yay4gQWRkcmVzcyB3aGF0IHdpbGwgaGFwcGVuIGF0IG1lZXRpbmdzIChnZW5lcmFsbHkpLiBFc3RhYmxpc2ggd2hvIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIHRoZSBmYWNpbGl0YXRpbmcsIGZyZXF1ZW5jeSwgYW5kIHNjaGVkdWxpbmcgb2YgbWVldGluZ3MsIGFuZCBhdHRlbmRhbmNlIGV4cGVjdGF0aW9ucy5dPC9zcGFuPjwvcD48aDYgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nNiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+U2FtcGxlIHRleHQ6PC9zcGFuPjwvaDY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDMiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMDQiPu+Cpzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5Qcm9qZWN0IHN1YnRlYW0gbGVhZGVycyB3aWxsIHJlcG9ydCBzdGF0dXMgYXQgZWFjaCB0ZWFtIG1lZXRpbmcuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwMyI+PHNwYW4gY2xhc3M9InB0LTAwMDAwNCI+74KnPC9zcGFuPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlByb2plY3QgdGVhbSBtZW1iZXJzIHdpbGwgbWVldCA8L3NwYW4+PGEgaWQ9IlRleHQxOSIgY2xhc3M9InB0LTAwMDAxMSI+PC9hPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPltmcmVxdWVuY3ksIGRhdGUsIHRpbWUsIGFuZCBsb2NhdGlvbnMgb2YgbWVldGluZ3NdPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPi4gRHVyaW5nIGVhY2ggbWVldGluZywgYSDigJxwYXJraW5nIGxvdOKAnSB3aWxsIGJlIHVzZWQgdG8gcmVjb3JkIHRvcGljcyB0aGF0IHJlcXVpcmUgZGlzY3Vzc2lvbiBhdCBhIGxhdGVyIGRhdGUuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwMyI+PHNwYW4gY2xhc3M9InB0LTAwMDAwNCI+74KnPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPklzc3Vlcywgcmlza3MsIGNoYW5nZSByZXF1ZXN0cywgYW5kIGFjdGlvbiBpdGVtcyB3aWxsIGJlIHJldmlld2VkIGFuZCB1cGRhdGVkIGF0IGVhY2ggbWVldGluZy48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAzIj48c3BhbiBjbGFzcz0icHQtMDAwMDA0Ij7vgqc8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+VGhlIHByb2plY3QgbWFuYWdlciB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciBmYWNpbGl0YXRpbmcgYW5kIGtlZXBpbmcgbWVldGluZ3Mgb24gdHJhY2suIFRlYW0gbWVtYmVycyB3aWxsIGFjY2VwdCB0aGUgcHJvamVjdCBtYW5hZ2Vy4oCZcyBkZWNpc2lvbiB0byB0YWJsZSBvciDigJxwYXJr4oCdIGEgZGlzY3Vzc2lvbiB0b3BpYy48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAzIj48c3BhbiBjbGFzcz0icHQtMDAwMDA0Ij7vgqc8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+TWVldGluZ3Mgd2lsbCBzdGFydCBhbmQgZW5kIG9uIHRpbWUuIFRlYW0gbWVtYmVycyB3aWxsIGF0dGVuZCBtZWV0aW5ncyBpbiBwZXJzb24gd2hlbiBmZWFzaWJsZS4gQSBkaWFsLWluIG51bWJlciB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgcmVtb3RlIGF0dGVuZGFuY2UuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwMyI+PHNwYW4gY2xhc3M9InB0LTAwMDAwNCI+74KnPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlNlbmRpbmcg4oCcc3RhbmQgaW5z4oCdIHRvIG1lZXRpbmdzIHdpbGwgbm90IGJlIGFsbG93ZWQgdW5sZXNzIGFwcHJvdmVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgcHJpb3IgdG8gbWVldGluZ3MuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwNSI+PHNwYW4gY2xhc3M9InB0LTAwMDAwNCI+74KnPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPkl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBlYWNoIHRlYW0gbWVtYmVyIHRvIHN0YXkgY3VycmVudCBvbiB0aGUgcHJvamVjdCB0ZWFtIGFjdGl2aXRpZXMsIGV2ZW4gd2hlbiBoZSBvciBzaGUgaGFzIG1pc3NlZCBhIG1lZXRpbmcuPC9zcGFuPjwvcD48aDIgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMCI+UGVyc29uYWwgQ291cnRlc2llczwvc3Bhbj48L2gyPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQm9keVRleHQiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPltPdXRsaW5lIHRoZSBwZXJzb25hbCBjb3VydGVzaWVzIHRoYXQgdGVhbSBtZW1iZXJzIHdpbGwgZXh0ZW5kIHRvIG9uZSBhbm90aGVyLiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGRlcGVuZCBsYXJnZWx5IG9uIHRoZSBjdWx0dXJlIG9mIHlvdXIgY29tcGFueS4gRG8gbm90IGFzc3VtZSB0aGF0IHBlcnNvbmFsIGJlaGF2aW9ycyBhcmUgdW5kZXJzdG9vZC5dPC9zcGFuPjwvcD48aDYgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nNiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+U2FtcGxlIHRleHQ6PC9zcGFuPjwvaDY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDMiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMDQiPu+Cpzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5FYWNoIHRlYW0gbWVtYmVyIHJlcHJlc2VudHMgYSBzcGVjaWZpYyBhcmVhIG9mIGV4cGVydGlzZSBvciBidXNpbmVzcyB1bml0LiBUZWFtIG1lbWJlcnMgd2lsbCBicmluZyB0aGVpciBpbmRpdmlkdWFsIHBlcnNwZWN0aXZlcyB0byB0aGUgdGVhbSBhbmQgd2lsbCBhbHNvIGNvbnNpZGVyIHdoYXQgaXMgYmVzdCBmb3IgdGhlIGNvbXBhbnkuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwNSI+PHNwYW4gY2xhc3M9InB0LTAwMDAwNCI+74KnPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPkFsbCBjZWxsIHBob25lcyBhbmQgb3RoZXIgY29tbXVuaWNhdGlvbiBkZXZpY2VzIG11c3QgYmUgc2lsZW5jZWQgZHVyaW5nIG1lZXRpbmdzIGFuZCB1c2VkIG9uIGFuIGV4Y2VwdGlvbiBiYXNpcyBvbmx5Ljwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1MaXN0QnVsbGV0MiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMiI+IDwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1MaXN0QnVsbGV0MiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMiI+IDwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1MaXN0QnVsbGV0MiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMiI+IDwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1MaXN0QnVsbGV0MiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMiI+IDwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1MaXN0QnVsbGV0MiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMiI+IDwvc3Bhbj48L3A+PGgzIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTMiPlJldmlld2VkIGFuZCBhcHByb3ZlZCBieTo8L3NwYW4+PC9oMz48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUJvZHlUZXh0MyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNCI+X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPl9fX19fX19fX19fX19fX19fX19fPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUJvZHlUZXh0My0wMDAwMTUiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTQiPlByb2plY3QgTWFuYWdlciA8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+RGF0ZTo8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQm9keVRleHQzLTAwMDAxNSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNCI+X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPl9fX19fX19fX19fX19fX19fX19fPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUJvZHlUZXh0My0wMDAwMTUiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTQiPlByb2plY3QgVGVhbSBNZW1iZXIgTmFtZTwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5EYXRlOjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Cb2R5VGV4dDMtMDAwMDE1Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE0Ij5fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX188L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+X19fX19fX19fX19fX19fX19fX188L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQm9keVRleHQzLTAwMDAxNSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNCI+UHJvamVjdCBUZWFtIE1lbWJlciBOYW1lPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPkRhdGU6PC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUJvZHlUZXh0My0wMDAwMTUiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTQiPl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5fX19fX19fX19fX19fX19fX19fXzwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Cb2R5VGV4dDMtMDAwMDE1Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE0Ij5Qcm9qZWN0IFRlYW0gTWVtYmVyIE5hbWU8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+RGF0ZTo8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQm9keVRleHQzLTAwMDAxNSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNCI+X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPl9fX19fX19fX19fX19fX19fX19fPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUJvZHlUZXh0My0wMDAwMTUiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTQiPlByb2plY3QgVGVhbSBNZW1iZXIgTmFtZTwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5EYXRlOjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Cb2R5VGV4dDMtMDAwMDE1Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE0Ij5fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX188L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+X19fX19fX19fX19fX19fX19fX188L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQm9keVRleHQzLTAwMDAxNSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNCI+UHJvamVjdCBUZWFtIE1lbWJlciBOYW1lPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPkRhdGU6PC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUJvZHlUZXh0My0wMDAwMTUiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTQiPl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5fX19fX19fX19fX19fX19fX19fXzwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Cb2R5VGV4dDMtMDAwMDE1Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE0Ij5Qcm9qZWN0IFRlYW0gTWVtYmVyIE5hbWU8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+RGF0ZTo8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQm9keVRleHQzLTAwMDAxNSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNCI+X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPl9fX19fX19fX19fX19fX19fX19fPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUJvZHlUZXh0My0wMDAwMTUiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTQiPlByb2plY3QgVGVhbSBNZW1iZXIgTmFtZTwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5EYXRlOjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Cb2R5VGV4dDMtMDAwMDE1Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE0Ij5fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX188L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+X19fX19fX19fX19fX19fX19fX188L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQm9keVRleHQzLTAwMDAxNSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNCI+UHJvamVjdCBUZWFtIE1lbWJlciBOYW1lPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPkRhdGU6PC9zcGFuPjwvcD48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvVGVzdC0wNS5odG1sIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9UZXN0LTA1Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIwZGFhYgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvVGVzdC0wNS5odG1sCkBAIC0wLDAgKzEsMjYzIEBACivvu788IURPQ1RZUEUgaHRtbCA+PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPjx0aXRsZT5DOlxVc2Vyc1xFcmljXERvY3VtZW50c1xPcGVuLVhtbC1Qb3dlclRvb2xzXE9wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXNcSHRtbENvbnZlcnRlcjAxXFRlc3QtMDUuZG9jeDwvdGl0bGU+PG1ldGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJQb3dlclRvb2xzIGZvciBPcGVuIFhNTCIgLz48c3R5bGU+c3BhbiB7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQordGFibGUucHQtMDAwMDAwIHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIGJvcmRlcjogbm9uZTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9Cit0ci5wdC0wMDAwMDEgeworICAgIGhlaWdodDogMC4xOWluOworfQordGQucHQtMDAwMDAyIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiA0OTkuNXB0OworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgYm9yZGVyLXJpZ2h0OiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK3AucHQtTm9ybWFsIHsKKyAgICBmb250LWZhbWlseTogJ0dhcmFtb25kJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udCB7CisgICAgZm9udC1mYW1pbHk6ICdHYXJhbW9uZCcsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorc3Bhbi5wdC0wMDAwMDMgeworICAgIGZvbnQtc2l6ZTogMTBwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RyLnB0LTAwMDAwNCB7CisgICAgaGVpZ2h0OiA1LjE5aW47Cit9Cit0ZC5wdC0wMDAwMDUgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDEzOS41cHQ7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICM4MDgwODAgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQorcC5wdC1UZXN0aW1vbmlhbCB7CisgICAgbWFyZ2luLXRvcDogMTBwdDsKKyAgICBsaW5lLWhlaWdodDogMjAwLjAlOworICAgIHRleHQtYWxpZ246IHJpZ2h0OworICAgIGZvbnQtZmFtaWx5OiAnR2FyYW1vbmQnLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTBwdDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDYgeworICAgIGZvbnQtZmFtaWx5OiAnR2FyYW1vbmQnLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTBwdDsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtUmVmZXJlbmNlIHsKKyAgICBtYXJnaW4tYm90dG9tOiA0NnB0OworICAgIHRleHQtYWxpZ246IHJpZ2h0OworICAgIGZvbnQtZmFtaWx5OiAnR2FyYW1vbmQnLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTBwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA3IHsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Cit0ZC5wdC0wMDAwMDggeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDM2MHB0OworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgYm9yZGVyLXJpZ2h0OiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICM4MDgwODAgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK2gxLnB0LUhlYWRpbmcxIHsKKyAgICBtYXJnaW4tYm90dG9tOiA0cHQ7CisgICAgbWFyZ2luLWxlZnQ6IDAuMThpbjsKKyAgICBmb250LWZhbWlseTogJ0dhcmFtb25kJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEzcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOSB7CisgICAgZm9udC1mYW1pbHk6ICdHYXJhbW9uZCcsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxM3B0OworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtVGV4dCB7CisgICAgbWFyZ2luLWJvdHRvbTogNHB0OworICAgIG1hcmdpbi1sZWZ0OiAwLjE4aW47CisgICAgZm9udC1mYW1pbHk6ICdHYXJhbW9uZCcsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorcC5wdC0wMDAwMTAgeworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgbWFyZ2luLWxlZnQ6IDAuNjhpbjsKKyAgICB0ZXh0LWluZGVudDogLTAuMjVpbjsKKyAgICBmb250LWZhbWlseTogJ0dhcmFtb25kJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LTAwMDAxMSB7CisgICAgZm9udC1mYW1pbHk6IFN5bWJvbDsKKyAgICBmb250LXNpemU6IDZwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdGV4dC1pbmRlbnQ6IDA7CisgICAgd2lkdGg6IDAuMjQ1aW47Cit9CitzcGFuLnB0LTAwMDAxMiB7CisgICAgZm9udC1mYW1pbHk6IFN5bWJvbDsKKyAgICBmb250LXNpemU6IDZwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdGV4dC1pbmRlbnQ6IDA7CisgICAgd2lkdGg6IDAuMjUwaW47Cit9CitwLnB0LTAwMDAxMyB7CisgICAgbWFyZ2luLWJvdHRvbTogNHB0OworICAgIG1hcmdpbi1sZWZ0OiAwLjY4aW47CisgICAgdGV4dC1pbmRlbnQ6IC0wLjI1aW47CisgICAgZm9udC1mYW1pbHk6ICdHYXJhbW9uZCcsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorcC5wdC1zbWFsbHNwYWNpbmcgeworICAgIG1hcmdpbi1sZWZ0OiAwLjI1aW47CisgICAgZm9udC1mYW1pbHk6ICdHYXJhbW9uZCcsICdzZXJpZic7CisgICAgZm9udC1zaXplOiA0cHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC0wMDAwMTQgeworICAgIGZvbnQtc2l6ZTogNHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1FZHVjYXRpb24geworICAgIG1hcmdpbi1sZWZ0OiAwLjE4aW47CisgICAgZm9udC1mYW1pbHk6ICdHYXJhbW9uZCcsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE1IHsKKyAgICBmb250LWZhbWlseTogJ0dhcmFtb25kJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQoraDIucHQtSGVhZGluZzIgeworICAgIG1hcmdpbi10b3A6IDhwdDsKKyAgICBtYXJnaW4tYm90dG9tOiA0cHQ7CisgICAgbWFyZ2luLWxlZnQ6IDAuMThpbjsKKyAgICBmb250LWZhbWlseTogJ0dhcmFtb25kJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTYgeworICAgIGZvbnQtZmFtaWx5OiAnR2FyYW1vbmQnLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitwLnB0LTAwMDAxNyB7CisgICAgbWFyZ2luLWxlZnQ6IDAuNjhpbjsKKyAgICB0ZXh0LWluZGVudDogLTAuMjVpbjsKKyAgICBmb250LWZhbWlseTogJ0dhcmFtb25kJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC1Qb3NpdGlvbiB7CisgICAgZm9udC1mYW1pbHk6ICdHYXJhbW9uZCcsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtTG9jYXRpb24geworICAgIG1hcmdpbi1sZWZ0OiAwLjkzaW47CisgICAgZm9udC1mYW1pbHk6ICdHYXJhbW9uZCcsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3AucHQtQWZmaWxpYXRpb24geworICAgIG1hcmdpbi1sZWZ0OiAwLjE4aW47CisgICAgZm9udC1mYW1pbHk6ICdHYXJhbW9uZCcsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK2JvZHkgeyBtYXJnaW46IDFjbSBhdXRvOyBtYXgtd2lkdGg6IDIwY207IHBhZGRpbmc6IDA7IH08L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2PjxkaXYgYWxpZ249ImxlZnQiPjx0YWJsZSBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAwMCI+PHRyIGNsYXNzPSJwdC0wMDAwMDEiPjx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0icHQtMDAwMDAyIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5EaWFuZSBXaGl0ZTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+MTIzIE1haW4gU3QsIFNlYXR0bGUsIFdBIDk4MTEyPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij4yMDYtNTU1LTEyMTI8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPmphbmljZUBhZHZlbnR1cmV3b3Jrcy5jb208L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMDQiPjx0ZCBjbGFzcz0icHQtMDAwMDA1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRlc3RpbW9uaWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA2Ij7igJwuLi5leGNlcHRpb25hbGx5IGVuZXJnZXRpYyBhbmQgZW50aHVzaWFzdGljIHRlYWNoZXIuLi5wcm9qZWN0cyBhIGNoYXJpc21hIHRoYXQgY2FwdHVyZXMgdGhlIGltYWdpbmF0aW9uIG9mIHN0dWRlbnRzLi4uZGVtb25zdHJhdGVkIGV4Y2VsbGVudCBjbGFzc3Jvb20gbWFuYWdlbWVudCBza2lsbC4uLuKAnTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1SZWZlcmVuY2UiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+U2ltb24gUGVhcnNvbjwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA3Ij48YnIgLz4mI3gyMDBlOzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPmZvcm1lciBhZG1pbmlzdHJhdG9yPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVJlZmVyZW5jZSI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1UZXN0aW1vbmlhbCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNiI+4oCcLi4uYnVzaW5lc3MgYmFja2dyb3VuZCBpbiB0ZWNobm9sb2d5IHdhcyBzdXBwb3J0aXZlIHRvIHRoZSB1c2Ugb2YgdmlkZW9zIGFuZCBjb21wdXRlcnMgaW4gdGhlIGNsYXNzLi4uU2hlIHZvbHVudGVlcmVkIGZvciBjb29wZXJhdGl2ZSBvcHBvcnR1bml0aWVzIGluIHRoZSBtZWRpYSBjZW50ZXIgYW5kIGhlbHBlZCB0ZWFjaGVycyB0byBhY2NvbW1vZGF0ZSBjb21wdXRlcnMuLi5JIHJlY29tbWVuZCBoZXIgd2l0aCB0aGUgaGlnaGVzdCByZWdhcmQuLi7igJ08L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtUmVmZXJlbmNlIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPkFpZGFuIERlbGFuZXk8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNyI+PGJyIC8+JiN4MjAwZTs8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij4ybmQgR3JhZGUgVGVhY2hlcjwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA3Ij48YnIgLz4mI3gyMDBlOzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPk5ldyBZb3JrIENpdHkgU2Nob29sczwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1SZWZlcmVuY2UiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGVzdGltb25pYWwiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDYiPuKAnC4uLmRlZXBseSBpbnZvbHZlZCBpbiBsZWFybmluZyBhYm91dCB0aGUgZWR1Y2F0aW9uYWwgc3RhdGUtb2YtdGhlLWFydCwgaW52ZXN0aWdhdGluZyByZXNlYXJjaCBhbmQgZGVzaWduaW5nIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzLi4uSSBsb29rIGZvcndhcmQgdG8gdGhlIHRpbWUgd2hlbiBEaWFuZSB3aWxsIGJyaW5nIGhlciBsb3ZlIG9mIGNoaWxkcmVuLCBlbnRodXNpYXNtLCBpbml0aWF0aXZlLCBhbmQgaW50ZWxsaWdlbmNlIGludG8gaGVyIG93biBjbGFzc3Jvb20u4oCdPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVJlZmVyZW5jZSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5Nb25pY2EgQnJpbmssIEVkLkQuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRlc3RpbW9uaWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA2Ij7igJxNeSBhYmlsaXR5IHRvIG1vdGl2YXRlIHN0dWRlbnRzIGFuZCBzaGFyZSBhIGxvdmUgb2YgbGVhcm5pbmcgZm9zdGVycyBhIHN1Y2Nlc3NmdWwgY2xhc3Nyb29tIGVudmlyb25tZW50LiAuLi5JIHdvdWxkIHdlbGNvbWUgYmVjb21pbmcgcGFydCBvZiDigJh0aGUgdmlsbGFnZSB0aGF0IHJhaXNlcyB0aGUgY2hpbGTigJkgaW4geW91ciBkaXN0cmljdC7igJ08L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtUmVmZXJlbmNlIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPkplbm55IEx5c2FrZXI8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtUmVmZXJlbmNlIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA4Ij48aDEgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOSI+UHJvZmVzc2lvbmFsIFByb2ZpbGU8L3NwYW4+PC9oMT48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRleHQiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+RWFnZXIgdG8gYnJpbmcgZWxlbWVudGFyeSBzdHVkZW50cyBpbnRvIHRoZSB0d2VudHktZmlyc3QgY2VudHVyeSB1c2luZyBhIHVuaXF1ZSBjb21iaW5hdGlvbiBvZiBlZHVjYXRpb24gZXhwZXJpZW5jZSBjb3VwbGVkIHdpdGggdGVuIHllYXJz4oCZIGJ1c2luZXNzIGJhY2tncm91bmQgaW4gY29tcHV0ZXIgc3lzdGVtcyBtYW5hZ2VtZW50Ljwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMTAiPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTEiPu+Ctzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPkhvbGQgTWFzdGVycyBEZWdyZWUgaW4gRWxlbWVudGFyeSBFZHVjYXRpb24gYW5kIEJhY2hlbG9ycyBEZWdyZWUgaW4gQ29tcHV0ZXIgU2NpZW5jZS48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDEwIj48c3BhbiBjbGFzcz0icHQtMDAwMDEyIj7vgrc8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5FeHBlcmllbmNlZCBpbiB1c2Ugb2YgdGhlIEludGVybmV0IGFuZCBlZHVjYXRpb25hbCBzb2Z0d2FyZS48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDEzIj48c3BhbiBjbGFzcz0icHQtMDAwMDEyIj7vgrc8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5EZWRpY2F0ZWQgdG8gZW50aHVzaWFzdGljIGFuZCBkeW5hbWljIHRlYWNoaW5nIGFzIGEgbWVhbnMgb2YgY3JlYXRpbmcgYW5kIG51cnR1cmluZyBhIGxpZmVsb25nIGxvdmUgb2Yga25vd2xlZGdlIGluIGNoaWxkcmVuLjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1zbWFsbHNwYWNpbmciPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTQiPiA8L3NwYW4+PC9wPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcxIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA5Ij5FZHVjYXRpb24sIEhvbm9ycywgYW5kIENlcnRpZmljYXRpb25zPC9zcGFuPjwvaDE+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1FZHVjYXRpb24iPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTUiPk0uUy4gRWxlbWVudGFyeSBFZHVjYXRpb248L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGV4dCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5FbG0gQ29sbGVnZSwgRmx1c2hpbmcsIE5ZLiAxOTk1PC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUVkdWNhdGlvbiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNSI+QmFjaGVsb3Igb2YgU2NpZW5jZSBDb21wdXRlciBTY2llbmNlPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRleHQiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+RmlyIFRyZWUgVW5pdmVyc2l0eSwgSGVtcHN0ZWFkLCBOWS4gMTk4NDwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1FZHVjYXRpb24iPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTUiPkthcHBhIERlbHRhIFBpIEhvbm9yIFNvY2lldHkgTWVtYmVyPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LXNtYWxsc3BhY2luZyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxNCI+IDwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1FZHVjYXRpb24iPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTUiPlByb3Zpc2lvbmFsIENlcnRpZmljYXRpb25zPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRleHQiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+TlkgU3RhdGUgRWxlbWVudGFyeSBFZHVjYXRpb24uIDE5OTU8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGV4dCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5OWSBTdGF0ZSBCdXNpbmVzcyBFZHVjYXRpb24uIDE5OTU8L3NwYW4+PC9wPjxoMiBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcyIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE2Ij5LZXkgUXVhbGlmaWNhdGlvbnM8L3NwYW4+PC9oMj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRleHQiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+Q2VydGlmaWVkIGluIEVsZW1lbnRhcnkgKEstNikgYW5kIEJ1c2luZXNzIEVkdWNhdGlvbjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1UZXh0Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPlBsYW4gYW5kIGluc3RydWN0IGVhY2ggc3ViamVjdCBhcmVhIHVzaW5nIHdpZGUgdmFyaWV0eSBvZiB0ZWFjaGluZyBhaWRzLCBtb3RpdmF0aW9uYWwgYW5kIGltcGxlbWVudGF0aW9uIHN0cmF0ZWdpZXMgdG8gZW5nYWdlIHN0dWRlbnRzIGluIGFjdGl2ZSBsZWFybmluZy48L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGV4dCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5JbmNvcnBvcmF0ZSBsZWFybmluZyBtb2RhbGl0eSBwcmluY2lwbGVzIGludG8gY2xhc3Nyb29tIGFuZCBpbmRpdmlkdWFsIGluc3RydWN0aW9uLiBEZXZlbG9wIGFuZCBjb25kdWN0IGludGVyLWdyYWRlIGFjdGl2aXRpZXMuIFV0aWxpemUgSGVhdGggYXV0b21hdGVkIG1hdGggbWFuYWdlbWVudCBzeXN0ZW0uPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRleHQiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+SW1wbGVtZW50IHRlY2hub2xvZ2ljYWwgYXBwcm9hY2hlcyB0byBzdWJqZWN0IG1hdGVyaWFsLiBSZXNlYXJjaCBlZHVjYXRpb25hbCByZXNvdXJjZXMgb24gdGhlIEludGVybmV0LiBBc3Npc3Qgd2l0aCBpbmZvcm1hdGlvbiByZXRyaWV2YWwuPC9zcGFuPjwvcD48aDIgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNiI+RXhwZXJpZW5jZWQgQ29tcHV0ZXIgRWR1Y2F0b3I8L3NwYW4+PC9oMj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRleHQiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+RGVzaWduZWQgYW5kIGNvbmR1Y3RlZCB2YXJpb3VzIGZhY3VsdHkgYW5kIHN0dWRlbnQgd29ya3Nob3BzIGZvciB0cmFpbmluZyBpbiB3b3JkIHByb2Nlc3NpbmcgYW5kIHNwcmVhZHNoZWV0IHNvZnR3YXJlLiBJbnN0cnVjdGVkIGNvcnBvcmF0ZSBwZXJzb25uZWwgaW4gdXNlIG9mIHdvcmQgcHJvY2Vzc2luZywgZGVza3RvcCBwdWJsaXNoaW5nLCBhbmQgZHJhZnRpbmcgcHJvZ3JhbXMgZm9yIGNvbnZlcnNpb24gZnJvbSBtYW51YWwgdHlwZXNldHRpbmcgYW5kIGRyYWZ0aW5nIHRvIGNvbXB1dGVyIGFzc2lzdGVkIG1ldGhvZHMuPC9zcGFuPjwvcD48aDIgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNiI+Q29tcHV0ZXIgU2tpbGxzPC9zcGFuPjwvaDI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMTciPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTIiPu+Ctzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtUG9zaXRpb24iPlNvZnR3YXJlICg8L3NwYW4+PHNwYW4gY2xhc3M9InB0LVBvc2l0aW9uIj5JQk08L3NwYW4+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LVBvc2l0aW9uIj4gYW5kIE1BQyBlbnZpcm9ubWVudHMpOjwvc3Bhbj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPiBNaWNyb3NvZnQgV2luZG93c8KuIGFuZCBET1MsIDwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPldvcmRQZXJmZWN0PC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+LCBMb3R1czEyMywgTWljcm9zb2Z0IFdvcmQsIFBhZ2VNYWtlciwgQXV0b0NBRCwgQm9va3MgaW4gUHJpbnQsIEJha2VyICZhbXA7IFRheWxvciBMaW5rcywgQmliYmFzZTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMTciPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTIiPu+Ctzwvc3Bhbj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPldvcmtpbmcga25vd2xlZGdlIG9mIHRoZSA8L3NwYW4+PHNwYW4gY2xhc3M9InB0LVBvc2l0aW9uIj5JbnRlcm5ldDwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMTciPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTIiPu+Ctzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtUG9zaXRpb24iPlN5c3RlbSBpbnN0YWxsYXRpb25zIGFuZCBkZWJ1Z2dpbmc7PC9zcGFuPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+IHRlcm1pbmFsL3ByaW50ZXIgb3BlcmF0aW9uczwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcxIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA5Ij5FbXBsb3ltZW50PC9zcGFuPjwvaDE+PGgyIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTYiPlByb2Zlc3Npb25hbCBEZXZlbG9wbWVudCBpbiBFZHVjYXRpb248L3NwYW4+PC9oMj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAxNyI+PHNwYW4gY2xhc3M9InB0LTAwMDAxMiI+74K3PC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1Qb3NpdGlvbiI+U3Vic3RpdHV0ZSBUZWFjaGVyLCBLIHRocnUgSGlnaCBTY2hvb2wsPC9zcGFuPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+IEFwcmlsIDE5OTUgdG8gcHJlc2VudDwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMTciPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTIiPu+Ctzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtUG9zaXRpb24iPkdyYWR1YXRlIEFkdmlzb3IsIEVkdWNhdGlvbiBEZXB0Liw8L3NwYW4+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij4gT2N0b2JlciAxOTk1IHRvIHByZXNlbnQ8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTG9jYXRpb24iPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+RWxtIENvbGxlZ2UsIEZsdXNoaW5nLCBOWTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMTciPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTIiPu+Ctzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtUG9zaXRpb24iPldvcmtzaG9wIFByZXNlbnRlciw8L3NwYW4+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij4gTm92ZW1iZXIgMTk5NTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Mb2NhdGlvbiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5GaXJzdCBjb21iaW5lZCBJbnRlcm5hdGlvbmFsIFJlYWRpbmcgQXNzb2NpYXRpb24gUmVnaW9uYWwgQ29uZmVyZW5jZSwgPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+TmFzaHZpbGxlPC9zcGFuPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+LCA8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5UTjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMTciPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTIiPu+Ctzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtUG9zaXRpb24iPkluZm9ybWF0aW9uIFNlcnZpY2VzIEFzc2lzdGFudCw8L3NwYW4+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij4gTWF5IDE5OTQgdG8gQXVndXN0IDE5OTU8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTG9jYXRpb24iPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+RWxtIENvbGxlZ2UsIEZsdXNoaW5nLCBOWTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMTciPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTIiPu+Ctzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtUG9zaXRpb24iPlN0dWRlbnQgVGVhY2hlciw8L3NwYW4+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij4gU2VwdGVtYmVyIHRvIERlY2VtYmVyIDE5OTQ8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTG9jYXRpb24iPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+RmlyIFRyZWUgRWxlbWVudGFyeSwgRmx1c2hpbmcsIE5ZPC9zcGFuPjwvcD48aDIgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNiI+Q29tcHV0ZXIgUmVsYXRlZCBUcmFpbmluZyBQb3NpdGlvbnM8L3NwYW4+PC9oMj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAxNyI+PHNwYW4gY2xhc3M9InB0LTAwMDAxMiI+74K3PC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1Qb3NpdGlvbiI+V29ya3Nob3AgUHJlc2VudGVyLDwvc3Bhbj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPiBGZWJydWFyeSwgMTk5NTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Mb2NhdGlvbiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5NYXBsZSBIaWdoIFNjaG9vbCwgRWFzdCBJc2xpcCwgTlk8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDE3Ij48c3BhbiBjbGFzcz0icHQtMDAwMDEyIj7vgrc8L3NwYW4+PHNwYW4gY2xhc3M9InB0LVBvc2l0aW9uIj5HcmFkdWF0ZSBBc3Npc3RhbnQsPC9zcGFuPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+IEF1Z3VzdCAxOTkzIHRvIE1heSAxOTk0PC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUxvY2F0aW9uIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPkVsbSBDb2xsZWdlLCBGbHVzaGluZywgTlk8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDE3Ij48c3BhbiBjbGFzcz0icHQtMDAwMDEyIj7vgrc8L3NwYW4+PHNwYW4gY2xhc3M9InB0LVBvc2l0aW9uIj5Tb2Z0d2FyZSBFbmdpbmVlciw8L3NwYW4+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij4gMTk4OSB0byAxOTkxPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUxvY2F0aW9uIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPlRyZXkgUmVzZWFyY2gsIFNtaXRodG93biwgTlk8L3NwYW4+PC9wPjxoMiBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcyIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE2Ij5Db3Jwb3JhdGUgQ29tcHV0ZXIgU3lzdGVtcyBNYW5hZ2VtZW50PC9zcGFuPjwvaDI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMTciPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTIiPu+Ctzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtUG9zaXRpb24iPlN5c3RlbXMgTWFuYWdlciw8L3NwYW4+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij4gMTk4NyB0byAxOTg5PC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUxvY2F0aW9uIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPkEuIERhdHVtIENvcnBvcmF0aW9uLCBCb2hlbWlhLCBOWTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMTciPjxzcGFuIGNsYXNzPSJwdC0wMDAwMTIiPu+Ctzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtUG9zaXRpb24iPlNvZnR3YXJlIFF1YWxpdHkgQXNzdXJhbmNlIEVuZ2luZWVyLDwvc3Bhbj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPiAxOTg2IHRvIDE5ODc8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTG9jYXRpb24iPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+RmFicmlrYW0sIEluYy4sIDwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPlNtaXRodG93bjwvc3Bhbj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPiwgPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+Tlk8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDE3Ij48c3BhbiBjbGFzcz0icHQtMDAwMDEyIj7vgrc8L3NwYW4+PHNwYW4gY2xhc3M9InB0LVBvc2l0aW9uIj5TdGFmZiBBZG1pbmlzdHJhdG9yLCBFeGVjdXRpdmUgRGVwYXJ0bWVudCw8L3NwYW4+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij4gMTk4NCB0byAxOTg2PC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LUxvY2F0aW9uIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPlRoZSBUZWxlcGhvbmUgQ29tcGFueSwgQnJvb2tseW4sIE5ZPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAxNyI+PHNwYW4gY2xhc3M9InB0LTAwMDAxMiI+74K3PC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1Qb3NpdGlvbiI+U3R1ZGVudCBEaXJlY3Rvci9Bc3Npc3RhbnQsIENvbXB1dGVyIFNjaWVuY2UgTGFiLDwvc3Bhbj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPiAxOTgxIHRvIDE5ODQ8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTG9jYXRpb24iPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+RmlyIFRyZWUgVW5pdmVyc2l0eSwgSGVtcHN0ZWFkLCBOWTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcxIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA5Ij5Qcm9mZXNzaW9uYWwgQWZmaWxpYXRpb25zPC9zcGFuPjwvaDE+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1BZmZpbGlhdGlvbiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5JbnRlcm5hdGlvbmFsIFJlYWRpbmcgQXNzb2NpYXRpb248L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtQWZmaWxpYXRpb24iPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+QXNzb2NpYXRpb24gZm9yIFN1cGVydmlzaW9uIGFuZCBDdXJyaWN1bHVtIERldmVsb3BtZW50PC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL1Rlc3QtMDYuaHRtbCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDEvVGVzdC0wNi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMDNmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL1Rlc3QtMDYuaHRtbApAQCAtMCwwICsxLDMyOSBAQAor77u/PCFET0NUWVBFIGh0bWwgPjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz48dGl0bGU+PC90aXRsZT48bWV0YSBuYW1lPSJHZW5lcmF0b3IiIGNvbnRlbnQ9IlBvd2VyVG9vbHMgZm9yIE9wZW4gWE1MIiAvPjxzdHlsZT5zcGFuIHsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9Cit0YWJsZS5wdC0wMDAwMDAgeworICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisgICAgYm9yZGVyOiBub25lOworICAgIHdpZHRoOiAxMDAlOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3RkLnB0LTAwMDAwMSB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTQuOCU7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0JDQjhBQyAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNCQ0I4QUMgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0JDQjhBQyAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNGMjRGNEY7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitwLnB0LU5vcm1hbCB7CisgICAgbWFyZ2luLXRvcDogM3B0OworICAgIG1hcmdpbi1ib3R0b206IDNwdDsKKyAgICBmb250LWZhbWlseTogQ2VudHVyeSBHb3RoaWM7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtMDAwMDAyIHsKKyAgICBjb2xvcjogIzRDNDgzRDsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Cit0ZC5wdC0wMDAwMDMgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDEwLjclOworICAgIGJvcmRlci10b3A6IHNvbGlkICNCQ0I4QUMgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjQkNCOEFDIDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICNCQ0I4QUMgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjRjI0RjRGOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDA0IHsKKyAgICBtYXJnaW4tdG9wOiAzcHQ7CisgICAgbWFyZ2luLWJvdHRvbTogM3B0OworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBmb250LWZhbWlseTogQ2VudHVyeSBHb3RoaWM7CisgICAgZm9udC1zaXplOiA4cHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udCB7CisgICAgY29sb3I6ICNGRkZGRkY7CisgICAgZm9udC1mYW1pbHk6IENlbnR1cnkgR290aGljOworICAgIGZvbnQtc2l6ZTogOHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDA1IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAxMC42JTsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjQkNCOEFDIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0JDQjhBQyAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjQkNCOEFDIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0YyNEY0RjsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK3RkLnB0LTAwMDAwNiB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTQuOCU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNCQ0I4QUMgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0JDQjhBQyAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDA3IHsKKyAgICBtYXJnaW4tdG9wOiAzcHQ7CisgICAgbWFyZ2luLWJvdHRvbTogM3B0OworICAgIGZvbnQtZmFtaWx5OiBDZW50dXJ5IEdvdGhpYzsKKyAgICBmb250LXNpemU6IDhwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCB7CisgICAgY29sb3I6ICM0QzQ4M0Q7CisgICAgZm9udC1mYW1pbHk6IENlbnR1cnkgR290aGljOworICAgIGZvbnQtc2l6ZTogOHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDA5IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAxMC43JTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0JDQjhBQyAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjQkNCOEFDIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitwLnB0LU5vcm1hbC0wMDAwMTAgeworICAgIG1hcmdpbi10b3A6IDNwdDsKKyAgICBtYXJnaW4tYm90dG9tOiAzcHQ7CisgICAgbWFyZ2luLWxlZnQ6IDAuMjdpbjsKKyAgICBmb250LWZhbWlseTogJ0dhcmFtb25kJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEwcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTEgeworICAgIGNvbG9yOiAjNEM0ODNEOworICAgIGZvbnQtZmFtaWx5OiAnR2FyYW1vbmQnLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTBwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtTm9ybWFsLTAwMDAxMiB7CisgICAgbWFyZ2luLXRvcDogM3B0OworICAgIG1hcmdpbi1ib3R0b206IDNwdDsKKyAgICBtYXJnaW4tbGVmdDogMC4zMWluOworICAgIGZvbnQtZmFtaWx5OiAnR2FyYW1vbmQnLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTBwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitwLnB0LU5vcm1hbC0wMDAwMTMgeworICAgIG1hcmdpbi10b3A6IDNwdDsKKyAgICBtYXJnaW4tYm90dG9tOiAzcHQ7CisgICAgZm9udC1mYW1pbHk6ICdHYXJhbW9uZCcsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3RkLnB0LTAwMDAxNCB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTAuNiU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNCQ0I4QUMgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0JDQjhBQyAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQordGQucHQtMDAwMDE1IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAxNC44JTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0JDQjhBQyAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjQkNCOEFDIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0REREJENTsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK3RkLnB0LTAwMDAxNiB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTAuNyU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNCQ0I4QUMgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0JDQjhBQyAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNERERCRDU7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9Cit0ZC5wdC0wMDAwMTcgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDEwLjYlOworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjQkNCOEFDIDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICNCQ0I4QUMgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjREREQkQ1OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDE4IHsKKyAgICBtYXJnaW4tdG9wOiAzcHQ7CisgICAgbWFyZ2luLWJvdHRvbTogM3B0OworICAgIG1hcmdpbi1sZWZ0OiAwLjE1aW47CisgICAgZm9udC1mYW1pbHk6IENlbnR1cnkgR290aGljOworICAgIGZvbnQtc2l6ZTogOHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE5IHsKKyAgICBjb2xvcjogIzRDNDgzRDsKKyAgICBmb250LWZhbWlseTogQ2VudHVyeSBHb3RoaWM7CisgICAgZm9udC1zaXplOiA4cHQ7CisgICAgZm9udC1zdHlsZTogaXRhbGljOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCB7CisgICAgY29sb3I6ICM0QzQ4M0Q7CisgICAgZm9udC1mYW1pbHk6ICdHYXJhbW9uZCcsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorc3Bhbi5wdC0wMDAwMjEgeworICAgIGNvbG9yOiAjNEM0ODNEOworICAgIGZvbnQtc2l6ZTogMTBwdDsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAyMiB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTQuOCU7CisgICAgYm9yZGVyLXRvcC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNCQ0I4QUMgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0JDQjhBQyAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0JDQjhBQyAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjMgeworICAgIGNvbG9yOiAjRjI0RjRGOworICAgIGZvbnQtZmFtaWx5OiBDZW50dXJ5IEdvdGhpYzsKKyAgICBmb250LXNpemU6IDhwdDsKKyAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAyNCB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTAuNyU7CisgICAgYm9yZGVyLXRvcC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNCQ0I4QUMgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0JDQjhBQyAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0JDQjhBQyAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworfQorcC5wdC1Ob3JtYWwtMDAwMDI1IHsKKyAgICBtYXJnaW4tdG9wOiAzcHQ7CisgICAgbWFyZ2luLWJvdHRvbTogM3B0OworICAgIG1hcmdpbi1sZWZ0OiAwLjI3aW47CisgICAgZm9udC1mYW1pbHk6IENlbnR1cnkgR290aGljOworICAgIGZvbnQtc2l6ZTogMTBwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LTAwMDAyNiB7CisgICAgY29sb3I6ICM0QzQ4M0Q7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDI3IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAxMC42JTsKKyAgICBib3JkZXItdG9wLXN0eWxlOiBub25lOworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0JDQjhBQyAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjQkNCOEFDIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjQkNCOEFDIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7Cit9CitoMi5wdC1IZWFkaW5nMiB7CisgICAgbWFyZ2luLXRvcDogNnB0OworICAgIG1hcmdpbi1ib3R0b206IDZwdDsKKyAgICBmb250LWZhbWlseTogJ0dhcmFtb25kJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEzcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC0wMDAwMjggeworICAgIGNvbG9yOiAjNEM0ODNEOworICAgIGZvbnQtc2l6ZTogMTNwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Citib2R5IHsgbWFyZ2luOiAxY20gYXV0bzsgbWF4LXdpZHRoOiAyMGNtOyBwYWRkaW5nOiAwOyB9PC9zdHlsZT48L2hlYWQ+PGJvZHk+PGRpdj48ZGl2IGFsaWduPSJsZWZ0Ij48dGFibGUgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDAiPjx0cj48dGQgY2xhc3M9InB0LTAwMDAwMSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDMiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5Nb250aCAxPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDAzIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+TW9udGggMjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwMyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPk1vbnRoIDM8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDMiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5Nb250aCA0PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDAzIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+TW9udGggNTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwMyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPk1vbnRoIDY8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDMiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij5Nb250aCA3PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+TW9udGggODwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAwNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij5TdGFydGluZyBjYXNoPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTAiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTEiPiQyMDAwMC4wMDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIj4kMjIwMDAuMDA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMTUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+Q2FzaCBJbjo8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDA2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTgiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPkNhc2ggU2FsZXMgUGFpZDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEwIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIj4kMjAwMC4wMDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIj4kMjAwMC4wMDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE4Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij5SZWNlaXZhYmxlczwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEwIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIj4kNDAwMC4wMDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIj4kNDAwMC4wMDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAwNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE5Ij5Ub3RhbCBDYXNoIEluPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTAiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPiQ2MDAwLjAwPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPiQ2MDAwLjAwPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMjEiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAyMSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDIxIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMjEiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAyMSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDIxIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDE1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPkNhc2ggT3V0Ojwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEwIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMDYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxOCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+UmVudDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEwIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIj4kMTAwMC4wMDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIj4kMTAwMC4wMDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE4Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij5QYXlyb2xsPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTAiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTEiPiQxMDAwLjAwPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTEiPiQxMDAwLjAwPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDA2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTgiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPk90aGVyPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTAiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTEiPiQyMDAwLjAwPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTEiPiQyMDAwLjAwPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDE1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTkiPlRvdGFsIENhc2ggT3V0PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTAiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPiQ0MDAwLjAwPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPiQ0MDAwLjAwPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMjEiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAyMSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDIxIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMjEiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAyMSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDIxIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDA2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPkVuZGluZyBCYWxhbmNlPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTAiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTEiPiQyMjAwMC4wMDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEyIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIj4kMjQwMDAuMDA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwOSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDEzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAyIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDIiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMjIiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMyI+Q2hhbmdlIChjYXNoIGZsb3cpPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDI0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMjUiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMjYiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMjQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDI2Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDI0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAyNiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAyNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMjYiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMjQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDI2Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDI0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAyNiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAyNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMjYiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMjciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDI2Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48aDIgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAyOCI+IDwvc3Bhbj48L2gyPjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9UZXN0LTA3Lmh0bWwgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL1Rlc3QtMDcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGYxZWRlCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9UZXN0LTA3Lmh0bWwKQEAgLTAsMCArMSwxNjYgQEAKK++7vzwhRE9DVFlQRSBodG1sID48aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+PHRpdGxlPteQ16jXpteV16og15TXkdeo15nXqiDigJMg15XXmden15nXpNeT15nXlDwvdGl0bGU+PG1ldGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJQb3dlclRvb2xzIGZvciBPcGVuIFhNTCIgLz48c3R5bGU+c3BhbiB7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQoraDEucHQtSGVhZGluZzEgeworICAgIG1hcmdpbi10b3A6IDVwdDsKKyAgICBtYXJnaW4tYm90dG9tOiA1cHQ7CisgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMjRwdDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250IHsKKyAgICBjb2xvcjogI0ZGMDAwMDsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAyNHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtTm9ybWFsIHsKKyAgICBiYWNrZ3JvdW5kOiAjRkZDMDAwOworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDAgeworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitwLnB0LU5vcm1hbFdlYiB7CisgICAgbWFyZ2luLXRvcDogNXB0OworICAgIG1hcmdpbi1ib3R0b206IDVwdDsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIHsKKyAgICBjb2xvcjogIzQ0NzJDNDsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIHsKKyAgICBjb2xvcjogIzQ0NzJDNDsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMgeworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCB7CisgICAgY29sb3I6ICM5MkQwNTA7CisgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK2gyLnB0LUhlYWRpbmcyIHsKKyAgICBtYXJnaW4tdG9wOiA1cHQ7CisgICAgbWFyZ2luLWJvdHRvbTogNXB0OworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDE4cHQ7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUgeworICAgIGNvbG9yOiAjRkYwMDAwOworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDE4cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC0wMDAwMDYgeworICAgIG1hcmdpbi10b3A6IDVwdDsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIG1hcmdpbi1yaWdodDogMC4yNWluOworICAgIHRleHQtaW5kZW50OiAtMC4yNWluOworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgbWFyZ2luLWxlZnQ6IDA7Cit9CitzcGFuLnB0LTAwMDAwNyB7CisgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdGV4dC1pbmRlbnQ6IDA7CisgICAgd2lkdGg6IDAuMjUwaW47Cit9CitwLnB0LTAwMDAwOCB7CisgICAgbWFyZ2luLXRvcDogNXB0OworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwLjc1aW47CisgICAgdGV4dC1pbmRlbnQ6IC0wLjM4aW47CisgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBtYXJnaW4tbGVmdDogMDsKK30KK3NwYW4ucHQtMDAwMDA5IHsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICB0ZXh0LWluZGVudDogMDsKKyAgICB3aWR0aDogMC4zNzVpbjsKK30KK3AucHQtMDAwMDEwIHsKKyAgICBtYXJnaW4tdG9wOiA1cHQ7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDAuODVpbjsKKyAgICB0ZXh0LWluZGVudDogLTAuMzVpbjsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIG1hcmdpbi1sZWZ0OiAwOworfQorc3Bhbi5wdC0wMDAwMTEgeworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIHRleHQtaW5kZW50OiAwOworICAgIHdpZHRoOiAwLjM1MGluOworfQorcC5wdC0wMDAwMTIgeworICAgIG1hcmdpbi10b3A6IDVwdDsKKyAgICBtYXJnaW4tYm90dG9tOiA1cHQ7CisgICAgbWFyZ2luLXJpZ2h0OiAwLjI1aW47CisgICAgdGV4dC1pbmRlbnQ6IC0wLjI1aW47CisgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBtYXJnaW4tbGVmdDogMDsKK30KK2JvZHkgeyBtYXJnaW46IDFjbSBhdXRvOyBtYXgtd2lkdGg6IDIwY207IHBhZGRpbmc6IDA7IH08L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2PjxoMSBkaXI9InJ0bCIgY2xhc3M9InB0LUhlYWRpbmcxIj4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPiYjeDIwMGY715DXqNem15XXqiDXlNeR16jXmdeqJiN4MjAwZjs8L3NwYW4+PC9oMT48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMCI+JiN4MjAwZjvXlNee15XXoNeXICImI3gyMDBmOzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAwIj4mI3gyMDBlO1VTQSYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAwIj4mI3gyMDBmOyIg157XpNeg15Qg15zXm9eQ158uINec16LXqNeaINeU16LXldeh16cg15HXoteo15XXpSDXlNeY15zXldeV15nXlteZ15QsINeo15DXlSAmI3gyMDBmOzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAwIj4mI3gyMDBlO1VTQSYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAwIj4mI3gyMDBmOyAo16LXqNeV16Ug15jXnNeV15XXmdeW15nXlCkuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsV2ViIj4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj4mI3gyMDBmO9eQ16jXpteV16og15TXkdeo15nXqiDXqdecINeQ157XqNeZ16fXlCYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjso15HXkNeg15LXnNeZ16o6ICYjeDIwMGY7PC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPiYjeDIwMGU7VW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJiN4MjAwZTs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMiPiYjeDIwMGY7LCDXkNeVINeR16jXkNep15kg16rXmdeR15XXqjogJiN4MjAwZjs8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+JiN4MjAwZTtVU0EmI3gyMDBlOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjssINeR16rXqNeS15XXnSDXnteZ15zXldec15kg15zXoteR16jXmdeqOiAi15TXnteT15nXoNeV16og15TXnteQ15XXl9eT15XXqiDXqdecINeQ157XqNeZ16fXlCIpINeU15nXkCDXpNeT16jXpteZ15Qg15XXqNek15XXkdec15nXp9eULdeX15XXp9eq15nXqiDXlNee15XXqNeb15HXqiDXni01MCDXnteT15nXoNeV16og15XXntee15fXldeWINek15PXqNec15kuINeU157Xk9eZ16DXlCDXqdeV15vXoNeqINeR16jXlda815HWuNa815Qg15HXnteo15vXliDXmdeR16nXqiDXkNee16jXmden15Qg15TXptek15XXoNeZ16osINep15HXlCDXoNee16bXkNeV16ogNDkg157XlNee15PXmdeg15XXqiDXldeb158g157Xl9eV15Yg16fXldec15XXnteR15nXlCDXqdeR15Ug16DXntem15DXqiDXlNei15nXqCDXldeV16nXmdeg15LXmNeV158sINeR15nXqNeqINeU157Xk9eZ16DXlC4g15DXqNem15XXqiDXlNeR16jXmdeqINeS15XXkdec16og15HXp9eg15PXlCDXkdem16TXldefINeV15HXnten16HXmden15Ug15HXk9eo15XXnS4g157Xk9eZ16DXqiDXkNec16HXp9eUINep15XXm9eg16og15HXptek15XXny3Xntei16jXkSDXlNeZ15HXqdeqLCDXm9eQ16nXqCDXp9eg15PXlCDXoNee16bXkNeqINee15bXqNeX15nXqiDXnNeUINeV16jXldeh15nXlCDXoNee16bXkNeqINeR16bXkyDXntei16jXkSwg157XoteR16gg15zXntem16gg15HXqNeZ16DXki4g15TXnteT15nXoNeUINeULSA1MCDXlNeZ15Ag15TXldeV15DXmSwg15DXqNeb15nXpNec15Ig15TXqdeV15vXnyDXkdeQ15XXp9eZ15nXoNeV16Eg15TXqden15guJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsV2ViIj4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj4mI3gyMDBmO9ep15jXl9eUINep15wg15DXqNem15XXqiDXlNeR16jXmdeqINeU15XXkCA5LjgzINee15nXnNeZ15XXnyDXp9eeIteoLCDXldeQ15XXm9ec15XXodeZ15nXqteULCDXoNeb15XXnyDXnNeZ15XXnNeZIDIwMTMg157Xldeg15Qg15stMzE3LDE4MSwwMDAg157Xmdec15nXldefINeq15XXqdeR15nXnS4g15DXqNem15XXqiDXlNeR16jXmdeqINeU15nXkCDXkNeX16og157XlNee15PXmdeg15XXqiDXlNee15LXldeV16DXldeqINeR15nXldeq16gg157XkdeX15nXoNeUINeQ16rXoNeZ16osINep16DXldem16gg15vXqteV16bXkNeUINee15TXkteZ16jXlCDXqNeX15HXqiDXlNeZ16fXoyDXntee15PXmdeg15XXqiDXqNeR15XXqi4g15vXnNeb15zXqiDXkNeo16bXldeqINeU15HXqNeZ16og15TXmdeQINeU15vXnNeb15zXlCDXlNec15DXldee15nXqiDXlNeS15PXldec15Qg15HXmdeV16rXqCDXkdei15XXnNedLCDXldeU16rXldem16gg15TXnten15XXnteZINeU15LXldec157XmSDXqdec15Qg15TXmdeUINec157Xotec15Qg154tMTQg15jXqNeZ15zXmdeV158g15PXldec16gg15HXqdeg16ogMjAwOS4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWxXZWIiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPiYjeDIwMGY715DXqNem15XXqiDXlNeR16jXmdeqINeg15fXqdeR16og15vXmdeV150gLSDXnNeQ15fXqCDXlNeq16TXqNen15XXqteUINep15wg15HXqNeZ16og15TXnteV16LXpteV16ogLSDXnNee16LXptee16og15TXotecINeU15nXl9eZ15PXlCDXkdei15XXnNedLCDXldeU15nXkCDXkdei15zXqiDXl9ep15nXkdeV16og157Xm9eo16LXqiDXkdeb15zXm9ec15QsINeR15HXmdeY15fXldefINeV15HXmdeX16HXmSDXlNeX15XXpSDXlNeR15nXoNec15DXldee15nXmdedLiYjeDIwMGY7PC9zcGFuPjwvcD48aDIgZGlyPSJydGwiIGNsYXNzPSJwdC1IZWFkaW5nMiI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXqteV15vXnyDXoteg15nXmdeg15nXnSYjeDIwMGY7PC9zcGFuPjwvaDI+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMDYiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC0wMDAwMDciPiYjeDIwMGY7MS4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJhci1TQSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjvXkNeY15nXnteV15zXldeS15nXlCYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAwNyI+JiN4MjAwZjsyLiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImFyLVNBIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj4mI3gyMDBmO9eU15nXodeY15XXqNeZ15QmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDA4Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtMDAwMDA5Ij4mI3gyMDBmOzIuMS4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJhci1TQSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjvXlNeq16fXldek15Qg15TXp9eT150g16fXldec15XXoNeZ15DXnNeZ16og15XXqNeQ16nXmdeqINeU16fXldec15XXoNeZ15bXpteZ15QmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMDgiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC0wMDAwMDkiPiYjeDIwMGY7Mi4yLiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImFyLVNBIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj4mI3gyMDBmO9eU16nXkteqINei16bXnteQ15XXqiDXldeU15TXqtek16nXmNeV16og157Xoteo15HXlCYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAwOCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAwOSI+JiN4MjAwZjsyLjMuJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iYXItU0EiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMiPiYjeDIwMGY7157XnNeX157XqiDXlNeQ15bXqNeX15nXnSDXldeU16rXpNeq15fXldeqINeU16rXotep15nXmdeUJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDA4Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtMDAwMDA5Ij4mI3gyMDBmOzIuNC4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJhci1TQSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjvXntec15fXnteqINeU16LXldec150g15TXqNeQ16nXldeg15QsINeU16nXpNecINeU15LXk9eV15wg15XXntec15fXnteqINeU16LXldec150g15TXqdeg15nXmdeUJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDA4Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtMDAwMDA5Ij4mI3gyMDBmOzIuNS4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJhci1TQSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjvXlNee15zXl9ee15Qg15TXp9eo15Qg15XXlteb15XXmdeV16og15TXkNeW16jXlyYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAwOCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAwOSI+JiN4MjAwZjsyLjYuJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iYXItU0EiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMiPiYjeDIwMGY7157XqteV150g15TXntec15fXnteUINeU16fXqNeUINeV16LXkyDXlNeZ15XXnSYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAwNyI+JiN4MjAwZjszLiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImFyLVNBIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj4mI3gyMDBmO9ek15XXnNeZ15jXmden15Qg15XXntee16nXnCYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAwNyI+JiN4MjAwZjs0LiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImFyLVNBIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj4mI3gyMDBmO9eb15zXm9ec15QmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDA4Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtMDAwMDA5Ij4mI3gyMDBmOzQuMS4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJhci1TQSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjvXlNeb16DXodeUJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtMDAwMDA3Ij4mI3gyMDBmOzUuJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iYXItU0EiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMiPiYjeDIwMGY716nXnNeY15XXnyDXnten15XXnteZJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtMDAwMDA3Ij4mI3gyMDBmOzYuJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iYXItU0EiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMiPiYjeDIwMGY715LXkNeV15LXqNek15nXlCYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMDgiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC0wMDAwMDkiPiYjeDIwMGY7Ni4xLiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImFyLVNBIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj4mI3gyMDBmO9ek16DXmSDXlNeQ16jXpSYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAwOCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAwOSI+JiN4MjAwZjs2LjIuJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iYXItU0EiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMiPiYjeDIwMGY715DXp9ec15nXnSYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAwOCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAwOSI+JiN4MjAwZjs2LjMuJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iYXItU0EiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMiPiYjeDIwMGY716DXlNeo15XXqiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAwOCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAwOSI+JiN4MjAwZjs2LjQuJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iYXItU0EiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMiPiYjeDIwMGY716TXkNeV16DXlCDXldek15zXldeo15QmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMDgiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC0wMDAwMDkiPiYjeDIwMGY7Ni41LiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImFyLVNBIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj4mI3gyMDBmO9eT15nXoNeV15bXkNeV16jXmdedJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtMDAwMDA3Ij4mI3gyMDBmOzcuJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iYXItU0EiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMiPiYjeDIwMGY715PXnteV15LXqNek15nXlCYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMDgiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC0wMDAwMDkiPiYjeDIwMGY7Ny4xLiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImFyLVNBIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj4mI3gyMDBmO9eT16rXldeqJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAxMCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAxMSI+JiN4MjAwZjs3LjEuMS4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJhci1TQSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjvXmdeU15PXldeqINeQ16jXpteV16og15TXkdeo15nXqiDXnNek15kg157Xk9eZ16DXldeqJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtMDAwMDA3Ij4mI3gyMDBmOzguJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iYXItU0EiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMiPiYjeDIwMGY716LXqNeZ150mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMDYiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC0wMDAwMDciPiYjeDIwMGY7OS4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJhci1TQSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjvXl9eZ16DXldeaJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtMDAwMDA3Ij4mI3gyMDBmOzEwLiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImFyLVNBIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj4mI3gyMDBmO9em15HXkCDXldeR15nXmNeX15XXnyYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAwNyI+JiN4MjAwZjsxMS4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJhci1TQSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjvXqteo15HXldeqJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAwOCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAwOSI+JiN4MjAwZjsxMS4xLiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImFyLVNBIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj4mI3gyMDBmO9eh16TXqNeV16osINek15nXnNeV16HXldek15nXlCDXldeQ157XoNeV16omI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMDgiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC0wMDAwMDkiPiYjeDIwMGY7MTEuMi4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJhci1TQSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjvXp9eV15zXmdeg16jXmdeUJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDA4Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtMDAwMDA5Ij4mI3gyMDBmOzExLjMuJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iYXItU0EiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMiPiYjeDIwMGY716HXpNeV16jXmCYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAwNyI+JiN4MjAwZjsxMi4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJhci1TQSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjvXqNeQ15Ug15LXnSYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAwNyI+JiN4MjAwZjsxMy4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJhci1TQSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMyI+JiN4MjAwZjvXp9eZ16nXldeo15nXnSDXl9eZ16bXldeg15nXmdedJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDEyIj4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtMDAwMDA3Ij4mI3gyMDBmOzE0LiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImFyLVNBIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj4mI3gyMDBmO9eU16LXqNeV16og16nXldec15nXmdedJiN4MjAwZjs8L3NwYW4+PC9wPjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9UZXN0LTA4Lmh0bWwgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAxL1Rlc3QtMDguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWM1Zjg2Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMS9UZXN0LTA4Lmh0bWwKQEAgLTAsMCArMSwyIEBACivvu788IURPQ1RZUEUgaHRtbCA+PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPjx0aXRsZT48L3RpdGxlPjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29udGVudD0iUG93ZXJUb29scyBmb3IgT3BlbiBYTUwiIC8+PHN0eWxlPnNwYW4geyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IH0KK2JvZHkgeyBtYXJnaW46IDFjbSBhdXRvOyBtYXgtd2lkdGg6IDIwY207IHBhZGRpbmc6IDA7IH08L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2IC8+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAyL0h0bWxUb1dtbENvbnZlcnRlcjAyLmNzIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMi9IdG1sVG9XbWxDb252ZXJ0ZXIwMi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQzNmMyCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMi9IdG1sVG9XbWxDb252ZXJ0ZXIwMi5jcwpAQCAtMCwwICsxLDM1OSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRHJhd2luZy5JbWFnaW5nOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzLkh0bWxUb1dtbDsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbiA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgIHZhciB0ZW1wRGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhzdHJpbmcuRm9ybWF0KCJFeGFtcGxlT3V0cHV0LXswOjAwfS17MTowMH0tezI6MDB9LXszOjAwfXs0OjAwfXs1OjAwfSIsIG4uWWVhciAtIDIwMDAsIG4uTW9udGgsIG4uRGF5LCBuLkhvdXIsIG4uTWludXRlLCBuLlNlY29uZCkpOworICAgICAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgICAgICBGaWxlSW5mbyB0ZW1wbGF0ZURvYyA9IG5ldyBGaWxlSW5mbygiLi4vLi4vVGVtcGxhdGVEb2N1bWVudC5kb2N4Iik7CisgICAgICAgICAgICBGaWxlSW5mbyBkYXRhRmlsZSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiRGF0YS54bWwiKSk7CisKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kIGdlbmVyYXRlcyBhIGxhcmdlIGRhdGEgZmlsZSB3aXRoIHJhbmRvbSBkYXRhLgorICAgICAgICAgICAgLy8gSW4gYSByZWFsIHdvcmxkIHNjZW5hcmlvLCB0aGlzIGlzIHdoZXJlIHlvdSB3b3VsZCBxdWVyeSB5b3VyIGRhdGEgc291cmNlIGFuZCBwcm9kdWNlIFhNTCB0aGF0IHdpbGwgZHJpdmUgeW91ciBkb2N1bWVudCBnZW5lcmF0aW9uIHByb2Nlc3MuCisgICAgICAgICAgICBpbnQgbnVtYmVyT2ZEb2N1bWVudHNUb0dlbmVyYXRlID0gMTAwOworICAgICAgICAgICAgWEVsZW1lbnQgZGF0YSA9IEdlbmVyYXRlRGF0YUZyb21EYXRhU291cmNlKGRhdGFGaWxlLCBudW1iZXJPZkRvY3VtZW50c1RvR2VuZXJhdGUpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCB3bWxEb2MgPSBuZXcgV21sRG9jdW1lbnQodGVtcGxhdGVEb2MuRnVsbE5hbWUpOworICAgICAgICAgICAgaW50IGNvdW50ID0gMTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjdXN0b21lciBpbiBkYXRhLkVsZW1lbnRzKCJDdXN0b21lciIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGVJbmZvIGFzc2VtYmxlZERvYyA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCBzdHJpbmcuRm9ybWF0KCJMZXR0ZXItezA6MDAwMH0uZG9jeCIsIGNvdW50KyspKSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkdlbmVyYXRpbmcgezB9IiwgYXNzZW1ibGVkRG9jLk5hbWUpOworICAgICAgICAgICAgICAgIGJvb2wgdGVtcGxhdGVFcnJvcjsKKyAgICAgICAgICAgICAgICBXbWxEb2N1bWVudCB3bWxBc3NlbWJsZWREb2MgPSBEb2N1bWVudEFzc2VtYmxlci5Bc3NlbWJsZURvY3VtZW50KHdtbERvYywgY3VzdG9tZXIsIG91dCB0ZW1wbGF0ZUVycm9yKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVFcnJvcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvcnMgaW4gdGVtcGxhdGUuIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTZWUgezB9IHRvIGRldGVybWluZSB0aGUgZXJyb3JzIGluIHRoZSB0ZW1wbGF0ZS4iLCBhc3NlbWJsZWREb2MuTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdtbEFzc2VtYmxlZERvYy5TYXZlQXMoYXNzZW1ibGVkRG9jLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb252ZXJ0aW5nIHRvIEhUTUwgezB9IiwgYXNzZW1ibGVkRG9jLk5hbWUpOworICAgICAgICAgICAgICAgIHZhciBodG1sRmlsZU5hbWUgPSBDb252ZXJ0VG9IdG1sKGFzc2VtYmxlZERvYy5GdWxsTmFtZSwgdGVtcERpLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb252ZXJ0aW5nIGJhY2sgdG8gRE9DWCB7MH0iLCBodG1sRmlsZU5hbWUuTmFtZSk7CisgICAgICAgICAgICAgICAgQ29udmVydFRvRG9jeChodG1sRmlsZU5hbWUuRnVsbE5hbWUsIHRlbXBEaS5GdWxsTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmdbXSBzX3Byb2R1Y3ROYW1lcyA9IG5ld1tdIHsKKyAgICAgICAgICAgICJVbmljeWNsZSIsCisgICAgICAgICAgICAiQmljeWNsZSIsCisgICAgICAgICAgICAiVHJpY3ljbGUiLAorICAgICAgICAgICAgIlNrYXRlYm9hcmQiLAorICAgICAgICAgICAgIlJvbGxlciBCbGFkZXMiLAorICAgICAgICAgICAgIkhhbmcgR2xpZGVyIiwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYRWxlbWVudCBHZW5lcmF0ZURhdGFGcm9tRGF0YVNvdXJjZShGaWxlSW5mbyBkYXRhRmksIGludCBudW1iZXJPZkRvY3VtZW50c1RvR2VuZXJhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjdXN0b21lcnMgPSBuZXcgWEVsZW1lbnQoIkN1c3RvbWVycyIpOworICAgICAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mRG9jdW1lbnRzVG9HZW5lcmF0ZTsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjdXN0b21lciA9IG5ldyBYRWxlbWVudCgiQ3VzdG9tZXIiLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoIkN1c3RvbWVySUQiLCBpICsgMSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudCgiTmFtZSIsICJFcmljIFdoaXRlIiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudCgiSGlnaFZhbHVlQ3VzdG9tZXIiLCByLk5leHQoMikgPT0gMCA/ICJUcnVlIiA6ICJGYWxzZSIpLAorICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoIk9yZGVycyIpKTsKKyAgICAgICAgICAgICAgICB2YXIgb3JkZXJzID0gY3VzdG9tZXIuRWxlbWVudCgiT3JkZXJzIik7CisgICAgICAgICAgICAgICAgaW50IG51bWJlck9mT3JkZXJzID0gci5OZXh0KDEwKSArIDE7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1iZXJPZk9yZGVyczsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG9yZGVyID0gbmV3IFhFbGVtZW50KCJPcmRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZSgiTnVtYmVyIiwgaiArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KCJQcm9kdWN0RGVzY3JpcHRpb24iLCBzX3Byb2R1Y3ROYW1lc1tyLk5leHQoc19wcm9kdWN0TmFtZXMuTGVuZ3RoKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KCJRdWFudGl0eSIsIHIuTmV4dCgxMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KCJPcmRlckRhdGUiLCAiU2VwdGVtYmVyIDI2LCAyMDE1IikpOworICAgICAgICAgICAgICAgICAgICBvcmRlcnMuQWRkKG9yZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VzdG9tZXJzLkFkZChjdXN0b21lcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXN0b21lcnMuU2F2ZShkYXRhRmkuRnVsbE5hbWUpOworICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWVyczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRmlsZUluZm8gQ29udmVydFRvSHRtbChzdHJpbmcgZmlsZSwgc3RyaW5nIG91dHB1dERpcmVjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZpID0gbmV3IEZpbGVJbmZvKGZpbGUpOworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVBcnJheSA9IEZpbGUuUmVhZEFsbEJ5dGVzKGZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbWVtb3J5U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbW9yeVN0cmVhbS5Xcml0ZShieXRlQXJyYXksIDAsIGJ5dGVBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obWVtb3J5U3RyZWFtLCB0cnVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBkZXN0RmlsZU5hbWUgPSBuZXcgRmlsZUluZm8oZmkuTmFtZS5SZXBsYWNlKCIuZG9jeCIsICIuaHRtbCIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERpcmVjdG9yeSAhPSBudWxsICYmIG91dHB1dERpcmVjdG9yeSAhPSBzdHJpbmcuRW1wdHkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeUluZm8gZGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhvdXRwdXREaXJlY3RvcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkaS5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5YbWxQb3dlclRvb2xzRXhjZXB0aW9uKCJPdXRwdXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0RmlsZU5hbWUgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKGRpLkZ1bGxOYW1lLCBkZXN0RmlsZU5hbWUuTmFtZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZhciBpbWFnZURpcmVjdG9yeU5hbWUgPSBkZXN0RmlsZU5hbWUuRnVsbE5hbWUuU3Vic3RyaW5nKDAsIGRlc3RGaWxlTmFtZS5GdWxsTmFtZS5MZW5ndGggLSA1KSArICJfZmlsZXMiOworICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VDb3VudGVyID0gMDsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcGFnZVRpdGxlID0gZmkuRnVsbE5hbWU7CisgICAgICAgICAgICAgICAgICAgIHZhciBwYXJ0ID0gd0RvYy5Db3JlRmlsZVByb3BlcnRpZXNQYXJ0OworICAgICAgICAgICAgICAgICAgICBpZiAocGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGUgPSAoc3RyaW5nKXBhcnQuR2V0WERvY3VtZW50KCkuRGVzY2VuZGFudHMoREMudGl0bGUpLkZpcnN0T3JEZWZhdWx0KCkgPz8gZmkuRnVsbE5hbWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBEZXRlcm1pbmUgbWF4LXdpZHRoIGZyb20gc2l6ZSBvZiBjb250ZW50IGFyZWEuCisgICAgICAgICAgICAgICAgICAgIFdtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzID0gbmV3IFdtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzKCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbENzcyA9ICJib2R5IHsgbWFyZ2luOiAxY20gYXV0bzsgbWF4LXdpZHRoOiAyMGNtOyBwYWRkaW5nOiAwOyB9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VUaXRsZSA9IHBhZ2VUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhYnJpY2F0ZUNzc0NsYXNzZXMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3NQcmVmaXggPSAicHQtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RyaWN0VG9TdXBwb3J0ZWRMYW5ndWFnZXMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RyaWN0VG9TdXBwb3J0ZWROdW1iZXJpbmdGb3JtYXRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUhhbmRsZXIgPSBpbWFnZUluZm8gPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnlJbmZvIGxvY2FsRGlySW5mbyA9IG5ldyBEaXJlY3RvcnlJbmZvKGltYWdlRGlyZWN0b3J5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2NhbERpckluZm8uRXhpc3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERpckluZm8uQ3JlYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpbWFnZUNvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGV4dGVuc2lvbiA9IGltYWdlSW5mby5Db250ZW50VHlwZS5TcGxpdCgnLycpWzFdLlRvTG93ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUZvcm1hdCBpbWFnZUZvcm1hdCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSAicG5nIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGb3JtYXQgPSBJbWFnZUZvcm1hdC5Qbmc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJnaWYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkdpZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gImJtcCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuQm1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dGVuc2lvbiA9PSAianBlZyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuSnBlZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gInRpZmYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCB0aWZmIHRvIGdpZi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gImdpZiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuR2lmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gIngtd21mIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9ICJ3bWYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LldtZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaW1hZ2UgZm9ybWF0IGlzbid0IG9uZSB0aGF0IHdlIGV4cGVjdCwgaWdub3JlIGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkb24ndCByZXR1cm4gbWFya3VwIGZvciB0aGUgbGluay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2VGb3JtYXQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW1hZ2VGaWxlTmFtZSA9IGltYWdlRGlyZWN0b3J5TmFtZSArICIvaW1hZ2UiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb3VudGVyLlRvU3RyaW5nKCkgKyAiLiIgKyBleHRlbnNpb247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uQml0bWFwLlNhdmUoaW1hZ2VGaWxlTmFtZSwgaW1hZ2VGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkV4dGVybmFsRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbWFnZVNvdXJjZSA9IGxvY2FsRGlySW5mby5OYW1lICsgIi9pbWFnZSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUNvdW50ZXIuVG9TdHJpbmcoKSArICIuIiArIGV4dGVuc2lvbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGltZyA9IG5ldyBYRWxlbWVudChYaHRtbC5pbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLnNyYywgaW1hZ2VTb3VyY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uSW1nU3R5bGVBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5BbHRUZXh0ICE9IG51bGwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2UuYWx0LCBpbWFnZUluZm8uQWx0VGV4dCkgOiBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1nOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBYRWxlbWVudCBodG1sRWxlbWVudCA9IFdtbFRvSHRtbENvbnZlcnRlci5Db252ZXJ0VG9IdG1sKHdEb2MsIHNldHRpbmdzKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBQcm9kdWNlIEhUTUwgZG9jdW1lbnQgd2l0aCA8IURPQ1RZUEUgaHRtbCA+IGRlY2xhcmF0aW9uIHRvIHRlbGwgdGhlIGJyb3dzZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIHVzaW5nIEhUTUw1LgorICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IG5ldyBYRG9jdW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWERvY3VtZW50VHlwZSgiaHRtbCIsIG51bGwsIG51bGwsIG51bGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgaHRtbEVsZW1lbnQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHRoZSB4aHRtbCByZXR1cm5lZCBieSBDb252ZXJ0VG9IdG1sVHJhbnNmb3JtIGNvbnRhaW5zIG9iamVjdHMgb2YgdHlwZQorICAgICAgICAgICAgICAgICAgICAvLyBYRW50aXR5LiAgUHRPcGVuWG1sVXRpbC5jcyBkZWZpbmUgdGhlIFhFbnRpdHkgY2xhc3MuICBTZWUKKyAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL2Jsb2dzLm1zZG4uY29tL2VyaWN3aGl0ZS9hcmNoaXZlLzIwMTAvMDEvMjEvd3JpdGluZy1lbnRpdHktcmVmZXJlbmNlcy11c2luZy1saW5xLXRvLXhtbC5hc3B4CisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBkZXRhaWxlZCBleHBsYW5hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgeW91IGZ1cnRoZXIgdHJhbnNmb3JtIHRoZSBYTUwgdHJlZSByZXR1cm5lZCBieSBDb252ZXJ0VG9IdG1sVHJhbnNmb3JtLCB5b3UKKyAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBkbyBpdCBjb3JyZWN0bHksIG9yIGVudGl0aWVzIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgcHJvcGVybHkuCisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWxTdHJpbmcgPSBodG1sLlRvU3RyaW5nKFNhdmVPcHRpb25zLkRpc2FibGVGb3JtYXR0aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoZGVzdEZpbGVOYW1lLkZ1bGxOYW1lLCBodG1sU3RyaW5nLCBFbmNvZGluZy5VVEY4KTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzdEZpbGVOYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb252ZXJ0VG9Eb2N4KHN0cmluZyBmaWxlLCBzdHJpbmcgZGVzdGluYXRpb25EaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzb3VyY2VIdG1sRmkgPSBuZXcgRmlsZUluZm8oZmlsZSk7CisgICAgICAgICAgICB2YXIgc291cmNlSW1hZ2VEaSA9IG5ldyBEaXJlY3RvcnlJbmZvKGRlc3RpbmF0aW9uRGlyKTsKKworICAgICAgICAgICAgdmFyIGRlc3REb2N4RmkgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKGRlc3RpbmF0aW9uRGlyLCBzb3VyY2VIdG1sRmkuTmFtZS5SZXBsYWNlKCIuaHRtbCIsICItQ29udmVydGVkQnlIdG1sVG9XbWwuZG9jeCIpKSk7CisKKyAgICAgICAgICAgIFhFbGVtZW50IGh0bWwgPSBIdG1sVG9XbWxSZWFkQXNYRWxlbWVudC5SZWFkQXNYRWxlbWVudChzb3VyY2VIdG1sRmkpOworCisgICAgICAgICAgICBzdHJpbmcgdXNlZEF1dGhvckNzcyA9IEh0bWxUb1dtbENvbnZlcnRlci5DbGVhblVwQ3NzKChzdHJpbmcpaHRtbC5EZXNjZW5kYW50cygpLkZpcnN0T3JEZWZhdWx0KGQgPT4gZC5OYW1lLkxvY2FsTmFtZS5Ub0xvd2VyKCkgPT0gInN0eWxlIikpOworCisgICAgICAgICAgICBIdG1sVG9XbWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncyA9IEh0bWxUb1dtbENvbnZlcnRlci5HZXREZWZhdWx0U2V0dGluZ3MoKTsKKyAgICAgICAgICAgIC8vIGltYWdlIHJlZmVyZW5jZXMgaW4gSFRNTCBmaWxlcyBjb250YWluIHRoZSBwYXRoIHRvIHRoZSBzdWJkaXIgdGhhdCBjb250YWlucyB0aGUgaW1hZ2VzLCBzbyBiYXNlIFVSSSBpcyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisgICAgICAgICAgICAvLyB0aGF0IGNvbnRhaW5zIHRoZSBIVE1MIGZpbGVzCisgICAgICAgICAgICBzZXR0aW5ncy5CYXNlVXJpRm9ySW1hZ2VzID0gc291cmNlSHRtbEZpLkRpcmVjdG9yeU5hbWU7CisKKyAgICAgICAgICAgIFdtbERvY3VtZW50IGRvYyA9IEh0bWxUb1dtbENvbnZlcnRlci5Db252ZXJ0SHRtbFRvV21sKGRlZmF1bHRDc3MsIHVzZWRBdXRob3JDc3MsIHVzZXJDc3MsIGh0bWwsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIGRvYy5TYXZlQXMoZGVzdERvY3hGaS5GdWxsTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgSHRtbFRvV21sUmVhZEFzWEVsZW1lbnQKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYRWxlbWVudCBSZWFkQXNYRWxlbWVudChGaWxlSW5mbyBzb3VyY2VIdG1sRmkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGh0bWxTdHJpbmcgPSBGaWxlLlJlYWRBbGxUZXh0KHNvdXJjZUh0bWxGaS5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgaHRtbCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBodG1sID0gWEVsZW1lbnQuUGFyc2UoaHRtbFN0cmluZyk7CisgICAgICAgICAgICAgICAgfQorI2lmIFVTRV9IVE1MQUdJTElUWVBBQ0sKKyAgICAgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSHRtbERvY3VtZW50IGhkb2MgPSBuZXcgSHRtbERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgaGRvYy5Mb2FkKHNvdXJjZUh0bWxGaS5GdWxsTmFtZSwgRW5jb2RpbmcuRGVmYXVsdCk7CisgICAgICAgICAgICAgICAgaGRvYy5PcHRpb25PdXRwdXRBc1htbCA9IHRydWU7CisgICAgICAgICAgICAgICAgaGRvYy5TYXZlKHNvdXJjZUh0bWxGaS5GdWxsTmFtZSwgRW5jb2RpbmcuRGVmYXVsdCk7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKEZpbGUuUmVhZEFsbFRleHQoc291cmNlSHRtbEZpLkZ1bGxOYW1lLCBFbmNvZGluZy5EZWZhdWx0KSk7CisgICAgICAgICAgICAgICAgc2IuUmVwbGFjZSgiJmFtcDsiLCAiJiIpOworICAgICAgICAgICAgICAgIHNiLlJlcGxhY2UoIiZuYnNwOyIsICJceEEwIik7CisgICAgICAgICAgICAgICAgc2IuUmVwbGFjZSgiJnF1b3Q7IiwgIlwiIik7CisgICAgICAgICAgICAgICAgc2IuUmVwbGFjZSgiJmx0OyIsICJ+bHQ7Iik7CisgICAgICAgICAgICAgICAgc2IuUmVwbGFjZSgiJmd0OyIsICJ+Z3Q7Iik7CisgICAgICAgICAgICAgICAgc2IuUmVwbGFjZSgiJiMiLCAifiMiKTsKKyAgICAgICAgICAgICAgICBzYi5SZXBsYWNlKCImIiwgIiZhbXA7Iik7CisgICAgICAgICAgICAgICAgc2IuUmVwbGFjZSgifmx0OyIsICImbHQ7Iik7CisgICAgICAgICAgICAgICAgc2IuUmVwbGFjZSgifmd0OyIsICImZ3Q7Iik7CisgICAgICAgICAgICAgICAgc2IuUmVwbGFjZSgifiMiLCAiJiMiKTsKKyAgICAgICAgICAgICAgICBGaWxlLldyaXRlQWxsVGV4dChzb3VyY2VIdG1sRmkuRnVsbE5hbWUsIHNiLlRvU3RyaW5nKCksIEVuY29kaW5nLkRlZmF1bHQpOworICAgICAgICAgICAgICAgIGh0bWwgPSBYRWxlbWVudC5QYXJzZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAvLyBIdG1sVG9XbWxDb252ZXJ0ZXIgZXhwZWN0cyB0aGUgSFRNTCBlbGVtZW50cyB0byBiZSBpbiBubyBuYW1lc3BhY2UsIHNvIGNvbnZlcnQgYWxsIGVsZW1lbnRzIHRvIG5vIG5hbWVzcGFjZS4KKyAgICAgICAgICAgICAgICBodG1sID0gKFhFbGVtZW50KUNvbnZlcnRUb05vTmFtZXNwYWNlKGh0bWwpOworICAgICAgICAgICAgICAgIHJldHVybiBodG1sOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQ29udmVydFRvTm9OYW1lc3BhY2UoWE5vZGUgbm9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUuTG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCkuV2hlcmUoYSA9PiAhYS5Jc05hbWVzcGFjZURlY2xhcmF0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBDb252ZXJ0VG9Ob05hbWVzcGFjZShuKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBzdHJpbmcgZGVmYXVsdENzcyA9CisgICAgICAgICAgICBAImh0bWwsIGFkZHJlc3MsCitibG9ja3F1b3RlLAorYm9keSwgZGQsIGRpdiwKK2RsLCBkdCwgZmllbGRzZXQsIGZvcm0sCitmcmFtZSwgZnJhbWVzZXQsCitoMSwgaDIsIGgzLCBoNCwKK2g1LCBoNiwgbm9mcmFtZXMsCitvbCwgcCwgdWwsIGNlbnRlciwKK2RpciwgaHIsIG1lbnUsIHByZSB7IGRpc3BsYXk6IGJsb2NrOyB1bmljb2RlLWJpZGk6IGVtYmVkIH0KK2xpIHsgZGlzcGxheTogbGlzdC1pdGVtIH0KK2hlYWQgeyBkaXNwbGF5OiBub25lIH0KK3RhYmxlIHsgZGlzcGxheTogdGFibGUgfQordHIgeyBkaXNwbGF5OiB0YWJsZS1yb3cgfQordGhlYWQgeyBkaXNwbGF5OiB0YWJsZS1oZWFkZXItZ3JvdXAgfQordGJvZHkgeyBkaXNwbGF5OiB0YWJsZS1yb3ctZ3JvdXAgfQordGZvb3QgeyBkaXNwbGF5OiB0YWJsZS1mb290ZXItZ3JvdXAgfQorY29sIHsgZGlzcGxheTogdGFibGUtY29sdW1uIH0KK2NvbGdyb3VwIHsgZGlzcGxheTogdGFibGUtY29sdW1uLWdyb3VwIH0KK3RkLCB0aCB7IGRpc3BsYXk6IHRhYmxlLWNlbGwgfQorY2FwdGlvbiB7IGRpc3BsYXk6IHRhYmxlLWNhcHRpb24gfQordGggeyBmb250LXdlaWdodDogYm9sZGVyOyB0ZXh0LWFsaWduOiBjZW50ZXIgfQorY2FwdGlvbiB7IHRleHQtYWxpZ246IGNlbnRlciB9Citib2R5IHsgbWFyZ2luOiBhdXRvOyB9CitoMSB7IGZvbnQtc2l6ZTogMmVtOyBtYXJnaW46IGF1dG87IH0KK2gyIHsgZm9udC1zaXplOiAxLjVlbTsgbWFyZ2luOiBhdXRvOyB9CitoMyB7IGZvbnQtc2l6ZTogMS4xN2VtOyBtYXJnaW46IGF1dG87IH0KK2g0LCBwLAorYmxvY2txdW90ZSwgdWwsCitmaWVsZHNldCwgZm9ybSwKK29sLCBkbCwgZGlyLAorbWVudSB7IG1hcmdpbjogYXV0byB9CithIHsgY29sb3I6IGJsdWU7IH0KK2g1IHsgZm9udC1zaXplOiAuODNlbTsgbWFyZ2luOiBhdXRvIH0KK2g2IHsgZm9udC1zaXplOiAuNzVlbTsgbWFyZ2luOiBhdXRvIH0KK2gxLCBoMiwgaDMsIGg0LAoraDUsIGg2LCBiLAorc3Ryb25nIHsgZm9udC13ZWlnaHQ6IGJvbGRlciB9CitibG9ja3F1b3RlIHsgbWFyZ2luLWxlZnQ6IDQwcHg7IG1hcmdpbi1yaWdodDogNDBweCB9CitpLCBjaXRlLCBlbSwKK3ZhciwgYWRkcmVzcyB7IGZvbnQtc3R5bGU6IGl0YWxpYyB9CitwcmUsIHR0LCBjb2RlLAora2JkLCBzYW1wIHsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSB9CitwcmUgeyB3aGl0ZS1zcGFjZTogcHJlIH0KK2J1dHRvbiwgdGV4dGFyZWEsCitpbnB1dCwgc2VsZWN0IHsgZGlzcGxheTogaW5saW5lLWJsb2NrIH0KK2JpZyB7IGZvbnQtc2l6ZTogMS4xN2VtIH0KK3NtYWxsLCBzdWIsIHN1cCB7IGZvbnQtc2l6ZTogLjgzZW0gfQorc3ViIHsgdmVydGljYWwtYWxpZ246IHN1YiB9CitzdXAgeyB2ZXJ0aWNhbC1hbGlnbjogc3VwZXIgfQordGFibGUgeyBib3JkZXItc3BhY2luZzogMnB4OyB9Cit0aGVhZCwgdGJvZHksCit0Zm9vdCB7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGUgfQordGQsIHRoLCB0ciB7IHZlcnRpY2FsLWFsaWduOiBpbmhlcml0IH0KK3MsIHN0cmlrZSwgZGVsIHsgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2ggfQoraHIgeyBib3JkZXI6IDFweCBpbnNldCB9CitvbCwgdWwsIGRpciwKK21lbnUsIGRkIHsgbWFyZ2luLWxlZnQ6IDQwcHggfQorb2wgeyBsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWwgfQorb2wgdWwsIHVsIG9sLAordWwgdWwsIG9sIG9sIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMCB9Cit1LCBpbnMgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSB9CiticjpiZWZvcmUgeyBjb250ZW50OiAiIlxBIiI7IHdoaXRlLXNwYWNlOiBwcmUtbGluZSB9CitjZW50ZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXIgfQorOmxpbmssIDp2aXNpdGVkIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgfQorOmZvY3VzIHsgb3V0bGluZTogdGhpbiBkb3R0ZWQgaW52ZXJ0IH0KKy8qIEJlZ2luIGJpZGlyZWN0aW9uYWxpdHkgc2V0dGluZ3MgKGRvIG5vdCBjaGFuZ2UpICovCitCRE9bRElSPSIibHRyIiJdIHsgZGlyZWN0aW9uOiBsdHI7IHVuaWNvZGUtYmlkaTogYmlkaS1vdmVycmlkZSB9CitCRE9bRElSPSIicnRsIiJdIHsgZGlyZWN0aW9uOiBydGw7IHVuaWNvZGUtYmlkaTogYmlkaS1vdmVycmlkZSB9CisqW0RJUj0iImx0ciIiXSB7IGRpcmVjdGlvbjogbHRyOyB1bmljb2RlLWJpZGk6IGVtYmVkIH0KKypbRElSPSIicnRsIiJdIHsgZGlyZWN0aW9uOiBydGw7IHVuaWNvZGUtYmlkaTogZW1iZWQgfQorCisiOworCisgICAgICAgIHN0YXRpYyBzdHJpbmcgdXNlckNzcyA9IEAiIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAyL0h0bWxUb1dtbENvbnZlcnRlcjAyLmNzcHJvaiBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDIvSHRtbFRvV21sQ29udmVydGVyMDIuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzk0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0h0bWxUb1dtbENvbnZlcnRlcjAyL0h0bWxUb1dtbENvbnZlcnRlcjAyLmNzcHJvagpAQCAtMCwwICsxLDE1IEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0NDU8L1RhcmdldEZyYW1ld29yaz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cT3BlblhtbFBvd2VyVG9vbHNcT3BlblhtbFBvd2VyVG9vbHMuY3Nwcm9qIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkRvY3VtZW50Rm9ybWF0Lk9wZW5YbWwiIFZlcnNpb249IjIuOC4xIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iV2luZG93c0Jhc2UiIC8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDIvVGVtcGxhdGVEb2N1bWVudC5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9IdG1sVG9XbWxDb252ZXJ0ZXIwMi9UZW1wbGF0ZURvY3VtZW50LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3MGY2YgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvSHRtbFRvV21sQ29udmVydGVyMDIvVGVtcGxhdGVEb2N1bWVudC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTGlzdEl0ZW1SZXRyaWV2ZXIwMS9MaXN0SXRlbVJldHJpZXZlcjAxLmNzIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9MaXN0SXRlbVJldHJpZXZlcjAxL0xpc3RJdGVtUmV0cmlldmVyMDEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI3NzY3NAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTGlzdEl0ZW1SZXRyaWV2ZXIwMS9MaXN0SXRlbVJldHJpZXZlcjAxLmNzCkBAIC0wLDAgKzEsMTUxIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTQuCisKK1RoaXMgY29kZSBpcyBsaWNlbnNlZCB1c2luZyB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIChNcy1QTCkuICBUaGUgdGV4dCBvZiB0aGUgbGljZW5zZQorY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9yZXNvdXJjZXMvc2hhcmVkc291cmNlL2xpY2Vuc2luZ2Jhc2ljcy9wdWJsaWNsaWNlbnNlLm1zcHgKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOworCitjbGFzcyBMaXN0SXRlbVJldHJpZXZlcjAxCit7CisgICAgcHJpdmF0ZSBjbGFzcyBYbWxTdGFja0l0ZW0KKyAgICB7CisgICAgICAgIHB1YmxpYyBYRWxlbWVudCBFbGVtZW50OworICAgICAgICBwdWJsaWMgaW50W10gTGV2ZWxOdW1iZXJzOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICB7CisgICAgICAgIHZhciBuID0gRGF0ZVRpbWUuTm93OworICAgICAgICB2YXIgdGVtcERpID0gbmV3IERpcmVjdG9yeUluZm8oc3RyaW5nLkZvcm1hdCgiRXhhbXBsZU91dHB1dC17MDowMH0tezE6MDB9LXsyOjAwfS17MzowMH17NDowMH17NTowMH0iLCBuLlllYXIgLSAyMDAwLCBuLk1vbnRoLCBuLkRheSwgbi5Ib3VyLCBuLk1pbnV0ZSwgbi5TZWNvbmQpKTsKKyAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPQorICAgICAgICAgICAgV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKCIuLi8uLi9OdW1iZXJlZExpc3RUZXN0LmRvY3giLCBmYWxzZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhYnN0cmFjdE51bUlkID0gMDsKKyAgICAgICAgICAgIFhFbGVtZW50IHhtbCA9IENvbnZlcnREb2NUb1htbCh3RG9jLCBhYnN0cmFjdE51bUlkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHhtbCk7CisgICAgICAgICAgICB4bWwuU2F2ZShQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiT3V0LnhtbCIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFhFbGVtZW50IENvbnZlcnREb2NUb1htbChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MsIGludCBhYnN0cmFjdE51bUlkKQorICAgIHsKKyAgICAgICAgWERvY3VtZW50IHhkID0gd0RvYy5NYWluRG9jdW1lbnRQYXJ0LkdldFhEb2N1bWVudCgpOworCisgICAgICAgIC8vIEZpcnN0LCBjYWxsIFJldHJpZXZlTGlzdEl0ZW0gc28gdGhhdCBhbGwgcGFyYWdyYXBocyBhcmUgaW5pdGlhbGl6ZWQgd2l0aCBMaXN0SXRlbUluZm8KKyAgICAgICAgdmFyIGZpcnN0UGFyYWdyYXBoID0geGQuRGVzY2VuZGFudHMoVy5wKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICB2YXIgbGlzdEl0ZW0gPSBMaXN0SXRlbVJldHJpZXZlci5SZXRyaWV2ZUxpc3RJdGVtKHdEb2MsIGZpcnN0UGFyYWdyYXBoKTsKKworICAgICAgICBYRWxlbWVudCB4bWwgPSBuZXcgWEVsZW1lbnQoIlJvb3QiKTsKKyAgICAgICAgdmFyIGN1cnJlbnQgPSBuZXcgU3RhY2s8WG1sU3RhY2tJdGVtPigpOworICAgICAgICBjdXJyZW50LlB1c2goCisgICAgICAgICAgICBuZXcgWG1sU3RhY2tJdGVtKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50ID0geG1sLAorICAgICAgICAgICAgICAgIExldmVsTnVtYmVycyA9IG5ldyBpbnRbXSB7IH0sCisgICAgICAgICAgICB9KTsKKyAgICAgICAgZm9yZWFjaCAodmFyIHBhcmFncmFwaCBpbiB4ZC5EZXNjZW5kYW50cyhXLnApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50IGRvY3VtZW50cyB0aGF0IGhhdmUgdHJhY2tlZCByZXZpc2lvbnMuCisgICAgICAgICAgICAvLyBBcyBuZWNlc3NhcnksIGNhbGwgUmV2aXNpb25BY2NlcHRlci5BY2NlcHRSZXZpc2lvbnMgYmVmb3JlIGNvbnZlcnRpbmcgdG8gWE1MLgorICAgICAgICAgICAgdmFyIHRleHQgPSBwYXJhZ3JhcGguRGVzY2VuZGFudHMoVy50KS5TZWxlY3QodCA9PiAoc3RyaW5nKXQpLlN0cmluZ0NvbmNhdGVuYXRlKCk7CisgICAgICAgICAgICBMaXN0SXRlbVJldHJpZXZlci5MaXN0SXRlbUluZm8gbGlpID0gCisgICAgICAgICAgICAgICAgcGFyYWdyYXBoLkFubm90YXRpb248TGlzdEl0ZW1SZXRyaWV2ZXIuTGlzdEl0ZW1JbmZvPigpOworICAgICAgICAgICAgaWYgKGxpaS5Jc0xpc3RJdGVtICYmIGxpaS5BYnN0cmFjdE51bUlkID09IGFic3RyYWN0TnVtSWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTGlzdEl0ZW1SZXRyaWV2ZXIuTGV2ZWxOdW1iZXJzIGxldmVsTnVtcyA9IAorICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGguQW5ub3RhdGlvbjxMaXN0SXRlbVJldHJpZXZlci5MZXZlbE51bWJlcnM+KCk7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsTnVtcy5MZXZlbE51bWJlcnNBcnJheS5MZW5ndGggPT0gY3VycmVudC5QZWVrKCkuTGV2ZWxOdW1iZXJzLkxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuUG9wKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBsZXZlbE51bXNGb3JUaGlzSW5kZW50ID0gbGV2ZWxOdW1zLkxldmVsTnVtYmVyc0FycmF5OworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbGV2ZWxUZXh0ID0gbGV2ZWxOdW1zCisgICAgICAgICAgICAgICAgICAgICAgICAuTGV2ZWxOdW1iZXJzQXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QobCA9PiBsLlRvU3RyaW5nKCkgKyAiLiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuU3RyaW5nQ29uY2F0ZW5hdGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgLlRyaW1FbmQoJy4nKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0N1cnJlbnRFbGVtZW50ID0gbmV3IFhFbGVtZW50KCJJbmRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoIkxldmVsIiwgbGV2ZWxUZXh0KSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuUGVlaygpLkVsZW1lbnQuQWRkKG5ld0N1cnJlbnRFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudC5QdXNoKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhtbFN0YWNrSXRlbSgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCA9IG5ld0N1cnJlbnRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsTnVtYmVycyA9IGxldmVsTnVtc0ZvclRoaXNJbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudC5QZWVrKCkuRWxlbWVudC5BZGQobmV3IFhFbGVtZW50KCJIZWFkaW5nIiwgdGV4dCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbE51bXMuTGV2ZWxOdW1iZXJzQXJyYXkuTGVuZ3RoID4gY3VycmVudC5QZWVrKCkuTGV2ZWxOdW1iZXJzLkxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBjdXJyZW50LlBlZWsoKS5MZXZlbE51bWJlcnMuTGVuZ3RoOyAKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPCBsZXZlbE51bXMuTGV2ZWxOdW1iZXJzQXJyYXkuTGVuZ3RoOyAKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxldmVsTnVtc0ZvclRoaXNJbmRlbnQgPSBsZXZlbE51bXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuTGV2ZWxOdW1iZXJzQXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVGFrZShpICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxldmVsVGV4dCA9IGxldmVsTnVtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5MZXZlbE51bWJlcnNBcnJheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZWxlY3QobCA9PiBsLlRvU3RyaW5nKCkgKyAiLiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlN0cmluZ0NvbmNhdGVuYXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVHJpbUVuZCgnLicpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0N1cnJlbnRFbGVtZW50ID0gbmV3IFhFbGVtZW50KCJJbmRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJMZXZlbCIsIGxldmVsVGV4dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5QZWVrKCkuRWxlbWVudC5BZGQobmV3Q3VycmVudEVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5QdXNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYbWxTdGFja0l0ZW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCA9IG5ld0N1cnJlbnRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZXZlbE51bWJlcnMgPSBsZXZlbE51bXNGb3JUaGlzSW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5QZWVrKCkuRWxlbWVudC5BZGQobmV3IFhFbGVtZW50KCJIZWFkaW5nIiwgdGV4dCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsTnVtcy5MZXZlbE51bWJlcnNBcnJheS5MZW5ndGggPCBjdXJyZW50LlBlZWsoKS5MZXZlbE51bWJlcnMuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGN1cnJlbnQuUGVlaygpLkxldmVsTnVtYmVycy5MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBpID4gbGV2ZWxOdW1zLkxldmVsTnVtYmVyc0FycmF5Lkxlbmd0aDsgCisgICAgICAgICAgICAgICAgICAgICAgICBpLS0pCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LlBvcCgpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50LlBvcCgpOworICAgICAgICAgICAgICAgICAgICB2YXIgbGV2ZWxOdW1zRm9yVGhpc0luZGVudCA9IGxldmVsTnVtcy5MZXZlbE51bWJlcnNBcnJheTsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxldmVsVGV4dCA9IGxldmVsTnVtcworICAgICAgICAgICAgICAgICAgICAgICAgLkxldmVsTnVtYmVyc0FycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KGwgPT4gbC5Ub1N0cmluZygpICsgIi4iKQorICAgICAgICAgICAgICAgICAgICAgICAgLlN0cmluZ0NvbmNhdGVuYXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5UcmltRW5kKCcuJyk7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDdXJyZW50RWxlbWVudCA9IG5ldyBYRWxlbWVudCgiSW5kZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKCJMZXZlbCIsIGxldmVsVGV4dCkpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50LlBlZWsoKS5FbGVtZW50LkFkZChuZXdDdXJyZW50RWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuUHVzaCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYbWxTdGFja0l0ZW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgPSBuZXdDdXJyZW50RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZXZlbE51bWJlcnMgPSBsZXZlbE51bXNGb3JUaGlzSW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuUGVlaygpLkVsZW1lbnQuQWRkKG5ldyBYRWxlbWVudCgiSGVhZGluZyIsIHRleHQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VycmVudC5QZWVrKCkuRWxlbWVudC5BZGQobmV3IFhFbGVtZW50KCJQYXJhZ3JhcGgiLCB0ZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHhtbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0xpc3RJdGVtUmV0cmlldmVyMDEvTGlzdEl0ZW1SZXRyaWV2ZXIwMS5jc3Byb2ogYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0xpc3RJdGVtUmV0cmlldmVyMDEvTGlzdEl0ZW1SZXRyaWV2ZXIwMS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjOTRkOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTGlzdEl0ZW1SZXRyaWV2ZXIwMS9MaXN0SXRlbVJldHJpZXZlcjAxLmNzcHJvagpAQCAtMCwwICsxLDE1IEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0NDU8L1RhcmdldEZyYW1ld29yaz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cT3BlblhtbFBvd2VyVG9vbHNcT3BlblhtbFBvd2VyVG9vbHMuY3Nwcm9qIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkRvY3VtZW50Rm9ybWF0Lk9wZW5YbWwiIFZlcnNpb249IjIuOC4xIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iV2luZG93c0Jhc2UiIC8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTGlzdEl0ZW1SZXRyaWV2ZXIwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0xpc3RJdGVtUmV0cmlldmVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODgxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0xpc3RJdGVtUmV0cmlldmVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0CkBAIC0wLDAgKzEsMyBAQAorRXhhbXBsZSBvdXRwdXQgZmlsZXMgYXJlIGluIGEgRGF0ZVRpbWUgc3RhbXBlZCBkaXJlY3RvcnkgaW4gLi9iaW4vZGVidWcuICBUaGUgZGlyZWN0b3J5IG5hbWUgaXMgRXhhbXBsZU91dHB1dC15eS1tbS1kZC1oaG1tc3MuCisKK0lmIHlvdSBhcmUgYnVpbGRpbmcgaW4gcmVsZWFzZSBtb2RlLCB0aGV5IHdpbGwsIG9mIGNvdXJzZSwgYmUgaW4gLi9iaW4vcmVsZWFzZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL0xpc3RJdGVtUmV0cmlldmVyMDEvTnVtYmVyZWRMaXN0VGVzdC5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9MaXN0SXRlbVJldHJpZXZlcjAxL051bWJlcmVkTGlzdFRlc3QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2UzMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9MaXN0SXRlbVJldHJpZXZlcjAxL051bWJlcmVkTGlzdFRlc3QuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01hcmt1cFNpbXBsaWZpZXJBcHAvRm9ybTEuRGVzaWduZXIuY3MgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01hcmt1cFNpbXBsaWZpZXJBcHAvRm9ybTEuRGVzaWduZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2ZjVmNgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWFya3VwU2ltcGxpZmllckFwcC9Gb3JtMS5EZXNpZ25lci5jcwpAQCAtMCwwICsxLDI0NCBAQAor77u/bmFtZXNwYWNlIE1hcmt1cFNpbXBsaWZpZXJBcHAKK3sKKyAgICBwYXJ0aWFsIGNsYXNzIEZvcm0xCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXF1aXJlZCBkZXNpZ25lciB2YXJpYWJsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uQ29tcG9uZW50TW9kZWwuSUNvbnRhaW5lciBjb21wb25lbnRzID0gbnVsbDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDbGVhbiB1cCBhbnkgcmVzb3VyY2VzIGJlaW5nIHVzZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlzcG9zaW5nIj50cnVlIGlmIG1hbmFnZWQgcmVzb3VyY2VzIHNob3VsZCBiZSBkaXNwb3NlZDsgb3RoZXJ3aXNlLCBmYWxzZS48L3BhcmFtPgorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGlzcG9zaW5nICYmIChjb21wb25lbnRzICE9IG51bGwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuRGlzcG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmFzZS5EaXNwb3NlKGRpc3Bvc2luZyk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFdpbmRvd3MgRm9ybSBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlcXVpcmVkIG1ldGhvZCBmb3IgRGVzaWduZXIgc3VwcG9ydCAtIGRvIG5vdCBtb2RpZnkKKyAgICAgICAgLy8vIHRoZSBjb250ZW50cyBvZiB0aGlzIG1ldGhvZCB3aXRoIHRoZSBjb2RlIGVkaXRvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRpYWxpemVDb21wb25lbnQoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlQ29udGVudENvbnRyb2xzID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkNoZWNrQm94KCk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlU21hcnRUYWdzID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkNoZWNrQm94KCk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlUnNpZEluZm8gPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuQ2hlY2tCb3goKTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVDb21tZW50cyA9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5DaGVja0JveCgpOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZUVuZEFuZEZvb3ROb3RlcyA9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5DaGVja0JveCgpOworICAgICAgICAgICAgdGhpcy5jYlJlcGxhY2VUYWJzV2l0aFNwYWNlcyA9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5DaGVja0JveCgpOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZUZpZWxkQ29kZXMgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuQ2hlY2tCb3goKTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVQZXJtaXNzaW9ucyA9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5DaGVja0JveCgpOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVByb29mID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkNoZWNrQm94KCk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlU29mdEh5cGhlbnMgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuQ2hlY2tCb3goKTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVMYXN0UmVuZGVyZWRQYWdlQnJlYWsgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuQ2hlY2tCb3goKTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVCb29rbWFya3MgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuQ2hlY2tCb3goKTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVXZWJIaWRkZW4gPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuQ2hlY2tCb3goKTsKKyAgICAgICAgICAgIHRoaXMuY2JOb3JtYWxpemUgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuQ2hlY2tCb3goKTsKKyAgICAgICAgICAgIHRoaXMuYnRuQXBwbHkgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuQnV0dG9uKCk7CisgICAgICAgICAgICB0aGlzLlN1c3BlbmRMYXlvdXQoKTsKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgLy8gY2JSZW1vdmVDb250ZW50Q29udHJvbHMKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy5jYlJlbW92ZUNvbnRlbnRDb250cm9scy5BdXRvU2l6ZSA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlQ29udGVudENvbnRyb2xzLkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEzLCAxMyk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlQ29udGVudENvbnRyb2xzLk5hbWUgPSAiY2JSZW1vdmVDb250ZW50Q29udHJvbHMiOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZUNvbnRlbnRDb250cm9scy5TaXplID0gbmV3IFN5c3RlbS5EcmF3aW5nLlNpemUoMTQ3LCAxNyk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlQ29udGVudENvbnRyb2xzLlRhYkluZGV4ID0gMDsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVDb250ZW50Q29udHJvbHMuVGV4dCA9ICJSZW1vdmUgQ29udGVudCBDb250cm9scyI7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlQ29udGVudENvbnRyb2xzLlVzZVZpc3VhbFN0eWxlQmFja0NvbG9yID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgLy8gY2JSZW1vdmVTbWFydFRhZ3MKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVNtYXJ0VGFncy5BdXRvU2l6ZSA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlU21hcnRUYWdzLkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEzLCAzNyk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlU21hcnRUYWdzLk5hbWUgPSAiY2JSZW1vdmVTbWFydFRhZ3MiOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVNtYXJ0VGFncy5TaXplID0gbmV3IFN5c3RlbS5EcmF3aW5nLlNpemUoMTIzLCAxNyk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlU21hcnRUYWdzLlRhYkluZGV4ID0gMTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVTbWFydFRhZ3MuVGV4dCA9ICJSZW1vdmUgU21hcnQgVGFncyI7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlU21hcnRUYWdzLlVzZVZpc3VhbFN0eWxlQmFja0NvbG9yID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgLy8gY2JSZW1vdmVSc2lkSW5mbworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlUnNpZEluZm8uQXV0b1NpemUgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVJzaWRJbmZvLkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEzLCA2MSk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlUnNpZEluZm8uTmFtZSA9ICJjYlJlbW92ZVJzaWRJbmZvIjsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVSc2lkSW5mby5TaXplID0gbmV3IFN5c3RlbS5EcmF3aW5nLlNpemUoMTExLCAxNyk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlUnNpZEluZm8uVGFiSW5kZXggPSAyOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVJzaWRJbmZvLlRleHQgPSAiUmVtb3ZlIFJzaWQgSW5mbyI7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlUnNpZEluZm8uVXNlVmlzdWFsU3R5bGVCYWNrQ29sb3IgPSB0cnVlOworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICAvLyBjYlJlbW92ZUNvbW1lbnRzCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVDb21tZW50cy5BdXRvU2l6ZSA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlQ29tbWVudHMuTG9jYXRpb24gPSBuZXcgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTMsIDg1KTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVDb21tZW50cy5OYW1lID0gImNiUmVtb3ZlQ29tbWVudHMiOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZUNvbW1lbnRzLlNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSgxMTgsIDE3KTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVDb21tZW50cy5UYWJJbmRleCA9IDM7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlQ29tbWVudHMuVGV4dCA9ICJSZW1vdmUgQ29tbWVudHMiOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZUNvbW1lbnRzLlVzZVZpc3VhbFN0eWxlQmFja0NvbG9yID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgLy8gY2JSZW1vdmVFbmRBbmRGb290Tm90ZXMKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy5jYlJlbW92ZUVuZEFuZEZvb3ROb3Rlcy5BdXRvU2l6ZSA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlRW5kQW5kRm9vdE5vdGVzLkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEzLCAxMDkpOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZUVuZEFuZEZvb3ROb3Rlcy5OYW1lID0gImNiUmVtb3ZlRW5kQW5kRm9vdE5vdGVzIjsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVFbmRBbmRGb290Tm90ZXMuU2l6ZSA9IG5ldyBTeXN0ZW0uRHJhd2luZy5TaXplKDE2NCwgMTcpOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZUVuZEFuZEZvb3ROb3Rlcy5UYWJJbmRleCA9IDQ7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlRW5kQW5kRm9vdE5vdGVzLlRleHQgPSAiUmVtb3ZlIEVuZCBhbmQgRm9vdCBOb3RlcyI7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlRW5kQW5kRm9vdE5vdGVzLlVzZVZpc3VhbFN0eWxlQmFja0NvbG9yID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgLy8gY2JSZXBsYWNlVGFic1dpdGhTcGFjZXMKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy5jYlJlcGxhY2VUYWJzV2l0aFNwYWNlcy5BdXRvU2l6ZSA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmNiUmVwbGFjZVRhYnNXaXRoU3BhY2VzLkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEzLCAxMzMpOworICAgICAgICAgICAgdGhpcy5jYlJlcGxhY2VUYWJzV2l0aFNwYWNlcy5OYW1lID0gImNiUmVwbGFjZVRhYnNXaXRoU3BhY2VzIjsKKyAgICAgICAgICAgIHRoaXMuY2JSZXBsYWNlVGFic1dpdGhTcGFjZXMuU2l6ZSA9IG5ldyBTeXN0ZW0uRHJhd2luZy5TaXplKDE1NCwgMTcpOworICAgICAgICAgICAgdGhpcy5jYlJlcGxhY2VUYWJzV2l0aFNwYWNlcy5UYWJJbmRleCA9IDU7CisgICAgICAgICAgICB0aGlzLmNiUmVwbGFjZVRhYnNXaXRoU3BhY2VzLlRleHQgPSAiUmVwbGFjZSBUYWJzIHdpdGggU3BhY2VzIjsKKyAgICAgICAgICAgIHRoaXMuY2JSZXBsYWNlVGFic1dpdGhTcGFjZXMuVXNlVmlzdWFsU3R5bGVCYWNrQ29sb3IgPSB0cnVlOworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICAvLyBjYlJlbW92ZUZpZWxkQ29kZXMKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy5jYlJlbW92ZUZpZWxkQ29kZXMuQXV0b1NpemUgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZUZpZWxkQ29kZXMuTG9jYXRpb24gPSBuZXcgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTMsIDE1Nyk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlRmllbGRDb2Rlcy5OYW1lID0gImNiUmVtb3ZlRmllbGRDb2RlcyI7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlRmllbGRDb2Rlcy5TaXplID0gbmV3IFN5c3RlbS5EcmF3aW5nLlNpemUoMTI0LCAxNyk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlRmllbGRDb2Rlcy5UYWJJbmRleCA9IDY7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlRmllbGRDb2Rlcy5UZXh0ID0gIlJlbW92ZSBGaWVsZCBDb2RlcyI7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlRmllbGRDb2Rlcy5Vc2VWaXN1YWxTdHlsZUJhY2tDb2xvciA9IHRydWU7CisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIC8vIGNiUmVtb3ZlUGVybWlzc2lvbnMKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVBlcm1pc3Npb25zLkF1dG9TaXplID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVQZXJtaXNzaW9ucy5Mb2NhdGlvbiA9IG5ldyBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMywgMTgxKTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVQZXJtaXNzaW9ucy5OYW1lID0gImNiUmVtb3ZlUGVybWlzc2lvbnMiOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVBlcm1pc3Npb25zLlNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSgxMjQsIDE3KTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVQZXJtaXNzaW9ucy5UYWJJbmRleCA9IDc7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlUGVybWlzc2lvbnMuVGV4dCA9ICJSZW1vdmUgUGVybWlzc2lvbnMiOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVBlcm1pc3Npb25zLlVzZVZpc3VhbFN0eWxlQmFja0NvbG9yID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgLy8gY2JSZW1vdmVQcm9vZgorICAgICAgICAgICAgLy8gCisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlUHJvb2YuQXV0b1NpemUgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVByb29mLkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEzLCAyMDUpOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVByb29mLk5hbWUgPSAiY2JSZW1vdmVQcm9vZiI7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlUHJvb2YuU2l6ZSA9IG5ldyBTeXN0ZW0uRHJhd2luZy5TaXplKDk0LCAxNyk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlUHJvb2YuVGFiSW5kZXggPSA4OworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVByb29mLlRleHQgPSAiUmVtb3ZlIFByb29mIjsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVQcm9vZi5Vc2VWaXN1YWxTdHlsZUJhY2tDb2xvciA9IHRydWU7CisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIC8vIGNiUmVtb3ZlU29mdEh5cGhlbnMKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVNvZnRIeXBoZW5zLkF1dG9TaXplID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVTb2Z0SHlwaGVucy5Mb2NhdGlvbiA9IG5ldyBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMywgMjI5KTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVTb2Z0SHlwaGVucy5OYW1lID0gImNiUmVtb3ZlU29mdEh5cGhlbnMiOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVNvZnRIeXBoZW5zLlNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSgxMzMsIDE3KTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVTb2Z0SHlwaGVucy5UYWJJbmRleCA9IDk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlU29mdEh5cGhlbnMuVGV4dCA9ICJSZW1vdmUgU29mdCBIeXBoZW5zIjsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVTb2Z0SHlwaGVucy5Vc2VWaXN1YWxTdHlsZUJhY2tDb2xvciA9IHRydWU7CisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIC8vIGNiUmVtb3ZlTGFzdFJlbmRlcmVkUGFnZUJyZWFrCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVMYXN0UmVuZGVyZWRQYWdlQnJlYWsuQXV0b1NpemUgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZUxhc3RSZW5kZXJlZFBhZ2VCcmVhay5Mb2NhdGlvbiA9IG5ldyBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMywgMjUzKTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVMYXN0UmVuZGVyZWRQYWdlQnJlYWsuTmFtZSA9ICJjYlJlbW92ZUxhc3RSZW5kZXJlZFBhZ2VCcmVhayI7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlTGFzdFJlbmRlcmVkUGFnZUJyZWFrLlNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSgxOTgsIDE3KTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVMYXN0UmVuZGVyZWRQYWdlQnJlYWsuVGFiSW5kZXggPSAxMDsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVMYXN0UmVuZGVyZWRQYWdlQnJlYWsuVGV4dCA9ICJSZW1vdmUgTGFzdCBSZW5kZXJlZCBQYWdlIEJyZWFrIjsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVMYXN0UmVuZGVyZWRQYWdlQnJlYWsuVXNlVmlzdWFsU3R5bGVCYWNrQ29sb3IgPSB0cnVlOworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICAvLyBjYlJlbW92ZUJvb2ttYXJrcworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlQm9va21hcmtzLkF1dG9TaXplID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVCb29rbWFya3MuTG9jYXRpb24gPSBuZXcgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTMsIDI3Nyk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlQm9va21hcmtzLk5hbWUgPSAiY2JSZW1vdmVCb29rbWFya3MiOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZUJvb2ttYXJrcy5TaXplID0gbmV3IFN5c3RlbS5EcmF3aW5nLlNpemUoMTIyLCAxNyk7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlQm9va21hcmtzLlRhYkluZGV4ID0gMTE7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlQm9va21hcmtzLlRleHQgPSAiUmVtb3ZlIEJvb2ttYXJrcyI7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlQm9va21hcmtzLlVzZVZpc3VhbFN0eWxlQmFja0NvbG9yID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgLy8gY2JSZW1vdmVXZWJIaWRkZW4KKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVdlYkhpZGRlbi5BdXRvU2l6ZSA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmNiUmVtb3ZlV2ViSGlkZGVuLkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEzLCAzMDEpOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVdlYkhpZGRlbi5OYW1lID0gImNiUmVtb3ZlV2ViSGlkZGVuIjsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVXZWJIaWRkZW4uU2l6ZSA9IG5ldyBTeXN0ZW0uRHJhd2luZy5TaXplKDEyOSwgMTcpOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVdlYkhpZGRlbi5UYWJJbmRleCA9IDEyOworICAgICAgICAgICAgdGhpcy5jYlJlbW92ZVdlYkhpZGRlbi5UZXh0ID0gIlJlbW92ZSBXZWIgSGlkZGVuIjsKKyAgICAgICAgICAgIHRoaXMuY2JSZW1vdmVXZWJIaWRkZW4uVXNlVmlzdWFsU3R5bGVCYWNrQ29sb3IgPSB0cnVlOworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICAvLyBjYk5vcm1hbGl6ZQorICAgICAgICAgICAgLy8gCisgICAgICAgICAgICB0aGlzLmNiTm9ybWFsaXplLkF1dG9TaXplID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuY2JOb3JtYWxpemUuTG9jYXRpb24gPSBuZXcgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTMsIDMyNSk7CisgICAgICAgICAgICB0aGlzLmNiTm9ybWFsaXplLk5hbWUgPSAiY2JOb3JtYWxpemUiOworICAgICAgICAgICAgdGhpcy5jYk5vcm1hbGl6ZS5TaXplID0gbmV3IFN5c3RlbS5EcmF3aW5nLlNpemUoOTcsIDE3KTsKKyAgICAgICAgICAgIHRoaXMuY2JOb3JtYWxpemUuVGFiSW5kZXggPSAxMzsKKyAgICAgICAgICAgIHRoaXMuY2JOb3JtYWxpemUuVGV4dCA9ICJOb3JtYWxpemUgWE1MIjsKKyAgICAgICAgICAgIHRoaXMuY2JOb3JtYWxpemUuVXNlVmlzdWFsU3R5bGVCYWNrQ29sb3IgPSB0cnVlOworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICAvLyBidG5BcHBseQorICAgICAgICAgICAgLy8gCisgICAgICAgICAgICB0aGlzLmJ0bkFwcGx5LkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDI1NiwgMzAxKTsKKyAgICAgICAgICAgIHRoaXMuYnRuQXBwbHkuTmFtZSA9ICJidG5BcHBseSI7CisgICAgICAgICAgICB0aGlzLmJ0bkFwcGx5LlNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSgxMDMsIDQxKTsKKyAgICAgICAgICAgIHRoaXMuYnRuQXBwbHkuVGFiSW5kZXggPSAxNDsKKyAgICAgICAgICAgIHRoaXMuYnRuQXBwbHkuVGV4dCA9ICJBcHBseSB0byBEb2N1bWVudHMiOworICAgICAgICAgICAgdGhpcy5idG5BcHBseS5Vc2VWaXN1YWxTdHlsZUJhY2tDb2xvciA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmJ0bkFwcGx5LkNsaWNrICs9IG5ldyBTeXN0ZW0uRXZlbnRIYW5kbGVyKHRoaXMuYnRuQXBwbHlfQ2xpY2spOworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICAvLyBGb3JtMQorICAgICAgICAgICAgLy8gCisgICAgICAgICAgICB0aGlzLkF1dG9TY2FsZURpbWVuc2lvbnMgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZUYoNkYsIDEzRik7CisgICAgICAgICAgICB0aGlzLkF1dG9TY2FsZU1vZGUgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5BdXRvU2NhbGVNb2RlLkZvbnQ7CisgICAgICAgICAgICB0aGlzLkNsaWVudFNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSgzNzgsIDM1NCk7CisgICAgICAgICAgICB0aGlzLkNvbnRyb2xzLkFkZCh0aGlzLmJ0bkFwcGx5KTsKKyAgICAgICAgICAgIHRoaXMuQ29udHJvbHMuQWRkKHRoaXMuY2JOb3JtYWxpemUpOworICAgICAgICAgICAgdGhpcy5Db250cm9scy5BZGQodGhpcy5jYlJlbW92ZVdlYkhpZGRlbik7CisgICAgICAgICAgICB0aGlzLkNvbnRyb2xzLkFkZCh0aGlzLmNiUmVtb3ZlQm9va21hcmtzKTsKKyAgICAgICAgICAgIHRoaXMuQ29udHJvbHMuQWRkKHRoaXMuY2JSZW1vdmVMYXN0UmVuZGVyZWRQYWdlQnJlYWspOworICAgICAgICAgICAgdGhpcy5Db250cm9scy5BZGQodGhpcy5jYlJlbW92ZVNvZnRIeXBoZW5zKTsKKyAgICAgICAgICAgIHRoaXMuQ29udHJvbHMuQWRkKHRoaXMuY2JSZW1vdmVQcm9vZik7CisgICAgICAgICAgICB0aGlzLkNvbnRyb2xzLkFkZCh0aGlzLmNiUmVtb3ZlUGVybWlzc2lvbnMpOworICAgICAgICAgICAgdGhpcy5Db250cm9scy5BZGQodGhpcy5jYlJlbW92ZUZpZWxkQ29kZXMpOworICAgICAgICAgICAgdGhpcy5Db250cm9scy5BZGQodGhpcy5jYlJlcGxhY2VUYWJzV2l0aFNwYWNlcyk7CisgICAgICAgICAgICB0aGlzLkNvbnRyb2xzLkFkZCh0aGlzLmNiUmVtb3ZlRW5kQW5kRm9vdE5vdGVzKTsKKyAgICAgICAgICAgIHRoaXMuQ29udHJvbHMuQWRkKHRoaXMuY2JSZW1vdmVDb21tZW50cyk7CisgICAgICAgICAgICB0aGlzLkNvbnRyb2xzLkFkZCh0aGlzLmNiUmVtb3ZlUnNpZEluZm8pOworICAgICAgICAgICAgdGhpcy5Db250cm9scy5BZGQodGhpcy5jYlJlbW92ZVNtYXJ0VGFncyk7CisgICAgICAgICAgICB0aGlzLkNvbnRyb2xzLkFkZCh0aGlzLmNiUmVtb3ZlQ29udGVudENvbnRyb2xzKTsKKyAgICAgICAgICAgIHRoaXMuTmFtZSA9ICJGb3JtMSI7CisgICAgICAgICAgICB0aGlzLlRleHQgPSAiRm9ybTEiOworICAgICAgICAgICAgdGhpcy5SZXN1bWVMYXlvdXQoZmFsc2UpOworICAgICAgICAgICAgdGhpcy5QZXJmb3JtTGF5b3V0KCk7CisKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwcml2YXRlIFN5c3RlbS5XaW5kb3dzLkZvcm1zLkNoZWNrQm94IGNiUmVtb3ZlQ29udGVudENvbnRyb2xzOworICAgICAgICBwcml2YXRlIFN5c3RlbS5XaW5kb3dzLkZvcm1zLkNoZWNrQm94IGNiUmVtb3ZlU21hcnRUYWdzOworICAgICAgICBwcml2YXRlIFN5c3RlbS5XaW5kb3dzLkZvcm1zLkNoZWNrQm94IGNiUmVtb3ZlUnNpZEluZm87CisgICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuQ2hlY2tCb3ggY2JSZW1vdmVDb21tZW50czsKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5DaGVja0JveCBjYlJlbW92ZUVuZEFuZEZvb3ROb3RlczsKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5DaGVja0JveCBjYlJlcGxhY2VUYWJzV2l0aFNwYWNlczsKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5DaGVja0JveCBjYlJlbW92ZUZpZWxkQ29kZXM7CisgICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuQ2hlY2tCb3ggY2JSZW1vdmVQZXJtaXNzaW9uczsKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5DaGVja0JveCBjYlJlbW92ZVByb29mOworICAgICAgICBwcml2YXRlIFN5c3RlbS5XaW5kb3dzLkZvcm1zLkNoZWNrQm94IGNiUmVtb3ZlU29mdEh5cGhlbnM7CisgICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuQ2hlY2tCb3ggY2JSZW1vdmVMYXN0UmVuZGVyZWRQYWdlQnJlYWs7CisgICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuQ2hlY2tCb3ggY2JSZW1vdmVCb29rbWFya3M7CisgICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuQ2hlY2tCb3ggY2JSZW1vdmVXZWJIaWRkZW47CisgICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuQ2hlY2tCb3ggY2JOb3JtYWxpemU7CisgICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuQnV0dG9uIGJ0bkFwcGx5OworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NYXJrdXBTaW1wbGlmaWVyQXBwL0Zvcm0xLmNzIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NYXJrdXBTaW1wbGlmaWVyQXBwL0Zvcm0xLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZDFlNjAKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01hcmt1cFNpbXBsaWZpZXJBcHAvRm9ybTEuY3MKQEAgLTAsMCArMSw1MyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uQ29tcG9uZW50TW9kZWw7Cit1c2luZyBTeXN0ZW0uRGF0YTsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5XaW5kb3dzLkZvcm1zOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKKworbmFtZXNwYWNlIE1hcmt1cFNpbXBsaWZpZXJBcHAKK3sKKyAgICBwdWJsaWMgcGFydGlhbCBjbGFzcyBGb3JtMSA6IEZvcm0KKyAgICB7CisgICAgICAgIHB1YmxpYyBGb3JtMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluaXRpYWxpemVDb21wb25lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBidG5BcHBseV9DbGljayhvYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgZSkKKyAgICAgICAgeworICAgICAgICAgICAgT3BlbkZpbGVEaWFsb2cgb2ZkID0gbmV3IE9wZW5GaWxlRGlhbG9nKCk7CisgICAgICAgICAgICBvZmQuTXVsdGlzZWxlY3QgPSB0cnVlOworICAgICAgICAgICAgRGlhbG9nUmVzdWx0IGRyID0gb2ZkLlNob3dEaWFsb2coKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIG9mZC5GaWxlTmFtZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jID0KKyAgICAgICAgICAgICAgICAgICAgV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKGl0ZW0sIHRydWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2ltcGxpZnlNYXJrdXBTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBTaW1wbGlmeU1hcmt1cFNldHRpbmdzCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZUNvbnRlbnRDb250cm9scyA9IGNiUmVtb3ZlQ29udGVudENvbnRyb2xzLkNoZWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVTbWFydFRhZ3MgPSBjYlJlbW92ZVNtYXJ0VGFncy5DaGVja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlUnNpZEluZm8gPSBjYlJlbW92ZVJzaWRJbmZvLkNoZWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVDb21tZW50cyA9IGNiUmVtb3ZlQ29tbWVudHMuQ2hlY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZUVuZEFuZEZvb3ROb3RlcyA9IGNiUmVtb3ZlRW5kQW5kRm9vdE5vdGVzLkNoZWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBSZXBsYWNlVGFic1dpdGhTcGFjZXMgPSBjYlJlcGxhY2VUYWJzV2l0aFNwYWNlcy5DaGVja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlRmllbGRDb2RlcyA9IGNiUmVtb3ZlRmllbGRDb2Rlcy5DaGVja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlUGVybWlzc2lvbnMgPSBjYlJlbW92ZVBlcm1pc3Npb25zLkNoZWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVQcm9vZiA9IGNiUmVtb3ZlUHJvb2YuQ2hlY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZVNvZnRIeXBoZW5zID0gY2JSZW1vdmVTb2Z0SHlwaGVucy5DaGVja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlTGFzdFJlbmRlcmVkUGFnZUJyZWFrID0gY2JSZW1vdmVMYXN0UmVuZGVyZWRQYWdlQnJlYWsuQ2hlY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZUJvb2ttYXJrcyA9IGNiUmVtb3ZlQm9va21hcmtzLkNoZWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVXZWJIaWRkZW4gPSBjYlJlbW92ZVdlYkhpZGRlbi5DaGVja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsaXplWG1sID0gY2JOb3JtYWxpemUuQ2hlY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgT3BlblhtbFBvd2VyVG9vbHMuTWFya3VwU2ltcGxpZmllci5TaW1wbGlmeU1hcmt1cChkb2MsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01hcmt1cFNpbXBsaWZpZXJBcHAvRm9ybTEucmVzeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWFya3VwU2ltcGxpZmllckFwcC9Gb3JtMS5yZXN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZjdkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01hcmt1cFNpbXBsaWZpZXJBcHAvRm9ybTEucmVzeApAQCAtMCwwICsxLDEyMCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxyb290PgorICA8IS0tIAorICAgIE1pY3Jvc29mdCBSZXNYIFNjaGVtYSAKKyAgICAKKyAgICBWZXJzaW9uIDIuMAorICAgIAorICAgIFRoZSBwcmltYXJ5IGdvYWxzIG9mIHRoaXMgZm9ybWF0IGlzIHRvIGFsbG93IGEgc2ltcGxlIFhNTCBmb3JtYXQgCisgICAgdGhhdCBpcyBtb3N0bHkgaHVtYW4gcmVhZGFibGUuIFRoZSBnZW5lcmF0aW9uIGFuZCBwYXJzaW5nIG9mIHRoZSAKKyAgICB2YXJpb3VzIGRhdGEgdHlwZXMgYXJlIGRvbmUgdGhyb3VnaCB0aGUgVHlwZUNvbnZlcnRlciBjbGFzc2VzIAorICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0eXBlcy4KKyAgICAKKyAgICBFeGFtcGxlOgorICAgIAorICAgIC4uLiBhZG8ubmV0L1hNTCBoZWFkZXJzICYgc2NoZW1hIC4uLgorICAgIDxyZXNoZWFkZXIgbmFtZT0icmVzbWltZXR5cGUiPnRleHQvbWljcm9zb2Z0LXJlc3g8L3Jlc2hlYWRlcj4KKyAgICA8cmVzaGVhZGVyIG5hbWU9InZlcnNpb24iPjIuMDwvcmVzaGVhZGVyPgorICAgIDxyZXNoZWFkZXIgbmFtZT0icmVhZGVyIj5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVJlYWRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIC4uLjwvcmVzaGVhZGVyPgorICAgIDxyZXNoZWFkZXIgbmFtZT0id3JpdGVyIj5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVdyaXRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIC4uLjwvcmVzaGVhZGVyPgorICAgIDxkYXRhIG5hbWU9Ik5hbWUxIj48dmFsdWU+dGhpcyBpcyBteSBsb25nIHN0cmluZzwvdmFsdWU+PGNvbW1lbnQ+dGhpcyBpcyBhIGNvbW1lbnQ8L2NvbW1lbnQ+PC9kYXRhPgorICAgIDxkYXRhIG5hbWU9IkNvbG9yMSIgdHlwZT0iU3lzdGVtLkRyYXdpbmcuQ29sb3IsIFN5c3RlbS5EcmF3aW5nIj5CbHVlPC9kYXRhPgorICAgIDxkYXRhIG5hbWU9IkJpdG1hcDEiIG1pbWV0eXBlPSJhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJpbmFyeS5iYXNlNjQiPgorICAgICAgICA8dmFsdWU+W2Jhc2U2NCBtaW1lIGVuY29kZWQgc2VyaWFsaXplZCAuTkVUIEZyYW1ld29yayBvYmplY3RdPC92YWx1ZT4KKyAgICA8L2RhdGE+CisgICAgPGRhdGEgbmFtZT0iSWNvbjEiIHR5cGU9IlN5c3RlbS5EcmF3aW5nLkljb24sIFN5c3RlbS5EcmF3aW5nIiBtaW1ldHlwZT0iYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5ieXRlYXJyYXkuYmFzZTY0Ij4KKyAgICAgICAgPHZhbHVlPltiYXNlNjQgbWltZSBlbmNvZGVkIHN0cmluZyByZXByZXNlbnRpbmcgYSBieXRlIGFycmF5IGZvcm0gb2YgdGhlIC5ORVQgRnJhbWV3b3JrIG9iamVjdF08L3ZhbHVlPgorICAgICAgICA8Y29tbWVudD5UaGlzIGlzIGEgY29tbWVudDwvY29tbWVudD4KKyAgICA8L2RhdGE+CisgICAgICAgICAgICAgICAgCisgICAgVGhlcmUgYXJlIGFueSBudW1iZXIgb2YgInJlc2hlYWRlciIgcm93cyB0aGF0IGNvbnRhaW4gc2ltcGxlIAorICAgIG5hbWUvdmFsdWUgcGFpcnMuCisgICAgCisgICAgRWFjaCBkYXRhIHJvdyBjb250YWlucyBhIG5hbWUsIGFuZCB2YWx1ZS4gVGhlIHJvdyBhbHNvIGNvbnRhaW5zIGEgCisgICAgdHlwZSBvciBtaW1ldHlwZS4gVHlwZSBjb3JyZXNwb25kcyB0byBhIC5ORVQgY2xhc3MgdGhhdCBzdXBwb3J0IAorICAgIHRleHQvdmFsdWUgY29udmVyc2lvbiB0aHJvdWdoIHRoZSBUeXBlQ29udmVydGVyIGFyY2hpdGVjdHVyZS4gCisgICAgQ2xhc3NlcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhpcyBhcmUgc2VyaWFsaXplZCBhbmQgc3RvcmVkIHdpdGggdGhlIAorICAgIG1pbWV0eXBlIHNldC4KKyAgICAKKyAgICBUaGUgbWltZXR5cGUgaXMgdXNlZCBmb3Igc2VyaWFsaXplZCBvYmplY3RzLCBhbmQgdGVsbHMgdGhlIAorICAgIFJlc1hSZXNvdXJjZVJlYWRlciBob3cgdG8gZGVwZXJzaXN0IHRoZSBvYmplY3QuIFRoaXMgaXMgY3VycmVudGx5IG5vdCAKKyAgICBleHRlbnNpYmxlLiBGb3IgYSBnaXZlbiBtaW1ldHlwZSB0aGUgdmFsdWUgbXVzdCBiZSBzZXQgYWNjb3JkaW5nbHk6CisgICAgCisgICAgTm90ZSAtIGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYmluYXJ5LmJhc2U2NCBpcyB0aGUgZm9ybWF0IAorICAgIHRoYXQgdGhlIFJlc1hSZXNvdXJjZVdyaXRlciB3aWxsIGdlbmVyYXRlLCBob3dldmVyIHRoZSByZWFkZXIgY2FuIAorICAgIHJlYWQgYW55IG9mIHRoZSBmb3JtYXRzIGxpc3RlZCBiZWxvdy4KKyAgICAKKyAgICBtaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5iaW5hcnkuYmFzZTY0CisgICAgdmFsdWUgICA6IFRoZSBvYmplY3QgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggCisgICAgICAgICAgICA6IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5CaW5hcnkuQmluYXJ5Rm9ybWF0dGVyCisgICAgICAgICAgICA6IGFuZCB0aGVuIGVuY29kZWQgd2l0aCBiYXNlNjQgZW5jb2RpbmcuCisgICAgCisgICAgbWltZXR5cGU6IGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3Quc29hcC5iYXNlNjQKKyAgICB2YWx1ZSAgIDogVGhlIG9iamVjdCBtdXN0IGJlIHNlcmlhbGl6ZWQgd2l0aCAKKyAgICAgICAgICAgIDogU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlNvYXAuU29hcEZvcm1hdHRlcgorICAgICAgICAgICAgOiBhbmQgdGhlbiBlbmNvZGVkIHdpdGggYmFzZTY0IGVuY29kaW5nLgorCisgICAgbWltZXR5cGU6IGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYnl0ZWFycmF5LmJhc2U2NAorICAgIHZhbHVlICAgOiBUaGUgb2JqZWN0IG11c3QgYmUgc2VyaWFsaXplZCBpbnRvIGEgYnl0ZSBhcnJheSAKKyAgICAgICAgICAgIDogdXNpbmcgYSBTeXN0ZW0uQ29tcG9uZW50TW9kZWwuVHlwZUNvbnZlcnRlcgorICAgICAgICAgICAgOiBhbmQgdGhlbiBlbmNvZGVkIHdpdGggYmFzZTY0IGVuY29kaW5nLgorICAgIC0tPgorICA8eHNkOnNjaGVtYSBpZD0icm9vdCIgeG1sbnM9IiIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiPgorICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiAvPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb290IiBtc2RhdGE6SXNEYXRhU2V0PSJ0cnVlIj4KKyAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgIDx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0YWRhdGEiPgorICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KKyAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciIC8+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbWV0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIgLz4KKyAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5Ij4KKyAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsaWFzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgorICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YSI+CisgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KKyAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWVudCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMiIgLz4KKyAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiIG1zZGF0YTpPcmRpbmFsPSIxIiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtc2RhdGE6T3JkaW5hbD0iMyIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWltZXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1zZGF0YTpPcmRpbmFsPSI0IiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIgLz4KKyAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc2hlYWRlciI+CisgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KKyAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8L3hzZDplbGVtZW50PgorICA8L3hzZDpzY2hlbWE+CisgIDxyZXNoZWFkZXIgbmFtZT0icmVzbWltZXR5cGUiPgorICAgIDx2YWx1ZT50ZXh0L21pY3Jvc29mdC1yZXN4PC92YWx1ZT4KKyAgPC9yZXNoZWFkZXI+CisgIDxyZXNoZWFkZXIgbmFtZT0idmVyc2lvbiI+CisgICAgPHZhbHVlPjIuMDwvdmFsdWU+CisgIDwvcmVzaGVhZGVyPgorICA8cmVzaGVhZGVyIG5hbWU9InJlYWRlciI+CisgICAgPHZhbHVlPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlUmVhZGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODk8L3ZhbHVlPgorICA8L3Jlc2hlYWRlcj4KKyAgPHJlc2hlYWRlciBuYW1lPSJ3cml0ZXIiPgorICAgIDx2YWx1ZT5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVdyaXRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5PC92YWx1ZT4KKyAgPC9yZXNoZWFkZXI+Cis8L3Jvb3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NYXJrdXBTaW1wbGlmaWVyQXBwL01hcmt1cFNpbXBsaWZpZXJBcHAuY3Nwcm9qIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NYXJrdXBTaW1wbGlmaWVyQXBwL01hcmt1cFNpbXBsaWZpZXJBcHAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMTcyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01hcmt1cFNpbXBsaWZpZXJBcHAvTWFya3VwU2ltcGxpZmllckFwcC5jc3Byb2oKQEAgLTAsMCArMSwyNSBAQAor77u/PFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldDQ1PC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXE9wZW5YbWxQb3dlclRvb2xzXE9wZW5YbWxQb3dlclRvb2xzLmNzcHJvaiIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJEb2N1bWVudEZvcm1hdC5PcGVuWG1sIiBWZXJzaW9uPSIyLjguMSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XaW5kb3dzLkZvcm1zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iV2luZG93c0Jhc2UiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgVXBkYXRlPSJGb3JtMS5jcyI+CisgICAgICA8U3ViVHlwZT5Gb3JtPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBVcGRhdGU9IkZvcm0xLkRlc2lnbmVyLmNzIj4KKyAgICAgIDxTdWJUeXBlPkZvcm08L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01hcmt1cFNpbXBsaWZpZXJBcHAvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NYXJrdXBTaW1wbGlmaWVyQXBwL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODg4MWMxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NYXJrdXBTaW1wbGlmaWVyQXBwL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApAQCAtMCwwICsxLDMgQEAKK0V4YW1wbGUgb3V0cHV0IGZpbGVzIGFyZSBpbiBhIERhdGVUaW1lIHN0YW1wZWQgZGlyZWN0b3J5IGluIC4vYmluL2RlYnVnLiAgVGhlIGRpcmVjdG9yeSBuYW1lIGlzIEV4YW1wbGVPdXRwdXQteXktbW0tZGQtaGhtbXNzLgorCitJZiB5b3UgYXJlIGJ1aWxkaW5nIGluIHJlbGVhc2UgbW9kZSwgdGhleSB3aWxsLCBvZiBjb3Vyc2UsIGJlIGluIC4vYmluL3JlbGVhc2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NYXJrdXBTaW1wbGlmaWVyQXBwL1Byb2dyYW0uY3MgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01hcmt1cFNpbXBsaWZpZXJBcHAvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWRhMWNlCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NYXJrdXBTaW1wbGlmaWVyQXBwL1Byb2dyYW0uY3MKQEAgLTAsMCArMSwyMSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5XaW5kb3dzLkZvcm1zOworCituYW1lc3BhY2UgTWFya3VwU2ltcGxpZmllckFwcAoreworICAgIHN0YXRpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBbU1RBVGhyZWFkXQorICAgICAgICBzdGF0aWMgdm9pZCBNYWluKCkKKyAgICAgICAgeworICAgICAgICAgICAgQXBwbGljYXRpb24uRW5hYmxlVmlzdWFsU3R5bGVzKCk7CisgICAgICAgICAgICBBcHBsaWNhdGlvbi5TZXRDb21wYXRpYmxlVGV4dFJlbmRlcmluZ0RlZmF1bHQoZmFsc2UpOworICAgICAgICAgICAgQXBwbGljYXRpb24uUnVuKG5ldyBGb3JtMSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWFya3VwU2ltcGxpZmllckFwcC9Qcm9wZXJ0aWVzL1Jlc291cmNlcy5EZXNpZ25lci5jcyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWFya3VwU2ltcGxpZmllckFwcC9Qcm9wZXJ0aWVzL1Jlc291cmNlcy5EZXNpZ25lci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmVjYTg4Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NYXJrdXBTaW1wbGlmaWVyQXBwL1Byb3BlcnRpZXMvUmVzb3VyY2VzLkRlc2lnbmVyLmNzCkBAIC0wLDAgKzEsNjMgQEAKK++7vy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyA8YXV0by1nZW5lcmF0ZWQ+CisvLyAgICAgVGhpcyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgYSB0b29sLgorLy8gICAgIFJ1bnRpbWUgVmVyc2lvbjo0LjAuMzAzMTkuMzQyMDkKKy8vCisvLyAgICAgQ2hhbmdlcyB0byB0aGlzIGZpbGUgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvciBhbmQgd2lsbCBiZSBsb3N0IGlmCisvLyAgICAgdGhlIGNvZGUgaXMgcmVnZW5lcmF0ZWQuCisvLyA8L2F1dG8tZ2VuZXJhdGVkPgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbmFtZXNwYWNlIE1hcmt1cFNpbXBsaWZpZXJBcHAuUHJvcGVydGllcyB7CisgICAgdXNpbmcgU3lzdGVtOworICAgIAorICAgIAorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICBBIHN0cm9uZ2x5LXR5cGVkIHJlc291cmNlIGNsYXNzLCBmb3IgbG9va2luZyB1cCBsb2NhbGl6ZWQgc3RyaW5ncywgZXRjLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8gVGhpcyBjbGFzcyB3YXMgYXV0by1nZW5lcmF0ZWQgYnkgdGhlIFN0cm9uZ2x5VHlwZWRSZXNvdXJjZUJ1aWxkZXIKKyAgICAvLyBjbGFzcyB2aWEgYSB0b29sIGxpa2UgUmVzR2VuIG9yIFZpc3VhbCBTdHVkaW8uCisgICAgLy8gVG8gYWRkIG9yIHJlbW92ZSBhIG1lbWJlciwgZWRpdCB5b3VyIC5SZXNYIGZpbGUgdGhlbiByZXJ1biBSZXNHZW4KKyAgICAvLyB3aXRoIHRoZSAvc3RyIG9wdGlvbiwgb3IgcmVidWlsZCB5b3VyIFZTIHByb2plY3QuCisgICAgW2dsb2JhbDo6U3lzdGVtLkNvZGVEb20uQ29tcGlsZXIuR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZSgiU3lzdGVtLlJlc291cmNlcy5Ub29scy5TdHJvbmdseVR5cGVkUmVzb3VyY2VCdWlsZGVyIiwgIjQuMC4wLjAiKV0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQorICAgIFtnbG9iYWw6OlN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXMuQ29tcGlsZXJHZW5lcmF0ZWRBdHRyaWJ1dGUoKV0KKyAgICBpbnRlcm5hbCBjbGFzcyBSZXNvdXJjZXMgeworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZ2xvYmFsOjpTeXN0ZW0uUmVzb3VyY2VzLlJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbjsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgc3RhdGljIGdsb2JhbDo6U3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8gcmVzb3VyY2VDdWx0dXJlOworICAgICAgICAKKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkNvZGVBbmFseXNpcy5TdXBwcmVzc01lc3NhZ2VBdHRyaWJ1dGUoIk1pY3Jvc29mdC5QZXJmb3JtYW5jZSIsICJDQTE4MTE6QXZvaWRVbmNhbGxlZFByaXZhdGVDb2RlIildCisgICAgICAgIGludGVybmFsIFJlc291cmNlcygpIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBSZXR1cm5zIHRoZSBjYWNoZWQgUmVzb3VyY2VNYW5hZ2VyIGluc3RhbmNlIHVzZWQgYnkgdGhpcyBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkNvbXBvbmVudE1vZGVsLkVkaXRvckJyb3dzYWJsZUF0dHJpYnV0ZShnbG9iYWw6OlN5c3RlbS5Db21wb25lbnRNb2RlbC5FZGl0b3JCcm93c2FibGVTdGF0ZS5BZHZhbmNlZCldCisgICAgICAgIGludGVybmFsIHN0YXRpYyBnbG9iYWw6OlN5c3RlbS5SZXNvdXJjZXMuUmVzb3VyY2VNYW5hZ2VyIFJlc291cmNlTWFuYWdlciB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIGlmIChvYmplY3QuUmVmZXJlbmNlRXF1YWxzKHJlc291cmNlTWFuLCBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICBnbG9iYWw6OlN5c3RlbS5SZXNvdXJjZXMuUmVzb3VyY2VNYW5hZ2VyIHRlbXAgPSBuZXcgZ2xvYmFsOjpTeXN0ZW0uUmVzb3VyY2VzLlJlc291cmNlTWFuYWdlcigiTWFya3VwU2ltcGxpZmllckFwcC5Qcm9wZXJ0aWVzLlJlc291cmNlcyIsIHR5cGVvZihSZXNvdXJjZXMpLkFzc2VtYmx5KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VNYW4gPSB0ZW1wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VNYW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgT3ZlcnJpZGVzIHRoZSBjdXJyZW50IHRocmVhZCdzIEN1cnJlbnRVSUN1bHR1cmUgcHJvcGVydHkgZm9yIGFsbAorICAgICAgICAvLy8gICByZXNvdXJjZSBsb29rdXBzIHVzaW5nIHRoaXMgc3Ryb25nbHkgdHlwZWQgcmVzb3VyY2UgY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5Db21wb25lbnRNb2RlbC5FZGl0b3JCcm93c2FibGVBdHRyaWJ1dGUoZ2xvYmFsOjpTeXN0ZW0uQ29tcG9uZW50TW9kZWwuRWRpdG9yQnJvd3NhYmxlU3RhdGUuQWR2YW5jZWQpXQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgZ2xvYmFsOjpTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mbyBDdWx0dXJlIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlQ3VsdHVyZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VDdWx0dXJlID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01hcmt1cFNpbXBsaWZpZXJBcHAvUHJvcGVydGllcy9SZXNvdXJjZXMucmVzeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWFya3VwU2ltcGxpZmllckFwcC9Qcm9wZXJ0aWVzL1Jlc291cmNlcy5yZXN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmN2RiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01hcmt1cFNpbXBsaWZpZXJBcHAvUHJvcGVydGllcy9SZXNvdXJjZXMucmVzeApAQCAtMCwwICsxLDExNyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxyb290PgorICA8IS0tIAorICAgIE1pY3Jvc29mdCBSZXNYIFNjaGVtYSAKKyAgICAKKyAgICBWZXJzaW9uIDIuMAorICAgIAorICAgIFRoZSBwcmltYXJ5IGdvYWxzIG9mIHRoaXMgZm9ybWF0IGlzIHRvIGFsbG93IGEgc2ltcGxlIFhNTCBmb3JtYXQgCisgICAgdGhhdCBpcyBtb3N0bHkgaHVtYW4gcmVhZGFibGUuIFRoZSBnZW5lcmF0aW9uIGFuZCBwYXJzaW5nIG9mIHRoZSAKKyAgICB2YXJpb3VzIGRhdGEgdHlwZXMgYXJlIGRvbmUgdGhyb3VnaCB0aGUgVHlwZUNvbnZlcnRlciBjbGFzc2VzIAorICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0eXBlcy4KKyAgICAKKyAgICBFeGFtcGxlOgorICAgIAorICAgIC4uLiBhZG8ubmV0L1hNTCBoZWFkZXJzICYgc2NoZW1hIC4uLgorICAgIDxyZXNoZWFkZXIgbmFtZT0icmVzbWltZXR5cGUiPnRleHQvbWljcm9zb2Z0LXJlc3g8L3Jlc2hlYWRlcj4KKyAgICA8cmVzaGVhZGVyIG5hbWU9InZlcnNpb24iPjIuMDwvcmVzaGVhZGVyPgorICAgIDxyZXNoZWFkZXIgbmFtZT0icmVhZGVyIj5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVJlYWRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIC4uLjwvcmVzaGVhZGVyPgorICAgIDxyZXNoZWFkZXIgbmFtZT0id3JpdGVyIj5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVdyaXRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIC4uLjwvcmVzaGVhZGVyPgorICAgIDxkYXRhIG5hbWU9Ik5hbWUxIj48dmFsdWU+dGhpcyBpcyBteSBsb25nIHN0cmluZzwvdmFsdWU+PGNvbW1lbnQ+dGhpcyBpcyBhIGNvbW1lbnQ8L2NvbW1lbnQ+PC9kYXRhPgorICAgIDxkYXRhIG5hbWU9IkNvbG9yMSIgdHlwZT0iU3lzdGVtLkRyYXdpbmcuQ29sb3IsIFN5c3RlbS5EcmF3aW5nIj5CbHVlPC9kYXRhPgorICAgIDxkYXRhIG5hbWU9IkJpdG1hcDEiIG1pbWV0eXBlPSJhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJpbmFyeS5iYXNlNjQiPgorICAgICAgICA8dmFsdWU+W2Jhc2U2NCBtaW1lIGVuY29kZWQgc2VyaWFsaXplZCAuTkVUIEZyYW1ld29yayBvYmplY3RdPC92YWx1ZT4KKyAgICA8L2RhdGE+CisgICAgPGRhdGEgbmFtZT0iSWNvbjEiIHR5cGU9IlN5c3RlbS5EcmF3aW5nLkljb24sIFN5c3RlbS5EcmF3aW5nIiBtaW1ldHlwZT0iYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5ieXRlYXJyYXkuYmFzZTY0Ij4KKyAgICAgICAgPHZhbHVlPltiYXNlNjQgbWltZSBlbmNvZGVkIHN0cmluZyByZXByZXNlbnRpbmcgYSBieXRlIGFycmF5IGZvcm0gb2YgdGhlIC5ORVQgRnJhbWV3b3JrIG9iamVjdF08L3ZhbHVlPgorICAgICAgICA8Y29tbWVudD5UaGlzIGlzIGEgY29tbWVudDwvY29tbWVudD4KKyAgICA8L2RhdGE+CisgICAgICAgICAgICAgICAgCisgICAgVGhlcmUgYXJlIGFueSBudW1iZXIgb2YgInJlc2hlYWRlciIgcm93cyB0aGF0IGNvbnRhaW4gc2ltcGxlIAorICAgIG5hbWUvdmFsdWUgcGFpcnMuCisgICAgCisgICAgRWFjaCBkYXRhIHJvdyBjb250YWlucyBhIG5hbWUsIGFuZCB2YWx1ZS4gVGhlIHJvdyBhbHNvIGNvbnRhaW5zIGEgCisgICAgdHlwZSBvciBtaW1ldHlwZS4gVHlwZSBjb3JyZXNwb25kcyB0byBhIC5ORVQgY2xhc3MgdGhhdCBzdXBwb3J0IAorICAgIHRleHQvdmFsdWUgY29udmVyc2lvbiB0aHJvdWdoIHRoZSBUeXBlQ29udmVydGVyIGFyY2hpdGVjdHVyZS4gCisgICAgQ2xhc3NlcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhpcyBhcmUgc2VyaWFsaXplZCBhbmQgc3RvcmVkIHdpdGggdGhlIAorICAgIG1pbWV0eXBlIHNldC4KKyAgICAKKyAgICBUaGUgbWltZXR5cGUgaXMgdXNlZCBmb3Igc2VyaWFsaXplZCBvYmplY3RzLCBhbmQgdGVsbHMgdGhlIAorICAgIFJlc1hSZXNvdXJjZVJlYWRlciBob3cgdG8gZGVwZXJzaXN0IHRoZSBvYmplY3QuIFRoaXMgaXMgY3VycmVudGx5IG5vdCAKKyAgICBleHRlbnNpYmxlLiBGb3IgYSBnaXZlbiBtaW1ldHlwZSB0aGUgdmFsdWUgbXVzdCBiZSBzZXQgYWNjb3JkaW5nbHk6CisgICAgCisgICAgTm90ZSAtIGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYmluYXJ5LmJhc2U2NCBpcyB0aGUgZm9ybWF0IAorICAgIHRoYXQgdGhlIFJlc1hSZXNvdXJjZVdyaXRlciB3aWxsIGdlbmVyYXRlLCBob3dldmVyIHRoZSByZWFkZXIgY2FuIAorICAgIHJlYWQgYW55IG9mIHRoZSBmb3JtYXRzIGxpc3RlZCBiZWxvdy4KKyAgICAKKyAgICBtaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5iaW5hcnkuYmFzZTY0CisgICAgdmFsdWUgICA6IFRoZSBvYmplY3QgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggCisgICAgICAgICAgICA6IFN5c3RlbS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuQmluYXJ5LkJpbmFyeUZvcm1hdHRlcgorICAgICAgICAgICAgOiBhbmQgdGhlbiBlbmNvZGVkIHdpdGggYmFzZTY0IGVuY29kaW5nLgorICAgIAorICAgIG1pbWV0eXBlOiBhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LnNvYXAuYmFzZTY0CisgICAgdmFsdWUgICA6IFRoZSBvYmplY3QgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggCisgICAgICAgICAgICA6IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5Tb2FwLlNvYXBGb3JtYXR0ZXIKKyAgICAgICAgICAgIDogYW5kIHRoZW4gZW5jb2RlZCB3aXRoIGJhc2U2NCBlbmNvZGluZy4KKworICAgIG1pbWV0eXBlOiBhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJ5dGVhcnJheS5iYXNlNjQKKyAgICB2YWx1ZSAgIDogVGhlIG9iamVjdCBtdXN0IGJlIHNlcmlhbGl6ZWQgaW50byBhIGJ5dGUgYXJyYXkgCisgICAgICAgICAgICA6IHVzaW5nIGEgU3lzdGVtLkNvbXBvbmVudE1vZGVsLlR5cGVDb252ZXJ0ZXIKKyAgICAgICAgICAgIDogYW5kIHRoZW4gZW5jb2RlZCB3aXRoIGJhc2U2NCBlbmNvZGluZy4KKyAgICAtLT4KKyAgPHhzZDpzY2hlbWEgaWQ9InJvb3QiIHhtbG5zPSIiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9vdCIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSI+CisgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICA8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGFkYXRhIj4KKyAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+CisgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaW1ldHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KKyAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5Ij4KKyAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsaWFzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgorICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YSI+CisgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KKyAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWVudCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMiIgLz4KKyAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1zZGF0YTpPcmRpbmFsPSIxIiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtc2RhdGE6T3JkaW5hbD0iMyIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWltZXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1zZGF0YTpPcmRpbmFsPSI0IiAvPgorICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzaGVhZGVyIj4KKyAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1zZGF0YTpPcmRpbmFsPSIxIiAvPgorICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDwveHNkOmVsZW1lbnQ+CisgIDwveHNkOnNjaGVtYT4KKyAgPHJlc2hlYWRlciBuYW1lPSJyZXNtaW1ldHlwZSI+CisgICAgPHZhbHVlPnRleHQvbWljcm9zb2Z0LXJlc3g8L3ZhbHVlPgorICA8L3Jlc2hlYWRlcj4KKyAgPHJlc2hlYWRlciBuYW1lPSJ2ZXJzaW9uIj4KKyAgICA8dmFsdWU+Mi4wPC92YWx1ZT4KKyAgPC9yZXNoZWFkZXI+CisgIDxyZXNoZWFkZXIgbmFtZT0icmVhZGVyIj4KKyAgICA8dmFsdWU+U3lzdGVtLlJlc291cmNlcy5SZXNYUmVzb3VyY2VSZWFkZXIsIFN5c3RlbS5XaW5kb3dzLkZvcm1zLCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OTwvdmFsdWU+CisgIDwvcmVzaGVhZGVyPgorICA8cmVzaGVhZGVyIG5hbWU9IndyaXRlciI+CisgICAgPHZhbHVlPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlV3JpdGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODk8L3ZhbHVlPgorICA8L3Jlc2hlYWRlcj4KKzwvcm9vdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01hcmt1cFNpbXBsaWZpZXJBcHAvUHJvcGVydGllcy9TZXR0aW5ncy5EZXNpZ25lci5jcyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWFya3VwU2ltcGxpZmllckFwcC9Qcm9wZXJ0aWVzL1NldHRpbmdzLkRlc2lnbmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTAwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01hcmt1cFNpbXBsaWZpZXJBcHAvUHJvcGVydGllcy9TZXR0aW5ncy5EZXNpZ25lci5jcwpAQCAtMCwwICsxLDMwIEBACivvu78vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gPGF1dG8tZ2VuZXJhdGVkPgorLy8gICAgIFRoaXMgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgdG9vbC4KKy8vICAgICBSdW50aW1lIFZlcnNpb246NC4wLjMwMzE5LjE4MDMzCisvLworLy8gICAgIENoYW5nZXMgdG8gdGhpcyBmaWxlIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZgorLy8gICAgIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLgorLy8gPC9hdXRvLWdlbmVyYXRlZD4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSBNYXJrdXBTaW1wbGlmaWVyQXBwLlByb3BlcnRpZXMKK3sKKworCisgICAgW2dsb2JhbDo6U3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlcy5Db21waWxlckdlbmVyYXRlZEF0dHJpYnV0ZSgpXQorICAgIFtnbG9iYWw6OlN5c3RlbS5Db2RlRG9tLkNvbXBpbGVyLkdlbmVyYXRlZENvZGVBdHRyaWJ1dGUoIk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uRWRpdG9ycy5TZXR0aW5nc0Rlc2lnbmVyLlNldHRpbmdzU2luZ2xlRmlsZUdlbmVyYXRvciIsICIxMS4wLjAuMCIpXQorICAgIGludGVybmFsIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFNldHRpbmdzIDogZ2xvYmFsOjpTeXN0ZW0uQ29uZmlndXJhdGlvbi5BcHBsaWNhdGlvblNldHRpbmdzQmFzZQorICAgIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBTZXR0aW5ncyBkZWZhdWx0SW5zdGFuY2UgPSAoKFNldHRpbmdzKShnbG9iYWw6OlN5c3RlbS5Db25maWd1cmF0aW9uLkFwcGxpY2F0aW9uU2V0dGluZ3NCYXNlLlN5bmNocm9uaXplZChuZXcgU2V0dGluZ3MoKSkpKTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFNldHRpbmdzIERlZmF1bHQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWV0cmljc0dldHRlcjAxL0NvbnRlbnRDb250cm9scy5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NZXRyaWNzR2V0dGVyMDEvQ29udGVudENvbnRyb2xzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwMGVlZAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWV0cmljc0dldHRlcjAxL0NvbnRlbnRDb250cm9scy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWV0cmljc0dldHRlcjAxL01ldHJpY3NHZXR0ZXIwMS5jcyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWV0cmljc0dldHRlcjAxL01ldHJpY3NHZXR0ZXIwMS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGYxZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NZXRyaWNzR2V0dGVyMDEvTWV0cmljc0dldHRlcjAxLmNzCkBAIC0wLDAgKzEsNjAgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7CisKK25hbWVzcGFjZSBPcGVuWG1sUG93ZXJUb29scworeworICAgIGNsYXNzIE1ldHJpY3NHZXR0ZXIwMQorICAgIHsKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBNZXRyaWNzR2V0dGVyU2V0dGluZ3Mgc2V0dGluZ3MgPSBudWxsOworICAgICAgICAgICAgRmlsZUluZm8gZmkgPSBudWxsOworCisgICAgICAgICAgICBmaSA9IG5ldyBGaWxlSW5mbygiLi4vLi4vQ29udGVudENvbnRyb2xzLmRvY3giKTsKKyAgICAgICAgICAgIHNldHRpbmdzID0gbmV3IE1ldHJpY3NHZXR0ZXJTZXR0aW5ncygpOworICAgICAgICAgICAgc2V0dGluZ3MuSW5jbHVkZVRleHRJbkNvbnRlbnRDb250cm9scyA9IGZhbHNlOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIj09PT09PT09PT09PT09IE5vIHRleHQgZnJvbSBjb250ZW50IGNvbnRyb2xzID09PT09PT09PT09PT09Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShmaS5GdWxsTmFtZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShNZXRyaWNzR2V0dGVyLkdldE1ldHJpY3MoZmkuRnVsbE5hbWUsIHNldHRpbmdzKSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworCisgICAgICAgICAgICBmaSA9IG5ldyBGaWxlSW5mbygiLi4vLi4vQ29udGVudENvbnRyb2xzLmRvY3giKTsKKyAgICAgICAgICAgIHNldHRpbmdzID0gbmV3IE1ldHJpY3NHZXR0ZXJTZXR0aW5ncygpOworICAgICAgICAgICAgc2V0dGluZ3MuSW5jbHVkZVRleHRJbkNvbnRlbnRDb250cm9scyA9IHRydWU7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiPT09PT09PT09PT09PT0gV2l0aCB0ZXh0IGZyb20gY29udGVudCBjb250cm9scyA9PT09PT09PT09PT09PSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZmkuRnVsbE5hbWUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoTWV0cmljc0dldHRlci5HZXRNZXRyaWNzKGZpLkZ1bGxOYW1lLCBzZXR0aW5ncykpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKworICAgICAgICAgICAgZmkgPSBuZXcgRmlsZUluZm8oIi4uLy4uL1RyYWNrZWRSZXZpc2lvbnMuZG9jeCIpOworICAgICAgICAgICAgc2V0dGluZ3MgPSBuZXcgTWV0cmljc0dldHRlclNldHRpbmdzKCk7CisgICAgICAgICAgICBzZXR0aW5ncy5JbmNsdWRlVGV4dEluQ29udGVudENvbnRyb2xzID0gdHJ1ZTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCI9PT09PT09PT09PT09PSBUcmFja2VkIFJldmlzaW9ucyA9PT09PT09PT09PT09PSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZmkuRnVsbE5hbWUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoTWV0cmljc0dldHRlci5HZXRNZXRyaWNzKGZpLkZ1bGxOYW1lLCBzZXR0aW5ncykpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKworICAgICAgICAgICAgZmkgPSBuZXcgRmlsZUluZm8oIi4uLy4uL1N0eWxlcy5kb2N4Iik7CisgICAgICAgICAgICBzZXR0aW5ncyA9IG5ldyBNZXRyaWNzR2V0dGVyU2V0dGluZ3MoKTsKKyAgICAgICAgICAgIHNldHRpbmdzLkluY2x1ZGVUZXh0SW5Db250ZW50Q29udHJvbHMgPSBmYWxzZTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCI9PT09PT09PT09PT09PSBTdHlsZSBIaWVyYXJjaHkgPT09PT09PT09PT09PT0iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGZpLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKE1ldHJpY3NHZXR0ZXIuR2V0TWV0cmljcyhmaS5GdWxsTmFtZSwgc2V0dGluZ3MpKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisKKyAgICAgICAgICAgIGZpID0gbmV3IEZpbGVJbmZvKCIuLi8uLi9UYWJsZXMueGxzeCIpOworICAgICAgICAgICAgc2V0dGluZ3MgPSBuZXcgTWV0cmljc0dldHRlclNldHRpbmdzKCk7CisgICAgICAgICAgICBzZXR0aW5ncy5JbmNsdWRlVGV4dEluQ29udGVudENvbnRyb2xzID0gZmFsc2U7CisgICAgICAgICAgICBzZXR0aW5ncy5JbmNsdWRlWGxzeFRhYmxlQ2VsbERhdGEgPSB0cnVlOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIj09PT09PT09PT09PT09IFNwcmVhZHNoZWV0IFRhYmxlcyA9PT09PT09PT09PT09PSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZmkuRnVsbE5hbWUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoTWV0cmljc0dldHRlci5HZXRNZXRyaWNzKGZpLkZ1bGxOYW1lLCBzZXR0aW5ncykpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWV0cmljc0dldHRlcjAxL01ldHJpY3NHZXR0ZXIwMS5jc3Byb2ogYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01ldHJpY3NHZXR0ZXIwMS9NZXRyaWNzR2V0dGVyMDEuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzk0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01ldHJpY3NHZXR0ZXIwMS9NZXRyaWNzR2V0dGVyMDEuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NZXRyaWNzR2V0dGVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NZXRyaWNzR2V0dGVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODgxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL01ldHJpY3NHZXR0ZXIwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKQEAgLTAsMCArMSwzIEBACitFeGFtcGxlIG91dHB1dCBmaWxlcyBhcmUgaW4gYSBEYXRlVGltZSBzdGFtcGVkIGRpcmVjdG9yeSBpbiAuL2Jpbi9kZWJ1Zy4gIFRoZSBkaXJlY3RvcnkgbmFtZSBpcyBFeGFtcGxlT3V0cHV0LXl5LW1tLWRkLWhobW1zcy4KKworSWYgeW91IGFyZSBidWlsZGluZyBpbiByZWxlYXNlIG1vZGUsIHRoZXkgd2lsbCwgb2YgY291cnNlLCBiZSBpbiAuL2Jpbi9yZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWV0cmljc0dldHRlcjAxL1N0eWxlcy5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NZXRyaWNzR2V0dGVyMDEvU3R5bGVzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzNzE4NgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWV0cmljc0dldHRlcjAxL1N0eWxlcy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWV0cmljc0dldHRlcjAxL1RhYmxlcy54bHN4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NZXRyaWNzR2V0dGVyMDEvVGFibGVzLnhsc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhMzZjZAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWV0cmljc0dldHRlcjAxL1RhYmxlcy54bHN4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWV0cmljc0dldHRlcjAxL1RyYWNrZWRSZXZpc2lvbnMuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvTWV0cmljc0dldHRlcjAxL1RyYWNrZWRSZXZpc2lvbnMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTYzZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9NZXRyaWNzR2V0dGVyMDEvVHJhY2tlZFJldmlzaW9ucy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvT3BlblhtbFJlZ2V4MDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9PcGVuWG1sUmVnZXgwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4ODFjMQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvT3BlblhtbFJlZ2V4MDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0CkBAIC0wLDAgKzEsMyBAQAorRXhhbXBsZSBvdXRwdXQgZmlsZXMgYXJlIGluIGEgRGF0ZVRpbWUgc3RhbXBlZCBkaXJlY3RvcnkgaW4gLi9iaW4vZGVidWcuICBUaGUgZGlyZWN0b3J5IG5hbWUgaXMgRXhhbXBsZU91dHB1dC15eS1tbS1kZC1oaG1tc3MuCisKK0lmIHlvdSBhcmUgYnVpbGRpbmcgaW4gcmVsZWFzZSBtb2RlLCB0aGV5IHdpbGwsIG9mIGNvdXJzZSwgYmUgaW4gLi9iaW4vcmVsZWFzZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL09wZW5YbWxSZWdleDAxL09wZW5YbWxSZWdleDAxLmNzIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9PcGVuWG1sUmVnZXgwMS9PcGVuWG1sUmVnZXgwMS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQ4ODVjCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9PcGVuWG1sUmVnZXgwMS9PcGVuWG1sUmVnZXgwMS5jcwpAQCAtMCwwICsxLDIzOCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7CisKK25hbWVzcGFjZSBPcGVuWG1sUmVnZXgwMQoreworICAgIHB1YmxpYyBjbGFzcyBPcGVuWG1sUmVnZXhFeGFtcGxlCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBEYXRlVGltZSBuID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgdmFyIHRlbXBEaSA9IG5ldyBEaXJlY3RvcnlJbmZvKAorICAgICAgICAgICAgICAgICQiRXhhbXBsZU91dHB1dC17bi5ZZWFyIC0gMjAwMDowMH0te24uTW9udGg6MDB9LXtuLkRheTowMH0te24uSG91cjowMH17bi5NaW51dGU6MDB9e24uU2Vjb25kOjAwfSIpOworICAgICAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgICAgICB2YXIgc291cmNlRG9jID0gbmV3IEZpbGVJbmZvKCIuLi8uLi9UZXN0RG9jdW1lbnQuZG9jeCIpOworICAgICAgICAgICAgdmFyIG5ld0RvYyA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiTW9kaWZpZWQuZG9jeCIpKTsKKyAgICAgICAgICAgIEZpbGUuQ29weShzb3VyY2VEb2MuRnVsbE5hbWUsIG5ld0RvYy5GdWxsTmFtZSk7CisgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG5ld0RvYy5GdWxsTmFtZSwgdHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWERvY3VtZW50IHhEb2MgPSB3RG9jLk1haW5Eb2N1bWVudFBhcnQuR2V0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgICAgICAvLyBNYXRjaCBjb250ZW50IChwYXJhZ3JhcGggMSkKKyAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTxYRWxlbWVudD4gY29udGVudCA9IHhEb2MuRGVzY2VuZGFudHMoVy5wKS5UYWtlKDEpOworICAgICAgICAgICAgICAgIHZhciByZWdleCA9IG5ldyBSZWdleCgiVmlkZW8iKTsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBPcGVuWG1sUmVnZXguTWF0Y2goY29udGVudCwgcmVnZXgpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGFtcGxlICMxIENvdW50OiB7MH0iLCBjb3VudCk7CisKKyAgICAgICAgICAgICAgICAvLyBNYXRjaCBjb250ZW50LCBjYXNlIGluc2Vuc2l0aXZlIChwYXJhZ3JhcGggMSkKKyAgICAgICAgICAgICAgICBjb250ZW50ID0geERvYy5EZXNjZW5kYW50cyhXLnApLlRha2UoMSk7CisgICAgICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnZXgoInZpZGVvIiwgUmVnZXhPcHRpb25zLklnbm9yZUNhc2UpOworICAgICAgICAgICAgICAgIGNvdW50ID0gT3BlblhtbFJlZ2V4Lk1hdGNoKGNvbnRlbnQsIHJlZ2V4KTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhhbXBsZSAjMiBDb3VudDogezB9IiwgY291bnQpOworCisgICAgICAgICAgICAgICAgLy8gTWF0Y2ggY29udGVudCwgd2l0aCBjYWxsYmFjayAocGFyYWdyYXBoIDEpCisgICAgICAgICAgICAgICAgY29udGVudCA9IHhEb2MuRGVzY2VuZGFudHMoVy5wKS5UYWtlKDEpOworICAgICAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ2V4KCJ2aWRlbyIsIFJlZ2V4T3B0aW9ucy5JZ25vcmVDYXNlKTsKKyAgICAgICAgICAgICAgICBPcGVuWG1sUmVnZXguTWF0Y2goY29udGVudCwgcmVnZXgsIChlbGVtZW50LCBtYXRjaCkgPT4KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4YW1wbGUgIzMgRm91bmQgdmFsdWU6ID57MH08IiwgbWF0Y2guVmFsdWUpKTsKKworICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgY29udGVudCwgYmVnaW5uaW5nIG9mIHBhcmFncmFwaCAocGFyYWdyYXBoIDIpCisgICAgICAgICAgICAgICAgY29udGVudCA9IHhEb2MuRGVzY2VuZGFudHMoVy5wKS5Ta2lwKDEpLlRha2UoMSk7CisgICAgICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnZXgoIl5WaWRlbyBwcm92aWRlcyIpOworICAgICAgICAgICAgICAgIGNvdW50ID0gT3BlblhtbFJlZ2V4LlJlcGxhY2UoY29udGVudCwgcmVnZXgsICJBdWRpbyBnaXZlcyIsIG51bGwpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGFtcGxlICM0IFJlcGxhY2VkOiB7MH0iLCBjb3VudCk7CisKKyAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGNvbnRlbnQsIG1pZGRsZSBvZiBwYXJhZ3JhcGggKHBhcmFncmFwaCAzKQorICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB4RG9jLkRlc2NlbmRhbnRzKFcucCkuU2tpcCgyKS5UYWtlKDEpOworICAgICAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ2V4KCJwb3dlcmZ1bCIpOworICAgICAgICAgICAgICAgIGNvdW50ID0gT3BlblhtbFJlZ2V4LlJlcGxhY2UoY29udGVudCwgcmVnZXgsICJnb29kIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4YW1wbGUgIzUgUmVwbGFjZWQ6IHswfSIsIGNvdW50KTsKKworICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgY29udGVudCwgZW5kIG9mIHBhcmFncmFwaCAocGFyYWdyYXBoIDQpCisgICAgICAgICAgICAgICAgY29udGVudCA9IHhEb2MuRGVzY2VuZGFudHMoVy5wKS5Ta2lwKDMpLlRha2UoMSk7CisgICAgICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnZXgoIiBbYS16Ll0qJCIpOworICAgICAgICAgICAgICAgIGNvdW50ID0gT3BlblhtbFJlZ2V4LlJlcGxhY2UoY29udGVudCwgcmVnZXgsICIgc3VwZXIgZ29vZCBwb2ludCEiLCBudWxsKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhhbXBsZSAjNiBSZXBsYWNlZDogezB9IiwgY291bnQpOworCisgICAgICAgICAgICAgICAgLy8gRGVsZXRlIGNvbnRlbnQsIGJlZ2lubmluZyBvZiBwYXJhZ3JhcGggKHBhcmFncmFwaCA1KQorICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB4RG9jLkRlc2NlbmRhbnRzKFcucCkuU2tpcCg0KS5UYWtlKDEpOworICAgICAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ2V4KCJeVmlkZW8gcHJvdmlkZXMiKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IE9wZW5YbWxSZWdleC5SZXBsYWNlKGNvbnRlbnQsIHJlZ2V4LCAiIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4YW1wbGUgIzcgRGVsZXRlZDogezB9IiwgY291bnQpOworCisgICAgICAgICAgICAgICAgLy8gRGVsZXRlIGNvbnRlbnQsIG1pZGRsZSBvZiBwYXJhZ3JhcGggKHBhcmFncmFwaCA2KQorICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB4RG9jLkRlc2NlbmRhbnRzKFcucCkuU2tpcCg1KS5UYWtlKDEpOworICAgICAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ2V4KCJwb3dlcmZ1bCAiKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IE9wZW5YbWxSZWdleC5SZXBsYWNlKGNvbnRlbnQsIHJlZ2V4LCAiIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4YW1wbGUgIzggRGVsZXRlZDogezB9IiwgY291bnQpOworCisgICAgICAgICAgICAgICAgLy8gRGVsZXRlIGNvbnRlbnQsIGVuZCBvZiBwYXJhZ3JhcGggKHBhcmFncmFwaCA3KQorICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB4RG9jLkRlc2NlbmRhbnRzKFcucCkuU2tpcCg2KS5UYWtlKDEpOworICAgICAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ2V4KCJbLl0kIik7CisgICAgICAgICAgICAgICAgY291bnQgPSBPcGVuWG1sUmVnZXguUmVwbGFjZShjb250ZW50LCByZWdleCwgIiIsIG51bGwpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGFtcGxlICM5IERlbGV0ZWQ6IHswfSIsIGNvdW50KTsKKworICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgY29udGVudCBpbiBpbnNlcnRlZCB0ZXh0LCBzYW1lIGF1dGhvciAocGFyYWdyYXBoIDgpCisgICAgICAgICAgICAgICAgY29udGVudCA9IHhEb2MuRGVzY2VuZGFudHMoVy5wKS5Ta2lwKDcpLlRha2UoMSk7CisgICAgICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnZXgoIlZpZGVvIik7CisgICAgICAgICAgICAgICAgY291bnQgPSBPcGVuWG1sUmVnZXguUmVwbGFjZShjb250ZW50LCByZWdleCwgIkF1ZGlvIiwgbnVsbCwgdHJ1ZSwgIkVyaWMgV2hpdGUiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhhbXBsZSAjMTAgRGVsZXRlZDogezB9IiwgY291bnQpOworCisgICAgICAgICAgICAgICAgLy8gRGVsZXRlIGNvbnRlbnQgaW4gaW5zZXJ0ZWQgdGV4dCwgc2FtZSBhdXRob3IgKHBhcmFncmFwaCA5KQorICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB4RG9jLkRlc2NlbmRhbnRzKFcucCkuU2tpcCg4KS5UYWtlKDEpOworICAgICAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ2V4KCJwb3dlcmZ1bCAiKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IE9wZW5YbWxSZWdleC5SZXBsYWNlKGNvbnRlbnQsIHJlZ2V4LCAiIiwgbnVsbCwgdHJ1ZSwgIkVyaWMgV2hpdGUiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhhbXBsZSAjMTEgRGVsZXRlZDogezB9IiwgY291bnQpOworCisgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBjb250ZW50IHBhcnRpYWxseSBpbiBpbnNlcnRlZCB0ZXh0LCBzYW1lIGF1dGhvciAocGFyYWdyYXBoIDEwKQorICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB4RG9jLkRlc2NlbmRhbnRzKFcucCkuU2tpcCg5KS5UYWtlKDEpOworICAgICAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ2V4KCJWaWRlbyBwcm92aWRlcyAiKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IE9wZW5YbWxSZWdleC5SZXBsYWNlKGNvbnRlbnQsIHJlZ2V4LCAiQXVkaW8gZ2l2ZXMgIiwgbnVsbCwgdHJ1ZSwgIkVyaWMgV2hpdGUiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhhbXBsZSAjMTIgUmVwbGFjZWQ6IHswfSIsIGNvdW50KTsKKworICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBjb250ZW50IHBhcnRpYWxseSBpbiBpbnNlcnRlZCB0ZXh0LCBzYW1lIGF1dGhvciAocGFyYWdyYXBoIDExKQorICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB4RG9jLkRlc2NlbmRhbnRzKFcucCkuU2tpcCgxMCkuVGFrZSgxKTsKKyAgICAgICAgICAgICAgICByZWdleCA9IG5ldyBSZWdleCgiIHRvIGhlbHAgeW91IHByb3ZlIHlvdXIgcG9pbnQiKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IE9wZW5YbWxSZWdleC5SZXBsYWNlKGNvbnRlbnQsIHJlZ2V4LCAiIiwgbnVsbCwgdHJ1ZSwgIkVyaWMgV2hpdGUiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhhbXBsZSAjMTMgRGVsZXRlZDogezB9IiwgY291bnQpOworCisgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBjb250ZW50IGluIGluc2VydGVkIHRleHQsIGRpZmZlcmVudCBhdXRob3IgKHBhcmFncmFwaCAxMikKKyAgICAgICAgICAgICAgICBjb250ZW50ID0geERvYy5EZXNjZW5kYW50cyhXLnApLlNraXAoMTEpLlRha2UoMSk7CisgICAgICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnZXgoIlZpZGVvIik7CisgICAgICAgICAgICAgICAgY291bnQgPSBPcGVuWG1sUmVnZXguUmVwbGFjZShjb250ZW50LCByZWdleCwgIkF1ZGlvIiwgbnVsbCwgdHJ1ZSwgIkpvaG4gRG9lIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4YW1wbGUgIzE0IERlbGV0ZWQ6IHswfSIsIGNvdW50KTsKKworICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBjb250ZW50IGluIGluc2VydGVkIHRleHQsIGRpZmZlcmVudCBhdXRob3IgKHBhcmFncmFwaCAxMykKKyAgICAgICAgICAgICAgICBjb250ZW50ID0geERvYy5EZXNjZW5kYW50cyhXLnApLlNraXAoMTIpLlRha2UoMSk7CisgICAgICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnZXgoInBvd2VyZnVsICIpOworICAgICAgICAgICAgICAgIGNvdW50ID0gT3BlblhtbFJlZ2V4LlJlcGxhY2UoY29udGVudCwgcmVnZXgsICIiLCBudWxsLCB0cnVlLCAiSm9obiBEb2UiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhhbXBsZSAjMTUgRGVsZXRlZDogezB9IiwgY291bnQpOworCisgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBjb250ZW50IHBhcnRpYWxseSBpbiBpbnNlcnRlZCB0ZXh0LCBkaWZmZXJlbnQgYXV0aG9yIChwYXJhZ3JhcGggMTQpCisgICAgICAgICAgICAgICAgY29udGVudCA9IHhEb2MuRGVzY2VuZGFudHMoVy5wKS5Ta2lwKDEzKS5UYWtlKDEpOworICAgICAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ2V4KCJWaWRlbyBwcm92aWRlcyAiKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IE9wZW5YbWxSZWdleC5SZXBsYWNlKGNvbnRlbnQsIHJlZ2V4LCAiQXVkaW8gZ2l2ZXMgIiwgbnVsbCwgdHJ1ZSwgIkpvaG4gRG9lIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4YW1wbGUgIzE2IFJlcGxhY2VkOiB7MH0iLCBjb3VudCk7CisKKyAgICAgICAgICAgICAgICAvLyBEZWxldGUgY29udGVudCBwYXJ0aWFsbHkgaW4gaW5zZXJ0ZWQgdGV4dCwgZGlmZmVyZW50IGF1dGhvciAocGFyYWdyYXBoIDE1KQorICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB4RG9jLkRlc2NlbmRhbnRzKFcucCkuU2tpcCgxNCkuVGFrZSgxKTsKKyAgICAgICAgICAgICAgICByZWdleCA9IG5ldyBSZWdleCgiIHRvIGhlbHAgeW91IHByb3ZlIHlvdXIgcG9pbnQiKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IE9wZW5YbWxSZWdleC5SZXBsYWNlKGNvbnRlbnQsIHJlZ2V4LCAiIiwgbnVsbCwgdHJ1ZSwgIkpvaG4gRG9lIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4YW1wbGUgIzE3IERlbGV0ZWQ6IHswfSIsIGNvdW50KTsKKworICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyBsZWZ0RG91YmxlUXVvdGF0aW9uTWFya3MgPSBAIltcdTAwMjLigJzigJ7Cq8K74oCdXSI7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHdvcmRzID0gQCJbXHdcLSYvXSsoPzpcc1tcd1wtJi9dKykqIjsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcgcmlnaHREb3VibGVRdW90YXRpb25NYXJrcyA9IEAiW1x1MDAyMuKAneKAn8K7wqvigJxdIjsKKworICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgY29udGVudCB1c2luZyByZXBsYWNlbWVudCBwYXR0ZXJuIChwYXJhZ3JhcGggMTYpCisgICAgICAgICAgICAgICAgY29udGVudCA9IHhEb2MuRGVzY2VuZGFudHMoVy5wKS5Ta2lwKDE1KS5UYWtlKDEpOworICAgICAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ2V4KCQie2xlZnREb3VibGVRdW90YXRpb25NYXJrc30oPzx3b3Jkcz57d29yZHN9KXtyaWdodERvdWJsZVF1b3RhdGlvbk1hcmtzfSIpOworICAgICAgICAgICAgICAgIGNvdW50ID0gT3BlblhtbFJlZ2V4LlJlcGxhY2UoY29udGVudCwgcmVnZXgsICLigJgke3dvcmRzfeKAmSIsIG51bGwpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGFtcGxlICMxOCBSZXBsYWNlZDogezB9IiwgY291bnQpOworCisgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBjb250ZW50IHVzaW5nIHJlcGxhY2VtZW50IHBhdHRlcm4gaW4gcGFydGlhbGx5IGluc2VydGVkIHRleHQgKHBhcmFncmFwaCAxNykKKyAgICAgICAgICAgICAgICBjb250ZW50ID0geERvYy5EZXNjZW5kYW50cyhXLnApLlNraXAoMTYpLlRha2UoMSk7CisgICAgICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnZXgoJCJ7bGVmdERvdWJsZVF1b3RhdGlvbk1hcmtzfSg/PHdvcmRzPnt3b3Jkc30pe3JpZ2h0RG91YmxlUXVvdGF0aW9uTWFya3N9Iik7CisgICAgICAgICAgICAgICAgY291bnQgPSBPcGVuWG1sUmVnZXguUmVwbGFjZShjb250ZW50LCByZWdleCwgIuKAmCR7d29yZHN94oCZIiwgbnVsbCwgdHJ1ZSwgIkpvaG4gRG9lIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4YW1wbGUgIzE5IFJlcGxhY2VkOiB7MH0iLCBjb3VudCk7CisKKyAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGNvbnRlbnQgdXNpbmcgcmVwbGFjZW1lbnQgcGF0dGVybiAocGFyYWdyYXBoIDE4KQorICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB4RG9jLkRlc2NlbmRhbnRzKFcucCkuU2tpcCgxNykuVGFrZSgxKTsKKyAgICAgICAgICAgICAgICByZWdleCA9IG5ldyBSZWdleCgkIih7bGVmdERvdWJsZVF1b3RhdGlvbk1hcmtzfSkodmlkZW8pKHtyaWdodERvdWJsZVF1b3RhdGlvbk1hcmtzfSkiKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IE9wZW5YbWxSZWdleC5SZXBsYWNlKGNvbnRlbnQsIHJlZ2V4LCAiJDFhdWRpbyQzIiwgbnVsbCwgdHJ1ZSwgIkpvaG4gRG9lIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4YW1wbGUgIzIwIFJlcGxhY2VkOiB7MH0iLCBjb3VudCk7CisKKyAgICAgICAgICAgICAgICAvLyBSZWNvZ25pemUgdGFicyAocGFyYWdyYXBoIDE5KQorICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB4RG9jLkRlc2NlbmRhbnRzKFcucCkuU2tpcCgxOCkuVGFrZSgxKTsKKyAgICAgICAgICAgICAgICByZWdleCA9IG5ldyBSZWdleChAIihbMS05XSlcLlx0Iik7CisgICAgICAgICAgICAgICAgY291bnQgPSBPcGVuWG1sUmVnZXguUmVwbGFjZShjb250ZW50LCByZWdleCwgIigkMSlcdCIsIG51bGwpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGFtcGxlICMyMSBSZXBsYWNlZDogezB9IiwgY291bnQpOworCisgICAgICAgICAgICAgICAgLy8gVGhlIG5leHQgdHdvIGV4YW1wbGVzIGRlYWwgd2l0aCBsaW5lIGJyZWFrcywgaS5lLiwgdGhlIDx3OmJyLz4gZWxlbWVudHMuCisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHlvdSBzaG91bGQgdXNlIHRoZSBVKzAwMEQgKENhcnJpYWdlIFJldHVybikgY2hhcmFjdGVyIChpLmUuLCAnXHInKQorICAgICAgICAgICAgICAgIC8vIHRvIG1hdGNoIGEgPHc6YnIvPiAob3IgPHc6Y3IvPikgYW5kIHJlcGxhY2UgY29udGVudCB3aXRoIGEgPHc6YnIvPiBlbGVtZW50LgorICAgICAgICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB5b3VyIHBsYXRmb3JtLCB0aGUgZW5kIG9mIGxpbmUgY2hhcmFjdGVyKHMpIHByb3ZpZGVkIGJ5CisgICAgICAgICAgICAgICAgLy8gRW52aXJvbm1lbnQuTmV3TGluZSBtaWdodCBiZSAiXG4iIChVbml4KSwgIlxyXG4iIChXaW5kb3dzKSwgb3IgIlxyIiAoTWFjKS4KKworICAgICAgICAgICAgICAgIC8vIFJlY29nbml6ZSB0YWJzIGFuZCBpbnNlcnQgbGluZSBicmVha3MgKHBhcmFncmFwaCAyMCkuCisgICAgICAgICAgICAgICAgY29udGVudCA9IHhEb2MuRGVzY2VuZGFudHMoVy5wKS5Ta2lwKDE5KS5UYWtlKDEpOworICAgICAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ2V4KCRAIihbMS05XSlcLntVbmljb2RlTWFwcGVyLkhvcml6b250YWxUYWJ1bGF0aW9ufSIpOworICAgICAgICAgICAgICAgIGNvdW50ID0gT3BlblhtbFJlZ2V4LlJlcGxhY2UoY29udGVudCwgcmVnZXgsICQiQXJ0aWNsZSAkMXtVbmljb2RlTWFwcGVyLkNhcnJpYWdlUmV0dXJufSIsIG51bGwpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGFtcGxlICMyMiBSZXBsYWNlZDogezB9IiwgY291bnQpOworCisgICAgICAgICAgICAgICAgLy8gUmVjb2duaXplIGFuZCByZW1vdmUgbGluZSBicmVha3MgKHBhcmFncmFwaCAyMSkKKyAgICAgICAgICAgICAgICBjb250ZW50ID0geERvYy5EZXNjZW5kYW50cyhXLnApLlNraXAoMjApLlRha2UoMSk7CisgICAgICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnZXgoJCJ7VW5pY29kZU1hcHBlci5DYXJyaWFnZVJldHVybn0iKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IE9wZW5YbWxSZWdleC5SZXBsYWNlKGNvbnRlbnQsIHJlZ2V4LCAiICIsIG51bGwpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGFtcGxlICMyMyBSZXBsYWNlZDogezB9IiwgY291bnQpOworCisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHNvZnQgaHlwaGVucyAocGFyYWdyYXBoIDIyKQorICAgICAgICAgICAgICAgIExpc3Q8WEVsZW1lbnQ+IHBhcmFzID0geERvYy5EZXNjZW5kYW50cyhXLnApLlNraXAoMjEpLlRha2UoMSkuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgY291bnQgPSBPcGVuWG1sUmVnZXguUmVwbGFjZShwYXJhcywgbmV3IFJlZ2V4KCQie1VuaWNvZGVNYXBwZXIuU29mdEh5cGhlbn0iKSwgIiIsIG51bGwpOworICAgICAgICAgICAgICAgIGNvdW50ICs9IE9wZW5YbWxSZWdleC5SZXBsYWNlKHBhcmFzLCBuZXcgUmVnZXgoInVzZSIpLCAibm8gbG9uZ2VyIHVzZSIsIG51bGwpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGFtcGxlICMyNCBSZXBsYWNlZDogezB9IiwgY291bnQpOworCisgICAgICAgICAgICAgICAgLy8gVGhlIG5leHQgZXhhbXBsZSBkZWFscyB3aXRoIHN5bWJvbHMgKGkuZS4sIHc6c3ltIGVsZW1lbnRzKS4KKyAgICAgICAgICAgICAgICAvLyBUbyB3b3JrIHdpdGggc3ltYm9scywgeW91IHNob3VsZCBhY3F1aXJlIHRoZSBVbmljb2RlIHZhbHVlcyBmb3IgdGhlCisgICAgICAgICAgICAgICAgLy8gc3ltYm9scyB5b3Ugd2lzaCB0byBtYXRjaCBvciB1c2UgaW4gcmVwbGFjZW1lbnQgcGF0dGVybnMuIFRoZSByZWFzb24KKyAgICAgICAgICAgICAgICAvLyBpcyB0aGF0IFVuaWNvZGVNYXBwZXIgd2lsbCAoYSkgbWltaWMgTWljcm9zb2Z0IFdvcmQgaW4gc2hpZnRpbmcgdGhlCisgICAgICAgICAgICAgICAgLy8gVW5pY29kZSB2YWx1ZXMgaW50byB0aGUgVW5pY29kZSBwcml2YXRlIHVzZSBhcmVhIChieSBhZGRpbmcgVStGMDAwKQorICAgICAgICAgICAgICAgIC8vIGFuZCAoYikgdXNlIHJlcGxhY2VtZW50cyBmb3IgVW5pY29kZSB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gdXNlZCBpbgorICAgICAgICAgICAgICAgIC8vIGNvbmp1bmN0aW9uIHdpdGggZGlmZmVyZW50IGZvbnRzIGFscmVhZHkgKGJ5IGFkZGluZyBVK0UwMDApLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gVGhlIHJlcGxhY2VtZW50IMOabmljb2RlIHZhbHVlcyB3aWxsIGRlcGVuZCBvbiB0aGUgb3JkZXIgaW4gd2hpY2gKKyAgICAgICAgICAgICAgICAvLyBzeW1ib2xzIGFyZSByZXRyaWV2ZWQuIFRoZXJlZm9yZSwgeW91IHNob3VsZCBub3QgcmVseSBvbiBhbnkgZml4ZWQKKyAgICAgICAgICAgICAgICAvLyBhc3NpZ25tZW50LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gSW4gdGhlIGV4YW1wbGUgYmVsb3csIHBlbmNpbCB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5IFUrRjAyMSwgd2hlcmVhcworICAgICAgICAgICAgICAgIC8vIHNwaWRlciAoc2FtZSB2YWx1ZSB3aXRoIGRpZmZlcmVudCBmb250KSB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5IFUrRTAwMS4KKyAgICAgICAgICAgICAgICAvLyBJZiBzcGlkZXIgaGFkIGJlZW4gYXNzaWduZWQgZmlyc3QsIHNwaWRlciB3b3VsZCBiZSBVK0YwMjEgYW5kIHBlbmNpbAorICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIFUrRTAwMS4KKyAgICAgICAgICAgICAgICBjaGFyIG9sZFBob25lID0gVW5pY29kZU1hcHBlci5TeW1Ub0NoYXIoIldpbmdkaW5ncyIsIDQwKTsKKyAgICAgICAgICAgICAgICBjaGFyIG5ld1Bob25lID0gVW5pY29kZU1hcHBlci5TeW1Ub0NoYXIoIldpbmdkaW5ncyIsIDQxKTsKKyAgICAgICAgICAgICAgICBjaGFyIHBlbmNpbCA9IFVuaWNvZGVNYXBwZXIuU3ltVG9DaGFyKCJXaW5nZGluZ3MiLCAweDIxKTsKKyAgICAgICAgICAgICAgICBjaGFyIHNwaWRlciA9IFVuaWNvZGVNYXBwZXIuU3ltVG9DaGFyKCJXZWJkaW5ncyIsIDB4MjEpOworCisgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBvciBjb21tZW50IG9uIHN5bWJvbHMgKHBhcmFncmFwaCAyMykKKyAgICAgICAgICAgICAgICBwYXJhcyA9IHhEb2MuRGVzY2VuZGFudHMoVy5wKS5Ta2lwKDIyKS5UYWtlKDEpLlRvTGlzdCgpOworICAgICAgICAgICAgICAgIGNvdW50ID0gT3BlblhtbFJlZ2V4LlJlcGxhY2UocGFyYXMsIG5ldyBSZWdleCgkIntvbGRQaG9uZX0iKSwgJCJ7bmV3UGhvbmV9IChyZXBsYWNlZCB3aXRoIG5ldyBwaG9uZSkiLCBudWxsKTsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBPcGVuWG1sUmVnZXguUmVwbGFjZShwYXJhcywgbmV3IFJlZ2V4KCQiKHtwZW5jaWx9KSIpLCAiJDEgKHNhbWUgcGVuY2lsKSIsIG51bGwpOworICAgICAgICAgICAgICAgIGNvdW50ICs9IE9wZW5YbWxSZWdleC5SZXBsYWNlKHBhcmFzLCBuZXcgUmVnZXgoJCIoe3NwaWRlcn0pIiksICIkMSAoc2FtZSBzcGlkZXIpIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4YW1wbGUgIzI1IFJlcGxhY2VkOiB7MH0iLCBjb3VudCk7CisKKyAgICAgICAgICAgICAgICB3RG9jLk1haW5Eb2N1bWVudFBhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBzb3VyY2VQcmVzID0gbmV3IEZpbGVJbmZvKCIuLi8uLi9UZXN0UHJlc2VudGF0aW9uLnBwdHgiKTsKKyAgICAgICAgICAgIHZhciBuZXdQcmVzID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsICJNb2RpZmllZC5wcHR4IikpOworICAgICAgICAgICAgRmlsZS5Db3B5KHNvdXJjZVByZXMuRnVsbE5hbWUsIG5ld1ByZXMuRnVsbE5hbWUpOworICAgICAgICAgICAgdXNpbmcgKFByZXNlbnRhdGlvbkRvY3VtZW50IHBEb2MgPSBQcmVzZW50YXRpb25Eb2N1bWVudC5PcGVuKG5ld1ByZXMuRnVsbE5hbWUsIHRydWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKFNsaWRlUGFydCBzbGlkZVBhcnQgaW4gcERvYy5QcmVzZW50YXRpb25QYXJ0LlNsaWRlUGFydHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYRG9jdW1lbnQgeERvYyA9IHNsaWRlUGFydC5HZXRYRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8WEVsZW1lbnQ+IGNvbnRlbnQgPSB4RG9jLkRlc2NlbmRhbnRzKEEucCk7CisgICAgICAgICAgICAgICAgICAgIHZhciByZWdleCA9IG5ldyBSZWdleCgiSGVsbG8iKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gT3BlblhtbFJlZ2V4LlJlcGxhY2UoY29udGVudCwgcmVnZXgsICJIIGUgbCBsIG8iLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4YW1wbGUgIzE4IFJlcGxhY2VkOiB7MH0iLCBjb3VudCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgeW91IGFic29sdXRlbHkgd2FudCB0byBwcmVzZXJ2ZSBjb21wYXRpYmlsaXR5IHdpdGggUG93ZXJQb2ludCAyMDA3LCB0aGVuIHlvdSB3aWxsIG5lZWQgdG8gc3RyaXAgdGhlIHhtbDpzcGFjZT0icHJlc2VydmUiIGF0dHJpYnV0ZSB0aHJvdWdob3V0LgorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGlzc3VlIGZvciBQb3dlclBvaW50IG9ubHksIG5vdCBXb3JkLCBhbmQgZm9yIDIwMDcgb25seS4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNpZGUtZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCBpZiBhIHJ1biBoYXMgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgaXQsIHRoZSBzcGFjZSB3aWxsIGJlIHN0cmlwcGVkIHVwb24gbG9hZGluZywgYW5kIGNvbnRlbnQvbGF5b3V0IHdpbGwgYmUgYWZmZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgIHhEb2MuRGVzY2VuZGFudHMoKS5BdHRyaWJ1dGVzKFhOYW1lc3BhY2UuWG1sICsgInNwYWNlIikuUmVtb3ZlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc2xpZGVQYXJ0LlB1dFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvT3BlblhtbFJlZ2V4MDEvT3BlblhtbFJlZ2V4MDEuY3Nwcm9qIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9PcGVuWG1sUmVnZXgwMS9PcGVuWG1sUmVnZXgwMS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjOTRkOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvT3BlblhtbFJlZ2V4MDEvT3BlblhtbFJlZ2V4MDEuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9PcGVuWG1sUmVnZXgwMS9UZXN0RG9jdW1lbnQuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvT3BlblhtbFJlZ2V4MDEvVGVzdERvY3VtZW50LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjYzNiMAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvT3BlblhtbFJlZ2V4MDEvVGVzdERvY3VtZW50LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9PcGVuWG1sUmVnZXgwMS9UZXN0UHJlc2VudGF0aW9uLnBwdHggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL09wZW5YbWxSZWdleDAxL1Rlc3RQcmVzZW50YXRpb24ucHB0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjgzNDA4Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9PcGVuWG1sUmVnZXgwMS9UZXN0UHJlc2VudGF0aW9uLnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9PcGVuWG1sUmVnZXgwMi9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL09wZW5YbWxSZWdleDAyL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODg4MWMxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9PcGVuWG1sUmVnZXgwMi9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKQEAgLTAsMCArMSwzIEBACitFeGFtcGxlIG91dHB1dCBmaWxlcyBhcmUgaW4gYSBEYXRlVGltZSBzdGFtcGVkIGRpcmVjdG9yeSBpbiAuL2Jpbi9kZWJ1Zy4gIFRoZSBkaXJlY3RvcnkgbmFtZSBpcyBFeGFtcGxlT3V0cHV0LXl5LW1tLWRkLWhobW1zcy4KKworSWYgeW91IGFyZSBidWlsZGluZyBpbiByZWxlYXNlIG1vZGUsIHRoZXkgd2lsbCwgb2YgY291cnNlLCBiZSBpbiAuL2Jpbi9yZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvT3BlblhtbFJlZ2V4MDIvT3BlblhtbFJlZ2V4MDIuY3MgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL09wZW5YbWxSZWdleDAyL09wZW5YbWxSZWdleDAyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMmFmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL09wZW5YbWxSZWdleDAyL09wZW5YbWxSZWdleDAyLmNzCkBAIC0wLDAgKzEsNjIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOworCitjbGFzcyBPcGVuWG1sUmVnZXhFeGFtcGxlCit7CisgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgIHsKKyAgICAgICAgdmFyIG4gPSBEYXRlVGltZS5Ob3c7CisgICAgICAgIHZhciB0ZW1wRGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhzdHJpbmcuRm9ybWF0KCJFeGFtcGxlT3V0cHV0LXswOjAwfS17MTowMH0tezI6MDB9LXszOjAwfXs0OjAwfXs1OjAwfSIsIG4uWWVhciAtIDIwMDAsIG4uTW9udGgsIG4uRGF5LCBuLkhvdXIsIG4uTWludXRlLCBuLlNlY29uZCkpOworICAgICAgICB0ZW1wRGkuQ3JlYXRlKCk7CisKKyAgICAgICAgdmFyIHNvdXJjZURvYyA9IG5ldyBGaWxlSW5mbygiLi4vLi4vVGVzdERvY3VtZW50LmRvY3giKTsKKyAgICAgICAgdmFyIG5ld0RvYyA9IG5ldyBGaWxlSW5mbygiTW9kaWZpZWQuZG9jeCIpOworICAgICAgICBpZiAobmV3RG9jLkV4aXN0cykKKyAgICAgICAgICAgIG5ld0RvYy5EZWxldGUoKTsKKyAgICAgICAgRmlsZS5Db3B5KHNvdXJjZURvYy5GdWxsTmFtZSwgbmV3RG9jLkZ1bGxOYW1lKTsKKyAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd0RvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihuZXdEb2MuRnVsbE5hbWUsIHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY291bnQ7CisgICAgICAgICAgICB2YXIgeERvYyA9IHdEb2MuTWFpbkRvY3VtZW50UGFydC5HZXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFJlZ2V4IHJlZ2V4OworICAgICAgICAgICAgSUVudW1lcmFibGU8WEVsZW1lbnQ+IGNvbnRlbnQ7CisKKyAgICAgICAgICAgIGNvbnRlbnQgPSB4RG9jLkRlc2NlbmRhbnRzKFcucCk7CisgICAgICAgICAgICByZWdleCA9IG5ldyBSZWdleCgiWy5dXHgwMjArIik7CisgICAgICAgICAgICBjb3VudCA9IE9wZW5YbWxSZWdleC5SZXBsYWNlKGNvbnRlbnQsIHJlZ2V4LCAiLiIgKyBFbnZpcm9ubWVudC5OZXdMaW5lLCBudWxsKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhcmEgaW4gY29udGVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbmV3UGFyYSA9IChYRWxlbWVudClUcmFuc2Zvcm1FbnZpcm9ubWVudE5ld0xpbmVUb1BhcmFncmFwaChwYXJhKTsKKyAgICAgICAgICAgICAgICBwYXJhLlJlcGxhY2VOb2RlcyhuZXdQYXJhLk5vZGVzKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3RG9jLk1haW5Eb2N1bWVudFBhcnQuUHV0WERvY3VtZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgVHJhbnNmb3JtRW52aXJvbm1lbnROZXdMaW5lVG9QYXJhZ3JhcGgoWE5vZGUgbm9kZSkKKyAgICB7CisgICAgICAgIHZhciBlbGVtZW50ID0gbm9kZSBhcyBYRWxlbWVudDsKKyAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBXLnApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBYRWxlbWVudChlbGVtZW50Lk5hbWUsCisgICAgICAgICAgICAgICAgZWxlbWVudC5BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybUVudmlyb25tZW50TmV3TGluZVRvUGFyYWdyYXBoKG4pKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9PcGVuWG1sUmVnZXgwMi9PcGVuWG1sUmVnZXgwMi5jc3Byb2ogYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL09wZW5YbWxSZWdleDAyL09wZW5YbWxSZWdleDAyLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWZlNmQzCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9PcGVuWG1sUmVnZXgwMi9PcGVuWG1sUmVnZXgwMi5jc3Byb2oKQEAgLTAsMCArMSwxMSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldDQ1PC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXE9wZW5YbWxQb3dlclRvb2xzXE9wZW5YbWxQb3dlclRvb2xzLmNzcHJvaiIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJEb2N1bWVudEZvcm1hdC5PcGVuWG1sIiBWZXJzaW9uPSIyLjcuMSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9PcGVuWG1sUmVnZXgwMi9UZXN0RG9jdW1lbnQuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvT3BlblhtbFJlZ2V4MDIvVGVzdERvY3VtZW50LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljMmU4ZAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvT3BlblhtbFJlZ2V4MDIvVGVzdERvY3VtZW50LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QaXZvdFRhYmxlczAxL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUGl2b3RUYWJsZXMwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4ODFjMQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUGl2b3RUYWJsZXMwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKQEAgLTAsMCArMSwzIEBACitFeGFtcGxlIG91dHB1dCBmaWxlcyBhcmUgaW4gYSBEYXRlVGltZSBzdGFtcGVkIGRpcmVjdG9yeSBpbiAuL2Jpbi9kZWJ1Zy4gIFRoZSBkaXJlY3RvcnkgbmFtZSBpcyBFeGFtcGxlT3V0cHV0LXl5LW1tLWRkLWhobW1zcy4KKworSWYgeW91IGFyZSBidWlsZGluZyBpbiByZWxlYXNlIG1vZGUsIHRoZXkgd2lsbCwgb2YgY291cnNlLCBiZSBpbiAuL2Jpbi9yZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUGl2b3RUYWJsZXMwMS9QaXZvdERhdGEudHh0IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QaXZvdFRhYmxlczAxL1Bpdm90RGF0YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwZWM2MgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUGl2b3RUYWJsZXMwMS9QaXZvdERhdGEudHh0CkBAIC0wLDAgKzEsNjEgQEAKK++7v1llYXIsUXVhcnRlcixSZWdpb24sQ2F0ZWdvcnksUHJvZHVjdCxBbW91bnQKKzIwMTAsUTEsTm9ydGgsQmljeWNsZXMsQjEwMCwzNDQ4LjAwCisyMDEwLFExLE5vcnRoLEJpY3ljbGVzLEIyMDAsODQ0OC4wMAorMjAxMCxRMSxOb3J0aCxCaWN5Y2xlcyxCMzAwLDkyMi4wMCAKKzIwMTAsUTEsTm9ydGgsQWNjZXNzb3JpZXMsTWlycm9ycywzMDMuMDAgCisyMDEwLFExLE5vcnRoLEFjY2Vzc29yaWVzLENhcnJpZXJzLDQ1NS4wMCAKKzIwMTAsUTEsU291dGgsQmljeWNsZXMsQjEwMCwyODg3LjAwCisyMDEwLFExLFNvdXRoLEJpY3ljbGVzLEIyMDAsNDQ3Ny4wMAorMjAxMCxRMSxTb3V0aCxCaWN5Y2xlcyxCMzAwLDEwMTEuMDAgCisyMDEwLFExLFNvdXRoLEFjY2Vzc29yaWVzLE1pcnJvcnMsODAuMDAgCisyMDEwLFExLFNvdXRoLEFjY2Vzc29yaWVzLENhcnJpZXJzLDIwNS4wMCAKKzIwMTAsUTIsTm9ydGgsQmljeWNsZXMsQjEwMCw0MDk5LjAwCisyMDEwLFEyLE5vcnRoLEJpY3ljbGVzLEIyMDAsODMzMy4wMAorMjAxMCxRMixOb3J0aCxCaWN5Y2xlcyxCMzAwLDM1NS4wMCAKKzIwMTAsUTIsTm9ydGgsQWNjZXNzb3JpZXMsTWlycm9ycyw0NDAuMDAgCisyMDEwLFEyLE5vcnRoLEFjY2Vzc29yaWVzLENhcnJpZXJzLDEyMC4wMCAKKzIwMTAsUTIsU291dGgsQmljeWNsZXMsQjEwMCw2MDIwLjAwCisyMDEwLFEyLFNvdXRoLEJpY3ljbGVzLEIyMDAsMTA4MjIuMDAKKzIwMTAsUTIsU291dGgsQmljeWNsZXMsQjMwMCwwLjAwIAorMjAxMCxRMixTb3V0aCxBY2Nlc3NvcmllcyxNaXJyb3JzLDEwNS4wMCAKKzIwMTAsUTIsU291dGgsQWNjZXNzb3JpZXMsQ2FycmllcnMsOTIyLjAwIAorMjAxMCxRMyxOb3J0aCxCaWN5Y2xlcyxCMTAwLDQ0MDMuMDAKKzIwMTAsUTMsTm9ydGgsQmljeWNsZXMsQjIwMCw3ODc4LjAwCisyMDEwLFEzLE5vcnRoLEJpY3ljbGVzLEIzMDAsMTA2LjAwIAorMjAxMCxRMyxOb3J0aCxBY2Nlc3NvcmllcyxNaXJyb3JzLDg5LjAwIAorMjAxMCxRMyxOb3J0aCxBY2Nlc3NvcmllcyxDYXJyaWVycyw2MTAuMDAgCisyMDEwLFEzLFNvdXRoLEJpY3ljbGVzLEIxMDAsNjY5OS4wMAorMjAxMCxRMyxTb3V0aCxCaWN5Y2xlcyxCMjAwLDcwOTkuMDAKKzIwMTAsUTMsU291dGgsQmljeWNsZXMsQjMwMCw2NzAuMDAgCisyMDEwLFEzLFNvdXRoLEFjY2Vzc29yaWVzLE1pcnJvcnMsMjc3LjAwIAorMjAxMCxRMyxTb3V0aCxBY2Nlc3NvcmllcyxDYXJyaWVycyw0OTAuMDAgCisyMDEwLFE0LE5vcnRoLEJpY3ljbGVzLEIxMDAsMjIwNC4wMAorMjAxMCxRNCxOb3J0aCxCaWN5Y2xlcyxCMjAwLDU1MDAuMDAKKzIwMTAsUTQsTm9ydGgsQmljeWNsZXMsQjMwMCwwLjAwIAorMjAxMCxRNCxOb3J0aCxBY2Nlc3NvcmllcyxNaXJyb3JzLDQ1LjAwIAorMjAxMCxRNCxOb3J0aCxBY2Nlc3NvcmllcyxDYXJyaWVycyw2MDAuMDAgCisyMDEwLFE0LFNvdXRoLEJpY3ljbGVzLEIxMDAsMjAwOC4wMAorMjAxMCxRNCxTb3V0aCxCaWN5Y2xlcyxCMjAwLDEwMjIwLjAwCisyMDEwLFE0LFNvdXRoLEJpY3ljbGVzLEIzMDAsMjQ0LjAwIAorMjAxMCxRNCxTb3V0aCxBY2Nlc3NvcmllcyxNaXJyb3JzLDQ0OC4wMCAKKzIwMTAsUTQsU291dGgsQWNjZXNzb3JpZXMsQ2FycmllcnMsMzI3LjAwIAorMjAxMSxRMSxOb3J0aCxCaWN5Y2xlcyxCMTAwLDkxMTIuMDAKKzIwMTEsUTEsTm9ydGgsQmljeWNsZXMsQjIwMCwxMDE4LjAwCisyMDExLFExLE5vcnRoLEJpY3ljbGVzLEIzMDAsOTAuMDAgCisyMDExLFExLE5vcnRoLEFjY2Vzc29yaWVzLE1pcnJvcnMsMjQ0LjAwIAorMjAxMSxRMSxOb3J0aCxBY2Nlc3NvcmllcyxDYXJyaWVycyw2NzAuMDAgCisyMDExLFExLFNvdXRoLEJpY3ljbGVzLEIxMDAsODAyMi4wMAorMjAxMSxRMSxTb3V0aCxCaWN5Y2xlcyxCMjAwLDgxOTkuMDAKKzIwMTEsUTEsU291dGgsQmljeWNsZXMsQjMwMCw4ODguMDAgCisyMDExLFExLFNvdXRoLEFjY2Vzc29yaWVzLE1pcnJvcnMsMjkwLjAwIAorMjAxMSxRMSxTb3V0aCxBY2Nlc3NvcmllcyxDYXJyaWVycywzNDQuMDAgCisyMDExLFEyLE5vcnRoLEJpY3ljbGVzLEIxMDAsMzI0OC4wMAorMjAxMSxRMixOb3J0aCxCaWN5Y2xlcyxCMjAwLDg3NDguMDAKKzIwMTEsUTIsTm9ydGgsQmljeWNsZXMsQjMwMCw5NzIuMDAgCisyMDExLFEyLE5vcnRoLEFjY2Vzc29yaWVzLE1pcnJvcnMsNjAzLjAwIAorMjAxMSxRMixOb3J0aCxBY2Nlc3NvcmllcyxDYXJyaWVycyw0ODUuMDAgCisyMDExLFEyLFNvdXRoLEJpY3ljbGVzLEIxMDAsMzQ3OC4wMAorMjAxMSxRMixTb3V0aCxCaWN5Y2xlcyxCMjAwLDg0OTguMDAKKzIwMTEsUTIsU291dGgsQmljeWNsZXMsQjMwMCwyODIuMDAgCisyMDExLFEyLFNvdXRoLEFjY2Vzc29yaWVzLE1pcnJvcnMsMTkzLjAwIAorMjAxMSxRMixTb3V0aCxBY2Nlc3NvcmllcyxDYXJyaWVycyw2NjcuMDAgCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1Bpdm90VGFibGVzMDEvUGl2b3RUYWJsZXMuY3MgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1Bpdm90VGFibGVzMDEvUGl2b3RUYWJsZXMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwNmM2ZgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUGl2b3RUYWJsZXMwMS9QaXZvdFRhYmxlcy5jcwpAQCAtMCwwICsxLDQ1NiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UaW1lcnM7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOworCituYW1lc3BhY2UgRXhhbXBsZVBpdm90VGFibGVzCit7CisgICAgY2xhc3MgUGl2b3RUYWJsZUV4YW1wbGUKKyAgICB7CisgICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG4gPSBEYXRlVGltZS5Ob3c7CisgICAgICAgICAgICB2YXIgdGVtcERpID0gbmV3IERpcmVjdG9yeUluZm8oc3RyaW5nLkZvcm1hdCgiRXhhbXBsZU91dHB1dC17MDowMH0tezE6MDB9LXsyOjAwfS17MzowMH17NDowMH17NTowMH0iLCBuLlllYXIgLSAyMDAwLCBuLk1vbnRoLCBuLkRheSwgbi5Ib3VyLCBuLk1pbnV0ZSwgbi5TZWNvbmQpKTsKKyAgICAgICAgICAgIHRlbXBEaS5DcmVhdGUoKTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIGFuIGV4aXN0aW5nIHBpdm90IHRhYmxlCisgICAgICAgICAgICBGaWxlSW5mbyBxcyA9IG5ldyBGaWxlSW5mbygiLi4vLi4vUXVhcnRlcmx5U2FsZXMueGxzeCIpOworICAgICAgICAgICAgRmlsZUluZm8gcXN1ID0gbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsICJRdWFydGVybHlQaXZvdC54bHN4IikpOworCisgICAgICAgICAgICBpbnQgcm93ID0gMTsKKyAgICAgICAgICAgIHVzaW5nIChPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgc3RyZWFtRG9jID0gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCgKKyAgICAgICAgICAgICAgICBTbWxEb2N1bWVudC5Gcm9tRmlsZU5hbWUocXMuRnVsbE5hbWUpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoU3ByZWFkc2hlZXREb2N1bWVudCBkb2MgPSBzdHJlYW1Eb2MuR2V0U3ByZWFkc2hlZXREb2N1bWVudCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgV29ya3NoZWV0UGFydCBzaGVldCA9IFdvcmtzaGVldEFjY2Vzc29yLkdldFdvcmtzaGVldChkb2MsICJSYW5nZSIpOworICAgICAgICAgICAgICAgICAgICB1c2luZyAoU3RyZWFtUmVhZGVyIHNvdXJjZSA9IG5ldyBTdHJlYW1SZWFkZXIoIi4uLy4uL1Bpdm90RGF0YS50eHQiKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzb3VyY2UuRW5kT2ZTdHJlYW0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxpbmUgPSBzb3VyY2UuUmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5MZW5ndGggPiAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nW10gZmllbGRzID0gbGluZS5TcGxpdCgnLCcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGl0ZW0gaW4gZmllbGRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbnVtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZShpdGVtLCBvdXQgbnVtKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXRBY2Nlc3Nvci5TZXRDZWxsVmFsdWUoZG9jLCBzaGVldCwgcm93LCBjb2x1bW4rKywgbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXRBY2Nlc3Nvci5TZXRDZWxsVmFsdWUoZG9jLCBzaGVldCwgcm93LCBjb2x1bW4rKywgaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2hlZXQuUHV0WERvY3VtZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgV29ya3NoZWV0QWNjZXNzb3IuVXBkYXRlUmFuZ2VFbmRSb3coZG9jLCAiU2FsZXMiLCByb3cgLSAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyZWFtRG9jLkdldE1vZGlmaWVkU21sRG9jdW1lbnQoKS5TYXZlQXMocXN1LkZ1bGxOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ3JlYXRlIGZyb20gc2NyYXRjaAorICAgICAgICAgICAgcm93ID0gMTsKKyAgICAgICAgICAgIGludCBtYXhDb2x1bW4gPSAxOworICAgICAgICAgICAgdXNpbmcgKE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudCBzdHJlYW1Eb2MgPSBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQuQ3JlYXRlU3ByZWFkc2hlZXREb2N1bWVudCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChTcHJlYWRzaGVldERvY3VtZW50IGRvYyA9IHN0cmVhbURvYy5HZXRTcHJlYWRzaGVldERvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXRBY2Nlc3Nvci5DcmVhdGVEZWZhdWx0U3R5bGVzKGRvYyk7CisgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldFBhcnQgc2hlZXQgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5BZGRXb3Jrc2hlZXQoZG9jLCAiUmFuZ2UiKTsKKyAgICAgICAgICAgICAgICAgICAgTWVtb3J5U3ByZWFkc2hlZXQgbXMgPSBuZXcgTWVtb3J5U3ByZWFkc2hlZXQoKTsKKworI2lmIGZhbHNlCisgICAgICAgICAgICAgICAgICAgIGludCBmb250MCA9IFdvcmtzaGVldEFjY2Vzc29yLkdldEZvbnRJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Gb250CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgPSAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLlRoZW1lLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiQ2FsaWJyaSIsCisgICAgICAgICAgICAgICAgICAgICAgICBGYW1pbHkgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1lID0gV29ya3NoZWV0QWNjZXNzb3IuRm9udC5TY2hlbWVUeXBlLk1pbm9yCisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpbnQgZm9udDIgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGb250SW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuRm9udAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCb2xkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgPSAxOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLlRoZW1lLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiQ2FtYnJpYSIsCisgICAgICAgICAgICAgICAgICAgICAgICBGYW1pbHkgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1lID0gV29ya3NoZWV0QWNjZXNzb3IuRm9udC5TY2hlbWVUeXBlLk1ham9yCisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpbnQgZm9udDMgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGb250SW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuRm9udAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCb2xkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgPSAxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLlRoZW1lLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiQ2FsaWJyaSIsCisgICAgICAgICAgICAgICAgICAgICAgICBGYW1pbHkgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1lID0gV29ya3NoZWV0QWNjZXNzb3IuRm9udC5TY2hlbWVUeXBlLk1pbm9yCisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpbnQgZm9udDQgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGb250SW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuRm9udAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCb2xkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgPSAxMywKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLlRoZW1lLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiQ2FsaWJyaSIsCisgICAgICAgICAgICAgICAgICAgICAgICBGYW1pbHkgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1lID0gV29ya3NoZWV0QWNjZXNzb3IuRm9udC5TY2hlbWVUeXBlLk1pbm9yCisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpbnQgZm9udDUgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGb250SW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuRm9udAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCb2xkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgPSAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLlRoZW1lLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiQ2FsaWJyaSIsCisgICAgICAgICAgICAgICAgICAgICAgICBGYW1pbHkgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1lID0gV29ya3NoZWV0QWNjZXNzb3IuRm9udC5TY2hlbWVUeXBlLk1pbm9yCisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpbnQgZm9udDYgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGb250SW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuRm9udAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTaXplID0gMTEsCisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvciA9IG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oIkZGMDA2MTAwIiksCisgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gIkNhbGlicmkiLAorICAgICAgICAgICAgICAgICAgICAgICAgRmFtaWx5ID0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtZSA9IFdvcmtzaGVldEFjY2Vzc29yLkZvbnQuU2NoZW1lVHlwZS5NaW5vcgorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZvbnQ3ID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0Rm9udEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkZvbnQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9IDExLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IgPSBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKCJGRjlDMDAwNiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJDYWxpYnJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhbWlseSA9IDIsCisgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWUgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5Gb250LlNjaGVtZVR5cGUuTWlub3IKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmb250OCA9IFdvcmtzaGVldEFjY2Vzc29yLkdldEZvbnRJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Gb250CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgPSAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbygiRkY5QzY1MDAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiQ2FsaWJyaSIsCisgICAgICAgICAgICAgICAgICAgICAgICBGYW1pbHkgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1lID0gV29ya3NoZWV0QWNjZXNzb3IuRm9udC5TY2hlbWVUeXBlLk1pbm9yCisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpbnQgZm9udDkgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGb250SW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuRm9udAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTaXplID0gMTEsCisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvciA9IG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oIkZGM0YzRjc2IiksCisgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gIkNhbGlicmkiLAorICAgICAgICAgICAgICAgICAgICAgICAgRmFtaWx5ID0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtZSA9IFdvcmtzaGVldEFjY2Vzc29yLkZvbnQuU2NoZW1lVHlwZS5NaW5vcgorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZvbnQxMCA9IFdvcmtzaGVldEFjY2Vzc29yLkdldEZvbnRJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Gb250CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvbGQgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9IDExLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IgPSBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKCJGRjNGM0YzRiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJDYWxpYnJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhbWlseSA9IDIsCisgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWUgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5Gb250LlNjaGVtZVR5cGUuTWlub3IKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmb250MTEgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGb250SW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuRm9udAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCb2xkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgPSAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbygiRkZGQTdEMDAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiQ2FsaWJyaSIsCisgICAgICAgICAgICAgICAgICAgICAgICBGYW1pbHkgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1lID0gV29ya3NoZWV0QWNjZXNzb3IuRm9udC5TY2hlbWVUeXBlLk1pbm9yCisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpbnQgZm9udDEyID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0Rm9udEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkZvbnQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9IDExLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IgPSBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKCJGRkZBN0QwMCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJDYWxpYnJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhbWlseSA9IDIsCisgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWUgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5Gb250LlNjaGVtZVR5cGUuTWlub3IKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmb250MTMgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGb250SW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuRm9udAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCb2xkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgPSAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLlRoZW1lLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiQ2FsaWJyaSIsCisgICAgICAgICAgICAgICAgICAgICAgICBGYW1pbHkgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1lID0gV29ya3NoZWV0QWNjZXNzb3IuRm9udC5TY2hlbWVUeXBlLk1pbm9yCisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpbnQgZm9udDE0ID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0Rm9udEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkZvbnQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9IDExLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IgPSBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKCJGRkZGMDAwMCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJDYWxpYnJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhbWlseSA9IDIsCisgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWUgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5Gb250LlNjaGVtZVR5cGUuTWlub3IKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmb250MTUgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGb250SW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuRm9udAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBJdGFsaWMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9IDExLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IgPSBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKCJGRjdGN0Y3RiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJDYWxpYnJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhbWlseSA9IDIsCisgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWUgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5Gb250LlNjaGVtZVR5cGUuTWlub3IKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmb250MTYgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGb250SW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuRm9udAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCb2xkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgPSAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLlRoZW1lLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiQ2FsaWJyaSIsCisgICAgICAgICAgICAgICAgICAgICAgICBGYW1pbHkgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1lID0gV29ya3NoZWV0QWNjZXNzb3IuRm9udC5TY2hlbWVUeXBlLk1pbm9yCisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpbnQgZm9udDE3ID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0Rm9udEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkZvbnQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9IDExLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IgPSBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mby5Db2xvclR5cGUuVGhlbWUsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJDYWxpYnJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhbWlseSA9IDIsCisgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWUgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5Gb250LlNjaGVtZVR5cGUuTWlub3IKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGwwID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0RmlsbEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsKFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsLlBhdHRlcm5UeXBlLk5vbmUsIG51bGwsIG51bGwpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGwxID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0RmlsbEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsKFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsLlBhdHRlcm5UeXBlLkdyYXkxMjUsIG51bGwsIG51bGwpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGwyID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0RmlsbEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsKFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsLlBhdHRlcm5UeXBlLlNvbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbygiRkZDNkVGQ0UiKSkpOworICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbDMgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwoV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwuUGF0dGVyblR5cGUuU29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKCJGRkZGQzdDRSIpKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmaWxsNCA9IFdvcmtzaGVldEFjY2Vzc29yLkdldEZpbGxJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbChXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbC5QYXR0ZXJuVHlwZS5Tb2xpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oIkZGRkZFQjlDIikpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGw1ID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0RmlsbEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsKFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsLlBhdHRlcm5UeXBlLlNvbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbygiRkZGRkNDOTkiKSkpOworICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbDYgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwoV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwuUGF0dGVyblR5cGUuU29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKCJGRkYyRjJGMiIpKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmaWxsNyA9IFdvcmtzaGVldEFjY2Vzc29yLkdldEZpbGxJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbChXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbC5QYXR0ZXJuVHlwZS5Tb2xpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oIkZGQTVBNUE1IikpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGw4ID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0RmlsbEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsKFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsLlBhdHRlcm5UeXBlLlNvbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbygiRkZGRkZGQ0MiKSkpOworICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbDkgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwoV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwuUGF0dGVyblR5cGUuU29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mby5Db2xvclR5cGUuVGhlbWUsIDQpKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmaWxsMTAgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwoV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwuUGF0dGVyblR5cGUuU29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mby5Db2xvclR5cGUuSW5kZXhlZCwgNjUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyg0LCAwLjc5OTk4MTY4ODg5NDMxNDQyKSkpOworICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbDExID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0RmlsbEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsKFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsLlBhdHRlcm5UeXBlLlNvbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLkluZGV4ZWQsIDY1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oNCwgMC41OTk5OTM4OTYyOTgxMDQ4NSkpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGwxMiA9IFdvcmtzaGVldEFjY2Vzc29yLkdldEZpbGxJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbChXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbC5QYXR0ZXJuVHlwZS5Tb2xpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvLkNvbG9yVHlwZS5JbmRleGVkLCA2NSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKDQsIDAuMzk5OTc1NTg1MTkyNDE5MjEpKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmaWxsMTMgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwoV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwuUGF0dGVyblR5cGUuU29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mby5Db2xvclR5cGUuVGhlbWUsIDUpKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmaWxsMTQgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwoV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwuUGF0dGVyblR5cGUuU29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mby5Db2xvclR5cGUuSW5kZXhlZCwgNjUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyg1LCAwLjc5OTk4MTY4ODg5NDMxNDQyKSkpOworICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbDE1ID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0RmlsbEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsKFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsLlBhdHRlcm5UeXBlLlNvbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLkluZGV4ZWQsIDY1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oNSwgMC41OTk5OTM4OTYyOTgxMDQ4NSkpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGwxNiA9IFdvcmtzaGVldEFjY2Vzc29yLkdldEZpbGxJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbChXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbC5QYXR0ZXJuVHlwZS5Tb2xpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvLkNvbG9yVHlwZS5JbmRleGVkLCA2NSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKDUsIDAuMzk5OTc1NTg1MTkyNDE5MjEpKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmaWxsMTcgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwoV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwuUGF0dGVyblR5cGUuU29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mby5Db2xvclR5cGUuVGhlbWUsIDYpKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmaWxsMTggPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwoV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwuUGF0dGVyblR5cGUuU29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mby5Db2xvclR5cGUuSW5kZXhlZCwgNjUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyg2LCAwLjc5OTk4MTY4ODg5NDMxNDQyKSkpOworICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbDE5ID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0RmlsbEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsKFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsLlBhdHRlcm5UeXBlLlNvbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLkluZGV4ZWQsIDY1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oNiwgMC41OTk5OTM4OTYyOTgxMDQ4NSkpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGwyMCA9IFdvcmtzaGVldEFjY2Vzc29yLkdldEZpbGxJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbChXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbC5QYXR0ZXJuVHlwZS5Tb2xpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvLkNvbG9yVHlwZS5JbmRleGVkLCA2NSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKDYsIDAuMzk5OTc1NTg1MTkyNDE5MjEpKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmaWxsMjEgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwoV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwuUGF0dGVyblR5cGUuU29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mby5Db2xvclR5cGUuVGhlbWUsIDcpKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmaWxsMjIgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwoV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwuUGF0dGVyblR5cGUuU29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mby5Db2xvclR5cGUuSW5kZXhlZCwgNjUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyg3LCAwLjc5OTk4MTY4ODg5NDMxNDQyKSkpOworICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbDIzID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0RmlsbEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsKFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsLlBhdHRlcm5UeXBlLlNvbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLkluZGV4ZWQsIDY1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oNywgMC41OTk5OTM4OTYyOTgxMDQ4NSkpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGwyNCA9IFdvcmtzaGVldEFjY2Vzc29yLkdldEZpbGxJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbChXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbC5QYXR0ZXJuVHlwZS5Tb2xpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvLkNvbG9yVHlwZS5JbmRleGVkLCA2NSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKDcsIDAuMzk5OTc1NTg1MTkyNDE5MjEpKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmaWxsMjUgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwoV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwuUGF0dGVyblR5cGUuU29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mby5Db2xvclR5cGUuVGhlbWUsIDgpKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmaWxsMjYgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwoV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwuUGF0dGVyblR5cGUuU29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mby5Db2xvclR5cGUuSW5kZXhlZCwgNjUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyg4LCAwLjc5OTk4MTY4ODg5NDMxNDQyKSkpOworICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbDI3ID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0RmlsbEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsKFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsLlBhdHRlcm5UeXBlLlNvbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLkluZGV4ZWQsIDY1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oOCwgMC41OTk5OTM4OTYyOTgxMDQ4NSkpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGwyOCA9IFdvcmtzaGVldEFjY2Vzc29yLkdldEZpbGxJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbChXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbC5QYXR0ZXJuVHlwZS5Tb2xpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvLkNvbG9yVHlwZS5JbmRleGVkLCA2NSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKDgsIDAuMzk5OTc1NTg1MTkyNDE5MjEpKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmaWxsMjkgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwoV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwuUGF0dGVyblR5cGUuU29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mby5Db2xvclR5cGUuVGhlbWUsIDkpKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmaWxsMzAgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwoV29ya3NoZWV0QWNjZXNzb3IuUGF0dGVybkZpbGwuUGF0dGVyblR5cGUuU29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mby5Db2xvclR5cGUuSW5kZXhlZCwgNjUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyg5LCAwLjc5OTk4MTY4ODg5NDMxNDQyKSkpOworICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbDMxID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0RmlsbEluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsKFdvcmtzaGVldEFjY2Vzc29yLlBhdHRlcm5GaWxsLlBhdHRlcm5UeXBlLlNvbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLkluZGV4ZWQsIDY1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oOSwgMC41OTk5OTM4OTYyOTgxMDQ4NSkpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGwzMiA9IFdvcmtzaGVldEFjY2Vzc29yLkdldEZpbGxJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbChXb3Jrc2hlZXRBY2Nlc3Nvci5QYXR0ZXJuRmlsbC5QYXR0ZXJuVHlwZS5Tb2xpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvLkNvbG9yVHlwZS5JbmRleGVkLCA2NSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKDksIDAuMzk5OTc1NTg1MTkyNDE5MjEpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGJvcmRlcjEgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRCb3JkZXJJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQm90dG9tID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUoV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyTGluZS5MaW5lU3R5bGUuVGhpY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLlRoZW1lLCA0KSkKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGludCBib3JkZXIyID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0Qm9yZGVySW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvdHRvbSA9IG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lKFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUuTGluZVN0eWxlLlRoaWNrLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKDQsIDAuNDk5OTg0NzQwNzQ1MjYyKSkKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGludCBib3JkZXIzID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0Qm9yZGVySW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvdHRvbSA9IG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lKFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUuTGluZVN0eWxlLk1lZGl1bSwgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyg0LCAwLjM5OTk3NTU4NTE5MjQxOTIxKSkKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGludCBib3JkZXI0ID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0Qm9yZGVySW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExlZnQgPSBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyTGluZShXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lLkxpbmVTdHlsZS5UaGluLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKCJGRjdGN0Y3RiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0ID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUoV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyTGluZS5MaW5lU3R5bGUuVGhpbiwgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbygiRkY3RjdGN0YiKSksCisgICAgICAgICAgICAgICAgICAgICAgICBUb3AgPSBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyTGluZShXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lLkxpbmVTdHlsZS5UaGluLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKCJGRjdGN0Y3RiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvdHRvbSA9IG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lKFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUuTGluZVN0eWxlLlRoaW4sIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oIkZGN0Y3RjdGIikpCisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpbnQgYm9yZGVyNSA9IFdvcmtzaGVldEFjY2Vzc29yLkdldEJvcmRlckluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlcgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBMZWZ0ID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUoV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyTGluZS5MaW5lU3R5bGUuVGhpbiwgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbygiRkYzRjNGM0YiKSksCisgICAgICAgICAgICAgICAgICAgICAgICBSaWdodCA9IG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lKFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUuTGluZVN0eWxlLlRoaW4sIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oIkZGM0YzRjNGIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgVG9wID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUoV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyTGluZS5MaW5lU3R5bGUuVGhpbiwgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbygiRkYzRjNGM0YiKSksCisgICAgICAgICAgICAgICAgICAgICAgICBCb3R0b20gPSBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyTGluZShXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lLkxpbmVTdHlsZS5UaGluLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKCJGRjNGM0YzRiIpKQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJvcmRlcjYgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRCb3JkZXJJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQm90dG9tID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUoV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyTGluZS5MaW5lU3R5bGUuRG91YmxlLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKCJGRkZGODAwMSIpKQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJvcmRlcjcgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRCb3JkZXJJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTGVmdCA9IG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lKFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUuTGluZVN0eWxlLkRvdWJsZSwgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbygiRkYzRjNGM0YiKSksCisgICAgICAgICAgICAgICAgICAgICAgICBSaWdodCA9IG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lKFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUuTGluZVN0eWxlLkRvdWJsZSwgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbygiRkYzRjNGM0YiKSksCisgICAgICAgICAgICAgICAgICAgICAgICBUb3AgPSBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyTGluZShXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lLkxpbmVTdHlsZS5Eb3VibGUsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oIkZGM0YzRjNGIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm90dG9tID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUoV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyTGluZS5MaW5lU3R5bGUuRG91YmxlLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKCJGRjNGM0YzRiIpKQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJvcmRlcjggPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRCb3JkZXJJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTGVmdCA9IG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lKFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUuTGluZVN0eWxlLlRoaW4sIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oIkZGQjJCMkIyIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHQgPSBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyTGluZShXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lLkxpbmVTdHlsZS5UaGluLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvKCJGRkIyQjJCMiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvcCA9IG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lKFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUuTGluZVN0eWxlLlRoaW4sIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oIkZGQjJCMkIyIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm90dG9tID0gbmV3IFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUoV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyTGluZS5MaW5lU3R5bGUuVGhpbiwgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbygiRkZCMkIyQjIiKSkKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGludCBib3JkZXI5ID0gV29ya3NoZWV0QWNjZXNzb3IuR2V0Qm9yZGVySW5kZXgoZG9jLCBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvcCA9IG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lKFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUuTGluZVN0eWxlLlRoaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLlRoZW1lLCA0KSksCisgICAgICAgICAgICAgICAgICAgICAgICBCb3R0b20gPSBuZXcgV29ya3NoZWV0QWNjZXNzb3IuQm9yZGVyTGluZShXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lLkxpbmVTdHlsZS5Eb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNvbG9ySW5mbyhXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8uQ29sb3JUeXBlLlRoZW1lLCA0KSkKKyAgICAgICAgICAgICAgICAgICAgfSk7CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICBpbnQgc291dGhJbmRleCA9IFdvcmtzaGVldEFjY2Vzc29yLkdldFN0eWxlSW5kZXgoZG9jLCAwLCA4LCAxLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkNlbGxBbGlnbm1lbnQgeyBIb3Jpem9udGFsQWxpZ25tZW50ID0gV29ya3NoZWV0QWNjZXNzb3IuQ2VsbEFsaWdubWVudC5Ib3Jpem9udGFsLkNlbnRlciB9LAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXRBY2Nlc3Nvci5HcmFkaWVudEZpbGwgZ3JhZGllbnQgPSBuZXcgV29ya3NoZWV0QWNjZXNzb3IuR3JhZGllbnRGaWxsKDkwKTsKKyAgICAgICAgICAgICAgICAgICAgZ3JhZGllbnQuQWRkU3RvcChuZXcgV29ya3NoZWV0QWNjZXNzb3IuR3JhZGllbnRTdG9wKDAsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oIkZGOTJEMDUwIikpKTsKKyAgICAgICAgICAgICAgICAgICAgZ3JhZGllbnQuQWRkU3RvcChuZXcgV29ya3NoZWV0QWNjZXNzb3IuR3JhZGllbnRTdG9wKDEsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oIkZGMDA3MEMwIikpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5vcnRoSW5kZXggPSBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRTdHlsZUluZGV4KGRvYywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldEFjY2Vzc29yLkdldEZvbnRJbmRleChkb2MsIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Gb250CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRhbGljID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplID0gOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvciA9IG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oV29ya3NoZWV0QWNjZXNzb3IuQ29sb3JJbmZvLkNvbG9yVHlwZS5UaGVtZSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJUaW1lcyBOZXcgUm9tYW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbWlseSA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXRBY2Nlc3Nvci5HZXRGaWxsSW5kZXgoZG9jLCBncmFkaWVudCksCisgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldEFjY2Vzc29yLkdldEJvcmRlckluZGV4KGRvYywgbmV3IFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlcgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBEaWFnb25hbERvd24gPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ29uYWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Cb3JkZXJMaW5lKFdvcmtzaGVldEFjY2Vzc29yLkJvcmRlckxpbmUuTGluZVN0eWxlLlRoaW4sIG5ldyBXb3Jrc2hlZXRBY2Nlc3Nvci5Db2xvckluZm8oIkZGNjE2MTAwIikpCisgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICBudWxsLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXRBY2Nlc3Nvci5DaGVja051bWJlckZvcm1hdChkb2MsIDEwMCwgIl8oXCIkXCIqICMsIyMwLjAwXyk7XyhcIiRcIiogXFwoIywjIzAuMDBcXCk7XyhcIiRcIiogXCItXCI/P18pO18oQF8pIik7CisgICAgICAgICAgICAgICAgICAgIGludCBhbW91bnRJbmRleCA9IFdvcmtzaGVldEFjY2Vzc29yLkdldFN0eWxlSW5kZXgoZG9jLCAxMDAsIDAsIDAsIDAsIG51bGwsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbVJlYWRlciBzb3VyY2UgPSBuZXcgU3RyZWFtUmVhZGVyKCIuLi8uLi9QaXZvdERhdGEudHh0IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghc291cmNlLkVuZE9mU3RyZWFtKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaW5lID0gc291cmNlLlJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUuTGVuZ3RoID4gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1tdIGZpZWxkcyA9IGxpbmUuU3BsaXQoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBpdGVtIGluIGZpZWxkcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG51bTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2UoaXRlbSwgb3V0IG51bSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbiA9PSA2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcy5TZXRDZWxsVmFsdWUocm93LCBjb2x1bW4rKywgbnVtLCBhbW91bnRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcy5TZXRDZWxsVmFsdWUocm93LCBjb2x1bW4rKywgbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0gPT0gIkFjY2Vzc29yaWVzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcy5TZXRDZWxsVmFsdWUocm93LCBjb2x1bW4rKywgaXRlbSwgV29ya3NoZWV0QWNjZXNzb3IuR2V0U3R5bGVJbmRleChkb2MsICJHb29kIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXRlbSA9PSAiU291dGgiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zLlNldENlbGxWYWx1ZShyb3csIGNvbHVtbisrLCBpdGVtLCBzb3V0aEluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0gPT0gIk5vcnRoIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcy5TZXRDZWxsVmFsdWUocm93LCBjb2x1bW4rKywgaXRlbSwgbm9ydGhJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXMuU2V0Q2VsbFZhbHVlKHJvdywgY29sdW1uKyssIGl0ZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heENvbHVtbiA9IGNvbHVtbiAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdysrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldEFjY2Vzc29yLlNldFNoZWV0Q29udGVudHMoZG9jLCBzaGVldCwgbXMpOworICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXRBY2Nlc3Nvci5TZXRSYW5nZShkb2MsICJTYWxlcyIsICJSYW5nZSIsIDEsIDEsIHJvdyAtIDEsIG1heENvbHVtbik7CisgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldFBhcnQgcGl2b3QgPSBXb3Jrc2hlZXRBY2Nlc3Nvci5BZGRXb3Jrc2hlZXQoZG9jLCAiUGl2b3QiKTsKKyAgICAgICAgICAgICAgICAgICAgV29ya3NoZWV0QWNjZXNzb3IuQ3JlYXRlUGl2b3RUYWJsZShkb2MsICJTYWxlcyIsIHBpdm90KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBDb25maWd1cmUgcGl2b3QgdGFibGUgcm93cywgY29sdW1ucywgZGF0YSBhbmQgZmlsdGVycworICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXRBY2Nlc3Nvci5BZGRQaXZvdEF4aXMoZG9jLCBwaXZvdCwgIlllYXIiLCBXb3Jrc2hlZXRBY2Nlc3Nvci5QaXZvdEF4aXMuQ29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgV29ya3NoZWV0QWNjZXNzb3IuQWRkUGl2b3RBeGlzKGRvYywgcGl2b3QsICJRdWFydGVyIiwgV29ya3NoZWV0QWNjZXNzb3IuUGl2b3RBeGlzLkNvbHVtbik7CisgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldEFjY2Vzc29yLkFkZFBpdm90QXhpcyhkb2MsIHBpdm90LCAiQ2F0ZWdvcnkiLCBXb3Jrc2hlZXRBY2Nlc3Nvci5QaXZvdEF4aXMuUm93KTsKKyAgICAgICAgICAgICAgICAgICAgV29ya3NoZWV0QWNjZXNzb3IuQWRkUGl2b3RBeGlzKGRvYywgcGl2b3QsICJQcm9kdWN0IiwgV29ya3NoZWV0QWNjZXNzb3IuUGl2b3RBeGlzLlJvdyk7CisgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldEFjY2Vzc29yLkFkZERhdGFWYWx1ZShkb2MsIHBpdm90LCAiQW1vdW50Iik7CisgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldEFjY2Vzc29yLkFkZFBpdm90QXhpcyhkb2MsIHBpdm90LCAiUmVnaW9uIiwgV29ya3NoZWV0QWNjZXNzb3IuUGl2b3RBeGlzLlBhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJlYW1Eb2MuR2V0TW9kaWZpZWRTbWxEb2N1bWVudCgpLlNhdmVBcyhQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiTmV3UGl2b3QueGxzeCIpKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyBBZGQgcGl2b3QgdGFibGUgdG8gZXhpc3Rpbmcgc3ByZWFkc2hlZXQKKyAgICAgICAgICAgIC8vIERlbW9uc3RyYXRlIG11bHRpcGxlIGRhdGEgZmllbGRzCisgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQoCisgICAgICAgICAgICAgICAgU21sRG9jdW1lbnQuRnJvbUZpbGVOYW1lKCIuLi8uLi9RdWFydGVybHlVbml0U2FsZXMueGxzeCIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoU3ByZWFkc2hlZXREb2N1bWVudCBkb2MgPSBzdHJlYW1Eb2MuR2V0U3ByZWFkc2hlZXREb2N1bWVudCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgV29ya3NoZWV0UGFydCBwaXZvdCA9IFdvcmtzaGVldEFjY2Vzc29yLkFkZFdvcmtzaGVldChkb2MsICJQaXZvdCIpOworICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXRBY2Nlc3Nvci5DcmVhdGVQaXZvdFRhYmxlKGRvYywgIlNhbGVzIiwgcGl2b3QpOworCisgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBwaXZvdCB0YWJsZSByb3dzLCBjb2x1bW5zLCBkYXRhIGFuZCBmaWx0ZXJzCisgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldEFjY2Vzc29yLkFkZFBpdm90QXhpcyhkb2MsIHBpdm90LCAiWWVhciIsIFdvcmtzaGVldEFjY2Vzc29yLlBpdm90QXhpcy5Db2x1bW4pOworICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXRBY2Nlc3Nvci5BZGRQaXZvdEF4aXMoZG9jLCBwaXZvdCwgIlF1YXJ0ZXIiLCBXb3Jrc2hlZXRBY2Nlc3Nvci5QaXZvdEF4aXMuQ29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgV29ya3NoZWV0QWNjZXNzb3IuQWRkUGl2b3RBeGlzKGRvYywgcGl2b3QsICJDYXRlZ29yeSIsIFdvcmtzaGVldEFjY2Vzc29yLlBpdm90QXhpcy5Sb3cpOworICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXRBY2Nlc3Nvci5BZGRQaXZvdEF4aXMoZG9jLCBwaXZvdCwgIlByb2R1Y3QiLCBXb3Jrc2hlZXRBY2Nlc3Nvci5QaXZvdEF4aXMuUm93KTsKKyAgICAgICAgICAgICAgICAgICAgV29ya3NoZWV0QWNjZXNzb3IuQWRkRGF0YVZhbHVlKGRvYywgcGl2b3QsICJUb3RhbCIpOworICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXRBY2Nlc3Nvci5BZGREYXRhVmFsdWUoZG9jLCBwaXZvdCwgIlF1YW50aXR5Iik7CisgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldEFjY2Vzc29yLkFkZERhdGFWYWx1ZShkb2MsIHBpdm90LCAiVW5pdCBQcmljZSIpOworICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXRBY2Nlc3Nvci5BZGRQaXZvdEF4aXMoZG9jLCBwaXZvdCwgIlJlZ2lvbiIsIFdvcmtzaGVldEFjY2Vzc29yLlBpdm90QXhpcy5QYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyZWFtRG9jLkdldE1vZGlmaWVkU21sRG9jdW1lbnQoKS5TYXZlQXMoUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIlF1YXJ0ZXJseVVuaXRTYWxlc1dpdGhQaXZvdC54bHN4IikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QaXZvdFRhYmxlczAxL1Bpdm90VGFibGVzMDEuY3Nwcm9qIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QaXZvdFRhYmxlczAxL1Bpdm90VGFibGVzMDEuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzk0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1Bpdm90VGFibGVzMDEvUGl2b3RUYWJsZXMwMS5jc3Byb2oKQEAgLTAsMCArMSwxNSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldDQ1PC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXE9wZW5YbWxQb3dlclRvb2xzXE9wZW5YbWxQb3dlclRvb2xzLmNzcHJvaiIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJEb2N1bWVudEZvcm1hdC5PcGVuWG1sIiBWZXJzaW9uPSIyLjguMSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IldpbmRvd3NCYXNlIiAvPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1Bpdm90VGFibGVzMDEvUXVhcnRlcmx5U2FsZXMueGxzeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUGl2b3RUYWJsZXMwMS9RdWFydGVybHlTYWxlcy54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOTQ1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1Bpdm90VGFibGVzMDEvUXVhcnRlcmx5U2FsZXMueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1Bpdm90VGFibGVzMDEvUXVhcnRlcmx5VW5pdFNhbGVzLnhsc3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1Bpdm90VGFibGVzMDEvUXVhcnRlcmx5VW5pdFNhbGVzLnhsc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhZWE2NQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUGl2b3RUYWJsZXMwMS9RdWFydGVybHlVbml0U2FsZXMueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9Db21wYW5pZXMucHB0eCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUHJlc2VudGF0aW9uQnVpbGRlcjAxL0NvbXBhbmllcy5wcHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MWFmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9Db21wYW5pZXMucHB0eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9Db250b3NvIE9uZS5wcHR4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDEvQ29udG9zbyBPbmUucHB0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjg5ODc3Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDEvQ29udG9zbyBPbmUucHB0eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9Db250b3NvIFRocmVlLnBwdHggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9Db250b3NvIFRocmVlLnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4Yjk2MgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUHJlc2VudGF0aW9uQnVpbGRlcjAxL0NvbnRvc28gVGhyZWUucHB0eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9Db250b3NvIFR3by5wcHR4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDEvQ29udG9zbyBUd28ucHB0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjQzMmJmCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDEvQ29udG9zbyBUd28ucHB0eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9Db250b3NvLnBwdHggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9Db250b3NvLnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyY2Y2ZQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUHJlc2VudGF0aW9uQnVpbGRlcjAxL0NvbnRvc28ucHB0eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9DdXN0b21lciBDb250ZW50LnBwdHggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9DdXN0b21lciBDb250ZW50LnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiYWVkYgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUHJlc2VudGF0aW9uQnVpbGRlcjAxL0N1c3RvbWVyIENvbnRlbnQucHB0eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4ODFjMQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUHJlc2VudGF0aW9uQnVpbGRlcjAxL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApAQCAtMCwwICsxLDMgQEAKK0V4YW1wbGUgb3V0cHV0IGZpbGVzIGFyZSBpbiBhIERhdGVUaW1lIHN0YW1wZWQgZGlyZWN0b3J5IGluIC4vYmluL2RlYnVnLiAgVGhlIGRpcmVjdG9yeSBuYW1lIGlzIEV4YW1wbGVPdXRwdXQteXktbW0tZGQtaGhtbXNzLgorCitJZiB5b3UgYXJlIGJ1aWxkaW5nIGluIHJlbGVhc2UgbW9kZSwgdGhleSB3aWxsLCBvZiBjb3Vyc2UsIGJlIGluIC4vYmluL3JlbGVhc2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDEvUHJlc2VudGF0aW9uIE9uZS5wcHR4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDEvUHJlc2VudGF0aW9uIE9uZS5wcHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTc1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9QcmVzZW50YXRpb24gT25lLnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDEvUHJlc2VudGF0aW9uIFRocmVlLnBwdHggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9QcmVzZW50YXRpb24gVGhyZWUucHB0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTcwZjk1Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDEvUHJlc2VudGF0aW9uIFRocmVlLnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDEvUHJlc2VudGF0aW9uIFR3by5wcHR4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDEvUHJlc2VudGF0aW9uIFR3by5wcHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZjdlODIKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9QcmVzZW50YXRpb24gVHdvLnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDEvUHJlc2VudGF0aW9uQnVpbGRlcjAxLmNzIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDEvUHJlc2VudGF0aW9uQnVpbGRlcjAxLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOWEyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9QcmVzZW50YXRpb25CdWlsZGVyMDEuY3MKQEAgLTAsMCArMSw2NCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7CisKK25hbWVzcGFjZSBFeGFtcGxlUHJlc2VudGF0b25CdWlsZGVyMDEKK3sKKyAgICBjbGFzcyBFeGFtcGxlUHJlc2VudGF0aW9uQnVpbGRlcjAxCisgICAgeworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBuID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgdmFyIHRlbXBEaSA9IG5ldyBEaXJlY3RvcnlJbmZvKHN0cmluZy5Gb3JtYXQoIkV4YW1wbGVPdXRwdXQtezA6MDB9LXsxOjAwfS17MjowMH0tezM6MDB9ezQ6MDB9ezU6MDB9Iiwgbi5ZZWFyIC0gMjAwMCwgbi5Nb250aCwgbi5EYXksIG4uSG91ciwgbi5NaW51dGUsIG4uU2Vjb25kKSk7CisgICAgICAgICAgICB0ZW1wRGkuQ3JlYXRlKCk7CisKKyAgICAgICAgICAgIHN0cmluZyBzb3VyY2UxID0gIi4uLy4uL0NvbnRvc28ucHB0eCI7CisgICAgICAgICAgICBzdHJpbmcgc291cmNlMiA9ICIuLi8uLi9Db21wYW5pZXMucHB0eCI7CisgICAgICAgICAgICBzdHJpbmcgc291cmNlMyA9ICIuLi8uLi9DdXN0b21lciBDb250ZW50LnBwdHgiOworICAgICAgICAgICAgc3RyaW5nIHNvdXJjZTQgPSAiLi4vLi4vUHJlc2VudGF0aW9uIE9uZS5wcHR4IjsKKyAgICAgICAgICAgIHN0cmluZyBzb3VyY2U1ID0gIi4uLy4uL1ByZXNlbnRhdGlvbiBUd28ucHB0eCI7CisgICAgICAgICAgICBzdHJpbmcgc291cmNlNiA9ICIuLi8uLi9QcmVzZW50YXRpb24gVGhyZWUucHB0eCI7CisgICAgICAgICAgICBzdHJpbmcgY29udG9zbzEgPSAiLi4vLi4vQ29udG9zbyBPbmUucHB0eCI7CisgICAgICAgICAgICBzdHJpbmcgY29udG9zbzIgPSAiLi4vLi4vQ29udG9zbyBUd28ucHB0eCI7CisgICAgICAgICAgICBzdHJpbmcgY29udG9zbzMgPSAiLi4vLi4vQ29udG9zbyBUaHJlZS5wcHR4IjsKKyAgICAgICAgICAgIExpc3Q8U2xpZGVTb3VyY2U+IHNvdXJjZXMgPSBudWxsOworCisgICAgICAgICAgICB2YXIgc291cmNlRG9jID0gbmV3IFBtbERvY3VtZW50KHNvdXJjZTEpOworICAgICAgICAgICAgc291cmNlcyA9IG5ldyBMaXN0PFNsaWRlU291cmNlPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFNsaWRlU291cmNlKHNvdXJjZURvYywgMCwgMSwgZmFsc2UpLCAgLy8gVGl0bGUKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGVTb3VyY2Uoc291cmNlRG9jLCAxLCAxLCBmYWxzZSksICAvLyBGaXJzdCBpbnRybyAob2YgMykKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGVTb3VyY2Uoc291cmNlRG9jLCA0LCAyLCBmYWxzZSksICAvLyBTYWxlcyBiaW9zCisgICAgICAgICAgICAgICAgbmV3IFNsaWRlU291cmNlKHNvdXJjZURvYywgOSwgMywgZmFsc2UpLCAgLy8gQ29udGVudCBzbGlkZXMKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGVTb3VyY2Uoc291cmNlRG9jLCAxMywgMSwgZmFsc2UpLCAgLy8gQ2xvc2luZyBzdW1tYXJ5CisgICAgICAgICAgICB9OworICAgICAgICAgICAgUHJlc2VudGF0aW9uQnVpbGRlci5CdWlsZFByZXNlbnRhdGlvbihzb3VyY2VzLCBQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiT3V0MS5wcHR4IikpOworCisgICAgICAgICAgICBzb3VyY2VzID0gbmV3IExpc3Q8U2xpZGVTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGVTb3VyY2UobmV3IFBtbERvY3VtZW50KHNvdXJjZTIpLCAyLCAxLCB0cnVlKSwgIC8vIENob29zZSBjb21wYW55CisgICAgICAgICAgICAgICAgbmV3IFNsaWRlU291cmNlKG5ldyBQbWxEb2N1bWVudChzb3VyY2UzKSwgZmFsc2UpLCAgICAgICAvLyBDb250ZW50CisgICAgICAgICAgICB9OworICAgICAgICAgICAgUHJlc2VudGF0aW9uQnVpbGRlci5CdWlsZFByZXNlbnRhdGlvbihzb3VyY2VzLCBQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiT3V0Mi5wcHR4IikpOworCisgICAgICAgICAgICBzb3VyY2VzID0gbmV3IExpc3Q8U2xpZGVTb3VyY2U+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGVTb3VyY2UobmV3IFBtbERvY3VtZW50KHNvdXJjZTQpLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGVTb3VyY2UobmV3IFBtbERvY3VtZW50KHNvdXJjZTUpLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGVTb3VyY2UobmV3IFBtbERvY3VtZW50KHNvdXJjZTYpLCB0cnVlKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBQcmVzZW50YXRpb25CdWlsZGVyLkJ1aWxkUHJlc2VudGF0aW9uKHNvdXJjZXMsIFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsICJPdXQzLnBwdHgiKSk7CisKKyAgICAgICAgICAgIHNvdXJjZXMgPSBuZXcgTGlzdDxTbGlkZVNvdXJjZT4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBTbGlkZVNvdXJjZShuZXcgUG1sRG9jdW1lbnQoY29udG9zbzEpLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGVTb3VyY2UobmV3IFBtbERvY3VtZW50KGNvbnRvc28yKSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbmV3IFNsaWRlU291cmNlKG5ldyBQbWxEb2N1bWVudChjb250b3NvMyksIHRydWUpLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIFByZXNlbnRhdGlvbkJ1aWxkZXIuQnVpbGRQcmVzZW50YXRpb24oc291cmNlcywgUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIk91dDQucHB0eCIpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUHJlc2VudGF0aW9uQnVpbGRlcjAxL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS5jc3Byb2ogYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9QcmVzZW50YXRpb25CdWlsZGVyMDEuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzk0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMS9QcmVzZW50YXRpb25CdWlsZGVyMDEuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDIvSGlkZGVuUHJlc2VudGF0aW9uLnBwdHggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMi9IaWRkZW5QcmVzZW50YXRpb24ucHB0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzdhNzZiCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDIvSGlkZGVuUHJlc2VudGF0aW9uLnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDIvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDIvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODgxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMi9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKQEAgLTAsMCArMSwzIEBACitFeGFtcGxlIG91dHB1dCBmaWxlcyBhcmUgaW4gYSBEYXRlVGltZSBzdGFtcGVkIGRpcmVjdG9yeSBpbiAuL2Jpbi9kZWJ1Zy4gIFRoZSBkaXJlY3RvcnkgbmFtZSBpcyBFeGFtcGxlT3V0cHV0LXl5LW1tLWRkLWhobW1zcy4KKworSWYgeW91IGFyZSBidWlsZGluZyBpbiByZWxlYXNlIG1vZGUsIHRoZXkgd2lsbCwgb2YgY291cnNlLCBiZSBpbiAuL2Jpbi9yZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUHJlc2VudGF0aW9uQnVpbGRlcjAyL1ByZXNlbnRhdGlvbjEucHB0eCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUHJlc2VudGF0aW9uQnVpbGRlcjAyL1ByZXNlbnRhdGlvbjEucHB0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmU3ZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDIvUHJlc2VudGF0aW9uMS5wcHR4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUHJlc2VudGF0aW9uQnVpbGRlcjAyL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMi5jcyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUHJlc2VudGF0aW9uQnVpbGRlcjAyL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDExMjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9QcmVzZW50YXRpb25CdWlsZGVyMDIvUHJlc2VudGF0aW9uQnVpbGRlcjAyLmNzCkBAIC0wLDAgKzEsODIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7CisKK25hbWVzcGFjZSBQcmVzZW50YXRpb25CdWlsZGVyMDIKK3sKKyAgICBjbGFzcyBQcmVzZW50YXRpb25CdWlsZGVyMDIKKyAgICB7CisgICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG4gPSBEYXRlVGltZS5Ob3c7CisgICAgICAgICAgICB2YXIgdGVtcERpID0gbmV3IERpcmVjdG9yeUluZm8oc3RyaW5nLkZvcm1hdCgiRXhhbXBsZU91dHB1dC17MDowMH0tezE6MDB9LXsyOjAwfS17MzowMH17NDowMH17NTowMH0iLCBuLlllYXIgLSAyMDAwLCBuLk1vbnRoLCBuLkRheSwgbi5Ib3VyLCBuLk1pbnV0ZSwgbi5TZWNvbmQpKTsKKyAgICAgICAgICAgIHRlbXBEaS5DcmVhdGUoKTsKKworICAgICAgICAgICAgc3RyaW5nIHByZXNlbnRhdGlvbiA9ICIuLi8uLi9QcmVzZW50YXRpb24xLnBwdHgiOworICAgICAgICAgICAgc3RyaW5nIGhpZGRlblByZXNlbnRhdGlvbiA9ICIuLi8uLi9IaWRkZW5QcmVzZW50YXRpb24ucHB0eCI7CisKKyAgICAgICAgICAgIC8vIEZpcnN0LCBsb2FkIGJvdGggcHJlc2VudGF0aW9ucyBpbnRvIGJ5dGUgYXJyYXlzLCBzaW11bGF0aW5nIHJldHJpZXZpbmcgcHJlc2VudGF0aW9ucyBmcm9tIHNvbWUgc291cmNlCisgICAgICAgICAgICAvLyBzdWNoIGFzIGEgU2hhcmVQb2ludCBzZXJ2ZXIKKyAgICAgICAgICAgIHZhciBiYVByZXNlbnRhdGlvbiA9IEZpbGUuUmVhZEFsbEJ5dGVzKHByZXNlbnRhdGlvbik7CisgICAgICAgICAgICB2YXIgYmFIaWRkZW5QcmVzZW50YXRpb24gPSBGaWxlLlJlYWRBbGxCeXRlcyhoaWRkZW5QcmVzZW50YXRpb24pOworCisgICAgICAgICAgICAvLyBOZXh0LCByZXBsYWNlICJ0aGVlIiB3aXRoICJ0aGUiIGluIHRoZSBtYWluIHByZXNlbnRhdGlvbgorICAgICAgICAgICAgdmFyIHBtbE1haW5QcmVzZW50YXRpb24gPSBuZXcgUG1sRG9jdW1lbnQoIk1haW4ucHB0eCIsIGJhUHJlc2VudGF0aW9uKTsKKyAgICAgICAgICAgIFBtbERvY3VtZW50IG1vZGlmaWVkTWFpblByZXNlbnRhdGlvbiA9IG51bGw7CisgICAgICAgICAgICB1c2luZyAoT3BlblhtbE1lbW9yeVN0cmVhbURvY3VtZW50IHN0cmVhbURvYyA9IG5ldyBPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQocG1sTWFpblByZXNlbnRhdGlvbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFByZXNlbnRhdGlvbkRvY3VtZW50IGRvY3VtZW50ID0gc3RyZWFtRG9jLkdldFByZXNlbnRhdGlvbkRvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcFhEb2MgPSBkb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgc2xpZGVJZCBpbiBwWERvYy5Sb290LkVsZW1lbnRzKFAuc2xkSWRMc3QpLkVsZW1lbnRzKFAuc2xkSWQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2xpZGVSZWxJZCA9IChzdHJpbmcpc2xpZGVJZC5BdHRyaWJ1dGUoUi5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2xpZGVQYXJ0ID0gZG9jdW1lbnQuUHJlc2VudGF0aW9uUGFydC5HZXRQYXJ0QnlJZChzbGlkZVJlbElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzbGlkZVhEb2MgPSBzbGlkZVBhcnQuR2V0WERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYWdyYXBocyA9IHNsaWRlWERvYy5EZXNjZW5kYW50cyhBLnApLlRvTGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgT3BlblhtbFJlZ2V4LlJlcGxhY2UocGFyYWdyYXBocywgbmV3IFJlZ2V4KCJ0aGVlIiksICJ0aGUiLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtb2RpZmllZE1haW5QcmVzZW50YXRpb24gPSBzdHJlYW1Eb2MuR2V0TW9kaWZpZWRQbWxEb2N1bWVudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDb21iaW5lIHRoZSB0d28gcHJlc2VudGF0aW9ucyBpbnRvIGEgc2luZ2xlIHByZXNlbnRhdGlvbgorICAgICAgICAgICAgdmFyIHNsaWRlU291cmNlcyA9IG5ldyBMaXN0PFNsaWRlU291cmNlPigpIHsKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGVTb3VyY2UobW9kaWZpZWRNYWluUHJlc2VudGF0aW9uLCAwLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGVTb3VyY2UobmV3IFBtbERvY3VtZW50KCJIaWRkZW4ucHB0eCIsIGJhSGlkZGVuUHJlc2VudGF0aW9uKSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbmV3IFNsaWRlU291cmNlKG1vZGlmaWVkTWFpblByZXNlbnRhdGlvbiwgMSwgdHJ1ZSksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgUG1sRG9jdW1lbnQgY29tYmluZWRQcmVzZW50YXRpb24gPSBQcmVzZW50YXRpb25CdWlsZGVyLkJ1aWxkUHJlc2VudGF0aW9uKHNsaWRlU291cmNlcyk7CisKKyAgICAgICAgICAgIC8vIFJlcGxhY2UgPCMgVFJBREVNQVJLICM+IHdpdGggQWR2ZW50dXJlV29ya3MgKGMpCisgICAgICAgICAgICBQbWxEb2N1bWVudCBtb2RpZmllZENvbWJpbmVkUHJlc2VudGF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIHVzaW5nIChPcGVuWG1sTWVtb3J5U3RyZWFtRG9jdW1lbnQgc3RyZWFtRG9jID0gbmV3IE9wZW5YbWxNZW1vcnlTdHJlYW1Eb2N1bWVudChjb21iaW5lZFByZXNlbnRhdGlvbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFByZXNlbnRhdGlvbkRvY3VtZW50IGRvY3VtZW50ID0gc3RyZWFtRG9jLkdldFByZXNlbnRhdGlvbkRvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcFhEb2MgPSBkb2N1bWVudC5QcmVzZW50YXRpb25QYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgc2xpZGVJZCBpbiBwWERvYy5Sb290LkVsZW1lbnRzKFAuc2xkSWRMc3QpLkVsZW1lbnRzKFAuc2xkSWQpLlNraXAoMSkuVGFrZSgxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNsaWRlUmVsSWQgPSAoc3RyaW5nKXNsaWRlSWQuQXR0cmlidXRlKFIuaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNsaWRlUGFydCA9IGRvY3VtZW50LlByZXNlbnRhdGlvblBhcnQuR2V0UGFydEJ5SWQoc2xpZGVSZWxJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2xpZGVYRG9jID0gc2xpZGVQYXJ0LkdldFhEb2N1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFncmFwaHMgPSBzbGlkZVhEb2MuRGVzY2VuZGFudHMoQS5wKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5YbWxSZWdleC5SZXBsYWNlKHBhcmFncmFwaHMsIG5ldyBSZWdleCgiPCMgVFJBREVNQVJLICM+IiksICJBZHZlbnR1cmVXb3JrcyAoYykiLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlUGFydC5QdXRYRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtb2RpZmllZENvbWJpbmVkUHJlc2VudGF0aW9uID0gc3RyZWFtRG9jLkdldE1vZGlmaWVkUG1sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gd2Ugbm93IGhhdmUgYSBQbWxEb2N1bWVudCAod2hpY2ggaXMgZXNzZW50aWFsbHkgYSBieXRlIGFycmF5KSB0aGF0IGNhbiBiZSBzYXZlZCBhcyBuZWNlc3NhcnkuCisgICAgICAgICAgICBtb2RpZmllZENvbWJpbmVkUHJlc2VudGF0aW9uLlNhdmVBcyhQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiTW9kaWZpZWQucHB0eCIpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUHJlc2VudGF0aW9uQnVpbGRlcjAyL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMi5jc3Byb2ogYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMi9QcmVzZW50YXRpb25CdWlsZGVyMDIuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzk0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1ByZXNlbnRhdGlvbkJ1aWxkZXIwMi9QcmVzZW50YXRpb25CdWlsZGVyMDIuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUmVmZXJlbmNlQWRkZXIwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4ODFjMQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUmVmZXJlbmNlQWRkZXIwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKQEAgLTAsMCArMSwzIEBACitFeGFtcGxlIG91dHB1dCBmaWxlcyBhcmUgaW4gYSBEYXRlVGltZSBzdGFtcGVkIGRpcmVjdG9yeSBpbiAuL2Jpbi9kZWJ1Zy4gIFRoZSBkaXJlY3RvcnkgbmFtZSBpcyBFeGFtcGxlT3V0cHV0LXl5LW1tLWRkLWhobW1zcy4KKworSWYgeW91IGFyZSBidWlsZGluZyBpbiByZWxlYXNlIG1vZGUsIHRoZXkgd2lsbCwgb2YgY291cnNlLCBiZSBpbiAuL2Jpbi9yZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUmVmZXJlbmNlQWRkZXIwMS9SZWZlcmVuY2VBZGRlcjAxLmNzIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1JlZmVyZW5jZUFkZGVyMDEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzN2JmMQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUmVmZXJlbmNlQWRkZXIwMS9SZWZlcmVuY2VBZGRlcjAxLmNzCkBAIC0wLDAgKzEsODAgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOworCitjbGFzcyBUZXN0VG9jQWRkZXIKK3sKKyAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgeworICAgICAgICB2YXIgbiA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgdmFyIHRlbXBEaSA9IG5ldyBEaXJlY3RvcnlJbmZvKHN0cmluZy5Gb3JtYXQoIkV4YW1wbGVPdXRwdXQtezA6MDB9LXsxOjAwfS17MjowMH0tezM6MDB9ezQ6MDB9ezU6MDB9Iiwgbi5ZZWFyIC0gMjAwMCwgbi5Nb250aCwgbi5EYXksIG4uSG91ciwgbi5NaW51dGUsIG4uU2Vjb25kKSk7CisgICAgICAgIHRlbXBEaS5DcmVhdGUoKTsKKworICAgICAgICBEaXJlY3RvcnlJbmZvIGRpMiA9IG5ldyBEaXJlY3RvcnlJbmZvKCIuLi8uLi8iKTsKKyAgICAgICAgZm9yZWFjaCAodmFyIGZpbGUgaW4gZGkyLkdldEZpbGVzKCIqLmRvY3giKSkKKyAgICAgICAgICAgIGZpbGUuQ29weVRvKFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsIGZpbGUuTmFtZSkpOworCisgICAgICAgIExpc3Q8c3RyaW5nPiBmaWxlc1RvUHJvY2VzcyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKworICAgICAgICAvLyBJbnNlcnRzIGEgYmFzaWMgVE9DIGJlZm9yZSB0aGUgZmlyc3QgcGFyYWdyYXBoIG9mIHRoZSBkb2N1bWVudAorICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3ZG9jID0KKyAgICAgICAgICAgIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiVGVzdDAxLmRvY3giKSwgdHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUFkZGVyLkFkZFRvYyh3ZG9jLCAiL3c6ZG9jdW1lbnQvdzpib2R5L3c6cFsxXSIsCisgICAgICAgICAgICAgICAgQCJUT0MgXG8gJzEtMycgXGggXHogXHUiLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluc2VydHMgYSBUT0MgYWZ0ZXIgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudAorICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3ZG9jID0KKyAgICAgICAgICAgIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiVGVzdDAyLmRvY3giKSwgdHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUFkZGVyLkFkZFRvYyh3ZG9jLCAiL3c6ZG9jdW1lbnQvdzpib2R5L3c6cFsyXSIsCisgICAgICAgICAgICAgICAgQCJUT0MgXG8gJzEtMycgXGggXHogXHUiLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluc2VydHMgYSBUT0Mgd2l0aCBhIGRpZmZlcmVudCB0aXRsZQorICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3ZG9jID0KKyAgICAgICAgICAgIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiVGVzdDAzLmRvY3giKSwgdHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUFkZGVyLkFkZFRvYyh3ZG9jLCAiL3c6ZG9jdW1lbnQvdzpib2R5L3c6cFsxXSIsCisgICAgICAgICAgICAgICAgQCJUT0MgXG8gJzEtMycgXGggXHogXHUiLCAiVGFibGUgb2YgQ29udGVudHMiLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluc2VydHMgYSBUT0MgdGhhdCBpbmNsdWRlcyBoZWFkaW5ncyB0aHJvdWdoIGxldmVsIDQKKyAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgd2RvYyA9CisgICAgICAgICAgICBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIlRlc3QwNC5kb2N4IiksIHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICBSZWZlcmVuY2VBZGRlci5BZGRUb2Mod2RvYywgIi93OmRvY3VtZW50L3c6Ym9keS93OnBbMV0iLAorICAgICAgICAgICAgICAgIEAiVE9DIFxvICcxLTQnIFxoIFx6IFx1IiwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnNlcnRzIGEgdGFibGUgb2YgZmlndXJlcworICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3ZG9jID0KKyAgICAgICAgICAgIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiVGVzdDA1LmRvY3giKSwgdHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUFkZGVyLkFkZFRvZih3ZG9jLCAiL3c6ZG9jdW1lbnQvdzpib2R5L3c6cFsyXSIsCisgICAgICAgICAgICAgICAgQCJUT0MgXGggXHogXGMgIiJGaWd1cmUiIiIsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5zZXJ0cyBhIGJhc2ljIFRPQyBiZWZvcmUgdGhlIGZpcnN0IHBhcmFncmFwaCBvZiB0aGUgZG9jdW1lbnQuCisgICAgICAgIC8vIFRlc3QwNi5kb2N4IGRvZXMgbm90IGluY2x1ZGUgYSBTdHlsZXNXaXRoRWZmZWN0cyBwYXJ0LgorICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3ZG9jID0KKyAgICAgICAgICAgIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiVGVzdDA2LmRvY3giKSwgdHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUFkZGVyLkFkZFRvYyh3ZG9jLCAiL3c6ZG9jdW1lbnQvdzpib2R5L3c6cFsxXSIsCisgICAgICAgICAgICAgICAgQCJUT0MgXG8gJzEtMycgXGggXHogXHUiLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluc2VydHMgYSBUT0EgYmVmb3JlIHRoZSBmaXJzdCBwYXJhZ3JhcGggb2YgdGhlIGRvY3VtZW50LgorICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3ZG9jID0KKyAgICAgICAgICAgIFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiVGVzdDA3LmRvY3giKSwgdHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUFkZGVyLkFkZFRvYSh3ZG9jLCAiL3c6ZG9jdW1lbnQvdzpib2R5L3c6cFsyXSIsCisgICAgICAgICAgICAgICAgQCJUT0EgXGggXGMgIiIxIiIgXHAiLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUmVmZXJlbmNlQWRkZXIwMS9SZWZlcmVuY2VBZGRlcjAxLmNzcHJvaiBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUmVmZXJlbmNlQWRkZXIwMS9SZWZlcmVuY2VBZGRlcjAxLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM5NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1JlZmVyZW5jZUFkZGVyMDEuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1Rlc3QwMS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1Rlc3QwMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDJiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1JlZmVyZW5jZUFkZGVyMDEvVGVzdDAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1Rlc3QwMi5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1Rlc3QwMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNTExOWUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1JlZmVyZW5jZUFkZGVyMDEvVGVzdDAyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1Rlc3QwMy5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1Rlc3QwMy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDJiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1JlZmVyZW5jZUFkZGVyMDEvVGVzdDAzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1Rlc3QwNC5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1Rlc3QwNC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYmM4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1JlZmVyZW5jZUFkZGVyMDEvVGVzdDA0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1Rlc3QwNS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1Rlc3QwNS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMGRiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1JlZmVyZW5jZUFkZGVyMDEvVGVzdDA1LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1Rlc3QwNi5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1Rlc3QwNi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NmJlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1JlZmVyZW5jZUFkZGVyMDEvVGVzdDA2LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1Rlc3QwNy5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZWZlcmVuY2VBZGRlcjAxL1Rlc3QwNy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MGQxNmQKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1JlZmVyZW5jZUFkZGVyMDEvVGVzdDA3LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZXZpc2lvbkFjY2VwdGVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZXZpc2lvbkFjY2VwdGVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODgxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1JldmlzaW9uQWNjZXB0ZXIwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKQEAgLTAsMCArMSwzIEBACitFeGFtcGxlIG91dHB1dCBmaWxlcyBhcmUgaW4gYSBEYXRlVGltZSBzdGFtcGVkIGRpcmVjdG9yeSBpbiAuL2Jpbi9kZWJ1Zy4gIFRoZSBkaXJlY3RvcnkgbmFtZSBpcyBFeGFtcGxlT3V0cHV0LXl5LW1tLWRkLWhobW1zcy4KKworSWYgeW91IGFyZSBidWlsZGluZyBpbiByZWxlYXNlIG1vZGUsIHRoZXkgd2lsbCwgb2YgY291cnNlLCBiZSBpbiAuL2Jpbi9yZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUmV2aXNpb25BY2NlcHRlcjAxL1JldmlzaW9uQWNjZXB0ZXIwMS5jcyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUmV2aXNpb25BY2NlcHRlcjAxL1JldmlzaW9uQWNjZXB0ZXIwMS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzcyYjIzCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZXZpc2lvbkFjY2VwdGVyMDEvUmV2aXNpb25BY2NlcHRlcjAxLmNzCkBAIC0wLDAgKzEsMjMgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOworCituYW1lc3BhY2UgUmV2aXNpb25BY2NlcHRlckV4YW1wbGUKK3sKKyAgICBjbGFzcyBSZXZpc2lvbkFjY2VwdGVyRXhhbXBsZQorICAgIHsKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbiA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgIHZhciB0ZW1wRGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhzdHJpbmcuRm9ybWF0KCJFeGFtcGxlT3V0cHV0LXswOjAwfS17MTowMH0tezI6MDB9LXszOjAwfXs0OjAwfXs1OjAwfSIsIG4uWWVhciAtIDIwMDAsIG4uTW9udGgsIG4uRGF5LCBuLkhvdXIsIG4uTWludXRlLCBuLlNlY29uZCkpOworICAgICAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgICAgICAvLyBBY2NlcHQgYWxsIHJldmlzaW9ucywgc2F2ZSByZXN1bHQgYXMgYSBuZXcgZG9jdW1lbnQKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHJlc3VsdCA9IFJldmlzaW9uQWNjZXB0ZXIuQWNjZXB0UmV2aXNpb25zKG5ldyBXbWxEb2N1bWVudCgiLi4vLi4vU291cmNlMS5kb2N4IikpOworICAgICAgICAgICAgcmVzdWx0LlNhdmVBcyhQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiT3V0MS5kb2N4IikpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9SZXZpc2lvbkFjY2VwdGVyMDEvUmV2aXNpb25BY2NlcHRlcjAxLmNzcHJvaiBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUmV2aXNpb25BY2NlcHRlcjAxL1JldmlzaW9uQWNjZXB0ZXIwMS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjOTRkOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUmV2aXNpb25BY2NlcHRlcjAxL1JldmlzaW9uQWNjZXB0ZXIwMS5jc3Byb2oKQEAgLTAsMCArMSwxNSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldDQ1PC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXE9wZW5YbWxQb3dlclRvb2xzXE9wZW5YbWxQb3dlclRvb2xzLmNzcHJvaiIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJEb2N1bWVudEZvcm1hdC5PcGVuWG1sIiBWZXJzaW9uPSIyLjguMSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IldpbmRvd3NCYXNlIiAvPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1JldmlzaW9uQWNjZXB0ZXIwMS9Tb3VyY2UxLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1JldmlzaW9uQWNjZXB0ZXIwMS9Tb3VyY2UxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiNDI4MQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvUmV2aXNpb25BY2NlcHRlcjAxL1NvdXJjZTEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1NtbERhdGFSZXRyaWV2ZXIwMS9TYW1wbGVTcHJlYWRzaGVldC54bHN4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9TbWxEYXRhUmV0cmlldmVyMDEvU2FtcGxlU3ByZWFkc2hlZXQueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmFmZGUxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9TbWxEYXRhUmV0cmlldmVyMDEvU2FtcGxlU3ByZWFkc2hlZXQueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1NtbERhdGFSZXRyaWV2ZXIwMS9TbWxEYXRhUmV0cmlldmVyMDEuY3MgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1NtbERhdGFSZXRyaWV2ZXIwMS9TbWxEYXRhUmV0cmlldmVyMDEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5NGM5YgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvU21sRGF0YVJldHJpZXZlcjAxL1NtbERhdGFSZXRyaWV2ZXIwMS5jcwpAQCAtMCwwICsxLDMyIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOworCituYW1lc3BhY2UgT3BlblhtbFBvd2VyVG9vbHMKK3sKKyAgICBjbGFzcyBTbWxEYXRhUmV0cmlldmVyMDEKKyAgICB7CisgICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gZmkgPSBudWxsOworICAgICAgICAgICAgZmkgPSBuZXcgRmlsZUluZm8oIi4uLy4uL1NhbXBsZVNwcmVhZHNoZWV0Lnhsc3giKTsKKworICAgICAgICAgICAgLy8gUmV0cmlldmUgcmFuZ2UgZnJvbSBTaGVldDEKKyAgICAgICAgICAgIFhFbGVtZW50IGRhdGEgPSBTbWxEYXRhUmV0cmlldmVyLlJldHJpZXZlUmFuZ2UoZmkuRnVsbE5hbWUsICJTaGVldDEiLCAiQTE6QzMiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGRhdGEpOworCisgICAgICAgICAgICAvLyBSZXRyaWV2ZSBlbnRpcmUgc2hlZXQKKyAgICAgICAgICAgIGRhdGEgPSBTbWxEYXRhUmV0cmlldmVyLlJldHJpZXZlU2hlZXQoZmkuRnVsbE5hbWUsICJTaGVldDEiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGRhdGEpOworCisgICAgICAgICAgICAvLyBSZXRyaWV2ZSB0YWJsZQorICAgICAgICAgICAgZGF0YSA9IFNtbERhdGFSZXRyaWV2ZXIuUmV0cmlldmVUYWJsZShmaS5GdWxsTmFtZSwgIlZlaGljbGVUYWJsZSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZGF0YSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1NtbERhdGFSZXRyaWV2ZXIwMS9TbWxEYXRhUmV0cmlldmVyMDEuY3Nwcm9qIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9TbWxEYXRhUmV0cmlldmVyMDEvU21sRGF0YVJldHJpZXZlcjAxLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM5NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9TbWxEYXRhUmV0cmlldmVyMDEvU21sRGF0YVJldHJpZXZlcjAxLmNzcHJvagpAQCAtMCwwICsxLDE1IEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0NDU8L1RhcmdldEZyYW1ld29yaz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cT3BlblhtbFBvd2VyVG9vbHNcT3BlblhtbFBvd2VyVG9vbHMuY3Nwcm9qIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkRvY3VtZW50Rm9ybWF0Lk9wZW5YbWwiIFZlcnNpb249IjIuOC4xIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iV2luZG93c0Jhc2UiIC8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvU3ByZWFkc2hlZXRXcml0ZXIwMS9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1NwcmVhZHNoZWV0V3JpdGVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODgxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1NwcmVhZHNoZWV0V3JpdGVyMDEvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0CkBAIC0wLDAgKzEsMyBAQAorRXhhbXBsZSBvdXRwdXQgZmlsZXMgYXJlIGluIGEgRGF0ZVRpbWUgc3RhbXBlZCBkaXJlY3RvcnkgaW4gLi9iaW4vZGVidWcuICBUaGUgZGlyZWN0b3J5IG5hbWUgaXMgRXhhbXBsZU91dHB1dC15eS1tbS1kZC1oaG1tc3MuCisKK0lmIHlvdSBhcmUgYnVpbGRpbmcgaW4gcmVsZWFzZSBtb2RlLCB0aGV5IHdpbGwsIG9mIGNvdXJzZSwgYmUgaW4gLi9iaW4vcmVsZWFzZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1NwcmVhZHNoZWV0V3JpdGVyMDEvU3ByZWFkc2hlZXRXcml0ZXIwMS5jcyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvU3ByZWFkc2hlZXRXcml0ZXIwMS9TcHJlYWRzaGVldFdyaXRlcjAxLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YmMyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1NwcmVhZHNoZWV0V3JpdGVyMDEvU3ByZWFkc2hlZXRXcml0ZXIwMS5jcwpAQCAtMCwwICsxLDk2IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKKworbmFtZXNwYWNlIFNwcmVhZHNoZWV0V3JpdGVyRXhhbXBsZQoreworICAgIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG4gPSBEYXRlVGltZS5Ob3c7CisgICAgICAgICAgICB2YXIgdGVtcERpID0gbmV3IERpcmVjdG9yeUluZm8oc3RyaW5nLkZvcm1hdCgiRXhhbXBsZU91dHB1dC17MDowMH0tezE6MDB9LXsyOjAwfS17MzowMH17NDowMH17NTowMH0iLCBuLlllYXIgLSAyMDAwLCBuLk1vbnRoLCBuLkRheSwgbi5Ib3VyLCBuLk1pbnV0ZSwgbi5TZWNvbmQpKTsKKyAgICAgICAgICAgIHRlbXBEaS5DcmVhdGUoKTsKKworICAgICAgICAgICAgV29ya2Jvb2tEZm4gd2IgPSBuZXcgV29ya2Jvb2tEZm4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXb3Jrc2hlZXRzID0gbmV3IFdvcmtzaGVldERmbltdCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXcgV29ya3NoZWV0RGZuCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiTXlGaXJzdFNoZWV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTmFtZSA9ICJOYW1lc0FuZFJhdGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkhlYWRpbmdzID0gbmV3IENlbGxEZm5bXQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDZWxsRGZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJOYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9sZCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2VsbERmbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiQWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9sZCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvcml6b250YWxDZWxsQWxpZ25tZW50ID0gSG9yaXpvbnRhbENlbGxBbGlnbm1lbnQuTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDZWxsRGZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJSYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9sZCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvcml6b250YWxDZWxsQWxpZ25tZW50ID0gSG9yaXpvbnRhbENlbGxBbGlnbm1lbnQuTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgUm93cyA9IG5ldyBSb3dEZm5bXQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSb3dEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxzID0gbmV3IENlbGxEZm5bXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gQ2VsbERhdGFUeXBlLlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJFcmljIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gQ2VsbERhdGFUeXBlLk51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBDZWxsRGF0YVR5cGUuTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gKGRlY2ltYWwpNDUuMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0Q29kZSA9ICIwLjAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSb3dEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxzID0gbmV3IENlbGxEZm5bXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gQ2VsbERhdGFUeXBlLlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJCb2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBDZWxsRGF0YVR5cGUuTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gNDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IENlbGxEYXRhVHlwZS5OdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAoZGVjaW1hbCk3OC4wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXRDb2RlID0gIjAuMDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgU3ByZWFkc2hlZXRXcml0ZXIuV3JpdGUoUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIlRlc3QxLnhsc3giKSwgd2IpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9TcHJlYWRzaGVldFdyaXRlcjAxL1NwcmVhZHNoZWV0V3JpdGVyMDEuY3Nwcm9qIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9TcHJlYWRzaGVldFdyaXRlcjAxL1NwcmVhZHNoZWV0V3JpdGVyMDEuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzk0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1NwcmVhZHNoZWV0V3JpdGVyMDEvU3ByZWFkc2hlZXRXcml0ZXIwMS5jc3Byb2oKQEAgLTAsMCArMSwxNSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldDQ1PC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXE9wZW5YbWxQb3dlclRvb2xzXE9wZW5YbWxQb3dlclRvb2xzLmNzcHJvaiIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJEb2N1bWVudEZvcm1hdC5PcGVuWG1sIiBWZXJzaW9uPSIyLjguMSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IldpbmRvd3NCYXNlIiAvPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1NwcmVhZHNoZWV0V3JpdGVyMDIvTm90ZS1FeGFtcGxlT3V0cHV0LWZpbGVzLWFyZS1pbi1iaW4tZGVidWcudHh0IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9TcHJlYWRzaGVldFdyaXRlcjAyL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODg4MWMxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9TcHJlYWRzaGVldFdyaXRlcjAyL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApAQCAtMCwwICsxLDMgQEAKK0V4YW1wbGUgb3V0cHV0IGZpbGVzIGFyZSBpbiBhIERhdGVUaW1lIHN0YW1wZWQgZGlyZWN0b3J5IGluIC4vYmluL2RlYnVnLiAgVGhlIGRpcmVjdG9yeSBuYW1lIGlzIEV4YW1wbGVPdXRwdXQteXktbW0tZGQtaGhtbXNzLgorCitJZiB5b3UgYXJlIGJ1aWxkaW5nIGluIHJlbGVhc2UgbW9kZSwgdGhleSB3aWxsLCBvZiBjb3Vyc2UsIGJlIGluIC4vYmluL3JlbGVhc2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9TcHJlYWRzaGVldFdyaXRlcjAyL1NwcmVhZHNoZWV0V3JpdGVyMDIuY3MgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1NwcmVhZHNoZWV0V3JpdGVyMDIvU3ByZWFkc2hlZXRXcml0ZXIwMi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjIwNTViCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9TcHJlYWRzaGVldFdyaXRlcjAyL1NwcmVhZHNoZWV0V3JpdGVyMDIuY3MKQEAgLTAsMCArMSwyMjQgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOworCituYW1lc3BhY2UgU3ByZWFkc2hlZXRXcml0ZXJFeGFtcGxlCit7CisgICAgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbiA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgIHZhciB0ZW1wRGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhzdHJpbmcuRm9ybWF0KCJFeGFtcGxlT3V0cHV0LXswOjAwfS17MTowMH0tezI6MDB9LXszOjAwfXs0OjAwfXs1OjAwfSIsIG4uWWVhciAtIDIwMDAsIG4uTW9udGgsIG4uRGF5LCBuLkhvdXIsIG4uTWludXRlLCBuLlNlY29uZCkpOworICAgICAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgICAgICBXb3JrYm9va0RmbiB3YiA9IG5ldyBXb3JrYm9va0RmbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdvcmtzaGVldHMgPSBuZXcgV29ya3NoZWV0RGZuW10KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBXb3Jrc2hlZXREZm4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJNeUZpcnN0U2hlZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uSGVhZGluZ3MgPSBuZXcgQ2VsbERmbltdCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENlbGxEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gIkRhdGFUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9sZCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2VsbERmbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiVmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9yaXpvbnRhbENlbGxBbGlnbm1lbnQgPSBIb3Jpem9udGFsQ2VsbEFsaWdubWVudC5SaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJvd3MgPSBuZXcgUm93RGZuW10KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUm93RGZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxscyA9IG5ldyBDZWxsRGZuW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IENlbGxEYXRhVHlwZS5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiQm9vbGVhbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IENlbGxEYXRhVHlwZS5Cb29sZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSb3dEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxzID0gbmV3IENlbGxEZm5bXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gQ2VsbERhdGFUeXBlLlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJCb29sZWFuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gQ2VsbERhdGFUeXBlLkJvb2xlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSb3dEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxzID0gbmV3IENlbGxEZm5bXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gQ2VsbERhdGFUeXBlLlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJTdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBDZWxsRGF0YVR5cGUuU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gIkEgU3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb3Jpem9udGFsQ2VsbEFsaWdubWVudCA9IEhvcml6b250YWxDZWxsQWxpZ25tZW50LlJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJvd0RmbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHMgPSBuZXcgQ2VsbERmbltdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBDZWxsRGF0YVR5cGUuU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gImludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IENlbGxEYXRhVHlwZS5OdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAoaW50KTEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSb3dEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxzID0gbmV3IENlbGxEZm5bXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gQ2VsbERhdGFUeXBlLlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJpbnQ/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gQ2VsbERhdGFUeXBlLk51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IChpbnQ/KTEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSb3dEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxzID0gbmV3IENlbGxEZm5bXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gQ2VsbERhdGFUeXBlLlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJpbnQ/IChpcyBudWxsKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IENlbGxEYXRhVHlwZS5OdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJvd0RmbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHMgPSBuZXcgQ2VsbERmbltdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBDZWxsRGF0YVR5cGUuU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gInVpbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBDZWxsRGF0YVR5cGUuTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gKHVpbnQpMTAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJvd0RmbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHMgPSBuZXcgQ2VsbERmbltdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBDZWxsRGF0YVR5cGUuU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gImxvbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBDZWxsRGF0YVR5cGUuTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gSW50NjQuTWF4VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUm93RGZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxscyA9IG5ldyBDZWxsRGZuW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IENlbGxEYXRhVHlwZS5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiZmxvYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBDZWxsRGF0YVR5cGUuTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gKGZsb2F0KTEyMy40NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSb3dEZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxzID0gbmV3IENlbGxEZm5bXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2VsbERmbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbERhdGFUeXBlID0gQ2VsbERhdGFUeXBlLlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJkb3VibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBDZWxsRGF0YVR5cGUuTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gKGRvdWJsZSkxMjMuNDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUm93RGZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxscyA9IG5ldyBDZWxsRGZuW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IENlbGxEYXRhVHlwZS5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiZGVjaW1hbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IENlbGxEYXRhVHlwZS5OdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAoZGVjaW1hbCkxMjMuNDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUm93RGZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxscyA9IG5ldyBDZWxsRGZuW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENlbGxEZm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxEYXRhVHlwZSA9IENlbGxEYXRhVHlwZS5EYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTIsIDEsIDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdENvZGUgPSAibW0tZGQteXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDZWxsRGZuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsRGF0YVR5cGUgPSBDZWxsRGF0YVR5cGUuRGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEyLCAxLCA5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXRDb2RlID0gIm1tLWRkLXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb3Jpem9udGFsQ2VsbEFsaWdubWVudCA9IEhvcml6b250YWxDZWxsQWxpZ25tZW50LkNlbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIFNwcmVhZHNoZWV0V3JpdGVyLldyaXRlKFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsICJUZXN0Mi54bHN4IiksIHdiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvU3ByZWFkc2hlZXRXcml0ZXIwMi9TcHJlYWRzaGVldFdyaXRlcjAyLmNzcHJvaiBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvU3ByZWFkc2hlZXRXcml0ZXIwMi9TcHJlYWRzaGVldFdyaXRlcjAyLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM5NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9TcHJlYWRzaGVldFdyaXRlcjAyL1NwcmVhZHNoZWV0V3JpdGVyMDIuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9UZXh0UmVwbGFjZXIwMS9UZXN0MDEucHB0eCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDEvVGVzdDAxLnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0M2U2ZgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDEvVGVzdDAxLnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9UZXh0UmVwbGFjZXIwMS9UZXN0MDIucHB0eCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDEvVGVzdDAyLnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyMWU1NAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDEvVGVzdDAyLnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9UZXh0UmVwbGFjZXIwMS9UZXN0MDMucHB0eCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDEvVGVzdDAzLnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyMWU1NAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDEvVGVzdDAzLnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9UZXh0UmVwbGFjZXIwMS9UZXh0UmVwbGFjZXIwMS5jcyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDEvVGV4dFJlcGxhY2VyMDEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIzMzc3NwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDEvVGV4dFJlcGxhY2VyMDEuY3MKQEAgLTAsMCArMSwzNiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKKworY2xhc3MgVGVzdFBtbFRleHRSZXBsYWNlcgoreworICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICB7CisgICAgICAgIHZhciBuID0gRGF0ZVRpbWUuTm93OworICAgICAgICB2YXIgdGVtcERpID0gbmV3IERpcmVjdG9yeUluZm8oc3RyaW5nLkZvcm1hdCgiRXhhbXBsZU91dHB1dC17MDowMH0tezE6MDB9LXsyOjAwfS17MzowMH17NDowMH17NTowMH0iLCBuLlllYXIgLSAyMDAwLCBuLk1vbnRoLCBuLkRheSwgbi5Ib3VyLCBuLk1pbnV0ZSwgbi5TZWNvbmQpKTsKKyAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgIEZpbGUuQ29weSgiLi4vLi4vVGVzdDAxLnBwdHgiLCBQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiVGVzdDAxb3V0LnBwdHgiKSk7CisgICAgICAgIHVzaW5nIChQcmVzZW50YXRpb25Eb2N1bWVudCBwRG9jID0KKyAgICAgICAgICAgIFByZXNlbnRhdGlvbkRvY3VtZW50Lk9wZW4oUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIlRlc3QwMW91dC5wcHR4IiksIHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICBUZXh0UmVwbGFjZXIuU2VhcmNoQW5kUmVwbGFjZShwRG9jLCAiSGVsbG8iLCAiR29vZGJ5ZSIsIHRydWUpOworICAgICAgICB9CisgICAgICAgIEZpbGUuQ29weSgiLi4vLi4vVGVzdDAyLnBwdHgiLCBQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiVGVzdDAyb3V0LnBwdHgiKSk7CisgICAgICAgIHVzaW5nIChQcmVzZW50YXRpb25Eb2N1bWVudCBwRG9jID0KKyAgICAgICAgICAgIFByZXNlbnRhdGlvbkRvY3VtZW50Lk9wZW4oUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIlRlc3QwMm91dC5wcHR4IiksIHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICBUZXh0UmVwbGFjZXIuU2VhcmNoQW5kUmVwbGFjZShwRG9jLCAiSGVsbG8iLCAiR29vZGJ5ZSIsIHRydWUpOworICAgICAgICB9CisgICAgICAgIEZpbGUuQ29weSgiLi4vLi4vVGVzdDAzLnBwdHgiLCBQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiVGVzdDAzb3V0LnBwdHgiKSk7CisgICAgICAgIHVzaW5nIChQcmVzZW50YXRpb25Eb2N1bWVudCBwRG9jID0KKyAgICAgICAgICAgIFByZXNlbnRhdGlvbkRvY3VtZW50Lk9wZW4oUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIlRlc3QwM291dC5wcHR4IiksIHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICBUZXh0UmVwbGFjZXIuU2VhcmNoQW5kUmVwbGFjZShwRG9jLCAiSGVsbG8iLCAiR29vZGJ5ZSIsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDEvVGV4dFJlcGxhY2VyMDEuY3Nwcm9qIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9UZXh0UmVwbGFjZXIwMS9UZXh0UmVwbGFjZXIwMS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjOTRkOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDEvVGV4dFJlcGxhY2VyMDEuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9UZXh0UmVwbGFjZXIwMi9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL05vdGUtRXhhbXBsZU91dHB1dC1maWxlcy1hcmUtaW4tYmluLWRlYnVnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODg4MWMxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9UZXh0UmVwbGFjZXIwMi9Ob3RlLUV4YW1wbGVPdXRwdXQtZmlsZXMtYXJlLWluLWJpbi1kZWJ1Zy50eHQKQEAgLTAsMCArMSwzIEBACitFeGFtcGxlIG91dHB1dCBmaWxlcyBhcmUgaW4gYSBEYXRlVGltZSBzdGFtcGVkIGRpcmVjdG9yeSBpbiAuL2Jpbi9kZWJ1Zy4gIFRoZSBkaXJlY3RvcnkgbmFtZSBpcyBFeGFtcGxlT3V0cHV0LXl5LW1tLWRkLWhobW1zcy4KKworSWYgeW91IGFyZSBidWlsZGluZyBpbiByZWxlYXNlIG1vZGUsIHRoZXkgd2lsbCwgb2YgY291cnNlLCBiZSBpbiAuL2Jpbi9yZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDIvVGVzdDAxLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOGVjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDIvVGVzdDAyLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NjNlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDIvVGVzdDAzLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwMy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MzBmYzUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwMy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDIvVGVzdDA0LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwNC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOGVjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwNC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDIvVGVzdDA1LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwNS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNmMxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwNS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDIvVGVzdDA2LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwNi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOWI2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwNi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDIvVGVzdDA3LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwNy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYjZmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwNy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDIvVGVzdDA4LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwOC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMmQ1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwOC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDIvVGVzdDA5LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwOS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMjE3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1Rlc3QwOS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDIvVGV4dFJlcGxhY2VyMDIuY3MgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1RleHRSZXBsYWNlcjAyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYTMwYTQKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1RleHRSZXBsYWNlcjAyL1RleHRSZXBsYWNlcjAyLmNzCkBAIC0wLDAgKzEsNTIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWwuTGlucTsKK3VzaW5nIERvY3VtZW50Rm9ybWF0Lk9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgT3BlblhtbFBvd2VyVG9vbHM7CisKK25hbWVzcGFjZSBPcGVuWG1sUG93ZXJUb29scworeworICAgIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG4gPSBEYXRlVGltZS5Ob3c7CisgICAgICAgICAgICB2YXIgdGVtcERpID0gbmV3IERpcmVjdG9yeUluZm8oc3RyaW5nLkZvcm1hdCgiRXhhbXBsZU91dHB1dC17MDowMH0tezE6MDB9LXsyOjAwfS17MzowMH17NDowMH17NTowMH0iLCBuLlllYXIgLSAyMDAwLCBuLk1vbnRoLCBuLkRheSwgbi5Ib3VyLCBuLk1pbnV0ZSwgbi5TZWNvbmQpKTsKKyAgICAgICAgICAgIHRlbXBEaS5DcmVhdGUoKTsKKworICAgICAgICAgICAgRGlyZWN0b3J5SW5mbyBkaTIgPSBuZXcgRGlyZWN0b3J5SW5mbygiLi4vLi4vIik7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZmlsZSBpbiBkaTIuR2V0RmlsZXMoIiouZG9jeCIpKQorICAgICAgICAgICAgICAgIGZpbGUuQ29weVRvKFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsIGZpbGUuTmFtZSkpOworCisgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIlRlc3QwMS5kb2N4IiksIHRydWUpKQorICAgICAgICAgICAgICAgIFRleHRSZXBsYWNlci5TZWFyY2hBbmRSZXBsYWNlKGRvYywgInRoZSIsICJ0aGlzIiwgZmFsc2UpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsICJUZXN0MDIuZG9jeCIpLCB0cnVlKSkKKyAgICAgICAgICAgICAgICAgICAgVGV4dFJlcGxhY2VyLlNlYXJjaEFuZFJlcGxhY2UoZG9jLCAidGhlIiwgInRoaXMiLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKSB7IH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IGRvYyA9IFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQuT3BlbihQYXRoLkNvbWJpbmUodGVtcERpLkZ1bGxOYW1lLCAiVGVzdDAzLmRvY3giKSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgIFRleHRSZXBsYWNlci5TZWFyY2hBbmRSZXBsYWNlKGRvYywgInRoZSIsICJ0aGlzIiwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikgeyB9CisgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIlRlc3QwNC5kb2N4IiksIHRydWUpKQorICAgICAgICAgICAgICAgIFRleHRSZXBsYWNlci5TZWFyY2hBbmRSZXBsYWNlKGRvYywgInRoZSIsICJ0aGlzIiwgdHJ1ZSk7CisgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIlRlc3QwNS5kb2N4IiksIHRydWUpKQorICAgICAgICAgICAgICAgIFRleHRSZXBsYWNlci5TZWFyY2hBbmRSZXBsYWNlKGRvYywgImlzIG9uIiwgImlzIGFib3ZlIiwgdHJ1ZSk7CisgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCBkb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4oUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIlRlc3QwNi5kb2N4IiksIHRydWUpKQorICAgICAgICAgICAgICAgIFRleHRSZXBsYWNlci5TZWFyY2hBbmRSZXBsYWNlKGRvYywgInRoZSIsICJ0aGlzIiwgZmFsc2UpOworICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsICJUZXN0MDcuZG9jeCIpLCB0cnVlKSkKKyAgICAgICAgICAgICAgICBUZXh0UmVwbGFjZXIuU2VhcmNoQW5kUmVwbGFjZShkb2MsICJ0aGUiLCAidGhpcyIsIHRydWUpOworICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsICJUZXN0MDguZG9jeCIpLCB0cnVlKSkKKyAgICAgICAgICAgICAgICBUZXh0UmVwbGFjZXIuU2VhcmNoQW5kUmVwbGFjZShkb2MsICJ0aGUiLCAidGhpcyIsIHRydWUpOworICAgICAgICAgICAgdXNpbmcgKFdvcmRwcm9jZXNzaW5nRG9jdW1lbnQgZG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsICJUZXN0MDkuZG9jeCIpLCB0cnVlKSkKKyAgICAgICAgICAgICAgICBUZXh0UmVwbGFjZXIuU2VhcmNoQW5kUmVwbGFjZShkb2MsICI9PT09PSBSZXBsYWNlIHRoaXMgdGV4dCA9PT09PSIsICIqKip6enoqKioiLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDIvVGV4dFJlcGxhY2VyMDIuY3Nwcm9qIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9UZXh0UmVwbGFjZXIwMi9UZXh0UmVwbGFjZXIwMi5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjOTRkOQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvVGV4dFJlcGxhY2VyMDIvVGV4dFJlcGxhY2VyMDIuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxDb21wYXJlcjAxL1NvdXJjZTEuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sQ29tcGFyZXIwMS9Tb3VyY2UxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlYzJmOAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sQ29tcGFyZXIwMS9Tb3VyY2UxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxDb21wYXJlcjAxL1NvdXJjZTIuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sQ29tcGFyZXIwMS9Tb3VyY2UyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzNGE4ZgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sQ29tcGFyZXIwMS9Tb3VyY2UyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxDb21wYXJlcjAxL1dtbENvbXBhcmVyMDEuY3MgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbENvbXBhcmVyMDEvV21sQ29tcGFyZXIwMS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2NlMmEwCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxDb21wYXJlcjAxL1dtbENvbXBhcmVyMDEuY3MKQEAgLTAsMCArMSwzNyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgY2xhc3MgV21sQ29tcGFyZXIwMQorICAgIHsKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbiA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgIHZhciB0ZW1wRGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhzdHJpbmcuRm9ybWF0KCJFeGFtcGxlT3V0cHV0LXswOjAwfS17MTowMH0tezI6MDB9LXszOjAwfXs0OjAwfXs1OjAwfSIsIG4uWWVhciAtIDIwMDAsIG4uTW9udGgsIG4uRGF5LCBuLkhvdXIsIG4uTWludXRlLCBuLlNlY29uZCkpOworICAgICAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgICAgICBXbWxDb21wYXJlclNldHRpbmdzIHNldHRpbmdzID0gbmV3IFdtbENvbXBhcmVyU2V0dGluZ3MoKTsKKyAgICAgICAgICAgIFdtbERvY3VtZW50IHJlc3VsdCA9IFdtbENvbXBhcmVyLkNvbXBhcmUoCisgICAgICAgICAgICAgICAgbmV3IFdtbERvY3VtZW50KCIuLi8uLi9Tb3VyY2UxLmRvY3giKSwKKyAgICAgICAgICAgICAgICBuZXcgV21sRG9jdW1lbnQoIi4uLy4uL1NvdXJjZTIuZG9jeCIpLAorICAgICAgICAgICAgICAgIHNldHRpbmdzKTsKKyAgICAgICAgICAgIHJlc3VsdC5TYXZlQXMoUGF0aC5Db21iaW5lKHRlbXBEaS5GdWxsTmFtZSwgIkNvbXBhcmVkLmRvY3giKSk7CisKKyAgICAgICAgICAgIHZhciByZXZpc2lvbnMgPSBXbWxDb21wYXJlci5HZXRSZXZpc2lvbnMocmVzdWx0LCBzZXR0aW5ncyk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcmV2IGluIHJldmlzaW9ucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQXV0aG9yOiAiICsgcmV2LkF1dGhvcik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJldmlzaW9uIHR5cGU6ICIgKyByZXYuUmV2aXNpb25UeXBlKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUmV2aXNpb24gdGV4dDogIiArIHJldi5UZXh0KTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxDb21wYXJlcjAxL1dtbENvbXBhcmVyMDEuY3Nwcm9qIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxDb21wYXJlcjAxL1dtbENvbXBhcmVyMDEuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzk0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbENvbXBhcmVyMDEvV21sQ29tcGFyZXIwMS5jc3Byb2oKQEAgLTAsMCArMSwxNSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldDQ1PC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXE9wZW5YbWxQb3dlclRvb2xzXE9wZW5YbWxQb3dlclRvb2xzLmNzcHJvaiIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJEb2N1bWVudEZvcm1hdC5PcGVuWG1sIiBWZXJzaW9uPSIyLjguMSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IldpbmRvd3NCYXNlIiAvPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbENvbXBhcmVyMDIvT3JpZ2luYWwuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sQ29tcGFyZXIwMi9PcmlnaW5hbC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YmZhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbENvbXBhcmVyMDIvT3JpZ2luYWwuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbENvbXBhcmVyMDIvUmV2aXNlZEJ5Qm9iLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbENvbXBhcmVyMDIvUmV2aXNlZEJ5Qm9iLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5NjE2MwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sQ29tcGFyZXIwMi9SZXZpc2VkQnlCb2IuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbENvbXBhcmVyMDIvUmV2aXNlZEJ5TWFyeS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxDb21wYXJlcjAyL1JldmlzZWRCeU1hcnkuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWE1YTU5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxDb21wYXJlcjAyL1JldmlzZWRCeU1hcnkuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbENvbXBhcmVyMDIvV21sQ29tcGFyZXIwMi5jcyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sQ29tcGFyZXIwMi9XbWxDb21wYXJlcjAyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODQzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbENvbXBhcmVyMDIvV21sQ29tcGFyZXIwMi5jcwpAQCAtMCwwICsxLDQ3IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkRyYXdpbmcuSW1hZ2luZzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgY2xhc3MgV21sQ29tcGFyZXIwMgorICAgIHsKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbiA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgIHZhciB0ZW1wRGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhzdHJpbmcuRm9ybWF0KCJFeGFtcGxlT3V0cHV0LXswOjAwfS17MTowMH0tezI6MDB9LXszOjAwfXs0OjAwfXs1OjAwfSIsIG4uWWVhciAtIDIwMDAsIG4uTW9udGgsIG4uRGF5LCBuLkhvdXIsIG4uTWludXRlLCBuLlNlY29uZCkpOworICAgICAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgICAgICBXbWxEb2N1bWVudCBvcmlnaW5hbFdtbCA9IG5ldyBXbWxEb2N1bWVudCgiLi4vLi4vT3JpZ2luYWwuZG9jeCIpOworICAgICAgICAgICAgTGlzdDxXbWxSZXZpc2VkRG9jdW1lbnRJbmZvPiByZXZpc2VkRG9jdW1lbnRJbmZvTGlzdCA9IG5ldyBMaXN0PFdtbFJldmlzZWREb2N1bWVudEluZm8+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgV21sUmV2aXNlZERvY3VtZW50SW5mbygpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSZXZpc2VkRG9jdW1lbnQgPSBuZXcgV21sRG9jdW1lbnQoIi4uLy4uL1JldmlzZWRCeUJvYi5kb2N4IiksCisgICAgICAgICAgICAgICAgICAgIFJldmlzb3IgPSAiQm9iIiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IgPSBDb2xvci5MaWdodEJsdWUsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBuZXcgV21sUmV2aXNlZERvY3VtZW50SW5mbygpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSZXZpc2VkRG9jdW1lbnQgPSBuZXcgV21sRG9jdW1lbnQoIi4uLy4uL1JldmlzZWRCeU1hcnkuZG9jeCIpLAorICAgICAgICAgICAgICAgICAgICBSZXZpc29yID0gIk1hcnkiLAorICAgICAgICAgICAgICAgICAgICBDb2xvciA9IENvbG9yLkxpZ2h0WWVsbG93LAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9OworICAgICAgICAgICAgV21sQ29tcGFyZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBXbWxDb21wYXJlclNldHRpbmdzKCk7CisgICAgICAgICAgICBXbWxEb2N1bWVudCBjb25zb2xpZGF0ZWRXbWwgPSBXbWxDb21wYXJlci5Db25zb2xpZGF0ZSgKKyAgICAgICAgICAgICAgICBvcmlnaW5hbFdtbCwKKyAgICAgICAgICAgICAgICByZXZpc2VkRG9jdW1lbnRJbmZvTGlzdCwKKyAgICAgICAgICAgICAgICBzZXR0aW5ncyk7CisgICAgICAgICAgICBjb25zb2xpZGF0ZWRXbWwuU2F2ZUFzKFBhdGguQ29tYmluZSh0ZW1wRGkuRnVsbE5hbWUsICJDb25zb2xpZGF0ZWQuZG9jeCIpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sQ29tcGFyZXIwMi9XbWxDb21wYXJlcjAyLmNzcHJvaiBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sQ29tcGFyZXIwMi9XbWxDb21wYXJlcjAyLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM5NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxDb21wYXJlcjAyL1dtbENvbXBhcmVyMDIuY3Nwcm9qCkBAIC0wLDAgKzEsMTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0NTwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxPcGVuWG1sUG93ZXJUb29sc1xPcGVuWG1sUG93ZXJUb29scy5jc3Byb2oiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iRG9jdW1lbnRGb3JtYXQuT3BlblhtbCIgVmVyc2lvbj0iMi44LjEiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS81RGF5VG91clBsYW5UZW1wbGF0ZS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS81RGF5VG91clBsYW5UZW1wbGF0ZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDc2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAxLzVEYXlUb3VyUGxhblRlbXBsYXRlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9Db250cmFjdC5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9Db250cmFjdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YTg5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAxL0NvbnRyYWN0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9IZWJyZXctMDEuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDEvSGVicmV3LTAxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4OTIwMAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDEvSGVicmV3LTAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9IZWJyZXctMDIuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDEvSGVicmV3LTAyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4MGQ2NwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDEvSGVicmV3LTAyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9SZXN1bWVUZW1wbGF0ZS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9SZXN1bWVUZW1wbGF0ZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTUwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAxL1Jlc3VtZVRlbXBsYXRlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UYXNrUGxhblRlbXBsYXRlLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAxL1Rhc2tQbGFuVGVtcGxhdGUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTkzMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UYXNrUGxhblRlbXBsYXRlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTAxLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmVkNDFhCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTAyLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjYyOGNhCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTAyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTAzLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzZjOGNiCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTAzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA0LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTdkNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA1LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGY2Mjg0Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA1LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA2LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDYuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDU2NjAyCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA2LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA3LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDcuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTcxMDYxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA3LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA4LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAxL1Rlc3QtMDguZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTIxYWJlCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9UZXN0LTA4LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9XbWxUb0h0bWxDb252ZXJ0ZXIwMS5jcyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDEvV21sVG9IdG1sQ29udmVydGVyMDEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzOWM1MgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDEvV21sVG9IdG1sQ29udmVydGVyMDEuY3MKQEAgLTAsMCArMSwxNTQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24gMjAxMC4KKworVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVzaW5nIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgKE1zLVBMKS4gIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlCitjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Jlc291cmNlcy9zaGFyZWRzb3VyY2UvbGljZW5zaW5nYmFzaWNzL3B1YmxpY2xpY2Vuc2UubXNweAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nLkltYWdpbmc7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbC5MaW5xOwordXNpbmcgRG9jdW1lbnRGb3JtYXQuT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPcGVuWG1sUG93ZXJUb29sczsKKworY2xhc3MgV21sVG9IdG1sQ29udmVydGVySGVscGVyCit7CisgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgIHsKKyAgICAgICAgdmFyIG4gPSBEYXRlVGltZS5Ob3c7CisgICAgICAgIHZhciB0ZW1wRGkgPSBuZXcgRGlyZWN0b3J5SW5mbyhzdHJpbmcuRm9ybWF0KCJFeGFtcGxlT3V0cHV0LXswOjAwfS17MTowMH0tezI6MDB9LXszOjAwfXs0OjAwfXs1OjAwfSIsIG4uWWVhciAtIDIwMDAsIG4uTW9udGgsIG4uRGF5LCBuLkhvdXIsIG4uTWludXRlLCBuLlNlY29uZCkpOworICAgICAgICB0ZW1wRGkuQ3JlYXRlKCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhpcyBleGFtcGxlIGxvYWRzIGVhY2ggZG9jdW1lbnQgaW50byBhIGJ5dGUgYXJyYXksIHRoZW4gaW50byBhIG1lbW9yeSBzdHJlYW0sIHNvIHRoYXQgdGhlIGRvY3VtZW50IGNhbiBiZSBvcGVuZWQgZm9yIHdyaXRpbmcgd2l0aG91dAorICAgICAgICAgKiBtb2RpZnlpbmcgdGhlIHNvdXJjZSBkb2N1bWVudC4KKyAgICAgICAgICovCisgICAgICAgIGZvcmVhY2ggKHZhciBmaWxlIGluIERpcmVjdG9yeS5HZXRGaWxlcygiLi4vLi4vIiwgIiouZG9jeCIpKQorICAgICAgICB7CisgICAgICAgICAgICBDb252ZXJ0VG9IdG1sKGZpbGUsIHRlbXBEaS5GdWxsTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgQ29udmVydFRvSHRtbChzdHJpbmcgZmlsZSwgc3RyaW5nIG91dHB1dERpcmVjdG9yeSkKKyAgICB7CisgICAgICAgIHZhciBmaSA9IG5ldyBGaWxlSW5mbyhmaWxlKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZmkuTmFtZSk7CisgICAgICAgIGJ5dGVbXSBieXRlQXJyYXkgPSBGaWxlLlJlYWRBbGxCeXRlcyhmaS5GdWxsTmFtZSk7CisgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbWVtb3J5U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1vcnlTdHJlYW0uV3JpdGUoYnl0ZUFycmF5LCAwLCBieXRlQXJyYXkuTGVuZ3RoKTsKKyAgICAgICAgICAgIHVzaW5nIChXb3JkcHJvY2Vzc2luZ0RvY3VtZW50IHdEb2MgPSBXb3JkcHJvY2Vzc2luZ0RvY3VtZW50Lk9wZW4obWVtb3J5U3RyZWFtLCB0cnVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZGVzdEZpbGVOYW1lID0gbmV3IEZpbGVJbmZvKGZpLk5hbWUuUmVwbGFjZSgiLmRvY3giLCAiLmh0bWwiKSk7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dERpcmVjdG9yeSAhPSBudWxsICYmIG91dHB1dERpcmVjdG9yeSAhPSBzdHJpbmcuRW1wdHkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnlJbmZvIGRpID0gbmV3IERpcmVjdG9yeUluZm8ob3V0cHV0RGlyZWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkaS5FeGlzdHMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuWG1sUG93ZXJUb29sc0V4Y2VwdGlvbigiT3V0cHV0IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRlc3RGaWxlTmFtZSA9IG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoZGkuRnVsbE5hbWUsIGRlc3RGaWxlTmFtZS5OYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciBpbWFnZURpcmVjdG9yeU5hbWUgPSBkZXN0RmlsZU5hbWUuRnVsbE5hbWUuU3Vic3RyaW5nKDAsIGRlc3RGaWxlTmFtZS5GdWxsTmFtZS5MZW5ndGggLSA1KSArICJfZmlsZXMiOworICAgICAgICAgICAgICAgIGludCBpbWFnZUNvdW50ZXIgPSAwOworCisgICAgICAgICAgICAgICAgdmFyIHBhZ2VUaXRsZSA9IGZpLkZ1bGxOYW1lOworICAgICAgICAgICAgICAgIHZhciBwYXJ0ID0gd0RvYy5Db3JlRmlsZVByb3BlcnRpZXNQYXJ0OworICAgICAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGUgPSAoc3RyaW5nKXBhcnQuR2V0WERvY3VtZW50KCkuRGVzY2VuZGFudHMoREMudGl0bGUpLkZpcnN0T3JEZWZhdWx0KCkgPz8gZmkuRnVsbE5hbWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVE9ETzogRGV0ZXJtaW5lIG1heC13aWR0aCBmcm9tIHNpemUgb2YgY29udGVudCBhcmVhLgorICAgICAgICAgICAgICAgIFdtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzIHNldHRpbmdzID0gbmV3IFdtbFRvSHRtbENvbnZlcnRlclNldHRpbmdzKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxDc3MgPSAiYm9keSB7IG1hcmdpbjogMWNtIGF1dG87IG1heC13aWR0aDogMjBjbTsgcGFkZGluZzogMDsgfSIsCisgICAgICAgICAgICAgICAgICAgIFBhZ2VUaXRsZSA9IHBhZ2VUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgRmFicmljYXRlQ3NzQ2xhc3NlcyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgIENzc0NsYXNzUHJlZml4ID0gInB0LSIsCisgICAgICAgICAgICAgICAgICAgIFJlc3RyaWN0VG9TdXBwb3J0ZWRMYW5ndWFnZXMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgUmVzdHJpY3RUb1N1cHBvcnRlZE51bWJlcmluZ0Zvcm1hdHMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgSW1hZ2VIYW5kbGVyID0gaW1hZ2VJbmZvID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeUluZm8gbG9jYWxEaXJJbmZvID0gbmV3IERpcmVjdG9yeUluZm8oaW1hZ2VEaXJlY3RvcnlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxEaXJJbmZvLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERpckluZm8uQ3JlYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICArK2ltYWdlQ291bnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBleHRlbnNpb24gPSBpbWFnZUluZm8uQ29udGVudFR5cGUuU3BsaXQoJy8nKVsxXS5Ub0xvd2VyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUZvcm1hdCBpbWFnZUZvcm1hdCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uID09ICJwbmciKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuUG5nOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJnaWYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuR2lmOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJibXAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuQm1wOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJqcGVnIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkpwZWc7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gInRpZmYiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdGlmZiB0byBnaWYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gImdpZiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGb3JtYXQgPSBJbWFnZUZvcm1hdC5HaWY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gIngtd21mIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gPSAid21mIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LldtZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGltYWdlIGZvcm1hdCBpc24ndCBvbmUgdGhhdCB3ZSBleHBlY3QsIGlnbm9yZSBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkb24ndCByZXR1cm4gbWFya3VwIGZvciB0aGUgbGluay4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZUZvcm1hdCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW1hZ2VGaWxlTmFtZSA9IGltYWdlRGlyZWN0b3J5TmFtZSArICIvaW1hZ2UiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUNvdW50ZXIuVG9TdHJpbmcoKSArICIuIiArIGV4dGVuc2lvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5CaXRtYXAuU2F2ZShpbWFnZUZpbGVOYW1lLCBpbWFnZUZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkV4dGVybmFsRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGltYWdlU291cmNlID0gbG9jYWxEaXJJbmZvLk5hbWUgKyAiL2ltYWdlIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb3VudGVyLlRvU3RyaW5nKCkgKyAiLiIgKyBleHRlbnNpb247CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFhFbGVtZW50IGltZyA9IG5ldyBYRWxlbWVudChYaHRtbC5pbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhBdHRyaWJ1dGUoTm9OYW1lc3BhY2Uuc3JjLCBpbWFnZVNvdXJjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLkltZ1N0eWxlQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5BbHRUZXh0ICE9IG51bGwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5hbHQsIGltYWdlSW5mby5BbHRUZXh0KSA6IG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltZzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgWEVsZW1lbnQgaHRtbEVsZW1lbnQgPSBXbWxUb0h0bWxDb252ZXJ0ZXIuQ29udmVydFRvSHRtbCh3RG9jLCBzZXR0aW5ncyk7CisKKyAgICAgICAgICAgICAgICAvLyBQcm9kdWNlIEhUTUwgZG9jdW1lbnQgd2l0aCA8IURPQ1RZUEUgaHRtbCA+IGRlY2xhcmF0aW9uIHRvIHRlbGwgdGhlIGJyb3dzZXIKKyAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgdXNpbmcgSFRNTDUuCisgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSBuZXcgWERvY3VtZW50KAorICAgICAgICAgICAgICAgICAgICBuZXcgWERvY3VtZW50VHlwZSgiaHRtbCIsIG51bGwsIG51bGwsIG51bGwpLAorICAgICAgICAgICAgICAgICAgICBodG1sRWxlbWVudCk7CisKKyAgICAgICAgICAgICAgICAvLyBOb3RlOiB0aGUgeGh0bWwgcmV0dXJuZWQgYnkgQ29udmVydFRvSHRtbFRyYW5zZm9ybSBjb250YWlucyBvYmplY3RzIG9mIHR5cGUKKyAgICAgICAgICAgICAgICAvLyBYRW50aXR5LiAgUHRPcGVuWG1sVXRpbC5jcyBkZWZpbmUgdGhlIFhFbnRpdHkgY2xhc3MuICBTZWUKKyAgICAgICAgICAgICAgICAvLyBodHRwOi8vYmxvZ3MubXNkbi5jb20vZXJpY3doaXRlL2FyY2hpdmUvMjAxMC8wMS8yMS93cml0aW5nLWVudGl0eS1yZWZlcmVuY2VzLXVzaW5nLWxpbnEtdG8teG1sLmFzcHgKKyAgICAgICAgICAgICAgICAvLyBmb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24uCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBJZiB5b3UgZnVydGhlciB0cmFuc2Zvcm0gdGhlIFhNTCB0cmVlIHJldHVybmVkIGJ5IENvbnZlcnRUb0h0bWxUcmFuc2Zvcm0sIHlvdQorICAgICAgICAgICAgICAgIC8vIG11c3QgZG8gaXQgY29ycmVjdGx5LCBvciBlbnRpdGllcyB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHByb3Blcmx5LgorCisgICAgICAgICAgICAgICAgdmFyIGh0bWxTdHJpbmcgPSBodG1sLlRvU3RyaW5nKFNhdmVPcHRpb25zLkRpc2FibGVGb3JtYXR0aW5nKTsKKyAgICAgICAgICAgICAgICBGaWxlLldyaXRlQWxsVGV4dChkZXN0RmlsZU5hbWUuRnVsbE5hbWUsIGh0bWxTdHJpbmcsIEVuY29kaW5nLlVURjgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9XbWxUb0h0bWxDb252ZXJ0ZXIwMS5jc3Byb2ogYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAxL1dtbFRvSHRtbENvbnZlcnRlcjAxLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM5NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMS9XbWxUb0h0bWxDb252ZXJ0ZXIwMS5jc3Byb2oKQEAgLTAsMCArMSwxNSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldDQ1PC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXE9wZW5YbWxQb3dlclRvb2xzXE9wZW5YbWxQb3dlclRvb2xzLmNzcHJvaiIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJEb2N1bWVudEZvcm1hdC5PcGVuWG1sIiBWZXJzaW9uPSIyLjguMSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IldpbmRvd3NCYXNlIiAvPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyLzVEYXlUb3VyUGxhblRlbXBsYXRlLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyLzVEYXlUb3VyUGxhblRlbXBsYXRlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0NzY2YQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDIvNURheVRvdXJQbGFuVGVtcGxhdGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL0NvbnRyYWN0LmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL0NvbnRyYWN0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhODk2NQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDIvQ29udHJhY3QuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL0hlYnJldy0wMS5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMi9IZWJyZXctMDEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDg5MjAwCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMi9IZWJyZXctMDEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL0hlYnJldy0wMi5kb2N4IGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMi9IZWJyZXctMDIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjgwZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMi9IZWJyZXctMDIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Jlc3VtZVRlbXBsYXRlLmRvY3ggYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Jlc3VtZVRlbXBsYXRlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlNTBmZQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDIvUmVzdW1lVGVtcGxhdGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rhc2tQbGFuVGVtcGxhdGUuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDIvVGFza1BsYW5UZW1wbGF0ZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OTMyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rhc2tQbGFuVGVtcGxhdGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDEuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDIvVGVzdC0wMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZWQ0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDIuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDIvVGVzdC0wMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjI4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDMuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDIvVGVzdC0wMy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NmM4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDQuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDIvVGVzdC0wNC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2Q2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDUuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDIvVGVzdC0wNS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjYyODQKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDYuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDIvVGVzdC0wNi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNTY2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDYuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDcuZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDIvVGVzdC0wNy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NzEwNjEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDcuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDguZG9jeCBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDIvVGVzdC0wOC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMjFhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1Rlc3QtMDguZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1dtbFRvSHRtbENvbnZlcnRlcjAyLmNzIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMi9XbWxUb0h0bWxDb252ZXJ0ZXIwMi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjc3ZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9XbWxUb0h0bWxDb252ZXJ0ZXIwMi9XbWxUb0h0bWxDb252ZXJ0ZXIwMi5jcwpAQCAtMCwwICsxLDE2MCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDEwLgorCitUaGlzIGNvZGUgaXMgbGljZW5zZWQgdXNpbmcgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSAoTXMtUEwpLiAgVGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UKK2NhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcmVzb3VyY2VzL3NoYXJlZHNvdXJjZS9saWNlbnNpbmdiYXNpY3MvcHVibGljbGljZW5zZS5tc3B4CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkRyYXdpbmcuSW1hZ2luZzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sLkxpbnE7Cit1c2luZyBEb2N1bWVudEZvcm1hdC5PcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9wZW5YbWxQb3dlclRvb2xzOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK2NsYXNzIFdtbFRvSHRtbENvbnZlcnRlckhlbHBlcgoreworICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICB7CisgICAgICAgIHZhciBuID0gRGF0ZVRpbWUuTm93OworICAgICAgICB2YXIgdGVtcERpID0gbmV3IERpcmVjdG9yeUluZm8oc3RyaW5nLkZvcm1hdCgiRXhhbXBsZU91dHB1dC17MDowMH0tezE6MDB9LXsyOjAwfS17MzowMH17NDowMH17NTowMH0iLCBuLlllYXIgLSAyMDAwLCBuLk1vbnRoLCBuLkRheSwgbi5Ib3VyLCBuLk1pbnV0ZSwgbi5TZWNvbmQpKTsKKyAgICAgICAgdGVtcERpLkNyZWF0ZSgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFRoaXMgZXhhbXBsZSBsb2FkcyBlYWNoIGRvY3VtZW50IGludG8gYSBieXRlIGFycmF5LCB0aGVuIGludG8gYSBtZW1vcnkgc3RyZWFtLCBzbyB0aGF0IHRoZSBkb2N1bWVudCBjYW4gYmUgb3BlbmVkIGZvciB3cml0aW5nIHdpdGhvdXQKKyAgICAgICAgICogbW9kaWZ5aW5nIHRoZSBzb3VyY2UgZG9jdW1lbnQuCisgICAgICAgICAqLworICAgICAgICBmb3JlYWNoICh2YXIgZmlsZSBpbiBEaXJlY3RvcnkuR2V0RmlsZXMoIi4uLy4uLyIsICIqLmRvY3giKSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29udmVydFRvSHRtbChmaWxlLCB0ZW1wRGkuRnVsbE5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIENvbnZlcnRUb0h0bWwoc3RyaW5nIGZpbGUsIHN0cmluZyBvdXRwdXREaXJlY3RvcnkpCisgICAgeworICAgICAgICB2YXIgZmkgPSBuZXcgRmlsZUluZm8oZmlsZSk7CisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGZpLk5hbWUpOworICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0gRmlsZS5SZWFkQWxsQnl0ZXMoZmkuRnVsbE5hbWUpOworICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1lbW9yeVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtb3J5U3RyZWFtLldyaXRlKGJ5dGVBcnJheSwgMCwgYnl0ZUFycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICB1c2luZyAoV29yZHByb2Nlc3NpbmdEb2N1bWVudCB3RG9jID0gV29yZHByb2Nlc3NpbmdEb2N1bWVudC5PcGVuKG1lbW9yeVN0cmVhbSwgdHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRlc3RGaWxlTmFtZSA9IG5ldyBGaWxlSW5mbyhmaS5OYW1lLlJlcGxhY2UoIi5kb2N4IiwgIi5odG1sIikpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXREaXJlY3RvcnkgIT0gbnVsbCAmJiBvdXRwdXREaXJlY3RvcnkgIT0gc3RyaW5nLkVtcHR5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5SW5mbyBkaSA9IG5ldyBEaXJlY3RvcnlJbmZvKG91dHB1dERpcmVjdG9yeSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZGkuRXhpc3RzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlblhtbFBvd2VyVG9vbHNFeGNlcHRpb24oIk91dHB1dCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZXN0RmlsZU5hbWUgPSBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKGRpLkZ1bGxOYW1lLCBkZXN0RmlsZU5hbWUuTmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgaW1hZ2VEaXJlY3RvcnlOYW1lID0gZGVzdEZpbGVOYW1lLkZ1bGxOYW1lLlN1YnN0cmluZygwLCBkZXN0RmlsZU5hbWUuRnVsbE5hbWUuTGVuZ3RoIC0gNSkgKyAiX2ZpbGVzIjsKKyAgICAgICAgICAgICAgICBpbnQgaW1hZ2VDb3VudGVyID0gMDsKKworICAgICAgICAgICAgICAgIHZhciBwYWdlVGl0bGUgPSBmaS5GdWxsTmFtZTsKKyAgICAgICAgICAgICAgICB2YXIgcGFydCA9IHdEb2MuQ29yZUZpbGVQcm9wZXJ0aWVzUGFydDsKKyAgICAgICAgICAgICAgICBpZiAocGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlID0gKHN0cmluZylwYXJ0LkdldFhEb2N1bWVudCgpLkRlc2NlbmRhbnRzKERDLnRpdGxlKS5GaXJzdE9yRGVmYXVsdCgpID8/IGZpLkZ1bGxOYW1lOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFRPRE86IERldGVybWluZSBtYXgtd2lkdGggZnJvbSBzaXplIG9mIGNvbnRlbnQgYXJlYS4KKyAgICAgICAgICAgICAgICBXbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBXbWxUb0h0bWxDb252ZXJ0ZXJTZXR0aW5ncygpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsQ3NzID0gImJvZHkgeyBtYXJnaW46IDFjbSBhdXRvOyBtYXgtd2lkdGg6IDIwY207IHBhZGRpbmc6IDA7IH0iLAorICAgICAgICAgICAgICAgICAgICBQYWdlVGl0bGUgPSBwYWdlVGl0bGUsCisgICAgICAgICAgICAgICAgICAgIEZhYnJpY2F0ZUNzc0NsYXNzZXMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICBDc3NDbGFzc1ByZWZpeCA9ICJwdC0iLAorICAgICAgICAgICAgICAgICAgICBSZXN0cmljdFRvU3VwcG9ydGVkTGFuZ3VhZ2VzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIFJlc3RyaWN0VG9TdXBwb3J0ZWROdW1iZXJpbmdGb3JtYXRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlciA9IGltYWdlSW5mbyA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2ltYWdlQ291bnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBleHRlbnNpb24gPSBpbWFnZUluZm8uQ29udGVudFR5cGUuU3BsaXQoJy8nKVsxXS5Ub0xvd2VyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUZvcm1hdCBpbWFnZUZvcm1hdCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uID09ICJwbmciKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuUG5nOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJnaWYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuR2lmOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJibXAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRm9ybWF0ID0gSW1hZ2VGb3JtYXQuQm1wOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uID09ICJqcGVnIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LkpwZWc7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gInRpZmYiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdGlmZiB0byBnaWYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gImdpZiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGb3JtYXQgPSBJbWFnZUZvcm1hdC5HaWY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHRlbnNpb24gPT0gIngtd21mIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gPSAid21mIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdCA9IEltYWdlRm9ybWF0LldtZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGltYWdlIGZvcm1hdCBpc24ndCBvbmUgdGhhdCB3ZSBleHBlY3QsIGlnbm9yZSBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkb24ndCByZXR1cm4gbWFya3VwIGZvciB0aGUgbGluay4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZUZvcm1hdCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYmFzZTY0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uQml0bWFwLlNhdmUobXMsIGltYWdlRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhID0gbXMuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBTeXN0ZW0uQ29udmVydC5Ub0Jhc2U2NFN0cmluZyhiYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5FeHRlcm5hbEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VGb3JtYXQgZm9ybWF0ID0gaW1hZ2VJbmZvLkJpdG1hcC5SYXdGb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUNvZGVjSW5mbyBjb2RlYyA9IEltYWdlQ29kZWNJbmZvLkdldEltYWdlRGVjb2RlcnMoKS5GaXJzdChjID0+IGMuRm9ybWF0SUQgPT0gZm9ybWF0Lkd1aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1pbWVUeXBlID0gY29kZWMuTWltZVR5cGU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbWFnZVNvdXJjZSA9IHN0cmluZy5Gb3JtYXQoImRhdGE6ezB9O2Jhc2U2NCx7MX0iLCBtaW1lVHlwZSwgYmFzZTY0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgWEVsZW1lbnQgaW1nID0gbmV3IFhFbGVtZW50KFhodG1sLmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShOb05hbWVzcGFjZS5zcmMsIGltYWdlU291cmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uSW1nU3R5bGVBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLkFsdFRleHQgIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYQXR0cmlidXRlKE5vTmFtZXNwYWNlLmFsdCwgaW1hZ2VJbmZvLkFsdFRleHQpIDogbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1nOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBYRWxlbWVudCBodG1sRWxlbWVudCA9IFdtbFRvSHRtbENvbnZlcnRlci5Db252ZXJ0VG9IdG1sKHdEb2MsIHNldHRpbmdzKTsKKworICAgICAgICAgICAgICAgIC8vIFByb2R1Y2UgSFRNTCBkb2N1bWVudCB3aXRoIDwhRE9DVFlQRSBodG1sID4gZGVjbGFyYXRpb24gdG8gdGVsbCB0aGUgYnJvd3NlcgorICAgICAgICAgICAgICAgIC8vIHdlIGFyZSB1c2luZyBIVE1MNS4KKyAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IG5ldyBYRG9jdW1lbnQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBYRG9jdW1lbnRUeXBlKCJodG1sIiwgbnVsbCwgbnVsbCwgbnVsbCksCisgICAgICAgICAgICAgICAgICAgIGh0bWxFbGVtZW50KTsKKworICAgICAgICAgICAgICAgIC8vIE5vdGU6IHRoZSB4aHRtbCByZXR1cm5lZCBieSBDb252ZXJ0VG9IdG1sVHJhbnNmb3JtIGNvbnRhaW5zIG9iamVjdHMgb2YgdHlwZQorICAgICAgICAgICAgICAgIC8vIFhFbnRpdHkuICBQdE9wZW5YbWxVdGlsLmNzIGRlZmluZSB0aGUgWEVudGl0eSBjbGFzcy4gIFNlZQorICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9lcmljd2hpdGUvYXJjaGl2ZS8yMDEwLzAxLzIxL3dyaXRpbmctZW50aXR5LXJlZmVyZW5jZXMtdXNpbmctbGlucS10by14bWwuYXNweAorICAgICAgICAgICAgICAgIC8vIGZvciBkZXRhaWxlZCBleHBsYW5hdGlvbi4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIElmIHlvdSBmdXJ0aGVyIHRyYW5zZm9ybSB0aGUgWE1MIHRyZWUgcmV0dXJuZWQgYnkgQ29udmVydFRvSHRtbFRyYW5zZm9ybSwgeW91CisgICAgICAgICAgICAgICAgLy8gbXVzdCBkbyBpdCBjb3JyZWN0bHksIG9yIGVudGl0aWVzIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgcHJvcGVybHkuCisKKyAgICAgICAgICAgICAgICB2YXIgaHRtbFN0cmluZyA9IGh0bWwuVG9TdHJpbmcoU2F2ZU9wdGlvbnMuRGlzYWJsZUZvcm1hdHRpbmcpOworICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KGRlc3RGaWxlTmFtZS5GdWxsTmFtZSwgaHRtbFN0cmluZywgRW5jb2RpbmcuVVRGOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1dtbFRvSHRtbENvbnZlcnRlcjAyLmNzcHJvaiBiL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV21sVG9IdG1sQ29udmVydGVyMDIvV21sVG9IdG1sQ29udmVydGVyMDIuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzk0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dtbFRvSHRtbENvbnZlcnRlcjAyL1dtbFRvSHRtbENvbnZlcnRlcjAyLmNzcHJvagpAQCAtMCwwICsxLDE1IEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0NDU8L1RhcmdldEZyYW1ld29yaz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cT3BlblhtbFBvd2VyVG9vbHNcT3BlblhtbFBvd2VyVG9vbHMuY3Nwcm9qIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkRvY3VtZW50Rm9ybWF0Lk9wZW5YbWwiIFZlcnNpb249IjIuOC4xIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iV2luZG93c0Jhc2UiIC8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL09wZW5YbWxQb3dlclRvb2xzRXhhbXBsZXMvV29yZEF1dG9tYXRpb25VdGlsaXRpZXMvV29yZEF1dG9tYXRpb25VdGlsaXRpZXMuY3MgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dvcmRBdXRvbWF0aW9uVXRpbGl0aWVzL1dvcmRBdXRvbWF0aW9uVXRpbGl0aWVzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZjU0YzEKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dvcmRBdXRvbWF0aW9uVXRpbGl0aWVzL1dvcmRBdXRvbWF0aW9uVXRpbGl0aWVzLmNzCkBAIC0wLDAgKzEsMzQgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFdvcmQgPSBNaWNyb3NvZnQuT2ZmaWNlLkludGVyb3AuV29yZDsKKworbmFtZXNwYWNlIE9wZW5YbWxQb3dlclRvb2xzCit7CisgICAgcHVibGljIGNsYXNzIFdvcmRBdXRvbWF0aW9uVXRpbGl0aWVzCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUHJvY2Vzc0ZpbGVzVXNpbmdXb3JkQXV0b21hdGlvbihMaXN0PHN0cmluZz4gZmlsZU5hbWVzKQorICAgICAgICB7CisgICAgICAgICAgICBXb3JkLkFwcGxpY2F0aW9uIGFwcCA9IG5ldyBXb3JkLkFwcGxpY2F0aW9uKCk7CisgICAgICAgICAgICBhcHAuVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGZpbGVOYW1lIGluIGZpbGVOYW1lcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBmaSA9IG5ldyBGaWxlSW5mbyhmaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBXb3JkLkRvY3VtZW50IGRvYyA9IGFwcC5Eb2N1bWVudHMuT3BlbihmaS5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGRvYy5TYXZlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuQ09NRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNhdWdodCB1bmV4cGVjdGVkIENPTSBleGNlcHRpb24uIik7CisgICAgICAgICAgICAgICAgICAgICgoTWljcm9zb2Z0Lk9mZmljZS5JbnRlcm9wLldvcmQuX0FwcGxpY2F0aW9uKWFwcCkuUXVpdCgpOworICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5FeGl0KDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgoTWljcm9zb2Z0Lk9mZmljZS5JbnRlcm9wLldvcmQuX0FwcGxpY2F0aW9uKWFwcCkuUXVpdCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Xb3JkQXV0b21hdGlvblV0aWxpdGllcy9Xb3JkQXV0b21hdGlvblV0aWxpdGllcy5jc3Byb2ogYi9PcGVuWG1sUG93ZXJUb29sc0V4YW1wbGVzL1dvcmRBdXRvbWF0aW9uVXRpbGl0aWVzL1dvcmRBdXRvbWF0aW9uVXRpbGl0aWVzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWZlNmQzCi0tLSAvZGV2L251bGwKKysrIGIvT3BlblhtbFBvd2VyVG9vbHNFeGFtcGxlcy9Xb3JkQXV0b21hdGlvblV0aWxpdGllcy9Xb3JkQXV0b21hdGlvblV0aWxpdGllcy5jc3Byb2oKQEAgLTAsMCArMSwxMSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldDQ1PC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXE9wZW5YbWxQb3dlclRvb2xzXE9wZW5YbWxQb3dlclRvb2xzLmNzcHJvaiIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJEb2N1bWVudEZvcm1hdC5PcGVuWG1sIiBWZXJzaW9uPSIyLjcuMSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvUkVBRE1FLm1kIGIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNTZiNDMKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUubWQKQEAgLTAsMCArMSwxOTggQEAKK++7v1shW0J1aWxkIHN0YXR1c10oaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vYXBpL3Byb2plY3RzL3N0YXR1cy9hdTl1bWR4Y3U3cG5uYWNtP3N2Zz10cnVlKV0oaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vcHJvamVjdC9vcGVueG1sc2RrL29wZW4teG1sLXBvd2VydG9vbHMpCisKK09wZW4tWE1MLVBvd2VyVG9vbHMKKz09PT09PT09PT09PT09PT09PT0KK1RoZSBPcGVuIFhNTCBQb3dlclRvb2xzIHByb3ZpZGVzIGd1aWRhbmNlIGFuZCBleGFtcGxlIGNvZGUgZm9yIHByb2dyYW1taW5nIHdpdGggT3BlbiBYTUwKK0RvY3VtZW50cyAoRE9DWCwgWExTWCwgYW5kIFBQVFgpLiAgSXQgaXMgYmFzZWQgb24sIGFuZCBleHRlbmRzIHRoZSBmdW5jdGlvbmFsaXR5CitvZiB0aGUgW09wZW4gWE1MIFNES10oaHR0cHM6Ly9naXRodWIuY29tL09mZmljZURldi9PcGVuLVhNTC1TREspLgorCitJdCBzdXBwb3J0cyBzY2VuYXJpb3Mgc3VjaCBhczoKKy0gU3BsaXR0aW5nIERPQ1gvUFBUWCBmaWxlcyBpbnRvIG11bHRpcGxlIGZpbGVzLgorLSBDb21iaW5pbmcgbXVsdGlwbGUgRE9DWC9QUFRYIGZpbGVzIGludG8gYSBzaW5nbGUgZmlsZS4KKy0gUG9wdWxhdGluZyBjb250ZW50IGluIHRlbXBsYXRlIERPQ1ggZmlsZXMgd2l0aCBkYXRhIGZyb20gWE1MLgorLSBIaWdoLWZpZGVsaXR5IGNvbnZlcnNpb24gb2YgRE9DWCB0byBIVE1ML0NTUy4KKy0gSGlnaC1maWRlbGl0eSBjb252ZXJzaW9uIG9mIEhUTUwvQ1NTIHRvIERPQ1guCistIFNlYXJjaGluZyBhbmQgcmVwbGFjaW5nIGNvbnRlbnQgaW4gRE9DWC9QUFRYIHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCistIE1hbmFnaW5nIHRyYWNrZWQtcmV2aXNpb25zLCBpbmNsdWRpbmcgZGV0ZWN0aW5nIHRyYWNrZWQgcmV2aXNpb25zLCBhbmQgYWNjZXB0aW5nIHRyYWNrZWQgcmV2aXNpb25zLgorLSBVcGRhdGluZyBDaGFydHMgaW4gRE9DWC9QUFRYIGZpbGVzLCBpbmNsdWRpbmcgdXBkYXRpbmcgY2FjaGVkIGRhdGEsIGFzIHdlbGwgYXMgdGhlIGVtYmVkZGVkIFhMU1guCistIENvbXBhcmluZyB0d28gRE9DWCBmaWxlcywgcHJvZHVjaW5nIGEgRE9DWCB3aXRoIHJldmlzaW9uIHRyYWNraW5nIG1hcmt1cCwgYW5kIGVuYWJsaW5nIHJldHJpZXZpbmcgYSBsaXN0IG9mIHJldmlzaW9ucy4KKy0gUmV0cmlldmluZyBtZXRyaWNzIGZyb20gRE9DWCBmaWxlcywgaW5jbHVkaW5nIHRoZSBoaWVyYXJjaHkgb2Ygc3R5bGVzIHVzZWQsIHRoZSBsYW5ndWFnZXMgdXNlZCwgYW5kIHRoZSBmb250cyB1c2VkLgorLSBXcml0aW5nIFhMU1ggZmlsZXMgdXNpbmcgZmFyIHNpbXBsZXIgY29kZSB0aGFuIGRpcmVjdGx5IHdyaXRpbmcgdGhlIG1hcmt1cCwgaW5jbHVkaW5nIGEgc3RyZWFtaW5nIGFwcHJvYWNoIHRoYXQKKyAgZW5hYmxlcyB3cml0aW5nIFhMU1ggZmlsZXMgd2l0aCBtaWxsaW9ucyBvZiByb3dzLgorLSBFeHRyYWN0aW5nIGRhdGEgKGFsb25nIHdpdGggZm9ybWF0dGluZykgZnJvbSBzcHJlYWRzaGVldHMuCisKK0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uIDIwMTItMjAxNworUG9ydGlvbnMgQ29weXJpZ2h0IChjKSBFcmljIFdoaXRlIDIwMTYtMjAxNworTGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4KK1NlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgorCitOZXdzCis9PT09CitOZXcgUmVsZWFzZSEgIFZlcnNpb24gNC40LgorCitUaGlzIHZlcnNpb24gaGFzIGEgY29tcGxldGVseSByZS13cml0dGVuIFdtbENvbXBhcmVyLmNzLCB3aGljaCBub3cgc3VwcG9ydHMgbmVzdGVkIHRhYmxlcyBhbmQgdGV4dCBib3hlcy4gIFdtbENvbXBhcmVyLmNzIGlzIGEgbW9kdWxlIHRoYXQgY29tcGFyZXMgdHdvIERPQ1ggZmlsZXMgYW5kCitwcm9kdWNlcyBhIERPQ1ggd2l0aCByZXZpc2lvbiB0cmFja2luZyBtYXJrdXAuICBJdCBlbmFibGVzIHJldHJpZXZpbmcgYSBsaXN0IG9mIHJldmlzaW9ucy4KKworT3Blbi1YbWwtUG93ZXJUb29scyBDb250ZW50Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlcmUgaXMgYSBsb3Qgb2YgY29udGVudCBhYm91dCBPcGVuLVhtbC1Qb3dlclRvb2xzIGF0IHRoZSBbT3Blbi1YbWwtUG93ZXJUb29scyBSZXNvdXJjZSBDZW50ZXIgYXQgT3BlblhtbERldmVsb3Blci5vcmddKGh0dHA6Ly9vcGVueG1sZGV2ZWxvcGVyLm9yZy93aWtpL3cvd2lraS9wb3dlcnRvb2xzLWZvci1vcGVuLXhtbC5hc3B4KQorCitTZWU6CistIFtEb2N1bWVudEJ1aWxkZXIgUmVzb3VyY2UgQ2VudGVyXShodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvZG9jdW1lbnRidWlsZGVyLmFzcHgpCistIFtQcmVzZW50YXRpb25CdWlsZGVyIFJlc291cmNlIENlbnRlcl0oaHR0cDovL29wZW54bWxkZXZlbG9wZXIub3JnL3dpa2kvdy93aWtpL3ByZXNlbnRhdGlvbmJ1aWxkZXIuYXNweCkKKy0gW0h0bWxDb252ZXJ0ZXIgUmVzb3VyY2UgQ2VudGVyXShodHRwOi8vb3BlbnhtbGRldmVsb3Blci5vcmcvd2lraS93L3dpa2kvaHRtbGNvbnZlcnRlci5hc3B4KQorLSBbSW50cm9kdWN0aW9uIHRvIERvY3VtZW50QXNzZW1ibGVyXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PTlRcXpDZ2ZxQTJZKQorLSBbQ29udHJpYnV0aW5nIHRvIE9wZW4tWG1sLVBvd2VyVG9vbHMgdmlhIEdpdEh1Yl0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1JaTd6OUw2RGtrbykKKy0gW0dpdHRpbmcsIEJ1aWxkaW5nLCBhbmQgSW5zdGFsbGluZyBPcGVuLVhtbC1Qb3dlclRvb2xzXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PTYwdy15UERTUUQwKQorCitCdWlsZCBJbnN0cnVjdGlvbnMKKz09PT09PT09PT09PT09PT09PQorCisqKlByZXJlcXVpc2l0ZXM6KioKKworLSBWaXN1YWwgU3R1ZGlvIDIwMTcgVXBkYXRlIDUgb3IgLk5FVCBDTEkgdG9vbGNoYWluCisKKyoqQnVpbGQqKgorIAorIFdpdGggVmlzdWFsIFN0dWRpbzoKKworLSBPcGVuIGBPcGVuWG1sUG93ZXJUb29scy5zbG5gIGluIFZpc3VhbCBTdHVkaW8KKy0gUmVidWlsZCB0aGUgcHJvamVjdAorLSBCdWlsZCB0aGUgc29sdXRpb24uICBUbyB2YWxpZGF0ZSB0aGUgYnVpbGQsIG9wZW4gdGhlIFRlc3QgRXhwbG9yZXIuICBDbGljayBSdW4gQWxsLgorLSBUbyBydW4gYW4gZXhhbXBsZSwgc2V0IHRoZSBleGFtcGxlIGFzIHRoZSBzdGFydHVwIHByb2plY3QsIGFuZCBwcmVzcyBGNS4KKworV2l0aCAuTkVUIENMSSB0b29sY2hhaW46CisKKy0gUnVuIGBkb3RuZXQgYnVpbGQgT3BlblhtbFBvd2VyVG9vbHMuc2xuYAorCitDaGFuZ2UgTG9nCis9PT09PT09PT09CisKK1ZlcnNpb24gNC4zIDogSnVuZSAxMywgMjAxNgorLSBOZXcgV21sQ29tcGFyZXIgbW9kdWxlCisKK1ZlcnNpb24gNC4yIDogRGVjZW1iZXIgMTEsIDIwMTUKKy0gTmV3IFNtbERhdGFSZXRyaWV2ZXIgbW9kdWxlCistIE5ldyBTbWxDZWxsRm9ybWF0dGVyIG1vZHVsZQorCitWZXJzaW9uIDQuMS4zIDogTm92ZW1iZXIgMiwgMjAxNQorLSBEb2N1bWVudEFzc2VtYmxlcjogRml4IGJ1ZyBhc3NvY2lhdGVkIHdpdGggZHVwbGljYXRlIGJvb2ttYXJrcy4KKy0gRG9jdW1lbnRBc3NlbWJsZXI6IEVuYWJsZSBwcm9jZXNzaW5nIG9mIGNvbnRlbnQgY29udHJvbHMgLyBtZXRhZGF0YSBpbiBmb290ZXIgcm93cy4KKy0gRG9jdW1lbnRBc3NlbWJsZXI6IEF2b2lkIHByb2Nlc3NpbmcgY29udGVudCBjb250cm9scyB1c2VkIGZvciBwdXJwb3NlcyBvdGhlciB0aGFuIHRoZSBEb2N1bWVudEFzc2VtYmxlciB0ZW1wbGF0ZSwgaW5jbHVkaW5nIHBhZ2UgbnVtYmVycyBpbiBmb290ZXJzLCBldGMuCisKK1ZlcnNpb24gNC4xLjIgOiBPY3RvYmVyIDMxLCAyMDE1CistIEh0bWxUb1dtbENvbnZlcnRlcjogSGFuZGxlIHVua25vd24gZWxlbWVudHMgYnkgcmVjdXJzaXZlbHkgcHJvY2Vzc2luZyBkZXNjZW5kYW50cworCitWZXJzaW9uIDQuMS4xIDogT2N0b2JlciAyMSwgMjAxNQorLSBGaXggdG8gQWRkVHlwZXMucHMxIHRvIGNvbXBpbGUgV21sVG9IdG1sQ29udmVydGVyLmNzIGluc3RlYWQgb2YgSHRtbENvbnZlcnRlci5jcworLSBGaXggdG8gTWV0dHJpY3NHZXR0ZXIucHMxIHRvIGNvcnJlY3RseSByZXBvcnQgd2hldGhlciBhIGRvY3VtZW50IGNvbnRhaW5zIHRyYWNrZWQgcmV2aXNpb25zCistIEFkZGVkIHNvbWUgdW5pdCB0ZXN0cyBmb3IgUHJlc2VudGF0aW9uQnVpbGRlcgorCitWZXJzaW9uIDQuMS4wIDogU2VwdGVtYmVyIDI3LCAyMDE1CistIE5ldyBIdG1sVG9XbWxDb252ZXJ0ZXIgbW9kdWxlCistIEh0bWxDb252ZXJ0ZXIgZ2VuZXJhdGVzIG5vbiBicmVha2luZyBzcGFjZXMgYXMgIzAwYTAgdW5pY29kZSBjaGFyYXRlciwgbm90ICZuYnNwOyBlbnRpdHkuCisKK1ZlcnNpb24gNC4wLjAgOiBBdWd1c3QgNiwgMjAxNQorLSBOZXcgRG9jdW1lbnRBc3NlbWJlciBtb2R1bGUKKy0gTmV3IFNwcmVhZHNoZWV0V3JpdGVyIG1vZHVsZQorLSBOZXcgQ21kbGV0OiBDb21wbGV0ZS1Eb2N4VGVtcGxhdGVGcm9tWG1sCistIEZpeCBEb2N1bWVudEJ1aWxkZXI6IGRlYWwgd2l0aCBoZWFkZXJzIC8gZm9vdGVycyBtb3JlIHJhdGlvbmFsbHkKKy0gRW5oYW5jZSBEb2N1bWVudEJ1aWxkZXI6IGFkZCBvcHRpb24gdG8gZGlzY2FyZCBoZWFkZXJzIC8gZm9vdGVycyBmcm9tIHNlY3Rpb24gKGJ1dCBrZWVwIGxheW91dCBvZiBzZWN0aW9uKQorLSBGaXggUmV2aXNpb25BY2NlcHRlcjogZGVhbCB3aXRoIHc6bW92ZVRvIGltbWVkaWF0ZWx5IGJlZm9yZSBhIHRhYmxlCistIE5ldyB0ZXN0IGRvY3VtZW50IGxpYnJhcnkgaW4gdGhlIFRlc3RGaWxlcyBkaXJlY3RvcnkKKy0gWFVuaXQgdGVzdHMKKy0gQ2xlYW5lZCB1cCBidWlsZCBzeXN0ZW0KKy0gQnVpbGQgdXNpbmcgdGhlIG9wZW4gc291cmNlIE9wZW4tWG1sLVNESyBhbmQgdGhlIG5ldyBTeXN0ZW0uSU8uUGFja2FnaW5nIGJ5IGRlZmF1bHQKKy0gQmFjayBwb3J0IHRvIC5ORVQgMy41CistIFJlbmFtZSB0aGUgUG93ZXJTaGVsbCBtb2R1bGUgdG8gT3Blbi1YbWwtUG93ZXJUb29scworCitWZXJzaW9uIDMuMS4xMSA6IEp1bmUgMzAsIDIwMTUKKy0gVXBkYXRlZCBwcm9qZWN0cyBhbmQgc29sdXRpb25zIHRvIGJ1aWxkIHdpdGggdGhlIG9wZW4gc291cmNlIE9wZW4gWE1MIFNESyBhbmQgbmV3IFN5c3RlbS5JTy5QYWNrYWdpbmcKKworVmVyc2lvbiAzLjEuMTAgOiBKdW5lIDE0LCAyMDE1CistIENoYW5nZWQgT3V0LVhsc3ggQ21kbGV0IHRvIEMjIGltcGxlbWVudGF0aW9uCistIEZpeCBBZGQtRG9jeFRleHQKKworVmVyc2lvbiAzLjEuMDkgOiBBcHJpbCAyMCwgMjAxNQorLSBGaXggT3BlblhtbFJlZ2V4OiBQb3dlclBvaW50IDIwMDcgYW5kIHhtbDpzcGFjZSBpc3N1ZXMsIGNhdXNpbmcgMjAwNyB0byBub3Qgb3BlbiBQUFRYJ3MKKworVmVyc2lvbiAzLjEuMDggOiBNYXJjaCAxMywgMjAxNQorLSBBZGRlZCBPdXQtWGxzeCBDbWRsZXQKKworVmVyc2lvbiAzLjEuMDcgOiBGZWJydWFyeSA5LCAyMDE1CistIEFkZGVkIE1lcmdlLVBwdHggQ21kbGV0CistIEFkZGVkIE5ldy1QcHR4IENtZGxldAorLSBBZGRlZCBOZXctUG1sRG9jdW1lbnQKKy0gRml4ZWQgaGVscCBmb3IgTWVyZ2UtRG9jeAorLSBEb24ndCB0aHJvdyBkdXBsaWNhdGUgYXR0cmlidXRlIGV4Y2VwdGlvbiB3aGVuIHJ1bm5pbmcgRm9ybWF0dGluZ0Fzc2VtYmxlci5Bc3NlbWJsZUZvcm1hdHRpbmcKKyAgdHdpY2Ugb24gc2FtZSBkb2N1bWVudC4KKworVmVyc2lvbiAzLjEuMDYgOiBGZWJydWFyeSA3LCAyMDE1CistIEFkZGVkIEV4cGFuZC1Eb2N4Rm9ybWF0dGluZyBDbWRsZXQKKy0gQ21kbGV0cyBkbyBub3Qga2VlcCBhIGhhbmRsZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnksIHByZXZlbnRpbmcgZGVsZXRpb24gb2YgdGhlIGRpcmVjdG9yeS4KKy0gQWRkZWQgYWRkaXRpb25hbCB0ZXN0cyB0byBUZXN0LU94UHRDbWRsZXRzCisKK1ZlcnNpb24gMy4xLjA1IDogSmFudWFyeSAyOSwgMjAxNQorLSBBZGRlZCBHZXRMaXN0SXRlbVRleHRfemhfQ04uY3MKKy0gRml4ZWQgR2V0TGlzdEl0ZW1UZXh0X2ZyX0ZSLmNzCistIFBhcnRpYWxseSBmaXhlZCBHZXRMaXN0SXRlbVRleHRfcnVfUlUuY3MKKy0gRml4ZWQgR2V0TGlzdEl0ZW1UZXh0X0RlZmF1bHQuY3MKKy0gQWRkZWQgYmV0dGVyIHN1cHBvcnQgaW4gTGlzdEl0ZW1SZXRyaWV2ZXIuY3MKKy0gQWRkZWQgRmlsZVV0aWxzIGNsYXNzIGluIFB0VXRpbC5jcworCitWZXJzaW9uIDMuMS4wNCA6IERlY2VtYmVyIDE3LCAyMDE0CistIEFkZGVkIEdldC1Eb2N4TWV0cmljcyBDbWRsZXQKKy0gQWRkZWQgTmV3LVdtbERvY3VtZW50IENtZGxldAorLSBBZGRlZCBNZXRyaWNzR2V0dGVyLmNzIG1vZHVsZQorLSBBZGRlZCBNZXR0cmljc0dldHRlcjAxLmNzIG1vZHVsZSwgYWxvbmcgd2l0aCBzYW1wbGUgZG9jdW1lbnRzCistIFJld29ya2VkIEFkZC1Eb2N4VGV4dCwgbmV3IHN0eWxlIG9mIHVzaW5nIGl0IHdpdGggTmV3LVdtbERvY3VtZW50CisKK1ZlcnNpb24gMy4xLjAzIDogRGVjZW1iZXIgOSwgMjAxNAorLSBBZGRlZCBDaGFydFVwZGF0ZXIuY3MgbW9kdWxlCistIEFkZGVkIENoYXJ0VXBkYXRlcjAxLmNzIG1vZHVsZSwgYWxvbmcgd2l0aCBzYW1wbGUgZG9jdW1lbnRzCistIEFkZGVkIFRlc3QtT3hQdENtZGxldHMgQ21kbGV0CisKK1ZlcnNpb24gMy4xLjAyIDogRGVjZW1iZXIgMSwgMjAxNAorLSBBZGRlZCBBZGQtRG9jeFRleHQgQ21kbGV0CisKK1ZlcnNpb24gMy4xLjAxIDogTm92ZW1iZXIgMjMsIDIwMTQKKy0gQWRkZWQgQ29udmVydC1Eb2N4VG9IdG1sIENtZGxldAorLSBBZGRlZCBDaGluZXNlIGFuZCBIZWJyZXcgc2FtcGxlIGRvY3VtZW50cworLSBDbWRsZXRzIGluIHRoaXMgcmVsZWFzZQorCUNsZWFyLURvY3hUcmFja2VkUmV2aXNpb24KKwlDb252ZXJ0LURvY3hUb0h0bWwKKwlDb252ZXJ0RnJvbS1CYXNlNjQKKwlDb252ZXJ0RnJvbS1GbGF0T3BjCisJQ29udmVydFRvLUJhc2U2NAorCUNvbnZlcnRUby1GbGF0T3BjCisJR2V0LU9wZW5YbWxWYWxpZGF0aW9uRXJyb3JzCisJTWVyZ2UtRG9jeAorCU5ldy1Eb2N4CisJVGVzdC1PcGVuWG1sVmFsaWQKKworVmVyc2lvbiAzLjEuMDAgOiBOb3ZlbWJlciAxMywgMjAxNAorLSBDaGFuZ2VkIGluc3RhbGxhdGlvbiBwcm9jZXNzIC0gbm8gbG9uZ2VyIHJlcXVpcmVzIGNvbXBpbGF0aW9uIHVzaW5nIFZpc3VhbCBTdHVkaW8KKy0gQWRkZWQgQ29udmVydFRvLUZsYXRPcGMgQ21kbGV0CistIEFkZGVkIENvbnZlcnRGcm9tLUZsYXRPcGMgQ21kbGV0CistIENoYW5nZWQgcGFyYW1ldGVycyBmb3IgVGVzdC1PcGVuWG1sVmFsaWQsIEdldC1PcGVuWG1sVmFsaWRhdGlvbkVycm9ycworLSBSZW1vdmVkIHRoZSB1bm5lY2Vzc2FyeSAxLzIgc2Vjb25kIHNsZWVwIHdoZW4gZG9pbmcgV29yZCBhdXRvbWF0aW9uIGluIHRoZSBOZXctRG9jeCBDbWRsZXQKKworVmVyc2lvbiAzLjAuMDAgOiBPY3RvYmVyIDI5LCAyMDE0CistIE5ldyByZWxlYXNlIG9mIGNtZGxldHMgdGhhdCBhcmUgd3JpdHRlbiBhcyAnQWR2YW5jZWQgRnVuY3Rpb25zJyBpbnN0ZWFkIG9mIGluIEMjLgorCitQcm9jZWR1cmVzIGZvciBlbmhhbmNpbmcgT3Blbi1YbWwtUG93ZXJUb29scworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZXJlIGFyZSBhIHZhcmlldHkgb2YgdGhpbmdzIHRvIGRvIHdoZW4gYWRkaW5nIGEgbmV3IENtZExldCB0byBPcGVuLVhtbC1Qb3dlclRvb2xzOgorLSBXcml0ZSB0aGUgbmV3IENtZExldC4gIFB1dCBpdCBpbiB0aGUgQ21kbGV0cyBkaXJlY3RvcnkKKy0gTW9kaWZ5IE9wZW4tWG1sLVBvd2VyVG9vbHMucHNtMQorICAtIENhbGwgdGhlIG5ldyBDbWRsZXQgc2NyaXB0IHRvIG1ha2UgdGhlIGZ1bmN0aW9uIGF2YWlsYWJsZQorICAtIE1vZGlmeSBFeHBvcnQtTW9kdWxlTWVtYmVyIGZ1bmN0aW9uIHRvIGV4cG9ydCB0aGUgQ21kbGV0IGFuZCBhbnkgYWxpYXNlcworLSBVcGRhdGUgUmVhZG1lLnR4dCwgZGVzY3JpYmluZyB0aGUgZW5oYW5jZW1lbnQKKy0gQWRkIGEgbmV3IHRlc3QgdG8gVGVzdC1PcGVuWG1sUG93ZXJUb29sc0NtZGxldHMucHMxCisKK1Byb2NlZHVyZXMgZm9yIGVuaGFuY2luZyB0aGUgY29yZSBDIyBtb2R1bGVzCistIE1vZGlmeSB0aGUgY29kZQorLSBXcml0ZSB4VW5pdCB0ZXN0cworLSBXcml0ZSBhbiBleGFtcGxlIGlmIG5lY2Vzc2FyeQorLSBSdW4geFVuaXQgdGVzdHMKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9CbGFuay1hbHRDaHVuay5kb2N4IGIvVGVzdEZpbGVzL0JsYW5rLWFsdENodW5rLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwYjU5OAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9CbGFuay1hbHRDaHVuay5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9CbGFuay13bWwuZG9jeCBiL1Rlc3RGaWxlcy9CbGFuay13bWwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmJhMTBhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0JsYW5rLXdtbC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAwMS1QbGFpbi1DT01QQVJFLUNBMDAxLVBsYWluLU1vZC5kb2N4IGIvVGVzdEZpbGVzL0NBL0NBMDAxLVBsYWluLUNPTVBBUkUtQ0EwMDEtUGxhaW4tTW9kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc2NzgxOAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DQS9DQTAwMS1QbGFpbi1DT01QQVJFLUNBMDAxLVBsYWluLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAwMS1QbGFpbi1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9DQS9DQTAwMS1QbGFpbi1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDM5ZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0NBL0NBMDAxLVBsYWluLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAwMS1QbGFpbi5kb2N4IGIvVGVzdEZpbGVzL0NBL0NBMDAxLVBsYWluLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5OTFlNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DQS9DQTAwMS1QbGFpbi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAwMi1Cb29rbWFyay5kb2N4IGIvVGVzdEZpbGVzL0NBL0NBMDAyLUJvb2ttYXJrLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhNDM2OQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DQS9DQTAwMi1Cb29rbWFyay5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAwMy1OdW1iZXJlZC1MaXN0LmRvY3ggYi9UZXN0RmlsZXMvQ0EvQ0EwMDMtTnVtYmVyZWQtTGlzdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODNkYjMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ0EvQ0EwMDMtTnVtYmVyZWQtTGlzdC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAwNC1Ud29QYXJhcy5kb2N4IGIvVGVzdEZpbGVzL0NBL0NBMDA0LVR3b1BhcmFzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNkODc5ZQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DQS9DQTAwNC1Ud29QYXJhcy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAwNS1UYWJsZS5kb2N4IGIvVGVzdEZpbGVzL0NBL0NBMDA1LVRhYmxlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyY2Q2ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DQS9DQTAwNS1UYWJsZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAwNi1Db250ZW50Q29udHJvbC5kb2N4IGIvVGVzdEZpbGVzL0NBL0NBMDA2LUNvbnRlbnRDb250cm9sLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY3NDE3ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DQS9DQTAwNi1Db250ZW50Q29udHJvbC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAwNy1EYXlMb25nLmRvY3ggYi9UZXN0RmlsZXMvQ0EvQ0EwMDctRGF5TG9uZy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YjI1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ0EvQ0EwMDctRGF5TG9uZy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAwOC1Gb290bm90ZS1SZWZlcmVuY2UuZG9jeCBiL1Rlc3RGaWxlcy9DQS9DQTAwOC1Gb290bm90ZS1SZWZlcmVuY2UuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTJkY2MzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0NBL0NBMDA4LUZvb3Rub3RlLVJlZmVyZW5jZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAwOS1hbHRDaHVuay5kb2N4IGIvVGVzdEZpbGVzL0NBL0NBMDA5LWFsdENodW5rLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlNDM5ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DQS9DQTAwOS1hbHRDaHVuay5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAxMC1EZWxldGUtUnVuLmRvY3ggYi9UZXN0RmlsZXMvQ0EvQ0EwMTAtRGVsZXRlLVJ1bi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzBiYjIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ0EvQ0EwMTAtRGVsZXRlLVJ1bi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAxMS1JbnNlcnQtUnVuLmRvY3ggYi9UZXN0RmlsZXMvQ0EvQ0EwMTEtSW5zZXJ0LVJ1bi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzgzZWQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ0EvQ0EwMTEtSW5zZXJ0LVJ1bi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAxMi1mbGRTaW1wbGUuZG9jeCBiL1Rlc3RGaWxlcy9DQS9DQTAxMi1mbGRTaW1wbGUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTMwNWRiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0NBL0NBMDEyLWZsZFNpbXBsZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAxMy1Mb3RzLW9mLVN0dWZmLmRvY3ggYi9UZXN0RmlsZXMvQ0EvQ0EwMTMtTG90cy1vZi1TdHVmZi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYjgxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ0EvQ0EwMTMtTG90cy1vZi1TdHVmZi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DQS9DQTAxNC1Db21wbGV4LVRhYmxlLmRvY3ggYi9UZXN0RmlsZXMvQ0EvQ0EwMTQtQ29tcGxleC1UYWJsZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODJiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ0EvQ0EwMTQtQ29tcGxleC1UYWJsZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAwMS1DaGFydC1DYWNoZWQtRGF0YS0wMS5kb2N4IGIvVGVzdEZpbGVzL0NVMDAxLUNoYXJ0LUNhY2hlZC1EYXRhLTAxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiN2EzMAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DVTAwMS1DaGFydC1DYWNoZWQtRGF0YS0wMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAwMi1DaGFydC1DYWNoZWQtRGF0YS0wMi5kb2N4IGIvVGVzdEZpbGVzL0NVMDAyLUNoYXJ0LUNhY2hlZC1EYXRhLTAyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhYmUyNwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DVTAwMi1DaGFydC1DYWNoZWQtRGF0YS0wMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAwMy1DaGFydC1DYWNoZWQtRGF0YS0wMy5kb2N4IGIvVGVzdEZpbGVzL0NVMDAzLUNoYXJ0LUNhY2hlZC1EYXRhLTAzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5NTgxOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DVTAwMy1DaGFydC1DYWNoZWQtRGF0YS0wMy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAwNC1DaGFydC1DYWNoZWQtRGF0YS0wNC5kb2N4IGIvVGVzdEZpbGVzL0NVMDA0LUNoYXJ0LUNhY2hlZC1EYXRhLTA0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyZWRhYwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DVTAwNC1DaGFydC1DYWNoZWQtRGF0YS0wNC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAwNS1DaGFydC1DYWNoZWQtRGF0YS0wNS5kb2N4IGIvVGVzdEZpbGVzL0NVMDA1LUNoYXJ0LUNhY2hlZC1EYXRhLTA1LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExOTA2OAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DVTAwNS1DaGFydC1DYWNoZWQtRGF0YS0wNS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAwNi1DaGFydC1DYWNoZWQtRGF0YS0wNi5kb2N4IGIvVGVzdEZpbGVzL0NVMDA2LUNoYXJ0LUNhY2hlZC1EYXRhLTA2LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkNTkxYQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DVTAwNi1DaGFydC1DYWNoZWQtRGF0YS0wNi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAwNy1DaGFydC1DYWNoZWQtRGF0YS0wNy5kb2N4IGIvVGVzdEZpbGVzL0NVMDA3LUNoYXJ0LUNhY2hlZC1EYXRhLTA3LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhODg3ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DVTAwNy1DaGFydC1DYWNoZWQtRGF0YS0wNy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAwOC1DaGFydC1DYWNoZWQtRGF0YS0wOC5kb2N4IGIvVGVzdEZpbGVzL0NVMDA4LUNoYXJ0LUNhY2hlZC1EYXRhLTA4LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4Zjc0ZQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DVTAwOC1DaGFydC1DYWNoZWQtRGF0YS0wOC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAwOS1DaGFydC1FbWJlZGRlZC1YbHN4LTAxLmRvY3ggYi9UZXN0RmlsZXMvQ1UwMDktQ2hhcnQtRW1iZWRkZWQtWGxzeC0wMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTNhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ1UwMDktQ2hhcnQtRW1iZWRkZWQtWGxzeC0wMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAxMC1DaGFydC1FbWJlZGRlZC1YbHN4LTAyLmRvY3ggYi9UZXN0RmlsZXMvQ1UwMTAtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNGJiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ1UwMTAtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAxMS1DaGFydC1FbWJlZGRlZC1YbHN4LTAzLmRvY3ggYi9UZXN0RmlsZXMvQ1UwMTEtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wMy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YzhjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ1UwMTEtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wMy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAxMi1DaGFydC1FbWJlZGRlZC1YbHN4LTA0LmRvY3ggYi9UZXN0RmlsZXMvQ1UwMTItQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNTc4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ1UwMTItQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAxMy1DaGFydC1FbWJlZGRlZC1YbHN4LTA1LmRvY3ggYi9UZXN0RmlsZXMvQ1UwMTMtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNGJlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ1UwMTMtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAxNC1DaGFydC1FbWJlZGRlZC1YbHN4LTA2LmRvY3ggYi9UZXN0RmlsZXMvQ1UwMTQtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNzZmN2QKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ1UwMTQtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAxNS1DaGFydC1FbWJlZGRlZC1YbHN4LTA3LmRvY3ggYi9UZXN0RmlsZXMvQ1UwMTUtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzIxMDIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ1UwMTUtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wNy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAxNi1DaGFydC1FbWJlZGRlZC1YbHN4LTA4LmRvY3ggYi9UZXN0RmlsZXMvQ1UwMTYtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wOC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZTNkMzIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ1UwMTYtQ2hhcnQtRW1iZWRkZWQtWGxzeC0wOC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAxNy1DaGFydC1FbWJlZGRlZC1YbHN4LTEwLmRvY3ggYi9UZXN0RmlsZXMvQ1UwMTctQ2hhcnQtRW1iZWRkZWQtWGxzeC0xMC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NjBiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ1UwMTctQ2hhcnQtRW1iZWRkZWQtWGxzeC0xMC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAxOC1DaGFydC1DYWNoZWQtRGF0YS00MS5wcHR4IGIvVGVzdEZpbGVzL0NVMDE4LUNoYXJ0LUNhY2hlZC1EYXRhLTQxLnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU4MDM4NAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DVTAxOC1DaGFydC1DYWNoZWQtRGF0YS00MS5wcHR4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DVTAxOS1DaGFydC1FbWJlZGRlZC1YbHN4LTQxLnBwdHggYi9UZXN0RmlsZXMvQ1UwMTktQ2hhcnQtRW1iZWRkZWQtWGxzeC00MS5wcHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTYyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ1UwMTktQ2hhcnQtRW1iZWRkZWQtWGxzeC00MS5wcHR4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DWi9DWjAwMS1QbGFpbi1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9DWi9DWjAwMS1QbGFpbi1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODJiZDcyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0NaL0NaMDAxLVBsYWluLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DWi9DWjAwMS1QbGFpbi5kb2N4IGIvVGVzdEZpbGVzL0NaL0NaMDAxLVBsYWluLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5OTFlNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DWi9DWjAwMS1QbGFpbi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DWi9DWjAwMi1NdWx0aS1QYXJhZ3JhcGhzLU1vZC5kb2N4IGIvVGVzdEZpbGVzL0NaL0NaMDAyLU11bHRpLVBhcmFncmFwaHMtTW9kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4ZTViOAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DWi9DWjAwMi1NdWx0aS1QYXJhZ3JhcGhzLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DWi9DWjAwMi1NdWx0aS1QYXJhZ3JhcGhzLmRvY3ggYi9UZXN0RmlsZXMvQ1ovQ1owMDItTXVsdGktUGFyYWdyYXBocy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNmRhYjUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ1ovQ1owMDItTXVsdGktUGFyYWdyYXBocy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DWi9DWjAwMy1NdWx0aS1QYXJhZ3JhcGhzLU1vZC5kb2N4IGIvVGVzdEZpbGVzL0NaL0NaMDAzLU11bHRpLVBhcmFncmFwaHMtTW9kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3Y2QwZQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9DWi9DWjAwMy1NdWx0aS1QYXJhZ3JhcGhzLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DWi9DWjAwMy1NdWx0aS1QYXJhZ3JhcGhzLmRvY3ggYi9UZXN0RmlsZXMvQ1ovQ1owMDMtTXVsdGktUGFyYWdyYXBocy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNjFkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ1ovQ1owMDMtTXVsdGktUGFyYWdyYXBocy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DWi9DWjAwNC1NdWx0aS1QYXJhZ3JhcGhzLWluLUNlbGwtTW9kLmRvY3ggYi9UZXN0RmlsZXMvQ1ovQ1owMDQtTXVsdGktUGFyYWdyYXBocy1pbi1DZWxsLU1vZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMWQyZjQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvQ1ovQ1owMDQtTXVsdGktUGFyYWdyYXBocy1pbi1DZWxsLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9DWi9DWjAwNC1NdWx0aS1QYXJhZ3JhcGhzLWluLUNlbGwuZG9jeCBiL1Rlc3RGaWxlcy9DWi9DWjAwNC1NdWx0aS1QYXJhZ3JhcGhzLWluLUNlbGwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWE3Y2IzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0NaL0NaMDA0LU11bHRpLVBhcmFncmFwaHMtaW4tQ2VsbC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9EQS1DZWxsRGF0YUluQXR0cmlidXRlcy54bWwgYi9UZXN0RmlsZXMvREEtQ2VsbERhdGFJbkF0dHJpYnV0ZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDY3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEtQ2VsbERhdGFJbkF0dHJpYnV0ZXMueG1sCkBAIC0wLDAgKzEsMTAgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8Q3VzdG9tZXI+CisgIDxDdXN0b21lcklEPjE8L0N1c3RvbWVySUQ+CisgIDxOYW1lPkNoZXJ5bDwvTmFtZT4KKyAgPEhpZ2hWYWx1ZUN1c3RvbWVyPlRydWU8L0hpZ2hWYWx1ZUN1c3RvbWVyPgorICA8T3JkZXJzPgorICAgIDxPcmRlciBQcm9kdWN0RGVzY3JpcHRpb249IlVuaWN5Y2xlIiBRdWFudGl0eT0iOCIgT3JkZXJEYXRlPSI5LzUvMjAwMSIgLz4KKyAgICA8T3JkZXIgUHJvZHVjdERlc2NyaXB0aW9uPSJUcmljeWNsZSIgUXVhbnRpdHk9IjUiIE9yZGVyRGF0ZT0iMTAvMjEvMjAwNSIgLz4KKyAgPC9PcmRlcnM+Cis8L0N1c3RvbWVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9EQS1Db25kaXRpb25hbE9uQXR0cmlidXRlLnhtbCBiL1Rlc3RGaWxlcy9EQS1Db25kaXRpb25hbE9uQXR0cmlidXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTUzMzgyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBLUNvbmRpdGlvbmFsT25BdHRyaWJ1dGUueG1sCkBAIC0wLDAgKzEsMTcgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8Q3VzdG9tZXIgSGlnaFZhbHVlQ3VzdG9tZXI9IlRydWUiPgorICA8Q3VzdG9tZXJJRD4xPC9DdXN0b21lcklEPgorICA8TmFtZT5DaGVyeWw8L05hbWU+CisgIDxPcmRlcnM+CisgICAgPE9yZGVyPgorICAgICAgPFByb2R1Y3REZXNjcmlwdGlvbj5VbmljeWNsZTwvUHJvZHVjdERlc2NyaXB0aW9uPgorICAgICAgPFF1YW50aXR5PjM8L1F1YW50aXR5PgorICAgICAgPE9yZGVyRGF0ZT45LzUvMjAwMTwvT3JkZXJEYXRlPgorICAgIDwvT3JkZXI+CisgICAgPE9yZGVyPgorICAgICAgPFByb2R1Y3REZXNjcmlwdGlvbj5UcmljeWNsZTwvUHJvZHVjdERlc2NyaXB0aW9uPgorICAgICAgPFF1YW50aXR5PjM8L1F1YW50aXR5PgorICAgICAgPE9yZGVyRGF0ZT44LzYvMjAwMDwvT3JkZXJEYXRlPgorICAgIDwvT3JkZXI+CisgIDwvT3JkZXJzPgorPC9DdXN0b21lcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEtQ29udGVudC1MaXN0LnhtbCBiL1Rlc3RGaWxlcy9EQS1Db250ZW50LUxpc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNDI4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEtQ29udGVudC1MaXN0LnhtbApAQCAtMCwwICsxLDM2IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPERhdGE+CisgIDxSb3c+CisgICAgPExpbms+aHR0cDovL2Jsb2dzLm1zZG4uY29tL2IvZXJpY3doaXRlL2FyY2hpdmUvMjAwNy8xMi8xMS9vcGVueG1sLWNvbnRlbnQtdHlwZXMtaW4tYW4teG1sLWRvY3VtZW50LmFzcHg8L0xpbms+CisgICAgPFRpdGxlPk9wZW5YTUwgQ29udGVudCBUeXBlcyBpbiBhbiBYTUwgRG9jdW1lbnQ8L1RpdGxlPgorICAgIDxTdW1tYXJ5PlNvbWV0aW1lcyB5b3UgbmVlZCB0byBwcm9ncmFtbWF0aWNhbGx5IGFjY2VzcyBhIHZhcmlldHkgb2YgcGFydHMgaW4gT3BlbiBYTUwgZG9jdW1lbnRzIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGVzIG9mIHRoZSBwYXJ0cy4gSW4gdGhpcyBjYXNlIGl0IGlzIGhlbHBmdWwgdG8gaGF2ZSBhIGxpc3Qgb2YgdGhlIGNvbnRlbnQgdHlwZXMgaW4gYSBwcm9ncmFtbWF0aWNhbGx5IGFjY2Vzc2libGUgZm9ybS48L1N1bW1hcnk+CisgICAgPEF1dGhvcj5FcmljIFdoaXRlPC9BdXRob3I+CisgICAgPEtleXdvcmQ+T1BDPC9LZXl3b3JkPgorICAgIDxBcnRpY2xlUGFnZXM+MTwvQXJ0aWNsZVBhZ2VzPgorICAgIDxDb2RlPk5vbmU8L0NvZGU+CisgICAgPFRlY2huaWNhbExldmVsPjEwMDwvVGVjaG5pY2FsTGV2ZWw+CisgICAgPE1lZGlhVHlwZT5BcnRpY2xlPC9NZWRpYVR5cGU+CisgIDwvUm93PgorICA8Um93PgorICAgIDxMaW5rPmh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9iL2VyaWN3aGl0ZS9hcmNoaXZlLzIwMDgvMDEvMTcvaG93LXRvLWV4dHJhY3QtY29tbWVudHMtZnJvbS1vcGVuLXhtbC1kb2N1bWVudHMuYXNweDwvTGluaz4KKyAgICA8VGl0bGU+SG93IHRvIEV4dHJhY3QgQ29tbWVudHMgZnJvbSBPcGVuIFhNTCBEb2N1bWVudHM8L1RpdGxlPgorICAgIDxTdW1tYXJ5PkhvdyB0byBFeHRyYWN0IENvbW1lbnRzIGZyb20gT3BlbiBYTUwgRG9jdW1lbnRzPC9TdW1tYXJ5PgorICAgIDxBdXRob3I+RXJpYyBXaGl0ZTwvQXV0aG9yPgorICAgIDxLZXl3b3JkPk9wZW4gWE1MIFNESywgV29yZHByb2Nlc3NpbmdNTDwvS2V5d29yZD4KKyAgICA8QXJ0aWNsZVBhZ2VzPjU8L0FydGljbGVQYWdlcz4KKyAgICA8Q29kZT5DIzwvQ29kZT4KKyAgICA8VGVjaG5pY2FsTGV2ZWw+MzAwPC9UZWNobmljYWxMZXZlbD4KKyAgICA8TWVkaWFUeXBlPkFydGljbGU8L01lZGlhVHlwZT4KKyAgPC9Sb3c+CisgIDxSb3c+CisgICAgPExpbms+aHR0cDovL2Jsb2dzLm1zZG4uY29tL2IvZXJpY3doaXRlL2FyY2hpdmUvMjAwOC8wNi8xMS9wcm9jZXNzaW5nLW9wZW4teG1sLWRvY3VtZW50cy1zZXJ2ZXItc2lkZS11c2luZy1wb3dlcnNoZWxsLmFzcHg8L0xpbms+CisgICAgPFRpdGxlPkF1dG9tYXRlZCBQcm9jZXNzaW5nIG9mIE9wZW4gWE1MIERvY3VtZW50cyB1c2luZyBQb3dlclNoZWxsPC9UaXRsZT4KKyAgICA8U3VtbWFyeT5Qcm9jZXNzaW5nIE9wZW4gWE1MIGRvY3VtZW50cyB1c2luZyBQb3dlclNoZWxsIGlzIGEgcG93ZXJmdWwgYXBwcm9hY2ggZm9yIGNyZWF0aW5nLCBtb2RpZnlpbmcsIGFuZCB0cmFuc2Zvcm1pbmcgT3BlbiBYTUwgZG9jdW1lbnRzLiAgVGhlIFBvd2VyVG9vbHMgZm9yIE9wZW4gWE1MIGFyZSBleGFtcGxlcyBhbmQgZ3VpZGFuY2UgdGhhdCBzaG93IGhvdyB0byBkbyB0aGlzLiAgVGhleSBjb25zaXN0IG9mIFBvd2VyU2hlbGwgY21kbGV0cywgYW5kIGEgbnVtYmVyIG9mIGV4YW1wbGUgc2NyaXB0cyB0aGF0IGRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgdGhlIGNtZGxldHMuICBFeGFtcGxlcyBpbmNsdWRlIGF1dG9tYXRlZCB3b3JkIHByb2Nlc3NpbmcgZG9jdW1lbnQgYW5kIHNwcmVhZHNoZWV0IGdlbmVyYXRpb24sIGFuZCBwcmVwYXJpbmcgZG9jdW1lbnRzIGZvciBkaXN0cmlidXRpb24gZXh0ZXJuYWwgdG8gYSBjb21wYW55LCBpbmNsdWRpbmcgcmVtb3ZpbmcgY29tbWVudHMsIGFjY2VwdGluZyByZXZpc2lvbnMsIGFwcGx5aW5nIGEgdW5pZm9ybSB0aGVtZSB0byB0aGVtLCBhbmQgYXBwbHlpbmcgYSB3YXRlcm1hcmsgdG8gdGhlbS48L1N1bW1hcnk+CisgICAgPEF1dGhvcj5FcmljIFdoaXRlPC9BdXRob3I+CisgICAgPEtleXdvcmQ+UG93ZXJUb29scywgRE9DWCBHZW5lcmF0aW9uLCBYTFNYIEdlbmVyYXRpb24sIFRvb2xzLCBPcGVuIFhNTCBTREs8L0tleXdvcmQ+CisgICAgPEFydGljbGVQYWdlcz40PC9BcnRpY2xlUGFnZXM+CisgICAgPENvZGU+Tm9uZTwvQ29kZT4KKyAgICA8VGVjaG5pY2FsTGV2ZWw+MjAwPC9UZWNobmljYWxMZXZlbD4KKyAgICA8TWVkaWFUeXBlPkFydGljbGU8L01lZGlhVHlwZT4KKyAgPC9Sb3c+Cis8L0RhdGE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0RBLURhdGEueG1sIGIvVGVzdEZpbGVzL0RBLURhdGEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjkyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEtRGF0YS54bWwKQEAgLTAsMCArMSwyNCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxDdXN0b21lcj4KKyAgPEN1c3RvbWVySUQ+MTwvQ3VzdG9tZXJJRD4KKyAgPE5hbWU+Q2hlcnlsPC9OYW1lPgorICA8SGlnaFZhbHVlQ3VzdG9tZXI+VHJ1ZTwvSGlnaFZhbHVlQ3VzdG9tZXI+CisgIDxPcmRlcnM+CisgICAgPE9yZGVyPgorICAgICAgPFByb2R1Y3REZXNjcmlwdGlvbj5VbmljeWNsZTwvUHJvZHVjdERlc2NyaXB0aW9uPgorICAgICAgPFF1YW50aXR5PjM8L1F1YW50aXR5PgorICAgICAgPE9yZGVyRGF0ZT45LzUvMjAwMTwvT3JkZXJEYXRlPgorICAgIDwvT3JkZXI+CisgICAgPE9yZGVyPgorICAgICAgPFByb2R1Y3REZXNjcmlwdGlvbj5UcmljeWNsZTwvUHJvZHVjdERlc2NyaXB0aW9uPgorICAgICAgPFF1YW50aXR5PjM8L1F1YW50aXR5PgorICAgICAgPE9yZGVyRGF0ZT44LzYvMjAwMDwvT3JkZXJEYXRlPgorICAgIDwvT3JkZXI+CisgIDwvT3JkZXJzPgorICA8VG90YWxRdWFudGl0eT42PC9Ub3RhbFF1YW50aXR5PgorICA8RGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhpcworaXMgYSBtdWx0aWxpbmUKK2Rlc2NyaXB0aW9uIHRoYXQKK2NvbnRhaW5zIGRldGFpbHMgYWJvdXQKK0NoZXJ5bC5dXT48L0Rlc2NyaXB0aW9uPgorPC9DdXN0b21lcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEtRGF0YU5lc3RlZFJlcGVhdC54bWwgYi9UZXN0RmlsZXMvREEtRGF0YU5lc3RlZFJlcGVhdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkZTc2NwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQS1EYXRhTmVzdGVkUmVwZWF0LnhtbApAQCAtMCwwICsxLDI4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPEN1c3RvbWVyPgorICA8Q3VzdG9tZXJJRD4xPC9DdXN0b21lcklEPgorICA8TmFtZT5DaGVyeWw8L05hbWU+CisgIDxIaWdoVmFsdWVDdXN0b21lcj5UcnVlPC9IaWdoVmFsdWVDdXN0b21lcj4KKyAgPE9yZGVycz4KKyAgICA8T3JkZXI+CisgICAgICA8UHJvZHVjdERlc2NyaXB0aW9uPlVuaWN5Y2xlPC9Qcm9kdWN0RGVzY3JpcHRpb24+CisgICAgICA8UXVhbnRpdHk+MzwvUXVhbnRpdHk+CisgICAgICA8T3JkZXJEYXRlPjkvNS8yMDAxPC9PcmRlckRhdGU+CisJICA8SXRlbXM+CisJICAgIDxJdGVtIFZhbHVlPSIxIiAvPgorCSAgICA8SXRlbSBWYWx1ZT0iMiIgLz4KKwkgICAgPEl0ZW0gVmFsdWU9IjMiIC8+CisJICA8L0l0ZW1zPgorICAgIDwvT3JkZXI+CisgICAgPE9yZGVyPgorICAgICAgPFByb2R1Y3REZXNjcmlwdGlvbj5UcmljeWNsZTwvUHJvZHVjdERlc2NyaXB0aW9uPgorICAgICAgPFF1YW50aXR5PjM8L1F1YW50aXR5PgorICAgICAgPE9yZGVyRGF0ZT44LzYvMjAwMDwvT3JkZXJEYXRlPgorCSAgPEl0ZW1zPgorCSAgICA8SXRlbSBWYWx1ZT0iNCIgLz4KKwkgICAgPEl0ZW0gVmFsdWU9IjUiIC8+CisJICAgIDxJdGVtIFZhbHVlPSI2IiAvPgorCSAgPC9JdGVtcz4KKyAgICA8L09yZGVyPgorICA8L09yZGVycz4KKzwvQ3VzdG9tZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0RBLURhdGFOb3RIaWdoVmFsdWVDdXN0LnhtbCBiL1Rlc3RGaWxlcy9EQS1EYXRhTm90SGlnaFZhbHVlQ3VzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxZDU4OAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQS1EYXRhTm90SGlnaFZhbHVlQ3VzdC54bWwKQEAgLTAsMCArMSwxOCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxDdXN0b21lcj4KKyAgPEN1c3RvbWVySUQ+MTwvQ3VzdG9tZXJJRD4KKyAgPE5hbWU+Q2hlcnlsPC9OYW1lPgorICA8SGlnaFZhbHVlQ3VzdG9tZXI+RmFsc2U8L0hpZ2hWYWx1ZUN1c3RvbWVyPgorICA8T3JkZXJzPgorICAgIDxPcmRlcj4KKyAgICAgIDxQcm9kdWN0RGVzY3JpcHRpb24+VW5pY3ljbGU8L1Byb2R1Y3REZXNjcmlwdGlvbj4KKyAgICAgIDxRdWFudGl0eT4zPC9RdWFudGl0eT4KKyAgICAgIDxPcmRlckRhdGU+OS81LzIwMDE8L09yZGVyRGF0ZT4KKyAgICA8L09yZGVyPgorICAgIDxPcmRlcj4KKyAgICAgIDxQcm9kdWN0RGVzY3JpcHRpb24+VHJpY3ljbGU8L1Byb2R1Y3REZXNjcmlwdGlvbj4KKyAgICAgIDxRdWFudGl0eT4zPC9RdWFudGl0eT4KKyAgICAgIDxPcmRlckRhdGU+OC82LzIwMDA8L09yZGVyRGF0ZT4KKyAgICA8L09yZGVyPgorICA8L09yZGVycz4KKzwvQ3VzdG9tZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0RBLURhdGFTbWFsbEN1c3RvbWVyLnhtbCBiL1Rlc3RGaWxlcy9EQS1EYXRhU21hbGxDdXN0b21lci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VlZDNkNwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQS1EYXRhU21hbGxDdXN0b21lci54bWwKQEAgLTAsMCArMSwyNCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxDdXN0b21lcj4KKyAgPEN1c3RvbWVySUQ+MTwvQ3VzdG9tZXJJRD4KKyAgPE5hbWU+Q2hlcnlsPC9OYW1lPgorICA8SGlnaFZhbHVlQ3VzdG9tZXI+RmFsc2U8L0hpZ2hWYWx1ZUN1c3RvbWVyPgorICA8T3JkZXJzPgorICAgIDxPcmRlcj4KKyAgICAgIDxQcm9kdWN0RGVzY3JpcHRpb24+VW5pY3ljbGU8L1Byb2R1Y3REZXNjcmlwdGlvbj4KKyAgICAgIDxRdWFudGl0eT4zPC9RdWFudGl0eT4KKyAgICAgIDxPcmRlckRhdGU+OS81LzIwMDE8L09yZGVyRGF0ZT4KKyAgICA8L09yZGVyPgorICAgIDxPcmRlcj4KKyAgICAgIDxQcm9kdWN0RGVzY3JpcHRpb24+VHJpY3ljbGU8L1Byb2R1Y3REZXNjcmlwdGlvbj4KKyAgICAgIDxRdWFudGl0eT4zPC9RdWFudGl0eT4KKyAgICAgIDxPcmRlckRhdGU+OC82LzIwMDA8L09yZGVyRGF0ZT4KKyAgICA8L09yZGVyPgorICA8L09yZGVycz4KKyAgPFRvdGFsUXVhbnRpdHk+NjwvVG90YWxRdWFudGl0eT4KKyAgPERlc2NyaXB0aW9uPjwhW0NEQVRBW1RoaXMKK2lzIGEgbXVsdGlsaW5lCitkZXNjcmlwdGlvbiB0aGF0Citjb250YWlucyBkZXRhaWxzIGFib3V0CitDaGVyeWwuXV0+PC9EZXNjcmlwdGlvbj4KKzwvQ3VzdG9tZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0RBLVRvb011Y2hEYXRhRm9yQ2VsbC54bWwgYi9UZXN0RmlsZXMvREEtVG9vTXVjaERhdGFGb3JDZWxsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OThmNjI5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBLVRvb011Y2hEYXRhRm9yQ2VsbC54bWwKQEAgLTAsMCArMSwxOSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxDdXN0b21lcj4KKyAgPEN1c3RvbWVySUQ+MTwvQ3VzdG9tZXJJRD4KKyAgPE5hbWU+Q2hlcnlsPC9OYW1lPgorICA8SGlnaFZhbHVlQ3VzdG9tZXI+VHJ1ZTwvSGlnaFZhbHVlQ3VzdG9tZXI+CisgIDxPcmRlcnM+CisgICAgPE9yZGVyPgorICAgICAgPFByb2R1Y3REZXNjcmlwdGlvbj5VbmljeWNsZTwvUHJvZHVjdERlc2NyaXB0aW9uPgorICAgICAgPFByb2R1Y3REZXNjcmlwdGlvbj5VbmljeWNsZTwvUHJvZHVjdERlc2NyaXB0aW9uPgorICAgICAgPFF1YW50aXR5PjM8L1F1YW50aXR5PgorICAgICAgPE9yZGVyRGF0ZT45LzUvMjAwMTwvT3JkZXJEYXRlPgorICAgIDwvT3JkZXI+CisgICAgPE9yZGVyPgorICAgICAgPFByb2R1Y3REZXNjcmlwdGlvbj5UcmljeWNsZTwvUHJvZHVjdERlc2NyaXB0aW9uPgorICAgICAgPFF1YW50aXR5PjM8L1F1YW50aXR5PgorICAgICAgPE9yZGVyRGF0ZT44LzYvMjAwMDwvT3JkZXJEYXRlPgorICAgIDwvT3JkZXI+CisgIDwvT3JkZXJzPgorPC9DdXN0b21lcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEtVG9vTXVjaERhdGFGb3JDb25kaXRpb25hbC54bWwgYi9UZXN0RmlsZXMvREEtVG9vTXVjaERhdGFGb3JDb25kaXRpb25hbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4OGNlOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQS1Ub29NdWNoRGF0YUZvckNvbmRpdGlvbmFsLnhtbApAQCAtMCwwICsxLDE5IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPEN1c3RvbWVyPgorICA8Q3VzdG9tZXJJRD4xPC9DdXN0b21lcklEPgorICA8TmFtZT5DaGVyeWw8L05hbWU+CisgIDxIaWdoVmFsdWVDdXN0b21lcj5UcnVlPC9IaWdoVmFsdWVDdXN0b21lcj4KKyAgPEhpZ2hWYWx1ZUN1c3RvbWVyPlRydWU8L0hpZ2hWYWx1ZUN1c3RvbWVyPgorICA8T3JkZXJzPgorICAgIDxPcmRlcj4KKyAgICAgIDxQcm9kdWN0RGVzY3JpcHRpb24+VW5pY3ljbGU8L1Byb2R1Y3REZXNjcmlwdGlvbj4KKyAgICAgIDxRdWFudGl0eT4zPC9RdWFudGl0eT4KKyAgICAgIDxPcmRlckRhdGU+OS81LzIwMDE8L09yZGVyRGF0ZT4KKyAgICA8L09yZGVyPgorICAgIDxPcmRlcj4KKyAgICAgIDxQcm9kdWN0RGVzY3JpcHRpb24+VHJpY3ljbGU8L1Byb2R1Y3REZXNjcmlwdGlvbj4KKyAgICAgIDxRdWFudGl0eT4zPC9RdWFudGl0eT4KKyAgICAgIDxPcmRlckRhdGU+OC82LzIwMDA8L09yZGVyRGF0ZT4KKyAgICA8L09yZGVyPgorICA8L09yZGVycz4KKzwvQ3VzdG9tZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0RBMDAxLVRlbXBsYXRlRG9jdW1lbnQuZG9jeCBiL1Rlc3RGaWxlcy9EQTAwMS1UZW1wbGF0ZURvY3VtZW50LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQxOWVkMwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTAwMS1UZW1wbGF0ZURvY3VtZW50LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0RBMDAyLVRlbXBsYXRlRG9jdW1lbnQuZG9jeCBiL1Rlc3RGaWxlcy9EQTAwMi1UZW1wbGF0ZURvY3VtZW50LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxMGIzNwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTAwMi1UZW1wbGF0ZURvY3VtZW50LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0RBMDAzLVNlbGVjdC1YUGF0aEZpbmRzTm9EYXRhLmRvY3ggYi9UZXN0RmlsZXMvREEwMDMtU2VsZWN0LVhQYXRoRmluZHNOb0RhdGEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTA3NjhkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMDAzLVNlbGVjdC1YUGF0aEZpbmRzTm9EYXRhLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0RBMDA0LURhdGEueG1sIGIvVGVzdEZpbGVzL0RBMDA0LURhdGEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZDNiOGMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEwMDQtRGF0YS54bWwKQEAgLTAsMCArMSwxOCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxDdXN0b21lcj4KKyAgPEN1c3RvbWVySUQ+MTwvQ3VzdG9tZXJJRD4KKyAgPE5hbWU+Q2hlcnlsPC9OYW1lPgorICA8SGlnaFZhbHVlQ3VzdG9tZXI+VHJ1ZTwvSGlnaFZhbHVlQ3VzdG9tZXI+CisgIDxPcmRlcnM+CisgICAgPE9yZGVyPgorICAgICAgPFByb2R1Y3REZXNjcmlwdGlvbj5VbmljeWNsZTwvUHJvZHVjdERlc2NyaXB0aW9uPgorICAgICAgPFF1YW50aXR5PjM8L1F1YW50aXR5PgorICAgICAgPE9yZGVyRGF0ZT45LzUvMjAwMTwvT3JkZXJEYXRlPgorICAgIDwvT3JkZXI+CisgICAgPE9yZGVyPgorICAgICAgPFByb2R1Y3REZXNjcmlwdGlvbj5UcmljeWNsZTwvUHJvZHVjdERlc2NyaXB0aW9uPgorICAgICAgPFF1YW50aXR5PjM8L1F1YW50aXR5PgorICAgICAgPE9yZGVyRGF0ZT44LzYvMjAwMDwvT3JkZXJEYXRlPgorICAgIDwvT3JkZXI+CisgIDwvT3JkZXJzPgorPC9DdXN0b21lcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMDQtU2VsZWN0LVhQYXRoRmluZHNOb0RhdGFPcHRpb25hbC5kb2N4IGIvVGVzdEZpbGVzL0RBMDA0LVNlbGVjdC1YUGF0aEZpbmRzTm9EYXRhT3B0aW9uYWwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmU5NzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMDA0LVNlbGVjdC1YUGF0aEZpbmRzTm9EYXRhT3B0aW9uYWwuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMDUtU2VsZWN0Um93RGF0YS1Ob0RhdGEuZG9jeCBiL1Rlc3RGaWxlcy9EQTAwNS1TZWxlY3RSb3dEYXRhLU5vRGF0YS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDdhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEwMDUtU2VsZWN0Um93RGF0YS1Ob0RhdGEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMDYtU2VsZWN0VGVzdFZhbHVlLU5vRGF0YS5kb2N4IGIvVGVzdEZpbGVzL0RBMDA2LVNlbGVjdFRlc3RWYWx1ZS1Ob0RhdGEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzYxY2MwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMDA2LVNlbGVjdFRlc3RWYWx1ZS1Ob0RhdGEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMDctU2VsZWN0UmVwZWF0aW5nRGF0YS1Ob0RhdGEuZG9jeCBiL1Rlc3RGaWxlcy9EQTAwNy1TZWxlY3RSZXBlYXRpbmdEYXRhLU5vRGF0YS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NmYyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEwMDctU2VsZWN0UmVwZWF0aW5nRGF0YS1Ob0RhdGEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMDgtVGFibGVFbGVtZW50V2l0aE5vVGFibGUuZG9jeCBiL1Rlc3RGaWxlcy9EQTAwOC1UYWJsZUVsZW1lbnRXaXRoTm9UYWJsZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOGRjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEwMDgtVGFibGVFbGVtZW50V2l0aE5vVGFibGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMDktSW52YWxpZFhQYXRoLmRvY3ggYi9UZXN0RmlsZXMvREEwMDktSW52YWxpZFhQYXRoLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1OGY5OQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTAwOS1JbnZhbGlkWFBhdGguZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMTAtSW52YWxpZFhtbC5kb2N4IGIvVGVzdEZpbGVzL0RBMDEwLUludmFsaWRYbWwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGYzNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMDEwLUludmFsaWRYbWwuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMTEtU2NoZW1hRXJyb3IuZG9jeCBiL1Rlc3RGaWxlcy9EQTAxMS1TY2hlbWFFcnJvci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwODQwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEwMTEtU2NoZW1hRXJyb3IuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMTItT3RoZXJNYXJrdXBUeXBlcy5kb2N4IGIvVGVzdEZpbGVzL0RBMDEyLU90aGVyTWFya3VwVHlwZXMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmYyYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMDEyLU90aGVyTWFya3VwVHlwZXMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMTMtUnVucy5kb2N4IGIvVGVzdEZpbGVzL0RBMDEzLVJ1bnMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDM4YjhlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMDEzLVJ1bnMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMTQtVHdvUnVucy1Ob1ZhbHVlc1NlbGVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvREEwMTQtVHdvUnVucy1Ob1ZhbHVlc1NlbGVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmZTc2YwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTAxNC1Ud29SdW5zLU5vVmFsdWVzU2VsZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMTUtVHdvUnVuc1htbEV4Y2VwdGlvbkluRmlyc3QuZG9jeCBiL1Rlc3RGaWxlcy9EQTAxNS1Ud29SdW5zWG1sRXhjZXB0aW9uSW5GaXJzdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiODcxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEwMTUtVHdvUnVuc1htbEV4Y2VwdGlvbkluRmlyc3QuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMTYtVHdvUnVuc1NjaGVtYUVycm9ySW5TZWNvbmQuZG9jeCBiL1Rlc3RGaWxlcy9EQTAxNi1Ud29SdW5zU2NoZW1hRXJyb3JJblNlY29uZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NmIyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEwMTYtVHdvUnVuc1NjaGVtYUVycm9ySW5TZWNvbmQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMTctRml2ZVJ1bnMuZG9jeCBiL1Rlc3RGaWxlcy9EQTAxNy1GaXZlUnVucy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzkzYzMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEwMTctRml2ZVJ1bnMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMTgtU21hcnRRdW90ZXMuZG9jeCBiL1Rlc3RGaWxlcy9EQTAxOC1TbWFydFF1b3Rlcy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MzEyMGEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEwMTgtU21hcnRRdW90ZXMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMTktUnVuSXNFbnRpcmVQYXJhZ3JhcGguZG9jeCBiL1Rlc3RGaWxlcy9EQTAxOS1SdW5Jc0VudGlyZVBhcmFncmFwaC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZjJkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEwMTktUnVuSXNFbnRpcmVQYXJhZ3JhcGguZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMjAtVHdvUnVuc0FuZE5vT3RoZXJDb250ZW50LmRvY3ggYi9UZXN0RmlsZXMvREEwMjAtVHdvUnVuc0FuZE5vT3RoZXJDb250ZW50LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3NDliNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTAyMC1Ud29SdW5zQW5kTm9PdGhlckNvbnRlbnQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMjEtTmVzdGVkUmVwZWF0LmRvY3ggYi9UZXN0RmlsZXMvREEwMjEtTmVzdGVkUmVwZWF0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0MzQyNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTAyMS1OZXN0ZWRSZXBlYXQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMjItSW52YWxpZFhQYXRoLmRvY3ggYi9UZXN0RmlsZXMvREEwMjItSW52YWxpZFhQYXRoLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2ZTU4NgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTAyMi1JbnZhbGlkWFBhdGguZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMjMtUmVwZWF0V09FbmRSZXBlYXQuZG9jeCBiL1Rlc3RGaWxlcy9EQTAyMy1SZXBlYXRXT0VuZFJlcGVhdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMmIwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEwMjMtUmVwZWF0V09FbmRSZXBlYXQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMjQtVHJhY2tlZFJldmlzaW9ucy5kb2N4IGIvVGVzdEZpbGVzL0RBMDI0LVRyYWNrZWRSZXZpc2lvbnMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmVlYzRkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMDI0LVRyYWNrZWRSZXZpc2lvbnMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMjUtVGVtcGxhdGVEb2N1bWVudC5kb2N4IGIvVGVzdEZpbGVzL0RBMDI1LVRlbXBsYXRlRG9jdW1lbnQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmI5MjZjCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMDI1LVRlbXBsYXRlRG9jdW1lbnQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMjYtSW52YWxpZFJvb3RYbWxFbGVtZW50LmRvY3ggYi9UZXN0RmlsZXMvREEwMjYtSW52YWxpZFJvb3RYbWxFbGVtZW50LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1ZTczMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTAyNi1JbnZhbGlkUm9vdFhtbEVsZW1lbnQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMjctWFBhdGhFcnJvckluUGFyYS5kb2N4IGIvVGVzdEZpbGVzL0RBMDI3LVhQYXRoRXJyb3JJblBhcmEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQ4N2E3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMDI3LVhQYXRoRXJyb3JJblBhcmEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMjgtTm9Qcm90b3R5cGVSb3cuZG9jeCBiL1Rlc3RGaWxlcy9EQTAyOC1Ob1Byb3RvdHlwZVJvdy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3Y2IyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEwMjgtTm9Qcm90b3R5cGVSb3cuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMjktTm9EYXRhRm9yQ2VsbC5kb2N4IGIvVGVzdEZpbGVzL0RBMDI5LU5vRGF0YUZvckNlbGwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmFhOWZiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMDI5LU5vRGF0YUZvckNlbGwuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMzAtVG9vTXVjaERhdGFGb3JDZWxsLmRvY3ggYi9UZXN0RmlsZXMvREEwMzAtVG9vTXVjaERhdGFGb3JDZWxsLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhZTczZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTAzMC1Ub29NdWNoRGF0YUZvckNlbGwuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMzEtQ2VsbERhdGFJbkF0dHJpYnV0ZXMuZG9jeCBiL1Rlc3RGaWxlcy9EQTAzMS1DZWxsRGF0YUluQXR0cmlidXRlcy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjg4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEwMzEtQ2VsbERhdGFJbkF0dHJpYnV0ZXMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMzItVG9vTXVjaERhdGFGb3JDb25kaXRpb25hbC5kb2N4IGIvVGVzdEZpbGVzL0RBMDMyLVRvb011Y2hEYXRhRm9yQ29uZGl0aW9uYWwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGVlNmVjCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMDMyLVRvb011Y2hEYXRhRm9yQ29uZGl0aW9uYWwuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMzMtQ29uZGl0aW9uYWxPbkF0dHJpYnV0ZS5kb2N4IGIvVGVzdEZpbGVzL0RBMDMzLUNvbmRpdGlvbmFsT25BdHRyaWJ1dGUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDQ5ODJkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMDMzLUNvbmRpdGlvbmFsT25BdHRyaWJ1dGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMzQtSGVhZGVyRm9vdGVyLmRvY3ggYi9UZXN0RmlsZXMvREEwMzQtSGVhZGVyRm9vdGVyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmNjA0ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTAzNC1IZWFkZXJGb290ZXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMzUtU2NoZW1hRXJyb3JJblJlcGVhdC5kb2N4IGIvVGVzdEZpbGVzL0RBMDM1LVNjaGVtYUVycm9ySW5SZXBlYXQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODRmNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMDM1LVNjaGVtYUVycm9ySW5SZXBlYXQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEwMzYtU2NoZW1hRXJyb3JJbkNvbmRpdGlvbmFsLmRvY3ggYi9UZXN0RmlsZXMvREEwMzYtU2NoZW1hRXJyb3JJbkNvbmRpdGlvbmFsLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2NjM3NgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTAzNi1TY2hlbWFFcnJvckluQ29uZGl0aW9uYWwuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREExMDAtVGVtcGxhdGVEb2N1bWVudC5kb2N4IGIvVGVzdEZpbGVzL0RBMTAwLVRlbXBsYXRlRG9jdW1lbnQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzdkNDJiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMTAwLVRlbXBsYXRlRG9jdW1lbnQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREExMDEtVGVtcGxhdGVEb2N1bWVudC5kb2N4IGIvVGVzdEZpbGVzL0RBMTAxLVRlbXBsYXRlRG9jdW1lbnQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmQ4ODQxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMTAxLVRlbXBsYXRlRG9jdW1lbnQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREExMDItVGVtcGxhdGVEb2N1bWVudC5kb2N4IGIvVGVzdEZpbGVzL0RBMTAyLVRlbXBsYXRlRG9jdW1lbnQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDY4M2NlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMTAyLVRlbXBsYXRlRG9jdW1lbnQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMDEtVGVtcGxhdGVEb2N1bWVudC5kb2N4IGIvVGVzdEZpbGVzL0RBMjAxLVRlbXBsYXRlRG9jdW1lbnQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzdjZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjAxLVRlbXBsYXRlRG9jdW1lbnQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMDItVGVtcGxhdGVEb2N1bWVudC5kb2N4IGIvVGVzdEZpbGVzL0RBMjAyLVRlbXBsYXRlRG9jdW1lbnQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQ0ZTc4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjAyLVRlbXBsYXRlRG9jdW1lbnQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMDMtU2VsZWN0LVhQYXRoRmluZHNOb0RhdGEuZG9jeCBiL1Rlc3RGaWxlcy9EQTIwMy1TZWxlY3QtWFBhdGhGaW5kc05vRGF0YS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMjZhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyMDMtU2VsZWN0LVhQYXRoRmluZHNOb0RhdGEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMDQtU2VsZWN0LVhQYXRoRmluZHNOb0RhdGFPcHRpb25hbC5kb2N4IGIvVGVzdEZpbGVzL0RBMjA0LVNlbGVjdC1YUGF0aEZpbmRzTm9EYXRhT3B0aW9uYWwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDRhMGM2Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjA0LVNlbGVjdC1YUGF0aEZpbmRzTm9EYXRhT3B0aW9uYWwuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMDUtU2VsZWN0Um93RGF0YS1Ob0RhdGEuZG9jeCBiL1Rlc3RGaWxlcy9EQTIwNS1TZWxlY3RSb3dEYXRhLU5vRGF0YS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTQ5OTUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyMDUtU2VsZWN0Um93RGF0YS1Ob0RhdGEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMDYtU2VsZWN0VGVzdFZhbHVlLU5vRGF0YS5kb2N4IGIvVGVzdEZpbGVzL0RBMjA2LVNlbGVjdFRlc3RWYWx1ZS1Ob0RhdGEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTM3OWUzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjA2LVNlbGVjdFRlc3RWYWx1ZS1Ob0RhdGEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMDctU2VsZWN0UmVwZWF0aW5nRGF0YS1Ob0RhdGEuZG9jeCBiL1Rlc3RGaWxlcy9EQTIwNy1TZWxlY3RSZXBlYXRpbmdEYXRhLU5vRGF0YS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMzg0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyMDctU2VsZWN0UmVwZWF0aW5nRGF0YS1Ob0RhdGEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMDgtVGFibGVFbGVtZW50V2l0aE5vVGFibGUuZG9jeCBiL1Rlc3RGaWxlcy9EQTIwOC1UYWJsZUVsZW1lbnRXaXRoTm9UYWJsZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMGNjZTcKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyMDgtVGFibGVFbGVtZW50V2l0aE5vVGFibGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMDktSW52YWxpZFhQYXRoLmRvY3ggYi9UZXN0RmlsZXMvREEyMDktSW52YWxpZFhQYXRoLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwNjE0NwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTIwOS1JbnZhbGlkWFBhdGguZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMTAtSW52YWxpZFhtbC5kb2N4IGIvVGVzdEZpbGVzL0RBMjEwLUludmFsaWRYbWwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODE3ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjEwLUludmFsaWRYbWwuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMTEtU2NoZW1hRXJyb3IuZG9jeCBiL1Rlc3RGaWxlcy9EQTIxMS1TY2hlbWFFcnJvci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MDEyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyMTEtU2NoZW1hRXJyb3IuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMTItT3RoZXJNYXJrdXBUeXBlcy5kb2N4IGIvVGVzdEZpbGVzL0RBMjEyLU90aGVyTWFya3VwVHlwZXMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OThhMTVmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjEyLU90aGVyTWFya3VwVHlwZXMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMTMtUnVucy5kb2N4IGIvVGVzdEZpbGVzL0RBMjEzLVJ1bnMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDk0MGMwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjEzLVJ1bnMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMTQtVHdvUnVucy1Ob1ZhbHVlc1NlbGVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvREEyMTQtVHdvUnVucy1Ob1ZhbHVlc1NlbGVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyN2Q1YQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTIxNC1Ud29SdW5zLU5vVmFsdWVzU2VsZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMTUtVHdvUnVuc1htbEV4Y2VwdGlvbkluRmlyc3QuZG9jeCBiL1Rlc3RGaWxlcy9EQTIxNS1Ud29SdW5zWG1sRXhjZXB0aW9uSW5GaXJzdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyN2EyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyMTUtVHdvUnVuc1htbEV4Y2VwdGlvbkluRmlyc3QuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMTYtVHdvUnVuc1NjaGVtYUVycm9ySW5TZWNvbmQuZG9jeCBiL1Rlc3RGaWxlcy9EQTIxNi1Ud29SdW5zU2NoZW1hRXJyb3JJblNlY29uZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MmYwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyMTYtVHdvUnVuc1NjaGVtYUVycm9ySW5TZWNvbmQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMTctRml2ZVJ1bnMuZG9jeCBiL1Rlc3RGaWxlcy9EQTIxNy1GaXZlUnVucy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZjgwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyMTctRml2ZVJ1bnMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMTgtU21hcnRRdW90ZXMuZG9jeCBiL1Rlc3RGaWxlcy9EQTIxOC1TbWFydFF1b3Rlcy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYzE5MzkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyMTgtU21hcnRRdW90ZXMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMTktUnVuSXNFbnRpcmVQYXJhZ3JhcGguZG9jeCBiL1Rlc3RGaWxlcy9EQTIxOS1SdW5Jc0VudGlyZVBhcmFncmFwaC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZDBkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyMTktUnVuSXNFbnRpcmVQYXJhZ3JhcGguZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMjAtVHdvUnVuc0FuZE5vT3RoZXJDb250ZW50LmRvY3ggYi9UZXN0RmlsZXMvREEyMjAtVHdvUnVuc0FuZE5vT3RoZXJDb250ZW50LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4OWQwYQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTIyMC1Ud29SdW5zQW5kTm9PdGhlckNvbnRlbnQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMjEtTmVzdGVkUmVwZWF0LmRvY3ggYi9UZXN0RmlsZXMvREEyMjEtTmVzdGVkUmVwZWF0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhZDc2YwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTIyMS1OZXN0ZWRSZXBlYXQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMjItSW52YWxpZFhQYXRoLmRvY3ggYi9UZXN0RmlsZXMvREEyMjItSW52YWxpZFhQYXRoLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliYmE4YwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTIyMi1JbnZhbGlkWFBhdGguZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMjMtUmVwZWF0V09FbmRSZXBlYXQuZG9jeCBiL1Rlc3RGaWxlcy9EQTIyMy1SZXBlYXRXT0VuZFJlcGVhdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjQyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyMjMtUmVwZWF0V09FbmRSZXBlYXQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMjQtVHJhY2tlZFJldmlzaW9ucy5kb2N4IGIvVGVzdEZpbGVzL0RBMjI0LVRyYWNrZWRSZXZpc2lvbnMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDcwYWZhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjI0LVRyYWNrZWRSZXZpc2lvbnMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMjUtVGVtcGxhdGVEb2N1bWVudC5kb2N4IGIvVGVzdEZpbGVzL0RBMjI1LVRlbXBsYXRlRG9jdW1lbnQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzc2MDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjI1LVRlbXBsYXRlRG9jdW1lbnQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMjYtSW52YWxpZFJvb3RYbWxFbGVtZW50LmRvY3ggYi9UZXN0RmlsZXMvREEyMjYtSW52YWxpZFJvb3RYbWxFbGVtZW50LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwODU4NwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTIyNi1JbnZhbGlkUm9vdFhtbEVsZW1lbnQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMjctWFBhdGhFcnJvckluUGFyYS5kb2N4IGIvVGVzdEZpbGVzL0RBMjI3LVhQYXRoRXJyb3JJblBhcmEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZThkNTc0Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjI3LVhQYXRoRXJyb3JJblBhcmEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMjgtTm9Qcm90b3R5cGVSb3cuZG9jeCBiL1Rlc3RGaWxlcy9EQTIyOC1Ob1Byb3RvdHlwZVJvdy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMTE5MWMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyMjgtTm9Qcm90b3R5cGVSb3cuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMjktTm9EYXRhRm9yQ2VsbC5kb2N4IGIvVGVzdEZpbGVzL0RBMjI5LU5vRGF0YUZvckNlbGwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWY0OGJlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjI5LU5vRGF0YUZvckNlbGwuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMzAtVG9vTXVjaERhdGFGb3JDZWxsLmRvY3ggYi9UZXN0RmlsZXMvREEyMzAtVG9vTXVjaERhdGFGb3JDZWxsLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzNDYwZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTIzMC1Ub29NdWNoRGF0YUZvckNlbGwuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMzEtQ2VsbERhdGFJbkF0dHJpYnV0ZXMuZG9jeCBiL1Rlc3RGaWxlcy9EQTIzMS1DZWxsRGF0YUluQXR0cmlidXRlcy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZTFjMjIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyMzEtQ2VsbERhdGFJbkF0dHJpYnV0ZXMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMzItVG9vTXVjaERhdGFGb3JDb25kaXRpb25hbC5kb2N4IGIvVGVzdEZpbGVzL0RBMjMyLVRvb011Y2hEYXRhRm9yQ29uZGl0aW9uYWwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDMyYzMwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjMyLVRvb011Y2hEYXRhRm9yQ29uZGl0aW9uYWwuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMzMtQ29uZGl0aW9uYWxPbkF0dHJpYnV0ZS5kb2N4IGIvVGVzdEZpbGVzL0RBMjMzLUNvbmRpdGlvbmFsT25BdHRyaWJ1dGUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGE0ZGExCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjMzLUNvbmRpdGlvbmFsT25BdHRyaWJ1dGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMzQtSGVhZGVyRm9vdGVyLmRvY3ggYi9UZXN0RmlsZXMvREEyMzQtSGVhZGVyRm9vdGVyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1MTVhYwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTIzNC1IZWFkZXJGb290ZXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMzUtQ3Jhc2hlcy5kb2N4IGIvVGVzdEZpbGVzL0RBMjM1LUNyYXNoZXMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDljOWNkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjM1LUNyYXNoZXMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMzYtUGFnZS1OdW0taW4tRm9vdGVyLmRvY3ggYi9UZXN0RmlsZXMvREEyMzYtUGFnZS1OdW0taW4tRm9vdGVyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjZDBjYQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTIzNi1QYWdlLU51bS1pbi1Gb290ZXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMzctU2NoZW1hRXJyb3JJblJlcGVhdC5kb2N4IGIvVGVzdEZpbGVzL0RBMjM3LVNjaGVtYUVycm9ySW5SZXBlYXQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTNhNTI4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjM3LVNjaGVtYUVycm9ySW5SZXBlYXQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMzgtU2NoZW1hRXJyb3JJbkNvbmRpdGlvbmFsLmRvY3ggYi9UZXN0RmlsZXMvREEyMzgtU2NoZW1hRXJyb3JJbkNvbmRpdGlvbmFsLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyMTQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTIzOC1TY2hlbWFFcnJvckluQ29uZGl0aW9uYWwuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyMzktUnVuTGV2ZWxDQy1SZXBlYXQuZG9jeCBiL1Rlc3RGaWxlcy9EQTIzOS1SdW5MZXZlbENDLVJlcGVhdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZTZkODAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyMzktUnVuTGV2ZWxDQy1SZXBlYXQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNTAtQWRkcmVzcy54bWwgYi9UZXN0RmlsZXMvREEyNTAtQWRkcmVzcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmZjAxZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTI1MC1BZGRyZXNzLnhtbApAQCAtMCwwICsxLDEzIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPEN1c3RvbWVyPgorICAgIDxGdWxsTmFtZXM+TXIgRGF2aWQgSm9uZXMgJmFtcDsgTXJzIEphbmUgSm9uZXM8L0Z1bGxOYW1lcz4KKwk8T3JkZXJWYWx1ZT4yMzAwPC9PcmRlclZhbHVlPgorICAgIDxDb3JyZXNwb25kZW5jZUFkZHJlc3M+CisgICAgPEFkZHJlc3NPbmU+NDYgUGFyayBWaWV3PC9BZGRyZXNzT25lPgorICAgIDxBZGRyZXNzVHdvPkxlZWRzPC9BZGRyZXNzVHdvPgorICAgIDxBZGRyZXNzVGhyZWU+V2VzdCBZb3Jrc2hpcmU8L0FkZHJlc3NUaHJlZT4KKyAgICA8QWRkcmVzc0ZvdXIgLz4KKyAgICA8QWRkcmVzc0ZpdmUgLz4KKyAgICA8UG9zdENvZGU+TFMxIDRBUjwvUG9zdENvZGU+CisgIDwvQ29ycmVzcG9uZGVuY2VBZGRyZXNzPgorPC9DdXN0b21lcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNTAtQ29uZGl0aW9uYWxXaXRoUmljaFhQYXRoLmRvY3ggYi9UZXN0RmlsZXMvREEyNTAtQ29uZGl0aW9uYWxXaXRoUmljaFhQYXRoLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkYzY5YwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTI1MC1Db25kaXRpb25hbFdpdGhSaWNoWFBhdGguZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNTEtRW5oYW5jZWRUYWJsZXMuZG9jeCBiL1Rlc3RGaWxlcy9EQTI1MS1FbmhhbmNlZFRhYmxlcy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ODQ5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyNTEtRW5oYW5jZWRUYWJsZXMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNTItVGFibGUtV2l0aC1TdW0uZG9jeCBiL1Rlc3RGaWxlcy9EQTI1Mi1UYWJsZS1XaXRoLVN1bS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYWI1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyNTItVGFibGUtV2l0aC1TdW0uZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNTMtVGFibGUtV2l0aC1TdW0tUnVuLUxldmVsLUNDLmRvY3ggYi9UZXN0RmlsZXMvREEyNTMtVGFibGUtV2l0aC1TdW0tUnVuLUxldmVsLUNDLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2NDViYwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTI1My1UYWJsZS1XaXRoLVN1bS1SdW4tTGV2ZWwtQ0MuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNTQtVGFibGUtV2l0aC1YUGF0aC1TdW0uZG9jeCBiL1Rlc3RGaWxlcy9EQTI1NC1UYWJsZS1XaXRoLVhQYXRoLVN1bS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZDc3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyNTQtVGFibGUtV2l0aC1YUGF0aC1TdW0uZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNTUtVGFibGUtV2l0aC1YUGF0aC1TdW0tUnVuLUxldmVsLUNDLmRvY3ggYi9UZXN0RmlsZXMvREEyNTUtVGFibGUtV2l0aC1YUGF0aC1TdW0tUnVuLUxldmVsLUNDLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4M2ZhMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTI1NS1UYWJsZS1XaXRoLVhQYXRoLVN1bS1SdW4tTGV2ZWwtQ0MuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNTYtTm9JbnZhbGlkRG9jT25FcnJvckluUnVuLmRvY3ggYi9UZXN0RmlsZXMvREEyNTYtTm9JbnZhbGlkRG9jT25FcnJvckluUnVuLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRjNDBiZQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTI1Ni1Ob0ludmFsaWREb2NPbkVycm9ySW5SdW4uZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNTctT3B0aW9uYWxSZXBlYXQuZG9jeCBiL1Rlc3RGaWxlcy9EQTI1Ny1PcHRpb25hbFJlcGVhdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MmFhNGIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyNTctT3B0aW9uYWxSZXBlYXQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNTgtQ29udGVudEFjY2VwdHNDaGFyc0FzWFBhdGhSZXN1bHQuZG9jeCBiL1Rlc3RGaWxlcy9EQTI1OC1Db250ZW50QWNjZXB0c0NoYXJzQXNYUGF0aFJlc3VsdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMDVhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyNTgtQ29udGVudEFjY2VwdHNDaGFyc0FzWFBhdGhSZXN1bHQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNTktTXVsdGlMaW5lQ29udGVudHMuZG9jeCBiL1Rlc3RGaWxlcy9EQTI1OS1NdWx0aUxpbmVDb250ZW50cy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNjEwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyNTktTXVsdGlMaW5lQ29udGVudHMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNjAtUnVuTGV2ZWxSZXBlYXQuZG9jeCBiL1Rlc3RGaWxlcy9EQTI2MC1SdW5MZXZlbFJlcGVhdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZmZlNDgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREEyNjAtUnVuTGV2ZWxSZXBlYXQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNjEtUnVuTGV2ZWxDb25kaXRpb25hbC5kb2N4IGIvVGVzdEZpbGVzL0RBMjYxLVJ1bkxldmVsQ29uZGl0aW9uYWwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmYyY2RmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjYxLVJ1bkxldmVsQ29uZGl0aW9uYWwuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNjItQ29uZGl0aW9uYWxOb3RNYXRjaC5kb2N4IGIvVGVzdEZpbGVzL0RBMjYyLUNvbmRpdGlvbmFsTm90TWF0Y2guZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZkMmJlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjYyLUNvbmRpdGlvbmFsTm90TWF0Y2guZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNjMtQ29uZGl0aW9uYWxOb3RNYXRjaC5kb2N4IGIvVGVzdEZpbGVzL0RBMjYzLUNvbmRpdGlvbmFsTm90TWF0Y2guZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZkMmJlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjYzLUNvbmRpdGlvbmFsTm90TWF0Y2guZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNjQtSW52YWxpZFJ1bkxldmVsUmVwZWF0LmRvY3ggYi9UZXN0RmlsZXMvREEyNjQtSW52YWxpZFJ1bkxldmVsUmVwZWF0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2OTg5NAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTI2NC1JbnZhbGlkUnVuTGV2ZWxSZXBlYXQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNjUtUnVuTGV2ZWxSZXBlYXRXaXRoV2hpdGVTcGFjZUJlZm9yZS5kb2N4IGIvVGVzdEZpbGVzL0RBMjY1LVJ1bkxldmVsUmVwZWF0V2l0aFdoaXRlU3BhY2VCZWZvcmUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWMwMGYxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RBMjY1LVJ1bkxldmVsUmVwZWF0V2l0aFdoaXRlU3BhY2VCZWZvcmUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREEyNjYtUnVuTGV2ZWxSZXBlYXQtTm9EYXRhLmRvY3ggYi9UZXN0RmlsZXMvREEyNjYtUnVuTGV2ZWxSZXBlYXQtTm9EYXRhLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlNDNmNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQTI2Ni1SdW5MZXZlbFJlcGVhdC1Ob0RhdGEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgImEvVGVzdEZpbGVzL0RCL0hlYWRlcnNGb290ZXJzL0Rlc3QvRmF4IFwwNTBjb250ZW50IGNvbnRyb2xcMDUxLmRvY3giICJiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9EZXN0L0ZheCBcMDUwY29udGVudCBjb250cm9sXDA1MS5kb2N4IgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjEzODY4Ci0tLSAvZGV2L251bGwKKysrICJiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9EZXN0L0ZheCBcMDUwY29udGVudCBjb250cm9sXDA1MS5kb2N4IgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvRGVzdC9GYXguZG9jeCBiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9EZXN0L0ZheC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMjc0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvRGVzdC9GYXguZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgImEvVGVzdEZpbGVzL0RCL0hlYWRlcnNGb290ZXJzL0Rlc3QvTGV0dGVyIFwwNTBjb250ZW50IGNvbnRyb2xcMDUxLmRvY3giICJiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9EZXN0L0xldHRlciBcMDUwY29udGVudCBjb250cm9sXDA1MS5kb2N4IgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTExMWQwCi0tLSAvZGV2L251bGwKKysrICJiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9EZXN0L0xldHRlciBcMDUwY29udGVudCBjb250cm9sXDA1MS5kb2N4IgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgImEvVGVzdEZpbGVzL0RCL0hlYWRlcnNGb290ZXJzL0Rlc3QvTGV0dGVyIFwwNTBydW4tbGV2ZWwgaW5zZXJ0IGVsZW1lbnRcMDUxLmRvY3giICJiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9EZXN0L0xldHRlciBcMDUwcnVuLWxldmVsIGluc2VydCBlbGVtZW50XDA1MS5kb2N4IgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzFjZTc1Ci0tLSAvZGV2L251bGwKKysrICJiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9EZXN0L0xldHRlciBcMDUwcnVuLWxldmVsIGluc2VydCBlbGVtZW50XDA1MS5kb2N4IgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvRGVzdC9MZXR0ZXIuZG9jeCBiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9EZXN0L0xldHRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OTE2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvRGVzdC9MZXR0ZXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0NvbnRlbnQtQ29udHJvbHMuZG9jeCBiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9TcmMvQ29udGVudC1Db250cm9scy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ODE1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0NvbnRlbnQtQ29udHJvbHMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0Rpc2NsYWltZXIuZG9jeCBiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9TcmMvRGlzY2xhaW1lci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YWIzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0Rpc2NsYWltZXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0Zvb3Rlci5kb2N4IGIvVGVzdEZpbGVzL0RCL0hlYWRlcnNGb290ZXJzL1NyYy9Gb290ZXIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjQxZTExCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RCL0hlYWRlcnNGb290ZXJzL1NyYy9Gb290ZXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0xldHRlcmhlYWQtd2l0aC1XYXRlcm1hcmsuZG9jeCBiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9TcmMvTGV0dGVyaGVhZC13aXRoLVdhdGVybWFyay5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZGIzZGMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0xldHRlcmhlYWQtd2l0aC1XYXRlcm1hcmsuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0xldHRlcmhlYWQuZG9jeCBiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9TcmMvTGV0dGVyaGVhZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYTJjNGUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0xldHRlcmhlYWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0xvZ28uZG9jeCBiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9TcmMvTG9nby5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNzA0ODEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL0xvZ28uZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL1dhdGVybWFyay0xLmRvY3ggYi9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL1dhdGVybWFyay0xLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1MjVjYQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9TcmMvV2F0ZXJtYXJrLTEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL1dhdGVybWFyay0yLmRvY3ggYi9UZXN0RmlsZXMvREIvSGVhZGVyc0Zvb3RlcnMvU3JjL1dhdGVybWFyay0yLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhOTBhMAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQi9IZWFkZXJzRm9vdGVycy9TcmMvV2F0ZXJtYXJrLTIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMDEtU2VjdGlvbnMuZG9jeCBiL1Rlc3RGaWxlcy9EQjAwMS1TZWN0aW9ucy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YjRhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREIwMDEtU2VjdGlvbnMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMDItTGFuZHNjYXBlLVNlY3Rpb24uZG9jeCBiL1Rlc3RGaWxlcy9EQjAwMi1MYW5kc2NhcGUtU2VjdGlvbi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MTZjY2EKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREIwMDItTGFuZHNjYXBlLVNlY3Rpb24uZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMDItU2VjdGlvbnMtV2l0aC1IZWFkZXJzLmRvY3ggYi9UZXN0RmlsZXMvREIwMDItU2VjdGlvbnMtV2l0aC1IZWFkZXJzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1OTYzNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQjAwMi1TZWN0aW9ucy1XaXRoLUhlYWRlcnMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMDMtT25seS1EZWZhdWx0LUhlYWRlci5kb2N4IGIvVGVzdEZpbGVzL0RCMDAzLU9ubHktRGVmYXVsdC1IZWFkZXIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTRiYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RCMDAzLU9ubHktRGVmYXVsdC1IZWFkZXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMDQtTm8tSGVhZGVycy5kb2N4IGIvVGVzdEZpbGVzL0RCMDA0LU5vLUhlYWRlcnMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWRiZWRhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RCMDA0LU5vLUhlYWRlcnMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMDUtSGVhZGVycy1XaXRoLUltYWdlcy5kb2N4IGIvVGVzdEZpbGVzL0RCMDA1LUhlYWRlcnMtV2l0aC1JbWFnZXMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmMyMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RCMDA1LUhlYWRlcnMtV2l0aC1JbWFnZXMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMDYtU291cmNlMS5kb2N4IGIvVGVzdEZpbGVzL0RCMDA2LVNvdXJjZTEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTIwNmI1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RCMDA2LVNvdXJjZTEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMDYtU291cmNlMi5kb2N4IGIvVGVzdEZpbGVzL0RCMDA2LVNvdXJjZTIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTc2ZmUwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RCMDA2LVNvdXJjZTIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMDYtU291cmNlMy5kb2N4IGIvVGVzdEZpbGVzL0RCMDA2LVNvdXJjZTMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDExNDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RCMDA2LVNvdXJjZTMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMDctQWJzdHJhY3QuZG9jeCBiL1Rlc3RGaWxlcy9EQjAwNy1BYnN0cmFjdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZGJmMWEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREIwMDctQWJzdHJhY3QuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMDctQXV0aG9yQmlvZ3JhcGh5LmRvY3ggYi9UZXN0RmlsZXMvREIwMDctQXV0aG9yQmlvZ3JhcGh5LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiNGFhNQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQjAwNy1BdXRob3JCaW9ncmFwaHkuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMDctTm90ZXMuZG9jeCBiL1Rlc3RGaWxlcy9EQjAwNy1Ob3Rlcy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNWY3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREIwMDctTm90ZXMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMDctU3BlYy5kb2N4IGIvVGVzdEZpbGVzL0RCMDA3LVNwZWMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQwOTYwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RCMDA3LVNwZWMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMDctV2hpdGVQYXBlci5kb2N4IGIvVGVzdEZpbGVzL0RCMDA3LVdoaXRlUGFwZXIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWRiYWFhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RCMDA3LVdoaXRlUGFwZXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMTAtRnJvbnRNYXR0ZXIuZG9jeCBiL1Rlc3RGaWxlcy9EQjAxMC1Gcm9udE1hdHRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNTViY2EKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREIwMTAtRnJvbnRNYXR0ZXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMTAtSW5zZXJ0LTAxLmRvY3ggYi9UZXN0RmlsZXMvREIwMTAtSW5zZXJ0LTAxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5NDgzNwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQjAxMC1JbnNlcnQtMDEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMTAtSW5zZXJ0LTAyLmRvY3ggYi9UZXN0RmlsZXMvREIwMTAtSW5zZXJ0LTAyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2NDZmYgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQjAxMC1JbnNlcnQtMDIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMTAtVGVtcGxhdGUuZG9jeCBiL1Rlc3RGaWxlcy9EQjAxMC1UZW1wbGF0ZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNWQwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREIwMTAtVGVtcGxhdGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMTEtQm9keS1XaXRoLVNoYXBlLmRvY3ggYi9UZXN0RmlsZXMvREIwMTEtQm9keS1XaXRoLVNoYXBlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyODM3MAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQjAxMS1Cb2R5LVdpdGgtU2hhcGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMTEtSGVhZGVyLVdpdGgtU2hhcGUuZG9jeCBiL1Rlc3RGaWxlcy9EQjAxMS1IZWFkZXItV2l0aC1TaGFwZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViN2FhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvREIwMTEtSGVhZGVyLVdpdGgtU2hhcGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMTItTGlzdHMtV2l0aC1EaWZmZXJlbnQtTnVtYmVyaW5ncy5kb2N4IGIvVGVzdEZpbGVzL0RCMDEyLUxpc3RzLVdpdGgtRGlmZmVyZW50LU51bWJlcmluZ3MuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWM3NzRhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RCMDEyLUxpc3RzLVdpdGgtRGlmZmVyZW50LU51bWJlcmluZ3MuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMTNhLUdyZWVuLUhlYWRpbmcxLURhbmlzaC5kb2N4IGIvVGVzdEZpbGVzL0RCMDEzYS1HcmVlbi1IZWFkaW5nMS1EYW5pc2guZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODAwODRjCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RCMDEzYS1HcmVlbi1IZWFkaW5nMS1EYW5pc2guZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMTNhLVJlZC1IZWFkaW5nMS1FbmdsaXNoLmRvY3ggYi9UZXN0RmlsZXMvREIwMTNhLVJlZC1IZWFkaW5nMS1FbmdsaXNoLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1MjZkNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQjAxM2EtUmVkLUhlYWRpbmcxLUVuZ2xpc2guZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMTNiLUJsdWUtTGlzdC1FbmdsaXNoLmRvY3ggYi9UZXN0RmlsZXMvREIwMTNiLUJsdWUtTGlzdC1FbmdsaXNoLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0NDc5MwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9EQjAxM2ItQmx1ZS1MaXN0LUVuZ2xpc2guZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMTNiLU9yYW5nZS1MaXN0LURhbmlzaC5kb2N4IGIvVGVzdEZpbGVzL0RCMDEzYi1PcmFuZ2UtTGlzdC1EYW5pc2guZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2Y4NDYwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RCMDEzYi1PcmFuZ2UtTGlzdC1EYW5pc2guZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvREIwMTQtV2ViRXh0ZW5zaW9ucy5kb2N4IGIvVGVzdEZpbGVzL0RCMDE0LVdlYkV4dGVuc2lvbnMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjVjNzYyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0RCMDE0LVdlYkV4dGVuc2lvbnMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvRTAwMTAuaHRtbCBiL1Rlc3RGaWxlcy9FMDAxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNGRhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvRTAwMTAuaHRtbApAQCAtMCwwICsxLDQwIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2gxIGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2E7IH0KK2gxIGVtIHsgY29sb3I6IHJlZDsgfQorb2wgeyBmb250LXNpemU6IHNtYWxsZXI7IH0KK3VsIHsgZm9udC1zaXplOiBsYXJnZXI7IH0KKy5menogeyBmb250LXNpemU6IDFleDsgfQorLmZ6ejIgeyBmb250LXNpemU6IDEyMCU7IH0KKy5menozIHsgZm9udC1zaXplOiAuNWluOyB9CisuZnp6NCB7IGZvbnQtc2l6ZTogMi41NGNtOyB9CisuZnp6NSB7IGZvbnQtc2l6ZTogMjU0bW07IH0KKy5meno2IHsgZm9udC1zaXplOiAxcGM7IH0KKy5meno3IHsgZm9udC1zaXplOiAxMDBweDsgfQorLmJhciB7IHRleHQtaW5kZW50OiAyZW07IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCA8ZW0+SGVhZDwvZW0+aW5nPC9oMT4KKyAgICA8cD5meno8L3A+CisgICAgPGgyPkh0bWwgSGVhZGluZzwvaDI+CisgICAgPHA+Znp6PC9wPgorICAgIDxvbD4KKyAgICAgIDxsaT5vbmU8L2xpPgorICAgICAgPGxpPnR3bzwvbGk+CisgICAgPC9vbD4KKyAgICA8dWw+CisgICAgICA8bGk+b25lPC9saT4KKyAgICAgIDxsaT50d288L2xpPgorICAgIDwvdWw+CisgICAgPHAgY2xhc3M9J2Z6eic+YmFyMTwvcD4KKyAgICA8cCBjbGFzcz0nZnp6Mic+YmFyMjwvcD4KKyAgICA8cCBjbGFzcz0nZnp6Myc+YmFyMzwvcD4KKyAgICA8cCBjbGFzcz0nZnp6NCc+YmFyNDwvcD4KKyAgICA8cCBjbGFzcz0nZnp6NSc+YmFyNTwvcD4KKyAgICA8cCBjbGFzcz0nZnp6Nic+YmFyNjwvcD4KKyAgICA8cCBjbGFzcz0nZnp6Nyc+YmFyNzwvcD4KKyAgICA8cCBjbGFzcz0nYmFyJz5iYXI4PC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9FMDAyMC5odG1sIGIvVGVzdEZpbGVzL0UwMDIwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkYzg0MgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9FMDAyMC5odG1sCkBAIC0wLDAgKzEsNDAgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoraDEgeyBmb250LWZhbWlseTogSGVsdmV0aWNhOyB9CitoMSBlbSB7IGNvbG9yOiByZWQ7IH0KK29sIHsgZm9udC1zaXplOiBzbWFsbGVyOyB9Cit1bCBmb250LXNpemU6IGxhcmdlcjsgfQorLmZ6eiB7IGZvbnQtc2l6ZTogMWV4OyB9CisuZnp6MiB7IGZvbnQtc2l6ZTogMTIwJTsgfQorLmZ6ejMgeyBmb250LXNpemU6IC41aW47IH0KKy5meno0IHsgZm9udC1zaXplOiAyLjU0Y207IH0KKy5meno1IHsgZm9udC1zaXplOiAyNTRtbTsgfQorLmZ6ejYgeyBmb250LXNpemU6IDFwYzsgfQorLmZ6ejcgeyBmb250LXNpemU6IDEwMHB4OyB9CisuYmFyIHsgdGV4dC1pbmRlbnQ6IDJlbTsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIDxlbT5IZWFkPC9lbT5pbmc8L2gxPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cD5meno8L3A+CisgICAgPG9sPgorICAgICAgPGxpPm9uZTwvbGk+CisgICAgICA8bGk+dHdvPC9saT4KKyAgICA8L29sPgorICAgIDx1bD4KKyAgICAgIDxsaT5vbmU8L2xpPgorICAgICAgPGxpPnR3bzwvbGk+CisgICAgPC91bD4KKyAgICA8cCBjbGFzcz0nZnp6Jz5iYXIxPC9wPgorICAgIDxwIGNsYXNzPSdmenoyJz5iYXIyPC9wPgorICAgIDxwIGNsYXNzPSdmenozJz5iYXIzPC9wPgorICAgIDxwIGNsYXNzPSdmeno0Jz5iYXI0PC9wPgorICAgIDxwIGNsYXNzPSdmeno1Jz5iYXI1PC9wPgorICAgIDxwIGNsYXNzPSdmeno2Jz5iYXI2PC9wPgorICAgIDxwIGNsYXNzPSdmeno3Jz5iYXI3PC9wPgorICAgIDxwIGNsYXNzPSdiYXInPmJhcjg8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDAxLTVEYXlUb3VyUGxhblRlbXBsYXRlLmRvY3ggYi9UZXN0RmlsZXMvSEMwMDEtNURheVRvdXJQbGFuVGVtcGxhdGUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzI1NGVlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDAxLTVEYXlUb3VyUGxhblRlbXBsYXRlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDAyLUhlYnJldy0wMS5kb2N4IGIvVGVzdEZpbGVzL0hDMDAyLUhlYnJldy0wMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZWUzM2YKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSEMwMDItSGVicmV3LTAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDAzLUhlYnJldy0wMi5kb2N4IGIvVGVzdEZpbGVzL0hDMDAzLUhlYnJldy0wMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiODBkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSEMwMDMtSGVicmV3LTAyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDA0LVJlc3VtZVRlbXBsYXRlLmRvY3ggYi9UZXN0RmlsZXMvSEMwMDQtUmVzdW1lVGVtcGxhdGUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWU1MGZlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDA0LVJlc3VtZVRlbXBsYXRlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDA1LVRhc2tQbGFuVGVtcGxhdGUuZG9jeCBiL1Rlc3RGaWxlcy9IQzAwNS1UYXNrUGxhblRlbXBsYXRlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5MzJmNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAwNS1UYXNrUGxhblRlbXBsYXRlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDA2LVRlc3QtMDEuZG9jeCBiL1Rlc3RGaWxlcy9IQzAwNi1UZXN0LTAxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4ZjBjOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAwNi1UZXN0LTAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDA3LVRlc3QtMDIuZG9jeCBiL1Rlc3RGaWxlcy9IQzAwNy1UZXN0LTAyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2MjhjYQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAwNy1UZXN0LTAyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDA4LVRlc3QtMDMuZG9jeCBiL1Rlc3RGaWxlcy9IQzAwOC1UZXN0LTAzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc2YzhjYgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAwOC1UZXN0LTAzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDA5LVRlc3QtMDQuZG9jeCBiL1Rlc3RGaWxlcy9IQzAwOS1UZXN0LTA0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3ZDY5NAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAwOS1UZXN0LTA0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDEwLVRlc3QtMDUuZG9jeCBiL1Rlc3RGaWxlcy9IQzAxMC1UZXN0LTA1LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmNjI4NAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAxMC1UZXN0LTA1LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDExLVRlc3QtMDYuZG9jeCBiL1Rlc3RGaWxlcy9IQzAxMS1UZXN0LTA2LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ1NjYwMgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAxMS1UZXN0LTA2LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDEyLVRlc3QtMDcuZG9jeCBiL1Rlc3RGaWxlcy9IQzAxMi1UZXN0LTA3LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3MTA2MQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAxMi1UZXN0LTA3LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDEzLVRlc3QtMDguZG9jeCBiL1Rlc3RGaWxlcy9IQzAxMy1UZXN0LTA4LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyMWFiZQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAxMy1UZXN0LTA4LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDE0LVJUTC1UYWJsZS0wMS5kb2N4IGIvVGVzdEZpbGVzL0hDMDE0LVJUTC1UYWJsZS0wMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MDBlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSEMwMTQtUlRMLVRhYmxlLTAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDE1LVZlcnRpY2FsLVNwYWNpbmctYXRMZWFzdC5kb2N4IGIvVGVzdEZpbGVzL0hDMDE1LVZlcnRpY2FsLVNwYWNpbmctYXRMZWFzdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMmZiNjAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSEMwMTUtVmVydGljYWwtU3BhY2luZy1hdExlYXN0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDE2LUhvcml6b250YWwtU3BhY2luZy1maXJzdExpbmUuZG9jeCBiL1Rlc3RGaWxlcy9IQzAxNi1Ib3Jpem9udGFsLVNwYWNpbmctZmlyc3RMaW5lLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkM2YxMgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAxNi1Ib3Jpem9udGFsLVNwYWNpbmctZmlyc3RMaW5lLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDE3LVZlcnRpY2FsLUFsaWdubWVudC1DZWxsLTAxLmRvY3ggYi9UZXN0RmlsZXMvSEMwMTctVmVydGljYWwtQWxpZ25tZW50LUNlbGwtMDEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDg5ODhjCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDE3LVZlcnRpY2FsLUFsaWdubWVudC1DZWxsLTAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDE4LVZlcnRpY2FsLUFsaWdubWVudC1QYXJhLTAxLmRvY3ggYi9UZXN0RmlsZXMvSEMwMTgtVmVydGljYWwtQWxpZ25tZW50LVBhcmEtMDEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTU2ODlhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDE4LVZlcnRpY2FsLUFsaWdubWVudC1QYXJhLTAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDE5LUhpZGRlbi1SdW4uZG9jeCBiL1Rlc3RGaWxlcy9IQzAxOS1IaWRkZW4tUnVuLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwMzQxNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAxOS1IaWRkZW4tUnVuLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDIwLVNtYWxsLUNhcHMuZG9jeCBiL1Rlc3RGaWxlcy9IQzAyMC1TbWFsbC1DYXBzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2ZTk2NQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAyMC1TbWFsbC1DYXBzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDIxLVN5bWJvbHMuZG9jeCBiL1Rlc3RGaWxlcy9IQzAyMS1TeW1ib2xzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3ZGZhMgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAyMS1TeW1ib2xzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDIyLVRhYmxlLU9mLUNvbnRlbnRzLmRvY3ggYi9UZXN0RmlsZXMvSEMwMjItVGFibGUtT2YtQ29udGVudHMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzU5MGY1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDIyLVRhYmxlLU9mLUNvbnRlbnRzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDIzLUh5cGVybGluay5kb2N4IGIvVGVzdEZpbGVzL0hDMDIzLUh5cGVybGluay5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMmIyNDQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSEMwMjMtSHlwZXJsaW5rLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDI0LVRhYnMtMDEuZG9jeCBiL1Rlc3RGaWxlcy9IQzAyNC1UYWJzLTAxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2ZDA1MgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAyNC1UYWJzLTAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDI1LVRhYnMtMDIuZG9jeCBiL1Rlc3RGaWxlcy9IQzAyNS1UYWJzLTAyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc3NzI3NgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAyNS1UYWJzLTAyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDI2LVRhYnMtMDMuZG9jeCBiL1Rlc3RGaWxlcy9IQzAyNi1UYWJzLTAzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1MWY3NQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAyNi1UYWJzLTAzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDI3LVRhYnMtMDQuZG9jeCBiL1Rlc3RGaWxlcy9IQzAyNy1UYWJzLTA0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4NzA4OQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAyNy1UYWJzLTA0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDI4LU5vLUJyZWFrLUh5cGhlbi5kb2N4IGIvVGVzdEZpbGVzL0hDMDI4LU5vLUJyZWFrLUh5cGhlbi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODlkMDcKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSEMwMjgtTm8tQnJlYWstSHlwaGVuLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDI5LVRhYmxlLU1lcmdlZC1DZWxscy5kb2N4IGIvVGVzdEZpbGVzL0hDMDI5LVRhYmxlLU1lcmdlZC1DZWxscy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzODJhN2QKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSEMwMjktVGFibGUtTWVyZ2VkLUNlbGxzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDMwLUNvbnRlbnQtQ29udHJvbHMuZG9jeCBiL1Rlc3RGaWxlcy9IQzAzMC1Db250ZW50LUNvbnRyb2xzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2YWEzMAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAzMC1Db250ZW50LUNvbnRyb2xzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDMxLUNvbXBsaWNhdGVkLURvY3VtZW50LmRvY3ggYi9UZXN0RmlsZXMvSEMwMzEtQ29tcGxpY2F0ZWQtRG9jdW1lbnQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRiYTAyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDMxLUNvbXBsaWNhdGVkLURvY3VtZW50LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDMyLU5hbWVkLUNvbG9yLmRvY3ggYi9UZXN0RmlsZXMvSEMwMzItTmFtZWQtQ29sb3IuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2E0NTc5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDMyLU5hbWVkLUNvbG9yLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDMzLVJ1bi1XaXRoLUJvcmRlci5kb2N4IGIvVGVzdEZpbGVzL0hDMDMzLVJ1bi1XaXRoLUJvcmRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNWMyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSEMwMzMtUnVuLVdpdGgtQm9yZGVyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDM0LVJ1bi1XaXRoLVBvc2l0aW9uLmRvY3ggYi9UZXN0RmlsZXMvSEMwMzQtUnVuLVdpdGgtUG9zaXRpb24uZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2I2ZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDM0LVJ1bi1XaXRoLVBvc2l0aW9uLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDM1LVN0cmlrZS1UaHJvdWdoLmRvY3ggYi9UZXN0RmlsZXMvSEMwMzUtU3RyaWtlLVRocm91Z2guZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODdmNDhiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDM1LVN0cmlrZS1UaHJvdWdoLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDM2LVN1cGVyLVNjcmlwdC5kb2N4IGIvVGVzdEZpbGVzL0hDMDM2LVN1cGVyLVNjcmlwdC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMzE0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSEMwMzYtU3VwZXItU2NyaXB0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDM3LVN1Yi1TY3JpcHQuZG9jeCBiL1Rlc3RGaWxlcy9IQzAzNy1TdWItU2NyaXB0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3OWE4OQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAzNy1TdWItU2NyaXB0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDM4LUNvbmZsaWN0aW5nLUJvcmRlci1XZWlnaHQuZG9jeCBiL1Rlc3RGaWxlcy9IQzAzOC1Db25mbGljdGluZy1Cb3JkZXItV2VpZ2h0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1NmYxNQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAzOC1Db25mbGljdGluZy1Cb3JkZXItV2VpZ2h0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDM5LUJvbGQuZG9jeCBiL1Rlc3RGaWxlcy9IQzAzOS1Cb2xkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzZTFjYgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzAzOS1Cb2xkLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDQwLUh5cGVybGluay1GaWVsZGNvZGUtMDEuZG9jeCBiL1Rlc3RGaWxlcy9IQzA0MC1IeXBlcmxpbmstRmllbGRjb2RlLTAxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxYTE1ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzA0MC1IeXBlcmxpbmstRmllbGRjb2RlLTAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDQxLUh5cGVybGluay1GaWVsZGNvZGUtMDIuZG9jeCBiL1Rlc3RGaWxlcy9IQzA0MS1IeXBlcmxpbmstRmllbGRjb2RlLTAyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0NzczMAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzA0MS1IeXBlcmxpbmstRmllbGRjb2RlLTAyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDQyLUltYWdlLVBuZy5kb2N4IGIvVGVzdEZpbGVzL0hDMDQyLUltYWdlLVBuZy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZTUyY2MKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSEMwNDItSW1hZ2UtUG5nLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDQzLUNoYXJ0LmRvY3ggYi9UZXN0RmlsZXMvSEMwNDMtQ2hhcnQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTIyMWM3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDQzLUNoYXJ0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDQ0LUVtYmVkZGVkLVdvcmtib29rLmRvY3ggYi9UZXN0RmlsZXMvSEMwNDQtRW1iZWRkZWQtV29ya2Jvb2suZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDVlOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDQ0LUVtYmVkZGVkLVdvcmtib29rLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDQ1LUl0YWxpYy5kb2N4IGIvVGVzdEZpbGVzL0hDMDQ1LUl0YWxpYy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NGJlNGEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSEMwNDUtSXRhbGljLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDQ2LUJvbGRBbmRJdGFsaWMuZG9jeCBiL1Rlc3RGaWxlcy9IQzA0Ni1Cb2xkQW5kSXRhbGljLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkMDE2ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzA0Ni1Cb2xkQW5kSXRhbGljLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDQ3LU5vLVNlY3Rpb24uZG9jeCBiL1Rlc3RGaWxlcy9IQzA0Ny1Oby1TZWN0aW9uLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5ZWRiNQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzA0Ny1Oby1TZWN0aW9uLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDQ4LUV4Y2VycHQuZG9jeCBiL1Rlc3RGaWxlcy9IQzA0OC1FeGNlcnB0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2NjYyMgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzA0OC1FeGNlcnB0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDQ5LUJvcmRlcnMuZG9jeCBiL1Rlc3RGaWxlcy9IQzA0OS1Cb3JkZXJzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwM2ViNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IQzA0OS1Cb3JkZXJzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDUwLVNoYWRlZC1UZXh0LTAxLmRvY3ggYi9UZXN0RmlsZXMvSEMwNTAtU2hhZGVkLVRleHQtMDEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTA0YzA2Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDUwLVNoYWRlZC1UZXh0LTAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDUxLVNoYWRlZC1UZXh0LTAyLmRvY3ggYi9UZXN0RmlsZXMvSEMwNTEtU2hhZGVkLVRleHQtMDIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzcxYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDUxLVNoYWRlZC1UZXh0LTAyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDUyLVNtYXJ0QXJ0LmRvY3ggYi9UZXN0RmlsZXMvSEMwNTItU21hcnRBcnQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTU5OWRkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDUyLVNtYXJ0QXJ0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDYwLUltYWdlLXdpdGgtSHlwZXJsaW5rLmRvY3ggYi9UZXN0RmlsZXMvSEMwNjAtSW1hZ2Utd2l0aC1IeXBlcmxpbmsuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA4NmEwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hDMDYwLUltYWdlLXdpdGgtSHlwZXJsaW5rLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hDMDYxLUh5cGVybGluay1pbi1GaWVsZC5kb2N4IGIvVGVzdEZpbGVzL0hDMDYxLUh5cGVybGluay1pbi1GaWVsZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MTI2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSEMwNjEtSHlwZXJsaW5rLWluLUZpZWxkLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMDEuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTAxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2OTliMgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMDIuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTAyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1YmE0NQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTAyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMDMuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTAzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwNGRlNQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTAzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMDQuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTA0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkOGRiNQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTA0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMDUuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTA1LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxODljMwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTA1LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMDYuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTA2LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwOGFiZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTA2LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMDcuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTA3LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2NWYzMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTA3LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMDguZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTA4LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjYjA3YwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTA4LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMDkuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTA5LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIzMmQwZQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTA5LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMTAuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTEwLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1ZjIwNQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTEwLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMTEuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTExLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhMTM0MAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTExLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMTIuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTEyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4OWE3OAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTEyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMTMuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTEzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyYzk5NAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTEzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMTQuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTE0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2MzhhMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTE0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMTUuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTE1LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4YjBhZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTE1LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMTYuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTE2LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxYjhjZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTE2LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMTcuZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTE3LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkODhkYQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTE3LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDAyLVRhYmxlMTguZG9jeCBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTE4LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4MzQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAwMi1UYWJsZTE4LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDEwLVNwYW5XaXRoU2luZ2xlU3BhY2UuZG9jeCBiL1Rlc3RGaWxlcy9IVzAxMC1TcGFuV2l0aFNpbmdsZVNwYWNlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ0MmYzNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9IVzAxMC1TcGFuV2l0aFNpbmdsZVNwYWNlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDEwLVN5bWJvbHMwMS5kb2N4IGIvVGVzdEZpbGVzL0hXMDEwLVN5bWJvbHMwMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZWQ0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSFcwMTAtU3ltYm9sczAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDEwLVN5bWJvbHMwMi5kb2N4IGIvVGVzdEZpbGVzL0hXMDEwLVN5bWJvbHMwMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOWYyNjkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSFcwMTAtU3ltYm9sczAyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDEwLVRhYjAxLmRvY3ggYi9UZXN0RmlsZXMvSFcwMTAtVGFiMDEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2MwOWNkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hXMDEwLVRhYjAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDEwLVRhYmxlV2l0aEVtcHR5Um93cy5kb2N4IGIvVGVzdEZpbGVzL0hXMDEwLVRhYmxlV2l0aEVtcHR5Um93cy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjI4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvSFcwMTAtVGFibGVXaXRoRW1wdHlSb3dzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDEwLVRhYmxlV2l0aEltYWdlLmRvY3ggYi9UZXN0RmlsZXMvSFcwMTAtVGFibGVXaXRoSW1hZ2UuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzZjOGNiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hXMDEwLVRhYmxlV2l0aEltYWdlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0hXMDEwLVRhYmxlV2l0aFRocmVlRW1wdHlSb3dzLmRvY3ggYi9UZXN0RmlsZXMvSFcwMTAtVGFibGVXaXRoVGhyZWVFbXB0eVJvd3MuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmM2NDRiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0hXMDEwLVRhYmxlV2l0aFRocmVlRW1wdHlSb3dzLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAwMS1lbi1VUy1vcmRpbmFsLmRvY3ggYi9UZXN0RmlsZXMvTElSMDAxLWVuLVVTLW9yZGluYWwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjMxMTRkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0xJUjAwMS1lbi1VUy1vcmRpbmFsLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAwMi1lbi1VUy1vcmRpbmFsVGV4dC5kb2N4IGIvVGVzdEZpbGVzL0xJUjAwMi1lbi1VUy1vcmRpbmFsVGV4dC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OWRjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvTElSMDAyLWVuLVVTLW9yZGluYWxUZXh0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAwMy1lbi1VUy11cHBlckxldHRlci5kb2N4IGIvVGVzdEZpbGVzL0xJUjAwMy1lbi1VUy11cHBlckxldHRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NzJmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvTElSMDAzLWVuLVVTLXVwcGVyTGV0dGVyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAwNC1lbi1VUy11cHBlclJvbWFuLmRvY3ggYi9UZXN0RmlsZXMvTElSMDA0LWVuLVVTLXVwcGVyUm9tYW4uZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDdhNTllCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0xJUjAwNC1lbi1VUy11cHBlclJvbWFuLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAwNS1mci1GUi1jYXJkaW5hbFRleHQuZG9jeCBiL1Rlc3RGaWxlcy9MSVIwMDUtZnItRlItY2FyZGluYWxUZXh0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1YjE1NAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9MSVIwMDUtZnItRlItY2FyZGluYWxUZXh0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAwNi1mci1GUi1vcmRpbmFsLmRvY3ggYi9UZXN0RmlsZXMvTElSMDA2LWZyLUZSLW9yZGluYWwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzMwNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0xJUjAwNi1mci1GUi1vcmRpbmFsLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAwNi1mci1GUi1vcmRpbmFsVGV4dC5kb2N4IGIvVGVzdEZpbGVzL0xJUjAwNi1mci1GUi1vcmRpbmFsVGV4dC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWZlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvTElSMDA2LWZyLUZSLW9yZGluYWxUZXh0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAwNy1ydS1SVS1vcmRpbmFsVGV4dC5kb2N4IGIvVGVzdEZpbGVzL0xJUjAwNy1ydS1SVS1vcmRpbmFsVGV4dC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMmI1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvTElSMDA3LXJ1LVJVLW9yZGluYWxUZXh0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAwOC16aC1DSC1jaGluZXNlQ291bnRpbmdUaG91c2FuZC5kb2N4IGIvVGVzdEZpbGVzL0xJUjAwOC16aC1DSC1jaGluZXNlQ291bnRpbmdUaG91c2FuZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNWE3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvTElSMDA4LXpoLUNILWNoaW5lc2VDb3VudGluZ1Rob3VzYW5kLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAwOS16aC1DTi1jaGluZXNlQ291bnRpbmcuZG9jeCBiL1Rlc3RGaWxlcy9MSVIwMDktemgtQ04tY2hpbmVzZUNvdW50aW5nLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljNTJhMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9MSVIwMDktemgtQ04tY2hpbmVzZUNvdW50aW5nLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAxMC16aC1DTi1pZGVvZ3JhcGhUcmFkaXRpb25hbC5kb2N4IGIvVGVzdEZpbGVzL0xJUjAxMC16aC1DTi1pZGVvZ3JhcGhUcmFkaXRpb25hbC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZWMxOGYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvTElSMDEwLXpoLUNOLWlkZW9ncmFwaFRyYWRpdGlvbmFsLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAxMS1lbi1VUy0wMDAwMS5kb2N4IGIvVGVzdEZpbGVzL0xJUjAxMS1lbi1VUy0wMDAwMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODdkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvTElSMDExLWVuLVVTLTAwMDAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAxMi1lbi1VUy0wMDAxLmRvY3ggYi9UZXN0RmlsZXMvTElSMDEyLWVuLVVTLTAwMDEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzE3YTZhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0xJUjAxMi1lbi1VUy0wMDAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAxMy1lbi1VUy0wMDEuZG9jeCBiL1Rlc3RGaWxlcy9MSVIwMTMtZW4tVVMtMDAxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyNDJlMgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9MSVIwMTMtZW4tVVMtMDAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAxNC1lbi1VUy0wMS5kb2N4IGIvVGVzdEZpbGVzL0xJUjAxNC1lbi1VUy0wMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NDM5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvTElSMDE0LWVuLVVTLTAxLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAxNS1lbi1VUy1jYXJkaW5hbFRleHQuZG9jeCBiL1Rlc3RGaWxlcy9MSVIwMTUtZW4tVVMtY2FyZGluYWxUZXh0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlMjlkOAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9MSVIwMTUtZW4tVVMtY2FyZGluYWxUZXh0LmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAxNi1lbi1VUy1kZWNpbWFsLmRvY3ggYi9UZXN0RmlsZXMvTElSMDE2LWVuLVVTLWRlY2ltYWwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTg1NGJlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0xJUjAxNi1lbi1VUy1kZWNpbWFsLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAxNy1lbi1VUy1kZWNpbWFsRW5jbG9zZWRDaXJjbGUuZG9jeCBiL1Rlc3RGaWxlcy9MSVIwMTctZW4tVVMtZGVjaW1hbEVuY2xvc2VkQ2lyY2xlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2YjI2NQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9MSVIwMTctZW4tVVMtZGVjaW1hbEVuY2xvc2VkQ2lyY2xlLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAxOC1lbi1VUy1kZWNpbWFsWmVyby5kb2N4IGIvVGVzdEZpbGVzL0xJUjAxOC1lbi1VUy1kZWNpbWFsWmVyby5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZThlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvTElSMDE4LWVuLVVTLWRlY2ltYWxaZXJvLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAxOS1lbi1VUy1sb3dlckxldHRlci5kb2N4IGIvVGVzdEZpbGVzL0xJUjAxOS1lbi1VUy1sb3dlckxldHRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZmVkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvTElSMDE5LWVuLVVTLWxvd2VyTGV0dGVyLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL0xJUjAyMC1lbi1VUy1sb3dlclJvbWFuLmRvY3ggYi9UZXN0RmlsZXMvTElSMDIwLWVuLVVTLWxvd2VyUm9tYW4uZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzhmMTdmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL0xJUjAyMC1lbi1VUy1sb3dlclJvbWFuLmRvY3gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1BCMDAxLUlucHV0MS5wcHR4IGIvVGVzdEZpbGVzL1BCMDAxLUlucHV0MS5wcHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMDNmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUEIwMDEtSW5wdXQxLnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1BCMDAxLUlucHV0Mi5wcHR4IGIvVGVzdEZpbGVzL1BCMDAxLUlucHV0Mi5wcHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NTBmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUEIwMDEtSW5wdXQyLnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1BCMDAxLUlucHV0My5wcHR4IGIvVGVzdEZpbGVzL1BCMDAxLUlucHV0My5wcHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjFiNDcKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUEIwMDEtSW5wdXQzLnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1BQMDA2LVZpZGVvcy5wcHR4IGIvVGVzdEZpbGVzL1BQMDA2LVZpZGVvcy5wcHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjhlOTAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUFAwMDYtVmlkZW9zLnBwdHgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1BVL1BVMDAxLVRlc3QwMDEubWh0IGIvVGVzdEZpbGVzL1BVL1BVMDAxLVRlc3QwMDEubWh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNDcxZTQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUFUvUFUwMDEtVGVzdDAwMS5taHQKQEAgLTAsMCArMSwyNTE4IEBACitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvcmVsYXRlZDsgYm91bmRhcnk9Ii0tLS09X05leHRQYXJ0XzAxRDM4NkI3LkUwNUY4NTkwIgorCitUaGlzIGRvY3VtZW50IGlzIGEgU2luZ2xlIEZpbGUgV2ViIFBhZ2UsIGFsc28ga25vd24gYXMgYSBXZWIgQXJjaGl2ZSBmaWxlLiAgSWYgeW91IGFyZSBzZWVpbmcgdGhpcyBtZXNzYWdlLCB5b3VyIGJyb3dzZXIgb3IgZWRpdG9yIGRvZXNuJ3Qgc3VwcG9ydCBXZWIgQXJjaGl2ZSBmaWxlcy4gIFBsZWFzZSBkb3dubG9hZCBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBXZWIgQXJjaGl2ZSwgc3VjaCBhcyBXaW5kb3dzriBJbnRlcm5ldCBFeHBsb3Jlcq4uCisKKy0tLS0tLT1fTmV4dFBhcnRfMDFEMzg2QjcuRTA1Rjg1OTAKK0NvbnRlbnQtTG9jYXRpb246IGZpbGU6Ly8vQzovMjY3QkEyRDQvVGVzdC5odG0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFibGUKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PSJ3aW5kb3dzLTEyNTIiCisKKzxodG1sIHhtbG5zOnY9M0QidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiCit4bWxuczpvPTNEInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKK3htbG5zOnc9M0QidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zOm09M0QiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIgoreG1sbnM9M0QiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0zRENvbnRlbnQtVHlwZSBjb250ZW50PTNEInRleHQvaHRtbDsgY2hhcnNldD0zRHdpbmRvd3MtMTI1PQorMiI+Cis8bWV0YSBuYW1lPTNEUHJvZ0lkIGNvbnRlbnQ9M0RXb3JkLkRvY3VtZW50PgorPG1ldGEgbmFtZT0zREdlbmVyYXRvciBjb250ZW50PTNEIk1pY3Jvc29mdCBXb3JkIDE1Ij4KKzxtZXRhIG5hbWU9M0RPcmlnaW5hdG9yIGNvbnRlbnQ9M0QiTWljcm9zb2Z0IFdvcmQgMTUiPgorPGxpbmsgcmVsPTNERmlsZS1MaXN0IGhyZWY9M0QiVGVzdF9maWxlcy9maWxlbGlzdC54bWwiPgorPGxpbmsgcmVsPTNERWRpdC1UaW1lLURhdGEgaHJlZj0zRCJUZXN0X2ZpbGVzL2VkaXRkYXRhLm1zbyI+Cis8bGluayByZWw9M0RPTEUtT2JqZWN0LURhdGEgaHJlZj0zRCJUZXN0X2ZpbGVzL29sZWRhdGEubXNvIj4KKzwhLS1baWYgIW1zb10+Cis8c3R5bGU+Cit2XDoqIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9CitvXDoqIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9Cit3XDoqIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9Cisuc2hhcGUge2JlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpO30KKzwvc3R5bGU+Cis8IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8bzpEb2N1bWVudFByb3BlcnRpZXM+CisgIDxvOkF1dGhvcj5FcmljIFdoaXRlPC9vOkF1dGhvcj4KKyAgPG86TGFzdEF1dGhvcj5FcmljIFdoaXRlPC9vOkxhc3RBdXRob3I+CisgIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+CisgIDxvOlRvdGFsVGltZT40PC9vOlRvdGFsVGltZT4KKyAgPG86Q3JlYXRlZD4yMDE4LTAxLTA2VDE0OjMwOjAwWjwvbzpDcmVhdGVkPgorICA8bzpMYXN0U2F2ZWQ+MjAxOC0wMS0wNlQxNDozMDowMFo8L286TGFzdFNhdmVkPgorICA8bzpQYWdlcz4xPC9vOlBhZ2VzPgorICA8bzpXb3Jkcz4xMTwvbzpXb3Jkcz4KKyAgPG86Q2hhcmFjdGVycz42NzwvbzpDaGFyYWN0ZXJzPgorICA8bzpMaW5lcz4xPC9vOkxpbmVzPgorICA8bzpQYXJhZ3JhcGhzPjE8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Nzc8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+MTYuMDA8L286VmVyc2lvbj4KKyA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgorIDxvOk9mZmljZURvY3VtZW50U2V0dGluZ3M+CisgIDxvOkFsbG93UE5HLz4KKyA8L286T2ZmaWNlRG9jdW1lbnRTZXR0aW5ncz4KKzwveG1sPjwhW2VuZGlmXS0tPgorPGxpbmsgcmVsPTNEdGhlbWVEYXRhIGhyZWY9M0QiVGVzdF9maWxlcy90aGVtZWRhdGEudGhteCI+Cis8bGluayByZWw9M0Rjb2xvclNjaGVtZU1hcHBpbmcgaHJlZj0zRCJUZXN0X2ZpbGVzL2NvbG9yc2NoZW1lbWFwcGluZy54bWwiPgorPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPHc6V29yZERvY3VtZW50PgorICA8dzpTcGVsbGluZ1N0YXRlPkNsZWFuPC93OlNwZWxsaW5nU3RhdGU+CisgIDx3OkdyYW1tYXJTdGF0ZT5DbGVhbjwvdzpHcmFtbWFyU3RhdGU+CisgIDx3OlRyYWNrTW92ZXM+ZmFsc2U8L3c6VHJhY2tNb3Zlcz4KKyAgPHc6VHJhY2tGb3JtYXR0aW5nLz4KKyAgPHc6SHlwaGVuYXRpb25ab25lPjIxPC93Okh5cGhlbmF0aW9uWm9uZT4KKyAgPHc6UHVuY3R1YXRpb25LZXJuaW5nLz4KKyAgPHc6VmFsaWRhdGVBZ2FpbnN0U2NoZW1hcy8+CisgIDx3OlNhdmVJZlhNTEludmFsaWQ+ZmFsc2U8L3c6U2F2ZUlmWE1MSW52YWxpZD4KKyAgPHc6SWdub3JlTWl4ZWRDb250ZW50PmZhbHNlPC93Oklnbm9yZU1peGVkQ29udGVudD4KKyAgPHc6QWx3YXlzU2hvd1BsYWNlaG9sZGVyVGV4dD5mYWxzZTwvdzpBbHdheXNTaG93UGxhY2Vob2xkZXJUZXh0PgorICA8dzpEb05vdFByb21vdGVRRi8+CisgIDx3OkxpZFRoZW1lT3RoZXI+RlI8L3c6TGlkVGhlbWVPdGhlcj4KKyAgPHc6TGlkVGhlbWVBc2lhbj5FTi1VUzwvdzpMaWRUaGVtZUFzaWFuPgorICA8dzpMaWRUaGVtZUNvbXBsZXhTY3JpcHQ+QVItU0E8L3c6TGlkVGhlbWVDb21wbGV4U2NyaXB0PgorICA8dzpDb21wYXRpYmlsaXR5PgorICAgPHc6QnJlYWtXcmFwcGVkVGFibGVzLz4KKyAgIDx3OlNuYXBUb0dyaWRJbkNlbGwvPgorICAgPHc6V3JhcFRleHRXaXRoUHVuY3QvPgorICAgPHc6VXNlQXNpYW5CcmVha1J1bGVzLz4KKyAgIDx3OkRvbnRHcm93QXV0b2ZpdC8+CisgICA8dzpTcGxpdFBnQnJlYWtBbmRQYXJhTWFyay8+CisgICA8dzpFbmFibGVPcGVuVHlwZUtlcm5pbmcvPgorICAgPHc6RG9udEZsaXBNaXJyb3JJbmRlbnRzLz4KKyAgIDx3Ok92ZXJyaWRlVGFibGVTdHlsZUhwcy8+CisgIDwvdzpDb21wYXRpYmlsaXR5PgorICA8bTptYXRoUHI+CisgICA8bTptYXRoRm9udCBtOnZhbD0zRCJDYW1icmlhIE1hdGgiLz4KKyAgIDxtOmJya0JpbiBtOnZhbD0zRCJiZWZvcmUiLz4KKyAgIDxtOmJya0JpblN1YiBtOnZhbD0zRCImIzQ1Oy0iLz4KKyAgIDxtOnNtYWxsRnJhYyBtOnZhbD0zRCJvZmYiLz4KKyAgIDxtOmRpc3BEZWYvPgorICAgPG06bE1hcmdpbiBtOnZhbD0zRCIwIi8+CisgICA8bTpyTWFyZ2luIG06dmFsPTNEIjAiLz4KKyAgIDxtOmRlZkpjIG06dmFsPTNEImNlbnRlckdyb3VwIi8+CisgICA8bTp3cmFwSW5kZW50IG06dmFsPTNEIjE0NDAiLz4KKyAgIDxtOmludExpbSBtOnZhbD0zRCJzdWJTdXAiLz4KKyAgIDxtOm5hcnlMaW0gbTp2YWw9M0QidW5kT3ZyIi8+CisgIDwvbTptYXRoUHI+PC93OldvcmREb2N1bWVudD4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OkxhdGVudFN0eWxlcyBEZWZMb2NrZWRTdGF0ZT0zRCJmYWxzZSIgRGVmVW5oaWRlV2hlblVzZWQ9M0QiZmFsc2UiCisgIERlZlNlbWlIaWRkZW49M0QiZmFsc2UiIERlZlFGb3JtYXQ9M0QiZmFsc2UiIERlZlByaW9yaXR5PTNEIjk5IgorICBMYXRlbnRTdHlsZUNvdW50PTNEIjM3NSI+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjAiIFFGb3JtYXQ9M0QidHJ1ZSIgTmFtZT0zRCI9CitOb3JtYWwiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiOSIgUUZvcm1hdD0zRCJ0cnVlIiBOYW1lPTNEIj0KK2hlYWRpbmcgMSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI5IiBTZW1pSGlkZGVuPTNEInRydWUiCisgICBVbmhpZGVXaGVuVXNlZD0zRCJ0cnVlIiBRRm9ybWF0PTNEInRydWUiIE5hbWU9M0QiaGVhZGluZyAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjkiIFNlbWlIaWRkZW49M0QidHJ1ZSIKKyAgIFVuaGlkZVdoZW5Vc2VkPTNEInRydWUiIFFGb3JtYXQ9M0QidHJ1ZSIgTmFtZT0zRCJoZWFkaW5nIDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiOSIgU2VtaUhpZGRlbj0zRCJ0cnVlIgorICAgVW5oaWRlV2hlblVzZWQ9M0QidHJ1ZSIgUUZvcm1hdD0zRCJ0cnVlIiBOYW1lPTNEImhlYWRpbmcgNCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI5IiBTZW1pSGlkZGVuPTNEInRydWUiCisgICBVbmhpZGVXaGVuVXNlZD0zRCJ0cnVlIiBRRm9ybWF0PTNEInRydWUiIE5hbWU9M0QiaGVhZGluZyA1Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjkiIFNlbWlIaWRkZW49M0QidHJ1ZSIKKyAgIFVuaGlkZVdoZW5Vc2VkPTNEInRydWUiIFFGb3JtYXQ9M0QidHJ1ZSIgTmFtZT0zRCJoZWFkaW5nIDYiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiOSIgU2VtaUhpZGRlbj0zRCJ0cnVlIgorICAgVW5oaWRlV2hlblVzZWQ9M0QidHJ1ZSIgUUZvcm1hdD0zRCJ0cnVlIiBOYW1lPTNEImhlYWRpbmcgNyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI5IiBTZW1pSGlkZGVuPTNEInRydWUiCisgICBVbmhpZGVXaGVuVXNlZD0zRCJ0cnVlIiBRRm9ybWF0PTNEInRydWUiIE5hbWU9M0QiaGVhZGluZyA4Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjkiIFNlbWlIaWRkZW49M0QidHJ1ZSIKKyAgIFVuaGlkZVdoZW5Vc2VkPTNEInRydWUiIFFGb3JtYXQ9M0QidHJ1ZSIgTmFtZT0zRCJoZWFkaW5nIDkiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJpbmRleCAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiaW5kZXggMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEImluZGV4IDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJpbmRleCA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiaW5kZXggNSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEImluZGV4IDYiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJpbmRleCA3Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiaW5kZXggOCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEImluZGV4IDkiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMzkiIFNlbWlIaWRkZW49M0QidHJ1ZSIKKyAgIFVuaGlkZVdoZW5Vc2VkPTNEInRydWUiIE5hbWU9M0QidG9jIDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMzkiIFNlbWlIaWRkZW49M0QidHJ1ZSIKKyAgIFVuaGlkZVdoZW5Vc2VkPTNEInRydWUiIE5hbWU9M0QidG9jIDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMzkiIFNlbWlIaWRkZW49M0QidHJ1ZSIKKyAgIFVuaGlkZVdoZW5Vc2VkPTNEInRydWUiIE5hbWU9M0QidG9jIDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMzkiIFNlbWlIaWRkZW49M0QidHJ1ZSIKKyAgIFVuaGlkZVdoZW5Vc2VkPTNEInRydWUiIE5hbWU9M0QidG9jIDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMzkiIFNlbWlIaWRkZW49M0QidHJ1ZSIKKyAgIFVuaGlkZVdoZW5Vc2VkPTNEInRydWUiIE5hbWU9M0QidG9jIDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMzkiIFNlbWlIaWRkZW49M0QidHJ1ZSIKKyAgIFVuaGlkZVdoZW5Vc2VkPTNEInRydWUiIE5hbWU9M0QidG9jIDYiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMzkiIFNlbWlIaWRkZW49M0QidHJ1ZSIKKyAgIFVuaGlkZVdoZW5Vc2VkPTNEInRydWUiIE5hbWU9M0QidG9jIDciLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMzkiIFNlbWlIaWRkZW49M0QidHJ1ZSIKKyAgIFVuaGlkZVdoZW5Vc2VkPTNEInRydWUiIE5hbWU9M0QidG9jIDgiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMzkiIFNlbWlIaWRkZW49M0QidHJ1ZSIKKyAgIFVuaGlkZVdoZW5Vc2VkPTNEInRydWUiIE5hbWU9M0QidG9jIDkiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJOb3JtYWwgSW5kZW50Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiZm9vdG5vdGUgdGV4dCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEImFubm90YXRpb24gdGV4dCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEImhlYWRlciIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEImZvb3RlciIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEImluZGV4IGhlYWRpbmciLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMzUiIFNlbWlIaWRkZW49M0QidHJ1ZSIKKyAgIFVuaGlkZVdoZW5Vc2VkPTNEInRydWUiIFFGb3JtYXQ9M0QidHJ1ZSIgTmFtZT0zRCJjYXB0aW9uIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QidGFibGUgb2YgZmlndXJlcyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEImVudmVsb3BlIGFkZHJlc3MiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJlbnZlbG9wZSByZXR1cm4iLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJmb290bm90ZSByZWZlcmVuY2UiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJhbm5vdGF0aW9uIHJlZmVyZW5jZSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEImxpbmUgbnVtYmVyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QicGFnZSBudW1iZXIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJlbmRub3RlIHJlZmVyZW5jZSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEImVuZG5vdGUgdGV4dCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEInRhYmxlIG9mIGF1dGhvcml0aWVzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QibWFjcm8iLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJ0b2EgaGVhZGluZyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkxpc3QiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJMaXN0IEJ1bGxldCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkxpc3QgTnVtYmVyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiTGlzdCAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiTGlzdCAzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiTGlzdCA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiTGlzdCA1Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiTGlzdCBCdWxsZXQgMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkxpc3QgQnVsbGV0IDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJMaXN0IEJ1bGxldCA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiTGlzdCBCdWxsZXQgNSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkxpc3QgTnVtYmVyIDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJMaXN0IE51bWJlciAzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiTGlzdCBOdW1iZXIgNCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkxpc3QgTnVtYmVyIDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMTAiIFFGb3JtYXQ9M0QidHJ1ZSIgTmFtZT0zRD0KKyJUaXRsZSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkNsb3NpbmciLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJTaWduYXR1cmUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMSIgU2VtaUhpZGRlbj0zRCJ0cnVlIgorICAgVW5oaWRlV2hlblVzZWQ9M0QidHJ1ZSIgTmFtZT0zRCJEZWZhdWx0IFBhcmFncmFwaCBGb250Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiQm9keSBUZXh0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiQm9keSBUZXh0IEluZGVudCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkxpc3QgQ29udGludWUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJMaXN0IENvbnRpbnVlIDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJMaXN0IENvbnRpbnVlIDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJMaXN0IENvbnRpbnVlIDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJMaXN0IENvbnRpbnVlIDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJNZXNzYWdlIEhlYWRlciIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCIxMSIgUUZvcm1hdD0zRCJ0cnVlIiBOYW1lPTNEPQorIlN1YnRpdGxlIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiU2FsdXRhdGlvbiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkRhdGUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJCb2R5IFRleHQgRmlyc3QgSW5kZW50Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiQm9keSBUZXh0IEZpcnN0IEluZGVudCAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiTm90ZSBIZWFkaW5nIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiQm9keSBUZXh0IDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJCb2R5IFRleHQgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkJvZHkgVGV4dCBJbmRlbnQgMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkJvZHkgVGV4dCBJbmRlbnQgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkJsb2NrIFRleHQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJIeXBlcmxpbmsiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJGb2xsb3dlZEh5cGVybGluayIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCIyMiIgUUZvcm1hdD0zRCJ0cnVlIiBOYW1lPTNEPQorIlN0cm9uZyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCIyMCIgUUZvcm1hdD0zRCJ0cnVlIiBOYW1lPTNEPQorIkVtcGhhc2lzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiRG9jdW1lbnQgTWFwIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiUGxhaW4gVGV4dCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkUtbWFpbCBTaWduYXR1cmUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJIVE1MIFRvcCBvZiBGb3JtIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiSFRNTCBCb3R0b20gb2YgRm9ybSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIk5vcm1hbCAoV2ViKSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkhUTUwgQWNyb255bSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkhUTUwgQWRkcmVzcyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkhUTUwgQ2l0ZSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkhUTUwgQ29kZSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkhUTUwgRGVmaW5pdGlvbiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkhUTUwgS2V5Ym9hcmQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJIVE1MIFByZWZvcm1hdHRlZCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkhUTUwgU2FtcGxlIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiSFRNTCBUeXBld3JpdGVyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiSFRNTCBWYXJpYWJsZSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIk5vcm1hbCBUYWJsZSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEImFubm90YXRpb24gc3ViamVjdCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIk5vIExpc3QiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJPdXRsaW5lIExpc3QgMSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIk91dGxpbmUgTGlzdCAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiT3V0bGluZSBMaXN0IDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBTaW1wbGUgMSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIlRhYmxlIFNpbXBsZSAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiVGFibGUgU2ltcGxlIDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBDbGFzc2ljIDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBDbGFzc2ljIDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBDbGFzc2ljIDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBDbGFzc2ljIDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBDb2xvcmZ1bCAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiVGFibGUgQ29sb3JmdWwgMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIlRhYmxlIENvbG9yZnVsIDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBDb2x1bW5zIDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBDb2x1bW5zIDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBDb2x1bW5zIDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBDb2x1bW5zIDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBDb2x1bW5zIDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBHcmlkIDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBHcmlkIDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBHcmlkIDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBHcmlkIDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBHcmlkIDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBHcmlkIDYiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBHcmlkIDciLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBHcmlkIDgiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBMaXN0IDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBMaXN0IDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBMaXN0IDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBMaXN0IDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBMaXN0IDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBMaXN0IDYiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBMaXN0IDciLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBMaXN0IDgiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSAzRCBlZmZlY3RzIDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSAzRCBlZmZlY3RzIDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSAzRCBlZmZlY3RzIDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBDb250ZW1wb3JhcnkiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBFbGVnYW50Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiVGFibGUgUHJvZmVzc2lvbmFsIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiVGFibGUgU3VidGxlIDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBTdWJ0bGUgMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIlRhYmxlIFdlYiAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiVGFibGUgV2ViIDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJUYWJsZSBXZWIgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIkJhbGxvb24gVGV4dCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCIzOSIgTmFtZT0zRCJUYWJsZSBHcmlkIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiVGFibGUgVGhlbWUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBOYW1lPTNEIlBsYWNlaG9sZGVyID0KK1RleHQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMSIgUUZvcm1hdD0zRCJ0cnVlIiBOYW1lPTNEIj0KK05vIFNwYWNpbmciLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjAiIE5hbWU9M0QiTGlnaHQgU2hhZGluZyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2MSIgTmFtZT0zRCJMaWdodCBMaXN0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjYyIiBOYW1lPTNEIkxpZ2h0IEdyaWQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjMiIE5hbWU9M0QiTWVkaXVtIFNoYWRpbmcgMT0KKyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2NCIgTmFtZT0zRCJNZWRpdW0gU2hhZGluZyAyPQorIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjY1IiBOYW1lPTNEIk1lZGl1bSBMaXN0IDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjYiIE5hbWU9M0QiTWVkaXVtIExpc3QgMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2NyIgTmFtZT0zRCJNZWRpdW0gR3JpZCAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjY4IiBOYW1lPTNEIk1lZGl1bSBHcmlkIDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjkiIE5hbWU9M0QiTWVkaXVtIEdyaWQgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI3MCIgTmFtZT0zRCJEYXJrIExpc3QiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNzEiIE5hbWU9M0QiQ29sb3JmdWwgU2hhZGluZz0KKyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI3MiIgTmFtZT0zRCJDb2xvcmZ1bCBMaXN0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjczIiBOYW1lPTNEIkNvbG9yZnVsIEdyaWQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjAiIE5hbWU9M0QiTGlnaHQgU2hhZGluZyBBYz0KK2NlbnQgMSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2MSIgTmFtZT0zRCJMaWdodCBMaXN0IEFjY2VuPQordCAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjYyIiBOYW1lPTNEIkxpZ2h0IEdyaWQgQWNjZW49Cit0IDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjMiIE5hbWU9M0QiTWVkaXVtIFNoYWRpbmcgMT0KKyBBY2NlbnQgMSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2NCIgTmFtZT0zRCJNZWRpdW0gU2hhZGluZyAyPQorIEFjY2VudCAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjY1IiBOYW1lPTNEIk1lZGl1bSBMaXN0IDEgQWM9CitjZW50IDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBOYW1lPTNEIlJldmlzaW9uIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjM0IiBRRm9ybWF0PTNEInRydWUiCisgICBOYW1lPTNEIkxpc3QgUGFyYWdyYXBoIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjI5IiBRRm9ybWF0PTNEInRydWUiIE5hbWU9M0Q9CisiUXVvdGUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMzAiIFFGb3JtYXQ9M0QidHJ1ZSIKKyAgIE5hbWU9M0QiSW50ZW5zZSBRdW90ZSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2NiIgTmFtZT0zRCJNZWRpdW0gTGlzdCAyIEFjPQorY2VudCAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjY3IiBOYW1lPTNEIk1lZGl1bSBHcmlkIDEgQWM9CitjZW50IDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjgiIE5hbWU9M0QiTWVkaXVtIEdyaWQgMiBBYz0KK2NlbnQgMSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2OSIgTmFtZT0zRCJNZWRpdW0gR3JpZCAzIEFjPQorY2VudCAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjcwIiBOYW1lPTNEIkRhcmsgTGlzdCBBY2NlbnQ9CisgMSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI3MSIgTmFtZT0zRCJDb2xvcmZ1bCBTaGFkaW5nPQorIEFjY2VudCAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjcyIiBOYW1lPTNEIkNvbG9yZnVsIExpc3QgQWM9CitjZW50IDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNzMiIE5hbWU9M0QiQ29sb3JmdWwgR3JpZCBBYz0KK2NlbnQgMSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2MCIgTmFtZT0zRCJMaWdodCBTaGFkaW5nIEFjPQorY2VudCAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjYxIiBOYW1lPTNEIkxpZ2h0IExpc3QgQWNjZW49Cit0IDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjIiIE5hbWU9M0QiTGlnaHQgR3JpZCBBY2Nlbj0KK3QgMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2MyIgTmFtZT0zRCJNZWRpdW0gU2hhZGluZyAxPQorIEFjY2VudCAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjY0IiBOYW1lPTNEIk1lZGl1bSBTaGFkaW5nIDI9CisgQWNjZW50IDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjUiIE5hbWU9M0QiTWVkaXVtIExpc3QgMSBBYz0KK2NlbnQgMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2NiIgTmFtZT0zRCJNZWRpdW0gTGlzdCAyIEFjPQorY2VudCAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjY3IiBOYW1lPTNEIk1lZGl1bSBHcmlkIDEgQWM9CitjZW50IDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjgiIE5hbWU9M0QiTWVkaXVtIEdyaWQgMiBBYz0KK2NlbnQgMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2OSIgTmFtZT0zRCJNZWRpdW0gR3JpZCAzIEFjPQorY2VudCAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjcwIiBOYW1lPTNEIkRhcmsgTGlzdCBBY2NlbnQ9CisgMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI3MSIgTmFtZT0zRCJDb2xvcmZ1bCBTaGFkaW5nPQorIEFjY2VudCAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjcyIiBOYW1lPTNEIkNvbG9yZnVsIExpc3QgQWM9CitjZW50IDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNzMiIE5hbWU9M0QiQ29sb3JmdWwgR3JpZCBBYz0KK2NlbnQgMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2MCIgTmFtZT0zRCJMaWdodCBTaGFkaW5nIEFjPQorY2VudCAzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjYxIiBOYW1lPTNEIkxpZ2h0IExpc3QgQWNjZW49Cit0IDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjIiIE5hbWU9M0QiTGlnaHQgR3JpZCBBY2Nlbj0KK3QgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2MyIgTmFtZT0zRCJNZWRpdW0gU2hhZGluZyAxPQorIEFjY2VudCAzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjY0IiBOYW1lPTNEIk1lZGl1bSBTaGFkaW5nIDI9CisgQWNjZW50IDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjUiIE5hbWU9M0QiTWVkaXVtIExpc3QgMSBBYz0KK2NlbnQgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2NiIgTmFtZT0zRCJNZWRpdW0gTGlzdCAyIEFjPQorY2VudCAzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjY3IiBOYW1lPTNEIk1lZGl1bSBHcmlkIDEgQWM9CitjZW50IDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjgiIE5hbWU9M0QiTWVkaXVtIEdyaWQgMiBBYz0KK2NlbnQgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2OSIgTmFtZT0zRCJNZWRpdW0gR3JpZCAzIEFjPQorY2VudCAzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjcwIiBOYW1lPTNEIkRhcmsgTGlzdCBBY2NlbnQ9CisgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI3MSIgTmFtZT0zRCJDb2xvcmZ1bCBTaGFkaW5nPQorIEFjY2VudCAzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjcyIiBOYW1lPTNEIkNvbG9yZnVsIExpc3QgQWM9CitjZW50IDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNzMiIE5hbWU9M0QiQ29sb3JmdWwgR3JpZCBBYz0KK2NlbnQgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2MCIgTmFtZT0zRCJMaWdodCBTaGFkaW5nIEFjPQorY2VudCA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjYxIiBOYW1lPTNEIkxpZ2h0IExpc3QgQWNjZW49Cit0IDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjIiIE5hbWU9M0QiTGlnaHQgR3JpZCBBY2Nlbj0KK3QgNCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2MyIgTmFtZT0zRCJNZWRpdW0gU2hhZGluZyAxPQorIEFjY2VudCA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjY0IiBOYW1lPTNEIk1lZGl1bSBTaGFkaW5nIDI9CisgQWNjZW50IDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjUiIE5hbWU9M0QiTWVkaXVtIExpc3QgMSBBYz0KK2NlbnQgNCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2NiIgTmFtZT0zRCJNZWRpdW0gTGlzdCAyIEFjPQorY2VudCA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjY3IiBOYW1lPTNEIk1lZGl1bSBHcmlkIDEgQWM9CitjZW50IDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjgiIE5hbWU9M0QiTWVkaXVtIEdyaWQgMiBBYz0KK2NlbnQgNCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2OSIgTmFtZT0zRCJNZWRpdW0gR3JpZCAzIEFjPQorY2VudCA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjcwIiBOYW1lPTNEIkRhcmsgTGlzdCBBY2NlbnQ9CisgNCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI3MSIgTmFtZT0zRCJDb2xvcmZ1bCBTaGFkaW5nPQorIEFjY2VudCA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjcyIiBOYW1lPTNEIkNvbG9yZnVsIExpc3QgQWM9CitjZW50IDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNzMiIE5hbWU9M0QiQ29sb3JmdWwgR3JpZCBBYz0KK2NlbnQgNCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2MCIgTmFtZT0zRCJMaWdodCBTaGFkaW5nIEFjPQorY2VudCA1Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjYxIiBOYW1lPTNEIkxpZ2h0IExpc3QgQWNjZW49Cit0IDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjIiIE5hbWU9M0QiTGlnaHQgR3JpZCBBY2Nlbj0KK3QgNSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2MyIgTmFtZT0zRCJNZWRpdW0gU2hhZGluZyAxPQorIEFjY2VudCA1Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjY0IiBOYW1lPTNEIk1lZGl1bSBTaGFkaW5nIDI9CisgQWNjZW50IDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjUiIE5hbWU9M0QiTWVkaXVtIExpc3QgMSBBYz0KK2NlbnQgNSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2NiIgTmFtZT0zRCJNZWRpdW0gTGlzdCAyIEFjPQorY2VudCA1Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjY3IiBOYW1lPTNEIk1lZGl1bSBHcmlkIDEgQWM9CitjZW50IDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjgiIE5hbWU9M0QiTWVkaXVtIEdyaWQgMiBBYz0KK2NlbnQgNSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2OSIgTmFtZT0zRCJNZWRpdW0gR3JpZCAzIEFjPQorY2VudCA1Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjcwIiBOYW1lPTNEIkRhcmsgTGlzdCBBY2NlbnQ9CisgNSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI3MSIgTmFtZT0zRCJDb2xvcmZ1bCBTaGFkaW5nPQorIEFjY2VudCA1Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjcyIiBOYW1lPTNEIkNvbG9yZnVsIExpc3QgQWM9CitjZW50IDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNzMiIE5hbWU9M0QiQ29sb3JmdWwgR3JpZCBBYz0KK2NlbnQgNSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2MCIgTmFtZT0zRCJMaWdodCBTaGFkaW5nIEFjPQorY2VudCA2Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjYxIiBOYW1lPTNEIkxpZ2h0IExpc3QgQWNjZW49Cit0IDYiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjIiIE5hbWU9M0QiTGlnaHQgR3JpZCBBY2Nlbj0KK3QgNiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2MyIgTmFtZT0zRCJNZWRpdW0gU2hhZGluZyAxPQorIEFjY2VudCA2Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjY0IiBOYW1lPTNEIk1lZGl1bSBTaGFkaW5nIDI9CisgQWNjZW50IDYiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjUiIE5hbWU9M0QiTWVkaXVtIExpc3QgMSBBYz0KK2NlbnQgNiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2NiIgTmFtZT0zRCJNZWRpdW0gTGlzdCAyIEFjPQorY2VudCA2Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjY3IiBOYW1lPTNEIk1lZGl1bSBHcmlkIDEgQWM9CitjZW50IDYiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNjgiIE5hbWU9M0QiTWVkaXVtIEdyaWQgMiBBYz0KK2NlbnQgNiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI2OSIgTmFtZT0zRCJNZWRpdW0gR3JpZCAzIEFjPQorY2VudCA2Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjcwIiBOYW1lPTNEIkRhcmsgTGlzdCBBY2NlbnQ9CisgNiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI3MSIgTmFtZT0zRCJDb2xvcmZ1bCBTaGFkaW5nPQorIEFjY2VudCA2Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjcyIiBOYW1lPTNEIkNvbG9yZnVsIExpc3QgQWM9CitjZW50IDYiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNzMiIE5hbWU9M0QiQ29sb3JmdWwgR3JpZCBBYz0KK2NlbnQgNiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCIxOSIgUUZvcm1hdD0zRCJ0cnVlIgorICAgTmFtZT0zRCJTdWJ0bGUgRW1waGFzaXMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMjEiIFFGb3JtYXQ9M0QidHJ1ZSIKKyAgIE5hbWU9M0QiSW50ZW5zZSBFbXBoYXNpcyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCIzMSIgUUZvcm1hdD0zRCJ0cnVlIgorICAgTmFtZT0zRCJTdWJ0bGUgUmVmZXJlbmNlIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjMyIiBRRm9ybWF0PTNEInRydWUiCisgICBOYW1lPTNEIkludGVuc2UgUmVmZXJlbmNlIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjMzIiBRRm9ybWF0PTNEInRydWUiIE5hbWU9M0Q9CisiQm9vayBUaXRsZSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCIzNyIgU2VtaUhpZGRlbj0zRCJ0cnVlIgorICAgVW5oaWRlV2hlblVzZWQ9M0QidHJ1ZSIgTmFtZT0zRCJCaWJsaW9ncmFwaHkiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiMzkiIFNlbWlIaWRkZW49M0QidHJ1ZSIKKyAgIFVuaGlkZVdoZW5Vc2VkPTNEInRydWUiIFFGb3JtYXQ9M0QidHJ1ZSIgTmFtZT0zRCJUT0MgSGVhZGluZyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0MSIgTmFtZT0zRCJQbGFpbiBUYWJsZSAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQyIiBOYW1lPTNEIlBsYWluIFRhYmxlIDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDMiIE5hbWU9M0QiUGxhaW4gVGFibGUgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NCIgTmFtZT0zRCJQbGFpbiBUYWJsZSA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ1IiBOYW1lPTNEIlBsYWluIFRhYmxlIDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDAiIE5hbWU9M0QiR3JpZCBUYWJsZSBMaWdodD0KKyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NiIgTmFtZT0zRCJHcmlkIFRhYmxlIDEgTGlnPQoraHQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDciIE5hbWU9M0QiR3JpZCBUYWJsZSAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ4IiBOYW1lPTNEIkdyaWQgVGFibGUgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0OSIgTmFtZT0zRCJHcmlkIFRhYmxlIDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTAiIE5hbWU9M0QiR3JpZCBUYWJsZSA1IERhcj0KK2siLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTEiIE5hbWU9M0QiR3JpZCBUYWJsZSA2IENvbD0KK29yZnVsIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUyIiBOYW1lPTNEIkdyaWQgVGFibGUgNyBDb2w9CitvcmZ1bCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NiIKKyAgIE5hbWU9M0QiR3JpZCBUYWJsZSAxIExpZ2h0IEFjY2VudCAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ3IiBOYW1lPTNEIkdyaWQgVGFibGUgMiBBY2M9CitlbnQgMSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0OCIgTmFtZT0zRCJHcmlkIFRhYmxlIDMgQWNjPQorZW50IDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDkiIE5hbWU9M0QiR3JpZCBUYWJsZSA0IEFjYz0KK2VudCAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUwIiBOYW1lPTNEIkdyaWQgVGFibGUgNSBEYXI9CitrIEFjY2VudCAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUxIgorICAgTmFtZT0zRCJHcmlkIFRhYmxlIDYgQ29sb3JmdWwgQWNjZW50IDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTIiCisgICBOYW1lPTNEIkdyaWQgVGFibGUgNyBDb2xvcmZ1bCBBY2NlbnQgMSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NiIKKyAgIE5hbWU9M0QiR3JpZCBUYWJsZSAxIExpZ2h0IEFjY2VudCAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ3IiBOYW1lPTNEIkdyaWQgVGFibGUgMiBBY2M9CitlbnQgMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0OCIgTmFtZT0zRCJHcmlkIFRhYmxlIDMgQWNjPQorZW50IDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDkiIE5hbWU9M0QiR3JpZCBUYWJsZSA0IEFjYz0KK2VudCAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUwIiBOYW1lPTNEIkdyaWQgVGFibGUgNSBEYXI9CitrIEFjY2VudCAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUxIgorICAgTmFtZT0zRCJHcmlkIFRhYmxlIDYgQ29sb3JmdWwgQWNjZW50IDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTIiCisgICBOYW1lPTNEIkdyaWQgVGFibGUgNyBDb2xvcmZ1bCBBY2NlbnQgMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NiIKKyAgIE5hbWU9M0QiR3JpZCBUYWJsZSAxIExpZ2h0IEFjY2VudCAzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ3IiBOYW1lPTNEIkdyaWQgVGFibGUgMiBBY2M9CitlbnQgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0OCIgTmFtZT0zRCJHcmlkIFRhYmxlIDMgQWNjPQorZW50IDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDkiIE5hbWU9M0QiR3JpZCBUYWJsZSA0IEFjYz0KK2VudCAzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUwIiBOYW1lPTNEIkdyaWQgVGFibGUgNSBEYXI9CitrIEFjY2VudCAzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUxIgorICAgTmFtZT0zRCJHcmlkIFRhYmxlIDYgQ29sb3JmdWwgQWNjZW50IDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTIiCisgICBOYW1lPTNEIkdyaWQgVGFibGUgNyBDb2xvcmZ1bCBBY2NlbnQgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NiIKKyAgIE5hbWU9M0QiR3JpZCBUYWJsZSAxIExpZ2h0IEFjY2VudCA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ3IiBOYW1lPTNEIkdyaWQgVGFibGUgMiBBY2M9CitlbnQgNCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0OCIgTmFtZT0zRCJHcmlkIFRhYmxlIDMgQWNjPQorZW50IDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDkiIE5hbWU9M0QiR3JpZCBUYWJsZSA0IEFjYz0KK2VudCA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUwIiBOYW1lPTNEIkdyaWQgVGFibGUgNSBEYXI9CitrIEFjY2VudCA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUxIgorICAgTmFtZT0zRCJHcmlkIFRhYmxlIDYgQ29sb3JmdWwgQWNjZW50IDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTIiCisgICBOYW1lPTNEIkdyaWQgVGFibGUgNyBDb2xvcmZ1bCBBY2NlbnQgNCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NiIKKyAgIE5hbWU9M0QiR3JpZCBUYWJsZSAxIExpZ2h0IEFjY2VudCA1Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ3IiBOYW1lPTNEIkdyaWQgVGFibGUgMiBBY2M9CitlbnQgNSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0OCIgTmFtZT0zRCJHcmlkIFRhYmxlIDMgQWNjPQorZW50IDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDkiIE5hbWU9M0QiR3JpZCBUYWJsZSA0IEFjYz0KK2VudCA1Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUwIiBOYW1lPTNEIkdyaWQgVGFibGUgNSBEYXI9CitrIEFjY2VudCA1Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUxIgorICAgTmFtZT0zRCJHcmlkIFRhYmxlIDYgQ29sb3JmdWwgQWNjZW50IDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTIiCisgICBOYW1lPTNEIkdyaWQgVGFibGUgNyBDb2xvcmZ1bCBBY2NlbnQgNSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NiIKKyAgIE5hbWU9M0QiR3JpZCBUYWJsZSAxIExpZ2h0IEFjY2VudCA2Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ3IiBOYW1lPTNEIkdyaWQgVGFibGUgMiBBY2M9CitlbnQgNiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0OCIgTmFtZT0zRCJHcmlkIFRhYmxlIDMgQWNjPQorZW50IDYiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDkiIE5hbWU9M0QiR3JpZCBUYWJsZSA0IEFjYz0KK2VudCA2Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUwIiBOYW1lPTNEIkdyaWQgVGFibGUgNSBEYXI9CitrIEFjY2VudCA2Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUxIgorICAgTmFtZT0zRCJHcmlkIFRhYmxlIDYgQ29sb3JmdWwgQWNjZW50IDYiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTIiCisgICBOYW1lPTNEIkdyaWQgVGFibGUgNyBDb2xvcmZ1bCBBY2NlbnQgNiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NiIgTmFtZT0zRCJMaXN0IFRhYmxlIDEgTGlnPQoraHQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDciIE5hbWU9M0QiTGlzdCBUYWJsZSAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ4IiBOYW1lPTNEIkxpc3QgVGFibGUgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0OSIgTmFtZT0zRCJMaXN0IFRhYmxlIDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTAiIE5hbWU9M0QiTGlzdCBUYWJsZSA1IERhcj0KK2siLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTEiIE5hbWU9M0QiTGlzdCBUYWJsZSA2IENvbD0KK29yZnVsIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUyIiBOYW1lPTNEIkxpc3QgVGFibGUgNyBDb2w9CitvcmZ1bCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NiIKKyAgIE5hbWU9M0QiTGlzdCBUYWJsZSAxIExpZ2h0IEFjY2VudCAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ3IiBOYW1lPTNEIkxpc3QgVGFibGUgMiBBY2M9CitlbnQgMSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0OCIgTmFtZT0zRCJMaXN0IFRhYmxlIDMgQWNjPQorZW50IDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDkiIE5hbWU9M0QiTGlzdCBUYWJsZSA0IEFjYz0KK2VudCAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUwIiBOYW1lPTNEIkxpc3QgVGFibGUgNSBEYXI9CitrIEFjY2VudCAxIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUxIgorICAgTmFtZT0zRCJMaXN0IFRhYmxlIDYgQ29sb3JmdWwgQWNjZW50IDEiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTIiCisgICBOYW1lPTNEIkxpc3QgVGFibGUgNyBDb2xvcmZ1bCBBY2NlbnQgMSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NiIKKyAgIE5hbWU9M0QiTGlzdCBUYWJsZSAxIExpZ2h0IEFjY2VudCAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ3IiBOYW1lPTNEIkxpc3QgVGFibGUgMiBBY2M9CitlbnQgMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0OCIgTmFtZT0zRCJMaXN0IFRhYmxlIDMgQWNjPQorZW50IDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDkiIE5hbWU9M0QiTGlzdCBUYWJsZSA0IEFjYz0KK2VudCAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUwIiBOYW1lPTNEIkxpc3QgVGFibGUgNSBEYXI9CitrIEFjY2VudCAyIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUxIgorICAgTmFtZT0zRCJMaXN0IFRhYmxlIDYgQ29sb3JmdWwgQWNjZW50IDIiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTIiCisgICBOYW1lPTNEIkxpc3QgVGFibGUgNyBDb2xvcmZ1bCBBY2NlbnQgMiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NiIKKyAgIE5hbWU9M0QiTGlzdCBUYWJsZSAxIExpZ2h0IEFjY2VudCAzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ3IiBOYW1lPTNEIkxpc3QgVGFibGUgMiBBY2M9CitlbnQgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0OCIgTmFtZT0zRCJMaXN0IFRhYmxlIDMgQWNjPQorZW50IDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDkiIE5hbWU9M0QiTGlzdCBUYWJsZSA0IEFjYz0KK2VudCAzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUwIiBOYW1lPTNEIkxpc3QgVGFibGUgNSBEYXI9CitrIEFjY2VudCAzIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUxIgorICAgTmFtZT0zRCJMaXN0IFRhYmxlIDYgQ29sb3JmdWwgQWNjZW50IDMiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTIiCisgICBOYW1lPTNEIkxpc3QgVGFibGUgNyBDb2xvcmZ1bCBBY2NlbnQgMyIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NiIKKyAgIE5hbWU9M0QiTGlzdCBUYWJsZSAxIExpZ2h0IEFjY2VudCA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ3IiBOYW1lPTNEIkxpc3QgVGFibGUgMiBBY2M9CitlbnQgNCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0OCIgTmFtZT0zRCJMaXN0IFRhYmxlIDMgQWNjPQorZW50IDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDkiIE5hbWU9M0QiTGlzdCBUYWJsZSA0IEFjYz0KK2VudCA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUwIiBOYW1lPTNEIkxpc3QgVGFibGUgNSBEYXI9CitrIEFjY2VudCA0Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUxIgorICAgTmFtZT0zRCJMaXN0IFRhYmxlIDYgQ29sb3JmdWwgQWNjZW50IDQiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTIiCisgICBOYW1lPTNEIkxpc3QgVGFibGUgNyBDb2xvcmZ1bCBBY2NlbnQgNCIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NiIKKyAgIE5hbWU9M0QiTGlzdCBUYWJsZSAxIExpZ2h0IEFjY2VudCA1Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ3IiBOYW1lPTNEIkxpc3QgVGFibGUgMiBBY2M9CitlbnQgNSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0OCIgTmFtZT0zRCJMaXN0IFRhYmxlIDMgQWNjPQorZW50IDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDkiIE5hbWU9M0QiTGlzdCBUYWJsZSA0IEFjYz0KK2VudCA1Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUwIiBOYW1lPTNEIkxpc3QgVGFibGUgNSBEYXI9CitrIEFjY2VudCA1Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUxIgorICAgTmFtZT0zRCJMaXN0IFRhYmxlIDYgQ29sb3JmdWwgQWNjZW50IDUiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTIiCisgICBOYW1lPTNEIkxpc3QgVGFibGUgNyBDb2xvcmZ1bCBBY2NlbnQgNSIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0NiIKKyAgIE5hbWU9M0QiTGlzdCBUYWJsZSAxIExpZ2h0IEFjY2VudCA2Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjQ3IiBOYW1lPTNEIkxpc3QgVGFibGUgMiBBY2M9CitlbnQgNiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBQcmlvcml0eT0zRCI0OCIgTmFtZT0zRCJMaXN0IFRhYmxlIDMgQWNjPQorZW50IDYiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNDkiIE5hbWU9M0QiTGlzdCBUYWJsZSA0IEFjYz0KK2VudCA2Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUwIiBOYW1lPTNEIkxpc3QgVGFibGUgNSBEYXI9CitrIEFjY2VudCA2Ii8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFByaW9yaXR5PTNEIjUxIgorICAgTmFtZT0zRCJMaXN0IFRhYmxlIDYgQ29sb3JmdWwgQWNjZW50IDYiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgUHJpb3JpdHk9M0QiNTIiCisgICBOYW1lPTNEIkxpc3QgVGFibGUgNyBDb2xvcmZ1bCBBY2NlbnQgNiIvPgorICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPTNEImZhbHNlIiBTZW1pSGlkZGVuPTNEInRydWUiIFVuaGlkZVdoZW5Vc2VkPTNEInRyPQordWUiCisgICBOYW1lPTNEIk1lbnRpb24iLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJTbWFydCBIeXBlcmxpbmsiLz4KKyAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0zRCJmYWxzZSIgU2VtaUhpZGRlbj0zRCJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0zRCJ0cj0KK3VlIgorICAgTmFtZT0zRCJIYXNodGFnIi8+CisgIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9M0QiZmFsc2UiIFNlbWlIaWRkZW49M0QidHJ1ZSIgVW5oaWRlV2hlblVzZWQ9M0QidHI9Cit1ZSIKKyAgIE5hbWU9M0QiVW5yZXNvbHZlZCBNZW50aW9uIi8+CisgPC93OkxhdGVudFN0eWxlcz4KKzwveG1sPjwhW2VuZGlmXS0tPgorPHN0eWxlPgorPCEtLQorIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KKyBAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OiJDYW1icmlhIE1hdGgiOworCXBhbm9zZS0xOjIgNCA1IDMgNSA0IDYgMyAyIDQ7CisJbXNvLWZvbnQtY2hhcnNldDowOworCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnJvbWFuOworCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOworCW1zby1mb250LXNpZ25hdHVyZTotNTM2ODY5MTIxIDExMDczMDU3MjcgMzM1NTQ0MzIgMCA0MTUgMDt9CitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OkNhbGlicmk7CisJcGFub3NlLTE6MiAxNSA1IDIgMiAyIDQgMyAyIDQ7CisJbXNvLWZvbnQtY2hhcnNldDowOworCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOworCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOworCW1zby1mb250LXNpZ25hdHVyZTotNTM2ODU5OTA1IC0xMDczNzMyNDg1IDkgMCA1MTEgMDt9CitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OiJDYWxpYnJpIExpZ2h0IjsKKwlwYW5vc2UtMToyIDE1IDMgMiAyIDIgNCAzIDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOi01MzY4NTk5MDUgLTEwNzM3MzI0ODUgOSAwIDUxMSAwO30KKyAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLworIHAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXVuaGlkZTpubzsKKwltc28tc3R5bGUtcWZvcm1hdDp5ZXM7CisJbXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW4tdG9wOjBpbjsKKwltYXJnaW4tcmlnaHQ6MGluOworCW1hcmdpbi1ib3R0b206OC4wcHQ7CisJbWFyZ2luLWxlZnQ6MGluOworCWxpbmUtaGVpZ2h0OjEwNyU7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMS4wcHQ7CisJZm9udC1mYW1pbHk6IkNhbGlicmkiLHNhbnMtc2VyaWY7CisJbXNvLWFzY2lpLWZvbnQtZmFtaWx5OkNhbGlicmk7CisJbXNvLWFzY2lpLXRoZW1lLWZvbnQ6bWlub3ItbGF0aW47CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6Q2FsaWJyaTsKKwltc28tZmFyZWFzdC10aGVtZS1mb250Om1pbm9yLWxhdGluOworCW1zby1oYW5zaS1mb250LWZhbWlseTpDYWxpYnJpOworCW1zby1oYW5zaS10aGVtZS1mb250Om1pbm9yLWxhdGluOworCW1zby1iaWRpLWZvbnQtZmFtaWx5OkFyaWFsOworCW1zby1iaWRpLXRoZW1lLWZvbnQ6bWlub3ItYmlkaTt9CitoMQorCXttc28tc3R5bGUtcHJpb3JpdHk6OTsKKwltc28tc3R5bGUtdW5oaWRlOm5vOworCW1zby1zdHlsZS1xZm9ybWF0OnllczsKKwltc28tc3R5bGUtbGluazoiSGVhZGluZyAxIENoYXIiOworCW1zby1zdHlsZS1uZXh0Ok5vcm1hbDsKKwltYXJnaW4tdG9wOjEyLjBwdDsKKwltYXJnaW4tcmlnaHQ6MGluOworCW1hcmdpbi1ib3R0b206MGluOworCW1hcmdpbi1sZWZ0OjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbGluZS1oZWlnaHQ6MTA3JTsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW4gbGluZXMtdG9nZXRoZXI7CisJcGFnZS1icmVhay1hZnRlcjphdm9pZDsKKwltc28tb3V0bGluZS1sZXZlbDoxOworCWZvbnQtc2l6ZToxNi4wcHQ7CisJZm9udC1mYW1pbHk6IkNhbGlicmkgTGlnaHQiLHNhbnMtc2VyaWY7CisJbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiJDYWxpYnJpIExpZ2h0IjsKKwltc28tYXNjaWktdGhlbWUtZm9udDptYWpvci1sYXRpbjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiQ2FsaWJyaSBMaWdodCI7CisJbXNvLWZhcmVhc3QtdGhlbWUtZm9udDptYWpvci1mYXJlYXN0OworCW1zby1oYW5zaS1mb250LWZhbWlseToiQ2FsaWJyaSBMaWdodCI7CisJbXNvLWhhbnNpLXRoZW1lLWZvbnQ6bWFqb3ItbGF0aW47CisJbXNvLWJpZGktZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWJpZGktdGhlbWUtZm9udDptYWpvci1iaWRpOworCWNvbG9yOiMyRjU0OTY7CisJbXNvLXRoZW1lY29sb3I6YWNjZW50MTsKKwltc28tdGhlbWVzaGFkZToxOTE7CisJbXNvLWZvbnQta2VybmluZzowcHQ7CisJZm9udC13ZWlnaHQ6bm9ybWFsO30KK3NwYW4uSGVhZGluZzFDaGFyCisJe21zby1zdHlsZS1uYW1lOiJIZWFkaW5nIDEgQ2hhciI7CisJbXNvLXN0eWxlLXByaW9yaXR5Ojk7CisJbXNvLXN0eWxlLXVuaGlkZTpubzsKKwltc28tc3R5bGUtbG9ja2VkOnllczsKKwltc28tc3R5bGUtbGluazoiSGVhZGluZyAxIjsKKwltc28tYW5zaS1mb250LXNpemU6MTYuMHB0OworCW1zby1iaWRpLWZvbnQtc2l6ZToxNi4wcHQ7CisJZm9udC1mYW1pbHk6IkNhbGlicmkgTGlnaHQiLHNhbnMtc2VyaWY7CisJbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiJDYWxpYnJpIExpZ2h0IjsKKwltc28tYXNjaWktdGhlbWUtZm9udDptYWpvci1sYXRpbjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiQ2FsaWJyaSBMaWdodCI7CisJbXNvLWZhcmVhc3QtdGhlbWUtZm9udDptYWpvci1mYXJlYXN0OworCW1zby1oYW5zaS1mb250LWZhbWlseToiQ2FsaWJyaSBMaWdodCI7CisJbXNvLWhhbnNpLXRoZW1lLWZvbnQ6bWFqb3ItbGF0aW47CisJbXNvLWJpZGktZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWJpZGktdGhlbWUtZm9udDptYWpvci1iaWRpOworCWNvbG9yOiMyRjU0OTY7CisJbXNvLXRoZW1lY29sb3I6YWNjZW50MTsKKwltc28tdGhlbWVzaGFkZToxOTE7fQorLk1zb0NocERlZmF1bHQKKwl7bXNvLXN0eWxlLXR5cGU6ZXhwb3J0LW9ubHk7CisJbXNvLWRlZmF1bHQtcHJvcHM6eWVzOworCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlmOworCW1zby1hc2NpaS1mb250LWZhbWlseTpDYWxpYnJpOworCW1zby1hc2NpaS10aGVtZS1mb250Om1pbm9yLWxhdGluOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OkNhbGlicmk7CisJbXNvLWZhcmVhc3QtdGhlbWUtZm9udDptaW5vci1sYXRpbjsKKwltc28taGFuc2ktZm9udC1mYW1pbHk6Q2FsaWJyaTsKKwltc28taGFuc2ktdGhlbWUtZm9udDptaW5vci1sYXRpbjsKKwltc28tYmlkaS1mb250LWZhbWlseTpBcmlhbDsKKwltc28tYmlkaS10aGVtZS1mb250Om1pbm9yLWJpZGk7fQorLk1zb1BhcERlZmF1bHQKKwl7bXNvLXN0eWxlLXR5cGU6ZXhwb3J0LW9ubHk7CisJbWFyZ2luLWJvdHRvbTo4LjBwdDsKKwlsaW5lLWhlaWdodDoxMDclO30KK0BwYWdlIFdvcmRTZWN0aW9uMQorCXtzaXplOjU5NS4zcHQgODQxLjlwdDsKKwltYXJnaW46MS4waW4gMS4waW4gMS4waW4gMS4waW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuV29yZFNlY3Rpb24xCisJe3BhZ2U6V29yZFNlY3Rpb24xO30KKy0tPgorPC9zdHlsZT4KKzwhLS1baWYgZ3RlIG1zbyAxMF0+Cis8c3R5bGU+CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KKyB0YWJsZS5Nc29Ob3JtYWxUYWJsZQorCXttc28tc3R5bGUtbmFtZToiVGFibGUgTm9ybWFsIjsKKwltc28tdHN0eWxlLXJvd2JhbmQtc2l6ZTowOworCW1zby10c3R5bGUtY29sYmFuZC1zaXplOjA7CisJbXNvLXN0eWxlLW5vc2hvdzp5ZXM7CisJbXNvLXN0eWxlLXByaW9yaXR5Ojk5OworCW1zby1zdHlsZS1wYXJlbnQ6IiI7CisJbXNvLXBhZGRpbmctYWx0OjBpbiA1LjRwdCAwaW4gNS40cHQ7CisJbXNvLXBhcmEtbWFyZ2luLXRvcDowaW47CisJbXNvLXBhcmEtbWFyZ2luLXJpZ2h0OjBpbjsKKwltc28tcGFyYS1tYXJnaW4tYm90dG9tOjguMHB0OworCW1zby1wYXJhLW1hcmdpbi1sZWZ0OjBpbjsKKwlsaW5lLWhlaWdodDoxMDclOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTEuMHB0OworCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlmOworCW1zby1hc2NpaS1mb250LWZhbWlseTpDYWxpYnJpOworCW1zby1hc2NpaS10aGVtZS1mb250Om1pbm9yLWxhdGluOworCW1zby1oYW5zaS1mb250LWZhbWlseTpDYWxpYnJpOworCW1zby1oYW5zaS10aGVtZS1mb250Om1pbm9yLWxhdGluOworCW1zby1iaWRpLWZvbnQtZmFtaWx5OkFyaWFsOworCW1zby1iaWRpLXRoZW1lLWZvbnQ6bWlub3ItYmlkaTt9Cis8L3N0eWxlPgorPCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPG86c2hhcGVkZWZhdWx0cyB2OmV4dD0zRCJlZGl0IiBzcGlkbWF4PTNEIjEwMjYiLz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOnNoYXBlbGF5b3V0IHY6ZXh0PTNEImVkaXQiPgorICA8bzppZG1hcCB2OmV4dD0zRCJlZGl0IiBkYXRhPTNEIjEiLz4KKyA8L286c2hhcGVsYXlvdXQ+PC94bWw+PCFbZW5kaWZdLS0+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9M0RFTi1VUyBzdHlsZT0zRCd0YWItaW50ZXJ2YWw6LjVpbic+CisKKzxkaXYgY2xhc3M9M0RXb3JkU2VjdGlvbjE+CisKKzxoMT5IZWFkaW5nPC9oMT4KKworPHAgY2xhc3M9M0RNc29Ob3JtYWw+Rm9ybXVsYTo8L3A+CisKKzxwIGNsYXNzPTNETXNvTm9ybWFsPjwhLS1baWYgZ3RlIG1zRXF1YXRpb24gMTJdPjxtOm9NYXRoUGFyYT48bTpvTWF0aD48aQorICBzdHlsZT0zRCdtc28tYmlkaS1mb250LXN0eWxlOm5vcm1hbCc+PHNwYW4gc3R5bGU9M0QnZm9udC1mYW1pbHk6IkNhbWJyaWEgPQorTWF0aCIsc2VyaWYnPjxtOnI+QTwvbTpyPjxtOnI+PTNEPC9tOnI+PG06cj4mIzk2MDs8L206cj48L3NwYW4+PC9pPjxtOnNTdXA+PQorPG06c1N1cFByPjxzcGFuCisgICAgc3R5bGU9M0QnZm9udC1mYW1pbHk6IkNhbWJyaWEgTWF0aCIsc2VyaWY7bXNvLWFzY2lpLWZvbnQtZmFtaWx5OiJDYW1icmk9CithIE1hdGgiOworICAgIG1zby1oYW5zaS1mb250LWZhbWlseToiQ2FtYnJpYSBNYXRoIic+PG06Y3RybFByPjwvbTpjdHJsUHI+PC9zcGFuPjwvbTpzPQorU3VwUHI+PG06ZT48aQorICAgIHN0eWxlPTNEJ21zby1iaWRpLWZvbnQtc3R5bGU6bm9ybWFsJz48c3BhbiBzdHlsZT0zRCdmb250LWZhbWlseToiQ2FtYnJpPQorYSBNYXRoIixzZXJpZic+PG06cj5yPC9tOnI+PC9zcGFuPjwvaT48L206ZT48bTpzdXA+PGkKKyAgICBzdHlsZT0zRCdtc28tYmlkaS1mb250LXN0eWxlOm5vcm1hbCc+PHNwYW4gc3R5bGU9M0QnZm9udC1mYW1pbHk6IkNhbWJyaT0KK2EgTWF0aCIsc2VyaWYnPjxtOnI+MjwvbTpyPjwvc3Bhbj48L2k+PC9tOnN1cD48L206c1N1cD48L206b01hdGg+PC9tOm9NYXRoUD0KK2FyYT48IVtlbmRpZl0tLT48IVtpZiAhbXNFcXVhdGlvbl0+PHNwYW4KK3N0eWxlPTNEJ2ZvbnQtc2l6ZToxMS4wcHQ7bGluZS1oZWlnaHQ6MTA3JTtmb250LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1zZXJpZjsKK21zby1hc2NpaS10aGVtZS1mb250Om1pbm9yLWxhdGluO21zby1mYXJlYXN0LWZvbnQtZmFtaWx5OkNhbGlicmk7bXNvLWZhcmVhcz0KK3QtdGhlbWUtZm9udDoKK21pbm9yLWxhdGluO21zby1oYW5zaS10aGVtZS1mb250Om1pbm9yLWxhdGluO21zby1iaWRpLWZvbnQtZmFtaWx5OiJUaW1lcyBOZT0KK3cgUm9tYW4iOworbXNvLWJpZGktdGhlbWUtZm9udDptaW5vci1iaWRpO21zby1hbnNpLWxhbmd1YWdlOkVOLVVTO21zby1mYXJlYXN0LWxhbmd1YWdlOgorRU4tVVM7bXNvLWJpZGktbGFuZ3VhZ2U6QVItU0EnPjwhLS1baWYgZ3RlIHZtbCAxXT48djpzaGFwZXR5cGUgaWQ9M0QiX3gwMDAwPQorX3Q3NSIKKyBjb29yZHNpemU9M0QiMjE2MDAsMjE2MDAiIG86c3B0PTNEIjc1IiBvOnByZWZlcnJlbGF0aXZlPTNEInQiIHBhdGg9M0QibUA0QD0KKzVsQDRAMTFAOUAxMUA5QDV4ZSIKKyBmaWxsZWQ9M0QiZiIgc3Ryb2tlZD0zRCJmIj4KKyA8djpzdHJva2Ugam9pbnN0eWxlPTNEIm1pdGVyIi8+CisgPHY6Zm9ybXVsYXM+CisgIDx2OmYgZXFuPTNEImlmIGxpbmVEcmF3biBwaXhlbExpbmVXaWR0aCAwIi8+CisgIDx2OmYgZXFuPTNEInN1bSBAMCAxIDAiLz4KKyAgPHY6ZiBlcW49M0Qic3VtIDAgMCBAMSIvPgorICA8djpmIGVxbj0zRCJwcm9kIEAyIDEgMiIvPgorICA8djpmIGVxbj0zRCJwcm9kIEAzIDIxNjAwIHBpeGVsV2lkdGgiLz4KKyAgPHY6ZiBlcW49M0QicHJvZCBAMyAyMTYwMCBwaXhlbEhlaWdodCIvPgorICA8djpmIGVxbj0zRCJzdW0gQDAgMCAxIi8+CisgIDx2OmYgZXFuPTNEInByb2QgQDYgMSAyIi8+CisgIDx2OmYgZXFuPTNEInByb2QgQDcgMjE2MDAgcGl4ZWxXaWR0aCIvPgorICA8djpmIGVxbj0zRCJzdW0gQDggMjE2MDAgMCIvPgorICA8djpmIGVxbj0zRCJwcm9kIEA3IDIxNjAwIHBpeGVsSGVpZ2h0Ii8+CisgIDx2OmYgZXFuPTNEInN1bSBAMTAgMjE2MDAgMCIvPgorIDwvdjpmb3JtdWxhcz4KKyA8djpwYXRoIG86ZXh0cnVzaW9ub2s9M0QiZiIgZ3JhZGllbnRzaGFwZW9rPTNEInQiIG86Y29ubmVjdHR5cGU9M0QicmVjdCIvPgorIDxvOmxvY2sgdjpleHQ9M0QiZWRpdCIgYXNwZWN0cmF0aW89M0QidCIvPgorPC92OnNoYXBldHlwZT48djpzaGFwZSBpZD0zRCJfeDAwMDBfaTEwMjUiIHR5cGU9M0QiI194MDAwMF90NzUiIHN0eWxlPTNEJ3dpPQorZHRoOjM5cHQ7CisgaGVpZ2h0OjE0cHQnPgorIDx2OmltYWdlZGF0YSBzcmM9M0QiVGVzdF9maWxlcy9pbWFnZTAwMS5wbmciIG86dGl0bGU9M0QiIiBjaHJvbWFrZXk9M0Qid2hpPQordGUiLz4KKzwvdjpzaGFwZT48IVtlbmRpZl0tLT48IVtpZiAhdm1sXT48aW1nIHdpZHRoPTNENTIgaGVpZ2h0PTNEMTkKK3NyYz0zRCJUZXN0X2ZpbGVzL2ltYWdlMDAyLnBuZyIgdjpzaGFwZXM9M0QiX3gwMDAwX2kxMDI1Ij48IVtlbmRpZl0+PC9zcGFuPj0KKzwhW2VuZGlmXT48c3Bhbgorc3R5bGU9M0QnbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6Q2FsaWJyaTttc28tZmFyZWFzdC10aGVtZS1mb250Om1pbm9yLWZhcmVhPQorc3QnPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4gc3R5bGU9M0QnbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6Q2FsaWJyaTttc28tZmFyPQorZWFzdC10aGVtZS1mb250OgorbWlub3ItZmFyZWFzdCc+U21hcnQgQXJ0OjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4gc3R5bGU9M0QnbXNvLW5vLXByb29mOnllcyc+PCEtLVtpZiBndGUgdm1sIDFdPjx2PQorOnNoYXBlCisgaWQ9M0QiRGlhZ3JhbV94MDAyMF8xIiBvOnNwaWQ9M0QiX3gwMDAwX2kxMDI2IiB0eXBlPTNEIiNfeDAwMDBfdDc1IiBzdHlsZT0KKz0zRCd3aWR0aDo3N3B0OworIGhlaWdodDo1MnB0O3Zpc2liaWxpdHk6dmlzaWJsZScgbzpnZnhkYXRhPTNEIlVFc0RCQlFBQmdBSUFBQUFJUUJnSmpjb1hBRUFBPQorSFlFQUFBVEFBQUFXME52Ym5SbGJuUmZWSGx3WlhOZExuaHRiTFNVeTA3RE1CUkUKKzkwajhRK1F0U3R4MmdSQnEwa1ZUVmdnUWxBKzRzbTlTcTM0RTIwbWJ2OGRKVTFVOEN0bDA2Y2ZNSEYyUFBGL3NsWXdhdEU0WW5aSnAKK01pRVJhbWE0MEdWSzN0Y1A4UjJKbkFmTlFScU5LV25Sa1VWMmZUVmZ0eFc2S0tpMVM4bkcrK3FlVXNjMnFNQWxwa0lkVGdwakZmaXcKK3RDV3RnRzJoUkRxYlRHNHBNOXFqOXJIdlBFZzJ6N0dBV3Zwb3RRL2JCeEtMMHBGb2ViallaYVVFcWtvS0JqNlEwa2J6YnlueGtKQUUKK1pYL0hiVVRsYmdJR29iOG1kQ2ZuQXdiZGN4aU5GUnlqRjdEK0NWVEFvTnc2aWpPVEc1Yjg3ZEZCS2hlYm9oQU1rOXk2VmE4Nk1wM3oKKzVnSktDOHBSRGg2bUl6SytqbnZJNDRiVktndzU0UloyNFRXVlRBYmpQTmlPWnBEUW10cGZnT0t4Tng3TjhWRUx0bjN6cmNRTHNQUysKK28xR1lrY2E2QzJBc2UrUFJITVBEamdFNXRmQm5HdzcxK0RmVjdMVEZaa1FiVDFtaDhYbVF2V0p6ZEtmOXI1RjlBZ0FBLy84REFGQkwKK0F3UVVBQVlBQ0FBQUFDRUFPUDBoLzlZQUFBQ1VBUUFBQ3dBQUFGOXlaV3h6THk1eVpXeHpwSkRCYXNNd0RJYnZnNzJEMFgxeG1zTVkKK28wNHZvOUJyNlI3QTJJcGpHbHRHTXRuNjlqT0R3VEo2MjFHLzBQZUpmMy80VEl0YWtTVlNOckRyZWxDWUhmbVlnNEgzeS9IcEJaUlUKK203MWRLS09CR3dvY3hzZUgvUmtYVzl1UnpMR0lhcFFzQnVaYXk2dlc0bVpNVmpvcW1OdG1JazYydHBHREx0WmRiVUE5OVAyejV0OE0KK0dEZE1kZklHK09RSFVKZGJhZVkvN0JRZGs5QlVPMGRKMHpSRmQ0K3FQWDNrTTY2TllqbGdOZUJadmtQR3RXdlBnYjd2M2YzVEc5aVcKK09ib2oyNFJ2NUxaK0hLaGxQM3E5NlhMOEFnQUEvLzhEQUZCTEF3UVVBQVlBQ0FBQUFDRUFvY0JRS3RvR0FBQXJIUUFBRmdBQUFHUnkKK2N5OWthV0ZuY21GdGN5OWtZWFJoTVM1NGJXelVXVmx2M0VZU2ZsOGcvMkhBOS9iMGZRaVdnejZ4QnB5MXNWYXlENHNnb0lhVU5NZ00KK09TYXAyTm9nLzMyTG5FTXpPZ0o2SkNmMkMwVzJwb3VzcjY2dnFsOSsvMm01bVB4V051MjhyazR6OGdKbms3S2ExY1c4dWp6TmZqeEwKK1NHZVR0c3VySWwvVVZYbWEzWlJ0OXYycjcvN3hzcmhjbmhSNWwvOVFGK1ZpQWxLcTlnVFdUck9ycmx1ZFRLZnQ3S3BjNXUyTGVsVlcKKzhOK0x1bG5tSFR3Mmw5T2l5VCtDL09WaVNqR1cwMktlWHpiNU10c0l5WThRc2N6blZmWnErS1pWOTZidHRyZVRaZjkxcjR2VDdIZGgKK3ZKWU1HeVFpdDRqVFNKQVRWQ1Buc0hVQ0p4eHgrQ09iZERjcjBMS29aMXR4emZ1eW15enFNMWp2NVZ3MzFjbm1nOXNYaS9yWE9Yc3gKK3E1ZlRuL0xtQmxUNno3em9ydDdNMnk2RExUN3YraDJMNGZGRHV5OWhPWjgxZFZ0ZmRNUG0rdUppUGl1bjZ6OTUwL1d3aUttZWZyaWUKK3ozNXR1NXRGT1czbnk5V2lKTm5rUTdzUnUxN0pKck1qQk0vcVJkMjAwM3cySzZ1Ty9FSjdLUnV4bTdWc3NycGFGQTE0UkRaZGc5bXUKKzNqVndPKzN0dm5vSTRNUlVzQ1JaWktXSkFEQVB5QmpIRUFYWU9SWFlDRUwvT0VCMWVNWFphZmJmcy9KVDkvT2RGL1h2Z2Rma0orZDEKK2NUTzhPajladE4zN0FZNStmZFZmbXVIeXJwa3M4dDVoeXdyOStMNFhsTVBldDFYNWN0cmY5RmY0SVZ4aHo2QkF2L2FvSWhGekk1S0wKK1NFcnBFWmVjSU9NVFJkRUhLN1h6U1JpMjg1UlYzcHcxZWRVQ2hKK3F3ZEZZTXM0VEZSR3hqZ0lPeWlJdGswTXVDWUU5OWNSaWZvREQKK0ljRGo5QzZyNGwzZTVQKytyL2xZTFJraFhNbkVFS0UwSUk2RlFSWStEWVdrZE1URU81TGNUc3QyZnY1dGFrbU14Tnd4aGpEekduRnUKK2ZhK2xSRjRMNW9pWFJMaS8xaW5QUHRaSE9XV3lob05aSWlRdGd4SFh3U050TFVVMGNZMEZWMUVhdXpQWGZhYzBNZ25MUEViR1l2QnAKK0ROdGRFQUZKeGhqUjFvU0UxVmZnbEJhSEdCaU95QVlyRUEvSklCMmxSSm9Ib1dtS2hvUzQwL0srVTM0cldxcm9FL1lDVWN2QUtVMmcKK1NGUEprYkpLT3VVNGxlSXdRNnlUOFpmTGxHZFhUWGxjcmd4YVVHT0NRU0VRQThuT1crUmk0c2dUTFhTeXpDVjZXMVh2dTZWa3hpdnUKK01JSzY0UkIzd2lJVHVFQWtVaUs5b2dhTS94VzRaWFJKSjYwRllnRytFSW9aVkFTcENKSmFXc3lVc3NuZFZvVDdidm1OYUttU1lGREUKK0hRclJnVEVNNkt1VnRJZ29RNG1CUklNTkdHUERrRllORU1FTnpSb29VcjlnMjdhZXZRN2oyVmEvNlYvNUVoaFhmd1h1MlM4TUpkNVgKKzNXbUdkMjhvMnpmNVRYM2RBYzlxMTIrRkg4Ny9WLzRUbU9taWJIZkVCRmIzZjdndTh2MzNqU1F4Z29nRTlkQWk4R3JJa3c1U3BQRncKK2NUWVNuSlQwT0kzR1lCd2hHbFJlWTlBQkRkcUQ0TTM1NGpTcmdNQUM3ZHZoOHJyNDFPTnl1ekFBeGY0RXFQUHJ4YUxzWXBXZkw4cGkKKzhsc09RZ2RTdDhIbWlZQVJaNHpTTENERkdMQytKQm5TbURNa2dWd3IwUk5aZGhzYXZSYTdMKzE1ZGI5dzZ6UWpLVW0vYVExWXU4cG4KKzVWMHM4QjBpK1NkRXoxbWxsSUU0VmhwcUt2QysvdHNUaXRKeElMTWVpaUlaNi9EamlNWXh4dDYzL3Q5c2JHV3dGVTRicEpRY1NFZ0UKK3dEUkRMQWFCQ1JCRzRzVll3RWFXK21jenRwRFJKTW9kY0ltZUNVb29WMDU1VUNYYXBJSDRSaFpHTzZvZFZjQ1BNVGEwWXIzR3R5bncKK0w0dnNUWmpzbW1kb1ovYnY5enJwU0tGVmRsRCtoTkNBSk8xYlBwNENQQXJLcVlVdzBrQmY5dXJFMnd1WUlUU3p6Mm5EaTdJZG11ZmYKK1J4WWxFUCsyS1liTTJHL2QzdmRZZms3WHZtbkZRUGM5ZmFrSmhISVZnTlFrQmFRVStMY2pqQ0lTc0U3T01FK0llVlRma1hsaHAyOGMKK2w1TytwTDdqR3RpakxUcXlMRDZtNGFiZkhweHBaS2UrWldUcjlueFUzL3V3STFDcU9IZ0RFc2FDSXhpQmtRNE9Ra0FKNGduVE1GazYKK1RDSDdqajh5Wit3Y1lXUytlZ3ltNTNEOGNiejFhRWNZaWNoV1EwaU5CNkc5N3dnajI1QURSeGhINmg5MGhIRjk1dEhBak13WlcyQ0EKK0lEd0t6TWl4d1FFdzR5cnpnOEFFcTNnSUNTZ1UxUkFoMmdKejdvazBWbElZaUJmdTArTVJNakl4M0ViSU9LNitoUWxJOHdGTXp4RWgKK0FjSWY1b01NY2FJVE1FaW9DcHE2QUIyVUZFVDdZRHc1TElVd3ROdFBDaU9yMjlla01pWXdUeE13MUlUdW5JQ0prMGFhK0loQ1AweTAKK0lYSVhEMG56RTFVZTJXQnNyWHczR0o3RHl0NEhvWnozU0NVUHBxWUNob2lXY0JTMWszQnlJQndXNllBQVBGSGx6K1FBZHhQamM2ak0KK1hhQWlRUGdHRFNOaWpxT0h3VXlVMENsWnhwSUZsNC82T1ZVZTJWbHNyY3krUUN5eklLM0dNQ0xGVk1Jb0swZ05VMGlZUFVic1dmUVMKK0pwTitiOElLSUQvUnlwOVo0UG1UVlI0WS9qNnRQNy9jSlBHUFZ6V2NNYTFISkRDREdIaC9mZ0ozayt0bWZ1ODQ3c0hEcTgyWlhuOTAKK3BYY25laUN4WGQyZUVrWVF1RGtvYkZkUEVEdHAxbWQ2emV0Q1pKUGx2UHFwaEpPcW84OGRRWEU0TkFGdE40ZENXd1FHdkhaSG5LLysKK0R3QUEvLzhEQUZCTEF3UVVBQVlBQ0FBQUFDRUExaThEQkI4QkFBQmZBZ0FBRGdBQUFHUnljeTlsTW05RWIyTXVlRzFzcEpMTFRzTXcKK0VFWDNTUHhENUQxMUdpaHFveWJkVkVoZHNZRVBNUFk0c2VRWEhwZkEzek41Q0pVVlV0bmQ4VWpIUjlmZUh6NmRMVDRnb1FtK1lldFYKK3lRcndNaWpqdTRhOXZqemRiVm1CV1hnbGJQRFFzQzlBZG1odmIvWkRyS0VLZmJBS1VrRVFqL1VRRzlibkhHdk9VZmJnQks1Q0JFOUwKK0haSVRtY2JVY1pYRVFIUm5lVldXajN3SVNjVVVKQ0RTNlhGZXNuYmlhdzB5UDJ1TmtBdmJNSExMNUxpdHRpU1Zwdm10WVZXNTIyd1kKK2IvZWk3cEtJdlpHTGpyakN4Z25qNmZJZjFGRmtVWnlUdVFLbGpDQWZSelRWdVRxQlBTbGN6T2pnSDhBRlFnWDhYWGJRMmtnNEJubDIKKzRQUGNPS21JVE0rTnZZbElSZGFLYk5KSnJjZHN3NVNyTWIvamxPL0hMT2Y4TUJiTmY5VnpPVk8rL0JmdE53QUFBUC8vQXdCUVN3TUUKK0ZBQUdBQWdBQUFBaEFOSXozUGtkQVFBQVpnTUFBQmtBQUFCa2NuTXZYM0psYkhNdlpUSnZSRzlqTG5odGJDNXlaV3h6dEpOZFQ4TWcKK0ZJYnZUZndQaEh0TE96OWpSbmRoWTdMRUczWCtnQk5LV3pMZ1ZHQnEvNzI0NldJVFZyM1pKVHpoUFU5eVh1YUxENlBKbTNSZW9lVzAKK3lISktwQlZZSzl0eStySzZQN3VoeEFld05XaTBrdE5CZXJvb1QwL21UMUpEaUk5OHAzcFBZb3IxbkhZaDlMZU1lZEZKQXo3RFh0cEkKK0duUUdRank2bHZVZzF0QktOc3Z6SytaK1o5QnlsRW1XTmFkdVdaOVRzaHI2T1BudmJHd2FKV1NGWW1Pa0RZa1JyRmJRT2pDUEd5WFcKK3oySFFNb2FEYTJYZzlCdDU5cnFIUlJibEtVdDd6WTdnOVFBRGJrTENTVy9CcEU5eEJKOEtBaVJzNm5nOTZYSjV3TVVvNGRCakV6S0IKK2h1M1c5YldtNjNFVGZ0WlVPWGlQUFV3WjdNaWt4TVVCaVVRcC8xMmNPOVRvZkVKSWJNSGVoNDErUi9rSkFBRC8vd01BVUVzREJCUUEKK0JnQUlBQUFBSVFCSzBMZUIyUUFBQUFVQkFBQVBBQUFBWkhKekwyUnZkMjV5WlhZdWVHMXNUSTVOVDhNd0RJYnZTUHlIeUVqY1dNSmcKK2dFclRpYTlka1NnZ3hDMXJ2TGJRT0tWT3QvTHY4YmpBeGJMMXZucjg1TXNwZEdxTEE3ZVJMSnpPRENpa0t2cVdhZ3N2ejZ1VEsxQ2MKK0hIblhSVUlMMzhpd0xBNFBjcGY1dUtNbjNKYXBWZ0loenB5RkpxVSswNXFyQm9QaldleVJKTnZFSWJnazUxQnJQN2lkd0VPbjU4WmMKKzZPQmFrZytONi9HdXdlcXpISU1GTTY3SysvWVdIOFpOT1g5OS9HRCtlbjlqYTQrUHBwdHJVQW1uOUZlR3ZiNm9ReUZPNnppU1o5VUoKK1EzcS9jNTh0emhlZzFyS1lzMHZRUmE3LzJ4Yy9BQUFBLy84REFGQkxBd1FVQUFZQUNBQUFBQ0VBQThDaVBCRUVBQURmUVFBQUdBQUEKK0FHUnljeTlrYVdGbmNtRnRjeTlqYjJ4dmNuTXhMbmh0Yk95Y1hVL2JNQlNHN3lmdFAwUytIMmtaSUZZUkVCK3JoSVRRcExIcnlVMmMKK05NSnhNdHVGOHU5bk81L3RvS1d4dXpURjNKUW15ckh6NVBqMThmRkp6eTdtQ1hhZUVHVnhTand3UEJnQUJ4RS9EV0lTZWVEWHcvakwKK0tYQVloeVNBT0NYSUF5K0lnWXZ6ejUvT2dpZ1orU2xPS2J0Qm9TT3NFRFlTeHp3dzVUd2J1Uzd6cHlpQjdDRE5FQkZudzVRbWtJdXYKK05ISURDcCtGL1FTN2g0UEJpUnZFTUtJd0FZVVIyTUpFQW1NQ25CbUovOHpRYmVDQkdTV2pKUFpweXRLUUgvaHA0cVpoR1B1bytJQ1UKK3k2YVAzVk0zdndVWCtqNGlmUGo3RUp5ck8rTXh4OGg1Z3RnRHdNMFBCWWo1aTBkOHlPOFl6OCtLL3gzK2tnbENoU25nWkRRV1JJZWkKK0lXbkNWY0FhVnpEK2d0SGRCRHNFSnVJeWtnWm9VTFFleGhoZll5cU1Pd25pVXc5UWxDSEl4Vms0VWx5Uk9KdjNwV3l0YktHK05POFgKK2pzazdMV0UrclBwWlhaVWJRV0dJZko3YktXancrVjFwdVRveXJycGRIZnErZUtXQ1VONTRicnY4Vm1DQU9JN0l2V0F4N0pMRk10WHUKK2VFaTM2QlRGYnJnRjd0NG5kZ1BFRXlLNktLU0tRSnhOWWE0Z3h3UHhwMForUTF3S3ZlcTdtc2pSVTBwNmZTOGZUbFFsaHE5ZDZ1bHUKK2pCMko0Y2hpQ0tQYkpQcUJvYTh6c1VnUjRUSGhmZEdRdFdPKzZhSjhYb2N5ZVpUQzUrMGlHVXY2MzVEVk9PbUpkZWhYVmdiR01iTjQKKzhrQWhZWWMzR2dIcG9tNmNiQ1gyS0tQMzk3ZlZYWHdmUmo4dFZyWFVyZGFNdGZaV2h6WVczNG5GV3F6N0s0WW1zSllTTU5TUkFORWoKK2xRZW9BL0pOVXhYbEFDOHQ2UTdmdGNFQm45ZTVFU1BCZ1E4eFRtY3lveVBUUWpXSnRUMVp2dlg2MHJZUUYxVnkxV3F3ZjVnaFk5d20KKzFZREVvREZubDhPc3ZhODFZeEZkTDZvRWJlTkpRV0t3MlFEbERUWWJvRERZYkFESUlMMmUycmhlN0xWVXdqS3U5akhXVHNkTllUTVMKK0dEUWZSNmRhdFJ4bzZNcDJ0eWc3MWJ2OVF0bXBadTRUeWgxWlJLblUwUlFHeFhiM3FwVE0xalhBK0Rxcmx0UGh6VTdJNlllaHZST0sKK3UwVDdkRVc2c2QrK3ZST2l2TmUwdytqUzkxc3NvbVdFS01FMGR0eS9yWEREOW12cy96NDFCbyttazJJcEdWdktTd1ZleGltckNpdnIKK3k3SThzUzZqTTA2WjAwdFp5V2FNODVIVmpEekJ2VlF2T0xHQ3NXM0JZQ21PQXgxaDFzOGY5Mzl1VXhBMUpjRnk5SURpZUtVeDZDMUUKK0Q2aFlkcHlLTGNqbmU3MzY0cmNpMjJaeDJIYW5MdDBlYkgzZFp6eTBLQU00K3dCVkdVSC9IcUNLV2V6VDYrblRVK0xab3FqQUpnTGsKK0MwM2w5RnVHOGE4RzlRcHhpM1N0UmJ3WjRoWTVXb3Q0TThRdEVyTVc4YnNSaXpMUGFkYStpRTdHanZWTEROdU5VMHZoNjErNEVqeGUKKzZXTm05UTdqcWwyWUhxVy81VEF0SDZxUjBnOU9EWEN1M2JtcTVGelllOWdUSnpjT1g5VGhtMU9TVlh2bzdUMjhlYy85VXhHS25oN20KK20wdjFLNU9oK1pkVjVSSjlLWS93VmlOYkI2OVhBcUhXVlBsdkdvaWZaVGovQ3dBQS8vOERBRkJMQXdRVUFBWUFDQUFBQUNFQVdjdWsKK210c0RBQUFOVVFBQUhBQUFBR1J5Y3k5a2FXRm5jbUZ0Y3k5eGRXbGphMU4wZVd4bE1TNTRiV3pzbk4xTzJ6QVV4KzhuN1IwaTM0KzAKK3NFMm9Ja1Y4cUJJU1FvaXhCM0FkSjdWdzdHQzdVTjUrdHBPbVRHS2lvWVE1NGR5MGFacmoxUDdaNXh6LzdmVG9lRlh3NklFcXphUkkKKzBIaHZoQ0lxaUV5WnlCUDArM2IyN1JCRjJtQ1JZaTRGVGRBVDFlaDQrdlhMVVpvWEUyMmVPRDJuV1dRTEVYcGlUeVZvWVV3NWlXTk4KK0ZyVEFlaytXVk5odk02a0tiT3hIbGNlcHdvKzIrSUxIKzZQUnp6aGxPRmU0UUhVaCtBMUZGSmdKRkMwRnUxL1NpelJCU3lVbUJTTksKK2FwbVpQU0tMV0dZWkk3Uit3OHE0Vy8rSUQrUDdKU04zdmhxeFprWEo2UmhOZmRVTU01eEdENWduQ01YVnFaUnE4dmNaZ3MybE50VzMKKzlqZ3lUNlZ0b3FvZ0ZKV0syUllkalVjalYwTHNHdXk1Z1NaVTBJTjBlb1R0NllJcWJBMjBTWkJVWmlGdGk1UUxSbVpLQ3VPczhZU3oKK2ZHRnVXQjRwWnNtWWhhTDAycUFvWmNwK2FtN1FGTnJndVp6elNOanlFeVJrU2tkMTlacnJ1cnQ1ZVpEV0RXZFcxNm8rOUUzdHF5TnUKK2JMOWg2U3BCKy9ZMzRZa21LcCtmY1JYWit0aE9hT3RvWCtmdTFUV2VyYjh6Y0JkbWpQUEcxdUY2M2JZMmNaZlNMS1BFTlBhdVBWNjMKK2I0ejgvUzJTeHI1Z1FxcTZETnZocWF1QTd6VGNqT3NmbmxYWDF6MmdiZ0RmRy95eDVWTjFvUFdubWhZWFY1Ylh1anNDcjZxdmhNdnIKK2dRb2c5cEVqekt4MkhHSFl1bFJBOXBISWRuYUtMb1NCUyt4TENITzBYSEQzdVVqMzJRNGtIRldtOU1hRXc5RTZBRm85U1E4ZHJlOUEKK3F5ZTBzdnlpeUs4NUpoQzltcm5VZXliMHp2RTFNOTdueC8rYVhmbmNENWpVVStvd21NeGhrRGhobzdPRXZQVWcwV3grcTdEUSsrY2gKKzV0emJTUUdmVFRiSzhsOUFyZE5oNU1hblY3ZmZVZXliQTdWSzFlM00rWFZCYmUwZngwSDZ4KzJrOFpmOTQzYSt0V3RadlhYQUlwaHoKK3VUUXdMZXBnV3RRYUJ0YmF1SDRFNnM5bXVXaTdjZFdrNDg1cDFXcE9OVnZxYnJuSjBRb3h5NFBGd2MxSysyWXAxOUVDWmJVdk9yaWoKK0JjcHFuMmlCc3RvWFdpVldaNHVBVlFxSVh5L0ZyK2ZVSUk3MWNheEJQT3NqTlloci9hTVdwcnEwUzF6YmJoWWNuTHEwQ1Zyajg2RUYKK3JRRWdHVnBFR2dDU29ZV2JuaUxKOGhOQ1FOenJJdlMzVnNXSkZEUEEwZFdER0sxeCtIMUFNRG82ZWk2bU5RNmpUdHltL0VDQjdMS2kKK3VwMXRjRG52SEh4Vk1MNUtTODVTQ0I2ZGJSRnA3YTA4a0pBZDFpNlQ5SjQ2TE0va0ZMeFdNRjdMVHo1bTBtN01lYnlDcDdkQ1NiVFcKK2VTK0E4UStUaHhOVGZNSUZWQUtqNHAyWVUzOWdNOXQ3YjJacm5YVjVGa1BUMzN1YWJYa1dReFBlKzh4aWFJcDdUMW5ZNXprV1pZRGgKK1lyc0ZqSmVmQ2VncGl2VHVGR0NFTXUwd0NtQUVORE1QMDBsOVF0VkswWWZiMWNEaXhYYXg1dit1ZUd6K05NRCtpK0gwRHdBQUFQLy8KK0F3QlFTd01FRkFBR0FBZ0FBQUFoQUw1L2M3R1BBd0FBaWdvQUFCZ0FBQUJrY25NdlpHbGhaM0poYlhNdmJHRjViM1YwTVM1NGJXekUKK1ZrMXYyemdRdlJmb2Z4and2cmFjTmtGaFZPa2xUYmRBNmg3aTdwNHBjV1J4bHg4cVNjVjJmLzJPU01wU05pNFFCQ2g2TVVSbDVuSG0KK3pYdWp2UDl3MEFvZTBIbHBUY2xXaTRJQm10b0thWFlsKzdhOS9lTWRBeCs0RVZ4Wmd5VTdvbWNmcmwrL2VpOTJlcTM0MGZiaEJoc2cKK0ZPUFg5SzVrYlFqZGVybjBkWXVhKzRYdDBOQmZHK3MwRDNSMHU2VndmRS80V2kwdml1SnFLU1RmT2E1WkJ1RXZnTkJjR2dhOWtkOTcKKy9DeEsxanV6enJCK29leS84czJpdG5yNUYzZEh1dmh2S1VKN0ozMWcxN0dOSUlOQ2VPQ3FaRGtDWWdqRW1HVUtFdWpyRlBQTkkxQTcKK2dMcHJ1WmMvQ0JGa1FPM0JOaUJrMDZCREUyQ1BjdGRTeHdDZnJCVXhRM0czUStEYTlpYkU2RHQ4UUFVckNIZ0lGTGh0RWZaRGNRTVMKKzhyb0YzL0lPUVhxUVJpQXhLUWhaSFVGZ1FLZWxRUUVWOS9SckRaWGdFdzdMRmRjODNQbVFxcWRuQ01lT0JxaUd2cUZ6c21SdlYxZkYKK0xEZ0gyS2FSTlZxakNENEhYaFpGREZ3T1E1L0RlcTY3R3g0NDlCNUpCaVNnVEttZ2wxK3NRSld1NzRaS2NsblZMai9zVzZ1UW5pUHEKK0xDR2VSK1NVNzhOUjRTKzZhSVRPUkNuM2ErNnBFM0M2SlJsblF3U0I0WnFtc3FIZkluUDN3TjFwYmc1SllQZ24rVStoSDdtYUIzQzEKK093M1daSUNPazUybXR6ZlNzYVRjeGxtOUhTWWVLYWJVekc0VVdiS3dlNDc3a2tSdWJOMXIwbU55c1VQRkF5MFIzOHJPTTNEclNzbXUKK1pMa2tMdjVKQ2tqREhTNU1kM2ZVNGRjbUs2S205REExbjQ2NWtUMGJMRlN5dW8wUEEyRWxHM3lUZTd1WXBCeFJjbHFLUHB2bXNObEcKK1M3UW5FOHd6eVNMNjFwcHcvK1BuTjF2cUVMLzN1WVNyeTdOQVowdndIYS9KWHJNYW9PRjFLRm14S0NKTUpPcC9oQkFCSDRldE1HbG0KK3hZQWZwRS85ZFNIMVkwaFhtZmNuUWt1TVJUL2RWYlR3aHRqUnRITmRWYjFTR0Q0YVhpbGFMM0Uzcms3S21RZE9BZ3lIc2YyMHRkSysKK2NWalRpSDZudURKRHRNQy91bnRVRFMyMU9WSFAwRjc0UW90N05xeEgwc2hUdXhpYmY2VGE2c1daNnNXWjdybVo1eVRtZW9YVDlxSEQKK1pMOG9ncytiVzdKRDdIbkROd3cwUHd6YmF6TjJQK1RubERsTE1mZnlwNW14a3RQVjhUUXBOeS9tMWxyNjhFN1N2OGdTbDgzczVadlIKK0Q3UURZVmdWNDZpRnJTSDZBcHJlMU9RWFE2b2M3THNMWk1OWTNnajQxR1Z2UjlUR0ttWDM5N0thZ0wyc3RvNGJXbmtFT1gwQXAvSnoKK2RjbndxWmZKTTc0YmlVdWUrWjArR2I4TFUrbjVRNUVKeVNmWnBDWlFQUnJIYkduRlNaM05mUUtkWHRDL0R0Zi9BUUFBLy84REFGQkwKK0F3UVVBQVlBQ0FBQUFDRUEvL0pVWU5ZREFBQzhFd0FBR1FBQUFHUnljeTlrYVdGbmNtRnRjeTlrY21GM2FXNW5NUzU0Yld6c1dGdUwKKzJ6Z1VmaS9zZnpCNjk4UjJuTmdPazVUY1hBcERPelFwN0t0aXk0bFpYVnhKeVdTNjdIL3ZrZVJjdTlBcEEvTlE4dUxvY2k3ZnVhUGMKK3Y5OHo2dTJJVkxYZ1F4VGVCY2dqdkJCbHpkZEQ5SFdaK3lueWxNYTh4RlJ3TWtUUFJLSDNvNy9lM1plcUdaUVNQd0doQnpLNEdwUnIKK05rUWJyWnRCcDZPS0RXRlkzWW1HY0xpdGhHUll3MWF1T3kwVG81MG9DUHFkc3NacmlSazZDRkhOVDBKWVhVaWhSS1h2Q3NFNm9xcnEKK2doekVHQ0hwdFJEOGs0aGY0MkM0NW1oa3pWTE5VaExpMW56M1FUYUw1bEc2YmZGcDl5aTl1aHdpY0JUSEREeUNPc2VybGhRT09zWTkKK1Y3eHJKNmdsVjQzSFJFbm9SNUQxYnkvczVWRTBHL3RSbGszOWVOS2IrZGtVUHBQeFBBenlwRDhOOHY1L0xUcStleWtjUTNmQ2N1SlMKKzFodzgyRmVTamU3eEFEenE3U0g0M1NDS3dLem5JWUtWTVFzUHlGNTdCZHdsNE9ZQTdncTRETE9zRjluN3prbEdJNVgrUUFUenpHS0kKK0pDazA0TVVEdkh0UTJvREFnd09KT1ZhQzFtVmVVMm8zSmxuSWxFcHZoK2tRNGFJZ1hJZVdmYk1sbndHZFBROGNKSVgxOVJIZHN1c2oKK1RKc052andFQ0RZdGpTWUw2QUlFNWQ0VDJCWWwxa3dNV1ZoUnJNRmkxa0NFRkY4akQ5TTExRWlocFlWMndYMFU3S0RTTjRkdm5EdkQKK2F1UDBXMnpPWGF6V1JIcTBodHBNVFF5dEY4RVZsTnY0VmhWRXFnMlJ5Vm1YRzNhbG55a1VnYUg4UWlySWVVaUR5RmxleVBYS2hFdmEKK01vQkdBWm14TWw4WGFNdGdPQ3NJOEpIWEJWVDlncmRsT1dFNzhnY3YwazJzUWNCazlRdXVqL3lzNXFLTjNHVyttV0E1NEpXamI4dFgKK09RY1lYK2o5UkpUUFJ1UUtmcUVEcUtiSWEzRDVBMWI2RVV0b09PQUNhS09RK2hzaHZ5UHZTWm9VVXQrMldCTGswWTljZ2ZkNnNVa3UKK2ZiNlI1NXZWK1ladjJWUkFPWVRRZ0p2Q0xTRTdJUTE1QVRwY0lyYWJxYmFoTUFDNUdHKzFxT3EyNkJ4ZWMwR1ZYaGlMYkYwMzVnVGEKK2dNZXdmTERnNlE1MGdmU2FsMUI5ZG5uS2Q2OGsxUkt2RnQrSEtJN2pIbGhoSmZKRlU1Z0Y0SHNzdEV1OTdDTEhUZ1FURjVKejBrTysKK3dObnBkbHpwYTVGZFVIaEcyMUtzdHA5Z0lyV3R4ZlJuUEhBZnNJcGlNNzRJOTc4dXdIdUFPalFTdkgrSU5FTU9lcG1yRFQzNnpJbHAKK1RhQVN2c0FPWDNDTjdkNkhtTHY0Ly8zcVhua3V4eXBRb01rVzJ2a2ttRS9HU1pKa29kOVAwc0NQNTBIc3AwR2MrL1ArSk80bXMra3MKK0Q4SzNuQVJSa0tXQnJZL2JNTGdOZzlzd3VBMEQ5TWNPZytXVGVPMHcrSTEyK2JKNTBPdlBzenlLSjM0YVQxTS83b2VaUDBtbW1aL00KK3gza2Fqb041ZDlaOXkza1FoeG04VWR6NHZEME9ibytEMitQZzlqajRVeDhIeXczOERmVGFpZkFiRGZOL0owTDdWSEQvU05sTit3ZmEKKzZBY0FBQUQvL3dNQVVFc0JBaTBBRkFBR0FBZ0FBQUFoQUdBbU55aGNBUUFBZGdRQUFCTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFGdEQKK2IyNTBaVzUwWDFSNWNHVnpYUzU0Yld4UVN3RUNMUUFVQUFZQUNBQUFBQ0VBT1AwaC85WUFBQUNVQVFBQUN3QUFBQUFBQUFBQUFBQUEKK0FBQ05BUUFBWDNKbGJITXZMbkpsYkhOUVN3RUNMUUFVQUFZQUNBQUFBQ0VBb2NCUUt0b0dBQUFySFFBQUZnQUFBQUFBQUFBQUFBQUEKK0FBQ01BZ0FBWkhKekwyUnBZV2R5WVcxekwyUmhkR0V4TG5odGJGQkxBUUl0QUJRQUJnQUlBQUFBSVFEV0x3TUVId0VBQUY4Q0FBQU8KK0FBQUFBQUFBQUFBQUFBQUFBSm9KQUFCa2NuTXZaVEp2Ukc5akxuaHRiRkJMQVFJdEFCUUFCZ0FJQUFBQUlRRFNNOXo1SFFFQUFHWUQKK0FBQVpBQUFBQUFBQUFBQUFBQUFBQU9VS0FBQmtjbk12WDNKbGJITXZaVEp2Ukc5akxuaHRiQzV5Wld4elVFc0JBaTBBRkFBR0FBZ0EKK0FBQWhBRXJRdDRIWkFBQUFCUUVBQUE4QUFBQUFBQUFBQUFBQUFBQUFPUXdBQUdSeWN5OWtiM2R1Y21WMkxuaHRiRkJMQVFJdEFCUUEKK0JnQUlBQUFBSVFBRHdLSThFUVFBQU45QkFBQVlBQUFBQUFBQUFBQUFBQUFBQUQ4TkFBQmtjbk12WkdsaFozSmhiWE12WTI5c2IzSnoKK01TNTRiV3hRU3dFQ0xRQVVBQVlBQ0FBQUFDRUFXY3VrbXRzREFBQU5VUUFBSEFBQUFBQUFBQUFBQUFBQUFBQ0dFUUFBWkhKekwyUnAKK1lXZHlZVzF6TDNGMWFXTnJVM1I1YkdVeExuaHRiRkJMQVFJdEFCUUFCZ0FJQUFBQUlRQytmM094andNQUFJb0tBQUFZQUFBQUFBQUEKK0FBQUFBQUFBQUpzVkFBQmtjbk12WkdsaFozSmhiWE12YkdGNWIzVjBNUzU0Yld4UVN3RUNMUUFVQUFZQUNBQUFBQ0VBLy9KVVlOWUQKK0FBQzhFd0FBR1FBQUFBQUFBQUFBQUFBQUFBQmdHUUFBWkhKekwyUnBZV2R5WVcxekwyUnlZWGRwYm1jeExuaHRiRkJMQlFZQUFBQUEKK0NnQUtBSnNDQUFCdEhRQUFBQUE9M0QKKyI+CisgPHY6aW1hZ2VkYXRhIHNyYz0zRCJUZXN0X2ZpbGVzL2ltYWdlMDAzLnBuZyIgbzp0aXRsZT0zRCIiIGNyb3BsZWZ0PTNEIi05NTI9Cis4ZiIKKyAgY3JvcHJpZ2h0PTNEIi05OTY4ZiIvPgorIDxvOmxvY2sgdjpleHQ9M0QiZWRpdCIgYXNwZWN0cmF0aW89M0QiZiIvPgorPC92OnNoYXBlPjwhW2VuZGlmXS0tPjwhW2lmICF2bWxdPjxpbWcgd2lkdGg9M0QxMDMgaGVpZ2h0PTNENjkKK3NyYz0zRCJUZXN0X2ZpbGVzL2ltYWdlMDA0LnBuZyIgdjpzaGFwZXM9M0QiRGlhZ3JhbV94MDAyMF8xIj48IVtlbmRpZl0+PC9zcD0KK2FuPjwvcD4KKworPHAgY2xhc3M9M0RNc29Ob3JtYWw+Q2hhcnQ6PC9wPgorCis8cCBjbGFzcz0zRE1zb05vcm1hbD48c3BhbiBzdHlsZT0zRCdtc28tbm8tcHJvb2Y6eWVzJz48IS0tW2lmIGd0ZSB2bWwgMV0+PHY9Cis6c2hhcGUKKyBpZD0zRCJDaGFydF94MDAyMF8yIiBvOnNwaWQ9M0QiX3gwMDAwX2kxMDI1IiB0eXBlPTNEIiNfeDAwMDBfdDc1IiBzdHlsZT0zRD0KKyd3aWR0aDo0MzNwdDsKKyBoZWlnaHQ6MjUzcHQ7dmlzaWJpbGl0eTp2aXNpYmxlJyBvOm9sZT0zRCIiPgorIDx2OmltYWdlZGF0YSBzcmM9M0QiVGVzdF9maWxlcy9pbWFnZTAwNS5wbmciIG86dGl0bGU9M0QiIi8+CisgPG86bG9jayB2OmV4dD0zRCJlZGl0IiBhc3BlY3RyYXRpbz0zRCJmIi8+Cis8L3Y6c2hhcGU+PCFbZW5kaWZdLS0+PCFbaWYgIXZtbF0+PGltZyB3aWR0aD0zRDU3NyBoZWlnaHQ9M0QzMzcKK3NyYz0zRCJUZXN0X2ZpbGVzL2ltYWdlMDA2LnBuZyIgdjpzaGFwZXM9M0QiQ2hhcnRfeDAwMjBfMiI+PCFbZW5kaWZdPjwvc3Bhbj0KKz48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8bzpPTEVPYmplY3QgVHlwZT0zRCJFbWJlZCIgUHJvZ0lEPTNEIkV4Y2VsLkNoYXJ0LjgiIFNoYXBlSUQ9M0QiQ2hhcnRfeDAwMj0KKzBfMiIKKyAgRHJhd0FzcGVjdD0zRCJDb250ZW50IiBPYmplY3RJRD0zRCJfMTU3NjcyNTQwMCI+CisgIDxvOldvcmRGaWVsZENvZGVzPlxzPC9vOldvcmRGaWVsZENvZGVzPgorIDwvbzpPTEVPYmplY3Q+Cis8L3htbD48IVtlbmRpZl0tLT48L3A+CisKKzwvZGl2PgorCis8L2JvZHk+CisKKzwvaHRtbD4KKworLS0tLS0tPV9OZXh0UGFydF8wMUQzODZCNy5FMDVGODU5MAorQ29udGVudC1Mb2NhdGlvbjogZmlsZTovLy9DOi8yNjdCQTJENC9UZXN0X2ZpbGVzL3RoZW1lZGF0YS50aG14CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZXRoZW1lCisKK1VFc0RCQlFBQmdBSUFBQUFJUURwM2crLy93QUFBQndDQUFBVEFBQUFXME52Ym5SbGJuUmZWSGx3WlhOZExuaHRiS3lSeTA3RE1CQkYKKzkwajhnK1V0U3B5eVFBZ2w2WUxIanNlaWZNREltU1FXeWRpeXAxWDc5MHpTVkVLb0lCWnNMTmt6OTU0NzQzSzlId2UxdzVpY3AwcXYKKzhrSXJKT3NiUjEybDN6ZFAyYTFXaVlFYUdEeGhwUStZOUxxK3ZDZzNoNEJKaVpwU3BYdm1jR2RNc2oyT2tISWZrS1RTK2pnQ3l6VjIKK0pvRDlnQTdOZFZIY0dPdUprVGpqeVVQWDVRTzJzQjFZUGU3bCtaZ2s0cEMwdWo4MlRxeEtRd2lEczhDUzFPeW8rVWJKRmtJdXlya24KKzlTNmtLNG1oelZuQ1ZQa1pzT2hlWlRYUk5hamVJUElMakJMRHNBeUpYODluSUJrdDVyODdub25zMjlaWmJMemRqcktPZkRaZXpFN0IKKy94Umc5VC9vRTlQTWYxdC9BZ0FBLy84REFGQkxBd1FVQUFZQUNBQUFBQ0VBcGRhbjU4QUFBQUEyQVFBQUN3QUFBRjl5Wld4ekx5NXkKK1pXeHpoSS9QYXNNd0RJZnZoYjJEMFgxUjBzTVlKWFl2cFpCREw2TjlBT0VvZjJnaUc5c2I2OXRQeHdZS3V3aUVwTy8zcVQzK3JvdjUKKzRaVG5JQmFhcWdiRDRrTS95MmpoZGoyL2Y0TEpoYVNuSlFoYmVIQ0dvM3ZidFYrOFVOR2pQTTB4RzZWSXRqQ1ZFZytJMlUrOFVxNUMKK1pOSEpFTkpLUmRzMFlpUi9wNUZ4WDljZm1KNFo0RFpNMC9VV1V0YzNZSzZQcU1uL3M4TXd6SjVQd1grdkxPVkZCRzQzbEV4cDVHS2gKK3FDL2pVNzJRcUdXcTFCN1F0Ymo1MXYwQkFBRC8vd01BVUVzREJCUUFCZ0FJQUFBQUlRQnJlWllXZ3dBQUFJb0FBQUFjQUFBQWRHaGwKK2JXVXZkR2hsYldVdmRHaGxiV1ZOWVc1aFoyVnlMbmh0YkF6TVRRckRJQkJBNFgyaGQ1RFpOMk83S0VWaXNzdXV1L1lBUTV3YVFjZWcKKzBwL2IxK1hqZ3pmTzN4VFZtMHNOV1N5Y0J3MktaYzB1aUxmd2ZDeW5HNmphU0J6RkxHemh4eFhtNlhnWXliU05FOTlKeUhOUmZTUFYKK2tJV3R0ZDBnMXJVcjFTSHZMTjFldVNScVBZdEhWK2pUOXluaVJlc3JKZ29DT1AwQkFBRC8vd01BVUVzREJCUUFCZ0FJQUFBQUlRQzIKKzlHZVlrd2NBQU1rZ0FBQVdBQUFBZEdobGJXVXZkR2hsYldVdmRHaGxiV1V4TG5odGJPeFp6WXNieVJXL0IvSS9OSDJYOWRXdGo4SHkKK29rL1Ayak8yc1dTSFBkWklwZTd5VkhlSnF0S014V0lJM2xNdWdjQW01SkNGdmUwaGhDenN3aTY1NUk4eDJDU2JQeUt2cWx2ZFZWTEoKK25oa2NNR0ZHTUhTWGZ1L1ZyOTU3OWQ1VDFkM1BYaWJVdThCY0VKYjIvUHFkbXUvaGRNNFdKSTE2L3JQWnBOTHhQU0ZSdWtDVXBiam4KK2I3RHdQN3YzNjEvZFJVY3l4Z24yUUQ0VlI2am54MUt1anFwVk1ZZGhKTzZ3RlU3aHV5WGpDWkx3eXFQcWdxTkwwSnZRYXFOV2ExVVQKK1JGTGZTMUVDYWg4dmwyU092WmxTNmQvYktoOVRlRTJsVUFOenlxZEtOYllrTkhaeFhsY0lzUkZEeXIwTFJIcyt6TE5nbHpQOFV2b2UKK1JVTENGejIvcHYvODZyMjdWWFNVQzFGNVFOYVFtK2kvWEM0WFdKdzM5Snc4T2lzbURZSXdhUFVML1JwQTVUNXUzQjYzeHExQ253YWcKKytSeFdtbkd4ZGJZYnd5REhHcURzMGFGNzFCNDE2eGJlME4vYzQ5d1AxY2ZDYTFDbVA5akRUeVpEc0tLRjE2QU1IKzdodzBGM01MTDEKK2ExQ0diKzNoMjdYK0tHaGIralVvcGlROTMwUFh3bFp6dUYxdEFWa3lldXlFZDhOZzBtN2t5a3NVUkVNUlhXcUtKVXZsb1ZoTDBBdkcKK0p3QlFRSW9rU1QyNVdlRWxta01VRHhFbFo1eDRKeVNLSWZCV0tHVUNobXVOMnFUV2hQL3FFK2duN1ZGMGhKRWhyWGdCRTdFM3BQaDQKK1lzN0pTdmI4QjZEVk55QnZmLzc1emVzZjM3eis2YzFYWDcxNS9mZDhicTNLa2p0R2FXVEsvZkxkSC83enpXKzlmLy93N1M5Zi96R2IKK2VoY3ZUUHk3di8zdTNULysrVDcxc09MU0ZHLy85UDI3SDc5LysrZmYvK3V2WHp1MDl6azZNK0V6a21EaFBjS1gzbE9Xd0FJZC9QRVoKK3Y1N0VMRWJFbE9pbmtVQXBVck00OUk5bGJLRWZiUkJGRHR3QTIzWjh6aUhWdUlEMzF5OHN3dE9ZcnlWeGFId1lKeGJ3bERFNllOeHAKK2hZZHFMc1BNczNVYXVTZm5heFAzRktFTDE5eERsRnBlSHE5WGtHT0pTK1V3eGhiTkp4U2xFa1U0eGRKVDM3RnpqQjJyKzRJUXk2Nm4KK1pNNlpZRXZwZlVHOEFTSk9rOHpJbVJWTnBkQXhTY0F2R3hkQjhMZGxtOVBuM29CUjE2cEgrTUpHd3Q1QTFFRitocWxseHZ0b0xWSGkKK1VqbERDVFVOZm9KazdDSTUzZkM1aVJzTENaNk9NR1hlZUlHRmNNazg1ckJldytrUEljMjQzWDVLTjRtTjVKS2N1M1NlSU1aTTVJaWQKK0QyT1VyRnpZS1VsakUvdTVPSWNRUmQ0VEpsM3dVMmJ2RVBVT2ZrRHBRWGMvSjloeTk0ZXp3VFBJc0NhbE1rRFVOMnZ1OE9WOXpLejQKK25XN29FbUZYcXVuenhFcXhmVTZjMFRGWVIxWm9uMkJNMFNWYVlPdzkrOXpCWU1CV2xzMUwwZzlpeUNySDJCVllENUFkcStvOXhRSjYKK0pkWGM3T2ZKRXlLc2tKM2lpQjNnYzdyWlNUd2JsQ2FJSDlMOENMeHUybndNcFM1eEJjQmpPajgzZ1k4STlJQVFMMDZqUEJhZ3d3anUKK2cxcWZ4TWdxWU9wZHVPTjF3eTMvWFdXUHdiNThZZEc0d3I0RUdYeHRHVWpzcHN4N2JUTkQxSnFnREpnWmdpN0RsVzVCeEhKL0thS0sKK3F4WmJPK1dXOXFZdDNRRGRrZFgwSkNUOVlBZTAwL3VFLzd2ZUJ6cU10My81eHJFUFBrNi80MVpzSmF0cmRqcUhrc254VG45ekNMZmIKKzFRd1pYNUJQdjZrWm9YWDZCRU1kMmM5WXR6M05iVS9qLzkvM05JZjI4MjBuYzZqZnVPMWtmT2d3Ymp1Wi9IRGw0M1F5WmZNQ2ZZMDYKKzhNZ09ldlN4VDNMdzFHZEpLSjNLRGNVblFoLzhDUGc5czVqQW9KTFRKNTY0T0FWY3hmQ295aHhNWU9FaWpyU014NW44RFpIeE5FWXIKK09CMnErMHBKSkhMVmtmQldUTUNoa1I1MjZsWjR1azVPMlNJNzdLelgxY0ZtVmxrRmt1VjRMU3pHNGFCS1p1aFd1enpBSzlScnRwRSsKK2FOMFNVTExYSVdGTVpwTm9Pa2kwdDRQS1NQcFlGNHptSUtGWDlsRllkQjBzT2tyOTFsVjdMSUJhNFJYNHdlM0J6L1NlSHdZZ0FrSncKK0hnZk4rVUw1S1hQMTFydmFtUi9UMDRlTWFVVUFOTmpiQ0NnOTNWVmNEeTVQclM0THRTdDQyaUpoaEp0TlFsdEdOM2dpaHAvQmVYU3EKKzBhdlF1SzZ2dTZWTExYcktGSG8rQ0syU1JydnpQaFkzOVRYSTdlWUdtcHFaZ3FiZVpjOXZOVU1JbVRsYTlmd2xIQnJEWTdLQzJCSHEKK054ZWlFZHk4ekNYUE52eE5Nc3VLQ3psQ0lzNE1ycE5PbGcwU0lqSDNLRWw2dmxwKzRRYWE2aHlpdWRVYmtCQStXWEpkU0N1ZkdqbHcKK3V1MWt2RnppdVRUZGJvd29TMmV2a09HelhPSDhWb3ZmSEt3azJScmNQWTBYbDk0WlhmT25DRUlzYk5lVkFSZEV3TjFCUGJQbWdzQmwKK1dKSEl5dmpiS1V4NTJqVnZvM1FNWmVPSXJtS1VWeFF6bVdkd25jb0xPdnF0c0lIeGxxOFpER3FZSkMrRVo1RXFzS1pScldwYVZJMk0KK3c4R3ErMkVoWlRramFaWTEwOG9xcW1xNnM1ZzF3N1lNN05qeVprWGVZTFUxTWVRMHM4Sm5xWHMzNVhhM3VXNm5UeWlxQkJpOHNKK2oKKzZsNmhJQmpVeXNrc2FvcnhmaHBXT1RzZnRXdkhkb0Vmb0hhVkltRmsvZFpXN1k3ZGlocmhuQTRHYjFUNVFXNDNhbUZvdWUwcnRhWDEKK3JibDVzYzNPWGtEeUdFR1h1NlpTYUZmQ3lTNUgwQkJOZFUrU3BRM1lJaTlsdmpYZ3lWdHowdk8vcklYOVlOZ0loNVZhSnh4WGdtWlEKK3EzVENmclBTRDhObWZSeldhNk5CNHhVVUZoa245VEM3c1ovQUJRYmQ1UGYyZW56djdqN1ozdEhjbWJPa3l2VGRmRlVUMTNmMzljYmgKK3UzdVBRTkw1c3RXWWRKdmRRYXZTYmZZbmxXQTA2RlM2dzlhZ01tb04yNlBKYUJoMnVwTlh2bmVod1VHL09ReGE0MDZsVlI4T0swR3IKK3B1aDN1cFYyMEdqMGczYS9Ndzc2ci9JMkJsYWVwWS9jRm1CZXpldmVmd0VBQVAvL0F3QlFTd01FRkFBR0FBZ0FBQUFoQUEzUmtKKzIKK0FBQUFHd0VBQUNjQUFBQjBhR1Z0WlM5MGFHVnRaUzlmY21Wc2N5OTBhR1Z0WlUxaGJtRm5aWEl1ZUcxc0xuSmxiSE9FajAwS3dqQVUKK2hQZUNkd2h2YjlPNkVKRW0zWWpRcmRRRGhPUTFEVFkvSkZIczdRMnVMQWd1aDJHK21XbTdsNTNKRTJNeTNqRm9xaG9JT3VtVmNackIKK2JianNqa0JTRms2SjJUdGtzR0NDam04MzdSVm5rVXNvVFNZa1VpZ3VNWmh5RGlkS2s1elFpbFQ1Z0s0NG80OVc1Q0tqcGtISXU5QkkKKzkzVjlvUEdiQVh6RkpMMWlFSHZWQUJtV1VKci9zLzA0R29sbkx4OFdYZjVSUVhQWmhRVW9vc2JNNENPYnFrd0V5bHU2dXNUZkFBQUEKKy8vOERBRkJMQVFJdEFCUUFCZ0FJQUFBQUlRRHAzZysvL3dBQUFCd0NBQUFUQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJiUTI5dWRHVnUKK2RGOVVlWEJsYzEwdWVHMXNVRXNCQWkwQUZBQUdBQWdBQUFBaEFLWFdwK2ZBQUFBQU5nRUFBQXNBQUFBQUFBQUFBQUFBQUFBQU1BRUEKK0FGOXlaV3h6THk1eVpXeHpVRXNCQWkwQUZBQUdBQWdBQUFBaEFHdDVsaGFEQUFBQWlnQUFBQndBQUFBQUFBQUFBQUFBQUFBQUdRSUEKK0FIUm9aVzFsTDNSb1pXMWxMM1JvWlcxbFRXRnVZV2RsY2k1NGJXeFFTd0VDTFFBVUFBWUFDQUFBQUNFQXR2Um5tSk1IQUFESklBQUEKK0ZnQUFBQUFBQUFBQUFBQUFBQURXQWdBQWRHaGxiV1V2ZEdobGJXVXZkR2hsYldVeExuaHRiRkJMQVFJdEFCUUFCZ0FJQUFBQUlRQU4KKzBaQ2Z0Z0FBQUJzQkFBQW5BQUFBQUFBQUFBQUFBQUFBQUowS0FBQjBhR1Z0WlM5MGFHVnRaUzlmY21Wc2N5OTBhR1Z0WlUxaGJtRm4KK1pYSXVlRzFzTG5KbGJITlFTd1VHQUFBQUFBVUFCUUJkQVFBQW1Bc0FBQUFBCisKKy0tLS0tLT1fTmV4dFBhcnRfMDFEMzg2QjcuRTA1Rjg1OTAKK0NvbnRlbnQtTG9jYXRpb246IGZpbGU6Ly8vQzovMjY3QkEyRDQvVGVzdF9maWxlcy9jb2xvcnNjaGVtZW1hcHBpbmcueG1sCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlCitDb250ZW50LVR5cGU6IHRleHQveG1sCisKKzw/eG1sIHZlcnNpb249M0QiMS4wIiBlbmNvZGluZz0zRCJVVEYtOCIgc3RhbmRhbG9uZT0zRCJ5ZXMiPz4KKzxhOmNsck1hcCB4bWxuczphPTNEImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9tYWluIj0KKyBiZzE9M0QibHQxIiB0eDE9M0QiZGsxIiBiZzI9M0QibHQyIiB0eDI9M0QiZGsyIiBhY2NlbnQxPTNEImFjY2VudDEiIGFjY2VudD0KKzI9M0QiYWNjZW50MiIgYWNjZW50Mz0zRCJhY2NlbnQzIiBhY2NlbnQ0PTNEImFjY2VudDQiIGFjY2VudDU9M0QiYWNjZW50NSIgYT0KK2NjZW50Nj0zRCJhY2NlbnQ2IiBobGluaz0zRCJobGluayIgZm9sSGxpbms9M0QiZm9sSGxpbmsiLz4KKy0tLS0tLT1fTmV4dFBhcnRfMDFEMzg2QjcuRTA1Rjg1OTAKK0NvbnRlbnQtTG9jYXRpb246IGZpbGU6Ly8vQzovMjY3QkEyRDQvVGVzdF9maWxlcy9pbWFnZTAwMS5wbmcKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorQ29udGVudC1UeXBlOiBpbWFnZS9wbmcKKworaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUU0QUFBQWNDQUlBQUFCQWpoNjJBQUFBQVhOU1IwSUFyczRjNlFBQUFBbHdTRmx6QUFBVworSlFBQUZpVUJTVklrOEFBQUFoeEpSRUZVV0VmdFZ6dFN3ekFRVlRoTG9HQTRnWE9DaElhS2xrNHVrNGFPRzlEWVpkTFJVdEVnblFDZgorSUpNaTlsMkVWajlManVSUFBHU3c0MjBTejZ6c2ZmdmVmalJqaktIcnNKdnJnQWtvSjZnRDVycWdhYnlZS1Z2RXREQlllSzJPeVFqbQoreUtJa0IweDVZajB3TmtJQlI4bkhlZzVVenRkUEhHdDJ5Q1d2WWFoRkNqS0k2YkMwdk55eUh3bFVXM1IvcS80RzFKc25rWEJRV2hpaworeGtITVZ2d0JWdW43Qm1FczBRN1R1Q2hYZTB4c2luMThRVG93RWNRT2sxVVJPaVl1Tm5RS0ZmekFUV3E0ZXVEL1M5bUxFNWJDYXVqZworS0ttOEhOU2M0S2krV0VUQytmQndHZ2djazlWbDhWRXBVQTVDQzdNS1ZXcFg0SmRRbXhRc0JsbXpoVjhEQWZOcTRSOTBvenlOR1FNRAorcXF3SXdUaUJVMWJBSm1ZM0hKMEhGNnJXcnFUYUhzY1gwRzJwSi9OeFQvV28wY0N6MHpVa3V3TVg2Y3NHSmEvTFpvNyt4Q00vWk9qaAorVHMxRStyWGppaklqMFh5dytQN01RTEZ2Mis1aGxya0pTTEY3K3JxbXU5U1FrWG13Ky9kUW1tR1Z4cXRkQlpWZUkybzVwTEZlcld0LworRjJtNWRudmZWeHozeUpBcXVUTVVsd2NrMmMrUHpqN1VWbU15cFc2ZEtGb3UxNEpWdHpHcERuSFhLeUxCS2hScEZzclYvdGpBUjl1aworMXZrSkdrMXBDb1o5cEVJNSt5cTRWUWdBbFcrQlBybW9EbUJ1QnEzZWQ1NVRJQUxFNzU3MmpiT1hmQkZTYXoxTVVIdjJPWFhhTkZ2UAorNjBQbWxPcUhWcWN3bHcweFNyWDFraTlqTTlpWXJzTkdlRFVQRVRkQkhhT2tKMVluVmdlZGdWODNuRHVjWHVTb2RBQUFBQUJKUlU1RQorcmtKZ2drPT0KKworLS0tLS0tPV9OZXh0UGFydF8wMUQzODZCNy5FMDVGODU5MAorQ29udGVudC1Mb2NhdGlvbjogZmlsZTovLy9DOi8yNjdCQTJENC9UZXN0X2ZpbGVzL2ltYWdlMDAyLnBuZworQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CitDb250ZW50LVR5cGU6IGltYWdlL3BuZworCitpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRTRBQUFBY0NBTUFBQUQ0TW5uVEFBQUFBWE5TUjBJQXJzNGM2UUFBQUhKUVRGUkZBQUFBCitBQUFBQUFBNkFBQm1BRG82QURwbUFEcVFBR2EyT2dBQU9nQTZPZ0JtT2pvQU9qcVFPbWEyT3BEYlpnQUFaam9BWnBDMlpwRGJacmJiCitacmIva0RvQWtEcG1rTnYvdG1ZQXRwQm10clptdHR2L3R2Ly8yNUE2MjVCbTI3Wm0yLy8vLzdabS85dVEvOXUyLy8rMi8vL2JuUFkzCis0UUFBQUFGMFVrNVRBRURtMkdZQUFBQUpjRWhaY3dBQUZpVUFBQllsQVVsU0pQQUFBQUFaZEVWWWRGTnZablIzWVhKbEFFMXBZM0p2CitjMjltZENCUFptWnBZMlYvN1RWeEFBQUJMa2xFUVZSSVMrMlUyM2FESUJCRm9hbVJYaXhKRXhwN0lWRUMvLytMUFlNUzBhV0xXUHNvCitUK3FhMlROejVnaGo2NW1wZ1BzVW5CZlZ6S3pKOFBMaHhNNzg3ZDl3SUZtWlJ6Z2o0cmMvMUxFeTZzNHB2bDAyZXhubjE5bHVHVTVuCitQOTFJVmg3VUlwemVSRFNtYzZkNkgyYUsxNmVacDlNOXVNc0xEeWRuWndGblhIZWN1cWhoRkdaZWcvaGx6cHlpVCsycGIybDR1SWx3CitLU3FmNTBYWDcwNXR2L1lWVXBIcjQ0TTF6RE1xa0JXVFI0TVVEQVpJTVpiZ0ZEbm1MaHoxVXJmMk4ySmM3VERhTWRtY3Q2cHV4d2pZCitRWmFWbnFONWh4dlhEbXFMSTRScW01b1loL1FZNEtiYUpEOVkyY1JQV01HSTVsL1Q2UnNCdTZ6UVliUEJnQjJVTHBzaHNhZmtIVkJUCitDSERYais5dUkzMGNMUE1JaDNqckpDNHNLNmt5SWpPeVZLeDFjb2Ryd0twQVQ0RmZicTRTOURGQUZuNEFBQUFBU1VWT1JLNUNZSUo9CisKKy0tLS0tLT1fTmV4dFBhcnRfMDFEMzg2QjcuRTA1Rjg1OTAKK0NvbnRlbnQtTG9jYXRpb246IGZpbGU6Ly8vQzovMjY3QkEyRDQvVGVzdF9maWxlcy9pbWFnZTAwMy5wbmcKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorQ29udGVudC1UeXBlOiBpbWFnZS9wbmcKKworaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUh3QUFBQnNDQU1BQUFIb0VSYUJBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeAorand2OFlRVUFBQUJnVUV4VVJRQUFBRVJ5eEVoMXhVeDR4MUI3eUZaL3lsbUN5MXFEeTErR3pXT0p6bW1PMEh5ZDFuK2UxMytmMTRXagorMlppeDNwdTA0S0c0NGJmSjZMN082OVBlOGRmaDgrWHI5K2Z0OStqdCtQRHordkgwKy9YMy9QajUvZm43L2Z6OS92Ly8vNjU4MzZRQQorQUFBQmRGSk9Vd0JBNXRobUFBQUFDWEJJV1hNQUFCY1JBQUFYRVFIS0p2TS9BQUFEOGtsRVFWUllSKzJZRDV1YklBekdMOXJOelhicgorMEhyT25aYnYveTJYQlB5TENLaHJlMnQvengwaWFYd0JnWUJ2SmpCQzZvS2tncG96YlVITWYwaGIwR0V0aURoRitvS1BLMmZtWE9RWQorcTBvS1V0TFY2eGtUOUM5YjJudVJDTDdxZXlreVZ1anNMYjczSC9wcTJIVzlXclQ5ckM3dDc4c3oxQWxYd09rLy9jR1lpVjIxYWNEWQorbmtBbElMdm9POExqK2JvaUZvTHFGNEZJajFtSjlXZ0o4emNKc3Bkd2JxRENUcXE2MXpHMXB6VDRvRlJqQmZGNHZnUGpsWXdJczh0UworWnpwRzlnTGdJREhwV21mYXNZWFl2cDdKOHkvVUE4T1NzUHFab0gyUkhaNnZjNFRSUFliOStDT09JTmUzeU5SK3hmRkJmeTM3MXM4RQorN1l1RVBiOGJ0aDFETzg0K0NVMkpnNzh2bTlnaHUrTFNXOHR1Z3M3WVN6RVlRV0gxTTBIN0lqU0JOdUNjZjR2OE0vY1lCMnFrd3FRZAordTN0MXdLUkl4Qm5TTE1iVnZGSEZZK3p1S2JwRURiQTdYdWQ1MUs3ejRrSGRZeHFTdGc3dldGQ1BjTnpnbGcydHVFNGQ1a2VRd3oyKworNUhBUkNRMmIvS2pMaHpqY0liL1FIMFJxZzJid3I3ck9EM2Jmd1AwcnIvTkRxTnR4cnJwWWRNL2d4S3QrZm9EaXdJbTJkampVMHd5SAorbkFxTWcralk4NWhkNXdtNTN4YzkvbFpCN3JvaEsvaGYzWE1walRFK3hlNU9FYmFZV3g2SFdOMDVxR0tNbHhSZU1kck9hMWpkYVhkQQorejBCalRiTXQ3NDlMQXh6cXJGcnJBLzRNOXJhVFM1RW9kN3pPWTNlSGlrTUR1Mk4rZU5qc1dYRDM0ZW5kTi9Ec1hhZnpJM0RJeXY3TQorWTJOQjNZeW5Kc3Z1dUV6Z3Zrb2NjZkxQTHp3TzlTdjgrY0RGZ3JLQnh3SDJxUUQzaGZSeGhKNDBnOFA5OU91WS9qelRqcEkybGlhdQorcmtNYm1ZdlhjbUd3aC9zR2RuRFhOVm5CNDdwN1BOYm1UZ04rcTd2QTFVcDhsd2M4VWZLeFV0c0dPTlFsQ0p4cUpXM3ZPWm5pY0s5eAorcFlJVTMyL0RpVGIyK0xqelNoRzJYQXpkb1Q3QVJTVlRiTzZlUEwzN0J0RDlVNk9iY1hPMHVINExOK1VsL21uRTA3ckJYV3BVU1Bmbgorb0dWV2lJdFc5Q1F6dkxzZThZUk50Y0UxbkxiUEFUVUtGNCtyRWxkK0lpcFFVMUFOc0I2b21aTWhLbHF6bTIzaW1GUDlrTllaL3F1NQorcTNyQmh6WGRmdFduQWRYdG5YaGN6VytWN2F3WmNFSlMyK09LSzlHTFkwTGx0SVh3WkkzNGJyekVuMWo4UGp5Q3VPNkptL0lTL3p6aQorSVdGemlTM2lLcVp3S0ZjUmpqN2NCMFRVVGVKOGlZcDNUakhKT2N3RlJOWk4zWjdXWnppVlh5dE1VYmRWVlhYd1lkczd6NXR2eFJsRQorK2FWQTNYYUxrM3QzL0RieHVGSjkvczU2dkpuZ2paMG5xOFQzNGlYK3hPTDM0UkhFZFUvY2xKZjRvNHZ6MFo5cGt1NER3U1lDVzk2RworbER1TDQ4NUZCVEJ4L1UyYm1MVEdxTXAxNm5NdU5yV2NUK1hxVzRIZVNXQXM3M04wV1dRdmNXNHUwK2VjN0NYZTd5RUNkaE43aWV2Sgord0kzdWN3NEN4ZmZsSmY3RTR2ZUJ4ZS9GMjl0ZkdSY29UYVUxY3FBQUFBQUFTVVZPUks1Q1lJSj0KKworLS0tLS0tPV9OZXh0UGFydF8wMUQzODZCNy5FMDVGODU5MAorQ29udGVudC1Mb2NhdGlvbjogZmlsZTovLy9DOi8yNjdCQTJENC9UZXN0X2ZpbGVzL2ltYWdlMDA0LnBuZworQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CitDb250ZW50LVR5cGU6IGltYWdlL3BuZworCitpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSm9BQUFCb0NBWUFBQUFKcGVrRkFBQUFBWE5TUjBJQ1FNQjl4UUFBQUFsd1NGbHpBQUFXCitKUUFBRmlVQlNWSWs4QUFBQUJsMFJWaDBVMjltZEhkaGNtVUFUV2xqY205emIyWjBJRTltWm1salpYL3ROWEVBQUE4dlNVUkJWSGphCis3WjM1ZHhSVkZzYzl4Ly9COFJmOWZjNlptZU0rSWlDRWdDT3VqS0tDbzdpd1ExZ0NnaWdxaGsxWlJYWUVoYUFnS29Jc0FySmtYenRMCitwMGtnSWFHVGRIYVNkR2ZyckoxdzUzNXZWOFVtaEFHZEFGM2tOdWQ3Q2w1VlYxZDNmWGozdnZmcWZkOWRFUkVSZDZsVU4xdDllaklpCit1cGQxdjhyeXVvOTFkekNEWm1PMXF5d3ZOK3VlWUFZdG0wV1ZIaCtWMUxSVG1jb3lLalcyeHF1VjlaZGdCczJPcXh5N09JMEdoc1hTCitzUEI0bFVVMGRGYWNiS3ZxT25FTG15d0NtbzBHVG1mUVpzZXJMS0toTStOa2F5blEvck1ralFiUGlLUGhjeEpVRmhFZ3cxWkJVeWxvCitDcHFDcHFDcEZMUmcwQ0J1SFQ4Nk9ab2VuZlM3SHA4YVE2SGhDcHFDMWtjLzdHTU0yTlMxV2JUcmhJdjJuaTZsNzFsN1RwWFNrdDE1CiswajNUbjJwbEJlMW0vS2poOFRSaWJpS3QzSnRQRmJXdGxKNVhSNGNUSytsd1FnVkZaVmFUcDZtREloaytmSThoTS9zSGJBcmFUUW1YCitjYlIrdjVNNnV5N1Q2ZlJxZW5aQkVqMDBNWm9lbWhBbC9YOWZIU21teS93SDBMMzhjU3FGenZiRGlaQTZZRm9NUGNudy9YTktUSGZJCis3ZTI3aHJKd3ZCeGo2TWxnL3Mrbm9QV3RoczZLcDNkWFpGQ2x1NDF5WFkwMDZzTmtnY3ZjYjlaZ3A5S3FxY1BYUmN1L3V5RDdSeTFNCitvUTBIbkxScVh3Rk5XR21YRUhzbW81cCtUYTZpNmVzYzlBUWZFenJIZjdOQytEUHduczBIQytsazJpVTZ4VEFmaksrZ0tXdnNBdW53CitJTXovRkxRK0ZCTDh3WHlqZHg1M0VWZG05T1graTFJMmJQYVZ4d3lkR1UvenQ1Nmp6czdMZEN5bFV2STFmQ2VBMmRMV1NWa0Y5WFE4Cit0WW8yTW5qbmlodXBxTEtaWnE0L0t4QU40L2MvLzBFeTdUNVJRdlVjZ24rTUxxT2R4MXprclBEU3VhSUdtdjVGRm9Yd1RRMjJ4b2FDCisxc2VnRGVIYUppcXpSc0ptK01hemNwMmhQWTVEMlZ2TDA2bXVzWU95Q3hzNG4wdWdNUkUyU3N2elVCZS83MkJjT1QwelA0bitPdTZVCitnTlBRM0NHMTIzTWNnZ2RPajZNVm5QdlZlenRvOHkrRkVqNGZHSCtHWm56cElIZERoNFRqa2ZNVHUyK3NnbmFIZ29iUW1YQzJsdG82Cit1bWdXYXFGZVFFUFp1R1hwVk1YaE5hKzBpWjVtTUFCYTFzVjZxdkswMHJTMWRnRUlOZE1MSEhyVHVESGhMUGNLbkFPbXhWSThuNytrCit1b1dlWDVBc2VSL3lPSHh1NnZrNktSLzlTYXFDMWg5QUF3anQxd0VOMEpUWHRFb3RodmZoUVFFSGcxYktvRXhibXlYZkQ2QWhUQ2JuCitlTWhWMVV6dmZKN0J0Vm95NWJtYXFMVzlpME5sSTlrNXpDTFVvbVpzYWUrazZ2bzJldTFUbTRKMng0ZE96cU9Rd0YvbUhPMkRyM0k0CityN282WHdKb0UxWm1VaDNuV01qRkJreU5sVWVmQUZwWlRZdUVTeE0wMUdncDV6eFV6SG5hMjU5bDBPaEZOcW5kYWh2YUpRZGM5RTJ1Cis5TXN0anN5akQ3ZWY0MXpPUVNQbkpXbU9kcWUzT3BHd3IvbWhnSnBiTzJuem9VS3B6VUlDYWhmL1l6TUowcnIwZFhaUjVHOHU2Y3E0CitFZEJRbzRYd2U4ODZHNmlZYTdqbnVMWjdjSHlVaEZrSTV4a1FwS01PQ2xwZmQyL3dEenFPdzZLenZKa0t5cnowR3VkZWFGVUNHbWd3CisvLzFWcnBVdWxIaXB2TFpGUWlpNkxsNWZjbU9nQVNRMEROcDhDTTBPLzNHejRydGJtaU8wSDYzL2ROamlwbS80MlVuZUZoL2xjN0tQCitmalZ6M3h0TDBnVkFON2M0SXlKekphZkRkd0ZveUxNcTNhMFUxZ00wVzI0ZGxWNXFrZk04d1kyQnNIVU9xcWhwbzhJS0RxZEdMZmNDCisxMjdianhUUnZxaFNnUTBkd0FwYVB4aUNRa3NTTlJCQXd6QlVZWVZYVk1ZTmdQUUxkVkxybVhrZGNyYXgvSjB5dUJ3aE1iQXhBTkFTCitzOTEwa2VIRStURHFnSnYyMXJJTUtVT0RBdWZGKzJLemF1aE5iczJHQmxsRFFFRzd5YlVhcmhGZERVamlVUnRCZ09YZkg2WElQdlBICitCMnovZWkrUlh1RmowV0ljT1MreE84OUNIOXZMWFA0cWx6OXRsSWN5eU1nRkE4K044K0xmUTJZR0gyUUsyaTBRV3FHNDFrQ2hVL2RhCitMVllBMURPWi8xL2wxenV2Z3FZUFB2WXJLV2dxQlUxQlU5QVVOSldDcGxMUUZEUUZ6VHFnalZxWVRBK01qNUt4UFpVMWhFZVpzSzN3CitXQWkwMWZ2eTZmMXRPZlRSanZNcWl3aFBsbUJiNSsyeURtajZzdnhMUWRPWGd0WU4ybWxqMW8vTWxWUlpRb2NTL1BlcnBlMnlkVURECitJekgvZU9mTUZYTWFWY0d0aHlkR3lkWlNqUUh0M3REdURRVk5wYUNwRkRRRlRVRlQwRlFLV3RBSjE0VUpKS1lHaUdKa2E1YkJvRVdOCisrQlMwUHlYelVld2RSNHRsMnB3cFc2NkhVczU3WkVhNVdYWUdkbFdmcEFUZGJISUZ6U0kxR243TTZldXl1bWVPTCtWdFlibVhmSjJYCithZHZoUXZwMHAzOVdPY2I5bm5rL1NZNFA3UVhZM21xNzNzck5zbUdHZ3JtV1ZORDZPblNHeGNtczhjZU1XZU1ZeFlCWDJwaFBiZlNJCis0VitMOEluNW5GQmdyUWJvelBKQWFFeFBqNUNBeVNlWTBtZE9IRGJWODN3S1dqOW9EQXd6Wm8zSDJHdW95dE5HNzM2ZTRZZUZmL0JuCit1VGJiZWJ5WU1qbWN6dHVTYlVBU0p3WXVNT0NMYzlUU1c4c3paT1lUWnI2UGpVaVQyZWxSZkM1Wm5taTZmK2I3MWtORmRLR2tTU1lrCitReW5uM0RSNlVhcDhqb0ttb1BIK1JERm93V3QvVEpsTUlJWXR3cVJWZHBsZ2pOZnliL09rOXNQM2ZHOXpOalY0ZlpMYllVSXh6bkVxCis3WkpZWE1FeGN0SnFPeTNrY0Z4ZTIwcm5peHZGb0Rta2w3Q3NvUFVqMEhEekFkYjRGWmxTbnBoZEs4YkthSmtpZDBOWlMydW51RGhpCitWdm9UNG5sYlJNMXRuWkxmb2ZXNjZXQWh0ZnU2YVBmSkVnbXJqMC94aCtNNW03TEZYT1pJVW1YUXVUNHFhTGNZdE9GR0h2WWkxMHh3CitaM1NKcDBhbTVGdTdqcnVraFFwUDJxUnN0OHhvUjYwR0d5ejRvNDFmbVNHZ25VejNPM3VqNWpJOWNXR1BCUzgxeDhVR2NsWTAwMHNmCitCWmNabjRKMkcwQkRJby9hWnUwUEJlSnpockFISzlGaktWWDBFNGRTbUNEbmMrNkY5N3owY2Fya1lTZHNWZEpTeFRsZ0oxL0NnQ0ozCitNNTI0TVV2OXhZVXBsSlpiUjlWMWJXSTFHcUtnOVcvUXpJN2RtVitlbFZEM0hZZEFlR2ZBR0huZFR4ZkZLUkpPUVJHN2Nta0sxMW8xCis5VzIwOVhDUjN3K1h6NHMrT1RoRGpsSFFGTFRyZ1FaQUFBcWN1RzE1SGxyMjdRVnlPUDJ1Mm5BRWdtM29ObTVWYmp4UUtFbi92QzA1CiszVXY3cE9WNnlOdnFFN3YzM2tJblhMdzFkQ3BvSXRRMmNCQkNYZ2JyS1hScG9LYUNheERjZ281eVFoL3ZjSXNKSHhvTWNCa1NJeGNHCitDd3Rpd1BVNzhyZkF4a0FNdDA1ekJNQURjZVhhR09odm9DWGx1S1ZyWXNLS2pLdjZ0OUNxRE4rUVRhM2Nvb1RuTFZxTDZEdER6YlhxCisrd0pxYXZGSlY4ZVdRNFYrbTZ0d2YvZkkyQWliTkJZOGpSMzAyWjU4bXJ6YUxqT01FRzVUdUxaRFhxZG15ZjBNTkN3MGxuek9UVzhzCitUYnNxWndKVXFLbXcrZ2tNKzFaK24wK0Rwc2V5NGlUSGdtRWZYQ0REMW1WZHNmcUsyVWUyTDZwTXpQaE1vU0VobnJuYVlkdi9IaE15CitoNGF1RmNiTTRhVWhQWWFQL0F2ZUcrVzkySVNhK3dPSG9FS3VjYXlDMWc5QUM3MkJ3ZTdRYXd5S1grKzlnUVBxT3FpdUR6NnFGRFNWCitncWFnS1dnS21rcEJVeWxvQ3BxQ1ppblE0TDN4ZDNodlRJcFdXVVFQRyt1S1dzcDc0M2hLRmYwUVhVYjdZOHRWVmxHTS8zNDFXOGxOCitTRi9xajZhZzZVdEIwNWVDOW9kQVU3TmtOVXUrSmFDcC9idmF2MnMvbWtvN2JGVUttb0ttb0Nsby8vZVBiRHdORzZ4UHZ5cG9RUXdhCitmampNU0xxZThOUXIxa0tIZ1F1MkNwcUNkc01DUE04dFNKS0pKYVpHZjVJcUZnYXZMRXJ0TG50MWtZM2hTcEpKd1poU3QvbWdrNTZhCittOWl2RFBnVXREOExHUXN6bFpaRTVva3RBZVNxYXBIWjRZM05QcXB5dDhtL1VZNkp2RFBXTzJqTEw0WFU0ZXVpeU9NdUJVMUIrMk0xCisyc2o1U1ZLRFFTTTVKSDUzc2xRbTlhNzlxWUNleGI2RktUU0toVW5DV3c4Vml2WEJONzhXOHcrZUlNNC9tTk9KMmVxaFBjNkxzaUdHCitHUitPZ1FLbjZTRWNtK1ZRYjE1b3lBVUhCeHhqemdsVjBLeVlveGtKUG9TT1NOZ1h0TFozVWtSa0xnMllHc3RBeElzQUZrRHp0blRTCitWNGVMSk1ST1dwVXBrMzVocW1kT3hUTnp1ZGY1dXdGUTJCdkFMMjNLV3J2QWpCc0ZlQkNhOFY0NENVMVltU21QVEpsMldMZ3U4M3p3Cis4c0F4azlmWTZZMmw2VFJpYnNKdDllSlEwUHBBbU55Ny9VaXhnTGIwMnp3QndvUUg4b1BtbzJQSmxmUnpYTGxNRmtab0xhNXFGaEFFCitJdjQrNDVhblUwNVJBMFhiYTJqZm1USzZ4T0U0djZ4SmhtNEdoY1dLZTFCV1FUMlYxYlNJdzJOZFV3Y2RUcWdRZUUwTEJIaXR3WndQCisrOHpQZ1pieGRZV0czejZiQkFYdEZvQzIyY2pSWUhHd2c4TW5haDBZdkRqTHZlU3M4RXFqQVlaN0FNMStzVjVHblRQeTYyamFGMWswCithSVkvUEw3Sit5NjRtc1RDQ3JYZVFBYnY4ejM1Vk05QUhZZ3RsOW9RTjNQdGp3WGs1VEM5NjRSTFFqVGN2Mk95YXFpNnZwMCsySlp6CisyMzQzQmUwV2dBYnZET3pEVW9KUGNRZ2JaRnc3cktqUWdJQjdOL3cyeGkxTEo0ZXpYa0Q1K092ekhKS2o1UWJCZkErMjh1N0dEZ3BiCis1NUNWL1I2ZUZDM2wwUXhScGJ0VndFVmVtRlBZUUlrNXRlSWdpZkhGdjcxOW1xYXV5UkwvajEvaUt6ai9pN3N0dFpxQ2RvdENKeG9ECitPNDRXMFlnNWlkMTUxSXE5K1JKU0FTTHlQSUFHRDlxTWdqb3hQVWJpYjg1Q2o4bXNrWFBBWmhRUUxvNzBXOG5uRkRXU2p4c2hzQ3FkCit1TkpPVFF3dTFqSVFxM2x1R1NQc2Z2MHIzSWVJRXJKcmpkbnQ4UXJhblF3YVdwM28zakJCZzZrTFFFTm9EUVFONGZPMUNKdUFodHpyCitaYzdCMHZMcVpMMkNDNXgzMmZOL1h4d0Q1YkNZSDhQSGY3ajlQRjlERjNrYTJ5bXJlMUdOQnJIRGdtWHBwb05PNDVvVU5BV3RCMmk0CitRYkFVaGJVN0FNSXhENHcvMDJNSm9GZ0ppWE0zNWNqbndGc05pN0NpOVJ1NFRORHQvTTBVdENBSGJYaTQvL3lZa05QZTBTVXJzeUNmCitNejhibndXUW5weUJ4a1FHTlhEb2hDY2IrdVBNbXh0aTVIbjR6ZEROb2FBcGFGZUROc2ZmaVlzbGZ3QmFsTDJhUnM1UGxBYy9rZXdqCitOME5qNHFuM0V1ajVCVWtVeGJsY0I0ZllSWnlqWWYrRGZCdytDM25kckExbnU4K3BvRmtRTklTbjNTZEtwRnRpaFpqcFhRbmF6bVBGCitzbS9QcVpJclFNTVlLRjVJMWgrYkhFTnZmNVloZlY0RjVWNGF1OWdtSGI3bWlBSDZ4K0RpM2RMV0tVbDlKSC9lM3RPbFVudDljOHhGCitUODlQRW9qUTlRR2JVbGlNb2k4dThvUkwzTDd4SHZqZ0RnNkxWZENzQ2hwdWNQakdiTG1wRTFkbFh0SGJEODNlNEJDdjJybWJzaVYwCitEVE02VjlIcnY1UExaNjEzeVBmQkNBRGdXODFBbVN1ay9INmpFcVRXVzd3clY3cEpzUGJBMGVSSzJuREE2UitoTUk1RjdZb0IvejBuCitTMlEvamtPM0Jod2tzVDZWaGs0TGc0YWJoK3RCQWc3b1J2VFliKzVEU0Ewc2g3V29sQnU1RTI0RzhpL29XbDBReUxXd2VKa3AwNm03CisrMXFNbkF6bk5ZOEovQXh0RE9nVHR2cjBob0ttVXRCVUNwcUNwbExRVkFxYWdxYWdCUVZvNk14RWZ4RXVYbVVORFRYR2JTMEdtdi9CCitQL1ExcWF3aHJCbVByVlZBeThaVlZucDhWRkxUVG1VcXk2alUyQnF2MW1BSHpjWnFWMWxlYnRZOXdRemF2YXo3VlpiWGZheTdneFkwCitsZXBhK2k5ZXVCQ2pZc09RWGdBQUFBQkpSVTVFcmtKZ2drPT0KKworLS0tLS0tPV9OZXh0UGFydF8wMUQzODZCNy5FMDVGODU5MAorQ29udGVudC1Mb2NhdGlvbjogZmlsZTovLy9DOi8yNjdCQTJENC9UZXN0X2ZpbGVzL2ltYWdlMDA1LnBuZworQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CitDb250ZW50LVR5cGU6IGltYWdlL3BuZworCitpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBNFlBQUFJUENBTUFBQUZ2WWdBTkFBQUFBWE5TUjBJQXJzNGM2UUFBQUFSblFVMUJBQUN4Citqd3Y4WVFVQUFBQzNVRXhVUmRuWjJkcmEydG5aMmRuWjJVUnl4RmxaV1Z4Y1hHQmdZR1JrWkdob2FHeHNiSEZ4Y1hOemMzWjJkbmw1CitlWHA2ZW41K2ZvS0Nnb2VIaDRxS2lvdUxpNDJOalpXVmxaaVltSnVibTUrZm42T2pvNldscGFlbnA2bXBxYXVycTY2dXJyR3hzYk96CitzN1MwdEx1N3U3Mjl2YisvdjhMQ3dzWEZ4Y3JLeXREUTBOVFUxTmZYMTluWjJkdmIyK0RnNE9QajQrZm41K25wNmVycTZ1enM3TzE5CitNZTd1N3ZIeDhmTHk4dlgxOWZqNCtQbjUrZno4L1AvLy94T1AzM29BQUFBRWRGSk9VNGVmeDkrbmhaa1pBQUFBQ1hCSVdYTUFBQmNSCitBQUFYRVFIS0p2TS9BQUE1OGtsRVFWUjRYdTNkRDBNazIzR2VjU1ZSYy9IR1dVa09LOGRJSm80ZHRMSVJTckNWYXdQei9UOVhUdGM4Cit3RHZRcDZhN09UTTlQZnYrYkYzWU9qWFY1MHhOOFIvbUY3LzQwNUg5NGsrYkkvTVZoM1NibS9LL3J0dStIaThtbVhYRmkvTGk1KzIvCitwbk1mRDJHUksxN2Q4L3B4dUkrSDRDc2VBbGZrdmVYQnZWM3h3SDVYOEtxditDbS83UEg2M0N2K3BlRFZFY1pjVVZJRytZcnYrWXBiCis2N2hpL1RiOXlzbGM4WmxYajNmRnpTT3YxMis5dGVlS2Zkblh1dmtWWDBqS29IVmNjWHViTlZ4eHUzS2dLL1lwbGJyMWxYRHFWNHdQCit0UHFVUC9VcGY0bC9pbGlKSlFLdnRpc2hyc2pyUmIreUxiZGRpdURiRlVPZndobmoxb1NMV05udWQzQWxES3hNdUZjSGJwMWRzYmJpCitLL3FLVGEvNHNQUGVxazg1OUJWZnZhYjRpaE5XZk1Valh2SHlCL3U2M091WHZiL3o4dFhyeW9ldmpOZFhMbm01NC8wWnl3Zm8zZWJpCis2OGNyYmpiM1plWDJhbURsOFdMVDNieDlhQysrM20ydStxYnBYaGEvVjQvZzVLLzQ4bTdtRThaZnNReDZkL3ZZL2RTLy9wZk5SWHc3Cis1NklNZHdsZmJDN0dmOFBGZlR5RW8zK0w5VSsvNE1wSDR5dFdkSnUvN2JySHpmZXI3bm56UjJLanpUdmo5VzMvenFDLzRvZDNVSHU1CitqNGZRWDNGNkx6N0RmVHdFWC9FUUZyc2k3eXdQNzFobjFNL3pmTVZQMlg3MkhPWmVzZjhFdTN5R1BkYUlLL1lwTHpsRDJsM3hQM2o5CitlRmQ4K2VUMmVGZDg0U3VleWhXVDI4aks4bGQ4K1ZndXVYVm9kOFVYeWEzRHZpdHEzYUt5Y241WDNONUdWMDcxaXR1VjdhMTNiVmUyCit0RzRodDlHVmoxY2NLSHNHVjd3cUwzcHg2K28zVW9lLys3cGQyWXE2dkY3SWJkNVc2bWZzVXdnWGJ5dmIvUkl1dGl0Yi9jcTRNNzdZCiszanBTSmw3eGJjVlg3UDBvVjl4OWJ4VXBaM2ZGRjIrMzloVjl4VmVWbGY2S3l6MVdqMlB4S3o3d01qSDBqYzJhRzE1dXZ2R3llSGZGCit4NnZOOStlSC9sZU4zdnY2M0grUDl2YXR5S3VyemJlSHpmMW04Mlh6bGNpTDUvN0RpNHZOL2IvcmwzQi93RDRld1NldUtOOXVuZkpvCittbkRGWC9KOTFmTC81VTNFNjdkYmY3ZTV2M2p1cmpkUGtiU2YrM2dJQy94VzZiSDVpT2ZnS0Vmcyt0L3RGZGRkMS9VL216VGxMZU44Cit4emhpLzZiM3B2OFJsOXYrN1hIOGdNdjM4bjY2SzBmc05uZjlQdy9xS0YyOC9HMGNzYnZqdmM3MmlNOFhwWXZkYnlQamtEeUw1K0NICitPV0w1R1AxOCtZRjZEbnpFYytBam5vUHRFUS8vZ2VLQ3RrZThPczdIL0ljVlgwSHQ4ZThYWi9SQTVZQSs0cXB4d0dNZE1iNi8wT1BmCitUY1UzTjNyOEd4eHc3QkdwOGI3S2FCelFSNXlKclUwNzRwZnRPNDM0ZVlkQWpkY2ZsSmlLQTM3OHVZd1cyTnI3elhGQS9ZR083YW44CitRT1hmVTNGQUgzRW10cmFTSTNLVmFkZmhKajdpcXgvbmlPOC9tNkxHT1IzeFBXb3NkVVQyV2hEWXdVMStrQ055bGJnT3QvQVJYMUZqCiswaEc1UmR5R0M2L2tpTlRZdTFzZmNSaTM4QkhmNFNiVGp2amhpNHpVR0ZzbGNJdjNSK1FXKzI4anVFVkJZQWMzbVhiRUQ2aHgxQ055CitpNTNiK0lnKzRwYVA2Q1B1NEJhbmVzVDRlUjlCalhNNjRudlU4QkYzY1FzZmNSZTM4QkhmNFNZKzRxc2Y1b2lYNy85eUlEWE82SWhuCit6VWU4THA4c3gwK3FiNzZYRDRDK0R2eFp6dmZpdDhEdTd4NDJQOS9mZExlYjc5Y1J6WDBwLy92ZS8zcllUeGZkM2ViKy9ZZGFnNTQyCittNXVTL1AzbStyYnM4ZUp1ODdqNUsva05OREdxaTJXbi9Zc3h1eFdEZjE4MDkvUDIxKzhtUGVkVy9GN1Q2NHNCZnFDZUF4OXhsdjRkCisxdVBtN3R0dDkzajM3YmtNeWZidFIvL09heWU4VmQ2UGxUY2QzZWFudnkvL3VTcGplTXRDSzRjNllyZTUrM3E3ZVN6LyticDU2T0xYCitLL3NqYXZocWUvTCtYWFczNlI0dm5zdC9TbWIzL2pkb1A4c1AxSFB3WXh6eDNCMzlOM3VQemlkY1A1OXcvWHpDQmk2N3I3dS9HZGwxCiszV1AvOGRtb1Qzby83ZkFuN0QrOXZmcW4zMjcrZDdkNS9yZWJlRGJyOGxseWVlV3gyL3pMRVE1NStCUDJYeU80aXA4aStOci81bmNmCis2azlZUHFYdnlpY2M5VS9TV3puOENaL0xwMFZYcFpOZkIwNDQ2UXNYTXgxaER2K3RmUEpYVHZqNzMvUW5mTzYvOWhRbjdQK2d6SGs4CitTcGZtRTY2ZlQ3aCtQOGdKSDQ3d1Juc3hjY0lHejE5MXVyWW5iUDJsMkZQaXR6VHI1eE91bjArNGZqN2grdm1FNitjVHJsK2M4TGhQCitNbjFrMng3RzU0ZDh6L1I4eE5FNDRlRy84bnh3L0tUcHg1OVBQWnM1NUh3KzRZcHhQcDl3eFRpZlQ3Z0cvRjVDL0RxRDRIeEhPaUcvCitFUkcvRTlFYzUvTUpYdzJla0JMdmk0ekcrWHpDZWRpYVQvZ3FUbmo5N3ZkT0tIRk9QWXdUOGpsSFFZbXorUE9EZXNJM2xEaW5IcjVECitDWit3aXZQNWhQT3dOWi93bFU4NEMrZnpDZWRkaUZ2NGhLOTh3bGs0bjA5NHhCTjI3MzdlbWhKbmRNTE51K2QrcGNRNW5mRGRjMkZSCitZckVUc3RlUHUrMXhpNGtuZkljU1BtRVY1L01KUDM5Q0x0TmZpRnY0aEtDRVQxakZaYy90aE55a3Z4R1g5UWxQNUlTVW1MUmJidUVUCisrb1ErNFpRVHZ2dVpLRXFjMHduajgwTytuMUZRSXI3NVFZbjkzMlhoSnYyTnVNV2syeWoycXQ5bGVjTXQzbStPVzFTK00vUHUwOE85CitkOU8rKzVaYlJBKzV4ZjUrQ0c3UnNvZnZVTUluM01WTjVwNlFXeFErNFl2eU9yZndDVCtpaEUrNGk1djRoRHU0aFUrNGcxdjRoSzk4CitRcC93RFRmeENYZHdDNTl3QjdlWWRzTDRBMXlDRW1kMHd2Y280UlB1NGlZKzRRNXU0UlB1NEJZKzRTdWYwQ2Q4dzAxOHdoM2N3aWZjCit3UzE4d2xkeHdpLzFaMFk2a3hPK2Y1NVpTcHpUQ2YzMzJ0Yk1KMXkvN0lRZi95TG11NTlESFhENS9ydXRBMVhlKy9pbk42LzIveW1TCiswWnRMVGpqd3RHRWZudHY3dllHbkRSdnpoMU0rUEEvYTNydGw0SG5Rbm1QaGcrU0U1VDU1L0hieFVDNTMzemZtdVp4NDd3bkxWYjVlCis5VmxYRjVlYisvdk52NDk1Ty8yNHVTcTMrNzU1N2g0MkZ4ZjlBV3U3ZmZPMVQ3a3ZkMHE1TDI1dk4xYzNtNjRiZm5xNE1YTjRrT2RGCitHM0NZSjNyN3NkL1NuQWVmY1AxOHd2VTc1QWtySDJSVXdxMmZOKzlGK3hQMm43bVZEdzY2emYxVitjL3JCeWY5SjNHNzRYaGYyWDlDCitGeC9EWEg0bDNQb1BBQjdtaEp1bmgrNysvcXI4WitlRUErSDRsUFhMWmZuMzEvS2ZQano4M0xEekhlYUVkLzFtWDVxMS9kNWRmOEtCCitjSC9Dcm4vQ2t0TEpiYmlQdHVTM05Pdm5FNjZmVDdoKzUvOVVxMmZ2QjNpNjNMUG5IcTZmZTdoKzd1SDZ1WWZyZDFZOXZQcnd2Y3VxCis1K1pmTEZuT2VmVHdzdjlhNis4SGUvajJKN0F1WDc2OTJJZmN3eE56MjM4cnZyanEvbUZ6K1czejlBL3g0d1RQM2NYbVg5LzNzRy96CitTdyt2eTgwcTN6ZGVsZlBxWVduUVEzbjlzdXU2cjR4YTBzT1MxZWV0M25tOExiM3UvdHcvaVRrOUxDMTlmdTNoNWMzTGozVzg5ckFQCit2Y3poLy92RGRuSE56dXBqbWgrVWU3aCs3dUg2dVlmcjV4NnVuM3U0ZnU3aCtyMzE4S0Y4NW1ScjlOYkRML2ViTDQrOGZuNVBEWHgyCithRlJQNXZCYit4OTh0R1B3KzhQMWN3L1h6ejFjUC9kdy9kekQ5WE1QMTg4OVhELzNjUDNjdy9WekQ5ZlBQVnkvdHg3ZWRkMmtQNWRqCitwMEo2MlBxdk5kaVI3THd0dlhyOTNwTXRwLy9ybHJ0WXFQSDd3NU5ENHdRTE5lN2h5YUZ4Z29VYTkvRGswRGpCUW8xN2VISm9uR0NoCit4ajA4T1RST3NGRGpIcDRjR2lkWXFIRVBqNkQvRS9tN1dCaEU0d1FMTmU3aEVkQTR3Y0lnR2lkWXFGbFJEL3NuZWRqRndzbWpjWUtGCitRVFJPc0ZBem9ZZGNYckJ3SkRST3NIRHl1THNFQzROb25HQ2h4ajA4QXU0dXdjSWdHaWRZcUhFUGo0QzdTN0F3aU1ZSkZtcTBoeGY1CitYMkhtOG9LRkk2Rnhnb1dUeDkwbFdCaEU0d1FMTlc4OWZQNzI3QjRlQm5lWFlHRVFqUk1zMU9nY3VvY0h3dDBsV0JoRTR3UUxOWDUvCitlQVRjWFlLRlFUUk9zRkRqSGg0QmQ1ZGdZUkNORXl6VXVJZEh3TjBsV0JoRTR3UUxOZTdoRVhCM0NSWUcwVGpCUW8xN2VBVGNYWUtGCitRVFJPc0ZEakhoNEJkNWRnWVJDTkV5elUvTWc5NUJTQ2hkYW9MbGdZUk9NRUN6WHVvV0toTmFvTEZnYlJPTUZDalh1b1dHaU42b0tGCitRVFJPc0ZEakhpb1dXcU82WUdFUWpSTXMxTGlIaW9YV3FDNVlHRVRqQkFzMTdxRmlvVFdxQ3hZRzBUakJRczFPRC9uVDVoVmNYckJ3CitKRFJPc0RBWHB4QXN0RVoxd2NJZ0dpZFlxTkVlUHIzMWtEOEt0b1BMQ3hhT2hNWUpGdWJpRklLRlFkeWZpcFc5cUM1WUdFUnh3Y0lPCitHdFY3NitHWHpiUG5NTUg5cVZqWmkrcUNoVUVVRnl6VStQMmhZbUVROTZkaVpTK3FDeFlHVVZ5d1VPTWVLaFlHY1g4cVZ2YWl1b2d3CitweEFScHJpSWNKMTdxRmdZeFAycFdObUw2aUxDbkVKRW1PSWl3blh1b1dKaEVQZW5ZbVV2cW9zSWN3b1JZWXFMQ05lNWg0cUZRZHlmCitpcFc5cUM0aXpDbEVoQ2t1SWx6bkhpb1dCbkYvS2xiMm9ycUlNS2NRRWFhNGlIRGRLZmFRNmlMQ25GTkVlRDZLQ3hZR2NYOHFWdmFpCit1b2d3cHhBUnByaUljTjNuZThqbFJZUS9nZW9pd2xRWEVaNlA0b0tGUWR5ZmlwVzlxQzRpekNsRWhDa3VJbHpuSGlvV0JuRi9LbGIyCitvcnFJTUtjUUVhYTRpSENkZTZoWUdNVDlxVmpaaStvaXdweENSSmppSXNKMTdxRmlZUkQzcDJKbEw2cUxDSE1LRVdHS2l3alh2Zlh3Cit1ZHZ6OUJaY1hrU1l5NHNJZndMVlJZU3BMaUk4SDhVRkM0TzRQeFVyZTFGZFJKaFRpQWhUWEVTNGJtY084Nys1eCtWRmhMbThpUEFuCitVRjFFbU9vaXd2TlJYTEF3aVB0VHNiSVgxVVdFT1lXSU1NVkZoT3VraDdkN25xS2F5NHNJYzNrUllTNnZJajRDMVVXRXFTNGlUSEVSCis0UkVvTGxnWVJISEZ5bDVVRnhIbUZDTENGQmNScmp2WSswTXVyeUkrQXRWRmhLa3VJa3h4RWVFUktDNVlHRVJ4eGNwZVZCY1I1aFFpCit3aFFYRWE1ekR4VUxneWl1V05tTDZpTENuRUpFbU9JaXduWHVvWW93eFZVZnByaUs5QkdvTGlKTWNSRmhpb3NJMTdtSEtzSVVWMzJZCis0aXJTUjZDNmlEREZSWVFwTGlKYzV4NnFDRk5jOVdHS3EwZ2ZnZW9pd2hRWEVhYTRpSENkZTZnaVRISFZoeW11SW4wRXFvc0lVMXhFCittT0lpd25YdW9Zb3d4VlVmcHJpSzlCR29MaUpNY1JGaGlvc0kxN21IS3NJVVYzMlk0aXJTUjZDNmlEREZSWVFwTGlKYzV4NnFDRk5jCis5V0dLcTBnZmdlb2l3aFFYRWFhNGlIQ2RlNmdpVEhIVmh5bXVJbjBFcW9zSVUxeEVtT0lpd25YdW9Zb3d4VlVmcHJpSzlCR29MaUpNCitjUkZoaW9zSTE3bUhLc0lVVjMyWTRpclNSNkM2aURERlJZUXBMaUpjSnoxcys3MG5McThpUGdMVlJZU3BMaUpNY1JIaEVTZ3VJa3h4CisxWWNwcmlKOUJLcUxDRk5jUkpqaUlzSjFPb2ZTUTM0eFl3ZVhGeEhtOGlMQ1hGNUZmQVNxaXdoVFhVU1k0aUxDSTFCY1JKamlxZzlUCitYRVg2Q0ZRWEVhYTRpRERGUllUZm9WRzlTZytIY0hrUllTNHZJc3psVmNSSG9McUlNTlZGaENrdUlqd0N4VVdFS2E3Nk1NVlZwSTlBCitkUkZoaW9zSVUxeEV1TTd2RDFXRUthNzZNTVZWcEk5QWRSRmhpb3NJVTF4RXVNNDlWQkdtdU9yREZGZVJQZ0xWUllRcExpSk1jUkhoCitPdmRRUlpqaXFnOVRYRVg2Q0ZRWEVhYTRpRERGUllUcjNFTVZZWXFyUGt4eEZla2pVRjFFbU9JaXdoUVhFYTV6RDFXRUthNzZNTVZWCitwSTlBZFJGaGlvc0lVMXhFdU00OVZCR211T3JERkZlUlBnTFZSWVFwTGlKTWNSSGhPdmRRUlpqaXFnOVRYRVg2Q0ZRWEVhYTRpRERGCitSWVRyM0VNVllZcXJQa3h4RmVralVGMUVtT0lpd2hRWEVhNXpEMVdFS2E3Nk1NVlZwSTlBZFJGaGlvc0lVMXhFdU00OVZCR211T3JECitGRmVSUGdMVlJZUXBMaUpNY1JIaE92ZFFSWmppcWc5VFhFWDZDRlFYRWFhNGlEREZSWVRyM0VNVllZcXJQa3h4RmVralVGMUVtT0lpCit3aFFYRWE1NzYrSDE0NTdueCtmeUlzSmNYa1NZeTZ1SWowQjFFV0dxaXdoVFhFUjRCSXFMQ0ZOYzlXR0txMGdmZ2VvaXdoUVhFYWE0CitpSERkV3crN3plYnU5YmRtK0FhSG5Td2ExWHZyNGQzTm5yK2JhQ2Rxd3Z0RE8xSHU0ZnE1aCtzM3M0Y1ByeC85Sk85REw5OCtScHJ0CitrcGVidTN0ZUdaVC9Gdm9Jb3c2MDJkeW11eGhqMUlHZS9wQS9qZUd1bVQzOHNuM3gvSzBjdVJ6Lzd2N3BadlBsNGFhL0I4cDljSHUvCiszZURuZTFqS2hxdit5T1g0RitYS1R6ZmxsZHY3L3U2TXEvWExQOGVMVHhoM29NMlh6L1p3MUlIdWZ0N3pWSlM3NXI0dExaK0ozSHpaCitYSC9yOTlGdDdoNDNYZGVWVjI2L3h5YStmSTJrQm5ONC9YMXovZlN0VkM3M1p5bitkWFBkZGQvTEsrVlM1Y2hQWGY4WmJmbUkrdk5HCitIT2pwKyticXN6MGNkYUM5VHllNnE5bjd3NjdiOWkxc3ArTWc3anFPMmZ2OG03YTY5UnpJSDlPc24zdTRmdTdoK3JtSDYrY2VycDk3Cit1SDZyNm1INXlMdnlxZURRNzkxVnM2ODNkeDgvL2JyWTNQTGFPK1Z6L1U5L0JlR3dWdEhEMTIrYmxrL1p5bWUvdHovZjNteXVIdU0xCit2cjdTZjRyKzR2VzdxZlhzL2dzd2VQa202M1g1TE8ycS82SmR0M24rR3EveEpaV3Jyc1dYRUE1cFhUMHM0eEwzYkJteHEwZnU0KzFYCit3WVo2V00zV29YM3BZWjhXTGI3b2UwaXp0NS9hUDAzNW9za0MvUDV3L2R6RDlYTVAxODg5WEQvM2NQM2N3L1g3MHkvK016K3dhS3YxCitDMTdhYXYwbnZ5MWRQYjgvWEQvM2NQM2N3L1Z6RDlmUFBWdy85M0Q5M01QMWN3L1h6ejFjUC9kdy9kekQ5VHVuSGo0UC9JQml6ZFdwCisvN0RhQk9mUnczL3Vpc2VzaDMxQzEzMTllUGs5TWZmd3hFUm5ubStHZW5qMytsdmVEeStyRVhJUFQ4emw5Z2RBbjd2bnkrNy9sSmQvCiswLzExYWVyVjk5OTB0LzN3eGVLMmg2WE4yMUQwOEcrNjM4VFN5cDFGRDd2dGI4OCtkeGVQLzF3NjlWOGZvMkZYM1IrZTM4OWhQNnF2CitjMWh1MXFldjNubjBjUHNMRWZHMmxINzJQM25majFyU3c5dCtRTG5wcXAzWEhKYi9YUGJEVmV6djRYV2Y1aDZlaUt0dG8xNTYySCtFCitNMllPWDVkVzdpeDZ1T24rMjJiem0yK3ZQYnpmL04xTEQwdm4vbStrdlBVd1F2MWk5OGZONXZmYnhWVTdqeDZXbmwzOCtYVU95MGVuCitmM3pwWVZuNXgvNkY5REJDL1dMLzhldWZZMjNkenFTSFB6VDNjUDNjdy9WekQ5ZlBQVncvOTNEOTNNUDFjdy9YenoxY1AvZHcvZHpECis5WE1QMTg4OVhEL3A0ZVhKLzNFNUcvVFd3MHRlMnRxODl2QlpuZ25BVnVXMWgwOFhtNmZYTnZKSE0reDAwYW5lemh3ZThKazQ3SEQwCisvV0dUNTl5eG8zdnJvYTJWZTdoKzd1SDZ1WWZyNXg2dW4zdTRmdTdoK3JtSDYrY2VycDk3dUg3dTRmcTVoK3ZuSHE2ZmU3aCs3dUg2Cit1WWZyNXg2dW4zdTRmdTdoK3JtSDYrY2VycDk3dUg3dTRmcTk5ZkE4L29iZ2oraXRoLzRoNzdWeUQ5ZFAzeDllZitjVi84N002YU5UCitQZTJoZjMzdEpQenVBeFpxWG52NC9IMXo1WTlwVGdHTkV5elU2QnphU2FCeGdvVWE5L0RrMERqQlFvMTdlSEpvbkdDaHhqMDhPVFJPCitzRkRqSHA0Y0dpZFlxSEVQVHc2TkV5elV1SWNuaDhZSkZtcmN3NU5ENHdRTE5lN2h5YUZ4Z29VYTkvRGswRGpCUW8xN2VISm9uR0NoCit4ajA4T1RST3NGRGpIaDdlTHo5Z1lSaU5FeXpVdUllSFIrTUVDOE5vbkdDaHhqMDhQQm9uV0JoRzR3UUxOZXZwNFY4K1lPSGswVGpCCit3akFhSjFpb2NROFBqOFlKRm9iUk9NRkNqWHQ0ZURST3NEQ014Z2tXYXNiM2tNc3JWbzZEeGdrV1RoNzNsbUJoR0kwVExOUzRoNGZICit2U1ZZR0ViakJBczE3dUhoY1c4SkZvYlJPTUZDalh0NGVOeGJnb1ZoTkU2d1VPTWVIaDczbG1CaEdJMFRMTlM0aDRmSHZTVllHRWJqCitCQXMxMHNQYlgvSEtNQzZ2V0RrT0dpZFlPSG5jVzRLRllUUk9zRkFqUGZ4NnhTdkR1THhpNVRob25HRGg1SEZ2Q1JhRzBUakJRczFiCitENi9LLzJXNHZHTGxPR2ljWU9Ia2NXOEpGb2JST01GQ3pXc1BuMjZraC94dXpRNHVyMWc1RGhvbldEaDUzRnVDaFdFMFRyQ3dnMDcxCis5R01heitGaGNHOEpGb2JST01GQ2pYdDRlTnhiZ29WaE5FNndVS005ekhGNXhjcHgwRGpCd3NuajNoSXNES054Z29VYTkvRHd1TGNFCitDOE5vbkdDaHhqMDhQTzR0d2NJd0dpZFlxSEVQRDQ5N1M3QXdqTVlKRm1yY3c4UGozaElzREtOeGdvVWE5L0R3dUxjRUM4Tm9uR0NoCit4ajA4UE80dHdjSXdHaWRZcUhFUEQ0OTdTN0F3ak1ZSkZtcmN3OFBqM2hJc0RLTnhnb1VhOS9Ed3VMY0VDOE5vbkdDaHhqMDhQTzR0Cit3Y0l3R2lkWXFIRVBENDk3UzdBd2pNWUpGbXArNUI1eUNzRkNZeFFYTEF5amNZS0ZHdmRRc2RBWXhRVUx3MmljWUtIR1BWUXNORVp4Cit3Y0l3R2lkWXFIRVBGUXVOVVZ5d01JekdDUlpxM0VQRlFtTVVGeXdNbzNHQ2hScjNVTEhRR01VRkM4Tm9uR0NoeGoxVUxEUkdjY0hDCitNQm9uV0toeER4VUxqVkZjc0RDTXhna1dhdHhEeFVKakZCY3NES054Z29VYTkxQ3gwQmpGQlF2RGFKeGdvY1k5VkN3MFJuSEJ3akFhCitKMWlvZWV2aFZmY1RydzNqOG9xVjQ2Qnhnb1haT0lWZ29UR0tDeGFHMFRqQlFvM080ZTA5cnd6aThvcVY0NkJ4Z29YWk9JVmdvVEdLCitDeGFHMFRqQlFvMzJzT1BsTUM2dldEa09HaWRZbUkxVENCWWFvN2hnWVJpTkV5elVhQSsvdk00aHY1ZXhnOHNyVm82RHhna1dadU1VCitnb1ZCM0orQ2hiMG9MbGdZUm5YQndnNDYxZE1lNXM4VnhPVVZLOGRCNHdRTHMzRUt3Y0lnN2svQndsNFVGeXdNbzdwZ29lYTFoMC9mCitOMWQrZjVqZy9oUXM3RVZ4d2NJd3Fnc1dhblFPYzF4ZXNYSWNORTZ3TUJ1bkVDd000djRVTE94RmNjSENNS29MRm1yY1E4WENJTzVQCit3Y0plRkJjc0RLTzZZS0hHUFZRc0RPTCtGQ3pzUlhIQndqQ3FDeFpxM0VQRndpRHVUOEhDWGhRWEVlWVVLdUpVRnhHdWN3OFZDNE80CitQd1VMZTFGY1JKaFRxSWhUWFVTNHpqMVVMQXppL2hRczdFVnhFV0ZPb1NKT2RSSGhPdmRRc1RDSSsxT3dzQmZGUllRNWhZbzQxVVdFCis2OXhEeGNJZzdrL0J3bDRVRnhIbUZDcmlWQmNScm5NUEZRdUR1RDhGQzN0UlhFU1lVNmlJVTExRXVNNDlWQ3dNNHY0VUxPeEZjUkZoCitUcUVpVG5VUjRUcjNVTEV3aVB0VHNMQVh4VVdFT1lXS09OVkZoT3ZjUThYQ0lPNVB3Y0plRkJjUjVoUXE0bFFYRWE0N3dSNVNYRVNZCitZNG9JZndMVkJRdUR1RDhGQzN0UlhFU1lVNmlJVTExRXVNNDlWQ3dNNHY0VUxPeEZjUkZoVHFFaVRuVVI0VHIzVUxFd2lQdFRzTEFYCit4VVdFT1lXS09OVkZoT3MrMzBNdUx5SThIOFZGaENrdUl2d0pWQmNzRE9MK0ZDenNSWEVSWVU2aElrNTFFZUU2OTFDeE1JajdVN0N3CitGOFZGaERtRmlqalZSWVRyM0VQRndpRHVUOEhDWGhRWEVlWVVLdUpVRnhHdWN3OFZDNE80UHdVTGUxRmNSSmhUcUloVFhVUzR6ajFVCitMQXppL2hRczdFVnhFV0ZPb1NKT2RSSGhPdmRRc1RDSSsxT3dzQmZGUllRNWhZbzQxVVdFNjl4RHhjSWc3ay9Cd2w0VUZ4SG1GQ3JpCitWQmNScm5NUEZRdUR1RDhGQzN0UlhFU1lVNmlJVTExRXVPNnRoMWZkTjE0Ynh1VlZ4TG04aVBCOEZCY1JwcmlJOENkUVhiQXdpUHRUCitzTEFYeFVXRU9ZV0tPTlZGaE90MERxOS81cFZCWEY1Rm5NdUxDTTlIY1JGaGlvc0lmd0xWQlF1RHVEOEZDM3RSWEVTWVU2aUlVMTFFCit1TTQ5VkN3TTR2NFVMT3hGY1JGaFRxRWlUblVSNFRycDRmUGI3eC95ZXhrN3VMeUtPSmNYRVo2UDRpTENGQmNSL2dTcUN4WUdjWDhLCitGdmFpdUlnd3AxQVJwN3FJOER0MHFpYzl6SDkxYmVvY2Nua1I0UkVvTGlKTWNSRmhpcXVJajBCMXdjSWdpZ3NXOXFLNGlEQ25VQkduCit1b2h3M1ZzUDk3VFFQZnlBaGIwb0xpTE1LVlRFcVM0aVhLZnZEM05jWGtXY3k0c0ljM2tSNFJFb0xpSk1jUkZoaXF1SWowQjF3Y0lnCitpZ3NXOXFLNGlEQ25VQkdudW9od25YdW9XQmhFY2NIQ1hoUVhFZVlVS3VKVUZ4R3VjdzhWQzRNb0xsallpK0lpd3B4Q1JaenFJc0oxCis3cUdLTU5WRmhDa3VJandDeFVXRUthNGlUblVSNFRyM1VFV1k2aUxDRkJjUkhvSGlJc0lVVnhHbnVvaHduWHVvSWt4MUVXR0tpd2lQCitRSEVSWVlxcmlGTmRSTGpPUFZRUnBycUlNTVZGaEVlZ3VJZ3d4VlhFcVM0aVhPY2VxZ2hUWFVTWTRpTENJMUJjUkpqaUt1SlVGeEd1CitjdzlWaEtrdUlreHhFZUVSS0M0aVRIRVZjYXFMQ05lNWh5ckNWQmNScHJpSThBZ1VGeEdtdUlvNDFVV0U2OXhERldHcWl3aFRYRVI0CitCSXFMQ0ZOY1JaenFJc0oxN3FHS01OVkZoQ2t1SWp3Q3hVV0VLYTRpVG5VUjRUcjNVRVdZNmlMQ0ZCY1JIb0hpSXNJVVZ4R251b2h3CituWHVvSWt4MUVXR0tpd2lQUUhFUllZcXJpRk5kUkxqT1BWUVJwcnFJTU1WRmhFZWd1SWd3eFZYRXFTNGlYT2NlcWdoVFhVU1k0aUxDCitJMUJjUkpqaUt1SlVGeEd1Y3c5VmhLa3VJa3h4RWVFUktDNGlUSEVWY2FxTENOZTVoeXJDVkJjUnByaUk4QWdVRnhHbXVJbzQxVVdFCis2OXhERldHcWl3aFRYRVI0QklxTENGTmNSWnpxSXNKMTdxR0tNTlZGaENrdUlqd0N4VVdFS2E0aVRuVVI0VHIzVUVXWTZpTENGQmNSCitIb0hpSXNJVVZ4R251b2h3blh1b0lreDFFV0dLaXdpUFFIRVJZWXFyaUZOZFJMak9QVlFScHJxSU1NVkZoRWVndUlnd3hWWEVxUzRpCitYT2NlcWdoVFhVU1k0aUxDSTFCY1JKamlLdUpVRnhHdWUrdmhYZmVkMTRaeGVSVnhMaThpek9WRmhFZWd1SWd3eFVXRUthNGlQZ0xWCitSWVNwTGlKTWNSSGhFU2d1SWt4eEZYR3Fpd2pYeVJ6ZXVZY1JwcnFJTU1WRmhFZWd1SWd3eFZYRXFTNGlYRGZjUTM0dll3ZVhWeEhuCis4aUxDWEY1RWVBU0tpd2hUWEVTWTRpcmlJMUJkUkpqcUlzSVVGeEVlZ2VJaXdoUlhFYWU2aVBBN2RLcm5PVlFScHJxSU1NVkZoRWVnCit1SWd3eFZYRXFTNGlYT2NlcWdoVFhVU1k0aUxDSTFCY1JKamlLdUpVRnhHdWUrdmhaZGZOZXI0bkxpOGl6T1ZGaEVlZ3VJZ3d4VVdFCitLYTRpUGdMVlJZU3BMaUpNY1JIaEVTZ3VJa3h4RlhHcWl3alh5Unp1d2VWVnhMbThpRENYRnhFZWdlSWl3aFFYRWFhNGl2Z0lWQmNSCitwcnFJTU1WRmhFZWd1SWd3eFZYRXFTNGlYT2NlcWdoVFhVU1k0aUxDSTFCY1JKamlLdUpVRnhHdWN3OVZoS2t1SWt4eEVlRVJLQzRpCitUSEVWY2FxTENOZTVoeXJDVkJjUnByaUk4QWdVRnhHbXVJbzQxVVdFNjl4REZXR3Fpd2hUWEVSNEJJcUxDRk5jUlp6cUlzSjE3cUdLCitNTlZGaENrdUlqd0N4VVdFS2E0aVRuVVI0VHIzVUVXWTZpTENGQmNSSG9IaUlzSVVWeEdudW9od25YdW9Ja3gxRVdHS2l3aVBRSEVSCitZWXFyaUZOZFJMak9QVlFScHJxSU1NVkZoRWVndUlnd3hWWEVxUzRpWE9jZXFnaFRYVVNZNGlMQ0kxQmNSSmppS3VKVUZ4R3VjdzlWCitoS2t1SWt4eEVlRVJLQzRpVEhFVmNhcUxDTmU1aHlyQ1ZCY1JwcmlJOEFnVUZ4R211SW80MVVXRTY5eERGV0dxaXdoVFhFUjRCSXFMCitDRk5jUlp6cUlzSjE3cUdLTU5WRmhDa3VJandDeFVXRUthNGlUblVSNFRyM1VFV1k2aUxDRkJjUkhvSGlJc0lVVnhHbnVvaHduWHVvCitJa3gxRVdHS2l3aVBRSEVSWVlxcmlGTmRSTGpPUFZRUnBycUlNTVZGaEVlZ3VJZ3d4VlhFcVM0aVhPY2VxZ2hUWFVTWTRpTENJMUJjCitSSmppS3VKVUZ4R3VjdzlWaEtrdUlreHhFZUVSS0M0aVRIRVZjYXFMQ05lNWh5ckNWQmNScHJpSThBZ1VGeEdtdUlvNDFVV0U2OXhECitGV0dxaXdoVFhFUjRCSXFMQ0ZOY1JaenFJc0oxN3FHS01OVkZoQ2t1SWp3Q3hVV0VLYTRpVG5VUjRUcjNVRVdZNmlMQ0ZCY1JIb0hpCitJc0lVVnhHbnVvaHczVnNQbjdyOEwrdHplUlZ4TGk4aXpPVkZoRWVndUlnd3hVV0VLYTRpUGdMVlJZU3BMaUpNY1JIaEVTZ3VJa3h4CitGWEdxaXdqWHZmWHc2K2JaUHlQY283cUlNTVZGaEVlZ3VJZ3d4VlhFcVM0aVhQZmF3NGZ2ZTU3aWdzdXJpSE41RVdFdUx5SThBc1ZGCitoQ2t1SWt4eEZmRVJxQzRpVEhVUllZcUxDSTlBY1JGaGlxdUlVMTFFdU82MWgvMXZXN3oya04rdHNkTkZwM3B2YzNpejJWeHNYN1YxCitlWHQvMkcxdTczblZWdVd0aDdaVzd1SDZ1WWZyNXg2dW4zdTRmdTdoK3MzdDRXVlhQcC9jNDNuZlU1dU84TERucTdpOWZjOEtQOHFJCitBejEzWGZxczE2T01PZERFZTI1bUR5OTV1Ym1yZjA3NWNQUDVIdlpmQWR4S3YvNlFQNlA0R0dNT1ZIejZxeURqRHZUbGlsZEdtZGZECitwM2pnMzJ5Ni9zaDMzeDl1eXIxNGUzL1hCMjR2K2kvYlhULzJDWi92NFpmK1A5ZDl4WExrcnIrbmZ5cXZsY3QrMzNUM2ZmM3RsK2svCiszY09SQnlxQlR4cDFvSWY3WS9TUXMxejFSeTc3dUNoN2U3b3ByOXplOTEvc3VlZzNXRFRxWVhuYjhxMVVMQS9odS90eTVTL2JMd3VXCitTNVI3T2FaR25oVitwcEVIZXRxKytJUlJCL3FwN0dPQ2VUMk03MUtWLzd3Y3VYK2ZkTkcvc2ozeTFiOXY3NUxQOS9DcWYvaGZQYjRjCit1VnkwNis1ZmovejhkWHVYZlA0Nkl3KzAzYzluakRuUVhWZjB5U1BOZkg5NFhkNjZsTGMvWGYrbDh0dnY1UTNBZGRkOUw2OXN2K2o2CisxRzJQK3ZuN3RpOXg4MlZ6L2EyL1A4dGJuTWROZjd4eWxYaGJ0UGtTYjBvYlhHYlVnYjVzbmo4OWgvMW05eDZvZEhuN1lweVpQZnlnCit2RFdMaCsvV3A5KzJWZDMrTEI4V05QaFlwbXBGQjJyVnd6TC9iMjltK29mdW9lejhSYkxQajBYVmlnN1Vxb2UySFBkdy9kekQ5WE1QCisxODg5WEQvM2NQM2N3L1Z6RDlmUFBWdy85M0Q5M01QMWN3L1hiNjA5ekgvUDdyMXAyWi8rSnVHUnJhcUhGNXRiWG50bjhEbmpxdG45Cit0d25mdTczZjhHM2VkNjQzVDRmN3hsTWJxK2dodjdQM0ZOUFVmNHY3cDh1L0w2LzNyMTF0ZjlUc1RuckliL0lsMmYwMzdWN3dDMzVmCisrdG03Njc2VlpuWmxEdnZYbmp1YWQ4RHZjRFd4cGg1dXJydkgvanZjUDVVNWlwK2IyUHowOG5Nd0F6MU1zdlc3dS9SdzAzM3RmOGpsCis5dWZibSsyUFN0eit2UDA1aitlKzk2ZHRWVDBzNDNKLzJYWDlqNTZVcnNScjE5VTVMR3JaMS9JdDNaY2VicDR1SHJxdTYzOTg1dW94CitYdHU4ekNFL3gzU3lWdGJEMi91NFE2TXIzTFh4bG02NGg1WHNNbXB2WG51NHVZZ3hqUjR5c051Zm1uTVBXM2pwWWRmL0xIYi9NeExSCitsWGh0K3hNVE84OFo5OUxEV25aNTZ5Zy9HRTRQNy9vM21YZWxTdlJ3KzFyVTNQbVpqTk8waWg1YXlqMWNQL2R3L2R6RDlYTVAxODg5CitYRC8zY1AzY3cvVnpEOWZQUFZ3LzkzRDkzTVAxS3oyMGxmc3Y3cUhaNHNvWThsYlZ6QmJoTVRSYm5NZlFiSEVlUTdQRmVRek5GdWN4CitORnVjeDlCc2NSNURzOFY1RE0wVzV6RTBXNXpIMEd4eEhzUFQ5SHcxNGprbHB6dFFXZnNraitFSmVmNm5YM1ZkOTVzLzk2L09tNWZyCitjdnRYWHgrZi8rN1gvOGpLbHNmd05Ia01UOFp0MS8yM1A1WkorWmZmbEZFWk95OTMzVTl2Zi9RUkQ1Y3ZmL3Z6NmFyNysvN2xhNWJICis4RFI1REUvRjljNUF0Um5ERng3REUrY3hQQkYzM2M3c2xIbjU3Vy9pUTh1TC91OXRQbjBwci96NnNyeS83TWVwTFA3UDhucjM3Wi83CiswRi8vK3RkL0c3ZDU4VGFHMjZtVHJKY3hMQzlMdlZMQ1Eza1NQSVluWXZlZFlUOG5NWC9sUTFXTlg4ZmZXZTJIaUVITDN4dStUTjM3Cis5NFlQbDl2aTFMT2xlUXhQeE82NHZRN1E2OFE4Lzh2LytQV3Z5N3Uxci8yZlBYNVpuRHVHMTExWGlrVzlqemUzNC9NWW5vZ3lPeStqCisxWHMzaHVWRDF0LythL25YYmFzeDdNdll5ZkFZbm9yYjhya2VzM0g3N2YwWXZuend1SjJmblRIa3cwc3hOSVprRVhqTHNKUGdNVHdaCit6NytQTDhrVVpkVGVqV0gvSlpxLy9sWDVVUEw5R0paWHR6Y1FIOGZ3TmVzbDhOUi8rZWZYL2hyTnFmQVltaTNPWTJpMk9JK2gyZUk4CitobWFMOHhpYUxjNWphTFk0ajZIWjRqeUdab3Z6R0pvdHptTm90amlQb2RuaVBJWm1pL01ZbWkzT1kyaTJ1S0V4dlBVdm81a2QwOEFZCiszdnJ2SXBnZDFjY3hmTDc2Ny8wdmllNytKbW40azVsOURyUDB6dEFZeHQ5YnVQMzR4eFhNN0NDcUg1UmUrME5Uc3lNWitoTE5RLytuCithUDFWR3JOakdScERNenNxajZIWjRqeUdab3Z6R0pvdHptTm90amlQb2RuaVBJWm1pL01ZbWkzT1kyaTJPSStoMmVJOGhtYUw4eGlhCitMYzVqYUxZNGo2SFo0anlHWm92ekdKb3R6bU5vdGppUG9kbmlQSVptaS9NWW1pM09ZMmkyT0kraDJlSThobWFMR3hqRE8vKzlick9qCis4aGlhTFc1b0RMdkNvMmgyTkxYUERaKyt4QlBLN09BNWFjeCtMTDhiZ2RTOW1LVjNwb3loMlErSlNVdVJPbFB0ZzlLQnB6YzArekV4CithU2xTWjZxOU56UXpNR2twVW1meUdKcnR3YVNsU0ozSlkyaTJCNU9XSW5VbWo2SFpIa3hhaXRTWlBJWm1lekJwS1ZKbjhoaWE3Y0drCitwVWlkeVdOb3RnZVRsaUoxSm8raDJSNU1Xb3JVbVR5R1puc3dhU2xTWi9JWW11M0JwS1ZJbmNsamFMWUhrNVlpZFNhUG9ka2VURnFLCisxSms4aG5ZT2Zqa0NxZE14YVNsU1ovSVkyamxnMGxLa1RzZWtwVWlkeVdObzU0QkpTNUU2SFpPV0luVW1qMkY3ZnhtQlZHdUVTVXVSCitPaDJUbGlKMUpvOWhlMHhhaWxScmhFbExrVG9kazVZaWRTYVBZWHRNV29wVWE0UkpTNUU2SFpPV0luV21RNHdocDg2UmU0Nll0QlNwCisxZ2lQcWhTcDB6RnBLVkpuOGhpMng2U2xTTFZHZUZTbFNKMk9TVXVST3BQSHNEMG1MVVdxTmNLaktrWHFkRXhhaXRTWlBJYnRNV2twCitVcTBSSGxVcFVxZGowbEtrenVReGJJOUpTNUZxamZDb1NwRTZIWk9XSW5XbTRURjh2dW8rOGRlQ09YV08zSFBFcEtWSXRVWjRWS1ZJCituWTVKUzVFNjArQVlQbjM1dzVYSGNEWW1MVVdxTmNLaktrWHFkRXhhaXRTWmhzYnc0YS91bnoyRzh6RnBLVkt0RVI1VktWS24ydzVhCitqdFNaQnNidzdxZWZ5MGVsQTJQSWsySHN4YWx6NUo0akppMUZxalhDb3lwRjZuUk1Xb3JVdlppbGR6Nk9ZVHlGUmU4N2djazRkWTdjCitjOFNrcFVpMVJuaFVwVWlkamtsTGtUclQ4SmRvaHQ4YmpzV3BjK1NlSXlZdFJhbzF3cU1xUmVwMFRGcUsxSmtxWS9ncG5EcEg3amxpCiswbEtrV2lNOHFsS2tUc2VrcFVpZHlXUFlIcE9XSXRVYTRWR1ZJblU2SmkxRjZrd2V3L2FZdEJTcDFnaVBxaFNwMHpGcEtWSm44aGkyCit4NlNsU0xWR2VGU2xTSjJPU1V1Uk9wUEhzRDBtTFVXcU5jS2pLa1hxZEV4YWl0U1pQSWJ0TVdrcFVxMFJIbFVwVXFkajBsS2t6dVF4CitiSTlKUzVGcWpmQ29TcEU2SFpPV0luVW1qMkY3VEZxS1ZHdUVSMVdLMU9tWXRCU3BNM2tNMjJQU1VxUmFJenlxVXFST3g2U2xTSjNKCitZOWdlazVZaTFScmhVWlVpZFRvbUxVWHFUQjdEOXBpMEZLbldDSStxRktuVE1Xa3BVbWZ5R0xiSHBLVkl0VVo0VktWSW5ZNUpTNUU2CitrOGV3UFNZdFJlcFNhRUtLMUhWZ3p5bFNwMlBTVXFUTzVERnNqMGxMa2JvVW1wQWlkUjNZYzRyVTZaaTBGS2t6ZVF6Ylk5SlNwQzZGCitKcVJJWFFmMm5DSjFPaVl0UmVwTUhzUDJtTFFVcVV1aENTbFMxNEU5cDBpZGprbExrVHFUeDdBOUppMUY2bEpvUW9yVWRXRFBLVktuCitZOUpTcE03a01XeVBTVXVSdWhTYWtDSjFIZGh6aXRUcG1MUVVxVE41RE50ajBsS2tMb1VtcEVoZEIvYWNJblU2SmkxRjZrd2V3L2FZCit0QlNwUzZFSktWTFhnVDJuU0oyT1NVdVJPcFBIc0QwbUxVWHFVbWhDaXRSMVlNOHBVcWRqMGxLa3p1UXhiSTlKUzVHNkZKcVFJblVkCisySE9LMU9tWXRCU3BNM2tNMjJQU1VxUXVoU2FrU0YwSDlwd2lkVG9tTFVYcVRCN0Q5cGkwRktsTG9Ra3BVdGVCUGFkSW5ZNUpTNUU2CiswOEFZWHQvMFR5YnowOC84Y3pwT25TUDNIREZwS1ZLWFFoTlNwSzREZTA2Uk9oMlRsaUoxcHRwN3c5dUxlMTZiamxQbnlEMUhURnFLCisxS1hRaEJTcDY4Q2VVNlJPeDZTbFNKMXBZQXlmcjdxdUsrOFJQK0RKTVBiaTFEbHl6eEdUbGlKMUtUUWhSZW82c09jVXFkTXhhU2xTCis5MktXM3FtOU4zejZNdjlKTERoMWp0eHp4S1NsU0YwS1RVaVJPaG1QeXh5NXpiRG5GS25Uc2VjVXFUTjVETnRqMGxLa0xvVW1wRWlkCitqTWRsanR4bTJIT0sxT25ZYzRyVW1RYkdNSjVaN2Vzai81cUJVK2ZJUFVkTVdvclVwZENFRkttVDhiak1rZHNNZTA2Uk9oMTdUcEU2CitVKzI5NFdkdzZoeTU1NGhKUzVHNkZKcVFJblV5SHBjNWNwdGh6eWxTcDJQUEtWSm44aGkyeDZTbFNGMEtUVWlST2htUHl4eTV6YkRuCitGS25Uc2VjVXFUTjVETnRqMGxLa0xvVW1wRWlkak1kbGp0eG0ySE9LMU9uWWM0clVtVHlHN1RGcEtWS1hRaE5TcEU3RzR6SkhialBzCitPVVZxUVJOeTVCYnNPVVhxVEI3RDltaGppdFNsMElRVXFaUHh1TXlSMnd4N1RwRmEwSVFjdVFWN1RwRTZrOGV3UGRxWUluVXBOQ0ZGCis2bVE4TG5Qa05zT2VVNlFXTkNGSGJzR2VVNlRPNURGc2p6YW1TRjBLVFVpUk9obVB5eHk1emJEbkZLa0ZUY2lSVzdEbkZLa3plUXpiCitvNDBwVXBkQ0UxS2tUc2JqTWtkdU0rdzVSV3BCRTNMa0Z1dzVSZXBNSHNQMmFHT0sxS1hRaEJTcGsvRzR6SkhiREh0T2tWclFoQnk1CitCWHRPa1RxVHg3QTkycGdpZFNrMElVWHFaRHd1YytRMnc1NVRwQlkwSVVkdXdaNVRwTTdrTVd5UE5xWklYUXBOU0pFNkdZL0xITG5OCitzT2NVcVFWTnlKRmJzT2NVcVRONURNZGd6eWxTQzlxWUluVXA3RGxGNm1ROExuUGtOc09lVTZRV05DRkhic0dlVTZUTzVERWNnejJuCitTQzFvWTRyVXBiRG5GS21UOGJqTWtkc01lMDZSV3RDRUhMa0ZlMDZST3BQSGNBejJuQ0sxb0kwcFVwZkNubE9rVHNiak1rZHVNK3c1CitSV3BCRTNMa0Z1dzVSZXBNSnpDR25EcEY2bExZYzRyVWdqMm5TRjBLZTA2Uk9obVB5eHk1emJEbkZLa0ZUY2lSVzdEbkZLa3plUXpICitZTThwVWd2Mm5DSjFLZXc1UmVwa1BDNXo1RGJEbmxPa0ZqUWhSMjdCbmxPa3p1UXhISU05cDBndDJIT0sxS1d3NXhTcGsvRzR6SkhiCitESHRPa1ZyUWhCeTVCWHRPa1RxVHgzQU05cHdpdFdEUEtWS1h3cDVUcEU3RzR6SkhialBzT1VWcVFSTnk1QmJzT1VYcVRCN0RNZGh6CitpdFNDUGFkSVhRcDdUcEU2R1kvTEhMbk5zT2NVcVFWTnlKRmJzT2NVcVRONURNZGd6eWxTQy9hY0luVXA3RGxGNm1ROExuUGtOc09lCitVNlFXTkNGSGJzR2VVNlRPNURFY2d6Mm5TQzNZYzRyVXBiRG5GS21UOGJqTWtkc01lMDZSV3RDRUhMa0ZlMDZST3BQSGNBejJuQ0sxCitZTThwVXBmQ25sT2tUc2JqTWtkdU0rdzVSV3BCRTNMa0Z1dzVSZXBNSHNNeDJIT0sxSUk5cDBoZENudE9rVG9aajhzY3VjMnc1eFNwCitCVTNJa1Z1dzV4U3BNdzJNNGZXMy9tK1Z6djlyd1I3REVVaGRDbnRPa1RvWmo4c2N1YzJ3NXhTcEJVM0lrVnV3NXhTcE05WGVHOTRlCis3eG1kT0hXSzFLV3c1eFNwQlh0T2tib1U5cHdpZFRJZWx6bHltMkhQS1ZJTG1wQWp0MkRQS1ZKbnFvemh3K1hRYzhtTXhLbHo1QmFjCitPa1hxVXRoeml0U0NQYWRJWFFwN1RwRTZHWS9MSExuTnNPY1VxUVZOeUpGYnNPY1VxVE1OaitIMTROT3E4WncwZTNIcUhMa0ZwMDZSCitXbkRxSExuTnNPY1VxUVY3VHBGYXNPVWN1YzJ3NXhTcGs3SGxITG5Oc09jVXFRVk55SkZic09jVXFYc3hTKzhNamVIdDROT3FqY2VwCitjK1FXbkRwRmFzR3BjK1EydzU1VHBCYnNPVVZxd1paejVEYkRubE9rVHNhV2MrUTJ3NTVUcEJZMElVZHV3WjVUcE03MGNRemo2UTJMCitvejJqRTZkT2tWcHc2aHk1emJEbkZLa0ZlMDZSV3JEbEhMbk5zT2NVcVpPeDVSeTV6YkRuRktrRlRjaVJXN0RuRktrejFiNUU4eG1jCitPa2R1d2FsVHBCYWNPa2R1TSt3NVJXckJubE9rRm13NVIyNHo3RGxGNm1Sc09VZHVNK3c1UldwQkUzTGtGdXc1UmVwTUhzTXgySE9LCisxSUk5cDBndDJIS08zR2JZYzRyVXlkaHlqdHhtMkhPSzFJSW01TWd0MkhPSzFKazhobU93NXhTcEJYdE9rVnF3NVJ5NXpiRG5GS21UCitzZVVjdWMydzV4U3BCVTNJa1Z1dzV4U3BNM2tNeDJEUEtWSUw5cHdpdFdETE9YS2JZYzhwVWd2Mm5DUFhZemlIeDNBTTlwd2l0V0RQCitLVklMdHB3anR4bjJuQ0sxWU04NWNqMkdjM2dNeDJEUEtWSUw5cHdpdFdETE9YS2JZYzhwVWd2Mm5DUFhZemlIeDNBTTlwd2l0V0RQCitLVklMdHB3anR4bjJuQ0sxWU04NWNqMkdjM2dNeDJEUEtWSUw5cHdpdFdETE9YS2JZYzhwVWd2Mm5DUFhZemlIeDNBTTlwd2l0V0RQCitLVklMdHB3anR4bjJuQ0sxWU04NWNqMkdjM2dNeDJEUEtWSUw5cHdpdFdETE9YS2JZYzhwVWd2Mm5DUFhZemlIeDNBTTlwd2l0V0RQCitLVklMdHB3anR4bjJuQ0sxWU04NWNqMkdjM2dNeDJEUEtWSUw5cHdpdFdETE9YS2JZYzhwVWd2Mm5DUFhZemlIeDNBTTlwd2l0V0RQCitLVklMdHB3anR4bjJuQ0sxWU04NWNqMkdjM2dNeDJEUEtWSUw5cHdpdFdETE9YS2JZYzhwVWd2Mm5DUFhZemlIeDNBTTlwd2l0V0RQCitLVklMdHB3anR4bjJuQ0sxWU04NWNqMkdjM2dNeDJEUEtWSUw5cHdpdFdETE9YS2JZYzhwVWd2Mm5DUFhZemlIeDNBTTlwd2l0V0RQCitLVklMdHB3anR4bjJuQ0sxWU04NWNqMkdjM2dNeDJEUEtWSUw5cHdpdFdETE9YS2JZYzhwVWd2Mm5DUFhZemlIeDNBTTlwd2l0V0RQCitLVklMdHB3anR4bjJuQ0sxWU04NWNqMkdjM2dNeDJEUEtWSUw5cHdpdFdETE9YS2JZYzhwVWd2Mm5DUFhZemlIeDNBTTlwd2l0V0RQCitLVklMdHB3anR4bjJuQ0sxWU04NWNqMkdjM2dNeDJEUEtWSUw5cHdpdFdETE9YS2JZYzhwVWd2Mm5DUFhZemlIeDNBTTlwd2l0V0RQCitLVklMdHB3anR4bjJuQ0sxWU04NWNqMkdjd3lPNGZOVjk1MVg1K0RVT1hJTFRwMGl0ZURVT1hLYlljOHBVZ3YybkNLMVlNczVjcHRoCit6eWxTQy9hY0k5ZGpPTWZBR0Q1YzN0eDVESGV3NXhTcEJYdE9rVnF3NVJ5NXpiRG5GS2tGZTg2UjZ6R2NZL2lEVW8vaEx2YWNJclZnCit6eWxTQzdhY0k3Y1o5cHdpdFdEUE9YSTlobk5NR1VPZURHTXZUcDBqdCtEVUtWSUxUcDBqdHhuMm5DSzFZTThwVWd1Mm5DTzNHZmFjCitJclZnenpseS9WUXlPV2JwSGI4M0hJTTlwMGd0MkhPSzFJSXQ1OGh0aGoyblNDM1ljNDVjdnplY3cyTTRCbnRPa1ZxdzV4U3BCVnZPCitrZHNNZTA2UldyRG5ITGtld3ptR3gvQnpPSFdPM0lKVHAwZ3RPSFdPM0diWWM0clVnajJuU0MzWWNvN2NadGh6aXRTQ1BlZkk5UmpPCis0VEVjZ3oyblNDM1ljNHJVZ2kzbnlHMkdQYWRJTGRoempseVA0Undld3pIWWM0clVnajJuU0MzWWNvN2NadGh6aXRTQ1BlZkk5UmpPCis0VEVjZ3oyblNDM1ljNHJVZ2kzbnlHMkdQYWRJTGRoempseVA0Undld3pIWWM0clVnajJuU0MzWWNvN2NadGh6aXRTQ1BlZkk5UmpPCis0VEVjZ3oyblNDM1ljNHJVZ2kzbnlHMkdQYWRJTGRoempseVA0Undld3pIWWM0clVnajJuU0MzWWNvN2NadGh6aXRTQ1BlZkk5UmpPCis0VEVjZ3oyblNDM1ljNHJVZ2kzbnlHMkdQYWRJTGRoempseVA0Undld3pIWWM0clVnajJuU0MzWWNvN2NadGh6aXRTQ1BlZkk5UmpPCis0VEVjZ3oyblNDM1ljNHJVZ2kzbnlHMkdQYWRJTGRoempseVA0Undld3pIWWM0clVnajJuU0MzWWNvN2NadGh6aXRTQ1BlZkk5UmpPCis0VEVjZ3oyblNDM1ljNHJVZ2kzbnlHMkdQYWRJTGRoempseVA0Undld3pIWWM0clVnajJuU0MzWWNvN2NadGh6aXRTQ1BlZkk5UmpPCis0VEVjZ3oyblNDM1ljNHJVZ2kzbnlHMkdQYWRJTGRoempseVA0Undld3pIWWM0clVnajJuU0MzWWNvN2NadGh6aXRTQ1BlZkk5UmpPCis0VEVjZ3oyblNDM1ljNHJVZ2kzbnlHMkdQYWRJTGRoempseVA0Undld3pIWWM0clVnajJuU0MzWWNvN2NadGh6aXRTQ1BlZkk5UmpPCis0VEVjZ3oyblNDM1ljNHJVZ2kzbnlHMkdQYWRJTGRoempseVA0Undld3pIWWM0clVnajJuU0MzWWNvN2NadGh6aXRTQ1BlZkk5UmpPCis0VEVjZ3oyblNDM1ljNHJVZ2kzbnlHMkdQYWRJTGRoempseVA0Undld3pIWWM0clVnajJuU0MzWWNvN2NadGh6aXRTQ1BlZkk5UmpPCis0VEVjZ3oyblNDM1ljNHJVZ2kzbnlHMkdQYWRJTGRoempseVA0Undld3pIWWM0clVnajJuU0MzWWNvN2NadGh6aXRTQ1BlZkk5UmpPCis0VEVjZ3oyblNDM1ljNHJVZ2kzbnlHMkdQYWRJTGRoempseVA0UndEWS9od2ViUFozSDdpRHdaejZoeTVCYWRPa1ZwdzZoeTV6YkRuCitGS2tGZTA2UldyRGxITG5Oc09jVXFRVjd6cEhyTVp6ajR4ZytmU2xUV09idzRqNytPUU9uenBGYmNPb1VxUVduenBIYkRIdE9rVnF3Cis1eFNwQlZ2T2tkc01lMDZSV3JEbkhMa2V3emsramlGL09IL2c3K2Z6WkJobU5oZXo5TTdITVh5NHJJMmhtUjNFeHpGOHZ2cjYrUEpmCitNenVDZ1MvUmxIZUVYVGYvTTBNem0yaG9ETTNzcUR5R1pvdnpHSm90em1Ob3RqaVBvZG5pUElabWl6dnVHTVpQcWo1ZnhVL0xiZDNOCisrODVJL3oyVlUvanhnbFlIdXY3V242bjhaMm5ORGxRcVBIMzU2V2YrdVp4bUQ3bis1enQvZGFnT0hYVU1yOS9hY2wzbTZLYmNQZVZGCisvK2pyeDJwN3hINmhYM3E0TEMvNlNidjk2ZjZ5dTluZVZPN0JrL2dwbjVZSDZoY1dmOVEyUHREY0IzdzdEUTkwL2ZVL3JyWTNhTytZCitZOGdQamI5NCt0TGZHZjBwbitONC9hTXdVc3AvdHBGeThzZnk1cXkvVlFTMHdDbU1ZZE1EbFVmQlRyVWx0RHRRUE5vWFAwL1RBMzNqCitSb2R3M0RGOFBjWGIyNlQrUG9rM1E5dWYzT25mQkpVM29pOC8yRnBDdkVudEg2VDlYZlRpTk1hdzRZR3V0K0ZGTlQzUVRybUZORHRRCitqT041ak9IYjZNUWIvamhVM0NkdmI3TWUvaXJ1Z0pjRHg1dW03WDFTWHY0dlhnc244VUZwdXdOdDN3QXZybVdIZG9aZ0tVMFBSTW9CCitIUGRMTk9WZUtjb2QwTDh4dXVtL0xsRWVmL0VXcW9UN3R6dmJlNmUvRy9wSTNBY3Y5MG41RVA1MThIaGIxdDlpWVcwT3RIMUxIVGRjCitXcHNEYmN1Y1FIK2FIYWgzTm1PNFQ3enhlcjRxSHlaOGNBSnZXbWZ3Z1U3ZFNSem94TWJRN0Vma01UUmJuTWZRYkhFZVE3UEZlUXpOCitGdWN4TkZ1Y3g5QnNjUjVEczhWNURNMFc1ekUwVzV6SDBHeHhIa096eFhrTXpSYm5NVHlVMjhIZjlFbWZHK1Q1YXZjWGE2b20xNDdmCitwQnIxNndMelNnLzlmb0tONXpGc2hPZlFLK0tmTTM1SDV1SHk1dldYVkhmeGhIdEYvSFB1Nzk5cy83aktPenc5WDlIL2EyN3AxOS9RCitzMWs4aG8wd2c4WDIzOWN2NzN6NjBZcGYvYjd0ZjZkMCsyN2xKYmI5YmZDM1IvNjRNWnhYZTlRWXppeDlkeHAvTzJDOVBJYU5NSU1GCitnZkpnN1gvcmUvc25UbDcvd2trOG5sOWpKV1huOFR0eURHZlZIdjdOMXZkak9LdDBlU2ZhSjlsc0hzTkdtTUdDUUsrTTFmYXgyM3YvCitlTWJENWR0NGpCN0RZbUx0K0h1ZEE1akJna0F4ZGR1czIyd2V3MGFZd1NMK2VkYy9TQjh1eXdkdThmaS9LNC9TdDhmemE2d1A2eU40CiszQmpPcUYzL3FKRVpMUHAvVFMvOTlLWEVucS82Skp2TlkyaTJPSStoMmVJOGhtYUw4eGlhTGM1amFMWTRqNkhaNGp5R1pvdnpHSm90Cit6bU5vdGppUG9kbmlQSVptaS9NWW1pMHV4dERNbHZTblAvMS9SSTYxdFZmWlliWUFBQUFBU1VWT1JLNUNZSUo9CisKKy0tLS0tLT1fTmV4dFBhcnRfMDFEMzg2QjcuRTA1Rjg1OTAKK0NvbnRlbnQtTG9jYXRpb246IGZpbGU6Ly8vQzovMjY3QkEyRDQvVGVzdF9maWxlcy9pbWFnZTAwNi5wbmcKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorQ29udGVudC1UeXBlOiBpbWFnZS9wbmcKKworaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQTJJQUFBSDZDQVlBQUFCbEJmK1ZBQUFBQVhOU1IwSUNRTUI5eFFBQUFBbHdTRmx6QUFBVworSlFBQUZpVUJTVklrOEFBQUFCbDBSVmgwVTI5bWRIZGhjbVVBVFdsamNtOXpiMlowSUU5bVptbGpaWC90TlhFQUFHTmNTVVJCVkhqYQorN2QzM3N4em5ZYTk1L3dOYlcvdkwxdTdXK3RhMTdIdTk5cjI3S3R2WHZyNm1ra3ZYc21STFZpSVZLSW1pUklvWklBbUFJQUNDUVl3QQorbUhNbUdNQUFFQVJ6UWc1RUpJZ2NpRVRraklPY2dhTjN6OU5TdzhQaG1aNEQ5a3gzVDgvenFYb0w1RGt6ZlhxNjM3ZjcvZmI3ZHM4ZgorclZ5NThxRVZLMVljN3lyaDQ0OC90bGdzRm92RllyRllMQlpMRXdxWnE2dWM2TXBnTC85UkhNSSsrZVFUaThWaXNWZ3NGb3ZGWXJFMAorc2NSaDdJKzYwbGowZzg3T3p2QzczLzNPWXJGWUxCYUx4V0t4V0N4TktHUXVzaGNaN0k4WUl1Ti9KRW1TSkVuTlJmWWlnNTBLWWlRMAorU1pJa1NWSnprTGtNWXBJa1NaS1VJWU9ZSkVtU0pHWE1JQ1pKa2lSSkdUT0lTWklrU1ZMR0RHS1NKRW1TbERHRG1DUkpraVJsekNBbQorU1pJa1NSa3ppRW1TSkVsU3hneGlraVJKa3BReGc1Z2tTWklrWmN3Z0prbVNKRWtaTTRoSmtpUkpVc1lNWXBJa1NaS1VNWU9ZSkVtUworSkdYTUlDWkpraVJKR1RPSVNaSWtTVkxHREdLU0pFbVNsREdEbUNSSmtpUmx6Q0FtU2VwV1oyZG5PSHo0Y0RoMDZGQTRlZktrR3lTbAorNDhlUGg0TUhENGFqUjQ5Nm5wVWtHY1FrU2QzYnZuMTd1T0dHRzBMZnZuM0QvUG56M1NBcHZmdnV1K0dDQ3k0SWp6enlTTmkvZjc4YgorUkpMYW5FRk1rdG9NeC9nREJ3NkVYYnQyaFowN2QwYWx1MkN3WmN1VzBLZFBuM0QrK2VlSE9YUG10UHpuWmxSdjc5NjlwejV6VDhxZQorUFh1aWtVRXdPc2gyT25iczJPZjYrNis5OWxyNDhZOS9ITzY4ODg2d2I5OCtLNklrdFRtRG1DUzFFWUxGK1BIanc3WFhYaHQrOHBPZgoraERQUFBET2NkZFpaNFpwcnJnbXpaOCtPZmgvYnVuVnI2TisvZjdqb29vdkNoeDkrMlBLZmZlUEdqV0h3NE1IaHU5LzlidlNaNDNMMgorMldlSGM4NDVKL3IzUnovNjBhbWYvL0NIUHd6OSt2V0xBaXZUQ1I5NzdMSG8vVysvL2Zibk9rKys4Y1liNFdjLysxbTQ1NTU3REdLUworSklPWUpMVURSblVXTDE0Y3JyNzY2aWhnbkhmZWVkRm9GOU1PS1JkZmZIRVV6QWhvakFTaHFFR01lNjBZclZ1L2Z2MXBqVTV0MjdZdAorM0gvLy9hRjM3OTZuUGpmbFY3LzZWUlJJZi8zclgzOXFtL0RmakY0eGlzWTBUYmJSdi83cnY0WTc3cmdqV29jWTUweGVzM2J0MnREUgorMFZIejd4dkVKRW1WREdLUzFBYm16WnNYTHIzMDB2Q2Q3M3dudXUrTDBhOTR5aDNXckZrVEhucm9vWERoaFJkR1UraEFjQ2xpRU51OAorZVhNVXBoaTlXcjE2ZGVybFBmcm9vMUhBZXVxcHA2S1JyKzR3TFhIRWlCSFJ0cHMyYmRxbmZzZVV4NWRmZmpsODR4dmZDQTgvL0hETgordjJNUWt5UlZNb2hKVXNseFA5aHR0OTBXaFkzcnI3OCtHdW5xem9rVEo4S2tTWlBDckZtem92OHZhaERidlh0M3VPS0tLNklndG1uVAorcHRUTDYwa1FxK2YxMTE4UC8vUlAveFFlZi96eG1xOHhpRW1TS2huRUpLbmtKa3lZRUUyLzQwRVJpeFl0NnZIN0txY21MbGl3SVBvWgorbzFFOFFaRVJ0aFVyVmtRalJiVVFhalpzMkJBV0xsd1lQdnJvbytoOXZDZWUrbGlOUjdzemZYTFZxbFhSL3hNZytYL2V1MjdkdXVqKwordFdYTGxvV3hZOGVlbWtySi9Wcjhuc0t5Q1pPbmcxRkJubUpJRUh2eXlTZHJmaDVHdlpoNnlQYmJzV1BIcWZkeTN4a1BNbm5nZ1FlaQorMGNaYmJya2wyalp6NTg2TlBpLzNsOFY2RXNTWThzaDVtUGZ5bWZoN2JIUFB5NUpVUGdZeFNTb3hPdlozMzMxM0ZEUnV1dW1tVXlHaQorSitJZ2Rza2xsNFNwVTZlR21UTm5oaXV2dkRKOC9ldGZEMS83MnRlaUIxd3dBa1FZcVVZbzRuZUV1RzkrODV2aDMvN3QzOEszdnZXdAorS0R3eE9yZHk1Y3JQdkdmcDBxWFJNcmxQamZCR3VHRzl6empqakhEVlZWZEZnWkovbVFMSWFOaFBmL3JUOFAzdmZ6OHEzL3ZlOTZMMworOFoxbnA2T25RWXpsRXJKNGlFYzhkWlA3MDU1OTl0bndMLy95TDlFNjhMQVA3alZqWFhnZ0NKOTE4dVRKcDVaUkw0aHgvbjMrK2VlagorKy9mKytaLy9PUXAyL011OWF1UEdqVHZ0enlaSktqYURtQ1NWR0ErUElJQVJobDU4OGNWUFBXU2lIb0xZZ0FFRG9tQkFJR05VamFjcgorRXBEdXV1dXU2RHV4Q0VVRXZlckgzdzhhTkNpY2UrNjVZZWpRb2RGOVU5eERSZEM1OGNZYm85REM4cW9EM1BMbHk2UFFSL0FnOFAzOAorNXo4UHQ5OStlN2p2dnZ1aWFZTUV0U2xUcGtRUDNHQmRDRG9zKzVWWFhva0s5MjVWM3ZmV0V6ME5ZdnljZGZuRkwzNFIzbnJycmVobgorakpLeFRvUW50a3Y4dWZpc3JBL1RGU3VuVGlZRk1jNjlmRzdDMTI5Lys5dnd4Qk5QaEpFalI0Wjc3NzAzMmlZRXZGZGZmZlZ6VDUyVQorSkJXUFFVeVNTb3hwZm9TRGIzLzcyK0g5OTk4L3JmY1N4T0xIdlJNZ1huamhoVTg5RmZDOTk5NkxualJJT0dFYVhZeHpDSCtMQjRKVQorNC80dVJyVUlXUVNWU2dReDd2MGlGUEg3T1BERXk0elBUU3lEMEVJUVMzdVAyT2tHTVVic0t0Y3JSc2hpOUlvQVZVdXRJSGJreUpGbworMll5MkVUS1pvbG1KcVkrTXR2R3dGYVptU3BMS3dTQW1TU1hHL1VxWFhYWlpORFd3K21sLzlSREVCZzRjR0UwQkpJUlZZeFJzeUpBaAorMFVNcTNuenp6UjZmTzBhUEhoMHRzL3JCRmdReDFwVVF4dlEvUnB5Nnd6MVRCRGFDV05xbkpqWWlpTEdlZkNaR0hWbFdMYldDR09FcQorZm5RK29hdzdUei85ZFBqQkQzNFFSbzBhWmFXV3BKSXdpRWxTaVhHdkZsOUt6SlMzenhQRTRudkV1R2VyR3RNY2VlUTk5MzRSRUxxYgorRnNoVU9nTFdqQmt6d3ZUcDA2Tjd6Zmh1TGg0Y3dwVER5dk1OcitQeCtZeVk4UjFodFpRdGlQSEFFY0lubjRsN3l1SnRSZUcvMldaOAorZHhuTFoxcW9KS2tjREdLU1ZHSTh0WkQ3dFFnYTQ4ZVBQNjMzOXVRTG5ibDNpMlZ6WDFSbEVDTzQ4SFJEN2lYai9YeUpOSVZSSFVibgorQ0ZHRWl1b2d4bXNaR2VydVlSNnhzZ1V4UWl4QmpHMFRiNmU0Y0c4WVUwT1o5c2p5a3g2UEwwbHFMUVl4U1NveE92eE1IK1RKZnNPSAorRDY4NTlhMDc5WUlZNXdyQ1MzVVE0eDRuL2haQmdpbDN2SWI3d1NnOGNJS25KaklpeHYxUUJyRi9EMktYWDM1NXRKeDRXOFdGOXpIMQorODUxMzNrbmNMcEtrMW1JUWs2U1NvM05QOE9FcGgvRjNkUFhFNXcxaVBGemlsNy84WlZTWVdsZU5oM3cwS29pdFdiTW0xYlpwZEJEagoreTZGcnFSWEUzbjMzM2VqblYxOTl0WlZWa3RxSVFVeVNTbzR2UmVZaEdOekw5ZUNERDM3bXFYeVZDRU04SWg3YnRtMzdYRUdNWUVFSQordS83NjY3c05Oanp1UFUwUTQwbUpqQjd4bEVFK1d4cU5DbUo4ZnFZUDhyajVXbDhSVUN1SThWbjVpZ0FlOSsrSWx5UzFENE9ZSkpVYworRDh6Z2U2MElBUVFnZ2dEM2psVWlkREZGanBFbXdrVDhzODhUeEdiTm1oWE9QLy84OEp2Zi9PWXpJMVo4TVRITFl6MCs3ejFpUEw2ZQorMFNQdXFZcS9YQmxNdXp6ZDgxY2pnaGgvazJtRGZFVUEzeWUyWmN1VzZPY0VOTDcwT1ZZcmlMRi8yT1o4U1RYZnM4YUlYelcraUp2UgorUmZhSkpLa2NER0tTMUFZT0hUb1VoU1VlRzg4VEZIbVNJdmVPeFlVbkZmSmdpTjY5ZTUrNjc0cXBpZnljSnhuV0NtSjhieGIzbjFVKworTmZIQWdRTlJJSW4vem1PUFBSWTlmdjNtbTIrT1JuNElhYlZHeFBoYmZKbHpVaEFqNFBDMFJrYkVDRzYzM25wclZGaVhXa0dxRnRhWgorTDRYbU15UzluNThQR3pZcytzNDA3dGVxdG1qUm91aHpzWDE1T0FycmM4c3R0NFM1YytlZWVnMzNlL0Y5WUh3QmR2VVhPcTlidHk3MAorN2RzM2VqQUgvL0tRRTc2QW0zREljdGdtYk1zRkN4WlltU1dwSkF4aWt0UW1HREVpTUJBOEdKbmhuaWFtMHpFYXhQZUY4U1hNR3pkdQorUFBWNlJuWUlBSVNuN3I2Y21YTUZJWXZ2RVh2cHBaYys5ZFJFbHNQdkNDWThKWkhSSzZaSGNpOFZvMWc4eUlPUm9jcnpEZCtueGQvcQorMWF0WDlOajlKSXdRTVpMRmN2ajdoRDZlNEhqaXhJblQyaWFzTTlNMVdRYnJteFRFZU1nSW42ZjZpNmpCcUJhUG0rY3pmdU1iM3doZgorLy9yWG8vL212QnJqUVNXRVJ4NUZYeDNFUUJnYk0yWk05SFVCQkVPQ01ZVXBpNFJBd2pBaFY1SlVEZ1l4U1dvejNDTkdwNTlSSndvUAorOE5pNWMrZG5Yc2U5VG55ZkY5TUxhd1dBN2R1M1J5Tlp1M2J0K3N6dkdJVmJ1M1p0ZElLaE1NSkdVQ0lROG5mNS8wcUVIZjRXNjlhVAorcHp1eVRvemVFZHI0bHkrWS9qeVk3c2RuNExOMDkxMW80T2RNR1dSYk1UV3lGbDdEWjJXZENMS1Z3WkQzOFg1K1h1dkxxdms1ditmOQorckJQYmlWRDdlVCtiSkttNERHS1NKRW1TbERHRG1DUkpraVJsekNBbVNaSWtTUmt6aUVtU0pFbFN4Z3hpa2lSSmtwUXhnNWdrU1pJaworWmN3Z0prbVNKRWtaTTRoSmtpUkpVc1lNWXBJa1NaS1VNWU9ZSkVtU0pHWE1JQ1pKa2lSSkdUT0lTWklrU1ZMR0RHS1NKRW1TbERHRAorbUNSSmtpUmx6Q0FtU1pJa1NSa3ppRW1TSkVsU3hneGlraVJKa3BReGc1Z2tTWklrWmN3Z0prbVNKRWtaTTRoSmtpUkpVc1lNWXBJaworU1pLVU1ZT1lKRW1TSkdYTUlDWkpraVJKR1RPSVNaSWtTVkxHbWhiRU9qczdUeFdEblNSSmtpVDl1NFlIc1lNSEQ0YUhIbm9vWEhubAorbGFGZnYzNmhmLy8rNGEyMzNnb25UcHh3YTB1U0pFbFNhSEFRVzdWcVZianV1dXZDNDQ4L0hsYXZYaDAyYk5nUWxUMTc5amdxSmttUworSkVsLzBMQWdkdno0OFhEWFhYZUZtMisrT1d6ZnZ0MHRLMG1TSkVrMU5DeUlNUnAyeFJWWGhNbVRKN3RWSlVtU0pDbEJ3NExZdSsrKworRy9yMjdSdG16Wm9WdG0zYkZqWnYzaHkyYk5rU1RVdHNoSk1uVDBhamJ0eHJackZZTEJhTHhXS3hXQ3habHNJR3NWZGZmVFVNR0RBZworM0gvLy9lR0dHMjZJUWxtZlBuM0N3SUVEbzlHeXRQZUliZDI2TlN4ZHVqUmFVWXZGWXJGWUxCYUx4V0xKb2l4ZnZqektNendOdnBCQgorN0xubm5ncy8rY2xQd3Z2dnZ4OGxSa2F2RGg4K0hJWU1HUkt1dXVxcWFKUXNqWjA3ZDBZUEFGbTdkcTNGWXJGWUxCYUx4V0t4WkZMSQorUit2WHJ5OXVFSHZqalRmQ29FR0R3cG8xYXo3MTh4a3pab1NMTHJvb3pKMDcxNG1na2lSSmtoUWFHTVFtVEpnUWV2ZnVIUll0V3ZTcAorbjArYk5pMWNjTUVGWWVIQ2hXNXRTWklrU1FvTkRHSThtSU12Y1g3eHhSYy85Zk1ISG5nZ3VsZk1SOXBMa2lSSjB1ODFMSWd4WjNMTQorbURHaFY2OWVZZFNvVVdIaXhJbmgrZWVmang3V01XblNwSWJQcVpRa1NaS2tWdFd3SUJaNzY2MjN3cTIzM2hwdXUrMjJNR3pZc0xCaworeVJLM3NpUkpraVJWYUhnUWt5UkpraVFsTTRoSmtpUkpVc1lNWXBJa1NaS1VNWU9ZSkVtU0pHWE1JQ1pKa2lSSkdUT0lTWklrU1ZMRworREdLU0pFbVNsREdEbUNSSmtpUmx6Q0FtU1pJa1NSa3ppRW1TSkVsU3hneGlraVJKa3BReGc1Z2tTWklrWmN3Z0prbVNKRWtaTTRoSgora2lSSlVzWU1ZcElrU1pLVU1ZT1lKRW1TSkdYTUlDWkpraVJKR1RPSVNaSWtTVkxHREdLU0pFbVNsREdEbUNSSmtpUmx6Q0FtU1pJaworU1JremlFbVNKRWxTeGd4aWtpUkprcFF4ZzVna1NaSWtaY3dnSmttU0pFa1pNNGhKa2lSSlVzWU1ZcElrU1pLVU1ZT1lKRW1TSkdYTQorSUNaSmtpUkpHVE9JU1pJa1NWTEdER0tTSkVtU2xER0RtQ1JKa2lSbHpDQW1TWklrU1JremlFbVNKRWxTeGd4aWtpUkprcFF4ZzVnaworU1pJa1pjd2dKa21TSkVrWk00aEpraVJKVXNZTVlwSWtTWktVTVlPWUpFbVNKR1hNSUNaSmtpUkpHVE9JU1pJa1NWTEdER0tTSkVtUworbExHR0JiR1RKMCtHelpzM2gyWExsb1VsUzVaRVpmSGl4ZEgvSHpseXhDMHRTWklrU1gvUXNDRFcwZEVScnJubW12Q3JYLzBxREI0OAorT0NxREJnMEtOOTEwVTlpeVpZdGJXcElrU1pMK29LRkJiT0RBZ1dITW1ERnVWVW1TSkVsSzBOQWd4Z2pZNk5HajNhcVNKRW1TbEtEaAorUWV6Tk45OTBxMHFTSkVsU2dvWUZzVjI3ZG9VK2ZmcEU5NG05OGNZYlVSazdkbXc0Y09DQVcxbVNKRW1TS2pRc2lCMDZkQ2k4L2ZiYgorNGI3Nzdvdkt2ZmZlRzNyMTZoVWVmdmpoNkdtS2FiSDgzYnQzaHoxNzlsZ3NGb3ZGWXJGWUxKWUdGZ1pQOGk0SER4NE0rL2J0SytUMgorMmJ0M2I4Ty80cXVwM3lPMllzV0tjUDc1NTRjbm4zd3lIRDkrUE5XeU5tN2NHT2JQbng4OUV0OWlzVmdzRm92RllyRTBwaXhjdURCTQorbWpRcFRKdzRNZGN5WWNLRU1IUG16TEIwNmRKQ2JaOUZpeFpGWDhuVjJkblpPa0VNOTl4elQ3ajIybXVqSkprR0tYbkhqaDNSRkVpTAoreFdLeFdDd1dpOFhTbU1KWFRUMy8vUE5oK1BEaDRabG5uc210UFA3NDQySHExS25STExnaWJaK2RPM2RHejhOb3FSRXgzSDMzM2RGOQorWTJtRG1DUkprcVRHTzNueVpIajU1WmZEYzg4OUZ3V3l2TXBUVHowVjVzMmIxemJidldGQmJPN2N1Wi9aY0RObXpBam5uWGRlZU8rOQorOTZJZExFbVNKS2xZamgwN1ZwZ2c5dEZISDdYTmRtOVlFT1ArcmV1dXV5N2NjTU1ONGM0Nzd3eTMzMzU3OUJURjExOS9QZHE1a2lSSgora29ySElKYVBoZ1V4M3JOZ3dZTHc3cnZ2aHZmZmZ6OGFCV09VVEpJa1NWSnhHY1R5MGZSN3hDUkpraVFWbDBFc0h3WXhTWklrcVkwWgoreFBKaEVKTWtTWkxhbUVFc0h3WXhTWklrcVkwWnhQSmhFSk1rU1pMYW1FRXNId1l4U1pJa3FZMFp4UEpoRUpNa1NaTGFtRUVzSHdZeAorU1pJa3FZMFp4UEpoRUpNa1NaTGFtRUVzSHdZeFNaSWtxWTBaeFBKaEVKTWtTWkxhbUVFc0h3WXhTWklrcVkwWnhQSmhFSk1rU1pMYQorbUVFc0h3WXhTWklrcVkwWnhQSmhFSk1rU1pMYW1FRXNId1l4U1pJa3FZMFp4UEpoRUpNa1NaTGFtRUVzSHdZeFNaSWtxWTBaeFBKaAorRUpNa1NaTGFtRUVzSHdZeFNaSWtxWTBaeFBKaEVKTWtTWkxhbUVFc0h3WXhTWklrcVkwWnhQSmhFSk1rU1ZKaHJkbDhNTnc2NHVOdworeDhoVnVaWmJSNndJYTdjZUt1VTJOb2psd3lBbVNaS2t3cHEyYUZmNHkzUEdoYis5Y0ZKdTViOTFsZjl5enZnd2MrbnVVbTVqZzFnKworREdLU0pFa3FySmxMTzhML3VHUnkrSjk5UHNpdGZMMnIvTU1sVThLSEgrOHA1VFkyaU9YRElDWkprcVRDTW9nMW4wRXNId1l4U1pJaworRlpaQnJQa01Zdmt3aUVtU0pLbXdER0xOWnhETGgwRk1rcW9jbmY5RzJEUHNHMkh2L1dmbVYrNzlRZGo3d0ZuaDVKNHQ3aEJKYmMwZworMW53R3NYd1l4Q1NweXBHcFQ0V2RsLzd2WWRmVmY1NWZ1ZXJQd3E0QmZ4Rk83bHpuRHBIVTFneGl6V2NReTRkQlRKS3FISm4rYk5qVgorNXorR2ptdi9Lcjl5emY4WE9xNzc2M0J5MTNwM2lLUzJaaEJyUG9OWVBneGlrbFRGSUNaSnhXRVFhejZEV0Q0TVlwSlV4U0FtU2NWaAorRUdzK2cxZytER0pwSys2SnpyQmwxNUd3dFNQL3NybHJQWTRlNzNTblNDa1p4Q1NwT0F4aXpXY1F5NGRCTEtYRm4rd0xYKzA5TFh5agorNy9Ud3ovM3lMVis2YkVxWXRhekRuU0tsWkJDVHBPSXdpRFdmUVN3ZkJyR1VGcTdlMTNWd21CSytkdm0wOEk5WDVGdis3cUpKWWNZUworZzVpVWxrRk1rb3JESU5aOEJyRjhHTVJTV3JSbVgvalNaVlBEMTYvOElOY0RCSVdERkFjclNla1l4Q1NwT0F4aXpXY1F5NGRCTENXRAorbUZRK0JqRkpLZzZEV1BNWnhQSmhFRXZKSUNhVmowRk1rb3JESU5aOEJyRjhHTVJTTW9oSjVXTVFrNlRpTUlnMW4wRXNId2F4bEF4aQorVXZrWXhDU3BPQXhpeldjUXk0ZEJMQ1dEbUZRK0JqRkpLZzZEV1BNWnhQSmhFRXZKSUNhVmowRk1rb3JESU5aOEJyRjhHTVJTTW9oSgorNVdNUWs2VGlNSWcxbjBFc0gwMExZb3NXTFlvMjZJUUpFNktkVzFZR01hbDhER0tTVkJ3R3NlWXppT1dqS1VGc3g0NGRZY0NBQWVITQorTTg4TU45eHdROWkzYjE5cE42QkJUQ29mZzVna0ZZZEJyUGtNWXZsb1NoQmpRdzRkT2pRTUdUSWszSFhYWFFZeGc1alVVZ3hpa2xRYworQnJIbU00amxvK0ZCYk1XS0ZkRm8ySnc1YzZLZGVmdnR0eHZFREdKU1N6R0lTVkp4R01TYXp5Q1dqNFlHTWQ3M3dBTVBoS2VmZmpvYworUG53NFBQdnNzMkhZc0dFR01ZT1kxRklNWXBKVUhBYXg1ak9JNWFPaFFleUREejRJZ3dZTkNpdFhyb3orbjQxWjlpQzIrSlA5aFFwaQorczVidDlvZ3RwWFIweG5PRkNXS2RIUnZjSVpMYUduMmJvZ1N4dVN2MmxuSWJIejkrdkRCQmJONjhlVzFUdHhzV3hBNGVQQmh1dnZubQorTUdiTW1ORFoyUm45YlBqdzRkSFV4QU1IRHFSZTBZNk9qckIyN2Rxd1ljT0d3cFR0V3phRzhUTlhoYS8wbmxhSUlIWkdWeUI4Yy9LSworc0gzcnhrSnRKNHVsbGNxNmJSMWg2OXYzaDkzOXZwQnZFQnY4eGE1Ly96cHNYRHdyck4rODFYMWpzVmphc3RDbm9XOURIeWZ2SVBhbAoreTZhRmQ2YVdyNSsxY2VQR3NHYk5takJ5NU1nd1lzU0lYSU1ZcytvbVQ1NGNObS9lWEtodHRINzkrckJwMDZaVEdhZHdRV3pVcUZIUgorRXhMWmNQR0NHemtpeG5JWEwxNGNsaTFiVnBpeWJzM3k4T2JFUlFVS1l0UEN5Kzh0RE9zL1dWNm83V1N4dEZKWnNuWnpXRGZtenJEbgorcWo4dFJCQmJPV2RpV0xycUUvZU54V0pweTBLZmhyNE5mWndpQkxFeFk4dlh6MXErZkhuMHRWTXZ2ZlJTN2tIc21XZWVDZVBHalF1cgorVnEwcTFEWmF1blJwOUJ5TVFnWXhScndZRFR2NzdMTkQvLzc5dzlWWFh4MlZDeTY0SUp4NzdyblJmL1B3ampRUEFUbHg0a1E0ZXZSbworb2NyeFkwZkRSeC92S3REVXhDbGg2b0p0NGZqeFltMG5pNldseXZFVDRjQ1VwMEpIM3o4cHhOVEV3MXRXaGFQSGpydGZMQlpMV3hiNgorTlBSdDZPTVVZV3Jpak1VN1N0blBvaS9Qb0VyZVV4T1pUVWRtNEo2MW9tMmpabnd2Y2tPQzJNbVRKOE91WGJ1aW9jMTE2OVpGVXdoWgorenIzMzNodU5raTFac2lUczM3Ky9sSE03dlVkTUtwOWkzU08yMFIwaXFhMTVqMWp6TWVEaFBXTFphOHIzaU1YWW1IeWYySkVqUjBxNworQVgxcW9sUStQalZSa29yRHB5WTJuMDlOekVmVGdoakxZSVBlZi8vOXBSME5nMEZNS2grRG1DUVZoMEdzK1F4aStXanFpRmc4djdOUgoreXlzaWc1aFVQZ1l4U1NvT2cxanpHY1R5MGRRZzFnNE1ZbEw1R01Ra3FUZ01ZczFuRU11SFFTd2xnNWhVUGdZeFNTb09nMWp6R2NUeQorWVJCTHlTQW1sWTlCVEpLS3d5RFdmQWF4ZkJqRVVqS0lTZVZqRUpPazRqQ0lOWjlCTEI4R3NaUU1ZbEw1R01Ra3FUZ01ZczFuRU11SAorUVN3bGc1aFVQZ1l4U1NvT2cxanpHY1R5WVJCTHlTQW1sWTlCVEpLS3d5RFdmQWF4ZkJqRVVqS0lTZVZqRUpPazRqQ0lOWjlCTEI4Rworc1pRTVlsTDVHTVFrcVRnTVlzMW5FTXVIUVN3bGc1aFVQZ1l4U1NvT2cxanpHY1R5WVJCTHlTQW1sWTlCVEpLS3d5RFdmQWF4ZkJqRQorVWpLSVNlVmpFSk9rNGpDSU5aOUJMQjhHc1pRTVlsTDVHTVFrcVRnTVlzMW5FTXVIUVN3bGc1aFVQZ1l4U1NvT2cxanpHY1R5WVJCTAoreVNBbWxZOUJUSktLd3lEV2ZBYXhmQmpFVWpLSVNlVmpFSk9rNGpDSU5aOUJMQjhHc1pRTVlsTDVHTVFrcVRnTVlzMW5FTXVIUVN3bAorZzVoVVBnWXhTU29PZzFqekdjVHlZUkJMeVNBbWxZOUJUSktLd3lEV2ZBYXhmQmpFVWpLSVNlVmpFSk9rNGpDSU5aOUJMQjhHc1pRTQorWWxMNUdNUWtxVGdNWXMxbkVNdUhRU3dsZzVoVVBnWXhaVjduanAwTWg0L21YNDZmNkhSbnFIQU1ZczFuRU11SFFTd2xnNWhVUGdZeAorWmVub3NjNXd3ZTN6dzNjSHpReG5YVDg3dC9MUFYwMFBENzMraVR0RWhXTVFhejZEV0Q0TVlpa1p4S1R5TVlncDAvcldGY1IrTUhoVworK1B1TEo0ZXY5SjZhVy9uaXJ5ZUVJUytzZEllb2NBeGl6V2NReTRkQkxDV0RtRlErQmpGbFd0KzZndGlQYjVnVHZ0SnJhcTdua0wrOQorY0ZLNFkrUXFkNGdLeHlEV2ZBYXhmQmpFVWpLSVNlVmpFRk9tOWMwZ0ppVXlpRFdmUVN3ZkJyR1VER0pTK1JqRWxHbDlNNGhKaVF4aQoreldjUXk0ZEJMQ1dEbUZRK0JqRmxXdDhNWWxJaWcxanpHY1R5WVJCTHlTQW1sWTlCVEpuV040T1lsTWdnMW53R3NYd1l4Rkl5aUVubAorWXhCVHB2WE5JQ1lsTW9nMW4wRXNId2F4bEF4aVV2a1l4SlJwZlRPSVNZa01ZczFuRU11SFFTd2xnNWhVUGdZeFpWcmZER0pTSW9OWQorOHhuRThtRVFTOGtnSnBXUFFVeVoxamVEbUpUSUlOWjhCckY4R01SU01vaEo1V01RVTZiMXpTQW1KVEtJTlo5QkxCOEdzWlFNWWxMNQorR01TVWFYMHppRW1KREdMTlp4RExoMEVzSllPWVZENEdNV1ZhM3d4aVVpS0RXUE1aeFBKaEVFdkpJQ2FWajBGTW1kWTNnNWlVeUNEVworZkFheGZCakVVaktJU2VWakVGT205YzBnSmlVeWlEV2ZRU3dmQnJHVURHSlMrUmpFbEdsOU00aEppUXhpeldjUXk0ZEJMQ1dEbUZRKworQmpGbFd0OE1ZbElpZzFqekdjVHlZUkJMeVNBbWxZOUJUSm5XTjRPWWxNZ2cxbndHc1h3WXhGSXlpRW5sWXhCVHB2WE5JQ1lsTW9nMQorbjBFc0h3YXhsQXhpVXZrWXhKUnBmVE9JU1lrTVlzMW5FTXRIdzRQWXlaTW53NGtUSjZMU0RvSE9JQ2FWajBGTW1kWTNnNWlVeUNEVworZkFheGZEUXNpQkhBeG8wYkZ3WU5HaFQ2OXUwYit2WHJGL3IzN3g4dHI4d01ZbEw1R01TVWFYMHppRW1KREdMTlp4RExSOE9DMkx4NQorODhJenp6d1RGaTFhRkRadDJoUTJidHdZcnJubW1uRFpaWmVGRFJzMmxIWURHc1NrOGpHSUtkUDZaaENURWhuRW1zOGdsbytHQmJFagorUjQ2RVE0Y09mZXBuTTJiTUNPZWRkMTZZTld0V2FUZWdRVXdxSDRPWU1xMXZCakVwa1VHcytReGkrV2pxd3pvbVQ1NGNqWWlWZVlNdQorL21SL29ZTFlyR1c3UFdKTEtSMmQ4VnhoZ2xoblIzbG5GT2dQOWUzNDd3b1R4TzRjdGRvZG9zS2hiMU9VSURaM3hkNVNidVBqeDQ4WAorSm9neHk2NWRORFNJN2QrL1AyemV2RG1hbGpobnpwd3dZTUNBTUdyVXFDaGxwOFU5YUZTU0lwVVRKNDZIZVNzNkNoWEVQbGkwSTV3OAorVWF6dFpMRzBWRGx4TWh5YytuUmhndGpSYld1NjF1bUUrNldraGZQSWdVTkh1NExZN0VJRXNXRXZydWc2aDVTdnZ0R0g2T3pzTEVRcAorWW4rbTBQdXVxNDNRdHlsS0VKdTFkRmNwKzFuTWFpdEtFUHZ3d3cramgvNFY3M2g5b3RoQmpCRXc3Z3ZyMDZkUFZPNjU1NTZ3YXRXcQoraHF6NGxpMWJ3dEtsUzZNVkxVcFovOG1LOE5ha3hlRXJ2YWNWSW9pZGNkbTBNUHI5UldIRDJoV0YyazRXU3l1VlpldTJoUFd2M2huMgorWFBXbitRYXh3Vi9zK3Zldnc2b1BKNFhscTllNmIwcGFWcTM4T0N4YXNqejhjUENNOE5YTHArVjZEdm43UzZhRzZ4NmJHemF1VzFtcQorYmJ4aXhZcXdaTW1Tc0hEaHd1Zys5cnpMNHNXTHJmdW5VZWpUMExlaGo1TjNFUHRTMXpxOE9xNTgvYXk0amJ6MDBrdGh4SWdSdVFZeAorbmpjeGZ2ejRzSHIxNmtKdG8rWExsMGVaaG9zcGhRMWl2SThyUGZFajdCOTk5TkZ3N3JublJnRXQ3WFRIblR0M2hqVnIxb1MxYTljVworcG16ZHRDNk1uYjZpUUVGc2FuaDk0dkt3YmZPNlFtMG5pNldWeWlkYmRvYk5iOTRiZHZmN1FpR0MyUHFGMDhNbkd6ZTdiMHBhTnF4ZgorRzFhcytpU2NlZTNNM0lQWWY3OTRTcmpoaVhsaDI1YjFwZHJHek5MaHFjNVBQLzEwMU1uTXN6ejc3TE5oOU9qUlVWOXIzVHJQMVQwcAorOUdubzI5REhLVUlRZTJ2S3g2WHJaMUVYQ1JsRkNHSzAwMG1USmtYdHRsQjlnNjQyeThNSEN4M0V1cHRPZU1zdHQ0U2Jicm9wbXJaWQorUmo2c1F5b2ZIOWFoTEJYcEhyR3lQcXhqNXN5WjRja25uOHc5aU5ISmZPMjExNnowcDd2L2ZGaEgweFhwSGpFZjF0SEFMMkorNktHSAord3NDQkEwTkhSemtEZ2tGTUtoK0RtREt0Yno0MXNla0lZblR3OHV4Z3h0T3VYbi85OVliMnM5cUJRYXo1ZkdwaVBob1d4QmpTWkJpeAorMHZyMTY4T2xsMTRhSG5ua2tYRDA2TkZTYmtDRG1GUStCakZsV3Q4TVlrMW5FR3Z4L1djUWF6cURXRDRhRnNUR2pCa1Ricnp4eG1qSQorblp2c21JOTkvZlhYaHlGRGhrUnpUOHZLSUNhVmowRk1tZFkzZzFqVEdjUmFmUDhaeEpyT0lKYVBoZ1V4NXBaeUF5cjNoTjErKysxaAorNk5DaDBjNHM2MGhZekNBbWxZOUJUSm5XTjROWTB4bkVXbnovR2NTYXppQ1dqNmJmSTFaMkJqR3BmQXhpeXJTK0djU2F6aURXNHZ2UAorSU5aMEJyRjhHTVJTTW9oSjVXTVFVNmIxelNEV2RBYXhGdDkvQnJHbU00amx3eUNXa2tGTUtoK0RtREt0YndheHBqT0l0ZmorTTRnMQorblVFc0h3YXhsQXhpVXZrWXhKUnBmVE9JTloxQnJNWDNuMEdzNlF4aStUQ0lwV1FRazhySElLWk02NXRCck9rTVlpMisvd3hpVFdjUQoreTRkQkxDV0RtRlErQmpGbFd0OE1ZazFuRUd2eC9kZGlRYXh6Lzg1dzhQV2J3OEhYYnZ6OXYzbVdsd2VGRSt2bjExMW5nMWcrREdJcAorR2NTazhqR0lLZFA2WmhCck9vTllpKysvRmd0aUo3ZXRDcnY2L2tuWWRlVWYvLzdmSE11T2kvN1hjR1RXUzNYWDJTQ1dENE5ZU2dZeAorcVh3TVlzcTB2aG5FbXM0ZzF1TDdyOVdDMkk1UC92MDRudWQ1cEtzUXhvN09IVk4zblExaStUQ0lwV1FRazhySElLWk02NXRCck9rTQorWWkyKy93eGlCckdTTW9pbFpCQ1R5c2NncGt6cm0wR3M2UXhpTGI3L0RHSUdzWkl5aUtWa0VKUEt4eUNtVE91YlFhenBER0l0dnY4TQorWWdheGtqS0lwV1FRazhySElLWk02NXRCck9rTVlpMisvd3hpQnJHU01vaWxaQkNUeXNjZ3BrenJtMEdzNlF4aUxiNy9ER0lHc1pJeQoraUtWa0VKUEt4eUNtVE91YlFhenBER0l0dnY4TVlnYXhraktJcFdRUWs4ckhJS1pNNjV0QnJPa01ZaTIrL3d4aUJyR1NNb2lsWkJDVAoreXNjZ3BrenJtMEdzNlF4aUxiNy9ER0lHc1pJeWlLVmtFSlBLeHlDbVRPdWJRYXpwREdJdHZ2OE1ZZ2F4a2pLSXBXUVFrOHJISUtaTQorNjV0QnJPa01ZaTIrL3d4aUJyR1NNb2lsWkJDVHlzY2dwa3pybTBHczZReGlMYjcvREdJR3NaSXlpS1ZrRUpQS3h5Q21UT3ViUWF6cAorREdJdHZ2OE1ZZ2F4a2pLSXBXUVFrOHJISUtaTTY1dEJyT2tNWWkyKy93eGlCckdTTW9pbFpCQ1Q2dnRrNjZFd1kwbEhtTE44ZDI1bAorMXJMZFlmNnF2YUd6QjhjM2c1aXlaQkJyUG9OWWkrOC9nNWhCcktRTVlpa1p4S1Q2YmgyeEl2emxMOGRGSjdHOHl0LzhabEw0dDRFegordzlIam5YWFgxeUNtTEJuRW1zOGcxdUw3enlCbUVDc3BnMWhLQmpHcFBqcDMvNjJyay9mMVA1ek04aWhmN3Vyay9xaXJzMnNRVTlFWQoreEpyUElOYmkrODhnWmhBcktZTllTZ1l4cVQ0NmQzVHk4bXdmZEhKL2JCQlRBUm5FbXM4ZzF1TDd6eUJtRUNzcGcxaEtCakdwUG9PWQorUVV3SjljMGcxblFHc1JiZmZ3WXhnMWhKR2NSU01vaEo5Um5FREdKS3FHOEdzYVl6aUxYNC9qT0lHY1JLeWlDV1Vpc0dzYzdEZThQaAorOFErR3cyUHZDNGZIUFpCYk9mVE83ZUhFdW5sV29qWmdFRE9JS2FHK0djU2F6aURXNHZ2UElHWVFLeW1EV0VxdEdNUk83bHdYZHZiOQorUXRoNXhSK0huVjJkemJ6S2pnditsM0I0MHFOV29qWmdFRE9JS2FHK0djU2F6aURXNHZ2UElHWVFLeW1EV0VvdEdjUTZOblIxOFA0bQorOXdNRUhkMGpIenhqSldvREJqR0RtQkxxbTBHczZReGlMYjcvREdJR3NaSXlpS1ZrRURPSXFUNkRtRUZNQ2ZYTklOWjBCckVXMzM4RworTVlOWVNSbkVVaktJR2NSVW4wSE1JS2FFK21ZUWF6cURXSXZ2UDRPWVFheWtER0lwR2NRTVlxclBJR1lRVTBKOU00ZzFuVUdzeGZlZgorUWN3Z1ZsSUdzWlFNWWdZeDFXY1FNNGdwb2I0WnhKck9JTmJpKzg4Z1poQXJLWU5ZU2dZeGc1anFNNGdaeEpSUTN3eGlUV2NRYS9IOQorWnhBemlKV1VRU3dsZzVoQlRQVVp4QXhpU3FodkJyR21NNGkxK1A0emlCbkVTc29nbHBKQnpDQ20rZ3hpQmpFbDFEZURXTk1aeEZwOAorL3huRURHSWxaUkJMeVNCbUVGTjlCakdEbUJMcW0wR3M2UXhpTGI3L0RHSUdzWkl5aUtWa0VET0lxVDZEbUVGTUNmWE5JTlowQnJFVworMzM4R01ZTllTUm5FVWpLSUdjUlVuMEhNSUthRSttWVFhenFEV0l2dlA0T1lRYXlrREdJcEdjUU1ZcXJQSUdZUVUwSjlNNGcxblVHcworeGZlZlFjd2dWbElHc1pRTVlnWXgxV2NRTTRncG9iNFp4SnJPSU5iaSs4OGdaaEFyS1lOWVNnWXhnNWpxTTRnWnhKUlEzd3hpVFdjUQorYS9IOVp4QXppSlZVUTRQWS92Mzd3N0pseThMQ2hRdkRraVZMd3RhdFcwdS9BUTFpQmpIVlp4QXppQ21odmhuRW1zNGcxdUw3enlCbQorRUN1cGhnV3hqbzZPYU9NTkdEQWdEQnc0TVBUcDB5ZjA3OTgvQ21hZG5aMGwzSFMvWnhBemlLaytnNWhCVEFuMXpTRFdkQWF4RnQ5LworQmpHRFdFazFMSWd4QXZiaWl5K0duVHQzUnYrL2UvZnVNSGp3NEhEVlZWZUZYYnQybFhZREdzUU1ZcXJQSUdZUVUwSjlNNGcxblVHcworeGZlZlFjd2dWbEpOdlVkczRzU0o0YUtMTGdxclZwWHp3QTZEbUVGTTlSbkVER0pLcUc4R3NhWXppTFg0L2pPSUdjUktxcWxCYk1hTQorR1ZFUVc3bHlaV2szb0VITUlLYjZER0lHTVNYVU40TlkweG5FV256L0djUU1ZaVhWMUNEMnhCTlBoS3V2dnJyVUQrMVlzdlpBb1lMWQorN09YMUR4Qmg3K2JDQkxGak01N3pETk1HN2h5MXVqQkI3RVFQYmxrOU5uTkVZWUpZMkxQSkNsUnl4MCtHd2dReDJtb1p6Wm8xcTFCQgorVEtlSHZrMVJndGhISy9mVlgrR085WVVLWXNmbnZWWjNsVStlUEZtWUlEWnYzcnkycWR0TkMyS0xGaTBLNTUxM1huajMzWGNiOHJDTworUTRjT1JROEU0ZDZ6b3BUOSsvYUU2UXMyaFMvM0trWVErNGRMcDRUeHN6ZUVBL3YzMUY3dnZmdkQ3clZMQ2hIRU9yb09EcnZIUFJKMgorN3orVXVKMzM3TmtUUFpIendJRURoU2o3OXUwclZEMHNlcUUrM3Zyc2t2QjNGK1Y3RXYxSzc2bmhyT3RtaFcwN09zTGVQUW5yVEgwYworLzJoVVA0c1F4SFovc3ZqMzdUWmhHKy9kdTdjdzdZUEMrbGozZTFhb2kxdTNkMFIxa3pxYVp4dWhqZEpXRTg4aHJiaU51K3JqbENsVAord3ZEaHczTVBZczgrKzJ4NDlkVlhvLzRNNXpiYlFNL09JZlJ0Nk9Qa0hjVE91SFJxbURSM1kvMSsxdW9GaFFsaUhmMitFSFpQSGRGMQorYmp1WTJNL2F2bjE3R0RWcVZPNUJqSGJLakxvaW5rZFlwMGFQWmpjbGlHM1pzaVY2ZXVLUUlVT2lsVzZFalJzM2h2bno1NGZGaXhjWAorcHF4WnVTUzhObTUrMThseldpR0MyQm1YVFFzajM1a2ZQbG0xcE9ZNkwxcStLaXlmT1Q3cTRIVU0vbUt1QjRjOVYvMXBXRHQ2YUZpdworZW1QaWRpYlVUNTQ4T1l3ZlB6NU1tREFoMThJNmNJQll1blJwb2VwaWtjdTYxVXZENEVmbWhMKy9KTjlPNWxjdm54WitjTTMwOE5IOAorUldIWjB0cnJTMzFjKzhydFVmM005ZVFadGMrLzdtcXY0NkoyVzJ0OWVWQVMwemlLMEQ3aXd2cXdYdGIvK29XNlNKMmtibEpIODJ3agordEZIYUttMjJUTnQ0K2ZMbDBVVmhScVB5RG1KMGNobDE0THhtRytsWm9VOUQzNFkrVHQ1QjdFdGQ2ekQ2M1huMSsxblQzNjg0anVjYgoreFBiMC83T3c1dlg3dzRKVkd4TFBJL1N4ZWVqZWlCRWpjaDgxZnYvOTk2TjJXNlI2U0p0dHhwUGdHeDdFR0xrWU9uUm9HRFJvVU5pOAorZVhQRFZwU3JyRHlSa1Njd0ZxWHMyOU1SUHBpL3NWQWpZbU5uclF2NzluYlVYdS9kZThPdU5Zc0tNeUxXTWZiaHNIUHZnWnJyeTFYRAorSFR0MmhKRWpSMGJEMVRUUVBNdmpqejhlWFZubDZsR1I2bUtSeS82dStuaExnVWJFdG16YkdYWjMxRjVmNm1QSHVFZUtNU0xXRmNSMgorclY3NCszWmJZMzI1U3NjSmk2bmdlYmNQeXBOUFBobmRGOHg2V2YvckYrcmk1cTA3Q3pNaVJsdmRuM1FPYWNWdDNGVVh1WmhYcEJFeAorK2pPYzMyd0RQZWhyZGRWSCtqWkZHUkdiT0dkOS9YN1d5bm1GR2hIcm1QSmMzYjRXdHhFVlpVUnMrdlRwaFR5SHNFNkZIaEVqaEQzOAorOE1QaDhzc3ZqMFlNMm9IM2lHVnpqeGduTGs1Z2VaOUVDWU56NTg1dGk3cmRTTjRqMXR4N3hEaUJQdjMwMDdtM2ovaHFadncxSnVvWgorN3hGclB1OFJhMjNlSStZOVltWFZzQ0RHMDFaSXNUeWNvMTFDR0h4cVl2T2Ztc2pCb1VoQjdNTVBQL1NzZUpwOGFtSnpuNXJJN0lNaQorQlRIdU5WRFArZFRFNXZPcGlTMisvM3hxb2s5TkxLbUdCVEdHRVgveWs1K0VjODQ1Sjl4MTExM2h6anZ2RExmZmZudFV4b3daRSszZworTWpLSUdjUlVuMEhNSUthRSttWVFhenFEV0l2dlA0T1lRYXlrR2hiRWVKakc3Tm16d3djZmZIRHFvUVp4V2JCZ1FUaHg0a1FwTjZCQgorekNDbStneGlCakVsMURlRFdOTVp4RnA4L3huRURHSWwxZFR2RVdzSEJqR0RtT296aUJuRWxGRGZER0pOWnhCcjhmMW5FRE9JbFpSQgorTENXRG1FRk05Um5FREdKS3FHOEdzYVl6aUxYNC9qT0lHY1JLeWlDV2trSE1JS2I2REdJR01TWFVONE5ZMHhuRVduei9HY1FNWWlWbAorRUV2SklHWVFVMzBHTVlPWUV1cWJRYXpwREdJdHZ2OE1ZZ2F4a2pLSXBXUVFNNGlwUG9PWVFVd0o5YTBWZzFqbnlhNXk0Zy8vNWxuKworc0E1MUdNUmFtMEhNSUZaV0JyR1VER0lHTWRWbkVET0lLYUcrdFdBUU8vQlN2N0I3eUQrR1BYZDlPOWV5KzdhdmhZT2pCOWRkWDROWQorYXpPSUdjVEt5aUNXa2tITUlLYjZER0lHTVNYVXR4WU1ZbnNmUGp2c3ZQS1B3NjRCZjVGcjJYbkYveDMyUFhGZTNmVTFpTFUyZzVoQgorckt3TVlpa1p4QXhpcXM4Z1poQlRRbjFyd1NDMjcvRnp3NjcrL3luL1R1WlZmeGIyUDMxeDNmVTFpTFUyZzVoQnJLd01ZaWtaeEF4aQorcXM4Z1poQlRRbjB6aUJuRWxMei9ER0lHc1pJeWlLVmtFRE9JcVQ2RG1FRk1DZlhOSUdZUVUvTCtNNGdaeEVyS0lKYVNRY3dncHZvTQorWWdZeEpkUTNnNWhCVE1uN3p5Qm1FQ3NwZzFoS0JqR0RtT296aUJuRWxGRGZER0lHTVNYdlA0T1lRYXlrREdJcEdjUU1ZcXJQSUdZUQorVTBKOU00Z1p4SlM4L3d4aUJyR1NNb2lsWkJBemlLaytnNWhCVEFuMXpTQm1FRlB5L2pPSUdjUkt5aUNXa2tITUlLYjZER0lHTVNYVQorTjRPWVFVekorODhnWmhBcktZTllTZ1l4ZzVqcU00Z1p4SlJRM3d4aUJqRWw3eitEbUVHc3BBeGlLUm5FREdLcXp5Qm1FRk5DZlRPSQorR2NTVXZQOE1ZZ2F4a2pLSXBXUVFNNGlwUG9PWVFVd0o5YzBnWmhCVDh2NHppQm5FU3NvZ2xwSkJ6Q0NtK2d4aUJqRWwxRGVEbUVGTQoreWZ2UElHWVFLeW1EV0VvR01ZT1k2ak9JR2NTVVVOOE1ZZ1l4SmU4L2c1aEJyS1FNWWlrWnhBeGlxczhnWmhCVFFuMHppQm5FbEx6LworREdJR3NaSXlpS1ZrRURPSXFUNkRtRUZNQ2ZYTklHWVFVL0wrTTRnWnhFcktJSmFTUWN3Z3B2b01ZZ1l4SmRRM2c1aEJUTW43enlCbQorRUNzcGcxaEtCakdEbU9vemlCbkVsRkRmREdJR01TWHZQNE9ZUWF5a0RHSXBHY1FNWXFyUElHWVFVMEo5TTRnWnhKUzgvd3hpQnJHUworTW9pbFpCQXppS2srZzVoQlRBbjF6U0JtRUZQeS9qT0lHY1JLeWlDV2trSE1JS2I2REdJR01TWFVONE9ZUVV6Sis4OGdaaEFyS1lOWQorU2dZeGc1anFNNGdaeEpSUTN3eGlCakVsN3orRG1FR3NwQXhpS1JuRURHS3F6eUJtRUZOQ2ZUT0lHY1NVdlA4TVlnYXhraktJcFdRUQorTTRpcFBvT1lRVXdKOWMwZ1poQlQ4djR6aUJuRVNzb2dscEpCekNDbStneGlCakVsMURlRG1FRk15ZnZQSUdZUUt5bURXRW9HTVlPWQorNmpPSUdjU1VVTjhNWWdZeEplOC9nNWhCcktRTVlpa1p4QXhpcXM4Z1poQlRRbjB6aUJuRWxMei9ER0lHc1pJeWlLVmtFRE9JcVQ2RAorbUVGTUNmWE5JR1lRVS9MK000Z1p4RXJLSUphU1Fjd2dwdm9NWWdZeEpkUTNnNWhCVE1uN3p5Qm1FQ3NwZzFoS0JqR0RtT296aUJuRQorbEZEZkRHSUdNU1h2UDRPWVFheWtER0lwR2NRTVlxclBJR1lRVTBKOU00Z1p4SlM4L3d4aUJyR1NNb2lsWkJBemlLaytnNWhCVEFuMQorelNCbUVGUHkvak9JR2NSS3lpQ1dra0hNSUtiNkRHSUdNU1hVTjRPWVFVekorODhnWmhBcktZTllTZ1l4ZzVqcU00Z1p4SlJRM3d4aQorQmpFbDd6K0RtRUdzcEF4aUtSbkVER0txenlCbUVGTkNmVE9JR2NTVXZQOE1ZZ2F4a2pLSXBXUVFNNGlwUG9PWVFVd0o5YzBnWmhCVAorOHY0emlCbkVTc29nbHBKQnpDQ20rZ3hpQmpFbDFEZURtRUZNeWZ2UElHWVFLeW1EV0VvR01ZT1k2ak9JR2NTVVVOOE1ZZ1l4SmU4LworZzVoQnJLU2FFc1NXTFZzV1huamhoYkI0OGVMUTJkbFprazNWUFlPWVFVejFHY1FNWWtxb2J3WXhnNWlTOTU5QnpDQldVZzBOWXNlUAorSDQ4T01PZWRkMTc0MXJlK0ZVYU5HaFZPbkRoUjZnMW9FRE9JcVQ2RG1FRk1DZlhOSUdZUVUvTCtNNGdaeEVxcVlVR016aklic0cvZgordnVHeHh4NExGMTk4Y1hqbGxWY01ZZ1l4ZzVnTVlnWXhKZFUzZzVoQlRNbjd6eUJtRUN1cGhnVXhwaUF1V0xBZ3JGeTVNam9KRThoRworamh4cEVET0lHY1JrRURPSUthbStHY1FNWWtyZWZ3WXhnMWhKTmVVZU1Ub0ZsMTkrZVZ0TVRWejh5ZjVDQmJGWnkzYlgzK2w3TmhVbQoraUIzdDZ2RDJwSklXS1lqTm5UdlhzK0pwdW5QVTZzSUVzZU1uNjYvdjBSblBGU2FJL1c3M3hycnJ1MlhMbGtJRnNSMDdkbGpwVDhPeAorcnROa1VZSVliYlVuaWhYRUxxbTd2ck5telNwVUVOUHBvVzlUbENBMmQ4WGV1dXY3dTEzckNoWEVqbjMwYXQxMXByOWVsQ0EyYjk2OAordHFuYlRRbGltelp0YW5nUTYram9DT3ZXclFzYk4yNHNUTm0rZFdNWVAzTlYrSEt2YVlVSVl2OXc2ZFR3MXBTVlljZTIydXU4WWN1Mgorc0duSjdLaUQxekg0aTdrZUhIYjMrMExZK3RhOVlmMzJqc1R0ekg0ZlBYcDA3Z2NIQ3AzZFNaTW1SUjNmSXRYRklwZWQyemVGRzU5YQorRVA3N3hWTnliUjlmN1QwdG5IbnR6TEQ2ay9WaDg2YmE2MHQ5M1ByMi9WSDl6UFVFR3JYUHYrNXFyN09pZGx0cmZibnd0WERod3FpRAorVjRRZ3hnVVRIdFRFZWxuLzZ4ZnFJbldTdWtrZHpiT04wRVpwcTdUWnBIWGVzSGxyMlBIQVQwUEgxWCtlZXllem95c003bnowVjExdAorWkh2TjllVjRQV0hDaEVKY3JLQjljTnZHaGcwYnJQODlMUFJwNk52UXg4azdpSjNSdFE3dlR1dEJQMnZSaklyamVMNXRaUGRWZnhxMgoram5zeXJOKzJLM0U3MC85bkp0dUlFU055NzJkTm5qeTVjUDBzMml6bnRVWS9oTEJsZ2hnZm5wTTdUMlFzU2xtM2VubDRjK0tpOEpYZQoreFFoaVoxdzJMYno4M3NLd2ZzM3ltdXU4ZE9XYXNHTDJ4RUlFc1QxZEI0ZDFyd3dMU3o3WlhITjlseTlmSHBZc1dWS0lxelR4MWN5eAorWThkR1UzQ0xWQmVMWERaODhuRzQ5dEVQdzk5Zmt1OUo5S3VYVHdzL0hEd2pMRmkwTkt6NHVQYjZVaC9YamJranFwOUZDR0lyWmsrSQorMm0ydDlWMnhZa1YwdGI4SUk4WVUydW1jT1hPaTliTCsxeS9VUmVva2RaTTZtbWNib1kzU1ZtbXpOZGU1NjVpOGRNWHFzUFhlSDRYZAorQS82Zi9EdVpWLy9uc1BYQlg0U2xxOVoxclYvMzV6Nk8xKys5OTE0aExsYlFQcml3dUhUcDB1ajhaaHVvWCtqVDBMZWhqNU4zRVB0UworMXpxTUdkdURmdGJNY1lVSlludjYvMWxZKythRFljbWFUWWw5clVXTEZvV1hYbm9wOXlCR094MDNibHpoK2xtMFdjNXJiUnZFZUNMagora1NOSHd0R2pSd3RUamgwN0d1WXUzMW1ncVlsVHd0UUYyNkwxcXJYT1I0NGVDNGUzckM3RTFNU092bjhTRGt4K01odzVkanh4T3g4NgorZENpTUdUT21FQjNONGNPSFI1M2VJdFhEb3BmalhmVng2QXNmaDcrN0tOOXBKVXo3K3RIMXM4TytBNGNUMTVmNmVHREtVMUg5TE1MVQoreE1OYlZrWHRObW1kR1RVdTB0UkVyaDVhOTN0ZTl1NC9ITlhOdktjbTBrWnBxOGVQSmE4djlYSFBvK2VFWGYzL2N5R21KdTU5NnNLNgorYmVTRER6NklqdDlGYUIrdnZmWmE0Zm96UlM3MGFlamIwTWNwd3RURUdZdTIxKzluYmZxNE1GTVRPL3A5SVJ5WU9iSnVYMnYvL3YxUgordnozdmk5NjBVeTdtRmEwZXhtMjJiYWNtRnBYM2lIbVBtT3J6SGpIdkVWTnQzaVBtUFdLcXMvKzhSOHg3eEVxcUtVRnM2OWF0NFlvcgorcm9pRzM4dk9weWI2MUVUVjUxTVRmV3FpRXVxYlQwMzBxWWxLM244K05kR25KcFpVUTRNWVU4ajI3dDBielRYbGU4VG9HUENRallNSAorRHpaOFRtVlJHTVFNWXFyUElHWVFVMEo5TTRnWnhKUzgvd3hpQnJHU2FsZ1FZMGlUampKVEVxKzg4c29vaVBYcTFTdjA2ZE1uM0hQUAorUFZGQUt5T0RtRUZNOVJuRURHSktxRzhHTVlPWWt2ZWZRY3dnVmxJTkhSRTdmUGh3MkxkdlgzVERILy9OU0JqL3piOWxQZWdZeEF4aQorcXM4Z1poQlRRbjB6aUJuRWxMei9ER0lHc1pKcXlqMWk3Y1FnWmhCVGZRWXhnNWdTNnB0QnpDQ201UDFuRURPSWxaUkJMQ1dEbUVGTQorOVJuRURHSktxRzhHTVlPWWt2ZWZRY3dnVmxJR3NaUU1ZZ1l4MVdjUU00Z3BvYjRaeEF4aVN0NS9CakdEV0VrWnhGSXlpQm5FVko5QgorekNDbWhQcG1FRE9JS1huL0djUU1ZaVZsRUV2SklHWVFVMzBHTVlPWUV1cWJRY3dncHVUOVp4QXppSldVUVN3bGc1aEJUUFVaeEF4aQorU3FodkJqR0RtSkwzbjBITUlGWlNCckdVREdJR01kVm5FRE9JS2FHK0djUU1Za3JlZndZeGcxaEpHY1JTTW9nWnhGU2ZRY3dncG9UNgorWmhBemlDbDUveG5FREdJbFpSQkx5U0JtRUZOOUJqR0RtQkxxbTBITUlLYmsvV2NRTTRpVmxFRXNKWU9ZUVV6MUdjUU1Za3FvYndZeAorZzVpUzk1OUJ6Q0JXVWdheGxBeGlCakhWWnhBemlDbWh2aG5FREdKSzNuOEdNWU5ZU1JuRVVqS0lHY1JVbjBITUlLYUUrbVlRTTRncAorZWY4WnhBeGlKV1VRUzhrZ1poQlRmUVl4ZzVnUzZwdEJ6Q0NtNVAxbkVET0lsWlJCTENXRG1FRk05Um5FREdKS3FHOEdNWU9Za3ZlZgorUWN3Z1ZsSUdzWlFNWWdZeDFXY1FNNGdwb2I0WnhBeGlTdDUvQmpHRFdFa1p4Rkl5aUJuRVZKOUJ6Q0NtaFBwbUVET0lLWG4vR2NRTQorWWlWbEVFdkpJR1lRVTMwR01ZT1lFdXFiUWN3Z3B1VDlaeEF6aUpXVVFTd2xnNWhCVFBVWnhBeGlTcWh2QmpHRG1KTDNuMEhNSUZaUworQnJHVURHSUdNZFZuRURPSUthRytHY1FNWWtyZWZ3WXhnMWhKR2NSU01vZ1p4RlNmUWN3Z3BvVDZaaEF6aUNsNS94bkVER0lsWlJCTAoreVNCbUVGTjlCakdEbUJMcW0wSE1JS2JrL1djUU00aVZsRUVzSllPWVFVejFHY1FNWWtxb2J3WXhnNWlTOTU5QnpDQldVZ2F4bEF4aQorQmpIVlp4QXppQ21odmhuRURHSkszbjhHTVlOWVNSbkVVaktJR2NSVW4wSE1JS2FFK21ZUU00Z3BlZjhaeEF4aUpXVVFTOGtnWmhCVAorZlFZeGc1Z1M2cHRCekNDbTVQMW5FRE9JbFpSQkxDV0RtRUZNOVJuRURHSktxRzhHTVlPWWt2ZWZRY3dnVmxJR3NaUU1ZZ1l4MVdjUQorTTRncG9iNFp4QXhpU3Q1L0JqR0RXRWtaeEZJeWlCbkVWSjlCekNDbWhQcG1FRE9JS1huL0djUU1ZaVZsRUV2SklHWVFVMzBHTVlPWQorRXVxYlFjd2dwdVQ5WnhBemlKV1VRU3dsZzVoQlRQVVp4QXhpU3FodkJqR0RtSkwzbjBITUlGWlNCckdVREdJR01kVm5FRE9JS2FHKworR2NRTVlrcmVmd1l4ZzFoSkdjUlNNb2daeEZTZlFjd2dwb1Q2WmhBemlDbDUveG5FREdJbFpSQkx5U0JtRUZOOUJqR0RtQkxxbTBITQorSUtiay9XY1FNNGlWbEVFc0pZT1lRVXoxR2NRTVlrcW9id1l4ZzVpUzk1OUJ6Q0JXVWdheGxBeGlCakhWWnhBemlDbWh2aG5FREdKSworM244R01ZTllTUm5FVWpLSUdjUlVuMEhNSUthRSttWVFNNGdwZWY4WnhBeGlKV1VRUzhrZ1poQlRmUVl4ZzVnUzZwdEJ6Q0NtNVAxbgorRURPSWxaUkJMQ1dEbUVGTTlSbkVER0pLcUc4R01ZT1lrdmVmUWN3Z1ZsSUdzWlFNWWdZeDFXY1FNNGdwb2I0WnhBeGlTdDUvQmpHRAorV0VrWnhGSXlpQm5FVko5QnpDQ21oUHBtRURPSUtYbi9HY1FNWWlWbEVFdkpJR1lRVTMwR01ZT1lFdXFiUWN3Z3B1VDlaeEF6aUpXVQorUVN3bGc1aEJUUFVaeEF4aVNxaHZCakdEbUpMM24wSE1JRlpTQnJHVURHSUdNZFZuRURPSUthRytHY1FNWWtyZWZ3WXhnMWhKTlR5SQorOGQ0VEowNkU0OGVQUi8rV25VSE1JS2I2REdJR01TWFVONE9ZUVV6Sis4OGdaaEFycVlZR01Uck1kSmF2dU9LSzBMZHYzOUNuVDU4dworWWNLRTZPZGxaUkF6aUtrK2c1aEJUQW4xelNCbUVGUHkvak9JR2NSS3FtRkJqQjM0NElNUGhxRkRoMFlMbzJQdzNudnZoVjY5ZW9WeAorNDhhRnpzN09FbTQrZzVoQlREMWhFRE9JS2FHK0djUU1Za3JlZndZeGcxaEpOU3lJelpvMUsvVHYzLzlUblZUQ0YrSHMybXV2RGJ0MgorN1NybEJqU0lHY1JVbjBITUlLYUUrbVlRTTRncGVmOFp4QXhpSmRXd0lQYjQ0NCtISVVPR2hJNk9Ud2VCNmRPbmg0c3Z2cmkwRzNYUgorbXYzaDd5NmFFcjdjYTFyNFN1OTh5OTljTUNuTVdMcTc3anAzN3Q0UWRnLzZyMkgzMVg4ZWRnLzh5OXhLUisvL014eWROcnorK25ZRgorK2xkZWVTWHFhSEtBeUxNODhjUVRZYzZjT1o0VlQ5UFFGMWVGTDU0M01kZjI4ZmNYVHdrL0dEdzdIRHRSLy9oMjlJT25vL3FaWi91SQorMnVlZy94STZPM29XeERoNTVkMCtLTU9IRHc4N2R1eXcwcCtHbzhkL0Y5Vk42bWllYllRMlNsdnRpZjJQL2l4MDlQa1ArYllSemlOWAorL25FNDhOUnY2cTd2akJrem91TjNFZG9IRnhaMWV1amIwTWZKczMxOHVhdjh0d3NtaHprZjc2Mjd2cDA3UC9uMzQzamViZVR5L3lzYworKzNCMDNYWG0yUTRqUjQ2TUxoYmszYzh5aUoxbUVHUG5NU1h4NFljZkRvY09IZnJVNzFqbUpaZGNFc2FPSFp2cUNoQ2pJcVIxL2xhUgoreXVMVnU4UDNyNWtlZm56OXpQQ1RHL0l0M3gwNExjeGV0cVB1T2gvWnNUN3NHUGF0c0dQSVA0VWRRNytaVzlsK3cvOElCMmFPckwrKworUjQ2RXQ5OStPenBBakI0OU90Znl3Z3N2UkFlSW90WERvcGVIWGwwVi9yWC8xRnpieHc4SFR3OFgzVEUzSER4OHRPNzZIcGcxTXFxZgorZWJhUHFIME8rMlk0c24xZDNmWGR1SEZqZU9tbGwzSnZIeFRhNmRhdFc2MzNwMUVPSERvYTFVM3FhSjV0aERaS1crM0pPdTkrN29xdworL2FZdjU5dEdPSS9jK0tXdzU2VUJkZGQzOXV6WjBmRzdDTzNqblhmZUtXUi9wc2lGdmcxOW5EemJ4NCtqZnRZSDRhT1BkOVh2dDJ4YgorOCsvSDhiemJ5Ry8vSVJ5YzkxYmRkYWIvem1qdHFGR2pjdTluelo4L3Y3QjFzWkJCYk0rZVBlR2FhNjZKcGlFZVBueTRLVUZzeTVZdAorWWNtU0pkSHlpbFNXTDE4ZWxpNHJUbUY5ZXJMT3k1Y3RMVVpadnF4SDY3dHMyYkxDbEo1c1k4dW55N0tXYXlQTEN0UkdsdHRHU2w2SworZEI2aHJmWm9uWXZTUHFMU1d1Y1IyMGRydDVHVzYyZTFZRityaUcyRTlWcTFhbFhEbjNuUmtDQzJmLy8rY1AzMTEwY2pZdFZCYk1XSworRlZFUWUvLzk5MU1Gc1owN2Q0WTFhOWFFZGV2V0ZhcXM3eW9iTjZ3dlRGbmYwM1hmc0xFWVpmMzZubTNucnRjVnFSU3RIaGE5YkZoZgorakhheVlVTVA5eDM3dUNodHBLZkhJdHRIYTdlUmdweERhS3M5YXlNYkNuUWUyZUE1cE9TbFNIMnRsdXRudFdoZnEyaDFjTzNhdFYzSAorNlEzRkRHSjhYOWl3WWNPaUViSHFxWWtrU080UjR6SDIzcHdxU1pJa1NRMEtZdHkvUlFpNzdycnJQbk9UTm8rdVowUnM2ZEtsYm0xSgora2lSSkNnMThhaUtQaG1Ya2kzdkJZb3lPM1hqamplR2VlKzRKQnc0Y2NHdExraVJKVW1oZ0VPUEpkanlXdFYrL2Z0R2p4Z2xrRHp6dworUUxqcHBwdWl1WldTSkVtU3BOOXJXQkFEajNYa3krQnV1KzIyNko2eGUrKzlOM3Fzc2lSSmtpVHAzelUwaUVtU0pFbVM2ak9JU1pJaworU1ZMR0RHS1NKRW1TbERHRG1DUkpraVJsekNBbVNaSWtTUmt6aUVtU0pFbFN4Z3hpa2lSSmtwUXhnNWdrU1pJa1pjd2dKa21TSkVrWgorTTRoSmtpUkpVc1lNWWkyNHcrSWl5VFp5T3R0RXNqN1UzaDV1RTFrZmxFZDlNNGkxaUduVHBvVisvZnFGL3YzN2h5dXZ2RExjZDk5OQorWWNPR0RUM2VYMlU5c0d6Y3VESGNjc3N0NGE2NzdncGJ0MjYxb3JTcG8wZVBodUhEaDRjK2ZmcUVxNjY2S2lxalI0OE9odzhmN3ZFeQoreXRSRytCd2ZmdmhodVA3NjYwUGZ2bjJqY3NjZGQ0UXRXN1pZV2RvVXg4b2JiN3d4T285UUgyNjQ0WVl3Wjg2YzBObloyWlp0NU9USgorazlFeFlzQ0FBZEh4Z20xeTY2MjNobjM3OWxsWjJoRDFlc3FVS1ovcVo5MS8vLzFoMDZaTmJkL1B3dnIxNjhQTk45OGNCZzhlSEQ3NgorNkNNclRBUHJuVUdzNEE0ZE9oU2VmZmJaY08yMTE0WlpzMmFGZGV2V2hiVnIxNGJYWDM4OVBQYllZOUZCb2llV0xsMGFicnJwcGlpOAorbGNHSkV5ZkMrUEhqdzBVWFhSUys5NzN2UlNkUkRoUnFQOVJwVGhBUFBQQkFXTDU4K2FrMjhzUVRUMFR0NU1pUkl6MWF6c3N2dnh3ZQorZXVpaGNQejQ4WmJmSnF0WHJ3NzMzSE5QZU8rOTk2SnRzV0RCZ3FoemNkMTExNFh0MjdkYmFkck1CeDk4RUs2Kyt1cW9QVkFmS0lRdworTHVqMXRGTkZRTG45OXR2RGhBa1RTckZOSmsrZUhKNTc3cmxUeDR5RkN4ZEc1eFBDNm9FREI2dzBiZVRnd1lQUmhUeU9qN1NMeW40VworNTVHZVhzQmF0R2hSMU0vcWFiK3NWZEFQWmZ2OC9PYy9ENWRmZm5tWU9IR2lsYVpCREdJdGdDczBkS0JvNEpVSUludjI3RG5WYWVTcQorSmdjVFRwYWNSUGg5akZFQlRqb1hYSEJCbURkdlh0aS9mMzgwZ2hEanlpQS9vOURnYXRVQmZzZHJXRDdMNU85VkxpZitQZXZBZjFkWAordG1QSGprVi9peEsvaHAvUlVhNitLc3ZyK1hubDU2Zys0RjF6elRYaGpUZmVpQTRRQkxHeWhFejFIUFhqd1FjZmpFWjdkdTdjK2FuZgoreGUwaHJzKzBsY3I2R2YrYytyaDM3OTZvVThyVnZtM2J0bjJtRFZIUGVWOTEyNmxVMlk3NDIvd04vbzJYdzk5anVmRTZVUGNyMFFaWQorZGx6MzQ3L0Y2N3I3bS95OTd0b09lQS9IaDhyZjBZRSs3N3p6b282RzJzZm16WnZEd0lFRG8wNGxkYVlTOWI1eTFKai83cTZlVTUvbworbU5JSmUrR0ZGN285VjFTZWY2ci9UbmZ0S0Q2SFZDNkh2eE8zSVpaVFhiZHBTN3dtYmt1VXVIMTBkd0dGMzFXM3M4cjFyVDVQTVVKMgorNFlVWFJwOVY3WU5qSS8yc0pVdVdmT3JuMUtuVDZXZXhIUHBaWFBpcTE4K3E1WFQ2V2RVelBpcjdXYXhiL0pyUDI4K0tNYnVDZ01uRgorU21aWlRKbzB5VXJUSUFheGd1dm82SWl1OUE4Wk1pVHhkVFF5cm5oeU5ZY1RaZS9ldmFOd1FvT2w0WTBZTVNKY2V1bWwwZFdNeXk2NworTERyZ3ZQbm1tNmZlKzhvcnI0UkxMcmtrWEhIRkZkSHZXRlpsUGFCUk16VnkwS0JCcDViUHlZci9aamswNHBVclYwWlRQQmpPNStlRQorcFBuejU1OWFEZ2VFaHg5K09EejY2S05SaDRDL3gzOXo0T0sxMVZkWU9CSHk4MXBYYTFsdk9oR3MyNmhSbzZJcGFRYXg5c01KajZ2WQoralB3azRjVDEwa3N2UmROT3FKL1VjK29jN1lPcmw4T0dEUXZubm50dVZQajliMy83MjJnVUdZd2dFZlRpTnNMMHBlb3JwSnpzYUdmVQorUXdydDdUZS8rVTAwL1d2eDRzWFJpZnp0dDkrTzJoOFhEZmc5STNpVm8xT3JWcTJLMnZBNzc3d1RqV2J4dDE1OTlkWG81RWZiSXlCVworSHJ6NXpKd2NkKy9lM2FOdHRXTEZpdENyVjYrb2ZhczlVRTg0UGxMdmtxN3FjeHpsL0gvMzNYZEg5Wjk2Y3R0dHQ0VTFhOVpFditmNAorejRqYTJXZWZIUjM3cWVNY3ora3M4amU0d0JlM0xjNEJ6T0tvREdPOGhtTTY3U3grRGUyV1pUM3l5Q05oMTY1ZDBmbUtpeUg4YlpZZgorbjEvaVRpaHRkZXpZc1ZHYjRzSWkwd21wLzV4RFdHL2FVK1Y1aStYUmpoajFxaFVNcTdjVlFZeDFZMFJFN1lFTGVCenZHZTFOUWoyaworSFRBN2licEplZWFaWjZKalAvV0xlaGIzcy9pWDlzSXhQMzR2eC9HTEw3NzRWRDlyNXN5Wm4rbG5jZUc5dXA5RmZXUTUvSjUrT3N1TgorMndmcndrWHBlRG4waWJndytmampqMGZuRHM1WnpKeGk5aERMcGQxVVl1WkUzRmRMMmo2Yy8wYU9IQm1XTFZzV3ZkNGcxdGhqdEVHcword0tqMG5Ld1k5VW5DU2ZERkYxK01UcHBjdmVGOU5HSWFJbzJYRXhJTm5KTXhyNld4eGxkQk9QRndVT0E5L0p6bDBOQ3BEekdtUkxLOAorY2VQR1JhL2gvemxBY0pMa0lFUm5tSU1MeStMM3JBTy9vOE1aZDJiNU9TZkxiMy83MjFFQW93UEtsUjVPd0J4TU9BRlhYaVVpckhIZworNEw2R2VsaG5nMWg3NHVvOGRaTUxBYlZRejk5OTk5M3cxbHR2UlhXVFFwdWl3OGNWVU5vSVAyTmFJcDA4N2pYa3drRTg2c3c5aU5SUAorZ3RDT0hUdWl6aCtkUHNKZHZIeE93clFqNmlBWFVEaEIwOTVZTDA3Q2NSM2x5aUp0Z1dWeGNxUEVRWW8yeDN2bzdOSzVqRWNyNHJCWgorZWZMamQzZmVlV2UwSGoyOXg0ZGpBTXRoSGRRZU9NNXpmS1dUV1dza0Y5UjU2dWpzMmJPak9zL3htUXVBWEhTZ2ZzWWpZb1F0TG1oUQorL3poKzAxL2dRZ1BILy9mZmZ6OTY3OXk1YzZPNnp2L0hHSlhqU2pyMzNQQ2ErRUliNjBWYjR6eEF1eUtvMFlaWVBtMlR2OGU1Sk82WAorMEliUFBQUE02QnpGaFlWNFpJMkxJSFJZSzg4QnJCZXZveE5hQzMrYnRzam5wMzF4enVJOFp6K29mUkJrT0M3R29ha1c2alZ0aExwTAorSGFadnc3bm50ZGRlaTQ3QjlGKzR1TWN4bkdOMlpUK0xpeUZ4djRxZlUxOFpwYTQ4YnhITU9DZXhERjR6WThhTXFKL0Z1WXM2VHQ4dAordmpnWDk3UG9KOUZHbUY0TGZzNDU1VHZmK1U0MHBaTHpGZTJVTUVWN0k2UlZqcUt4TFBwWnRTN1MwQTVvRHdSVjJncjlSRjV2RUdzYworZzFnTEhDQTR1WEJ5VEVKRHI5NXZuRVFaVFl2bnV0T0l1WUlTWCtFRS84MFYrTXJSQkJvdDcyTkVMVjRtVjFUNEdSM01HRmRMZVEwTgorbjVNclZ4NHJUL1R4QVlHR3owR0tSc3ovYzZEaEJGcUpBdzJOTy80NUhXTk95azg5OVZSaTV3RXMyeURXdnJqeXprbWljclNvTzlYVAorbGhnRm95NXlnZ1IxbmZwRzZLcWN5a1Rib0kxd2JJeHhNcUl0Y1U4SjZBd3lHaHd2SzI1YmRPcVlCc2g3cWQveEtIU005M055ams5cQorOFlnVkQ1NnB2RWVGTmtEZzRrSkczQjU0TGNlR25vNXUwYTY1OTRYd1J0dFVlNkRUUlJCNy92bm5FNmNmY1J5dC9qMmhoeXY3QkJvUQoreUtqbmxSY0dhU3ZVVFk3emxiZ29SOGN2N3ZUUnlhUVRHYmNaTUJPRGNFWm5rZEJHRzJGVXVCS3ZZYnB3UEhMTU92MzYxNytPemhtVgorNk5EeU9uNGY0d28rbjczVy9UcTBlWllmUDVpQmM4aVRUejdwUFpSdGhyNFIrNy9lQmFydStsbjBnemhuY0h3RnkrRGNVRG0xbFZFbgoremlHTTVzWTRaM0RlNHZ3VlkyU1lDeDhFckxoK3NteGVFMCtkcDFTZXkyaVRYTHpndlhFL0t4NTE1dTlXSW1qU0p1TTJSdHRsSFo1KworK3VtYTAzZTU3NTQyeWl3TmNDd3dpRFdXUWF6ZzRpdU5YQm1waDRaRW82SHgwUW1rMDBZWWk1OEF4UUdpZXVTQVlYWWFMRmZLZVEvdgorcFI3RVYxRGpCcy9WZmpweDhUMDROSGdPTEFReDZnd25NazVvbFhndkJ4QitGOCtuNWdEQmdhdjY0UW1NZXRGcDVVb3I5WTlwSVQzdAorWkJyRTJodDFqTHJZazV1cE9jSEY5WnlMRzV4UTZLeUJreXhYRUxuZ0VJL01VaGZwWUhKUmdMYklleW0weC9QUFAvL1VsWFplejBnYQorVnpsajhhZzBmNGZwSUxUanVFTWJvOFBIT3RENUF5ZEkzdFBkbFZsT2ZFd3o0U29zNjhWcm1KcFZmVjljZC9oc3RCR21TdnEwcS9aQworRUNLZ01FSmI3ejRRTURJVW4wUGkyUkpjM1FkMWpRc0hqQUJVMW1IcUlVRXZibHY4RzArSFp5UU0xRHV1M0ZmZW44aHJPTmR3M0NiTQorY2I2S082RXh6bHZVZXpyTDFIc3VadEJHcXUvaGlxYzEwZzc1Ynk1WXNEdzZxRW1mTzc3bmpNS29IT2M1TG9iRUl3d3FQNmJsY1h4bQorcGs4OTFDdjZKOVJ6Q2hmTmhnNGRldXJDV1R4N3FESUUwYitpbnpWMTZ0UlRiWVQ2UlNqaS9YSDlwSTF5L3FFZWdqNFViWmYrRisragorL1ZTMlBWQnY2WWR4Z1NTKy80eDZUMStyK2lJMi9VUDZTVXlScEMyeHpLVFB6ZC9uNGlMckdLTi95RG81dmIxeERHSUZSMmVPb1dtRworbjVOd0VHQ0tGbUdHRXljblN6cGRoSjc0QU5GZEVLTkR5VDB4dkkrR0hCZENFQ2ZoT0lqUlVMa0t5UUdCZFdJNG05ZHhBT05xWXp5ZAorb3hJQmlkZHhrdVpxVG1VUXE3N0JsQkV3Z2lNSElVN0VYSDJoY3gyZnhKTVl4Tm9iOVQ2ZUFwaUVzTThKay9wSSs2Q08wMFk0S2FGVworRUdNMG1EWkN1NnBzSTVTNGc4cnJ1S3JJOG1ncmpHUXpTc3pmb3o3VE52aTdsYU5xY2J1bDQ4ZmZRRklRWS8ycDQ3UkxMbXpRWHBqaQorMnhQOGZlNU5xSGNmbmNxSHpoaGhoMk52cmF2ZTRGZy9mZnIwVTQ5eTU5LzRuc2o0QVFhMWdoakhmMTViMlRib05OS0JpeThVRVBCNAorTCt2Q09ZU09IQjA2MmgvckdFK3pqVWNXWW5SWUNVYWN2NUtDR0JoVjQ3WDBaVGdlZEhkUFREMThIdG9aYmN1K1VIdmdlRTAvcTNJMAordFRzY3Ira0RWZmF6dUNCSDhJblBHZDBGTWVyNkwzLzV5Mjc3V1dQR2pEa1Z4QmcxL3RXdmZoV2QwMmdqL0k3cGk2eGZmUHl2dnBlZQorL2c5dEtMN2dYUm5FcWk5NDgzZG9rNHl5MFNlakxUSGFWV3MyQ1grWGZoOFhUR2lIckJQYmlQWGdaL1MzZW5KeFI4a01ZZ1ZIQStFSworSDUyNkpGeTFvSkZYWHNWanBJQ09ZRHdpeHBYSTdnNFFOS3JxRG1KMUphR2h4emRHMDRnWlBvK1hFNStjT1hoVU4zcXU5SFBWaDVOcgorVWhBREoxSFdqeE11QnhLbWlmWGtzZU1Hc2ZiR2lZL09WMUtIaTVNVGRaYXBzWEdkWXBvdGRibHlSSXdiblBsWi9CcnFQcDFEVGw1SgorVDdsaStkUnQ2anAvaCtrZUxDdStJaGxmRWVVZWcwcU00dEYyT0xrakRtTGRkUWhZRnNjQjJpQ2pBOVQzbm95VTA1N1lQb3hZbE9HeAorL0RvOVhPVGlYTUR4TzJuNkxoY1Y2QmhXVGp1a2JWR240d3NPVENHa3cxZjVHbzcvaEs3Sys4RzZ3NVJFM3N2NWpEWkNCN0R5NGwwOAorOGh5UEJzUUloNHlzRVFZcmcxaDM1eXpPU1h4T3psZDBZZ2w5UGJtWVY0bHpVL3pnQmp1WjdZSGpNQmQrcTZmWFZxT2ZRVCtyOHFJZgorbzFnYysrTUwzb1NwNnZySlNCanZTM29TSjNXYmN4SDFsNHVCbklmb0s4WEw0UUlCN1NjK1g4VzR1TUtGUE9wNi9EVEZXa0VNVE9tTgorKzFuOGphUnBpWXhpMC81Wk5oZE5LSngzdURCSmNPV3orNTE3NlJuRVdnRFRuN2phV0Qwbk54NGlKK1J3TlpIR0VsOU41R29IRFpFVAorWHZ4QUFUcHZYQlhucWthTUV4ZU5tNU5XSlU1ZThWUXZUdVFNZlhPRmtJNGtqWlBDOG1pRUJDRTZuWnhZS3hzbGRZbUd5OEVMOGR6bAorV2tHTXY4ZFZJa1lJR09Ib1NTY3p4aWdCbllHZVROTlN1ZEFPdUQrUkUwYjFpWTVPSFNPMkJIVGFFRk5mWTNRdXFUUHhmVjNVY3k0YworMEk0cTZ5Y2RQMDZPMVY4ZlFkdUoyeHNkVk9vMUhkUzRqWENpNDhKSS9GVEdlSHBZSlVhb2FIL3hFNnU0NzZ0V0VBT2RVdG93N1pvQQorVjkxcHJjWnllUjBuMjU0OE5VN2xSUDJQNzMrcVB2WnlwWjJMRXR5L3dvaHVQSDJXZWhzL2pUYStyNHY3VVdnTGxlMkljQjgvZEtieQordmtiYUJsT2Y0djRFZFpkNnk3L3hPWVEyRXQrL3hmbU5JRmc1ZFpZT0lwMWpMaWpHNXpIYVdLMGdSa2VVVGluTG9kN3ozN1hxUGV0RgorZTZ1ZUNzbDVqVkdPNnFuMktqZnFQOGRXUWxPbHVKOUYzYVllMHMrSjJ4RHRnZEJEaWVzK0Y3eFpUdVhEemdodXRKdnFhWVhVZlVhSworUVQzbDRqTjFsbllSdHhHTzRkUjlmcy92dUVoUU9Xck14VHZPTGZGNWpMNWZVaENqYjhjNWgzNFdGempxUFgrZ0dsUGpPZGRXYnlkOQorZmdheEZrQ2o0Mm8ySVlXcklWeGQ1NlJGdytPRVNQaGd1SnFURDc5blpJRFhFMllxd3hFTm52L25ZRUlqWWw5ekV1VktKc1BmQkNiZQorUy9DandWZk9BZWIxWEZWbkhiaHFTV0hLQ3EvallNVFZTcTUwOGpoamxzR1ZUZzRHbkp6akF3MEhDQm8vVjU1cWpTNnczai84NFEragorQXd1ZDJ5UjBIcmpIalczQkZTU0cvZ2xrL0t4c1g2YW9aUEZqc2FrSFhQR2pqVkFJUGp4OWtNNFdkVE8reVpnNnl0UStPbHlWOTNWUgorZDJoSFhIamd5aVpCSjM0dkowQ216TEpjd2hrWEgrS3I3Und6bWRiSUNaalgwVDZvdzF3RnBUMXhRdVE5L0gzYUxjdWdvMGU3aTZkbQorZ1pNYzY4U1UzbHJIQWs2Q1o1MTFWalRLa1hTc1p0MzRMTFFMZ2gyZmpYYk1aK2ZrM3RNdnVWWTVzUCtwTy9FeG1rSmJvYTV6d1NCKworb0F3WE5UaWZVR2Y0ZjU0bUYxOG9pS2Z2RW5Lb3p3UTB6aUc4bitNL29ZbmxVcjg1bjNBOGpwL29HVitNWUdRNFBvZlFQamduMEpuaworUE1Mb00xZnBPU2V4RE00dnZDY09aL0hqNVdrajFROGlpTEd1di9qRkw2SXBWVW5mbDhkNmNYR1JpNWkwVWY0ZUYwWTR4ekh5WE84aQoraDhxRklNVXhOVDRtVi9lenFBL1VFNDZwL0N6K01uRENETWY4K0VJQng5MTRLbkJsUDR1MnhySlpWdHhIb241em5vbnhjL3B0dks2eQorbjBXYjR6ekV4VUQ2Y056M0dDK0RpeHVjeStMUmJsN0hhMmhYM1Yzd0J1dE5QNHYxUE4yTDE3UXZ0a0gxclNqNi9BeGlMWVJwSWpRdQorcnJ6ekw0MnA4dnVEYU9nMFhEcWpuTWg0UFQrcnZIckMxYzU0VktweXJqRlg4ZU5waHdTMWVDcEtmSUJpbWdZZHo4cXBUVnhsNWFBUgorTjBoR3RPTDV4eXlMRTN6bGdZRHd4YjF1ZERKckRZVnpVT0lMWitrRTFIc2tOeWRpUGd0L2o4REh3WWlERXV2dkY5YTJIenFKVEkvbAorcEVnOW9GNXc0cXo4SGpzNlhyU2RlKys5TjJvZnRJSEtrVmNDRVcyR1RpVTMvc2RQbCtKcUpDZG5mczV5T1JGV3RqMk9tMXp4ckI3RgorNVY0dnJ0N0hGd2I0ZmR5R1djL3FVVzVPNHJTYldnL1U0RE55MVpUQWx6U2RHRnp0cDlOTjI2Qk44RGZqSjN3UlVIMXlZdnVoZnNYSAorYU00VHRJUEtLL2ZNbHFDdVVEZTVLRVk5cEE1WDFqV21TREd5RnI4bVByL1FFU1RFY2V5bi9WWGUxMHk5SmJoVlB2MHdibGVzQzhkdQorWHNQL3gyMlluM044cnh6bHBpMXpycUtOMUhxeUllY2hydmp6T1pLbUU0Tk9LOGVFZUowcGpvUzFOMFpzSy90WlhLaXJQRmJTSHVLKworRXFOb25FY0k4SlYxalFzVTFGMHVSbGNlNHhsOVlwbHgzYTZjWlJIZnVzSHh2WEpLTEtOeGhMMjR2OGE1aElzSGNUK0xZM25sUXpsbworajR5ODBmNXFUVVhuUEVRL2kzTmRUNy82Sk1ZRFA3aklVdjNGMS9yOERHS3FpNmtyQks3cVlmWDRRU0ljYUJwVlp6aFpjd1cyY3ZxaworVkhTMEFhN1NWNC9FY3ZXVEVZRFR2VStsRms2NG5LeTU0cG4wNEFXcFNMZ2dSOWlpM2xhS1IzZ1pDYXNYbW5xS0N4Q2NyeXEvU2tJcQorT2k1c0U3aXFwNlZ6OFp4K0ZxTnJqZXBuRWRMb1o5Vjd3Sld5WVJCVFhmRTN3bk1TWlJTT0s0YnhkOFF3RmFYeXU4WFNZRG5jczFONQorNDZ2VUNwaCt5MmdBVitGcEd4U3ViRktmNCs5ZlNZdmpNdmV2Y0tOMG81WXBaWUc2eXl3RnppRjhhWHA4RHVGWXovU29SbDFkNTF6RgorYUIwanh0WGZSeVlWR1ZQRnViV2t1cC9GOUdEYVRQVzlqSjhYVXl5WkVzeE1pZW9ubENvZkJqSDFHTVBZVEdYaG9FQUFxM3pzYWlNdwordFlVRFQvV1hQVXV0Z0ttS1BCU0R0a0ZoK21MbC9QKzBPQzR6bFlWMjU1T3ExSXE0dXMvOVYvRTVoQ21HalJvdEJpTnZUQmRyNUN3TgorS1N2eDkwTlc5ck80bGFPUkQxcGk2aTc5TEVmRGlyWGZEV0tTSkVtU2xDR0RtQ1JKa2lSbHpDQW1TWklrU1JremlFbVNKRWxTeGd4aQora2lSSmtwUXhnNWdrU1pJa1pjd2dKa21TSkVrWk00aEpraVJKVXNZTVlwSWtTWktVTVlPWUpFbVNKR1hNSUNaSmtpUkpHVE9JU1pJaworU1ZMR0RHS1NKRW1TbERHRG1DUkpraVJsekNBbVNaSWtTUmt6aUVtU0pFbFN4Z3hpa2lSSmtwUXhnNWdrU1pJa1pjd2dKa21TSkVrWgorTTRoSmtpUkpVc1lNWXBJa1NaS1VNWU9ZSkVtU0pHWE1JQ1pKa2lSSkdUT0lTVkxPMXE1ZEd5Wk9uQmkyYjkvdXhtaUN2WHYzaGlsVAorcG9SbHk1YTVNUnFzczdNekxGaXdJRXlmUGowY09YTEVEU0pKcDhFZ0prazlkT2pRb2ZEV1cyK0ZKNTU0SWd3ZlBqejY3Nk5IajZaZQorN3VqUm84T1BmdlNqTUdQR2pFdyt4NnBWcThLcnI3NGFIZmpwU0JmSm5EbHpvdTM3MUZOUGhSZGVlQ0ZzM0xneDlUS1hMMThlempubgorblBEZ2d3ODJkZDMzNzk4ZjNuenp6V2pkcVIvODk3NTkrd3F6YlRkdDJoU2VmLzc1YVAyZWZ2cnBNR3ZXck5UTFBINzhlTGpsbGx2QworeFJkZkhIYnUzTm5VOWFkOXNONFV0dS9VcVZNOUtFbHFhUVl4U2VvQk90bFBQdmxrdVBIR0c2Tk80TFBQUGh2dXZmZmVNSG55NU5SaAorYk0yYU5XSHMyTEZoMjdadFRmME1KMCtlRE8rKysyNjQ4TUlMdzdlKzlhMHdhdFNvY09MRWlVSnNYOWFEVWNGcnI3MDJQUExJSStHWgorWjU0Sjk5OS9mM2pwcFpmQ2poMDdVaTE3ejU0OTBiS1hMRm5TdFBYZnZYdDNlTzY1NThMTk45OGNCUVhDNUtXWFhoclZrVjI3ZHVXKworZmRldlh4K0dEQmtTN3JqampsUHI5OUJERDBVaE5RMkMvRWNmZlJTRm9tYU5pUEUzWnM2Y0dlNjU1NTVvM1dsN2Q5MTFWL2pGTDM0UgorM252dlBmc3NrbHFXUVV4U1d6aHlyRE04L3RhNmNOOHJhOEtEcjM3U2JibHo1S293WlVIM1YvVVovZUtxLzZKRmkwNzlqQTQrSGRsagoreDQ0Vi92TVRkRWFPSEJtdXVPS0tjTjk5OTBWaDdKVlhYbWxvRUR2NjBXdmg0R3MzaGtOdkQrdTJISHp6MW5CNDRpUDByRC96M2hVcgorVm9UTEw3ODhHckdKRVJ6WnZoMGRIWVhmdm94OEVSYTJiTmx5Nm1lRUJNTENoQWtUR3ZJMzJBNnpaODhPYytmT3JWa1lVZVNpUVNYcQorSjRId21tdXVpVVoxWXhzMmJJZ3VBaFFkUVl3UXpSVGV5dnBNNktYT01QVlVrbHFSUVV4U1c5aDc0RVQ0eHl1bWhTK2VOekg4N1lXVAordWkzLzZXZGp3NURuVjNUNy9nY2VlQ0FLWXBzM2IwNzhPL3lla1p6YmI3ODlHbkZZdUhEaHFkL1JDYVp6enBTd2VmUG1SU01VWThhTQoraVVZVG1KN0lxRVVsT3RTTUFBd2JOaXpxU0hPZlV5VkdJRjUrK2VWb2xHUG8wS0ZoL1BqeE5kZUxVTVBmWGJ4NGNUVHkxcmR2M3lpWQorTlRLSTdYLzZvckRqNHY4dDdPenpIN3N0TzNyOUgySDN6V2QwcmN4bi95YjNHUDNzWnorckcxb0lGYXczbjVkUkVVYjQ0bk1XLzNLLworMHV1dnZ4NXRTL1lESXo4c202bVloSmhxakVTeUxMWWhJNFFIRHg3ODFPOC8rT0NEYUNTRy9jbEk2T21FYmtKWi8vNzlvMzNiQ0t0WAorcnc0UFAveHdOTFd3Vm5uMDBVYy9GUWJqZWtSZ29SN1Y4K0dISDU3YUhveEtWdDYzeUgrempWaVBOOTU0STNvTmRXN2N1SEhSTk16Swora0Jldjc5MTMzeDF0TzlhTHNGMkphYWVQUC81NDlQczc3N3d6bWpKN09yaVEwTHQzNzg5OFhrbHFGUVl4U1cxaDM4RVQ0YnZYekFwZgordlh4YStKOTlQdWkyRU1idUhiMjYyL2UvL2ZiYjBYMUdkSVJyZGNiWHJWc1hicnJwcG1qRWlSRTAvaDA0Y09DcEsvbE1YN3YxMWx1agord0VGSUlJVFI4WDN4eFJmREJSZGNFSTFteEJodEkzd1IxbGdXbldKR3N3aHcwZWZadHk4YVBhSXp6THF4TEtiMHNieDZDSXQwekJzOQorTmZIQWkzM0RybjUvR2pxdS9hdHV5NjRCZnhIMjNQa3YzUVl4T3UxTTVidjY2cXMvTmZKUjZmRGh3MUd3WW5yb2E2KzlGcTAvSFhHbQoraDRKekY0R0wrKzBZTGVFZXMwbVRKa1ZCOTdMTExvdW1sc1lJcHJ5V1VTS0NIZHU0VDU4KzBWVEllSW9kd2ZlMjIyNkxYc2Z2ZVQ4aAorai9mMkJQV0JmZGFvSU1aMklReXkzMnNWNmtuMUZGZnU0eUlRL2ZyWHY0NkNaeTNUcGswTGd3WU5pcWIrVWFmNGJ5NUF4Q05PakU0eQora3NwK1lsdndHb0k5UWVxcXE2NzYxTWdscjczdXV1dWlPc20ySTl6OTlyZS9QUldhMk4vVWI0SVl5MkZmc2N5ZTNoTklxT3ZYcjE5MAorb2NLSGhFaHFWUVl4U1cwaGJSQWorSEFQME05Ly92T284MDZIdUhMMGhQdkVHSkc0NFlZYm9zQUFPckIwNU9PSFJMQU1SbkVJWXBVUAorR3FCejNLdFhyMU1oQzNSZTZkelNtWThSUXVqTUVnUTVWaE9tS3BkREI1enBadlh3MElhaUJURStFNk5QRjExMFVUVHl5Q2dVNTZSSworQkFYQ0VxTmVNVDREWVRkK1VBVGJqZTFMQUlneE9zYTJIREZpeEttZjhRUkZScXNJQVRHQzE1VlhYbm5xWGpJZVFsRzVIUGJ4eXBVcgorZS95QUUwSWJRYXh5VkRTTnp4dkU0bjNPNTJHcUpPRys4bk9EY0U3ZG9nN0htSWJMeUdrOFNzbUlGZldHOE12eVlseWNJSFJ4OFNDcQorQndjT1JCY2FDRjl4YU4yNmRXdjBHdG9RR0VFalNGV09aakZOc3RZMFErb0hJMkFFYk5hVC9Va0lhOFREY2lRcEx3WXhTVzBoYlJBRAorVTY4WUFhQWorUDN2Zno4S0FJeTRjTXlrUThsb1RqdzZFMk9raWs0ajRZd3BZblNDNlJCWGhqaW1LOUs1allNWXIyWFVoNUd5U3R3RAoreEdnRW5XWUtvZUg2NjYrUHdzSHBLR0lRQTl1UnpqZ2Q3TFBPT2l1Y2YvNzUwVWhKM0RrbnhCS01LdGVaa1pWTExya2tDZzI4bnlsegoraE5yS2JjSXlxNE1ZeTZWVHp5aGxqTDlEOENETWdkRWd0bmZTbE05YStKdTg5N0hISG12WU5rNFR4TUJEVHdpYmhGMUdEZG1lOGNNNgorQ0ZzREJnejRWUENQNzhQaU04VGJtbnJLZE5qSzF6QUZ0ektJeGFOVjFhT3pyRHNYS2dpeWhPcnp6anN2MnA4OXVjY3J2bCtRc003RgoraDNmZWVTZTZJTUxvSGNGUGtscVJRVXhTVzJoRUVJdlJjV1RVaEk0MlV3b1pLV0FraXVsdmhDT2UvQmNYd2dTQmpSQVdCekdtRTFaTworYjZ3T1lyeHU4T0RCVWNEZzMzaFp2SWEvUjRlWURqQ2hrT2xqVEJjakJES0ZyaWVLR3NSaXJCT2ZrVkd4NzMzdmUxRXdZbnV4M1g3egorbTk5RUhmQjRtekJDOXN0Zi9qSWFKWXVER0tOUWxWUGN1Z3Rpak16d1ByWmZ2Q3lDeUU5Lyt0TlRRWXpnUWhoakh6SjZ4dlMrNm52SQordWtNUUluQVEyQnY1M1hCcGcxaU1FTThvN0psbm5obE5sYVcrRWNUWUhteURlSHV3bmM4Kysrem9iOGJia1RwWU9acldYUkJidW5ScAordEo4SVkvR3lxTWZubm50dWRCR0NDeHJ4L1pMVWNaYkozNnA4RUU1UGNIOGdZUzVwdXFVa0ZabEJURkpiYUdRUWkvSFk3cmdqeUxHVAorVU1EOVJnU2t1REFGanRFeVJnRUljQVF4SHBwUWVWOUxyU0JHQjVlQUVTK0xEaTdUN0Nxblk5SFI1K2ZjYThNb0J5Tnc5UlE5aU1XNAorNTRpQXlZTWNHTG5pWDdZZDI2bHlteEJRR0VWa0d6TWRrTTlXT2JMVFhSQmoxSTJBekhkVHhjc2lYQk9xSzcvN2krREZDQThQcENDbworeE1HbDVqWTRjQ0FLYi93OXdtUWpOU3FJeFhnOVFZaTZ5NmdmQVpiSC9GZldYejU3UEdySXRxR2VFblpqM1FVeHRpT2prdXlMeW1VeAorb3NXNlZkNWpSMzJtamxQZnVZZnRkS1p4OHJVQTFJL0s2YU9TMUVvTVlwTGFRdG9nMXQwREd1YlBueC9kejhUVENPa1VNcHBBcUtxRgoram1wUGdoaC9peWxoOFVoRWQ2cVAwNFF6bHN0SVRMMkhGeEFNQ1N0TU1Xdms4VDVORUNORVZhOEwyNVNSRXA2NFI0ZWZlKzBZSmF0MQorWDlEcEJERWVvTUZJVGEwUks5YWwrbDR3OWhNalBiVWUrVTRJNHo0K0FnMGh2ZEUrYnhEcjdyUHcvenlZaElzSEJGNGV2YzhJVnZXVAorRFNzeDNiTW5RWXh0ejNLWmZsaEw5Zm93Z3NrSWM2MDYyZDE5ZWZIMFR6NkhKTFVpZzVpa3RrQVErOWNCTThNWmwwME5YK3NLWTkyVgordnpwL1lyaDcxR2Nmb2MwSUNBOGY0UDR2UWc2RmFXdmN4OFZURWhucG9xUElhQlFkVU82TjRUV00wakRsaTVFbjBGRmxhaFlQOEtnTQorUzl6dlFvZXlzdlBPdlRCMDZKbCt4WEo0UGNHUGtSeW1kZkdFUlRyZC9EZS9vd1BOcUFLZDhWb1BrK0RwZWJ3MjdzQVNUQWdQVFB0cgoreEhIL3dQTlhoRjFYL29mUU1laS9kbHQyWGZWblljK3diM3dtaUJFOGVYZ0RvM3J4OXFYd1dWaFBQamNZTFlrZnU4OCs0VFdjdDNoZgorUEdyRDlFeW1pRlkrZVpHUktmWUw5eFBGbUVwS2VPREpsanpvZzJVUlVIbFlCWUdEL2N0eU9TZnlPMGJKR0hraElIZDNUeE9CaEVCQQorVU9PK1FmWVpnWkgzOG05UEgvQ1JoSFhoeVlKTXE2eFZDR284R0tNU0kxazhPSU9BRkc5YnRpbWpWcnlIZlIrUE9GS24yVGE4aG9ERworUGlDa2dUckcvdUNKbFpXZm14RkFBbk84RC9pOGJHdkNMNk5qTEl0NnhwUlBwald5djJrcjc3Ly8vcW4xb1owUUJDdWZIQnBqVkpMOQorUkxDTFg4OW5wQzB4WmJUNmF4OGtxVlVZeENTMWhmMWRRZXpIdi8wd2ZMUC9qUENkZ1RPN0xWL3BQVFU4OU5vbm4za3ZIVWM2c3dRbworT3ErRUFVSVNEekdJbjlZSEFnMVR2SGdOOTRyeE9qckc4VWhCL05SRTdqV3FER0pNZTZQVFd2azBRUDRtbldXbVhqSEN3N0o0SDlNSworNDJtT0JDbitEaUVqL2pMa1dxTmhkSmdKY2J5T2RXZEtKYU41dkpmSGlGZE94L3U4RHI0OHNDdHcvYjloOTAxbmRGczZydnVic1BlKworSDN3bWlNVkJnRkRBdHFORHpzZ0xvWWNwYmZGb0pKK2JNRUNBaXZjRCs0VGd4R3Y0UFIzOTZzNDVvWXlnVUQxeVF2QmlmekE5ajJVUgorWkFrQ0JBbTJGdysyWVBvaTI0dnR6TitxTmUyUGtNUGY0Q3NPV0gvV2dYL2o5MVdPMEgxZUxJTnRSQkN0VmFnRDFhTjhmQjZDUGV2RQorL21hZHFHOEVvOHI2UXAwaWlQSXdEMTVIM1dQYWJYeGZISUdXOTNIaG9MSmVFVmpaVjNFOUI4dGw1SXh0eTdMWUZteC82bG5jOFNENAorc1IvNVBZWHZlK3R1cWl6N2xTbWtjVjJQMngvMXR2SmhLNUxVYWd4aWt0b0NoN1U5QjQ2SDNmdHJsNDU5eDhLaEk3Vy9JNHBPSkoxYworUmtzbzNZVWVPbzFNcVl0ZlYva2x0eHhiNmRSU0tvK3pCRGhHZUxycmhOSzVqWmRWSFpib1lNZnJ3dDlNK3JKaC9sNjgvb1JIbHN1SQorQisrbE05dUlFWnZmSGRrZk92ZnZESjBIZHRVc3Z6dTBwK2I3K1R6eForWGZXdmRpVmU2SHlzNS92QXplVnptVmxQK09SOUNxc1gvaQorWmJFOUt2Y0wyNFNmeGI5UGVqb2YrNDcxWW4zWXZ2Ris0YjBzZzlISXRQZ2M4ZWhvclJMZks5ZmQvcWVPVks1VGQ5TnRLK3NVbjZPeQorVHNiYnNYcHFLTnVRYlZQOWQzbDk1YmFvM3Y0c0s5NjIxTUdrdmdlL2krdHJ2Rzd4MTBSSVVxc3lpRW1TSkVsU3hneGlraVJKa3BReAorZzVna1NaSWtaY3dnSmttU0pFa1pNNGhKa2lSSlVzWU1ZcElrU1pLVU1ZT1lKRW1TSkdYTUlDWkpraVJKR1RPSVNaSWtTVkxHREdLUworSkVtU2xER0RtQ1JKa2lSbHpDQW1TWklrU1JremlFbVNKRWxTeGd4aWtpUkprcFF4ZzVna1NaSWtaY3dnSmttU0pFa1pNNGhKa2lSSgorVXNZTVlwSWtTWktVTVlPWUpFbVNKR1hNSUNaSmtpUkpHZXMyaUVtU0pFbVNtdXRVRUZ1eFlrWDBQNTJkblZGQ3MxZ3NGb3ZGWXJGWQorTEJaTDR3dVppK3hGQmlPSWRjWmh6R0t4V0N3V2k4VmlzVmdzelNzclY2NGtpUDJPSURZdkRtTU1rVmtzRm92RllyRllMQmFMcGZHRgorekVVSTZ5b2IvMy9STjY5L1R3UTljUUFBQUFCSlJVNUVya0pnZ2s9PQorCistLS0tLS09X05leHRQYXJ0XzAxRDM4NkI3LkUwNUY4NTkwCitDb250ZW50LUxvY2F0aW9uOiBmaWxlOi8vL0M6LzI2N0JBMkQ0L1Rlc3RfZmlsZXMvb2xlZGF0YS5tc28KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LW1zbworCiswTThSNEtHeEd1RUFBQUFBQUFBQUFBQUFBQUFBQUFBQVBnQURBUDcvQ1FBR0FBQUFBQUFBQUFBQUFBQUJBQUFBQVFBQUFBQUFBQUFBCitFQUFBL3YvLy93QUFBQUQrLy8vL0FBQUFBQUFBQUFELy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy85CisvLy8vL3YvLy93TUFBQUFFQUFBQUJRQUFBQVlBQUFBSEFBQUFDQUFBQUFrQUFBQUtBQUFBQ3dBQUFBd0FBQUFOQUFBQURnQUFBQThBCitBQUFRQUFBQUVRQUFBQklBQUFBVEFBQUEvdi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vMUlBCitid0J2QUhRQUlBQkZBRzRBZEFCeUFIa0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBV0FBVUEvLy8vLy8vLy8vOEJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUZCSjBPNzZodE1CCisvdi8vL3dBQUFBQUFBQUFBWHdBeEFEVUFOd0EyQURjQU1nQTFBRFFBTUFBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQmdBQWdILy8vLy8vLy8vLy8vLy8vOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQ0FBQUFvQ0lBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC8vLy8vLy8vLy8vLy8vL3dBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQS8vLy8vLy8vCisvLy8vLy8vL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSFlBCitBSGljN1QwSFhCUkg5N04zQnl6OUtHS1g0MEFFcVFjSVdCRHNKVWhUd2NTQ0J4eUluZ2M1RGp1S3dSb05LaG9MWXBmWUZWRlQ3S2pSCitvSmpZdThhYWFHelJxTVJvdlAvTTdPN2QzbDdoeUZmKytiN1A0VGR6dTI5Zm1YbnozdHVaMmRubDFBOU9OMWR0YjNJTGNGSkh3QWZ2CisxTmJBa2dVajZJeVRFQUFlZmY1T3JWWXpZUFg3OUIrVi9vUlpRUGRoVy9vWDlia1Z6Q1RNMWpEYndHd0xzeDNNOWpBN3dPeEltUUJ3CitndGtaWmhlWVhXRnVBTE1iekExaGJnUnpZNWlid053VTVtWXdONGU1QmN6dU1JdGc5b0JaRExNbnpGNHd0NFRaRytaV01QdkE3QXR6CithNWo5WVBhSE9RRG1RSmlEWUE2R1dRSnpDTXloTUlmQjNBYm1jSmdqWUk2azIvUHUvMWZGZit1VUJITGdud3IyUlRlZ2dMOUtNSlliCitDa3dtTjJDaDhYa1VEenhJSG9ZZnBDNTNaK01tOURyMTVJOXBad2srUEk3aFV6QUN4QU01a05WTEpqdlpBQjdCYm8rNWRLNkFrZDhGCit0bjhreUlYMVNBUEQ2eTNmR2NwSE1SRDVrTG55RVg0YWZjeW41ZmFDMnMrRU5ma3I4dXZiZnFSNkpxNi9vL3VOOFJNTCtwb1ZEZVA2CisvM3RmK3U5S0JIVWIvOHVKZ0JiQnQ2RnNuK3Y3NkQ3UUp6dGRtWk9YazZrU2RSdVRMcE9MdWd5VEtsWFl3anBuWjJaRzRuc0p2aEtJCityd1JHZ2hkdEt6K3VSd1Y0Zkh4UCtxdnBIZlFZUzU2K0NwQ1AzcHk2NHZucitHSENUZk5JNE5kcXgrVmdDRnNQS045QTEyTUE1ZmM5CitBWFd2SEFTb2UyRXVvSHhsQnFEdWx3c0FkWDljQ1NobDN4VlE5MENFMDAyWm5TNUtHWmF0a2htSENZR2VIckZzY09DanIxQThSY2VGCitIUmMvWm1KcmZWSUtqRGxLTUFMR0lIUWZHRkZQYWh4L2NEeEJjUVBaZ0RrMENIZDdGblBjRitURCtEc1NTUEc5aDRtRFNneFJnV3g0CityRERCeTRlT2Y1YjFrSS82N0pLbUxsMmhoSFJjQnhtK0E5YXZQcEd3L1d4L01rYytzaFZYb2s0MHMxTjk1Yk9UTlNtRURtQUJXdmM2CithVlVGMjJJSkszY0wvbFlJcXJDdDNnYklyblBSUFVCcmxxSi9mZXFNNnlBbFVCME9RbDFGRVFJSUlVQVpMSjNncUJMQm5YSHBnc3R0CitHSE12THFPd0YwSTZqd3FYdHZpSUFBTjRNUmp2TTF5S2NlbUFPWDZGYWE1Z2lBVDYyeldBZW1ndTZoOGV5TFlpdXNCK2w4TitUNE0yCitrUDAzd21nTmhoRm9yTXRnMkhNd1JDQVdsbGxnR0xSYXhNOGZqbFBDd1Y2ZWNZbUNPakd1Z2JveDBKeWdybmE1MW9uUm9VNk1qblZnCitFQ0M2enJhRTFkbVdzRHFsV05mSnc2WU9Ianc0VzZwTENsbW5GR3VUUEw3VFdoTXdqTEVUWG9nMmlkR0lNSVhSUXRBTVJsTTQ3eE43CitpVDM5UFQyRFUzM2JEL0poVGdiNXRoQjR3UHQrTTUzckE1TmtHWU4xa2NUdzl0cGNpeFFZck1zSG5pT3NWckF4WWk0V2h4dU5HZ0U5CitCYzRRVXhHOHRZaVJUSjhPOHFFRk13QnhnQmhmalVtRnBJRncrdW1MU05sMHVrUWNpbWc0U1cybks0eXFtNjQ4WERXV3lPaG9MWXR3CitPTmVWc0lReTlIckVITXFiOUp6bXBWckVpdThIUmUvaC94bzRBVmh3SGdXM1lQQjMwbkRCQ2lQd2JVYmdNNDNBUzQzQWx4cUJielFDCiszMXpQK2l3MEF0OVVULzdHOExmL1A5WG5Hd3h2b0FmZmJ3Uyt5d2o4S3lQd0hVYmcyNDNBcWZyWTZzRzNZTGdqQTEvZzVMVElkcEV0Citvd2NuRFR3ejg0RDdBWGVtUGhZd2htRDQ3elFmd05pbnJ4RzR2eEY0YTROd0YwYnVDMTI0alY3OUtUdTBZdURuUUFMQWkzOFVQcWtMCitkMlBnMWxvNExBb2I2Y0U1Y3UzMTlFUFpqMURMWnlqQUM1RVV2cDFlUFRuMlUrYms1R2JyWnN2NG5RT0xQNlZueGc2dERlckgwa2c5CitYYlgxa2NJUmpFWVB6Z2J3SjVDdVlBSUpXS2tqVUNRUFdsQkFCb0FDSFRoS1BLZ0RWendUUTdkbjVnN2hBR3ZJMHljZzZrdkFxeThCCit2NzRFZ3ZvU1dOU1h3TEsrQkZiMUpTRHJTMkJkWHdLYitoTFkxcGZBcnI0RTl2VWxjS2d2Z1dOOUNmenFTK0JmWDRLQStoSUUxcGVnCitYWDBKMnVzUThEa0VSQUhaaVVNZ3dXakdDSGdrZlFFNUpqWEFGSW4wbVlTWXcwUWRiWnBKcURsTVFrSjFtWERiSDJheS9UeDlxY0VhCitxWGoxVHdyVU9nUUMrc0xScDkrcmpWZmRSNGRKR2JBMHpFUjl6QlNUQ0YwbUtVWnFvbjVZeG1JeWo4TUVQZml5MGpDSmpoNWxoRW5OCitFZzBUS3hvMmFkSWtOYlB1UWhxQVdiTmdqRGdiQXpEOVNyWGxWQ3JhY0tXZVAzK3VWeW1FekswVUcyYk5nbkVyeFlicFY4cFhwMUovCitGQmhSdDZGSy9mTTB4YldCY0IwYjBLc1VJMHhkU0ppd2dkYWFsakhMd0FaYlZsNWUvaTlVTjljeG93RGptTGdCZ05NeS9WWkU2clJDCitML1JwTEZsZG85ZUt5c3BLdlZhd1lkWXNHTGNWYkpoK0s0SjBXb0g2a3RPSy9oeUNEZ0RGVHFPdHNESVFYdGtobDZteHZxV0lBVHRhCitHdXprdXVPMlVJZUpRUjN6Z1N6VE5CTTNjNWpVeEpwbTBzd2NKdHpnejJYaWFaNU9MRXd5Y1RKUEo2YVpORFJQSjZhWk5EZFBKNmFaCitlSm1uRTB1VFRKek4wNGxwSm8zTTA0bHBKaTNNMDRscEppM04wNG1WU1NZdTV1bkVOSlBHNXVuRU5CTjM4M1JpbW9tM2VUb2hUVEp4CitOVThucHBrME1VOG5wcG1Jek5PSmFTYXR6Tk9KdFVrbURjelRpV2ttVGMzVGlXa21IdWJwaE0xa1BzOFozaVRnNUM0a3VLVW9RTlFwCitQVjJtVUVsS3lENmdoTVdhRUxSUTI4TkpRREQwTEJHY0ZZbEFKNUFPLzZnbnFkUU1nNEJ6U2l1QkxQUHlyZWRxQzNSTVBUOVF0MFNpCitrUmducnBnUWZURmlFMkpDdEdJc1pKbHY3MTR3TE1hWkt5WlVYNHkzQ1RHaFdqR1dzc3pIang4YkZ1UENGUk9tTDZhMUNURmhXakZXCitza3oxOHhyRFlseTVZdHJvaXdrMElhYU5WZ3dweTd6K3NOYXdtQVpjTWVINllrSk1pQW5YaXJHV1pkNStlc1d3R0Rja0pzeTBwYmxECitNV0ZtV0ZwTjdNNmpQeHNXMDVBcnhvQ2xlWm9RdzdhMG10amZUMnd4TEtZUlY0d0JTMnRsUWd6YjBtcGlyMTY5YWxoTVk2NFlBNWJtCitaMElNMjlKcVl0VS9MVEVzcGdsWGpBRkxDekloaG0xcE5iSDdMajR4TEtZcFY0d0JTd3MxSVladGFUV3hSMi91TkN5bUdSSVRidHJTCitSRkJNdUJtV0ZoSmF2TUZJM3pUbmlqRmdhVjRteExBdExTVDBSY1VVdzJKYWNNVVlzRFFmRTJMWWxoWVNXbDFkYlZpTU8xZU1BVXZ6CitOeUdHYldraG9lckxtWWJGaUxoaURGaGFzQWt4YkVzTENWMTY2Q2ZEWWp5NFlneFlXcGdKTVd4TEN3bmRjS3JZa0JnN2dCNWtBNDJOCitkZUlJYUs2Mk1tcFhBSFJWSHFHWUFtcDNqNGFwcDVacGlENVREdzVUdGhVQjhMaEFZcGlwbDVacHFEN1RsaHltYkp1aDFoSU1NbTJwCitaUnFtejlTWHc1UnRJWkRSUVdDWXFiZVdhUnQ5cGdFY3BteDdBR0RnMHZPR21iYlNNZzNYWnlyaE1HWDNQZ0M1VzNvWVlrb0NIelRVCis2aXpOS0NIYjZqSWttcXI1b0RPUWdnd05Jd3MxdFVKb1FSK2paVVNha1JENG9qWDhMbEo1ZXI1Y3Fzck9VWlNRazNVWjh0elV0b0RhCitpb0cyc2NsMXRxbFphUVNnNVN4R0FGcGV3Z0lzZ1FNR29QVU1BaUt6ejBpZE0ydWRzL2s4UjlBYVBZM29Na3lXUGtMVVJTYVhsNUNUCitPUFZxcUxhQjlSb0c5WllPUmtBZjZnS1A1UENQWFN1RDVzUFVDcTByV1dwcVJaMlJPbWZXT21mejRValdyNUN2TGlGRnVsV3g0RU1oCisxRDV2dElzUEpZVHJYMmdKY1gwNHVKWnFheGF1Q0F5RVlXQ3doaWFnVUFCcHZEazBBalVKYWZLQkV2NGhNMG1uZDlFamlzQkNLMGdSCit5S0d3VXR2cFVlakthZ0NDMERKTnR6RzVjcWxDcXNwUmpoWDFrNDFSbFpBOU9IcHVveGFDYm1BTXlNVjlyOEQ5bjRNM0w0cEFQOGg4CitERHhIaTFkTTc2TXVwTTNMR3NxRDRhWkhUZzQwMVBZY1EyMmlGb0FlZUZ1b3JxbWlGWEdHRjFvMnAzazV3QmdHUGFLblRKcVJyY2dTCitTZlFxeWhkQ3pmYUVGVUsybncwcm1nVXJTTVU5YkFMUVlicjJHMDZ4UTUydURZU0llUWliZVlnK2N5Y0R6RU5NTVZkSHIvNzZGczA4CitsTTA4VkorNXN3SG1vYWFZVTBNREhtWWV4bVllcGhjUStDNEdtSWRwZWt5SCtYeWVEWXhxTUpiM1V1VG1RMVBJNTVpQ0syd1AyckdhCitDeTFMcGVOb2FOMmY2VFQwY09BZmRIOGhqSU13THNWbUswYklNbWovLzRCVG1VWXdMc1hpRm8yQXJjdlFpUUI4b0JlTEdQRm9pUnY1CitzaDJJUUdFaFRwYXZVa3JsZW9HWmFBWURjeHhrbUkvZldwSFNiRFh0ZlZpbWphY3BHaU9GSmxVSW9EdUdjcGdCS0RKT3M4MVhydFcrCis3bDNkR2tRaWY0bkxVY2xLeURST2UyMmd2OFRobDJuUTZ5d1cycXFvYTlTTXB0RWlzMWJUMUJtcGMyYXRjemFmWnd2YW9qVzYrSHdWCis3dkhSSEtFTklPdDRyQVA5UG1lSGZCUWg5WUlyb1JOY0NaM2dTdWdFVndLSHNuYUZGbEIzWHB4UVpnRTdJZ0cyV2FtNVIxSUJ6QWEwCitSNmJhTDFzbGg5cVNjS3plRVZhdEg3UU9GZjM2ajc2MUU0aEZCOHdpUjRVc2dETkk0emZHTEpEQ3FTNFQ2SGVaSlN1T1VLMWx6cENKCitPWUVvOU1BN1JhcFVJTitrd21zMFI4TzJNRktuNE4zZ0NvMTdHZ3FyYWtabU1Ua0FGTE5ZekFWb2Jka0pFa2xCR201dFgwZzZGaC8xCit3WjZSamJlY2gwQXRab05SdUVGYURQWW0zbkF3Rkc5V25ncmJjUWMvOExVRStMVUpDWUxjeGU4VVdZSyt3MlF5bGFTVWJBUksyUTFoCisvYTRoaFRBRG5UUWJxbytBZjF1cGpkYUNodEFhQ0l4UGdDcUNoSm5DZXd0YmdVanAzRmVtekpibGlTVGF3eER0WVNnYUlVaFZzaXgwCis4NUt3VDBMWUp6cG9ZVkNPU0EzSEZpU0lDcVQySTZTVGJqQnJxK3BHLy9MQVF0TGFmaUhyaXYxc0hrajRnQzlBTzNBUTJBTTh1T0Y0CitBTjJubXZHb2hkdUJYWElVS2pqU1MrMDNObGVXTnpod3pFajU1bmtuNGc0SEM3dlY5bnhiZEMrZ2QxbGxETm55d1NmSGlvK3RubkR3Cit1eVZlYnRXWEt0ZjFmMU1iZTZaZjUvVWlON24vNWREYTVlM3ZLUGU1VyswNnZMaHNYZTl0enp2N2VUMXMybU53K1k4UjhaZTNKTStjCiszS1JSQjJtNTQrSVh1L2Z2OVltWVh0aHJabWxTK2ZpZmNyTmlLNk9LNXlyZDU2NDk4MGNrNzBTYlVkNkZmeFk2bk14UHZOYm80Y3g1CitrWGVxdTF5OHgvK3lvdm1BcUNmM1hpLzJ1ajEzNSs3bzhMak52YnVRUlRzT2xweDd0UDUxOTJxM3pvSEh2Mm4xTW5DdDM4eFZKejg4CisxTzkxNDRyN1EyUnRUcmRaZjBQMDNIYTI4K0VLdTVtcFAyU0pHZ2Y4ZEtEOThwbVBybDc0VUw3M2VuRmw4WVR3SVRWeFZXclhvUytqCis3N3VjclprMGNCSVBoU1krUjEvbEY5YjlmQkFlaFJQVTVwRlVwVXllRnhTSXlpbHpmaGgrT05odSt0T3ArNHBPRnlTZU9keW81YWlnCis4cmxkZ3RZVWdGcytrNGFKbTE1dCt2QnEvREZMbXoza2xMVlBhemRFdmRzNjYvV3RCVCtMM0VvM1doNiszU1g2eExCYm82SU9UUHFrCitldXJhZFMzSmdXTnlwNjBaZjNWWDZ0NkUwMnM2bkpRMExlLzVaZkRuem80ekxzZnZUZHJhT2VOMHRmQk03MjVYdzlLOEpxMmI5M0hxCitSZmZGeXh2ZkRJODkrOUl0NldMRTBLMXoxbGVyZHh3T3Jsa2VYelZwbS8rOWJnSkZ4SUxZN0x0cHE5WUgzZW03Yis1NjJjWnpMVTd0CisrdnIxaFQ4SlF3MGRNWGFoV3hFOCtoUlF6NkJVdzJRalpVR3NzZzhjZFdYSmxNaEM3R3I2MkJ3V0NXTnVGYXdhUGZkeVJQb2VuMjVwCitsU2UyN25rRnVwUTE2WFJzNVprVlZ5L2V1MU1VOGYyUHJ1ZVhmbUQvb1grWmxmMm5zcE9CTTc3NmRZTC91cWJyci9SczlxMi8vTmF4CitCajg5R05Pb2V1ZG5Mai8yK2k0dnNjRHovTnlwVzNaZEYxM1k1WGZlNDZuLzlTSGZlQTJQbXRVajVmN1pXdC9iM1I3NmVkdndJZzFYCit2cXFoY1A5a2VITThLcUs4UWEveUVsVHRSeCtlbk5XMGg5dUJvTHVUaHYwUitIRFRRUGNpMlpyNCtFZU5ydzZvN0ZMY0pxblg0T1cvCitCQ2IyTDkwZVBHM29pbGVWRlhQdHZ4RW9UM2o0TiswcDhsNzBWbUs1MU90TmowZWJma2tlL1htL3lpekxIUm1MR2xlZEd2ekh2cFFECis0NTZlSHgvZlB5SW5ldGFHMGRPK0Vmay8rUDE4MHdZL0hxNWVjTEpuNWYzZjU3UmFrM1NpZGtyWGFydkVoVGVMRHh3OWRLRGc0ZndECisxN3BhaFJ5U3ZJcnA2R1MxL2s2UHBFREg0ekxKVkttWG9xSmwzTTA5YmU5SVNuNDkzdkJlNHg0L3I0ejQ0dDVINVdkOGpzM3cycjlvCitaYU56SFJmL1VPMDYzcVg4eklGZGlSM1gvbHJhYzVYbEZ3dm1mRDVjM212WW8wYzdOd3JUQXY1WU1ENXJ4cWdKaTdPT2Z0L3E5eVV2CitvajZkTWlXbzNjUnU2dGYzQmthY3VDOXlXYTJjczlrajRzeWtKWU84Zzl0dmVkRDI5VzJ2RldIa29aV25UNzRjQVQ3Zjg3VTA3MUtqCitjR1ZCazhJditnN0lQdjd0aGN1Ylh4YlpqU2c4MDJQNmswNTVDZHMrR3RObFVzSDB2SWgrN3JiYk9tMTROOVFxdXNuTHFrL2RoaFFsCitUZmk2eUhIODR4c0hMMnpyNUx0L2UxRk84dTZpbGRrUExxNmNVWEpYWlRYWXV1bkxkNW03Mm1aOGYzK1Z5dzJIb3NRZEMzMkRFb1QyCitZMVViZkgveW4vY21MYUI3ZkdOM0lvYndMZkY2ZG5mY3pKK0gyU1JlNjdHZ0xQZDI4M25kQkpPLzZtcnRFanhvUS8vdW43ZDdtN0lpCitKanA3em1yK2JMdnNiMjBYejFqbThlMHhsNzV4Q3l2di9HaXhaVDh4OXMwZkw1Y3VpdDQzOXZWdlMxTzIzZGo3TmlYOHEyUlpkZlBWCitHZExqZno2Ny9xUDZ6NU1OYnp5Tm52am0yQ0oxejNVM2p0cTZxSitzbUZSUWUyTGIwNzZPZm9HeHoxNXRjci94NTR2RFY3ZXBYMTJ0CitUVzIzYzNUYmRwSmJMczdwdDY0ZisvbUdwOXRoWHZPM3o2d1BsQjN4Nm55a0pNYnAvcWoxTFk1L3g3dVI2dm5Mb1pjVkl3KzFhbFk1CisyM1pNMXN0enQ5c1YvOTdiK1ZoTjdlcEx2QmFoM2NmUGJtK2ZHMzlTTm1CTVpXKzNKOVd2angrSjZueS9wczFvOTVZTGk2WnZhcmsyCis1WGJTNVRrVjNYN3o2RGF6cTIzWjBBY2JubDd5UFZwOHZpQnVodXhpZXNpOTJJcHZYblJzTmNUUmFWMHY3N3RIYk5aMnZqLzN5TTFGCit1MmFKdnI1U2VmS1p5N1pqNjBlYzUwL0k5SlFPRlAwaWlxNDZGM0tuK2M0U24xRWJ5bFl1THJXTTdoeWluTmRzMit0elIreW5DdUtECitnbVUzY3FkTnphM3VjTE5peU9FSHRhTERYMStmR0h0eCsyZDNTOHAycTFwNEhJMjlXN2pzbGFkcjBPQkxrbDVpbHpjYklxY0t1OTNvCis0ajM0MS9UTXA4S1hEaE5qcW9lTWp2YTRwS3lkN2xLVjNuT3JkN2s0NWx5RTM1TmY3eld2MmZ4NzgyMFBta2xURmo1NGZ1bjQxc0Z4CitaYWRQRHd6WWZLcmpvY1dyODhJT1h4ci9ka05ScHprQkFVc2JybjNhZlc1L2grMStGVS9FN1pQUGovL0VZbWV2amRzdTk1blhvK3NBCitqL1pIYmIrYy9zT3pjWDdQTmljNmUrNlAvNjNnMTkzWnYzbjBhNXZWdWlCbTNUcnZYenRPZnVWNCs5dnNCVlk4VmFPcWZTa1BENU1mCis3dnBnbiszb3ZWdS91WGRnMWlQSnBVWHhBVTBhWGxva0tnb0s0TSs4dm1Ec3RwSGVNejV5Y1NWQ081MGErdldaZ0JrRG5nUjE3VGY0CitmSnJmdW12WGJ1eWMyblNscFBLUFpZdTkzT1VUdjd5eS9OY0RaMTlGampwOExIdk10VSszTE1pdlRzNUs3ZDMyMnZEY1Y3ZmVXVjB0CitKVDVxNlNqcFYzSzlMUC82K1VHajI3eFRGNlRzeUFsS3JRMTUwNjc0NFpDajAxdmMyYjJvT2k2NVkxeFEzNTFCcHk2dlAxdjhZa0dQCitGYStQako4ejRhY3BaN1lQNmp2QjY4V0dPWVdwWVR1YzdGcTNMYmcyOHpmUGd6TEJuSTAxVlFJM1JkVzhoYzhpNTY5d2F2eVo1ODRwCithMVp0M0xiQXYrc1g0enoydG5USlRWczdmZG51QnN1MzNrNFAveUMrM2FiKytSdVhKQ2RQenBBTXNmN3Q0OGp5RXQvZHAvM2puaXBmCitsajd1dktKU1FmcGNQakUzMkh0SHIzUE52VXFYZHBKNUZYeGgyejF2N2ltL056NytWeHpjQXNvbjN0blkzQzBtb05ibTdkMVhONmVQCitPK2JJRnhJZWtiT0xYazM0NHUyQzNlUHVESDVjTStmQmc0S2pPOFhnbzBkOUJLN0xGWDVieHk5YWw3eG8yaFdMRGlQbkJSODY2YjBxCitZRTNURGs1VmpyZjgyNTIvMzIzWW9Bc1hIeDhxZDR1UzJVUzVUMG51dE9ieU9QZFptLzVvY3ZmTFBINmZtdGhPTGsvMzNvbjR4V05LCitqV3RBKzNmTjRtYmZrZ3pwL0loOHVjbjJ0TVdnUGJFdDR5UGU5Zzg1VVdMYk5rYmMyMzdyL0xoUyt6U3hwTlpuWnZ2OUgwMThZbGw2Cit2OW5xYi9xUG1DdDh0L1B1bGJuSjcrUjNEejc0Y3Y2ekNjWHJ6cWoyU0ZiN0w5dmZlVnA4M3RUZkJnWk16SzhveWZETHJZMHNYVGErCitsZXBiZHc5eWU4V0gvUzNMbklpR1Z1ZlBsWWJ5SXFSanhYNjNjellGeTdJdjd2MzBqR1JCc2VmdTJRbkppVFVaeXcvbHQvN2h3ZjJ2CitybGtlSGZobFp2QjZhY2xtNFhML2ZwUGJmRGE4LzltOXc5YzJlNVY4M2RIVzkwVGpYanZXUTlVbjlqKzc3TnZOamNObFEwOHNUUEY3Citicm5wczVrZTY1WTA2TmpuK2xYZnIvWlY1dzhzNkR5azVjR2IzL3packg4dHo2SnFaWEpzWm1MZjJhUFBWaHkvZkhuOTRQYmh0bS9CCitybG11MXA0UEk4S0hmL1ZvNFVYeVoxWHdtUExqanNxcmliWmRmdXVUdWlGZ3k3YWFrd05Iam5ydVduSU03TDdXNFBQT2U1eS9IOVgyCitrMm5ETm84dkNSdDUwRzJzOTQ0dFJQeU5UK2NYcS9jNmp5cWFHUEJvVWVzdHVRTnNmdWxVZnM1bXo4dWtDTHVINTZVRHR0aU4yOVV3CitZVUNHYThyaEY3c25DbElhcVpZTnZ2THcyYkpaYjhia2ZaQ1hmdngyeU5tR3Y4bjZERXE5bGpMaVRkQ1RLRjZ2bjhldUNSOSs4ZXErCis3aHNHUHkzdVhiWHlZdXRkYno0YmtuM3Fmb1RWbWs3UjhsMDlnaVk4alMwcVV1eHpENXUySlduTmxhZUxQdW5lN1hUT3JnOU9ya3grCithSGxTTWFLUktqVmpwTjNtRG4zY2x3UWMzRnQ2Y1FzYWNPcmZ0TzFQejEzeEpUeHFTbEFQbU5rM2JXcVl4UjEzME1PdVBqYUhnbDJuCisxSDR5bXN6Sk9idGJPTS83K294VFc4N3hwOXh0WXg4ZTdaWDQ2TEg5Vm44eWNMcDAvNUxzUFl1V1ZidWtoOXlRRE52WWhHejM0UE9QCitTNnRHZnYyb09DYkpMVzdtNWZZWkZVTS9LYzZKZU53Z2E5NEhQbjI4dlpKOEFpV0xsUTZ0ZXM4dk8vVnB2OWVGV3lQWHpFbStLMTd6CitSYWZ2OXB6cVdadGZzUExaVW1MQ3QxNzcwb1RqejRQR0N4TksxVHYrakd3eU15dkkzVzN3dThST2VaZW5XdmlzUGxwejAzUHB4bGpCCis4WUc3ZHgvNVVkTjBnaGNBakkvRGRaT0JVVG1YQVhkZ3FrM0JoTTR3bFV2SUhlaHBVMk9lNldFZmx4TjMxS1ZORnd4eGtoaml3VFVDCitiWnBsWTdaSkpIeGdnYi9mWUFIL0JrTkcwN0JDWnNOWjNXek9qQTl0R0tkZThSWHB2T0tiQUdlSENmRFh3VUVBZno4aXBmQnZPRG1DCitYRVorUVRLZmNTbkNXOTJtNE5JYlZqOFRwNStpVzdHT2ZRQWo4SDYwTCt0NEZkNm1SczBlQ2J3WERZQlFuTTVHTTc5bzR5OStwWmYwCitobG5QSmpTcFF5aHpSTDN3U3dqeDZ3aENJUXVuZ2tBejAxQUlXa25QWXpPRUpHQStXUlFpcEY0dlFOZXRoSGJnNE1HREFKa3A2a1liCit5SWQ1YnhwaFc4TTVlUkpwQnpQUWZGaUFPYmVpdjVXd2xpd2gxbkpxUFBPNi9leHhrRUdIYU5oTG9sRXlaVjUyamlKS0xBa01Gb3RrCitpdlFjdFBvWEplN2ZyM3RBcEZpVXA1SXFNcVR5SElVc1NqeFdsaWVPN21odjAwSGFMaTgzUVNtQzVJcThkdElvOFRDVktyZGRVRkJlCitPalFCYVY1Z1RxNU1BYTlsNWloSFNsWHdWSmtWbEtHVWpvWnNSOHFEUW9LRHc0TkdTck1WNG82SVQ0NDhPNk43dGx5T1R4QzlySXRjCitLUm9sbFVlSjA3SWs0cUNPSFlJNFdIS0ZhSFNVdUcyYmtEWmlVYm8wTjBxY0taZXE0T0hJM0l3b2NaNGlTeXlTeXJOZ2U5SlZ5anBGCitxTVpJTUk0OGYyU2ZuQXdLSm1rVEhCeU1CR053ZkdZbUJZNWt3RUVzTHZxMVUrYmtLeklvTExrQ0FXU1ptYkowVld5ZWlpYUZpdXZZCitGL1pTWDVMYXZZVlNHT3h0UHV4dFByWkFBZTVkWkFHSlFrZjZveGRXZUpzOXZHQXZSRVpQRW4zeE1sWTJMUFB3Mm5TaTBBWGdGUmNZCitjdG9EekFmWkZnTHpkTUVvSlVLVDQ5UExKSmJ3bUhrYkh3bE54VWFMakE4bDlNMGNFaG9hTWo2UVdZTU5FQkcyZ09abml6RXpoWmJFCitIY0wyVi9TQ1VpSG1PWm5vcWp6Qys0UkE4b3JRTnc5NFUvRHhWT0lGQU1KcFZRaG5PaTVuWVB5WnVQd1VsN053T1J1WG4rR3lHSmR6CitjRW05MFRzUGx5VzRuSS9MQmJqOEhKY0xjYmtJODErTWo1ZmdzaFNYUzNGWmhyNCtFWE9BYUFiY3dRNGdmdFlad3BianJ6T3N3T1ZLCitoQ1ZhaFhtc3hwQTF1RnlMNGVVWS9nV0dyTVBsQVFnZkNxeUZ6TGQ2QUE0WGZlQmZCNVpUMm5HYzFJRjI3YldrR3VnNjZXVEM4MGp4Cit2Wi9CMzk5SnBkUmpZOE9PaWtwRkRqbzMxeU1jV0I3UkRac1hjOFdPZGNVc1grRVo4WlVRUTc3Q2czOW0rd3FoRVdyY1Y5U1pRT01yCitiVXo2eXVNQ3lYdGZNZWdyaEk2dkVFWjk1VUp4N2ZmL09iNFM4amYwRmI0Ulh3azE1Q3Q4K0dlMnIvQ3dITk8rc25EaFFvMnZSSmowCitsZkx5OHZlK1l0QlhlRHErd2pQcUs5OE91dkFmZEY4Si9mZjZTbGM0K2tZNzFiMkV5R3hiQ2tYUXhpbHIzbjVQclo3NlFQdlJvbUE0CitneEE2VUlZZEwzUUZQS0QvWVM1dnlNVU51d1R6U0l2cElCN2RRZVZrTGN4YWlpcm5GU1YzL3NIT1VZMzU1M1JPV2s3RzJBUWxOUXpPCitVL1ZWalpYTDhFa3VMcUJxNFUrR0xETUo0d1JwUURKRlJvSlVLWVZna1Z5S2FpdFRCUFR2UzNkakxpNVJEVFVkdzZnTnFSK3BuVzlTCis3ZHYva3RvUjcrNUM1RG1kaE02WUN3QWZRc0twa0ZPY2pTNDN0QlByTktSN0I2LzFocmJSWE9pc0o0R2lFQWxKZXRKSWdEUWFpd0RhCit4NWRQTmQzTkpPWmNRSjhudy9Oa2VKNUJ0Nk9GRUw4NlFzQTVwd0daMFhUYkdnSVBUU1JscG9jQzJPSzE1SERPVkc5RnlWQ25qaVZKCitmNU9wbnNaaC95dW1jT1hrR0I3YmRTMGRRMWRuOFA1T3JpdFM1cWlpeEFIaHdWU0NVblBUdTJjcjgxU3gwandWOGxGWU96R3FxU29lCitGcG55SE5nbE1yazhPemN2TzQrQ3d6cmtLTWVKUmFPVnFJL3lQczZYS21Xd2F4VHBFRXgxRG4zU1JhVkV6TXdKRnFLOGNiRG5VWFhTCitvc1N3ek1abGZwUllBYldCTktQTUhpRkRaMzN4a1ZnMFFxWkVlZ3pCSk5JOG1Ud2JhUzM0TDlsRnVHRzdDRFhQTHRDdVJvVklOVFpYCitsaWxOaDNYd0c2a0lrS3NvZGpJcDU0Sk1TbDFJeitOY1NNK2pKVkg2K0N1eGN6blpBaXhuMlo0Tkx1RWtSaGhJUTVhVFBqb1lyalNHCitRSmlJNDVNQUpHbmlGQk9KbWFpRW9pV0tlZ1RnSmhUMTNJV3REY1FtdzhtZE1CWFJSQVlqR2twb2JHZ0h4emdlT0daemw4SFlVUlRWCitjUzE1bGpQS0NWMjljV2JrVDN2QTN6RHVtVDl5V1V1bTZvUnpBallMaGZNZWY1TncvbDhZdzJPMlM5L0g4UGN4L044U3d3MUZYVmZXCitQSThiZHhzS0xVRlRjQldlaVlVMm1pdU9vQUdrNlc0Qng4NXd2R29QZjlIQTJZcmdhY2EwYUhOblYvcjZURUM5VHMrTXNGRlUxcC9ZCitSSU1LKzdwSDJBMzFSdGpjUnhkTUpOZXNpTEUrK1JySGVuUmhRY09ZYzJ1YXFmWlJCcFgwNDd4MGRkWGd6ZnovOERodjZGbkFNcklECit6TnFHSHRKOWpGaG5LaWR6OVFMYm9MOWhZSHNmMFA1N0FwcmhRYWtqSEpRRzBSREcwcTFabHM3QUxBekFBQXUyanV3S3N4WkdoWWcyCitjS3IrenFHM0hUQTdzVVBmU2t2cW54c2tRYy9ZUXFEUUdJMXJ6UTU5cjlWb0tBcEFQMEI5dWdPRnZrWTZvWThLZS94Nmh6MG1yUDRQCitoN2xXOEo1R2FaRWI4RjdVOC92ZzVlUlluWUFYdW5GZE85bjdnR2M2NEVuQy9tTEVnMDNBNk84am40bkkxMWdUK2U0dU43VFl5VjM3CitEZkE2K2IreTltdFlZUlpRWVFQaDc3MkcybHVBUFV0aGdFY3Q0bE1qWnZSNUVCbGVwaGZ3bW12NDRBOTlvN2Vhc2pUdkZVcG9CS0l1CitCSjVwQk1LNGlCQWF3YWdJQnNHb0NBcUJaMXhFS0kxZ1ZBU0RZRlFFaGNBM0xpS01SakFxZ2tFd0tpSU05d2dCK0R6bWNRdTFnY29wCitob0lRR2dpZmhyRG1GaGpDWG5NUzBCQUVLMTJDa2hNTjRWS3haeWgyTkFSUm5heEI2VzAwQmRGaWtSaUgvZjlIbkdrSW9xSTJqRm5TCitFQzJWYTR3TVA1L295TE1CZkVzR3ZweHNyV1BMMUc0N0hyQVFqc0tER3ZTYVdRRG9EL3JDWTJYbWNyS1JEcmFBeHFZNmhka0FKOVRaCitBR2VQVzJNSHl3dzBuSUxIVHBoQ0NFandkc096TTMzU0VxSlRNYncxaHZ2aDhoTU1LUVJhWVMzUks0WEFuNWdNcjFRSi9ubGI1OUIvCithNkMyenFGM21yaGI1eHdQbUw5cHJqK3NCUWtLNkVkeXZXd2NjYTNRT2JRcDRHVk5uVE54d0VLalFaSW5wSS85S1FNaUhER01NQURqCitHWUR4RGNBRUhOaWZtZ0V0R3NGUVp3VCs0Q3R6eG9ObmhPYU1ENmphb2pNQzB5RXArK0Rna2NCMHhNMXhNUWhmRVlONXhQQXhKZzlqCitJdGtUZVRhNEI5RlZRUXhqd1k0YVQ2Q3U4NmtheENCYVBxYTFvS1h3YVZvN0pLVXdFMHNoYVNrQ2pHbEpZd3BvVEdlTStUSEdkSVdZCitGNEVEU0laVlR3Q1IwTEk2d055UjV3eSt4QzJPb1hzTTRjNkNOanRMcDM5dFFIT3F2ZHJIWVFTUlJUWUVXU3cwMkRqMGhKdmZGWUNQCit5ZVl3YXk5WkFNMC9DcU1BU2pLQ1VKSUUzZDE4WnJhZ2pSWVVtSUd4b3dpcWFldGVxUEUvZ3JvUzFFZy9hWnBjSnNFN0pTVDZDK0M2CisvN2lIL3FkVWFGT3ZTSCtSeERBdTZ6MUVRLy8veURSSmlLRGVKS0dqeVhBd1dxZDNDQTRoOTVkSm8yR0hqZGFaY2lIS0tiNzRVZ3VkCitTMVM0MWFnUE1MZjBmMm95OWYrdmVPZFBuaThMYkNxY3Y0Z0VmdjZ2dHdaRDJGMUFUVFhSOVFSQTJlb0FRSDMzRUgwbUFLMnBvSGR4CitoVENqOTJQUlh1OEpnSXJnVXdBMTlwZ05xQTBDRzRIdS84TmlPb0xxUTZGbW03ZXgzeFpDaWg3RkR1cWxWM3hJdlJFTDdJUVV4eFkwCitSVXFPY2tRZXdzclRmQVd0QlUyTUtiVGcvNlgwZndJVW1pY0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKKworLS0tLS0tPV9OZXh0UGFydF8wMUQzODZCNy5FMDVGODU5MAorQ29udGVudC1Mb2NhdGlvbjogZmlsZTovLy9DOi8yNjdCQTJENC9UZXN0X2ZpbGVzL2ZpbGVsaXN0LnhtbAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogcXVvdGVkLXByaW50YWJsZQorQ29udGVudC1UeXBlOiB0ZXh0L3htbDsgY2hhcnNldD0idXRmLTgiCisKKzx4bWwgeG1sbnM6bz0zRCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiPgorIDxvOk1haW5GaWxlIEhSZWY9M0QiLi4vVGVzdC5odG0iLz4KKyA8bzpGaWxlIEhSZWY9M0QidGhlbWVkYXRhLnRobXgiLz4KKyA8bzpGaWxlIEhSZWY9M0QiY29sb3JzY2hlbWVtYXBwaW5nLnhtbCIvPgorIDxvOkZpbGUgSFJlZj0zRCJpbWFnZTAwMS5wbmciLz4KKyA8bzpGaWxlIEhSZWY9M0QiaW1hZ2UwMDIucG5nIi8+CisgPG86RmlsZSBIUmVmPTNEImltYWdlMDAzLnBuZyIvPgorIDxvOkZpbGUgSFJlZj0zRCJpbWFnZTAwNC5wbmciLz4KKyA8bzpGaWxlIEhSZWY9M0QiaW1hZ2UwMDUucG5nIi8+CisgPG86RmlsZSBIUmVmPTNEImltYWdlMDA2LnBuZyIvPgorIDxvOkZpbGUgSFJlZj0zRCJvbGVkYXRhLm1zbyIvPgorIDxvOkZpbGUgSFJlZj0zRCJmaWxlbGlzdC54bWwiLz4KKzwveG1sPgorLS0tLS0tPV9OZXh0UGFydF8wMUQzODZCNy5FMDVGODU5MC0tCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUHJlc2VudGF0aW9uLnBwdHggYi9UZXN0RmlsZXMvUHJlc2VudGF0aW9uLnBwdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwMzM3MAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9QcmVzZW50YXRpb24ucHB0eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkEwMDEtVHJhY2tlZC1SZXZpc2lvbnMtMDEuZG9jeCBiL1Rlc3RGaWxlcy9SQTAwMS1UcmFja2VkLVJldmlzaW9ucy0wMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMDliODYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUkEwMDEtVHJhY2tlZC1SZXZpc2lvbnMtMDEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkEwMDEtVHJhY2tlZC1SZXZpc2lvbnMtMDIuZG9jeCBiL1Rlc3RGaWxlcy9SQTAwMS1UcmFja2VkLVJldmlzaW9ucy0wMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MmQyZTEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUkEwMDEtVHJhY2tlZC1SZXZpc2lvbnMtMDIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDEtQWZ0ZXIxLmRvY3ggYi9UZXN0RmlsZXMvUkMvUkMwMDEtQWZ0ZXIxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3YjQ3NwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SQy9SQzAwMS1BZnRlcjEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDEtQWZ0ZXIyLmRvY3ggYi9UZXN0RmlsZXMvUkMvUkMwMDEtQWZ0ZXIyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2OGYzMwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SQy9SQzAwMS1BZnRlcjIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDEtQmVmb3JlLmRvY3ggYi9UZXN0RmlsZXMvUkMvUkMwMDEtQmVmb3JlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4NzBlOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SQy9SQzAwMS1CZWZvcmUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDItSW1hZ2UtQWZ0ZXIxLmRvY3ggYi9UZXN0RmlsZXMvUkMvUkMwMDItSW1hZ2UtQWZ0ZXIxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3OGM2OQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SQy9SQzAwMi1JbWFnZS1BZnRlcjEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDItSW1hZ2UuZG9jeCBiL1Rlc3RGaWxlcy9SQy9SQzAwMi1JbWFnZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODcwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUkMvUkMwMDItSW1hZ2UuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDMtTXVsdGktUGFyYXMtQWZ0ZXIuZG9jeCBiL1Rlc3RGaWxlcy9SQy9SQzAwMy1NdWx0aS1QYXJhcy1BZnRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Mjc4OTkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUkMvUkMwMDMtTXVsdGktUGFyYXMtQWZ0ZXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDMtTXVsdGktUGFyYXMuZG9jeCBiL1Rlc3RGaWxlcy9SQy9SQzAwMy1NdWx0aS1QYXJhcy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZTIxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUkMvUkMwMDMtTXVsdGktUGFyYXMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDQtQWZ0ZXIxLmRvY3ggYi9UZXN0RmlsZXMvUkMvUkMwMDQtQWZ0ZXIxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1MWNmNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SQy9SQzAwNC1BZnRlcjEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDQtQWZ0ZXIyLmRvY3ggYi9UZXN0RmlsZXMvUkMvUkMwMDQtQWZ0ZXIyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwZTY2NgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SQy9SQzAwNC1BZnRlcjIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDQtQmVmb3JlLmRvY3ggYi9UZXN0RmlsZXMvUkMvUkMwMDQtQmVmb3JlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxYTQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SQy9SQzAwNC1CZWZvcmUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDUtQWZ0ZXIxLmRvY3ggYi9UZXN0RmlsZXMvUkMvUkMwMDUtQWZ0ZXIxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2YWQ3NgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SQy9SQzAwNS1BZnRlcjEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDUtQmVmb3JlLmRvY3ggYi9UZXN0RmlsZXMvUkMvUkMwMDUtQmVmb3JlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxYTQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SQy9SQzAwNS1CZWZvcmUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDYtQWZ0ZXIxLmRvY3ggYi9UZXN0RmlsZXMvUkMvUkMwMDYtQWZ0ZXIxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3NzRmZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SQy9SQzAwNi1BZnRlcjEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDYtQmVmb3JlLmRvY3ggYi9UZXN0RmlsZXMvUkMvUkMwMDYtQmVmb3JlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlYTUwYwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SQy9SQzAwNi1CZWZvcmUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDctRW5kbm90ZXMtQWZ0ZXIuZG9jeCBiL1Rlc3RGaWxlcy9SQy9SQzAwNy1FbmRub3Rlcy1BZnRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTZmMzMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUkMvUkMwMDctRW5kbm90ZXMtQWZ0ZXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUkMvUkMwMDctRW5kbm90ZXMtQmVmb3JlLmRvY3ggYi9UZXN0RmlsZXMvUkMvUkMwMDctRW5kbm90ZXMtQmVmb3JlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0YzEzOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SQy9SQzAwNy1FbmRub3Rlcy1CZWZvcmUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDEtVHJhY2tlZC1SZXZpc2lvbnMtMDEtQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAwMS1UcmFja2VkLVJldmlzaW9ucy0wMS1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NzAxNmIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMDEtVHJhY2tlZC1SZXZpc2lvbnMtMDEtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDEtVHJhY2tlZC1SZXZpc2lvbnMtMDEuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAwMS1UcmFja2VkLVJldmlzaW9ucy0wMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMDliODYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMDEtVHJhY2tlZC1SZXZpc2lvbnMtMDEuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDEtVHJhY2tlZC1SZXZpc2lvbnMtMDItQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAwMS1UcmFja2VkLVJldmlzaW9ucy0wMi1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNjliNDQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMDEtVHJhY2tlZC1SZXZpc2lvbnMtMDItQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDEtVHJhY2tlZC1SZXZpc2lvbnMtMDIuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAwMS1UcmFja2VkLVJldmlzaW9ucy0wMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MmQyZTEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMDEtVHJhY2tlZC1SZXZpc2lvbnMtMDIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDItRGVsZXRlZC1UZXh0LUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMDItRGVsZXRlZC1UZXh0LUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU0M2NhZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAwMi1EZWxldGVkLVRleHQtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDItRGVsZXRlZC1UZXh0LVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMDItRGVsZXRlZC1UZXh0LVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwNzEzMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAwMi1EZWxldGVkLVRleHQtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDItRGVsZXRlZC1UZXh0LmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMDItRGVsZXRlZC1UZXh0LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3OTNjZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAwMi1EZWxldGVkLVRleHQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDMtSW5zZXJ0ZWQtVGV4dC1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDAzLUluc2VydGVkLVRleHQtQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQzNjYxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDAzLUluc2VydGVkLVRleHQtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDMtSW5zZXJ0ZWQtVGV4dC1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDAzLUluc2VydGVkLVRleHQtUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWZkNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDAzLUluc2VydGVkLVRleHQtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDMtSW5zZXJ0ZWQtVGV4dC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDAzLUluc2VydGVkLVRleHQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjJhZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDAzLUluc2VydGVkLVRleHQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDQtRGVsZXRlZC1UZXh0LWluLUNDLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMDQtRGVsZXRlZC1UZXh0LWluLUNDLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4YmFhNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAwNC1EZWxldGVkLVRleHQtaW4tQ0MtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDQtRGVsZXRlZC1UZXh0LWluLUNDLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMDQtRGVsZXRlZC1UZXh0LWluLUNDLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1YmQyNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAwNC1EZWxldGVkLVRleHQtaW4tQ0MtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDQtRGVsZXRlZC1UZXh0LWluLUNDLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMDQtRGVsZXRlZC1UZXh0LWluLUNDLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4MDIyMAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAwNC1EZWxldGVkLVRleHQtaW4tQ0MuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDUtRGVsZXRlZC1QYXJhZ3JhcGgtTWFyay1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDA1LURlbGV0ZWQtUGFyYWdyYXBoLU1hcmstQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmM5NWFjCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDA1LURlbGV0ZWQtUGFyYWdyYXBoLU1hcmstQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDUtRGVsZXRlZC1QYXJhZ3JhcGgtTWFyay1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDA1LURlbGV0ZWQtUGFyYWdyYXBoLU1hcmstUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWM2NzkxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDA1LURlbGV0ZWQtUGFyYWdyYXBoLU1hcmstUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDUtRGVsZXRlZC1QYXJhZ3JhcGgtTWFyay5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDA1LURlbGV0ZWQtUGFyYWdyYXBoLU1hcmsuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTU3ODBkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDA1LURlbGV0ZWQtUGFyYWdyYXBoLU1hcmsuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDYtSW5zZXJ0ZWQtUGFyYWdyYXBoLU1hcmstQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAwNi1JbnNlcnRlZC1QYXJhZ3JhcGgtTWFyay1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMWE2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMDYtSW5zZXJ0ZWQtUGFyYWdyYXBoLU1hcmstQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDYtSW5zZXJ0ZWQtUGFyYWdyYXBoLU1hcmstUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAwNi1JbnNlcnRlZC1QYXJhZ3JhcGgtTWFyay1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYWEzYmQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMDYtSW5zZXJ0ZWQtUGFyYWdyYXBoLU1hcmstUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDYtSW5zZXJ0ZWQtUGFyYWdyYXBoLU1hcmsuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAwNi1JbnNlcnRlZC1QYXJhZ3JhcGgtTWFyay5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YWVjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMDYtSW5zZXJ0ZWQtUGFyYWdyYXBoLU1hcmsuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDctTXVsdGlwbGUtRGVsZXRlZC1QYXJhLU1hcmstQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAwNy1NdWx0aXBsZS1EZWxldGVkLVBhcmEtTWFyay1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZWVhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMDctTXVsdGlwbGUtRGVsZXRlZC1QYXJhLU1hcmstQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDctTXVsdGlwbGUtRGVsZXRlZC1QYXJhLU1hcmstUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAwNy1NdWx0aXBsZS1EZWxldGVkLVBhcmEtTWFyay1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NzJiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMDctTXVsdGlwbGUtRGVsZXRlZC1QYXJhLU1hcmstUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDctTXVsdGlwbGUtRGVsZXRlZC1QYXJhLU1hcmsuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAwNy1NdWx0aXBsZS1EZWxldGVkLVBhcmEtTWFyay5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NDFmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMDctTXVsdGlwbGUtRGVsZXRlZC1QYXJhLU1hcmsuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDgtTXVsdGlwbGUtSW5zZXJ0ZWQtUGFyYS1NYXJrLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMDgtTXVsdGlwbGUtSW5zZXJ0ZWQtUGFyYS1NYXJrLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1ZTljNwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAwOC1NdWx0aXBsZS1JbnNlcnRlZC1QYXJhLU1hcmstQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDgtTXVsdGlwbGUtSW5zZXJ0ZWQtUGFyYS1NYXJrLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMDgtTXVsdGlwbGUtSW5zZXJ0ZWQtUGFyYS1NYXJrLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyZmE1ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAwOC1NdWx0aXBsZS1JbnNlcnRlZC1QYXJhLU1hcmstUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDgtTXVsdGlwbGUtSW5zZXJ0ZWQtUGFyYS1NYXJrLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMDgtTXVsdGlwbGUtSW5zZXJ0ZWQtUGFyYS1NYXJrLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzMmM5YQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAwOC1NdWx0aXBsZS1JbnNlcnRlZC1QYXJhLU1hcmsuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDktRGVsZXRlZC1UYWJsZS1Sb3ctQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAwOS1EZWxldGVkLVRhYmxlLVJvdy1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYTU5MDcKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMDktRGVsZXRlZC1UYWJsZS1Sb3ctQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDktRGVsZXRlZC1UYWJsZS1Sb3ctUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAwOS1EZWxldGVkLVRhYmxlLVJvdy1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MzMyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMDktRGVsZXRlZC1UYWJsZS1Sb3ctUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMDktRGVsZXRlZC1UYWJsZS1Sb3cuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAwOS1EZWxldGVkLVRhYmxlLVJvdy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTA2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMDktRGVsZXRlZC1UYWJsZS1Sb3cuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTAtSW5zZXJ0ZWQtVGFibGUtUm93LUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTAtSW5zZXJ0ZWQtVGFibGUtUm93LUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyZmU1OAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxMC1JbnNlcnRlZC1UYWJsZS1Sb3ctQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTAtSW5zZXJ0ZWQtVGFibGUtUm93LVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTAtSW5zZXJ0ZWQtVGFibGUtUm93LVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyMDNmOAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxMC1JbnNlcnRlZC1UYWJsZS1Sb3ctUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTAtSW5zZXJ0ZWQtVGFibGUtUm93LmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTAtSW5zZXJ0ZWQtVGFibGUtUm93LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiZGM3MAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxMC1JbnNlcnRlZC1UYWJsZS1Sb3cuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTEtTXVsdGlwbGUtRGVsZXRlZC1Sb3dzLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTEtTXVsdGlwbGUtRGVsZXRlZC1Sb3dzLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0YzYyNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxMS1NdWx0aXBsZS1EZWxldGVkLVJvd3MtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTEtTXVsdGlwbGUtRGVsZXRlZC1Sb3dzLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTEtTXVsdGlwbGUtRGVsZXRlZC1Sb3dzLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkMWY3MgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxMS1NdWx0aXBsZS1EZWxldGVkLVJvd3MtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTEtTXVsdGlwbGUtRGVsZXRlZC1Sb3dzLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTEtTXVsdGlwbGUtRGVsZXRlZC1Sb3dzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxMWZkOAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxMS1NdWx0aXBsZS1EZWxldGVkLVJvd3MuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTItTXVsdGlwbGUtSW5zZXJ0ZWQtUm93cy1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDEyLU11bHRpcGxlLUluc2VydGVkLVJvd3MtQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDZkNWE3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDEyLU11bHRpcGxlLUluc2VydGVkLVJvd3MtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTItTXVsdGlwbGUtSW5zZXJ0ZWQtUm93cy1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDEyLU11bHRpcGxlLUluc2VydGVkLVJvd3MtUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjZjYWIyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDEyLU11bHRpcGxlLUluc2VydGVkLVJvd3MtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTItTXVsdGlwbGUtSW5zZXJ0ZWQtUm93cy5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDEyLU11bHRpcGxlLUluc2VydGVkLVJvd3MuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmE2MDU3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDEyLU11bHRpcGxlLUluc2VydGVkLVJvd3MuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTMtRGVsZXRlZC1NYXRoLUNvbnRyb2wtQ2hhci1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDEzLURlbGV0ZWQtTWF0aC1Db250cm9sLUNoYXItQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjI3YjhhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDEzLURlbGV0ZWQtTWF0aC1Db250cm9sLUNoYXItQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTMtRGVsZXRlZC1NYXRoLUNvbnRyb2wtQ2hhci1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDEzLURlbGV0ZWQtTWF0aC1Db250cm9sLUNoYXItUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWY5OWMxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDEzLURlbGV0ZWQtTWF0aC1Db250cm9sLUNoYXItUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTMtRGVsZXRlZC1NYXRoLUNvbnRyb2wtQ2hhci5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDEzLURlbGV0ZWQtTWF0aC1Db250cm9sLUNoYXIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2JhMjgxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDEzLURlbGV0ZWQtTWF0aC1Db250cm9sLUNoYXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTQtSW5zZXJ0ZWQtTWF0aC1Db250cm9sLUNoYXItQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAxNC1JbnNlcnRlZC1NYXRoLUNvbnRyb2wtQ2hhci1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MjhjMzkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMTQtSW5zZXJ0ZWQtTWF0aC1Db250cm9sLUNoYXItQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTQtSW5zZXJ0ZWQtTWF0aC1Db250cm9sLUNoYXItUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAxNC1JbnNlcnRlZC1NYXRoLUNvbnRyb2wtQ2hhci1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YjMzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMTQtSW5zZXJ0ZWQtTWF0aC1Db250cm9sLUNoYXItUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTQtSW5zZXJ0ZWQtTWF0aC1Db250cm9sLUNoYXIuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAxNC1JbnNlcnRlZC1NYXRoLUNvbnRyb2wtQ2hhci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzY3MzQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMTQtSW5zZXJ0ZWQtTWF0aC1Db250cm9sLUNoYXIuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTUtTW92ZUZyb20tTW92ZVRvLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTUtTW92ZUZyb20tTW92ZVRvLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk0Njc2YgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxNS1Nb3ZlRnJvbS1Nb3ZlVG8tQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTUtTW92ZUZyb20tTW92ZVRvLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTUtTW92ZUZyb20tTW92ZVRvLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmMWE0NgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxNS1Nb3ZlRnJvbS1Nb3ZlVG8tUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTUtTW92ZUZyb20tTW92ZVRvLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTUtTW92ZUZyb20tTW92ZVRvLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxZmU4MAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxNS1Nb3ZlRnJvbS1Nb3ZlVG8uZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTYtRGVsZXRlZC1DQy1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDE2LURlbGV0ZWQtQ0MtQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQ2Yzc1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDE2LURlbGV0ZWQtQ0MtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTYtRGVsZXRlZC1DQy1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDE2LURlbGV0ZWQtQ0MtUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTVhOWZhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDE2LURlbGV0ZWQtQ0MtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTYtRGVsZXRlZC1DQy5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDE2LURlbGV0ZWQtQ0MuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTY2OTJiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDE2LURlbGV0ZWQtQ0MuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTctSW5zZXJ0ZWQtQ0MtQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAxNy1JbnNlcnRlZC1DQy1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMTM2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMTctSW5zZXJ0ZWQtQ0MtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTctSW5zZXJ0ZWQtQ0MtUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAxNy1JbnNlcnRlZC1DQy1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MDMxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMTctSW5zZXJ0ZWQtQ0MtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTctSW5zZXJ0ZWQtQ0MuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAxNy1JbnNlcnRlZC1DQy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZjljMDcKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMTctSW5zZXJ0ZWQtQ0MuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTgtTW92ZUZyb20tTW92ZVRvLUNDLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTgtTW92ZUZyb20tTW92ZVRvLUNDLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyMzFlMwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxOC1Nb3ZlRnJvbS1Nb3ZlVG8tQ0MtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTgtTW92ZUZyb20tTW92ZVRvLUNDLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTgtTW92ZUZyb20tTW92ZVRvLUNDLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmZWVhZQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxOC1Nb3ZlRnJvbS1Nb3ZlVG8tQ0MtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTgtTW92ZUZyb20tTW92ZVRvLUNDLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTgtTW92ZUZyb20tTW92ZVRvLUNDLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmMzRhOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxOC1Nb3ZlRnJvbS1Nb3ZlVG8tQ0MuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTktRGVsZXRlZC1GaWVsZC1Db2RlLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTktRGVsZXRlZC1GaWVsZC1Db2RlLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYzNGFkYwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxOS1EZWxldGVkLUZpZWxkLUNvZGUtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTktRGVsZXRlZC1GaWVsZC1Db2RlLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTktRGVsZXRlZC1GaWVsZC1Db2RlLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzZWUzNQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxOS1EZWxldGVkLUZpZWxkLUNvZGUtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMTktRGVsZXRlZC1GaWVsZC1Db2RlLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMTktRGVsZXRlZC1GaWVsZC1Db2RlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlNzJkNQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAxOS1EZWxldGVkLUZpZWxkLUNvZGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjAtSW5zZXJ0ZWQtRmllbGQtQ29kZS1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDIwLUluc2VydGVkLUZpZWxkLUNvZGUtQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODkyZjExCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDIwLUluc2VydGVkLUZpZWxkLUNvZGUtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjAtSW5zZXJ0ZWQtRmllbGQtQ29kZS1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDIwLUluc2VydGVkLUZpZWxkLUNvZGUtUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODU0YWJhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDIwLUluc2VydGVkLUZpZWxkLUNvZGUtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjAtSW5zZXJ0ZWQtRmllbGQtQ29kZS5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDIwLUluc2VydGVkLUZpZWxkLUNvZGUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWYzNGNhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDIwLUluc2VydGVkLUZpZWxkLUNvZGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjEtSW5zZXJ0ZWQtTnVtYmVyaW5nLVByb3BlcnRpZXMtQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAyMS1JbnNlcnRlZC1OdW1iZXJpbmctUHJvcGVydGllcy1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMjljZjgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMjEtSW5zZXJ0ZWQtTnVtYmVyaW5nLVByb3BlcnRpZXMtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjEtSW5zZXJ0ZWQtTnVtYmVyaW5nLVByb3BlcnRpZXMtUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAyMS1JbnNlcnRlZC1OdW1iZXJpbmctUHJvcGVydGllcy1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MjAxNmQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMjEtSW5zZXJ0ZWQtTnVtYmVyaW5nLVByb3BlcnRpZXMtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjEtSW5zZXJ0ZWQtTnVtYmVyaW5nLVByb3BlcnRpZXMuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAyMS1JbnNlcnRlZC1OdW1iZXJpbmctUHJvcGVydGllcy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNmEyYmUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMjEtSW5zZXJ0ZWQtTnVtYmVyaW5nLVByb3BlcnRpZXMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjItTnVtYmVyaW5nQ2hhbmdlLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMjItTnVtYmVyaW5nQ2hhbmdlLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1OTNjMAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAyMi1OdW1iZXJpbmdDaGFuZ2UtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjItTnVtYmVyaW5nQ2hhbmdlLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMjItTnVtYmVyaW5nQ2hhbmdlLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3MDE5OAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAyMi1OdW1iZXJpbmdDaGFuZ2UtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjItTnVtYmVyaW5nQ2hhbmdlLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMjItTnVtYmVyaW5nQ2hhbmdlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNjYmVmNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAyMi1OdW1iZXJpbmdDaGFuZ2UuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjMtTnVtYmVyaW5nQ2hhbmdlLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMjMtTnVtYmVyaW5nQ2hhbmdlLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgxMDA0YwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAyMy1OdW1iZXJpbmdDaGFuZ2UtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjMtTnVtYmVyaW5nQ2hhbmdlLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMjMtTnVtYmVyaW5nQ2hhbmdlLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3NmM3OAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAyMy1OdW1iZXJpbmdDaGFuZ2UtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjMtTnVtYmVyaW5nQ2hhbmdlLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMjMtTnVtYmVyaW5nQ2hhbmdlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyMWRjOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAyMy1OdW1iZXJpbmdDaGFuZ2UuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjQtUGFyYWdyYXBoTWFyay1yUHItQ2hhbmdlLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMjQtUGFyYWdyYXBoTWFyay1yUHItQ2hhbmdlLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3ZjVhZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAyNC1QYXJhZ3JhcGhNYXJrLXJQci1DaGFuZ2UtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjQtUGFyYWdyYXBoTWFyay1yUHItQ2hhbmdlLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMjQtUGFyYWdyYXBoTWFyay1yUHItQ2hhbmdlLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjMzUxMgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAyNC1QYXJhZ3JhcGhNYXJrLXJQci1DaGFuZ2UtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjQtUGFyYWdyYXBoTWFyay1yUHItQ2hhbmdlLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMjQtUGFyYWdyYXBoTWFyay1yUHItQ2hhbmdlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkNmQ2NgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAyNC1QYXJhZ3JhcGhNYXJrLXJQci1DaGFuZ2UuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjUtUGFyYWdyYXBoLVByb3BzLUNoYW5nZS1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDI1LVBhcmFncmFwaC1Qcm9wcy1DaGFuZ2UtQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTliYmYyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDI1LVBhcmFncmFwaC1Qcm9wcy1DaGFuZ2UtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjUtUGFyYWdyYXBoLVByb3BzLUNoYW5nZS1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDI1LVBhcmFncmFwaC1Qcm9wcy1DaGFuZ2UtUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjU2NjdiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDI1LVBhcmFncmFwaC1Qcm9wcy1DaGFuZ2UtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjUtUGFyYWdyYXBoLVByb3BzLUNoYW5nZS5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDI1LVBhcmFncmFwaC1Qcm9wcy1DaGFuZ2UuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Y5M2NkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDI1LVBhcmFncmFwaC1Qcm9wcy1DaGFuZ2UuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjYtTnVtYmVyaW5nQ2hhbmdlLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMjYtTnVtYmVyaW5nQ2hhbmdlLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0M2E4ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAyNi1OdW1iZXJpbmdDaGFuZ2UtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjYtTnVtYmVyaW5nQ2hhbmdlLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMjYtTnVtYmVyaW5nQ2hhbmdlLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwZmFjMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAyNi1OdW1iZXJpbmdDaGFuZ2UtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjYtTnVtYmVyaW5nQ2hhbmdlLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMjYtTnVtYmVyaW5nQ2hhbmdlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2NjEzNwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAyNi1OdW1iZXJpbmdDaGFuZ2UuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjctQ2hhbmdlLVNlY3Rpb24tQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAyNy1DaGFuZ2UtU2VjdGlvbi1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTE3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMjctQ2hhbmdlLVNlY3Rpb24tQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjctQ2hhbmdlLVNlY3Rpb24tUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAyNy1DaGFuZ2UtU2VjdGlvbi1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NDAyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMjctQ2hhbmdlLVNlY3Rpb24tUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjctQ2hhbmdlLVNlY3Rpb24uZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAyNy1DaGFuZ2UtU2VjdGlvbi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYjZjNWEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMjctQ2hhbmdlLVNlY3Rpb24uZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjgtVGFibGUtR3JpZC1DaGFuZ2UtQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAyOC1UYWJsZS1HcmlkLUNoYW5nZS1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Njg2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMjgtVGFibGUtR3JpZC1DaGFuZ2UtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjgtVGFibGUtR3JpZC1DaGFuZ2UtUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAyOC1UYWJsZS1HcmlkLUNoYW5nZS1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NmRlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMjgtVGFibGUtR3JpZC1DaGFuZ2UtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjgtVGFibGUtR3JpZC1DaGFuZ2UuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAyOC1UYWJsZS1HcmlkLUNoYW5nZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMmFjMjcKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMjgtVGFibGUtR3JpZC1DaGFuZ2UuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjktVGFibGUtUm93LVByb3BzLUNoYW5nZS1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDI5LVRhYmxlLVJvdy1Qcm9wcy1DaGFuZ2UtQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWNjMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDI5LVRhYmxlLVJvdy1Qcm9wcy1DaGFuZ2UtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjktVGFibGUtUm93LVByb3BzLUNoYW5nZS1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDI5LVRhYmxlLVJvdy1Qcm9wcy1DaGFuZ2UtUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTQzNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDI5LVRhYmxlLVJvdy1Qcm9wcy1DaGFuZ2UtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMjktVGFibGUtUm93LVByb3BzLUNoYW5nZS5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDI5LVRhYmxlLVJvdy1Qcm9wcy1DaGFuZ2UuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTRiYTcxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDI5LVRhYmxlLVJvdy1Qcm9wcy1DaGFuZ2UuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzAtVGFibGUtUm93LVByb3BzLUNoYW5nZS1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDMwLVRhYmxlLVJvdy1Qcm9wcy1DaGFuZ2UtQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTM5YmFlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDMwLVRhYmxlLVJvdy1Qcm9wcy1DaGFuZ2UtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzAtVGFibGUtUm93LVByb3BzLUNoYW5nZS1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDMwLVRhYmxlLVJvdy1Qcm9wcy1DaGFuZ2UtUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTVhZjZkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDMwLVRhYmxlLVJvdy1Qcm9wcy1DaGFuZ2UtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzAtVGFibGUtUm93LVByb3BzLUNoYW5nZS5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDMwLVRhYmxlLVJvdy1Qcm9wcy1DaGFuZ2UuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTVjNzdhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDMwLVRhYmxlLVJvdy1Qcm9wcy1DaGFuZ2UuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzEtVGFibGUtUHJvcC1DaGFuZ2UtQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzMS1UYWJsZS1Qcm9wLUNoYW5nZS1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNTkyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzEtVGFibGUtUHJvcC1DaGFuZ2UtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzEtVGFibGUtUHJvcC1DaGFuZ2UtUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzMS1UYWJsZS1Qcm9wLUNoYW5nZS1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMjhiZDMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzEtVGFibGUtUHJvcC1DaGFuZ2UtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzEtVGFibGUtUHJvcC1DaGFuZ2UuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzMS1UYWJsZS1Qcm9wLUNoYW5nZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNmZhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzEtVGFibGUtUHJvcC1DaGFuZ2UuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzItVGFibGUtUHJvcC1DaGFuZ2UtQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzMi1UYWJsZS1Qcm9wLUNoYW5nZS1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNTAwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzItVGFibGUtUHJvcC1DaGFuZ2UtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzItVGFibGUtUHJvcC1DaGFuZ2UtUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzMi1UYWJsZS1Qcm9wLUNoYW5nZS1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1M2ZiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzItVGFibGUtUHJvcC1DaGFuZ2UtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzItVGFibGUtUHJvcC1DaGFuZ2UuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzMi1UYWJsZS1Qcm9wLUNoYW5nZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNTY0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzItVGFibGUtUHJvcC1DaGFuZ2UuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzMtVGFibGUtUHJvcC1FeC1DaGFuZ2UtQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzMy1UYWJsZS1Qcm9wLUV4LUNoYW5nZS1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDUzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzMtVGFibGUtUHJvcC1FeC1DaGFuZ2UtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzMtVGFibGUtUHJvcC1FeC1DaGFuZ2UtUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzMy1UYWJsZS1Qcm9wLUV4LUNoYW5nZS1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDRhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzMtVGFibGUtUHJvcC1FeC1DaGFuZ2UtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzMtVGFibGUtUHJvcC1FeC1DaGFuZ2UuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzMy1UYWJsZS1Qcm9wLUV4LUNoYW5nZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMjEwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzMtVGFibGUtUHJvcC1FeC1DaGFuZ2UuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzQtRGVsZXRlZC1DZWxscy1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDM0LURlbGV0ZWQtQ2VsbHMtQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDliYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDM0LURlbGV0ZWQtQ2VsbHMtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzQtRGVsZXRlZC1DZWxscy1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDM0LURlbGV0ZWQtQ2VsbHMtUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWNmNGUwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDM0LURlbGV0ZWQtQ2VsbHMtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzQtRGVsZXRlZC1DZWxscy5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDM0LURlbGV0ZWQtQ2VsbHMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWI0YTMzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDM0LURlbGV0ZWQtQ2VsbHMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzUtSW5zZXJ0ZWQtQ2VsbHMtQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzNS1JbnNlcnRlZC1DZWxscy1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzJlMjMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzUtSW5zZXJ0ZWQtQ2VsbHMtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzUtSW5zZXJ0ZWQtQ2VsbHMtUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzNS1JbnNlcnRlZC1DZWxscy1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODVhZDkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzUtSW5zZXJ0ZWQtQ2VsbHMtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzUtSW5zZXJ0ZWQtQ2VsbHMuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzNS1JbnNlcnRlZC1DZWxscy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NGUzMjUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzUtSW5zZXJ0ZWQtQ2VsbHMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzYtVmVydC1NZXJnZWQtQ2VsbHMtQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzNi1WZXJ0LU1lcmdlZC1DZWxscy1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMGY0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzYtVmVydC1NZXJnZWQtQ2VsbHMtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzYtVmVydC1NZXJnZWQtQ2VsbHMtUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzNi1WZXJ0LU1lcmdlZC1DZWxscy1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMDg4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzYtVmVydC1NZXJnZWQtQ2VsbHMtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzYtVmVydC1NZXJnZWQtQ2VsbHMuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDAzNi1WZXJ0LU1lcmdlZC1DZWxscy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTMzZGQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwMzYtVmVydC1NZXJnZWQtQ2VsbHMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzctQ2hhbmdlZC1TdHlsZS1QYXJhLVByb3BzLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMzctQ2hhbmdlZC1TdHlsZS1QYXJhLVByb3BzLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzN2YwOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAzNy1DaGFuZ2VkLVN0eWxlLVBhcmEtUHJvcHMtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzctQ2hhbmdlZC1TdHlsZS1QYXJhLVByb3BzLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMzctQ2hhbmdlZC1TdHlsZS1QYXJhLVByb3BzLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3ZDE3YwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAzNy1DaGFuZ2VkLVN0eWxlLVBhcmEtUHJvcHMtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzctQ2hhbmdlZC1TdHlsZS1QYXJhLVByb3BzLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMzctQ2hhbmdlZC1TdHlsZS1QYXJhLVByb3BzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxNjM1NAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAzNy1DaGFuZ2VkLVN0eWxlLVBhcmEtUHJvcHMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzgtSW5zZXJ0ZWQtUGFyYXMtYXQtRW5kLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMzgtSW5zZXJ0ZWQtUGFyYXMtYXQtRW5kLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhZTBlNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAzOC1JbnNlcnRlZC1QYXJhcy1hdC1FbmQtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzgtSW5zZXJ0ZWQtUGFyYXMtYXQtRW5kLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMzgtSW5zZXJ0ZWQtUGFyYXMtYXQtRW5kLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczNzJiZQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAzOC1JbnNlcnRlZC1QYXJhcy1hdC1FbmQtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzgtSW5zZXJ0ZWQtUGFyYXMtYXQtRW5kLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMzgtSW5zZXJ0ZWQtUGFyYXMtYXQtRW5kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4YjgzYwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAzOC1JbnNlcnRlZC1QYXJhcy1hdC1FbmQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzktSW5zZXJ0ZWQtUGFyYXMtYXQtRW5kLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMzktSW5zZXJ0ZWQtUGFyYXMtYXQtRW5kLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlNjMyMAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAzOS1JbnNlcnRlZC1QYXJhcy1hdC1FbmQtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzktSW5zZXJ0ZWQtUGFyYXMtYXQtRW5kLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMzktSW5zZXJ0ZWQtUGFyYXMtYXQtRW5kLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyYjA0ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAzOS1JbnNlcnRlZC1QYXJhcy1hdC1FbmQtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwMzktSW5zZXJ0ZWQtUGFyYXMtYXQtRW5kLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwMzktSW5zZXJ0ZWQtUGFyYXMtYXQtRW5kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU4ZjM5NQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDAzOS1JbnNlcnRlZC1QYXJhcy1hdC1FbmQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDAtRGVsZXRlZC1QYXJhcy1hdC1FbmQtQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA0MC1EZWxldGVkLVBhcmFzLWF0LUVuZC1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YTdiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNDAtRGVsZXRlZC1QYXJhcy1hdC1FbmQtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDAtRGVsZXRlZC1QYXJhcy1hdC1FbmQtUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA0MC1EZWxldGVkLVBhcmFzLWF0LUVuZC1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDE3ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNDAtRGVsZXRlZC1QYXJhcy1hdC1FbmQtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDAtRGVsZXRlZC1QYXJhcy1hdC1FbmQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA0MC1EZWxldGVkLVBhcmFzLWF0LUVuZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjFlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNDAtRGVsZXRlZC1QYXJhcy1hdC1FbmQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDEtQ2VsbC1XaXRoLUVtcHR5LVBhcmFzLWF0LUVuZC1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDQxLUNlbGwtV2l0aC1FbXB0eS1QYXJhcy1hdC1FbmQtQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmNiN2MyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDQxLUNlbGwtV2l0aC1FbXB0eS1QYXJhcy1hdC1FbmQtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDEtQ2VsbC1XaXRoLUVtcHR5LVBhcmFzLWF0LUVuZC1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDQxLUNlbGwtV2l0aC1FbXB0eS1QYXJhcy1hdC1FbmQtUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWQ0ZDhjCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDQxLUNlbGwtV2l0aC1FbXB0eS1QYXJhcy1hdC1FbmQtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDEtQ2VsbC1XaXRoLUVtcHR5LVBhcmFzLWF0LUVuZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDQxLUNlbGwtV2l0aC1FbXB0eS1QYXJhcy1hdC1FbmQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2M2MDFlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDQxLUNlbGwtV2l0aC1FbXB0eS1QYXJhcy1hdC1FbmQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDItRGVsZXRlZC1QYXJhLU1hcmstYXQtRW5kLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwNDItRGVsZXRlZC1QYXJhLU1hcmstYXQtRW5kLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQyMjc5MgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDA0Mi1EZWxldGVkLVBhcmEtTWFyay1hdC1FbmQtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDItRGVsZXRlZC1QYXJhLU1hcmstYXQtRW5kLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwNDItRGVsZXRlZC1QYXJhLU1hcmstYXQtRW5kLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjYWQ5OQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDA0Mi1EZWxldGVkLVBhcmEtTWFyay1hdC1FbmQtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDItRGVsZXRlZC1QYXJhLU1hcmstYXQtRW5kLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwNDItRGVsZXRlZC1QYXJhLU1hcmstYXQtRW5kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0YjVlNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDA0Mi1EZWxldGVkLVBhcmEtTWFyay1hdC1FbmQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDMtTUVSR0VGT1JNQVQtRmllbGQtQ29kZS1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDQzLU1FUkdFRk9STUFULUZpZWxkLUNvZGUtQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjc3ZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDQzLU1FUkdFRk9STUFULUZpZWxkLUNvZGUtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDMtTUVSR0VGT1JNQVQtRmllbGQtQ29kZS1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDQzLU1FUkdFRk9STUFULUZpZWxkLUNvZGUtUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBlNzNhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDQzLU1FUkdFRk9STUFULUZpZWxkLUNvZGUtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDMtTUVSR0VGT1JNQVQtRmllbGQtQ29kZS5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDQzLU1FUkdFRk9STUFULUZpZWxkLUNvZGUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzk0ZDRiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDQzLU1FUkdFRk9STUFULUZpZWxkLUNvZGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDQtTUVSR0VGT1JNQVQtRmllbGQtQ29kZS1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDQ0LU1FUkdFRk9STUFULUZpZWxkLUNvZGUtQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGY5ZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDQ0LU1FUkdFRk9STUFULUZpZWxkLUNvZGUtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDQtTUVSR0VGT1JNQVQtRmllbGQtQ29kZS1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDQ0LU1FUkdFRk9STUFULUZpZWxkLUNvZGUtUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTkzMGFjCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDQ0LU1FUkdFRk9STUFULUZpZWxkLUNvZGUtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDQtTUVSR0VGT1JNQVQtRmllbGQtQ29kZS5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDQ0LU1FUkdFRk9STUFULUZpZWxkLUNvZGUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmY4YWFiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDQ0LU1FUkdFRk9STUFULUZpZWxkLUNvZGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDUtT25lLWFuZC1IYWxmLURlbGV0ZWQtTGluZXMtYXQtRW5kLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwNDUtT25lLWFuZC1IYWxmLURlbGV0ZWQtTGluZXMtYXQtRW5kLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQyMWZlZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDA0NS1PbmUtYW5kLUhhbGYtRGVsZXRlZC1MaW5lcy1hdC1FbmQtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDUtT25lLWFuZC1IYWxmLURlbGV0ZWQtTGluZXMtYXQtRW5kLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwNDUtT25lLWFuZC1IYWxmLURlbGV0ZWQtTGluZXMtYXQtRW5kLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwYzYwZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDA0NS1PbmUtYW5kLUhhbGYtRGVsZXRlZC1MaW5lcy1hdC1FbmQtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDUtT25lLWFuZC1IYWxmLURlbGV0ZWQtTGluZXMtYXQtRW5kLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwNDUtT25lLWFuZC1IYWxmLURlbGV0ZWQtTGluZXMtYXQtRW5kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1ZTIyOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDA0NS1PbmUtYW5kLUhhbGYtRGVsZXRlZC1MaW5lcy1hdC1FbmQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDYtQ29uc2VjdXRpdmUtRGVsZXRlZC1SYW5nZXMtQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA0Ni1Db25zZWN1dGl2ZS1EZWxldGVkLVJhbmdlcy1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYjQxMGQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNDYtQ29uc2VjdXRpdmUtRGVsZXRlZC1SYW5nZXMtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDYtQ29uc2VjdXRpdmUtRGVsZXRlZC1SYW5nZXMtUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA0Ni1Db25zZWN1dGl2ZS1EZWxldGVkLVJhbmdlcy1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjkwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNDYtQ29uc2VjdXRpdmUtRGVsZXRlZC1SYW5nZXMtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDYtQ29uc2VjdXRpdmUtRGVsZXRlZC1SYW5nZXMuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA0Ni1Db25zZWN1dGl2ZS1EZWxldGVkLVJhbmdlcy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODIzZGIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNDYtQ29uc2VjdXRpdmUtRGVsZXRlZC1SYW5nZXMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDctSW5zZXJ0ZWQtYW5kLURlbGV0ZWQtUGFyYWdyYXBoLU1hcmstQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA0Ny1JbnNlcnRlZC1hbmQtRGVsZXRlZC1QYXJhZ3JhcGgtTWFyay1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZDViMDEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNDctSW5zZXJ0ZWQtYW5kLURlbGV0ZWQtUGFyYWdyYXBoLU1hcmstQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDctSW5zZXJ0ZWQtYW5kLURlbGV0ZWQtUGFyYWdyYXBoLU1hcmstUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA0Ny1JbnNlcnRlZC1hbmQtRGVsZXRlZC1QYXJhZ3JhcGgtTWFyay1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZDQyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNDctSW5zZXJ0ZWQtYW5kLURlbGV0ZWQtUGFyYWdyYXBoLU1hcmstUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDctSW5zZXJ0ZWQtYW5kLURlbGV0ZWQtUGFyYWdyYXBoLU1hcmsuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA0Ny1JbnNlcnRlZC1hbmQtRGVsZXRlZC1QYXJhZ3JhcGgtTWFyay5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwY2JmYjQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNDctSW5zZXJ0ZWQtYW5kLURlbGV0ZWQtUGFyYWdyYXBoLU1hcmsuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDgtRGVsZXRlZC1JbnNlcnRlZC1QYXJhLU1hcmstQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA0OC1EZWxldGVkLUluc2VydGVkLVBhcmEtTWFyay1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNDYwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNDgtRGVsZXRlZC1JbnNlcnRlZC1QYXJhLU1hcmstQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDgtRGVsZXRlZC1JbnNlcnRlZC1QYXJhLU1hcmstUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA0OC1EZWxldGVkLUluc2VydGVkLVBhcmEtTWFyay1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNWRjNTkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNDgtRGVsZXRlZC1JbnNlcnRlZC1QYXJhLU1hcmstUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDgtRGVsZXRlZC1JbnNlcnRlZC1QYXJhLU1hcmsuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA0OC1EZWxldGVkLUluc2VydGVkLVBhcmEtTWFyay5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMDNlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNDgtRGVsZXRlZC1JbnNlcnRlZC1QYXJhLU1hcmsuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDktRGVsZXRlZC1QYXJhLUJlZm9yZS1UYWJsZS1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDQ5LURlbGV0ZWQtUGFyYS1CZWZvcmUtVGFibGUtQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDMwOGQxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDQ5LURlbGV0ZWQtUGFyYS1CZWZvcmUtVGFibGUtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDktRGVsZXRlZC1QYXJhLUJlZm9yZS1UYWJsZS1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDQ5LURlbGV0ZWQtUGFyYS1CZWZvcmUtVGFibGUtUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjBlNzUxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDQ5LURlbGV0ZWQtUGFyYS1CZWZvcmUtVGFibGUtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNDktRGVsZXRlZC1QYXJhLUJlZm9yZS1UYWJsZS5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDQ5LURlbGV0ZWQtUGFyYS1CZWZvcmUtVGFibGUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDNkNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDQ5LURlbGV0ZWQtUGFyYS1CZWZvcmUtVGFibGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNTAtRGVsZXRlZC1Gb290bm90ZS1BY2NlcHRlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDUwLURlbGV0ZWQtRm9vdG5vdGUtQWNjZXB0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E3Y2RmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDUwLURlbGV0ZWQtRm9vdG5vdGUtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNTAtRGVsZXRlZC1Gb290bm90ZS1SZWplY3RlZC5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDUwLURlbGV0ZWQtRm9vdG5vdGUtUmVqZWN0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjEyOGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDUwLURlbGV0ZWQtRm9vdG5vdGUtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNTAtRGVsZXRlZC1Gb290bm90ZS5kb2N4IGIvVGVzdEZpbGVzL1JQL1JQMDUwLURlbGV0ZWQtRm9vdG5vdGUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmUyZGMzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1JQL1JQMDUwLURlbGV0ZWQtRm9vdG5vdGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNTEtQXJhYmljLUFjY2VwdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwNTEtQXJhYmljLUFjY2VwdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlNDAwOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDA1MS1BcmFiaWMtQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNTEtQXJhYmljLVJlamVjdGVkLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwNTEtQXJhYmljLVJlamVjdGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4MDFlOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDA1MS1BcmFiaWMtUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNTEtQXJhYmljLmRvY3ggYi9UZXN0RmlsZXMvUlAvUlAwNTEtQXJhYmljLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEwYTMyZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9SUC9SUDA1MS1BcmFiaWMuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNTItRGVsZXRlZC1QYXJhLU1hcmstQWNjZXB0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA1Mi1EZWxldGVkLVBhcmEtTWFyay1BY2NlcHRlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjZhZjIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNTItRGVsZXRlZC1QYXJhLU1hcmstQWNjZXB0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNTItRGVsZXRlZC1QYXJhLU1hcmstUmVqZWN0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA1Mi1EZWxldGVkLVBhcmEtTWFyay1SZWplY3RlZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNGRjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNTItRGVsZXRlZC1QYXJhLU1hcmstUmVqZWN0ZWQuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlAwNTItRGVsZXRlZC1QYXJhLU1hcmsuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDA1Mi1EZWxldGVkLVBhcmEtTWFyay5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NTIxZDgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlAwNTItRGVsZXRlZC1QYXJhLU1hcmsuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvUlAvUlA5OTktVGFibGUuZG9jeCBiL1Rlc3RGaWxlcy9SUC9SUDk5OS1UYWJsZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YmZiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvUlAvUlA5OTktVGFibGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gwMDEtVGFibGUueGxzeCBiL1Rlc3RGaWxlcy9TSDAwMS1UYWJsZS54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOWEwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gwMDEtVGFibGUueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gwMDItVHdvVGFibGVzVHdvU2hlZXRzLnhsc3ggYi9UZXN0RmlsZXMvU0gwMDItVHdvVGFibGVzVHdvU2hlZXRzLnhsc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2ZTAyZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9TSDAwMi1Ud29UYWJsZXNUd29TaGVldHMueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gwMDMtVGFibGVXaXRoRGF0ZUluRmlyc3RDb2x1bW4ueGxzeCBiL1Rlc3RGaWxlcy9TSDAwMy1UYWJsZVdpdGhEYXRlSW5GaXJzdENvbHVtbi54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOTlhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gwMDMtVGFibGVXaXRoRGF0ZUluRmlyc3RDb2x1bW4ueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gwMDQtVGFibGVBdE9mZnNldExvY2F0aW9uLnhsc3ggYi9UZXN0RmlsZXMvU0gwMDQtVGFibGVBdE9mZnNldExvY2F0aW9uLnhsc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwNGJjNwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9TSDAwNC1UYWJsZUF0T2Zmc2V0TG9jYXRpb24ueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gwMDUtVGFibGUtV2l0aC1TaGFyZWRTdHJpbmdzLnhsc3ggYi9UZXN0RmlsZXMvU0gwMDUtVGFibGUtV2l0aC1TaGFyZWRTdHJpbmdzLnhsc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkMWZlNQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9TSDAwNS1UYWJsZS1XaXRoLVNoYXJlZFN0cmluZ3MueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gwMDYtVGFibGUtTm8tU2hhcmVkU3RyaW5ncy54bHN4IGIvVGVzdEZpbGVzL1NIMDA2LVRhYmxlLU5vLVNoYXJlZFN0cmluZ3MueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2YxNmE0Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMDA2LVRhYmxlLU5vLVNoYXJlZFN0cmluZ3MueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gwMDctT25lLUNlbGwtVGFibGUueGxzeCBiL1Rlc3RGaWxlcy9TSDAwNy1PbmUtQ2VsbC1UYWJsZS54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYWY5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gwMDctT25lLUNlbGwtVGFibGUueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gwMDgtVGFibGUtV2l0aC1UYWxsLVJvdy54bHN4IGIvVGVzdEZpbGVzL1NIMDA4LVRhYmxlLVdpdGgtVGFsbC1Sb3cueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2NmYmI5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMDA4LVRhYmxlLVdpdGgtVGFsbC1Sb3cueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gwMDktVGFibGUtV2l0aC1XaWRlLUNvbHVtbi54bHN4IGIvVGVzdEZpbGVzL1NIMDA5LVRhYmxlLVdpdGgtV2lkZS1Db2x1bW4ueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmFmMTlmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMDA5LVRhYmxlLVdpdGgtV2lkZS1Db2x1bW4ueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMDEtU2ltcGxlRm9ybWF0cy54bHN4IGIvVGVzdEZpbGVzL1NIMTAxLVNpbXBsZUZvcm1hdHMueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGY3ZWJiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMTAxLVNpbXBsZUZvcm1hdHMueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMDItOS14LTkueGxzeCBiL1Rlc3RGaWxlcy9TSDEwMi05LXgtOS54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OWFmZWIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMDItOS14LTkueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMDMtTm8tU2hhcmVkU3RyaW5nLnhsc3ggYi9UZXN0RmlsZXMvU0gxMDMtTm8tU2hhcmVkU3RyaW5nLnhsc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3OGJlNwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9TSDEwMy1Oby1TaGFyZWRTdHJpbmcueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMDQtV2l0aC1TaGFyZWRTdHJpbmcueGxzeCBiL1Rlc3RGaWxlcy9TSDEwNC1XaXRoLVNoYXJlZFN0cmluZy54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMDk5OTAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMDQtV2l0aC1TaGFyZWRTdHJpbmcueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMDUtTm8tU2hhcmVkU3RyaW5nLnhsc3ggYi9UZXN0RmlsZXMvU0gxMDUtTm8tU2hhcmVkU3RyaW5nLnhsc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5YTBiNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9TSDEwNS1Oby1TaGFyZWRTdHJpbmcueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMDYtOS14LTktRm9ybWF0dGVkLnhsc3ggYi9UZXN0RmlsZXMvU0gxMDYtOS14LTktRm9ybWF0dGVkLnhsc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyOGUzMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9TSDEwNi05LXgtOS1Gb3JtYXR0ZWQueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMDctOS14LTktRm9ybWF0dGVkLVRhYmxlLnhsc3ggYi9UZXN0RmlsZXMvU0gxMDctOS14LTktRm9ybWF0dGVkLVRhYmxlLnhsc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkYmQzNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9TSDEwNy05LXgtOS1Gb3JtYXR0ZWQtVGFibGUueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMDgtU2ltcGxlRm9ybWF0dGVkQ2VsbC54bHN4IGIvVGVzdEZpbGVzL1NIMTA4LVNpbXBsZUZvcm1hdHRlZENlbGwueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODkyNGUyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMTA4LVNpbXBsZUZvcm1hdHRlZENlbGwueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMDktQ2VsbFdpdGhCb3JkZXIueGxzeCBiL1Rlc3RGaWxlcy9TSDEwOS1DZWxsV2l0aEJvcmRlci54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NmFiMWEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMDktQ2VsbFdpdGhCb3JkZXIueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMTAtQ2VsbFdpdGhNYXN0ZXJTdHlsZS54bHN4IGIvVGVzdEZpbGVzL1NIMTEwLUNlbGxXaXRoTWFzdGVyU3R5bGUueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTExMDM1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMTEwLUNlbGxXaXRoTWFzdGVyU3R5bGUueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMTEtQ2hhbmdlZERlZmF1bHRDb2x1bW5XaWR0aC54bHN4IGIvVGVzdEZpbGVzL1NIMTExLUNoYW5nZWREZWZhdWx0Q29sdW1uV2lkdGgueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmEwYjAzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMTExLUNoYW5nZWREZWZhdWx0Q29sdW1uV2lkdGgueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMTItTm90VmVydE1lcmdlZENlbGwueGxzeCBiL1Rlc3RGaWxlcy9TSDExMi1Ob3RWZXJ0TWVyZ2VkQ2VsbC54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYzE5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMTItTm90VmVydE1lcmdlZENlbGwueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMTMtVmVydE1lcmdlZENlbGwueGxzeCBiL1Rlc3RGaWxlcy9TSDExMy1WZXJ0TWVyZ2VkQ2VsbC54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMjAwZTIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMTMtVmVydE1lcmdlZENlbGwueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMTQtQ2VudGVyZWQtQ2VsbC54bHN4IGIvVGVzdEZpbGVzL1NIMTE0LUNlbnRlcmVkLUNlbGwueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDkyYjVkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMTE0LUNlbnRlcmVkLUNlbGwueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMTUtRGlnaXRzVG9SaWdodC54bHN4IGIvVGVzdEZpbGVzL1NIMTE1LURpZ2l0c1RvUmlnaHQueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2VmZWRiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMTE1LURpZ2l0c1RvUmlnaHQueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMTYtRm10TnVtSWQtMS54bHN4IGIvVGVzdEZpbGVzL1NIMTE2LUZtdE51bUlkLTEueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzcwZDhjCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMTE2LUZtdE51bUlkLTEueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMTctRm10TnVtSWQtMi54bHN4IGIvVGVzdEZpbGVzL1NIMTE3LUZtdE51bUlkLTIueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjUwNjU4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMTE3LUZtdE51bUlkLTIueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMTgtRm10TnVtSWQtMy54bHN4IGIvVGVzdEZpbGVzL1NIMTE4LUZtdE51bUlkLTMueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDNkODk3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMTE4LUZtdE51bUlkLTMueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMTktRm10TnVtSWQtNC54bHN4IGIvVGVzdEZpbGVzL1NIMTE5LUZtdE51bUlkLTQueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDU0YTJjCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMTE5LUZtdE51bUlkLTQueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMjAtRm10TnVtSWQtOS54bHN4IGIvVGVzdEZpbGVzL1NIMTIwLUZtdE51bUlkLTkueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmJiZDcxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMTIwLUZtdE51bUlkLTkueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMjEtRm10TnVtSWQtMTEueGxzeCBiL1Rlc3RGaWxlcy9TSDEyMS1GbXROdW1JZC0xMS54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MTdlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMjEtRm10TnVtSWQtMTEueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMjItRm10TnVtSWQtMTIueGxzeCBiL1Rlc3RGaWxlcy9TSDEyMi1GbXROdW1JZC0xMi54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNjMyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMjItRm10TnVtSWQtMTIueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMjMtRm10TnVtSWQtMTQueGxzeCBiL1Rlc3RGaWxlcy9TSDEyMy1GbXROdW1JZC0xNC54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWE5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMjMtRm10TnVtSWQtMTQueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMjQtRm10TnVtSWQtMTUueGxzeCBiL1Rlc3RGaWxlcy9TSDEyNC1GbXROdW1JZC0xNS54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTlmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMjQtRm10TnVtSWQtMTUueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMjUtRm10TnVtSWQtMTYueGxzeCBiL1Rlc3RGaWxlcy9TSDEyNS1GbXROdW1JZC0xNi54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NWU0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMjUtRm10TnVtSWQtMTYueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMjYtRm10TnVtSWQtMTcueGxzeCBiL1Rlc3RGaWxlcy9TSDEyNi1GbXROdW1JZC0xNy54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OTEzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMjYtRm10TnVtSWQtMTcueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMjctRm10TnVtSWQtMTgueGxzeCBiL1Rlc3RGaWxlcy9TSDEyNy1GbXROdW1JZC0xOC54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NzgxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMjctRm10TnVtSWQtMTgueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMjgtRm10TnVtSWQtMTkueGxzeCBiL1Rlc3RGaWxlcy9TSDEyOC1GbXROdW1JZC0xOS54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYTkyYWEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMjgtRm10TnVtSWQtMTkueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMjktRm10TnVtSWQtMjAueGxzeCBiL1Rlc3RGaWxlcy9TSDEyOS1GbXROdW1JZC0yMC54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MjU1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMjktRm10TnVtSWQtMjAueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMzAtRm10TnVtSWQtMjEueGxzeCBiL1Rlc3RGaWxlcy9TSDEzMC1GbXROdW1JZC0yMS54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjgxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMzAtRm10TnVtSWQtMjEueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMzEtRm10TnVtSWQtMjIueGxzeCBiL1Rlc3RGaWxlcy9TSDEzMS1GbXROdW1JZC0yMi54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTFhYTAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMzEtRm10TnVtSWQtMjIueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMzItRm10TnVtSWQtNDYueGxzeCBiL1Rlc3RGaWxlcy9TSDEzMi1GbXROdW1JZC00Ni54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYzMwMTAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMzItRm10TnVtSWQtNDYueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxMzMtRm10TnVtSWQtNDcueGxzeCBiL1Rlc3RGaWxlcy9TSDEzMy1GbXROdW1JZC00Ny54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NDk2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU0gxMzMtRm10TnVtSWQtNDcueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxNTEtQ3VzdG9tLUNlbGwtRm9ybWF0LUN1cnJlbmN5Lnhsc3ggYi9UZXN0RmlsZXMvU0gxNTEtQ3VzdG9tLUNlbGwtRm9ybWF0LUN1cnJlbmN5Lnhsc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkMjlkNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9TSDE1MS1DdXN0b20tQ2VsbC1Gb3JtYXQtQ3VycmVuY3kueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gxNTItQ3VzdG9tLUNlbGwtRm9ybWF0Lnhsc3ggYi9UZXN0RmlsZXMvU0gxNTItQ3VzdG9tLUNlbGwtRm9ybWF0Lnhsc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkZWI1NwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9TSDE1Mi1DdXN0b20tQ2VsbC1Gb3JtYXQueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gyMDEtQ2VsbC1DMS1XaXRob3V0LVItQXR0ci54bHN4IGIvVGVzdEZpbGVzL1NIMjAxLUNlbGwtQzEtV2l0aG91dC1SLUF0dHIueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjZiMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMjAxLUNlbGwtQzEtV2l0aG91dC1SLUF0dHIueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gyMDItQ2VsbC1DMS1EMS1XaXRob3V0LVItQXR0ci54bHN4IGIvVGVzdEZpbGVzL1NIMjAyLUNlbGwtQzEtRDEtV2l0aG91dC1SLUF0dHIueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQyMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMjAyLUNlbGwtQzEtRDEtV2l0aG91dC1SLUF0dHIueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gyMDMtQ2VsbC1DMS1EMS1FMS1XaXRob3V0LVItQXR0ci54bHN4IGIvVGVzdEZpbGVzL1NIMjAzLUNlbGwtQzEtRDEtRTEtV2l0aG91dC1SLUF0dHIueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDA5MjEzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMjAzLUNlbGwtQzEtRDEtRTEtV2l0aG91dC1SLUF0dHIueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU0gyMDQtQ2VsbC1BMS1CMS1DMS1XaXRob3V0LVItQXR0ci54bHN4IGIvVGVzdEZpbGVzL1NIMjA0LUNlbGwtQTEtQjEtQzEtV2l0aG91dC1SLUF0dHIueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGMzNjMyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1NIMjA0LUNlbGwtQTEtQjEtQzEtV2l0aG91dC1SLUF0dHIueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvU3ByZWFkc2hlZXQueGxzeCBiL1Rlc3RGaWxlcy9TcHJlYWRzaGVldC54bHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZjc4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvU3ByZWFkc2hlZXQueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDAwMTAuaHRtbCBiL1Rlc3RGaWxlcy9UMDAxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjdlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDAwMTAuaHRtbApAQCAtMCwwICsxLDQwIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2gxIHsgZm9udC1mYW1pbHk6IEhlbHZldGljYTsgfQoraDEgZW0geyBjb2xvcjogcmVkOyB9CitvbCB7IGZvbnQtc2l6ZTogc21hbGxlcjsgfQordWwgeyBmb250LXNpemU6IGxhcmdlcjsgfQorLmZ6eiB7IGZvbnQtc2l6ZTogMWV4OyB9CisuZnp6MiB7IGZvbnQtc2l6ZTogMTIwJTsgfQorLmZ6ejMgeyBmb250LXNpemU6IC41aW47IH0KKy5meno0IHsgZm9udC1zaXplOiAyLjU0Y207IH0KKy5meno1IHsgZm9udC1zaXplOiAyNTRtbTsgfQorLmZ6ejYgeyBmb250LXNpemU6IDFwYzsgfQorLmZ6ejcgeyBmb250LXNpemU6IDEwMHB4OyB9CisuYmFyIHsgdGV4dC1pbmRlbnQ6IDJlbTsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIDxlbT5IZWFkPC9lbT5pbmc8L2gxPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cD5meno8L3A+CisgICAgPG9sPgorICAgICAgPGxpPm9uZTwvbGk+CisgICAgICA8bGk+dHdvPC9saT4KKyAgICA8L29sPgorICAgIDx1bD4KKyAgICAgIDxsaT5vbmU8L2xpPgorICAgICAgPGxpPnR3bzwvbGk+CisgICAgPC91bD4KKyAgICA8cCBjbGFzcz0nZnp6Jz5iYXIxPC9wPgorICAgIDxwIGNsYXNzPSdmenoyJz5iYXIyPC9wPgorICAgIDxwIGNsYXNzPSdmenozJz5iYXIzPC9wPgorICAgIDxwIGNsYXNzPSdmeno0Jz5iYXI0PC9wPgorICAgIDxwIGNsYXNzPSdmeno1Jz5iYXI1PC9wPgorICAgIDxwIGNsYXNzPSdmeno2Jz5iYXI2PC9wPgorICAgIDxwIGNsYXNzPSdmeno3Jz5iYXI3PC9wPgorICAgIDxwIGNsYXNzPSdiYXInPmJhcjg8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMDExLmh0bWwgYi9UZXN0RmlsZXMvVDAwMTEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWIyYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMDExLmh0bWwKQEAgLTAsMCArMSwxMSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPHA+UGFyYWdyYXBoIDE8L3A+CisJPGhyIC8+CisgICAgPHA+UGFyYWdyYXBoIDI8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMDEyLmh0bWwgYi9UZXN0RmlsZXMvVDAwMTIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzczMjZiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMDEyLmh0bWwKQEAgLTAsMCArMSwxMSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPHA+UGFyYWdyYXBoIDEgPGk+d2l0aCBpdGFsaWMgdGV4dDwvaT4gYW5kIHNvbWUgbW9yZSB0ZXh0LjwvcD4KKwk8aHIgLz4KKyAgICA8cD5QYXJhZ3JhcGggMjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDAwMTMuaHRtbCBiL1Rlc3RGaWxlcy9UMDAxMy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOGJiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDAwMTMuaHRtbApAQCAtMCwwICsxLDE3IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8cD5QYXJhZ3JhcGggMSA8cz53aXRoIHMgdGV4dDwvcz4gYW5kIHNvbWUgbW9yZSB0ZXh0LjwvcD4KKwk8aHIgLz4KKyAgICA8cD5QYXJhZ3JhcGggMSA8c3Ryb25nPndpdGggc3Ryb25nIHRleHQ8L3N0cm9uZz4gYW5kIHNvbWUgbW9yZSB0ZXh0LjwvcD4KKwk8aHIgLz4KKyAgICA8cD5QYXJhZ3JhcGggMSA8c3ViPndpdGggc3ViIHRleHQ8L3N1Yj4gYW5kIHNvbWUgbW9yZSB0ZXh0LjwvcD4KKwk8aHIgLz4KKyAgICA8cD5QYXJhZ3JhcGggMSA8c3VwPndpdGggc3VwIHRleHQ8L3N1cD4gYW5kIHNvbWUgbW9yZSB0ZXh0LjwvcD4KKwk8aHIgLz4KKyAgICA8cD5QYXJhZ3JhcGggMSA8dT53aXRoIHUgdGV4dDwvdT4gYW5kIHNvbWUgbW9yZSB0ZXh0LjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDAwMTQuaHRtbCBiL1Rlc3RGaWxlcy9UMDAxNC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMzdmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDAwMTQuaHRtbApAQCAtMCwwICsxLDI1IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgPHRhYmxlPgorICAgIDx0cj4KKwkgIDx0ZD48L3RkPgorCSAgPHRkPmRlZjwvdGQ+CisJICA8dGQ+Z2hpPC90ZD4KKwk8L3RyPgorICAgIDx0cj4KKwkgIDx0ZD5hYmM8L3RkPgorCSAgPHRkPmRlZjwvdGQ+CisJICA8dGQ+Z2hpPC90ZD4KKwk8L3RyPgorICAgIDx0cj4KKwkgIDx0ZD48L3RkPgorCSAgPHRkPjwvdGQ+CisJICA8dGQ+Z2hpPC90ZD4KKwk8L3RyPgorICA8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDAxNS5odG1sIGIvVGVzdEZpbGVzL1QwMDE1Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1MjRjMgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDAxNS5odG1sCkBAIC0wLDAgKzEsMTIgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxwPlBhcmFncmFwaCAxPC9wPgorICAgIDxwIHN0eWxlPSJtYXJnaW4tdG9wOiAyNHB0OyI+UGFyYWdyYXBoIDI8L3A+CisgICAgPHA+UGFyYWdyYXBoIDM8L3A+CisgICAgPHA+UGFyYWdyYXBoIDQ8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMDIwLmh0bWwgYi9UZXN0RmlsZXMvVDAwMjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjE1NDIxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMDIwLmh0bWwKQEAgLTAsMCArMSw3IEBACis8aHRtbD4KKzxoZWFkLz4KKzxib2R5PgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgIDxwPlRoaXMgaXMgYW4gaHRtbCBkb2N1bWVudCBpbiBhIHN0cmluZyBsaXRlcmFsLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDAwMzAuaHRtbCBiL1Rlc3RGaWxlcy9UMDAzMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZDQxYTkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDAwMzAuaHRtbApAQCAtMCwwICsxLDExIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2gxIHsgY29sb3I6IHJlZCB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+VGhpcyBpcyBhbiBodG1sIGRvY3VtZW50IGluIGEgc3RyaW5nIGxpdGVyYWwuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDA0MC5odG1sIGIvVGVzdEZpbGVzL1QwMDQwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5NGY5ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDA0MC5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorcCB7Citjb2xvcjogcmVkOworbWFyZ2luOiAzZW07Cit9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+VGhpcyBpcyBhbiBodG1sIGRvY3VtZW50IGluIGEgc3RyaW5nIGxpdGVyYWwuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDA1MC5odG1sIGIvVGVzdEZpbGVzL1QwMDUwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxMjAzMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDA1MC5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorcCB7Citjb2xvcjogcmVkOworbWFyZ2luOiAzZW07Citib3JkZXI6IHRoaW4gc29saWQgcmVkOworfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxwPlRoaXMgaXMgYW4gaHRtbCBkb2N1bWVudCBpbiBhIHN0cmluZyBsaXRlcmFsLjwvcD4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDAwNjAuaHRtbCBiL1Rlc3RGaWxlcy9UMDA2MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZGM2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDAwNjAuaHRtbApAQCAtMCwwICsxLDE1IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3AgeworY29sb3I6IHJlZDsKK21hcmdpbjogM2VtOworYm9yZGVyOiBtZWRpdW0gc29saWQgcmVkOworfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxwPlRoaXMgaXMgYW4gaHRtbCBkb2N1bWVudCBpbiBhIHN0cmluZyBsaXRlcmFsLjwvcD4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDAwNzAuaHRtbCBiL1Rlc3RGaWxlcy9UMDA3MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzM5NmMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDAwNzAuaHRtbApAQCAtMCwwICsxLDE1IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3AgeworY29sb3I6IHJlZDsKK21hcmdpbjogM2VtOworYm9yZGVyOiB0aGljayBzb2xpZCByZWQ7Cit9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPHA+VGhpcyBpcyBhbiBodG1sIGRvY3VtZW50IGluIGEgc3RyaW5nIGxpdGVyYWwuPC9wPgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDA4MC5odG1sIGIvVGVzdEZpbGVzL1QwMDgwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2MjdlOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDA4MC5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorcCB7Citjb2xvcjogcmVkOworbWFyZ2luOiAzZW07Citib3JkZXI6IHRoaW4gc29saWQgcmVkOworcGFkZGluZzogM2VtOworfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxwPlRoaXMgaXMgYW4gaHRtbCBkb2N1bWVudCBpbiBhIHN0cmluZyBsaXRlcmFsLjwvcD4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDAwOTAuaHRtbCBiL1Rlc3RGaWxlcy9UMDA5MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNzQxMjQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDAwOTAuaHRtbApAQCAtMCwwICsxLDEyIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3AgeworfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgIDxwPjxlbSBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMC4zZW07IGZsb2F0OmxlZnQ7IGZvbnQtc2l6ZTo1ZW07IG1hcmdpbi1yaWdodDogMC4zZW0iPlQ8L2VtPmhpcyBpcyBhbiBodG1sIGRvY3VtZW50IGluIGEgc3RyaW5nIGxpdGVyYWwuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDEwMC5odG1sIGIvVGVzdEZpbGVzL1QwMTAwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVlYWU5NAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDEwMC5odG1sCkBAIC0wLDAgKzEsMTIgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorcCB7Cit9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+VGhpcyBpcyBhbiA8ZW0gc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTsgd2lkdGg6IDE2MHB4OyBkaXNwbGF5OiBibG9jazsgdG9wOiA1ZW07IGxlZnQ6IDVlbTsiPmh0bWwgZG9jdW1lbnQ8L2VtPiBpbiBhIHN0cmluZyBsaXRlcmFsLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDAxMTAuaHRtbCBiL1Rlc3RGaWxlcy9UMDExMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMWE1N2EKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDAxMTAuaHRtbApAQCAtMCwwICsxLDMzIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3RhYmxlIHsKKyAgYm9yZGVyLXNwYWNpbmc6IDBweDsKK30KK3RkIHsKKyAgLyogcGFkZGluZzogMWVtOyAqLworICBib3JkZXI6IGJsYWNrIHRoaWNrIHNvbGlkOworICBiYWNrZ3JvdW5kOiB5ZWxsb3c7Cit9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHkgc3R5bGU9J2ZvbnQtZmFtaWx5OiBDYWxpYnJpJz4KKzx0YWJsZSBzdHlsZT0nYm9yZGVyOiB0aGljayBzb2xpZCByZWQ7IGZvbnQtc2l6ZTogMTFwdDsgYm9yZGVyLXNwYWNpbmc6IC4yNWluOyBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOyc+Cis8dGJvZHk+Cis8dHI+Cis8dGQgc3R5bGU9J3dpZHRoOiA0MTFweDsgYm9yZGVyOiBibGFjayB0aGljayBkYXNoZWQ7Jz5hYWE8L3RkPgorPHRkIHN0eWxlPSdwYWRkaW5nOiAwcHg7Jz5iYmI8L3RkPgorPHRkIHN0eWxlPSdwYWRkaW5nOiAwcHg7Jz5jY2M8L3RkPjwvdHI+Cis8dHI+Cis8dGQgc3R5bGU9J3dpZHRoOiA0MTFweDtwYWRkaW5nOiAwcHg7Jz5kZGQ8L3RkPgorPHRkIHN0eWxlPSdwYWRkaW5nOiAwcHg7Jz5lZWU8L3RkPgorPHRkIHN0eWxlPSdwYWRkaW5nOiAwcHg7Jz5nZ2c8L3RkPjwvdHI+Cis8dHI+Cis8dGQgc3R5bGU9J2JvcmRlcjogYmxhY2sgdGhpY2sgc29saWQ7IHdpZHRoOiA0MTFweDtwYWRkaW5nOiAwcHg7Jz5oaGg8L3RkPgorPHRkIHN0eWxlPSdwYWRkaW5nOiAwcHg7Jz5paWk8L3RkPgorPHRkIHN0eWxlPSdib3JkZXI6IGJsYWNrIHRoaWNrIGRhc2hlZDtwYWRkaW5nOiAwcHg7Jz5qamo8L3RkPgorPC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDExMS5odG1sIGIvVGVzdEZpbGVzL1QwMTExLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyMWFlNQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDExMS5odG1sCkBAIC0wLDAgKzEsMzMgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgordGFibGUgeworICBib3JkZXItc3BhY2luZzogMHB4OworfQordGQgeworICAvKiBwYWRkaW5nOiAxZW07ICovCisgIGJvcmRlcjogYmxhY2sgdGhpY2sgc29saWQ7CisgIGJhY2tncm91bmQ6IHllbGxvdzsKK30KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keSBzdHlsZT0nZm9udC1mYW1pbHk6IENhbGlicmknPgorPHRhYmxlIHN0eWxlPSdib3JkZXI6IHRoaWNrIHNvbGlkIHJlZDsgZm9udC1zaXplOiAxMXB0OyBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOyc+Cis8dGJvZHk+Cis8dHI+Cis8dGQgc3R5bGU9J3dpZHRoOiA0MTFweDsgYm9yZGVyOiBibGFjayB0aGljayBkYXNoZWQ7IHBhZGRpbmc6IDBweDsnPmFhYTwvdGQ+Cis8dGQgc3R5bGU9J3BhZGRpbmc6IDBweDsnPmJiYjwvdGQ+Cis8dGQgc3R5bGU9J3BhZGRpbmc6IDBweDsnPmNjYzwvdGQ+PC90cj4KKzx0cj4KKzx0ZCBzdHlsZT0nd2lkdGg6IDQxMXB4O3BhZGRpbmc6IDBweDsnPmRkZDwvdGQ+Cis8dGQgc3R5bGU9J3BhZGRpbmc6IDBweDsnPmVlZTwvdGQ+Cis8dGQgc3R5bGU9J3BhZGRpbmc6IDBweDsnPmdnZzwvdGQ+PC90cj4KKzx0cj4KKzx0ZCBzdHlsZT0nYm9yZGVyOiBibGFjayB0aGljayBzb2xpZDsgd2lkdGg6IDQxMXB4O3BhZGRpbmc6IDBweDsnPmhoaDwvdGQ+Cis8dGQgc3R5bGU9J3BhZGRpbmc6IDBweDsnPmlpaTwvdGQ+Cis8dGQgc3R5bGU9J2JvcmRlcjogYmxhY2sgdGhpY2sgZGFzaGVkO3BhZGRpbmc6IDBweDsnPmpqajwvdGQ+Cis8L3RyPgorPC90Ym9keT4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMTEyLmh0bWwgYi9UZXN0RmlsZXMvVDAxMTIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmJlNDgwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMTEyLmh0bWwKQEAgLTAsMCArMSwyOSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cit0ZCB7CisgIGJvcmRlcjogYmxhY2sgdGhpY2sgc29saWQ7CisgIGJhY2tncm91bmQ6IHllbGxvdzsKK30KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keSBzdHlsZT0nZm9udC1mYW1pbHk6IENhbGlicmknPgorPHRhYmxlIHN0eWxlPSdib3JkZXI6IHRoaWNrIHNvbGlkIHJlZDsgZm9udC1zaXplOiAxMXB0Oyc+Cis8dGJvZHk+Cis8dHI+Cis8dGQgc3R5bGU9J3dpZHRoOiA0MTFweDsgYm9yZGVyOiBibGFjayB0aGljayBkYXNoZWQ7Jz5hYWE8L3RkPgorPHRkIHN0eWxlPScnPmJiYjwvdGQ+Cis8dGQgc3R5bGU9Jyc+Y2NjPC90ZD48L3RyPgorPHRyPgorPHRkIHN0eWxlPSd3aWR0aDogNDExcHg7Jz5kZGQ8L3RkPgorPHRkIHN0eWxlPScnPmVlZTwvdGQ+Cis8dGQgc3R5bGU9Jyc+Z2dnPC90ZD48L3RyPgorPHRyPgorPHRkIHN0eWxlPSdib3JkZXI6IGJsYWNrIHRoaWNrIHNvbGlkOyB3aWR0aDogNDExcHg7Jz5oaGg8L3RkPgorPHRkIHN0eWxlPScnPmlpaTwvdGQ+Cis8dGQgc3R5bGU9J2JvcmRlcjogYmxhY2sgdGhpY2sgZGFzaGVkOyc+ampqPC90ZD4KKzwvdHI+Cis8L3Rib2R5PgorPC90YWJsZT4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDAxMjAuaHRtbCBiL1Rlc3RGaWxlcy9UMDEyMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NDIzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDAxMjAuaHRtbApAQCAtMCwwICsxLDEzIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2gxLCBwIHsKK2NvbG9yOiBncmVlbjsKK30KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cD5UaGlzIGlzIGFuIGh0bWwgZG9jdW1lbnQgaW4gYSBzdHJpbmcgbGl0ZXJhbC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMTMwLmh0bWwgYi9UZXN0RmlsZXMvVDAxMzAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmY5MDAxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMTMwLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitoMSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KK2gxIHsgZm9udC1zaXplOiAxMnB4IH0KK2gxIHsgbGluZS1oZWlnaHQ6IDE0cHggfQoraDEgeyBmb250LWZhbWlseTogSGVsdmV0aWNhIH0KK2gxIHsgZm9udC12YXJpYW50OiBub3JtYWwgfQoraDEgeyBmb250LXN0eWxlOiBub3JtYWwgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgIDxwPlRoaXMgaXMgYW4gaHRtbCBkb2N1bWVudCBpbiBhIHN0cmluZyBsaXRlcmFsLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDAxNDAuaHRtbCBiL1Rlc3RGaWxlcy9UMDE0MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZDBlZTIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDAxNDAuaHRtbApAQCAtMCwwICsxLDE4IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2gxIHsKK2ZvbnQtd2VpZ2h0OiBib2xkOworZm9udC1zaXplOiAxMnB4OworbGluZS1oZWlnaHQ6IDE0cHg7Citmb250LWZhbWlseTogSGVsdmV0aWNhOworZm9udC12YXJpYW50OiBub3JtYWw7Citmb250LXN0eWxlOiBub3JtYWwKK30KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cD5UaGlzIGlzIGFuIGh0bWwgZG9jdW1lbnQgaW4gYSBzdHJpbmcgbGl0ZXJhbC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMTUwLmh0bWwgYi9UZXN0RmlsZXMvVDAxNTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTA1YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMTUwLmh0bWwKQEAgLTAsMCArMSwxMSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitoMSB7IG1hcmdpbjogMC41ZW0gfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgIDxwPmVtIG1hcmdpbi48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMTYwLmh0bWwgYi9UZXN0RmlsZXMvVDAxNjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzcxNmFmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMTYwLmh0bWwKQEAgLTAsMCArMSwxMSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitoMSB7IG1hcmdpbjogMWV4OyBmb250OiBib2xkIDE2cHQgaGVsdmV0aWNhOyBjb2xvcjogYmxhY2s7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cD5leCBtYXJnaW4uPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDE3MC5odG1sIGIvVGVzdEZpbGVzL1QwMTcwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5NTk0MAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDE3MC5odG1sCkBAIC0wLDAgKzEsMTIgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorYm9keSB7IGZvbnQtc2l6ZTogMTVwdCB9CitoMSB7IGZvbnQtc2l6ZTogMmVtIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cD5oMSBmb250IHNpemUgaXMgc3BlY2lmaWVkIGluIHRlcm1zIG9mIHRoZSBib2R5IGZvbnQgc2l6ZS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMTgwLmh0bWwgYi9UZXN0RmlsZXMvVDAxODAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjdkMDdiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMTgwLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitoMSB7IGxpbmUtaGVpZ2h0OiAxMDBweDsgdmVydGljYWwtYWxpZ246IHRleHQtdG9wOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+bGluZSBoZWlnaHQgaXMgc3BlY2lmaWVkIGluIHRlcm1zIG9mIHRoZSBzaXplIG9mIHRoZSBoMSBmb250LiAgVE9ETyBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IHJlYWxseSB3b3JrCisgICAgICAgIGluIHRoZSBXb3JkIHJlbmRlcmluZyAtIHB1dHMgc3BhY2UgYWJvdmUsIGJ1dCBub3QgYmVsb3cuICBUaGVyZSByZWFsbHkgYXJlIG5vIG9wdGlvbnMgaW4gV29yZHByb2Nlc3NpbmdNTCB0bworICAgICAgICBzcGVjaWZ5IGxpbmUgaGVpZ2h0LiAgSSB0aGluayB0aGF0IHRoZSBvbmx5IHBvc3NpYmxlIHdheSB0aGF0IHRoaXMgY291bGQgYmUgaW1wbGVtZW50ZWQgd291bGQgYmUgdG8gc3BlY2lmaWNhbGx5CisgICAgICAgIGNhbGN1bGF0ZSB0aGUgc3BhY2UgYmVmb3JlIGFuZCBzcGFjZSBhZnRlci4gIEknbSBub3QgY29tcGxldGVseSBzdXJlIHRoYXQgdGhpcyBjb3VsZCBiZSBwb3NzaWJsZS4gIEkgYW0gcHJldHR5CisgICAgICAgIHN1cmUgdGhhdCB0aGlzIGlzIG5vdCB3b3J0aCB0aGUgZWZmb3J0LjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDAxOTAuaHRtbCBiL1Rlc3RGaWxlcy9UMDE5MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZmQzZWQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDAxOTAuaHRtbApAQCAtMCwwICsxLDE3IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2JvZHkgeworICBmb250LXNpemU6IDI0cHg7CisgIHRleHQtaW5kZW50OiAzZW07Cit9CitoMSB7IGZvbnQtc2l6ZTogMTJweCB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Ym9keSB0ZXh0IGluZGVudCBpcyAzZW0gb2YgMjRweC4gIGgxIGluaGVyaXRzLiAgSXRzIHRleHQgaW5kZW50IGlzIGFsc28gdGhlIHNhbWUgLSBpdCBpbmhlcml0cyB0aGUgY29tcHV0ZWQgdmFsdWUuCisgICAgICAgSG93ZXZlciwgaXQgaXMgaW50ZXJlc3RpbmcuIElFOSByZWNvbXB1dGVzIDNlbSAqIDEycHggaW5kZW50IGZvciBoMS4gIFdvcmQgY29tcHV0ZXMgM2VtICogMTJweCBpbmRlbnQgZm9yIGgxLCBhbmQgM2VtICogMjRweCBmb3IgcC4KKyAgICAgICBOZWl0aGVyIHdvcmQgbm9yIElFIGFyZSBjb3JyZWN0LiAgTXkgY29udmVyc2lvbiwgYW5kIGNocm9tZSBhcmUgY29ycmVjdC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMjAwLmh0bWwgYi9UZXN0RmlsZXMvVDAyMDAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGM5MWU4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMjAwLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Citib2R5IHsKK2ZvbnQtc2l6ZTogMTJweDsKK3RleHQtaW5kZW50OiAxaW47Cit9CitoMSB7IGZvbnQtc2l6ZTogMTVweCB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+dHJ5IHZhcmlvdXMgdW5pdHMgb2YgbWVhc3VyZS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMjEwLmh0bWwgYi9UZXN0RmlsZXMvVDAyMTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA5MzZkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMjEwLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Citib2R5IHsKK2ZvbnQtc2l6ZTogMTJweDsKK3RleHQtaW5kZW50OiAyNS40bW07Cit9CitoMSB7IGZvbnQtc2l6ZTogMTVweCB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+dHJ5IHZhcmlvdXMgdW5pdHMgb2YgbWVhc3VyZS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMjIwLmh0bWwgYi9UZXN0RmlsZXMvVDAyMjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzJkZDJkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMjIwLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Citib2R5IHsKK2ZvbnQtc2l6ZTogMTJweDsKK3RleHQtaW5kZW50OiAyLjU0Y207Cit9CitoMSB7IGZvbnQtc2l6ZTogMTVweCB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+dHJ5IHZhcmlvdXMgdW5pdHMgb2YgbWVhc3VyZS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMjMwLmh0bWwgYi9UZXN0RmlsZXMvVDAyMzAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDRhOTg4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMjMwLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Citib2R5IHsKK2ZvbnQtc2l6ZTogMTJweDsKK3RleHQtaW5kZW50OiA3MnB0OworfQoraDEgeyBmb250LXNpemU6IDE1cHggfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgIDxwPnRyeSB2YXJpb3VzIHVuaXRzIG9mIG1lYXN1cmUuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDI0MC5odG1sIGIvVGVzdEZpbGVzL1QwMjQwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwNTMzNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDI0MC5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorYm9keSB7Citmb250LXNpemU6IDEycHg7Cit0ZXh0LWluZGVudDogNnBjOworfQoraDEgeyBmb250LXNpemU6IDE1cHggfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgIDxwPnRyeSB2YXJpb3VzIHVuaXRzIG9mIG1lYXN1cmUuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDI1MC5odG1sIGIvVGVzdEZpbGVzL1QwMjUwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwZmYxNwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDI1MC5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorYm9keSB7Citmb250LXNpemU6IDEycHg7Cit0ZXh0LWluZGVudDogOTZweDsKK30KK2gxIHsgZm9udC1zaXplOiAxNXB4IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cD50cnkgdmFyaW91cyB1bml0cyBvZiBtZWFzdXJlLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDAyNTEuaHRtbCBiL1Rlc3RGaWxlcy9UMDI1MS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNGY0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDAyNTEuaHRtbApAQCAtMCwwICsxLDE1IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2JvZHkgeworZm9udC1zaXplOiAxMnB4OwordGV4dC1pbmRlbnQ6IDk2cHg7Cit9CitoMSB7IGZvbnQtc2l6ZTogMTVweCB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHAgc3R5bGU9InRleHQtaW5kZW50OiAtNDhweDsiPnRyeSB2YXJpb3VzIHVuaXRzIG9mIG1lYXN1cmUuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDI2MC5odG1sIGIvVGVzdEZpbGVzL1QwMjYwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5ZTU0NgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDI2MC5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorYm9keSB7Citmb250LXNpemU6IDEycHQ7Cit9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+c29tZSB0ZXh0PC9wPgorICAgIDxwIHN0eWxlPSJmb250LXNpemU6IDEyMCUiPnRyeSB2YXJpb3VzIHVuaXRzIG9mIG1lYXN1cmUuPC9wPgorICAgIDxwIHN0eWxlPSJ3b3JkLXNwYWNpbmc6IC41Y20iPnRyeSB2YXJpb3VzIHVuaXRzIG9mIG1lYXN1cmUuICBJbnRlcmVzdGluZyBUT0RPIC0gd29yZC1zcGFjaW5nIGRvZXNuJ3Qgd29yayBpbiBXb3JkLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDAyNzAuaHRtbCBiL1Rlc3RGaWxlcy9UMDI3MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNzg4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDAyNzAuaHRtbApAQCAtMCwwICsxLDExIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2JvZHkgeyBiYWNrZ3JvdW5kOiB1cmwoLi9zdGFydC5qcGcpIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cD5UT0RPIHdoeSBkb2Vzbid0IHRoaXMgd29yaz88L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMjgwLmh0bWwgYi9UZXN0RmlsZXMvVDAyODAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODA5NDRjCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMjgwLmh0bWwKQEAgLTAsMCArMSwzMiBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Citib2R5IHsKK2NvdW50ZXItcmVzZXQ6IGNoYXB0ZXI7Cit9CitoMTpiZWZvcmUgeworY29udGVudDogIkNoYXB0ZXIgIiBjb3VudGVyKGNoYXB0ZXIpICIuICI7Citjb3VudGVyLWluY3JlbWVudDogY2hhcHRlcjsKK30KK2gxIHsKK2NvdW50ZXItcmVzZXQ6IHNlY3Rpb247IAorfQoraDI6YmVmb3JlIHsKK2NvbnRlbnQ6IGNvdW50ZXIoY2hhcHRlcikgIi4iIGNvdW50ZXIoc2VjdGlvbikgIiAiOworY291bnRlci1pbmNyZW1lbnQ6IHNlY3Rpb247Cit9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PC9wPgorICAgIDxoMj5IMjwvaDI+Cis8cD5iYXI8L3A+Cis8aDI+aGhoMjwvaDI+Cis8cD5iYXo8L3A+Cis8aDE+enp6PC9oMT4KKzxwPjExMTwvcD4KKzxwPlRPRE8gd2h5IGRvZXNuJ3QgdGhpcyB3b3JrPzwvcD4KKzxoMj51dXU8L2gyPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDI5MC5odG1sIGIvVGVzdEZpbGVzL1QwMjkwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiZGE3ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDI5MC5odG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorYm9keSB7Citmb250LWZhbWlseTogQ2FsaWJyaTsKK30KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPnRlc3QgcGFyYWdyYXBoPC9wPgorPG9sPgorPGxpPml0ZW0gYTwvbGk+Cis8bGk+aXRlbSBiPC9saT4KKzxvbD4KKzxsaT5pdGVtIGM8L2xpPgorPGxpPml0ZW0gZDwvbGk+Cis8bGk+aXRlbSBlPC9saT4KKzxvbD4gCis8bGk+aXRlbSBmPC9saT4gCis8L29sPiAKKzxvbD4gCis8bGk+aXRlbSBnPC9saT4gCis8L29sPiAKKzxsaT5pdGVtIGg8L2xpPiAKKzwvb2w+IAorPGxpPml0ZW0gaTwvbGk+IAorPGxpPml0ZW0gajwvbGk+IAorPC9vbD4gCis8b2w+IAorPGxpPml0ZW0gazwvbGk+IAorPGxpPml0ZW0gbDwvbGk+IAorPC9vbD4gCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMzAwLmh0bWwgYi9UZXN0RmlsZXMvVDAzMDAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjJjN2UwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMzAwLmh0bWwKQEAgLTAsMCArMSwzMCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8b2wgc3R5bGU9Imxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGEiPgorPGxpPml0ZW0gYTwvbGk+Cis8bGk+aXRlbSBiPC9saT4KKzxvbD4KKzxsaT5pdGVtIGM8L2xpPgorPGxpPml0ZW0gZDwvbGk+Cis8bGk+aXRlbSBlPC9saT4KKzxvbD4gCis8bGk+aXRlbSBmPC9saT4gCis8L29sPiAKKzxvbD4gCis8bGk+aXRlbSBnPC9saT4gCis8L29sPiAKKzxsaT5pdGVtIGg8L2xpPiAKKzwvb2w+IAorPGxpPml0ZW0gaTwvbGk+IAorPGxpPml0ZW0gajwvbGk+IAorPC9vbD4gCis8b2w+IAorPGxpPml0ZW0gazwvbGk+IAorPGxpPml0ZW0gbDwvbGk+IAorPC9vbD4gCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwMzEwLmh0bWwgYi9UZXN0RmlsZXMvVDAzMTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDgwMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwMzEwLmh0bWwKQEAgLTAsMCArMSwxMyBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8b2w+Cis8bGk+YWFhPC9saT4KKzxsaT5iYmI8L2xpPgorPGxpPmNjYzwvbGk+Cis8L29sPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDMyMC5odG1sIGIvVGVzdEZpbGVzL1QwMzIwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE2YzIwZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDMyMC5odG1sCkBAIC0wLDAgKzEsMzAgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPG9sPgorPGxpPml0ZW0gYTwvbGk+Cis8bGk+aXRlbSBiPC9saT4KKzxvbCBzdHlsZT0ibGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYSI+Cis8bGk+aXRlbSBjPC9saT4KKzxsaT5pdGVtIGQ8L2xpPgorPGxpPml0ZW0gZTwvbGk+Cis8b2w+IAorPGxpPml0ZW0gZjwvbGk+IAorPC9vbD4gCis8b2w+IAorPGxpPml0ZW0gZzwvbGk+IAorPC9vbD4gCis8bGk+aXRlbSBoPC9saT4gCis8L29sPiAKKzxsaT5pdGVtIGk8L2xpPiAKKzxsaT5pdGVtIGo8L2xpPiAKKzwvb2w+IAorPG9sPiAKKzxsaT5pdGVtIGs8L2xpPiAKKzxsaT5pdGVtIGw8L2xpPiAKKzwvb2w+IAorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDMzMC5odG1sIGIvVGVzdEZpbGVzL1QwMzMwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjMGJlOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDMzMC5odG1sCkBAIC0wLDAgKzEsNDMgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPG9sIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IHVwcGVyLWFscGhhIj4KKzxsaT5pdGVtIGE8L2xpPgorPGxpPml0ZW0gYjwvbGk+Cis8b2wgc3R5bGU9Imxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGEiPgorPGxpPml0ZW0gYzwvbGk+Cis8b2wgc3R5bGU9Imxpc3Qtc3R5bGUtdHlwZTogbG93ZXItcm9tYW4iPgorPGxpPml0ZW0gYzwvbGk+Cis8bGk+aXRlbSBkPC9saT4KKzxsaT5pdGVtIGU8L2xpPgorPC9vbD4gCis8bGk+aXRlbSBkPC9saT4KKzxsaT5pdGVtIGU8L2xpPgorPG9sPiAKKzxsaT5pdGVtIGY8L2xpPiAKKzwvb2w+IAorPG9sPiAKKzxsaT5pdGVtIGc8L2xpPiAKKzwvb2w+IAorPGxpPml0ZW0gaDwvbGk+IAorPC9vbD4gCis8bGk+aXRlbSBpPC9saT4gCis8bGk+aXRlbSBqPC9saT4gCis8L29sPiAKKzxvbCBzdHlsZT0ibGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsLWxlYWRpbmctemVybyI+IAorPGxpPml0ZW0gazwvbGk+IAorPGxpPml0ZW0gbDwvbGk+IAorPC9vbD4gCis8b2wgc3R5bGU9Imxpc3Qtc3R5bGUtdHlwZTogdXBwZXItcm9tYW4iPiAKKzxsaT5pdGVtIGs8L2xpPiAKKzxvbCBzdHlsZT0ibGlzdC1zdHlsZS10eXBlOiBsb3dlci1yb21hbiI+IAorPGxpPml0ZW0gazwvbGk+IAorPGxpPml0ZW0gbDwvbGk+IAorPC9vbD4gCis8bGk+aXRlbSBsPC9saT4gCis8L29sPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDM0MC5odG1sIGIvVGVzdEZpbGVzL1QwMzQwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4MGJkNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDM0MC5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorcCB7Y291bnRlci1pbmNyZW1lbnQ6IHBhci1udW19CitoMSB7Y291bnRlci1yZXNldDogcGFyLW51bX0KK3A6YmVmb3JlIHtjb250ZW50OiBjb3VudGVyKHBhci1udW0sIHVwcGVyLXJvbWFuKSAiLiAiCit9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PC9wPgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cD50b2RvIHRoaXMgZG9lc24ndCB3b3JrLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDAzNTAuaHRtbCBiL1Rlc3RGaWxlcy9UMDM1MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MDJjODEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDAzNTAuaHRtbApAQCAtMCwwICsxLDEyIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3AgeyBjb2xvcjogZ3JlZW4gfQoraDEgeyBjb2xvcjogYXF1YSB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDM2MC5odG1sIGIvVGVzdEZpbGVzL1QwMzYwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5N2YzOAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDM2MC5odG1sCkBAIC0wLDAgKzEsMTIgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoraDEgeyBjb2xvcjogI2YwMDsgfQorcCB7IGNvbG9yOiAjMGYwOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDM3MC5odG1sIGIvVGVzdEZpbGVzL1QwMzcwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzOTBkYwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDM3MC5odG1sCkBAIC0wLDAgKzEsMTIgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoraDEgeyBjb2xvcjogI2ZmMDAwMDsgfQorcCB7IGNvbG9yOiAjMDAwMGZmOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDM4MC5odG1sIGIvVGVzdEZpbGVzL1QwMzgwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxNGRhYwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDM4MC5odG1sCkBAIC0wLDAgKzEsMTIgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoraDEgeyBjb2xvcjogcmdiKDI1NSwgMjU1LCAwKTsgfQorcCB7IGNvbG9yOiByZ2IoMCwgMjU1LCAyNTUpOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDM5MC5odG1sIGIvVGVzdEZpbGVzL1QwMzkwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmNzU0NgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDM5MC5odG1sCkBAIC0wLDAgKzEsMTIgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoraDEgeyBjb2xvcjogcmdiKDEwMCUsIDEwMCUsIDAlKTsgfQorcCB7IGNvbG9yOiByZ2IoMCUsIDUwJSwgNTAlKTsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgIDxwPmZ6ejwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA0MDAuaHRtbCBiL1Rlc3RGaWxlcy9UMDQwMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOWI3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA0MDAuaHRtbApAQCAtMCwwICsxLDEzIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyogeyBjb2xvcjogcmVkOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PC9wPgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwPmZ6eiBUT0RPIGRvZXNuJ3Qgd29yayBmb3Igd29yZDwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA0MTAuaHRtbCBiL1Rlc3RGaWxlcy9UMDQxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0Y2ViY2MKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA0MTAuaHRtbApAQCAtMCwwICsxLDEzIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3AgeyBjb2xvcjogcmVkOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PC9wPgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwPmZ6ejwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA0MjAuaHRtbCBiL1Rlc3RGaWxlcy9UMDQyMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MDI3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA0MjAuaHRtbApAQCAtMCwwICsxLDEzIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2gxID4gcCB7IGNvbG9yOiByZWQ7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cD5meno8L3A+CisgICAgPGgyPkh0bWwgSGVhZGluZzwvaDI+CisgICAgPHA+Znp6IHdlaXJkIHRvZG8gdGhpcyBkb2Vzbid0IHdvcmsgZm9yIGVpdGhlciBJRSBvciBXb3JkLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA0MzAuaHRtbCBiL1Rlc3RGaWxlcy9UMDQzMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOWFkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA0MzAuaHRtbApAQCAtMCwwICsxLDEzIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2E6bGluayB7IGNvbG9yOiByZWQ7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cD5meno8YSBocmVmPSdodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20nPkVyaWMgV2hpdGU8L2E+PC9wPgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwPmZ6ejwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA0MzEuaHRtbCBiL1Rlc3RGaWxlcy9UMDQzMS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZGNmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA0MzEuaHRtbApAQCAtMCwwICsxLDEzIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2E6bGluayB7IGNvbG9yOiByZWQ7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cD5meno8YSBocmVmPScjJz5FcmljIFdoaXRlPC9hPjwvcD4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cD5meno8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNDMyLmh0bWwgYi9UZXN0RmlsZXMvVDA0MzIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTE4YmFkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNDMyLmh0bWwKQEAgLTAsMCArMSwxMCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CithOmxpbmsgeyBjb2xvcjogcmVkOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisJPHRhYmxlPjx0cj48dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSI+ZXhhbXBsZTwvYT48L3RkPjwvdHI+PC90YWJsZT4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA0NDAuaHRtbCBiL1Rlc3RGaWxlcy9UMDQ0MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOThmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA0NDAuaHRtbApAQCAtMCwwICsxLDEzIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2EgeyBjb2xvcjogcmVkOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PGEgaHJlZj0naHR0cDovL3d3dy5lcmljd2hpdGUuY29tJz5FcmljIFdoaXRlPC9hPjwvcD4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cD5meno8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNDUwLmh0bWwgYi9UZXN0RmlsZXMvVDA0NTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTMwYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNDUwLmh0bWwKQEAgLTAsMCArMSwxMiBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PGEgaHJlZj0naHR0cDovL3d3dy5lcmljd2hpdGUuY29tJz5FcmljIFdoaXRlPC9hPjwvcD4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cD5meno8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNDYwLmh0bWwgYi9UZXN0RmlsZXMvVDA0NjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFjNGY1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNDYwLmh0bWwKQEAgLTAsMCArMSwxNCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CithOmxpbmsgeyBjb2xvcjogcmVkIH0KK2E6aG92ZXIgeyBjb2xvcjogYmx1ZSB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PGEgaHJlZj0naHR0cDovL3d3dy5lcmljd2hpdGUuY29tJz5FcmljIFdoaXRlPC9hPjwvcD4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cD5menogVE9ETyBob3ZlciBkb2VzbnQgd29yayBmb3Igd29yZCwgYnV0IGRpZG50IGV4cGVjdCBpdCB0by48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNDcwLmh0bWwgYi9UZXN0RmlsZXMvVDA0NzAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQ2ODhiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNDcwLmh0bWwKQEAgLTAsMCArMSwxMyBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitoMSBlbSB7IGNvbG9yOiByZWQgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIDxlbT5IZWFkPC9lbT5pbmc8L2gxPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cD5meno8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNDgwLmh0bWwgYi9UZXN0RmlsZXMvVDA0ODAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjM3OGNlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNDgwLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitwOmxhbmcoZnIpIHsgY29sb3I6IHJlZCB9CitwOmxhbmcoZW4pIHsgY29sb3I6IGdyZWVuIH0KK3A6bGFuZyhlbi11cykgeyBjb2xvcjogeWVsbG93IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cCBsYW5nPSdmcic+Znp6PC9wPgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwIGxhbmc9J2VuLXVzJz5meno8L3A+CisgICAgPHAgbGFuZz0nZW4nPmZ6eiB0b2RvIGRvZXNudCB3b3JrPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDQ5MC5odG1sIGIvVGVzdEZpbGVzL1QwNDkwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlMDIyOAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDQ5MC5odG1sCkBAIC0wLDAgKzEsMTMgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoraDEgKyBwIHsgY29sb3I6IHJlZCB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PC9wPgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwPmZ6eiB0b2RvIGRvZXNudCB3b3JrPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDUwMC5odG1sIGIvVGVzdEZpbGVzL1QwNTAwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjOWZiNQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDUwMC5odG1sCkBAIC0wLDAgKzEsMTMgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorcFtpZF0geyBjb2xvcjogcmVkIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cCBJRD0ieHgiPmZ6ejwvcD4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cD5menogdG9kbyBkb2VzbnQgd29yazwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA1MTAuaHRtbCBiL1Rlc3RGaWxlcy9UMDUxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZmYwMzQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA1MTAuaHRtbApAQCAtMCwwICsxLDE0IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3BbbGFuZ3w9ImVuIl0geyBjb2xvcjogcmVkIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cCBsYW5nPSdmcic+Znp6PC9wPgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwIGxhbmc9J2VuLXVzJz5meno8L3A+CisgICAgPHAgbGFuZz0nZW4nPmZ6eiB0b2RvIGRvZXNudCB3b3JrPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDUyMC5odG1sIGIvVGVzdEZpbGVzL1QwNTIwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI2MmM4NwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDUyMC5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorcFtjbGFzc349ImFiYyJdIHsgY29sb3I6IHJlZCB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PC9wPgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwIGNsYXNzPSJhYmMiPmZ6ejwvcD4KKyAgICA8cD5menogdG9kbyBkb2VzbnQgd29yaywgYWx0aG91Z2ggZm9sbG93aW5nIGV4YW1wbGUgZG9lcyB3b3JrLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA1MzAuaHRtbCBiL1Rlc3RGaWxlcy9UMDUzMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMzYxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA1MzAuaHRtbApAQCAtMCwwICsxLDE0IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3AuYWJjIHsgY29sb3I6IHJlZCB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PC9wPgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwIGNsYXNzPSJhYmMiPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNTQwLmh0bWwgYi9UZXN0RmlsZXMvVDA1NDAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWFhYzU4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNTQwLmh0bWwKQEAgLTAsMCArMSwxNCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitwI2FiYyB7IGNvbG9yOiByZWQgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cCBpZD0iYWJjIj5meno8L3A+CisgICAgPHA+Znp6PC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDU1MC5odG1sIGIvVGVzdEZpbGVzL1QwNTUwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NjYTdkYgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDU1MC5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorcCwgaDEgeyBjb2xvcjogcmVkIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cD5meno8L3A+CisgICAgPGgyPkh0bWwgSGVhZGluZzwvaDI+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA1NjAuaHRtbCBiL1Rlc3RGaWxlcy9UMDU2MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MDhjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA1NjAuaHRtbApAQCAtMCwwICsxLDE0IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKypbbGFuZz1lbl0geyBjb2xvcjogcmVkIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cCBsYW5nPSJmciI+Znp6PC9wPgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwIGxhbmc9ImVuLXVzIj5meno8L3A+CisgICAgPHAgbGFuZz0iZW4iPkRvZXNuJ3Qgd29yayBmb3Igd29yZC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNTcwLmh0bWwgYi9UZXN0RmlsZXMvVDA1NzAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGE4ODc0Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNTcwLmh0bWwKQEAgLTAsMCArMSwxNCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitbbGFuZz1lbl0geyBjb2xvcjogcmVkIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cCBsYW5nPSJmciI+Znp6PC9wPgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwIGxhbmc9ImVuLXVzIj5meno8L3A+CisgICAgPHAgbGFuZz0iZW4iPmZ6eiB0b2RvIGRvZXNudCB3b3JrPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDU4MC5odG1sIGIvVGVzdEZpbGVzL1QwNTgwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwN2MzNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDU4MC5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoraDEgeyBjb2xvcjogcmVkIH0KK2VtIHsgY29sb3I6IHJlZCB9CitoMSBlbSB7IGNvbG9yOiBibHVlIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCA8ZW0+SGVhZDwvZW0+aW5nPC9oMT4KKyAgICA8cD5meno8L3A+CisgICAgPGgyPkh0bWwgSGVhZGluZzwvaDI+CisgICAgPHA+Znp6IDxlbT5iYXI8L2VtPjwvcD4KKyAgICA8cD5meno8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNTkwLmh0bWwgYi9UZXN0RmlsZXMvVDA1OTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWZmZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNTkwLmh0bWwKQEAgLTAsMCArMSwxMyBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitwW2lkPSJ4eCJdIHsgY29sb3I6IHJlZCB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHAgaWQ9Inh4Ij5meno8L3A+CisgICAgPGgyPkh0bWwgSGVhZGluZzwvaDI+CisgICAgPHA+ZG9lc24ndCB3b3JrIGZvciB3b3JkIG9yIGllLiAgV29ya3MgZm9yIG1lIGFuZCBjaHJvbWUuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDYwMC5odG1sIGIvVGVzdEZpbGVzL1QwNjAwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkYjhjMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDYwMC5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorZGl2ICogcCB7IGNvbG9yOiByZWQ7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8ZGl2PgorICAgIDxkaXY+CisgICAgICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgICAgICA8cD5meno8L3A+CisgICAgPC9kaXY+CisgICAgPC9kaXY+CisgICAgPGgyPkh0bWwgSGVhZGluZzwvaDI+CisgICAgPHA+d29ya3MgaW4gaWUgYW5kIGZvciBtZSwgbm90IGluIHdvcmQ8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNjEwLmh0bWwgYi9UZXN0RmlsZXMvVDA2MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjVhMDJmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNjEwLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitwLmFiYyB7IGNvbG9yOiBibHVlIH0KK3AuYWJjLmRlZiB7IGNvbG9yOiByZWQgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cCBjbGFzcz0iYWJjIj5meno8L3A+CisgICAgPHAgY2xhc3M9ImFiYyBkZWYiPmZ6ejwvcD4KKyAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgdGhhdCBzaG93cyB0aGF0IHRoZSBDU1MgcHJvY2Vzc29yIGluIFdvcmQgaXMgcmVhbGx5IHByZXR0eSBjcmFwcHkuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDYyMC5odG1sIGIvVGVzdEZpbGVzL1QwNjIwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlZGEyMAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDYyMC5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorKiNhYmMgeyBjb2xvcjogYmx1ZSB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKzxwPmZ6ejwvcD4KKzxoMj5IdG1sIEhlYWRpbmc8L2gyPgorPHAgSUQ9ImFiYyI+Znp6PC9wPgorPHA+d29ya3MgaW4gaWUsIG5vdCBpbiB3b3JkLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA2MjIuaHRtbCBiL1Rlc3RGaWxlcy9UMDYyMi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTQxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA2MjIuaHRtbApAQCAtMCwwICsxLDEwIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyojYWJjIHsgY29sb3I6IGJsdWUgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHAgSUQ9ImFiYyI+Znp6PC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDYzMC5odG1sIGIvVGVzdEZpbGVzL1QwNjMwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2MmQ4YwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDYzMC5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorI2FiYyB7IGNvbG9yOiBibHVlIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5IdG1sIEhlYWRpbmc8L2gxPgorPHA+Znp6PC9wPgorPGgyIElEPSJhYmMiPkh0bWwgSGVhZGluZzwvaDI+Cis8cCBJRD0iYWJjIj5meno8L3A+Cis8cD53b3JrcyBib3RoIGluIGllIGFuZCB3b3JkPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDY0MC5odG1sIGIvVGVzdEZpbGVzL1QwNjQwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjZjQwZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDY0MC5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorcCNhYmMgeyBjb2xvcjogYmx1ZSB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKzxwPmZ6ejwvcD4KKzxoMiBJRD0iYWJjIj5IdG1sIEhlYWRpbmc8L2gyPgorPHAgSUQ9ImFiYyI+Znp6PC9wPgorPHA+d29ya3MgYm90aCBpbiBpZSBhbmQgd29yZDwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA2NTAuaHRtbCBiL1Rlc3RGaWxlcy9UMDY1MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTNiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA2NTAuaHRtbApAQCAtMCwwICsxLDE0IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3BbSUQ9YWJjXSB7IGNvbG9yOiByZWQgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPkh0bWwgSGVhZGluZzwvaDE+Cis8cD5meno8L3A+Cis8aDIgSUQ9ImFiYyI+SHRtbCBIZWFkaW5nPC9oMj4KKzxwIElEPSJhYmMiPmZ6ejwvcD4KKzxwPndvcmtzIGluIGNocm9tZSwgbm90IGluIGllIGFuZCB3b3JkPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDY1MS5odG1sIGIvVGVzdEZpbGVzL1QwNjUxLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjYmFkZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDY1MS5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorcFtJRD1hYmNdIHsgY29sb3I6IHJlZCB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8cCBJRD0iYWJjIj5meno8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNjYwLmh0bWwgYi9UZXN0RmlsZXMvVDA2NjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzY0OTY4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNjYwLmh0bWwKQEAgLTAsMCArMSwxMyBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitoMTpmaXJzdC1jaGlsZCB7IGNvbG9yOiByZWQgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPkgxPC9oMT4KKzxwPmZ6ejwvcD4KKzxoMT5IMTwvaDE+Cis8cD50b2RvIHdvcmtzIGluIGNocm9tZSwgbm90IGluIElFIG9yIFdvcmQuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDY3MC5odG1sIGIvVGVzdEZpbGVzL1QwNjcwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5OTFlZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDY3MC5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorZGl2IHA6Zmlyc3QtY2hpbGQgeyBjb2xvcjogcmVkIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5IMTwvaDE+Cis8ZGl2PgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+Cis8L2Rpdj4KKzxoMT5IMTwvaDE+Cis8cD50b2RvIHdvcmtzIGluIGNocm9tZSwgbm90IGluIElFIG9yIFdvcmQuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDY4MC5odG1sIGIvVGVzdEZpbGVzL1QwNjgwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmMTc2NgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDY4MC5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorcDpmaXJzdC1jaGlsZCBlbSB7IGNvbG9yOiByZWQgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPkgxPC9oMT4KKzxkaXY+CisgICAgPHA+Znp6IDxlbT5lbTwvZW0+PC9wPgorICAgIDxwPmZ6eiA8ZW0+ZW08L2VtPjwvcD4KKzwvZGl2PgorPGgxPkgxPC9oMT4KKzxwPnRvZG8gYXMgdXN1YWwgd29ya3MgaW4gY2hyb21lLCBub3QgaW4gSUUgb3IgV29yZC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNjkwLmh0bWwgYi9UZXN0RmlsZXMvVDA2OTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmYyMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNjkwLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitoMSB7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2UgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPmhlYWRpbmcgMSBzaG91bGQgYmUgdXBwZXJjYXNlPC9oMT4KKzxkaXY+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKzwvZGl2PgorPGgxPmgxPC9oMT4KKzxwPndvcmtzIGluIElFIGFuZCBXb3JkPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDY5MS5odG1sIGIvVGVzdEZpbGVzL1QwNjkxLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5MGNiZQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDY5MS5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoraDEgeyB0ZXh0LXRyYW5zZm9ybTogbG93ZXJjYXNlIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5IRUFESU5HIDEgU0hPVUxEIEJFIExPV0VSIENBU0U8L2gxPgorPGRpdj4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorPC9kaXY+Cis8aDE+SEVBRElORyAxPC9oMT4KKzxwPndvcmtzIGluIElFIGFuZCBXb3JkPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDY5Mi5odG1sIGIvVGVzdEZpbGVzL1QwNjkyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhOGE0YQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDY5Mi5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoraDEgeyB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZSB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+SEVBRElORyAxIFNIT1VMRCBCRSBDQVBJVEFMSVpFRDwvaDE+Cis8ZGl2PgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+Cis8L2Rpdj4KKzxoMT5IRUFESU5HIDE8L2gxPgorPHA+d29ya3MgaW4gSUUgYW5kIFdvcmQ8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNzAwLmh0bWwgYi9UZXN0RmlsZXMvVDA3MDAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmQwMTYwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNzAwLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitwOmZpcnN0LWxpbmUgeyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5oMTwvaDE+Cis8ZGl2PgorICAgIDxwPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LiBNYWVjZW5hcyBwb3J0dGl0b3IgY29uZ3VlIG1hc3NhLiBGdXNjZSBwb3N1ZXJlLCBtYWduYSBzZWQgcHVsdmluYXIgdWx0cmljaWVzLCBwdXJ1cyBsZWN0dXMgbWFsZXN1YWRhIGxpYmVybywgc2l0IGFtZXQgY29tbW9kbyBtYWduYSBlcm9zIHF1aXMgdXJuYS4gTnVuYyB2aXZlcnJhIGltcGVyZGlldCBlbmltLiBGdXNjZSBlc3QuIFZpdmFtdXMgYSB0ZWxsdXMuIFBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMgZXQgbmV0dXMgZXQgbWFsZXN1YWRhIGZhbWVzIGFjIHR1cnBpcyBlZ2VzdGFzLiBQcm9pbiBwaGFyZXRyYSBub251bW15IHBlZGUuIE1hdXJpcyBldCBvcmNpLiBBZW5lYW4gbmVjIGxvcmVtLiBJbiBwb3J0dGl0b3IuIERvbmVjIGxhb3JlZXQgbm9udW1teSBhdWd1ZS4gU3VzcGVuZGlzc2UgZHVpIHB1cnVzLCBzY2VsZXJpc3F1ZSBhdCwgdnVscHV0YXRlIHZpdGFlLCBwcmV0aXVtIG1hdHRpcywgbnVuYy4gTWF1cmlzIGVnZXQgbmVxdWUgYXQgc2VtIHZlbmVuYXRpcyBlbGVpZmVuZC4gVXQgbm9udW1teS4gRnVzY2UgYWxpcXVldCBwZWRlIG5vbiBwZWRlLiBTdXNwZW5kaXNzZSBkYXBpYnVzIGxvcmVtIHBlbGxlbnRlc3F1ZSBtYWduYS4gSW50ZWdlciBudWxsYS4gRG9uZWMgYmxhbmRpdCBmZXVnaWF0IGxpZ3VsYS4gRG9uZWMgaGVuZHJlcml0LCBmZWxpcyBldCBpbXBlcmRpZXQgZXVpc21vZCwgcHVydXMgaXBzdW0gcHJldGl1bSBtZXR1cywgaW4gbGFjaW5pYSBudWxsYSBuaXNsIGVnZXQgc2FwaWVuLjwvcD4KKyAgICA8cD5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dWVyIGFkaXBpc2NpbmcgZWxpdC4gTWFlY2VuYXMgcG9ydHRpdG9yIGNvbmd1ZSBtYXNzYS4gRnVzY2UgcG9zdWVyZSwgbWFnbmEgc2VkIHB1bHZpbmFyIHVsdHJpY2llcywgcHVydXMgbGVjdHVzIG1hbGVzdWFkYSBsaWJlcm8sIHNpdCBhbWV0IGNvbW1vZG8gbWFnbmEgZXJvcyBxdWlzIHVybmEuIE51bmMgdml2ZXJyYSBpbXBlcmRpZXQgZW5pbS4gRnVzY2UgZXN0LiBWaXZhbXVzIGEgdGVsbHVzLiBQZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzIGV0IG5ldHVzIGV0IG1hbGVzdWFkYSBmYW1lcyBhYyB0dXJwaXMgZWdlc3Rhcy4gUHJvaW4gcGhhcmV0cmEgbm9udW1teSBwZWRlLiBNYXVyaXMgZXQgb3JjaS4gQWVuZWFuIG5lYyBsb3JlbS4gSW4gcG9ydHRpdG9yLiBEb25lYyBsYW9yZWV0IG5vbnVtbXkgYXVndWUuIFN1c3BlbmRpc3NlIGR1aSBwdXJ1cywgc2NlbGVyaXNxdWUgYXQsIHZ1bHB1dGF0ZSB2aXRhZSwgcHJldGl1bSBtYXR0aXMsIG51bmMuIE1hdXJpcyBlZ2V0IG5lcXVlIGF0IHNlbSB2ZW5lbmF0aXMgZWxlaWZlbmQuIFV0IG5vbnVtbXkuIEZ1c2NlIGFsaXF1ZXQgcGVkZSBub24gcGVkZS4gU3VzcGVuZGlzc2UgZGFwaWJ1cyBsb3JlbSBwZWxsZW50ZXNxdWUgbWFnbmEuIEludGVnZXIgbnVsbGEuIERvbmVjIGJsYW5kaXQgZmV1Z2lhdCBsaWd1bGEuIERvbmVjIGhlbmRyZXJpdCwgZmVsaXMgZXQgaW1wZXJkaWV0IGV1aXNtb2QsIHB1cnVzIGlwc3VtIHByZXRpdW0gbWV0dXMsIGluIGxhY2luaWEgbnVsbGEgbmlzbCBlZ2V0IHNhcGllbi48L3A+Cis8L2Rpdj4KKzxoMT5oMTwvaDE+Cis8cD50b2RvIHdvcmtzIGluIElFIGFuZCBjaHJvbWUsIG5vdCBpbiBXb3JkLiAgbWF5IG5vdCBtYWtlIHNlbnNlIHRvIHN1cHBvcnQgdGhpcyBvbmUuCisgICAgd291bGQgcmVxdWlyZSB3cml0aW5nIGEgbGF5b3V0IGVuZ2luZS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNzEwLmh0bWwgYi9UZXN0RmlsZXMvVDA3MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2JiOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNzEwLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitwOmZpcnN0LWxldHRlciB7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGZvbnQtc2l6ZTogMjQ7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5oMTwvaDE+Cis8ZGl2PgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+Cis8L2Rpdj4KKzxoMT5oMTwvaDE+Cis8cD53b3JrcyBpbiBJRSwgbm90IGluIFdvcmQuICB0aGlzIGNvdWxkIGJlIGVhc2llciB0byBpbXBsZW1lbnQgdGhhbiBmaXJzdC1saW5lLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA3MjAuaHRtbCBiL1Rlc3RGaWxlcy9UMDcyMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDAxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA3MjAuaHRtbApAQCAtMCwwICsxLDE3IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3A6Zmlyc3QtbGluZSB7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2UgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPmgxPC9oMT4KKzxkaXY+CisgICAgPHA+TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVlciBhZGlwaXNjaW5nIGVsaXQuIE1hZWNlbmFzIHBvcnR0aXRvciBjb25ndWUgbWFzc2EuIEZ1c2NlIHBvc3VlcmUsIG1hZ25hIHNlZCBwdWx2aW5hciB1bHRyaWNpZXMsIHB1cnVzIGxlY3R1cyBtYWxlc3VhZGEgbGliZXJvLCBzaXQgYW1ldCBjb21tb2RvIG1hZ25hIGVyb3MgcXVpcyB1cm5hLiBOdW5jIHZpdmVycmEgaW1wZXJkaWV0IGVuaW0uIEZ1c2NlIGVzdC4gVml2YW11cyBhIHRlbGx1cy4gUGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cyBldCBuZXR1cyBldCBtYWxlc3VhZGEgZmFtZXMgYWMgdHVycGlzIGVnZXN0YXMuIFByb2luIHBoYXJldHJhIG5vbnVtbXkgcGVkZS4gTWF1cmlzIGV0IG9yY2kuIEFlbmVhbiBuZWMgbG9yZW0uIEluIHBvcnR0aXRvci4gRG9uZWMgbGFvcmVldCBub251bW15IGF1Z3VlLiBTdXNwZW5kaXNzZSBkdWkgcHVydXMsIHNjZWxlcmlzcXVlIGF0LCB2dWxwdXRhdGUgdml0YWUsIHByZXRpdW0gbWF0dGlzLCBudW5jLiBNYXVyaXMgZWdldCBuZXF1ZSBhdCBzZW0gdmVuZW5hdGlzIGVsZWlmZW5kLiBVdCBub251bW15LiBGdXNjZSBhbGlxdWV0IHBlZGUgbm9uIHBlZGUuIFN1c3BlbmRpc3NlIGRhcGlidXMgbG9yZW0gcGVsbGVudGVzcXVlIG1hZ25hLiBJbnRlZ2VyIG51bGxhLiBEb25lYyBibGFuZGl0IGZldWdpYXQgbGlndWxhLiBEb25lYyBoZW5kcmVyaXQsIGZlbGlzIGV0IGltcGVyZGlldCBldWlzbW9kLCBwdXJ1cyBpcHN1bSBwcmV0aXVtIG1ldHVzLCBpbiBsYWNpbmlhIG51bGxhIG5pc2wgZWdldCBzYXBpZW4uPC9wPgorICAgIDxwPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LiBNYWVjZW5hcyBwb3J0dGl0b3IgY29uZ3VlIG1hc3NhLiBGdXNjZSBwb3N1ZXJlLCBtYWduYSBzZWQgcHVsdmluYXIgdWx0cmljaWVzLCBwdXJ1cyBsZWN0dXMgbWFsZXN1YWRhIGxpYmVybywgc2l0IGFtZXQgY29tbW9kbyBtYWduYSBlcm9zIHF1aXMgdXJuYS4gTnVuYyB2aXZlcnJhIGltcGVyZGlldCBlbmltLiBGdXNjZSBlc3QuIFZpdmFtdXMgYSB0ZWxsdXMuIFBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMgZXQgbmV0dXMgZXQgbWFsZXN1YWRhIGZhbWVzIGFjIHR1cnBpcyBlZ2VzdGFzLiBQcm9pbiBwaGFyZXRyYSBub251bW15IHBlZGUuIE1hdXJpcyBldCBvcmNpLiBBZW5lYW4gbmVjIGxvcmVtLiBJbiBwb3J0dGl0b3IuIERvbmVjIGxhb3JlZXQgbm9udW1teSBhdWd1ZS4gU3VzcGVuZGlzc2UgZHVpIHB1cnVzLCBzY2VsZXJpc3F1ZSBhdCwgdnVscHV0YXRlIHZpdGFlLCBwcmV0aXVtIG1hdHRpcywgbnVuYy4gTWF1cmlzIGVnZXQgbmVxdWUgYXQgc2VtIHZlbmVuYXRpcyBlbGVpZmVuZC4gVXQgbm9udW1teS4gRnVzY2UgYWxpcXVldCBwZWRlIG5vbiBwZWRlLiBTdXNwZW5kaXNzZSBkYXBpYnVzIGxvcmVtIHBlbGxlbnRlc3F1ZSBtYWduYS4gSW50ZWdlciBudWxsYS4gRG9uZWMgYmxhbmRpdCBmZXVnaWF0IGxpZ3VsYS4gRG9uZWMgaGVuZHJlcml0LCBmZWxpcyBldCBpbXBlcmRpZXQgZXVpc21vZCwgcHVydXMgaXBzdW0gcHJldGl1bSBtZXR1cywgaW4gbGFjaW5pYSBudWxsYSBuaXNsIGVnZXQgc2FwaWVuLjwvcD4KKzwvZGl2PgorPGgxPmgxPC9oMT4KKzxwPnRvZG8gd29ya3MgaW4gSUUgYW5kIGNocm9tZSwgbm90IGluIFdvcmQuICBtYXkgbm90IG1ha2Ugc2Vuc2UgdG8gc3VwcG9ydCB0aGlzIG9uZS4KKyAgICB3b3VsZCByZXF1aXJlIHdyaXRpbmcgYSBsYXlvdXQgZW5naW5lLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA3MzAuaHRtbCBiL1Rlc3RGaWxlcy9UMDczMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NWZmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA3MzAuaHRtbApAQCAtMCwwICsxLDE5IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3AgeyBmb250LXNpemU6IDEycHQ7IGxpbmUtaGVpZ2h0OiAxLjIgfQorcDpmaXJzdC1sZXR0ZXIgeyBmb250LXNpemU6IDIwMCU7IGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsgZmxvYXQ6IGxlZnQ7IH0KK3NwYW4geyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5oMTwvaDE+Cis8ZGl2PgorICAgIDxwPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LiBNYWVjZW5hcyBwb3J0dGl0b3IgY29uZ3VlIG1hc3NhLiBGdXNjZSBwb3N1ZXJlLCBtYWduYSBzZWQgcHVsdmluYXIgdWx0cmljaWVzLCBwdXJ1cyBsZWN0dXMgbWFsZXN1YWRhIGxpYmVybywgc2l0IGFtZXQgY29tbW9kbyBtYWduYSBlcm9zIHF1aXMgdXJuYS4gTnVuYyB2aXZlcnJhIGltcGVyZGlldCBlbmltLiBGdXNjZSBlc3QuIFZpdmFtdXMgYSB0ZWxsdXMuIFBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMgZXQgbmV0dXMgZXQgbWFsZXN1YWRhIGZhbWVzIGFjIHR1cnBpcyBlZ2VzdGFzLiBQcm9pbiBwaGFyZXRyYSBub251bW15IHBlZGUuIE1hdXJpcyBldCBvcmNpLiBBZW5lYW4gbmVjIGxvcmVtLiBJbiBwb3J0dGl0b3IuIERvbmVjIGxhb3JlZXQgbm9udW1teSBhdWd1ZS4gU3VzcGVuZGlzc2UgZHVpIHB1cnVzLCBzY2VsZXJpc3F1ZSBhdCwgdnVscHV0YXRlIHZpdGFlLCBwcmV0aXVtIG1hdHRpcywgbnVuYy4gTWF1cmlzIGVnZXQgbmVxdWUgYXQgc2VtIHZlbmVuYXRpcyBlbGVpZmVuZC4gVXQgbm9udW1teS4gRnVzY2UgYWxpcXVldCBwZWRlIG5vbiBwZWRlLiBTdXNwZW5kaXNzZSBkYXBpYnVzIGxvcmVtIHBlbGxlbnRlc3F1ZSBtYWduYS4gSW50ZWdlciBudWxsYS4gRG9uZWMgYmxhbmRpdCBmZXVnaWF0IGxpZ3VsYS4gRG9uZWMgaGVuZHJlcml0LCBmZWxpcyBldCBpbXBlcmRpZXQgZXVpc21vZCwgcHVydXMgaXBzdW0gcHJldGl1bSBtZXR1cywgaW4gbGFjaW5pYSBudWxsYSBuaXNsIGVnZXQgc2FwaWVuLjwvcD4KKyAgICA8cD5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dWVyIGFkaXBpc2NpbmcgZWxpdC4gTWFlY2VuYXMgcG9ydHRpdG9yIGNvbmd1ZSBtYXNzYS4gRnVzY2UgcG9zdWVyZSwgbWFnbmEgc2VkIHB1bHZpbmFyIHVsdHJpY2llcywgcHVydXMgbGVjdHVzIG1hbGVzdWFkYSBsaWJlcm8sIHNpdCBhbWV0IGNvbW1vZG8gbWFnbmEgZXJvcyBxdWlzIHVybmEuIE51bmMgdml2ZXJyYSBpbXBlcmRpZXQgZW5pbS4gRnVzY2UgZXN0LiBWaXZhbXVzIGEgdGVsbHVzLiBQZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzIGV0IG5ldHVzIGV0IG1hbGVzdWFkYSBmYW1lcyBhYyB0dXJwaXMgZWdlc3Rhcy4gUHJvaW4gcGhhcmV0cmEgbm9udW1teSBwZWRlLiBNYXVyaXMgZXQgb3JjaS4gQWVuZWFuIG5lYyBsb3JlbS4gSW4gcG9ydHRpdG9yLiBEb25lYyBsYW9yZWV0IG5vbnVtbXkgYXVndWUuIFN1c3BlbmRpc3NlIGR1aSBwdXJ1cywgc2NlbGVyaXNxdWUgYXQsIHZ1bHB1dGF0ZSB2aXRhZSwgcHJldGl1bSBtYXR0aXMsIG51bmMuIE1hdXJpcyBlZ2V0IG5lcXVlIGF0IHNlbSB2ZW5lbmF0aXMgZWxlaWZlbmQuIFV0IG5vbnVtbXkuIEZ1c2NlIGFsaXF1ZXQgcGVkZSBub24gcGVkZS4gU3VzcGVuZGlzc2UgZGFwaWJ1cyBsb3JlbSBwZWxsZW50ZXNxdWUgbWFnbmEuIEludGVnZXIgbnVsbGEuIERvbmVjIGJsYW5kaXQgZmV1Z2lhdCBsaWd1bGEuIERvbmVjIGhlbmRyZXJpdCwgZmVsaXMgZXQgaW1wZXJkaWV0IGV1aXNtb2QsIHB1cnVzIGlwc3VtIHByZXRpdW0gbWV0dXMsIGluIGxhY2luaWEgbnVsbGEgbmlzbCBlZ2V0IHNhcGllbi48L3A+Cis8L2Rpdj4KKzxoMT5oMTwvaDE+Cis8cD50b2RvIHdvcmtzIGluIElFIGFuZCBjaHJvbWUsIG5vdCBpbiBXb3JkPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDc0MC5odG1sIGIvVGVzdEZpbGVzL1QwNzQwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4YzY2ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDc0MC5odG1sCkBAIC0wLDAgKzEsMTkgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorcCB7IGZvbnQtc2l6ZTogMTJwdDsgfQorc3BhbiB7IGZvbnQtc2l6ZTogMjAwJTsgZm9udC1zdHlsZTogaXRhbGljOworICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOyBmbG9hdDogbGVmdDsgfQorc3BhbiB7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2UgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPmgxPC9oMT4KKzxkaXY+CisgICAgPHA+PHNwYW4+TDwvc3Bhbj5vcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LiBNYWVjZW5hcyBwb3J0dGl0b3IgY29uZ3VlIG1hc3NhLiBGdXNjZSBwb3N1ZXJlLCBtYWduYSBzZWQgcHVsdmluYXIgdWx0cmljaWVzLCBwdXJ1cyBsZWN0dXMgbWFsZXN1YWRhIGxpYmVybywgc2l0IGFtZXQgY29tbW9kbyBtYWduYSBlcm9zIHF1aXMgdXJuYS4gTnVuYyB2aXZlcnJhIGltcGVyZGlldCBlbmltLiBGdXNjZSBlc3QuIFZpdmFtdXMgYSB0ZWxsdXMuIFBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMgZXQgbmV0dXMgZXQgbWFsZXN1YWRhIGZhbWVzIGFjIHR1cnBpcyBlZ2VzdGFzLiBQcm9pbiBwaGFyZXRyYSBub251bW15IHBlZGUuIE1hdXJpcyBldCBvcmNpLiBBZW5lYW4gbmVjIGxvcmVtLiBJbiBwb3J0dGl0b3IuIERvbmVjIGxhb3JlZXQgbm9udW1teSBhdWd1ZS4gU3VzcGVuZGlzc2UgZHVpIHB1cnVzLCBzY2VsZXJpc3F1ZSBhdCwgdnVscHV0YXRlIHZpdGFlLCBwcmV0aXVtIG1hdHRpcywgbnVuYy4gTWF1cmlzIGVnZXQgbmVxdWUgYXQgc2VtIHZlbmVuYXRpcyBlbGVpZmVuZC4gVXQgbm9udW1teS4gRnVzY2UgYWxpcXVldCBwZWRlIG5vbiBwZWRlLiBTdXNwZW5kaXNzZSBkYXBpYnVzIGxvcmVtIHBlbGxlbnRlc3F1ZSBtYWduYS4gSW50ZWdlciBudWxsYS4gRG9uZWMgYmxhbmRpdCBmZXVnaWF0IGxpZ3VsYS4gRG9uZWMgaGVuZHJlcml0LCBmZWxpcyBldCBpbXBlcmRpZXQgZXVpc21vZCwgcHVydXMgaXBzdW0gcHJldGl1bSBtZXR1cywgaW4gbGFjaW5pYSBudWxsYSBuaXNsIGVnZXQgc2FwaWVuLjwvcD4KKyAgICA8cD5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dWVyIGFkaXBpc2NpbmcgZWxpdC4gTWFlY2VuYXMgcG9ydHRpdG9yIGNvbmd1ZSBtYXNzYS4gRnVzY2UgcG9zdWVyZSwgbWFnbmEgc2VkIHB1bHZpbmFyIHVsdHJpY2llcywgcHVydXMgbGVjdHVzIG1hbGVzdWFkYSBsaWJlcm8sIHNpdCBhbWV0IGNvbW1vZG8gbWFnbmEgZXJvcyBxdWlzIHVybmEuIE51bmMgdml2ZXJyYSBpbXBlcmRpZXQgZW5pbS4gRnVzY2UgZXN0LiBWaXZhbXVzIGEgdGVsbHVzLiBQZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzIGV0IG5ldHVzIGV0IG1hbGVzdWFkYSBmYW1lcyBhYyB0dXJwaXMgZWdlc3Rhcy4gUHJvaW4gcGhhcmV0cmEgbm9udW1teSBwZWRlLiBNYXVyaXMgZXQgb3JjaS4gQWVuZWFuIG5lYyBsb3JlbS4gSW4gcG9ydHRpdG9yLiBEb25lYyBsYW9yZWV0IG5vbnVtbXkgYXVndWUuIFN1c3BlbmRpc3NlIGR1aSBwdXJ1cywgc2NlbGVyaXNxdWUgYXQsIHZ1bHB1dGF0ZSB2aXRhZSwgcHJldGl1bSBtYXR0aXMsIG51bmMuIE1hdXJpcyBlZ2V0IG5lcXVlIGF0IHNlbSB2ZW5lbmF0aXMgZWxlaWZlbmQuIFV0IG5vbnVtbXkuIEZ1c2NlIGFsaXF1ZXQgcGVkZSBub24gcGVkZS4gU3VzcGVuZGlzc2UgZGFwaWJ1cyBsb3JlbSBwZWxsZW50ZXNxdWUgbWFnbmEuIEludGVnZXIgbnVsbGEuIERvbmVjIGJsYW5kaXQgZmV1Z2lhdCBsaWd1bGEuIERvbmVjIGhlbmRyZXJpdCwgZmVsaXMgZXQgaW1wZXJkaWV0IGV1aXNtb2QsIHB1cnVzIGlwc3VtIHByZXRpdW0gbWV0dXMsIGluIGxhY2luaWEgbnVsbGEgbmlzbCBlZ2V0IHNhcGllbi48L3A+Cis8L2Rpdj4KKzxoMT5oMTwvaDE+Cis8cD50b2RvIHdvcmtzIGluIElFIGFuZCBjaHJvbWUsIHBhcnRseSBpbiBXb3JkPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDc0Mi5odG1sIGIvVGVzdEZpbGVzL1QwNzQyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwNjhlZQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDc0Mi5odG1sCkBAIC0wLDAgKzEsMjIgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorcCB7IGZvbnQtc2l6ZTogMTJwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwIHN0eWxlPSdmb250LXdlaWdodDogbm9ybWFsJz5mb250LXdlaWdodDogbm9ybWFsPC9wPgorPHAgc3R5bGU9J2ZvbnQtd2VpZ2h0OiBib2xkJz5mb250LXdlaWdodDogYm9sZDwvcD4KKzxwIHN0eWxlPSdmb250LXdlaWdodDogYm9sZGVyJz5mb250LXdlaWdodDogYm9sZGVyPC9wPgorPHAgc3R5bGU9J2ZvbnQtd2VpZ2h0OiBsaWdodGVyJz5mb250LXdlaWdodDogbGlnaHRlcjwvcD4KKzxwIHN0eWxlPSdmb250LXdlaWdodDogMTAwJz5mb250LXdlaWdodDogMTAwPC9wPgorPHAgc3R5bGU9J2ZvbnQtd2VpZ2h0OiAyMDAnPmZvbnQtd2VpZ2h0OiAyMDA8L3A+Cis8cCBzdHlsZT0nZm9udC13ZWlnaHQ6IDMwMCc+Zm9udC13ZWlnaHQ6IDMwMDwvcD4KKzxwIHN0eWxlPSdmb250LXdlaWdodDogNDAwJz5mb250LXdlaWdodDogNDAwPC9wPgorPHAgc3R5bGU9J2ZvbnQtd2VpZ2h0OiA1MDAnPmZvbnQtd2VpZ2h0OiA1MDA8L3A+Cis8cCBzdHlsZT0nZm9udC13ZWlnaHQ6IDYwMCc+Zm9udC13ZWlnaHQ6IDYwMDwvcD4KKzxwIHN0eWxlPSdmb250LXdlaWdodDogNzAwJz5mb250LXdlaWdodDogNzAwPC9wPgorPHAgc3R5bGU9J2ZvbnQtd2VpZ2h0OiA4MDAnPmZvbnQtd2VpZ2h0OiA4MDA8L3A+Cis8cCBzdHlsZT0nZm9udC13ZWlnaHQ6IDkwMCc+Zm9udC13ZWlnaHQ6IDkwMDwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA3NDUuaHRtbCBiL1Rlc3RGaWxlcy9UMDc0NS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZmNiZWMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA3NDUuaHRtbApAQCAtMCwwICsxLDEzIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3AgeyBmb250LXNpemU6IDEycHQ7IH0KK3NwYW4geyBmb250LXNpemU6IDIwMCU7IGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsgZmxvYXQ6IGxlZnQ7IH0KK3NwYW4geyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPjxzcGFuPkw8L3NwYW4+b3JlbSBpcHN1bS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNzUwLmh0bWwgYi9UZXN0RmlsZXMvVDA3NTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGE1NGUzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNzUwLmh0bWwKQEAgLTAsMCArMSwxOSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitwIHsgZm9udC1zaXplOiAxMnB0OyBsaW5lLWhlaWdodDogMS4yIH0KK3A6Zmlyc3QtbGV0dGVyIHsgZm9udC1zaXplOiAyMDAlOyBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7IGZsb2F0OiBsZWZ0OyB9CitzcGFuIHsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZSB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+aDE8L2gxPgorPGRpdj4KKyAgICA8cD4iTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVlciBhZGlwaXNjaW5nIGVsaXQuIE1hZWNlbmFzIHBvcnR0aXRvciBjb25ndWUgbWFzc2EuIEZ1c2NlIHBvc3VlcmUsIG1hZ25hIHNlZCBwdWx2aW5hciB1bHRyaWNpZXMsIHB1cnVzIGxlY3R1cyBtYWxlc3VhZGEgbGliZXJvLCBzaXQgYW1ldCBjb21tb2RvIG1hZ25hIGVyb3MgcXVpcyB1cm5hLiBOdW5jIHZpdmVycmEgaW1wZXJkaWV0IGVuaW0uIEZ1c2NlIGVzdC4gVml2YW11cyBhIHRlbGx1cy4gUGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cyBldCBuZXR1cyBldCBtYWxlc3VhZGEgZmFtZXMgYWMgdHVycGlzIGVnZXN0YXMuIFByb2luIHBoYXJldHJhIG5vbnVtbXkgcGVkZS4gTWF1cmlzIGV0IG9yY2kuIEFlbmVhbiBuZWMgbG9yZW0uIEluIHBvcnR0aXRvci4gRG9uZWMgbGFvcmVldCBub251bW15IGF1Z3VlLiBTdXNwZW5kaXNzZSBkdWkgcHVydXMsIHNjZWxlcmlzcXVlIGF0LCB2dWxwdXRhdGUgdml0YWUsIHByZXRpdW0gbWF0dGlzLCBudW5jLiBNYXVyaXMgZWdldCBuZXF1ZSBhdCBzZW0gdmVuZW5hdGlzIGVsZWlmZW5kLiBVdCBub251bW15LiBGdXNjZSBhbGlxdWV0IHBlZGUgbm9uIHBlZGUuIFN1c3BlbmRpc3NlIGRhcGlidXMgbG9yZW0gcGVsbGVudGVzcXVlIG1hZ25hLiBJbnRlZ2VyIG51bGxhLiBEb25lYyBibGFuZGl0IGZldWdpYXQgbGlndWxhLiBEb25lYyBoZW5kcmVyaXQsIGZlbGlzIGV0IGltcGVyZGlldCBldWlzbW9kLCBwdXJ1cyBpcHN1bSBwcmV0aXVtIG1ldHVzLCBpbiBsYWNpbmlhIG51bGxhIG5pc2wgZWdldCBzYXBpZW4uPC9wPgorICAgIDxwPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LiBNYWVjZW5hcyBwb3J0dGl0b3IgY29uZ3VlIG1hc3NhLiBGdXNjZSBwb3N1ZXJlLCBtYWduYSBzZWQgcHVsdmluYXIgdWx0cmljaWVzLCBwdXJ1cyBsZWN0dXMgbWFsZXN1YWRhIGxpYmVybywgc2l0IGFtZXQgY29tbW9kbyBtYWduYSBlcm9zIHF1aXMgdXJuYS4gTnVuYyB2aXZlcnJhIGltcGVyZGlldCBlbmltLiBGdXNjZSBlc3QuIFZpdmFtdXMgYSB0ZWxsdXMuIFBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMgZXQgbmV0dXMgZXQgbWFsZXN1YWRhIGZhbWVzIGFjIHR1cnBpcyBlZ2VzdGFzLiBQcm9pbiBwaGFyZXRyYSBub251bW15IHBlZGUuIE1hdXJpcyBldCBvcmNpLiBBZW5lYW4gbmVjIGxvcmVtLiBJbiBwb3J0dGl0b3IuIERvbmVjIGxhb3JlZXQgbm9udW1teSBhdWd1ZS4gU3VzcGVuZGlzc2UgZHVpIHB1cnVzLCBzY2VsZXJpc3F1ZSBhdCwgdnVscHV0YXRlIHZpdGFlLCBwcmV0aXVtIG1hdHRpcywgbnVuYy4gTWF1cmlzIGVnZXQgbmVxdWUgYXQgc2VtIHZlbmVuYXRpcyBlbGVpZmVuZC4gVXQgbm9udW1teS4gRnVzY2UgYWxpcXVldCBwZWRlIG5vbiBwZWRlLiBTdXNwZW5kaXNzZSBkYXBpYnVzIGxvcmVtIHBlbGxlbnRlc3F1ZSBtYWduYS4gSW50ZWdlciBudWxsYS4gRG9uZWMgYmxhbmRpdCBmZXVnaWF0IGxpZ3VsYS4gRG9uZWMgaGVuZHJlcml0LCBmZWxpcyBldCBpbXBlcmRpZXQgZXVpc21vZCwgcHVydXMgaXBzdW0gcHJldGl1bSBtZXR1cywgaW4gbGFjaW5pYSBudWxsYSBuaXNsIGVnZXQgc2FwaWVuLjwvcD4KKzwvZGl2PgorPGgxPmgxPC9oMT4KKzxwPnRvZG8gd29ya3MgaW4gSUUgYW5kIGNocm9tZSwgbm90IGluIFdvcmQ8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNzYwLmh0bWwgYi9UZXN0RmlsZXMvVDA3NjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDI2M2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNzYwLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitwLnNwZWNpYWw6YmVmb3JlIHtjb250ZW50OiAiU3BlY2lhbCEgIn0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5oMTwvaDE+Cis8ZGl2PgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cCBjbGFzcz0ic3BlY2lhbCI+Znp6PC9wPgorPC9kaXY+Cis8aDE+aDE8L2gxPgorPHA+d29ya3MgaW4gY2hyb21lLCBub3QgaW4gSUUgb3Igd29yZDwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA3NzAuaHRtbCBiL1Rlc3RGaWxlcy9UMDc3MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MWExODQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA3NzAuaHRtbApAQCAtMCwwICsxLDEzIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2gxIHsgY29sb3I6IGJsdWU7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCA8ZW0+SGVhZDwvZW0+aW5nPC9oMT4KKyAgICA8cD5meno8L3A+CisgICAgPGgyPkh0bWwgSGVhZGluZzwvaDI+CisgICAgPHA+ZW0gaW5oZXJpdHMgY29sb3IgZnJvbSBoMTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA3ODAuaHRtbCBiL1Rlc3RGaWxlcy9UMDc4MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDFhMzIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA3ODAuaHRtbApAQCAtMCwwICsxLDE1IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2JvZHkgeyBmb250LXNpemU6IDEwcHQgfQoraDEgeyBmb250LXNpemU6IDEzMCUgfQoraDIgeyBmb250LXNpemU6IDExNSUgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIDxlbT5IZWFkPC9lbT5pbmc8L2gxPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cD5oMSBiZWNvbWVzIDEzcHQuICBlbSBpbmhlcml0cyBjb21wdXRlZCB2YWx1ZS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNzkwLmh0bWwgYi9UZXN0RmlsZXMvVDA3OTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTJhNzU5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNzkwLmh0bWwKQEAgLTAsMCArMSwxNCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitoMSB7IGNvbG9yOiByZWQgIWltcG9ydGFudCB9CitoMSB7IGNvbG9yOiBibHVlIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCA8ZW0+SGVhZDwvZW0+aW5nPC9oMT4KKyAgICA8cD5meno8L3A+CisgICAgPGgyPkh0bWwgSGVhZGluZzwvaDI+CisgICAgPHA+d29yZCBkb2VzIGhvbm9yIGltcG9ydGFudC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNzkxLmh0bWwgYi9UZXN0RmlsZXMvVDA3OTEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZhYjUzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNzkxLmh0bWwKQEAgLTAsMCArMSwyOSBAQAorCis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkV4YW1wbGVzIG9mIG1hcmdpbnMsIHBhZGRpbmcsIGFuZCBib3JkZXJzPC9USVRMRT4KKzxzdHlsZSB0eXBlPSd0ZXh0L2Nzcyc+CisgICAgcC5jbGFzc0EgeworICAgICAgICBjb2xvcjogd2hpdGU7ICAgICAgICAgICAgICAgICAgCisgICAgICAgIGJhY2tncm91bmQ6IGJsdWU7ICAgICAgICAgICAgICAKKyAgICAgICAgbWFyZ2luOiA0MHB4IDQwcHggNDBweCA0MHB4OworICAgICAgICBwYWRkaW5nOiAxMnB4IDBweCAxMnB4IDEycHg7CisgICAgfQorICAgIHAuY2xhc3NCIHsKKyAgICAgICAgY29sb3I6IHdoaXRlOyAgICAgICAgICAgICAgICAgIAorICAgICAgICBiYWNrZ3JvdW5kOiBibHVlOyAgICAgICAgICAgICAgCisgICAgICAgIG1hcmdpbjogNDBweCA0MHB4IDQwcHggNDBweDsKKyAgICAgICAgcGFkZGluZzogMTJweCAwcHggMTJweCAxMnB4OworICAgICAgICBib3JkZXItc3R5bGU6IGRhc2hlZDsKKyAgICAgICAgYm9yZGVyLXdpZHRoOiBtZWRpdW07ICAgICAgICAgIAorICAgICAgICBib3JkZXItY29sb3I6IGxpbWU7CisgICAgfQorPC9zdHlsZT4KKzwvSEVBRD4KKzxCT0RZPgorPHA+YmVmb3JlPC9wPgorPHAgY2xhc3M9J2NsYXNzQSc+Zmlyc3QgcGFyYWdyYXBoPC9wPgorPHAgY2xhc3M9J2NsYXNzQic+c2Vjb25kIHBhcmFncmFwaC48L3A+Cis8cD5hZnRlcjwvcD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA3OTIuaHRtbCBiL1Rlc3RGaWxlcy9UMDc5Mi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTRmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA3OTIuaHRtbApAQCAtMCwwICsxLDI5IEBACisKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+RXhhbXBsZXMgb2YgbWFyZ2lucywgcGFkZGluZywgYW5kIGJvcmRlcnM8L1RJVExFPgorPHN0eWxlIHR5cGU9J3RleHQvY3NzJz4KKyAgICBwLmNsYXNzQSB7CisgICAgICAgIGNvbG9yOiB3aGl0ZTsgICAgICAgICAgICAgICAgICAKKyAgICAgICAgYmFja2dyb3VuZDogYmx1ZTsgICAgICAgICAgICAgIAorICAgICAgICBtYXJnaW46IDBweCAwcHggMHB4IDBweDsKKyAgICAgICAgcGFkZGluZzogMTJweCAxMnB4IDEycHggMTJweDsKKyAgICB9CisgICAgcC5jbGFzc0IgeworICAgICAgICBjb2xvcjogd2hpdGU7ICAgICAgICAgICAgICAgICAgCisgICAgICAgIGJhY2tncm91bmQ6IGJsdWU7ICAgICAgICAgICAgICAKKyAgICAgICAgbWFyZ2luOiAwcHggMHB4IDBweCAwcHg7CisgICAgICAgIHBhZGRpbmc6IDEycHggMTJweCAxMnB4IDEycHg7CisgICAgICAgIGJvcmRlci1zdHlsZTogZGFzaGVkOworICAgICAgICBib3JkZXItd2lkdGg6IG1lZGl1bTsgICAgICAgICAgCisgICAgICAgIGJvcmRlci1jb2xvcjogbGltZTsKKyAgICB9Cis8L3N0eWxlPgorPC9IRUFEPgorPEJPRFk+Cis8cD5iZWZvcmU8L3A+Cis8cCBjbGFzcz0nY2xhc3NBJz5maXJzdCBwYXJhZ3JhcGg8L3A+Cis8cCBjbGFzcz0nY2xhc3NCJz5zZWNvbmQgcGFyYWdyYXBoLjwvcD4KKzxwPmFmdGVyPC9wPgorPC9CT0RZPgorPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDc5My5odG1sIGIvVGVzdEZpbGVzL1QwNzkzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliMWMwNwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDc5My5odG1sCkBAIC0wLDAgKzEsMjkgQEAKKworPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5FeGFtcGxlcyBvZiBtYXJnaW5zLCBwYWRkaW5nLCBhbmQgYm9yZGVyczwvVElUTEU+Cis8c3R5bGUgdHlwZT0ndGV4dC9jc3MnPgorICAgIHAuY2xhc3NBIHsKKyAgICAgICAgY29sb3I6IHdoaXRlOyAgICAgICAgICAgICAgICAgIAorICAgICAgICBiYWNrZ3JvdW5kOiBibHVlOyAgICAgICAgICAgICAgCisgICAgICAgIG1hcmdpbjogMHB4IDBweCAwcHggMHB4OworICAgICAgICBwYWRkaW5nOiAyNHB4IDI0cHggMjRweCAyNHB4OworICAgIH0KKyAgICBwLmNsYXNzQiB7CisgICAgICAgIGNvbG9yOiB3aGl0ZTsgICAgICAgICAgICAgICAgICAKKyAgICAgICAgYmFja2dyb3VuZDogYmx1ZTsgICAgICAgICAgICAgIAorICAgICAgICBtYXJnaW46IDBweCAwcHggMHB4IDBweDsKKyAgICAgICAgcGFkZGluZzogMjRweCAyNHB4IDI0cHggMjRweDsKKyAgICAgICAgYm9yZGVyLXN0eWxlOiBkYXNoZWQ7CisgICAgICAgIGJvcmRlci13aWR0aDogbWVkaXVtOyAgICAgICAgICAKKyAgICAgICAgYm9yZGVyLWNvbG9yOiBsaW1lOworICAgIH0KKzwvc3R5bGU+Cis8L0hFQUQ+Cis8Qk9EWT4KKzxwPmJlZm9yZTwvcD4KKzxwIGNsYXNzPSdjbGFzc0EnPmZpcnN0IHBhcmFncmFwaDwvcD4KKzxwIGNsYXNzPSdjbGFzc0InPnNlY29uZCBwYXJhZ3JhcGguPC9wPgorPHA+YWZ0ZXI8L3A+Cis8L0JPRFk+Cis8L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwNzk0Lmh0bWwgYi9UZXN0RmlsZXMvVDA3OTQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzlkZDRiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwNzk0Lmh0bWwKQEAgLTAsMCArMSwyOSBAQAorCis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkV4YW1wbGVzIG9mIG1hcmdpbnMsIHBhZGRpbmcsIGFuZCBib3JkZXJzPC9USVRMRT4KKzxzdHlsZSB0eXBlPSd0ZXh0L2Nzcyc+CisgICAgcC5jbGFzc0EgeworICAgICAgICBjb2xvcjogd2hpdGU7ICAgICAgICAgICAgICAgICAgCisgICAgICAgIGJhY2tncm91bmQ6IGJsdWU7ICAgICAgICAgICAgICAKKyAgICAgICAgbWFyZ2luOiA2cHQgNnB0IDZwdCA2cHQ7CisgICAgICAgIHBhZGRpbmc6IDI0cHggMjRweCAyNHB4IDI0cHg7CisgICAgfQorICAgIHAuY2xhc3NCIHsKKyAgICAgICAgY29sb3I6IHdoaXRlOyAgICAgICAgICAgICAgICAgIAorICAgICAgICBiYWNrZ3JvdW5kOiBibHVlOyAgICAgICAgICAgICAgCisgICAgICAgIG1hcmdpbjogNnB0IDZwdCA2cHQgNnB0OworICAgICAgICBwYWRkaW5nOiAyNHB4IDI0cHggMjRweCAyNHB4OworICAgICAgICBib3JkZXItc3R5bGU6IGRhc2hlZDsKKyAgICAgICAgYm9yZGVyLXdpZHRoOiBtZWRpdW07ICAgICAgICAgIAorICAgICAgICBib3JkZXItY29sb3I6IGxpbWU7CisgICAgfQorPC9zdHlsZT4KKzwvSEVBRD4KKzxCT0RZPgorPHA+YmVmb3JlPC9wPgorPHAgY2xhc3M9J2NsYXNzQSc+Zmlyc3QgcGFyYWdyYXBoPC9wPgorPHAgY2xhc3M9J2NsYXNzQic+c2Vjb25kIHBhcmFncmFwaC48L3A+Cis8cD5hZnRlcjwvcD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA3OTUuaHRtbCBiL1Rlc3RGaWxlcy9UMDc5NS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZmVjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA3OTUuaHRtbApAQCAtMCwwICsxLDM0IEBACisKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+RXhhbXBsZXMgb2YgbWFyZ2lucywgcGFkZGluZywgYW5kIGJvcmRlcnM8L1RJVExFPgorPHN0eWxlIHR5cGU9J3RleHQvY3NzJz4KKyAgICBwLmNsYXNzQSB7CisgICAgICAgIGNvbG9yOiB3aGl0ZTsgICAgICAgICAgICAgICAgICAKKyAgICAgICAgYmFja2dyb3VuZDogYmx1ZTsgICAgICAgICAgICAgIAorICAgICAgICBtYXJnaW46IDE4cHggMThweCAxOHB4IDE4cHg7CisgICAgICAgIHBhZGRpbmc6IDEwcHQgMTBwdCAxMHB0IDEwcHQ7CisgICAgfQorICAgIHAuY2xhc3NCIHsKKyAgICAgICAgY29sb3I6IHdoaXRlOyAgICAgICAgICAgICAgICAgIAorICAgICAgICBiYWNrZ3JvdW5kOiBibHVlOyAgICAgICAgICAgICAgCisgICAgICAgIG1hcmdpbjogMThweCAxOHB4IDE4cHggMThweDsKKyAgICAgICAgcGFkZGluZzogMTBwdCAxMHB0IDEwcHQgMTBwdDsKKyAgICAgICAgYm9yZGVyLXN0eWxlOiBkYXNoZWQ7CisgICAgICAgIGJvcmRlci13aWR0aDogbWVkaXVtOyAgICAgICAgICAKKyAgICAgICAgYm9yZGVyLWNvbG9yOiBsaW1lOworICAgIH0KKzwvc3R5bGU+Cis8L0hFQUQ+Cis8Qk9EWT4KKzxwPmJlZm9yZTwvcD4KKzxwIGNsYXNzPSdjbGFzc0EnPmZpcnN0IHBhcmFncmFwaDwvcD4KKzxwIGNsYXNzPSdjbGFzc0InPnNlY29uZCBwYXJhZ3JhcGguPC9wPgorPHAgY2xhc3M9J2NsYXNzQic+dGhpcmQgcGFyYWdyYXBoLjwvcD4KKzxwIGNsYXNzPSdjbGFzc0InPmZvdXJ0aCBwYXJhZ3JhcGguPC9wPgorPHAgY2xhc3M9J2NsYXNzQSc+ZmlmdGggcGFyYWdyYXBoPC9wPgorPHAgY2xhc3M9J2NsYXNzQSc+c2l4dGggcGFyYWdyYXBoPC9wPgorPHAgY2xhc3M9J2NsYXNzQSc+c2V2ZW50aCBwYXJhZ3JhcGg8L3A+Cis8cD5hZnRlcjwvcD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA4MDIuaHRtbCBiL1Rlc3RGaWxlcy9UMDgwMi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNmU5ODgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA4MDIuaHRtbApAQCAtMCwwICsxLDE3IEBACisKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+RXhhbXBsZXMgb2YgbWFyZ2lucywgcGFkZGluZywgYW5kIGJvcmRlcnM8L1RJVExFPgorPHN0eWxlIHR5cGU9J3RleHQvY3NzJz4KKzwvc3R5bGU+Cis8L0hFQUQ+Cis8Qk9EWT4KKzxwPi0tLS0tPC9wPgorPHAgc3R5bGU9J21hcmdpbjoxMnB0Jz4xMnB0PC9wPgorPHA+LS0tLS08L3A+Cis8cCBzdHlsZT0nbWFyZ2luOjIwcHQnPjIwcHQ8L3A+Cis8cD4tLS0tLTwvcD4KKzxwIHN0eWxlPSdtYXJnaW46MzBwdCc+MzBwdDwvcD4KKzxwPi0tLS0tPC9wPgorPC9CT0RZPgorPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDgwNC5odG1sIGIvVGVzdEZpbGVzL1QwODA0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmZTJjMgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDgwNC5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKworPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5FeGFtcGxlcyBvZiBtYXJnaW5zLCBwYWRkaW5nLCBhbmQgYm9yZGVyczwvVElUTEU+Cis8c3R5bGUgdHlwZT0ndGV4dC9jc3MnPgorPC9zdHlsZT4KKzwvSEVBRD4KKzxCT0RZPgorPHA+LS0tLS08L3A+Cis8aDEgc3R5bGU9J21hcmdpbjoxMnB0Jz4xMnB0PC9oMT4KKzxwPi0tLS0tPC9wPgorPGgyIHN0eWxlPSdtYXJnaW46MjBwdCc+MjBwdDwvaDI+Cis8cD4tLS0tLTwvcD4KKzxoMyBzdHlsZT0nbWFyZ2luOjMwcHQnPjMwcHQ8L2gzPgorPHA+LS0tLS08L3A+Cis8L0JPRFk+Cis8L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwODA1Lmh0bWwgYi9UZXN0RmlsZXMvVDA4MDUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmU2MjAzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwODA1Lmh0bWwKQEAgLTAsMCArMSwxNyBAQAorCis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkV4YW1wbGVzIG9mIG1hcmdpbnMsIHBhZGRpbmcsIGFuZCBib3JkZXJzPC9USVRMRT4KKzxzdHlsZSB0eXBlPSd0ZXh0L2Nzcyc+Cis8L3N0eWxlPgorPC9IRUFEPgorPEJPRFk+Cis8cD4tLS0tLTwvcD4KKzx1bD4KKzxsaSBzdHlsZT0nbWFyZ2luOjEycHQnPjEycHQ8L2xpPgorPGxpIHN0eWxlPSdtYXJnaW46MjBwdCc+MjBwdDwvbGk+Cis8bGkgc3R5bGU9J21hcmdpbjozMHB0Jz4zMHB0PC9saT4KKzwvdWw+Cis8cD4tLS0tLTwvcD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA4MTAuaHRtbCBiL1Rlc3RGaWxlcy9UMDgxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYmRkMTYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA4MTAuaHRtbApAQCAtMCwwICsxLDMyIEBACisKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+RXhhbXBsZXMgb2YgbWFyZ2lucywgcGFkZGluZywgYW5kIGJvcmRlcnM8L1RJVExFPgorPHN0eWxlIHR5cGU9J3RleHQvY3NzJz4KKyAgICBVTCB7CisgICAgYmFja2dyb3VuZDogeWVsbG93OworICAgIG1hcmdpbjogMTJweCAxMnB4IDEycHggMTJweDsKKyAgICBwYWRkaW5nOiAzcHggM3B4IDNweCAzcHg7CisgICAgfQorICAgIExJIHsKKyAgICBjb2xvcjogd2hpdGU7ICAgICAgICAgICAgICAgICAgCisgICAgYmFja2dyb3VuZDogYmx1ZTsgICAgICAgICAgICAgIAorICAgIG1hcmdpbjogMTJweCAxMnB4IDEycHggMTJweDsKKyAgICBwYWRkaW5nOiAxMnB4IDBweCAxMnB4IDEycHg7ICAgCisgICAgbGlzdC1zdHlsZTogbm9uZTsgICAgICAgICAgICAgIAorICAgIH0KKyAgICBMSS53aXRoYm9yZGVyIHsKKyAgICBib3JkZXItc3R5bGU6IGRhc2hlZDsKKyAgICBib3JkZXItd2lkdGg6IHRoaW47ICAgICAgICAKKyAgICBib3JkZXItY29sb3I6IGxpbWU7CisgICAgfQorPC9zdHlsZT4KKzwvSEVBRD4KKzxCT0RZPgorPFVMPgorICAgIDxsaT5GaXJzdCBlbGVtZW50IG9mIGxpc3Q8L2xpPgorICAgIDxsaSBjbGFzcz0nd2l0aGJvcmRlcic+U2Vjb25kIGVsZW1lbnQgb2YgbGlzdCBpcyBhIGJpdCBsb25nZXIgdG8gaWxsdXN0cmF0ZSB3cmFwcGluZy48L2xpPgorPC9VTD4KKzxQPnRvZG8gdGhpcyBkb2Vzbid0IHdvcmsgcHJvcGVybHkgaW4gV29yZCAtIHRoZSBsaXN0LXN0eWxlOiBub25lIGlzIG5vdCB3b3JraW5nLiAgYWxzbyBtYXJnaW5zIGRvbnQgd29yayBwcm9wZXJseS48L1A+Cis8L0JPRFk+Cis8L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwODEyLmh0bWwgYi9UZXN0RmlsZXMvVDA4MTIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTRhY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwODEyLmh0bWwKQEAgLTAsMCArMSwzMSBAQAorCis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkV4YW1wbGVzIG9mIG1hcmdpbnMsIHBhZGRpbmcsIGFuZCBib3JkZXJzPC90aXRsZT4KKzxzdHlsZSB0eXBlPSd0ZXh0L2Nzcyc+Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8cCBzdHlsZT0nZm9udDogeHgtc21hbGwgQ2FsaWJyaTsnPmZvbnQ6IHh4LXNtYWxsIENhbGlicmk8L3A+Cis8cCBzdHlsZT0nZm9udDogeC1zbWFsbCBDYWxpYnJpOyc+Zm9udDogeC1zbWFsbCBDYWxpYnJpPC9wPgorPHAgc3R5bGU9J2ZvbnQ6IHNtYWxsIENhbGlicmk7Jz5mb250OiBzbWFsbCBDYWxpYnJpPC9wPgorPHAgc3R5bGU9J2ZvbnQ6IG1lZGl1bSBDYWxpYnJpOyc+Zm9udDogbWVkaXVtIENhbGlicmk8L3A+Cis8cCBzdHlsZT0nZm9udDogbGFyZ2UgQ2FsaWJyaTsnPmZvbnQ6IGxhcmdlIENhbGlicmk8L3A+Cis8cCBzdHlsZT0nZm9udDogeC1sYXJnZSBDYWxpYnJpOyc+Zm9udDogeC1sYXJnZSBDYWxpYnJpPC9wPgorPHAgc3R5bGU9J2ZvbnQ6IHh4LWxhcmdlIENhbGlicmk7Jz5mb250OiB4eC1sYXJnZSBDYWxpYnJpPC9wPgorPHAgc3R5bGU9J2ZvbnQ6IHh4LXNtYWxsICJ0aW1lcyBuZXcgcm9tYW4iOyc+Zm9udDogeHgtc21hbGwgVGltZXMgTmV3IFJvbWFuPC9wPgorPHAgc3R5bGU9J2ZvbnQ6IHgtc21hbGwgInRpbWVzIG5ldyByb21hbiI7Jz5mb250OiB4LXNtYWxsIFRpbWVzIE5ldyBSb21hbjwvcD4KKzxwIHN0eWxlPSdmb250OiBzbWFsbCAidGltZXMgbmV3IHJvbWFuIjsnPmZvbnQ6IHNtYWxsIFRpbWVzIE5ldyBSb21hbjwvcD4KKzxwIHN0eWxlPSdmb250OiBtZWRpdW0gInRpbWVzIG5ldyByb21hbiI7Jz5mb250OiBtZWRpdW0gVGltZXMgTmV3IFJvbWFuPC9wPgorPHAgc3R5bGU9J2ZvbnQ6IGxhcmdlICJ0aW1lcyBuZXcgcm9tYW4iOyc+Zm9udDogbGFyZ2UgVGltZXMgTmV3IFJvbWFuPC9wPgorPHAgc3R5bGU9J2ZvbnQ6IHgtbGFyZ2UgInRpbWVzIG5ldyByb21hbiI7Jz5mb250OiB4LWxhcmdlIFRpbWVzIE5ldyBSb21hbjwvcD4KKzxwIHN0eWxlPSdmb250OiB4eC1sYXJnZSAidGltZXMgbmV3IHJvbWFuIjsnPmZvbnQ6IHh4LWxhcmdlIFRpbWVzIE5ldyBSb21hbjwvcD4KKzxwIHN0eWxlPSdmb250OiB4eC1zbWFsbCAidGltZXMiOyc+Zm9udDogeHgtc21hbGwgdGltZXM8L3A+Cis8cCBzdHlsZT0nZm9udDogeC1zbWFsbCAidGltZXMiOyc+Zm9udDogeC1zbWFsbCB0aW1lczwvcD4KKzxwIHN0eWxlPSdmb250OiBzbWFsbCAidGltZXMiOyc+Zm9udDogc21hbGwgdGltZXM8L3A+Cis8cCBzdHlsZT0nZm9udDogbWVkaXVtICJ0aW1lcyI7Jz5mb250OiBtZWRpdW0gdGltZXM8L3A+Cis8cCBzdHlsZT0nZm9udDogbGFyZ2UgInRpbWVzIjsnPmZvbnQ6IGxhcmdlIHRpbWVzPC9wPgorPHAgc3R5bGU9J2ZvbnQ6IHgtbGFyZ2UgInRpbWVzIjsnPmZvbnQ6IHgtbGFyZ2UgdGltZXM8L3A+Cis8cCBzdHlsZT0nZm9udDogeHgtbGFyZ2UgInRpbWVzIjsnPmZvbnQ6IHh4LWxhcmdlIHRpbWVzPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDgxNC5odG1sIGIvVGVzdEZpbGVzL1QwODE0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhZDQwMgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDgxNC5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKworPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5FeGFtcGxlcyBvZiBtYXJnaW5zLCBwYWRkaW5nLCBhbmQgYm9yZGVyczwvdGl0bGU+Cis8c3R5bGUgdHlwZT0ndGV4dC9jc3MnPgorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHAgc3R5bGU9J2ZvbnQtZmFtaWx5OiBDYWxpYnJpLCBzYW4tc2VyaWY7Jz5TaG91bGQgYmUgQ2FsaWJyaTwvcD4KKzxwIHN0eWxlPSdmb250LWZhbWlseTogZnp6LCBDYWxpYnJpLCBzYW4tc2VyaWY7Jz5TaG91bGQgYmUgQ2FsaWJyaSAoYnlwYXNzaW5nIGZ6eik8L3A+Cis8cCBzdHlsZT0nZm9udC1mYW1pbHk6IGZ6eiwgc2VyaWY7Jz5TaG91bGQgYmUgVGltZXMgTmV3IFJvbWFuIChieXBhc3NpbmcgZnp6LCBtYXBwaW5nIHNlcmlmIHRvIHRpbWVzKTwvcD4KKzxwIHN0eWxlPSdmb250LWZhbWlseTogc2Fucy1zZXJpZjsnPlNob3VsZCBiZSBBcmlhbDwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA4MjAuaHRtbCBiL1Rlc3RGaWxlcy9UMDgyMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDllYWEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA4MjAuaHRtbApAQCAtMCwwICsxLDM1IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2JvZHkgeworYmFja2dyb3VuZDogb3JhbmdlOworfQorZGl2IHsKK2JhY2tncm91bmQ6IHllbGxvdzsKK21hcmdpbjogMCUgMCUgMCUgMCU7Citib3JkZXI6IHRoaW4gc29saWQgcmVkOworcGFkZGluZzogMCUgMCUgMCUgMCU7Cit9CitwIHsKK2JhY2tncm91bmQ6IHJlZDsKK21hcmdpbjogMyUgMyUgMyUgMyU7CitwYWRkaW5nOiAzJSAzJSAzJSAzJTsKK2JvcmRlcjogdGhpbiBzb2xpZCBibHVlOworfQoraDEgeworYmFja2dyb3VuZDogZ3JlZW47CittYXJnaW46ICAzJSAgMyUgIDMlICAzJTsKK3BhZGRpbmc6IDMlIDMlIDMlIDMlOworYm9yZGVyOiB0aGluIHNvbGlkIGJsdWU7Cit9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGRpdj4KKyAgICA8aDE+SHRtbCA8ZW0+SGVhZDwvZW0+aW5nPC9oMT4KKyAgICA8cD5meno8L3A+CisgICAgPC9kaXY+CisgICAgPGgyPkh0bWwgSGVhZGluZzwvaDI+CisgICAgPHA+dGhpcyBkZW1vbnN0cmF0ZXMgc2V0dGluZyBib3JkZXJzLCBtYXJnaW5zIGJ5IHBlcmNlbnRhZ2UuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDgyMS5odG1sIGIvVGVzdEZpbGVzL1QwODIxLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAxZGQzZQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDgyMS5odG1sCkBAIC0wLDAgKzEsMjIgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorcCB7CitiYWNrZ3JvdW5kOiByZWQ7CittYXJnaW46IDMlIDMlIDMlIDMlOworLyogcGFkZGluZzogMyUgMyUgMyUgMyU7ICovCisvKm1hcmdpbjogMTBweCAxMHB4IDEwcHggMTBweDsKK3BhZGRpbmc6IDEwcHggMTBweCAxMHB4IDEwcHg7Ki8KK2JvcmRlcjogdGhpbiBzb2xpZCBibHVlOworfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxkaXY+CisgICAgPGgxPkh0bWwgPGVtPkhlYWQ8L2VtPmluZzwvaDE+CisgICAgPHA+Znp6PC9wPgorICAgIDwvZGl2PgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwPnRoaXMgZGVtb25zdHJhdGVzIHNldHRpbmcgYm9yZGVycywgbWFyZ2lucyBieSBwZXJjZW50YWdlLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA4MzAuaHRtbCBiL1Rlc3RGaWxlcy9UMDgzMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NDcyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA4MzAuaHRtbApAQCAtMCwwICsxLDM1IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2JvZHkgeworYmFja2dyb3VuZDogb3JhbmdlOworfQorZGl2IHsKK2JhY2tncm91bmQ6IHllbGxvdzsKK21hcmdpbjogMCUgMCUgMCUgMCU7Citib3JkZXI6IHRoaW4gc29saWQgcmVkOworcGFkZGluZzogMCUgMCUgMCUgMCU7Cit9CitwIHsKK2JhY2tncm91bmQ6IHJlZDsKK21hcmdpbjogMTJweCAxMnB4IDEycHggMTJweDsKK3BhZGRpbmc6IDRweCA0cHggNHB4IDRweDsKK2JvcmRlcjogdGhpbiBzb2xpZCBibHVlOworfQoraDEgeworYmFja2dyb3VuZDogZ3JlZW47CittYXJnaW46IDEycHggMTJweCAxMnB4IDEycHg7CitwYWRkaW5nOiA0cHggNHB4IDRweCA0cHg7Citib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsKK30KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8ZGl2PgorICAgIDxoMT5IdG1sIDxlbT5IZWFkPC9lbT5pbmc8L2gxPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8L2Rpdj4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cD5kZW1vbnN0cmF0ZXMgYm9yZGVycywgbWFyZ2lucyBieSBmaXhlZCBzaXplLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA4NDAuaHRtbCBiL1Rlc3RGaWxlcy9UMDg0MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MTI1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA4NDAuaHRtbApAQCAtMCwwICsxLDM3IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2JvZHkgeworYmFja2dyb3VuZDogb3JhbmdlOworfQorZGl2IHsKK2JhY2tncm91bmQ6IHllbGxvdzsKK21hcmdpbjogMCUgMCUgMCUgMCU7Citib3JkZXI6IHRoaW4gc29saWQgcmVkOworcGFkZGluZzogMTJweCAxMnB4IDEycHggMTJweDsKK30KK3AgeworYmFja2dyb3VuZDogcmVkOworbWFyZ2luOiA0cHggNHB4IDRweCA0cHg7CitwYWRkaW5nOiAycHggMnB4IDJweCAycHg7Citib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsKK30KK2gxIHsKK2JhY2tncm91bmQ6IGdyZWVuOworbWFyZ2luOiA0cHggNHB4IDE2cHggNHB4OworcGFkZGluZzogMnB4IDJweCAycHggMnB4OworYm9yZGVyOiB0aGluIHNvbGlkIGJsdWU7Cit9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGRpdj4KKyAgICA8aDE+SHRtbCA8ZW0+SGVhZDwvZW0+aW5nPC9oMT4KKyAgICA8cD5meno8L3A+CisgICAgPHA+YmFyPC9wPgorICAgIDxwPmJhejwvcD4KKyAgICA8L2Rpdj4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cD5kZW1vbnN0cmF0ZXMgYm9yZGVycywgbWFyZ2lucyBieSBmaXhlZCBzaXplLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA4NTAuaHRtbCBiL1Rlc3RGaWxlcy9UMDg1MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZTRmMWMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA4NTAuaHRtbApAQCAtMCwwICsxLDE2IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8ZGl2PgorICAgIDxoMT5IdG1sIDxlbT5IZWFkPC9lbT5pbmc8L2gxPgorICAgIDxwPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LiA8ZGl2IGRpc3BsYXk9J2lubGluZS1ibG9jayc+PHA+TWFlY2VuYXMgcG9ydHRpdG9yIGNvbmd1ZSBtYXNzYS48L3A+PHA+Znp6PC9wPjxwPmJhcjwvcD48L2Rpdj4gRnVzY2UgcG9zdWVyZSwgbWFnbmEgc2VkIHB1bHZpbmFyIHVsdHJpY2llcywgcHVydXMgbGVjdHVzIG1hbGVzdWFkYSBsaWJlcm8sIHNpdCBhbWV0IGNvbW1vZG8gbWFnbmEgZXJvcyBxdWlzIHVybmEuIE51bmMgdml2ZXJyYSBpbXBlcmRpZXQgZW5pbS4gRnVzY2UgZXN0LiBWaXZhbXVzIGEgdGVsbHVzLiBQZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzIGV0IG5ldHVzIGV0IG1hbGVzdWFkYSBmYW1lcyBhYyB0dXJwaXMgZWdlc3Rhcy4gUHJvaW4gcGhhcmV0cmEgbm9udW1teSBwZWRlLiBNYXVyaXMgZXQgb3JjaS4gQWVuZWFuIG5lYyBsb3JlbS4gSW4gcG9ydHRpdG9yLiBEb25lYyBsYW9yZWV0IG5vbnVtbXkgYXVndWUuIFN1c3BlbmRpc3NlIGR1aSBwdXJ1cywgc2NlbGVyaXNxdWUgYXQsIHZ1bHB1dGF0ZSB2aXRhZSwgcHJldGl1bSBtYXR0aXMsIG51bmMuIE1hdXJpcyBlZ2V0IG5lcXVlIGF0IHNlbSB2ZW5lbmF0aXMgZWxlaWZlbmQuIFV0IG5vbnVtbXkuIEZ1c2NlIGFsaXF1ZXQgcGVkZSBub24gcGVkZS4gU3VzcGVuZGlzc2UgZGFwaWJ1cyBsb3JlbSBwZWxsZW50ZXNxdWUgbWFnbmEuIEludGVnZXIgbnVsbGEuIERvbmVjIGJsYW5kaXQgZmV1Z2lhdCBsaWd1bGEuIERvbmVjIGhlbmRyZXJpdCwgZmVsaXMgZXQgaW1wZXJkaWV0IGV1aXNtb2QsIHB1cnVzIGlwc3VtIHByZXRpdW0gbWV0dXMsIGluIGxhY2luaWEgbnVsbGEgbmlzbCBlZ2V0IHNhcGllbi48L3A+CisgICAgPHA+YmFyPC9wPgorICAgIDxwPmJhejwvcD4KKyAgICA8L2Rpdj4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cD5kZW1vbnN0cmF0ZXMgYm9yZGVycywgbWFyZ2lucyBieSBmaXhlZCBzaXplLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA4NTEuaHRtbCBiL1Rlc3RGaWxlcy9UMDg1MS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OGNlNzcKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA4NTEuaHRtbApAQCAtMCwwICsxLDExIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8ZGl2PgorICAgIDxwPmFiYyA8ZGl2IGRpc3BsYXk9J2lubGluZS1ibG9jayc+PHA+ZGVmPC9wPjwvZGl2PjwvcD4KKyAgICA8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA4NjAuaHRtbCBiL1Rlc3RGaWxlcy9UMDg2MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTI3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA4NjAuaHRtbApAQCAtMCwwICsxLDE3IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8ZGl2PgorICAgIDxoMT5IdG1sIDxlbT5IZWFkPC9lbT5pbmc8L2gxPgorICAgIDxwPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LiBNYWVjZW5hcyBwb3J0dGl0b3IgY29uZ3VlIG1hc3NhLiBGdXNjZSBwb3N1ZXJlLCBtYWduYSBzZWQgcHVsdmluYXIgdWx0cmljaWVzLCBwdXJ1cyBsZWN0dXMgbWFsZXN1YWRhIGxpYmVybywgc2l0IGFtZXQgY29tbW9kbyBtYWduYSBlcm9zIHF1aXMgdXJuYS4gTnVuYyB2aXZlcnJhIGltcGVyZGlldCBlbmltLiBGdXNjZSBlc3QuIFZpdmFtdXMgYSB0ZWxsdXMuIFBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMgZXQgbmV0dXMgZXQgbWFsZXN1YWRhIGZhbWVzIGFjIHR1cnBpcyBlZ2VzdGFzLiBQcm9pbiBwaGFyZXRyYSBub251bW15IHBlZGUuIE1hdXJpcyBldCBvcmNpLiBBZW5lYW4gbmVjIGxvcmVtLiBJbiBwb3J0dGl0b3IuIERvbmVjIGxhb3JlZXQgbm9udW1teSBhdWd1ZS4gU3VzcGVuZGlzc2UgZHVpIHB1cnVzLCBzY2VsZXJpc3F1ZSBhdCwgdnVscHV0YXRlIHZpdGFlLCBwcmV0aXVtIG1hdHRpcywgbnVuYy4gTWF1cmlzIGVnZXQgbmVxdWUgYXQgc2VtIHZlbmVuYXRpcyBlbGVpZmVuZC4gVXQgbm9udW1teS4gRnVzY2UgYWxpcXVldCBwZWRlIG5vbiBwZWRlLiBTdXNwZW5kaXNzZSBkYXBpYnVzIGxvcmVtIHBlbGxlbnRlc3F1ZSBtYWduYS4gSW50ZWdlciBudWxsYS4gRG9uZWMgYmxhbmRpdCBmZXVnaWF0IGxpZ3VsYS4gRG9uZWMgaGVuZHJlcml0LCBmZWxpcyBldCBpbXBlcmRpZXQgZXVpc21vZCwgcHVydXMgaXBzdW0gcHJldGl1bSBtZXR1cywgaW4gbGFjaW5pYSBudWxsYSBuaXNsIGVnZXQgc2FwaWVuLjwvcD4KKyAgICA8cD5iYXI8L3A+CisgICAgPHA+YmF6PC9wPgorICAgIDxwIHN0eWxlPSdwb3NpdGlvbjpmaXhlZDsgYm90dG9tOiAxMHB4OyByaWdodDogMTBweDsgYmFja2dyb3VuZDogcmVkOyBib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsgJz5UZXN0PC9wPgorICAgIDwvZGl2PgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwPmRlbW9uc3RyYXRlcyBib3JkZXJzLCBtYXJnaW5zIGJ5IGZpeGVkIHNpemUuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDg3MC5odG1sIGIvVGVzdEZpbGVzL1QwODcwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlOGVjNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDg3MC5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+YW5vbiB0ZXh0IGludGVycnVwdGVkIGJ5IGEgYmxvY2s8L3RpdGxlPgorPHN0eWxlPgorcCB7IGRpc3BsYXk6IGlubGluZTsgYm9yZGVyOiAgdGhpbiBzb2xpZCBibHVlOyB9CitzcGFuIHsgZGlzcGxheTogYmxvY2sgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+Cit0aGlzIGlzIGFub255bW91cyB0ZXh0IGJlZm9yZSB0aGUgc3Bhbi4gIDxzcGFuPlRoaXMgaXMgdGhlIGNvbnRlbnQgb2YgU1BBTi48L3NwYW4+ICB0aGlzIGlzIGFub255bW91cyB0ZXh0IGFmdGVyIHRoZSBzcGFuLgorPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDg4MC5odG1sIGIvVGVzdEZpbGVzL1QwODgwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyYjYxNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDg4MC5odG1sCkBAIC0wLDAgKzEsOSBAQAorPGh0bWw+Cis8aGVhZC8+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cCBzdHlsZT0ncG9zaXRpb246IHJlbGF0aXZlOyB0b3A6MjAwcHg7IGxlZnQ6MjAwcHg7IGJvcmRlcjp0aGluIHNvbGlkIGJsdWU7Jz50aGlzIGlzIHBvc2l0aW9uZWQgcmVsYXRpdmU8L3A+CisgICAgPGgyPkh0bWwgSGVhZGluZzwvaDI+CisgICAgPHA+Znp6PC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDg5MC5odG1sIGIvVGVzdEZpbGVzL1QwODkwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkYWRjYwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDg5MC5odG1sCkBAIC0wLDAgKzEsOSBAQAorPGh0bWw+Cis8aGVhZC8+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cCBzdHlsZT0ncG9zaXRpb246IGFic29sdXRlOyB0b3A6MHB4OyBsZWZ0OjBweDsgYm9yZGVyOnRoaW4gc29saWQgYmx1ZTsnPlRoaXMgaXMgcG9zaXRpb25lZCBhYnNvbHV0ZS4gIEl0IGlzIHRha2VuIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cuPC9wPgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwPmZ6ejwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA5MDAuaHRtbCBiL1Rlc3RGaWxlcy9UMDkwMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTVkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA5MDAuaHRtbApAQCAtMCwwICsxLDM4IEBACis8aHRtbD4KKzxoZWFkLz4KKzxib2R5PgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgIDxwIHN0eWxlPSdiYWNrZ3JvdW5kOiB5ZWxsb3c7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyc+VGhpcyBpcyBhIHRlc3QuPC9wPgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDkxMC5odG1sIGIvVGVzdEZpbGVzL1QwOTEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllNWQ1NAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDkxMC5odG1sCkBAIC0wLDAgKzEsMzggQEAKKzxodG1sPgorPGhlYWQvPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHAgc3R5bGU9J2JhY2tncm91bmQ6IHllbGxvdzsgYm9yZGVyOiB0aGluIHNvbGlkIGJsdWU7Jz5UaGlzIGlzIGEgdGVzdC48L3A+CisgICAgPGgyPkh0bWwgSGVhZGluZzwvaDI+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cD5meno8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTIwLmh0bWwgYi9UZXN0RmlsZXMvVDA5MjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTljZjYxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTIwLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitwIHsgd2lkdGg6IDEwZW07IGJvcmRlcjogc29saWQgYXF1YTsgfQorc3BhbiB7IHdpZHRoOiA1ZW07IGhlaWdodDogNSBlbTsgYm9yZGVyOiBzb2xpZCBibHVlOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+Cis8cD4KKzxzcGFuPiA8L3NwYW4+CitTdXBlcmNhbGlmcmFnaWxpc3RpY2V4cGlhbGlkb2Npb3VzCis8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTIxLmh0bWwgYi9UZXN0RmlsZXMvVDA5MjEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzcxODc2Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTIxLmh0bWwKQEAgLTAsMCArMSwxMCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD48aW1nIHNyYz0iVDA5MjFfZmlsZXMvaW1nLnBuZyIvPjwvcD4KKzxwPk9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBUbyBjaGFuZ2UgdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LCBjaG9vc2UgbmV3IFRoZW1lIGVsZW1lbnRzIG9uIHRoZSBQYWdlIExheW91dCB0YWIuIFRvIGNoYW5nZSB0aGUgbG9va3MgYXZhaWxhYmxlIGluIHRoZSBRdWljayBTdHlsZSBnYWxsZXJ5LCB1c2UgdGhlIENoYW5nZSBDdXJyZW50IFF1aWNrIFN0eWxlIFNldCBjb21tYW5kLiBCb3RoIHRoZSBUaGVtZXMgZ2FsbGVyeSBhbmQgdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IHByb3ZpZGUgcmVzZXQgY29tbWFuZHMgc28gdGhhdCB5b3UgY2FuIGFsd2F5cyByZXN0b3JlIHRoZSBsb29rIG9mIHlvdXIgZG9jdW1lbnQgdG8gdGhlIG9yaWdpbmFsIGNvbnRhaW5lZCBpbiB5b3VyIGN1cnJlbnQgdGVtcGxhdGUuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA5MjFfZmlsZXMvaW1nLlBORyBiL1Rlc3RGaWxlcy9UMDkyMV9maWxlcy9pbWcuUE5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzN2FkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA5MjFfZmlsZXMvaW1nLlBORwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA5MjIuaHRtbCBiL1Rlc3RGaWxlcy9UMDkyMi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MDkzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA5MjIuaHRtbApAQCAtMCwwICsxLDEwIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxpbWcgc3JjPSJUMDkyMl9maWxlcy9pbWcucG5nIi8+Cis8cD5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gVG8gY2hhbmdlIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudCwgY2hvb3NlIG5ldyBUaGVtZSBlbGVtZW50cyBvbiB0aGUgUGFnZSBMYXlvdXQgdGFiLiBUbyBjaGFuZ2UgdGhlIGxvb2tzIGF2YWlsYWJsZSBpbiB0aGUgUXVpY2sgU3R5bGUgZ2FsbGVyeSwgdXNlIHRoZSBDaGFuZ2UgQ3VycmVudCBRdWljayBTdHlsZSBTZXQgY29tbWFuZC4gQm90aCB0aGUgVGhlbWVzIGdhbGxlcnkgYW5kIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBwcm92aWRlIHJlc2V0IGNvbW1hbmRzIHNvIHRoYXQgeW91IGNhbiBhbHdheXMgcmVzdG9yZSB0aGUgbG9vayBvZiB5b3VyIGRvY3VtZW50IHRvIHRoZSBvcmlnaW5hbCBjb250YWluZWQgaW4geW91ciBjdXJyZW50IHRlbXBsYXRlLiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTIyX2ZpbGVzL2ltZy5QTkcgYi9UZXN0RmlsZXMvVDA5MjJfZmlsZXMvaW1nLlBORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzdhZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTIyX2ZpbGVzL2ltZy5QTkcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTIzLmh0bWwgYi9UZXN0RmlsZXMvVDA5MjMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjM5ZjcwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTIzLmh0bWwKQEAgLTAsMCArMSw5IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPjxpbWcgc3JjPSJUMDkyM19maWxlcy9pbWcucG5nIi8+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIFRvIGNoYW5nZSB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQsIGNob29zZSBuZXcgVGhlbWUgZWxlbWVudHMgb24gdGhlIFBhZ2UgTGF5b3V0IHRhYi4gVG8gY2hhbmdlIHRoZSBsb29rcyBhdmFpbGFibGUgaW4gdGhlIFF1aWNrIFN0eWxlIGdhbGxlcnksIHVzZSB0aGUgQ2hhbmdlIEN1cnJlbnQgUXVpY2sgU3R5bGUgU2V0IGNvbW1hbmQuIEJvdGggdGhlIFRoZW1lcyBnYWxsZXJ5IGFuZCB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgcHJvdmlkZSByZXNldCBjb21tYW5kcyBzbyB0aGF0IHlvdSBjYW4gYWx3YXlzIHJlc3RvcmUgdGhlIGxvb2sgb2YgeW91ciBkb2N1bWVudCB0byB0aGUgb3JpZ2luYWwgY29udGFpbmVkIGluIHlvdXIgY3VycmVudCB0ZW1wbGF0ZS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDkyNC5odG1sIGIvVGVzdEZpbGVzL1QwOTI0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2MDY4ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDkyNC5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoraW1nIHsgZmxvYXQ6IGxlZnQ7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPjxpbWcgc3JjPSJUMDkyNF9maWxlcy9pbWcucG5nIi8+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIFRvIGNoYW5nZSB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQsIGNob29zZSBuZXcgVGhlbWUgZWxlbWVudHMgb24gdGhlIFBhZ2UgTGF5b3V0IHRhYi4gVG8gY2hhbmdlIHRoZSBsb29rcyBhdmFpbGFibGUgaW4gdGhlIFF1aWNrIFN0eWxlIGdhbGxlcnksIHVzZSB0aGUgQ2hhbmdlIEN1cnJlbnQgUXVpY2sgU3R5bGUgU2V0IGNvbW1hbmQuIEJvdGggdGhlIFRoZW1lcyBnYWxsZXJ5IGFuZCB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgcHJvdmlkZSByZXNldCBjb21tYW5kcyBzbyB0aGF0IHlvdSBjYW4gYWx3YXlzIHJlc3RvcmUgdGhlIGxvb2sgb2YgeW91ciBkb2N1bWVudCB0byB0aGUgb3JpZ2luYWwgY29udGFpbmVkIGluIHlvdXIgY3VycmVudCB0ZW1wbGF0ZS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBUbyBjaGFuZ2UgdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LCBjaG9vc2UgbmV3IFRoZW1lIGVsZW1lbnRzIG9uIHRoZSBQYWdlIExheW91dCB0YWIuIFRvIGNoYW5nZSB0aGUgbG9va3MgYXZhaWxhYmxlIGluIHRoZSBRdWljayBTdHlsZSBnYWxsZXJ5LCB1c2UgdGhlIENoYW5nZSBDdXJyZW50IFF1aWNrIFN0eWxlIFNldCBjb21tYW5kLiBCb3RoIHRoZSBUaGVtZXMgZ2FsbGVyeSBhbmQgdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IHByb3ZpZGUgcmVzZXQgY29tbWFuZHMgc28gdGhhdCB5b3UgY2FuIGFsd2F5cyByZXN0b3JlIHRoZSBsb29rIG9mIHlvdXIgZG9jdW1lbnQgdG8gdGhlIG9yaWdpbmFsIGNvbnRhaW5lZCBpbiB5b3VyIGN1cnJlbnQgdGVtcGxhdGUuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gVG8gY2hhbmdlIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudCwgY2hvb3NlIG5ldyBUaGVtZSBlbGVtZW50cyBvbiB0aGUgUGFnZSBMYXlvdXQgdGFiLiBUbyBjaGFuZ2UgdGhlIGxvb2tzIGF2YWlsYWJsZSBpbiB0aGUgUXVpY2sgU3R5bGUgZ2FsbGVyeSwgdXNlIHRoZSBDaGFuZ2UgQ3VycmVudCBRdWljayBTdHlsZSBTZXQgY29tbWFuZC4gQm90aCB0aGUgVGhlbWVzIGdhbGxlcnkgYW5kIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBwcm92aWRlIHJlc2V0IGNvbW1hbmRzIHNvIHRoYXQgeW91IGNhbiBhbHdheXMgcmVzdG9yZSB0aGUgbG9vayBvZiB5b3VyIGRvY3VtZW50IHRvIHRoZSBvcmlnaW5hbCBjb250YWluZWQgaW4geW91ciBjdXJyZW50IHRlbXBsYXRlLiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTI0X2ZpbGVzL2ltZy5QTkcgYi9UZXN0RmlsZXMvVDA5MjRfZmlsZXMvaW1nLlBORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzdhZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTI0X2ZpbGVzL2ltZy5QTkcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTI1Lmh0bWwgYi9UZXN0RmlsZXMvVDA5MjUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTM1NmZmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTI1Lmh0bWwKQEAgLTAsMCArMSwxMCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitpbWcgeyBmbG9hdDogcmlnaHQ7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPjxpbWcgc3JjPSJUMDkyNV9maWxlcy9pbWcucG5nIi8+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIFRvIGNoYW5nZSB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQsIGNob29zZSBuZXcgVGhlbWUgZWxlbWVudHMgb24gdGhlIFBhZ2UgTGF5b3V0IHRhYi4gVG8gY2hhbmdlIHRoZSBsb29rcyBhdmFpbGFibGUgaW4gdGhlIFF1aWNrIFN0eWxlIGdhbGxlcnksIHVzZSB0aGUgQ2hhbmdlIEN1cnJlbnQgUXVpY2sgU3R5bGUgU2V0IGNvbW1hbmQuIEJvdGggdGhlIFRoZW1lcyBnYWxsZXJ5IGFuZCB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgcHJvdmlkZSByZXNldCBjb21tYW5kcyBzbyB0aGF0IHlvdSBjYW4gYWx3YXlzIHJlc3RvcmUgdGhlIGxvb2sgb2YgeW91ciBkb2N1bWVudCB0byB0aGUgb3JpZ2luYWwgY29udGFpbmVkIGluIHlvdXIgY3VycmVudCB0ZW1wbGF0ZS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBUbyBjaGFuZ2UgdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LCBjaG9vc2UgbmV3IFRoZW1lIGVsZW1lbnRzIG9uIHRoZSBQYWdlIExheW91dCB0YWIuIFRvIGNoYW5nZSB0aGUgbG9va3MgYXZhaWxhYmxlIGluIHRoZSBRdWljayBTdHlsZSBnYWxsZXJ5LCB1c2UgdGhlIENoYW5nZSBDdXJyZW50IFF1aWNrIFN0eWxlIFNldCBjb21tYW5kLiBCb3RoIHRoZSBUaGVtZXMgZ2FsbGVyeSBhbmQgdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IHByb3ZpZGUgcmVzZXQgY29tbWFuZHMgc28gdGhhdCB5b3UgY2FuIGFsd2F5cyByZXN0b3JlIHRoZSBsb29rIG9mIHlvdXIgZG9jdW1lbnQgdG8gdGhlIG9yaWdpbmFsIGNvbnRhaW5lZCBpbiB5b3VyIGN1cnJlbnQgdGVtcGxhdGUuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gVG8gY2hhbmdlIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudCwgY2hvb3NlIG5ldyBUaGVtZSBlbGVtZW50cyBvbiB0aGUgUGFnZSBMYXlvdXQgdGFiLiBUbyBjaGFuZ2UgdGhlIGxvb2tzIGF2YWlsYWJsZSBpbiB0aGUgUXVpY2sgU3R5bGUgZ2FsbGVyeSwgdXNlIHRoZSBDaGFuZ2UgQ3VycmVudCBRdWljayBTdHlsZSBTZXQgY29tbWFuZC4gQm90aCB0aGUgVGhlbWVzIGdhbGxlcnkgYW5kIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBwcm92aWRlIHJlc2V0IGNvbW1hbmRzIHNvIHRoYXQgeW91IGNhbiBhbHdheXMgcmVzdG9yZSB0aGUgbG9vayBvZiB5b3VyIGRvY3VtZW50IHRvIHRoZSBvcmlnaW5hbCBjb250YWluZWQgaW4geW91ciBjdXJyZW50IHRlbXBsYXRlLiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTI1X2ZpbGVzL2ltZy5QTkcgYi9UZXN0RmlsZXMvVDA5MjVfZmlsZXMvaW1nLlBORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzdhZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTI1X2ZpbGVzL2ltZy5QTkcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTI2Lmh0bWwgYi9UZXN0RmlsZXMvVDA5MjYuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDRhMDRlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTI2Lmh0bWwKQEAgLTAsMCArMSwxMSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitpbWcgeyBmbG9hdDogbGVmdDsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+PGltZyBzcmM9ImltZy5wbmciLz5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuPC9wPgorPHA+PGltZyBzcmM9ImltZzIucG5nIi8+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIFRvIGNoYW5nZSB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQsIGNob29zZSBuZXcgVGhlbWUgZWxlbWVudHMgb24gdGhlIFBhZ2UgTGF5b3V0IHRhYi4gVG8gY2hhbmdlIHRoZSBsb29rcyBhdmFpbGFibGUgaW4gdGhlIFF1aWNrIFN0eWxlIGdhbGxlcnksIHVzZSB0aGUgQ2hhbmdlIEN1cnJlbnQgUXVpY2sgU3R5bGUgU2V0IGNvbW1hbmQuIEJvdGggdGhlIFRoZW1lcyBnYWxsZXJ5IGFuZCB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgcHJvdmlkZSByZXNldCBjb21tYW5kcyBzbyB0aGF0IHlvdSBjYW4gYWx3YXlzIHJlc3RvcmUgdGhlIGxvb2sgb2YgeW91ciBkb2N1bWVudCB0byB0aGUgb3JpZ2luYWwgY29udGFpbmVkIGluIHlvdXIgY3VycmVudCB0ZW1wbGF0ZS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBUbyBjaGFuZ2UgdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LCBjaG9vc2UgbmV3IFRoZW1lIGVsZW1lbnRzIG9uIHRoZSBQYWdlIExheW91dCB0YWIuIFRvIGNoYW5nZSB0aGUgbG9va3MgYXZhaWxhYmxlIGluIHRoZSBRdWljayBTdHlsZSBnYWxsZXJ5LCB1c2UgdGhlIENoYW5nZSBDdXJyZW50IFF1aWNrIFN0eWxlIFNldCBjb21tYW5kLiBCb3RoIHRoZSBUaGVtZXMgZ2FsbGVyeSBhbmQgdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IHByb3ZpZGUgcmVzZXQgY29tbWFuZHMgc28gdGhhdCB5b3UgY2FuIGFsd2F5cyByZXN0b3JlIHRoZSBsb29rIG9mIHlvdXIgZG9jdW1lbnQgdG8gdGhlIG9yaWdpbmFsIGNvbnRhaW5lZCBpbiB5b3VyIGN1cnJlbnQgdGVtcGxhdGUuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gVG8gY2hhbmdlIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudCwgY2hvb3NlIG5ldyBUaGVtZSBlbGVtZW50cyBvbiB0aGUgUGFnZSBMYXlvdXQgdGFiLiBUbyBjaGFuZ2UgdGhlIGxvb2tzIGF2YWlsYWJsZSBpbiB0aGUgUXVpY2sgU3R5bGUgZ2FsbGVyeSwgdXNlIHRoZSBDaGFuZ2UgQ3VycmVudCBRdWljayBTdHlsZSBTZXQgY29tbWFuZC4gQm90aCB0aGUgVGhlbWVzIGdhbGxlcnkgYW5kIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBwcm92aWRlIHJlc2V0IGNvbW1hbmRzIHNvIHRoYXQgeW91IGNhbiBhbHdheXMgcmVzdG9yZSB0aGUgbG9vayBvZiB5b3VyIGRvY3VtZW50IHRvIHRoZSBvcmlnaW5hbCBjb250YWluZWQgaW4geW91ciBjdXJyZW50IHRlbXBsYXRlLiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTI3Lmh0bWwgYi9UZXN0RmlsZXMvVDA5MjcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDc2MTJmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTI3Lmh0bWwKQEAgLTAsMCArMSwxMiBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitpbWcuYSB7IGZsb2F0OiBsZWZ0OyB9CitpbWcuYiB7IGZsb2F0OiByaWdodDsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+PGltZyBjbGFzcz0iYSIgc3JjPSJpbWcucG5nIi8+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LjwvcD4KKzxwPjxpbWcgY2xhc3M9ImIiIHNyYz0iaW1nMi5wbmciLz5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gVG8gY2hhbmdlIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudCwgY2hvb3NlIG5ldyBUaGVtZSBlbGVtZW50cyBvbiB0aGUgUGFnZSBMYXlvdXQgdGFiLiBUbyBjaGFuZ2UgdGhlIGxvb2tzIGF2YWlsYWJsZSBpbiB0aGUgUXVpY2sgU3R5bGUgZ2FsbGVyeSwgdXNlIHRoZSBDaGFuZ2UgQ3VycmVudCBRdWljayBTdHlsZSBTZXQgY29tbWFuZC4gQm90aCB0aGUgVGhlbWVzIGdhbGxlcnkgYW5kIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBwcm92aWRlIHJlc2V0IGNvbW1hbmRzIHNvIHRoYXQgeW91IGNhbiBhbHdheXMgcmVzdG9yZSB0aGUgbG9vayBvZiB5b3VyIGRvY3VtZW50IHRvIHRoZSBvcmlnaW5hbCBjb250YWluZWQgaW4geW91ciBjdXJyZW50IHRlbXBsYXRlLiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIFRvIGNoYW5nZSB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQsIGNob29zZSBuZXcgVGhlbWUgZWxlbWVudHMgb24gdGhlIFBhZ2UgTGF5b3V0IHRhYi4gVG8gY2hhbmdlIHRoZSBsb29rcyBhdmFpbGFibGUgaW4gdGhlIFF1aWNrIFN0eWxlIGdhbGxlcnksIHVzZSB0aGUgQ2hhbmdlIEN1cnJlbnQgUXVpY2sgU3R5bGUgU2V0IGNvbW1hbmQuIEJvdGggdGhlIFRoZW1lcyBnYWxsZXJ5IGFuZCB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgcHJvdmlkZSByZXNldCBjb21tYW5kcyBzbyB0aGF0IHlvdSBjYW4gYWx3YXlzIHJlc3RvcmUgdGhlIGxvb2sgb2YgeW91ciBkb2N1bWVudCB0byB0aGUgb3JpZ2luYWwgY29udGFpbmVkIGluIHlvdXIgY3VycmVudCB0ZW1wbGF0ZS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBUbyBjaGFuZ2UgdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LCBjaG9vc2UgbmV3IFRoZW1lIGVsZW1lbnRzIG9uIHRoZSBQYWdlIExheW91dCB0YWIuIFRvIGNoYW5nZSB0aGUgbG9va3MgYXZhaWxhYmxlIGluIHRoZSBRdWljayBTdHlsZSBnYWxsZXJ5LCB1c2UgdGhlIENoYW5nZSBDdXJyZW50IFF1aWNrIFN0eWxlIFNldCBjb21tYW5kLiBCb3RoIHRoZSBUaGVtZXMgZ2FsbGVyeSBhbmQgdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IHByb3ZpZGUgcmVzZXQgY29tbWFuZHMgc28gdGhhdCB5b3UgY2FuIGFsd2F5cyByZXN0b3JlIHRoZSBsb29rIG9mIHlvdXIgZG9jdW1lbnQgdG8gdGhlIG9yaWdpbmFsIGNvbnRhaW5lZCBpbiB5b3VyIGN1cnJlbnQgdGVtcGxhdGUuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA5MjguaHRtbCBiL1Rlc3RGaWxlcy9UMDkyOC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMzY5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA5MjguaHRtbApAQCAtMCwwICsxLDEwIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2ltZyB7IGZsb2F0OiBsZWZ0OyB3aWR0aDogNDAwcHg7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPjxpbWcgc3JjPSJpbWcucG5nIi8+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIFRvIGNoYW5nZSB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQsIGNob29zZSBuZXcgVGhlbWUgZWxlbWVudHMgb24gdGhlIFBhZ2UgTGF5b3V0IHRhYi4gVG8gY2hhbmdlIHRoZSBsb29rcyBhdmFpbGFibGUgaW4gdGhlIFF1aWNrIFN0eWxlIGdhbGxlcnksIHVzZSB0aGUgQ2hhbmdlIEN1cnJlbnQgUXVpY2sgU3R5bGUgU2V0IGNvbW1hbmQuIEJvdGggdGhlIFRoZW1lcyBnYWxsZXJ5IGFuZCB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgcHJvdmlkZSByZXNldCBjb21tYW5kcyBzbyB0aGF0IHlvdSBjYW4gYWx3YXlzIHJlc3RvcmUgdGhlIGxvb2sgb2YgeW91ciBkb2N1bWVudCB0byB0aGUgb3JpZ2luYWwgY29udGFpbmVkIGluIHlvdXIgY3VycmVudCB0ZW1wbGF0ZS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBUbyBjaGFuZ2UgdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LCBjaG9vc2UgbmV3IFRoZW1lIGVsZW1lbnRzIG9uIHRoZSBQYWdlIExheW91dCB0YWIuIFRvIGNoYW5nZSB0aGUgbG9va3MgYXZhaWxhYmxlIGluIHRoZSBRdWljayBTdHlsZSBnYWxsZXJ5LCB1c2UgdGhlIENoYW5nZSBDdXJyZW50IFF1aWNrIFN0eWxlIFNldCBjb21tYW5kLiBCb3RoIHRoZSBUaGVtZXMgZ2FsbGVyeSBhbmQgdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IHByb3ZpZGUgcmVzZXQgY29tbWFuZHMgc28gdGhhdCB5b3UgY2FuIGFsd2F5cyByZXN0b3JlIHRoZSBsb29rIG9mIHlvdXIgZG9jdW1lbnQgdG8gdGhlIG9yaWdpbmFsIGNvbnRhaW5lZCBpbiB5b3VyIGN1cnJlbnQgdGVtcGxhdGUuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gVG8gY2hhbmdlIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudCwgY2hvb3NlIG5ldyBUaGVtZSBlbGVtZW50cyBvbiB0aGUgUGFnZSBMYXlvdXQgdGFiLiBUbyBjaGFuZ2UgdGhlIGxvb2tzIGF2YWlsYWJsZSBpbiB0aGUgUXVpY2sgU3R5bGUgZ2FsbGVyeSwgdXNlIHRoZSBDaGFuZ2UgQ3VycmVudCBRdWljayBTdHlsZSBTZXQgY29tbWFuZC4gQm90aCB0aGUgVGhlbWVzIGdhbGxlcnkgYW5kIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBwcm92aWRlIHJlc2V0IGNvbW1hbmRzIHNvIHRoYXQgeW91IGNhbiBhbHdheXMgcmVzdG9yZSB0aGUgbG9vayBvZiB5b3VyIGRvY3VtZW50IHRvIHRoZSBvcmlnaW5hbCBjb250YWluZWQgaW4geW91ciBjdXJyZW50IHRlbXBsYXRlLiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTI5Lmh0bWwgYi9UZXN0RmlsZXMvVDA5MjkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZiNzYzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTI5Lmh0bWwKQEAgLTAsMCArMSwxMCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitpbWcgeyBmbG9hdDogbGVmdDsgd2lkdGg6IDQwMHB4OyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD48aW1nIHNyYz0iaW1nLnBuZyIvPjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA5MzAuaHRtbCBiL1Rlc3RGaWxlcy9UMDkzMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OWQ0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA5MzAuaHRtbApAQCAtMCwwICsxLDEwIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2ltZyB7IGZsb2F0OiBsZWZ0OyBoZWlnaHQ6IDgwcHg7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPjxpbWcgc3JjPSJpbWcucG5nIi8+PC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDkzMS5odG1sIGIvVGVzdEZpbGVzL1QwOTMxLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1MDc1ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDkzMS5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoraW1nIHsgZmxvYXQ6IGxlZnQ7IGhlaWdodDogODBweDsgd2lkdGg6IDE2MHB4OyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD48aW1nIHNyYz0iaW1nLnBuZyIvPk9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBUbyBjaGFuZ2UgdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LCBjaG9vc2UgbmV3IFRoZW1lIGVsZW1lbnRzIG9uIHRoZSBQYWdlIExheW91dCB0YWIuIFRvIGNoYW5nZSB0aGUgbG9va3MgYXZhaWxhYmxlIGluIHRoZSBRdWljayBTdHlsZSBnYWxsZXJ5LCB1c2UgdGhlIENoYW5nZSBDdXJyZW50IFF1aWNrIFN0eWxlIFNldCBjb21tYW5kLiBCb3RoIHRoZSBUaGVtZXMgZ2FsbGVyeSBhbmQgdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IHByb3ZpZGUgcmVzZXQgY29tbWFuZHMgc28gdGhhdCB5b3UgY2FuIGFsd2F5cyByZXN0b3JlIHRoZSBsb29rIG9mIHlvdXIgZG9jdW1lbnQgdG8gdGhlIG9yaWdpbmFsIGNvbnRhaW5lZCBpbiB5b3VyIGN1cnJlbnQgdGVtcGxhdGUuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gVG8gY2hhbmdlIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudCwgY2hvb3NlIG5ldyBUaGVtZSBlbGVtZW50cyBvbiB0aGUgUGFnZSBMYXlvdXQgdGFiLiBUbyBjaGFuZ2UgdGhlIGxvb2tzIGF2YWlsYWJsZSBpbiB0aGUgUXVpY2sgU3R5bGUgZ2FsbGVyeSwgdXNlIHRoZSBDaGFuZ2UgQ3VycmVudCBRdWljayBTdHlsZSBTZXQgY29tbWFuZC4gQm90aCB0aGUgVGhlbWVzIGdhbGxlcnkgYW5kIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBwcm92aWRlIHJlc2V0IGNvbW1hbmRzIHNvIHRoYXQgeW91IGNhbiBhbHdheXMgcmVzdG9yZSB0aGUgbG9vayBvZiB5b3VyIGRvY3VtZW50IHRvIHRoZSBvcmlnaW5hbCBjb250YWluZWQgaW4geW91ciBjdXJyZW50IHRlbXBsYXRlLiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIFRvIGNoYW5nZSB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQsIGNob29zZSBuZXcgVGhlbWUgZWxlbWVudHMgb24gdGhlIFBhZ2UgTGF5b3V0IHRhYi4gVG8gY2hhbmdlIHRoZSBsb29rcyBhdmFpbGFibGUgaW4gdGhlIFF1aWNrIFN0eWxlIGdhbGxlcnksIHVzZSB0aGUgQ2hhbmdlIEN1cnJlbnQgUXVpY2sgU3R5bGUgU2V0IGNvbW1hbmQuIEJvdGggdGhlIFRoZW1lcyBnYWxsZXJ5IGFuZCB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgcHJvdmlkZSByZXNldCBjb21tYW5kcyBzbyB0aGF0IHlvdSBjYW4gYWx3YXlzIHJlc3RvcmUgdGhlIGxvb2sgb2YgeW91ciBkb2N1bWVudCB0byB0aGUgb3JpZ2luYWwgY29udGFpbmVkIGluIHlvdXIgY3VycmVudCB0ZW1wbGF0ZS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDkzMi5odG1sIGIvVGVzdEZpbGVzL1QwOTMyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1MDc1ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDkzMi5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoraW1nIHsgZmxvYXQ6IGxlZnQ7IGhlaWdodDogODBweDsgd2lkdGg6IDE2MHB4OyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD48aW1nIHNyYz0iaW1nLnBuZyIvPk9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBUbyBjaGFuZ2UgdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LCBjaG9vc2UgbmV3IFRoZW1lIGVsZW1lbnRzIG9uIHRoZSBQYWdlIExheW91dCB0YWIuIFRvIGNoYW5nZSB0aGUgbG9va3MgYXZhaWxhYmxlIGluIHRoZSBRdWljayBTdHlsZSBnYWxsZXJ5LCB1c2UgdGhlIENoYW5nZSBDdXJyZW50IFF1aWNrIFN0eWxlIFNldCBjb21tYW5kLiBCb3RoIHRoZSBUaGVtZXMgZ2FsbGVyeSBhbmQgdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IHByb3ZpZGUgcmVzZXQgY29tbWFuZHMgc28gdGhhdCB5b3UgY2FuIGFsd2F5cyByZXN0b3JlIHRoZSBsb29rIG9mIHlvdXIgZG9jdW1lbnQgdG8gdGhlIG9yaWdpbmFsIGNvbnRhaW5lZCBpbiB5b3VyIGN1cnJlbnQgdGVtcGxhdGUuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gVG8gY2hhbmdlIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudCwgY2hvb3NlIG5ldyBUaGVtZSBlbGVtZW50cyBvbiB0aGUgUGFnZSBMYXlvdXQgdGFiLiBUbyBjaGFuZ2UgdGhlIGxvb2tzIGF2YWlsYWJsZSBpbiB0aGUgUXVpY2sgU3R5bGUgZ2FsbGVyeSwgdXNlIHRoZSBDaGFuZ2UgQ3VycmVudCBRdWljayBTdHlsZSBTZXQgY29tbWFuZC4gQm90aCB0aGUgVGhlbWVzIGdhbGxlcnkgYW5kIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBwcm92aWRlIHJlc2V0IGNvbW1hbmRzIHNvIHRoYXQgeW91IGNhbiBhbHdheXMgcmVzdG9yZSB0aGUgbG9vayBvZiB5b3VyIGRvY3VtZW50IHRvIHRoZSBvcmlnaW5hbCBjb250YWluZWQgaW4geW91ciBjdXJyZW50IHRlbXBsYXRlLiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIFRvIGNoYW5nZSB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQsIGNob29zZSBuZXcgVGhlbWUgZWxlbWVudHMgb24gdGhlIFBhZ2UgTGF5b3V0IHRhYi4gVG8gY2hhbmdlIHRoZSBsb29rcyBhdmFpbGFibGUgaW4gdGhlIFF1aWNrIFN0eWxlIGdhbGxlcnksIHVzZSB0aGUgQ2hhbmdlIEN1cnJlbnQgUXVpY2sgU3R5bGUgU2V0IGNvbW1hbmQuIEJvdGggdGhlIFRoZW1lcyBnYWxsZXJ5IGFuZCB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgcHJvdmlkZSByZXNldCBjb21tYW5kcyBzbyB0aGF0IHlvdSBjYW4gYWx3YXlzIHJlc3RvcmUgdGhlIGxvb2sgb2YgeW91ciBkb2N1bWVudCB0byB0aGUgb3JpZ2luYWwgY29udGFpbmVkIGluIHlvdXIgY3VycmVudCB0ZW1wbGF0ZS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDkzMy5odG1sIGIvVGVzdEZpbGVzL1QwOTMzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhYzFkMAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDkzMy5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoraW1nIHsgZmxvYXQ6IGxlZnQ7IG1hcmdpbjogMjBweDsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+PGltZyBzcmM9ImltZy5wbmciLz5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gVG8gY2hhbmdlIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudCwgY2hvb3NlIG5ldyBUaGVtZSBlbGVtZW50cyBvbiB0aGUgUGFnZSBMYXlvdXQgdGFiLiBUbyBjaGFuZ2UgdGhlIGxvb2tzIGF2YWlsYWJsZSBpbiB0aGUgUXVpY2sgU3R5bGUgZ2FsbGVyeSwgdXNlIHRoZSBDaGFuZ2UgQ3VycmVudCBRdWljayBTdHlsZSBTZXQgY29tbWFuZC4gQm90aCB0aGUgVGhlbWVzIGdhbGxlcnkgYW5kIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBwcm92aWRlIHJlc2V0IGNvbW1hbmRzIHNvIHRoYXQgeW91IGNhbiBhbHdheXMgcmVzdG9yZSB0aGUgbG9vayBvZiB5b3VyIGRvY3VtZW50IHRvIHRoZSBvcmlnaW5hbCBjb250YWluZWQgaW4geW91ciBjdXJyZW50IHRlbXBsYXRlLiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIFRvIGNoYW5nZSB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQsIGNob29zZSBuZXcgVGhlbWUgZWxlbWVudHMgb24gdGhlIFBhZ2UgTGF5b3V0IHRhYi4gVG8gY2hhbmdlIHRoZSBsb29rcyBhdmFpbGFibGUgaW4gdGhlIFF1aWNrIFN0eWxlIGdhbGxlcnksIHVzZSB0aGUgQ2hhbmdlIEN1cnJlbnQgUXVpY2sgU3R5bGUgU2V0IGNvbW1hbmQuIEJvdGggdGhlIFRoZW1lcyBnYWxsZXJ5IGFuZCB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgcHJvdmlkZSByZXNldCBjb21tYW5kcyBzbyB0aGF0IHlvdSBjYW4gYWx3YXlzIHJlc3RvcmUgdGhlIGxvb2sgb2YgeW91ciBkb2N1bWVudCB0byB0aGUgb3JpZ2luYWwgY29udGFpbmVkIGluIHlvdXIgY3VycmVudCB0ZW1wbGF0ZS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBUbyBjaGFuZ2UgdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LCBjaG9vc2UgbmV3IFRoZW1lIGVsZW1lbnRzIG9uIHRoZSBQYWdlIExheW91dCB0YWIuIFRvIGNoYW5nZSB0aGUgbG9va3MgYXZhaWxhYmxlIGluIHRoZSBRdWljayBTdHlsZSBnYWxsZXJ5LCB1c2UgdGhlIENoYW5nZSBDdXJyZW50IFF1aWNrIFN0eWxlIFNldCBjb21tYW5kLiBCb3RoIHRoZSBUaGVtZXMgZ2FsbGVyeSBhbmQgdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IHByb3ZpZGUgcmVzZXQgY29tbWFuZHMgc28gdGhhdCB5b3UgY2FuIGFsd2F5cyByZXN0b3JlIHRoZSBsb29rIG9mIHlvdXIgZG9jdW1lbnQgdG8gdGhlIG9yaWdpbmFsIGNvbnRhaW5lZCBpbiB5b3VyIGN1cnJlbnQgdGVtcGxhdGUuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA5MzQuaHRtbCBiL1Rlc3RGaWxlcy9UMDkzNC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNGNiZjAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA5MzQuaHRtbApAQCAtMCwwICsxLDEwIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2ltZyB7IGZsb2F0OiBsZWZ0OyBtYXJnaW4tcmlnaHQ6IDI4cHg7IG1hcmdpbi1ib3R0b206IDIwcHg7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPjxpbWcgc3JjPSJpbWcucG5nIi8+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIFRvIGNoYW5nZSB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQsIGNob29zZSBuZXcgVGhlbWUgZWxlbWVudHMgb24gdGhlIFBhZ2UgTGF5b3V0IHRhYi4gVG8gY2hhbmdlIHRoZSBsb29rcyBhdmFpbGFibGUgaW4gdGhlIFF1aWNrIFN0eWxlIGdhbGxlcnksIHVzZSB0aGUgQ2hhbmdlIEN1cnJlbnQgUXVpY2sgU3R5bGUgU2V0IGNvbW1hbmQuIEJvdGggdGhlIFRoZW1lcyBnYWxsZXJ5IGFuZCB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgcHJvdmlkZSByZXNldCBjb21tYW5kcyBzbyB0aGF0IHlvdSBjYW4gYWx3YXlzIHJlc3RvcmUgdGhlIGxvb2sgb2YgeW91ciBkb2N1bWVudCB0byB0aGUgb3JpZ2luYWwgY29udGFpbmVkIGluIHlvdXIgY3VycmVudCB0ZW1wbGF0ZS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBUbyBjaGFuZ2UgdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LCBjaG9vc2UgbmV3IFRoZW1lIGVsZW1lbnRzIG9uIHRoZSBQYWdlIExheW91dCB0YWIuIFRvIGNoYW5nZSB0aGUgbG9va3MgYXZhaWxhYmxlIGluIHRoZSBRdWljayBTdHlsZSBnYWxsZXJ5LCB1c2UgdGhlIENoYW5nZSBDdXJyZW50IFF1aWNrIFN0eWxlIFNldCBjb21tYW5kLiBCb3RoIHRoZSBUaGVtZXMgZ2FsbGVyeSBhbmQgdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IHByb3ZpZGUgcmVzZXQgY29tbWFuZHMgc28gdGhhdCB5b3UgY2FuIGFsd2F5cyByZXN0b3JlIHRoZSBsb29rIG9mIHlvdXIgZG9jdW1lbnQgdG8gdGhlIG9yaWdpbmFsIGNvbnRhaW5lZCBpbiB5b3VyIGN1cnJlbnQgdGVtcGxhdGUuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gVG8gY2hhbmdlIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudCwgY2hvb3NlIG5ldyBUaGVtZSBlbGVtZW50cyBvbiB0aGUgUGFnZSBMYXlvdXQgdGFiLiBUbyBjaGFuZ2UgdGhlIGxvb2tzIGF2YWlsYWJsZSBpbiB0aGUgUXVpY2sgU3R5bGUgZ2FsbGVyeSwgdXNlIHRoZSBDaGFuZ2UgQ3VycmVudCBRdWljayBTdHlsZSBTZXQgY29tbWFuZC4gQm90aCB0aGUgVGhlbWVzIGdhbGxlcnkgYW5kIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBwcm92aWRlIHJlc2V0IGNvbW1hbmRzIHNvIHRoYXQgeW91IGNhbiBhbHdheXMgcmVzdG9yZSB0aGUgbG9vayBvZiB5b3VyIGRvY3VtZW50IHRvIHRoZSBvcmlnaW5hbCBjb250YWluZWQgaW4geW91ciBjdXJyZW50IHRlbXBsYXRlLiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTM1Lmh0bWwgYi9UZXN0RmlsZXMvVDA5MzUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjFkZTcyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTM1Lmh0bWwKQEAgLTAsMCArMSwxMCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitpbWcgeyBmbG9hdDogcmlnaHQ7IG1hcmdpbi1sZWZ0OiAyOHB4OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBtYXJnaW4tdG9wOiA4cHg7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwIHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+PGltZyBzcmM9ImltZy5wbmciLz5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gVG8gY2hhbmdlIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudCwgY2hvb3NlIG5ldyBUaGVtZSBlbGVtZW50cyBvbiB0aGUgUGFnZSBMYXlvdXQgdGFiLiBUbyBjaGFuZ2UgdGhlIGxvb2tzIGF2YWlsYWJsZSBpbiB0aGUgUXVpY2sgU3R5bGUgZ2FsbGVyeSwgdXNlIHRoZSBDaGFuZ2UgQ3VycmVudCBRdWljayBTdHlsZSBTZXQgY29tbWFuZC4gQm90aCB0aGUgVGhlbWVzIGdhbGxlcnkgYW5kIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBwcm92aWRlIHJlc2V0IGNvbW1hbmRzIHNvIHRoYXQgeW91IGNhbiBhbHdheXMgcmVzdG9yZSB0aGUgbG9vayBvZiB5b3VyIGRvY3VtZW50IHRvIHRoZSBvcmlnaW5hbCBjb250YWluZWQgaW4geW91ciBjdXJyZW50IHRlbXBsYXRlLiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIFRvIGNoYW5nZSB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQsIGNob29zZSBuZXcgVGhlbWUgZWxlbWVudHMgb24gdGhlIFBhZ2UgTGF5b3V0IHRhYi4gVG8gY2hhbmdlIHRoZSBsb29rcyBhdmFpbGFibGUgaW4gdGhlIFF1aWNrIFN0eWxlIGdhbGxlcnksIHVzZSB0aGUgQ2hhbmdlIEN1cnJlbnQgUXVpY2sgU3R5bGUgU2V0IGNvbW1hbmQuIEJvdGggdGhlIFRoZW1lcyBnYWxsZXJ5IGFuZCB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgcHJvdmlkZSByZXNldCBjb21tYW5kcyBzbyB0aGF0IHlvdSBjYW4gYWx3YXlzIHJlc3RvcmUgdGhlIGxvb2sgb2YgeW91ciBkb2N1bWVudCB0byB0aGUgb3JpZ2luYWwgY29udGFpbmVkIGluIHlvdXIgY3VycmVudCB0ZW1wbGF0ZS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBUbyBjaGFuZ2UgdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LCBjaG9vc2UgbmV3IFRoZW1lIGVsZW1lbnRzIG9uIHRoZSBQYWdlIExheW91dCB0YWIuIFRvIGNoYW5nZSB0aGUgbG9va3MgYXZhaWxhYmxlIGluIHRoZSBRdWljayBTdHlsZSBnYWxsZXJ5LCB1c2UgdGhlIENoYW5nZSBDdXJyZW50IFF1aWNrIFN0eWxlIFNldCBjb21tYW5kLiBCb3RoIHRoZSBUaGVtZXMgZ2FsbGVyeSBhbmQgdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IHByb3ZpZGUgcmVzZXQgY29tbWFuZHMgc28gdGhhdCB5b3UgY2FuIGFsd2F5cyByZXN0b3JlIHRoZSBsb29rIG9mIHlvdXIgZG9jdW1lbnQgdG8gdGhlIG9yaWdpbmFsIGNvbnRhaW5lZCBpbiB5b3VyIGN1cnJlbnQgdGVtcGxhdGUuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA5MzYuaHRtbCBiL1Rlc3RGaWxlcy9UMDkzNi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwN2VlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA5MzYuaHRtbApAQCAtMCwwICsxLDUyIEBACis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiIC8+Cis8bWV0YSBuYW1lPSJHZW5lcmF0b3IiIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDE1IChmaWx0ZXJlZCkiIC8+Cis8c3R5bGU+Cis8IS0tCisgLyogRm9udCBEZWZpbml0aW9ucyAqLworIEBmb250LWZhY2UKKwl7Zm9udC1mYW1pbHk6IkNhbWJyaWEgTWF0aCI7CisJcGFub3NlLTE6MiA0IDUgMyA1IDQgNiAzIDIgNDt9CitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OkNhbGlicmk7CisJcGFub3NlLTE6MiAxNSA1IDIgMiAyIDQgMyAyIDQ7fQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCisgcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAorCXttYXJnaW4tdG9wOjBpbjsKKwltYXJnaW4tcmlnaHQ6MGluOworCW1hcmdpbi1ib3R0b206OC4wcHQ7CisJbWFyZ2luLWxlZnQ6MGluOworCWxpbmUtaGVpZ2h0OjEwNyU7CisJZm9udC1zaXplOjExLjBwdDsKKwlmb250LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1zZXJpZjt9CisuTXNvQ2hwRGVmYXVsdAorCXtmb250LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1zZXJpZjt9CisuTXNvUGFwRGVmYXVsdAorCXttYXJnaW4tYm90dG9tOjguMHB0OworCWxpbmUtaGVpZ2h0OjEwNyU7fQorQHBhZ2UgV29yZFNlY3Rpb24xCisJe3NpemU6OC41aW4gMTEuMGluOworCW1hcmdpbjoxLjBpbiAxLjBpbiAxLjBpbiAxLjBpbjt9CitkaXYuV29yZFNlY3Rpb24xCisJe3BhZ2U6V29yZFNlY3Rpb24xO30KKy0tPgorPC9zdHlsZT4KKworPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyI+CisKKzxkaXYgY2xhc3M9IldvcmRTZWN0aW9uMSI+CisKKzxwIGNsYXNzPSJNc29Ob3JtYWwiPjxpbWcgd2lkdGg9IjMzMyIgaGVpZ2h0PSI1MiIgaWQ9IlBpY3R1cmUgMSIKK3NyYz0iVDA5MzZfZmlsZXMvaW1hZ2UwMDEucG5nIiAvPjwvcD4KKworPHAgY2xhc3M9Ik1zb05vcm1hbCI+VGhpcyBpcyBhIHRlc3QuPC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+CmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA5MzZfZmlsZXMvaW1hZ2UwMDEucG5nIGIvVGVzdEZpbGVzL1QwOTM2X2ZpbGVzL2ltYWdlMDAxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWFkYzQwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTM2X2ZpbGVzL2ltYWdlMDAxLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA5NDAuaHRtbCBiL1Rlc3RGaWxlcy9UMDk0MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMDkxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA5NDAuaHRtbApAQCAtMCwwICsxLDExIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2ltZyB7IG1hcmdpbjogMmVtIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPjxpbWcgc3R5bGU9ImZsb2F0OiBub25lOyIgc3JjPSJpbWcucG5nIi8+PC9wPgorPHA+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIFRvIGNoYW5nZSB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQsIGNob29zZSBuZXcgVGhlbWUgZWxlbWVudHMgb24gdGhlIFBhZ2UgTGF5b3V0IHRhYi4gVG8gY2hhbmdlIHRoZSBsb29rcyBhdmFpbGFibGUgaW4gdGhlIFF1aWNrIFN0eWxlIGdhbGxlcnksIHVzZSB0aGUgQ2hhbmdlIEN1cnJlbnQgUXVpY2sgU3R5bGUgU2V0IGNvbW1hbmQuIEJvdGggdGhlIFRoZW1lcyBnYWxsZXJ5IGFuZCB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgcHJvdmlkZSByZXNldCBjb21tYW5kcyBzbyB0aGF0IHlvdSBjYW4gYWx3YXlzIHJlc3RvcmUgdGhlIGxvb2sgb2YgeW91ciBkb2N1bWVudCB0byB0aGUgb3JpZ2luYWwgY29udGFpbmVkIGluIHlvdXIgY3VycmVudCB0ZW1wbGF0ZS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDk0NS5odG1sIGIvVGVzdEZpbGVzL1QwOTQ1Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0MGQ0MwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDk0NS5odG1sCkBAIC0wLDAgKzEsMTEgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorYm9keSwgcCwgaW1nIHsgbWFyZ2luOiAyZW0gfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+PGltZyBzdHlsZT0iZmxvYXQ6IG5vbmU7IiBzcmM9ImltZy5wbmciLz48L3A+Cis8cD5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gVG8gY2hhbmdlIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudCwgY2hvb3NlIG5ldyBUaGVtZSBlbGVtZW50cyBvbiB0aGUgUGFnZSBMYXlvdXQgdGFiLiBUbyBjaGFuZ2UgdGhlIGxvb2tzIGF2YWlsYWJsZSBpbiB0aGUgUXVpY2sgU3R5bGUgZ2FsbGVyeSwgdXNlIHRoZSBDaGFuZ2UgQ3VycmVudCBRdWljayBTdHlsZSBTZXQgY29tbWFuZC4gQm90aCB0aGUgVGhlbWVzIGdhbGxlcnkgYW5kIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBwcm92aWRlIHJlc2V0IGNvbW1hbmRzIHNvIHRoYXQgeW91IGNhbiBhbHdheXMgcmVzdG9yZSB0aGUgbG9vayBvZiB5b3VyIGRvY3VtZW50IHRvIHRoZSBvcmlnaW5hbCBjb250YWluZWQgaW4geW91ciBjdXJyZW50IHRlbXBsYXRlLiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTQ4Lmh0bWwgYi9UZXN0RmlsZXMvVDA5NDguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2ZlMGNjCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTQ4Lmh0bWwKQEAgLTAsMCArMSwxMSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Citib2R5LCBwLCBpbWcgeyBtYXJnaW46IDJlbSB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD48aW1nIHN0eWxlPSJmbG9hdDogbGVmdDsgIiBzcmM9ImltZy5wbmciLz4KK09uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBUbyBjaGFuZ2UgdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LCBjaG9vc2UgbmV3IFRoZW1lIGVsZW1lbnRzIG9uIHRoZSBQYWdlIExheW91dCB0YWIuIFRvIGNoYW5nZSB0aGUgbG9va3MgYXZhaWxhYmxlIGluIHRoZSBRdWljayBTdHlsZSBnYWxsZXJ5LCB1c2UgdGhlIENoYW5nZSBDdXJyZW50IFF1aWNrIFN0eWxlIFNldCBjb21tYW5kLiBCb3RoIHRoZSBUaGVtZXMgZ2FsbGVyeSBhbmQgdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IHByb3ZpZGUgcmVzZXQgY29tbWFuZHMgc28gdGhhdCB5b3UgY2FuIGFsd2F5cyByZXN0b3JlIHRoZSBsb29rIG9mIHlvdXIgZG9jdW1lbnQgdG8gdGhlIG9yaWdpbmFsIGNvbnRhaW5lZCBpbiB5b3VyIGN1cnJlbnQgdGVtcGxhdGUuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiA8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTUwLmh0bWwgYi9UZXN0RmlsZXMvVDA5NTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDc0M2U2Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTUwLmh0bWwKQEAgLTAsMCArMSwxNCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Citib2R5LCBwLCBpbWcgeyBtYXJnaW46IDJlbSB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD4KKzxpbWcgc3JjPSJpbWcucG5nIiBhbHQ9ImlsbHVzdHJhdGUgZmxvYXRzIiBzdHlsZT0iZmxvYXQ6IGxlZnQ7Ii8+Cis8aW1nIHNyYz0iaW1nLnBuZyIgYWx0PSJpbGx1c3RyYXRlIGZsb2F0cyIgc3R5bGU9ImZsb2F0OiByaWdodDsiLz4KK09uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiBUbyBjaGFuZ2UgdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LCBjaG9vc2UgbmV3IFRoZW1lIGVsZW1lbnRzIG9uIHRoZSBQYWdlIExheW91dCB0YWIuIFRvIGNoYW5nZSB0aGUgbG9va3MgYXZhaWxhYmxlIGluIHRoZSBRdWljayBTdHlsZSBnYWxsZXJ5LCB1c2UgdGhlIENoYW5nZSBDdXJyZW50IFF1aWNrIFN0eWxlIFNldCBjb21tYW5kLiBCb3RoIHRoZSBUaGVtZXMgZ2FsbGVyeSBhbmQgdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IHByb3ZpZGUgcmVzZXQgY29tbWFuZHMgc28gdGhhdCB5b3UgY2FuIGFsd2F5cyByZXN0b3JlIHRoZSBsb29rIG9mIHlvdXIgZG9jdW1lbnQgdG8gdGhlIG9yaWdpbmFsIGNvbnRhaW5lZCBpbiB5b3VyIGN1cnJlbnQgdGVtcGxhdGUuIE9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudC4gWW91IGNhbiB1c2UgdGhlc2UgZ2FsbGVyaWVzIHRvIGluc2VydCB0YWJsZXMsIGhlYWRlcnMsIGZvb3RlcnMsIGxpc3RzLCBjb3ZlciBwYWdlcywgYW5kIG90aGVyIGRvY3VtZW50IGJ1aWxkaW5nIGJsb2Nrcy4gV2hlbiB5b3UgY3JlYXRlIHBpY3R1cmVzLCBjaGFydHMsIG9yIGRpYWdyYW1zLCB0aGV5IGFsc28gY29vcmRpbmF0ZSB3aXRoIHlvdXIgY3VycmVudCBkb2N1bWVudCBsb29rLiBZb3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgZG9jdW1lbnQgdGV4dCBieSBjaG9vc2luZyBhIGxvb2sgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIFF1aWNrIFN0eWxlcyBnYWxsZXJ5IG9uIHRoZSBIb21lIHRhYi4gWW91IGNhbiBhbHNvIGZvcm1hdCB0ZXh0IGRpcmVjdGx5IGJ5IHVzaW5nIHRoZSBvdGhlciBjb250cm9scyBvbiB0aGUgSG9tZSB0YWIuIE1vc3QgY29udHJvbHMgb2ZmZXIgYSBjaG9pY2Ugb2YgdXNpbmcgdGhlIGxvb2sgZnJvbSB0aGUgY3VycmVudCB0aGVtZSBvciB1c2luZyBhIGZvcm1hdCB0aGF0IHlvdSBzcGVjaWZ5IGRpcmVjdGx5LiAKKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA5NTUuaHRtbCBiL1Rlc3RGaWxlcy9UMDk1NS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjgxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA5NTUuaHRtbApAQCAtMCwwICsxLDIyIEBACis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkEgZnJhbWUgZG9jdW1lbnQgd2l0aCBDU1MgMi4xPC9USVRMRT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiI+Citib2R5IHsgaGVpZ2h0OiA4LjVpbiB9IAorI2hlYWRlciB7Cit3aWR0aDogMTAwJTsKK2hlaWdodDogMTUlOwordG9wOiAwOworcmlnaHQ6IDA7Citib3R0b206IGF1dG87CitsZWZ0OiAwOworfQorPC9zdHlsZT4KKzwvSEVBRD4KKzxCT0RZPgorPERJViBpZD0iaGVhZGVyIiBzdHlsZT0iYmFja2dyb3VuZDogYXF1YTsgYm9yZGVyOiB0aGluIHNvbGlkIGJsdWU7IHBhZGRpbmc6IDFlbTsiPkhlYWRlciBpbmZvLiAgSGVhZGVyIGluZm8uICBIZWFkZXIgaW5mby4gIEhlYWRlciBpbmZvLiAgSGVhZGVyIGluZm8uICBIZWFkZXIgaW5mby4gIEhlYWRlciBpbmZvLiAgSGVhZGVyIGluZm8uICBIZWFkZXIgaW5mby4gIEhlYWRlciBpbmZvLiAgSGVhZGVyIGluZm8uICBIZWFkZXIgaW5mby4gIEhlYWRlciBpbmZvLiAgSGVhZGVyIGluZm8uICBIZWFkZXIgaW5mby4gIDwvRElWPgorPERJViBpZD0ic2lkZWJhciIgc3R5bGU9ImJhY2tncm91bmQ6IGdyZWVuOyBjb2xvcjogd2hpdGU7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyBwYWRkaW5nOiAxZW07Ij5TaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiBTaWRlYmFyLiA8L0RJVj4KKzxESVYgaWQ9Im1haW4iIHN0eWxlPSJiYWNrZ3JvdW5kOiBvcmFuZ2U7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyBwYWRkaW5nOiAxZW07Ij5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS4gVG8gY2hhbmdlIHRoZSBvdmVyYWxsIGxvb2sgb2YgeW91ciBkb2N1bWVudCwgY2hvb3NlIG5ldyBUaGVtZSBlbGVtZW50cyBvbiB0aGUgUGFnZSBMYXlvdXQgdGFiLiBUbyBjaGFuZ2UgdGhlIGxvb2tzIGF2YWlsYWJsZSBpbiB0aGUgUXVpY2sgU3R5bGUgZ2FsbGVyeSwgdXNlIHRoZSBDaGFuZ2UgQ3VycmVudCBRdWljayBTdHlsZSBTZXQgY29tbWFuZC4gQm90aCB0aGUgVGhlbWVzIGdhbGxlcnkgYW5kIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBwcm92aWRlIHJlc2V0IGNvbW1hbmRzIHNvIHRoYXQgeW91IGNhbiBhbHdheXMgcmVzdG9yZSB0aGUgbG9vayBvZiB5b3VyIGRvY3VtZW50IHRvIHRoZSBvcmlnaW5hbCBjb250YWluZWQgaW4geW91ciBjdXJyZW50IHRlbXBsYXRlLiBPbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHRoZXNlIGdhbGxlcmllcyB0byBpbnNlcnQgdGFibGVzLCBoZWFkZXJzLCBmb290ZXJzLCBsaXN0cywgY292ZXIgcGFnZXMsIGFuZCBvdGhlciBkb2N1bWVudCBidWlsZGluZyBibG9ja3MuIFdoZW4geW91IGNyZWF0ZSBwaWN0dXJlcywgY2hhcnRzLCBvciBkaWFncmFtcywgdGhleSBhbHNvIGNvb3JkaW5hdGUgd2l0aCB5b3VyIGN1cnJlbnQgZG9jdW1lbnQgbG9vay4gWW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mIHNlbGVjdGVkIHRleHQgaW4gdGhlIGRvY3VtZW50IHRleHQgYnkgY2hvb3NpbmcgYSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSBRdWljayBTdHlsZXMgZ2FsbGVyeSBvbiB0aGUgSG9tZSB0YWIuIFlvdSBjYW4gYWxzbyBmb3JtYXQgdGV4dCBkaXJlY3RseSBieSB1c2luZyB0aGUgb3RoZXIgY29udHJvbHMgb24gdGhlIEhvbWUgdGFiLiBNb3N0IGNvbnRyb2xzIG9mZmVyIGEgY2hvaWNlIG9mIHVzaW5nIHRoZSBsb29rIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUgb3IgdXNpbmcgYSBmb3JtYXQgdGhhdCB5b3Ugc3BlY2lmeSBkaXJlY3RseS48L0RJVj4KKzxESVYgaWQ9ImZvb3RlciIgc3R5bGU9ImJhY2tncm91bmQ6IHllbGxvdzsgYm9yZGVyOiB0aGluIHNvbGlkIGJsdWU7IHBhZGRpbmc6IDFlbTsiPkZvb3Rlci4gIEZvb3Rlci4gIEZvb3Rlci4gIEZvb3Rlci4gIEZvb3Rlci4gIEZvb3Rlci4gIEZvb3Rlci4gIEZvb3Rlci4gIEZvb3Rlci4gIEZvb3Rlci4gIEZvb3Rlci4gIEZvb3Rlci4gIEZvb3Rlci4gIEZvb3Rlci4gIEZvb3Rlci4gIEZvb3Rlci4gIDwvRElWPgorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTYwLmh0bWwgYi9UZXN0RmlsZXMvVDA5NjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJmYTgyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTYwLmh0bWwKQEAgLTAsMCArMSw0NiBAQAorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5BIGZyYW1lIGRvY3VtZW50IHdpdGggQ1NTIDIuMTwvVElUTEU+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iPgorYm9keSB7IGhlaWdodDogOC41aW4gfSAKKyNoZWFkZXIgeword2lkdGg6IDEwMCU7CitoZWlnaHQ6IDE1JTsKK3RvcDogMDsKK3JpZ2h0OiAwOworYm90dG9tOiBhdXRvOworbGVmdDogMDsKK30KKyNzaWRlYmFyIHsKK3dpZHRoOiAxMGVtOworaGVpZ2h0OiBhdXRvOwordG9wOiAxNSU7CityaWdodDogYXV0bzsKK2JvdHRvbTogMTAwcHg7CitsZWZ0OiAwOworfQorI21haW4geword2lkdGg6IGF1dG87CitoZWlnaHQ6IGF1dG87Cit0b3A6IDE1JTsKK3JpZ2h0OiAwOworYm90dG9tOiAxMDBweDsKK2xlZnQ6IDEwZW07Cit9CisjZm9vdGVyIHsKK3dpZHRoOiAxMDAlOworaGVpZ2h0OiAxMDBweDsKK3RvcDogYXV0bzsKK3JpZ2h0OiAwOworYm90dG9tOiAwOworbGVmdDogMDsKK30KKzwvc3R5bGU+Cis8L0hFQUQ+Cis8Qk9EWT4KKzxESVYgaWQ9ImhlYWRlciIgc3R5bGU9ImJhY2tncm91bmQ6IGFxdWE7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyBwYWRkaW5nOiAxZW07Ij5IZWFkZXIgaW5mby4gIEhlYWRlciBpbmZvLiAgSGVhZGVyIGluZm8uICBIZWFkZXIgaW5mby4gIEhlYWRlciBpbmZvLiAgSGVhZGVyIGluZm8uICBIZWFkZXIgaW5mby4gIEhlYWRlciBpbmZvLiAgSGVhZGVyIGluZm8uICBIZWFkZXIgaW5mby4gIEhlYWRlciBpbmZvLiAgSGVhZGVyIGluZm8uICBIZWFkZXIgaW5mby4gIEhlYWRlciBpbmZvLiAgSGVhZGVyIGluZm8uICA8L0RJVj4KKzxESVYgaWQ9InNpZGViYXIiIHN0eWxlPSJiYWNrZ3JvdW5kOiBncmVlbjsgY29sb3I6IHdoaXRlOyBib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsgcGFkZGluZzogMWVtOyI+U2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gU2lkZWJhci4gPC9ESVY+Cis8RElWIGlkPSJtYWluIiBzdHlsZT0iYmFja2dyb3VuZDogb3JhbmdlOyBib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsgcGFkZGluZzogMWVtOyI+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuIFRvIGNoYW5nZSB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQsIGNob29zZSBuZXcgVGhlbWUgZWxlbWVudHMgb24gdGhlIFBhZ2UgTGF5b3V0IHRhYi4gVG8gY2hhbmdlIHRoZSBsb29rcyBhdmFpbGFibGUgaW4gdGhlIFF1aWNrIFN0eWxlIGdhbGxlcnksIHVzZSB0aGUgQ2hhbmdlIEN1cnJlbnQgUXVpY2sgU3R5bGUgU2V0IGNvbW1hbmQuIEJvdGggdGhlIFRoZW1lcyBnYWxsZXJ5IGFuZCB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgcHJvdmlkZSByZXNldCBjb21tYW5kcyBzbyB0aGF0IHlvdSBjYW4gYWx3YXlzIHJlc3RvcmUgdGhlIGxvb2sgb2YgeW91ciBkb2N1bWVudCB0byB0aGUgb3JpZ2luYWwgY29udGFpbmVkIGluIHlvdXIgY3VycmVudCB0ZW1wbGF0ZS4gT24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBjb29yZGluYXRlIHdpdGggdGhlIG92ZXJhbGwgbG9vayBvZiB5b3VyIGRvY3VtZW50LiBZb3UgY2FuIHVzZSB0aGVzZSBnYWxsZXJpZXMgdG8gaW5zZXJ0IHRhYmxlcywgaGVhZGVycywgZm9vdGVycywgbGlzdHMsIGNvdmVyIHBhZ2VzLCBhbmQgb3RoZXIgZG9jdW1lbnQgYnVpbGRpbmcgYmxvY2tzLiBXaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suIFlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBvZiBzZWxlY3RlZCB0ZXh0IGluIHRoZSBkb2N1bWVudCB0ZXh0IGJ5IGNob29zaW5nIGEgbG9vayBmb3IgdGhlIHNlbGVjdGVkIHRleHQgZnJvbSB0aGUgUXVpY2sgU3R5bGVzIGdhbGxlcnkgb24gdGhlIEhvbWUgdGFiLiBZb3UgY2FuIGFsc28gZm9ybWF0IHRleHQgZGlyZWN0bHkgYnkgdXNpbmcgdGhlIG90aGVyIGNvbnRyb2xzIG9uIHRoZSBIb21lIHRhYi4gTW9zdCBjb250cm9scyBvZmZlciBhIGNob2ljZSBvZiB1c2luZyB0aGUgbG9vayBmcm9tIHRoZSBjdXJyZW50IHRoZW1lIG9yIHVzaW5nIGEgZm9ybWF0IHRoYXQgeW91IHNwZWNpZnkgZGlyZWN0bHkuPC9ESVY+Cis8RElWIGlkPSJmb290ZXIiIHN0eWxlPSJiYWNrZ3JvdW5kOiB5ZWxsb3c7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyBwYWRkaW5nOiAxZW07Ij5Gb290ZXIuICBGb290ZXIuICBGb290ZXIuICBGb290ZXIuICBGb290ZXIuICBGb290ZXIuICBGb290ZXIuICBGb290ZXIuICBGb290ZXIuICBGb290ZXIuICBGb290ZXIuICBGb290ZXIuICBGb290ZXIuICBGb290ZXIuICBGb290ZXIuICBGb290ZXIuICA8L0RJVj4KKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDk2OC5odG1sIGIvVGVzdEZpbGVzL1QwOTY4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyYjE4OQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDk2OC5odG1sCkBAIC0wLDAgKzEsMjcgQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+Q29tcGFyaXNvbiBvZiBwb3NpdGlvbmluZyBzY2hlbWVzPC90aXRsZT4KKzxzdHlsZT4KK2JvZHkgeworICBmb250LXNpemU6MTJweDsKKy8qICBsaW5lLWhlaWdodDogMjAwJTsKKyAgd2lkdGg6IDQwMHB4OworICBoZWlnaHQ6IDQwMHB4OyAqLworfQorLyoKK3AgeyBkaXNwbGF5OiBibG9jayB9CitzcGFuIHsgZGlzcGxheTogaW5saW5lIH0KKyovCisjb3V0ZXIgeyBjb2xvcjogcmVkIH0KKyNpbm5lciB7IGNvbG9yOiBibHVlIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPkJlZ2lubmluZyBvZiBib2R5IGNvbnRlbnRzLgorPHNwYW4gaWQ9Im91dGVyIj4gU3RhcnQgb2Ygb3V0ZXIgY29udGVudHMuCis8c3BhbiBpZD0iaW5uZXIiPiBJbm5lciBjb250ZW50cy48L3NwYW4+CitFbmQgb2Ygb3V0ZXIgY29udGVudHMuPC9zcGFuPgorRW5kIG9mIGJvZHkgY29udGVudHMuCis8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QwOTcwLmh0bWwgYi9UZXN0RmlsZXMvVDA5NzAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2Q3ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QwOTcwLmh0bWwKQEAgLTAsMCArMSwyMSBAQAorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5Db21wYXJpc29uIG9mIHBvc2l0aW9uaW5nIHNjaGVtZXM8L1RJVExFPgorPHN0eWxlPgorYm9keSB7IGRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6MTJweDsgbGluZS1oZWlnaHQ6IDIwMCU7Cit3aWR0aDogNDAwcHg7IGhlaWdodDogNDAwcHggfQorcCB7IGRpc3BsYXk6IGJsb2NrIH0KK3NwYW4geyBkaXNwbGF5OiBpbmxpbmUgfQorI291dGVyIHsgY29sb3I6IHJlZCB9CisjaW5uZXIgeyBjb2xvcjogYmx1ZSB9Cis8L3N0eWxlPgorPC9IRUFEPgorPEJPRFk+Cis8UD5CZWdpbm5pbmcgb2YgYm9keSBjb250ZW50cy4KKzxTUEFOIGlkPSJvdXRlciI+IFN0YXJ0IG9mIG91dGVyIGNvbnRlbnRzLgorPFNQQU4gaWQ9ImlubmVyIj4gSW5uZXIgY29udGVudHMuPC9TUEFOPgorRW5kIG9mIG91dGVyIGNvbnRlbnRzLjwvU1BBTj4KK0VuZCBvZiBib2R5IGNvbnRlbnRzLgorPC9QPgorPC9CT0RZPgorPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMDk4MC5odG1sIGIvVGVzdEZpbGVzL1QwOTgwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4NDkzNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMDk4MC5odG1sCkBAIC0wLDAgKzEsMjEgQEAKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+Q29tcGFyaXNvbiBvZiBwb3NpdGlvbmluZyBzY2hlbWVzPC9USVRMRT4KKzxzdHlsZT4KK2JvZHkgeyBkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOjEycHg7IGxpbmUtaGVpZ2h0OiAyMDAlOword2lkdGg6IDQwMHB4OyBoZWlnaHQ6IDQwMHB4IH0KK3AgeyBkaXNwbGF5OiBibG9jayB9CitzcGFuIHsgZGlzcGxheTogaW5saW5lIH0KKyNvdXRlciB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAtMTJweDsgY29sb3I6IHJlZCB9CisjaW5uZXIgeyBwb3NpdGlvbjogcmVsYXRpdmU7IHRvcDogMTJweDsgY29sb3I6IGJsdWUgfQorPC9zdHlsZT4KKzwvSEVBRD4KKzxCT0RZPgorPFA+QmVnaW5uaW5nIG9mIGJvZHkgY29udGVudHMuCis8U1BBTiBpZD0ib3V0ZXIiPiBTdGFydCBvZiBvdXRlciBjb250ZW50cy4KKzxTUEFOIGlkPSJpbm5lciI+IElubmVyIGNvbnRlbnRzLjwvU1BBTj4KK0VuZCBvZiBvdXRlciBjb250ZW50cy48L1NQQU4+CitFbmQgb2YgYm9keSBjb250ZW50cy4KKzwvUD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDA5OTAuaHRtbCBiL1Rlc3RGaWxlcy9UMDk5MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTUyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDA5OTAuaHRtbApAQCAtMCwwICsxLDIxIEBACis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkNvbXBhcmlzb24gb2YgcG9zaXRpb25pbmcgc2NoZW1lczwvVElUTEU+Cis8c3R5bGU+Citib2R5IHsgZGlzcGxheTogYmxvY2s7IGZvbnQtc2l6ZToxMnB4OyBsaW5lLWhlaWdodDogMjAwJTsKK3dpZHRoOiA0MDBweDsgaGVpZ2h0OiA0MDBweCB9CitwIHsgZGlzcGxheTogYmxvY2sgfQorc3BhbiB7IGRpc3BsYXk6IGlubGluZSB9Cisjb3V0ZXIgeyBjb2xvcjogcmVkIH0KKyNpbm5lciB7IGZsb2F0OiByaWdodDsgd2lkdGg6IDEzMHB4OyBjb2xvcjogYmx1ZSB9Cis8L3N0eWxlPgorPC9IRUFEPgorPEJPRFk+Cis8UD5CZWdpbm5pbmcgb2YgYm9keSBjb250ZW50cy4KKzxTUEFOIGlkPSJvdXRlciI+IFN0YXJ0IG9mIG91dGVyIGNvbnRlbnRzLgorPFNQQU4gaWQ9ImlubmVyIj4gSW5uZXIgY29udGVudHMuPC9TUEFOPgorRW5kIG9mIG91dGVyIGNvbnRlbnRzLjwvU1BBTj4KK0VuZCBvZiBib2R5IGNvbnRlbnRzLgorPC9QPgorPC9CT0RZPgorPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTAwMC5odG1sIGIvVGVzdEZpbGVzL1QxMDAwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcyNzdiNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTAwMC5odG1sCkBAIC0wLDAgKzEsMjMgQEAKKworPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5Db21wYXJpc29uIG9mIHBvc2l0aW9uaW5nIHNjaGVtZXM8L1RJVExFPgorPHN0eWxlPgorYm9keSB7IGRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6MTJweDsgbGluZS1oZWlnaHQ6IDIwMCU7Cit3aWR0aDogNDAwcHg7IGhlaWdodDogNDAwcHggfQorcCB7IGRpc3BsYXk6IGJsb2NrIH0KK3NwYW4geyBkaXNwbGF5OiBpbmxpbmUgfQorI2lubmVyIHsgZmxvYXQ6IHJpZ2h0OyB3aWR0aDogMTMwcHg7IGNvbG9yOiBibHVlIH0KKyNzaWJsaW5nIHsgY29sb3I6IHJlZCB9Cis8L3N0eWxlPgorPC9IRUFEPgorPEJPRFk+Cis8UD5CZWdpbm5pbmcgb2YgYm9keSBjb250ZW50cy4KKzxTUEFOIGlkPSJvdXRlciI+IFN0YXJ0IG9mIG91dGVyIGNvbnRlbnRzLgorPFNQQU4gaWQ9ImlubmVyIj4gSW5uZXIgY29udGVudHMuPC9TUEFOPgorPFNQQU4gaWQ9InNpYmxpbmciPiBTaWJsaW5nIGNvbnRlbnRzLjwvU1BBTj4KK0VuZCBvZiBvdXRlciBjb250ZW50cy48L1NQQU4+CitFbmQgb2YgYm9keSBjb250ZW50cy4KKzwvUD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDEwMTAuaHRtbCBiL1Rlc3RGaWxlcy9UMTAxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YWI0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDEwMTAuaHRtbApAQCAtMCwwICsxLDIzIEBACisKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+Q29tcGFyaXNvbiBvZiBwb3NpdGlvbmluZyBzY2hlbWVzPC9USVRMRT4KKzxzdHlsZT4KK2JvZHkgeyBkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOjEycHg7IGxpbmUtaGVpZ2h0OiAyMDAlOword2lkdGg6IDQwMHB4OyBoZWlnaHQ6IDQwMHB4IH0KK3AgeyBkaXNwbGF5OiBibG9jayB9CitzcGFuIHsgZGlzcGxheTogaW5saW5lIH0KKyNpbm5lciB7IGZsb2F0OiByaWdodDsgd2lkdGg6IDEzMHB4OyBjb2xvcjogYmx1ZSB9Cisjc2libGluZyB7IGNsZWFyOiByaWdodDsgY29sb3I6IHJlZCB9Cis8L3N0eWxlPgorPC9IRUFEPgorPEJPRFk+Cis8UD5CZWdpbm5pbmcgb2YgYm9keSBjb250ZW50cy4KKzxTUEFOIGlkPSJvdXRlciI+IFN0YXJ0IG9mIG91dGVyIGNvbnRlbnRzLgorPFNQQU4gaWQ9ImlubmVyIj4gSW5uZXIgY29udGVudHMuPC9TUEFOPgorPFNQQU4gaWQ9InNpYmxpbmciPiBTaWJsaW5nIGNvbnRlbnRzLjwvU1BBTj4KK0VuZCBvZiBvdXRlciBjb250ZW50cy48L1NQQU4+CitFbmQgb2YgYm9keSBjb250ZW50cy4KKzwvUD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDEwMjAuaHRtbCBiL1Rlc3RGaWxlcy9UMTAyMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZWMyY2QKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDEwMjAuaHRtbApAQCAtMCwwICsxLDI4IEBACisKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+Q29tcGFyaXNvbiBvZiBwb3NpdGlvbmluZyBzY2hlbWVzPC9USVRMRT4KKzxzdHlsZT4KK2JvZHkgeyBkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOjEycHg7IGxpbmUtaGVpZ2h0OiAyMDAlOword2lkdGg6IDQwMHB4OyBoZWlnaHQ6IDQwMHB4IH0KK3AgeyBkaXNwbGF5OiBibG9jayB9CitzcGFuIHsgZGlzcGxheTogaW5saW5lIH0KKyNvdXRlciB7Citwb3NpdGlvbjogYWJzb2x1dGU7Cit0b3A6IDIwMHB4OyBsZWZ0OiAyMDBweDsKK3dpZHRoOiAyMDBweDsKK2NvbG9yOiByZWQ7Cit9CisjaW5uZXIgeyBjb2xvcjogYmx1ZSB9Cis8L3N0eWxlPgorPC9IRUFEPgorPEJPRFk+Cis8UD5CZWdpbm5pbmcgb2YgYm9keSBjb250ZW50cy4KKzxTUEFOIGlkPSJvdXRlciI+IFN0YXJ0IG9mIG91dGVyIGNvbnRlbnRzLgorPFNQQU4gaWQ9ImlubmVyIj4gSW5uZXIgY29udGVudHMuPC9TUEFOPgorPFNQQU4gaWQ9InNpYmxpbmciPiBTaWJsaW5nIGNvbnRlbnRzLjwvU1BBTj4KK0VuZCBvZiBvdXRlciBjb250ZW50cy48L1NQQU4+CitFbmQgb2YgYm9keSBjb250ZW50cy4KKzwvUD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDEwMzAuaHRtbCBiL1Rlc3RGaWxlcy9UMTAzMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNTY1NTkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDEwMzAuaHRtbApAQCAtMCwwICsxLDMxIEBACisKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+Q29tcGFyaXNvbiBvZiBwb3NpdGlvbmluZyBzY2hlbWVzPC9USVRMRT4KKzxzdHlsZT4KK2JvZHkgeyBkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOjEycHg7IGxpbmUtaGVpZ2h0OiAyMDAlOword2lkdGg6IDQwMHB4OyBoZWlnaHQ6IDQwMHB4IH0KK3AgeyBkaXNwbGF5OiBibG9jayB9CitzcGFuIHsgZGlzcGxheTogaW5saW5lIH0KKyNvdXRlciB7Citwb3NpdGlvbjogcmVsYXRpdmU7Citjb2xvcjogcmVkCit9CisjaW5uZXIgeworcG9zaXRpb246IGFic29sdXRlOwordG9wOiAyMDBweDsgbGVmdDogLTEwMHB4OworaGVpZ2h0OiAxMzBweDsgd2lkdGg6IDEzMHB4OworY29sb3I6IGJsdWU7Cit9Cis8L3N0eWxlPgorPC9IRUFEPgorPEJPRFk+Cis8UD5CZWdpbm5pbmcgb2YgYm9keSBjb250ZW50cy4KKzxTUEFOIGlkPSJvdXRlciI+IFN0YXJ0IG9mIG91dGVyIGNvbnRlbnRzLgorPFNQQU4gaWQ9ImlubmVyIj4gSW5uZXIgY29udGVudHMuPC9TUEFOPgorPFNQQU4gaWQ9InNpYmxpbmciPiBTaWJsaW5nIGNvbnRlbnRzLjwvU1BBTj4KK0VuZCBvZiBvdXRlciBjb250ZW50cy48L1NQQU4+CitFbmQgb2YgYm9keSBjb250ZW50cy4KKzwvUD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDEwNDAuaHRtbCBiL1Rlc3RGaWxlcy9UMTA0MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OWY2ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDEwNDAuaHRtbApAQCAtMCwwICsxLDI4IEBACisKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+Q29tcGFyaXNvbiBvZiBwb3NpdGlvbmluZyBzY2hlbWVzPC9USVRMRT4KKzxzdHlsZT4KK2JvZHkgeyBkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOjEycHg7IGxpbmUtaGVpZ2h0OiAyMDAlOword2lkdGg6IDQwMHB4OyBoZWlnaHQ6IDQwMHB4IH0KK3AgeyBkaXNwbGF5OiBibG9jayB9CitzcGFuIHsgZGlzcGxheTogaW5saW5lIH0KKyNvdXRlciB7IGNvbG9yOiByZWQgfQorI2lubmVyIHsKK3Bvc2l0aW9uOiBhYnNvbHV0ZTsKK3RvcDogMjAwcHg7IGxlZnQ6IC0xMDBweDsKK2hlaWdodDogMTMwcHg7IHdpZHRoOiAxMzBweDsKK2NvbG9yOiBibHVlOworfQorPC9zdHlsZT4KKzwvSEVBRD4KKzxCT0RZPgorPFA+QmVnaW5uaW5nIG9mIGJvZHkgY29udGVudHMuCis8U1BBTiBpZD0ib3V0ZXIiPiBTdGFydCBvZiBvdXRlciBjb250ZW50cy4KKzxTUEFOIGlkPSJpbm5lciI+IElubmVyIGNvbnRlbnRzLjwvU1BBTj4KKzxTUEFOIGlkPSJzaWJsaW5nIj4gU2libGluZyBjb250ZW50cy48L1NQQU4+CitFbmQgb2Ygb3V0ZXIgY29udGVudHMuPC9TUEFOPgorRW5kIG9mIGJvZHkgY29udGVudHMuCis8L1A+Cis8L0JPRFk+Cis8L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMDUwLmh0bWwgYi9UZXN0RmlsZXMvVDEwNTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWJhYzE1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMDUwLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPFAgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTsgbWFyZ2luLXJpZ2h0OiAxMHB4OyBsZWZ0OiAxMHB4OyI+CitJIHVzZWQgdHdvIHJlZCBoeXBoZW5zIHRvIHNlcnZlIGFzIGEgY2hhbmdlIGJhci4gVGhleQord2lsbCAiZmxvYXQiIHRvIHRoZSBsZWZ0IG9mIHRoZSBsaW5lIGNvbnRhaW5pbmcgVEhJUworPFNQQU4gc3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiBhdXRvOyBsZWZ0OiAtMWVtOyBjb2xvcjogcmVkOyI+LS08L1NQQU4+Cit3b3JkLjwvUD4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cD5meno8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMDYwLmh0bWwgYi9UZXN0RmlsZXMvVDEwNjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzY1MGUzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMDYwLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitwLm5vdGU6YmVmb3JlIHsgY29udGVudDogIk5vdGU6ICIgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8aDI+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cCBjbGFzcz0ibm90ZSI+Znp6PC9wPgorICAgIDxwPmZ6ejwvcD4KKyAgICA8cCBjbGFzcz0ibm90ZSI+Znp6PC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTA3MC5odG1sIGIvVGVzdEZpbGVzL1QxMDcwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjODUyNwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTA3MC5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorYm9keSB7Citjb3VudGVyLXJlc2V0OiBjaGFwdGVyOyAKK30KK2gxOmJlZm9yZSB7Citjb250ZW50OiAiQ2hhcHRlciAiIGNvdW50ZXIoY2hhcHRlcikgIi4gIjsKK2NvdW50ZXItaW5jcmVtZW50OiBjaGFwdGVyOyAKK30KK2gxIHsKK2NvdW50ZXItcmVzZXQ6IHNlY3Rpb247IAorfQoraDI6YmVmb3JlIHsKK2NvbnRlbnQ6IGNvdW50ZXIoY2hhcHRlcikgIi4iIGNvdW50ZXIoc2VjdGlvbikgIiAiOworY291bnRlci1pbmNyZW1lbnQ6IHNlY3Rpb247Cit9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PC9wPgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwIGNsYXNzPSJub3RlIj5meno8L3A+CisgICAgPHA+Znp6PC9wPgorICAgIDxwIGNsYXNzPSJub3RlIj5meno8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMDgwLmh0bWwgYi9UZXN0RmlsZXMvVDEwODAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmU3MDE2Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMDgwLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorCis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkxvd2VyY2FzZSBsYXRpbiBudW1iZXJpbmc8L1RJVExFPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK29sIHsgbGlzdC1zdHlsZS10eXBlOiBsb3dlci1yb21hbiB9Cis8L3N0eWxlPgorPC9IRUFEPgorPEJPRFk+Cis8b2w+Cis8bGk+IFRoaXMgaXMgdGhlIGZpcnN0IGl0ZW0uPC9saT4KKzxsaT4gVGhpcyBpcyB0aGUgc2Vjb25kIGl0ZW0uPC9saT4KKzxsaT4gVGhpcyBpcyB0aGUgdGhpcmQgaXRlbS48L2xpPgorPC9vbD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDExMDAuaHRtbCBiL1Rlc3RGaWxlcy9UMTEwMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MWM3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDExMDAuaHRtbApAQCAtMCwwICsxLDEzIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2JvZHkgeyBmb250LWZhbWlseTogR2lsbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cD5meno8L3A+CisgICAgPGgyPkh0bWwgSGVhZGluZzwvaDI+CisgICAgPHA+Znp6PC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTExMC5odG1sIGIvVGVzdEZpbGVzL1QxMTEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5YzQ5MgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTExMC5odG1sCkBAIC0wLDAgKzEsMjAgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgIDxwIHN0eWxlPSJmb250LXNpemU6IHh4LXNtYWxsIj54eC1zbWFsbCBOb3cgaXMgdGhlIHRpbWUgZm9yIGFsbCBnb29kIG1lbiB0byBjb21lIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS48L3A+CisgICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogeC1zbWFsbCI+eC1zbWFsbCBOb3cgaXMgdGhlIHRpbWUgZm9yIGFsbCBnb29kIG1lbiB0byBjb21lIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS48L3A+CisgICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGwiPnNtYWxsIE5vdyBpcyB0aGUgdGltZSBmb3IgYWxsIGdvb2QgbWVuIHRvIGNvbWUgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LjwvcD4KKyAgICA8cCBzdHlsZT0iZm9udC1zaXplOiBtZWRpdW0iPm1lZGl1bSBOb3cgaXMgdGhlIHRpbWUgZm9yIGFsbCBnb29kIG1lbiB0byBjb21lIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS48L3A+CisgICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2UiPmxhcmdlIE5vdyBpcyB0aGUgdGltZSBmb3IgYWxsIGdvb2QgbWVuIHRvIGNvbWUgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LjwvcD4KKyAgICA8cCBzdHlsZT0iZm9udC1zaXplOiB4LWxhcmdlIj54LWxhcmdlIE5vdyBpcyB0aGUgdGltZSBmb3IgYWxsIGdvb2QgbWVuIHRvIGNvbWUgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LjwvcD4KKyAgICA8cCBzdHlsZT0iZm9udC1zaXplOiB4eC1sYXJnZSI+eHgtbGFyZ2UgTm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBtZW4gdG8gY29tZSB0byB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuPC9wPgorICAgIDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+bGFyZ2VyIE5vdyBpcyB0aGUgdGltZSBmb3IgYWxsIGdvb2QgbWVuIHRvIGNvbWUgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LjwvcD4KKyAgICA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj5zbWFsbGVyIE5vdyBpcyB0aGUgdGltZSBmb3IgYWxsIGdvb2QgbWVuIHRvIGNvbWUgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LjwvcD4KKyAgICA8cCBzdHlsZT0iZm9udC1zaXplOiA4MCUiPjgwJSBOb3cgaXMgdGhlIHRpbWUgZm9yIGFsbCBnb29kIG1lbiB0byBjb21lIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS48L3A+CisgICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogMTIwJSI+MTIwJSBOb3cgaXMgdGhlIHRpbWUgZm9yIGFsbCBnb29kIG1lbiB0byBjb21lIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMTExLmh0bWwgYi9UZXN0RmlsZXMvVDExMTEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzYwODc3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMTExLmh0bWwKQEAgLTAsMCArMSwxMzYgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorLmYwNiB7IGZvbnQtc2l6ZTogMDZwdDsgfQorLmYwNyB7IGZvbnQtc2l6ZTogMDdwdDsgfQorLmYwOCB7IGZvbnQtc2l6ZTogMDhwdDsgfQorLmYwOSB7IGZvbnQtc2l6ZTogMDlwdDsgfQorLmYxMCB7IGZvbnQtc2l6ZTogMTBwdDsgfQorLmYxMSB7IGZvbnQtc2l6ZTogMTFwdDsgfQorLmYxMiB7IGZvbnQtc2l6ZTogMTJwdDsgfQorLmYxMyB7IGZvbnQtc2l6ZTogMTNwdDsgfQorLmYxNCB7IGZvbnQtc2l6ZTogMTRwdDsgfQorLmYxNSB7IGZvbnQtc2l6ZTogMTVwdDsgfQorLmYxNiB7IGZvbnQtc2l6ZTogMTZwdDsgfQorLmYxNyB7IGZvbnQtc2l6ZTogMTdwdDsgfQorLmYxOCB7IGZvbnQtc2l6ZTogMThwdDsgfQorLmYxOSB7IGZvbnQtc2l6ZTogMTlwdDsgfQorLmYyMCB7IGZvbnQtc2l6ZTogMjBwdDsgfQorLmYyMSB7IGZvbnQtc2l6ZTogMjFwdDsgfQorLmYyMiB7IGZvbnQtc2l6ZTogMjJwdDsgfQorLmYyMyB7IGZvbnQtc2l6ZTogMjNwdDsgfQorLmYyNCB7IGZvbnQtc2l6ZTogMjRwdDsgfQorLmYyNSB7IGZvbnQtc2l6ZTogMjVwdDsgfQorLmYyNiB7IGZvbnQtc2l6ZTogMjZwdDsgfQorLmYyNyB7IGZvbnQtc2l6ZTogMjdwdDsgfQorLmYyOCB7IGZvbnQtc2l6ZTogMjhwdDsgfQorLmYyOSB7IGZvbnQtc2l6ZTogMjlwdDsgfQorLmYzMCB7IGZvbnQtc2l6ZTogMzBwdDsgfQorLmYzMSB7IGZvbnQtc2l6ZTogMzFwdDsgfQorLmYzMiB7IGZvbnQtc2l6ZTogMzJwdDsgfQorLmYzMyB7IGZvbnQtc2l6ZTogMzNwdDsgfQorLmYzNCB7IGZvbnQtc2l6ZTogMzRwdDsgfQorLmYzNSB7IGZvbnQtc2l6ZTogMzVwdDsgfQorLmYzNiB7IGZvbnQtc2l6ZTogMzZwdDsgfQorLmYzNyB7IGZvbnQtc2l6ZTogMzdwdDsgfQorLmYzOCB7IGZvbnQtc2l6ZTogMzhwdDsgfQorLmYzOSB7IGZvbnQtc2l6ZTogMzlwdDsgfQorLmY0MCB7IGZvbnQtc2l6ZTogNDBwdDsgfQorLmY0MSB7IGZvbnQtc2l6ZTogNDFwdDsgfQorLmY0MiB7IGZvbnQtc2l6ZTogNDJwdDsgfQorLmY0MyB7IGZvbnQtc2l6ZTogNDNwdDsgfQorLmY0NCB7IGZvbnQtc2l6ZTogNDRwdDsgfQorLmY0NSB7IGZvbnQtc2l6ZTogNDVwdDsgfQorLmY0NiB7IGZvbnQtc2l6ZTogNDZwdDsgfQorLmY0NyB7IGZvbnQtc2l6ZTogNDdwdDsgfQorLmY0OCB7IGZvbnQtc2l6ZTogNDhwdDsgfQorLmY0OSB7IGZvbnQtc2l6ZTogNDlwdDsgfQorLmY1MCB7IGZvbnQtc2l6ZTogNTBwdDsgfQorLmY1MSB7IGZvbnQtc2l6ZTogNTFwdDsgfQorLmY1MiB7IGZvbnQtc2l6ZTogNTJwdDsgfQorLmY1MyB7IGZvbnQtc2l6ZTogNTNwdDsgfQorLmY1NCB7IGZvbnQtc2l6ZTogNTRwdDsgfQorLmY1NSB7IGZvbnQtc2l6ZTogNTVwdDsgfQorLmY1NiB7IGZvbnQtc2l6ZTogNTZwdDsgfQorLmY1NyB7IGZvbnQtc2l6ZTogNTdwdDsgfQorLmY1OCB7IGZvbnQtc2l6ZTogNThwdDsgfQorLmY1OSB7IGZvbnQtc2l6ZTogNTlwdDsgfQorLmY2MCB7IGZvbnQtc2l6ZTogNjBwdDsgfQorLmY2MiB7IGZvbnQtc2l6ZTogNjJwdDsgfQorLmY2NCB7IGZvbnQtc2l6ZTogNjRwdDsgfQorLmY2NiB7IGZvbnQtc2l6ZTogNjZwdDsgfQorLmY2OCB7IGZvbnQtc2l6ZTogNjhwdDsgfQorLmY3MCB7IGZvbnQtc2l6ZTogNzBwdDsgfQorLmY3MiB7IGZvbnQtc2l6ZTogNzJwdDsgfQorLmY3NCB7IGZvbnQtc2l6ZTogNzRwdDsgfQorLmY3NiB7IGZvbnQtc2l6ZTogNzZwdDsgfQorLmY3OCB7IGZvbnQtc2l6ZTogNzhwdDsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxkaXYgY2xhc3M9ImYwNiI+PHA+MDZwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjA2cHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjA3Ij48cD4wN3B0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+MDdwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMDgiPjxwPjA4cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj4wOHB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYwOSI+PHA+MDlwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjA5cHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjEwIj48cD4xMHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+MTBwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMTEiPjxwPjExcHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj4xMXB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYxMiI+PHA+MTJwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjEycHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjEzIj48cD4xM3B0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+MTNwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMTQiPjxwPjE0cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj4xNHB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYxNSI+PHA+MTVwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjE1cHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjE2Ij48cD4xNnB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+MTZwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMTciPjxwPjE3cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj4xN3B0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYxOCI+PHA+MThwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjE4cHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjE5Ij48cD4xOXB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+MTlwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMjAiPjxwPjIwcHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj4yMHB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYyMSI+PHA+MjFwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjIxcHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjIyIj48cD4yMnB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+MjJwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMjMiPjxwPjIzcHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj4yM3B0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYyNCI+PHA+MjRwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjI0cHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjI1Ij48cD4yNXB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+MjVwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMjYiPjxwPjI2cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj4yNnB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYyNyI+PHA+MjdwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjI3cHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjI4Ij48cD4yOHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+MjhwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMjkiPjxwPjI5cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj4yOXB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYzMCI+PHA+MzBwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjMwcHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjMxIj48cD4zMXB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+MzFwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMzIiPjxwPjMycHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj4zMnB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYzMyI+PHA+MzNwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjMzcHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjM0Ij48cD4zNHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+MzRwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMzUiPjxwPjM1cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj4zNXB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYzNiI+PHA+MzZwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjM2cHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjM3Ij48cD4zN3B0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+MzdwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMzgiPjxwPjM4cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj4zOHB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYzOSI+PHA+MzlwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjM5cHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjQwIj48cD40MHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+NDBwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNDEiPjxwPjQxcHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj40MXB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY0MiI+PHA+NDJwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjQycHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjQzIj48cD40M3B0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+NDNwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNDQiPjxwPjQ0cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj40NHB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY0NSI+PHA+NDVwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjQ1cHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjQ2Ij48cD40NnB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+NDZwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNDciPjxwPjQ3cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj40N3B0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY0OCI+PHA+NDhwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjQ4cHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjQ5Ij48cD40OXB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+NDlwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNTAiPjxwPjUwcHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj41MHB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY1MSI+PHA+NTFwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjUxcHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjUyIj48cD41MnB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+NTJwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNTMiPjxwPjUzcHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj41M3B0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY1NCI+PHA+NTRwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjU0cHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjU1Ij48cD41NXB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+NTVwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNTYiPjxwPjU2cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj41NnB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY1NyI+PHA+NTdwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjU3cHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjU4Ij48cD41OHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+NThwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNTkiPjxwPjU5cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj41OXB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY2MCI+PHA+NjBwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjYwcHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjYyIj48cD42MnB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+NjJwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNjQiPjxwPjY0cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj42NHB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY2NiI+PHA+NjZwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjY2cHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjY4Ij48cD42OHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+NjhwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNzAiPjxwPjcwcHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj43MHB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY3MiI+PHA+NzJwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjcycHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjc0Ij48cD43NHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IGxhcmdlciI+NzRwdCBmb250IGxhcmdlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNzYiPjxwPjc2cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogbGFyZ2VyIj43NnB0IGZvbnQgbGFyZ2VyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY3OCI+PHA+NzhwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBsYXJnZXIiPjc4cHQgZm9udCBsYXJnZXI8L3A+PC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMTEyLmh0bWwgYi9UZXN0RmlsZXMvVDExMTIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjFjYjJmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMTEyLmh0bWwKQEAgLTAsMCArMSwxMzYgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorLmYwNiB7IGZvbnQtc2l6ZTogMDZwdDsgfQorLmYwNyB7IGZvbnQtc2l6ZTogMDdwdDsgfQorLmYwOCB7IGZvbnQtc2l6ZTogMDhwdDsgfQorLmYwOSB7IGZvbnQtc2l6ZTogMDlwdDsgfQorLmYxMCB7IGZvbnQtc2l6ZTogMTBwdDsgfQorLmYxMSB7IGZvbnQtc2l6ZTogMTFwdDsgfQorLmYxMiB7IGZvbnQtc2l6ZTogMTJwdDsgfQorLmYxMyB7IGZvbnQtc2l6ZTogMTNwdDsgfQorLmYxNCB7IGZvbnQtc2l6ZTogMTRwdDsgfQorLmYxNSB7IGZvbnQtc2l6ZTogMTVwdDsgfQorLmYxNiB7IGZvbnQtc2l6ZTogMTZwdDsgfQorLmYxNyB7IGZvbnQtc2l6ZTogMTdwdDsgfQorLmYxOCB7IGZvbnQtc2l6ZTogMThwdDsgfQorLmYxOSB7IGZvbnQtc2l6ZTogMTlwdDsgfQorLmYyMCB7IGZvbnQtc2l6ZTogMjBwdDsgfQorLmYyMSB7IGZvbnQtc2l6ZTogMjFwdDsgfQorLmYyMiB7IGZvbnQtc2l6ZTogMjJwdDsgfQorLmYyMyB7IGZvbnQtc2l6ZTogMjNwdDsgfQorLmYyNCB7IGZvbnQtc2l6ZTogMjRwdDsgfQorLmYyNSB7IGZvbnQtc2l6ZTogMjVwdDsgfQorLmYyNiB7IGZvbnQtc2l6ZTogMjZwdDsgfQorLmYyNyB7IGZvbnQtc2l6ZTogMjdwdDsgfQorLmYyOCB7IGZvbnQtc2l6ZTogMjhwdDsgfQorLmYyOSB7IGZvbnQtc2l6ZTogMjlwdDsgfQorLmYzMCB7IGZvbnQtc2l6ZTogMzBwdDsgfQorLmYzMSB7IGZvbnQtc2l6ZTogMzFwdDsgfQorLmYzMiB7IGZvbnQtc2l6ZTogMzJwdDsgfQorLmYzMyB7IGZvbnQtc2l6ZTogMzNwdDsgfQorLmYzNCB7IGZvbnQtc2l6ZTogMzRwdDsgfQorLmYzNSB7IGZvbnQtc2l6ZTogMzVwdDsgfQorLmYzNiB7IGZvbnQtc2l6ZTogMzZwdDsgfQorLmYzNyB7IGZvbnQtc2l6ZTogMzdwdDsgfQorLmYzOCB7IGZvbnQtc2l6ZTogMzhwdDsgfQorLmYzOSB7IGZvbnQtc2l6ZTogMzlwdDsgfQorLmY0MCB7IGZvbnQtc2l6ZTogNDBwdDsgfQorLmY0MSB7IGZvbnQtc2l6ZTogNDFwdDsgfQorLmY0MiB7IGZvbnQtc2l6ZTogNDJwdDsgfQorLmY0MyB7IGZvbnQtc2l6ZTogNDNwdDsgfQorLmY0NCB7IGZvbnQtc2l6ZTogNDRwdDsgfQorLmY0NSB7IGZvbnQtc2l6ZTogNDVwdDsgfQorLmY0NiB7IGZvbnQtc2l6ZTogNDZwdDsgfQorLmY0NyB7IGZvbnQtc2l6ZTogNDdwdDsgfQorLmY0OCB7IGZvbnQtc2l6ZTogNDhwdDsgfQorLmY0OSB7IGZvbnQtc2l6ZTogNDlwdDsgfQorLmY1MCB7IGZvbnQtc2l6ZTogNTBwdDsgfQorLmY1MSB7IGZvbnQtc2l6ZTogNTFwdDsgfQorLmY1MiB7IGZvbnQtc2l6ZTogNTJwdDsgfQorLmY1MyB7IGZvbnQtc2l6ZTogNTNwdDsgfQorLmY1NCB7IGZvbnQtc2l6ZTogNTRwdDsgfQorLmY1NSB7IGZvbnQtc2l6ZTogNTVwdDsgfQorLmY1NiB7IGZvbnQtc2l6ZTogNTZwdDsgfQorLmY1NyB7IGZvbnQtc2l6ZTogNTdwdDsgfQorLmY1OCB7IGZvbnQtc2l6ZTogNThwdDsgfQorLmY1OSB7IGZvbnQtc2l6ZTogNTlwdDsgfQorLmY2MCB7IGZvbnQtc2l6ZTogNjBwdDsgfQorLmY2MiB7IGZvbnQtc2l6ZTogNjJwdDsgfQorLmY2NCB7IGZvbnQtc2l6ZTogNjRwdDsgfQorLmY2NiB7IGZvbnQtc2l6ZTogNjZwdDsgfQorLmY2OCB7IGZvbnQtc2l6ZTogNjhwdDsgfQorLmY3MCB7IGZvbnQtc2l6ZTogNzBwdDsgfQorLmY3MiB7IGZvbnQtc2l6ZTogNzJwdDsgfQorLmY3NCB7IGZvbnQtc2l6ZTogNzRwdDsgfQorLmY3NiB7IGZvbnQtc2l6ZTogNzZwdDsgfQorLmY3OCB7IGZvbnQtc2l6ZTogNzhwdDsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxkaXYgY2xhc3M9ImYwNiI+PHA+MDZwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj4wNnB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMDciPjxwPjA3cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+MDdwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjA4Ij48cD4wOHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjA4cHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYwOSI+PHA+MDlwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj4wOXB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMTAiPjxwPjEwcHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+MTBwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjExIj48cD4xMXB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjExcHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYxMiI+PHA+MTJwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj4xMnB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMTMiPjxwPjEzcHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+MTNwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjE0Ij48cD4xNHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjE0cHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYxNSI+PHA+MTVwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj4xNXB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMTYiPjxwPjE2cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+MTZwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjE3Ij48cD4xN3B0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjE3cHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYxOCI+PHA+MThwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj4xOHB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMTkiPjxwPjE5cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+MTlwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjIwIj48cD4yMHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjIwcHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYyMSI+PHA+MjFwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj4yMXB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMjIiPjxwPjIycHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+MjJwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjIzIj48cD4yM3B0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjIzcHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYyNCI+PHA+MjRwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj4yNHB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMjUiPjxwPjI1cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+MjVwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjI2Ij48cD4yNnB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjI2cHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYyNyI+PHA+MjdwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj4yN3B0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMjgiPjxwPjI4cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+MjhwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjI5Ij48cD4yOXB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjI5cHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYzMCI+PHA+MzBwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj4zMHB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMzEiPjxwPjMxcHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+MzFwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjMyIj48cD4zMnB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjMycHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYzMyI+PHA+MzNwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj4zM3B0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMzQiPjxwPjM0cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+MzRwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjM1Ij48cD4zNXB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjM1cHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYzNiI+PHA+MzZwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj4zNnB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmMzciPjxwPjM3cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+MzdwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjM4Ij48cD4zOHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjM4cHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImYzOSI+PHA+MzlwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj4zOXB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNDAiPjxwPjQwcHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+NDBwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjQxIj48cD40MXB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjQxcHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY0MiI+PHA+NDJwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj40MnB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNDMiPjxwPjQzcHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+NDNwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjQ0Ij48cD40NHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjQ0cHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY0NSI+PHA+NDVwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj40NXB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNDYiPjxwPjQ2cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+NDZwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjQ3Ij48cD40N3B0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjQ3cHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY0OCI+PHA+NDhwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj40OHB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNDkiPjxwPjQ5cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+NDlwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjUwIj48cD41MHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjUwcHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY1MSI+PHA+NTFwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj41MXB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNTIiPjxwPjUycHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+NTJwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjUzIj48cD41M3B0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjUzcHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY1NCI+PHA+NTRwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj41NHB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNTUiPjxwPjU1cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+NTVwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjU2Ij48cD41NnB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjU2cHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY1NyI+PHA+NTdwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj41N3B0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNTgiPjxwPjU4cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+NThwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjU5Ij48cD41OXB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjU5cHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY2MCI+PHA+NjBwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj42MHB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNjIiPjxwPjYycHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+NjJwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjY0Ij48cD42NHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjY0cHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY2NiI+PHA+NjZwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj42NnB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNjgiPjxwPjY4cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+NjhwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjcwIj48cD43MHB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjcwcHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY3MiI+PHA+NzJwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj43MnB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmNzQiPjxwPjc0cHQgZm9udDwvcD4gPHAgc3R5bGU9ImZvbnQtc2l6ZTogc21hbGxlciI+NzRwdCBmb250IHNtYWxsZXI8L3A+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZjc2Ij48cD43NnB0IGZvbnQ8L3A+IDxwIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPjc2cHQgZm9udCBzbWFsbGVyPC9wPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImY3OCI+PHA+NzhwdCBmb250PC9wPiA8cCBzdHlsZT0iZm9udC1zaXplOiBzbWFsbGVyIj43OHB0IGZvbnQgc21hbGxlcjwvcD48L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDExMjAuaHRtbCBiL1Rlc3RGaWxlcy9UMTEyMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTc2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDExMjAuaHRtbApAQCAtMCwwICsxLDE0IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cCBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBub25lIj5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zLjwvcD4KKyAgICA8cCBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUiPk9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMuPC9wPgorICAgIDxwIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG92ZXJsaW5lIj5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zLjwvcD4KKyAgICA8cCBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2giPk9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMuPC9wPgorICAgIDxwIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IGJsaW5rIj5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDExMzAuaHRtbCBiL1Rlc3RGaWxlcy9UMTEzMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZjUzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDExMzAuaHRtbApAQCAtMCwwICsxLDE2IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cCBzdHlsZT0ibGV0dGVyLXNwYWNpbmc6IG5vcm1hbCI+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcy48L3A+CisgICAgPHAgc3R5bGU9ImxldHRlci1zcGFjaW5nOiAxcHgiPk9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMuPC9wPgorICAgIDxwIHN0eWxlPSJsZXR0ZXItc3BhY2luZzogMnB4Ij5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zLjwvcD4KKyAgICA8cCBzdHlsZT0ibGV0dGVyLXNwYWNpbmc6IDNweCI+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcy48L3A+CisgICAgPHAgc3R5bGU9ImxldHRlci1zcGFjaW5nOiAtMXB4Ij5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zLjwvcD4KKyAgICA8cCBzdHlsZT0ibGV0dGVyLXNwYWNpbmc6IC0ycHgiPk9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMuPC9wPgorICAgIDxwIHN0eWxlPSJsZXR0ZXItc3BhY2luZzogLTNweCI+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcy48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMTMxLmh0bWwgYi9UZXN0RmlsZXMvVDExMzEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDg1ZGUyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMTMxLmh0bWwKQEAgLTAsMCArMSw5IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8cCBzdHlsZT0ibGV0dGVyLXNwYWNpbmc6IDExMCUiPk9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTEzMi5odG1sIGIvVGVzdEZpbGVzL1QxMTMyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwNGUyYgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTEzMi5odG1sCkBAIC0wLDAgKzEsMTEgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxwIHN0eWxlPSJsZXR0ZXItc3BhY2luZzogLTFweCI+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcy48L3A+CisgICAgPHAgc3R5bGU9ImxldHRlci1zcGFjaW5nOiAtMnB4Ij5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zLjwvcD4KKyAgICA8cCBzdHlsZT0ibGV0dGVyLXNwYWNpbmc6IC0zcHgiPk9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTE0MC5odG1sIGIvVGVzdEZpbGVzL1QxMTQwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0YWM5ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTE0MC5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5IdG1sIEhlYWRpbmc8L2gxPgorICAgIDxwIHN0eWxlPSJ3b3JkLXNwYWNpbmc6IG5vcm1hbCI+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcy48L3A+CisgICAgPHAgc3R5bGU9IndvcmQtc3BhY2luZzogMXB4Ij5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zLjwvcD4KKyAgICA8cCBzdHlsZT0id29yZC1zcGFjaW5nOiAycHgiPk9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMuPC9wPgorICAgIDxwIHN0eWxlPSJ3b3JkLXNwYWNpbmc6IDNweCI+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcy48L3A+CisgICAgPHAgc3R5bGU9IndvcmQtc3BhY2luZzogLTFweCI+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcy48L3A+CisgICAgPHAgc3R5bGU9IndvcmQtc3BhY2luZzogLTJweCI+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcy48L3A+CisgICAgPHAgc3R5bGU9IndvcmQtc3BhY2luZzogLTNweCI+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcy48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMTUwLmh0bWwgYi9UZXN0RmlsZXMvVDExNTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDU4OTg2Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMTUwLmh0bWwKQEAgLTAsMCArMSwxMyBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHAgc3R5bGU9InRleHQtdHJhbnNmb3JtOiBub25lIj5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zLjwvcD4KKyAgICA8cCBzdHlsZT0idGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemUiPk9uIHRoZSBJbnNlcnQgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMuPC9wPgorICAgIDxwIHN0eWxlPSJ0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlIj5PbiB0aGUgSW5zZXJ0IHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zLjwvcD4KKyAgICA8cCBzdHlsZT0idGV4dC10cmFuc2Zvcm06IGxvd2VyY2FzZSI+T24gdGhlIEluc2VydCB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcy48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMTYwLmh0bWwgYi9UZXN0RmlsZXMvVDExNjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmNkNjIyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMTYwLmh0bWwKQEAgLTAsMCArMSwxNCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHAgc3R5bGU9IndoaXRlLXNwYWNlOiBub3JtYWwiPk9uICAgIHRoZSAgICAgSW5zZXJ0ICAgICB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcy48L3A+CisgICAgPHAgc3R5bGU9IndoaXRlLXNwYWNlOiBwcmUiPk9uICAgIHRoZSAgICAgSW5zZXJ0ICAgICB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcy48L3A+CisgICAgPHAgc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXAiPk9uICAgIHRoZSAgICAgSW5zZXJ0ICAgICB0YWIsIHRoZSBnYWxsZXJpZXMgaW5jbHVkZSBpdGVtcy48L3A+CisgICAgPHAgc3R5bGU9IndoaXRlLXNwYWNlOiBwcmUtd3JhcCI+T24gICAgdGhlICAgICBJbnNlcnQgICAgIHRhYiwgdGhlIGdhbGxlcmllcyBpbmNsdWRlIGl0ZW1zLjwvcD4KKyAgICA8cCBzdHlsZT0id2hpdGUtc3BhY2U6IHByZS1saW5lIj5PbiAgICB0aGUgICAgIEluc2VydCAgICAgdGFiLCB0aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTE3MC5odG1sIGIvVGVzdEZpbGVzL1QxMTcwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUwNjdjYwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTE3MC5odG1sCkBAIC0wLDAgKzEsMjAgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5IHN0eWxlPSJmb250OiBjYWxpYnJpIDExcHQgbm9ybWFsOyI+Cis8dGFibGU+Cis8Y2FwdGlvbj5UaGlzIGlzIGEgc2ltcGxlIDN4MyB0YWJsZTwvY2FwdGlvbj4KKzx0ciBpZD0icm93MSI+Cis8dGg+SGVhZGVyIDEgPC90aD48dGQ+Q2VsbCAxIDwvdGQ+PHRkPkNlbGwgMjwvdGQ+PC90cj4KKzx0ciBpZD0icm93MiI+Cis8dGg+SGVhZGVyIDIgPC90aD48dGQ+Q2VsbCAzIDwvdGQ+PHRkPkNlbGwgNDwvdGQ+PC90cj4KKzx0ciBpZD0icm93MyI+Cis8dGg+SGVhZGVyIDMgPC90aD48dGQ+Q2VsbCA1IDwvdGQ+PHRkPkNlbGwgNjwvdGQ+PC90cj4KKzwvdGFibGU+Cis8cD5UZXN0PC9wPgorPHA+VGVzdDwvcD4KKzxwPlRlc3Q8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMTgwLmh0bWwgYi9UZXN0RmlsZXMvVDExODAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjMxYzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMTgwLmh0bWwKQEAgLTAsMCArMSwxOSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Citib2R5IHsgZm9udDogY2FsaWJyaSAxMXB0OyB9Cit0aCB7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiByZWQ7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzx0YWJsZT4KKzxjYXB0aW9uPlRoaXMgaXMgYSBzaW1wbGUgM3gzIHRhYmxlPC9jYXB0aW9uPgorPHRyIGlkPSJyb3cxIj4KKzx0aD5IZWFkZXIgMSA8L3RoPjx0ZD5DZWxsIDEgPC90ZD48dGQ+Q2VsbCAyPC90ZD48L3RyPgorPHRyIGlkPSJyb3cyIj4KKzx0aD5IZWFkZXIgMiA8L3RoPjx0ZD5DZWxsIDMgPC90ZD48dGQ+Q2VsbCA0PC90ZD48L3RyPgorPHRyIGlkPSJyb3czIj4KKzx0aD5IZWFkZXIgMyA8L3RoPjx0ZD5DZWxsIDUgPC90ZD48dGQ+Q2VsbCA2PC90ZD48L3RyPgorPC90YWJsZT4KKyAgICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMTkwLmh0bWwgYi9UZXN0RmlsZXMvVDExOTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGExNTA5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMTkwLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Citib2R5IHsgZm9udDogY2FsaWJyaSAxMXB0OyB9Cit0aCB7IHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZSB9Cit0ZCB7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGUgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHRhYmxlPgorPGNhcHRpb24+VGhpcyBpcyBhIHNpbXBsZSAzeDMgdGFibGU8L2NhcHRpb24+Cis8dHIgaWQ9InJvdzEiPgorPHRoPkhlYWRlciAxIDwvdGg+PHRkPkNlbGwgMSA8L3RkPjx0ZD5DZWxsIDI8L3RkPjwvdHI+Cis8dHIgaWQ9InJvdzIiPgorPHRoPkhlYWRlciAyIDwvdGg+PHRkPkNlbGwgMyA8L3RkPjx0ZD5DZWxsIDQ8L3RkPjwvdHI+Cis8dHIgaWQ9InJvdzMiPgorPHRoPkhlYWRlciAzIDwvdGg+PHRkPkNlbGwgNSA8L3RkPjx0ZD5DZWxsIDY8L3RkPjwvdHI+Cis8L3RhYmxlPgorICAgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDEyMDAuaHRtbCBiL1Rlc3RGaWxlcy9UMTIwMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMWNiMmQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDEyMDAuaHRtbApAQCAtMCwwICsxLDIwIEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2JvZHkgeyBmb250OiBjYWxpYnJpIDExcHQ7IH0KK3RhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSB9Cit0YWJsZSwgdGgsIHRkIHsgYm9yZGVyOiB0aGluIHNvbGlkIGJsYWNrIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzx0YWJsZT4KKzxjYXB0aW9uPlRoaXMgaXMgYSBzaW1wbGUgM3gzIHRhYmxlPC9jYXB0aW9uPgorPHRyIGlkPSJyb3cxIj4KKzx0aD5IZWFkZXIgMSA8L3RoPjx0ZD5DZWxsIDEgPC90ZD48dGQ+Q2VsbCAyPC90ZD48L3RyPgorPHRyIGlkPSJyb3cyIj4KKzx0aD5IZWFkZXIgMiA8L3RoPjx0ZD5DZWxsIDMgPC90ZD48dGQ+Q2VsbCA0PC90ZD48L3RyPgorPHRyIGlkPSJyb3czIj4KKzx0aD5IZWFkZXIgMyA8L3RoPjx0ZD5DZWxsIDUgPC90ZD48dGQ+Q2VsbCA2PC90ZD48L3RyPgorPC90YWJsZT4KKyAgICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMjAxLmh0bWwgYi9UZXN0RmlsZXMvVDEyMDEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWJhNmNiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMjAxLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Citib2R5IHsgZm9udDogY2FsaWJyaSAxMXB0OyB9Cit0YWJsZSB7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UgfQordGgsIHRkIHsgYm9yZGVyOiB0aGluIHNvbGlkIGJsYWNrIH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzx0YWJsZT4KKzxjYXB0aW9uPlRoaXMgaXMgYSBzaW1wbGUgM3gzIHRhYmxlPC9jYXB0aW9uPgorPHRyIGlkPSJyb3cxIj4KKzx0aD5IZWFkZXIgMSA8L3RoPjx0ZD5DZWxsIDEgPC90ZD48dGQ+Q2VsbCAyPC90ZD48L3RyPgorPHRyIGlkPSJyb3cyIj4KKzx0aD5IZWFkZXIgMiA8L3RoPjx0ZD5DZWxsIDMgPC90ZD48dGQ+Q2VsbCA0PC90ZD48L3RyPgorPHRyIGlkPSJyb3czIj4KKzx0aD5IZWFkZXIgMyA8L3RoPjx0ZD5DZWxsIDUgPC90ZD48dGQ+Q2VsbCA2PC90ZD48L3RyPgorPC90YWJsZT4KKyAgICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMjEwLmh0bWwgYi9UZXN0RmlsZXMvVDEyMTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODRiM2RiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMjEwLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Citib2R5IHsgZm9udDogY2FsaWJyaSAxMXB0OyB9Cit0YWJsZSB7IGJvcmRlcjogbWVkaXVtIHNvbGlkIHJlZDsgfQordGQgeyBib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHRhYmxlPgorPGNhcHRpb24+VGhpcyBpcyBhIHNpbXBsZSAzeDMgdGFibGU8L2NhcHRpb24+Cis8dHIgaWQ9InJvdzEiPgorPHRoPkhlYWRlciAxIDwvdGg+PHRkPkNlbGwgMSA8L3RkPjx0ZD5DZWxsIDI8L3RkPjwvdHI+Cis8dHIgaWQ9InJvdzIiPgorPHRoPkhlYWRlciAyIDwvdGg+PHRkPkNlbGwgMyA8L3RkPjx0ZD5DZWxsIDQ8L3RkPjwvdHI+Cis8dHIgaWQ9InJvdzMiPgorPHRoPkhlYWRlciAzIDwvdGg+PHRkPkNlbGwgNSA8L3RkPjx0ZD5DZWxsIDY8L3RkPjwvdHI+Cis8L3RhYmxlPgorICAgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDEyMjAuaHRtbCBiL1Rlc3RGaWxlcy9UMTIyMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMDg1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDEyMjAuaHRtbApAQCAtMCwwICsxLDE5IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2JvZHkgeyBmb250OiBjYWxpYnJpIDExcHQ7IH0KK3RhYmxlIHsgdGFibGUtbGF5b3V0OiBmaXhlZDsgd2lkdGg6IDEwMCU7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzx0YWJsZT4KKzxjYXB0aW9uPlRoaXMgaXMgYSBzaW1wbGUgM3gzIHRhYmxlPC9jYXB0aW9uPgorPHRyIGlkPSJyb3cxIj4KKzx0aD5IZWFkZXIgMSA8L3RoPjx0ZD5DZWxsIDEgPC90ZD48dGQ+Q2VsbCAyPC90ZD48L3RyPgorPHRyIGlkPSJyb3cyIj4KKzx0aD5IZWFkZXIgMiA8L3RoPjx0ZD5DZWxsIDMgPC90ZD48dGQ+Q2VsbCA0PC90ZD48L3RyPgorPHRyIGlkPSJyb3czIj4KKzx0aD5IZWFkZXIgMyA8L3RoPjx0ZD5DZWxsIDUgPC90ZD48dGQ+Q2VsbCA2PC90ZD48L3RyPgorPC90YWJsZT4KKyAgICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMjMwLmh0bWwgYi9UZXN0RmlsZXMvVDEyMzAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjFhMjBiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMjMwLmh0bWwKQEAgLTAsMCArMSwyMyBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Citib2R5IHsgZm9udDogY2FsaWJyaSAxMXB0OyB9Cit0YWJsZSB7IHRhYmxlLWxheW91dDogZml4ZWQ7IH0KK3RoIHsgd2lkdGg6IDEwZW0gfQordGQgeyB3aWR0aDogNmVtIH0KK3RhYmxlIHsgYm9yZGVyOiBtZWRpdW0gc29saWQgcmVkOyB9Cit0ZCB7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8dGFibGU+Cis8Y2FwdGlvbj5UaGlzIGlzIGEgc2ltcGxlIDN4MyB0YWJsZTwvY2FwdGlvbj4KKzx0ciBpZD0icm93MSI+Cis8dGg+SGVhZGVyIDEgPC90aD48dGQ+Q2VsbCAxIDwvdGQ+PHRkPkNlbGwgMjwvdGQ+PC90cj4KKzx0ciBpZD0icm93MiI+Cis8dGg+SGVhZGVyIDIgPC90aD48dGQ+Q2VsbCAzIDwvdGQ+PHRkPkNlbGwgNDwvdGQ+PC90cj4KKzx0ciBpZD0icm93MyI+Cis8dGg+SGVhZGVyIDMgPC90aD48dGQ+Q2VsbCA1IDwvdGQ+PHRkPkNlbGwgNjwvdGQ+PC90cj4KKzwvdGFibGU+CisgICAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTI0MC5odG1sIGIvVGVzdEZpbGVzL1QxMjQwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwOTAzNQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTI0MC5odG1sCkBAIC0wLDAgKzEsMjUgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorYm9keSB7IGZvbnQ6IGNhbGlicmkgMTFwdDsgfQordGFibGUgeyB0YWJsZS1sYXlvdXQ6IGZpeGVkOyB9Cit0aCB7IHdpZHRoOiAxMGVtOyB9Cit0ZCB7IHdpZHRoOiA2ZW07IH0KK3RhYmxlIHsgYm9yZGVyOiBtZWRpdW0gc29saWQgcmVkOyB9Cit0ZCB7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8dGFibGU+Cis8Y2FwdGlvbiBzdHlsZT0iYm9yZGVyOiB0aGluIHNvbGlkIHJlZDsiPlRoaXMgaXMgYSBzaW1wbGUgM3gzIHRhYmxlPC9jYXB0aW9uPgorPHRyIGlkPSJyb3cxIj4KKzx0aD5IZWFkZXIgMSA8L3RoPjx0ZD5DZWxsIDEgPC90ZD48dGQ+Q2VsbCAyPC90ZD48L3RyPgorPHRyIGlkPSJyb3cyIj4KKzx0aD5IZWFkZXIgMiA8L3RoPjx0ZD5DZWxsIDMgPC90ZD48dGQ+Q2VsbCA0PC90ZD48L3RyPgorPHRyIGlkPSJyb3czIj4KKzx0aD5IZWFkZXIgMyA8L3RoPjx0ZD5DZWxsIDUgPC90ZD48dGQ+Q2VsbCA2PC90ZD48L3RyPgorPC90YWJsZT4KKyAgICAgICAgPHA+V29yZCBpcyBpbmNvcnJlY3RseSBjYWxjdWxhdGluZyBjb2x1bW4gd2lkdGhzLiAgV29yZCBpcyBhbHNvIHVzaW5nIHRoZSB3cm9uZyBmb250IGZvciB0aGUgdGFibGUuICBXb3JkIGFsd2F5cyB1c2VzIDExcHQgY2FsaWJyaSByZWdhcmRsZXNzCisgICAgICAgICAgIG9mIGZvbnQgc2V0IGZvciB0aGUgdGFibGUsIG9yIGJvZHkuICBXb3JkIGFsd2F5cyBjYWxjdWxhdGVzIGNvbHVtbiB3aWR0aHMgKHdoZW4gc3BlY2VkIGJ5IGVtIG9yIGV4KSBiYXNlZCBvbiAxMnB0IGNhbGlicmkuPC9wPgorICAgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDEyNDEuaHRtbCBiL1Rlc3RGaWxlcy9UMTI0MS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzYxODYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDEyNDEuaHRtbApAQCAtMCwwICsxLDE4IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2JvZHksIHRhYmxlIHsgZm9udDogY2FsaWJyaSAxMnB0OyB9Cit0YWJsZSB7IHRhYmxlLWxheW91dDogZml4ZWQ7IH0KK3RoIHsgd2lkdGg6IDEwZW07IH0KK3RkIHsgd2lkdGg6IDZlbTsgfQordGFibGUgeyBib3JkZXI6IG1lZGl1bSBzb2xpZCByZWQ7IH0KK3RkIHsgYm9yZGVyOiB0aGluIHNvbGlkIGJsdWU7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzx0YWJsZT4KKzx0ciBpZD0icm93MSI+Cis8dGg+SGVhZGVyIDEgPC90aD48dGQ+Q2VsbCAxIDwvdGQ+PHRkPkNlbGwgMjwvdGQ+PC90cj4KKzwvdGFibGU+CisgICAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTI0Mi5odG1sIGIvVGVzdEZpbGVzL1QxMjQyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzMjk5MwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTI0Mi5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorYm9keSB7IGZvbnQ6IGNhbGlicmkgMTFwdDsgfQordGFibGUgeyB0YWJsZS1sYXlvdXQ6IGZpeGVkOyB9Cit0aCB7IHdpZHRoOiA3MnB0OyB9Cit0ZCB7IHdpZHRoOiA1MHB0OyB9Cit0YWJsZSB7IGJvcmRlcjogbWVkaXVtIHNvbGlkIHJlZDsgfQordGQgeyBib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHRhYmxlPgorPHRyIGlkPSJyb3cxIj4KKzx0aD5IZWFkZXIgMSA8L3RoPjx0ZD5DZWxsIDEgPC90ZD48dGQ+Q2VsbCAyPC90ZD48L3RyPgorPC90YWJsZT4KKyAgICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMjUwLmh0bWwgYi9UZXN0RmlsZXMvVDEyNTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWY5MzYxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMjUwLmh0bWwKQEAgLTAsMCArMSwyMyBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cit0YWJsZSwgYm9keSB7IGZvbnQ6IGNhbGlicmkgMTFwdCB9Cit0YWJsZSB7IHRhYmxlLWxheW91dDogZml4ZWQgfQordGggeyB3aWR0aDogMTBlbTsgbWFyZ2luOiAxZW07IH0KK3RkIHsgd2lkdGg6IDZlbTsgbWFyZ2luOiAxZW07IH0KK3RhYmxlIHsgYm9yZGVyOiBtZWRpdW0gc29saWQgcmVkOyB9Cit0ZCB7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8dGFibGU+Cis8Y2FwdGlvbj5UaGlzIGlzIGEgc2ltcGxlIDN4MyB0YWJsZTwvY2FwdGlvbj4KKzx0ciBpZD0icm93MSI+Cis8dGg+SGVhZGVyIDEgPC90aD48dGQ+Q2VsbCAxIDwvdGQ+PHRkPkNlbGwgMjwvdGQ+PC90cj4KKzx0ciBpZD0icm93MiI+Cis8dGg+SGVhZGVyIDIgPC90aD48dGQ+Q2VsbCAzIDwvdGQ+PHRkPkNlbGwgNDwvdGQ+PC90cj4KKzx0ciBpZD0icm93MyI+Cis8dGg+SGVhZGVyIDMgPC90aD48dGQ+Q2VsbCA1IDwvdGQ+PHRkPkNlbGwgNjwvdGQ+PC90cj4KKzwvdGFibGU+CisgICAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTI1MS5odG1sIGIvVGVzdEZpbGVzL1QxMjUxLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4MjA2YgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTI1MS5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgordGFibGUsIGJvZHkgeyBmb250OiBjYWxpYnJpIDExcHQ7IH0KK3RhYmxlIHsgdGFibGUtbGF5b3V0OiBmaXhlZDsgYm9yZGVyOiBtZWRpdW0gc29saWQgcmVkOyB9Cit0ZCB7IHdpZHRoOiA2ZW07IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyBtYXJnaW46IDE1cHg7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzx0YWJsZT4KKzx0cj4KKyAgPHRkPkNlbGwgMTwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKyAgICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMjYwLmh0bWwgYi9UZXN0RmlsZXMvVDEyNjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWNhY2U4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMjYwLmh0bWwKQEAgLTAsMCArMSwzMSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cit0YWJsZSB7IHRhYmxlLWxheW91dDogZml4ZWQgfQordGggeyB3aWR0aDogMTBlbTsgbWFyZ2luOiAxZW07IH0KK3RkIHsgd2lkdGg6IDZlbTsgbWFyZ2luOiAxZW07IH0KK3RhYmxlIHsgYm9yZGVyOiBtZWRpdW0gc29saWQgcmVkOyB9Cit0ZCB7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8dGFibGU+Cis8Y2FwdGlvbj5UaGlzIGlzIGEgc2ltcGxlIDN4MyB0YWJsZTwvY2FwdGlvbj4KKzx0ciBpZD0icm93MSI+Cis8dGg+SGVhZGVyIDEgPC90aD4KKzx0ZCBjb2xzcGFuPScyJz5DZWxsIDEgPC90ZD4KKzx0ZD5DZWxsIDI8L3RkPgorPC90cj4KKzx0ciBpZD0icm93MiI+Cis8dGg+SGVhZGVyIDIgPC90aD4KKzx0ZCByb3dzcGFuPScyJz5DZWxsIDMgPC90ZD4KKzx0ZCBjb2xzcGFuPScyJz5DZWxsIDQ8L3RkPgorPC90cj4KKzx0ciBpZD0icm93MyI+Cis8dGg+SGVhZGVyIDMgPC90aD4KKzx0ZD5DZWxsIDUgPC90ZD4KKzx0ZD5DZWxsIDYgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTI3MC5odG1sIGIvVGVzdEZpbGVzL1QxMjcwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5NDE5YgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTI3MC5odG1sCkBAIC0wLDAgKzEsMjYgQEAKKworPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5UYWJsZSBleGFtcGxlPC9USVRMRT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitUQUJMRSB7IGJhY2tncm91bmQ6ICNmZjA7IGJvcmRlcjogc29saWQgYmxhY2s7CitlbXB0eS1jZWxsczogaGlkZSB9CitUUi50b3AgeyBiYWNrZ3JvdW5kOiByZWQgfQorVEQgeyBib3JkZXI6IHNvbGlkIGJsYWNrIH0KKzwvc3R5bGU+Cis8L0hFQUQ+Cis8Qk9EWT4KKzxUQUJMRT4KKzxUUiBDTEFTUz0idG9wIj4KKzxURD4gMTwvVEQ+Cis8VEQgcm93c3Bhbj0iMiI+IDI8L1REPgorPFREPiAzPC9URD4KKzxURD4gNDwvVEQ+Cis8L1RSPgorPFRSPgorPFREPiA1PC9URD4KKzxURD48L1REPgorPC9UUj4KKzwvVEFCTEU+Cis8L0JPRFk+Cis8L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMjgwLmh0bWwgYi9UZXN0RmlsZXMvVDEyODAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjZlNDczCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMjgwLmh0bWwKQEAgLTAsMCArMSwzMSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cit0YWJsZSB7IHdpZHRoOiA0MGVtOyB9Cit0aCB7IHdpZHRoOiAxMGVtOyBtYXJnaW46IDFlbTsgfQordGQgeyB3aWR0aDogNmVtOyBtYXJnaW46IDFlbTsgfQordGFibGUgeyBib3JkZXI6IG1lZGl1bSBzb2xpZCByZWQ7IH0KK3RkIHsgYm9yZGVyOiB0aGluIHNvbGlkIGJsdWU7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzx0YWJsZT4KKzxjYXB0aW9uPlRoaXMgaXMgYSBzaW1wbGUgM3gzIHRhYmxlPC9jYXB0aW9uPgorPHRyIGlkPSJyb3cxIj4KKzx0aD5IZWFkZXIgMSA8L3RoPgorPHRkIGNvbHNwYW49JzInPkNlbGwgMSA8L3RkPgorPHRkPkNlbGwgMjwvdGQ+Cis8L3RyPgorPHRyIGlkPSJyb3cyIj4KKzx0aD5IZWFkZXIgMiA8L3RoPgorPHRkIHJvd3NwYW49JzInPkNlbGwgMyA8L3RkPgorPHRkIGNvbHNwYW49JzInPkNlbGwgNDwvdGQ+Cis8L3RyPgorPHRyIGlkPSJyb3czIj4KKzx0aD5IZWFkZXIgMyA8L3RoPgorPHRkPkNlbGwgNSA8L3RkPgorPHRkPkNlbGwgNiA8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMjkwLmh0bWwgYi9UZXN0RmlsZXMvVDEyOTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDJiMzMyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMjkwLmh0bWwKQEAgLTAsMCArMSwzMiBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cit0YWJsZSB7IHRhYmxlLWxheW91dDogZml4ZWQ7CittYXJnaW4tbGVmdDogMmVtOworbWFyZ2luLXJpZ2h0OiAyZW0gfQordGFibGUgeyBib3JkZXI6IG1lZGl1bSBzb2xpZCByZWQ7IH0KK3RoIHsgYm9yZGVyOiB0aGluIHNvbGlkIGdyZWVuOyB9Cit0ZCB7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8dGFibGU+Cis8Y2FwdGlvbj5UaGlzIGlzIGEgc2ltcGxlIDN4MyB0YWJsZTwvY2FwdGlvbj4KKzx0ciBpZD0icm93MSI+Cis8dGg+SGVhZGVyIDEgPC90aD4KKzx0ZCBjb2xzcGFuPScyJz5DZWxsIDEgPC90ZD4KKzx0ZD5DZWxsIDI8L3RkPgorPC90cj4KKzx0ciBpZD0icm93MiI+Cis8dGg+SGVhZGVyIDIgPC90aD4KKzx0ZCByb3dzcGFuPScyJz5DZWxsIDMgPC90ZD4KKzx0ZCBjb2xzcGFuPScyJz5DZWxsIDQ8L3RkPgorPC90cj4KKzx0ciBpZD0icm93MyI+Cis8dGg+SGVhZGVyIDMgPC90aD4KKzx0ZD5DZWxsIDUgPC90ZD4KKzx0ZD5DZWxsIDYgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTMwMC5odG1sIGIvVGVzdEZpbGVzL1QxMzAwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhY2NmMAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTMwMC5odG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgordGFibGUgeyB0YWJsZS1sYXlvdXQ6IGZpeGVkOworbWFyZ2luLWxlZnQ6IDJlbTsKK21hcmdpbi1yaWdodDogMmVtOworYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKK30KK3RhYmxlIHsgYm9yZGVyOiBtZWRpdW0gc29saWQgcmVkOyB9Cit0aCB7IGJvcmRlcjogdGhpbiBzb2xpZCBncmVlbjsgfQordGQgeyBib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHRhYmxlPgorPGNhcHRpb24+VGhpcyBpcyBhIHNpbXBsZSAzeDMgdGFibGU8L2NhcHRpb24+Cis8dHIgaWQ9InJvdzEiPgorPHRoPkhlYWRlciAxIDwvdGg+Cis8dGQgY29sc3Bhbj0nMic+Q2VsbCAxIDwvdGQ+Cis8dGQ+Q2VsbCAyPC90ZD4KKzwvdHI+Cis8dHIgaWQ9InJvdzIiPgorPHRoPkhlYWRlciAyIDwvdGg+Cis8dGQgcm93c3Bhbj0nMic+Q2VsbCAzIDwvdGQ+Cis8dGQgY29sc3Bhbj0nMic+Q2VsbCA0PC90ZD4KKzwvdHI+Cis8dHIgaWQ9InJvdzMiPgorPHRoPkhlYWRlciAzIDwvdGg+Cis8dGQ+Q2VsbCA1IDwvdGQ+Cis8dGQ+Q2VsbCA2IDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDEzMTAuaHRtbCBiL1Rlc3RGaWxlcy9UMTMxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZDlhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDEzMTAuaHRtbApAQCAtMCwwICsxLDM0IEBACis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3RhYmxlIHsgdGFibGUtbGF5b3V0OiBmaXhlZDsKKyAgbWFyZ2luLWxlZnQ6IDJlbTsKKyAgbWFyZ2luLXJpZ2h0OiAyZW07CisgIGJvcmRlci1zcGFjaW5nOiAxMHB4OworfQordGFibGUgeyBib3JkZXI6IG1lZGl1bSBzb2xpZCByZWQ7IH0KK3RoIHsgYm9yZGVyOiB0aGluIHNvbGlkIGdyZWVuOyB9Cit0ZCB7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8dGFibGU+Cis8Y2FwdGlvbj5UaGlzIGlzIGEgc2ltcGxlIDN4MyB0YWJsZTwvY2FwdGlvbj4KKzx0ciBpZD0icm93MSI+Cis8dGg+SGVhZGVyIDEgPC90aD4KKzx0ZCBjb2xzcGFuPScyJz5DZWxsIDEgPC90ZD4KKzx0ZD5DZWxsIDI8L3RkPgorPC90cj4KKzx0ciBpZD0icm93MiI+Cis8dGg+SGVhZGVyIDIgPC90aD4KKzx0ZCByb3dzcGFuPScyJz5DZWxsIDMgPC90ZD4KKzx0ZCBjb2xzcGFuPScyJz5DZWxsIDQ8L3RkPgorPC90cj4KKzx0ciBpZD0icm93MyI+Cis8dGg+SGVhZGVyIDMgPC90aD4KKzx0ZD5DZWxsIDUgPC90ZD4KKzx0ZD5DZWxsIDYgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTMyMC5odG1sIGIvVGVzdEZpbGVzL1QxMzIwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViOWNmOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTMyMC5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgordGFibGUgeyBib3JkZXI6IG91dHNldCAxMHB0OworYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsKK2JvcmRlci1zcGFjaW5nOiAxNXB0IH0KK3RkIHsgYm9yZGVyOiBpbnNldCA1cHQgfQordGQuc3BlY2lhbCB7IGJvcmRlcjogaW5zZXQgMTBwdCB9IAorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHRhYmxlPgorPGNhcHRpb24+VGhpcyBpcyBhIHNpbXBsZSAzeDMgdGFibGU8L2NhcHRpb24+Cis8dHIgaWQ9InJvdzEiPgorPHRoPkhlYWRlciAxIDwvdGg+Cis8dGQgY29sc3Bhbj0nMicgY2xhc3M9J3NwZWNpYWwnPkNlbGwgMSA8L3RkPgorPHRkPkNlbGwgMjwvdGQ+Cis8L3RyPgorPHRyIGlkPSJyb3cyIj4KKzx0aD5IZWFkZXIgMiA8L3RoPgorPHRkIHJvd3NwYW49JzInPkNlbGwgMyA8L3RkPgorPHRkIGNvbHNwYW49JzInPkNlbGwgNDwvdGQ+Cis8L3RyPgorPHRyIGlkPSJyb3czIj4KKzx0aD5IZWFkZXIgMyA8L3RoPgorPHRkPkNlbGwgNSA8L3RkPgorPHRkPkNlbGwgNiA8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMzMwLmh0bWwgYi9UZXN0RmlsZXMvVDEzMzAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzYwMGQzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMzMwLmh0bWwKQEAgLTAsMCArMSwzMiBAQAorCis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3RhYmxlIHsgdGFibGUtbGF5b3V0OiBmaXhlZCB9Cit0YWJsZSB7IGJvcmRlcjogbWVkaXVtIHNvbGlkIHJlZDsgfQordGQgeyBib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsgfQordGggeyBib3JkZXI6IHRoaW4gc29saWQgYXF1YTsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+dGFibGUtbGF5b3V0OiBmaXhlZDwvcD4KKzx0YWJsZT4KKyAgICA8Y2FwdGlvbj5UaGlzIGlzIGEgc2ltcGxlIDN4MyB0YWJsZTwvY2FwdGlvbj4KKyAgICA8dHIgaWQ9InJvdzEiPgorICAgIDx0aD5IZWFkZXIgMSA8L3RoPgorICAgIDx0ZD5DZWxsIDEgPC90ZD4KKyAgICA8dGQ+Q2VsbCAyPC90ZD4KKyAgICA8L3RyPgorICAgIDx0ciBpZD0icm93MiI+CisgICAgPHRoPkhlYWRlciAyIDwvdGg+CisgICAgPHRkPkNlbGwgMyA8L3RkPgorICAgIDx0ZD5DZWxsIDQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGlkPSJyb3czIj4KKyAgICA8dGg+SGVhZGVyIDMgPC90aD4KKyAgICA8dGQ+Q2VsbCA1IDwvdGQ+CisgICAgPHRkPkNlbGwgNiA8L3RkPgorICAgIDwvdHI+Cis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTM0MC5odG1sIGIvVGVzdEZpbGVzL1QxMzQwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJmZDFhZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTM0MC5odG1sCkBAIC0wLDAgKzEsMzIgQEAKKworPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cit0YWJsZSB7IHRhYmxlLWxheW91dDogYXV0byB9Cit0YWJsZSB7IGJvcmRlcjogbWVkaXVtIHNvbGlkIHJlZDsgfQordGQgeyBib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsgfQordGggeyBib3JkZXI6IHRoaW4gc29saWQgYXF1YTsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+dGFibGUtbGF5b3V0OiBhdXRvPC9wPgorPHRhYmxlPgorICAgIDxjYXB0aW9uPlRoaXMgaXMgYSBzaW1wbGUgM3gzIHRhYmxlPC9jYXB0aW9uPgorICAgIDx0ciBpZD0icm93MSI+CisgICAgPHRoPkhlYWRlciAxIDwvdGg+CisgICAgPHRkPkNlbGwgMSA8L3RkPgorICAgIDx0ZD5DZWxsIDI8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGlkPSJyb3cyIj4KKyAgICA8dGg+SGVhZGVyIDIgPC90aD4KKyAgICA8dGQ+Q2VsbCAzIDwvdGQ+CisgICAgPHRkPkNlbGwgNDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHIgaWQ9InJvdzMiPgorICAgIDx0aD5IZWFkZXIgMyA8L3RoPgorICAgIDx0ZD5DZWxsIDUgPC90ZD4KKyAgICA8dGQ+Q2VsbCA2IDwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMzUwLmh0bWwgYi9UZXN0RmlsZXMvVDEzNTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGI5OGRmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMzUwLmh0bWwKQEAgLTAsMCArMSwzNSBAQAorCis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3RhYmxlIHsgdGFibGUtbGF5b3V0OiBmaXhlZDsKK21hcmdpbi1sZWZ0OiAyZW07CittYXJnaW4tcmlnaHQ6IDJlbSB9CisKK3RhYmxlIHsgYm9yZGVyOiBtZWRpdW0gc29saWQgcmVkOyB9Cit0ZCB7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyB9Cit0aCB7IGJvcmRlcjogdGhpbiBzb2xpZCBhcXVhOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD50YWJsZS1sYXlvdXQ6IGF1dG88L3A+Cis8dGFibGU+CisgICAgPGNhcHRpb24+VGhpcyBpcyBhIHNpbXBsZSAzeDMgdGFibGU8L2NhcHRpb24+CisgICAgPHRyIGlkPSJyb3cxIj4KKyAgICA8dGg+SGVhZGVyIDEgPC90aD4KKyAgICA8dGQ+Q2VsbCAxIDwvdGQ+CisgICAgPHRkPkNlbGwgMjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHIgaWQ9InJvdzIiPgorICAgIDx0aD5IZWFkZXIgMiA8L3RoPgorICAgIDx0ZD5DZWxsIDMgPC90ZD4KKyAgICA8dGQ+Q2VsbCA0PC90ZD4KKyAgICA8L3RyPgorICAgIDx0ciBpZD0icm93MyI+CisgICAgPHRoPkhlYWRlciAzIDwvdGg+CisgICAgPHRkPkNlbGwgNSA8L3RkPgorICAgIDx0ZD5DZWxsIDYgPC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDEzNjAuaHRtbCBiL1Rlc3RGaWxlcy9UMTM2MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhN2ZiZmMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDEzNjAuaHRtbApAQCAtMCwwICsxLDMxIEBACisKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgordGFibGUgeyBib3JkZXI6IG1lZGl1bSBzb2xpZCByZWQ7IH0KK3RkIHsgYm9yZGVyOiB0aGluIHNvbGlkIGJsdWU7IH0KK3RoIHsgYm9yZGVyOiB0aGluIHNvbGlkIGFxdWE7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPnRhYmxlLWxheW91dDogYXV0bzwvcD4KKzx0YWJsZT4KKyAgICA8Y2FwdGlvbj5UaGlzIGlzIGEgc2ltcGxlIDN4MyB0YWJsZTwvY2FwdGlvbj4KKyAgICA8dHIgaWQ9InJvdzEiPgorICAgIDx0aCBzdHlsZT0nd2lkdGg6IDEwZW07Jz5IZWFkZXIgMSA8L3RoPgorICAgIDx0ZCBzdHlsZT0nd2lkdGg6IDE1ZW07Jz5DZWxsIDEgPC90ZD4KKyAgICA8dGQ+Q2VsbCAyPC90ZD4KKyAgICA8L3RyPgorICAgIDx0ciBpZD0icm93MiI+CisgICAgPHRoPkhlYWRlciAyIDwvdGg+CisgICAgPHRkPkNlbGwgMyA8L3RkPgorICAgIDx0ZD5DZWxsIDQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGlkPSJyb3czIj4KKyAgICA8dGg+SGVhZGVyIDMgPC90aD4KKyAgICA8dGQ+Q2VsbCA1IDwvdGQ+CisgICAgPHRkPkNlbGwgNiA8L3RkPgorICAgIDwvdHI+Cis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTM3MC5odG1sIGIvVGVzdEZpbGVzL1QxMzcwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1MGFhMgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTM3MC5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKworPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cit0YWJsZSB7IGJvcmRlcjogbWVkaXVtIHNvbGlkIHJlZDsgfQordGQgeyBib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsgfQordGggeyBib3JkZXI6IHRoaW4gc29saWQgYXF1YTsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+dGFibGUtbGF5b3V0OiBhdXRvPC9wPgorPHRhYmxlPgorICAgIDxjYXB0aW9uPlRoaXMgaXMgYSBzaW1wbGUgM3gzIHRhYmxlPC9jYXB0aW9uPgorICAgIDx0ciBpZD0icm93MSI+CisgICAgPHRoIHN0eWxlPSd3aWR0aDogMjAlOyc+SGVhZGVyIDEgPC90aD4KKyAgICA8dGQgc3R5bGU9J3dpZHRoOiA0MCU7Jz5DZWxsIDEgPC90ZD4KKyAgICA8dGQgc3R5bGU9J3dpZHRoOiA0MCU7Jz5DZWxsIDI8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGlkPSJyb3cyIj4KKyAgICA8dGg+SGVhZGVyIDIgPC90aD4KKyAgICA8dGQ+Q2VsbCAzIDwvdGQ+CisgICAgPHRkPkNlbGwgNDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHIgaWQ9InJvdzMiPgorICAgIDx0aD5IZWFkZXIgMyA8L3RoPgorICAgIDx0ZD5DZWxsIDUgPC90ZD4KKyAgICA8dGQ+Q2VsbCA2IDwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxMzgwLmh0bWwgYi9UZXN0RmlsZXMvVDEzODAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjRiMjEwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxMzgwLmh0bWwKQEAgLTAsMCArMSwzMSBAQAorCis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3RhYmxlIHsgYm9yZGVyOiBtZWRpdW0gc29saWQgcmVkOyB9Cit0ZCB7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBoZWlnaHQ6IDUwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgfQordGggeyBib3JkZXI6IHRoaW4gc29saWQgYXF1YTsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgaGVpZ2h0OiA1MHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPnRhYmxlLWxheW91dDogYXV0bzwvcD4KKzx0YWJsZT4KKyAgICA8Y2FwdGlvbj5UaGlzIGlzIGEgc2ltcGxlIDN4MyB0YWJsZTwvY2FwdGlvbj4KKyAgICA8dHIgaWQ9InJvdzEiPgorICAgIDx0aCBzdHlsZT0nd2lkdGg6IDIwJTsnPkhlYWRlciAxIDwvdGg+CisgICAgPHRkIHN0eWxlPSd3aWR0aDogNDAlOyc+Q2VsbCAxIDwvdGQ+CisgICAgPHRkIHN0eWxlPSd3aWR0aDogNDAlOyc+Q2VsbCAyPC90ZD4KKyAgICA8L3RyPgorICAgIDx0ciBpZD0icm93MiI+CisgICAgPHRoPkhlYWRlciAyIDwvdGg+CisgICAgPHRkPkNlbGwgMyA8L3RkPgorICAgIDx0ZD5DZWxsIDQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGlkPSJyb3czIj4KKyAgICA8dGg+SGVhZGVyIDMgPC90aD4KKyAgICA8dGQ+Q2VsbCA1IDwvdGQ+CisgICAgPHRkPkNlbGwgNiA8L3RkPgorICAgIDwvdHI+Cis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTM5MC5odG1sIGIvVGVzdEZpbGVzL1QxMzkwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjMDM3NgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTM5MC5odG1sCkBAIC0wLDAgKzEsMzIgQEAKKworPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cit0YWJsZSB7IGJvcmRlcjogbWVkaXVtIHNvbGlkIHJlZDsgfQordGQgeyBib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgaGVpZ2h0OiA1MHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KK3RoIHsgYm9yZGVyOiB0aGluIHNvbGlkIGFxdWE7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IGhlaWdodDogNTBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB9Cit0ciNyb3czIHsgdmlzaWJpbGl0eTogY29sbGFwc2UgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+dG9kbyB0aGlzIGRvZXNuJ3Qgd29yazwvcD4KKzx0YWJsZT4KKyAgICA8Y2FwdGlvbj5UaGlzIGlzIGEgc2ltcGxlIDN4MyB0YWJsZTwvY2FwdGlvbj4KKyAgICA8dHIgaWQ9InJvdzEiPgorICAgIDx0aCBzdHlsZT0nd2lkdGg6IDIwJTsnPkhlYWRlciAxIDwvdGg+CisgICAgPHRkIHN0eWxlPSd3aWR0aDogNDAlOyc+Q2VsbCAxIDwvdGQ+CisgICAgPHRkIHN0eWxlPSd3aWR0aDogNDAlOyc+Q2VsbCAyPC90ZD4KKyAgICA8L3RyPgorICAgIDx0ciBpZD0icm93MiI+CisgICAgPHRoPkhlYWRlciAyIDwvdGg+CisgICAgPHRkPkNlbGwgMyA8L3RkPgorICAgIDx0ZD5DZWxsIDQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGlkPSJyb3czIj4KKyAgICA8dGg+SGVhZGVyIDMgPC90aD4KKyAgICA8dGQ+Q2VsbCA1IDwvdGQ+CisgICAgPHRkPkNlbGwgNiA8L3RkPgorICAgIDwvdHI+Cis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTQwMC5odG1sIGIvVGVzdEZpbGVzL1QxNDAwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4ODMwYQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTQwMC5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKworPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cit0YWJsZSB7IGJvcmRlcjogbWVkaXVtIHNvbGlkIHJlZDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgfQordGQgeyBib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgaGVpZ2h0OiA1MHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KK3RoIHsgYm9yZGVyOiB0aGluIHNvbGlkIGFxdWE7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IGhlaWdodDogNTBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD50b2RvIHRoaXMgZG9lc24ndCB3b3JrPC9wPgorPHRhYmxlPgorICAgIDxjYXB0aW9uPlRoaXMgaXMgYSBzaW1wbGUgM3gzIHRhYmxlPC9jYXB0aW9uPgorICAgIDx0ciBpZD0icm93MSI+CisgICAgPHRoIHN0eWxlPSd3aWR0aDogMjAlOyc+SGVhZGVyIDEgPC90aD4KKyAgICA8dGQgc3R5bGU9J3dpZHRoOiA0MCU7Jz5DZWxsIDEgPC90ZD4KKyAgICA8dGQgc3R5bGU9J3dpZHRoOiA0MCU7Jz5DZWxsIDI8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGlkPSJyb3cyIj4KKyAgICA8dGg+SGVhZGVyIDIgPC90aD4KKyAgICA8dGQ+Q2VsbCAzIDwvdGQ+CisgICAgPHRkPkNlbGwgNDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHIgaWQ9InJvdzMiPgorICAgIDx0aD5IZWFkZXIgMyA8L3RoPgorICAgIDx0ZD5DZWxsIDUgPC90ZD4KKyAgICA8dGQ+Q2VsbCA2IDwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxNDEwLmh0bWwgYi9UZXN0RmlsZXMvVDE0MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTY2OWI0Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxNDEwLmh0bWwKQEAgLTAsMCArMSwzMSBAQAorCis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3RhYmxlIHsgYm9yZGVyOiBtZWRpdW0gc29saWQgcmVkOyBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOyB9Cit0ZCB7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBoZWlnaHQ6IDUwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgfQordGggeyBib3JkZXI6IHRoaW4gc29saWQgYXF1YTsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgaGVpZ2h0OiA1MHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPnRvZG8gdGhpcyBkb2Vzbid0IHdvcms8L3A+Cis8dGFibGU+CisgICAgPGNhcHRpb24+VGhpcyBpcyBhIHNpbXBsZSAzeDMgdGFibGU8L2NhcHRpb24+CisgICAgPHRyIGlkPSJyb3cxIj4KKyAgICA8dGggc3R5bGU9J3dpZHRoOiAyMCU7Jz5IZWFkZXIgMSA8L3RoPgorICAgIDx0ZCBzdHlsZT0nd2lkdGg6IDQwJTsnPkNlbGwgMSA8L3RkPgorICAgIDx0ZCBzdHlsZT0nd2lkdGg6IDQwJTsnPkNlbGwgMjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHIgaWQ9InJvdzIiPgorICAgIDx0aD5IZWFkZXIgMiA8L3RoPgorICAgIDx0ZD5DZWxsIDMgPC90ZD4KKyAgICA8dGQ+Q2VsbCA0PC90ZD4KKyAgICA8L3RyPgorICAgIDx0ciBpZD0icm93MyI+CisgICAgPHRoPkhlYWRlciAzIDwvdGg+CisgICAgPHRkPkNlbGwgNSA8L3RkPgorICAgIDx0ZD5DZWxsIDYgPC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDE0MjAuaHRtbCBiL1Rlc3RGaWxlcy9UMTQyMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNTcwYTcKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDE0MjAuaHRtbApAQCAtMCwwICsxLDMxIEBACisKKzxodG1sPgorPGhlYWQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgordGFibGUgeyBib3JkZXI6IG1lZGl1bSBzb2xpZCByZWQ7IGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7IH0KK3RkIHsgYm9yZGVyOiB0aGluIHNvbGlkIGJsdWU7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IGhlaWdodDogNTBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB9Cit0aCB7IGJvcmRlcjogdGhpbiBzb2xpZCBhcXVhOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBoZWlnaHQ6IDUwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+dG9kbyB0aGlzIGhhcyBkaWZmZXJlbnQgYmVoYXZpb3IgYmV0d2VlbiB3b3JkIGFuZCBJRTwvcD4KKzx0YWJsZT4KKyAgICA8Y2FwdGlvbj5UaGlzIGlzIGEgc2ltcGxlIDN4MyB0YWJsZTwvY2FwdGlvbj4KKyAgICA8dHIgaWQ9InJvdzEiPgorICAgIDx0aCBzdHlsZT0nd2lkdGg6IDIwJTsnPkhlYWRlciAxIDwvdGg+CisgICAgPHRkIHN0eWxlPSd3aWR0aDogNDAlOyc+Q2VsbCAxIDwvdGQ+CisgICAgPHRkIHN0eWxlPSd3aWR0aDogNDAlOyc+Q2VsbCAyPC90ZD4KKyAgICA8L3RyPgorICAgIDx0ciBpZD0icm93MiI+CisgICAgPHRoPkhlYWRlciAyIDwvdGg+CisgICAgPHRkPkNlbGwgMyA8L3RkPgorICAgIDx0ZD5DZWxsIDQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGlkPSJyb3czIj4KKyAgICA8dGg+SGVhZGVyIDMgPC90aD4KKyAgICA8dGQ+Q2VsbCA1IDwvdGQ+CisgICAgPHRkPkNlbGwgNiA8L3RkPgorICAgIDwvdHI+Cis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTQzMC5odG1sIGIvVGVzdEZpbGVzL1QxNDMwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3NzkxYgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTQzMC5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKworPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cit0YWJsZSB7IGJvcmRlcjogbWVkaXVtIHNvbGlkIHJlZDsgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsgYm9yZGVyLXNwYWNpbmc6IDJlbTsgfQordGQgeyBib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgaGVpZ2h0OiA1MHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KK3RoIHsgYm9yZGVyOiB0aGluIHNvbGlkIGFxdWE7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IGhlaWdodDogNTBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD50b2RvIHdvcmtzIGZvciBjaHJvbWUsIG5vdCBmb3IgaWUgLyB3b3JkPC9wPgorPHRhYmxlPgorICAgIDxjYXB0aW9uPlRoaXMgaXMgYSBzaW1wbGUgM3gzIHRhYmxlPC9jYXB0aW9uPgorICAgIDx0ciBpZD0icm93MSI+CisgICAgPHRoIHN0eWxlPSd3aWR0aDogMjAlOyc+SGVhZGVyIDEgPC90aD4KKyAgICA8dGQgc3R5bGU9J3dpZHRoOiA0MCU7Jz5DZWxsIDEgPC90ZD4KKyAgICA8dGQgc3R5bGU9J3dpZHRoOiA0MCU7Jz5DZWxsIDI8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGlkPSJyb3cyIj4KKyAgICA8dGg+SGVhZGVyIDIgPC90aD4KKyAgICA8dGQ+Q2VsbCAzIDwvdGQ+CisgICAgPHRkPkNlbGwgNDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHIgaWQ9InJvdzMiPgorICAgIDx0aD5IZWFkZXIgMyA8L3RoPgorICAgIDx0ZD5DZWxsIDUgPC90ZD4KKyAgICA8dGQ+Q2VsbCA2IDwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxNDQwLmh0bWwgYi9UZXN0RmlsZXMvVDE0NDAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmUxNTUyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxNDQwLmh0bWwKQEAgLTAsMCArMSwzMSBAQAorCis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3RhYmxlIHsgYm9yZGVyOiBtZWRpdW0gc29saWQgcmVkOyBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOyBib3JkZXItc3BhY2luZzogMmVtOyBiYWNrZ3JvdW5kOiB5ZWxsb3c7IGVtcHR5LWNlbGxzOiBoaWRlOyB9Cit0ZCB7IGJvcmRlcjogdGhpbiBzb2xpZCBibHVlOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBoZWlnaHQ6IDUwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgYmFja2dyb3VuZDogcmVkOyB9Cit0aCB7IGJvcmRlcjogdGhpbiBzb2xpZCBhcXVhOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBoZWlnaHQ6IDUwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgYmFja2dyb3VuZDogYmx1ZTsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+dG9kbyB3b3JrcyBmb3IgaWUsIG5vdCBmb3Igd29yZDwvcD4KKzx0YWJsZT4KKyAgICA8Y2FwdGlvbj5UaGlzIGlzIGEgc2ltcGxlIDN4MyB0YWJsZTwvY2FwdGlvbj4KKyAgICA8dHIgaWQ9InJvdzEiPgorICAgIDx0aCBzdHlsZT0nd2lkdGg6IDIwJTsnPkhlYWRlciAxIDwvdGg+CisgICAgPHRkIHN0eWxlPSd3aWR0aDogNDAlOyc+Q2VsbCAxIDwvdGQ+CisgICAgPHRkIHN0eWxlPSd3aWR0aDogNDAlOyc+Q2VsbCAyPC90ZD4KKyAgICA8L3RyPgorICAgIDx0ciBpZD0icm93MiI+CisgICAgPHRoPkhlYWRlciAyIDwvdGg+CisgICAgPHRkPkNlbGwgMyA8L3RkPgorICAgIDx0ZD5DZWxsIDQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGlkPSJyb3czIj4KKyAgICA8dGg+SGVhZGVyIDMgPC90aD4KKyAgICA8dGQ+Q2VsbCA1IDwvdGQ+CisgICAgPHRkIHN0eWxlPSd2aXNpYmlsaXR5OiBoaWRkZW47Jz48L3RkPgorICAgIDwvdHI+Cis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTQ1MC5odG1sIGIvVGVzdEZpbGVzL1QxNDUwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiOTBhYwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTQ1MC5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKworPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cit0YWJsZSB7IGJvcmRlcjogbWVkaXVtIHNvbGlkIHJlZDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgYmFja2dyb3VuZDogeWVsbG93OyB9Cit0aCB7IGJvcmRlcjogdGhpbiBzb2xpZCBibGFjazsgYmFja2dyb3VuZDogd2hpdGU7IH0KK3RkIHsgYm9yZGVyOiB0aGluIHNvbGlkIGJsdWU7IGJhY2tncm91bmQ6IGFxdWE7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPjwvcD4KKzx0YWJsZT4KKyAgICA8Y2FwdGlvbj5UaGlzIGlzIGEgc2ltcGxlIDN4MyB0YWJsZTwvY2FwdGlvbj4KKyAgICA8dHIgaWQ9InJvdzEiPgorICAgIDx0aCBzdHlsZT0nd2lkdGg6IDIwJTsnPkhlYWRlciAxIDwvdGg+CisgICAgPHRkIHN0eWxlPSd3aWR0aDogNDAlOyc+Q2VsbCAxIDwvdGQ+CisgICAgPHRkIHN0eWxlPSd3aWR0aDogNDAlOyc+Q2VsbCAyPC90ZD4KKyAgICA8L3RyPgorICAgIDx0ciBpZD0icm93MiI+CisgICAgPHRoPkhlYWRlciAyIDwvdGg+CisgICAgPHRkPkNlbGwgMyA8L3RkPgorICAgIDx0ZD5DZWxsIDQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGlkPSJyb3czIj4KKyAgICA8dGg+SGVhZGVyIDMgPC90aD4KKyAgICA8dGQ+Q2VsbCA1IDwvdGQ+CisgICAgPHRkIHN0eWxlPSdib3JkZXItc3R5bGU6IGhpZGRlbjsnPkNlbGwgNjwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxNDYwLmh0bWwgYi9UZXN0RmlsZXMvVDE0NjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE2ZTZmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxNDYwLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPGh0bWw+Cis8aGVhZD4KKyAgICA8TElOSyByZWw9J3N0eWxlc2hlZXQnIGhyZWY9J3Rlc3QuY3NzJyB0eXBlPSd0ZXh0L2NzcycvPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8ZGl2IGNsYXNzPSdjMSc+CisgICAgPGgxIHN0eWxlPSdjb2xvcjogYmx1ZSc+SHRtbCBIZWFkaW5nPC9oMT4KKyAgICA8cD5meno8L3A+CisgICAgPGgyIGNsYXNzPSdjMScgaWQ9J2kwMSc+SHRtbCBIZWFkaW5nPC9oMj4KKyAgICA8cD5meno8L3A+CisgICAgPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxNDcwLmh0bWwgYi9UZXN0RmlsZXMvVDE0NzAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQ4YzAwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxNDcwLmh0bWwKQEAgLTAsMCArMSwzMSBAQAorCis8aHRtbD4KKzxoZWFkPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3RhYmxlIHsgdGFibGUtbGF5b3V0OiBmaXhlZCB9Cit0YWJsZSB7IGJvcmRlcjogbWVkaXVtIHNvbGlkIHJlZDsgfQordGQgeyBib3JkZXI6IHRoaW4gc29saWQgYmx1ZTsgfQordGggeyBib3JkZXI6IHRoaW4gc29saWQgYXF1YTsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHRhYmxlPgorICAgIDxjYXB0aW9uPlRoaXMgaXMgYSBzaW1wbGUgM3gzIHRhYmxlPC9jYXB0aW9uPgorICAgIDx0ciBpZD0icm93MSI+CisgICAgPHRoPkhlYWRlciAxIDwvdGg+CisgICAgPHRkPkNlbGwgMSA8L3RkPgorICAgIDx0ZD5DZWxsIDI8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGlkPSJyb3cyIj4KKyAgICA8dGg+SGVhZGVyIDIgPC90aD4KKyAgICA8dGQ+Q2VsbCAzIDwvdGQ+CisgICAgPHRkPkNlbGwgNDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHIgaWQ9InJvdzMiPgorICAgIDx0aD5IZWFkZXIgMyA8L3RoPgorICAgIDx0ZD5DZWxsIDUgPC90ZD4KKyAgICA8dGQ+Q2VsbCA2IDwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxNDgwLmh0bWwgYi9UZXN0RmlsZXMvVDE0ODAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTlhZDBjCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxNDgwLmh0bWwKQEAgLTAsMCArMSwxMiBAQAorPGh0bWw+Cis8aGVhZD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkh0bWwgSGVhZGluZzwvaDE+CisgICAgPHA+Znp6PC9wPgorICAgIDxoMj5IdG1sIEhlYWRpbmc8L2gyPgorICAgIDxwPmZ6ejwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDE0OTAuaHRtbCBiL1Rlc3RGaWxlcy9UMTQ5MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NjNmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDE0OTAuaHRtbApAQCAtMCwwICsxLDE0IEBACisKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+Q29tcGFyaXNvbiBvZiBwb3NpdGlvbmluZyBzY2hlbWVzPC9USVRMRT4KKzwvSEVBRD4KKzxCT0RZPgorPFA+QmVnaW5uaW5nIG9mIGJvZHkgY29udGVudHMuCis8U1BBTiBpZD0ib3V0ZXIiPiBTdGFydCBvZiBvdXRlciBjb250ZW50cy4KKzxTUEFOIGlkPSJpbm5lciI+IElubmVyIGNvbnRlbnRzLjwvU1BBTj4KK0VuZCBvZiBvdXRlciBjb250ZW50cy48L1NQQU4+CitFbmQgb2YgYm9keSBjb250ZW50cy4KKzwvUD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDE1MDAuaHRtbCBiL1Rlc3RGaWxlcy9UMTUwMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMzZlZTgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDE1MDAuaHRtbApAQCAtMCwwICsxLDE2IEBACisKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+TG93ZXJjYXNlIGxhdGluIG51bWJlcmluZzwvVElUTEU+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgordWwgeyBsaXN0LXN0eWxlLWltYWdlOiB1cmwoInN0YXIucG5nIikgfQorPC9zdHlsZT4KKzwvSEVBRD4KKzxCT0RZPgorPG9sPgorPGxpPiBUaGlzIGlzIHRoZSBmaXJzdCBpdGVtLjwvbGk+Cis8bGk+IFRoaXMgaXMgdGhlIHNlY29uZCBpdGVtLjwvbGk+Cis8bGk+IFRoaXMgaXMgdGhlIHRoaXJkIGl0ZW0uPC9saT4KKzwvb2w+Cis8L0JPRFk+Cis8L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxNTEwLmh0bWwgYi9UZXN0RmlsZXMvVDE1MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWZiZDEwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxNTEwLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorCis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkNvbXBhcmlzb24gb2YgaW5zaWRlL291dHNpZGUgcG9zaXRpb248L1RJVExFPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK3VsIHsgbGlzdC1zdHlsZTogb3V0c2lkZSB9Cit1bC5jb21wYWN0IHsgbGlzdC1zdHlsZTogaW5zaWRlIH0KKzwvc3R5bGU+Cis8L0hFQUQ+Cis8Qk9EWT4KKzxVTD4KKzxsaT5maXJzdCBsaXN0IGl0ZW0gY29tZXMgZmlyc3Q8L2xpPgorPGxpPnNlY29uZCBsaXN0IGl0ZW0gY29tZXMgc2Vjb25kPC9saT4KKzwvVUw+Cis8VUwgY2xhc3M9ImNvbXBhY3QiPgorPGxpPmZpcnN0IGxpc3QgaXRlbSBjb21lcyBmaXJzdDwvbGk+Cis8bGk+c2Vjb25kIGxpc3QgaXRlbSBjb21lcyBzZWNvbmQ8L2xpPgorPC9VTD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDE1MjAuaHRtbCBiL1Rlc3RGaWxlcy9UMTUyMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYWY0MTcKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDE1MjAuaHRtbApAQCAtMCwwICsxLDE3IEBACis8SFRNTD4KKzxIRUFEPgorPFRJVExFPldBUk5JTkc6IFVuZXhwZWN0ZWQgcmVzdWx0cyBkdWUgdG8gY2FzY2FkZTwvVElUTEU+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorb2wuYWxwaGEgbGkgeyBsaXN0LXN0eWxlOiBsb3dlci1hbHBoYSB9Cit1bCBsaSB7IGxpc3Qtc3R5bGU6IGRpc2MgfQorPC9zdHlsZT4KKzwvSEVBRD4KKzxCT0RZPgorPG9sIGNsYXNzPSJhbHBoYSI+Cis8bGk+bGV2ZWwgMTwvbGk+Cis8VUw+Cis8bGk+bGV2ZWwgMjwvbGk+Cis8L1VMPgorPC9vbD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDE1MzAuaHRtbCBiL1Rlc3RGaWxlcy9UMTUzMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MjE4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDE1MzAuaHRtbApAQCAtMCwwICsxLDE3IEBACis8SFRNTD4KKzxIRUFEPgorPFRJVExFPldBUk5JTkc6IFVuZXhwZWN0ZWQgcmVzdWx0cyBkdWUgdG8gY2FzY2FkZTwvVElUTEU+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorb2wgbGkgeyBsaXN0LXN0eWxlOiBsb3dlci1hbHBoYSB9Cit1bCBsaSB7IGxpc3Qtc3R5bGU6IGRpc2MgfQorPC9zdHlsZT4KKzwvSEVBRD4KKzxCT0RZPgorPG9sIGNsYXNzPSJhbHBoYSI+Cis8bGk+bGV2ZWwgMTwvbGk+Cis8VUw+Cis8bGk+bGV2ZWwgMjwvbGk+Cis8L1VMPgorPC9vbD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDE1NDAuaHRtbCBiL1Rlc3RGaWxlcy9UMTU0MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMmUzMzcKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDE1NDAuaHRtbApAQCAtMCwwICsxLDE3IEBACis8SFRNTD4KKzxIRUFEPgorPFRJVExFPldBUk5JTkc6IFVuZXhwZWN0ZWQgcmVzdWx0cyBkdWUgdG8gY2FzY2FkZTwvVElUTEU+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorb2wgbGkgeyBsaXN0LXN0eWxlOiBkZWNpbWFsLWxlYWRpbmctemVybyB9Cit1bCBsaSB7IGxpc3Qtc3R5bGU6IGNpcmNsZSB9Cis8L3N0eWxlPgorPC9IRUFEPgorPEJPRFk+Cis8b2wgY2xhc3M9ImFscGhhIj4KKzxsaT5sZXZlbCAxPC9saT4KKzxVTD4KKzxsaT5sZXZlbCAyPC9saT4KKzwvVUw+Cis8L29sPgorPC9CT0RZPgorPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTU1MC5odG1sIGIvVGVzdEZpbGVzL1QxNTUwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhNjY3OAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTU1MC5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+V0FSTklORzogVW5leHBlY3RlZCByZXN1bHRzIGR1ZSB0byBjYXNjYWRlPC9USVRMRT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitvbCBsaSB7IGxpc3Qtc3R5bGU6IHVwcGVyLXJvbWFuIH0KK3VsIGxpIHsgbGlzdC1zdHlsZTogc3F1YXJlIH0KKzwvc3R5bGU+Cis8L0hFQUQ+Cis8Qk9EWT4KKzxvbCBjbGFzcz0iYWxwaGEiPgorPGxpPmxldmVsIDE8L2xpPgorPFVMPgorPGxpPmxldmVsIDI8L2xpPgorPC9VTD4KKzwvb2w+Cis8L0JPRFk+Cis8L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxNTYwLmh0bWwgYi9UZXN0RmlsZXMvVDE1NjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2IxOTllCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxNTYwLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5XQVJOSU5HOiBVbmV4cGVjdGVkIHJlc3VsdHMgZHVlIHRvIGNhc2NhZGU8L1RJVExFPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK29sIGxpIHsgbGlzdC1zdHlsZTogbG93ZXItbGF0aW4gfQordWwgbGkgeyBsaXN0LXN0eWxlOiB1cHBlci1sYXRpbiB9Cis8L3N0eWxlPgorPC9IRUFEPgorPEJPRFk+Cis8b2wgY2xhc3M9ImFscGhhIj4KKzxsaT5sZXZlbCAxPC9saT4KKzxVTD4KKzxsaT5sZXZlbCAyPC9saT4KKzwvVUw+Cis8L29sPgorPC9CT0RZPgorPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTU3MC5odG1sIGIvVGVzdEZpbGVzL1QxNTcwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4MTI0YgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTU3MC5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+V0FSTklORzogVW5leHBlY3RlZCByZXN1bHRzIGR1ZSB0byBjYXNjYWRlPC9USVRMRT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitvbCBsaSB7IGxpc3Qtc3R5bGU6IHVwcGVyLWFscGhhIH0KK3VsIGxpIHsgbGlzdC1zdHlsZTogbG93ZXItYWxwaGEgfQorPC9zdHlsZT4KKzwvSEVBRD4KKzxCT0RZPgorPG9sIGNsYXNzPSJhbHBoYSI+Cis8bGk+bGV2ZWwgMTwvbGk+Cis8VUw+Cis8bGk+bGV2ZWwgMjwvbGk+Cis8L1VMPgorPC9vbD4KKzwvQk9EWT4KKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDE1ODAuaHRtbCBiL1Rlc3RGaWxlcy9UMTU4MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MGQ2OTkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDE1ODAuaHRtbApAQCAtMCwwICsxLDE3IEBACis8SFRNTD4KKzxIRUFEPgorPFRJVExFPldBUk5JTkc6IFVuZXhwZWN0ZWQgcmVzdWx0cyBkdWUgdG8gY2FzY2FkZTwvVElUTEU+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorb2wgbGkgeyBsaXN0LXN0eWxlOiB1cHBlci1yb21hbiB9Cit1bCBsaSB7IGxpc3Qtc3R5bGU6IGxvd2VyLWdyZWVrIH0KKzwvc3R5bGU+Cis8L0hFQUQ+Cis8Qk9EWT4KKzxvbCBjbGFzcz0iYWxwaGEiPgorPGxpPmxldmVsIDE8L2xpPgorPFVMPgorPGxpPmxldmVsIDI8L2xpPgorPC9VTD4KKzwvb2w+Cis8L0JPRFk+Cis8L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxNTkwLmh0bWwgYi9UZXN0RmlsZXMvVDE1OTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmY0NDYwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxNTkwLmh0bWwKQEAgLTAsMCArMSw0MyBAQAorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5UZXN0IG1hbnkgYm9yZGVyIHNpemVzPC9USVRMRT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cis8L3N0eWxlPgorPC9IRUFEPgorPEJPRFk+Cis8cCBzdHlsZT0nYm9yZGVyOnNvbGlkIGJsYWNrIDAuNXB0Oyc+Ym9yZGVyOnNvbGlkIGJsYWNrIDAuNXB0OzwvcD4KKzxwLz4KKzxwIHN0eWxlPSdib3JkZXI6c29saWQgcmVkIDEuMHB0Oyc+Ym9yZGVyOnNvbGlkIHJlZCAxLjBwdDs8L3A+Cis8cC8+Cis8cCBzdHlsZT0nYm9yZGVyOnNvbGlkIGdyZWVuIDIuMHB0Oyc+Ym9yZGVyOnNvbGlkIGdyZWVuIDIuMHB0OzwvcD4KKzxwLz4KKzxwIHN0eWxlPSdib3JkZXI6c29saWQgcmdiKDI1NSwyNTUsMCkgNC4wcHQ7Jz5ib3JkZXI6c29saWQgcmdiKDI1NSwyNTUsMCkgNC4wcHQ7PC9wPgorPHAvPgorPHAgc3R5bGU9J2JvcmRlcjpzb2xpZCBibGFjayB0aGluOyc+Ym9yZGVyOnNvbGlkIGJsYWNrIHRoaW47PC9wPgorPHAvPgorPHAgc3R5bGU9J2JvcmRlcjpzb2xpZCAjRjAwIG1lZGl1bTsnPmJvcmRlcjpzb2xpZCAjRjAwIG1lZGl1bTs8L3A+Cis8cC8+Cis8cCBzdHlsZT0nYm9yZGVyOnNvbGlkICMwMEZGMDAgdGhpY2s7Jz5ib3JkZXI6c29saWQgIzAwRkYwMCB0aGljazs8L3A+Cis8cC8+Cis8cCBzdHlsZT0nYm9yZGVyOnNvbGlkIHJnYigwJSwgMCUsIDEwMCUpIDFweDsnPmJvcmRlcjpzb2xpZCByZ2IoMCUsIDAlLCAxMDAlKSAxcHg7PC9wPgorPHAvPgorPHAgc3R5bGU9J2JvcmRlcjpzb2xpZCBibGFjayAycHg7Jz5ib3JkZXI6c29saWQgYmxhY2sgMnB4OzwvcD4KKzxwLz4KKzxwIHN0eWxlPSdib3JkZXI6c29saWQgYmxhY2sgM3B4Oyc+Ym9yZGVyOnNvbGlkIGJsYWNrIDNweDs8L3A+Cis8cC8+Cis8cCBzdHlsZT0nYm9yZGVyOnNvbGlkIGJsYWNrIDRweDsnPmJvcmRlcjpzb2xpZCBibGFjayA0cHg7PC9wPgorPHAvPgorPHAgc3R5bGU9J2JvcmRlcjpzb2xpZCBibGFjayA4cHg7Jz5ib3JkZXI6c29saWQgYmxhY2sgOHB4OzwvcD4KKzxwLz4KKzxwIHN0eWxlPSdib3JkZXI6c29saWQgYmxhY2sgMXB4Oyc+Ym9yZGVyOnNvbGlkIGJsYWNrIDFweDs8L3A+Cis8cC8+Cis8cCBzdHlsZT0nYm9yZGVyOnNvbGlkIGJsYWNrIDAuMWluOyc+Ym9yZGVyOnNvbGlkIGJsYWNrIDAuMWluOzwvcD4KKzxwLz4KKzxwIHN0eWxlPSdib3JkZXI6c29saWQgYmxhY2sgMC4yNWluOyc+Ym9yZGVyOnNvbGlkIGJsYWNrIDAuMjVpbjs8L3A+Cis8cC8+Cis8cCBzdHlsZT0nYm9yZGVyOnNvbGlkIGJsYWNrIDAuMWNtOyc+Ym9yZGVyOnNvbGlkIGJsYWNrIDAuMWNtOzwvcD4KKzxwLz4KKzxwIHN0eWxlPSdib3JkZXI6c29saWQgYmxhY2sgMXBjOyc+Ym9yZGVyOnNvbGlkIGJsYWNrIDFwYzs8L3A+Cis8cC8+Cis8L0JPRFk+Cis8L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxNTkxLmh0bWwgYi9UZXN0RmlsZXMvVDE1OTEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDA2NjU3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxNTkxLmh0bWwKQEAgLTAsMCArMSwxOSBAQAorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5UZXN0IG1hbnkgYm9yZGVyIHNpemVzPC9USVRMRT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cis8L3N0eWxlPgorPC9IRUFEPgorPEJPRFk+Cis8cCBzdHlsZT0nYm9yZGVyOnNvbGlkIGJsYWNrIDAuMWluOyc+Ym9yZGVyOnNvbGlkIGJsYWNrIDAuMWluOzwvcD4KKzxwLz4KKzxwIHN0eWxlPSdib3JkZXI6c29saWQgYmxhY2sgMC4yNWluOyc+Ym9yZGVyOnNvbGlkIGJsYWNrIDAuMjVpbjs8L3A+Cis8cC8+Cis8cCBzdHlsZT0nYm9yZGVyOnNvbGlkIGJsYWNrIDAuMWNtOyc+Ym9yZGVyOnNvbGlkIGJsYWNrIDAuMWNtOzwvcD4KKzxwLz4KKzxwIHN0eWxlPSdib3JkZXI6c29saWQgYmxhY2sgMXBjOyc+Ym9yZGVyOnNvbGlkIGJsYWNrIDFwYzs8L3A+Cis8cC8+Cis8cCBzdHlsZT0nYm9yZGVyOnNvbGlkIGJsYWNrIDEycHQ7Jz5ib3JkZXI6c29saWQgYmxhY2sgMTJwdDs8L3A+Cis8cC8+Cis8L0JPRFk+Cis8L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxNjEwLmh0bWwgYi9UZXN0RmlsZXMvVDE2MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGJkMjFmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxNjEwLmh0bWwKQEAgLTAsMCArMSw1MyBAQAorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiIgLz4KKzxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTQgKGZpbHRlcmVkKSIgLz4KKzxzdHlsZT4KKy8vPCFbQ0RBVEFbCisKKyZsdDshLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCisgQGZvbnQtZmFjZQorICAgIHtmb250LWZhbWlseTpDYWxpYnJpOworICAgIHBhbm9zZS0xOjIgMTUgNSAyIDIgMiA0IDMgMiA0O30KK0Bmb250LWZhY2UKKyAgICB7Zm9udC1mYW1pbHk6IlRyYWRpdGlvbmFsIEFyYWJpYyI7CisgICAgcGFub3NlLTE6MiAyIDYgMyA1IDQgNSAyIDMgNDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KKyBwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisgICAge21hcmdpbi10b3A6MGluOworICAgIG1hcmdpbi1yaWdodDowaW47CisgICAgbWFyZ2luLWJvdHRvbToxMC4wcHQ7CisgICAgbWFyZ2luLWxlZnQ6MGluOworICAgIGxpbmUtaGVpZ2h0OjExNSU7CisgICAgZm9udC1zaXplOjExLjBwdDsKKyAgICBmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiO30KKy5Nc29DaHBEZWZhdWx0CisgICAge2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7fQorLk1zb1BhcERlZmF1bHQKKyAgICB7bWFyZ2luLWJvdHRvbToxMC4wcHQ7CisgICAgbGluZS1oZWlnaHQ6MTE1JTt9CitAcGFnZSBXb3JkU2VjdGlvbjEKKyAgICB7c2l6ZTo4LjVpbiAxMS4waW47CisgICAgbWFyZ2luOjEuMGluIDEuMGluIDEuMGluIDEuMGluO30KK2Rpdi5Xb3JkU2VjdGlvbjEKKyAgICB7cGFnZTpXb3JkU2VjdGlvbjE7fQorLS0mZ3Q7CisKKy8vXV0+Ly8KKzwvc3R5bGU+CisKKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiPgorCis8ZGl2IGNsYXNzPSJXb3JkU2VjdGlvbjEiPgorCis8cCBjbGFzcz0iTXNvTm9ybWFsIiBhbGlnbj0icmlnaHQiIHN0eWxlPSd0ZXh0LWFsaWduOnJpZ2h0Jz48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJSVEwiIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7bGluZS1oZWlnaHQ6MTE1JTtmb250LWZhbWlseToiVHJhZGl0aW9uYWwgQXJhYmljIiwic2VyaWYiJz4mIzE1NzU7JiMxNjA0OyYjMTU5MzsmIzE2MDQ7JiMxNjA4OyYjMTYwNTsKKyYjMTU3NTsmIzE2MDQ7JiMxNTc1OyYjMTU4MDsmIzE1Nzg7JiMxNjA1OyYjMTU3NTsmIzE1OTM7JiMxNjEwOyYjMTU3Nzs8L3NwYW4+PC9iPjwvcD4KKworPC9kaXY+CisKKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTYyMC5odG1sIGIvVGVzdEZpbGVzL1QxNjIwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyNTc4OAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTYyMC5odG1sCkBAIC0wLDAgKzEsMjYzIEBACivvu788IURPQ1RZUEUgaHRtbCA+PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPjx0aXRsZT48L3RpdGxlPjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29udGVudD0iUG93ZXJUb29scyBmb3IgT3BlbiBYTUwiIC8+PHN0eWxlPnNwYW4geyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IH0KK3AucHQtTm9ybWFsIHsKKyAgICBsaW5lLWhlaWdodDogMTE1LjAlOworICAgIG1hcmdpbi1ib3R0b206IDEwcHQ7CisgICAgbWFyZ2luLWxlZnQ6IDMuMDBpbjsKKyAgICBiYWNrZ3JvdW5kOiAjQzJENjlCOworICAgIGZvbnQtZmFtaWx5OiBCZXJuYXJkIE1UIENvbmRlbnNlZDsKKyAgICBmb250LXNpemU6IDI2cHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250IHsKKyAgICBmb250LWZhbWlseTogQmVybmFyZCBNVCBDb25kZW5zZWQ7CisgICAgZm9udC1zaXplOiAyNnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDAwIHsKKyAgICBsaW5lLWhlaWdodDogMTE1LjAlOworICAgIG1hcmdpbi1ib3R0b206IDEwcHQ7CisgICAgbWFyZ2luLWxlZnQ6IDMuMDBpbjsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSB7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDAyIHsKKyAgICBsaW5lLWhlaWdodDogMTE1LjAlOworICAgIG1hcmdpbi1ib3R0b206IDEwcHQ7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMgeworICAgIGNvbG9yOiAjRkZGRkZGOworICAgIGJhY2tncm91bmQ6ICMxRjQ5N0Q7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorZGl2LnB0LTAwMDAwNCB7CisgICAgYm9yZGVyLXRvcDogc29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMS4wcHQ7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDQuMHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDEuMHB0OworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNC4wcHQ7CisgICAgbWFyZ2luLWxlZnQ6IDAuNTBpbjsKK30KK3AucHQtTm9ybWFsLTAwMDAwNSB7CisgICAgbGluZS1oZWlnaHQ6IDExNS4wJTsKKyAgICBtYXJnaW4tYm90dG9tOiAxMHB0OworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIGJhY2tncm91bmQ6ICNGRkMwMDA7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDYgeworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RhYmxlLnB0LTAwMDAwNyB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQordGQucHQtMDAwMDA4IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAxMzYuNTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzRCQUNDNjsKK30KK3AucHQtTm9ybWFsLTAwMDAwOSB7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LVBsYWNlaG9sZGVyVGV4dCB7CisgICAgY29sb3I6IGJsYWNrOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Cit0ZC5wdC0wMDAwMTAgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDExOC4zcHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICM0QkFDQzY7Cit9CitwLnB0LU5vcm1hbC0wMDAwMTEgeworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQordGQucHQtMDAwMDEyIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAyMTguNTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzRCQUNDNjsKK30KK3RkLnB0LTAwMDAxMyB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTM2LjU1cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICM0QkFDQzY7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNCB7CisgICAgY29sb3I6ICNGRkZGRkY7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDE1IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAxMTguM3B0OworICAgIGJvcmRlci10b3A6IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjQjZEREU4OworfQordGQucHQtMDAwMDE2IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAyMTguNTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0I2RERFODsKK30KK3NwYW4ucHQtUGxhY2Vob2xkZXJUZXh0LTAwMDAxNyB7CisgICAgY29sb3I6IGJsYWNrOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtTm9ybWFsLTAwMDAxOCB7CisgICAgbGluZS1oZWlnaHQ6IDExNS4wJTsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtMDAwMDE5IHsKKyAgICBjb2xvcjogI0ZGRkZGRjsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitkaXYucHQtMDAwMDIwIHsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAxLjBwdDsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKK30KK3AucHQtTm9ybWFsLTAwMDAyMSB7CisgICAgbGluZS1oZWlnaHQ6IDExNS4wJTsKKyAgICBtYXJnaW4tYm90dG9tOiAxMHB0OworICAgIG1hcmdpbi1sZWZ0OiAyLjUwaW47CisgICAgZm9udC1mYW1pbHk6IEJlcm5hcmQgTVQgQ29uZGVuc2VkOworICAgIGZvbnQtc2l6ZTogMjJwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIyIHsKKyAgICBmb250LWZhbWlseTogQmVybmFyZCBNVCBDb25kZW5zZWQ7CisgICAgZm9udC1zaXplOiAyMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjMgeworICAgIGZvbnQtc2l6ZTogMjJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK2JvZHkgeyBtYXJnaW46IDFjbSBhdXRvOyBtYXgtd2lkdGg6IDIwY207IHBhZGRpbmc6IDA7IH08L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2PjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPkNvbnRvc28sIEluYzwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDAwIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5KYW51YXJ5IDMxLCAyMDExPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPkRlYXIgRXJpYyBXaGl0ZSw8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwMiI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+T24gdGhlIEluc2VydCB0YWIsIDwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAzIj50aGUgZ2FsbGVyaWVzIGluY2x1ZGUgaXRlbXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gY29vcmRpbmF0ZTwvc3Bhbj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj4gd2l0aCB0aGUgb3ZlcmFsbCBsb29rIG9mIHlvdXIgZG9jdW1lbnQuPC9zcGFuPjwvcD48ZGl2IGNsYXNzPSJwdC0wMDAwMDQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNiI+SW1wb3J0YW50IG5vdGU6IFlvdXIgbmV3IGN1c3RvbWVyIElEOiAxLjwvc3Bhbj48L3A+PC9kaXY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDAyIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5XaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suPC9zcGFuPjwvcD48ZGl2IGFsaWduPSJsZWZ0Ij48dGFibGUgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDciPjx0cj48dGQgY2xhc3M9InB0LTAwMDAwOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA5Ij48c3BhbiBjbGFzcz0icHQtUGxhY2Vob2xkZXJUZXh0Ij5EZXNjcmlwdGlvbjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxMCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDExIj48c3BhbiBjbGFzcz0icHQtUGxhY2Vob2xkZXJUZXh0Ij5RdWFudGl0eTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxMiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDExIj48c3BhbiBjbGFzcz0icHQtUGxhY2Vob2xkZXJUZXh0Ij5PcmRlciBEYXRlPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDEzIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDkiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTQiPlVuaWN5Y2xlPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTEiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPjg8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMSI+PHNwYW4gY2xhc3M9InB0LVBsYWNlaG9sZGVyVGV4dC0wMDAwMTciPlNlcHRlbWJlciAyNiwgMjAxNTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxMyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA5Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE0Ij5IYW5nIEdsaWRlcjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDExIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj4xPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTEiPjxzcGFuIGNsYXNzPSJwdC1QbGFjZWhvbGRlclRleHQtMDAwMDE3Ij5TZXB0ZW1iZXIgMjYsIDIwMTU8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMTMiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwOSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNCI+SGFuZyBHbGlkZXI8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+Mzwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDExIj48c3BhbiBjbGFzcz0icHQtUGxhY2Vob2xkZXJUZXh0LTAwMDAxNyI+U2VwdGVtYmVyIDI2LCAyMDE1PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDEzIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDkiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTQiPkhhbmcgR2xpZGVyPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTEiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPjE8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMSI+PHNwYW4gY2xhc3M9InB0LVBsYWNlaG9sZGVyVGV4dC0wMDAwMTciPlNlcHRlbWJlciAyNiwgMjAxNTwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE4Ij48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE5Ij4gPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlRoZSBkZXNjcmlwdGlvbiBmb3IgT3JkZXIgIzEgaXMgVW5pY3ljbGUuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlF1YW50aXR5OiA4PC9zcGFuPjwvcD48ZGl2IGNsYXNzPSJwdC0wMDAwMjAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwMiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+RGF0ZTogU2VwdGVtYmVyIDI2LCAyMDE1PC9zcGFuPjwvcD48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlRoZSBkZXNjcmlwdGlvbiBmb3IgT3JkZXIgIzIgaXMgSGFuZyBHbGlkZXIuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlF1YW50aXR5OiAxPC9zcGFuPjwvcD48ZGl2IGNsYXNzPSJwdC0wMDAwMjAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwMiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+RGF0ZTogU2VwdGVtYmVyIDI2LCAyMDE1PC9zcGFuPjwvcD48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlRoZSBkZXNjcmlwdGlvbiBmb3IgT3JkZXIgIzMgaXMgSGFuZyBHbGlkZXIuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlF1YW50aXR5OiAzPC9zcGFuPjwvcD48ZGl2IGNsYXNzPSJwdC0wMDAwMjAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwMiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+RGF0ZTogU2VwdGVtYmVyIDI2LCAyMDE1PC9zcGFuPjwvcD48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlRoZSBkZXNjcmlwdGlvbiBmb3IgT3JkZXIgIzQgaXMgSGFuZyBHbGlkZXIuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlF1YW50aXR5OiAxPC9zcGFuPjwvcD48ZGl2IGNsYXNzPSJwdC0wMDAwMjAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwMiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+RGF0ZTogU2VwdGVtYmVyIDI2LCAyMDE1PC9zcGFuPjwvcD48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPldlIHJlYWxseSBhcHByZWNpYXRlIHlvdXIgYnVzaW5lc3MuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMjEiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjIiPkVyaWMgV2hpdGU8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMyI+PGJyIC8+JiN4MjAwZTs8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMiI+RGlyZWN0b3Igb2YgQ3VzdG9tZXIgUmVsYXRpb25zPC9zcGFuPjwvcD48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTYzMC5odG1sIGIvVGVzdEZpbGVzL1QxNjMwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkOTRhNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTYzMC5odG1sCkBAIC0wLDAgKzEsMjYzIEBACivvu788IURPQ1RZUEUgaHRtbCA+PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPjx0aXRsZT48L3RpdGxlPjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29udGVudD0iUG93ZXJUb29scyBmb3IgT3BlbiBYTUwiIC8+PHN0eWxlPnNwYW4geyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IH0KK3AucHQtTm9ybWFsIHsKKyAgICBsaW5lLWhlaWdodDogMTE1LjAlOworICAgIG1hcmdpbi1ib3R0b206IDEwcHQ7CisgICAgbWFyZ2luLWxlZnQ6IDMuMDBpbjsKKyAgICBiYWNrZ3JvdW5kOiAjQzJENjlCOworICAgIGZvbnQtZmFtaWx5OiBCZXJuYXJkIE1UIENvbmRlbnNlZDsKKyAgICBmb250LXNpemU6IDI2cHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250IHsKKyAgICBmb250LWZhbWlseTogQmVybmFyZCBNVCBDb25kZW5zZWQ7CisgICAgZm9udC1zaXplOiAyNnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDAwIHsKKyAgICBsaW5lLWhlaWdodDogMTE1LjAlOworICAgIG1hcmdpbi1ib3R0b206IDEwcHQ7CisgICAgbWFyZ2luLWxlZnQ6IDMuMDBpbjsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSB7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDAyIHsKKyAgICBsaW5lLWhlaWdodDogMTE1LjAlOworICAgIG1hcmdpbi1ib3R0b206IDEwcHQ7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMgeworICAgIGNvbG9yOiAjRkZGRkZGOworICAgIGJhY2tncm91bmQ6ICMxRjQ5N0Q7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorZGl2LnB0LTAwMDAwNCB7CisgICAgYm9yZGVyLXRvcDogc29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMS4wcHQ7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDQuMHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDEuMHB0OworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNC4wcHQ7CisgICAgbWFyZ2luLWxlZnQ6IDAuNTBpbjsKK30KK3AucHQtTm9ybWFsLTAwMDAwNSB7CisgICAgbGluZS1oZWlnaHQ6IDExNS4wJTsKKyAgICBtYXJnaW4tYm90dG9tOiAxMHB0OworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIGJhY2tncm91bmQ6ICNGRkMwMDA7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDYgeworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RhYmxlLnB0LTAwMDAwNyB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQordGQucHQtMDAwMDA4IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAxMzYuNTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzRCQUNDNjsKK30KK3AucHQtTm9ybWFsLTAwMDAwOSB7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LVBsYWNlaG9sZGVyVGV4dCB7CisgICAgY29sb3I6IGJsYWNrOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Cit0ZC5wdC0wMDAwMTAgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDExOC4zcHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICM0QkFDQzY7Cit9CitwLnB0LU5vcm1hbC0wMDAwMTEgeworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQordGQucHQtMDAwMDEyIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAyMTguNTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzRCQUNDNjsKK30KK3RkLnB0LTAwMDAxMyB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTM2LjU1cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICM0QkFDQzY7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNCB7CisgICAgY29sb3I6ICNGRkZGRkY7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDE1IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAxMTguM3B0OworICAgIGJvcmRlci10b3A6IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjQjZEREU4OworfQordGQucHQtMDAwMDE2IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAyMTguNTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0I2RERFODsKK30KK3NwYW4ucHQtUGxhY2Vob2xkZXJUZXh0LTAwMDAxNyB7CisgICAgY29sb3I6IGJsYWNrOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtTm9ybWFsLTAwMDAxOCB7CisgICAgbGluZS1oZWlnaHQ6IDExNS4wJTsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtMDAwMDE5IHsKKyAgICBjb2xvcjogI0ZGRkZGRjsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitkaXYucHQtMDAwMDIwIHsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAxLjBwdDsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKK30KK3AucHQtTm9ybWFsLTAwMDAyMSB7CisgICAgbGluZS1oZWlnaHQ6IDExNS4wJTsKKyAgICBtYXJnaW4tYm90dG9tOiAxMHB0OworICAgIG1hcmdpbi1sZWZ0OiAyLjUwaW47CisgICAgZm9udC1mYW1pbHk6IEJlcm5hcmQgTVQgQ29uZGVuc2VkOworICAgIGZvbnQtc2l6ZTogMjJwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIyIHsKKyAgICBmb250LWZhbWlseTogQmVybmFyZCBNVCBDb25kZW5zZWQ7CisgICAgZm9udC1zaXplOiAyMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjMgeworICAgIGZvbnQtc2l6ZTogMjJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK2JvZHkgeyBtYXJnaW46IDFjbSBhdXRvOyBtYXgtd2lkdGg6IDIwY207IHBhZGRpbmc6IDA7IH08L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2IGNsYXNzPSJwdC0wMDAwMDQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNiI+SW1wb3J0YW50IG5vdGU6IFlvdXIgbmV3IGN1c3RvbWVyIElEOiAxLjwvc3Bhbj48L3A+PC9kaXY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDAyIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj5XaGVuIHlvdSBjcmVhdGUgcGljdHVyZXMsIGNoYXJ0cywgb3IgZGlhZ3JhbXMsIHRoZXkgYWxzbyBjb29yZGluYXRlIHdpdGggeW91ciBjdXJyZW50IGRvY3VtZW50IGxvb2suPC9zcGFuPjwvcD48ZGl2IGFsaWduPSJsZWZ0Ij48dGFibGUgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDciPjx0cj48dGQgY2xhc3M9InB0LTAwMDAwOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA5Ij48c3BhbiBjbGFzcz0icHQtUGxhY2Vob2xkZXJUZXh0Ij5EZXNjcmlwdGlvbjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxMCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDExIj48c3BhbiBjbGFzcz0icHQtUGxhY2Vob2xkZXJUZXh0Ij5RdWFudGl0eTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxMiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDExIj48c3BhbiBjbGFzcz0icHQtUGxhY2Vob2xkZXJUZXh0Ij5PcmRlciBEYXRlPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDEzIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDkiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTQiPlVuaWN5Y2xlPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTEiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPjg8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMSI+PHNwYW4gY2xhc3M9InB0LVBsYWNlaG9sZGVyVGV4dC0wMDAwMTciPlNlcHRlbWJlciAyNiwgMjAxNTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAxMyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA5Ij48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE0Ij5IYW5nIEdsaWRlcjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDExIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAxIj4xPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTEiPjxzcGFuIGNsYXNzPSJwdC1QbGFjZWhvbGRlclRleHQtMDAwMDE3Ij5TZXB0ZW1iZXIgMjYsIDIwMTU8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMTMiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwOSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNCI+SGFuZyBHbGlkZXI8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMSI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+Mzwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDExIj48c3BhbiBjbGFzcz0icHQtUGxhY2Vob2xkZXJUZXh0LTAwMDAxNyI+U2VwdGVtYmVyIDI2LCAyMDE1PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDEzIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDkiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTQiPkhhbmcgR2xpZGVyPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTEiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPjE8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxMSI+PHNwYW4gY2xhc3M9InB0LVBsYWNlaG9sZGVyVGV4dC0wMDAwMTciPlNlcHRlbWJlciAyNiwgMjAxNTwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE4Ij48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE5Ij4gPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlRoZSBkZXNjcmlwdGlvbiBmb3IgT3JkZXIgIzEgaXMgVW5pY3ljbGUuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlF1YW50aXR5OiA4PC9zcGFuPjwvcD48ZGl2IGNsYXNzPSJwdC0wMDAwMjAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwMiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+RGF0ZTogU2VwdGVtYmVyIDI2LCAyMDE1PC9zcGFuPjwvcD48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlRoZSBkZXNjcmlwdGlvbiBmb3IgT3JkZXIgIzIgaXMgSGFuZyBHbGlkZXIuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlF1YW50aXR5OiAxPC9zcGFuPjwvcD48ZGl2IGNsYXNzPSJwdC0wMDAwMjAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwMiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+RGF0ZTogU2VwdGVtYmVyIDI2LCAyMDE1PC9zcGFuPjwvcD48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlRoZSBkZXNjcmlwdGlvbiBmb3IgT3JkZXIgIzMgaXMgSGFuZyBHbGlkZXIuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlF1YW50aXR5OiAzPC9zcGFuPjwvcD48ZGl2IGNsYXNzPSJwdC0wMDAwMjAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwMiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+RGF0ZTogU2VwdGVtYmVyIDI2LCAyMDE1PC9zcGFuPjwvcD48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlRoZSBkZXNjcmlwdGlvbiBmb3IgT3JkZXIgIzQgaXMgSGFuZyBHbGlkZXIuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPlF1YW50aXR5OiAxPC9zcGFuPjwvcD48ZGl2IGNsYXNzPSJwdC0wMDAwMjAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwMiI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSI+RGF0ZTogU2VwdGVtYmVyIDI2LCAyMDE1PC9zcGFuPjwvcD48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDIiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDEiPldlIHJlYWxseSBhcHByZWNpYXRlIHlvdXIgYnVzaW5lc3MuPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMjEiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjIiPkVyaWMgV2hpdGU8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMyI+PGJyIC8+JiN4MjAwZTs8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMiI+RGlyZWN0b3Igb2YgQ3VzdG9tZXIgUmVsYXRpb25zPC9zcGFuPjwvcD48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTY0MC5odG1sIGIvVGVzdEZpbGVzL1QxNjQwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4MTE0ZQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTY0MC5odG1sCkBAIC0wLDAgKzEsMjYzIEBACivvu788IURPQ1RZUEUgaHRtbCA+PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPjx0aXRsZT48L3RpdGxlPjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29udGVudD0iUG93ZXJUb29scyBmb3IgT3BlbiBYTUwiIC8+PHN0eWxlPnNwYW4geyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IH0KK3AucHQtTm9ybWFsIHsKKyAgICBsaW5lLWhlaWdodDogMTE1LjAlOworICAgIG1hcmdpbi1ib3R0b206IDEwcHQ7CisgICAgbWFyZ2luLWxlZnQ6IDMuMDBpbjsKKyAgICBiYWNrZ3JvdW5kOiAjQzJENjlCOworICAgIGZvbnQtZmFtaWx5OiBCZXJuYXJkIE1UIENvbmRlbnNlZDsKKyAgICBmb250LXNpemU6IDI2cHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250IHsKKyAgICBmb250LWZhbWlseTogQmVybmFyZCBNVCBDb25kZW5zZWQ7CisgICAgZm9udC1zaXplOiAyNnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDAwIHsKKyAgICBsaW5lLWhlaWdodDogMTE1LjAlOworICAgIG1hcmdpbi1ib3R0b206IDEwcHQ7CisgICAgbWFyZ2luLWxlZnQ6IDMuMDBpbjsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMSB7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDAyIHsKKyAgICBsaW5lLWhlaWdodDogMTE1LjAlOworICAgIG1hcmdpbi1ib3R0b206IDEwcHQ7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDMgeworICAgIGNvbG9yOiAjRkZGRkZGOworICAgIGJhY2tncm91bmQ6ICMxRjQ5N0Q7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorZGl2LnB0LTAwMDAwNCB7CisgICAgYm9yZGVyLXRvcDogc29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMS4wcHQ7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDQuMHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDEuMHB0OworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNC4wcHQ7CisgICAgbWFyZ2luLWxlZnQ6IDAuNTBpbjsKK30KK3AucHQtTm9ybWFsLTAwMDAwNSB7CisgICAgbGluZS1oZWlnaHQ6IDExNS4wJTsKKyAgICBtYXJnaW4tYm90dG9tOiAxMHB0OworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIGJhY2tncm91bmQ6ICNGRkMwMDA7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDYgeworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RhYmxlLnB0LTAwMDAwNyB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQordGQucHQtMDAwMDA4IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAxMzYuNTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzRCQUNDNjsKK30KK3AucHQtTm9ybWFsLTAwMDAwOSB7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LVBsYWNlaG9sZGVyVGV4dCB7CisgICAgY29sb3I6IGJsYWNrOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Cit0ZC5wdC0wMDAwMTAgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDExOC4zcHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICM0QkFDQzY7Cit9CitwLnB0LU5vcm1hbC0wMDAwMTEgeworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQordGQucHQtMDAwMDEyIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAyMTguNTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzRCQUNDNjsKK30KK3RkLnB0LTAwMDAxMyB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTM2LjU1cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICM0QkFDQzY7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNCB7CisgICAgY29sb3I6ICNGRkZGRkY7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDE1IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAxMTguM3B0OworICAgIGJvcmRlci10b3A6IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkICNGRkZGRkYgMS4wcHQ7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjQjZEREU4OworfQordGQucHQtMDAwMDE2IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAyMTguNTVwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgI0ZGRkZGRiAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjRkZGRkZGIDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0I2RERFODsKK30KK3NwYW4ucHQtUGxhY2Vob2xkZXJUZXh0LTAwMDAxNyB7CisgICAgY29sb3I6IGJsYWNrOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtTm9ybWFsLTAwMDAxOCB7CisgICAgbGluZS1oZWlnaHQ6IDExNS4wJTsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtMDAwMDE5IHsKKyAgICBjb2xvcjogI0ZGRkZGRjsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitkaXYucHQtMDAwMDIwIHsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAxLjBwdDsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKK30KK3AucHQtTm9ybWFsLTAwMDAyMSB7CisgICAgbGluZS1oZWlnaHQ6IDExNS4wJTsKKyAgICBtYXJnaW4tYm90dG9tOiAxMHB0OworICAgIG1hcmdpbi1sZWZ0OiAyLjUwaW47CisgICAgZm9udC1mYW1pbHk6IEJlcm5hcmQgTVQgQ29uZGVuc2VkOworICAgIGZvbnQtc2l6ZTogMjJwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIyIHsKKyAgICBmb250LWZhbWlseTogQmVybmFyZCBNVCBDb25kZW5zZWQ7CisgICAgZm9udC1zaXplOiAyMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjMgeworICAgIGZvbnQtc2l6ZTogMjJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK2JvZHkgeyBtYXJnaW46IDFjbSBhdXRvOyBtYXgtd2lkdGg6IDIwY207IHBhZGRpbmc6IDA7IH08L3N0eWxlPjwvaGVhZD48Ym9keT48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMjEiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjIiPkVyaWMgV2hpdGU8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMyI+PGJyIC8+JiN4MjAwZTs8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMiI+RGlyZWN0b3Igb2YgQ3VzdG9tZXIgUmVsYXRpb25zPC9zcGFuPjwvcD48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTY1MC5odG1sIGIvVGVzdEZpbGVzL1QxNjUwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkMmIzYQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTY1MC5odG1sCkBAIC0wLDAgKzEsMzEgQEAKK++7vzwhRE9DVFlQRSBIVE1MPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+CisgICAgPHRpdGxlPjwvdGl0bGU+CisgICAgPG1ldGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJQb3dlclRvb2xzIGZvciBPcGVuIFhNTCIgLz4KKyAgICA8c3R5bGU+CisgICAgICAgIHNwYW4geworICAgICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOworICAgICAgICB9CisgICAgICAgIGJvZHkgeworICAgICAgICAgICAgbWFyZ2luOiAxY20gYXV0bzsKKyAgICAgICAgICAgIG1heC13aWR0aDogMjBjbTsKKyAgICAgICAgICAgIHBhZGRpbmc6IDA7CisgICAgICAgIH0KKyAgICA8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPHAgZGlyPSJsdHIiPlRoaXMgaXMgYSB0ZXN0LjwvcD4KKzxjb2RlPgorICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5zdHJvbmcpCisgICAgICAgIHJldHVybiBlbGVtZW50Lk5vZGVzKCkuU2VsZWN0KG4gPT4gVHJhbnNmb3JtKG4sIHNldHRpbmdzLCB3RG9jLCBuZXh0RXhwZWN0ZWQpKTsKKworICAgIGlmIChlbGVtZW50Lk5hbWUgPT0gWGh0bWxOb05hbWVzcGFjZS5zdHlsZSkKKyAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2Uuc3ViKQorICAgICAgICByZXR1cm4gZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybShuLCBzZXR0aW5ncywgd0RvYywgbmV4dEV4cGVjdGVkKSk7Cis8L2NvZGU+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxNjYwLmh0bWwgYi9UZXN0RmlsZXMvVDE2NjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDcwNDZiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxNjYwLmh0bWwKQEAgLTAsMCArMSwzOSBAQAor77u/PCFET0NUWVBFIEhUTUw+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz4KKyAgICA8dGl0bGU+PC90aXRsZT4KKyAgICA8bWV0YSBuYW1lPSJHZW5lcmF0b3IiIGNvbnRlbnQ9IlBvd2VyVG9vbHMgZm9yIE9wZW4gWE1MIiAvPgorICAgIDxzdHlsZT4KKwkJLm5vcm1hbCB7CisJCQltYXJnaW46IDBwdDsKKwkJfQorICAgICAgICBzcGFuIHsKKyAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKKyAgICAgICAgfQorICAgICAgICBib2R5IHsKKyAgICAgICAgICAgIG1hcmdpbjogMWNtIGF1dG87CisgICAgICAgICAgICBtYXgtd2lkdGg6IDIwY207CisgICAgICAgICAgICBwYWRkaW5nOiAwOworICAgICAgICB9CisgICAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxwIGNsYXNzPSdub3JtYWwnPlRoaXMgaXMgYSB0ZXN0LjwvcD4KKyAgICA8cCBjbGFzcz0nbm9ybWFsJz5UaGlzIGlzIGEgdGVzdC48L3A+CisgICAgPHAgY2xhc3M9J25vcm1hbCc+VGhpcyBpcyBhIHRlc3QuPC9wPgorPHByZT4KKyAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2Uuc3Ryb25nKQorICAgICAgICByZXR1cm4gZWxlbWVudC5Ob2RlcygpLlNlbGVjdChuID0+IFRyYW5zZm9ybShuLCBzZXR0aW5ncywgd0RvYywgbmV4dEV4cGVjdGVkKSk7CisKKyAgICBpZiAoZWxlbWVudC5OYW1lID09IFhodG1sTm9OYW1lc3BhY2Uuc3R5bGUpCisgICAgICAgIHJldHVybiBudWxsOworCisgICAgaWYgKGVsZW1lbnQuTmFtZSA9PSBYaHRtbE5vTmFtZXNwYWNlLnN1YikKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQuTm9kZXMoKS5TZWxlY3QobiA9PiBUcmFuc2Zvcm0obiwgc2V0dGluZ3MsIHdEb2MsIG5leHRFeHBlY3RlZCkpOworPC9wcmU+CisgICAgPHAgY2xhc3M9J25vcm1hbCc+VGhpcyBpcyBhIHRlc3QuPC9wPgorICAgIDxwIGNsYXNzPSdub3JtYWwnPlRoaXMgaXMgYSB0ZXN0LjwvcD4KKyAgICA8cCBjbGFzcz0nbm9ybWFsJz5UaGlzIGlzIGEgdGVzdC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxNjcwLmh0bWwgYi9UZXN0RmlsZXMvVDE2NzAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODU4MGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxNjcwLmh0bWwKQEAgLTAsMCArMSwzMiBAQAor77u/PCFET0NUWVBFIEhUTUw+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz4KKyAgICA8dGl0bGU+PC90aXRsZT4KKyAgICA8bWV0YSBuYW1lPSJHZW5lcmF0b3IiIGNvbnRlbnQ9IlBvd2VyVG9vbHMgZm9yIE9wZW4gWE1MIiAvPgorICAgIDxzdHlsZT4KKwkJLm5vcm1hbCB7CisJCQltYXJnaW46IDBwdDsKKwkJfQorICAgICAgICBzcGFuIHsKKyAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKKyAgICAgICAgfQorICAgICAgICBib2R5IHsKKyAgICAgICAgICAgIG1hcmdpbjogMWNtIGF1dG87CisgICAgICAgICAgICBtYXgtd2lkdGg6IDIwY207CisgICAgICAgICAgICBwYWRkaW5nOiAwOworICAgICAgICB9CisgICAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxwIGNsYXNzPSdub3JtYWwnPlRoaXMgaXMgYSB0ZXN0LjwvcD4KKyAgICA8cCBjbGFzcz0nbm9ybWFsJz5UaGlzIGlzIGEgdGVzdC48L3A+CisgICAgPHAgY2xhc3M9J25vcm1hbCc+VGhpcyBpcyBhIHRlc3QuPC9wPgorPGJsb2NrcXVvdGUgY2l0ZT0iaHR0cDovL3d3dy5lcmljd2hpdGUuY29tIj4KKyAgICBPcGVuIFhNTCBpcyBhIHRlY2hub2xvZ3kgdGhhdCBlbmFibGVzIHlvdSB0byBwYXJzZSwgcXVlcnksIGNyZWF0ZSwgYW5kIG1vZGlmeSBkb2N1bWVudHMgZ2VuZXJhdGVkIGJ5IE1pY3Jvc29mdCBPZmZpY2UsIGFzIHdlbGwgYXMgb3RoZXIgY29uZm9ybWFudCBvZmZpY2Ugc3VpdGVzLgorPC9ibG9ja3F1b3RlPgorICAgIDxwIGNsYXNzPSdub3JtYWwnPlRoaXMgaXMgYSB0ZXN0LjwvcD4KKyAgICA8cCBjbGFzcz0nbm9ybWFsJz5UaGlzIGlzIGEgdGVzdC48L3A+CisgICAgPHAgY2xhc3M9J25vcm1hbCc+VGhpcyBpcyBhIHRlc3QuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTY4MC5odG1sIGIvVGVzdEZpbGVzL1QxNjgwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2MWI2NQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTY4MC5odG1sCkBAIC0wLDAgKzEsMzIgQEAKK++7vzwhRE9DVFlQRSBIVE1MPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+CisgICAgPHRpdGxlPjwvdGl0bGU+CisgICAgPG1ldGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJQb3dlclRvb2xzIGZvciBPcGVuIFhNTCIgLz4KKyAgICA8c3R5bGU+CisJCS5ub3JtYWwgeworCQkJbWFyZ2luOiAwcHQ7CisJCX0KKyAgICAgICAgc3BhbiB7CisgICAgICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CisgICAgICAgIH0KKyAgICAgICAgYm9keSB7CisgICAgICAgICAgICBtYXJnaW46IDFjbSBhdXRvOworICAgICAgICAgICAgbWF4LXdpZHRoOiAyMGNtOworICAgICAgICAgICAgcGFkZGluZzogMDsKKyAgICAgICAgfQorICAgIDwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8cCBjbGFzcz0nbm9ybWFsJz5UaGlzIGlzIGEgdGVzdC48L3A+CisgICAgPHAgY2xhc3M9J25vcm1hbCc+VGhpcyBpcyBhIHRlc3QuPC9wPgorICAgIDxwIGNsYXNzPSdub3JtYWwnPlRoaXMgaXMgYSB0ZXN0LjwvcD4KKzxibG9ja3F1b3RlIGNpdGU9Imh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbSI+CisgICAgPHA+T3BlbiBYTUwgaXMgYSB0ZWNobm9sb2d5IHRoYXQgZW5hYmxlcyB5b3UgdG8gPGVtPnBhcnNlLCBxdWVyeSwgY3JlYXRlLCBhbmQgbW9kaWZ5IGRvY3VtZW50czwvZW0+IGdlbmVyYXRlZCBieSBNaWNyb3NvZnQgT2ZmaWNlLCBhcyB3ZWxsIGFzIG90aGVyIGNvbmZvcm1hbnQgb2ZmaWNlIHN1aXRlcy48L3A+Cis8L2Jsb2NrcXVvdGU+CisgICAgPHAgY2xhc3M9J25vcm1hbCc+VGhpcyBpcyBhIHRlc3QuPC9wPgorICAgIDxwIGNsYXNzPSdub3JtYWwnPlRoaXMgaXMgYSB0ZXN0LjwvcD4KKyAgICA8cCBjbGFzcz0nbm9ybWFsJz5UaGlzIGlzIGEgdGVzdC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxNjkwLmh0bWwgYi9UZXN0RmlsZXMvVDE2OTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTUyZjViCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxNjkwLmh0bWwKQEAgLTAsMCArMSwzNSBAQAor77u/PCFET0NUWVBFIEhUTUw+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz4KKyAgICA8dGl0bGU+PC90aXRsZT4KKyAgICA8bWV0YSBuYW1lPSJHZW5lcmF0b3IiIGNvbnRlbnQ9IlBvd2VyVG9vbHMgZm9yIE9wZW4gWE1MIiAvPgorICAgIDxzdHlsZT4KKyAgICAgICAgYmxvY2txdW90ZSB7CisgICAgICAgICAgICBtYXJnaW46IDRwdDsKKyAgICAgICAgfQorCQkubm9ybWFsIHsKKwkJCW1hcmdpbjogMHB0OworCQl9CisgICAgICAgIHNwYW4geworICAgICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOworICAgICAgICB9CisgICAgICAgIGJvZHkgeworICAgICAgICAgICAgbWFyZ2luOiAxY20gYXV0bzsKKyAgICAgICAgICAgIG1heC13aWR0aDogMjBjbTsKKyAgICAgICAgICAgIHBhZGRpbmc6IDA7CisgICAgICAgIH0KKyAgICA8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPHAgY2xhc3M9J25vcm1hbCc+VGhpcyBpcyBhIHRlc3QuPC9wPgorICAgIDxwIGNsYXNzPSdub3JtYWwnPlRoaXMgaXMgYSB0ZXN0LjwvcD4KKyAgICA8cCBjbGFzcz0nbm9ybWFsJz5UaGlzIGlzIGEgdGVzdC48L3A+Cis8YmxvY2txdW90ZSBjaXRlPSJodHRwOi8vd3d3LmVyaWN3aGl0ZS5jb20iPgorICAgIDxwPk9wZW4gWE1MIGlzIGEgdGVjaG5vbG9neSB0aGF0IGVuYWJsZXMgeW91IHRvIDxlbT5wYXJzZSwgcXVlcnksIGNyZWF0ZSwgYW5kIG1vZGlmeSBkb2N1bWVudHM8L2VtPiBnZW5lcmF0ZWQgYnkgTWljcm9zb2Z0IE9mZmljZSwgYXMgd2VsbCBhcyBvdGhlciBjb25mb3JtYW50IG9mZmljZSBzdWl0ZXMuPC9wPgorPC9ibG9ja3F1b3RlPgorICAgIDxwIGNsYXNzPSdub3JtYWwnPlRoaXMgaXMgYSB0ZXN0LjwvcD4KKyAgICA8cCBjbGFzcz0nbm9ybWFsJz5UaGlzIGlzIGEgdGVzdC48L3A+CisgICAgPHAgY2xhc3M9J25vcm1hbCc+VGhpcyBpcyBhIHRlc3QuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTcwMC5odG1sIGIvVGVzdEZpbGVzL1QxNzAwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyMTJmZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTcwMC5odG1sCkBAIC0wLDAgKzEsMzUgQEAKK++7vzwhRE9DVFlQRSBIVE1MPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+CisgICAgPHRpdGxlPjwvdGl0bGU+CisgICAgPG1ldGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJQb3dlclRvb2xzIGZvciBPcGVuIFhNTCIgLz4KKyAgICA8c3R5bGU+CisgICAgICAgIGJsb2NrcXVvdGUgeworICAgICAgICAgICAgbWFyZ2luOiA0cHQ7CisgICAgICAgIH0KKwkJLm5vcm1hbCB7CisJCQltYXJnaW46IDBwdDsKKwkJfQorICAgICAgICBzcGFuIHsKKyAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKKyAgICAgICAgfQorICAgICAgICBib2R5IHsKKyAgICAgICAgICAgIG1hcmdpbjogMWNtIGF1dG87CisgICAgICAgICAgICBtYXgtd2lkdGg6IDIwY207CisgICAgICAgICAgICBwYWRkaW5nOiAwOworICAgICAgICB9CisgICAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxwIGNsYXNzPSdub3JtYWwnPlRoaXMgaXMgYSB0ZXN0LjwvcD4KKyAgICA8cCBjbGFzcz0nbm9ybWFsJz5UaGlzIGlzIGEgdGVzdC48L3A+CisgICAgPHAgY2xhc3M9J25vcm1hbCc+VGhpcyBpcyBhIHRlc3QuPC9wPgorPGFydGljbGU+CisgICAgPHA+T3BlbiBYTUwgaXMgYSB0ZWNobm9sb2d5IHRoYXQgZW5hYmxlcyB5b3UgdG8gPGVtPnBhcnNlLCBxdWVyeSwgY3JlYXRlLCBhbmQgbW9kaWZ5IGRvY3VtZW50czwvZW0+IGdlbmVyYXRlZCBieSBNaWNyb3NvZnQgT2ZmaWNlLCBhcyB3ZWxsIGFzIG90aGVyIGNvbmZvcm1hbnQgb2ZmaWNlIHN1aXRlcy48L3A+Cis8L2FydGljbGU+CisgICAgPHAgY2xhc3M9J25vcm1hbCc+VGhpcyBpcyBhIHRlc3QuPC9wPgorICAgIDxwIGNsYXNzPSdub3JtYWwnPlRoaXMgaXMgYSB0ZXN0LjwvcD4KKyAgICA8cCBjbGFzcz0nbm9ybWFsJz5UaGlzIGlzIGEgdGVzdC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxNzEwLmh0bWwgYi9UZXN0RmlsZXMvVDE3MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGY5MDRiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxNzEwLmh0bWwKQEAgLTAsMCArMSwzNyBAQAor77u/PCFET0NUWVBFIEhUTUw+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz4KKyAgICA8dGl0bGU+PC90aXRsZT4KKyAgICA8bWV0YSBuYW1lPSJHZW5lcmF0b3IiIGNvbnRlbnQ9IlBvd2VyVG9vbHMgZm9yIE9wZW4gWE1MIiAvPgorICAgIDxzdHlsZT4KKyAgICAgICAgYmxvY2txdW90ZSB7CisgICAgICAgICAgICBtYXJnaW46IDRwdDsKKyAgICAgICAgfQorCQkubm9ybWFsIHsKKwkJCW1hcmdpbjogMHB0OworCQl9CisgICAgICAgIHNwYW4geworICAgICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOworICAgICAgICB9CisgICAgICAgIGJvZHkgeworICAgICAgICAgICAgbWFyZ2luOiAxY20gYXV0bzsKKyAgICAgICAgICAgIG1heC13aWR0aDogMjBjbTsKKyAgICAgICAgICAgIHBhZGRpbmc6IDA7CisgICAgICAgIH0KKyAgICA8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPHAgY2xhc3M9J25vcm1hbCc+VGhpcyBpcyBhIHRlc3QuPC9wPgorICAgIDxwIGNsYXNzPSdub3JtYWwnPlRoaXMgaXMgYSB0ZXN0LjwvcD4KKyAgICA8cCBjbGFzcz0nbm9ybWFsJz5UaGlzIGlzIGEgdGVzdC48L3A+CisgICAgPHNlY3Rpb24+CisgICAgICAgIDxhcnRpY2xlPgorICAgICAgICAgICAgPHA+T3BlbiBYTUwgaXMgYSB0ZWNobm9sb2d5IHRoYXQgZW5hYmxlcyB5b3UgdG8gPGVtPnBhcnNlLCBxdWVyeSwgY3JlYXRlLCBhbmQgbW9kaWZ5IGRvY3VtZW50czwvZW0+IGdlbmVyYXRlZCBieSBNaWNyb3NvZnQgT2ZmaWNlLCBhcyB3ZWxsIGFzIG90aGVyIGNvbmZvcm1hbnQgb2ZmaWNlIHN1aXRlcy48L3A+CisgICAgICAgIDwvYXJ0aWNsZT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHAgY2xhc3M9J25vcm1hbCc+VGhpcyBpcyBhIHRlc3QuPC9wPgorICAgIDxwIGNsYXNzPSdub3JtYWwnPlRoaXMgaXMgYSB0ZXN0LjwvcD4KKyAgICA8cCBjbGFzcz0nbm9ybWFsJz5UaGlzIGlzIGEgdGVzdC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxODAwLmh0bWwgYi9UZXN0RmlsZXMvVDE4MDAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGM5NWZjCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxODAwLmh0bWwKQEAgLTAsMCArMSwxNDggQEAKK++7vzwhRE9DVFlQRSBodG1sID48aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+PHRpdGxlPjwvdGl0bGU+PG1ldGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJQb3dlclRvb2xzIGZvciBPcGVuIFhNTCIgLz48c3R5bGU+c3BhbiB7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQorcC5wdC1UaXRsZSB7CisgICAgbWFyZ2luLWJvdHRvbTogMjZwdDsKKyAgICBmb250LWZhbWlseTogTWljcm9zb2Z0IFlhSGVpIFVJOworICAgIGZvbnQtc2l6ZTogMzNwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQgeworICAgIGNvbG9yOiAjRkE1QTAwOworICAgIGZvbnQtZmFtaWx5OiBNaWNyb3NvZnQgWWFIZWkgVUk7CisgICAgZm9udC1zaXplOiAzM3B0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RhYmxlLnB0LTAwMDAwMCB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQordGQucHQtMDAwMDAxIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiA1My44NXB0OworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjREFEQURBIDIuM3B0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK2gxLnB0LUhlYWRpbmcxIHsKKyAgICBsaW5lLWhlaWdodDogOTAuMCU7CisgICAgZm9udC1mYW1pbHk6IE1pY3Jvc29mdCBZYUhlaSBVSTsKKyAgICBmb250LXNpemU6IDI2cHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIgeworICAgIGNvbG9yOiAjRkE1QTAwOworICAgIGZvbnQtZmFtaWx5OiBNaWNyb3NvZnQgWWFIZWkgVUk7CisgICAgZm9udC1zaXplOiAyNnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAwMyB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMzIwLjQ1cHQ7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogc29saWQgI0RBREFEQSAyLjNwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQorcC5wdC1Ob3JtYWwgeworICAgIGZvbnQtZmFtaWx5OiBNaWNyb3NvZnQgWWFIZWkgVUk7CisgICAgZm9udC1zaXplOiAxMXB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0IHsKKyAgICBjb2xvcjogIzQwNDA0MDsKKyAgICBmb250LWZhbWlseTogTWljcm9zb2Z0IFlhSGVpIFVJOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAwNSB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTMzLjE1cHQ7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDYgeworICAgIGNvbG9yOiAjNDA0MDQwOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RyLnB0LTAwMDAwNyB7CisgICAgaGVpZ2h0OiAwLjQ0aW47Cit9Cit0ZC5wdC0wMDAwMDggeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDUzLjg1cHQ7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQorc3Bhbi5wdC0wMDAwMDkgeworICAgIGNvbG9yOiAjRkE1QTAwOworICAgIGZvbnQtc2l6ZTogMjZwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Cit0ZC5wdC0wMDAwMTAgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDMyMC40NXB0OworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgYm9yZGVyLXJpZ2h0OiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK3NwYW4ucHQtMDAwMDExIHsKKyAgICBjb2xvcjogIzQwNDA0MDsKKyAgICBmb250LXNpemU6IDExcHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Citib2R5IHsgbWFyZ2luOiAxY20gYXV0bzsgbWF4LXdpZHRoOiAyMGNtOyBwYWRkaW5nOiAwOyB9PC9zdHlsZT48L2hlYWQ+PGJvZHk+PGRpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRpdGxlIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij41IOaXpea4uOihjOeoi+iuoeWIkjwvc3Bhbj48L3A+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAwIj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMDEiPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcxIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+56ysPC9zcGFuPjwvaDE+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj4xIOWkqTwvc3Bhbj48L2gxPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDMiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+55uu55qE5ZywPC9zcGFuPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7vvJpbPC9zcGFuPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7mgqjopoHljrvlk6rlhL88L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPu+8n108L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+5Zyo5ZOq6YeM5ZCD6aWt77yaW+aXqemkkOWQg+S7gOS5iO+8n108L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+5a6J5o6S5LuA5LmI5rS75Yqo77yaW+aYr+WQpuimgeS5sOa8lOWHuueahOelqO+8n108L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+5b6F5Zyo5ZOq6YeMPC9zcGFuPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7vvJpb5rKZ5rup5bGL6L+Y5piv5pyL5Y+L55qE5rKZ5Y+R77yfXTwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7mirXovr7mlrnlvI/vvJpb6aOe5py644CB54Gr6L2m6L+Y5pivIEdQUyDoh6rpqb7vvJ9dPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNiI+PGltZyBzcmM9ImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVFTa1pKUmdBQkFRRUEzQURjQUFELzJ3QkRBQUlCQVFJQkFRSUNBZ0lDQWdJQ0F3VURBd01EQXdZRUJBTUZCd1lIQndjR0J3Y0lDUXNKQ0FnS0NBY0hDZzBLQ2dzTURBd01Cd2tPRHcwTURnc01EQXovMndCREFRSUNBZ01EQXdZREF3WU1DQWNJREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBei93QUFSQ0FFVEFaY0RBU0lBQWhFQkF4RUIvOFFBSHdBQUFRVUJBUUVCQVFFQUFBQUFBQUFBQUFFQ0F3UUZCZ2NJQ1FvTC84UUF0UkFBQWdFREF3SUVBd1VGQkFRQUFBRjlBUUlEQUFRUkJSSWhNVUVHRTFGaEJ5SnhGREtCa2FFSUkwS3h3UlZTMGZBa00ySnlnZ2tLRmhjWUdSb2xKaWNvS1NvME5UWTNPRGs2UTBSRlJrZElTVXBUVkZWV1YxaFpXbU5rWldabmFHbHFjM1IxZG5kNGVYcURoSVdHaDRpSmlwS1RsSldXbDVpWm1xS2pwS1dtcDZpcHFyS3p0TFcydDdpNXVzTER4TVhHeDhqSnl0TFQxTlhXMTlqWjJ1SGk0K1RsNXVmbzZlcng4dlAwOWZiMytQbjYvOFFBSHdFQUF3RUJBUUVCQVFFQkFRQUFBQUFBQUFFQ0F3UUZCZ2NJQ1FvTC84UUF0UkVBQWdFQ0JBUURCQWNGQkFRQUFRSjNBQUVDQXhFRUJTRXhCaEpCVVFkaGNSTWlNb0VJRkVLUm9iSEJDU016VXZBVlluTFJDaFlrTk9FbDhSY1lHUm9tSnlncEtqVTJOemc1T2tORVJVWkhTRWxLVTFSVlZsZFlXVnBqWkdWbVoyaHBhbk4wZFhaM2VIbDZnb09FaFlhSGlJbUtrcE9VbFphWG1KbWFvcU9rcGFhbnFLbXFzck8wdGJhM3VMbTZ3c1BFeGNiSHlNbkswdFBVMWRiWDJObmE0dVBrNWVibjZPbnE4dlAwOWZiMytQbjYvOW9BREFNQkFBSVJBeEVBUHdEOEErcHB3R0dvK1hGT2p4dm9GR090Z1g1aFJzSUZHRG1uRmNkS2szVVJRbTRpdlEvZ2Y4RjlRK0p2aWFHT08zayt4cWN5eWJmbFZlOWNMcFZrMTdleHhyMWNnVjlaZkQ3eGxaL0NQNGFRd1creGRTdWtCSS9pRmZNOFNabld3MUJRd3F2T1dpOHZQNUgwV1NZQ0ZhZDZyc2tkbnBQeEYwbndVTHo0WVhWeDltOE4rSlloQTF3cDRzcnhmOVROK0I0UHNmYXZDTmYwVFVGOFFYV202a3BodnJLYzI5eGtkU09qZlJoZ2lyR3FhYy9pbSthUjJabmt5eU1UL25wL0t2Uzd2U0kvaVg0VnNkY2tDalhORmpTdzFSY2MzY0kvMVUzMVZlRCtGZkQwWVU4dWZ0RnE1MjVuL2YyVXYrM3ZoZm1vK1orZ1VjTTY5UDJjZnNiZWNlcS83ZCtKZVRsNUhtOC9nUnBvV2hnL2ZxM0dBT3Ywcmw3bndUTmF1MGNrYnF5bkJCSFN2MEIvWXgvWUI4UWZ0TzYvOWowYTNWWUk0eEpOZFNLZkxoVW5BSjJna2trOEtBU2VmU3ZRdjJ6UCtDSEh4Qy9aZjhIeCtKcjYzaTFUUjdpWHkzdWJkTWVRNXpnT3BKWlFjY0hwOUs1c0x4WjcwN1JiakhlU1RhWHEwckw1czZzWmtkUG1oU2xPS3FTMmkycnYwWFUvTDJ4OElUVFhDeHJHenN4d0I2bXZvajRGZkN1eitIRUZ2cW1weCtkZVhCSGx3ZGRoUFFrVjMyaWZBN1JmaG40Wm12dFFXUnRhSzVnaGsrNmg5Y2V0VS9BMXRKcnV0eWVkdWM0TExudFhsWnR4Tjlmb3loUnVvTGQ3WDlQTHpPN0xjaGRDdEhuM082K0EzN1FXc2ZBdGZHZHZjZUc3UHhGcC9qQ0lXK3lhWkYyWTNCZXZPMzV1UngwcnovNFE2QnJId3htdnJxVFI3SFVQdGtma3FKcFkzTWVjL01PVDYxNlpvL2hTRjcrRnJpT1pvTnc4d1JrQml2ZkJQSFQ2MTBHbCtDbzJ1VzJSc0lkeDJoemxnTzJjY0d2Z3FtWjRlbDdWd2drNm5MemI2OHFzdXVqUzdiOVQ3ekNaWE5WSVRqSjNoZmwyMHZ2MFBGOUwrSHQ1cE40VnVvUkcwbVdVUnNHSEo5aldoWWVBNVRjTnVSdHZiTmV6NnY0RzNpMmtFZkNaQk9QcFVtbGVCMXVKZUY1K25Xc0tuRW5NdWM2NDVFb1BsUzBFK0dmZ2czK2tySXk5ZHFrWTY0VUQrbGQxcFh3M2FHUWVVdnlzZnU5cTZqNFhlQzF0dEZTUGI5MXNuMTVydXROOE9MRXcyclg1bm1tZlNkV1hLOUxuMXVId2NJUVhNY1RwUHcrL2REOTJWWSszU3Vtcy9oc2w3ZEk0UXR0VUw5TVYzWGgzd3Y1MGlncm44SzlRK0Zmd2UvNFNUWEk0MmpQbDk4Q3ZsNm1hVnExUlVxZXNub2prekROc1BoS2JsTFphbmtVSHdrWVdQeXdkczlLeG0rRnl4WHFONWUwcTJhL1JyU2YySlhrOE9LL2xwSEl5WkNGc05YaVh4TS9aK1BoalUzUm9tVm96Z2dpdlh6cmhmaURKNlVjUmpxVW94bnRmK3Z3ZXA4ZGx2aUpoTVhWbFNoSk94ODRwNE8yOCtYODJNZEt4TlMrRnEzdXFOSnQrOXllSzk5dVBBU3hTRUt2NlVpZUExVThLUHlyNHlubVZhTW55cDNQZWp4R2xxZUg2WDhMM2U4aldLM2JQYml0UysrSE0rbXMyK1BhdzlSMXIzYlJ2RHNpc3NhcXFqMlduZUkvQnl5QWJscjBLZnQ2ME9jNVo4VlRkUlIwc2ZNL2lUd2N6V3pBSnl4QlhBNUpITmRmKzAxZWZFanhob1hoVzE4YVdFMW5ZMkM3dE8zVzRqODNoUms0Nm5BSEhIWDNydWRmK0g2dW01RlZXUTdnZmNVNzR1L0VqeEI4YUcwaTExTDdLaTZLcE1BaWlLNzI0Qlk4bm41UjB4WGJoY3dqUXB6alZrMUxTMXRucnJmMDZlWjEvMm84UmlhRlRraEtNZWE4cGZGRzZzdVgxNitSeHY3WDNpcjRpZVBmZzc0YjA3eFZwUDluNlpER3NsdEo1T3o3VVF1ME1UMk8zdHg2MTh2OEFoYndMY0pGY0xKR3hqQnlwSXI3UitPWHhTOFIvR2p3dnBlbGF0SGF4MittNFlDR0lqelh4dDNOblBiMDRyekJQaDhzV25raUhiMXlNZEs5Q2ZFRk9uZUZLVGtuYlY3bStReWhUd2tZMW9ScHl1L2RoOE9yYnY2dnIvU1BKL2h4NFRqdHRTdnBHUmVBa2VjZE9wUDhBTWZsWGp2N1JsakpjK003aWFORmJ6eVJ5b09BTUFmeXI2aXN2RC84QVpVVTIxZm1kMmNuMTdDdkdmaW44UFpwdGFiaG4zRE9jVjYyUjVySDY4NnNuMHNleGlhYXFVdVNCOHlYK2l6V2k3cExhQ1RzTnlaL0d0dVg0YjIxenB5U0czUVNUUktRZG82MTZQcS93MmtsVGF5OVQ2VjFObDhOUStoUXJNdUdWQU1pdnU4UnhGR01ZdUx0cWVMREszSnRTUjgzeC9ESzNlYVJIczdmcjE4c2MxQnFud2swNnp0VEpOcDlwK0VTODE5RWY4SzVXMlZtYU5aUFRpdU8rSW53NHVOVjB1VllHYU4wQktxdmV1ekM4U09wVVVlZXk5VGh4V1N4VUcrVk4raDhhK0xOQ2p1TmZ1SGdzNDQ0TjIxRkNjREZZT3BhSnVpS0xid2dkaXFZWWZqWHYxejhPNU5YMWVQVDdKSXhNeEtndndQcVRXSHFId2xmVE5aZTFtOHViWTNMUkhjRFg2ZGhjL3BwS0xlcVh6c2ZtK0t5V281T1NXN05iL2ducDhCdmlUOFV2aUplMnZ3L3RQTmRiY3lYYnM0ampSVjRCeWU1TFl3T3VhNmp3WDhOUGlwb2Y3V0d2YWJjYjQ5WTAxdkp1WTE0VkF1UU1ZOXNuT2VjOTgxMjM3TnZpZnhOK3pmWlhHcitEOVp1Tk51TlJYeTVvMWhHTURHT2M1N0Q5S3liVHhyNHkwYjRwNnY0dm0xYjdScW10T1pMbG1qd0d5TVk0UHBYeHVZWnJXeE9MeE02YXA4c29jc2JwOHplbTcrLzhENi9LOEpQRFVxRk9yS1hMR1hOWk42T3p2MXRiYmJYZTU4eWZ0TGVCTmF0ZmlGcjgvaUpZcHJ3bU5yV1NCanNLTm5CSDY1ejN6WGxNdmc2WmJSWmlqY3RqM0ZmV1BqZlFienhyNGt2TlIxT1NLV2U1WkNxSWhXT0ZWR0ZVREo0SDg2b3dmQmRmRUFiekw2enRjLzM4MTl0bDNGQ3cyR2hUcTIwU3ZhOXRFbFpJK1V6UGgxNG5GVHEwNzZ0dFgzMWJkMno1WGgwQ1FTTDhyZGZTdTg4QjZaTlpSU1RxeXFJY2NaNU9lT0s5TThSL0FuVHREZGd1dmFmZVhDbkpnZ2lkbUg0a1kvV3RMU3ZobGI2UnBGc2pReXJKZkFUYm5ia3JrZ2ZLT240ODEzWXZpU2pXcGFYMThuK3A1MkY0ZHJRcVdsMDgvd0RJNFh4UjhPN2ZYckQ3UlovYklyakdaRjNCbGIxSUdLNW14K0hrT29zTGU1YTh0MjNiVVpWVWhSMDVyNm04RWZCTzd1STFtVzB1dnMvWnhFY0d2U0xUOWovU2ZFR2p5WHpMY0RVSThNc1FHQTNyMnI1R3J4M2g4R3ZaMUphZEh1MGZZWVhoV3JXMXNqNEoxMzRIM09uSzBjVi9ONVhSUVloV0svd2IxSllXMjN1N1BRR1ByWDJkNHIrQnMwbDc1UzI3WlZzWTIwMS8yZW4wL1RmTW50OGJod0NLOVNqeC9GUVRsSlhma2pXcHdhbkoyVHQ2di9NK0RQRW53azFTelZaV2tEbGp0QkNZckpnOE5YV2wycFg5MDNQQnowcjZyK04vaG1IdzdvZHh0alhNWkdEanYwcjVuMSsxWkdiWnU2bmdHdjBESTg3cVk2anpPMWo4NXp6Sm9ZS3ZhTjcrcHpPdXczRFcySkdqS2hnTUtPZldpckNXUnVKeXNqTXFua25GRmZVd3hDZ3JIeWRUQnlyUG1TT0xicUtGKzlUZ3BOT2ppM0gvQUR6WHI5RDRlTUhjYzIxaXUzOGFraWhKcGJlSG4zcmEwZlJGdVFOMWM5U3NvTFU5WEQ0V1ZTUS93ZEhIWjZndHhJTStYeXYxcnBtMVc0OFFhb3MwOGpoY2dLYzhJS2gwend4R1dBN1YyWGgvd3pFQ3Z5amFPd0ZmTzQ3R1UxTDJqM3NmVTRMTFpXc2F2ZzRiRVlUWFViYlJsT09jL1d2UnZoNWV2NGYxK082MmhyZVllWE1qRE85RHdRYTVYUXZEMEc0Zkl1RFhhNkJZQ01MdVhLOERuK2xmQTVwWGhOU1hjKzR5M0R6aGJ1dGo5cHYrRGVqeDVvdHAvYkdnckpiL0FHcnpJcEZSZ0RKSWhSOWpldUZPUm5zWEE3aXZ2Yi9nb3JxR20ydjdJdml4YitTM1JiaU9KSVJMakRTQ1ZHR0I2Z0tUK0ZmZ0greG40MDFyNFYrTHJmWHRMdjduVGJpeEIyelJOdExBL3dBSjlRY0RyWDBSKzBKKzIvNDIvYUMwcTN0OWUxYWJVTGV6QldHUGhWeWVwSUhCUHZYd3E0MmxsK1ZZcklZMHVkMU9aUmxkSkxuMGx6ZFcxZHRXOUhaSTc4VndaVXgyYzBjMlUxR0VYRnlXdC9jdFpMUzJ0a3Vsdk0rWmZqdllmMjU0anVIVVpETWVsWW53eDhNeFdlcXQ1bUZrMlk1N2MxM0owaiszN3Bta2piSlBYdWE2UFNmaFJIYmJadDZtTitDakxocStOZWFSb1lYNnRKOUxINkRUeTF6cmUxaWl2cGVpV3F2ekpHeCtvcnFkQzBLM2VSUUdSdU9BQ0t1ZUh2aHhieHVydEdzaTl3UjFydC9DdmdDM3M1NDUxVmR5L2RCSEFyNHZINXBUU2RwTStvdytHNWRaSkdGckhnWkxheWhpWlY4eVU3dG8vaEh2VmZRL0EreVVZVG5QSXhYcUZoNE1ON2R0S2VyZDI3MXAyL2dueTI3WnoyV3ZuWlp5NHg1Ym5US3RSaTlYcVlIaDdTL3NrS3J0VUhpdXEwN1RGSzUyaGM5S21zdkNpeHRscy9sVzFhNkNHaXgxOURtdkF4T0tUMXVlZGlzYkY2Smw3d2RwKzY5ajZZenpYMDUreXpZV2xyNHJ0WmJoVktpVWRSeFh6ejRVMEx5cmhNL2lhOWkrRzJ0blJuUUtjY2l1dmhYTUk0WE02ZUthdnlTVDE4bWZtL0ZpbGlLRXFVSHVqN3NRYmh4WGhIN1UybTI5eHE4ZXhWOHhvaHZ4MlBiOUt0NkYrMEJlVytsTEEyMlNSUnRWaU9SWEkrTmRZazE2Nk1zenMwajhrazEvVUhpUjRpNVpuZVNyQjRTTDVtMDNkZkRib24xZjZING5rbVVZakM0djJ0VFpYdDVubXMvaDZPUng4bWUxT2o4TEs3ZmMvU3VsdC9ENW1iT1RWMlB3N3Riclg4MzBzdWNuZXg5OUxNR2xhNXptbStFVkU2NFNrOFMrRnR6S050ZHZwZWg0bFgvQ21lSk5GYkk1L1N2ZG9aYnkwcjJPT09ZeTlxdFR5UFZ2Q2dFRXZ5ZndtdUJtOE1zdDZkdnluT09LOXUxM1JtUzJrNXp3YTg4djlPOHE3UEdlU2ErUXp6QlBtVFI5WmxlWVNhZXAzLzdMMzdQK24vRXJYbUdyUnRMYTIwWmxkYzRMY2dBWjdkYTdMOXB6OWtmUU5GOERYV29hTFpwWnZhcVpOcWs0WUFFa0VmUUU1OXF6ZjJZL2lmWitBdkVJVzhmeTdlNlF4TzM5d2tnZy9uWFkvdGFmSDNSYmJ3RkxZYWZmUTNsemNBamFuT01xVnlmVEFKL0hGZnRXUjRYaEpjQTE1WXprK3N4YjFkdmFYMDVlWHExYnRwZS9VK0p4Mk16aDUvVFZCeTVHMVpLL0xicmZvZkIycitEL0FMTmN5Ymx3cTlhODk4VTZiYnozYi9JcFVERmVtZUs5VWE3a2tJWXJ1NDRyemZWckNScFczYnVhL0NjdnFTdmVUUDZLeWlVM3JVWncrcWVHNFpyaGRxcUZCNXlLMnIvUllIc1ZNYWpiamppbjNtbnRFdkc0OCtsUnd6WERXTzJQYmhUZ2hoWHZ5cXluRmE3SHZXMTBPYTFIUnVQdTF6T3M2VHNXVGF2TzA0cnRkU2U4akhIbGZsWEtlSTN2amJ5YmxoNkVjZGE5bkExSnVXNk9TdkZIejNhNk5OcE91UjNTeGg1STI0ejBQMXIyYjltMzltTFVQMmtmaWRwZW13MmtQMm5VcmhJVTJyZ0VzZVMzc0JrazlnSzVxRHc0MDE3dWVQNVEzSkhldnRML0FJSnRlSjlGK0dueHc4S1gxMDhjY1BubU9Weng1SG1LeUFuNkZnVDdWOXRXek9uUEUwS05XWExHY294bEwrV0xrazNmcFpObnlPTHc4OFBoSytJcFI1cFFqS1NWcjNrazdIWS9Hei9nakJKOExQaFpOZTZWcVVlcFhjSTgyU0ZZZHFuQzVJVTljK21ldU8xZkEvai9BT0ZiYUxkeVJtUDZnaXYzMy9hbStJV25lQnZnM3FWN2RYVWNjYklDRHVISUJCNDljOEQ4YS9EejR4K1AzdTlXdUdqc1ZYY1N3NTZaTmU3eDlsZUd5ZlBZNFBLWk54Y0ZLU2NyOHJiZHRYcnFsZjVueTNoM25tT3pqQVZhdVk2OHNyUmtrbGZ1dE5ORHdxOThDZk8yVkE5YXp0ZDBPMzBEU21rZmJ1Nkl2OTQxMDJ1ZUxib016ZllNaGVwRFZ6TjM1bmliVjBlZGZLamhIeXhua0UxbGhhbFoybFVlaVBxcWthYTBndFRCOEgvRDMrMEwzZTY1YVE3NUNSelhvbnc2OEFSK0xQaVpicmRJc2tNYktnRGRBRkhIOHF2ZUcwanRJQXEyamNOeWNqNXE5VitEbmdGRHJVVjJrZTd6R3lWeDkwNXJ5ODZ6eWNLYzV0MjBhUjJZTExZSkwxdXo2Yy9aMS9aazFQNDF5dzZWcE5pSm80a0c1OENPR0ZmVW5IVHQ3MTZuNC84QStDYk90ZkRMUVA3U2FPMXVJWXlETVlNN29oNmtZNmU5ZlFmL0FBVEVzckhUL2hicXFLSTF2M3ZBemYzakY1YWhmdzNiNjl0K08vaXV4OExmQzdWcHJ0Z0ZrdDJqUkQveTBZamdWNzNEUGhiaytPNFFsbitPeEVsT1VaeXVtbEdISzJrbXJhdlRXNzNkbDBQeC9pSHhJemFqbnNzRGhFbENNbEcxdFhlMnQrbmtmazM0NytCZW1lR1pKTGcyMExTWnlmbEhOZlAvQU1jRmhndDJXSlZYYmtjQ3ZxTDRxK0kyMWpWSnd5c3E1SUMrbGZOZnh1MDFiUVN1VlpsMmxoeFg0anc3aUpTeEM1MjNycGMvZDhycVZaNFZ1czliSHc3KzBuRXJhUE5HM0xUTU1ENmMxODI2cm9IbVRiVHdjOWErbnZqVFpTYTVyVWtubDdWWGhSanRYa2VzZUVXODdMUjhaUGF2NjI0WHhxbzRXTVc5ZHo4azRrd3JxNGh5dDVIR2ZEdndRdDdxTnhOSkNzZ1ViUmtjR2l2VGZoN3AwT214U3JMOHZPUjh2V2l1ckg1dFVkWjh0N0hIZ2N0cHFpcjdueHFxYmowcWFDTEorNytsUGloM2UxWGJTMTNNQnRyOWpuVXNmaCtId3JiSkxMVHZNWmE2enc1NGQ4NEQ5YXpORnN0LzUxMzNoRHc5ZFhBSGx4bmI2bmpOZUJtT001WTduMW1YWU83c2tQMHJ3bU01M0VZOXE2N1JkQVZTbzllQjcxdmVFUEJIMnBoOW95cS8zVkhXdlVQQy93QVBMT0NOVEZDcGJqbGhtdnp2Tk05akRSNm4zMlc1TEtwMHNjRjRjOENUWHpyc2prMjlpT0JYclB3NytETW11WGR0YnlNd1ZqMFVkUHhyYTBmd3B0d3FyMDZZcjJYNFplRG0wRFNWdXBGL2ZUY0Rqb0svTnM5NG1uR20rUjJiMlB1TXV5T21tdWJVNWIreUQ0VDI2WEdyTDVZd0cvdjFOcDFyTmNTcjh6anVDSzdUeFQ0V2JWNFJjS3Y3K0laR09wRk84TmVIVEpieHR0TzdvYzE4TkxNWXVuenkzNitwOUJETDNHVmxzUjZMNGJrdGxqa2pkdDMzZzRyc1BEL2hXNzFKWTU1NWlReHdkeDV4VzE0VDhJcTBDbGd2M3Z1MTIyaWFBcXg3ZHFCVjdFVjhobUdjTzlrZTFUcFJweHV6TDB6d1Y1S3JsK1BZMTAybGVHVEFWWGNDdlkxcmFmcHJPQjkwaGVBSzJyRFR2T0tqYXVQcFh5V0l4c3BiczQ4Umo3S3lLK2plR1dRWkJ5T09jOUswNHZEWjNqYyswRTR5Ulc5b1dsWVg3b1lmVHBXaW1tZ241VjcrbGNITE9Xc2o1bXRtTW5KMlp5Zi9BQWpjZ2tYYWR3K2xhMm4rSEpFSFBTdWpzOUtWbUhBL0FWcEhSY0w4dlRIWVUvcXJtck04NnRtVCtFek5KMEpsMmtWMW1nNlJKTGRSeG8yM2QzSTZWSG91bUtQTDNlZGpQWmE2YlM3TmJTWkpFRnl4eU9zZkZldGwrQmpHU1o4NWpzWTNkR3haV3R4WXZHa2tnWnNaQkFyVWlqYTRmOTR6TVQ2clR0UWhXV1dGdjNuSXg4aTVOWHRNc0kzZmxyN2ovcGpuK3RmWlVzSDcvSXRqNCt0V1Z1ZGhZV3dpazI3Vy9LdENMVG1hVDdqZmxWeTMwYU41VmJkZWUzN3Ivd0N2V3paYVZHNSs5ZEgvQUhrNmZyWHZZWEtaczhxdGlsdVptbDZhZk5IeTQrb28xL1RzL3dBTmRKcCtscjlvSEVwK3EwM1hkS1YyNnR3ZTRyNkNPVXlqaG5JNFByZjd4TTh6OFJhYnNoYjVmMHJ6M3hGcDBhdVNZMjNaUFJ1RFhyL2lheWpXRCtQUFA4TmVkYTlaUnlTOVg3OGJhL084OHd0cEgxbVY0bnFjSmYzTW1uZk5BUEo5d2NuODY0L3hOZFhGNlczTXo5L3JYb2ZpUFRGanR1UC9BRUd1THZyUUtKRDM1N1Y4Qm1WS29yVzJQdDh0cXcrSzJwNTVxZGkwbnpiV2JjZnlyS3U5SlpzNVg4TVYyTSttcXd4dTI4K2xVcmpTWTl4TFNoZVBRMXlVY1QwNm4yRkhHV1BPOVMweVJKUDlYV1JjMnJLcllISTZqRmVpM25oKzNtUHpYc1VmSGRIUDhnYTUrKzhHc0lIdUk3cTNhRlNTVDgzQStoRmV2UnhGMXFlL2hjd2cxYVg1TTg5MXF5a2pHNVVMYzl1OWM3cVdueVA4MGtERmUrUndhOUkxQ3hqZ083KzBMUDZPajhmK08xaFhOdDlvdUNWMW5TTURqYXlQaGMvOEF4WHU0WEVTVzM2bm9TcVJjZjhBZ1A4QXlPTVR3cHBtb1h5eU5mSnBOdWVXV1NGNU1IMFhiMS9TdEx3ZHJOcjRLMXBwRW11OVRSRy9jczBaZ2piSGNqay9oVnE2MEZ2dHYvSVkwQ1RhT0ZZbmF1VDZGTWZqVWFhVk5KTXYvRXo4UFNiZUFQTndGSDB4WHB5cXFjWEdiMC9yeXVjcVVPYTkzOTM5TTdMNGtmSFh4QjhRTk04dTkxRzh1SWRxaFlXZHZLUUFZRzFjNEdLOFA4VmFaTmNCMlpXd2M4a1Y2ZmF4emVZVmU4MFNSVkcwZnZsK1Vld3JFOFo2UE5QYUdTUzQwOHdvdklpbVVuSHNLakFWbFNxV1gzaVZHbENuN09rbEZkRWxZOFh2UEQwMXhMdFZkd05OMDd3U3h1dm1qYk9mU3ZjL0JQdzdUUTlBbDFPNGhRM1Z3djdoSE9Bb3h4blByMXEzNGY4QUIwbHNDMXpISDVqZk54aHE5aXJ4RnlLVVk3TFQvTXlwNEtNbnpNNGJ3NTRGYTR0VVl3dHRVWSs3WHR2d0I4QXc2MXFTMmx4ZlE2WEhqZVM0NWtJL2hIdlRkRTBkV0tydFg4cTZuUWRGRVV5NFVlM0ZmSFpqbThxaWFrVmpLa1lVcFU2YnM3YjlqMjN3QS9pUDRSU3lhcHBkNVBwT254amFza3M2cEpNT21CSG5KNTdjOFZzL0ZiNHVhaDhTTVNUWDE1Y3d4b0FnbE9BV3h5MjBjQ3ZOTkIwbVM3a2ozYm1BOVRYZlJlSHdORzVYSEhwWEhoc3l4RThOTENVWlNqU2VyanpOeGN1NldpWDNYOHo4dnhtRm9SeEN4RlZLVlRhOXJPMzR0djUvSThYOFRXSW11cFcyN21icnhYbVB4VjhJUjYzb3M4VEx0YmFjRUN2b3ZVdkN5dXp0NWEvVEZlZmVQL0RLenhzRlVLeSsxY21EclRvVkU3N00rMnlyTklPU2gwUHo5K0lud2JEelNNaGJHVDFXdks5YStGVEpJeXV1MERvUUsvUXJ4ajhLN1dhMjNHM1Rhd3lUaXZIL0FCdDhPTkxna2tWMGp5b0o2MSt3Wkh4ckpwUTFPekdaUFJ4RWVlSjhoMnZ3NCt4U2t0KzhVanB0NlVWNjVyL2h1U2JVbSt6Uk5IQ3ZDOFp6UlgzQ3p5VWtwT1I4KzhyVVh5eFIrVmRsQTBqY0N1czA3d1ZMOWc4NDg4WnhqdFdYcE5qdm5qQUhWaFhzUGg3UkZlSlZLN2x4akZmMFhtbVlPaWxZL24vSzhBcWwwemtQQk5tdHRxMFlrUU5HeHh6MnIyUHdycEg3OEx0NmVsY0pmK0VYMC9VdmxYOTIvd0F5bjByMVA0Y3dtNk1lNzVzSUFmYXZpczh4YW5EMnNXZlo1SmhuR2ZzcEk2L3c5NGR5NnR0N1lyMER3cm9qS2VSNlZuK0U5STNUcjh2SHZYb3ZoelE4dXE3ZS9hdnlUTnN3Nk0vVTh2d2EwTmY0ZitFanFHb29QTFl4cjh6SEZlc1dtbWg0RlZWK1ZPQlR2aGQ0WWhzN0JqSnRqOHhUOHhGZFZiNkJnTXdBNHp3TzlmazJiWnA3U3MxMFd4OVpoOE9vb282RjRWam5QekNyVW5nWk5QdmxlRmYzY25VZjNUVnpUcHBMVjJYeVpGSyt1SzZTeVpaN1VyNWJFc0JrK2hyNTJ0aXFrWGUrak9pZG9wTkZQUk5KYTJDbEF3WTlUWFRhRFlzdHd1MUNWemc4VW1sMlMrVUYyODlhNlhSWU5rZTNiOTAxNGVKeEwxWjVPTXhkazdGN1ROSVhDL0x6MzRyWTAvUlBuNEE2OTZabzZsbXlFYnJXL1pRa2ovVnNNMTV1RnZPVjJmSTRyRXlUc1Q2UHBteFNOdk9QU3JjZGh0ejh2U3Iya3c3WTIrVmh4VXp4N1UrNmV2TmZVVWFQdVhaNEZTdTNNcjZmWUtXempGYVVBRVE2VlRXOFdGZWpVNWRVVW4vQ3NZMUlwNm5QT01wTTFJaDZFaXRYU256L0FCSHA2MWdXbDNrODd1YTJyQjhLdkJycm96VjdvOC9FUTZIVVNPWjdPUGs3bDQ0TmFXaWJ5T1diODZ4OUpkcEVVSGl1aDA2M2FOMU9EZzk2K253cmM1S1NQbmEvdXF4djJFYlNSTDh6Zm5XcHBzYkkvd0I1dnhxcm8wUFBTdGFLMzh0OTJEWDIrQXc4bWxJK2N4RlJYc2FHazJ6R2NjbW9mRU1SODd2NzFxNkZiK1pNdjNxcWVLTGRrdThjMTl6V3krU3k3bnQxUE1qVVh0ck00RHhkdTJ0elhBYWpBelM3c211LzhYcXpTWTJ0anBuRmNkckZzWXhYNG5uMEg3VitSOWpsc2tvSTVQeE5GdmgyODlLNFRXRThvTW8vaVBhdlJOZXRaREJ1eDIvT3VJMXF6YkorWHBYNTVtMG5GTm8renl5b3JIRzZsbTJjc0t6TDI3WmVWWmwzZTlidXRFUnZuQTkrT2xjdnFseXNhTjgyQjF4WHoySHRMVSt4d3NlZXhUMUhXYmxvdHZueVl4ajcxY3JxK3FUd044a2pManNEV2xxV3FLTzUvTHJYT2FwZWVZV3gwcjNzTFNzejZqQTRaSjdGTFZQRWVvUS9NdHd6ZXVRRFhOYXA0dzFJVEJWZUxjeHp6RW4rRlg5WDFXT01jczNYMHJtOVZ2bzl4TzducU9LK2d3bEZQZUo3aW8wMHRsOXcyOThjNmdVem0xWTlDVGJvZjZWbXY0NXZOLzhBcTdMUC9Yc24rRlJYbHhFQmt0dFg2VmxYRnpBei9MSXVhOXlqaDRmeS9nWXppbHRZM28vRzl6SnkwT25zUGUwVC9DdER3bGRmOEpwNGdXTzRqdG83Q3ovZVRHT0pZOTdmM2VNVnhOMXFJZ2cvZG5MZFAvcjFxYUhyaTZmcGYyYUdiSG1jdTM5NDk2MHJZVzBMd1ZuK1htWjd1eDZSNGc4U1I2dGVMSERISDlsaitWQjF5Zld0YlEvOUlDN2htdUI4TGFsYnkzQ3JJNjVIZXZROUFLT3lpTmw5cStheGxKVVZ5Skcwa29VOURwOUkweU15TDNhdTMwUHcyVzIvTCtOWVBoVFNSUE1uekRjYTlkOEllR1B0Rm91Rkh5aXZuNDAzWHFjaDhMbk9ZZXk2aDRYOE5mTkdOdGVrdDRXVmRFVWJlM3BVWGhMdzJwWmNyOHdQcFhvOXg0YTI2S3Z5anBYM1dTNUxlazJsc2o4dHpiTm02a2RlcDRscTNobnlvbStXdkt2SE5tcXpTQUx1cjZUOFI2RGl6YjkzOHlqdDNyeDN4TDRSYWE2bFBsbkdlT0s4ck9NdGNJKzZqNkRJczBUbHpTWjVEZmFlYm0zZU5vL2x4ZysxZVBlUHZoM0RmWEo4dVBBR1FjSGxxK21kVDhLczBUSXFjOS9ldU4xN3dNZDdSK1d1NWoxcnc4RmlLbUduZDZINkxsdWEwMDdTMlo4dTZ2OEFEcVBUNzV2c3NieVNFQUFGYzdmWCt0RmZSZytIOXZwTGJwSTFNamRUUlh2eDRtbmExcitwNnJ4bEJ1OGRqK2Ryd25hZmFiK0ZmVmdLOXo4SzZadklYcnQ2VjVINEQwN3pOUmg3L09QdzVyMzd3anB3akt0dERkeURYOXU4U1ltelNSL1BQRCtIdnVOMUR3eDl1dENOdnpxTWdpdHo0VDZPeTNFaWxjbGNWcmFMcEJtbFhDMTJmdzM4Rm9QRWpZWGlSY2xhL084Zm1palFsQ1RQdnNIZ2w3YU0wZFhvZWc1dDQ4amJ4a2tIcFhvdnc5OEwvd0JwWGlydlpRdUN4R2VsSm8vaEZWaWorWDA0cjB6NFlhSDVVOGtpcjBJR1Q5Sy9JYzN6YjkzSm8vUXNMUVViR2hwK2dMYXhwSDUwMjBlL2V1cDBDeVgvQUZaa1pnZWhKcTNwdW5yTUYzS0dZblBOYlZob3lRN1dISHRYNXZpTVp6Ym5wU3JScHhzSGdqUzFoOFcyZTdUNHRVRFNnRzJsYkN6NU9BcFBGZWllRlBEbW9hYjRjOFdhU1BEbGkwdG0zMmk2bGxLK2ZwNFU0SVFrNUk1d2Nacmt0TnRsSXp1WlpGYktrY1lyYXNFbU54SXhrbWJ6dUpHM0hNbjE5ZnhyaCt2S0thZCt1MWx1cmRuL0FGNW56MlpUbFZkMDEwM3Z1bW4wa3ZQNTJ2cG9VN1RUVmpDc0Y1TmJGbnB4VWpyODN2V2hhYVVrblFObFJ4eFd6cCtqS1kxd3VlQWE4T2JuTis0ZVZpTWNyRGZEMWswZjN1L1N1cTBqU1JNM3pOMHFyb21sYkpCeHhYVjZmcDQzcXdYakhQdFh0NERCMlZ6NWJIWXpVbjAzUlZGdnU5dUtxMzJuQkFhNmF4dFBMaHoyeHhXWnFuSFk4NUZmU3lwS05KSGcwOFEzTjZuS1hWcXlLM3AwcXI5bmJIWG5xSzF0VGxWUnRxbEdWYVQ4ZnpyNTJxNDgyaDdGT1RjYmt1bUpJcktTUWM4MTAya3dlWXVOM05jL2JKc1BIcnhXOW9UNFlOVzJGa25LeHc0eTlyblY2SFpidHZyWFY2Ulo1RzFxd2RCK1pWSHJYYmFGWitlVnhYNlJrZUI5cEpSUjhabUZaeEwya1dCWDVldGRKYmFONThRK1dwZEMwTHpGR1ZycTlQMHBZSTYvb0xoYmd1VldONmk5MCtMeG1PczdMY3pmRDJrZVNOemNOVVBpYlJQTmxMNHp4MnJwSTRWaVg1Y1UyV0JabCtZQ3YxQ1hET0hsZ3Zxdnp1ZVdzVkwybk9lTitKUERieVRzZm0yOWNacmk5WDBKbWZwd0RYdm1zK0dVbVJ0cTh0WEg2cjRMd0dabzYvQStLdkR1dENvNVJWMXVmVVpmbkN0Wm5qZXJhSG1EN3RjVjRpMFhaRkl5cjBGZXorTU5EVzFqNlk0cnkveG11eTNrQzllbGZnbkZHU3JEODBaSSsyeW5HT2JUUjR4NG1oWVN0MjV4OWE0YldvWkhQb000cjBUWExkWTdsdk1VTnowTmNiclZxVHUyOU0xK1hZR2ZLN0g2eGx0V3lTT0sxYTNKYmJ1Ni9wV0ZlMjdUQnVmWTExR3AycTVQOTdOWmNsdVkyLzNoWDB0R3BkWFByc05Xc2psNWZEMzJoR2FUK0htc2ZWL0M4YXhPM3k4ZEs2K1dKazNaOVB6cWxxRnI1cWJUL0VQeXIwYU9Ja3JOTTlTblU1bnFlWjZ6cFdObUdIejhkZnUxeTkxcGswVHN5dDl3OWoxcjFEVk5EVVB1Mm9kbzlQdlZ5ZXNhY0lXK1hvZXRmU1lQR1hWaXExRzY1a2NtSTVwSCtidjNyWDBPM2tpWU5sVzlzZGFiY3lSMmI3Y0QzTlgvQUEvTWtrMzNoODNwWG9WcWo1YjJPV0VOVHB0SjBKdFNaSGpqRWE0SFU4MTZMNFAwU1JESHVIdDFybXZCcUsrMWR3K1U0RmV0ZUM5QVc1a2pHZTQ3VjhObW1NY2RHWjVqaVZScG5YZkQ3d3lXWlhLS2VtRFh0M2dYdzB5eEtPTWV0YzE4TC9DMGJSN1QyNEh2WHRYaER3cHNWRjZZeGppdS9oM0taVm1wUHFmaHZFbWIzazFjUENuaGRmdGE3enRYUFVETmVqM0hoNjNiU1Bsa1luSEFLVkZvUGhOUXluYnpYWnI0ZURXYXJqb0svb3ZoUGcydFZ3OVMxTytubWZsT1pabHpWRTdua0hpTHcycGlaZHZhdUExN3dObHQyMzF6WDBCcmZneHBwQ2R2RmNwclhoVUxJVjIxOHB4RndmWG95YXFRYVI2ZVg1eHk3TStmdFc4RTljcU9UMVBXdWQxdndPcUtmbDdaNjE5QWF6NE9XS05tMml1SDhUNlFzS09GWHNhL01jeXlMMlM5OUgyZUF6dVVtck0rZWZFM2h4WHUxVm1XUDNQYWl1czhUNkt3MVBlMFN5RG5BYnBSWHhGYkM4czJqOUF3K09rNmFhZjVIODBId3pzQytxMi9IOFl6WDBENFpzMUtoZTdWNGo4THRvMUdOZVBsZXZkUENBM3pwMDY4Vi9jL0UxUnVmeVBqT0hjT3VTNTZKNE4wRC9Sdk0yZysvcFhkZUEvRFR3NjZzM2JPTWUxWlBnK3kzV2llaHIxTDRlYVNyM3NZeDh2SElGZmkrY1k5eFVqOUp3T0ZWNHZzZGw0WjBCcnVFYlZQUFRqclhwM2dMd1pKcCtsYmJpQmxiSlBLNDRyVitGK2gydWgzRnZkeVJvM3pxUnVHUlgyLzhkTER3ZnFmN0xXaXpQcGlSNjVmTEd0cEtMWHk1R2JxM3pEZ3FRUFUxK2VVY0wvYU9GeGRkVm93VkNQUGFUMW5yYmxqNXZaTHE3RjU1eEYvWjllaFFWSnk5cExsdXVubTEyN254aERwS3BJcEVZWEhwV3JaMkNpTE9EWHRIZ0w5aUxWZmlENFJ1dFEwN1VMR1M2dFUzL1l5U0pHOWdlbWZyWGxPc2VHNXZEMTlKYTNDdEhKQzVSbFBZanFEWHltWlpaamNOUnBZakUwNVJoVlRjRzFwSzJqcy9McXQxMkhoODl3bU1xVG8wS2ljb2ZFdXErLzh5SFQ0Q0pGK1ZWcm9OTnR2dFVxZ2JmYXNuVGJaWGJJKzk2R3VqMFd6TWMwY252d0srZHFTNXBXTWNaVU4vUmRLWlVaYTZMUk5ERE11Y0RkNlZIb0dsL2FJOXc2bXVsMHZTeXJnODhWOUJnOEsya2ZGWXpHUFd4RkJvelFTZkt1UHdyYzB1eXlnNDlxdldlbmVmSHUyNTlhdldXbkFPbzZWOUpoOE1rZk80akZPVzVMWldCK3hzZlVZcm10YnQvTGRoMStsZWhXT2txZFBrKzkwcWpwUHc2dXZFOTYwZHRHWkpPd3IycDVYV3hDaFJ3OEhLVXRrdFcvS3lQT280Nm5UY3BUZGtqeG5XMi8wakF4K05adjJoclk1K1d2U1BpcDhITlI4SVA1bHhieVI3czRQVlcraEZlY3krSHJwai9xMitiMUZmRDV0bHVMd2xlV0hyMDNHYTNUVm12Vk0rdXkvR1VLOU5UcHlUUk5ZNnRpWmQyM0h0WFhlSGJoWjhjamRqcFhHMmVnWEVjdktrVjBuaDZ5YTNaZHhZRmV0WTVYQ3R6WG1pY2RHRGpvejB6dzdBWlF0ZWxlRE5OWTdjMTVqNFNMTEpIWHNuZ01MS0ZCNHI5LzRBd1VLMkpnbWZtdWVUY0lzN0xTTFZZNDErWG10REZSMjY3WWhVbGYxN2hhS3BVbEJINS9LVGs3aFJSUlhRU0l5N3F6OWF0QThCd09hMGFpdW8vTWpybXhkRlZLVGd5b1NhZHp5Zng3cExPamR2cFhqWGpLd01LditWZlJYam0yVXd0OHZhdkR2aUxiaEJKeFg4a2VKbVJ4cFZwMlAwVGgzRlhhUjRWNHdzV0Z3ZHRjUHExdXhERDVldmV2UlBGdHN6eXR4M3JnOWJ0R2N0dEdOM3FhL2xmRVV2WTRsd1AycktxbnVxNXkwOXZ1M0U3VHRHVFdaTkVYZks4OC9sVzVObzAwM3lydStiMEhhci9oYjRhWG1zNm9rY01MU3NPU1BhdlFwMUVuYU8vUmRUNlg2MVRwUjVweTJPRnZZU0hZZmRLam9henIrd2trVmR2emR1Qlh1SGpIOW51NmtzRnVMS3ptWmxHMlJkcHptdVU4T2ZCYldiM1ZIdFZ0TGhab3p5cGlJWmE5TGxxMDJ1ZUx2NlBXNXBoZUlNSktsN1JUU3QzUEg5WHRXampKN2R4WEU2M2J6VHY4QUxIOG5yaXZyL3dBWC9zYmVJTkY4T2Yyak5wMXdzTzNjem1FN2Z6eFh6ZjhBRUh3ODJoVHpSc3UzcmtIdFhzMFBiWWVxcVdJcHloSnE2VWsxZGQxZmRIdDVQbm1FekNMamg1cVZ0N0hsbC9GZ01yUWpkNjFlOFBXa2JzUGxDN2UvcFZMVmI5SWJqYStkcC91OVJTNkdaSnBWR1dDNTQ5NitrbEZ1bDJQUjVZOHg2dDRFVlE2aFZ6eURYdVB3K3MyZWFIOTM4dlU4VjRqOFBJbWhsakhESGl2b3I0VnlSeUNMekY1T09sZm51YVN2V1VlN1BtdUtLamhDNjdIdFh3eDB3T1kvbDlLOTk4RitIaGNKSGdjOFY1WjhMZEhqa1dQWjdWOUFlQTlLOGkwRDQ2Vi9RWGhUdzhzYlhqR1MwNm44eDhUNDYwblkxdEwwZExORnlxNUZhR01DaWl2N0F3dUVwWWVtcVZKV1NQejJVbkozWXlTQlpSZ2lzUHhEb0ViUmxsWDVxMzZpdW9mTWkvQ3VUTk10bzR5aEtuVWowS3BWSENWMGVRZUk3Zll6QTU3OFZ3SGlpMVFLZjhLOVg4ZjZaNVV6TUs4dzhXMjdQQzNzRFg4Z2NYWmJMRDRpZEtYUnMvUU1ucTh5VFI1TjR2UlladlRCNmVsRlIrTW85bHczemQ2Sy9KTVRoNzFMbjZkaFcvWkt4L01qOE5MQmx2VmJQZXZhUEJMc3QwbjZWNS80QjhOdEZxRWNLeHN6c2NLQU1rbXZVUER1a3lXbDhGbGphSmxQUmhnaXY2Nno3RlJuSitobmtPSG5DQ3YzUGJ2aDg0bnM0OTNXdlYvQWRtMHQ5Ynh4NTNTT29GZVBmRDJmeWhHcCs2Qlh2bndLdEUxWHhUWkwxd1F4SHBpdndqaUtUcHFjdWgrcFpmSFJObnVma1NRcGEyNnFWT1ZYOGErb2RZMG1XOXZmREdsZmJMaTZzOUUwcGJtUlpHSlZKR0dCZ0gycjVtbTFXT3o4V1d1Ly9Wck91UitOZmFQaW05MDFQQjE1cmtheDdaTE9LSldIY0JmL0FLOWZtdVhVbk9sTnQyMmI4MHJ2ODB0ejVQakRFVHB5dzlvL0Z6VzlYYVA1Tm5jZnNoWGEyUHcxOFNhb3ZseVNRbDhEK0w1VkxZL0d2bS94YjhFZkZYaWUydTljWFNiaVcwOHhta2FQREZjblBJSFA0MTZSK3lUOFNvVytGL2lyUzJNYXU3Tk51eVFkdGVxZnN0Ni9jMi93eThTYW5jN1d0YmN5U3FHUDkxV1kvaGpGZnNWSEE0RGkzQzVkbHRXcEtuQ2hScVNiaXIybGU3YlQ2V2lyNnJzZm1kWEdZckpjWmk4WFRpbTNPQ3MrcXRwYTNxZkZNUGh4N0tiYVYybm9RZTlkUjRlMHFUY3U1YzloanRVbmlLWVhtdlN0dFZTNzdpQU9sZEY0WHN2UFZmbDlzMS9PbUhvODJJYXZzejlCeGVOazZTbkkzZkR1bEdKWXp0cnJ0UDBUelVWaCtWTDRhMEJmczY4YnZTdXUwZlF6Rk45MzVhL1JNdHk5dEkvUGNkanRXWjJrYVNXTzNCNXE5Rm9iUjNBNHJwOU84T0x1M0t0YXplRlRKdFpWN2ZuWDIyRTRkclZZM2pIWStjclpqRk14ZE4wbi9pV1NIMnE5OEx2RXRwNGIxaVpicVFSSk1tME9Sd3B6M3JwZE04THQvWnN5N2VvcmlQRWZneVJkMjBNdWMvalgxMzFITU1pbmg4enc5TzhvM2RtbmJzNy9BQ1o1MGExSEVxZEdvOUdXdjJnL2lUcEY1b2tWbkZNbDB5dnVabEhDOFY0dmYrSmRMZUJkdU55OVFSVzk0cjhKU3pIYnRiYjNyaGRlOElPaGJIRmZsL0duRkdaNW5tRlRIMTZjVTJrckpiSkt5MzFQcjhqd0dHbzBWU2pKOS92RzZuNG10VUphUEFHZWxOMC94REZQSXUxc25yWE5hanBUUkhrdDE5YWwwSmxzN2dBNHo2K2xmQTBjeXF5cWUvWkkrdWVEcCt6dXRUMS93YmY3NVk2OXA4QVRGOXUydkFmQldvb3NzZGUyZUFOZVJVWGFGN1pyOSs4TjhkQlltRG0rcCtiOFJVV2s3STlWZy8xWXA5VnRPdWZQZ1ZzOXMxWnIrd3FNbEtDa2o4M2FzN0JSUlJXZ0JUWmVVcDFOZnRTbHNCelhpKzI4eUxwWGkzeEgwN01qQUtUaytsZS82clpmYUZQR2VPSzg2OFplRXZOOHh0dmJpdnhYeEd5Q2VJZzZrRWZTNUhqRlRscWZNM2pEU2Rqc3UwNXpYQWFqcE82ZGxaZHZQRmU1ZU12QzBpWEw1WHZYbnV1ZUhsamwrNzFOZnhoeE5rTTQxWFVYUS9ZOHB6Sk9DT1cwVHd4Qzl5dm1kdWVPOWVqZUVkSXQvRE4vOW9sRGVRcWg5MFo5eFhubmlEV2Y3Q3Q1Z3JiV0J3SzRuVnZqbHFWclp6V3F6dUlXemtaNml2RXluRlFwU3ZHSE5KYS9NOXllV1lySHExTjZIMTlwL3dBYVBDUHcvVmJwN3hiaU1uTHF5N2pqL3dDdFhXZUgvd0JzUDRYNjFmek90N2IyOXhnTHVrZ3daQng3VitadmlQNGczVjBybnpIMlNkUm1zTFRmRnN0dFA1aXN3R2ZXdjF2SlBGRFBjdWh5NGFuUzVkK1dVT2JYdW5kTkV5OElNUGlZYzlXclBtOG12eDBQMkIrSkh4YThNNlg4T05RdkxyVXRQbXM1YloxVkZrREdjbFRoUVBldnlMK08xMy9hT3QzeFRiOTg3VkI2aXRPLytLbW9hbHB6UWZhSldRRE9BeHg5YTRQVzVKcjZkdVMyN25KckxqRGpyRzhVNHFoaWNaU2hTOWpGcEtMYnZlemJiZlRSV1hUdnFmUjhBY0IvMkE2a25VNW5QeXR0dC93VHpxODBBdk16UDVpdG5nQVpyVTBIVHBONnFvM04yRmRSYitHZnRuRHJ1SHJWMno4RUxGY1pWV1A0MTRWWE1vY3ZLMmZvdkxHTHZjMS9DTnBKcHBpTEE4OXdSeDByM0Q0WjZnR2VFL054akdLOG04UCtGbWpVT1ZiQjZFMTZqOE5sVkpvNDFSMmRUemp0WHhlYVRVbW5IZTU4cHhGT05TbStwOVhmQnU5ODd5enU5T0sra1BCYjUwcGU5ZkwvQU1KN2h0TmFGU3YzZ090ZlNmdzkxQVQ2YUF6ZEsvcWJ3TnhrWVloVTV2VnBuOHRjWFV2ZmNrZFBSUm1qT0svcW8rRkNtU25FYlo5S2VUeFdMNGw4U1I2VkQ5NzYxeFpoamFXRm9TclZuWkpGMDZjcHk1WW5JL0VLK3hJM05lVCtLZFE4dDNJUDNzNHJzUEdQakszdTJrM09BZXdOZVcrTnRSRThEdEhJcDRQUTEvRy9HbWMwOFRpYWxXRHVtejlIeVBCeWlrcEk0bnhwY0xMSjk3bWl1UzhVNjVMSGMvTnRQTkZmbGs4WEZ5dWZxbUZ3Y2xTUjU1L3dVby9ZNCtGLzdLWGl6U1BFL2dmUWRNMHZVdkVXOTdxQ05CNWFzb0h6b3Y4QURudUJ4WE4vQnI5bjd3VC9BTUZCUGhocVBoTzkwMnkwengzcHNEWEdtYW5BZ2pkMkhJRGNmTXB4Z2crdGNuL3dWdThjWG1sL3RZK0t0Qi90eisxTGZSWWJhUzBpTEEvWkVrakRHTTQ3Z2tuUHBpdWMvd0NDVnZ4Z3VQRHY3VHZoNmVlNElTYTRGdklPZ0lmSy93Q0ZmcCtLd2NxK2RQRTFJK3pTbW8yakp2bFdrV292dDFYVFhUUSswd09Vemx3UlRxUnF1ZGRRZFNNdGI5WktMNzZlNjc3bmdYaVg0TmF2OEl2RTk5b3VzMnIydW82WmNQYXpvdys2Nk1RZnc0cjNyOWl2d2IvYkd1WGwxSkh1RnBEd1NPaE5lNGY4RnFmaG5hZUR2am11dFc2S28xNjBpdkpBQi9HQ1ViODlvcmgvMkNvMWgrSCt2NmhKankyYllyZGpnVjRYRjBhdUhkZkMxZDRUY0crOW52OEFOYWxZTE1vWW5KS2VZVXRIVWhGMjdOdEpyNU82RHhUYXMvaUJ0dWZ2OGZuWDBYNDZ1Wi9DUDdPZWhXRWtqK2RmS0pUbHVjSG12bmViVWsxSHhwRXVkd2t1QVB3elh1djdVZXRwOXMwWFRZeis3dExDTVlCNkhIcFg1ekcwTU5VbjFza3ZtLzhBZ0hQbmtaVk1SZzhPMXBySi9KSzM0c3gvZ3g4Um04TjZWcXRoSEdUY2FrQWdmdXExOWdmQ09TMzFIOWtQWGtzV0szUXRMa1RlV011VzJuakh1T0srRjdmdzdmYUZIWjNrZzhsTHJPdzVyNnMvWVcrSTYzYWFwNFl1TE80dUxmVUlXWnB0dnljS1FSbnB6bkZmb3ZoVG5WR2pqNm1YMTdKVnFjNmFrL3N1UzBhdHFydlJud1BpQmwwWllWNDNENjhzb3lmbnk2UDdrZUl5Z1Q2aDk2dTc4RzJyU1JKZ2ZqWFNmRHo5bW5TL0Z1dVhlbTNHb1hsbnFhaDVJMkNoa1FBOEFpdWY4UEJ0QjF5YXo4Nk9mN1BLWS9NUS9LK0RqSTlxL09xZkQrTXdjYWVMeFVVbzFHMG1tbnJHMTAxdW1ycmRkZlVuRVpwUXhLbFJvUFdLVGQxMGUxajAvd0FMUkZBdTdwWGRhRFpyTWZ1NHJrUENOeWsrMGJSWG8zaGZUbG1uWGFlL1N2MVRoZkErMnFSaERXNStiNXBWY2IzTi93QU9lSDJuYjVsMnFQYXVvdHRLaXQ0d0FpbW5hYmFpMnRWWGpwVmdEQXIrd09IZUc4UGdNUEZPTjVkV3o0UEVZaVZTVnlNUXFxNDJyejJyUDFYdzFEZko5MWMvU3RTaXZjeFdYNGZFMC9aMW9wb3hqT1VYZUo1djRtK0h1STJiYU9ocnlQeDc0ZVd5TEtxL3BYMDFxbHI5cHMyWEhhdkdmaVpvWlh6RzIrM05memQ0bzhGVU1IRDJ1R2pvN24xMlFabE4xT1dUUG5MeE5aT0pXNEk1cm56dWdrM2YzVGduMXIwWFU0dnNmaUNLUlpJWVdXUUVQS3U1RTl5TzRybWRXUXk2UGN4L2E3Vmg5c0pFU3g0WnpqN3dQOTMycitWTVRsdHB5bmZhL3dDSHpYOWR6OWN3ZUtiaW92eS9yWTBQQjJyTXBVL2gxcjJMNGQ2dXdrQTMxNFg0Zk1sa1JrSEM5c1YzSGh6eGo5aHg4MjBnODgxOWx3dm1uMVdjWlNaNCtkWUwycWZJZlVYaG5YazhoWTkyNXNkSzZDM3UxbXI1L3dEQ3Z4R1lzcDM4NUdPYTlTOFBlTDFsaVRkem4zcit2ZUQrUEtHSnB4bzFYYXgrVTVsbE5TbEs1MmdPYUtvMldwck9veC9Pcml5YmpYNm5TcndxUjVvczhLVVduWmpxS0tLMkVJeUIxeFdacStpTGVRc01mZXJVb3JueEdHcDFvT0ZSYU1xTW5GM1I1RjQ0OEVyYXJKSklvL0t2Q1BIY1N4WExMR3VOdmZGZlYveEEwejdmYUgycjUwK0pmaHp5cEpHQysvU3Y1TzhXdUhGaEp5OWd2ZGFQMFRoZkg4MWxObnoxNDZzV2tsZmR6azU1cnlqeGhaTkNXMmp2aml2YnZHMm1rbHZtenpYbHZpT3h6TEo4cEk2OUsvbGlnL1pWM0EvZk1peEZranpIVUxSdUFWYkIvU3NmVUxKb3h0ajVIYXZUWS9DTXVwcCs3aGZQZjVTYXJhajhOYnl3WVNTUVNZSE9DblVWN3RMTUlSZGo3V2xtbEpQbGs5VHplQ2FaWlZqK1laSFgycmNGc3BnVThkUFN1Z204TnE4Kzc3S3l0anFXL3dEclZuM3RpMW92ekQyNlZ2TEV4bTBvblQ5YmpVYXNSNmJiQ1pncXF2NEN1ZzByU1Zrais3OHc5cXlmRGNKZTcycitPYTd6UXZEc2w1RnRqQmtZbkh5aXZQeFZibFo1T1lZcFEzWnBlRFlZcitGTGVlT1BkSDkzaXUyOExXTU9sWHlzWW85cFBaZWFwK0UvaDVmYVJackpKcGtrc2sxd2dXYmZqYXY5M0h2NjEwWGk3UVp0TXZtOG0zbHRXRG5aRXgzYlJqdWFtamx0VGw5dlo2VzZQcjY2ZEQ0REhZeW5WcXVuQ1dqODFicDVucUdoYWpiMnFRU0t3eGdmaFhvZmhYNHFSMkcxSTVsMjlEelh5bHAvakhWcmpVNDlOOG1XUzZia0JjNHhYVlFqVnROa2pqWVRLZXBCNjE5cGsvRldLd2xUMnVGaTFhMnZuMlBpOHc0YmpQM2FzbHJ0NkgybjRPK0lkdnJjZTFwRlpsN2cxMGN1cVFSeDdqSXVLK1Z2aHJxR3JXMFh5aDEzSHFjMTZpTDNWSnRMakEzTXpqdFg5TWNMK0ttTXE0UGxyMG5LU1c1K1o1bHcvQ2pWNVlUVmpzL0ZueEVoMHVKbGorOTZnMTVQNDgrS1VZRE5KUHQrcHJWdVBEZXBhMUJ4dTh6dVBXdUg4ZGZCblVkUUVubXFWalBCenptdmgrTnVKTSt6Q0RxUmhMazZLenNqMDhud09DcHpTcVNWenp2eGg4UUpyanpKRmt5cjg4R3VVdVBFMXhjMnpiWkcyZ2RxdCtJZkJHcGFIcWkydmt2Tkd6WUFYbkF6WHBYaEg5bnVPODhQTmRHTm5hUUg1RHh6aXZ3ZWpoOGZqcThxVk5QbWpxejlMbGljRmdxVVp5ZWoyUG1MeFg0dHVMZVllWUNWN1pIV2l2VWZpZDhDcnhZeWtsb29TTmdBZXBORmVMV280aWxOd3FRazJmWTRITjh1blJUZHZ2UitFUHd6L2FpMTc0NWZHelhOYzhTYWhKZmFyNGxjelhVcm43em5zUFlEZ0RzQUsrclAyTDliWFF2alpvTW5tR1BiZnducjArY1YrY3Y3T1YyMWw4U3JCZjhBcHFCWDF4NGI4ZnY0VDhXdzNFY2pJMXZJR1VnNHdRYzEvV2ZGdVYwNkdMVWNQR3l0RnBMKzd0K1I3dkJPWVR4T1UreXJQWnlqOG1qOWIvOEFndkQ0WnVicnd4NEMxMjNYeklacmQ3VnlCMVB5c01uL0FJRlhtWGdyd3ZIOEQvMlY5SnNaQjVGeHFTR2QySjV5M09EWFJhQiszSDRLL2JhL1pnOEwrR1BFTnhIRDRrOEwzVU54T1pXRzJWSXhna2Y3dy9sWGtIeDUvYVVzZkgrcFRhYlo0R24ydjdxREI0QUdSWDQveDVtRU14elNjTUluYVRqS1YwMVp1TVUwNzcyYWRtdDB6eHVEOG94ME1IUXlyRXdhOWpPWE0ramlwTnhhZlc5Ny9Jd3JQeE05cnF5ekszelJ1R0J6NzEzbW9mRXU2OGFYb3VyeVR6SmxSVXpub0FPSzhiMG00ODU5dWNuMXJyTkdtYVBiaHV1Qlh4bU13a1VySDZsamNEU25hcGJWYVg5VDBpODhmeWFocG5selNTYnJWQ0lGenhtdnJMOWs3UnRhK0UzZ2VPKzFxVFNkU2gxSzMrMldjc0Z4dWV5QnlTR3g2NTcxOGQrSXZoYnJ1aG1HU08ybHU0YmkyKzFCNGtKR3p2OEFsWHMzaGZ4blkvRHo5bCt5MFBUNG5rMTdXcDJlVjFjbDBCYkdNZGVuYWpLTVZTd2MzWGo4ZHJ4ZW0vYXpUdmZicGJlK2grWDhXWUNuaXNGVHcrRWFhbk5KcXlkbHE3M3V1VzFtMzMyUHB6NFBmRlJvZkNQamZ4ZHFOcXZreGp5YmFaVnh1UFBBL0VyWGluaERWRnU3NHlibCtaczgxMlA3UWQxSDhKUDJhZkNmZ3kzY2k0MWJiZVhXL2hnQU1rRWU3RWZsWG1YdzlWUUYzeVk2VjZISEdaVm9ZakI1WEtYTjdHRjVhTDQ2bnZ5MVc5azRyMVRQZ2NveSttOFBYeHNGYU01V2ovaGg3cWZ6YWJQb0R3TE1yQld6MC9XdlYvQTB2K25SZld2R1BBVnpER3FmTm5wbXZYZkNGM0dzcU12WWcxOXh3SmlWREUwNXQ3Tk0rRnp5bnEwZXJRLzZzVTZxdWxYYTNWcXBYMHExWDl2WWF0R3JTalVpN3BvL09HbW5aaFJSUld3aHMzK3JOZVUvRlVZRW4wTmVwWHR4NUVETWV3cnluNG42bGJ6eHZ1YmEzYXZ5WHhhclUvN081SEpKN250WkpGKzNUUEEvR2FLYmlUSjYxRDhLUENGcjR5OGVXZW56TUZqdUpBck42RHJUdkhrYXBKSTRiSXo2MXdZOFh6K0hMOWJpM2thS1NKc3F5OEVHdjRicjVwaDhObU1LdUpoendqSk54N3BQVmZOYUg3VGhjUFVyWVZ3b3UwbXRIMlo5TWZIajRPNlA4Ty9CNjZwcERTV2R6RTRpSVo5d2xCQjlmcFh6N0JxRnhxMSsyM2FXNm5hQW8vU3Mvd0FmZnRDNjU0L3M0N2ZVTDZhNGpoNFVGdVByWEs2WjRrbWlteUhibnBnMTdQR1hGK1dabG12MWpLc082RkN5OTNSYXBhdXkwVi9JMXlQaC9HNGJDdU9MbXBUNzc2ZXU1N2Q0VXVwYllicE0vS2E5SzhLK0tHZTRqWGQzeDFyd1B3MzQ2bGhqQ1NNcnF3eHpYZStFdGRXVmdkMWZTOFBaNVRqeSt5a2VIbTJXVGQzSkgxVHBHa3gyK214U0xJek15QmljOEhJclFzcGR4cnlYd1I0NW5uaWp0M3VtYU5jWVRQU3ZTZEYxTmJnL0tmMXIrd09GK0pzSGpxVVZobzhsa2swMnR6OG54MkJxMHBQbjFOdWloSDNEOEtLL1FEeXdvb29vQXBheFl0ZjIrMWZsejFQcFhtdnhsK0ZsdkQ0UXVyNk9hVHpyZGR6QnVqRHBYb212YSttbFJINWdEanZYazN4WDhkWE91NmJKYWk0VllXNnFCak5may9pVGpzbWhnYTFQR1E1NmppMUh5YldqMzBzejNjbHA0bDFveXBPeXVyK2g4NGFoNFdrMWkva1VoaXF0Zy9TdWkwYjltS1B4ZmFlWGJ0SEk4eS9kSERnMTAzZ3pUaEY0amhqajJicG4rZGo5MVZycy9pWDRqMC93VnFObmQ2Yk1JYnBlWlBLUHl0ajJyK1Q4ajRWeTZWQ3BtR1BzNFJhVFY3T3pmMlgzWFpuNmRpczd4Y2FrYUdHZG0xbytuek5MNFQvc1orSC9BQWJwY2JYeWZhcm9ybDFJRzBHczM5cGI5bnZ3L2FlQUx6VXJXRmJlUzFBSkdSaGgwck5IN2IvMldQeVRid3pURGd2bkg2VjVqOGYvQU5xeSs4ZTZGSllibGpnUE94QmdFKzlmcEhFWEZQaHpRNGVxNWRsbUhVcWppMUgzZmVVcldUY205MDlYYTZQR3k3SytJNjJZd3IxNU5hcHZYUzNheDh4K005VlRUTlJaZHFyc09CWEphejRnVy9rQ2hWR2ZmbXRIeHEwbC9kTXg1NXpYS3ZhdEhkRmdPZWxmenZnNk1WVFRaL1VHWDRXSHM0dDcyTzA4RWFmSGRuSVpRK1B4cjZhL1pBK0M2K1BmRVJobWJ5NDRWTXJ0anNDT0FQWGtWOHErQ3hKYjNRa2orOTE2MTlTZnMxZkZ4dkNHczI4a00zbFNrRlNPMlBRL1d2UzRmbGdZWjNRbm1hY3FLa3VaTFM2djZudy9IRWNYOVVxUndyOTVyVHlQckUvczRhVE5Hc2Nra2pKSDBBVUxVbDkrelI0ZDFHRlZtU1oyQjRKTlNmRHY0d3A0bjNKY2hVYkhEcndEK0ZkMWJhakRkQmZMa1JzOUFHcis2c2l5UGcvTThPcTJDb1FhZlIzdjZXYi9BT0FmekJpTVptZUhueTFKeVRSNTlwLzdNM2gvdy9xaTZocHNYMmZVVkdCTXloOGZnYXRSZkFMU1RLMDF3MHQxY09Tek93Q2cvZ0s3MVczR2thVGFhOTZQQW1RUjJ3c1V0N2EydjN0ZTEvTzF6bWxtK05rN3lxTnZ2ZlczYSs5dkk0dXorRjYybHdWWHlsZ3hqaGVhM05LOEtycGdZRStZcDZBOUJWeDcvd0F1US9NaHljcU05cWJjYTRrSkM3bDNudG1zc0xrK1RZSjg4STJhN3Z2MHQraGpVeE5lcHBKa05wcEsyMTN1OHNZUEhOVGFqb1VHcUp0a1hQMHJ5UDR6ZnRiV2Z3OHZUYldzQnVKbzNBbFkvZFd1aStFMzdRR24vRWE3TVNNcXNZMWRjOEhKNml2bWNMeDl3bFd6Q1dReHFxVTI3YXIzYnZvbnM5dnZQUXE1TG1OUERyR1NnMUh1UDhRL0JTSFVieGZKakFYMXgwK3RhOWo0Q2swclMxaGoyL3V4d01kYTZ4Ym1Oajk1ZnpwelNCVjU0cjI2UGg3a2tLMDhSVFRUbDJlaU9PV1o0aVVWQ1QwUjRkOFNQQmMxM0hrcjg1WVpVMFY2YjRvZ2h2WHlRdldpdnduaURnZW1zZE5VNVhWOXo2VEI1MU9OSkkvaXcrQS9pU08xK0pXbHlTTUZXUzVVRW50bXZwenhmSGNXMnZzTU1GWTdoOUsrZGZoTit6L2YrTVBoVmJlS05Hbjg3VUxlN2NQYU1kdTlVeGdvZlgyUFd2cUJXZnhOOFBORzFhU0dTR1pvaEZPampheU9vd1FmZXZ2ZUxxOUQ2M0dwU2FkbTRTWFZOYmZmcnFmME40ZXlxUEIxS0ZWV3ZhY1gzVDBmM0M2RmZYZHI1TTFyUExESURoaWpGY2l2VXZDbmlSbldNcy96QURQUFd2STlHMUlXa3V4dW5hdXEwN1dQc2R4RzI3NUdGZm5tWjRYMm1sajcraFc1SGM5KzhLK0lJOHFTdzZDdTYwZlhvV1JSbmsvclhnL2hqVzJaVjJzZWE5QzhKMzhsekR1WGMyMGcxK2E1cGxxVGJaN3RPc3B4c3o5S2YyT3A3cnhmZmFmcG1zVzhmMmVUU2lMSXN1Zk5YY053cWw0OStCdDE0WS9ibThNdzZmYitacE9zWEVjNng3ZjNjUmoyNzFQYkhHZnhyb3YyZElaWTUvaExEblpKSmJUU0JpZVhVSWNpdm9qNFYrR0d2dFRmVWRUWHo3L1Q3dWN4ekhuYWpFZ0FmaGl2VjRONGNqbVN3K0d0NzN0VStiKzZsR1RYM1MwNmFIOHQ1MW4wOHR4MWZFMDdjczRUank5THVVNHFTK2NicytPZjIvUGk1RDRzL2FIdUxHM2JiQm9NQ1daOU40eVd4K2VQd3JrL0F1ck16UmZQMXJrdmpWcDJvYS84YmZFbDhxS3d1TlNuZmNaQjh3OHc0L1N0bndUNGQxQldqYjkzeDErZXZ5N2k3RlN6RE1LK0xrN3puTnY3MmZwK0h5N0Q0WEtLR0hoSmU3QkxmcmJYOFQ2TCtIK3JSckFuelpiaXZYZkNHcmh3dnpWODcrQ2I2VFJuV0diaG1HNFlPYTlQOE8rS3ZJMmxXcjJ1RjgzOWpibjBhUHlqUE12Y3BPeDcvd0NHdkVxMnd4bjVUWFQybXJSWFNBcXdyd3JTUEhXMExrNHpYVFdIalg3T2kvUHllY1pyK21PRi9GQllla3FOWFdLUHp2R1pMSy9NajFnT0c2TlVjbC9IRURsaHhYQzJIajltc3BXM2RCeFhMNmg4VWZLdWRyVEg1aml2czh3OFdNQmg2VUp3VitiOERobzVOV25KeDdIZStLL0dVVnZFeXF3OUs4VytKSGlpTzZrWmQrS3ArT3ZpYjVHLzk1OHVlNXJ4L3dBYmZFMXBtazJ2eDF6WDh6ZUluaWJMTVp1Rjc5a2o3emgvaHVhYWxZcitQZkVJVnBCNW5ldk5mRUhpcFlsYlBOSGlueHVzc1VoWnlXUGF2T1BFUGlQN1RQZ00zclg0Zmg4TFBFVkhWcTlUOXN5WEpXb3BOSFRMNHBqWm16K3ZhdExUdFlXUXFRM3ZYbDY2c3pTWjNOK05hMW40aE1VZU54QjcxNkZUQXBMUStpclpWYU9oNnZwZXRza3EvTWNWNkI0UThUZVVvK2F2QnRKOFROdVg1ajFydS9EWGlQekVYbkhOY3RPdFZ3VSthTzNZK1Z6WEszeTJhUG8zNGY4QWl2OEEweGNObXZhZkJHdjduUnBHQVgzTmZMdnc5OFJyRklPVHUrbGVrYWI4UW1nS3FyNHhYN2p3UHhsOVZVYXNuc3o4aHozSm5PYlVVZlRWanEwTjJ1RmNWY0ZlSmVFZmlPVU81cFB1MTMray9FU0dlSmR6Y3RnVi9VMlFlSXVCeHRQOSsrV1IrZDR2S2ExRjJTT3VxRzd1bHRJOXpNQUt3ZGY4YXc2ZEpESHVHNmNZQjlDZW42MXlQaVA0a2ZhTlBMS3gzQTRJelhmbmZIV1g0R000cVY1TDg3WC9BRk1jUGwxV3ExcG9YUGlGNGpqdUF3VitSeFhoL2pQVm1qYVRheDYrdGEvaVh4czh6TTI4N3M5SzgyOFRlTGZQWjFQV3Y1QzhRT05GamFzcXplclAwbkljb2xUc3JHVHFmeEN1OUh1V01VbUdIZjByai9FZnhXdXRTa2J6cFdMWXh5ZWxSK0pkUTh5UnVUODJmd3JpdFZmRGtuOEsvRW9ZL0VWN3B6ZksrbHo5VnkzSzZHa25IVTFmN1Y4K1Rja3ZPZldzclc5VmR0d1B6ZXRaRW1vR0U3VjNWVHVkWWtWam5ubm5OYVVjSlozUjlOUndOcFhSVTFiOTY1UE9NMWhUMi96ZEszSjc1Smg4eS9qVmU1dDRwbzl5bjhLOWFuSnhSN2xHVGdyTkVmaGpVRjA2NlpwTTdUWGFlRS9GeHR0VmllSS9LcHhrVjUvZEtJQjh1S3RhRHJvMDJjYm03OFZOZWlwKy9FenhtRFZhTGxZK3kvZ3o4U1hndDNkbTNibEhXdlpQRGZ4TGd0UEx1TjUzSXVRQlh3LzRCK0tvdDR5clorWHZtdTF0djJnRjBBQmp1azNEQkhwWDJmRC9BQm5XeStNWU9UVFg5WFB4ck91RGFsYXMrV081OW1RZnRPYVRZLzhBSDlKSEVPbWM4bjhLOGIrT243ZlRlRnZFeHRMSjRXc2ZMNVpCa2tuM3I1azF6NHF0cjJ0ZmFJcG1aTTRaR1AzZld1QitKK3VqVTlSYTRkdHlyeCtGZTdtM2pGeEhtTkw2bEdzNFJ2OEFFdEpOZG0rM2tkR1IrR0dCamlGTEVxK20zUmY4RSt0dkRYeHE4YWVPOVYwKytWTGhkR3VNc2pSNE1qajB4Mno3MTduNENiVU5XUnI1bzdtQU11UEpsTzU4ajE3VjhkZnNkL3RXMlBocDdmU3J1R0ZyT1BLNys4WjlUWDF6YWZ0RmFMTHBRZTJ1SXhKams1K1d0K0RjZGhuS1ZiTXNYSlRUdTR5M3ZiUnA2YWR2eFBsK01Nb3hPRnIvQUZlamgxR095YTZxL1h6T0IrTmZnU1RWWjVyanlZekpJRDhtT2g5YTg5OENlT2J6NFY2dWhlSnBIUTR3djhJelhzbHo0MXQvSE5uY1RTNXhncXJxT0RYaC93QVFwbDB1Nmtadm5abUlVZDhWOFp4UFJwME1Vc3l3VTJ0VzAvbnUwZGVSeW5WcFBCWW1OMTJQZXZBMzdTdjlvM2FmYUVqVlpCNjR3YTlLMUw0d2FQSG9Va3pYMEt0R3ZJVnM4K2xmQjFsNG51b2RRRzVabFZlUUs2T1BWNTlRc3BOck11NDdpTTlTUFd2bytIZkdQTjhMUW5obStmbVRYdmZucFk1OHg0Rnc4cWltbnlyeVBvQysvYUd0Mm4vZHorWVBUYnlLSytaZE51SlpMK1dTVjVOekU4WjZVVjRmK3ZtWlZIek9UL0U3djlVOEpIM2R6OEV2MlA3dHJINEpXR1ArV2swekhIL1hRaitsZXUyOTUveEtMaU1sdHNoM1k3YnZYRmNEK3liNE9FbndFOFB6Zjg5bzNjL2pJMWVqZUk5RWswWHd4ZTNrSkcrM2hKakI2TXg0VWZpU0JYOUE1OVdwMU16clJXN20vdjVySDNmRE9JcVliRFVhblJRVi9TeXVjYktqSmVZMm5xYTNkQXZmUHQvSmt5ZWZsckloMDIrMHU3czRkWWpXM3ZKNGxkd3YzZHg2Z1ZZMUNLVFRMMVdYSVdzNnlqTzBVMTVOYmZJKzU5c25IMnNkbWVnZUdkUWxzSFJDVGhlbGUvOEE3TzFxdXVhdzFxZHJTWEVSQ2h2WHRYelI0ZjFyejRsRFk5alh0WHdSMTJiUjlYdGJxSmp1aVlINml2ei9BSW13c3BZZVNqbzdNOUREMWJybGc5YmFIN0lmc2srRXJmeGw4TlBBT3N5TXkzUGh1MW5qSlBZL2NQOEFJMTYzNGorSUVQZ3o0QStJUEVsb3F5TERiVFMyNFBIbVB5Ri9OcTh1L1lFdi93RGhKZmdITWJkdHpiSFVLUDRTM05XdjI1dkVjUHcvK0ErbCtGN2Rramt2eW9LZzgrWEg4ekg4V3hYMkhEMklXVmNMMU04K0YreGxaOTZrdVduQzNwYTcrUi9LT2FZV1dNNGhlQW5kL3ZiVzdSNW5LWDVud3ZQcThsenFUelM1M09TekVIcVRYV2VHTmJaWFFaLyt2WEdUeEdPNGI2MW82UGZtMlpjZm1SWDh0MUlyZUovUldLdzhaMDBrajBTZnhhTFBWRStiNXRnL0N1ajBMeDZ6c3Z6Y1Y0anIvaVR5dGZ3V2JHd1ZwNlg0dWFKQU53NlpybmxScXdsN1NEMzFQRnhHUktkTk8zUStpTkk4ZExJY3RKMDZWc1FmRVBlMzN6OHZTdm4rMjhhbTJoKy85NzNyUXNQSEpLRnQrQjlhNjZPZllxa2w3cDgxVzRaNjJQb2JUUGlONVdsM0g3ejlhODU4VC9GSmx1RHRrNyt0Y0V2eERaYktkZk0vSE5jWHJmam9ieTI0TUFlbWVEVjRuT01YaTFHbkZ0Skd1V2NMcFZHM0U5SjhUZVA1ZGNnampqYmROSVFpcG43eFBIOWE4MzhhYXpxR256WE1keGJ6d2kzS2lRa1pDRnVSazlPYzFONEN1cmk2dUJkWEZuSE5wOTFEY0tqdHlBOGNUU1lBQnlHK1hqUDRWeDN4UThYUGEyMGl0SXl3ejZIRk9xdDBKQ29wUDVwVytCeVhuOSt0ZHliL0FBdC93M1UrcnkzTFkwcS9zWUpXWCtmNldaaGE3NHBPNTJhUTQ3Vnl1b2VMaXN4K2JJcmh0WStJcGtESzBpajA1cm5ybnh2NWsyM3pDelpyNjNDNUhOTFZIMjZsU3BlN0U5ZHN0ZlUvTVdOVzdIWGpMUGpkWGxkbDRzYnkvdmZyV3RwWGlsbzNERGE5VFZ5cHE5amVOU0V0R2V5YUplZnZBek5YWjZKcmZsaGZtNEhhdklmRGV2TmRCYy9XdXB0ZGNhMlVmTU0vV3ZtTVpnMjN5czh6SFlIbjJQYi9BQW40d1cza1U3dWZyWGE2TDR5OHk0NVBKNUhOZUorQ3RGMVRWR3RwRmhFY1YwR2FLU1YxUkgyNHlNazlmbVhqcWR3OWE2TFNmRWYyWmp1YkRMeGdudlhsU3A0ckNOT0Y3ZjhBRE0rQngrVjBwemFnMDM1YStYNkh2MWg0MldHSlZEYzkrYTNySDRoTkdrWDd4c2xobjByd1RRUEVrbXIzOGR2RHVhV1E0VVoveit0ZWgzL2pDNytGOTFZUTI5L1l6VGVXSG5FRWlUS1NUMGJxRGdWOVJsZkVkZmtkV3JlTk9OazVKWDM3SnRYZlhkYUh4ZVB5VlJrcWFWNU8rbTMzN25xWGo3eHZKYzZmYnlJN0JsR1BwMElyQjFIeFd6VFozL0plUnJNaCt2WDhteVB3cmx2SGZ4YXRkVjBrcjlsU0s4bWRKQzhUYlkrQVJ3dmJPZWNjWjZZcmtkUzhTL1pkTDB1NFNmZHVFaXN1NzdoRG5qOFFRYTc4NzRxY3AxSlVaKzAwVDB1dXFqcy9KM2R2djBPREFaSkwyY1ZLTm5kcjhML29kRDRsOFZlWDVtV2JlRHdQV3VDMWZ4Q1paMlk1ejdVdmlEWFZ1cGZNM2NTQ3VSMVhVdkxmZDcrdGZtbFd2VXhjK2FleDlybHVXcUsyTG1vNnQ1ekVZNHJCdnBrbGIycU81dnQvelp4VkdXNERnL04rRmQxR2h5ZEQ2akQ0ZmxHM2ZsL05qdFZHZUtOeDllYXNTMmJTRGN2UDBxcmRXall4N2RhN3FldlU5S25idVZiaTNRdGpkM3FHNHN2bEcxcWtLRlJrMUhMSnRYajhhNmp1aHpQcVpkN0c2TWZtNEhhcWNoUDRWcVhTNEo3N3VSVkc2bHowcm9nN283b1RWaXhwV3EvWXpsZUt0WGV1VFhQOFhiNjF6Y3QyVmRzWnFJWERSbk81dnhyVDJDYnVZeVVPYm1hTmthMUpwa3U0WmIxcWg0bjhaZmJyWmwyWUdEa2RNMWt5YXV3bStibXFlb2Fnc2srMXNObnI3MTEwc0t1ZTdSckhrYjV1cGQrSHQvY1J6ek5HVEd1L0liKzlYdmZ3NStJRWx2YnhpZVNYYW82ZFFhOFEwb3c2VmJMTEg5MWhuRmRoNFUxMXI1Tm9aaGtjVnc1bEgya3VlT2xqaHpUQnh4Rkswa2ZUZmhiNHRIVkkxdDA4eUczVWNsZUt6dFR1WTV0U2ttaytaYy9JU2E1bjRYV3JHemFSbUtnSjFQZW42NXFEckx0V1JRdWVhOHJFWTZwS2d2YTY2Nkg1bzhCU2hpSlFwYUhaeDJObmUyYlNSTis4VkNkcDcxUnR0VGpzd1ZrWVJ0amdWeGFlT3hwdnlLM1BjNXFqcTNqSmJyNXNqYzFZckZQUnhoWm0xUEthcmJVcjJPeHZOWnQzdXRwRzV2VWQ2SzhzMVR4Vk5ET3JiL2JyMG9yb3B5cVd1MHZ1UFdqa1UybFpuNWFmc3NXaTJYN1B2aFZXKzgxaXJmbVNhN3FHMlh4RDRnc3RMM0tZMVlYZHdHSHlrS2NJUHhibi9nTmVZZkJIV2Y3TStEL2gyTS91L0owK0lmOEFqb3I2dy9ZRy9ZbDE3OW9UeExEcTErdmxhYmV5aDVSbjUyaUhDajI0eWZ4TmYwdHhCVWhocTlmRlZwV3ZLWEwzY20zYTNuMU9USzVMNnBCeTBoQ01lYVQyU1NYNTl1cHhQN1lIN0l2akRRdmg3NFMxNXRMa3QvN1dkSmJDVU1yZmFJWE9OM3lrNHdmWEZjNzhTdmd0Y2VDdEtzR3Z0clNUUnFTVlBWc2MxK29uN2Z2ajN3ajRRK0ZuaEg0ZDI2d3phaDRSaTNUeTRHTFNMYjhzWlByeG5IYkZmbEw4WFA4QWdvSjRTK0xIaSs3OEk2ZmF0Si9aTXVJOVM4MEJaV0dRVlVlbGVYZzYyWVlqRVJ3bVh4ZFNsU1hOS1NWcmN5VGFmK0dWMXBlNTlEa2VZMFBxU3htTlhzM1hrMUZQUzZUZkswdGQ0MmIvQU1tak50dEQyQlFxN2NWN0orejlMYnkrSWJHM3VtQVNTUUtkM3ZYbmVoelI2cnBzYzBIekszU3VtOEd1ZE8xMjB1T1FzY3FrL1ROWTV0SjFxTXFVdEhyOTU5TlRwS0RVb243VGY4RThkVXMvQkdtLzJVa3ltM3ZDREdDZnV0V0wvd0FGR05KMUIvaVJaM1VpdTFqL0FHZUJBZjRRZHgzZ2UvVDlLNDM0Y2VETDdVUGgzNGYxL3dBTzNMSXlJcnlLcDZzTVY5QS90UFdwOGY4QTdLa09zVFF4ZmI3RkVsWXN3WFovQy9KOWE1OGh4TlhPZUJzWGtsYThaNGExYVBhVUY4UytWMi9XeC9PT0xsREI4UzA4d2pMbTlwSndrbnVtOUwvTS9QcTh1MWFkdm1BSVBIdlJIZHFFKzhLZDhUL0IxOThQOWNodDc1b045NWJwZHhHR1paRk1iakk1VW5COWp6WFAvd0JvR01ldkdhL0ZhbURsVGx5VkUwMXVqOTZvUXAxYVNuVGQwK3FNdnh0NG5FUGlieTkyTUl0V2ROOFRxQUczY0tQV3ZPUGlKcmJmOEpsTDgzeWdMeCtGVTc3eGU5c2dRTndGeDFyNkNPVmM5S0Z1eVBSaHljdkxMb2V1cjQxTHlmZUhzS25meDE5bGhBTGo1dlUxNGhGOFJHam0yc2YxcXByM3hVOHFkVjM5TWQ2SThQVGxLeVF2WTRlMTJlOU40N1VhZEwrODZqcm5wWG4vQUlqK0owY0c3OTZQejYxNTVkL0Z2N1Bvc3plWUFBTTllbGVRK0tQakg5cjNNczZ0enhocTlqS2VFNTFKdTYwRkt0aDhNdWFOcnMrdXZCWDdTRm40ZStHZDAwa2kvYmJIVUk3dTFUZC9yeHRlT1JQYmhoK1ZjWlA4YVA4QWhhQ2YyZXl4cFBiYUpjV1ZvRTVhNGRkOGlBLzdSUEg1VjhxV3Z4Sm11TE81YnpWMnhrWkJibm5QYjhLcTZiOFRMcXoxU09TMHVwTGU2aGNTUlNJMkdSd1FRUWZVR3Z0TUx3bTZjcjl2ODduRkhFVUp4bE9DOTZWOWV6dGI5WDk3UFhmRTNqeTMwandIZjZiY1cxdWtwanRwRnVEQ0ROSE03aG1HN0c0WWp5TnVSMFBldENINEwzRjBMcTQwM1dJYnkzU3crMjIyK0prbHV5Q1JKR0FNZ011TThua0ZPNXdPWitBV3UzM2lUNGdYV2J5ejFIVjdHTjlSdTlQdVl2T2ZXWTVNQ1dNbnB1RWVXeGdrN2lPRHhYdUdrNkpGNFBsamgwdlZMV0N3aHRYdmRNa3VpQzBYS09JU2U3TGhWUEdDWXEwekNMd1ZPeTNldnJ0dDkzM1NSblRwdkVWSmN1bHJiZDluZlQrdVdSNFRZZUwxbG0rUmxWU2VGQlBGZFpvbXVvd0h6OGQrYTh4MW53eHFSOFhlSmhwZW56U2Fib2w3Y1J5U0loV0tCRWRzRGMzb296anJqdFR0QThYcXlMdG1PNGZ3OXNjVnRqTXBVbGVIOVhPUEQ1bXI2bjBGb2ZpcjdKdHd3UDQxMGx2NHBsbnR2UEt5ZVR2MitadE8wTjZaNlpyNS9zZkdyYmZ2dHgrVmV0ZkJUNGx6ZUk3QStGN3E4aGgwKytXU0tQem0yeHd6TjgwY2h5Y0FoaGpKN01hK1J4ZVI4dnZ0SHNVOHh1cng2YS9KSHYzd3UxYVp0TnZwZDdBdy9aQXZ6ZDJkUjAvQVYxbmpIWG92Rk9qejZza3pSeWFlVGFzdmxCUmNGWmpnNXoyU1NNZjhCL1A1NnRmaWZQb210WFZ2YTNYN21LUkZESWZsa01YQ3NQYk9TUHJYVTZOOFJidnhINGJrMHkzdHBwcnBwdnVweTF6Sks2bmdmUkJYeWRUTHFrYnEyOXRQdS9FeHhXVnVWUllwTmJyNUt5VHZmdmI4Zkk5aytEM2p1MTBGdFV1cExOTDYrVzJaYlFTSDkxQ1RrTTdESTNZWG9PaHpWVzM4YmZiZFQzdkpsMmJKTmVXK0hQRTkxb0hpQ2F4dmJlUzF1ZHJRUEZLQ3JLU080L0twdFAxL3k5UTNiaUdKNUZlVmpNSE9VRlJrdEkzdDZ2ZHZ1L1Y3YUhQTEk2YnJUclIxNWtyUHk4dkxycDNQWC9FUGpBaG84U2Z3OVRVRW5pYUp2Q0xrc3h1RnV4dEliZ0tVUGI4SzgvMXJ4SVpSdzNHT3RkRjRyMEVlRXZnajRmMXlhNWlWdGF1Wno1Yk44eXFueWc5ZWg1cmd3ZVd5VUhaWDAxL0w4Mmp6NVpmVHBLbkdlOHBXWG03Ti9rbWFpK0pQdE5teTd2bVdzdS8xSHo3U1J2TlVOSDJKNU5jZlkrTUZTVVlrWGF3OWFpMUx4VXNjaDJsY2ZuVHA1ZTR5dFk3b1pmR0V0RGFmVUpDY2c4OTZkRk84cmxteno3MXh0MTQxOHJPMXUvTkphK1BuWjhEYlhmOEFVcWxycEhaS01Oa2VnUlhQbExVTTJvS1ViMTcxeThQaVV5a0R6Rithb1g4UUNLNDJzeTR6V01jTEsreENveFQxTjU1TythalMzWjBra3o4cThubXMrRFZST3Yzc2luVGFndXo1VzdWWHM1WDJPbFdTOTBiZVhRVWNmZHJMdjdnN3N0OHVlUlNhamVCajFyTGx1VGNYU3htVDJydW8wZEFsVXRzUG5uK2I3MVp0N3JNY0J4dU82dmVybjlqSytpL1o5azhhU2FoYXh6K1FidE5PWi84QVNIdHhuTXUzMDcvVG12bG5XdFpXSzVrVU4wSndhOXlPVTE0T0tyUmE1a3BMYlZQWitYbzdNODNENXBoOFNwT2hOUzVXNHZ5YTNYL0IyTmk0MXBaWDNVMyswbzFPK1FqOGE0OTlZMnhzZDZpc1BXdkdEQmZMVTlUMXpYcFU4cmN0RWJmWFVrZXFXM2l0Yi9iREY5M08zam5OZXVmQyt6aGhlS1NaZVZBd0s4RitFRTdmYTRRNmJtY2hpVDJyM3pRNzJLelJkNTJrYzlhK1h6NmtxVDlqQTZLc3BWTVBwMVBVWDhVZlpySVJSZkw4dGNmNGo4VHl4aHR6ZFNhd3RZK0lNTmhJRmtrVldicGsxeHZpNzRreHRNRkVpL01PQ1BTdm5zSGxzNU5KcHM4M0JaU29TNXBJdlhIeEt0NHRWYUdhNXc0YkcxdUsxbjhVUWlMZDVxamoxNHI1WCtPSHhCV3oxaEdoWnM1K1lyM3Foby83UW0relcya2tkVGdETHR3Sys5andmVXFVWTFxZlhjN1pZckRxZkpMb2ZTK3VlTmxZc1BPVnVSMzZVVjg5M0h4TFZVM0dZU0szZlBGRmEwK0dhaVZraS9ybE5hSStWL2h2ZjIrb2VIZkRkbEJQSEl0ekhER1NyaHNLQU4zVDhxL1lMNEMvdElhRit5Myt6SGFycGNkdmVlS3RTZzhtenQxSVBsSEgzMzlBT3RmZ04reTM0WTE3NFkvdFVSZUZOYXQ3M1NkUzArVjRMM1Q3amhvSEdDVlpleEZmb3o0bCtKMm4vczlmQ1hXUEZ1dVRlWjlqaHpDak56STNSVVg2NXI5YjhTc2pxVWN3dzlIRFM1NVBXS1MxazV1eS93Q0hQa2VDNkdFempJSjFzZDd0T0U3eVY5R29MWnZ0MVo1Ti93QUZWLzIxTDd3WDRZdXZEdHZxa2wxNHU4VkV6YWpjaDh5UXhzZm0raGJvQjJGZm56OElkUlhSL0htbTN0MUcwMXJIT3JUS0d3WFhQUE5VUGlyOFU5UytPbnhSMVB4THF6NzdyVTV6THRIM1kxejhxajJBclE4TVFLSkl6L0RrZEsvYnVHK0Y2T1I1T3NGOXVTdk5yckpyVzNrdGtmbEdkY1VWTTh6ZjY1RFNsVGRxY2VpaXV0dlBkL2QwUDBjMFR4dDRiOExlRmJlODgrTzFzcnBSSkVrampjb0l6aXFhZnRJK0dTKzJLNFp0cDZnZGE4eitKM2k3d1RxLzdKV2llUWJJYXpiSWlmSS83NHNNZFI2VjR2NFgxZmZBckhtdnlqQThLMGNWU3FWNjNPbXBTalo2YlBmenVmcXVhOFgxOE5WaFFvcUxUaW5kYTcva2YwRGY4RWwvMjB2RFB4TStDOXhvYzBsMU5lYVI5NEpDWk1MMkp4WDNqNGxuMEx4ait6WnJNeTIvOXNhVDlobG5rdFl3ZDBwUUY5b0hYT1IwcitaSDlqTDl2SHhwK3hwNHJ1TlE4STNGb3B2azh1ZUM1aTh5T1FmbU9hL1U3OWh6L2d2QkJkZURielNmRzJsMjhmaURVcFQ5bmxoSGwyZnpESHpFazQ5NjgzTGNJOGd4R0poaW8zd3RTbk9La284MG84eXZxbHVyM1ZyV3RhN1B6SGlESnF1WlYvcjJBVjZuTkdUanpXdTc2MjBWdS94ZkkxZGIrSEd1Zkc3eFBmYTUvb3RtdDBmTVdGVXdzTVlHRkdCMHdCWEIrUHZoenFuZ2VQekptam50ODRNa1o2VjdYOFR2MjRmaHo4QnZFZmg3UzVOUjBpL3UvRStIbE9uU0NTTzBESC9scGcvTHllL1d2SFBqYi93VWUrSE45OFN0YzhCYXhadzZiY1doU0tEVWJaQTBkeXJvckJqanVOMkQ3ZzEvUDhjcng4M3pSaEtjck9UdEY2eHVrMm4xdGZXeCtrWmJubU5kU01mWjJwYUpiYUphZDc5UFY3bnp2OFF0UldMeGZkZk5uN3VUNzRGY3ZmNnZ1a2JMZnJYcDM3UzN3Q3VQQm1tUitKdE4xT0RVOUoxS0pKMUtnN3NZQXJ3Sy93REVHR2JuREFWOXZrOU9saWFFYWxGM1ZyUHlhM1BxdnJjV3VaUFIvd0NadFhtcllaMjNmcldGcFdtNng4UnZGMXZvK2hXbHhxV3BYUkt4VzhJeTdrQWsva09hcjJyM1hpSzlqc2JPT1M0dTd5UllvbzBHNXBHSndBQjZrMWU4RTJXdmZCUDlvT3gwM1ZyVzYwdS9tYzIwa1V5bU4xTHFkdlgvQUd0cHlPb3I2ZWhoZlpRblV0ZHhUYVhleUk5dHp5alR2YTcrN3o5RGI4WmZBUFVyWDltclhQRkRYMHNPcWFUSkt0N3BNbHV5eVc4U1NpRjNMZXF1UUNwSEdjNXJ3TDRLZkJieFQ4ZTdUeExjZUhZN2VaZkRkazE3ZExMY3BFU3FobTJvR0kzdVZSeUZISkNHdjBFMXE1dE5kLzRTS3cxU1JWMC94ay96dWd3dU5Wc2pCSzNQOXk3dDVYOUFSWHhkK3doTWZDbWxlS3pOTVlacHZFY0dsaGM3VllyQmNobC9PUWZuWHM1UGo1UXdGZXRGSnlqT0tYWnhrMWI1OHIrODh1dGhxdGF2Q2xOMjVveTZYczRwM1hTK3FYbnIxc2VMZUhkWHVyalR0WHVGbGJ5YmRFamNCZDNtRm15b3oyKzRUbjJ4M3JYK0grcXd5ZjJwcUY1SGRlVHBOaE5jNFZkK1pBTnNZT000QmRsNU5lUStJWnJ5SHdCZGFoL29zT25YMStzUG1OSmdtU05XSlRBNTZOM0hhdlFmMkF2Rm1xZUhQam5ZMjlqZStINHRQMXRvN0xVbzc2UHpiZTd0bWtVdXI1T0JqQTR4azlBUWNWK2tZN0s0eHd0U3UzOFA1SzExZnZ2MFBpc05ubFpTVkdrbTczMTdYdll2ZkFUNG1YK2hmRzNROVJndkpvYnE0dWxqTW9ZaGdXNDYvWEg1VjlYZU1JNW83S1M4dkpWZTQzaVZpcWhFSjU2S09CMTdWOFovdEdSNlg4Si8ybHZFdGo0YmFiK3lkSDFabjA4T01GSXdRNnJuSjNCYzdRd09HQUJIQnI2eDFmNGkyZmpyNGQ2ZGZXNnQ1ZXFXNlNBanRrZEsrSDR3d2JjOE5pNks5eWEvRFJyOEgrQjkvd0NIdVlSblN4R0dxL0hGMysvUi9jMStKaGZ0RC9HZTJqK0hlbDZiWXJjV3MrcFhFdDVxQmRzL2E1R09YbEJIcWNLQWM4QSt0ZVhhSDRwVi9tM0ZjZGNHdVMvYUg4VFRMOFg5VTBwNU1RNkRJZFBoVlcrWENkVy80RTJUK05WdkJkMDJvd1hIN3hrOG1NdXZ5RnQ1SE9QeUJPZmF2VndlUnhvWUtMZTh2ZWU3MzEvQmFIeUdNem1OZkd5alErR09pUzdML04zWjY3cDNqS01iY250WFdlRmZITnJhWE1HSm0vZS9MS3UzN25welhnOWw0aklYTzQvblc1cG5pZnloOTRnL1d2TXhlU3FTYU96QjV6eXZtajBQcXJ3THJxVGVLZFBWbVdlRnA0eHQ2aHhrY2ZqWDFscitnUzZqOFN2Q21xMlZuWldOMTRnc29tYUsxaFdDTU1mTWh6dFVBWjJTZFFPb3oxcjR4K0MybXphMThLdEg4VFJSdkhCcDJwdHB0eE0zQWVRNGtqWU45RzJrZGlGOWErNHRBdVpMUHh2OEk5U3VMcmZwVW1qdzNEeDhmSzl2Sk9Yd2ZmY3ZIVDVSWDVOeERoWjBhcnBKMlZwWDgybWt2enVmWFlyRiszb1F4RlB0TFQwaTVOZlBsL0F3UDJsNWRMOE4rSGZGV29TVzl0OXVYVm80Ylc2T2ZPVXF4VGJuUFRZbWNlOWVJei9FR1BUaGEzVWtqUnczcTdvOGdnNUJ3UVBYSHI3MTZMOFhvcFBqTmUrQzlGV1A3UEhyMnAzZXY2bjgyRmh0RVpWQi9FbVVEUGNDdmxYOXBiOW9xKytLbnh4dW9UWXg2TFplSDVaTkx0YkdOZHZrSkc1WDVnTUx2T09TQU9nSGFyeWJKRmphVGMvTitrYnVNZnZ0Zi9oekRCNWxVd05zUEpYMXM5ZHJKTFQ1bytqdkRmanYvaFBOUXR0RHNVWnJxVTd3eDR5QU9tT3RkRCszTDQxdWZCV21lQmZEb1pXczdmUkV1azhzWXcwanNYejc1R1BiRmZJT20vRUxXUERlclJhbHBkeGNXOXhaZ1A1c1pQeWU5ZXIvQUIzK00yc2ZIUDRPK0VkZTFDR0pmN0RCMGE0ZEV4NXJrdkxISm52dVVPRHoxUTF0UjRialJyUm12aGQxYnowZXYzWCtROFppNTFLOU9jVXVXTGYzdFd2K256SWZEL3hOYVFsV2tPN0hITmRGWmVLcEw0YnQyZjZWNGhvMm9OTSs3NXE3cnc3cm5rd2JzL2RIUE5SanNyaERXQ01hV0xrM3FkamU2NTFCYkhQZXBMRFU1Rk9WNEk5YTRXKzhReDNsMUp0Yjd2T005YTBJUEVqVytuNVk0NDR6MnJpbGdHb3BXTkZpdFR1OU84UUNLNDJzMU1PdFRhaHFubHdocG1aZ3FJZ0xNeDloWEI2WjRzVUJta2xqWmdTUmc4MTZoK3prMXQ0azBpK3U0NFZYVTdDNWE0am5WeXM2b3NlU3E4NHh5VG5IYnJYRmljSXNQQ1ZXUzBYNm1rY1Z6dmxqdVU3ZnhXMXRPMGJibzJVNElJNlYydnd4OE9YbnhNOFYyT2sySTh5ODFHZU9DRlNjYm5kZ28vVTB6NDkybGkraU5xelF3dFArN3Q0SlkxRVdBZ1ZueXE4Tm5mMVBOZXhmQ0hVdmhqby9nL3dndG8xNW8vaWVTM2p2L3dDM1RMdXQ3ZTVERmxpZE1mYzRVRWprSG4ycmt3dUhvWXFLbnpLSHE3WGVudXAyYVRkOTNaTGR0SXd4ZU1yVUtmdXdjcE5PMWxlMmoxYTBkazlHbDczWk00ZjQvZnMzZUl2Z2xKdTFDR080dHNsVGRXa25uVzRidXBjY0JoNkhCL25YZyt2ZUtocDh3dzNLbk9SWDFKcm54Q3UvRDJpYWpydW56ZjJ6NFYxSzROanJtbnpIekk5Nm5PRDZkeWpqbnVLK1kvMnF2aFVuZzdSNC9GL2gyNGZWUEIycVNNc01oLzEyblNmOCs4NEhBWWRBM1JnQVJqa0QxTXR3dUd4VlQ5eEZ4N3hrMDJ0ZWpzdWJwMFZyOVZxYzFISFlpRkZQRTJiMjVrcks2M1RWM3l5N0s3VFdxN0w2RStJUHhUdlg4TGVEZFd0Ym01anM5VThQd1JzZ2M0ZEZVd1NLUjZFbzFmRVhpM3hVZE4xeTloM3NQSW5lUEhjQUVpdm8zeGY0bm5IN0h2d3QxS09OaWY3SnVvdXY5eThtL3dBYStNL2pkNG9YL2hNNUxoV082OWpXVjF6OTF1aC9sbjhhOXJJY3RkVEcxb3ZYL1BUL0FERldsQ2hsZFBFUlNUdkpQelNrMHZ5L0UzTlMrSUM3U3ZtSGNheHJueGViaTVYOTRNZWdyenJWUEUzeXRoanUrdFU3SHhUKyt3N0hiMDY5SysvbzVIR01icEh6RTg2dksxejZlK0hIeEdWTHFIOThjcW9IcG5GZXBUL0dtQ3lqVU5KODNIMUZlVUw4WXRDOFgvc2M2RmFhWG9Ockg0azBXN2swMjd1MWdWV1g1ak1reGsrOHp5QnluSjJnUllBNUpyNWUvYUEvYlR1dmhsYXJhV0dtdGM2cXVDejNHUkVCM0hIT2ErYXA4RlR6WEYreW9SMVRhMXN0dXZvZlJQaU9HQndpeEdKMGk5VmE3dnJhMjI1OVZmRS80MUc5MTJCWVpuUVo2NTROWk9xZkV5U1ZJY1NNZHk0cjREMUQvZ28zcjF5aXlTNkxwelhpTndjdDVlMzg4NXJuMy80S0QrUFA3VyswTC9aZmtkRWdhM0pWUHhCQnI3ekMrRU9ZS0Npb1JYS3VzdC91dWZKMXZGUExWSzZsSjM3UjJQdUx4akxjYXBxYS9lZU5oa1Z4UGppNGJUNzJPTWJsWmdNZ0hwWG1mN0huN1RuakQ5by80d2YySGVXZW5tM2hzcExwL3MwTEs0MjRIVXNlT2E5UStLUGdMVUxMVzVyajcwU0U1R1R4WFBVeXVwbG1OV0J4YmlwS0tkazc3N0hwWWJOcU9aNE40M0NKdUxkdFZiYmM1MmJ4N2VhVWRqenplWDI1b3IxbjlsNzluL3d0OFlQRlBoaytMTDU3alQ5ZU43R3VtYVJlcEhxc1p0MHo1ajcwS0pHVDB5ZHh4MHh6UlcxYkc1ZFFseVloMmw2Ti9rbWVmVWxpNzNwSnVMMmVuNnRIbUg3UmZ3dzhHZkFqL2dxSHIrajJkNU51MG0vbFh6Ymk1TWpUTysxd3JTSC9BRmpEZVFYL0FJaU0xNFYvd1VUL0FHc0pmalI0MGg4TmFaY1owRFFUdE93L0xjVGRHWStvR01DdDMvZ3F2NGhuOGUvOEZBUGlscUdteVJ3dzZWZUV4bVBjbmx4Unh4b0ZHNzVzamdjODVCcjVUdFVhN3U5emZNV09TZXVUWDY1azNEZENwaWFPYlY1T2M0UVNpbnJadlcvclo2YWFINXRtUEZXS3A1WlBJc1BIa2pVbTNKclM2VmxiNzFyMytiTkhRYk12dDk2Ni9RWWRwSXoyNzgxajZSR3NTZk1DUHB4VzFvNmxDekw5ZmV2ZnhsUnl1TEs4SkdsQkltampranV0dTRsVjV4bk5kUjRlMUZvb052TzZ2WFAyUHZCdmhIeG5vMnZUYS84QTJaSkxieG5hdDFJSXlvd2VWejNyeUdlM1ZQR3QzQnBzY2wxWngzREttd0ZzcG4vQ3ZsUDdTaGljUlZ3bkswNmRydDdPK3VoN0ZiTHFtSG8wc1NwSnFwZXlXNnMrcU9oMGZXV2U0VDYrdGRoRDRudUZzZG9hVGF2WUUxQmIrQVp2RW1xMmJhZnBOeFpXc2EvdlhrWGJrOTY3S0w0YXg2YXdhT1hrRGxTT0RYemVPeG1HdXViZnQvblk5ekE1WGpIR1RqdDMydjZYT0wwVDR3M1BoZXp2WTQyamsrMU1vWXlqZXk0NllKNlZKcmZ4VGZ4YmV3M2x3N2ZibEFVeTd2bWZIcWE0WDRwYVhQb0hpU1g1V1dHVnR5N2VsWTlycXJCRitZcitOZXRTeW5EMUlyRVFXcjYvSThldm1tSnB6K3JUZWtlbnpQMlkvd0NDZkYxZGZIejlsV1NEeEZmTE1tbEh5YmJQSk1aSElQclhrc2Z3TDB1MStNMnVXczAxeGVhUHA3aGJTTkpOdjJsMkl3ck5qTzBaNXhnNDdqclh1SC9Cdno4R0YrSlg3UG1zUzNlckxZNmxjVGtXRU53dUlad0JnamQwQkpycHIvNEkvWS8yb3JmUmRXVmJXYTUxZ1c3eHE0UklsTXVDQm4wSHJtdjVjeGRERjVkbldMVkZXcFZKdU1PVzF1Wk5jeTArRnErenM3TzZSK3M1RGo4UGlYS2pYazcwNFJtMDlIYmx1N2QwOTI3N253SDRzK0kxcjRWK0ttcFRlSHpMWnc2VnFURzBWbkpNWVJ5RitZOG5wMXI2VjhaMnkvdGtmQnZTUEZYaCtHT2J4cDRFUmJ1UzNRNW12N0tOdzdxT2NzOFBKd09TaEovaHI4L3ZpT3V0YWY4QUVEeEUybHFMclNiSFVaN1JMKzVsV0tDWUpJd0h6dVFyT1FOMjBIUFBTdldQMlpQMm1wUGd0KzBXMmg2VHFFMXVKTFNIWk9reHl0OElWYVFLUmpBTEYxeDlCazErczVoa0RwMDQ0bWg3MG9SYmFUMWNkT1pQejFUWC9EbkJsZWJVc1ROWWFwN3JrMG95ZXlrNzI4Mm5acDlycDdwSDJWcnV1MnEvQ3JXcmU0dWJjUjZkZVd1cGFlSkpBSnZLZDFrVkZIVmxHV0pIWXNmV3ZOZGUrR3Zodi9oWWNsaDRidkxmVW90ZThRNjM0MmxGZzI1N1NBMi9uUlJNTURheUJIRzN0aXVOK0xQalRVL0hsMWNhaGZTU1BjVE1TN0U4bnNLNWY5blA0aC84S2krTittNnZjWE1rTm15eldWMUlvSjJ3enh2RTU5OEsrY2UxZko1UGdha2NOS0xuMmR1N1NhV3Z6Kyt4K2haaGhZUi9mcldvbE8zYm1sRko5TlUycjlOMmVPK01mMlVkQjhVNkI0ZWs4TjYwWHNkUXVwaGMzMnVSTmJSYWRKdGhIMlliZHdrWXlPNURLUHVqSndBYThpZndGTDRiOEplSnI3U3JpM2xrczdxSFNuU0FzWTdyelhmYTZNQ01ZTVFJUFRrY1Y5VS90bjY5cFB3ZjhLMk9oK0ZkVXRkYzB2U2RQa3NQN1NpQjhxL3Y3Mk52dE1rZlE0U04yVlRqSUNwbWo5aHJWTlArR243TCt0ZUp0UThKNlg0eSt5K05OS1ZOTHZsQWh2MzhxNENSeU5rRUtDK2Vvd2NHdjFUTHMreEt3U3hOVjNpNXFNVTkydWJkK3FzOWxhL2RNL0w4NHlmQ1VhZnM4T256OHQzZnB6TktLUzBhZXZWOWtmRGVxYXhkeFRMRGV0TkpkVzdlWEpMSXhaaUZ3cXIxNktBQVBhdnJ2Ui9nSDhVTlIrRW1oNnNkU2swTFI0TGVHTzBzcmUzWGQ1ZU1iM3lkelpJTzVnTUFrYzE5dTZyK3pQOEFEMzRoWDFyOFVkZStEZnczOE8rSGRQbWdsR2w2SVpyblVYdlhPUEp1TFpHbFdSUmt0Kzd6MEJJQUJ4OUVlSC8yZlBpRjhicm0zdVBCV2srRmRMRmlHaXY3Z3UwMXRGQzUzYkZNclBIdDJnaGtUcGs4RHBYeFdmZUpQMTdFVWNIbE9INTVKdTdhVWs5TlZGSlBaYnUxMWRMcWMvRHVCaGx6cTRqSHo1VlpMV1hKeTIxdEpwMzFkdHJxOXI3NmZoQjhadkVONWZmR2p4UkpxQ1J4M3k2bmNSM0NJMjVVa1dRcXdCN2dFRVYxT2thL1lyYzZWcFdtemZaa2V5SzNrMTFjRHlaYmwxZjVnZWlxQXlxUFFnK3RmY1hpTC9nZ1g0djFiNHplTFBFR3NlSlBET2syYzJwWFdwL1o3R2EyMVR5b25jeUtERVg4dzd2bVlLc2JNRkdPVGdINHYvYSsvWnQ4VGZzNzJyK0lwRTBuVlBEV3FYVHcyZW82VGV4WE5zV0RGZGpyR3hhRnVEOGtnVmhnZ2dFRVYraTRYR1lMSHFuaDZFazJrbHB0ZXlWdXp0cmJWbnllQnIreWRYRVRhdCtqdTlPdXZvWk9xYWxaMmswVnZaS1MwQTJTeitidVdjLzNnT3c2L2hpbnJyNUNIbmdlOVlXaGVEdFZ1ZkRsdmRMSHZra1JwSGo1Vm9sQ2c4bHNMdXh6dEJKeDJxMThOZkJ0NThVZkZsdnBGcmZhVFlOTmxtdU5Tdm83TzNpVWRTenlFRGowR1Nld3FxbENqR01wU2tyUjNiZmJlLzhBWG9hVks5WlRYdU9QTnNyZE5MVy9EOVQ5QnY4QWduTmJXSHhHL1pUK0lHaHRKSE5OYjJTNm9rTWtvVE10dk9Kc2ducGhVN2NucDNxUFIvam5yM2lPV3oweHRTbVcwMDBpQ3pWV1A3bEhQN3pIMTZHdm56NFdlRHRZK0NscHJXbncrSzlKMUg3VkdCTW1sWGZuUXRBVGpJY2NISjRLKzJlUWE5SCtFNy9hZFNWdDJXR01WK05aNWdhWHRhOWRTVTR1WE5IZlM2VjkvTmZpZnMzRE1tcVVIT05tMUc2YTFUaW5HL3pXdlRkbytzcFBGY0dwNk5idloyYVEzdW42WXRwTmRQTGhHalI1SkZ6a1lSUVpHTEgyQjdWOHBlTVBoN3AzeEcrTjF4NGcwdStlNDAzeFY0Z2xqV1JZdG1YWTc1WEdlZ0xsOERIVEZlNCtQL0Flb2VKLzJaUEhWMVp5U3dmMlhZUlRUT2pGZmtNeVpYais4QVJqdm11SC9aeThKTS9oWHdERzZibm4xdVNUcDF3QU0vclh5K1U0ajZuZ2FtS2pMM20zRC90MVFiWDRpelJZZjY3S2dscEJYK2NtbTcvSTg2OGE2UmNlRWZFK3FhVGJ6VHJicEtiZVE5NUZVOSszYXZSYi9WbGwvWXdqMGUxYUsrZXk4VFIzTWhWY1RXOFhrVHFwZGV1MHRJUm5PTTRHZWEzdmliOEtYdXZpSHJMN2V0MC9iM3JkK0F2d2hiVS9HYTZmdGphUFZJNUxHYUZsT1owa1VqampHNEhEQWRjcUNPUlhSSE9hRlNsU25ONnhzMzV1MW5mNU00TVZSa291YjIzKzdVK2J0TW5lQWZlSzg5SzEvdDdXOEgzejh4d2VldGFQamJ3Qk40ZjFxNnQyUnQxdkswYkFEdURqK2xZMnBhSmRXc01aaytVc3VjR3ZhOXBUcTJsZmM4MzJudkNhbHF4dFlHZmQyNjF5OTE4VExqUGxyTXpiVHh6eFZueHZQSlphTTJmbGJnQSt0ZVlYT3ZycDAvN3hoeWNubXZieTNMbzFZOHpWK3g4L21lWVNwenNuWkhaYTE0OG1zb21aWk5ydDcxOVBmczVmRVN4dWYyYlYxQ3hnL3MveEREZHRhVFhrTXo1blFxd1lNcEpYSlZnT0FPUFd2TC9paDhDdkRkLzhFclc2dExoWTlZc2ROKzN4WDF0RklzV3BLdzM3WlVrT1ZJR1FHVUFkT01WTi93QUU5L0JHci9FYndIOFJKV2hrYlJmRGVreWF1NWFUeW8vUEdFakc3b0NjOU9weGl2T3ppaGg4WGxzcDBIclRrcitldHJhN3JyOGpzeStwV3dPT3AvWG90Um5HNjg3N2ZqbzArNTlDL0JyeHpvc3ZpN1JiZnhoSkpkZUc0N3hHdW8za3hsU1YzYzlzZ0FaSHBYc3VtK0ZQQi94Z3ZMbVR3ZkcybVc5eEpMRmVhSVpkL3dCZzRQbDNjTE56NVhIN3dITzNnOUR4K2NYaUx4N3I4dmhTNEYxQ1BzOGt5d3hTd2xtVVAxQ1ovdkVEakhwWHJQaGU4OFhhWDhMZFA4UlhlbjZ4cGNsclA5aHVaSjRKSU56RGxHNUE0WmVEN3FhK2F4UEQwNldIYW55dU1uYnBkUG8wN1gzNmJYM1R1ZldQR1lmRzQzbHB6bFRxS0s1ZjVkM2RPT2liZTZlK2kxM1QrZy9nYjhUWVBoTjhWZFQ4RytPWXBvZkRQaURObGY3aDgwTEFueTVoL3VzUWMraE5jUjhRUEdrUDdOM3hTOFNlRWRkdDRmRWZnMjhtRmxxbGlrL3pYRnUySGpuaXdlSkZVcTZOL1FtdTYrS0JQN1lYN01rWGp1MHRJNHZFM2d0RXNkYkVFZTFaNFNBSXB6amdISXdjbXZqL0FNZS9FT2J4WkpaMmx6YnduVUxSQkE5OFdQbTNNWXdFVjg5ZGlqYUQ2QUR0V2VVWmU1VkZLVWJXMzZiYk5lV2oydlovTWRhU3JxcEtlamw3czQ3cFRWck5kbTQyYWU3VGk5R2o3YStPL2dhMytISC9BQVQvQVBoamNMY1F6MnNZdW83Vm1PMTVvWkxpU1NOaXA1R1ZJejcxOHk2Tit6eG9IN1FYaDN3OHQ5YTZwYTNETmN0RmNhVEVyM04vdGZCakpJSUFIQkIydGpQVG12SC9BTzNOZTFHNmgwdTQxRFVMalQ3Y255WUhtZG80djkwWndQd3I2VS9aSCtFT3UrSU5Da1pMVzlsczlOdVdaWklrWmxpYVlEaGlPbWR2QSt0ZG1QcHl5MkVzVlNxTlRiVDAvd0FObjVQWFcxcmZjWllIRDAxZy9xT0x0S0NsSjNlbHVadHBiOUwydmZYeXVmUGY3VG43R00zdzhzclM0OEs2RjQzdUk0VWQ5VGx2WS90RWNJR0NwM1J3eGhlTTV6a2NkUlhnbmliNGQrSWZDMnQyVmpxT20zMWpjYWxHazFxazBMUm1kSCs2eTVIektleEhCcjlXZFQ4TDNYaDNVM3RGZ3Q3M1VyRU1rOW9GZVowRGZMbDFPUVFDUURuZ0Zobk5lS2Z0bytDdFk4WS90c2ZENHI1bHZhVy9pT1MyV0FqWXRyYnhTSklJeXZSUXNhdDh2R01HdmU0VjR5clZxa2NKaVk5SDd6ZXVpYjEwOHJIeXVlOFAwSUtXSndzbHk2UGxTZlZ4U3RkdDJkNzN2WXBmc25mc2FhcDhLUGgzOFU5TCtJSDJHM3NiM3d6WjYzQmNMZHJJbG5LbDJzZXdsZWt3RGxTblVGaFh3TCsyNUQ0WjBqVVd0dFBFbHhlaTJpL2ZNR0tMSmtoOHNmWEdmeHI5US9ESGlXUDRpZUVQaTlwdXBlSUZGbnFHaDZmYjZQYW1ZRjd1NWE1aGtDb0NlcFpwQ2NkZ2EvT2YvZ3BWK3pYcUg3UG53YjFGZFh1TEc1MXFIVy9zVThscGNyUEdJOWlsUUNPNFlPRC9BSVlOZlVjSTR4VnM1aFhxemNYVWNWWlBSdDdPMit5MXYrUWNSNWE4RGt0ZkR0OHpnM0pYV3k1SXQydjV2MFRSOEc2KzBZMWlieS91cTJNK3ZyWDBIOGE5SHRaditDZi9BTUhudFliZU81anV0WHVicDQwQWtrTDNDSXBkc2M0V1BBNTQ1OWErYnllZjhhKzR2RG53bXNQaXovd1NNOEcrSTdmN2ZEZmVHL0crb2VGdFFrbmxaclhaY1IyODhESXVEeXBrZmNGOWM0NXI5MTRreFgxVDZuVmxLeVZWSitkNFRTVCtiWHpQdzdoV2pUeHVKcjRlYTFxVTVXOHBYVFg1SGd2N0RIN1hDL3NhZkZ5NjhWTm9LZUludU5Qa3NWdDN1UEpDNzJVN2ljSFAzZW52WDZKM25qNjQrUEh3SHN2SFMrRU5ROE1qWGxlTVdsMUZqZXYvQUQwVGdia09lQ1FNaXZ5WDhWK0gyOEYrTGJ5eCswdzNnc1p5aVR4QXFrNEJPSFVNQWNIR2VSbXYzcFQ0dDZMOFR2MkwvaHBxVjB5ZmJHOFBXYUFuR0N3aFVFZm1LL0p2R1dqaE1KV3dtWjBhWE5WcXk1WEs4dmhpcnFQTGUydDczdGRXUHY4QXdweGVNZFd0bGxXVnFjRTd4c3RHM3EyOTlHcld2MVBrL3dBUmZDSDRnZkczUWREMHY0Y2VCOU5YVUZXT2RZOUtzWGx1bkVjY3NjenlTSGMzenNOekxuYmt4OERnVVYrcjM3RGR4Wi9EVHdINFZqdU5TL3NId3JiNkxONGcxN1VvSEVja3ozVjAxdlp3ZVp3UW8yTSt4VHlXSlBRVVZ3WlhMTXF0QlRvMHFiVDE5N2ZWSjd0M2VqVjN0ZTY2SDFXWmNSNHZEMWZZNE9qS1VZcTE0OHpWMDJ0Ykt5YlZuYlhScDliSDgxZnhjOGQ2eDRpK0l2amJYdFpLWEY5NGtubm11cEFlREpMSVg0L3owcno3UkkxTW8zZnlydS8yanJyVDdEeE91azJxYmJtempEWDhnejg5dzNKWEIvdUE0K3VhNno5bWo5aWZYUDJoN2lPS3kxYlNORmFTMmx1a2ZVMmVHTjFqUjNPR0NrWk8zQTl5Qlg3YkhNc05oTUFzWGluN09MUzFmWkxUdjAxOUQ4YmhsMWV2bUgxYkRSNTNDKzNyZC81ZXB3TmxDcGk0L01jNHFhVzgreFFNb3gwOWMxMjNqRDluTFZQaFQ0TDhRNmg0ZzFQUzlMMUxRcnkzdFk5SmxrTFhWK0psRGI0aW9LbFZVZ25KSFd2TnZPTi9jUXJJSkVqbU9BekxqTlJoc1JSeFVYVW95NW9wN3JiWlBSN05XYTFWMGU1aS9hWWY5MVVYTE8yejZkTmUydmM5TS9acCtIOXg4VXZFclc3K2ZIWTVDelNwMEJPY0EvWEJyN08rR2Z3TTBENGZhZmlPemhrbXg5OWt5VDcxNlA4QThFcHYrQ2NPbStJdjJldFcrSVhpSFQ3eTIwWFQ0SHUvN1Fqa09acEFwQ1FLblFrc1FNNDQ1TmNqcU9zQ0s0bENuQURISDByOEs0czRtbG1HWVZjTGhKTlFnMG4wVGV1cXM5ZFUwZnMzQWVWNFdoaE9hb2xLcXRXOTdYMVMyM3RxMTVveVBGMFN3L0xDcUlub0JpdWE4TWVGYjc0aStMclhSTlBUZGQza2dqakdlNXJVMTI4YWQyYkorZ3JPOEZhL2RlRWZHK202bFp2NWR4YXpxNkg4UlhuMEkxSVVKZXp0eldkcjkrbHo2SEc4c3FpVDJ1ZlZmaVgvQUlONGZGdnhOL1orMVRYclhYNFg4VFdNUDJtRFRGdC9sbkFHU3UvT2MrbkdLL1B2NEkvc1MrSnZpajhZYkR3L2NXR29XTml0NkxmVWJzMjdGYlJBMkh5ZW1SZzhHdjZndjJGYnZVZGIrSEdoNmhxSHkvMmhacHVCOTFCRmZJZjdlbnd5OEgvc3crSi9IMnBhazF2NGYwMjVSOVFXZUp0aGxMcVdHQjNPN0kvQ3ZObzhZWjVsdkQ5UEhKT3E2MDNUV2l2Q2JWNHRKTFZOWHNuMWoxdWZrR0JsaGN3enVyaGNkWk9HcTVkbWs3TlAwM3Z2YTl6amYyYlBFWGh2OW1qNGQyMmc2SGJnNmY0ZmI3SkpJSk5yTzIzY0pQeDUvRVZ4di9CVDc0aGY4STk4TTd6NHlhWGZUMnNseG9zRUdsUng4elhPcnl5dkFOcmRqSEdQT1BVblo3MTh1Nk40MDE3UlAyZXJHUysxQzRtMVR4UHJZMW1aSGJFbHBaUEhJbHJDZlFzaUdVZ2RwRTc1cjJyNHkrQXZDZjdSSDdGL2h1eDhhZkVDeDhDV21pNnJONUUxeXJuN1U4c0NzRWpZQXFzaEViQU13L2lPTVp6WHh1VjVISEE1bmZHVGRTTTUzbFpOdHlqckoyM2JmdkxUbzNZKzl4bUhVTUQvQUdsZ3J3ay9jYmY4a3RQbHFsYnNmbHY0YXVHMTNYYlcyMUs0YWZTdE9aSmJvdWN4UnhCZzB6NS9oenlNOXlSV044U3ZqSFkrT1AycjljOFphTFlObytrNjE0b3VOVXNySXR1YXl0NWJsbmppSjc3RVlMbjJyMnI5cVA4QTRKMGVNUGhSOEVyUHh4NFN1djhBaExQQTk0TTM5NWF4a1RXckwxOHhBT0lSMkl5TTllMWZKRmxGTWJpSDVXSHpLUjdjaXY2Y3lLdGdNeW96eGVGcUtVZFlXV2xuOXBTVDFUYlMwYVg0bjVSbUZTdmhjUkdsTldsRjN2ZTk3YldhMDBQMDA4UTJLM21rUnlCOHJMR0dCSFJ1Szg3MWpRbTQycXpzM1FBY211VjhOZU12aVg4WXZBOGNQaGRiSFN0TjBLRmJXNHY1NDFkN2laVitZS0dCSHAyNzlhOTMvWlU4QUw0MitBWHhJajhRYWtMcjRnYVhveXphYUpiWDdOYnh1YmhGZDFLRStadGp5MkFGUEhRak5majd3TTh2aStlcEZ0U3M0cDNraytyc3JKVzFldC9tZjBKRFBLVmFDcWV6bnl0SzByS3piYVdsM2ZmclpMUzk3SGozeDQvWm04WGVNdFM4S2VIOUJoc3RVaGpnKzBOYnBxRnVrNXVaaU4yWW1jUGdLRlVFakJ3U090ZmYzN0NmN0hFT3Vmc3VSK0VmaWRldzMxM2ErS2JQVWwvNFJtU0ZaOU9FTzdpNnVnQUpRdUNHVkM1VUhBUEpBay9ZZi9aTThMNjk0bzhLK01yR1BVcnJ4Um9HaVc4RjlQUHBxdEpkckVBak5HWjBrUlN5aHZ1cUdiQUFrWEpyOVJQQVBoaTAxWHczSGRUYWZwbHZwY2thRVFHMWlpSS92Tkp0VWJXQkI0REVFYzRGZkw0cmlURjVwR09VNEdTVXFkM3pPRFRVcnZtZnhQVFZPNld2VmREOHY0dnppT0JxVFVvdThtbnZacXpWbHQ1YVc5YjduZ1BpYjlsdnd6NFAwUFJiR3dpMHRWaXVqcXBPcGFhMTRnV0VaVmhLY0JaQ3ZRc3dPRDBPTVYwWHdXRmw0azhQM1VOdForS05GMGRaQ0RwMTdITW9RTUNYY0tHTFlJNkJ1TWNERmZSVXVyNkQ0WDBpNWt1LzdQRnFxaVB5eEdHWnVPUno5N2pvUFN2RDdyL2dwZDRIMFR4cmVhVEpGcDlyWTZhVldlZWVhS0xPL2hOb0o1ejc0NjE0bUo0Wnl6Q3Vtc1pqbEJ5V3NZeGxONzJmTmFWMUZ2VjNzdkkrRncrYlpwbVZHcENqUmxVYTE1dVpLMnQrMnIxU1c3V3RucXo4bS84QWdxWjRjc24rT0tXL2hQWHZHdmgvd2ZkMnJ2TnFXbVdzdXBRYWZPRHRSSm9ZMEJXTml4QUx5bGxWaUFyQWJUOGxlRFAyZWZFWHc4OFc2aFk2eHJTNno0VGx1RUY1YjNmN3pTOWJpRzExbHdHTFJzbVNmTUtaVWpCR1FRZjZaYlA0ei9EM1hiRlJKQnBDMjk0Z2xsRXNVVWtZQjZiK3BHYzRCcWo0OStBdmczeHRZU3lhZjRaOE93NmxKKy9DVDZkRThkd0NvejIyL01vQUxZSndCNlYraFpYbTBjRmxuczhxeEZPczRxelVVbEp2ZE9ONDM1cmFKTnErOFZkTm5STGlTRXF5V1k0ZWFXeWJrK2l0cnRmenN2WFEvbUQvQUd2UGhEcm43S1B4TzFUd3Q0bHQ1clhVb1oza3RUYUVpSjRtemhsTEtEdFBCQkFHUjdZcngyWlBLZU4vbTI1SG1LdU00Nm42R3Y2V1BqZC93VG8rRi94ZCtFM2gzVlBpM3BNOHNQaENHYlQ0ZzhVYjNNTUxQOG84MWMvS3FnZ05rY0VjQWdHdkJiWDlqRDlpblJ2aDVlZUY5TjhOYTVyZWw2bGN2REpxNWtua0VFN0FsQ1oxSXlWQnlBRzI0SEdlYyszZy9FRERZYkRSZUxweWpPeWIxamRwM3M3SjNXM1ZMVzkya2QyTHhFOHlxWG84MCtYUmNzVzFkYWI3YTZQVG8rclB5UDhBMmZ0Ymp2UEdOblk2VEQ1a1YxRlBISkZjUHVLUmhHYmNXeDJBem4xRmU5ZkFxSm4xNVYzY0ljc0txL3RCZnNRWDM3Q1B4cThUUnhSMzYrRzc2T0cyMEs4bVpaVjFDR1lNN09yaFFPQkhnamcvUFdoK3k3bzdlSnZIbGhwa2N5eG5Vcm1PMzM5bDNzQm45YThmaVRGWWZFMEo0ckRPOEhGTy9YdnI1cTl2Vkg2MXd4Vy9kUm5PMXZMWkpIMDU0bzBqV0l2MmVOU2FIem90UDhVUlMyb0tkSi9JTWJGZm9ESUs3RDluVDRNd3A4TVBDTjAwYStkcGQrV1k0NUc3L0lyejYyL2FEMDMvQUlaQ3U3ZThNelhPbDYrSWJMYXVGQzNHOFNBblBaSUU0OWNWN0greDM4VnJQeHI0RzFEVG9XVjN0d3M4WEhQQjU0L0N2dzNpU25qY0xsejltbW9xYnY4QWR5djgvdU9iTk1jNTFwMUVyU3ZaK2E2UC93QUJjYitoMTNpSDRBd1RhN3FNMGlyaHBQTUpLOG5kelZYUVBoR3VrYS9heTJMTEZPc3lQRzMzTU1yQXFjK29JR0s5eThYZUgzdmZEVmpxeXRpRzVnQWYvZUZlWTNmaU9PeTFhSlFyVHF6N1hXTWJtS25yZ2V2ZjZpdmc0NHJGVTZ5cE9UMFMrN2ROZkk4YkI1cFh4Tkp4dmUxMC9sb3poZGIvQUdlL0RObjhSdFkxcnhGWVQ2aGFQSTdDM0xtTVR5dklmbUJIOEk1L0d2a2o5b3J3MVorRy9HZW9SMnJSL1pZNUNZa1I5K3hlZ1VuQTVHSyt4djJqL0Yyb2FWWmYyWHBxaTkxS1dIN1F1OXdvRE1tNU03aUFBb0lKL0d2RTlIK0VuZ240TmVHMDhkZkd6Vkx1WXpQNTJsYUpZM1lNbXJxT3JNVjVTUGR4dUJHY2NldGZwWEN0ZkZUcU9WZWQxZXlXN2ZucGQyKy95VnpTclVWTERScTFMM2xheVhWTHNucHJ2MDAzMFI4WGZGUFVKSi9ENWJBR1A1VjRqRG91cS9FZnhZdWphTEQ5cXVwSTNrQzd4SDhxS1dibGlCd0FhKzBQaXQrMUQ4QmZqWnF0enBlcS9ET2J3ZnB0dzRXRFdkSDFTNCswV3c5WGlrZVNOaDE2REo5cThiK0hud08wMzRTL3RMYWZxVm40bTB2eFI0SDFLMXVYMC9WcllrYmdNQXhUUi9laW1Da25hYzVISUpyOXl5bkhmVk1OVTlwQnhuR0xsRk5PMG5hOWsrcjhuWitSOHRqTU84Ymk2VkhWUmxKSnU2dWsybGQyYis4OXY4VjI4YWZzT2VFOWFHNHpYdmhTT09WZzR3Q2pHREdQWDVTVDlhOVYvWm04SnQ4RFArQ1NIanJ4RmVOOW5ieDFxa1ZoWXFXQU13aUttUmd1TTQ0eG5QYnB4WEk2cEpaZUp2Q210ZUEyOFAyZGpvbWk2WUxMU2todUpaUHRGcXllZERkYnpodk0zdWpFRUFaT01ZcDM3ZVB4UWJ3OSt6OThKL2hqWjdsZzhQZUdiTysxRWRQOU11VTg2UUgzRzhDdmlzSzRWSFV3cTE1NnJrdTNMTFZmaGYwZGtmVzVoaGNUTDZrcWkrR0NiZjhBZ2szYjcrUmVhMk16OWx2NGIrRXZqRjhKMTBueFpiNnhMWjNldnkzRVowNW9sbFl3MmpZWGRJNktBV2tYZ0hKT0FNbXZxTzkwanc3NEEvWWUxYnc1ZVdkdnFVMHU2SFRyRDdYSjV0akF6TVlaa00wWmtFbTVzK1dQbDdCdm1yNSsvd0NDYU45cGEvRVQ0ZTZmZWFXZFcxRFM3dTUxK0paYnZ5YlczRWtzTnVqdWdSbWtmZEdkaWpDOVN4QUJJOW4vQU9DMlg3UWx0YitCSUxkYmZiTnJzdVF1bGhMSFZMS0tQRENPVjJMQVJzZGpaK1VrRmVCakZWaU12cTFaeGhHZnhWSGFMWG0wNUozU1ZrdFBONmJYUEF4R001Y2ZibDBqYVRhZjhxdmJhL3p1dHJkVDR4MGo0N2VMdmc3RnIyaDZYcUZ4WTIrcVJ2cDJvd1krU1pBMkNyS2ZRamp1Q0s1Q1J2dHpSVE1NeUtjayt0VlovRjF2OFJZN2JYSUpQTUdzUXBjeS9NR0t6RWZ2QVQ2aDkzNTFkME8zRjNmTEgvRFhzeXBxbEcwbGFTMzlldjQzUHU0MWxVWHRJYXFWbmZ2Mlo2RjhPZkNzV3JYa2NyUnIrVmZSZnd2OForS1BoZHBGNjNoTytYVHIxb2hLbThoWTNhTUZoblBBYjcyRDcxNXQ4SHZDeTJjRWVWM2NaRmUrL0JUdzNEcW5qalRZcmlOWkxkcGdzaXVQbFlIZzUvT3Z5dk84NWxUcjg4SDhPdjNIcTE2Rk5ZR3A3WlhUVHZwZit0VG9mMklvZkR2N1NueFo4UWVNcnFkVzhXVFc4VW90L04yeHVKZVJoZHdIbUpJdUNBQ0d3cDRPYXd2amQ4RGJYUWZpanFseDRodXBMVzhzUE0xblI3aTVrOHY3VEpHcnd5cWNuUHp4eVRFZHl5cFhqWGc3NFQrSVAyZlBpcW12YWJOSWphYmU3MWREKzZaUXg2ajhhKzRQSFdtYVA4U3ZDV2srTFBFWGdtUHhCYlIycGwreWFXRTFDK2xZbmNVQ094d01saVR4alBiQnJvcVlxbEhFUXFZV1RsdFpxNzBkbForbDk3cmV4K2FZZkhTdzFXVXEvd0RDbXJOSzEwNDJhdGQ5V3Y2MFB6ZC9aSThPeFRmR1RVZFN2bW11SXRCMUMwMUdLMWovQUxzTXczWno2akF6MnptdkJmOEFncFRiNm44Yi9nUDRxaTBteHU1dFUwcThzL0VkN0FrUmxra3NtTnhITk54eUJHL2tFbnBoK1Q2K1kvOEFCVmo5cDZPeS9iWHV0VytIc2krSGZEdWl6UXhmOEkvYnl2QWJXNmlVQ1ZaUm5MZ3NNNXlWUG9EWGpmanZ4VjhTUDJzMXMvRldpM0VOeHErbTI4dHJMcE9sWFpTKzhtTEVoa1czenZrWEQ4N2R4K1VuQUFyK2lPR3VDOFdzVGhjM3ExSXhnN1MxVFhLMGxhTFdsN3BiOUw5VEhpcnhBd0dNeS9HWU9FSiswbHlwSzYrSFhtZDAydDN0MXQyUEJQQ25oYWZ4WjRwc05NandqM3R5bHZ2YjdxYmpnayttT3Y0VitnZjdGVS9oM3hoK3lwKzBCNEgwNjR1bzlMK0d0NXAzalhRcmtqTFhWMGl5V3N1OVNTb0RueVRnRCtINlY0TCt4VCt6bnB2N1J2eFB2SnROdVA3QnRmRHVuR2ZVN0xVZFJFTEZ6SDVSYU9jcGhXZVFzUXBUSzVBK2JHYStsdjJiYm5WUDJaZitDWlB4czhjNmY0T2xqOElmRVMrdC9DZWx5M3FJTDZTVDU1SjdsSlNnYWFOTmlLTnVFREU0NXpqN2JqTEhSeGFsZ3FWL2FSZE95MFZwU21ucnZyeXArWEs1TzUrZThJNEw2cjdQR1hTVG52MWNZcFhVZm03dnJvbFkrQy9pNzRYdDIweTMxcTNtRFNTTUlaMDlEamdqOGpYM1Y0RCtNOXVQMkhQaDlZUTNJbXVMUFRzU3FINWpJWWpINlY4SWZFSzBXZnduYTNObmNOSmJ5VE9HamJBSVpjWnlNNTQzZC9XdlhmaFpxZDFCK3ozbzhtUDNZYWFOZm9ITlZ4WmxNY2JnY01xcnY3T3BkZjhBZ01sWm5vWmRta2NObldKcVllT2xTbXIyMVRkNDNhL1h6dWZaWHhvLzRLY2VQdkh2N0R2aFR3WG90azFuNGU4THZEWjZyZndSQU5jM0tQTTBLU09Ca3FJM0JDbnVwTkZlRWZzaWFwNHcrTHZoVHhkOEhmQXZoM1M5WThTZU5wN1hVNFpMMllxWWxzaTd1STFMQk41VjJKSjUyaGhSWHpkUEM0RENTbFF4VHB4cy9kNTVhOHJTZlcraWQwcmFXUjlmbGZFMEtlR2pHRGNlL0xhemZWdmJWOVQ0b3Z0WXVmRmZpZTQxQzZienJpK3VHbG1kdWR6TVNTYSs3UDJSOVJid1I0TnM3elQ3bU9lUzFYZE1zTjBzZ0NxVkxiN2QrcWhXWUFBOHNmYXZnR0hjSEcydDdUTlkxQ3lHWXIyNmhYSEJXUWpQT2EvU09Kc2dXWjRWWVZTVVlycGE2dDJ0ZEg1VndieEgvWjJJbmlKd2M1UzYzdDg5ajYwL2JkL2FDOEkvSDdWcnVhMzhCMm5oZlhJZFN6SmUyenVrTjNIREFzV3dSc05vSVpDV0k3MTg4K00vRkZwcjgyajI5dmFwRE5FNkFpSmo1Ykx4empzeFBKcmw5VzhSNmxyTm5EYjNWOWN6UVc3TzBTTzVZSVhPV0k5eWVUVVdpU1RXMnJXc2tSTHlSdU5tZlh0V1dVOFAwc3Z3MGFOTnUwTDJ1MjdhVzNiZW5sc3VtaDNabG5rOFhXazFHM05hN3NyNk8vVDgrdTcxUDNsL1pOK0tkOW8vL0JDUHhkYXE3ckpjNjNaYWJaQ1BLc3hlZEN3QjdncUdIME5mSFd1WFUxaHFVdHZPclF6d3NWZFQxVWp0WDZYL0FQQk8zNEV0cmY4QXdTMStHOXY0MHNUb3VrdzZsY2VKZFFaazJ4L1o3YUIzQlluZ1pHV0dmU3Z6UitMdmp1MCtKWHhKMXp4Qll3cmEyV3JYczExYXhMMGppWnlVSDRMaXY1d3dyblV4dGVQSjdpbEwzdWwzSnlTWGZTVjc3YW43bHduaktYTFdvUStQbTVuOXloOTdjSHAwTXU3dk55L04xckxtMUJZSlZia0ZUdXFHNnY4QUE2KzlZZXNhbnQ0eWEraHcrR3U3SHNZMnJiM2orZy8vQUlKYi9HSC9BSVQ3OWxyd3pPc3pOY1djRVN2NzdSZzE1aC93Y0cvczBmOEFDNmRKK0hPc05GTkpwazE1OWcxTHkyMnFrUDhBcmk3ZlNOSmE4by80SUMvRWk0MW40V2FsWVNUNzQ5UHVOb2pKKzZEWDZUZnRCK0Q5TStMZjdMZXRXZXIyUDlvV3RuYlBQSkFIS002b0NXQVpmbUJLYmhrYzROZVZ3NUtxOHZ6REs0UDM2TjZrUFdtMjlQUGxkajhQenoyZVc4U3h4TnJ3bTdTWGxVV3ZiWnMvQWo0bVg4bXY2NWNYTU1aaXNiaTREUXhBbkNSeHA1Y1Mvd0RBWThDdWkrUEhoSmZpdC93VFUrS09uaUx6Yjd3N0JZYTlaS1B2SzBWM0hGSVI3ZVJOTWZ3RmZWbmhQNHEvc2QrTjIxSFJXMExXZEx1TFdSbmdKdlpFM0xnOGJuWXFBTUE0TmRWOEsvQ0h3SDFRYTFhK0UvR0V1aWFsSlp6Mk1sbnIxbkJxdG82VFFzQTBrYW5EUnFXREVFSGtDdm1zSGlIUnhtSHF1U2k2Y2xMVzhkRTliOHlTMVdtNSt1WnRuV0d4V1Yxc0VxTlNOMGtyeFRWMVpyNEhKN3EyMmgrYWYvQkQ2MCtJbHorMFZwV2h6MmZpYldQaG40eGd1ZEExYUhiSk5ZTERKR1ZZa1oycVZabFBZODE5bnQvd1FPOEMrSWZpRHFmaWI0b2ZFTHd4NGYxUzd1Vm1tMDJ4a1JJNG0rVUFNRkFYTEFFc1FCa3NUZ1ZkL2JIK0UycmZzcS9BaytOUDJiUERlaDNtdDYwSEhpYnhINE9BbGgwL3lrQUppalpYYUlTWkRPb0FVYkJnakpyOHBkWS9hVytJZXNlTWJXUzgxaldyclZtdTNOekRjU3R0ZHlUL0FBOGRja0d2ME9wUXgrWTRxcGpNRTQwazlIWnRPU3RlN1VXdGVuTmRlYVB6S243S01GVHFUYVN0OWxTa21tMTlyYlI3V2JlbTFqOU5QalQreXo0SCtCL3hPajhCK0M3dTNYd3k4a09icUs2RTZ2SklnYVI5N1lITGRpZU9sZlluN0xuN0dIZ1BWZkFFc1RhYkcycDJObkxGOXNhTllRWkhZS3pPZ0xGV0FCR1F4eUNmYXZqTDluTDlpR1h4cjRlOE8rTXZpVjR1MVhTVDRnOHRyWFM3YU4vczBBQVVyQ3VHUFFZR1c1Sk5mcGo4SGRQOE4vREQ0YjZoTlp0Q0liR3c4eWU1bjNQSjVReWZ2TVNjRGpHNzByOFJ6R2RPcG1Qc1hXVlJlKzVyVzErV1MzZnZPM2UzUzk5VDZmaUxpTEV4eXlqaHNOenhjRkZLWDh6V2pidHA4azJ0YkhOcnJuaGY5bEx3ZGRheDR1aDArMnRmQ3RvMGtGemJzY1hFUTZCUU9HWW5ING12elIvYVcvNEwyZUwvQUlnK010UWowdHJHejhMeE5KYkxZeGtNczhENVVzeFBQbWoySEdmeHI1ai9BT0NwUC9CUVRYUDJwZmpScUVOcnFGMWErR2RMZDdPMHRZWjJFVXlLY2J5TTQ1eG5waXZqdGRja3Ryaks4TVRuSnI5SzRJOE4xREFjMk8rM3J5YldUMjVtcmN6UzZ2YjExUG1hMktwNFN0N1NwRlZLdldUMVVlNmluZGI2dDk5dEQ3WTFUL2dvbDhSdkdYZ2ZUZkQrbjZucldvM2Vsa3VrMExPWkRHQ1dYZU9kMjBuR1Qyd0s4a3NQamJyM3hOMThhTHJXb1F4M3pxVWdlNFR5UXNnSllGbS92NTRCSTZtdkdORjhkYWxvc3J5V3Q3YzJqU3JzY3hTRmQ2bnNjZHFxM3VweVg5LzUyOCtid2R4UEpQclgzbUQ0UndlR2NsUnB4amZWTkxXNzF2Nlg2STBxY1QxM0dOcFB6V3lhK1hYelo5ci9BTEUzN1RuanI0SmVMTlAxSzQ4VHlRMmVuSThjN1M2bkhjK2ZDNURHTXh1K1craW5JSTljQ3YxYjhBZnR6NmhyZXQ2REhwTjNKck51WTBUVWRMdW9sM0xGS0NZN21DWHFGejhwQkhmcU1WL08ybXBTZmY1Mi9lWmM4SDFyNjIvWlArTWx4cWxwYVF5eVhsNXFIMkw3TnA5eGF5Q0c0dFpJM1lyRnY3Z3J3RDZzQnpYNTV4eHdYSzd6TEN6VUoyYWZLckxYcTFmVzJyMWZvdWo5L0o2bUJ6YTJFeGNMeVMwYjFmYXowVHNyNlcxdWYwZWVFUEZWbjhVUGgzYjNZUzR0NFpvV0RReUFHU0JsR0NDT2M0cjR2L2JTK0I5NXBGMlBHV2cvRHp3eDRxV0daZDBzZCsraVh6c3ZDTXMzekt4d1NvVXFBZlhzYm4vQk03NC8zZmlUd2k2WCtvdGZtRmxodml4S0FrOUhZQS9Ld0hCSHFNOXhYMFY4VWJhdzhPVE5hcGRRV21sNjhHaGpWMEVnV1JnRHVVbks4QU1TR3puOEsvT01mblU4Wmg0VjZxWHRLRGNLbXJWOVBkZHJxOEhibzAwMmxzZkdRd2RiSTgybmg2YmRtN3ExOXQycnJXNlczVHF6OFRQK0NyM3hMOGVmdEcrQWZCdDNaNmhmYWY0VDhOWDF4WXphSmUyTWNPb2FiZGs1SW1tWGlTTmxVN0dRQlNBYThLK0JYeE0xcjRPZUpkRDFpUzFzOVN0OUx2bHZibEZaaE5KR0NDVUI2ZkxqampKcjlqUDJndjJZdkMrdGZDYlhMZTcxTFQ0clg3S1VhOW1pTXVubHlwSG1LRmJFVHF4ejA2R3Z6UDhBQW53Tmo4Sy9IaTVzMXVvOVlzckszdk5Rc0pvRnhCZUNDMmttQk9mNE1vQVFQcHhYMWZEZkZWS3JsVHdXSnBwS2twTksyOGRkT2EyNjJUZXRyUFhjL1VNbG9ZV3RHcFh3cmt0NzdwZDl0dGV0dXIxMWJPVitJUHhJYTAvWkc4TXEyRVhWL0ZONWNSOFlNa2NVTVl6OU15L2dhOVEvNEp6L0FCUm1oK0owZHZIY3NqWEZuSXFnOUhJR2Y2R3ZEdjhBZ28vcTgzZ3pVL2hqNFRaaTBlbTZKSmVGbFFJcGtubEFZQURqQU1QR094RlluN0gvQU1SNS9CbnhrOE4zU3N6SkRkcWpybnFyL0lSK1RHdmJ4bVNSeC9EYzZzVi9FOXBKZitCUzVmd3NlSFV6QjA4NG5RbnRlS2YzSzUrc2x2OEF0ZlROK3p0ZE5OR3JTNkhldGJ6Z0hvYzQvd0RacStZUGlMKzF4ZStJQzYyckcxRzdoNHpoaDcxYnNyaWJWdkhQeFE4RnJHMGJhbGJMcXRzSE9OcEtnbkgvQUFJajhxK1U1UEU4a3M3UmhqdnpnajNyODM0ZTRYdzFhck9yVWpkcmxhdjBqS0thWHlkMGUzVXFVc0VtcVViY3pkL1ZPei9yelBwMzRnL0ZPYjRyZjhJSHBOOXJna20xYTRpc0gxQzNVdExLdTlVVU9EakRJSDJFbnFGQit2aDMvQlJQeFJjWEg3UVhpYlQvQUxYTmRXK2szYmFkYkZ6d2tVT0kxQUhRRENqZ1Y2bit6WDhMTFA0MGFOcCtvUi9hRzFEd2pkdHFlcHgyanJIS2JhS01zc3FidU03bFJXSUhmSjU1cmdQMml2Qi8vQ2QvRi94SHFNbHJKRXQ5ZXlUN0pPV0c0N3VTTy9OZldaTkxDWVBHOG5XS2xmUkw3U3MxNnIrbGM0cTFERVl1RGt2aFZrdks2dmJ5KzVmTStRZkZHcnNsaXc2bkZkVCt4UXVwZUovaXl2aHExVXpmOEpBVmlqaWMvTDVnUERmVUF0ejZFMTEvaVA0RzI1a1krVnVBOVIwcjBML2duMzhIcmVMOW9Uekw3U2JHNDBvV3NpWFYxZXlTeFJhWkNTUE11TjBiS2NvbTRqbkhQdml2MG5HWnpoWjVaV2hEZHJTL2ZwK0o4N1F5dkUwOGZUcXAvQzcvQUNTdS93QUQ2ZDhRYW5ZZkJqOW9Ud3REcUZ1eU0zaHpTMDFHTEFPNHRiSms4Y0VjRHAxQU5lVGY4RkIvRXVuK0tmMmgvRUZ6cHR2OW5zWkhWTGRNNTNJRVVLdzlpTUhIWVY2WCswUHBsbjhhdmpGZGE5NFJ0N2R2RDJ5UFR0Smp0K2h0b0FJb2M5OTJ4Vno3MTRSOGI5THU3enh5clhFVExKQXFRT092M0FGUDhxL0tzcHAwWVkrTW95dTFGcCtxZW5uM1AxdFlXY3NKVHIxbGFYSWxieWRuOTZ0WTk4LzRKYi9EUys4Si9FbngzOFNOUW50VVg0YitEaFoydGhNTXl0TGNrU0JzSGxSaGlOdzY3c0R2ajVtL2IyL2F6dVBpSjhESkxQeFI5aHQvRjJxWEgyelVGZ1V5M0Y2UzBraXh5WUlFRUVDR01CQW84eVJuSlB5VjkrL0N2NFRhaHFmd0krTTE1WnczMGVtK0p2QTJtYWhhWEtxUkhLOXM4eXl4cXk4N2xVSjEvdmREWDRZL0YvNGwzVjVEcW1uTkpLelRYWHorYTNtT2dVRUhCUFFIZ1kvMmEvUXVDOEpQTk1aSEVWRmJsalRkcmJPOHI2L0s3MDZMWHFmaVhFbU1oaGZiMmZ2T2NvL0pLTHQ5N2EvNFk3ajlrVDR0cEdseDRkdW1Dc3JtNXRlZnZBL2ZYOE1BajhhK21QQjZOUHJFTWlyOHJNTTErYzNoN1ZMN1F0ZHRiNnlaa250WkE2N2YxL01WK2wvaC9SSS9oOUpwczE1ZFc3V09xYVRaYXhhM0RzRVZvcm0zam5VZjd5NzlwOTFOZTM0aFpiVHcxWlY2VzlWUFR6VnIvbW45NTdYaHJuVHhkQjRLczlhZHJQOEF1dmI3dHZTeDlBK0NydU95amhJNHlvNHIwWHdkOFJJOUMxRlp2TTIrUXJTTWZRQUUxOG8zL3dDMVA0VTBlUlkvN2ZzV2tqNEt4dnV4K1ZhWGdMOXJUd2ZyUGlPMHM1dGN0RisxU2lFbVVrTHRiNVRuMjVyOEN4bkNlTnJSZFNWS1Z2OEFDLzhBSS9VTVpubUFjSFE5ckMrM3hMZjd6ZThaZjhGQkZiNGZhbEJkUnhlZE1qWWJQUTE1SCt6NS93QUZNL0ZHak5ONFZ0Wm9ZN0hVTXhYQURQQ1dqVnc2bFdRZ21RRTU1SUJBSU9jaXZsWDlwcnhEZWZEenh6cS9oMjZrVHpMQzRhUE1jZ2RTTzNJOXE1SDRDZkd1KzhFZU8yVFRiZXp1N3JXSXhaSTF3aGI3T3p1dUhYQkhJNkVISUlKQkZmdVdVZUd1WHd5NnBWcFUxTG5YTXRiTGJSMzlIYy9BS1BFbGVPWVJvMUhaWHRMUyt6N2Q3cjVIVmY4QUJXK3dXeitNM2gvVUxYeEZKNHEwbnhKcEoxU3p2NXRMYXptVU5QTEU4RHV4THlzanhNQ1hPUVNRQW93SytZdEU4V1huaGJVdFAxTFRibTRzOVIwNjQrMFFUUnNWYUp3UVFWeDBPUlgxZG9YL0FBVDE4ZGZIMzRrYWszaTd4REJva0l2SnBFakN0Y0ZTN0hPeE1oVUJ3T005cStkdjJrL2diZGZzNWZHRFZmQ041ZXhhaEpwcktVdUVqTVlsUmxEQTdUbkhCNlpOZnJmQ2VhWmI3Q0dTMHE4YXRXbkM3c3RIRzl0MGxGN3BPMjcxc2VCeFJ3L20yRzVzMXhGQjA2VlNWb3R0WHZ1dEwzVjdOcTZKTlgrTjJwZU41NGJ5N2I3TjRrdDQyVnRXdEhhM3VOUlE1Slc0S25EdmdrQi92SGdObnJYdW43UWZ4aTA3OXAvd0g4TGRLOEVhcDRsMGl6OEZlRTdiUnIrd3Y3amRBMTlHOHpTVElGd01QNWdPNGpjZTlmSnR1eXd6bzVHNEsyU1BXdXMrRDN4QWJ3TjR2dG1tWm0wK1NRTE5IbmhRZU4zNFY3ZVk1WEhrVmJEcjM2ZDNGYVcydGF6L0FBMnQwUE40ZXpPa3NUR2xqdjRjdEc3dE5YdGFWMDExM2V1aDFYakh3UnFIaFc5czlIMXlLM0dxVFJMZUM4UU1ESkJJTUlwQkFCNkU1R2Z2ZGExZkNmeFF0L0IzZ2xmQ3Q5R3l5V3Nza2tNblZaVmRzakZmWk1meGYrSjN4MThmK0dmaDM0VitGT2ovQUJVOEo2ZnBGaFptMlhSMTNITnVKSHplSW9lTmdXUE8vZ3JpbS90VC93REJFenhaNGY4QWhGL3d0RFFmQitvV3RsY0pOY3orSEx2eERiTGNlSC9LRE5KSC9FOHgrVmp0NFlZQVBOZm45TGlyRHo5bmg4NGlxZlBhVVdweGF2MDVydE9EczNvMXk5Rks5a2ZkWTdLdll6bkxCVFRsRnVQdlh1NCtXamNucHVydS9TMXo1RytEZng2MXI0SGZGdlQvQUJUNGN1NWJQVTdFU3JGTEdkckFTUlBHM1B1ckdpbC9ZMCtDdXZmdFQvSEN4OEYrSGREdjlVMXk2anVKQlp3SnVrQWlqWjNKNll4am5ORmQyZlVjcWhpRkhHMGxLU1MxYXZwcmI5VHhjdmpLdFM5cEdwRkp2cTdkdTU0VFlRbWFUanRXc3FlWDhwQlZ1LzhBRFZIVEUvZDhoc0UrbFhsK1pldnlnNDRPZWV2U3YwYXJLN1BsOHZwcU5QemY5ZjB4bU5yNWI5YTdYOW5Yd0pOOFJ2akY0ZjBpRmQwbDlmd3dBSHR1Y0N1S21sQVE3ZTNmMXI3TC93Q0NGbndsdC9pdCszLzREdGJyZDVNTjZzNUl4L0FRZnhyd09KTXdlQ3lxdmlsdkdMYTliYWZpZTlrMUdGWEhRaEw0VTd2MFdyL0JIN1FmdFMvdFQrRGZDbmczeHQreWpybDlOcFAyYjRaVzJwV2Q1RktBZ3VJWW1tZUEralNKRmpCNGJPT3ByOGYvQUF4cjFyclBobTF1TFBkOWxrWDkxdTY0N1Y5aGY4Rit0UjhVZnNLZnR5V254R3NMN3czcnNIeEVqa1M0c3A5S1dSb2JhRVJvTGVXUmw1VmgwdzJSaHUxZklldmZFN1RQaXJjZjI5cEdpV3ZoMjAxSlJJZFB0eis1Z2IrSUwyeG4wcjhPd09BcVF3VktwRk4wMnJKODE3T0xrcFJhc251M2JWcXl0dFkvWk9DcFU3U2xDU2JtbEtTU3RkdExXNzlOZlBVejlVdTJCYkgwckYxQ1hjaDUzSCtWV05UdXR2UFFWaFhPcFpseDJyMjhOUjAwUHBzZXo5RC9BUGdnQjhYWWZEWHgxMWZ3M2RYSGxycTBLeVJLeDRMS2VmNWl2M2c4QVJSM09rM0ZsSmlTTzRqSUlQY0VZTmZ5NGZzVC9GMXZneiswUjRaOFFKSUZGdGRLc2hKd05yY0hOZjA2L0FmeFhENHY4SDZYcWtMS3kzVUN2bGVoQkdhOGpKSUxDY1U4eldsUkorcXR5eVgzV2Z6UHgzeEt3VW5ScFlxTzF1VitxMVg0UDhEK2ZQOEE0S08vczgvOEtHL2FaOGNhUEhtR08zMUdVeEFEQU1NbUpFSDAyc0IrRmZLOHZpbldQQitxQzcwL1VMeTF1SVc4eU9TR1Fxd2JwWDYzZjhISi93QU8wOFAvQUJVOEgrSXJlM1ZVOFJhZkxiVE9COStTRmdSbjMyditRcjhsZkUwSWt0WFlub09hMHdlR2VHclZNSFY5NVFsS1BmUk95KzlIcVVjeGVLd2xIRlFkbTRwdjEyZjRvMlBoei93VWErSy93TDhVNmRkYVg0cTFaTEt4dUdtYTA4NzkxTHZLbDhnakdUdEhOZnA5NEsrRjNnWC9BSUtsYUI0VStJbDE0SnN2RC9qSjJGMCtvV2tTMjZhb3BKODBTRDdyc0N2REhCSFBQTmZqTi9ZVCtJZkVzTnFxN2pKSU1mblg3Vy9zVmZIUFQvQ0h3NjhIK0ZMclJMZlVMSFM3T0xUdUpQM2NEQVl3ZHVDT1NEdTZlOWZLK0prb1pkaHFGYkx2M1ZSdDh6am9uRHJkTGZmZXplNTJaYmc4VG1GR3RVY2ZhY3V6ZTZ1dTdhdXRObS9OYW8rNlBoZDRQdGZEV2dRNlJwOGRwYVd0c3NjVFd3MlR1U3VQM2pTS1FlbkFCSGF2ay84QTRMMC90VTZUK3lsK3laZGVHZkRkOVk2WDRsOFlTQVBIQmhYTU80RjhLYzllbm9PYTk5OEUrT2JxK20xQzYwMno4blI0ZHd1V2puVzRaSFVCUUNydGxjWXh5QngzcjhGUCtDMlA3UlRmSFQ5dGpYa2lrbWF6MEVycDhRYzlOZytiMjVZbnBYeGZobmhJNXptRU1QVXAzakZjemsxMGkxb2swcmN6ZG5vdExxM1UrYnFZV3JoYXp4VlIvRGJUKzg5cjJ2ckhkYXZaSHk1cUhpSnRXdVpacEpDMGpaSnpWQTNRRXZROFZUaWtELzczU3BIbjhwT1JuUHIycitzbzBZeFZrZU5VclNtK2FScDI5NHM2aGZsR2ZUdFRtWXcveFZsV2x4dG43ZGZ5cTljemdLdjk3M3JPVk96c1pjMmx5d3Q3SUhHMXVhOUMrR0h4RzFYd0diTyswNldHRm9icFhWcEZWaHZVZ2djOVAvcjE1akUyR0djMXVlR2RVUzNuOHViUGx5WUp4MklyaHpEQ3dxMG5DYVRYVmR6dXkzRlRvMWxPTXJQdjJQMmcvWUQvQUdoSDhGZUd0TTFPOGtodC9FR3FScDUrNkdOLzdVaFk0RXd3TXF3eHRKSFhiOUsvUjM0VytLOUorTFdnWFdqNjU5bHZOUXN5R3prb3Nvd0NDdUNEMy9oNC9XdndLL1luK0wvOWhmWmRKdmtrdUlZWnQ5aGZvZWJQY1FOdis2YzhqdjhBVVYrcC93QUYvaTFCcVBpKzNodGRNZGRYdFhqdDJtaW1WeXlFREM3V0lHYzl2VFBOZng3eFRnYStTWnhLb28rMHB5NXJ4ZHVWcHRXMGZhL3FtcmJXUDAvUDhucDVyZ29ZNmpkVHRySld1bXJXdTlIYmZ1ZXhmdERmQ1RSZFErSEd2NlN0anBla3hheGJ5TkxGSEFDODdrSDk2dTVSODRQR0FlbVNLL09MNEhmQXU4OEJhMTRrbTFTL3VMUzEwR1A3QllNOXM4cXVieVpJRlVZK1pUSXNoWEdNQWdrOEExK2dmeFQrTFZ2QjROMU8zMXJXN2pSYnUvM3d0Yk9nTVVqQlI4Z2RjbFR3T25kdXRlRFJmR0ErRFBnUDRxOFpTTHBzbHJHMFMyOXRjVEYydDBpeEl6RndyYjVGTzEwWE9kNEhTdkp5L05LdnRKVTZDOXlxNHEybDA3MnNsM2F2ZFdTMTc3M3c1TEY0ZkxxdlBkdHRKTjMzZGs3TnJYUlBXN1NzdGRrZm5mOEE4RnRmRHA4TmFyOFBMczIvazNFVnhxbW11clJsSFZZdnNiSXBCd2Nmdkg0UHZYeXo4T3ZHc3RoZDIxekd4V1NCMWtCejNISXJwLzJ5dmoxNHkrS0wzZWcrTnRYdGRZdVBEK3J5M09uWEhsN1o1WUp4MzJqYmdoVWJKK2JKNzE1UDRObk1XMys3WDlYY01aTFBDNUJSd2VJYWs0ODJxMVRVcE9TM1M2TmRENFRPTVlxbWJ6clF1cnRhUFJwcFdkL21tZnBSY2ZIK3p2dFY4Ri9HU3pqbnVOTGdzdjdJOFNKRU12QTJPU3c5QXhINFlyemI0bWZDYTY4TTY5RnIxb1licnc1NGttZTYwK2VJN2dGY2xsUStod2YwcnpyOWlMNDF3K0IvRW1vZUV0Yk1VbmhieGdCYlhTeWc3WVpHK1VQN2RjSDZnOXErdC9oMzhMN1R3NTRiMUQ0VGVJYnJiL3BJdWZET29TcWZMbkRFbFZ6anFDU0RuMVB0WDVIbWxGWkRpblRpdEVsYnJ6VXJ0NmYzcVVwYTk0YTJQMEhDenA0N0RxbzkrdmxOV3Y4QTl1eVd2azBYUDJDWnRKMHY0dGVIb3RWaFcwdEpyajdIZlhTT1VXNHM1OFJ6UnpEdXUxaVF3NUJBN0FZKzhQMmpmK0NZUGhQWFBDMm82ajRSdXBwcnl6dEJKRmFncEkwbzZoczRCYkl6eVNlbGZDZmhmNFo2bjhOUEdyYVhmV29hNmhJMnFEbFpsUFJsUHY4QW5YMkY4Qy9qSnJuZ3E3MFMrdFo3enk3VS9ZcnFLVE82SkNjcUNUMVhIUTljcWErTngrZllXblVjcXRQbmpLejUwM3pSVm5ySG85NzJlanRiUW5OTUJqcWFwNG5McTNLMXZGNnhuMVYrM1ZYMzEwUGpMV3YyWmRVMXpXbzlOc2JPU2U2bGw4cEkwUTdpMmNZeDY1NHJ2ZkdOdlpmc3IvRFM4OENXV2wyc3V2YWs2Mi9pYTV1RlhiY0ZnR0ZpbmRWWDd4WVlMTjN3b3I3aitLZWthUjhHZkVXb2VNb1pGdVBFM2lWUmRhZEFVeC9aaXlETHlrZjN1U0Z5QmprK2xmSlh4eThGYVQ0NzBtOHU5WWtTR2JtUTNyc0ZNWjlXWThFYzkrS3hyWnhMQ1ZJNFBGU3ZKdlhsNko3WDF2elMzc3RZcTI3YlM2c3Z4MUxNcExGUXAyZ2t0K3N1dlQ0WTlHOTVhMnNybnpGK3l4OFN0TC9abS9hTHQxMXhkV2g4RjZoNXNvaFZSTDlrbDhweXVjNUxESUlPT3ZCUFExOGNmdEdmdFY2MWNmSHZWOVY4TzZ2cWphYjlzWXdXOTRnMkZReEdER2M0QkhicUsrM3Yya3ZDbWphQ25odlFiR0dHU2FQU2pmM0dzUGlTR1JpbzNMSEtHSmJnNFBHQnpqSUJOZm1YOFJESnJQaWErdkdqMmZhWm1rS2pzU1NUWDdQd0RnOEhqY1JQSDFxZDVPS2k3MmFhdTdPMnVyUzllKzU4WHhsajYrRnBRK3AxV2s1YVdiMFMxdDAwVGsvSnByc2Z0Ri93VDUrS2w1ckh3UzhZZUpkZXVOZXVORHMvQ1l1TExTdE92NW92c2x4aVpaazJyaUtSWEppSVdYZG5EWUdBYy9pRDhlSTB2ZmlqclUwY1p0MWt2SkdFVEg1bzhzZUQ5Sy9Yai9na0Y0eHV0YS80SjQvRTN6dFFOcUxTemhzZ0hJSW1DM1VlN2pHY2xKRVRKNkFqSGV2eXUvYWkwWDdQOFd0Y3VCSHNXNHU1SlF1TVlCSnIzdUJHOExtbGZCeXQ3dDByWDBpcHRKYStqZnEyOTJ6aTRtd2YxN0pubXF2ZjJrYi9BRHBSbGZzdFc5dC9rZlZYN01YN04zd3IvWkIrQlhoSDRyZkZXMTBMNGdheDQ0dTR2K0ViOExuVUN0cWxxcEgyaTZ1M2p5UGxMS29qUFE3c2drWUhKLzhBQlh2NDIrQXZIWHhWOEw2RjhPN1hRdFAwZnd0cHoyVXNHaCtZMm5oek04Z0VVcm5mS2dEQUFzQmc1QUFHQlh4bE5yTi9xdHphNmJidGNUdVc4cTNoM2s0TEhvbzdaUHBYYWZ0US9CSHhMK3p4NHAwN1MvRUduM0duWGk2Ylp5M0VFeStYTGJ5eTI4Y3BqZENjaGdYSU9SMUJyN0hEOFBLR1p3eG1NcnVkV1hQeXA2SkxaSlJ1MHJKMmJXcmJiUGhvNDYrQ3FVNkZPMFZ5cHY4QUhXMit2VjdHUnEvalRUN0MzdGZzQ1hVVXlSNHVmTllNclNlcVk2RDYxbWFoOFh6RXRzOXZHME4xQVN6eStabnpEbmpBN1Z6T3Iydms2UkRmRzl0WGE0a2FQN09ySHpZOGZ4RVl4Zy9Xc2VWTGR0S2VmN1VxM0t1RlczMm5jdzljOU1malgyVkRLNkRTY2szcjUvMWIxMFBCcllxcmQyc3RPbHZ3OC94TzkvYVkrTDl2OFhQRzl2cmxubzhPZ3RkV01DM1VFVXp5ck5PaUJKSnNzU2N5TXBjak9BV09NRGl0SDloWHhYcGZncjlxYndicnV1Vy8yclNkSjFhMmx1bzNVTkdVTXFLZCtlaTRKNUhJSUZjVDR6WHczY2ZEbncxZGFiZWFsSnJ4OCtMV0xlZUJGdDRDSC9jbUZ3eExCa09XM0FZSTR5T2E5dy80SjQrQWJqeDc4TXZqMnRycDBHb1hVSGcyUDdPSFFOSWtwMUswS0dQL0FHOXdIVG5hR3JITXZZWVhLSndjYlEwZzA5TEtVbEI2dm9rNytoNk9XMGEyS3pPUEk3emFjbGJXN1VYTDcyMTYzUDBzK052dzlUd2o4ZXZFY2VudC9vc2VvU05BMzk2TW5LLytPa1Y4Qi84QUJaMzRZeWFWOFIvQ1BqR0dPTllOZTAwMk01VWRiaUJpZWZxa2lmWGFhK3MvMjV2MjF0SCtESGl6d3hhV1A5bStJdkVXdGFicDBPcXF0OHNOdm90NjF0Q0pJcmh6OTFneEpPQWR2ZkI0cjVIL0FHcWYyajQvMnlQZ24vWlYvZGVFTkYxYnd0cUZ4Zld1MjV1NUd2b280Y01xSDdQNWY3M2VObTVsT1ltREJlTS9oL0FXUzV2Z2M0b1krVkpxajcwRzdxL0swMG5iZTEwbmRyYlZIN3B4MXhCbFdaOE9mVUkxYjRoUmhLMW44U1N1cjJ0ZXphM1BrcjRhZUZ2K0U3K0lPaTZLWDh0ZFV2WXJablBBVU80QlA0QTFuK0pMU0hUZGV2cmUxbEUwRnZjU1J4U0QrTlF4QVA0am1qUTlkdS9ER3RXdW9XTXpXMTVaeUNXR1ZEODBiRG9SVU9wVzRoblYxWXRITU42c2V2dUQ3aXY2V1VKKzI1bS9kc3JMenU3djdyZmlmelhLcFMrcXFuR1B2cVRibDVOS3krKzcrWjlOZnM4ZjhGY3ZqaCt6WjhOby9EdmgzeDFyRnJZMlBsdzJkdVdXU0NHRlZZYk5qQWpBK1hGZWMzSDdiUHhaOFNlSTd5NW44ZGVJcDV0VzFEKzBMbEh1aTBjdHdXenZLOU0vUVY1S3FraG00d0srMVA4QWdpNSt6RDRaOGZmR21iNG9mRTYxa2I0WS9EbVJMaVJXRENQVmRUNGEzdEFSMXgvckhIOTFjSDcyRDh2bkdDeVhLc05Yek90aDRiWGZ1cHVUNkphYnQ3THU3bnNaYmpzMHh0ZWpnOFBPVGJka2sybjk2N2VmUS9YYjlrcndab2YvQUFUTi9aSzAzNDZmRVBUclMzL2FHK0tWaGJSWEw3MUVzRmlYRElRaS9JalNSckd6a0RKNHowTkZmQXYvQUFVRC9ibzEvd0RhKytMVjFmYWxkVExwaXlIN0ZDT0ZnalhoVUgwQUg1MFYrSXp5ZXZqclYzT1ZGTmFSaTNvdWwvUHkyaXJSV2lSL1NHVmNINENuUVg5b3dWV3M5Wk45MzBYa3UvVjNmVS9NTFRsLzBWNVA0bFhJUDQwOVc4d0RkNjlmd29vcitrcGJuODRVZmhndkw5U3VqR1JtTEhKelg2ZWY4R3dHbnczdjdmdWpTU3hySkpGREt5RS93bkhXaWl2a3VQUCtSTFYvN2QvOUtSNnZEZjhBRmsvN2svOEEwbG42dmY4QUJlMzluVHdSNHovWkoxblZ0VThPV0Y1cVZuRGMzTUZ5Kzd6SVpGamNxeWtIZzU5T3ZmTmZpTG85akRZL0Rmd2VZWTBpKzBhTERMSnRHTjdFRExIM1ByM29vcjhXeVgzS1ZTakRTS21ySmJLOEhleTIxNjl6OVk4UFpPVkJTbHErVnEva3BLeStYUXhkWWRndldzRjNMUHo2aWlpdnNNTDhKOXJqalk4UHp2RmNvVlpsS25JeDI1citsci9nbFg0Z3ZOWS9aUjhGeVhWeEpNN1dTQWx1K0JSUlh6T2F0ck04RzF2ZVg1SS9QK09JcDVKSy93RFBIOG1lSi84QUJ5Rll3ei9CUDRlelBHclNSNjQ2cXg2Z0dCOGl2dzMrSWkrVGV6S3Z5ako2VVVWMjR0disyOFIvaVgvcE1UNVhoNy9rVDB2bi93Q2xNNVg0V1NNUGlkWm5QL0xRSDlSWDdTZnMrK0N0THN0RDBIVUliT09LOGswcUF2SWhLNy9rYnFNNFA0aWlpdnkveHFrMTlXUzZxVi9QUSs2NFlxU1dCcldmMnY4QTIxbjFINGQ4UFdWajRTYVNHM2pqa3VQTVdSbDRMajMvQURQNTEvTkQrM0FjZnRiZkVSY3RoZGV1Z01uT0I1aG9vcnM4RFlwWmhYc3YrWGEvOUtSOGptRTVTd2szSi9iWDVTUExnTTdxYktma0gwb29yK2wzdWZML0FHUWg0bi9HdEdRNWlvb3JPcHVGUDRXR01wK05YTFE1MmZXaWl1ZXBzYlErSStpZjJIZFV1STlja2dFemVUTTZxNkhsV0E1SEZmZlh3VDFtNnZ2MnI5UGhrdUpEQ3pydVFIYXJZQ1l5QjF4azlmV2lpdjUxOFNLY2ZydFoyLzVkeS9RL2RlRlpQK3hGOHoyLzl2SzJqOE5XUit3cXR0aTZsQUs5Vnoxd1QwejdWeFdsNlRhNjkreUVsbGZXdHZlV2Q5NFkxbTl1SUo0eEpITk1vWXE1VThFZ3hvUi91MFVWK1E1RzM5UWhMcXF2L3R6THJTYnlXaGZxMy82U3o4Yy9HYXI0cGc4UzZwZktrMTliMmRqNWNnVUpzeTRVNFZjTDkzanBYTytGajhnb29yKzJvNllleTJWdi9TVWZpdUliZU1iZmQvbWQ5NGIrYTlpLzNzVitvSDdOL3dEeGRYNEVlRWYrRWh4cWpXWUpoZVVZa2oya2hjTXVHNEFIZnRSUlg0ZjRxNllTbE5icWVqNnJUb2ZvSEMrOC9ROTgrRDkxL2EzeGttMDY4aHM3NnpqVUlpWFZySE9WRzBIQVoxTERuM3IycjRHNjdjYTU4Zjd6dzlkK1JObzBGeUZqdFd0NDlxQVlJQU8zT0FSMHppaWl2eVBoaVRsanNQU2xyRnVLdDAxMzAyMTZtUEUrMVh5cHRyeWV1dnI1bkovSFRVN2pWdkdlb1RYTTBrMG4ybDEzTWV3WWdDdlBSNE8wM3g5cnVoNkxyRnF0N3BtcFhvanVvR1psV1pRcnNBU3BCeGtEdjJvb3I1bkk1T3BuTk9VOVc2aXZmVzk1ZFQzS2Z1NU0rWFQzSCtSOUMrRXYyT2ZoaDRRK0RlcWFwWWVDOUdqMUNLd21SSnBVYWNvSkYydmdTRmdDVjR5Qm5GZmc5L3dVdCtHSGgvNFcvSFQrenZEK2wydWwyVFdxekdLRUhidkxrRThrOWdPT2xGRmYwN2s4blQ0aHBVcWVrWFN1MHRFM2ZkcmEvbWZrRWFrNnVBcXpxdHlhbWttOVhhM21mU3YvQUFSN3RrbS9ZaCtQRzRFK1N1bm1NWk9GemRMay9qc1gvdmtWOE1mdFlXNkh4VnJqYlJ1VnhnK2xGRmV2ay84QXlVMWYwWC9wVFAwU2pyd2hPTDI5b3Y4QTAxRSthNGIyV3gxS080aGthT2FGaElqcWNGR0J5Q0szdkduakhWdmkxOFIyMUx4THFWN3JXb1hoVjU3aTZtWjVKV3dPUzJjMFVWKzNjcXR6VzFTZjZINGRSaytmazZPVWRPaDY5NFArQi9oVy90NEpKdEhnbGFSQVdMU09jLzhBajFXUEUzd1Q4S1dsbTVqME96VStvQi94b29yOHRsbUdLOXRiMmt0KzcvelAzYkI1Vmd2cTkvWXcyL2xYK1I4Ni9HdlFiUHcvcU1jZG5BdHZHM0pWU2NacjZnLzRKcmF4YytGZmdMNDB2ZFBtYTF1N3JXYlMzbGxRRGMwWWlrSVhQc1dicDYwVVY5WHhWSno0ZFhQcmVVTDM2Kyt0ejRmaFduQ254ZHl3U1NTbmEybHZjZXgxSDdCL3dnOE0vRWJUOWMxL1h0SHM5WTFoZFRtQXVic0dWaGdqSEJPTzU1eDNyMlQ5cG53Sm9zLzdLbmpyZHBkai9vZWx5elFGWVZVeE91Q3BVam9SUlJYNDFuV0xydmloUWMzYU5XQ1N1N0pYam91M3lQM0xKTUhRWENya29LOHFVMjNaYXV6MWZkK3ArVEw5RFZpTTc5TVhQTzJUajJ5T2Y1Q2lpdjZyUDR4cC9EOGl1NkFTOU85ZnFsNE1zWWZCWC9CTWY0T2FkcFVhMlZuclVGNXJOL0hIL3dBdlY0MDdSR1p5ZVMzbG9pam5BQ2dBQ2lpdnpMeFJrL3F1RmowZFZmOEFwRWo5UThJNHhlZTNhK3hJK2M5UW1hWFVKRlpzcms4VVVVVjRNVjdxUDZOWFUvL1oiIHN0eWxlPSJ3aWR0aDogMS44NDkzMDZpbjsgaGVpZ2h0OiAxLjI0OTMwNmluIiBhbHQ9IuWbvueJhyA0IiAvPjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDA3Ij48dGQgY2xhc3M9InB0LTAwMDAwOCI+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDkiPiA8L3NwYW4+PC9oMT48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDEwIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTEiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMDEiPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcxIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+56ysPC9zcGFuPjwvaDE+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj4yIOWkqTwvc3Bhbj48L2gxPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDMiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+W+imgeabv+aNouS7u+S9leWNoOS9jeespuaWh+acrO+8iOS+i+WmguatpOaWh+acrO+8ie+8jOWPqumcgOmAieS4reS4gOihjOaIluS4gOauteaWh+acrOW5tuW8gOWni+mUruWFpeOAguS4uui+vuWIsOacgOS9s+aViOaenO+8jOivt+WLv+WcqOaCqOmAieS4reeahOWtl+espuW3puS+p+aIluWPs+S+p+WMheWQq+epuuagvOOAgl08L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA2Ij48aW1nIHNyYz0iZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFFQTNBRGNBQUQvMndCREFBSUJBUUlCQVFJQ0FnSUNBZ0lDQXdVREF3TURBd1lFQkFNRkJ3WUhCd2NHQndjSUNRc0pDQWdLQ0FjSENnMEtDZ3NNREF3TUJ3a09EdzBNRGdzTURBei8yd0JEQVFJQ0FnTURBd1lEQXdZTUNBY0lEQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF6L3dBQVJDQUVUQVpjREFTSUFBaEVCQXhFQi84UUFId0FBQVFVQkFRRUJBUUVBQUFBQUFBQUFBQUVDQXdRRkJnY0lDUW9MLzhRQXRSQUFBZ0VEQXdJRUF3VUZCQVFBQUFGOUFRSURBQVFSQlJJaE1VRUdFMUZoQnlKeEZES0JrYUVJSTBLeHdSVlMwZkFrTTJKeWdna0tGaGNZR1JvbEppY29LU28wTlRZM09EazZRMFJGUmtkSVNVcFRWRlZXVjFoWldtTmtaV1puYUdscWMzUjFkbmQ0ZVhxRGhJV0doNGlKaXBLVGxKV1dsNWlabXFLanBLV21wNmlwcXJLenRMVzJ0N2k1dXNMRHhNWEd4OGpKeXRMVDFOWFcxOWpaMnVIaTQrVGw1dWZvNmVyeDh2UDA5ZmIzK1BuNi84UUFId0VBQXdFQkFRRUJBUUVCQVFBQUFBQUFBQUVDQXdRRkJnY0lDUW9MLzhRQXRSRUFBZ0VDQkFRREJBY0ZCQVFBQVFKM0FBRUNBeEVFQlNFeEJoSkJVUWRoY1JNaU1vRUlGRUtSb2JIQkNTTXpVdkFWWW5MUkNoWWtOT0VsOFJjWUdSb21KeWdwS2pVMk56ZzVPa05FUlVaSFNFbEtVMVJWVmxkWVdWcGpaR1ZtWjJocGFuTjBkWFozZUhsNmdvT0VoWWFIaUltS2twT1VsWmFYbUptYW9xT2twYWFucUttcXNyTzB0YmEzdUxtNndzUEV4Y2JIeU1uSzB0UFUxZGJYMk5uYTR1UGs1ZWJuNk9ucTh2UDA5ZmIzK1BuNi85b0FEQU1CQUFJUkF4RUFQd0Q5TklmRDBNeUc0a3YybUVnNFV1RlhKLzhBcmRxcDZScElnMWE2bXZMcVJiT01CRWdqUWJUN2s1Ni9oVHJEU1BEdHRZTkxaMlUxM0huYzM3OVl3RDlHWWRLWmQyV2x6UTI5cTFuSXJTRXR0bHVrREhIdUNjL2hYN01wUFZYZHZSSnI1WDBQeUgyYTBkbDk3dCtXcDBPaFF3MkEydzNEWEVNM3pCSGs2ZlFlMVNYb1c5bEJkb0RhSTJRdVdWbVBmdldiUFp3NlhiSVk0WVYrWUFlYmRzeDZkdmYyck4xR3ltdnI4TGRSNlBGSEg5ME5QSjh3N1p3YTU0MDFPWFBmL1A4QU0zbG91VzN5NkhTUU5ZNmxjUzdtOHFHTG9mT0l5Ty90VVU4K21TMzd3V2R4RkpOS3Z6ZnZUbEI2NHpYTTZqRGR4M09VdDlDOHBCc1FNODMzdXYzaHgrbFc5RTBLNGs4NmFTUFJacmk0R1gyaVJjODlOM3RWeW9xSzVuSmtLY3BTNVZGZWVoMlZtdGxiMndYYzF3WWVIbEpKeDlhWXR6bzFtenRNeUl6TGxtL2hZZlExZ1N5VFNNMW45ajArTnR1UGszTWd6N2tqbXE0dDc3dzdCSkdaTFc2a2x6c0lDankrT0I4eHJsVkZQN1R1L3dDdlE2UGFOZlpWbDVmOEUyOWMwZlJkV3Q0NVhtU2FMTzVBekFnSDB4aXRodFpzSklvWTNqak9FQjI1eGdEMDRya0xqeFpmV0ZpWkV0clBWUExYekdnaWVKSk1qc056cU1uNmdWVDhOZkV1ODhVM3ovYlBEVjdwTUhrcTM3KzR0cE1rNXl2N3FaejI3OFZUd3M1UXUzcEgrOHZ3V2orNUZScVJqTDNWdjVmbTlWK0oyejZyWVR3ZWVyTkhIbkRpUk1rQ3E2YWhvOWhDMGtHU2VnRVFKYnIzL0dzZlhmaUxvSGgyMWtqdU5VMHlIakxLVmN0ajZETllla2ZHcndXdHhIQkRleHd5U2ZNbyt3VGNrZSt5aW5ncTBvYzBZVGE5SGI4ak9waktNWmNzcHhUODdiK1dwM3R6ZldrOE1jazBXMUpjRExMallSejZqOHFwUytKdFBsbWpWWkdRbmhXQ2J0eC9PdVR1L2l0b1Z3azBkdmVUeVhVaHl5SnA4akVEL3ZuRlk5bDR1MFhTNFpnamF0SnVmTFkwcVRMSHIxQ1ZyVHkrZHZmakx5MGY2b3puam9YOTJTZmZWSG96M2kvOGU2cE5OQU15eXlNUW9QdFZGZkZFVWwvNWRyWjZsTXl0eVNnMkwvaUs0dVg0elc2enh0YVdmaWFhWlFWTUNhWnR3TzJTNEhINDFOYmZGL1V0U21XM2swTHhYWWpraWNXc1BIb1BsWTFjY0JVaXJ1UDN1MzRkZmtMNjVUazdSYjM2UnY4QWpiUTdTZnhYRGFYRXpYR25TUnRuNTJqVGR0eDNOU1crcEM3MUpaTGUydjVJWkZKWHpFSUhUdG11WDBqeDNjSmRKNTJuK0tabzhaeExGSDE5U1FmeHhVZXAvRTdWTEhVRlk2TnFYOW43Y0dlV2VHTURyeHk0L2xXWDFWM3NrdHY1bC9tWDdlNjVwWC84Qi9XeDN2MlJMcTBacm0xKzhEdVE0YkI5RCtGVkpUSEJheHRIYlNOZzUycEdDUU05dUs0Znc5OFU3ZTkxK1RacHQxQ1BKSHp5Nm5ibFpQd0VoNmV1SzNMVHhuSnFFYXdSNmFzRWE1TEJyNk52cGpESCtsWnl3MVNEMS9OZjVtMGNWVHF4OTMwMmYrUjA1djF1YmlQYmEzU3lLQ1FQTEhJcGx6ckk4MHRjYWZlS3FqL25ubFdQWTF6clhFeTJ5cXRyYXZuSkx0Zll3S0w3VWRTUEN0WVJSeVlDa3lsODFuR2pHL1Q3L3dEZ21qbExaSi8xNm03cUd0eUpCKzVodVlXWUZRNVlKajBITlNXM2lpY1F0dXM1dDhlQUJKSUVEbjI3VmdhbG9EWHYyZVc1aXRaSmR1emVyU2JvL2ZwaXJ0dkZjaTAyczhOd3FxQ3JiSk9hbVVhWEt2OEFnLzUvNUJHTlhtN2ZkL2wvbVg3YnhkZmxKL00wNTRkNEhQMmdOam5zYWtzOWErd0ZYbTNMdTVLeVNqYVAxckgxTVhPbzJwMzZXc3NXUXVZZ3diZzl4UWRPZGlzN1c4Y2FuSVlOQms0L3o2Q3B0U2Exc3Y2OVdQMmRUbTZ1M2Y4QTRaR2xySGpaYk10SkcxdTBTRUFZbEhQcjBOUGc4YkI0bVdHYXlXWFA3dEpMb2JtUGVzeXo4T3crYmxJcFBNMmwwS3dkZnpHUHdxYXo4T1hFbDE1M2x5dElxbkR1aXF3K255MFMrcjJzTlU4UTN2OEFoL3dTYWI0aE5wWlpacHJFK1p3TXpibnlQb0t1UWVKV3ZGM1F5MjdMdEpDNy92Zld1WXZQQnVzUTY2dHd0emRlV2NqRFhhanIvc2xQNjFzd2VGNzI5c0pJNTVKRTNaQjJYUjNGZnFCL0tpcDdDeXQvWHkvNElxY0s3YlQvQUsrWnJTbThtVnZMazNJMkR6TGpCL0tudzNFMXZhay9hblhuR01aQi9TdUx2L2hQY05DcldxeUZteGhialVwY1pCNDZVc2Z3dTE2K1JsbGswbUpTTUZUZVR0eCtZbzluaDdmSCtDL3pIR25pVS9nMTlmOEFnSTZLWFdiclR3elNTVFNSa0VqQVo4RDF3Qi9PcjFwNHpTNlZWV2FkZk1HTWlKd1QzN2l1WXR2QmZpclF0RWpoc3Jqdzk1aThLWlpiaVRhbzZkOG44NnJMNEM4V3pNekRYTkJ0NUdKSS9kM0h5dDY4dldYK3p5dmQrbWovQUN0K3BhcDRtTzBmWFZmbmY5RHJJZnRNdDJ5L2FHOHRod3pxd2JOWEpaYjUyK1dlVDVSaEcybmFQOGE1andUOE9OZjA2YVQvQUlTUFh0TTF5UE9VeEEwVEo3WlVqUDQxMWZoblNScHQ5ZHlhbC9adHpheU4vbzZ4QjR6RXVPaCtiazF4NGpGUWhLMFZ6VzZwYVA3N1A4RWRXSHd0U2NVNUxsdjNlcSs2L3dDRnlORnZJcFZhVzhsWi93QzdzTzArL1dyMEt2TGNqRjR2R09OdlQ5YTg1MUg0VitLcjdWN2hwdmlKWjI5ck5JelEyeTZiQXhpWHNOekFuOWF2YVA4QUNEVW95dm1lUG16SHlWRnBiZ04vNDVWODFPVWVibnM3Znl2L0FDTW94cmMzS3FidC9pai9BUEpYUFFvd0lnNHVMeEdqN0FnZnp6Vjc5M01pN0x2Q0tPQUZ6UytIMDBleHM0cmVaOU51cE5vM08zSG1IdWNEajhxbDFTd3NkYTBXNnM3VFVyZXhsbVFxczBLamZGbmpJSnowcng2bUlkL2hmM0k5aUdGWExkU1YrMy9CdVIya2F6emY4Zms2WUdQNGNIM3ExaU8yTzQzRTF3emNBQUEwM3dsQmFlQy9EcTJkM3JQOXB6S3hKdUxtTldrNStneCtsWVBqVFNORjhXYWdzczNpVFU3RVJqaExOM2dRKzUyam1pTlJ6blpwOHZlMzZmOEFCSEttNDArWlc1dXpkdngvNEIxRUVKdko5elN5S3Vjcm43eHF4NUN1eDJ6T3ZVSE1uRmNQYVczaHZSbzJtazhTWDgrMEVabXVaR0EvQ3JIaGZ4VG8vaVlYMEZqZlhETHB6RVNsNFpGM2dCU1NtNzd3K1lESXp6eFNyUmpDUHRHMm9xMnJWdFc3SmI3dGxVVzVOUTA1bjBUdnNyOXV4MXhOdkR5ektxZzlkOUZwNU1VN01zMk4vVGRKdzFjVHFmaXJ3MVpabGE0djUxenlrRnBKSi83TFd4QjRuMEc5dEZLcmVMdEdWVjRDckQ4Q0tjc1BKUjJldmtPTlNMbGE2Kzgzcnh0eU1vYUpXendRM2FxeTZXSEtreVNKdEhYekt3dFExWFRib0I0clhVcmhzZndBSVIrWkZXdE8xYTIweUtHWllkU1Zzak1Mc0d4OWVjVkxwemhIUmFseDVKU3UzK1pzSll5cmdKTHRYSFhkay9uVWNPa1RKSkxLMTAwakgxWTRINjFPbnhOeW5OakpIemo1bFdubjRsUmpEZVhHcFBBeUJ5ZnlySG1yOUltM3M2SFdSVlRSbGI1M0tzelo0VUgvQUJvcTFkZkVSNHJlYVJvVnhiNDNxa1paaGtnRDVWQlBmMG9weGxYbHRHL3Avd0FNYXZDUVc2ZjNIeUhkZkdmd1paMjhNS1dlcDZsYnlrTVF0bkl6ZzQ1TFp4eFZIeGQ4ZGZoM0JhMjF4Y2FINGpieVdKVnhaTis3STdENXUrTzFlL1NXV3V6U3JqVE5GVWZ4QXlrN3YwcHphSHJWemRxNXNkQ2pWQVYyakp4bnZ5SytubG5kbys3RnA5K2Qvb2o1Zit3NU5POVJXL3dSL1ZuZ3VrL3RONkhyTm5ETForSFBGMDhZYkNCdE1aZG85L241cmFUNDZTek9zY2ZoM3hPclNjQnY3SVE0OU01ZXZabTBmV0ZkUXk2SEdNWVBGUjNHbDZzVWJ6THZTVlZzZmRUT1Axck9PY0pwYzFOWDlYL2tiUnlkci9sNi91aXZ5WjVGWStKdGF2QkpJK2xhemR4c2R5UVM2WEZGZ2o2TlUrZytMOVZ2THRvNVBDWGlLMFVQZ3NSR3FNUHdiajhxOVZHbjZoRnRCMXJTWVZ6MU1RUC9BTE5TN3BvTnpONG0wZVBCem55UmovME9xbG5YZW5INzJ2eVZpbzVQQlA4QWlQOEFCLzVuQTZxOTNPRVgvaEY5UXVoa0VCcjNaK2VQU3FGeDRXdUw2OFdTTHdpdHJkWjNNMHQ2eERjY2RQOEFDdlMzOFV3MnJCcFBHV2p4dEhubFlsSC9BTFBWVzc4ZmFQSmRCN2p4cnB2bUx5R1VxQ1AvQUI2c1k1M1ZqOEtYM3kvek5KWlBSbHJLVCs2UCtWem05UDhBQXQ5KzduajhPNlNpdGdzWGtiZXYwd3Y4NjFGOExhbllvMjNTZE5VTjBNYnQrR2VLMW9QakQ0ZXRJdGtuamxOb0hSSlZBTlZiMzR0K0RSYTVrOFl6TW5YL0FGZy93cm5ubkZWdThyZmUvd0JXYlJ5cWpiM2Ivd0JmSXpkSitGZXNhaXJzMmo2Tkp6dy9rbVJsOThzUDBxd253WjF6eXR2MlhTOEtDVi8wSVl6MlBJb2I0NitBN045cDhUM201aDBWK0Q5Y0NvZFIvYUMrSDlsYjduMXpVSm03QlhmbjhxbisxcXJlNis3L0FJSmY5bTBVdG45Ny93QWl4cHZ3aDhTUGRxOGwzYkp0QVZ0bHFvT1ByVjY4K0dHcFdhNzMxUzRLblB5SXNZSnJBc3Yya3Zock5DR2sxSzVXVEh6QnpKMXFRZnRDL0MxVHUrMkpLTytNdHorZFRMTWE4bnV2dVgrWTQ0Q2pIN0wrK1g2bzByZjRleUlWaisxNmp1YnUwb1hiK0lxbGZmRGlOWlAzOG1vTUVPNC84VEprNS9BMUdmMmt2aFRBdVdrak9Ca3MwSEFIMXExbzM3VHZ3cDFTTU5iM0ZxcU1BUVdnMjVCcHh4dUszaTM4ditIRkxCNFhhVWZ3T1IxNzRYYWJkM3UrM2lETXgzNXVkZHVGeDY1Q3RWVStCbzlRbmtzNXJYd3JkMk8zSGxYR29UM0c0NTdoaVJYcTFuOGZmaHpleXh4cnFPbnI1aENydVhidVBvSzJkTjhjZUVkWWVackdTenVuaVlKSjVRQktFOUFmenEvcjJON3kvcjVHU3dXQlYya3Z1LzRKNEZIOEJ0TDBDL1M0MHZTdkFNTWtuM3lsdEpJd0hwelhTYVA0RmV6eTBObDRiamJ2NU9uY1ovS3ZjSXJ2UjdKZHpRV3NlZjcyT2FqbjhYNlhhWE8xVXQvOTVTT0tpV1B4czlMdit2a1ZIQjRPR3lYeS93Q0hPQjBxMGdqMHdKY2FYcGswdzZPTFhwOUJpcVIwTFZyYTk4eTN1djNlTUJQc3lLaWUrTVY2SGNmRS9UTE5nb2pqWjhlblVmbFVJK0tOalA4QWR0bWJhMkd6SDIvS29pc1RkdmxlcHJPcGgzb2NCWWVEZGN1SmQxeGY2bytHeUJHQXFuMkZhVS9nMjd1b0FvR3FSN2VQOVp0UDZWMUgvQzQ3YnpqSEhhc281SHpqRlZaUGpJNmhvNDdVdEoySjRIOHEzNWNXOW8vaVpPcGhZci9nSE4yWHc1MURUN2d5TGNYbmZBa3VwRHdmeHgrbGFyYUpjcEZHdm4rWHNHR1BuT3hQNlU2Zng1cWw3ODdYbHZicTNPMVlDeEg0NXFoTnFrY2picnJVTHQ1VG5INzBLRytncTFoNjh2amIrVE12YjBJSzhVaXJQWno2Vk1xdHFFOHpPVC9xMVkvaFJKQ3p4N2xrMUtUUEdBRDh2NjFCUDR2V0VlWEZKY015L3dDMzFxak44UTdyUGxMSElXWTlkeDQvR3VxT0JyZHpLV01vOUVhdHJCYm8vbHpTMzI5VHd4VTUvbldyRHBWbE02dDlxdTR3dkdESDFybGJqeDFlTDhxeDRicUNHM0UxajMzajdVSlpmNHR5bmdFZmRyU09WMVpkZnhNcDVsVGpxbCtSM091YTdwT2xLVXVHdlcyamNkcURwOWMxbEw4UWZEa3JLcXlYbnpjamtaRmNucW5qWFVQcy93QXpSeTd1TXNNWXJCdDlVbm51TXlGWStjc29YT2Yxcm9wWkxkZTgvd0FUQ3BuRCt4K1NQUUp2R1BodUs4RGJOVWFWdU1MT1JnL25pcysrOFgrRmwxS0dhNHM5U21rVWdnTmN2czYrbWNHdUx2N1JyMnhBU1dLU05XSmJlTWJSNlZrcG9zTjArTGxyVi9PYkMrV3ZsNWIzeVRtdWlua2RCNnR2OFRrbm5GZmFOdndQVUxmNHVlSGJtU1ZvOU52TUx3Lzd4dG9BOXMxRmFmR1R3N2Z4c1k5TmthS01sUVhMWUpCeC9lNXJ6YXo4T2FmSGNORkRJclRTY0VlZHlnNzgxWGI0ZDJkbmRRK1pMSXlxNHlJWlB2RS8zc2pGZFA4QVl1RGIxdjhBZC93VEwrMWNYYlJyK3ZrZW5YUHhwOE90Yjc3ZlNmT2toWUlmbExlVjllYXRXM3hpMDViUXlOYTJhTVNSOGdKT2ZwbXZON0R3ZHBPaTMweGp0Yk9kcGpod3JEZHhXMWJhY05Rc21qUjQrRGtKR2ZMQy93REFobm1vbGxPRVM5MU8zbVZITXNXOUhJN1N5K0wrblhUZkxwRWx3Zkw4M0tSNHlNZ2RNOWExWVBpbnA4Y0VNeWFlRTh3NEttSEJPYTh2ZlJOWVZrazh5elZGajVWaVpHTGVwYmpqOEt1K0c3SFVSRk1McnlKcGNCak1KTnFuMjZrMW5VeXZDcFhYNW1rY3d4TjdOczlXdGZpT3VyV2NrdHJZb0RIa1lkQU9SMjZWVnV2aVBjWFZuSWgwKzFqMi9MODhpZ01mUWNWd0QrSDVaWjFhVFZyajkyUGxpODc1U0t5TmM4R1RKZk04T29TTEpJQUFQdFJUMTVJNkg4cXpwNVhoZWF6L0FDZithTGxtR0p0ZjlWL2tiSGlEeGg0c2VKLzdQMG53M2J4cXBZdmNYTWhaVDJIQ2ltK0dQaVZyMmt3U1J3cnBKV2RzVHJIZlNJb1lnYmlPQ2Y4QTlkYzNQNGRodDdYN05OZjJ0dVpBVE5KdjN1eFBBNXFHTHdjMmxhZkZiUjZpK0dmT1hsMjdSbk9lTTVQUVo2VjBZN0k4cXgrR2VFeHRLRlNEYWZLNHRwMjFUZDI3MmEwT0tPS3hjSnFwR1R2NnJUMDBQU1BDbnhMaDBXMmh0Ylg3STBjVFlJZHBYWWRlQVdCSjU3bXVydFBpQzF4YitadGhVc1R3eWpQOHE4a1BoNFFicHB0UXZGQ3BobFdZZVhnZmgvS3J0ckpEWXcrV2I2NGtZSmtqekJ4bnAycktybHVHbHJUWDRIVFJ4MklqcEovaWVqbng3RGJYMjE1UExtMjhSN2lQTTU5cW8zSHhnVXhTQ08zTndzWVB5TEtWS24zNHpYbTk0TGpVbWFhQyszeG9Tb1FPcUgzNUNnMW42bDRldXIyQlZzZFFXejNCVmVTSXFvbEdlZDJRVFd0UEtjUGRLYi9PeSs3VVVzd3JXdkg5RDJLeStKRm5xTnJHWld1STVPNmJpd1EvV3MvVmRiMEh4RGVRU1RYVGxyV2RaWTBhZGd1OVJ4d0RnOWVoNHpYbjV0TGV6U08xbXZKcjlZMEFOekpJQ21jOGo1Y0NxZHg0WDAyL1pZSTQvczVCM2d4eXFwNS9pQUlJN2QvV2lHVzBGSzkydTF2NnYrbzNqYXpWbWsvWC9ockhzT3IrUGJxZTF2SW9MMnpoODRvVmtDYld3TWNGdjR2U2l2SHJxNjArUFNWdGJxM25aTGRpRnVKbURidWVlZ0EvS2lzNk9VMElKcTMvQUpLbjJPaXJtRldxMUtUL0FCYS9ROEFtL2JQOFpYQWFSdkVVMFB6SGNoWVovU29XL2JCOFJYRW4ra2VKTGhjOUZXVHJYZHdmc3AvRG5Ua3pKcE9vVEVrWjMzY2gvd0RacXYzSDdLL3cwMVcyTWIrSHBXR01uL1NwaG44UTJhL01Yd2Z4QlVTY3NSYjVzL1J2OVlzaWc3Um8vd0Rrdi9CUE1MejlvdlVyeGZNbjFxK1pldk1wTlp0NyswS3MzekxxRjB4ems3blpmNjE3eHB2N1B2dzlzZE1qdFY4TTI3UngvZDN5eU4rWkxacTVGOE5mQjlzVlczOEo2Sjh2ZDRWZkg1MVZQZ1hPSlA4QWVZbjgvd0RNaXB4ZGxFSCs3b2FlaVBtUFUvMmhOUVNXMVRUN2RyMUdrL2ZOSk95bU5QOEFaNjVQdFRiajR4NjlmYTlGRnA4R3BUeHlJUzBZVGNGeDdmZS9LdnF1MTB2U05MTytEUmRCczF6Z3VJSTFIOHF2dzNzZGs2N1k5THQyWFB6SkdxL3lGZEVmRG5GUzBuaVgrUDhBbWMvK3ZXRmkvZG9mbC9rZkpLZkZ6eFhaVzRiVWZET3VlWThteUw3TFpUVFpCT0FUaGVNKzlkSnBXa2VQTmNra1pmREdxeHFWeWpNb0dmd0p5SytsYm54YVlvMi9lVzdsZS9YTk11dmlFMXRBRyswV3lzY0RQcVRYYlM4TTRmYnJTWnp5OFFGYjNhS1h6UG4yMStFdnhJdm0vZDZGZHJHUmo1NTRsOSs3Vm9IOW1yNGw2M0F2eldsdXY5eWU2VGo4cTloajhjU2ZhNUpKTldrSzR3SVVRYlZQNVpxVzM4V202VXExMU52WHFQWTEzMC9EZkNSZDVUay9uL3dEaHFjZlY1YVFoSDh6eDNTLzJJZkdrTE0xeHJXbGlTUnQyNlNRdnQrZ3JwdEwvWVpNUkJ2ZkZFY1o2bnlWNm44VFhjWCtyenRGNWF6emJtK1VIZndSVlcxTTE2UExhVjJWVi81NmYvWHIwc1B3SGw5TmJQNW5EVzQyeDA5TkY2SXliWDlqcnczWmovVE5kdnArYzVWMUFiOEswN0g5bkw0ZTZNNnBJdDljdTNVTk1mNlZQRmFURWxvL01PMDlXYjdvL0dnbStaMlZHKzl5VzNEaXZUcDhMNENEMGlqemFuRTJZU1Z1ZjdqVzAzNFIvRC9TYnZjdWorWUdUR3lRbDErcHJvTkQwZndmb3NHTFR3L1pLT052eWY0MXlkdEhjYk5zMDZqSkpKeVAwcHh1WklJOE5OR3l4cnlONHJwamt1R2pwR0tPV1djWXAvRk4vZWRsY3crSExtOXRMZzZGWXROWlA1bHVkb3pFM1lpdFZmSGtkc2tqQ3p0NFpKQ001VWZNUjB6WGx4MUlmdTJqdTJqM05ncU1Oa1o5Y1pyUWU1ODJFTTBseElvUEJVNHorRmJmMlpTWFRRNS83UXF5M2tkNU44VW1lTmhLc2ErbmRhYWZpTkxPditqcTBpc09pQVp6WG51eTB1N1E1UzgyRTgvTS93Q3ZOVGFWcTFyOWpWclc0azhuSEJHY2ZuVi9VS1MyaVQ5Y3FQcWRvM2k2OWx1RzNSU0VZeU9tZjBxUzMxKzd1U1dNY2lybkIzRVZ6Y1BpT0dNakVqTXA0SjU1QSt0T1R4WEhNcE1ieWZLVDh1MC9ONzVwZlZWMGlIMWg5V2RJYm1jRm02QnV1RFVkMWZTVERDODVHSzVXMzhjbzl6dFZwVWtWY0VNdkdmeEZOaitJTWp0NVJMS3luNWNMdUIrdnBWUEN5dnNUS3ZiYzZqKzBaVWZhdHl5bnB0SXBKcjJSNXZtR09PdnBYTlMrTVp0cXpCVlpWNEl4MXBMcnhYdjJyNWMzelpPUTJBMytmU2o2dEs1UDFnNk9YVFBNaldRTkdyRG5QUTFVdW9GRE41MTBxN3NBWXp6V0EzaVhlb2JaZFRSWUlLZmRINTVGVmJyVzQ1bzkwS051alAzQ1NjL25WTER5Nmt1dm9kVExEYnhGZjlJV010OXhqazVxbk5hV0xiWkpieFdaZTZuTmNwZWEyMTdKRDVrREJmVUVrRDI0NlUyMXZZWmwycnVqWWNZSXdDUHJXc2NPMHR6UDZ3cGJvNmk3MDJ3bnNkelhFc25QQUhIV28xMDZ4aitVVEs3Z0Jpd2J0OWE1azM4Y002dytkdjhBTStWVWM0eGpyZzA5cnEzQ0g1U2t2SXo1blRuaXE5ajB1eGUwdTdXUjBsK0xlQkYzQnBCazg1Nm1zcTdzSVp3WkJMczJnazlEV1Ivd2xkcmovVnpNYzdTR084TGoyelUvOXR3Slp5YklZOEFoanVKNStvcHhqeTl5WFVVbnFQMHk4OHEzWmx1SUJJdWNiMEM0QVByVUJrdXRWbmtaYmlKcE1BRk4rQVBYaXFkcHExdHVrTnkxdUlWWUtJMGp5d3o2N2gzcTRmRk5tczRTM21qdDhOc0cvSE9LMnV0MFJHT2xwZnFVN1d6djRKM2FHUlY4djVnd0gzaitQV2x1SU5XdkpZWkk1WmJObStWZ0NwVi95T1JXZzJyVFRMSkpiL1pIampVa0w1bURuSCtUVWRsck4xREZISmNmWk5paktDT1RQNTVGTDI4cjNhUWV4aTExc1UvdHV2SkRLelhXeFJoU2lyeWZRNXBMZVR4RkN0dmJRMzBNZTdMTis2TE5JUHJuanZXbFBxeXJGNWlGUHRES0NBZm1EZTFOazE2UzV1cmNyREkwaWtibVJWRzBkNlVxNzI1Vjl5RDJFZWpaVS90aldOTnRHa3VMaU5wTng4cktuZEdlblNxVXQzNG4xZTk4eVNXemFRamJHelJad085ZGdEYnRlZWFMVjJVcmpHNGNuMXhVNlhQNy9hMXBkTXI0T2NqNWF6K3VXMTVWZjBScDlUdm81UDhBRTVLYTIxdGJXM2ZKa25oSlZueDhoeDdEc2F6YjNTL0d5V0N0RkpwMDAxMUpqZk5FMG5rcjZkUm42MTZoWTM4TUI4dUtQYnQ2bDA3MDY0dTJlMlpaUEo4N0h5S3JGYytuU3M0NWhOUDRWODBhZlVJZFcvdlp4SGhmVFBGVnpZTEJxZjJZU0tEKzlDNHh6NlpJL1BtcmtHZzMwTjhHZU9TNDh6TytWUmplUjdBY1lycmJHNXphanpBc25QUU9lRGo2MDF0ZE9uM0t4L1pWYkErYkRxYy9pVFdOVEd5YmJzdmxvZEVNRkZXV3R6QnMvQ3Q5SHFMU095K1N5NStZOHIvOWVpM2drMCs3MnJFWHlUZ2lUY3A5eUsyTlI4YVNlZVlZOVBra1hibHNiT24vQUgxelZJK0pUWnVKWWZEODB1UnlJdGdQL2ZKSXJHV0tiVjVHMzFWYlJUKzRsc1pHczRaQWJOZkxtWE96elBsSFhvUGVtNmRKYXkzYXErbmIyUlNRWFVxc2ZIclRiM1dZOWFXRlcwblVyY3pOamFHOHRoLzN5MVhyS3kreXJnV09xUnFQbEc1eTRQNWsvclhNOFhUV3Q5Zkovd0RCTnZxazl2MC80QlNOd1BzUmFXempoeTJGVXlid1IrVkZhRGFqR3lTR1RTcnFieVgyc2dUQkhwOWFLVlBIVVpLNmwrSjFMQlYxcFovY2NBTlltbHQySlJwTnI5Q1FXOU00SCtlYTV4dmlucmVwK0xkUzBXMjhONnpHdW43V1cvdVU4aXl1QWRwT3lYbkpHVHhqdDJyNHUrQm43Y0hpSDlwTDRKK1AvRTNnZTQwRFJQSEdqNm9MZTBzdFFYeTRGdE53Mm9TNUh6T01rODlTSzlNOFcvdFRlS3ZodjhOTkoxUHhsSHB0MURxcndXMXphNkYvcEY0MXc1Qy9JdThqWURqSXgwSjZWRkxPNkZTQ3FRK0hlOW5hMTdiN0xVNVZnWjIxWGJTNnU3cTYwdGY3dXVsejZvczN1cEkybHVKSTFVWkh5ejdrSy8zaWNDb0wyNjJhbmIyUDJrcmMzU1BMRis2Wmwyb0JuSjZkeFhnL2p2OEFhRnVQQS93OXNZTk4renlYV3FRdkxiMncwdGxOc0Fvd3NpS1dHU3hBUDE5cThVdnYrQ3FYeE84T0xjTnIzd2xUVGJHMmpkWWJ5SzhXWTNjcTQrVUlvT3hTT2N0Z1ZyVnp6RDBKY2xXVm5idHA5NFJ5MnROTjA0dHEvVGY4ejY4MUx3bjRvOFErSmZzV3EyK2h5ZUc4QjNiem5NenVweXVGd0FNSEhjNXJvcFBCRUxMSkpOcU1pazhLZ09GR08zNlY4TTNQL0JSYnhwOFEvaWpvK202Ym9xMy9BSVUxQzJSOVlsMy9BR1Nhd2xiUHlRczNMWWJhY2dFZGE5RXQvd0RncFJlYUQ4UmZGZWp0NEQxalhORzBmN0xEcE43WnhNelhqTUFKaXpiU1BrYnZ4bkJxcUhFV0VtbkpWTkwydnNyMnYrbS9mUXdxWlRpSXBMMlR2Nk52dDh0ZHZ2MlBvN1U5WDBmd3A0RnVOVzhTWEVPbDI5aW1aNVd1UThjSTZCaWNBZS9TcHZCZC9vZmlUdzViWGVuM2cxT0dlTVBIY3hyOGszdU8zNVZ6dGg4WDlFZ2p0WkJwT3FiYjlmTmVFd2wwdDJQSjNqMU9hODM4T2Z0TGZFSzkrTEd0V2QvNFQwelN2Q2RyYmw5T3VZcGZPdWJvZ25ySGtiZlhIV3V5V2JVWVdjcFhVdEZiWDc3YkszVm1VY3ZyTnZsZzlQSzIzcitTdWZRd3RiYU5WM1F2ak9jQWQ2b2FqRk5McWU2MGoxQlYyN0dqMmp5eVR6dlBHZUs4dzAvOXAvOEE0V0FFc2JHeDE2eDFDR1hQbXo2VzBLeUlPU29abEl3ZlhOZHRyWHhPdnRDaHVwRGJySkdwRG9EY2JjS091U0UvVHZRczR3OXVaU1RYcmY4QUlwWmJpRzdjcis2eDAwdGpxTnRhQlZ0bzVKTWNaeU4zOUtiRFphdkxEdGtpanR3VkIyZ2pjT2F4ZitGc2FrMXZieXJIcDZReUtOak81K1pqMEhPSzVPMThlL0VxNnU0WmpMNGJsMlN2SE1zZGc4WWtUSksvTXpuR01qcHdTS3lsbm1IZ3J0cC9KdjhBUXY4QXNldkoyUy9GZjVvNzdVN3VUdy9KYVFYK3JSMm92cGZKWGY4QUt4ZnFGVUg3eE9EeDdWcld2aCtGWnViaTRMTGdjcWRuK2Y4QUN1TmZYZkdPdXlMSkpkNlpDMGEvNmdXZm1xci9BRkovL1ZVTmpjZkVhTHhCZlRYR3U2ZSttenhCYldCTEFMSkZJVHl6Tms1SDBBcFN6eW10RmY1Si93Q1JDeWlxbjArOWY1dTU2VGJhZGJScGw5NVZ2bFpTTTA5ZENzNGcvbDJySXNZTzRuZ0w5VFhJNlpINGtnZ1ZwTlZudW5Ea3N4alJVL0lDbTZucDJyYW5ITkRQNGh1b1pKa2ZhSVBsQ2pyNzlLei9BTFdoMFRLV1Z6dG8xOS8rU09uajh1emt1cERwZDU1ZHZ0WkpkdTlaeTJlRXh6NmM0cStaSkgwUkxyN0RmMjh5cVhhQUtIa0h0Z1o2K3hyeStMdzVySGhUd3BEcDFycVdwVFdxcUFrelh6ZVp1NjRKSU9mclZyVFBCV29TZ1MvMmhxQm5TUUV2OXFabGtIdUFNVnovQU5zSnZWTnY1ZjVuUzhwbTdQbVgzLzhBQVBWYklyY1JibWhralVMbkpQVDZqK2VhZzBhR08vc2Q1VzNSVmtPenlKUE1SMC9oT2NEcjZWNTNEOFBiMjN1M2ttdnJ5ZHBpZHNUNzVFeDlQd3FTTDRMeS9hNDJqamtzNUFwVld0dzBhcjlSbkgwNHJPV2RXZWtKWCtSZjlqOTZpL0gvQUNQVUxpQ0dKQVh1TGVORi92Y2ZYdldTTDI0ZS93REpXM0xXdkJTNlJnd2tKOXM5djZWemFmQkdhNnRmczg3VzBrU0h6UjV2M3l4OVRuK1hwVTB2d3hrZ1AvSDVOQ0FSc1ZaK29IMXpWVTgybEw3RC9BbDVaRzluVVgzTTdBcXVGVi9MWnMrb1U1ckN2VXZIdUxXUkxpM3MxamxKbmlZTEsweTg0VVB3VjljNE5VcC9nOHQ3YXNZOVEyeUVtUkpHSVpsZkgzZ0QzNXBnK0Z5aEkxdWJ4YmlSVjJ2SVVDN3o2a0FZRkg5clZFLzRiKzlCL1pjR25lb3Z1ZjhBbWJjdXJxakx0aVhnZk5rY0FkKzNXcytYeFpETFlMY0sxdkdXVWxGbVR5OXgvbVB5b3QvaGhiM2tMcGNUSXlzTUVsc0JoVmpUL2hkcGVtMk1jTnJPeVJ3S1ZSVkc0SjlNajFvL3RhcDBwL2ovQU1BbFpiUzZ6L0QvQUlKbXcrSXpCZnp0ZmFscDYybXhURXFSYldYdGdzWDV6OUJVcDFiUzcyS1poZTJhckhrdGdyZ2RPdlBYbXJRK0dtbXl4cXQ5TkxkYzVKbDRIMXgwcXduZ0xSYmxIWGFqUjlHR003aC9LcGptbGRhOGkrLy9BSUJheStnM1p6ZjNmOEU1ZTZpc3ZOOHVhWlpwSm13Rml5b0k3ZE05cW51UEF0aEJFV2t0WjJVbFYyb0MrU1RnY0QrZjFycEY4R2FLbHB0OHp6RmIrSGFlbEdrZUVORjAyQm80NGRxdTI0NUJZbjg2cFp0aTdmQ3Z4RCt6Y05mZC9jam1OWDhDYVd2a3lQYktKcmZpR1RhQzBlNGVtZjZpcUdvK0JOUGV4amtsdkROT3E1TzI1RVRIMUlHNyt0ZCsrbTZaYlJOdXRKQXk5TVJacFBzRm5QTnUrenpGVkdQOVVBS24rMWNYZlN5KzhTeS9DOWJzODkxTHdMWjZNOHQ1WnRMY1NKRmxram04d3lkK0JuazF5UHc0OFkrSWZIK28zVnBjK0VkYjhNMnNMbFk3clV0a1luSDk1VURaL1d2Y2hFc0UyRnRKblZTRGxnRndmYXFiMzF3SlArUFNaUXB5Q3dHTTBQTk1ROUhKZmQvd1N2cU9IdDhQOWZkK3B5bDU4TlpiaXgvZDZ0SEl5bk9EYWtzVDljbW53L0JNYWpCSjUvaVM4alpWd2hqMDFEZ24zTmRZdXFYQ3hObTFmWkp5d0hHUHhwbHpxOXhCRHRXemtKWnVNc01tc1pZL0UzMW5wNkwvQUNORmhxSzJnci9NNCtINEp4V1V1MlB4ZnJpdGdaUmJDUEJQMXJUaitFVVVrUytYNHE4UXJJaHc0Tm5DUTQ3akdLc1A0cnVyUjIvMEoxWmpuSG5VcmVOYnhrSlcza3pqUHpOMS9Tb2xpcTAxck4vaVg3R0VkRkJmY2k3WmZDYlM0SmtsbXZ0Y2tqQ2JSbFlsT2ZYcC9LdEJmQnVnYWRieGhvZFFacy82MXJnSzJUeDZWejlyOFE3cWVIeTJ0VzJFNE9Uamo4cXNMNHJ1THhoODFyR0I5MVhsRzQ0NmQ2eTl0V1N2elMvRWZzNFh0WmZjamQwL3dUNGZnaytYUzdpVFAzdk51Y2xqK1ZUUDRXME9ERWFhT3k3am5jTDVsUEhQQnhYSmFoNGhsczRnL21RcG5rL3Z4Z0Nzcy9FUmZNYVA3VkRsUm5IbVpQOEFPczNWYmQ1U2YzczBqQzBiSkw3a2VxSTJuM00vbU5wY0FPTUtwbGFvNGY3UGhsKzBMcHRwbU1FWUxFL3BYazlyNHhpTi92bDFTR1BjTUl2bVpHZTJmU3FlcC9HVnJBK1dKclZsd1dQT2R2dm1zNXliVjlkelpSYTkxSHRWbHJWbkpNdi9BQkxMR05nUGxZeC9kUDB6VWJhajltYmQ5bnNkbU1nZVRnbm4xelh6anJuN1VWcFpJelJYc0t5S09jRGtjOUt4N3Y4QWJXaHRYaTNTZmFZbDVrSWk1UDBxWllpakRXVHNiUXc5ZVh3cTU5VFgzaWVNeFBIOWxoVlNNYjRvaUdINGlvZEwxdHRIaC9jUEowSk85Zk1ZNTl5YStXYjM5dVhUbXVOMytrU1JzTWhQTDI0K3ByTjFEOXZlMHQzVVE2ZmVHUGQwRTJBUitWY2tzendrZEhNNkk1Ymkvd0NSbjE1SjR2dVpXOHg1SCtib0NCeDlLSi9pRElJbGprdU51NzFPRFh4MWZmOEFCUWl6Q2xZOUx2SGtDNUJhNHhqL0FNZHJLay80S0Z6WVBsNkszeW5BWnBpZjZWbEhOc0RiNHpUK3ljYzdOd1B0aWJ4dmVlU0dTNEhsdWVQbkc2aXZobSsvNEtGNm5KTXJRMk1XMERnRnp4UlV5empMb3UwcW40R3l5WE1IOE5QOFYvbWNYNGYvQUdCYk94MUNlWmxVeFNQNWs5cVpKVEZPL3dEZmI1c2srOWRSWWZzaldFYnF2a2FlVWdPMkFtMjN0Q092eWJpY1kvUGl2b2NPcVhHRjNmTWZsR09hYkhJdGhJeWhwdDJTY2JSeG50WHNReWFoRmNxUE0vdGl0TFU4WDB6OWxlQzRtamtudXZ0RnhHZmxab3lTdkhCN1lyV3VmMlhyYS9MU1RXOXZJc2grNDFyR1Iwd1FRVjcxNnpielJ6VERDekdSaGphSHd6Vlh1clc0VmZNM1NScXVTUTh6ZEs2SGxPSGxwSy96WmwvYXRaYk5mY2VXNlgrejdZK0g3VklVMHU2bWpIeXBzaFVDTGtrNEFIVHJYWmVGL2d6WVcxbzdXK21OWm8zTGhtSzcrUFFtdWoweS91TGFRYmJ1M1dQSHlzR0pJcWU5OGJXVnREdW0xSzBHd1pkaDgyTWZqVzFQTHFFWGFNVVkxTXpyeWRuTGZ6TS9Udmh6YTI1My9aVlptQkpmZHlTT2xUTjhOYmUrRzZPMmFGb3lTa29HNWtPTWZ6OWVLVC9oYm5oMjZzaXgxcXhFZU5wT1FwOStDYVMzK1BIZ3ZUa2pXYnhIYXcrV3UwL3ZWMmdmbnpWU3cxTkpXUnovQUZtbzkyTzhKL0MvVWRHdFl4ZWE1ZmFoTUdPNTJnaFhPVG5HRlVEZ1Ywbi9BQWhxekt5eUxJM2M0QUc0MXhlci90VS9EblFZMW1tOFhXVUt5TnRWbXVGQ25yNysxSTM3WW53NmdaV1R4UmFUWVg1aHUrLzM0NXFmWjA0cTM1LzhPTDJ0U1R1dndPOVBndXlsS21XR1JqSHluQU8zNlU0K0ZvNDc3ZHRZUkt2TVo2dWZYUFd2S2IvOXQzNGYyMXo1eTZ2TlA1WkFNY1l5cWtqdWF4OWUvd0NDaFhndFJJSTRkUWRsSFZaZHJENlZoTDJFZnRKZk5mNW12TGlacEpSay9rLzhqM2FIUXJPQ0dSbHNZeExuNWp2WmR4OWV0WFp0SVdaVlAyU0E5T3JGc0R0WHlUcTMvQlEzU1dGeERaL2IxM2tFTzdHVGFNMWc2QiszUEpEY1hUWHVvMzExQ3d4Rm1IWjVlTTl4MS84QXJWRlRFWVNMdDdTUDNvcUdFeGpWMUIvY3o3Tm1hMzAyMHVXayt5eDdmbUttTmVNZWxWWWZpVjRmRWNjMzlyYVNzVGc0NEFiSTRJeGovT0srVGY4QWg0RnBxUUx0aG51TXI4N3V1QTVIWE9jMXp0MSszaFo2dE84Mm42Ylp2bklZckdqY2Z5Rlp5eCtBV3JxeCs5ZjhFMVdYNDZUc3FjdnVaOWszZng2OE0yU3NyYTlwWTJuSlRaMi9LcUZ4KzB4NE5zaCs3OFFSc3pENXZMdHoxLzc1cjQwdmYyeEZlTldsMG0zVU1PVzh0RnlQcmlzeS93RDJ0L3RGdDVsdmFvSTI0RzBxQWYwckdXYjVldmVWU1AzL0FQQU40NUxqV3Jlemw5eVgrWjl3SisxQjRUa2pWazFDNGRSMUtXalovUEZOaS9haDhMajVXbTFTYnFjcmFrY2ZsWHdYZi90VFhteU1SeVN3cUczN1ZreG5xTVk5S2dsL2FOMWUraStXYTRWV1BHMWpYUFBpRExJcldvdngvd0F6by8xZHg3K3cxOTMrUitndG44Zk5GMWFmYjVXc3VyZHltM0kvT3VtMFRVOURlRnJpRyt1bzVwVXg1VTB4S2puSXdDU0FhL01tUDQrYTFxRjB3OCs5UlY2RnBXRlFhaDhXZGVuUnBQTzFDYm5HRWxiL0FCcmpxY1Y1WXRWTCt2dk9pbndybUZ0djEvUS9VK1BYZEZTMlZwdFpqUWpxQzY4MVRuOGYrRjdkQ1pkY3RGVnVlWkFTMWZsZXZ4UTF3dkdGRjZGa3dNTklUMjU2MCsrOFdhcmNxMjJPUm00eDgyZnJYUExpN0xvdmR2NW1rZUVjZTkzK0IrbDE5OFV2Q2x1ei93REZUV3NTZGdEdXdQZXM2NCtPL2cvVFEyL3hkR3E0eUFzSTcxK2JPbzMvQUlpdkk0emFxc1p5TjVkejB6VmVPVHhGWVNTU1gwM25Sek1QS1FJVjh2MDV6ejlhei8xMHkxUFJ2Ny8rQWJmNm5ZMjE3cjd2K0Nmb3JmOEE3VDNnaUdQYko0cHVwdG9JQUVlQXcvQVZtSisxOTRSMGhzVytvWFREdnREZGZmaXZnV1c1MUprdzBpdzdSOTVuNHB6WGw1RW84eTZDc3k1VUlTMjdIdFdOVGpuQXJ2OEFpYlUrRE1UTHIrQ1B2RnYyMk5GMm55cHJ5UmlTY0NQcCtsVzdiOXR6UTFLcEpEY050NEoySDV2MXI4L1pyelV2N05pdVZiVXA5cHlzVUlLU045YzQ0cld0Tk4xQzZ0RnVJV3VsVmg1akJtNkgwUE9LNWY4QWlJV1gzczBkSCtvZUx0ZTU5elgzN2JuaDN5blpZTHhXM1pJWEgrTll1c2Z0NFdQbHF0dXQ1NWZZSHkrZjByNGl2djdRdFlCUGRTZlpZUyswQ1dVS1gvV2tqMEs1TVcrM2pFbTc1dys3R2NuMXFaY2Y0UkxtcHhYektqd05WdmFiZnlzZmFGdiszd3RtRjh5eE15ODRPVjNWR3Y4QXdVSmgrMGY4Z3Bud01rR1VBRTE4YnZZNmhiS0drMmJUMXkvQy93Q05OdHZEK3BUeWx2dFVXMWw1UlkrZnpybi9BT0lnME9YbXN2eE9qL1VXZDdLLzNuMTdmZnQvU1NJM2xhSEV2Yzc3azgxalgzN2UrcVNuNWJIVFZ3Y2pkSTdGVDdWOHVHMyswZWR0dWttTWY3c3FnM09HQXlRUm5qdlZpSHd4ZHVGY3kvSmpKY3FBRkh2eldIL0VRNktWdFBrdjh6YVBBcmV5KytSOUMzbjdjR3RGbVpVMGhQbE9DZDVQODZ6cC93QnRmeEZKQ3FpK3NvdDJjRklOM0gxeFhpRGVDbXU0NDJhNjJxckZ0NnB3UWV0UzJuZ2xmS2FHTzYrMHN3TEFFNGJIOUt6L0FPSWpVMHJ4aVYvcUxkNnRmZWVyM2Y3V1dzWHdaWmRVZjUreXg0SDhxeVQrMHJmU1J1c2tzMGpjbGNNUjlhNEsxOEFTT2dWcE5oYkkyNU9WOXFyWEhobjdCOHNrMjBIS25BSjh3ZC9wV0V2RXB2M1l4ZXAwUTRFcHIzcFNSNkEvN1NkOVBieWJHbWpLakgzeVJXTHFYN1JXclhoMk5KY2JsVTdVQndUanZuOGF3MzhOV3lST3l0Skh0WGN5dU92MG9YUmcwSW1paWlLN2R4ZVdUR3hlTW5wWG0xZkVpcExlL3dCeDIwdUI2UzdmMTh4WmZqYnFNMzd5NWE2UXUyMGM3em5QZkZKTjhTTGp5dGl0STNtOE14SnlmV29OQjhQd3lQUGNMZXczRnJJVGlRRUdOUGJyMHJSZTFReC9MOWhrSzlkampwMS9Ldk5yY2ZUbHUyZW5SNFVweGQxWXlaUEZWMWN4NFZkM2xnZ0h2K2VLcHllSVpsdCtWbDh3bkdCeUI5YTNJcmVDSm81dnR1bjdIUDhBQ3dLcFZxNWdqZVJtOHVGb1l6bmVQbFZnUit2Yjg2ODMvWGFOU1hMZjcvOEFoanUvMVpVWXAvbGIvTTVVYTlkWE1tM0xEeTFJd3FkYWh1dFF2REV1MVgyNCtVc09BZjhBUHJYUlhHcjJkaGNMSXlXN2lRcU1ZenQ5cXUzdXMyZG1WYVdPSDVzQm9XVGxDZW1Lemx4VTN0Wm1peUZKZGJISExOZHlSa3NzaU5nRE9CZyt0UjNHb1Qyc2JLVm1mSzhFRElQWGsxMXk2elphck11MlZiZnFNQlJrRHArZEpQbzBkeEg1TWQ4bm5NT0djRG9QYi9QU3NaY1NUa3RZL2RjMnA1UFRpOUgrUnhFVnpxSzNaWmNMSDI0SEZGZEpjYWZadElyWGwwTnF0dDJ3Ymh2NDc0b3FYbjlYL24zL0FGOTUxUnltbmI0eTlmZnQ1ZUlyMnllT3hra2htYjVsYk81UTNxZUt4ZFYvYlo4YjMrN2RmVEs2N1F4WEp6WEhTZUE3aExqY0x1R05SbFNzYUREKzQ0elU2ZkRscG9CRzk1THV6a3VvQytaanQwcjdxcDRoWmkrcVhvajRXandUbDhkMWYxTlc0L2E4OGJQTUZqMVM3ajhuNW1PYy9nT2FaY2Z0T2VNTlpsWkpOVDFJcXk4S1hKSnoyNjFERjRMczdmVkMwN3B1QXhzREU1K3Z2VTAvaEMxVzRrbUh6YmpnZlBqSDZqcG11R3Z4eG1rdmVqVXQ4anNwY0paYW5ad1J3L2lEWE5ZOGFheVB0WGlEeEZiREpDUlJUbU5DUm5rNEg4eldwcHMxOUJHcU5mYWhQNWZPK1NUNzMxNHJvbzlJaGppS0tJV1pobGVQdmV2K1RVMHR2L29HMWxoajJya0x1Q2svV3ZOcWNWWmxPL1BWZjMvOEU5Q253L2dZSzBLYSs1SExSVFhNbDlDNVc0THUyd0x1UEh2NlZjL3NnU3dNSlk1Rzh3NUpac2pOZFZZMjl2QU42UlN0SkdtN2R1M2JpZW8vbFduWnBaeUtaU3JMeC9FcDQ5aFhEUGlURlA4QTVlUDd6cmpsR0hpckttdld4NTUvd2pDT2l3SkJHSTR4dStZNUMrK1B4cTdKNEdrdTVZNVkyYVBhd3dZeGpnZjByczdXQ3p2U3pSUXpLcUhEWUJBUHQvOEFxclZtQzI5M0VaSVdrOGlQNVVqVWdFSHZudWE0NjNFRlg0WE83OVVieHkybmE2Zzdlak9DaThPM0ZsZExLQ2dremtEK0UvVVZkdE5BejVra3JNV2tPVGhzTDdERmROWVcwWW1TR08wS2ZQbGtIM216NjVxMWQyNnh5cXNPbnFHRW0wOCtuTzQ1L3BYTFV6cFQ5MlVsZCtadEhMNVExU2Vua2NsTjRXalNRbmI4empJM05qZzBuL0NLUnc0VVErV3l1TWdaUFhvYTcyYTFraldGcExhR1pwK0kySnlDZXc5YVplVzJyUVdyTjlodDFqVnNFN3M0QTZWeDA4OFNYTHpYODlYL0FKR3NzdmJmTnkva2NyRDhPL3RnMktxOU9lRHpUYnI0ZUxwc1BreFdxTkp0MmhGUURQclhWYVZhNnRKSDVpclp4c3hLdGo3NEg4cXNUYVZkWFQvdlptV1JUbktuK3RZeXppU2xwTi8rQXY4QXlOSTRIbVZ1VmY4QWdTL3pPSXNQaHhxVWxwKzhoczROb0k4c3RuanR6VXFlQzc2emlDUncyelBqREVIYUI5SzdxMnNab0N5eVhVYmZhZW04ZGNIdCtKcVM1MFNIUjNmenJtUnBHVWxRU2NmaDJxdjdjbEpYZC91LzRBdnFLVHMrWFR1LytDZWQ2ajRIdkd2VWtqdm80Zkw0bFVya2ZuVnlEd1kxN01zbHJxRUcxdU5wK2JwK05kN2M2UnBzTmtyVDNGcTIwZlBFMHVTK1JucjlLcGFiNGUwb29Qc3MwSUpJQUc3aEQxL1gwcWY3WWxiYVgzZjhNVThDcldUai9YM21HUEQza3h5S3pSK1pnWWZwc3g3ZDgwdDk5b2t0VU5yTkYrNVg5NGRwMnlIb1YvUG11aG10N0cwVHpwR1Z2NGRvR1ErUGVxc211YWRiZWI1U3JjQ1BEeUJmbDhyM09jWi9EMXJpeE9PNTJ1YUQrZjhBdzV2UnduTGRxUytYL0RHR0xhNGx0VisxUEpIS3FmTUlCbmQ5TTFyV2ZobEx0RlZwWmxVZ0VaT0dPZlhGTzB6NGo2TmN5b3Y3eVpaRVBtbllma3dPM2Y2MFgzalczV1cwTnRiM0ErMWNSbHdkcDkrbEpZNmNWeUtML0QvTUpZZFBXK3ZwL3dBQXFud0hETXpHZjdSTXFrNFVuNVd4M3FUL0FJUXVHOW04NWJaOHJuYTU1T0Q2VmN2L0FCZXRuYk0wY0p1SkY1ZUtQSkhYQk9jL1hqMnFUUi9FWnVvWkpWdDhSeGdpSUZHVmlBY2RPdFgvQUdoVWE5NWFMekplSHRMM2VwR1BCVU1kcEVzYXNyZzc4RWo1cWxuOElSM2R5czNuVFc3S05xbFdBejJJNlV6Vi9HU3RCR0lVZSttK1h6RDVYbHh4NE9jQWsvTVFQd3BJdkgwbHJlYkdzbGtWaCs3S2tNUVQwL0k5YVByamxHL1c3Nmk5ZzcvOEFTOThKMmFGV3VKTGk0YUhCNWJKSDRWSlBwa2R2RUdqVjlvVStYRVdQemUyTzFVZFE4YVgxaE51a3RaN2lSaVNER2dKQXpnKzJCVTF0cWR4cUVkd3ppZFptQk1YN3M0S2tmZEJDbnJ3S3psWDUxcUhzWndXMmhVOFQrQ3JYWFIvcEZySE91NEJrZkhHUFRJcWVLMFcwU05JN2VUeTRjSnRVWVJnQlY1ZEc4UVM2TXM5bVk1TGhwQW9nbFVobUhjNUlBd1BybmcwazlwcTJuYXZIOW9qa0M0M1B1aXdGQkhVWU9TT241MGxpbEdQTDMrNDJsVG0zM3Q4dnVJcnE4bWl1MWFPeHRWQ3AxWWs1L0NtMlY0TlJ1SkkzdGJPemhJWldtV0l0bkk3ZysrUHpvMFBVOVZ1YnFhNWt0NDRUYmd4cmhNcXh3Zm01UDhBTE5aM2lMVWJ6VFlKSTVwTFdhNGFJL3VsWERPeHlBQU9NZGp6VXhyMDA5Vy9MY0pVNm5LUDBEUzlSdDlSa1czdFlJNHlCaHdtQXg0NS9uVithNTFpelIvS1JaRWtCRzFsNFBxUHJYT2Fmck92UG9ydzNFMHRuTkZDQ3plVUFoeWVNOWZweFhRVy9peUNIVHBMV0dMN2RmRjlqWFJkMVczN0hLNXdBRzQ5YXpyWWpsMHYvWHFheHc4NTI1a09zVjFPOWhiRFc4RzNPQ1d6dEk5ZWVsTnVmQ0Y5ZjM0WnJvNWtPWDhzcXU0OFZ6ZG5xRWtRS1N4dGNTK1dOajVkRjNFRUZWQTY0NFBQcFdyWlEzeHM0cnVPNVM0KzBXM216aUpTSkxmRGJjQUhIT0JuajFxbzFJcDI1MjM4dGY2c1JLbk5MNFV2dkw2NkZmS3p4eVhra2s2dGxBWmxBeG5JNkNxV3MrSDVyc1NiNzVZSkZHOE5uUHlqMUdLcEczMVNDTzNuZ2FhUzVaaUlrOGhXODA0QUdldWNZUDNoajYxZWJRZkVZdTdXNjFLSlVpa0d4cDVHQ29nQSs0RVVaT2V4eDYwMWpLYWF1d1dEcVd0cGJ2OEE4T09UU2JXOWRvVzFTSm1pUUZzS1NkdmFvZjdNMG02ajJEVWxXTjVDU2RwNUk2OEgvUEZMcEhoSFd0TjFpM3VMaTNsdDVyaDl6UXZ5a2lFNEM1QTRKWEI5Um1ydmkvNGNlSnRjMVMra3RORmEyalFxSUpBd1pUa0RQQjV4Mnp3ZjFwVk1aVHYrN0NPRm5zN1hLOFBoSFMyWHlWdm1raUl5VlJmbEdmYWk1MFhUNUxwVlc3dTEyZ0JTQUJqOGV2OEE5YXB0SzhIZUtyTm9vV3NMV2E4Mm5kOHBCVThZSHBtdHpRL0JtdlFXcXozMXZGYXplWUE4cGp4SEdRVHczSFhIZjB4V2NzUkM3dXlvMGFpUnpWbjRTMG5TL0xTWVRYVGVaMFp1RHdlQWV5LzFyUnZQaHRadlpMczg5bzVodFpXWWZKeURXeGVhTmMyaVc1a3ZHaTNUa0tZSW95amVuM3VlY250NlZ2UTJFMjlwcnFhNWhRQTRrL2RuSkhkdHVjQS96cCswcE5YWlRkVlNzcm5GL3dEQ3ViR3hoalZWMjNGeGtBRTV3QU1lbFJwOEpyVzd2V2syaHZtK2NPcmRoMlBmK2xkVjRpMEs1MGQ5NjNVMGlnWmllQ1ZXV1ZlcEl5dmJISnlCeFVkbUxxVFhMUFRWYTZ2SFpSTTIyUmNnTjdqSFFIc1QwcTQxNlN0Wks0djNxaTNmUTVpOStIMEFOdEhiUWg1SXcyQnRPQ0FjbGoyenlQU3M2ZndYcUVLeTJ2OEFaY2pDNFpaRWsyL2RZWkdBZmZQU3ZTN0tMN0hjM1Z4ZldFZG5Zd1NtTXlTU3NkeEJ3V09UaFYvR3N1ODhaSjRxMStQUy9EUGlMUko1Rm1XUGVreXQ5bnpqcjE1SGZ2eFI3ZUVsYU92ZnFPTVp3Zk5QVDFkdnpPUXYvaC9xRnZhTERkV2F6S3FqZXhmL0FGZlBBQit0RmVyeWZET2JWb0xXOGs4U3hDQm1lR2FLMnQyTWMwaWtqZGtydTkrUUI2Wm9wVTYxTnE4VmY1Q2xmZWNtajUra3Q3RkhXUkMwOGNZODBsVUkyanQxcUc1MUN4VDVaRXZXVnYzaU5HdVNRZXg5T2E3YlRQMmN0VHVyV0c2azE2NHVNN2ZOWU1ubGtnakpBSTduOWNWVVQ0RWFZdXUzRnIvd2trS1hUbkVrYnloWXdNNUE5QWUvV3I5dE9WNUsrbm0vdUw5blRnMUYyKzVhZVp4RW1xYVBwTjRwbVdmY3lBbEN2ejg5RFYrMThRYWJxRUVMZVhEaVVCVkx1RHo3K2xlb3gvQUx3bkRaeUw5cXRaMnVpa2M3QjkyRHlCdHgvUGtWZWkrSFBnM1EvRWx2YXczRmhDWUlTb3RqR0F6QVk1R2ZwMkZSeXFXcjF0ZmRoS29vOWZ1UjVOSnFWamJXZHV6Ulc0aFppaXlFa3JJMmNmTDY4MUphdzIybzVqdUxlR1Nabi9jQ01iL01KNVVEUDRWNmpyUGdyd3hxMm10R3pMSEhiTVpOMFFMYldQVHY2ZmxUWS9oTGIzbWlxWk5TZ25GdTZ0R3NFVEs2SVB1aHVlVzloK2xMM0V2ZXRlL244Z3ZMZU4vNjdIQ3pJTEl3V0pRMnN6SDk4Wkl6c1hweVNQdTFuM0YvcU5oTDV3dFdlTldMQWhmbDJqdHoxeml2VHJyd0IvYWFXcW1hN2l0NW4rem5mRUJHdU9lYzl2clR0TDhCVzhJdnJheGt2L04yK1VXdDFWaE42dDZaNXgrRlI3U2xUV2xsZnlSVXFjNUxXNysvL0k4Mmo4WjZuNTZRdHBsd3ZuUkY5dUZBakFPQ3hQb1A2MVp2Yi94QlBjV3RzMEM3MVVCQXFoU3FFOFk0NTZrOXppdlJ0RitFbDFGb1Z4TjlvdnJxNGgySWpQczh4bGJuQUh0VzE0WStHK29UWHMxMGxwZlNYVnU1emF5eUNVeEtBVGtsUU1FOERIdlNsaUVuMDlTWTRXK2lUZC82c2VPNnREZFcydnlTVFc3U1hGdXFoakN4M01Ed3ZIMTYrMWJXaitIOVV1TENTNXZJbWpnV003bXpuYVQwQi84QXJjMTY3cUhnM1h0STFtMWVPUFEzalZBWllaWlNYVlczRGFPd1lBZTlia0h3ODhRWExTeVdoc2tWMTNiWkFYampYQXhnOERPUVRuM3JDcGlvdzBiL0FET2hZZVU5ZVg3ckhpVmg0Y2U0azJ6dzNFbHJiN2RoRGZkVWp2ejFHS3NYdWpZbWFTTzZ2V2tPUzZmOHM0UWZmSFAxcjJxYjRWK0t0VDAxYnc2bHAwTFJ0NVNQYld6U295ais5azQ5ZVFLMEwvNEs2L3FscEVxNmhEYnRJM3psVTJnUmowWDFwUE1LTnQzNkV4d05aYWNxKzlIem5ZK0I5UWtEUnczeVJ5dkd4MzVMT3A1SXlNWUdlbVJUZFkwdFl0WmlzbTFtYTNtUkFzZ0s3dDduK24vMXEraUxyNEUzMm1MYitYclFZeGtxM3lLaGNEME80OWZwM3JObitFTUduWHJSYWhxVWlOTUZ6NXNnazNOam5CQVBHZlk4VlAxNml0ZGU0TEIxZDIwdnUvVThYdS9oUGE2aXNFTGF0ZE5EREVGa2tZbFhhUm1KSlhIVGpINVZSdmZoZFozbDk1YzJ0NnRJcXJoQXlua0RzTVY5TWFWOEtOSzBuUzQ0cmU2dUpyZUIvTUc2WkI1aWtqQlk0NlZWdnZoYmJ4V016SzBUeHN4OHVMZnVBYzhLTW5qdU0xbERIV2Z1N2VmL0FBeHBWd3IrSnRYOGt2dlBtYTI4QStIL0FBL2NxSnJ6VkxocnFUSVI0OGpQUUFaNmNaclZzdEw4UCtHSElTT2E2YWJkTjVHTTVic1R6WDBSRjhGdkN1dVdrUDJ6VkZXNWd5TmpES1JZemtqSFhKeHhUdFcrQi93OGh0b0YxQWFqY1gxNENNUUlJMm1PUnllRGdEMDk2djY4M28wMzMwWmw5VlMxY3JhYWYwajV0bGx0YkF2cE5ycE0zOW55U0xOY0c0SmJZUVB1b2V2SjR3RGpyVnl3MG15dmJGRS9zVzZESGRJTitXWjFQVThkVkhJd2VsZlJWbDRaOEpwQmlEUjlYOHREZ0VFcklUZ2NZSGZOYVhoTHc5cE9pYUJIZVdHbjNsdXlzM21ibVhmSEhua3VjZjNqMDYxenp6Q1hOeTh2YnNkTWNMQlJ2elB6dGUvNUkrVk5Sc3Bra3VGczlEaDg5ZjhBVXQ1R04veTRYSjl4eFYvL0FJUWJYTmV1NEwrUFNUcDlwSXJMYTIwdUN5bGVDRDduUGZBcjZnZnh0b3VwYXpjUXdXTFQzVmloTTRhNCtaQzNISTIvTGs5cTBMUHhaRFo2VXR2YjZTMXhEY09ETkZGY2xrbVlFZmU0NCs2Ty9XaXBqcW1uS3VYVHlGSEQwSDhUNW1udHFmSXZoN3daNHF1SDNXeTJ0b2k1WHlmczZrS3VjQW5qdlhRUmZDTHhsSmV0ODIyU05sOGt3eHFtQmc3c0Q4dnlyNlI4VzZ0TmMyRExZNk90ak1zeVJXa2h1ZnVPRGxsTVpIemZLV3h6V05ldDRuaVpoTWRzZm1iWmlMWXNFREVnQUVFQWNkZU9LSTE2a3RYcDA2Q2w3S0x0WnUzcWVJYWw4QlBFY21pM0VrMFpqbnVNUEdYMnJodUJqcmovQVBYWFFhYit5dDRoK3lXdDFkejIxcmMycTVWR2JoY2dBZHVlUFhyWHROaDhOTlY4UTJCYTd2N3V5dDdOQkdrM2toYmR1VDhuVG5Qcm52VU41OEZyblhSNWwzcVdwU0pETmp5NUhMaEZBd0c2NEF6ajZEMXJINnczSFNWdjFOWFM1WHBDKzN5WFU4bDFuOWx2VVBEZHRhdEg0b2hqKzB4aWR5a29sMi83SjQrWC9kcXZwZndSdTlIbHV2dEd0ZWMwd3p0VkMyQU1rbFBUcjFIU3ZYTHY0TFdzajI4MGVvMjhqTXcydEpjRGF3SGRpZnlHRFhiSjhDdFFzZkRvaldaTHkzY0VOSEVubSthT0R4NkQzNUhOYVBGVDNjcmtLQzI1RWo1NnQvZytyWFVOcEhxMXhNOStoRHhoQ05vNHlGNzU1NjFwNmorenZKYUxackd1cVRMRTIwSklkdS9xTnhkdW9IQXhYc1ZwNGUwM3daZVNmWXJmK3pyeG4rVzRXMk16b0Z3RGdBREhRZ2RjMTFoK0dXdWE2VHFFR25Yalc5MHBTRXlXcGlqT2NIZGo4TThlcHBmV0trMzdpZGw4eVZHbkJXYlRiOGtsdHQ1bnpiRit6cDl1dVZUYkpGYnVqWmlhUWZPZjlucjNINVZhdmYyVkk5VXQ1dnRndHJHNWlWVWlFWkROTGdBbkp4bk9DZWxmVU9rZnMxZUlOVWdoWCt3amJ6V3hFenZNKzFqNkVqMlBPYzlLdjZ2K3laNGgxNHBQY05wOTNkeDc1WmZzMXlza2hkbEFEWlAzVklBR1BZK3RPTlBFU1RjSXY3dHRTYW1LdzBXb3lsSDcxMi9xeDhpNnA4RUpORzAxclB6YlM1dFRFaGtqMlorVXYxeWZtK1hJNEZSajltMngvdGdMRERNdGxHNDh3ckg4c2p0eHVKOUQxcjZqYjlucnhkYzJFUDhBYWZodG9vSVp3OHJ4M0FsQVJDUFFETEVqT1BTdXgwNzltTFZOZjFkZjdSdlk3ZUdaQTZTeTIyNlNNZnc1VlNNWSt0S3RUcnQ4c0lQOU45NzZmaWFVY1JoNFJkU2RSTFR2NWR0ZjY2SHlSL3dwalM3dlRQcytxV3NMU1hGeGxUYm55NDdZWnhnQWM0NEhKcWhlL0JYUzdYVG9ZclMydkhqanpGTXhYYXpQbnYzeFgxaGJmc3VYeDhHeVhRMWZTTGRaSXlHbGhCSXV0ckVqajE3NE9hdWFaK3pYQ21wMnVuMzExL2FGcnFsdGxyc1RibVo4ZktTQ0JnRGpnZGFxTkRFMDVLTW90ZlA1ZmljOVRIWWFhNWVlOXZLL20vVStXOUErRFdnNkhESmZYa2wxRGUyZjNVSThzUkhIOEkvaXo3ZTlibWhmRDdUL0FCWEMwSTBtejFtNmdpTTNreVNNclFEQnd3eHh3QU9EMXhYMFByZjdEZHJyQ1cxNUJxVm5IZFd6U0FNOXI1MnlWVGhXWEpCR09SazU0TmM1NFUvWkQ4V2FQOFk5UTFXYnhuSXNPckJEY3hXOXN3MlJBOExFd2Y1VHR6eVZKckxseGFsclRmNGY1K3UvWTArczRTVUxxcXI5ZW42TDhQOEFoL0g5UDhDUm90dkhxZHJ1TEFsWlpzdEdDdkFVZSszakh0V3BaZURJZEtzN2xyVkZqdDJrL3dDV281R01rNUdPblN2cFMrL1plc3pva2pXdW9YVWtheXZjVGVhcStlekVnNDI1NUJ3UDFySHNQZ0xEQWtMWEdvM3NEU0tXUXdCRlZjRWJRd09lU0IzOTY2SllQRVFiNTRxeGxITU1NMWFuSi9jKzMzL2dmUDYrQnJ3MmtGekU4UGx0SXhiWUZ6RXFuSUpPT0QzNitsU1MrRHY3YWFOYnkwdDdxT1ZHbVhPZkxuSS92TDBZOGRjZnlyM2x2aEJvdml5K3R0S3ZwTlJWWkdScDNzUU50MDJTY01kdlE5d0QwenpYcGMvd0owZnc1bzg5NHNkczlySkhzUVdiTjV5dTN5NUhJQUE0eW82OCt0YllmQTRpcFQ1NVdUOCt4bGlzMncxS3BaTjY5dTU4VzZ4OFBOSE9vUVA5Z1Eyc213c2trS0w1YkEvTUFQNVZKNG8rRjNoNFhFa2NPbVc4ZWxUU2hIYzcya0FMWk9RZWhQcFgySEw4R3RIMU8zKzJ4dzNIN3hWZDBhSmxreW55L3dBV2RvNTdFWXdLNTd3cjhJTkpzdFh2N3AydDlxelBHdUpFOHNzckZneGNqUFBUdlZVc3ZxVzVYSlg2YjYzSWxtMVA0MG41OUxIeWZmOEFnVHcvSHJjVFEyUDJpeHQ0V1NQeWlwWEpaaGdqSEk2RGprYzFwZUkvREZ2YjM4YmVIZEllL2FCVmhEUldlSmxKWEpCNDZEcG4zcjYwOEx4WGMxN2NUV3VnNlBkZVRFMDhVRDRNc1J4MVU0d1RubkJ4M3FTMThLYVBwdmlTeTFmVU5OVzMxU05pN3pDNGJhUXcya0ZnTytmZkdLNlk1ZjdPSzUzMDdYLzRGOVRDZWFLVGx5eHY1WFgvQUE5dHR6NURnK0FNZnhNOEszbG5xR2l4cTBFUWt2YmE4allJeW5ub2ZjOVRYTytEUDJBTkQ4TzZtYi9SL0J0aGF4dkY1MjYydEZSWWpqaGp3UHpyNzJ2TG01OFArSFpMclQ3YnlaTlFkcE4wSU1vT0Q4ZzJaOU1aSjdBY1ZoM2cxbUdDUzh1UHNmbGFoRThsdzkwZkpralpnQWRwNll3QjI2bWw5UzluRjJtMTVXMk5vNW81MlhJdEd0M3ZiVGIvQUlKOHI2Qit6YnJqS3JMcGx2Rkl5bk1JT0djWis4Qng3ODBWOVBlTi9FdGw0UDBLMWtHbWFzOXhlZkxjVFdzY2traWdINWZteGpHTm96NzBWTXNCZjRKTDUyTS83WTVYNzhYOGxMYjVINXNlTVBDOG53MjFEUzdQekxqV0k5UUFXVStmQ3ZseEJzdmpMcXlrODlzMVkxYjRQK0hkUnU3cTFpdW9YdGdtMUxmeWlXVElYREdRbnJ3QVRudWZXbHVENFMvNFNXMzArVy8xVFZKYjVnOG9XMkRHM1ViZHJzeEkyamtqajByb0xmeFBwVjNydHhwOXZZNnhkZWRidG43REZpVm1HUmdBZmV3RVBCOUs1SlNjZmRUMTA2MjMyUFVqSzhWSnJ2c3I3THk3ZDlVWWMvZ0RSL0RtalcrbWFiZVhHNEl3WlJIKzdUYmpidlk4Z0EraHBzZW4yQThPU1NTei9hZFFWREtERmJBaVRDOHFDZTNQcjJxcjhWUGoxNFYrRlhndTZqMVN4MVM2MVNTSVFReFIyanRJRzV4dUs0Q3RucVAwcWI5bVh4bjRrOGNhaGRXczN3MzhRV09vTEVsNXNOaVZqZU5pV1VIY2NqSzRIU3RhMFhTcHFwSjIrN1V6cHlsWHFOVTFwM3RzN2ZMeTZtcjROOFgrRlpyQ0JZYks4dGRXdDFaWlk3bER0ZENDcEhUSEdlcFBhdGZWTHEwZ1N4czdiUVpHaGxqKzF5WE5oYzhMZ2tBT1dQRGZnZXRSK0F2Q2ZqRHhkOFNyeTE4WmVCYm5SYlZyYVdkR3R0ekFrdDhuQTQrNk1rZFFUeFYveEw0TDhaZUo5YzhOU2FmNFJ4NGVpbGI3Vk5hYWo1TFhDSUNyQ1Rlb0lKd3B3T2MxeFVLYWN1V01kWHBmcGZ5Njl6cHhIdEZIbWxKYkoyMDIyMTNYVFpYMjFzVDZOcThkNWUvWjE4UDNWdmJqZDVqUHVJbUxZeHlmWW5QU3MrTzV1bk8yS3gwelQ3ZTN5cGpMZVl1Q2NoanozNmNkTzllbjZoK3l4OFN0VzFpM3VQaDBtaVhFZHdZMnZYMWZXNUd6RVFvVlUyZ2pjT2NaOWVPOVp1ci9BTE9YeFMxbnhiZWVGdEx0ZkJNTm5idG05bHY1WjJuOHpBYmFzZ1E3VTU0d1FQclc4c0hpSDd5amUvWFg1cnlPYW5pOFBibGxPejdYUzh2STVyUTFtMC9ScnEra2t0TGJVb0dXT05oWmt4OERuNWVjOU9NRG5OWExmeFg0b2cxbVhVcGpwYzl4cUVLZ0tzZXdPdzZzVlhwbmc4NEhGYVdsZnNmL0FCTjhSK083WFFMcngzcEthUXlpNHVJYmJTaWs2Ung3UVVXUS9leDY1QlBXdlhQSGY3RE1ta2FySHFTZUxiM1Q3bUZIYUMxanQxVzJ2SFlrZVd6TVNRcWpCeU9oTlZoOEhpWlI5azE3cjE2ZnFyazRqR1lXRnFuTStiMWQ3ZGJXdWVPYTlhK0lJZkQ4RnRxRU1ObnJ4REw1MGpCVmxWdW0xUjBQWHFmd3JHaDBEeGJxR3QyZHJNeCt6REN2S3NpcWd3UUI3QWZYMEpyNms4RC9BTEtCOFE2ZlozV3JlSUp0UWE0UU9GZ2hqWlljb1VBWEl5U1Jqa25qclhRK0hQMmV2QjU4ZkMxWFZ0U3RWMHUyMkZIVEFtSUJKTEQ3cFlIUElvcDRDdlV1MGxhOW50ditpK1poaU15dzhicVRiZS9WNmVmZG55dmMrQVBFRmhGOWxrdTVKbHVrV05JUmRSaElsQXlTMk9tUFhnVkY0TThIZjhKcjRyTnExK3R2RzZxc3F5U01SRENjQXRnWmJhQm5uSFd2cTN3MzhIUEQ5aHIydjMycVdkMXMxcTNVdERkUytkQzhlNDdNYzdVemtINVFNMTFOcDhNZEs4TCtITFJkSTBUU2Z0bXVSZVRKY0RiNTBjYmNtTG9UZ1lKcldqaFp6VWs1TC9oblk1cTJNb3duRnhUOHRkTlZmeTIvNEI4YzJmZ0sydVk1SjdmVWJGcmV3blczZExpWTdBcGtFU3R2SitiSklQT01ER2FvM2xocE92ZUt0VDA3U3Z0RWQxNFpua2l2L01zM1NNUDBLSXd5SkFTT3FFOFlJcjdxVDRlV3VtNmNmRC85amFUWXd5YldNdHZhcHRENUJKYzR4MnF2UDhLcmR4ZDYwTkZobXVHVVFXMzJkL0pLQk1nU01Wd2UzVTVOWnl5M2FTYjg5MXNhUnppQ1d2WGJiVy9WZks1OHNXSHdMMTdVbzQ3eTIwYS91ZEg4c1N3WEVjRFFNb09DMlk1QUMyTTVCeGcxMHIvQTNXdEtOcnBjbGkycTIweUdRVGk2aWo4dDJHM2FlZDJWd0RqRmZSbWlheGVXOXhiZjJocHY3dVMwTWhuZ2xHM0lHQ3B5TXQxSjU5TTFPL2dUVDliMHVWWTQwaHV2UFNSYnFiNUhWZDJXSUM0NUdNVmY5a3dsYm1scGJiYnArdnJvVC9ia3FkN3dTdDEzM2ZlL1ErUWRMK0NmaWEwOFFSM0ZwbzUwdXlTT2FUeXIrQjdnelNvNEEybUU1Q05ub1Jua2VsZFo0by9aNzF2WExxMnVwZEpoM3NpVFNwRnRqRnNXSE9RWDN0dDRCR00xOUsrS0MybmFyWXgyMGtOMFpEdE54RmtzRk9mNGVnNmN0N1ZwYVhaV2N5cnFFMW5MWTNvZDROMHJEYk92OTgrNXFxZVMwbmRYZTI3MjdhYVdNNm5FRlg0MGtsMjEvRyt1djlJK2ZmRFg3S1dyZUpyUUsxakZwYXlSdkdESmNvN0t4VEFiUEtqSHBuTlZmQ3Y3RGVvYVJvVWxsZTYxZExkd09JNDd1eGVObzNrUHpLQ0NNbklPZnJudFgxZHFWdFlhaEswcXJIZGJXQWdnZ0JVYmh3MlIwTGUvdFhOczlqWVd2Mm0rdGIyTXozR1piTllOc2tycWNLMlIzQXg2Y1YxVnNqb1VrbTI3WDc2Zmh0MzB1emdoeEZpcXVsa3ZMbDEvNFBiV3l2MVBEZE8vNEo5MnVwNnhxMXJyMnBNSTlRUldra2ZaRE5kZ0U0QklPYzV4elhUZjhNYjZPTEEyNjZsUFBINUxSZzRTTlVjTWNCUmpuNjg1R0s5UjF5d0hpcldHdk5Qdm5zMnRZV2lIbVJOTWtiRWdLZVNSa2RnQlVta0c0MXRvOVF1dFM4eWF4blNNd0xHckFTNEc3Y091ZVJ4VzlUQTRPTHRHTjBubzI3LzVXOHREbS90UEYzNTNLMmxtcmRlaXRiL2dJOG8xNzlsWFFyencvcEZycUZ0ZHRlNmZONWdta2NibVlESG1EYXVPL1E5czEwMmxmQVBTZEZpYlViU3hodUpyeVVNeFoyWnJsbStadUIwQTU3ZDY3YlhkQzFDMjFlVFdCY3hmWmZzNjdiZmJ0YnpOeERIMjRJOWMwN3cxcTJuelN4d0w5b2FhRXM3U05HMnlKK29Rbm9PL2J2U1dXMFZOd2tsZTExL1g0aC9hbGQwbE9FbTdQVzMzL3dDUnlldGZDL1M5S3VwbnZQc3NsbHFFNGsrenlJMkk1TVlDZ2NIT2VjbW5hYjhMZkMvaStXU1gvaEg3ZUsza1pyWEFKQ2s1MmtFN3U0N2VsZEtOZTFlN2U1a3Vrc2wwKzhqWjRIWnN6UnN1N2NCeHgyQVBXc3l5OEpSNnRIcDluSExEYXBjQVhHUE5iY1dCeU00T2Nrajh1dE9PSHBYU3BRdmZXelZtdnZ2dnVUSEUxMnIxYWpqYlM2ZC95dHFyV09WbS9aeDhDL0xZdDRhMGY3SGF2c2hkQXpUT3lNU0RrdjhBd25wZ2ZuWG9kalp1Q2tOckRadmF3d2tpS05SSElSajE3WjlLNTdWNzNWcmZ4ZWhnV2JPbUtTNEVaYlp6d2Y4QTZ4clIwMzdScHQ5SmF4TE5mbTdaYmdQS3h3R1lINU1qbm4wN1U2VlNuQ3ByR3p2YmI5ZXV1bXo5UllqMmtvcHVYTnBmVnQyKy93QXZQNUROV3Y0YklyYjJGckhjWFRSYmpBeFR6eXBPQzJPdlRQNVZwM0d0WFZucHRuQUlJWkxlTk1FSWo0ai9BQUhVZ1o0L2xXQmZwWTJkL1ozdHZick40aWxkaHN0Z0dhTUFrWTNIb01ZT09sYlYvd0NLWk5JMDZOR3RMNjRsZVFMUEVyRE1XU2N0Z2ZuWFZLVGpKcDN1N2R2TDBzY2pYTWtyWHQ4dm5yK0EyK2psbVp0VllSMjhESVVDSGtrRTl3ZWVQU3JIaDNRN2ZiSnFEZVNMcFF4WnBQbDh4QmdnSEhIWElxdjRxRWwvb0V6ZVNyQ0RMVzhiZkxNekp5b1laNUpQZjg2cDZUNHExVFVOTHZFMURUWXkwaFNBN01CcmZPZnZBRHBram1oVGpHVGxQZC9QWCtrT1VaenAyWFRUMFg2LzFZdjI5amQrSVlGMUtOdnNVYVBsd0hCallZNUFGVTdPOVhTM1N3dXJ5K3Q3eStrekJjb3BZQmo2bkJ3ZnJ4VnVUU2RRcy9EL0FKbXBXeStXdytaSVppRlk5UHVnWjZZcDhHajZscTNoTzFhM21oamhDaHhHRzI3RXhsUUNlY2pqdldWUG5UdFRUYjBkdGRkTC93Qk5DNW90V2NvMnZaUHQ4K3Y1R1JMNGJzYlNPUm80WnJueVFJOTdJL01tVHV4ampPTWUxYTJwYVhicnA3V3NaV0hjb2UyTTBiQXJqczN0eWVoNzFsZUd2M3VtTjUwZitsTkp6SDVqQWhsNUI5QjIrdGFWMXFGM2NYa2NNTTlyZVhFTHFrOFc3NWhHY0U0QS9MTlowNmptcjJYYlZldmUzNm0xWk5UMzJ2MS9ycVVkSWtzWDB0bzdWcnExdDFnZFpkOEx5TEk1SU9VWWp1ZDN2ZzFrYVo0NWhzTEZyYlRWWlliTWJBeVNicEJucVMzUCtSWFhhVkplYUI0cW5oVlk0YmU0Y3l0Ym9BZHBQVG51TWRhcDNFc2RuSzZOYTJ0NVBlTis3bmFCQmhDYzg0QU9GNTY1elhTNFUyb3l2eXlWMXQ4KzkxL1hrWjA2anU0eVhNbnF0ZjhBZ2EyWHI1SEwrTmZGZXVhZjRiaDF5Rytra3QxY1IzRWR0YUk3ZVdXQ2pjSEE0NTZqRldkQjAyeThVWGswY1AyaVcxRGhTZGdpZVNUYm5ianVPVFNlRVYxRFR0RjFpejFMV0xYVkp0U2thRzNXMGo4c0tDY3FDRzdMa2MxclhYaDF2aFQ0US90T1M5Z2poc1FmT2tqVC9WaGo4MkFPcEdPM1hOWndqVmFVN2N5Vy9rNzIrZW1wdTUwNFhqSDNXOUY1OVZmVGRQVFF4MCtIbDFJTFM4M1hHang2ZklUSGFzQnRaUWNZSkJQWDF6M3JMMTJTSFJibDlNTW4yYSsxQXE2dWtxeVI1M04xL3dCbytnNTVGWDRmRnIrTmRGMG55V2E2czJZR2N5UmZlNU9Cay9kNTY5cXgyOE8vMjM0ayt5M2tEUTNDK1k5dGNlUmdYRW9HUWR3SDVZNzFuTnBhSmY4QUJ2MjZKLzVGeHFPN2NyWFhaZHR2bDNPbVB4THNmQ2Z3cWVDN3ZIbnVtRFczbFlWSkhsemtCVlB6TjlQVE5lZStJOWQwblRkS3RKRjBYVUxpMzFSOFJyS2gzWk9DK1dVSEcwalBQUE5laTZONExzREhwc0owOWJYVmJkSkxuYTcrWTEyYzdUeTJXVWpPZUQ2OXFwNjlxOW5yVjYxbXNkNGZzUzdoYXdqWVpBVGpBSlBEZlRuak5UV1hQQ0xsTFJLMFZiWDAxVyt1dm5heHBnNWV6bExsVDFiYjEwMTA2ZWRyRmo0Y1djT3BlZmEyc2JXOWg1SWtqbG5rYUZndk9RUTN6Ymg2a1l4V2RlK0daZEx2cE5Ia3VKcnJSek9KdzhJRCtka2hqZzlNQTR6V3JyM2gxTGJ3YmYzVm5IcUZ1SXBGOG8zV1ZiRzBaRE4xeDFCejdWejl2NGcxQ1BTOFF3NnBxRjFiTHZGdEdSOTA4TVZ5UmxRUHhOYlNiU1ZPMW5lKys2dTlQbVRUYW0zVXZwYTFtdG5wcmY4QURheFMxVHg1cGVrYXJzaFZyalZKdkxrZ3N3cGlrbGh3ZDJTeENqSHAzSGF1YTFqWFdrK0k4ZjhBYTZ4V2VtNjdhNUVVNUJodDNVN1ZBZFNRZk01NDQ1QXJzdkJtamFkNG1TVFVMNks0VmhFc1RTU1NJaENuT0ZBSFg2aXJYalQ0Wlc5N3JPbDJ0NzVNK2p4MisvY0UyaU1xeEt4aHUzT09wN21zK1NUcHUxbGZSdno5TG0zdG9RcWFOM1gvQUFIb1IyT2kyc21selhWdTE4TGlTUUJpRlp0NEhRWTZBRHNSMW9xajRaaDFMUS9EclcxM05EQ3NrOGpTVzhTZVo1Y1FJRVdHSjl1VDBvcVhpOUVtdFV1MXZ6T3FOQ3E3dU10TC93QmJLMy9BUEx0TS9aRjhJK0N0R2t0TGZ3dnA5ODkzT3QxUHFMWjhrNU9WaUVqa3QxL2hBd1NSVlR3ejhPYlB3aDRpdGI3VGRCanRyRnBKNGxsVmxPektzcEtoUmxzNGJQYzE2SjRqamw4VzZwRGEzV3BObkxYa0VyS0lqYmtIQ0ZsNEpJSkh5NEo2MVNmd3RxR2syaXRkNnBEcUZ2Y1hKbHRudG1DeUdWaHRiNVJ5VjZ0NlZOV05LT25lejEyMDdYNjZsUnhWU1ZwUGZYYnpXM24vQUpHVHBIdzVheDFHM2h0YmZUcHBKN2cza2tja0dQSVVqYUR0N3NPVHlSM3JiMXZSN2I0YU5KcUV6VDZwZEZENTBDdUVXUUhCQ2JWem5QTzBmWHJVMnBhTkxxR3RSeldyTmRhVTBHeHBUY2dMSVdYN3V6cnU3YzFIb0h3a2hiVXZ0dXNYRjFaMlVVWlhUMlU3bFhHUVE2am51TU4yN1YwU2pHeWJXMjZ2L1hYL0FDT1ZWcWtvTlJkbDBlL1RUdnJicDZzMlBESGl1MDhRNlUxdlphYkphUzZnUXZrcWdSclJoOHlnWk80OU1rZ2lxY25oTFE5VGhraDFDem1NdHVFTFF6S1pWVTVibG4vaHlPdGJtbStGTk5zdkNscXVqMzFxMDF2RzBzVUlWeExPdTdHQ1c1QUhKSlBRZTFjdjRvK0llb2ZEdWUxdi9FMmxUZjJmcUNNVWhzMjh6ekdZRUtIR1R1QkpHUU9tQldrYVB0RkcxbFo5T2k3NlA4MzVHUDFybGNsZHZ2ZnExNnJYOHlsNFcrSFk4RzZkdTBYVDdPelczbUYzY1FXcmwxdWtUUGxZSkEyZ1pQVE5kWDRVOFUyYitKNUx1NHVMaTAxRFVJb2hkd05sbUtMd29QSEhYN3g2OUs4eThkZnRLYVA0M3VsaDAvVC9BQkZvOXhwWTNYei9BTm55VzhTNUlEYldZWWJhZTFkdjhOL0JHcjJWM1p4NjlyLzJxNjFheXpiYm9oR2JncXpGV0pBSXdWSUh0MXFaNFdhcHB4Zk0xOG41ZjhHNXI3YVBOKzhYS24vWDQyMHRjMmJyVDdPdzhlYnBMdGJmekdQbHhDWjVCSXg2WkFIeWpHUm5PT09sVGYyVk5jYTVhNnJxbHd0eG85cjUxcExENVpLNExMdE9EM0FIWEZUL0FCQ1QvaFd2aGkwVzN2bW51M3VWWHovTDg1TFpEbnJ0SEozWS9Tc2JVUEIrdWF2NGpzcjY1MUpia1BGNTAwVHlLRjh0Z1FoMkVqblBQRmMzTkdGNHdXcVY5RTdiN2YwaVZLVTdTaTlIZFhkdnZTMytkenJkRW0wL3hINGYrenlRdzZmcCtuci9BS0c1Qk1aWWZMaHRvR01jY0ROU2VGZkNjV3BXVWQ5ZjZiSEhHcFpqT0ZabW5ma2ZJdkpQQTY4WUJPZWxZbXF3NmpvMzJxYWE4V0ZwSWZPdHJlS1VHT1BIOFJ4bkRIZ2ZsVUhoUDRnNmhmM1NhUFAvQUdqNWFJN3ZmckNXK3pxVkpZa2ZVbGM0NzFWUE1LYWJqVWpaL24xU2QvOEFnR1VxTTJyMHBhYjlkUFMzZjUraDFtdnc2UHFlblJYRm10OWIyOFZ1eGpTV0F4b2NMd1BteG5IcDJyTStIK2xXV3U2ZkZQaG9sczRqS0xoWDNORzdZRGNZR051T25vYXdmQldpSFF0WVhTMjFIKzBOUHZ0MG1udTgyeU4xR01aQjlRVGoxcloxenhzeDF1ZXhiVDdxOXVtaFMzK3pTSUJBaUU4a25wakE3MWJsQnk5bzB1Mi81ZnBhNW5DbFVTOW5HVGIzOC94L0c1dVdON0hhZUdtc2wxSjVyeTFrTXpMQUIrOGp5TUI5eEpiUFhJNUhGUTJ1bng2VHFkMTRoVzh1a2tsalBrMjhrWmtXSk9jTWNNT0RrbkJIUEh0VGREOEVhTHBmaUlYV25LdGlsNndhYUVKKzZsRzNid2ZiSGIwclE4WTZucG1obTEwMjMwZlVMbVo1QkRtT1JVRU1mSkJMTVFBRGpnZTFQbW5KYytsb3J1OSsrbjlNeGs0cVhzNHArOXE5RnQxdmZRbytITDRYY2N6YXRxRUYxSkNqeVF5TkFCKzcvd0JvYmpqcVB5TldMYTJ1dkcyak5xME1kcmV3cXJSeE5Bbm1iR0J3U2c0Qkp4MTlxMEwvQUViVDlKMGRua1dUVUxpWk1FN3c3b29HU04zVGtmblEwdHhvV2tXMDFySC9BR1dZVzNzdm1BUnpKbkl5dlhKOVJSYlYrMjZhMlhuM2IwMDdhZXBMcWMxblQzMlY5RnRyYTJ1cjhtWk9uWExwZUxGSkd0cnFFYzNtUnh5QS9LcXFSc1p1blBCd01jbXEycWVKcmZYTFZiVmRRaU1sdXhWL0pJWmxZOUJqRzVXL0hwVVhqenhIWitMTmZnaHQwdFpmTVQvU2tsbjJyTXpFREhIemRBYzFvZURrdk5CaHZMZlROSzArYTBTNFlPa0I4eGQzY2J1b1BzYVViVGI1SjZKMjArKzl0TzNSOURTcDdxVTVMVjYyYldqMmEvSFM0N3c5clV6WGhXSzV0WUxDMUtxZlBoSUFLazdodTNkeVJ6aXVncy9GK25hSmY3YmpVWS9LdkcrMFpTUGZFZys2RjNIcGtnbXNuVTdXSFVkTXZyVzF0cnhvK3NyeHNvamlMY0ZNSHY3aXVLOGNlRi8rRVQxZlQxVzgxU2FHM2pFSWdtVVRCaVNjREFCQkhKNjlLdFlpclJwcXBwS09tdXZYMHQyczBSN0NuaUpPS3VtK25YU3p2c2VvUTZqRHI0YVBTZkphMWprQmtkSndxemUzQTdWZjFEU3JQVklwSTQ3ZXpqbTh3Z0dNNFVrNEIzRURnbnArVmVNK0gvaGY0bjByUzVyb0tkT3RibVBaNUJHSkp1UVJrRG9CakhyelhVWE9tYXZickZNR2thenZvRlMzVzN4Sk5DN1orWjhuN29PM3AzRkpZN2RUaTdPemFhKzdwZGYxdVl5d01kSFRxTFRzOWI2WHZyWnZ5T2k4U1c5bm9Obkw5bFpKcDdhWU83UEp0VWR0bzZqajA2azFxZUdUSkJmWFRlWmVOcDByK1p1bXR4RmoxNUs1YnAxcnozVmRHKzBhaDlpdW85U2gxQ1NJSkdwa3pBN0Q1aVhISUI2bnJYUitCdFF1TGZRQkJKcTF1K241ZUtZeWd5VEpNRGhsSkI0eGpvYTZNTmlKS3M3cmwwVnJiS3pmdXlXbWo2dmNXSW9KMGRKY3p2MTY3YXExK3p0WTJkZXRqZGFuZEcxanNyeUl3RndwZkxGQUIwWEhjak5jNXBtcE5OWkxyR2htUDdQYXlHRGRLbmxxQnY4QW03WkhVKzFaV2xhbHFBa20wLzdSY1Fyc1l4WG5sQmhNR3puYU85TnV2RkZ2OExmRDFuSmN2Y1gybXMzMmZ5eGJ0SXpTTVRqNVY2NE9EazhBQ3VHcGprNm50WSs3dnJ2WjZXYTZwTHpPaW5nNXFQcy9pZWxsWjZxMnZ6YU5LRCszdkYvaURVYlcxdUpiYTFzWlJOY1NlV0NiemRrZ0syNEVxQmtZQTlLNlpmRGRyNFUwNVptTjNkWEJqTE1JNDk2dzVIM3NlMzFyei9WL0UyaStFZkRVT3MyZDVMSmRPb1dVSkVUOS9uQko1QUI2ZWxhV2c2eHBrbW9hYnFBMVM0dFRPRkFNY3AyeXNNN3R4NkFIT0Judld1SHhsUDJ1cTVwYVdrNVhTMTZMYSszcjh4VmNQVnRhL0t1M0xadTI5K3R2TXpmRy93QVQ5QzhEV2RoY1hjTThjNy9ORzV0bWozbGM5dWhCNHp6WFNXRjdyRVhoNXI2eld4dUxlNmg4OUhsc2pETkh2NUNsY2s0QTc1elZuNGphSGNlSW80WkliMVZMRUJZM3hJcTVJNC9IK3RWOVp1Ym5WSlRaV2plVEpFNkNVU0RaNWdIQi9YRlhVcUtFcHg1Yk51eTJUZW5xN2Yxc1pyOTVHTCs5UFZMOEYva1ZmR0hoblVyVkxHSytXNXZqTklza2swY1o4cTNPZW1laEhPY25waXRYeGxxT2t5WGYyVzh1UkRHc0IzVE5GNmNnN3M5T0t0YWxlWEhoNUd0N2gybnM1ZmxRR1FxU1Q5UHlyaS9GSGdDTzBqdkk3N1UyMUsydUlSbXlFZ1VvN2s5dW1PbmZ0UldsQ0VyMEk2YVh1OVZiNTNzOWRsOXhXSHZWUzlwTGEvTFpiM3R0cDA4OURTMVB4YkZxZGhEWjN0M05IcG9Ld3hUZktwazNEaGw0NXg2VmV0TEhUL0JMMjFoSmJ6WDBOcW9OdVdYYXFBREFJNjlxNXVmd1NMM1NKTFR5Tk5XM3RJbDhxM3VaZkxUSVhJZFQyUE9QcVRWWHdCZGE5NFpuMUN4bW1rdUxXVlJKQjlxL2VMYUlPa2F0MXdBZXZmaXVQNjQvYU55bDZOcnRwYjh2T3h2T2luQktuODByTGZyZGFuWGFxc2VvYTM5aTNMSGEzZHY1d1NVZ2lkeG5iOC9YSXg5YTUzeFZvbDhtbnRObzBtbDZkcTBKRWNwbWdiem5qWDVncWNqYVNTZVNEbXVtcy9FTm40bzFPK2tXZU9TRzFpRnZGTGIyNUNSeUVFa2trWjR5UGJtcVd0M00yajNsbmVwZHBmVy9rbGJ0Wlc4dllkdnl0R3hISkhjVjFjc0trWkpOV3U5VzdXL1ByK1poU25Lbk5KcnRwYmQvUDhiblBhLzRvMDlkWTBkbzljbFh4SkN4a2x0R0FNUTJxUWR5NUJYZHh6eWE1bnhjMTU0dzFBUjI4MDYzam9IdTRsdXpFelJrakxLTTR3T2VEMk5kTDRaMU45VDF5ODBtUFIydDlRbWd6L2JqbU9jc3VjQUJldkFJN1k5NnVhaHBqYUJZVzJsM2wxWjNOekhDMG9FcWVTYnNnQUVsT09tUndQVTF4VkpPcEdOV0xYSWxzcjcyM2ZXL1ZuYkRraExrdDczZlRhL1MybHUydm1UU3dEd2w0TysyVzlySTE5QkF5N3lGRWpvUmdMMEhJSFBQV29MT0E2ekRieVgxNWRXYzhsa0x1MDB4SWdKbUlVQWxteVFUOHdPRG5CTlhiWlk0dkRqV3VyNmpGTjU2NE8yTVc2THRBenRIcDBBL090M3crZEUxZUZaTDJPMWoreUR5YlZBeDh4OGYzU2NaSngycm93OFpPYXBwcmw2WGRrdm5mdDk1aFVxY3ROemtuZTd1MHZ1dGZ6djZMcWNqNEU4R0xmYXJNc2QvY0paeWxYVmJ2NVpQbTVZaHU1L0QwcmEwdlR2N2QxVlpyRzlYVkVWdGdFYkJGdGNjTWhIUHpER1NlS3h2RmRoY3BmWGxzSVp0SjBUV0dXRkpwUDNiUVM4aFNEbk9PUjByQjhIK0hXK0dIaTI4MGpRN20zWFViaERKUGZ5U2lUN1NjZE8vT01kY0dzNDh1a0pKdTNWZWVxc241YTN0OXhwVXZOT3BHU1RhMmZ5MXV1dDlMWC9NMU5WOFA2aC9aK3NhcERaMkw2bFp6RUxJOStTcUU5Q1d3U3YxQXp6Vm1iUXRQOE1SdzZ4Y05lV1Y5ZVJKREJFQzBxZWFlU09uSU9UZzRIYXR6d2gvWThZYmFmT252ajVjaGgzRW1WL3Vsc0E0d1JqSjZackx0UHM5ajRjMVNIWDRyYTZ2Tk5kbzdacExndjViL2REZHZteWVudFNvdW5HS2JhdEs5NVBvMHZKZFY4OURTVlNjcE9DdjAwdHEwL0p2Wk5maVc5WThFNmxwU3RyREszbHd4cG0wbitlRWtBbHBDQ1J5TTlmYnBXQWJaZkNyM0dvUWZ2TkptMitiUE5IdVB6QUhiRkdPb0JQVUhIdFR2RU0rcjZ2cmVnMmx6cTBqUnh3R0M3S1lVT3dZajduOTdCK21LN3J4WjRwZ1lhYjlrdDBObllUSkc4aCsvdTZEYUIyOStsYnVOR3FuVWkybEd5U2VyZXV0cmZqOGpLTXExSktubythOTdhV3R0ZS9WOVAxT0pzNW9FYXpudHRKWnRQWVlGMjhZUlJ6OHZ5N2Z2QVlybjc3eExkV1dqM2xqWlNTUlR6WDdMTWs1YWJ6bFpRVHQ2TG5rSEE2ZEsydFoxbUh4WHEybzZMQjlzMDI4dUZra2d0a0dIaytiL1hiemdZT1R4MDZWbTJmaDdXNC9DY0VKWGU0ZGJNdzNFQVl5WmR0eEpCeUR0SStZZHVsWVNpcFZVbEsxdkxUcGU3dHArZXAyUmw3dXFYVHJyMXQvdzYwMDBNM1J0SnU3dnh6SmVYaTN3dGJxeWpSWm81QUduSy93R0U4ZkxnSGR1L0RqTkZkZDRwMWJTdkIvaGl4MURVSXROdFlvSXhETDVHU0VmT01BOU1mV2l0cU1La282V2ZuWnJ6L1VQckQzamRlV25UVHMreGxONE0xcXl1cEgwdXhtczF0VWV6bXZycFlyaHhDb1hhRlVrbm5xV0s1cXpvM2hLTnliR1MydGJGcnpaYlIzTGhYZVo4Wkw1SEtBWTRVWTkrdFlQaXkzMW40YlcxM2Z5Vzl1Vm1jMzFvOXBNeHVwbmt3R1VyamE0QUl3U2VuYWlYd0gvd0FJbjRIZSsxblY3eGJtU2NYREovY3l3WXFIR01xVk9NRTFOSEVjMzcyS3Z5OUhwYlRYVzF0K2xyOVVLTk51S2h6NlM2cnYyc205dGRlaHl1dWZEL1Z2aHI4VEZ1SWRZWFI0VmtWYm04dUZFa0dvUnBqYnRqNVZRUzNKQUI0cnZKclR4TS94R2JVbzdiUzd2UzlxU1FTT3hNYzBPQjU0VWNESnlOdkdlbFVmaUo0RWcrSVMzMXJxRGYyZmJOYWxqcDg3K1NVQStiem81T2NxM0hBNEdLaCtIZmhyVVBEbGxlYXhNMDJvV2Q0SVp6NXl2Slo2RkhHckY5bWNiOGpIb0J0ck92aUpLV3FhazlkT2lWdTZiZjNYWG9PRkpLbkYzWHVyNzI5T2pWdFBPMjlyczBJYjdSL2lEcTBscnJVVnMxanBHKzB1THVNT0hnWjh1TnB6a2NNQVNEMEZhM2liVU5KOFN4Nk5wZG5mWE40TGk0OGlPV2RaWTQxUWRkaktPRGdENWlmeHB1aitJb2ZFbmg5dFNXT2JSVnZvdjNjVXVtblpQRVNWV1NSVHdOM1VFSG9Sak5WZmgxNHJmVk5HMXJTdEIxQnJpNGdPWXR3Q2VWS3k3UkZ5Y2hkeWtqcWVPbGR0S3BLTkZ2RWU4NWJQK25iYnVqanJSVXBmdTlPVzJqNzllbmZ6OGlqOFRGWFdkRnV0SDFUUng5dXVicFprRU4ySTJaWTl4WW5zVlhqSVBVa1Z2M1VTM1B3dHNmN0h1TGdhcGFCa3QvT2pqK1ZpQ1NtOGc1SDA0cm52Rk9pVy9oM3hUNFgxWmRTYSs4VGFsTTBNdHVVOHlGRHNQbk50em5idTI5OFpJcTM0MThPV1gvQ1l5ZUgxdTVrMDIvQ3lYRnE4aFZvNWg4MkF4T0VIUTdlK0t4bDljbkI4dG5HM3EwbTdxL1M2ODcyTkl4bys3RjczODdPeXMxcjA3V3NkWFphNitnYUphNmZyZG5iMjhPcUJFWm1qTXNzc3ZBUEhUYjdpcXZoclRMZnhONHQxYTgwNjVqL2NySEY1TEE3WUZ5RHNJYmtad0R4Z2ZXbzdYVElmQ1BqajdjMnNhaHJXa3kyUXRvSXBMY3lyWnpqWmpEOUJsUWFicUYzSDRjOEhOREpIZWF2UERjRnI3VXZORVJsbElLTHYyZzd3b1ljWnFZem5HOUtwTmU0OU90MHRlbW5Wc3psdnpRV3NyZE5MdDluMXNyYjlWWTB2aXA0b3M3RHdkY2FocGw1RERmV08yT09DR0NNaWRpY0tzdVZ4Nm41VDJxSHduNHYwZS84QURlb1gycTI5L3B0NUMwVnZjU1J5U1J0Y3ZsY0VLaHdGTEVEdHdlZUt0ZUh2QUszSGhwVy9zNnoxQ09HNTgwU3h5aDEzcmpHTWVoem5OTzhYMldwYXhjcERiWEZ2YnMwYUdXT0dJYmJ3Wis3blB5NDlSbnBYWFdyY3Y3MnJUU2VtNmZacTZ2cDkzL0Q4MGFkUG1kS01tMWZkTksycTlmeC80YkF1L0dFM2pIUjdvTkRiNlRjMjdlWEM5dEVKcExkUS9CWmNZWGNBRDh1ZU90YWRubzFucXV0NmhhdGVSV2VvWE1Qa3d5WENySTBLbFFTT3k1SkdjOWF0ZkQ3d3JwL2hueExldGNYVnZJcVFoNTdaV1VQYmtuQURjZ0h2MXJ5dlFmRW1tK0d2akhKb0d1YUxmWDFqb2x1K3BXT3BUZ1N6YWhBVUxMaGY0Z3B5TWpQSXJHblRjZlp5cThzdGRVditEMzJiOGplVXFjNHpoU3V0THIxMy9UOGZVN2Z4UDRVOFJhYm8yajJ0NWVSMituNmZOL3BKczBBZTlIM2NNNXlWVWtnL0xnNTRyVTBid2NkTjhPeWFmclZ4Y3k2ZktSTkpLMXorOFJGSlpWeUJuQTNZNjVQZk5UZkNxOHZkZTBOMy93Qkpqc2J5V1dXU09kZk1qd1R1VXFUOTBZQUhIQU5iZml5My90dUd6OHlUeTdPOG1FQ1dkdW9UejNVNStkdXJEZzVHS3FOTlA0VTlORXJkOU5YZlZXYVczeU1aMUhHYmhkWHZ2cjYvZmUvVzJpMlBQMnVZVnZyNXBqY3g2SU5zdHNiVzVaUTRDbmRESU1nY2dEbkJPTTgxUlh4VjRwK0lKamJ3L1oybDVIRkJzdDRuaytabERBRUNRakhDNTZrNXhYcVhoejRaUk45c2ZWdEowNmFhVXNZb0l3QkVtQmphM3VUM3dTTTFvYWxCZCtDZkRuMmZUV2poZFVMbU1JcXd3anJoUU1jWjQ2YzA0NWFwMHJZcE5RdnNyMzBlMXRFdXJXcjcyRCswcWFxMnBwT2V5YmVsMnQ3clYyK1I1cnJYd01zcmU2dUx1OEdzUjZ0OW5qU1B5NThRNTNidWkrL1VrZHF6N1A0b1cvdy84US8yTFk2dFp4cmVTdk5NbDBOcGtreUJqZDBVam5wWHFHbVR0Sm9pNmhyRXNNY2Q5YmJXM1JNbjd3Y1p6L0NPb3gzNjE1VVBCc1BpL3dBZFdtcFhIaHc2bFoyVVpIMmtydmppa0pJMmhPcEdNa2tkT0s0T1hEWWVVYU1HNHFWN1crSlJlcXZibzcrbGphbFVxVmxOMUVueTczV2pmbGUydW1tdTlqMGZ3SDRqL3RRWFZyYi9BR2ljTklDczBzYUdEZWVySzNVZ2U5WjhQdzExYWJ4eEpjMzhzMXhwOFRDVlFrNFF6UDJDQmNIYndNN3ZVMXlQaUh4VmFKNGJrMFc5dnJyUjQ5U2xhTFRJa2k4bFZIR0Yyc0ZiR2M1SVBQclhkZUY5RGJ3UDRDV0d6dkpyN1VMUkR0OHhRelQ1T2NEazRHVGp2MHJ1d3YxZXJoVkN0N3pYWjJWdlRXL3BmL0k0NXpxVTZzblJYS3BhYXJXL3JwWXpkUytOMnFlSDlmbS90alMvc3RyWlF5TkdOMjhNUjB6alBKSHZXMTRWK0pzR3VlRzAxWW1OYlA1azhtQlR2Vmw1YnFOM1QwOUs4cjhRZVBkWWsxQTZMcW1reUhVTDZReVFXOGR6bHRuVWpidEdlbWZwWFZlR0xLNDhEeVNYMXhxV2kyRUl1dkxFZHo4eGFBeHJ6eWZsZmVXSEE1QzF6eXgySjVwU3FOcUwxVGVsdGx0cGZ5MlRPbXBsK0hWT3l0emJXV3QvTlBwOXpaMm1uWHZoMzRnK0cvN1R1STU0cEZtQllPN295djBBNEl6d2ZwV0RvbndzMDNTdkhPcWFocE9vL1pKTHBsdUowQ2t4aGg3Tjh1VGs1SjVyVTBqeFJINHR1NGJleHRZNW80VWtacENnRUlZZDFVY25yaW02dDRJbDFLVnBOcXh0Y2ZNOFljd21RanFBcHpqSngrRmFWcTA4VlJWU25HTXZoVjBwSzl0YnV6M3UxK1p5VTR1aE54bkp4dnNuWjJYby9LNVg4UGE3cXVxZUtEY1hHbHgvWlk0V3d6b2l1RUdlUVV5T2FwZUVkT3Z0YThjNjg4Tm0wOWpidHVna3VYTzF5eWhnRjU3Y2oyNDYxZFhRYnB2QkxYRDZrYlNlMWdmL0FFVzNtMndoc0VnYnNIbjNySStGbW82bHBSRmpyV3NRM2t0MHBNS0lQS2w2WTVHU1d3Q0tLZHZhd2xpcnU3YnZvM3FyYjY2ZXByS1Y0UzlsWk5KSzJ1eWY1K21obGVGZEIxYlZidTh1cmkxdDdpYTNuV0pyZFpRSW9zWitZNEh6RStocnZOTXZOSjFqeFZEYTNGamIyN0xFY0xMRjhwYnVCL0NQV3N5ejhOYWw4TjF1cHByNzdYWmZ1NHJTM3Q3TGJ0WThsbk9UdllqYjh4SHJWSzUwald0VDhaNlpQSm81TWMyVmVjM0g3dFJqSnlnQXg2OWFJVTV3cktuR0Q2WFQ2NitYOU1pcFVWU0xtNUsydG1tMXZ2bzl6dkk3YVBTOUthTmJTMWFTYVFzRXlTcFVkem52eDJyei9YL0VtcTJtcXRhVFdjOGNYaUM0RVZ0SkRHR2pad3BiYVh3ZHZ5b1NPMmVPSzF0TDBUeWJpOXUyVlZqaWNnTk9XdzNCSkFHVDh2UFhpcXR4NGRodjlIamswNmE3MDJUekZLVzZ6aDRRNTc1emtER2VnclNwaUpOS3JUamF5c3JPemExV3VpOC8rQ0dIb3doSnFidmUyclQwZS9mMDZmY2Flc1dtdTI5aGJ4VzlqSGNhamNBYnA1VkVzWVVIbmNwK1ZTUWY0YXJhWHA5NWVYVjVQY1c5bkNzSWFLZERiaFlwc0RJd1Judlc1cnVxeVdmaFZ0MGpmYXJVZ01JV0xCaDllMlFlOVl2aWJWYnU5MFMzaWpoajBpTi9uS2w5N3k3ampKNEhKOTg4NHJucTJqelRrMjdXYVQ3N2E2SlhXdDd2WHNUaDV6bkZRU1N1MnIvOE8yN2RyTDVtUDRaK0oraitQOVprWFRZWW11TFdUeXI2TzZURWNFYWpHVTc0M1k2K3RkSEZFdmlxSzl1UE50YmUxdDEzUnNJVjhxUWMvd0FXQzJQMXBQQXZ3MjAvUzRMaTRUeTdqN1pJWkhlYUllZmtEQk80ZFFPd3JIZzFHZlJ2RVUza0xMcXVuQ056anpkcnh1b1BXUG9jK3BQWHRWU296OW5DZGVDZk85ZFVudHZvcnY1YUZ5bFRsVWxIRHQrN3RmOEFMWFMvUzdzWXZoWDRtT0xUVXJHNFcyMWkxODNkc3Q0MmdhS0pTTnhiQUhRRE9POVNhNVlYSGpyVEcwMk93ODNRNDRRRmFiY256c1F5bklCSUFVajd0ZFo0TjhIMmVyM3NGL05ENUxYSU8rTTVSTGhXWHV2ZnYxNlZrZUs3aWJ3VnFkcmNlSGx1Rmg4NzdQY1JiaE5FbWVtMFo0UEZIMWVTdzBYVWZ1N1dXOXIzdHRxbGZyTHpObzFhYnJPTkZlOXY1WDI3Mlh5V3BRMDd3cko0TjBuVGRPVysxRythM1VMSTlzNVV4d0Jzc1djNExZT0JqcldocVhnS0RYVEQ0aXQydmIwUXhoWWRzcXh1VnljZ0Z2cU9PaHhWWHhocjhWNXFkdEgvQUc0clRRTVZ1Tk1oZll5TTNMTXdCSjllNEdUWFJlRTdQVDd5ZTNhRzZZYWJiUTQzVFMvS0J3UjMvWDFvalFvMTZxb0pYVmwyV3QrOTNwdmUvd0NBcFZhdE9uN1ZPejF2cDA3V3N0K242bk5hRDR6bHM5TGsvdEFXODFpMHVQTHZMUVJUUVJnQUZTRlhEYzl3U1RXbjQ0MFRUL0doMGkwaEduMmNkbi9wVnE4VFNLWDR3RU9GKzZRY2tIMEZYR2ZTMjFMeWIvVzN2SlJPZGl5QVlkU3VRQU9jajBOWGJMUlpMRFUxMUtNTGJ3YjIydExNWDNBNHhoTURIeWpIWDBxNDA1d2NxVjA0TnBQcTFiejFzdlJyMU02bFNuZFRTYWV2a20ydTFsZjdqa24wN1dOVDAxWnRUdDdGZE4wdTUzN003cEdZSE85ZDNZOWNIOHFxeGVLdkN0anFOMWNYVTFuR3F4czV0L01lU1IxNkhnL3hFamsrbkZkcnFYaWhkWjFDOTB2eXJWcG9XWm5CRzBxdUR0UDE0cnpEVWZoUG92eFp1MFcyMHUzaXM3Z3RCZlhzak5Hems0SlNOZ1BsT2NjMWpXU1VyVTNlK2lWdDdlWGEyK3Z6NkcrSGxKMDI2cTVWdmRQWlBYNyszVTJvZE1YVjlKaWJ3NmJxd3NWWnBZNTQ0Z3BVa0g2RWdIbm12Ti9oT3VwV1h4RTFXTHhadThRVFhEN1V2WUk5Z3VWVjJ3NVFZVlRnak9CbmdkYTZ6eEY0SnNmQmNkbnArbHk2OFp0UFF3Tk5CZmJtaWJPQUpRM0RMdE9lZmFwUEcvaVgvaFMwT2hZMVpKb1o3Y3JlT0VDdmJ0c0dDTWNETFp6bjByRnlqVGJsVGltbHVuYlRwb25iN3RUcnArOUhmVjdOWFY3YXU3U2Y2RncrRzlNMS9YcEpiTzgvc3Rab1dXSm8vTWtkaUNRKzdkMXp4ME5XL0RVV290OFBaTkR2TGlXUzRhUmxqdTRZZkw4aFZiY2hCNjU0QXArbytNdFdpMERRZFB1dEprOG5WaVdtMUJZOWh0WThaSEk2SE9EbnAxOUt3ZE4xK2J3dDR2dDdhU2JWTlVXeURTQzVTUjVXRWZIeXlFQW5zZVQ2ZWxhd3JxVlJOU3M3VzJhdGZWcHE5dk5QUVZSVkhCcTEwbmZkUzIwVFR0ZjFYenNRNjU0cmJ3aDhRTE80MURXTFRVTlVaRmp0MkVhSklpbmtvNnF1TTg5VHpYYnpmRW1QUlBNMWk4dFd1a2FPU1MyVkIvcWRxbmZ3T003UjM1ck9iNEtXdXBhb3ZqU3pNRnhlNmlHdUk1RnQxdWxrTWlydFlxUHZZQUdDRFdmcnh2UEVuaHFQUXpidFo2aFBjU2k5K3kybkxxVndXd0RsQ1I5Y1lvbDdlaFZjcGRkdHRXMnJQWjMwRkg2dlhqR01OYkt6ZXFzdXE5T2hCNGtzci94TGJEVDlQMC9UZFkvdFZ6ZHkyOXhNMGNVb0hJYjVSd1JrY2NmalJXVnJQaXBmQ2ZoWmJXMWt1dnRjY3V3TEpLeXRnWXlRUU1rZEJqcHhSWEZLdFFoN3NwZmwrcWY5ZEQxYU9IeGJqN2xsNnRxL25wSkdQNFYrRWNPbytOZkMvd0RhSGlUU2RObDBXWXNKNHBNUzZzaFFvWTVOM0FKeVd3UGF0M1NOUnZFdXZIR2w2amNhWk5wT2lYOGR0cHRzODRkZ2plV1ZrYlAzVjNPUmtjY1lybVBoeGZwY3orSmREdlBDc045Ym03RU1GNDF6bmZFaTdnNkE4aDhnNUdjY0NxdmhUd25OOFJmR21xVDMxeC9adW4zbGxKRWxyY0txNGorUUlKSFU0TzFsWWpuUHpqcml2UXA4c2NMQ2lsek9UdTNmYmRXdHRiWjZkMGNrcFNuV2RTY3JXUzNXblIzNzMzWDNub1h4UHR0SjhmOEFoMmExMUxVckdPTzNTSHpvN0s2Ry9ldVFBQjFJT1R3UFNyZmgzeGhZZUcvQzkxby9ndXkxTFVHdHB4QmR5WFZxelJYVWUwQm1qYm93WGRqak9mZXZQUEcvanJSWDE2eDFDeDFMUVcxUzNack85U1cya2x0N0g1Q003anRPOGNZenh5Y1pyYThIYXBwbndUK0RuaHZ4RnArcTN1cVFNRSsxcEw4NERGZVl3R0JhTU0yTTU1d0szb1ZLMDZqUytiVGQwdTY4Ky9rY3RXblRjRnJwZlJQWnZzMzIwZHVtdmZVMW04VDJIZ0M3c05OMTdYTk5HcVJ2TmNDeXQ0SFc2V0xadVdOVlAzaXVkMk9UeHhYTi9HWDlwdlNmQjl2YndhSGRYZDFxR3NTQjVGK3dzdTFCakx5bmIvRHVIR2NuTmRoOFBQaTk0ZCtNa2xuckdyNmJCSjltZjdaYVhja09VUXNwUUt1Zm1MY3NNNHh6Vkh4ZTluckhpeisxcE5LTU9pWG43cVdhR0ZUbkJDckh6eXBKK1lrWUJBR2UxWTFLRkdWUGxwVGE2SmRiUFJ0NjlldHVqRlRjMVZ2V2o1OUxOOWxwcWFtdGFGYWZZZFAxZVNmKzE3NlRFTWtsck1HV0VNTWpLSG5CT09Pb3JsUGl6NFM4YStMcHpmeGFYYjZscGNPbzIrK0N5dWRzenhMamN6ZGNzb09kbzYxaGZHRHhmZWZEcnhEY05hMjhNU3hTeFI3WVl6STBDREozaDhGUUNBdnIzNUhmdnZEWHhBbnNiSnZGRml0cFlTMzFwdXU3QVNGcElueGxTaW41U3g3a1Y1MU9TdzhuU3FPVVlycWxlL2ZmZHJzMmJ5ak9jSVZJTlRmbnBiWnBhUFJQV3oyTEh3djhITnAzaHkralo3NlM0dDVYbWdaMjJ5UXlEUHl1TTdlNE9UeCtWWExPYTErSUdnNlpIYXlXa2NMM1FlNnVyT2FObGtLNTNxWEdReFlnY0N1TitIMnIrSnRmc0xxYlRiTk5TMDJPQm11RnZya0sxL0s1RFBuQkdUOTVlT0FRS3pMMjkxVDRmWFU4ZHRZNmZhNllMNkJKN0NTTmxXelNWR0RlVWVCa050em5KTmEwK1J3OTYvTHJkMjNzcnJ5WFZPMm9WYWMxVWE1azVhV1M2TjZkNzludGJ1ZHZvZXMzbmhuU05XMDN3N3ArcFdPa0xkZVhQTThpeVNSNzFYZElNOEQ1ZWdQcFZ6eExaNlMraXdTMmVvV1RYTnJabjdOcUU2bVltVjJLa2tLZHBJQUkrcHJOOE9lRy9HSHdzMXE5aHVsdDlTMEcralNZVElTMXFGR1FJblptRHFSZzhnSDd3ejNGVU5hOFdTWHV1V3RubytuV041cFNoekpHUnRTQmtETjVhSGhtYmNWK1k4WXo2VjFZcUxVSVFyWDV1ejJTdmZUeWVubmZ5TWFjVlZxYzFMYlRYdnQ4WG10Zkt4VytHWGlUV3ZBT28zd1hUZEcxRFRkUVJJNUpMWjJSMFJNZ3VRMlFWWWttdTAwM1g5SXVkUDFqKzJOSGpnczdhM1dGeVp3eE1jdVFvQkJ5cFBQVDFybS9CT25Ed2Q0Umh1dFhsaFdCWUhoTnVoM21OQ3daOS9QSTZnSHNLaThPZU45QjFmWFBFQ3c2VnFFek5KREhMYkJHZUdUSndnQllrRWdIT09nNHJuK3RTY28xS251dEwzVnBzMDlXdGIvMTh0YW1EZytkUlRhdXJ0TnBicFdXcVh6dFkwZkZWamI2M0szaCszbHZOUHM3V0FRTFBQY01rZDNHNlkySzNRbFNjZHNmV3Vzc05OMC9RdEkwL1N0UHZMcU80VzM4cTBnbG4zRHpBTUZsSjVPRHprbXVaOGJhRllmMkZMcTJvNkxEcEgyZFdhSzRrdTM4dkhHUzBlN2I2Y2pvYWx0dkdWdnBmdzlzOVpuaDB2N0w1WWd0THNSU1NUc1N3SHlxQmtEak9Sa2REV1B0SXhjL2JKTFJPK3FhU2EydmF6MTdXMjNNcWxLVXFjVlR1OWJXMGQ1VzYyYnY5OTk5aGJXZTQrSEd2YVRwbDVjQ2VTNHVHTTE5NWdSc2hDTnA1NjdpcHdja2lvL2lINFl0L0ZXajZicWVwNmZKcUdxUTZndHZiek5jYlZVTXd3NVhJNEFQY2RSUnJmd3kwMi84UU5lYW5xVGVJdGJTSXoyZGpMNWR2RGs4R1ZnTWZJTnlucnVPUDRqV1Q0djhRU2FuY1dFMm02aEhieWZ1b1k1STR0d2xrU1FGeVUya1l4OGdKWFBldXl2aEkwNE85UzBiYVhmZDlkMDM5ejEzMnZuUm43V3JHYWp6UzNlajZkdG1sL1hlM3FOajRlZzhQZUZwck81UVhtbGJET1pJemdxK1NTbzV5ZmF2THZDM3hndGJtN2Q5VTAvV1BEbHZhdVJIYnNHaldlUGpMa2tZeW82Z0R2WForTHROdXJIUXROdEpOVFdHR1pERzFvakFDNGt5WDNLNmdPcHdDTVpBNUp4V2ZyVmxNMDBscFA1a2QxYXhMRkJlVFNDUkZENDR5M1Z1QUR1em5GR0luQ0VWQlIwaWwwWGE5cnZYMFg0Mk1jTFRjcnluTDRtLzhyMjI5V3Z6SCtJdEhtK0ljc2MrZzNDdHB1bmxUSTh1VVFkV2NFbkhZaXNsYnUxc1BHa01jbDR2OXBhVE5HdmxndTB6UVNBWWxBeGdyOCtNOThlMWJXbDZ0cnVsUjIrandhUWw5YXd4QmJpZUdWVmFhVEl5Q3BZRGJ0STQ3MWwzR3R4MnR2ckY5cVduM2xwcURTaTNYN1BHaGxhTlFOcWpkd0Jubmc5SzVKcWlvcVMwazJtNzZMdnB0NUxjNnFjYWk5eVZuRkxTelRkbTkzdnZyMHVlaGVJWTdOSUdsL3NsYis4c2R5bG5BVXNCemtIMVBwMXFqNGM4TjZEbzlyOXB1dE9XMXZDREx0YVR6UE01emtqMXlUd2ZTdk8vRHZ4U2kxUFNkVTFDYTgxN1NyZTFtVzNtVzdqaWI1U0RqWWNzQ3B3ZWEydFIrUG1sNjJ1eXgwL3lWaG5lMG5ubWhiS3FBY01yWXgxUFhzYTllV05weDVxK0lzcEpiTktYYlZXWFMzVitma2VmVHdkYVZxVks3dTkwMnR1bXVuWFk2alhkSjB5MmhhYlMzOHU4amMzQ2Zac3JFcmZ4QnZjalBIcmlyR2theXhzV3Q5cTZoZk1SZGtzUnVoRFlPMGpydUdjVnpkMXEyZytJN0dTQ1hVWnJXV0ZsVm9MZFdXWm1VZ2daeDN3TW1vZkIxN2E2UHJOekpiV2Q5SmN6SzU4NXB4NWE4OG1RQmgwNjRIRmVkVHhUVHZDeWpKUGJWZWVsbnIyNjZHMHNLM1NjWjNjbzY2cTM0NmFkZERXdGZBUGhleWxsMCtXM2p0N2k1dXZ0V3lNdjVjMHVPZDNiOEsydEcwQ0hTYlM3aG10aEMwMFRSeE9pbHBJVXhnaFJ6amprVndtZ3h5eWVNOVFoYlhKTGkxMUtKdkkyV1JVUk9wSkFSeXVQUTg5ZmV1eThQWFVkbDRlbUptdTdxN3VqNWJDWS9NTThFOGZqalB0WFRSdW1xaXNuRzk3YTZlZm4wVnJITGlZVFM1Vkp1OXUvNGRsM3ZjcVd2aUwrMnJDUmJLTnIvVHZLS3ZPSmYzekZmbDVYc3crbFkvZ21QVmZBVFRUYWxjRFZ0SHM0TnR0TEptU1dHVHNtZTU2ZHVNVnpQZ0crbTBmNGh5NmtMUytXUDdTMXZjQlMzMmVaQ2NjYmp0eU1FOGRLOUErSUZtWWRIYit6NXBGamtkcHBDWWczQklJQTdkaitkWXE3ZzhUQ2V0NzJmYnB2ZTZ1ZExwcW5VK3J5aW1wYVgxK2V2Ui9oNUdUWmVMZkVvOFEzRFgrbTI0MEc2c3lJb1kxSW15ZTV6N2RxdDZCZHc2NWQyVnJOcHM0dDQxOG1HNlhHOHNSa2drZncvcFd6NFYxaUR4VGF6VGFrSkxmeU1KQWhPMGdkTnh4eGpuSDRWbXdYZDFvVzYyekhZbUJndm54SHpBeUVua0QxNlo0eFhYVXFTVWFiY3VaUzdMWFR1dGxlM1V5c3J5Z284c2w1dTIyL25hLzRtcHB1bTJ2OXErYlpXc1Z3Mm5sNDVuRngrOGg0Kzd5ZWF4eHBtcFcvaHU0a1MyVzRqa21MU3lYU21Wdm13bzI0N0tPd3JuYm0ydnRHOFQyN1I2eGJXejNWejg4TXRudmE2TGRzNUFIVHFhN3k5djhBL2hIb05xNmxKSkpkRmRxeGdGYzVJd1BRRDY5cWlQc0pSL2VKeFdxZTI3MmRuK1dyODlRcWMxT1NqVGZOZTIvTjB2Zjh5djRZOFAyMTNwcXpSeVc5dFBIbU5YdDFiZGhUeng3bXVZbTEzUjlCMFBWNDJ1TDY1bSsyeVNYTVlnWkdVZFNRQ08zclhWeWFwYTZkb053clJ6cmNXQ05jU1IrYnRaeHUzSG5PVCtkWWE2RW5pVFRKTllXVFpwdW9MbFlaUVdZSG5MRnV1TUQxTkZhbktNVjdCTFJPKy9vMzVXMjJERDF2M2o5czNadGR0YlBSZCt0K3hRdFBFRno4VnI2eGt1WWpiMmRxV2x0eEJjZVdXeXBIN3hldUZ6bjYxUGVlRGJaZGQwYTFXV05CWXpOZFNzalkrMGxoakhUbkJKUFBTdWEweGROOEE2Uk5xbWwzTjlzMHVUN05lR1ZuOHFkamdNeTUrOEY5UU1jZDYyZFY4T1I2eEpZZUlJOWFNY2JUZVhDZ0FCMlB4anBrODkvUVZ6MTYwRS9mVGIzdTlPM24zMGYvQUFUb3AwM0ZYZzFHTHVsdnYyMjdOMi9QUXcvSHZoQ0hUZmlJdDdxMnFMYld0ODd4ekxLeTRPZnV4cVIxSGZuSnpYWStHN1didzc0WHRiR0M0aTFMVHhBMXU4MkZWbURFZ0t2WTdSMHJsZkdObFlXM2hKcE5lMG1hOWpoTHhFVFhQbWZham5BSkFZcWplL0J4WFIvQ25WYkRWdElXejAzUzQ3R094a1NPS0ZwQktzUHk3czhaejlSbWxnNHhVbTR0Nit1bmxyODc5eXNWS1RweGMxZEwwdHBwZmUvK1hxZVkzSHcxOFFlRi9HdHZyRnJydC9aK0hZNEMxMWFYa2FzMjRrcUd6akdBZTN0WG9PcFQ2cHJFdW10WW00ajhtQmlVYWNlWE91NzVYN0FIQXlBZlgyck8rSmVrM1Y1cXkzSXYxaDh1NWo4aEZMU1IzQ2hzbFNHR2NaQlA0VnBlR1BFTTF2ckY1RmRhWTJxUjNVdVhrYzdYamlYYXBDRGNCZ01lQUI2MDhQVTU2ODZON0syNzlkdEU5ZlBzNzdJMnhOM1JqaUdrM2ZaZWkrWDQ3b2RvZHpwT3FlSHJxYTlXOGs4bHQxelBjSGJ0QzV6dVBwNysxWXZneTZ1TkpFZHZleVNYa1MzUG1XNzd3MGNjVE4veXp4K0o1eWMxMlZ0NEtuMURWSkk3K05yaTNhWXRjNUczZEdRUUl0cThObnY5YWsxSFJ0Syt6Mjl6QXR6WjJXbHlIelkyQTJSTnVQVWRlRGoxR0tJNFN0T1BNMm90UDV2dituVTU1NHFtcE9NYnlYbHN0TEpmMGwwT1JmNG5YMnZhckxmYWI0ZjFMVFk3RnhZL2FMeVBEU1FCamtqUEpHZWUvVDJybTlmbXZ2RVBpQzh0ZjdhdXI1N3FRUjNMUk1KWXd2T3p5OXYzVzV3YzEzM2lTRFNoNFB1REpmVEpQSEtIVkxLUStiSStlTmdibkpCUEgxcmwvaC9wN1cyclhmMnEwdmJXNGh3MG15SlMwcXY5M2NNOFNkejA2Vk9JanJwdTdQUnByNXIrdE81MFlkUVVYS0syMDFUdjkvelIwbGo0Y2s4UStGN1NhNjF0cEx5MmlZU1dqWWNTRUE4QTlTY2NFRGpCTlkxcDRlbStITWVwYWszMmV4ZWZaSTBUcTNtR0k0QTI5dndxelllRnRVMVB3eEovd2oycVcxaW1qK1o5bVY0V1BsNVVmZjNMdXlmVE5VVGUrSU5PbXV2K0VsV3dpalpJL0xFRFBMSzY0R1FRMlFCMEp4WFJVbEZSV0ljV20xYTYwWFZOOVYwOHZUb1RUNWxKME9aT045bnZ2dGI1K2ZZNUEvRUc0aDFieUxUVmhxTnZERFBQTjVVVzJHQlIvRkx4Z2tEc3A1clN0Zkhtb1dlbVdOMVk2cFp6WEdvT1pQTURMQzVCeHRKNUIySEdPblVWYThBUTZmcXNxWGx2bzgwTnhLeGdtdFdSTnNCemtOa0hIell6eDY5alZUNGo2blo2THJVbW0zZWl3eU5xekx1dkFwYVN5d1FPSE9BQi93RHI5NjVwZXpUVW96YmEydHM5SDFTM3ZwNUhkR0VwWHBOSlgxZDByOUZzM3R2cDEwME5pOHZmRE90MlUwMFVjbXJUeU1ESzh1V1RmbkIrZnI5QU9LS3hmRDl0QjRNOEY2MWEzZGpkYVphTGRMSENKU3JyY0FzSEQ1TzRucitsRlpTbzRlVnBWSXlUc3Z0Vy9QVTNvd25HOFlWTkU5Ti9MczBpOTRKOEphMXFQaXFQeFBMREpZTTJsckkya1JYZzh1S1VPSDMvQU8wVzRISUhURmVjMjJuNnN2N1JkMUpMWXkzRm5xRnA5bVRURElTc0RieVhkNHlNUGtnY2prZmpWL3h4NFkxRHh0ckdxYVN0MXFGcjRrdkpESGRKYjJqZlpGWHpPWXczOEs3ZjR1ZzVPS3lMSDQxK05kZDFHSHdwNGg4T3phVHFlbnhTUTJkMVpzMXkrRkFLT3pLRitVcVZBUGNuOEs3S3RHZHAxRks2VjB2WHBaTkt6c3ZQek9haks3U3N0ZGV1MnQzZTd1cnZ1bnBvYmtmd0owbVd4MUMzMWJVdE44TjZrMXdKWm83aU1ORGNvQ1Fkckhua0FjNHlwOWFrK0lPaDZQZjZERDREMHE2MDZOTGpNVWNsdk9aQ3N4TzVpY0Q1eUZDa2JzRE5aZmlsNzN4aG9PazNlc2JieldiSFVWVm9ySzFrbXVidFZiZytXVytSZ3k4dURqSGF1aThEZU1OVStLVnhkYXErZzJPajZwTklqelc4NU14c3JnWURZWWJkNnR0QUp4eHQ2VUtVS2loYWRwTFYvTzl0RjF2NUQ5bk9sTnVTMDZXNk5XVjc5dCtydDh6SzBQd2RkYXI4SjlOZzB2V0ZtdXRKbDhxMGZ6RmpoQ21YWTRrUlQxVlMyQUQxQXpYcGVyWFVQaG53RHFVZXI2aEhkV2MyMENXOFBreG9GVVpkVGtnODhZcWJ3eDhLdFE4WStENzdVa2prc281cDNkSUlHTEpNRjRKQ1pITEVFQWpyZ0d2TWZEdW9TZkU3VnJlNkt3UldjZm5XRWxwTGxVUlZiWko1MGZUek40SnllbnR6VXkrczRXbFNsV3AvRnMzZTJ1MnVpZDFmcHBvUlVuVHIxWjBxVDJkMnRMM1g0N3I1bmFlSnRDaitNM3dJdExtNmttc0lwVjhtNGkweTNra2xsakgzRi9YSko0cmlmQ25pTFhQR0Y1WmFSZmFQSGMyK24yb2ExdXhBVzI3SEtmdkFEakpIUUROZGw0ZitKTng0WnRMclFkRk43Y1NhUExFc2R3NGJiY1J0bmF1M1BRREhYSjVGZEpvUHhTc1BGbDVORHA4R2wvMjFaeXgybXJ3RmdxeG9RSkZ3MlFNZ0VIOGNWVlNwS3RHTVc3OHJzN2VhOWRQdTJNb3lsUW5PWEk5ZFY1TFhmVHovQUNUS1hoQ0RUZkZYdzJndTFzSnJlU085YUc1dGJKMmpXSDUyR1QyRGZMeUJuQmF0UHhocHR4cStnTzJxNmZjU1djYUxIWk9ydExKSUFSdE1od01NQ2NaNzF6dmkvd0NHK3FEVExpTFNmRUJ1Tkw4UmFpb1dVSXJ5UlNxamVYR2h6amFXQXovdWprWnJWOE8vRGZ4UEhvdWxhVDRna1c2M3grVGV4eTNKL3dCS2JnR1pRdUNNWUh5NXg4MWRPdk00dUw1YldiVnJYMXRyNmVtdXlPYVNnNHFwekpPN2RtM2RMUzZ0NU82OVB2VlJ0ZHVCNGUxRHdlczF4Tk45amU2U083aTNuWWh5Tm9CeVFOckhubXNudzNjemZDVHc0MDE5Y1NhdzEwb1dhNFMxRWIyZ2xjN1YyK3BZNHpuSUhKclcwM3dWYWVLZGFtK3dYVjhWMFdCckEzSEVVY2pnZ0dNN3NrWVBmUGVuWHVpYWxxbmc5OUwwKzQwK0JmdHJSYW1yRFBteGJXNkhQRFlJT1RrSGI3NXJrOXJEa2pTbnpOcThWdTFwMmYzK1hZMjVkVzR0V2RtK20vZlEwTlc4UTZQSEpwT29hcG9leVNZaTBUYklKSVpEeUFGSTlRTW5qSFdwYnZVNFgxSFVIczdFL1pHdDI4Mkt3d3JDYU5zcXdZOEVqZ2NIdWZTdWI4SitJTHkyYnc3cDZ0TnFHZ3hoTE80OGhnWklZOWdDbVIxNllJSFE5U2VhNnZ4L3FtamZERHd4NTNodldWZG8wYUw3Q1pGa2l1dDV3UWVNN3NuUEI5YTZLTVoxWXVyZEpSZnZMUlMxMnN0RS9QVmJNenEwMUJ4cHRheVdtcmNiWDY3Mis3dHJaQjhWTmVzOVkweXhUVW9aSnZ0RVNsN0tXTU5HSVNRV0RQbnFjZW5QQXJOOGFlTXZDT3ArQWRJdkkvTGs4dU5ZTGZUb1p1STBHRkpVWUhDOVB5cWo4Si9CbDRMRzR2cmlTM3VOTlcyWmhZK1NZNFYzRFBsdTJTV0s0enVBR0FhNWU0c0xLYnliNlRUMDBtNmozMis2Q2I3UkVrVzhsc013RzVlQWNFRHBYTDdTcE9pNjJNcGU3SkpLK3UzVi93Q1Y3WDZHM3NJd3JLaGg1Nnd1OU5OOTEwKy9WK1ozejM5dkw0RnZOWTA2eHQ1TGk0YzJuNzV5M2w0RzJQa0RQVWdrakhYMnE1OFByQzF1UEJ5M0Y4c1Z4cWxvSkZtbWlpWk11ZW94akk5T25wWE42RjRkUzltam1oa1c0bGtoRHh6eHQ5bTJvQUNwUEI0SkdDS3VmREg0cTNXaGZFTFhvOWFhM3Q5UGppam10bjVWWkdLRGR1WnVweUFPZzRyUEQ0aU01UmhTK0Z2ZHEvWFh5WHlNOFJSbW95bEJ0eTNzbTl1M1hwZEhXVCtFNW0xN1ROWXVKWWJwcmUzY3JwNmphSXlRdno3dWV3T1NSbjVzZXRjM3FPc1QzUGl4bVAyTzEwenp4UDVzMGhMZWFuQ3hFWXd3eG5tckhqblc3UHhscTl4YnJxVnhZcmNRRjB1N2FVSGVtQVFkcEhSU2Ywckowcnhob1B3cTBHMWIremJtN21tdUZ1SmI2VFBseTVCekxuRzFjbnNNZGE2UHJGR3BMM3RFbnErcnNrdWliMTF1dHV4TkduVmpGT1N2SnJSYWFKM2ZWcGFkOSs1MlNhcmNlR05ldDdxMnZ0SU9rWHhYem8ySUczdHVEOGMreHJsL2lvMnRENHNhRHFXbDIrblhuaGZ6Q05WUm1QbVhLc01BcGpxUjh2SGZCcVBWZkVGcDQvbHVQc0Y5SERvOXpCNThsckQ4enp5RmlHNS91bmdjZDg4MWM4VWVHclc3MWJRYjYrdWovWnVrZ1MyTWtxK1g5bG1IQXlBUm5ISUdmWHBXanF3dEZSYXNtbXRFNzk5K25YVTUvWk9NdWY3VFRUNmZmYnIwNjk5VG9uOFBhZjRrMHUraFhSdHRqZFcvRnJNbzJsVXp0VlJqalBQUFVWRG96dytJZEQxQ084c2JPMTBtWUxEYmhNN2cyTWxtYnJ3ZjVkNnVlRTdYUlo5SysyV2VvTmZhamVPUE9acm5jTjI3QklIWWNtcmx4UHAvdzUwdTR1TDdXclFUVFRDTkYzckNpcytBRlZSa2xqeHlldnRYYlV3ODZzdmEyaTFadDJ0YXoxdGJUWHlYNkhLOFE0cmsxdmRXdmU5MWJiZnkxZlQxT0V2dkN1dWFmcmVuMmNqZjJmSHFqTUpMNXRzck1vRFlUZGtFTWVNRURqTmRQb09nMkhoUHczSnBNVmpIYnh4Um1PSXlNU0hQSTViNjhFODlUUjQ3MzZWcCtmRVduMk91VzhjbSt5dVppR0NaSFEvTDhwNjgrMVI2KzcrTVRBYldQN091bHlxc2NjSURIZ2NqSDkzR0NNVjVXSldIdzc5bkM2bnA3cjNTYTI3ZWQwM2Z1ZGtaVmEwSTg5dVR1dHJyYnJmcmF6MkxHbStHNWZDUGhhekN6SzB5WEVSRUVTaVJGSklHME1jRWlvZkdmaVM2OE1lSW1XM2hhU0dlUVJpV01IYUdkRDhyZW1PdWFwWDNqVS8yOW9zTVUxMWFxMHhlSzNtWGExMjNRS0EzT1I2KzRyYjBpNHZOU2x2SWJpTzBIa3Q1a2NjMHUxdDJPVDc0UHRWMWEwYXE5blJ1cGFhcTcxUzgrKyszVHBjeTVaUmZ0S3lUM3V0dEcxK1g2NzZHSGZ3M0Q3YlBVYmVTSzFaZDR2Vm1Dd1JURmh3UjF5ZHg1UG9hYjQvOFhYbW02N3BtanUwbHBwYkh5cEpsVVNSUy9keHZQUUE1NEhYMnE5NGgwN1d2RU5uSnB0d2tjYlRSZ3czQVg5eXBMY1pHZVNLMHRMMEdlT09QUjlYdk5MMXFDT0xkSUpsd2Jqa1k0eWZ1NDYxdFRwemRIbGk3YzFrMjlOTmRMWHZielRKOXRHTWs1MmtsZDJUNjZhcno4bWpsdkQyalhHcGZFTzQrMmZicFk0SUQ1Q3E0OG81NmJsOVBUTmEzaFQ0bDZmcSt2dzJjMm4zS3kyN21FTVJoUzNQSlh2bkJIcFYzd05vNjIvaVc3bTB0clY0Ymx2TDh1T2N0R3FMd1FBT09PZnh6NjB2aXlPM2sxTm1pZVBUbmpqWllyaHdJNDRtRGM5ZXRLbnpVcVVaVTlVbTFycmZXK2wvK0JiUW5FVDlyVmxHWFpiYVcwdHJZbjhSK0NZNE5mRjgxdk5kVzZzR2xRSENRNDRPTSt1YzhlbFkwR3J4NmdrdHJyR2t3eVc3c1VnaVJpajdOd0FPUU9uSUhyVS9qbTdhRFIvczF2ZldNK29GUG04dWJLNUkrODNQUS9Xc3ZSdkdOMFlJcHJpeGhXTzNaVWxDdm1SSTJISlgxQlBmMnJueEdJb3d4S2pIUzNlMHRmTnRXL3dBbWRGR2xVbFE1cGE5dDAvbHIxL0k2eUhTcmVIVDdxTzg4dTFReE5DZ1p2TUVTdDFCNHFoWStHNXRKOFBRYURheDI5dnBxd0xhQzVXVXlPcTQ2Z2RzalA1MHk1aVd6MGY4QXRleDBTYVo0d3FJMDY3ZzBYOTRqdjlmUVZuNnQ0cnQvRlBoank0OVB2clNTTXFXRUFDSXovd0IwbkhhbEdzcU40eWR1YTdTN3B2cnBiN3JldXhsUm96bTd4MVY5ZHRINlgvTzVrZUxQQk52NGcweVRTUmZPdW5veG0zRUhFWFArc0EvaVRKQng2NXAvZ253UE40VThRUXdYbW9MZVdMUklzZTJQY282bkpMZFBYQTZWbzZMcGk2SFlYZHhxUDJpM3M3ZEZmZHU4N2QzVVk5aUJSQnFVUGlUVzdYVlB0N1hVRjVsRWdYYm1NNHh1S25rRElOUGxVNDg3dlp0UDVYdDMyNmZlZGZ0R202WE10bnJaYXUxOUdsdjMxSjU1Tk12WmY3TXRZWWJsbnVDNWpHUEpuWW5nTng3NS9BKzFWYno0VzNuZ2xVdU5QdDFoYVhEWEt3bG1Ka0p5U296MEE0NTlhMG51V2labzVvazhsQzRqa2pYYmtLT01mVWlwYnJRTGEwc2ROWVRYVWNtcWxualNPUXRKQTdMOHA5MUhmNlZkS2txbENVYWtieXV0bW9xS3ZiYXp2djM4KzdNUGJPbkpXZWorZDNxLzA3Zm9NVHcvYTNjN0R6bzdxTzNLdkcvbE1zaU9jakJ5TVl6K1ZjcWRWdC9CbmpMKzBicWJ5N2lYZWhqTC91WXp5ZHdCNms4ZEJYYVdQaEtiU1ZzL3RFbU44YlFQTURtTXNTU0dkVGpMRTl3ZTlWOVUwR1NMeG10NGx6bzl3djJMN0xJcGkzSE9WK2ZHN2djVXErRnQ3OExRVjE1OUwrZlQ1QlR4Y0U1UWsrWk5mcjZXMTNmWFlJL0h2OXFYMXZieWFrK20zV3BKNVZnakwvcnBjRnNoZS9UT005SzgrK0x1bzZ4ck0zMk9lK2hhWDkzRFBieG55bmxIRzl2TDdrbHVNOXF2K0x2RytpYWRyK2srSDF0NXRTcy9NTDNkeFkyN013a09OdTF3U1Z3Y2dtdFQ0MWVGditFeDB5MzFLeDhxU08zYU5KQk9tSm9NTUR2QjY0QTVPYzV4V2xhQzluYVUrWnhkN0o3NmJPMm1uNG8wdzhYVG1wS0hLcHBwTnJiNTI2L2grQnpOMTRac2JUd2RlWDF6SlBKZFdjcG1rZ2ljYjdaVUkyajF5UnprZWxZT2dlQ2JHemU2dUpML0FGKzRrWStkTUlaeTZCQ1NkenRuSXh5UHhOYldyV0RhUE5kWDE1ckdqdzMyb0l0bUdzRHNOMG1OeGtLa2tsaC9MTmFtaDdMb1R3YW5hbldyVmxEbTdWQW9MS0RnS1NPQjB4NjVyZ1ZOeW43cnMvdXRidjN2cDNSMktUVlAzdFZlOXJkLzAzRzZEWjNtaHhySnBlby9aN0RVTGtCSUorSnBTeUJCaG1JK1hrWXp6bk5RNmo0QjhTZUlQSE1PbjZsYzZhMW5acjVrVjFIS3dlVnlSdVJobjA5VFhPL0dxM2JXTGZUWVZhT2UzallYTXYyaHYrUFpJanZDN3M4NXdSakhlcFBCdmhtVFRkVmJWR3ZwcHJXYU9PUmJlMHVWV0dOZHdMZk9BY1lIUHZpcnBxVTRLRHV1enZwYnpYUy80ZHR6U1Yxek9OdHVxVjcrWGV4ckNEVkk5VzFMUTdqVGZMc2JkMmt0NzIybDhpY2pJSVE0QkRGQ0JrOVNEVlcxK0pOaDR3OGUzbWwzMmtTV1AyTTQvdEdWbU1NN3FneGxPQ1J5QmdkVFhVd2VQdkQrbGFQcmtpMzZxR3V5ME44RzNJekVnSEw5RGs4VncxMThUdFN0ZkgxbkRwZWgzVjlmWFVabXcxbnVnaWlKeHZCeHhnQW5KcnJwNE9yVTVZS1NlMm1tbHQ5THE3L3pNL2JRdEtWUk5kbnJyZTNycGY3ckUzN1FFdW9Id3BDWTRiV2VPT2RRSm9TNkl5NE8zSk9leG9wMC9qNlA0cy8yZnFGajViMnNNa2x2Y1BKRGhkNmc1QVBQUmpucDNvcktyTEZ3cU9OSGJ6aW5yWlh0cXREMU1ITENLaEgyMGJ2WGFUWFY5TEhuZmdUVi9pQjhIN0h4QzE1cVdtTUpwRWk4K3dqTjlKTkFDd1ZXZGlkanNjam4xSGV1MCtDOEhpR3g4UHI0cTFrLzJiSGNTYklMT2RvNDUwaVJ5V0hITGdxTWpCSjVBcnluNGQzK3RlS3ZEMXZwZWw2NVo2UHB0ekYvYkxycVk4dTYwOXBaRWVLQjBBMnN3eWM1UFFHdXl1dkhtZ2YybHAvL0FBa1RhL2NYMXJxRU1VTU5vZDhMWWJsUnRiYXF2eVNPbURUeFdJdzlLMkd4RlJXbGUxM2F6K2UzVGJyNUhMaHNQV3J4Y3FNTnJLVmx1bG8zOTk5M2EyeHBlRWZoVFo2dDhkZkZmakhRZFExSzQxNi8wMWwwV0NlNzh0RWtVa2JHdDJJRERjYzcrY2pqTloybCtNdFcxelF0SDAzV05EMVR3LzQwc2trdHRWdWNwNWVwRkZibkNGZ0Zaa1BJSUsrMlJYUS9FVzFqdmZHTm5iK0VyeTYwUHhaTWh2TDFMMTJaN20zNkNHTnR4Q1p3UHVlZzROWk54OFE5QjhhZUhyclZkTWxrMW02MFc0Q1NpSnpKSkhJdUh5Y2tiUzIwY24wUHZVVktsR0dHVWFFRTdhT3kwdHBwcmQzMjY3SW1qN1NkWlNxUFN5dHJybzNiYlMycjhtK2gzWHdBK0srcWFSNElXRzB1L3QwTm1yclBweEI4NndZSE8wRmg4dzZucWV2RlVXczlGMGY0bWFsckdwVytyNlBiNnBhaDNLN1hqdTVDd0laTUVydTViSzlUa2NjVm5hSDRZbTFQeFZONDJ1TldpMENMeEhwSzI3NmFTMGZrVDVkdnRETndEdUdBZU8xVy9BMmcrSU5hc3I3UmJ5MzB1NGswa045alAyaytaY2dNV0VwUXJ0M0VNRnlDZW5Xcy9yWHRZd3BWS2w0clpTYnN0ckt6ditIWXdsRlU2azhRMDR5NjJ0NTNkL1gxdmMxcmJYdEgweXdtZSt0N3kva25sa2ExRWJoSGRNbFNqS1RuY0FCa2pJejZWNTNvRTJxZUNYbWtrc2JUVGZDdXR5ZVpjVFRHTVhEN1BrMjR6dTRSUXdPQ2ZyMjd6U2RFMW54TnIxdmR3NmJhdzZnMFVjVWNFbHhqN09qa0dkVmJhUnV3bm9PM1BOY2Y0UThMYWZlZkgvVkpMNjMxRFZ0THRTMENRT3ZteEIvSzNGVHZPZmx5UnZBNjU5SzB3Y1kremJxeXN0dExXZW5mWFhycHJZdkVTL2VlNHVaMnZyZDJ0NUszbHE5R3p2aEJZK0xORXR0TTAyVzZqMDNSbWh1QnVEck02Z0VmSzZIamY4ckRJendRZTlaSGo3NDNYM2dMeFZKYjNUM1g5bVRUaUhVZFJlY24relZSQzM3b1p6MUFCUFBXcHROOE94ZUVvZE8xRHd2cXNWclozVXB0THUxdDdqekRiYm15ckVzTXNWeGpiam9mYXNUeGo0VDFyeGpZMmQvYXV0NHRqZU5iQ0VJRUxOeVdrZmNQbkJBQTI4NHpXZEd0SlR0TnR4OHRWYnBiMFd1dXBNc1BHVnJOYTZhN3A2WHY4MTg3L2Zmc05BMGJTL0d2L0NRTlpYMzJxN1V6d1BKZmxyZFFjWmpNVWJFR1RPZU1aNXJwZkZYaWUzMG53VmZXdWorRjdWVnZsUG51THZFckJnY3Z6OHdPTThrSEFyaGZEZmduVUgrSHVxM1VzLzJYeHMyb3k2bFl1TFllUUZRQlNvVE9HVXF1U2VQbXo5YTF2Q1dxYXRKWlhlbStNcHRQMDN6RUtLa2tlMjRtaU1ZdzRJSEJNaGZqUDNUMXFZMDhSRnFWQjNWdDdKeVcrN2EwdnZwdHRjMHJSb3liaE5hcTExZDJlMnlXOXR0ZDJSMm53TTFiUU5GaGs4T2FURnA5cGE3WXJreVh1RWxDWUt1ZWhiMk9NSFA1Unk2N0RQZFhrTU5wcDdXVXR4TUhtalE3bGtaRjNTTHQrNkNwNEk5YTY2RHhuOXB0dFcwZXp1cExpUzF6UFl4SWpMSEpIbkFVc2VHQlVBNDdIdFVmaHlkdEMxQzFrMUpZN1M0MUd4RXNVVXFMRzFsS1l6bFhRWnhnWTV6eldtSXhEMHBRdnJhN2JXN2ZrbDJzcjN2cXpDamIzcWswdXRrcjdMNXY1MjZwR0Q4RHZpdGZlRHJIU2REMURTM3ViU3hNc2JUM1Y2aXRESXhkbCtVOHZsQ24welcxRjRVdHRaK0lPb1c5eloyOXUxOHh1djhBV0w1VXVjN1N1MDRBWGQwbzFxUHdhZkV0cHFFZDRtdFc4VW9pdmhibmVEY2tLRXkzVmNBajJIR2E1aldKOUYxZlVGT2dSSjl0dFpQdEVWckczeXhwRytBcGZwdVBQQSt0R0t4RlZ3aFJxVFh1MjBUWDR1MW4wMHZwMEx3c1l0enF3aTF6SjYydjE5ZE92VFhxejFSUEE4UGhIVFdta2pmN1ZNcXdwT0hCODhLRGhXRGtBRDBJcmpOUjhWMnZpSy9UVDcvVFlKcm1Mekk1YnJadWpqUUE3ZHc2c004Y0U4OXEwRi9hU1R4djRidW9MelRXYit6bVJicUdPVldhVit5WTQ3Z0UrbFdkUDBDN3VaWDF6UnJQVFZFTW5sUzJ6dW93M0h6WXg5NDV5SzFxVTZQdEZUdzdja3RYcGEzVnUzbDN2ZmZmYzQ2ZnQxSG14Tms3Nk8vWFpLL1ozLzRZVzYrSGRwRnBsNXIrcE1Fa3M3TVcybnhMSXl3b20wRG1QZzdpUU1aSFErOVZSZWFmNGtzUDdJdFo0Ynk2dElZblAybTJsaXQ3ZGVTZjRjRThBZGNWMERYMnFlSWZCZHJyRnZIYTNsMHN6Vzg4VWtZZDBSSEt1TThqY0NweHdEakZkQjRaMUxUZGZzTDJiVDdYN08wYTdERkpGNWJPY0hJeWVxNXh6N1U2MFozNWt1V0xWMDNaWDAxMC93Q0QydGN3K3NPbmZuZk5aOU9qdWx2MjMyMzEyUE1icnh2b3ZpTDRoV3VtUjIrc1dWeHA5bzF0Tzl2Q1VoTW94SmdzT09oNzlqelZxeThIeWFsZTNGNzRnMUdHYlJXbEFTMFYramNFRXNGeWVtU2VtZmF1cUdrV3VqNmE5dGVJdG11dFNtRXhybG1NdmVRK3U0QURyMEZZWGl6eGZwSGh2NFk2aERielhGM2E2YVpKTGhJbzlwa2pYaGt4Mys5K2xjOWF0VXZHdlgzU1duUk43SkxwcCtidWJ4bnZDaXQzdjVkWGZYcnA5eEg0aStKbHI0SDhKcmZhUnBQMmhyVjhGWVFBSFk1eVdKL2g0Njl6aXFQdzZzMTEzdyswbmlxeWp0N3JWV01zazBVcDJ3eDUzSW9IM2cyT01qMXhXUit6MThRdEQ4VCtGcmxOTjhVYU8xdjluK2Uza1VUWE84S003Z1J3QngzT0s3ejRjNmZwbmlyd1BwZDFhNmwvcHQxR0paMGROejVJeVU2OUIwNHJvcDBjUzM3YU5tbkZ0SjhxN0xUVjMwYTBzbnBlNDUxS0VZT0VycVY3TnB0OUw2NmRIZnYyTGMyalJONEZuc1Z1TjJuUWxkc2tqbHBvbVZ3eS9lN0VZSFE4R3RYdzc0bXNZTk11Sm1zMWhramhkM25mRWE1VVlKSTY1UHNPMVVOZjhaUVNhaERZU2FYTnAwd2JmSGNUNGpBVmNIakhYT0FEbjFyTzFIeFBiK0twYnE0bXViS1N4bWhNS1NPUExqRWdHR0RuMk9PbWV0VjdlbFFxeFVKUG1WbHJIMXZ1cjZYOC9VNUZScVZLZDVyUjY3K25iUjN0K0d4OEE2ei9BTUZJditFNy9hQWg4UFJSczB1bjNLeHlzc1RSbVBkSUJ1T1FDUDhBOVZmb1Y4TmRUcy9FUHc4czd5MXNsdUxpNHR5eXl5c29aWk9uemNuQVBxZXRma3o0SitEMnVYLy9BQVU3MUxTOVUwclNMcWVLUmJnWFZwTm1HNkRzVlZlemNBSGtBNHI5WFBCOEVlcGVFRzBldzArKzBXNWh4RGNHM3hLa1lBeG5MWUp5bzcrdGVyamNIaDZEaDlYajd6alpycTlYcjFWM3ZkMjA5REdOV3JVaS9hTzY1dEgyVnRuczlPcVdsKzl6cHZFNlIzbWorWGQzc21seVRSTEZKTXN5cUFBUG0ybm5rNTdlbFpQZzNRNC9EM2htU08ydWpxVVN6c0JjU01aYmlRWTZaNkxWZlZOR1BoUFRwcmxydGJ5MVpRSUVuaURESSsvdVBSZW5XclBoYjRqYURkYWJLTkxoeWtGdVo1Z3JoWTF3RGtBRHFmNkN1Q01JeW01MUVvdXpXcnUvSzFyK3ZRZkpLTksxSzhsZnRaZmo5M1VwZUNJTHZUL0RVbXA2ZnBkN3Bkd3N6cGJ4WEgzSlFUeSszc0Q3NHAybHRlYXRCRGFhcDRmdnJ5eHZaR2E1bGxsUXgyK1FTZG8zYmprZ2RCV2w0dXZab3ZDeWFlbDNkU05xeXI1RW1mbWdYY0dMZXZUajZWdWVGdE50cjJKcEk3NlJ4NWZsa3lBcXpQOEEzaHowNHE4UFJsVnJSdzlDNmFYd3UyKzcwZmtsOTY2azFLc29VblZxTDRtOWRkdlgxdjhBTlBkR1RxTnBZMjF0TXRubzl2ZE5JeUJpVU1PSThkeWVyRGoyclB0ZFJ0OU5sdW5zYlBUYmVTYUVERXltV1E0eU8zVUFlbGRaWjZMSUlIKzBQdW01aENTUHd5NXh4OVJYTitQUEExdzE3YTNlbnlDMmpzSEx5QkFDc2d4allSMkF6bk5QRzBha0llMGpEVzFsWkw4YmFycnYrUk9HclU1ejlsT1duZHQyL3Jwc1ZiZXkxanhIcGwxSE5mcmNXV3hUREhGR3llYW5CTzBOM0hJcXJyR25mWkxtR3pzYmlUN0xlWUVrRTBKVjRtSEF5UndmeHJXczdtNmJ3bFl6UENubVF6bFFobTJOdDVIQjYrK1BhbzRySzgxMkkzRjFxVm5idEZQc0h6WUxJQUFTckRHRG12UGxGU2ZMQk50cGF1OS94ZTJ1bjVYT3RWTE50MlVVM3RiZmJvdGRyOURJMUxXTGkxbG0wMk8xdXIrMUdZelBBaXVyeUw4M0lKeU1ZeGtBaXRNK0lyY1hOd3R2cDVlUzR0UUlHaVpCTEpJcVpFWkxZQUpQSE9BTzlhOWpZYWJONGFsamd2Zkt1RlZvMG1aOXdaejN6NzUrdGMxcnVwLzhJRG9WNEp0TisxM1VxWXRYS2h5N2JlVG5xbzZqMXJhVk9WRmMyaWpKTFZlOXAyZmJ0K0pOT1VhcmNFbmRQUmJYMjE4L1RzY2w4UDhBNGlhbHFtam1iVkxQVXJPSDdYSkZjV1Vrc1Frc25qWTdnY0VqYmtIN3BQR0s5RnM1WmZIU3JxbWp5MkYxYitTUXRzSC9BTlU0NEcxaHgyNXJ5eld2aXRjYW5jMk9qSHc3WjMwZDlFMzJxZUNjYjRIYmxsYks0eWNrOWV4clc4QWVMZjhBaFNPbVcrbW5UMEZ0Zk9aNGx0SmZOa1dOajhvSTZManB4eFhQUXJLbnl3cXl2RjI3TnJ0cnYxZlJvNjY5RjFFNVU0cFRUMjZOZGZ3dDVuU3lhVUg4RFhlbGE5cjExZFdjaXMwbDRyS3JXOHBZNWpWZ0FSdDVBNjhkNjg1K0NGck40R2d2TkhqdUxTK21hZDVvR3VTWFo0aTJRaGxPVno4M1QyN1UyK3NZOVI4UTNFeXk2cFphYmRTU3I1VW0wd2tzZnZ0bGlNWlBwMnJvbjBuUmZET3NXMGR0cDl2WXdYUThpYTVXNExJV0dXSngvQVd3M0lySEc0aXRLTFVuWnBwTlBXNjZPKyszeldwclJ3OU9NK1dONVh1OU5FbmJYVC9LL3dBZzFYVFlmK0ZoNmRHcXhhZ05TZ2tpbk5xL2t0QXhLcU03ZXdCNWIyNjFlZVdQVDExdTAvMHB2c0ljU1JYaFpZN2o5Mk1JajQrWmM0ejFKbzhFK0M5RmZWTHE3MG04aGFPemtPVWtsTTBpZ0hKUUE4c0RYYitHL0dXbitMZDYzR2xYbGc5aTVZck5nUnNRcHdXSFRCSFkrb3JiTDhIN2FMNW1xZXQ5ZG4wMHZyODMwT2ZGWXBSZGxlYSs1cnRwK0doNU44TjlPMG5Xb2ZMMXJUYmV5WFNvM3VIbldiZGc3U05vNnZnQittUDVWMVhnMDZ2NFBzTHo3RGNXdDNvTnd3bGdGNnBFMExNcFoxenQrNlBsd01kcTgvOEFHMWhhbjRwWEY0MW5jMlN5WGE3WmhKNU1kMFhUN2luT0FOcFBQSFN1b2s4UVhsbmNXemVLcjQyMm5XNEMrU2t1OW1CNFg1bCs4Y0FWeTA4VkNsS1hzL2RrbmE2dWxyM2J2K1Q5VDA2K0dkVGxjbTVKcE96MWVuWkxWdnp1dlF6ZkRjVXVxMjl4YVhVbDFhM2VvU01UTDVFUlNUY1NNaGVxOGVsTnVmQ1dsL0EySmRHbHZKOVM4NGJoSHVKYUZtNDdEYnQ1NEdTZmFyTng0OFg0TkN6ajBPMWJ4SFkrSnRUTVprdW5HZE9NbUFHa1k4aU5RQU52cm12T3ZDbnhldlBpVDhUZkUwbDlwUDhBWjYyQWprZ21uWGJDeklRaTdFNk1Ed2VuZXRaMVl5b0wyNmZOZlZxeTBTMWZtOXUyblFpTVc2MG5DeWowWGU3c3ROMHRIZjhBeVBRL2hkSlllSGZBRjFaM1ZwZFJXc2QxbFlIdGNyY3Brbmc0eU9nSk9CZ21yTXZ4bi90cnhVdmg5YkdTeGd2N0owWjVHVVF3NEJLZ3k4TUN3ejh2VEdNZDYyUGdscHZqQy9zTDl2RWtEZjJmTmZ5eXhRN0ZZcWprdVR5TWhjbmpyK2xIanZRZFA4TWVHZFRodGRGaDFTT0crVlpESzJibU1tUGNIKzc4d0hBQUJ3UVQ3aXZRbzRlcENpNjA1dFJ0MVdyMHZkTmREa2xXbzFLM3NveDk3bTBzN3BhcGVXdnI5NTVEcUh3eG0rR0V1b2VJYk9iVUpOTnZwRlNMVDlQbERyYnlENWZNUlJ6aGw2NSt0Rld0RjBueGg0WThWYXRyV3FQZFEyTXl4UjZQSEVmTW04c0RhVmFBY0RISnlNNUdNbmlpdDQ1Ymc2OFZVcVYxZTNYbXY4enE5dGlidjJWSzZ2dW1yZkxmK3ZNcWVLTk4wT2JTdFV0VzB1SzcwMkdKSWplMjh5aFo0bnh1a2R0dWQyY0FBSElCckgrRU9zYWZvK20rSXRTdWRKdVlZWVhFS1QzZHFmSUVlRkFRTUN1K1RleXFPTTRjVlkrRnZ4WDBlKytEMS80QjFxK1R6OU56WlNQYmFZeXRQS0c1RG5HZUNBTnljSGptbGF3OFRmQjIzdkxQVTQ3WmZER3QzY2t6dzZqQ1dsaUFVbmZicUNjWmRFYkxuUFVqMHJ6Nk5TdFdncXFYTXJiY3FWbTNyZTd2NmFMOGtkZGIyZUhVb1NzcE5yVlNidXJicjdQbTlYMjlObXdnWDRqZkVqUkxlODBjNkxyVzJHNFl5U1BJVUFqNVVJUis3WWtuTEE1QUhRNUdPYVRUSWZDWGpQVWJmd3pQRDRaMGU5dmJlS1RVb3BrbmpaVWRrbFNaU29IQTNBbk9jR3JuaGJ4REJyUGlpMTFQUmZGbW0zZWszOWpKYnpYL0FBSnJlV05sRElPamVaMUcwREl4enhXYjhTZmhSWS9FM3czY3h3dGMrR2RQc1MrcDZqcFZ0TDlwKzNQdGJhTWpMUnU2Z014SklKYjJybzVZMHByRDFaV2Q5ZEhvbW03TFR6dHJidDZjZnRKeVh0YVMwdHFyN3U2VjN2cDFTVisrek80K0srbS9hWXRNOFAyMExYMzlyU0ZVMUo3Y21ONGdoWkVpS2s3aHczQkl4anIycnBOZitFK3BhOThRUER0cmNReTNjTmxwemxudDRHdFpKVkNJQWZOQkkzQjlweDcxNVY4SmZqdHFuZzd4bG9PbitJTGMzV254V0FsMHd4NVdTQUtNaEhLNXl5amdxY1o1cjEzNEovSDYrOFIrS05WMGwydWJpT1hVNUlwYnk2ak1LUmgwRWlKRnVJSkFCeG5IcjZWblJwSnpqU3J0eFhSSlh1cmFXdW10V3JmaVo0cFZlWG5oWjJ1MjluZTl0YmEzVzluNklxZUtmRkd2Nk44TmRMbHZyMjhzdGFPcTIxckZwbHZDdStKMmZZZ2NnaHl1RGtuMnowcm1QaVA4SGw4YitLdFZ1cmp4RnFtbFNXY0VObGZHRlZWMlptRERPM0Q3QUd5U01aenlhMnZGZHhvSHc5OE42bDRtMTZ4MUsxMUN6dXN4ZVJPSnZNbWtMYldKeVI2QW5vdnR6VzU0VzB2Ukd0R21uMVRYbzcrN3RmdEZvczVFbTlUZzQzQmNOdDRHRG5pdVYrelVsUEZ1MGQ3UFJLMSs2MzIwVnJ2UXFNbkdMZExmdWwzdDIzVytyOVhzR2dlSHZDV2w2QmNhY2plWjRndDJrbXQ3eUtmUG1rUkJSSmpQR0ZBVWpKNTU3MC85bjVqRjRUdkxQeGJkdmVSYXhleVh0bkJQek5aeE5rQmczM3M0d1NjY0Zoelhuei82UG8rcFh0dmNhVFlTM3R5eTZjOEZ3UHRMeEJBSlhrK1llWElYL2h3UGxBNDV4VjcvQUlXYi9adXFhYnErb1hlaDNsckRZeUxjeVdwZVNhM2lZS3BEdHlxczJCaFNRU2VnUE5ieXgxZWhHTTRSWExIYTBiUmNYdHpkM1ova1U4TEN2elJjbnpQZTcxVWxxK1hzcnI1YW9zYTFydDM4TXJYVGRVMWE4MXlOYkhWNTdSRnQ3QitJUXUvY0Q4eFpUR2NFNDY1NlYwM3hoMGlEeHZmVytwV3RyZlc5NXNTNWp1UDllcFYvbDJrY2Y4czJCeDJ6VmZ4SHBXb2EzNG9XRjVMcTFudms4NjZnbWxUYkltd3IrN09mdkhhbzR3RHQ5elZBYXY0azhONjNxS3lYOWcra3cyZjJlVVNLV2tpd3VTZG9QWEJBTFpIU3NzTGpJVXFuSktNdVcrcWZrdEwzWFcrMXhWc1BLb2xVdXVaTHBwNjJ0cDAzSXRTMG54RDRRK0djZW0zTnJadzZ0YXhRV0QzRWNoajg1eXBIbllITzA4bkhQSkFyUzBUUUwveHhETko0Z1MxdklaVzhzM01zQlpaY0wvcVFyTm51b3kzWFBTby9CMHVuK09OUXZyWFVKSXI2NDhPV1VOMUxFazBqUE9oVWxXOHZHUTJCOTNKeWE3dndkcitnK0YvRFZ4ZFhUWGVtcXNodUlMYlZtTUt5bklBWlZibjArbkZkZEZReEZWTzFyMzJkbG85ZHV0dGxwZnB1YzJJNXFjUGVYTmJ5WFczNjYvOEFESG5mZ2o0U3llQ3Rhcy9EbmgvVHJmdzdwdDlBODhVSDJZdDlva0IzT1R6MkdQejYxM0svRC93dm91clhzTjViVFhGMXBZRTBsMHhBamdaeHVDN0FlK0NlZXRhQStNRmxydXRXZHpNYk9HN0huSkFYdTFWWkV4bkNZUE80cUQ2L0xYbmZpN3hscG1odGZhcEpGUHJEYXM2M0NvOTk1VU80bktJUm5QeWc5RFhGVHdXQ3B6bFBEdHVWN3R6L0FKVXUxdDcvQUlHanJZcXMxQ3I3dWlzbzIxZDdMVy9iYTVlOEgvQXJ3VDhUTDNVNFRNelJ3VHJlUzJ5TzF2dGRtM0I4N3R6Y3JuT2Nkc1ZvZkVqNGtTL0Qvd0FXdzZYYXJCcWVuMzFsOW4yZy9jbERZSmR1MkVJSUo2VjQzcTN4Q1MzK0lsdlByMm16ZUc3T0pjc215YnpyeUxCYmhVR1NBd0J5UU9QcldQZS90c2ZESHhKb2srazZEZlhIOW42YXp1YmlLQ1JwSTVtT0dVcTUzUG4zSEhhdW4yYjBqR0xpKytyVCs1YWRiN21WU20wL2JTbHpKZE5McTJuejEyUGE1dGJUdy80YlZyeVNhR09SNWJtMXRyRC9BRlVraWRUTVJrRDcyZWVUMXAvZ0c5OFhlUHJiVGRXWk4xaklzc1VsaTBzY0Z4TXEvZFpXS2s3UWY1NXFyOEtvdFkrSVB3M1hYcEpKcmNYTUpXVzBaRmlNakRDYi9MUEkrVk9NNDY1NXptcWVzK0kvRzFzOW5wOXJaeHlYbHR2anViaHBJMVdKR3h0K1hqTGdaSEhZMXpTY2FNN3ppK1gvQUNmVzkwK3BkL2FRMGF2ZDMrNzVQdC9XM2EyL2liVzQ5S3ZibUhUR056cDhjalo4ejdSdUpHQ2dPQ1F5cnllTWNWK2JQN2ZuL0JSM1h2Zzk0WTFUVEdqMGUzOFRhZ1gwdTJVenFZaWpaM1M4Z2JHUEE1NHg5ZVB0MjcwN3hacmVrYTFxRjU0bnNkQTB1K2haa2RKSTF1SnBGancyMVBRZ2RzazlhL0JQOXVXeTFEL2hZc3RtdXRmOEpFOTVxai9aWFNRR1NKUmxSdlZpUUIxNmpBNHI3RGhmS2NKajZ5ZUt2SlJmTWxaTkx0ZTl2bmEreDRlYzVoWHdWQit4NVk4M3UzdTc3WGR0Mi93TTd3bCsxQjhSVThhYVJQWmVJSm85UzFhUkVOdTAvd0M3bHozMnBqSTlSa2prVis3UDdOZmkvVi8rRUJ0N3FhS3grd1hrRWR2R0o3WXl4VHlsVkRrWWJJQU9UakJ3QWEvQlA5bHo0Y2E5OGRmajdZNkxwd2tqbXRMazJjVFJiVyt6N21Da0wzUGJwNml2M20vWTk4TTZyOExQQlZsYjZ4SGRhbGNhYmR2Ynh3U1pYekpkcXJoY2RBQWM5c2l2YzhRTXZ5K2o3SDJiVVo5T3RvdTJyaWxzck8zYlZIbDhKWXJGVmxVZFJOeDZ1M1ZkTHQ5ZExuMFJMNG0xRHdUYzJadnRQdXZFY2s2ZlpyYUt3aVJZZkxBM01TVDZMazQ3NHhWUHhsNFowdnhwcFZ4RjluK3dhZmRCV1cyUWhQS2xJT0h3T01rY0VHdWI4UStOby9DWGltYlJiSzhOMWZUS0pZTGRIejluWTVZako2SEF3ZWVocmN0UGlDL2lyUTVsdXJXeHM1TE1abWpVdHZES3ZKQkF3ZXZyWDU3UnhEY0pVS2p0WjN1OVczMjVucTE4N2JkajZhVk9Ta3FrVmR5UzIwWDNiTC9oKzUrTTM3UVB4QjFMOW4vL0FJS0UrSFd0WkpMSFVJNW9ZVnVsK1l5N1pUa1o0QUpHTWM4SDE2Vit6bndNOGV4K0lmQ1dtNnQ0ZEZqTkhkS3FhbXM4aFc0YVhHQ1E1T0c1eDBGZmovOEE4RnNQQ3QxNEorSVZqNHk4UHdMY1dHbnlaam5tSTh4M1lnL2N5Ty9BenpYMmIvd1NUK0x1citOZjJlZkROOUhidGQydHp2YUV3c0gzeWdrc3BYTzVkcDY1R09LK296UjFaNEtqajZkMXB5dDlWYlozMTFmenZjOGZCOGlyVmNOTnA5VXJkOTEwc2wzNmFIMnhxdXVYUGpYeEhOb0Y5cGF3NmZLaFpwUmNiVHRIcU51T1RuajZjMXplay9BcndYTnJ1ajZuYjZMZkpQb0xTRzJjWFRySENHNmtvdkRnN1I5NnRheDhUYVROTDUycExlVzkxTEh2bmlhQjFrSnlDTWNjZzg5SzEvRUhqaHZDK2ozbXRRUmlIU2JXRHpHSkFETUFNNUNubmpwanJYenVGcmUxVG01Sjkya3BTdHZzMXBicTlIZDJSM1ZLYzZiVk9DY2ZtMHI3YU8rdHpFWHdHK2tYaFl5Myt1U1RTL2JQTWx1UkM4SFBDS095WTdlMWVpNlJML2FlbEZiclQwalhiOHNaWU51L1N2a3p4TC93VXkrRXR0NDZtMDJEV0xYL0FJU1p6NVp0NVlaTnJnRE9HN2djNXlLK2d2Qlh4Ylh4bG8xdExwcXgzRmxORDVpenhNUW03SDNlUm5qNmMxN3VYNGVXQ2Z0MHBLTWs3ZTdkUytiWDV0K2pPSEZWWGlIeWN5Y28rZXErU2R2d01LMThNYWxvM2pPK3VOUTF5NmowbDBrMldrN0F4eDVQeXFqRTU0OXEzZkQrcWFmcXlUVzArcFF3WEZ2R3NTajdRRjh6cVFTRDY1eHoxcW0yaE5yR3F6UjZqZlcwMHJSYjl6UTd6R0QwQ2p0K1ZZbzBjUlEzai8yZmF5eHc0RVRoTW1kQWZtSjM4NUI2WXI1cU5aVXArM211WlhmVmFmZHMreDZyb3FhNUZLejAyVmw2cS9mcWRscGVsMjgwTTk0SVRaelFxcFJIVUJTNDZQazlqNjFqK0w0Tk8xK3h0LzdVbXNZZFFuZEpJb1VtQUlrR2RwWEk5RGtnZzVya2RhOFo2bnBGalpzdm1TUnh5blB6NEpUcW9KSXh0R2Z4cUhXTHJUV2swL1dOUjFadFpralF5d3hXY0piREhIelBnRURBSTZrWnJTdm1FS3lkS0ViSmIzdHEzMXRwcjAyTktlRHFVN1ZKeTcyYTEyNmVqL3A3bHJ4NTRIdXRFOEZydHRiZTM4eVlMSmMrUUpHa3pqNXVEdzM0Q3JHaytMN1hSdFkwZlN0VUVNMTdNR2xpZG9pMjlRaHlwQXlxc2ZYTmMvcW1vYXA4UnJPSFQ3cTgxSm83VUdTRzZnSVZXMmdrN2tHRGdnWXhUUEUvdzA4VlF4NmJjV043UGZXY01ZbDJ6TUU4czRKQklQelkrdWE1WXVIdEZHaEZwYWIyZWlTdmZXNjEvd0NIT2lwSnhoYXMxZlhadnJ0YnVhdmluNGk2SGJhZnFkbnFYaHEvMEpMZFZ2a3ZKWFdBeWJ1Y0kyM3JuamJYRXgrTHA3VFJ0VTFmd3ZwbHBOcGN3RnRKTWJyZEpzazRPd1lJeU01SUFOZC9yR2xhZjRvOEZKRHEyajI5eGNSYll4QUozKytSa0g1dW9KNS96aXNYeFo4R0xqd040UDB1ejB2VG8zdFlwWXk0VTdtQkp3U3BYRzA4OGs1R0FLNkoxTHFVNVJ1NHBMU05yYjIyUzJNb3hia3FhMHUzdTc2Nlh0cXpCMGZXZGE4UlBHb3ROUXViT1Zmc01pVzUyQ1NWY2JUSmxjbE5wNmdETmRJZFN2dkNseUYxZnc5ZVJhUkxGc2VRdDVnaVBxUzZEQTQ0T2M4MUZaM0dxNks5cEhIWlg0ZDdqNTlVWnRua3NjTHR3QmdnREdPSzZ2Vy9BbXBheG8yZFUxbFdoMjdkUiswUHZna2pQZkJHQmpybXVPaktFNE9scmUraWVsK3V0LzAwTnEwdlp6aTIxeXk2cjVMUzM0WDE4ak04SFhQZy9XSTQ5VDhPL3dBVng1N3l1Mkk0djd3T1Q4MlBUZ1ZwYTdxbGg0ejF1M3RiNlpwbzdqWUlMbUlPa1UrYzhaNStZZS90WFA4QWlTZTMrSEgySmRJdGJXVkxjQkhrZ3RDUlB2eHMyQWZLQm5xVyt0YXVvK1A3VStITkYxRFViV3p0OWZ0Wk1pMExtWlY1K2FUNU9CZ2YzcTZ2ZG01ZTBWbzMxN08zbGZWcGE2ZHRORG41dVZ4Y2J0MmR1NjYzMjIvcTF4bml5YVA0WCtQb2JHOGdHdmFkck50aUMwT0ZWWFFiU2R2SXpzNzhaM1ZWMTdRZEIrSW5obXh0dFBlWHdyZFRPc3kzTjJGZFZNWUFhTVpPTWtOampwNzFoK0t2aVJmYTk0MGFTU2UxYXh0MTgrTzluczNWVWlJK1pWQ3IxRGJjazhHcy93Q01PcGY4TEY4RlFhUDVGdmVSelA1ZHVJSk5yRjhNY3Vja0w4Mk9EejZpdWVPSWpHcEoyVHB5ZWlzbnBkWDd0THJ2dWRsS2xVWEtrK1dwYlZwdEs5bmJUYnRkV1hjOUUxNzRmYVBlWFVMWGxpdHpZeElKNDd3ekswYzhzZVc4c3IxSHJua0hKcmg0ZE4xTDdOSmVXMFVVTnZlT2JpOHZaTUkwY1VlQ0VSU09jWTZBNVBYaXEvd1grSE9wZkRud2pjU1RhdkhzdDR6TkJZM0V2bUxCTnNPVnlUZ2pPTVl4M3JMK05TeldmZ0pkVTFtemJ6N2lXR1V5MlQ3L0FMS3ZBRzVBMzhad0I2NXhWendlRnhrcFRncnhXbHROYnExK3VpYTE2K1pPSHJWYWFVWnU3NjcyMDE2OWV2cjBPdytKZnhFMUw0WDZaWStKOVAwN1V2RU9qc1kwdWJheWZtNzh3QWhpRzRDajJCeG11YzhlL0U3eEJmNlN2aUN4dGJIU2ROdUhSYm0xMUNSdk1pNzVWeWRtZUFBQXBJclIrSCtyNnhxVXNXbHlhbHFFMmc2cmFRM2tTeFd5Sko4eCtlTnNqNWNaR0FCd1AxNXI5cEQ0a3dlQVBDMnVSNmxaU2F2cHVpeGk2alNHSVNUUnFldlQ1Y2pHZVFTSzF3ZUxvUWYxYWxvMXJaNnZTM1R0Mytkd2VIYnFKNk5XM1YxZGRIcjF2YnAyTlB4MzhXZEoxeE5QaGsxWTZYNGsxS0pKVFpPamVaYUtxSG5JSktoZ005QlJYZ3VvZkZ2d0w4WVBFdHZkNnI0WjhmV3MrbXdpR0hVRnR0c3NnSUpJa2NZR09UZ1VWV01wMnF0VGkwK3RuWmZJNmNQVnJScFJqVGNiVzYzdjZiRno0V3crSVBIZnhYMGJ4SnFHblNlRzd2VkZTOGZUNVlRa2Vvb21kKzVGRzJObDNJd0NmZTJrbXV2OGNlSS9FSGlYeHpyMWpxMnBSNnBhMk82NnQ1cENmM0lqeCs1VlZITFNFN1JrY0Z2VWlsMW45b1hYdGNlUFM3T1RUN0hYTFVHeGswTFZaUEp1cllFaFduaWtBeTNEREhBQVBHYWcrS3Q1cjNoelJiaUxUZEFnYThHbVNOTnFFMDdDN1ZrK2RKQng4eDg1VVBwd2ZTdFByU2hpT1ZwSmZhVGZWV3ZiVy9kSnN3bGhlYW5CU2ZSMnRybzluMnZvbmJiOFRPMWo0WjZiNExsenFXaDM2Mk9ocEo0aHZiV3pIbHk2ZEpJTngzZ1lMQUt4QkF5TWpwVGZobk40ZjhiZU9iVlBCR3JSUjYxL1o2bTRzTGlSM3ZMa05DV2pFcWs0anlwSlV0MzNmM2E5bTBYVEc4YWFWcHVuK0lsMUMxMXpXdkQ2WHR4ZTJxdERDeS9LSFh6TnhERWx3ZHByeVQ0QWZzLzZ4OEIvaWJxWGlMeFJmV2Q3cGV0WDdwWjY3OW1XTzdhS0g5NUV0dzZuOTRpcTBxN2pnWUhUbXRvMHBWSEtyT0RqS1ZscTczVGQ5bXRrbmU5OXdxUzVZcWxHU2ZMZmJUVmFhTyt0N1d0dlpNMlBHM3d1ajhCK0tFYTRzN2pWcmU3aGFMN09KUWtjUUs4c3hYa2tjOGc5QVNjMTU5OGEvd0JwaXo4RWZDUzZhdzhPNmhkeVFTUlRsSUxoMTJ0R1BLWGJsdW9CSDEvQ3ZiUGlUcUYxb21yZUhicVFOcm5oR1FHNHRMalM0ZjhBU1ZMNUl3aTVKakFPRGo3d2M5cTVuVVBBZW5mRnZ3M3FuMjdSN05vTkhtajFncExiR0thN1VGdkxRS052bHJ1QzV5RHV6bXVmR2V6ZUpqU2hKV2oxNk5KZHRMZjB6VENjME1PNjhydHZ5MVR2MzZ2MTlDait6bG9HdWFwUHA2Nm5yV3VYRnBDV2tGcnFMT3pReVNOdUVaWnVjQkFkb0p4ODJPZ3IxRHh2b1Y1WngrRjVMbzZoWlF4YWl4OGlSRTgrVkhpTVloSFAzYy9OeFhLcDhJTmFqOFJ6ZUxMZWFhMXV0ZTB4ZnRNYjZtd3NVSEFqMm9UeThlM2NTTWN0eDFwdWsrR2RGMWJSclpaTmF1THk2MCsrYUMxdjdtMWRVRnl1N0xxeFk1QUpQSXpqRmN0YUVZcVhJcFNsYnlYVGZiYlkyNTV6bEZ5Y1VyK3ZYYmY1SFhhcHB0ak0yb2FMb0ZycGRucG1rNmRMZFM2amNSaTZEWFpJQWlLSGt0eXhPQ1B1Z1Y0bHBSMUxRL0FHcVdWMUpadGE2aE41MTR4dDBXUzdicnlRQVFGQXdNWUlCcjAyOCtIci9ESFN0UWxnRmhyR3E2cGVpNkY3UEdVVzFsTU1hbFFyWkFCS2xneFBWdmZqamRFOEplRVlmaW8zaHpYN3EvdDlMMnBkUXdYTGsrYkxnbVg1aWVJOTQ0eG5QVEZkR0hwVTVVNWM5bnk2dHYxMmZSVzd2WHpPV1ZScVNpcjYydDNkdFcvTitYb3JHYjhQdmk3NDYrTStuZUk5UXY4QVE0YmpTZE9qaHNMSzZqZ2xzM1pWSkpDUDEycXgrOE9wOWE5RVc2ZytGVjliMjhGbWJwYnh6TnJNYzhjak5KRzhKWGNybmc0d2h3Y2c0OVRYQnA0NThaZkUyNHZ0RnZKcHRGMXpTMFVDMnZBMzJVb28zUlNDVGd2Q1Q4dWNBNVZ1QVJYcFBoUFQvSEdtYXhKcldzZUxQRGRucEsyOFVZRjNOdWl1NVJ5L2xsc0VBQTdRZXAybklybHdOV25pTVczQ04xMHR1OVBOL203YitoNmVaNEZZVEN3WE90ZDFkMlczcDUzdDVlWmovc3d0cE9zK0tKZGVqc2RZMHhiaUMyMDZMVVpybmFibVJVSTg0b3I3ZHBPT0NCajA1cjBmNG9lQ1BpRnErdFc4ME91YUhyR2xvRS8wYTh0SUZYT2ZtSU96UEhCNFBicFhENjU0bDhFZUt0SGI3UGVhUFl6NGJVOVZFRSswM0VqUmxYWkl4MUFQSUFQWEZYUEQvd0FVN1R4RXVpem1hMXRMUzY4cG11VVZ2S2xqVXFYUjFZNGlKWE9jNXdUWFZqSzlPaHowb3Q2M2J0ZEpiYVB2WkpXNnB2UThlblRxVjNHdEZMVG8xZjUvZmZiZnFpUHdiNERUd0g4UU5hdVBFOWpwTndkTWlFK2x6bERJU1NQMzNsbkFJSURnREFPZmJOV3RQOFZlRzc2N3VQN2EwMW0wMjZnRjVCZVI3REZFMlFWUmgxRWk5YzlPeHJlK0kxOHVvYTVwZXR5WFgvRXZzMmVDQlBra2hNRHJoc2dISXpnRUgyRmVPL0gzNFhhcGVlRDlMajhQMmY4QXBsMWR5eVcxNXA4L2xob0pPUE1rVUh1cHlSeVFSNjE1anhNSXFOYW9uSko2dEszTGQ2YzIvd0IrcDA0ZWpPdEZ3dnl2b3JyVnBYZHRWWituWFRZL1AvOEE0S2lmdGhhbnBmN1FrMXBONHUxYUxUbGxTRjN0cm41cmUwWWp6RVUveE1SMDkrT0s3ei9nanA4SGRFK0t1cWVKTmIxRzVGN1kyY2s5enBkamNIWmRYY2FwbERJVXdRUzNROWErVC8yOHYrQ2ViL0NINHZXbXA2bjRxdk5mMXJYci93Q3pXTmlyeVhBakt5RHpIa0JQeTRCN2p0WDM3K3dWOE83WDRGZnMvUjZwcVdsNnpvS3NKSnB0VE5zMXhIRkhnbmVwNEJIQkIvdWl2MWZPTVJocWVTVWFHRTk1emFkNy9FOWRIcG90ZndQaDhyd3VKbG1WU3BYOTFRVFZyZkN0N3AzZXVuNG4xbDhiL2lrZmhoWnBmTlp5VytuV3RySkwrLzhBM0N2MEtSSTJja2hRYzUvbldaOFBQMjFORThmL0FBNjFTODFyVFJwbHhwc0VWekZIZnc0ZThVZzRYZUR1T01kZWEvRmo5dEwvQUlLSitLUGlmcnVvYVZvL2lhYlhOSGgxS2FPemNPMnp5UUczU2JNbm5jZnB6WGhHdmZHdjRpZkVqU1lIaDFLNi9zelRCdW11amVzb0FBNUNqUFRHZWg2MWpoT0NhdFNncHlrb04zYmplNmQ5dG5wMUp4SEZOT05Sd1Njb3BxeldsdS9tejliUDI5ZitDaEh3MmJTYjNUOUgxV0c4dTVJRC9aOGRsY3RFc0JBS2xNWkdHemtmU3Z5QlhTZFU4U2ZFU1hUZEV0N0cvd0JiMWk2Mmg1Wjkwb2dLQXQxKzZRekVaSG9LcS9DdXgwdjR0MjJvNmdvV2JTZEREWGdXZWIvU0xxYzR3a2JIcWQzUFgrSTExUHd4OE8rSExMNHk2ZHFWbnJjZHJKY09QdFVSVlJJcmpBMmJ0dzJLTnVNazErZzVWbE5QQVlhVkxEOHQ3TG9ydDlmbGZicWZKNWhtVThUWFZTdXBiOTNaTHAvd1hjKytmK0NYMy9CTER4WjhHYkdQeE5xUG4yT3QydDRzOXRKOXNaZ3hrK1pYWGs1eHhuUEJyOWJiQkJyMXlzR3MzV214WDAxMnMrK0VoTnlsTUFsZWhiS24xNkN2ajc5bFA5c0RTZkZud24wYnc1WTMxamEzMXFnZ3ZKbmtWNWdEemxrSGZQSFd2bzd4L3dEczdhbzFobzhsM3JVMGNrTjBrc015RGEwQUpHZUFDVGdaNEp3Sy9BYzF4V1kxY1RVcVkzWDJmWFZXMTBXbXk2SjZmcWZyV0V3K0NqaDQvVjJrcGJkWHNyL1BxMTFQVHZEUGhiVGZEdmllOWtLNlRkWGt5S2x0KzVEU1JMMFppUnp6V1A0c2pPZzN0dHBWeE5iMm1uM1R0RzZTcVBNdWNrRWxkZ3lGSFFFbnZXNTROOE4zcTZUYTM5dHFDelhFWThoZDBSaTg1TjNKYnVEejE1empwVThVR29SYTFkSFVyWFRKNWtPK0Z6TVhKaWJ1TWdkRDJyYVZQRTE2TVpUVnI3UGRXZXVyM2Q3ZmwwT0dOU01LalNkN0wwMVdpdGZiOGQyZm54L3dWcC9acDBmeEY0TDAyODAvVnJpRzZtTE1rTVkzeHFWYjkyTnA0SlpzZ3QyOWErRmYrQ2JQN1gzakQ5azM0NzNIaE8rMWhkQml0cHBZcG81VEcyRkxGdjNha01BU01aNzgxKzAzeHg4SEw4VFBoLzRtZTgwbWE0aGh0cE1KSlpiVmhWVllob21YT1NHRzcwT2Evbm4vQUcxdkFNM3dMK1AxeHF5dFk2Zk5Za1hNTm5mcmlXY09mdmhjRTVib0RYMXZDTmVGU2xMTHE3YVQrRzZ1ays2M2VuYStoNE9lVWFrSkxHVTBtNHZYWFY5MDl2dnRxZjBTZkJiNGtXZjdVdmdUUzc2d3ZOUzh5d25EdmVSUlIvdjBVRUFQa1lHYzV4Nml2R2YrQ3VmeGg4UWVFZjJhZkVHbHJmV3VtMkU4QlZaYmVRTGM0QXp3ZnFCa2l2aGYvZ2psL3dBRmZKSWwxRHdqcjA4MWt0bW9lQ0dObURYTE93R05oR0RqZ1oveHI3VS80S00rQXRGL2FoL1pkdm1rYmJldzJKOGxGdUVTT1dRak8wdi9BQURQYzlLOHVwaFBxR1BpcTE5OVhiU1ViOXRiMjZub1U2MGNYaG5LbFphYUp2WnYxMnYwUHc4OEJlS3JyWFBGVng0aHVQRmsycStLdE8zbUdPZFZEM050L0hsZ09xak9DZWVLL1ZmL0FJSXRmdGNSMzBONXB2aTdWRHEwTUxtYXdtbXZpRnN1eFFSakFidnlRVCtkZmp2ZDZUSjhPTlIxYTJ2bzRyTzgwK1pyZjdNSlBNVW93d1AzZ0FEQTg4aXYxUy80SXpmc3pXUGpId05ZUjMybTZiZlIzTTQxRDdWRUFreTdCZ29yai9sbWQ0eURqa0N2MVBqQ25ocU9WcWVJU3U3Y3F1MDA5OXRyK3A4Snc3S3JXeHNvMDc2WDVuYmRlcTZlZTJwK3AzaDd4ZnBHclgvMmdYUWptMUlobFJiYkxLUGR2VDYxYytLVXpXbWlhUytueVJ2NXR3a2JOSnlYak9OeEhHRHg2MURIb1gvQ0I2QkNOTFcyalczaDJSV3I0WWhRT1FXUE9lbk5WdEYwcXk4ZVdxSnJHdFdOeW9UYkJid01GOHZudnoxenhYNFhUak9jSlVZSk9WazlkTFhkMXEzMThsMnVmcFB1YzBhemJzdE8vUzJpc3R2Ti9NWi9admg3eEI0b3ZMRzlqLzBlM2pVUE96WWkyc29JUlQwejNJR0tyV0hoendqcWVyblNQRDlyTDlzYXlNaStUSXhqYU5TQnRaaVR0UFRnWXJwOWE4UDZEYjZEYjZUSXNhMjBFZ3VtOG9EZHdjY2crcE5jMVoyTmo0QzhkMk1sclBkYkw2TmlMYUdQRHlNU01aQTV4MVA0VnZPbzhPb09wQ000dDNrMXZxbG90OW5zMHRYZlFxakdGWlNkTnlUcytWZEhicTdkK3oyN21SOE1mQW1wK0V2RWJhYmRXc3l4ekV5N0JLQksyM0dDSGJnam5ubXIrcitITGk3MXU2dU5VdTlTc0xPMWJlSm51OXFnQTV4Z1lYQSttSzEvR1B4Ty90ZnhLdW5hV2x3THZUWE1kemNyYW1SWTM0TElEZ2pJSFVkczFqK0cvaHUzeFg4YzZoYytJTld1YnpUWTdSWUUwL2RzVWtra3NRTWR1TUVkcTlENnFxMWFPR3B3VW0zZE4yUzJUcytxYTFYYS9ReW8xcHhwdkVOOHF0cmJWOXRPbXAyRnZiNkxyOW5IcUUwMGR6Tlp3TE1wamx3cmdET2VNQTlNNDZWdy9qTHhQZDZuNFdhNzArK3NmTWlrOHlaUUNKRWlZL0xqSEc3K3RYTGJ3QnB2d3MxZUszOFAzVTAwaXpHVW81RWlSSjl6eWd1T2VEMDYxdGFqNFNzN09hYVNPTjdhTzhkVElpV09OalpHMHFEMkhKSXhYRG1GYW02N1VrbEtMOTlMWnQ2cDNUMXRzMTIrWnJoK1dFVTVONi9ENWRHck5mTmVad3VuK0xycVhUMXRkU2xWYmU4d3NjZU16VE53U2MvVDhhbW5GOTREMFB4SHE4ZXI2ZmNRV3R1MDV0YndqN0tFQy9kWmpubmdlbk5ibnhxdTQvQVBoZVM0dUxXejFiN1JLaVdxZ0NJMnVjWmJjTW5ISFFESnJ5WHhacDF0NDM4QzNHaytNcmV5aDhNM3dCdjV0akJGUmp3ckFFY0U0eWE4bkV4NWErM0xMWmE3WDZYZDlIdnBwMDducFlQa3FZZEp1NjNlbDcydHRwdjBlejZxNGZBLzRwYXQrMEo4SDlOMWkydC83QSsxRlExM2FPSmVyQW55OGpnakI2RUR0eUswUjhSN3pWTG5XSkxqemI2eTBYZGFyZVhOdkhBNVlMaGk1alVCaHp3RFcrL3h3MGo0UmFQZWFEcHRuZVJSNmJHZkxqdDlOVm9WVlZCR3puYmdnajNyeS93eGVyOGF2aUZKNG8wK1B4Qkg0ZnM3d3ZOQzl0NVMzNVZBR0JDL0tTR0JBNjlCWFJoNmtGVWRLbTN5eFh2SjdSZmV5ZXYzYmsxdWYyYXFUaW8zZWo2dTJyU2RycnByZjhHZFZZNkJybmhrMk54bzk1Y2E1UHFEcXFMY1JaaGlVUitZTWhSNmdmTGpuM3JQOGVmRWZUZmgxNFkwM3hONHIxaTZhYXpuTUNxTkg4cVNHV1FrK1hzVlJuNXM4bk9LOUMwRFZOU3N0T21aZFIxQ3lPdFRtYlQ3TjRQTmxqWCs2d1g3dVFPQ2VLNVA5b2EwdU5Gc1Y4Vi9FZlU1L0RuaHpSNHhLcXFSSmlaaHhDdTBjL2RPU2E3cTJGbFZ3N2pRaHBLMTJra2tscjAyYjIxUm5oYXlvMXVhck83Vit0MjI5TnJPNnY1Nks1ei9BTU1QRXRyNHg4SmE1Y2FqTGRSNmhxTnhjeVdNTTArK1MwVmtYNXNjZ0RKT0IyQjlhNlB3YjRiMDd4UmFXMWhlYWdMd1NORjlvamtBS2dJZDRiUDNtNUNnRG9PdGVaZUFQRkh3OStLM2hpUFVOTjhXTWpBenhXVm5HMFNvd2tUYXBiREYyTE0yY2VvSGF1b3ZQaDlwWHc1U3gwMmJXN3JUZkVrZGdMeVJJbUhtTkhqYmdKa0UrZzU3MTU5VEE0aUVvemJTU1NUaTczdDF2YXoyNmFuZFF4VkJ3bFp0eWJidXRrL0xmUy9vV3J2eGhxVXZ4S2JRbTF5ZlQ5TzBlM2xuajFCYmRWdUpIS2xRcFZjcnNJWGoxd2VLVDRkYWJGcjNnL3hOTGVORGZib0VTUjd1UXhmYUVjbGQ3c3hDcU9lZ0ZjcG9KMUx3L3BlcWVMOVZsMWIvQUlSdTF0eElQdFZxelhpdDk0Uk1BMzhKWUxqSDFBNlYxM2lEeFJydnhVOExhRFl3NlRhMk9uNjVKSEpkYnlFMnhSU0syeVVmN1FHQURucWVLNjhMaCthc3BPRVc3V3U5SHIzZlQwWm5VeEZOVTdKdGEzZHV0bmZUdnU5dEwvTWQ4U1BoN3Ezd2wxU09id2JIcHQ5bzJyMjBUYW45b3ZUTHNkQnRVeHFTZXJZenR4d0tLa3NQaXpxbXNuVXJIWHRJc2JDVHc3T2JkN2hyWnJlMm1qSi9kbEFGR1NBeWdrY1VWeVk2dFRvVm5UVGpicGR2YjcwZDJCcHlxVWxLcHo4Mnp0YmRhZmYrQjQ5bzNpRHd0WWZGaXoxbTEvdFM1dDlXYWJUTFJwSVBPbWE5aWNLaXE2NVFodVRrOU9lbld0SFhMVHhsOEsvamY0Yy90NzdSRHA5MDkycCt4d3R4Sk1NeHhrTnVMNFhjelk0R09POWRWcUZyWWZCM3dCOXQ4TjZQZFFXdHZmUHJYMmtySElVdUhJTEJnU3pZZmxUaFRndGtZeFhJK0hQRUhqbjRvYS9JM2liUjVyYzZlTGUvbXZJWlA5STBzVFN5QllDWTIydnRCR0d3ZUd3eG9qVHJUVDVrNzJka3Q3THkxYWFWdnhNL3JOTnRPbTA0N051MjczdDAxZC9UVGJyMzN4QUE4TE5jNmpwZXJSWCt1ZUg5T0wyZXBYTTI2S0R6Q00yMkZBem5BNHptclZoOFJOVjhkL3M5YWJjYW5wOXV1cVhsaFBIZFdoY3dXOFRHUGFZMTNaQkhMQTlSWGsrcS9CWHg1NGwrTnZpS094MGp4RnJXbXlMYlFXbW55K1ZHSXJyTG1TNG1rWXJoUUZYako2akF4VmpYUEYrdC9EYTZYd3Y0aXZ4SHJXbFBGSHE4Y0Z1WENsdHgrMFp3eWVYSXNiNEFDa2JUbkZkR1pLbzZNSzJHaHpQYlpxejAwZm12a1k0S05LY25DdksxdW51MnRycjMxdXU5Nzk3bm9uaExRcGZIbml5eXVORDhUV2YyRzZzV2dTZVczSm4wcWFCU1ZRaGNLMFAzZ0dHQm5IWHBXbGNUYUg0TzhONmhvT2s2aytwYXByOGoyc1YxTkNRajNDK1p4SXh4dFg3MkMzR2NqTll2Z254WnB2Z1R4aGIrTWJpenRiVHdscWxySFpXVnJwakNScnZlNUQzRWgzSGFxNzk1eGdqWWMraGF1dStBZmg5OGU5WTFEU05XczdpZlc3TVNhZklaR2VLRW9GRWpxWHltNE9lcEdCbnRYUEdrdnEvdGNSRlhUMXR1cjZiWDliK2ZZSzlaeW1xZEJ2bGNmSlhhOTdmdnN2U3oxQ0h3emE2SjhCWVpkYm10YjZTenZVaXRaNDd1T1MzdHJVcnNlRnlweWdWbTNjNVBIV3ZScmJWdkMrZ2VJZEgwL1F0WXNkVXQ3cUZXbDg1VWUyTnZHTXVzYmpHV0F5ZXBxSDRHZUR2aC9hL0RxOW0wZUc2aGh0d3N1b3ZPcGxXNWtsWm5mRzRZYkxCdVV4d2V3eFZ6NDlmQks4OEcvQXJ4UnEramVITFhYcnp5SmJxMXNtY0pjV1N2SHNZeE4wK1VmUHR5RHdSendLOWpDeCt1eGpHbkhtUzNhVzBmVzZWMjlMV2RyV1QwWjV0YXRDaTVLYmFmUmQ1Tkx5ZDBrN3AzVjc5TkREOGRXVVB4Sm11ZkRlZ3lhb2tkODhzNE5wS0NzZ1pnemtFNVgxeG5BSFN1YzFmVVJkK0s1UEJzZGpwZHJEcGw3L2FjRTl4ZG9vdUFEaFZjRUVHUlg3S1FSWExmczc2QjQ0OEd5ZUNMZFZ0ZEoxbEd2YlM5L2Y4QWxKdmFacFlnOGUzbU4wY01jQThoZmZPVCswTjRJOGMrS2ZEdXFRNlBiK0drMURSM2EvbGZUcFFXRjVodjNUTXd5R1luSUs0SHJYenRIRHFxNVFjbXZlZHBhY3FYYlc3djNQWXhOYU9IakgzVTBrblp0ODEvNXVpdFk5VytBL2pPeDhXNkRIcFd1ZUZvSTd5VlpVbHZqTVpEZUlNanpNbmtFa011QWNobDZZSU5XTkQrRVNlTDFhemdzN3k0MHZ3NDAzMlhUY0ZtbkRSa1pra2I1ZDVjbGxBNkRibXViOEUrT3JkZEk4UDZsZGFuWVhtZ3ZCREpwMm5UV2J4ekpPeXJ1TE1tRWVRU3E1QWJqbm9hNlR3MThkckg0ZGZFYTQwelM5UjFqVk5WMVpmdE5wYUxDSTRaNVhrVXlSaENNQjFVbHVBT00raHJyb3FsSnhqN1MzSzllVkp1M2YxdnUrdlU0OFY3V0U1VFVmaVhWdTEvbjVmZDBNL3dmOEhiUHh4b3JhbG92aGk0czlVaHRtc3JxeXYwOG01MCthTGp6Rk9mbStiSXlPRHlmU2w4U2VEL0FBdm9lZ3cyZGxEYjIrdGE4cFI0NDBNd3Rralh6QzdiZnVncXBCTERuZ1YzUGpJWC93QVA3aFBFemFlYlBYdFlQbFhGdDVubC9hQjFaWXhrb1c1eWM0ejYxeDN3VjB5KzBYeE5mK05kWCt4NlBwMTRUcFhrdGJSczhQSUpjdGo3cExiZWMxMC9WZmJSNUozaXI2ODFudTlIYlIzdHZmVFlxR0xVVmRKUFRTMTczdHRmVld2dGJVNHkxK0ZHdFFlSzdIKzJMdVBWUEROekhJME0wVndzTWR6aFF5cW1TUXdIUFRIM1RWV3g4TmFIcHZ4UTA5YmZRL0ZGMW8waVQvYU5hamhFVnBwOE9Ea3NTZm1VWTRZSHRtczM0bS9ER2J3U3JXZDk0czFMdy9vZWszTWt1bnZISVpHa0VybGdBdlFxck9RZW1GUHBYVmFwOFJMN1d2RGx4TkRHdHpINGRzMWU2dFlYTUZ0clcxQUdKVlJ0Mk1wREVEZ1o0NlZ6WWpOS3Fnc0pVYTVQbWsvVjZLMjE5aWFPRGl2OW9wcjN2azJ2UFhxZmxUL3dVSjF4ZkYvalZMblEvd0MxWnZEODczRjFaWHNoRHNrYU9GY1B5T004ZzhaQnJtZkhmN2NQakx3NzhCTk44STZKNGkxTnJmVWJWYmU1dHROdVdrRTZBL01pcU9PRnlXOWNFVmsvSC9VdkN2akxVL0ZHb2F4SjRncy9FVnZxNnBhYURwQjIyb3Rua0pmYzhnOHZBVElBQUJGZUcybDlKNEU4U1IzOWhvOTlOYVcwN1N4eDNFNnI1Rzc1U01weDkwaytuQk5mdmVXNUhTbmx1R25YaXB1RVcwa3JMVjNWOTlWK0orVDQ3TjZrY1pXalNiaXB0WGJkM29yUGEyai9BQVBPZkdtdjI5cDhSMnVQRFAyKzEwdWFNclBmTWdXNmlrTzNlWEJIM1R6MnowcnFOUzhKeWY4QUNxclJyT1hWNW9yT0kzTjFkZVNxZVZGd01xUDQxeWV1UFNvUEVHbWFoOFJpc1FiUjdOTmF1SG1tblhrd0tjL0xqSHpFakhKcm5kTGoxVDRiMjlyRHFWdzErdVBMdUhEbFZ0NFdQRVd3WURBanIxcjZ1R0huVHdiMDUzK1R1dEg4dXg4L1VyUnE0aEw0VjVmbWR4NEExYS84U2ZDK094a250Wm9kSG1Na2RqTDhzcVlJT1dHZU54NTQ3WXJpUjQvT20rS2RZRjlJZFBrbm5SYmFOenNqVDVRQmtjbnJrOWVhMy9ESDdSdXFlQy9GdDlwOWxvdGxxRWV1QWJYbGpWa2hjZ0lwSjRJNUFIT1I5S3pmRFVHbzNIeFRnMHU2MCszMWE4dWIzR3AzZCtFRUdtdXdBK1hZY0ZRb3lCenlhd1dLVksxR1ZOcVhYVnlWMHZUUzNUVm1rOEw3U2Z0SXpWcmVoN2Y4Qi9pNWZmczYrSmJPOEY3cDJvVzkwVUNwQ0haN3ZkeWNucXJjREI2WUpyK2czOWlqOW9Md3orM0w4TzdIWDlTOEx3MldvVzZlVWt4bCtlVGFxYm0yZzdsK1k0K1ljN1QycitjUHh4cFhoSHcvWncvMk5yVjFyR3ArYWlHMlNFRmJja0hISkErN2pwbm9EWDdDZjhFbVBpRnExMSt6dkZxVTFqRC9BRzlwOWtSRWRQa2RDOFFWU1N5bmpyMlBwWDVEeGhtRFgvQ2hSdzk0T1ZwSnBXa3RWdEpYMWZWTFRRL1JPRzhIZUR3c3EzdktOMVp2VGJxdXk2ZGZVL1FpWFJkWThNWGw1SERxbG4vWmNOeVNzVjJobmJCd3d4dHdWNXdSeFdicVhqUFh0WG1oaldEVGJ5MWpsTVU2MnNaU1NOY0hydVArZWE0bjluLzQ4V1BqZTIxU2E0MDI0aDErMVZuWDdSdWxTNUFYR3dzcHhuMlBTdGZUdmlyZWVJdFRqdDRZNzdUN0ZaakNYdDdOWTdjSEhDbkkzZXRmQzRqRWV5cE9GV1hLbmYzVnJ5cTZhdS84cjZMelBlbzBKVkpjMFZlM1ZxMTNicHV6VStGUHcvazF6UzdyenBMckZ4Rk5GSEFUaENqcVUzRTl4Z2svV3Z6eS93Q0N3LzdJTTNnYndYY2E4K2kyK3RUYVhhZVhBMGtCa0JCYjVHTGQyeVFDQmpnOUsvUjdUTFBWN083dm9kRDFhNmE0WmZNZEhhTjBqSkJBUHpnN1I3TGpvYStQZitDMWZpL3hkbzN3S1o5UDFTT1MxRVNSM1Z0aFdVc1pBUG1KR1QrZkhGZWh3eG1sR2pXbzFNQ3A4OFpmRlpLTFRlcTJiWnc1cmhWaUtkUlZtdVZxOXJ1NjB1dXgrSDJpZkYrNThENnBQZlgybHlXTjF3c2JxREVZeXZTTUE1T1NjL2hYNkQvc3pmOEFCVE96K0hYN0wycmEzOFF0TlhXcG9iR1d5dHRJdVBtekdRd2FROXR4d3BCeGtBVitZODEvWngrTnRXYnhBWnJ5NE0vbVc5cTEyNWlqWTU1QkJIZmdBbkFyZGkwYTQrSkhnUDdacHVyWEVja2hiemJacGYzS3FNZ3FpODUrcDYxKzZadmtzODFqVHAxclJzNzZXVGV0MnR1dmI1bjVybHViVWN2YzUwMjVLMXJPOXZKay9nK0x3cjhVL2lTMXpmTEhhNmpOcUxYMjI2bkVjYkkzUkVMZGdQZnFLL2N6L2dtTDQ1K0hPaStHclhSNUx2OEEwcGJFc1FYL0FOR3R6a2NmN3pldlN2NTZkVzhBWFhoencxYzYxZFhpemFoWk44aXVBOGNrV0JrSVY1RDU5UjByc1AyVmYrQ2gvd0FUL2dyZTNFR2ozRWwvTEt4Y2I0eElMWlFNcUR1L2hGZk84U1pITE5hRWFWTnUwSHMvSlcxMTE4ajJNbnpHR0NuS2NrcnpXNmJ1cjY2ZnFmMUZOcm1sK0lmRDl4WnJxbW4yTUJKamlFRW9hUWV6QWMvaGdWVDhCZkRTejFIUUx4OVNzNW4wK0NVL1p6SXBoa3VBTWZOdE9HNE5mbG4vQU1FeC93RGd1SGUzbmp1MDBIeGxvTnBjV2t5aWU4MUw3RjVzdm1ucUVJeHh1ejJQclg2MWVKZFNtK0svd3RpMWpRZGNqaGFHRTNFa2JEbVJlV1dQS2diY25IU3Z5SEdaRFBBWXYyTmFidnkzYVYwbWw1OWJhdHBhcXg5L2g4MFdKdzZsVFdrbnZkWFQ4dXF1cks3ZHRTcjhOSXRIMTJQWFBEY01Pb1c5cHB0ejVhVFNJVm1Zc0JKbFhPZHk4OXZ6ckYrUDJocjRaMHVUVkRybW9TUjdrWHlsWE03Z2NsVnh3TStwNDRyUitIWGpleDFYVFZqMVJiYlRkV210VE92a001V1ArSERIUEw3cy9MazhWUThmK0hUZStBck84dGJHK3ZMZTlqUU5meVhIbEJPT2NvdytVOGRBT3RaME9URVFsUlZuR0xWN3ByUytyVmszcDZkVHBqS3JSeEhNbTA5dWpUZHU3MGQ3ZER5NzRBL3RIYWY0NytKUDlpZUV2Q2ZpS3hqVzRrdXIzVkxsd0kybFlENW16d0I4b0pOZlVQaWJ4NXBXc2VHZFgremlScHJXRS92clhERnpqSkNzUHlyODlmaEg4ZGYrRVkrTU4xNEYwNDJjYTNWd3IzSXRWYWEvbUROd3BPT0ZPTUhBSGV2dWZScmpTdEFoaDB1NnV4cDhJdFMxeERFbjNoZ3NTeEk0d0IyNTRyMXNWVnhXRnJleW94akdOVld1N05XdFphOUgxNytSd3FOS3I3OHBPVW92czExdS9OOWwwUE5yanhkSi93QUs4T3IzVi9xV24rSVJlcERERjVYbUNDT1I4REFVZjNRRDh4NjE3VjRpMW16MS9UTGJSWXRTRy9VNFdnVFB5M200THlkcDVEQWM1eDZWNWJvL3g0OEVhUDQwWFRkRi90RHhGYTZya0NDTzNYeTEyOVpBejRMRFBmSjcxY244ZDI1OGRHLzhOM0VNZDdiWER3UEpxa2JTSkhGa0IxVGJ6a0hBSFBRRVZ5NEtuR2xGVTY5bEtiU2xic3VxMlRYZHN2RVU1enFjMUpPMGRWZGRYMDhyV3ZiVW4rTnZoTFNmQm53K3QvTzFKdEoxVjVZTEd3bm5Ka1pwQ3lqS3F2OEFFeWdqSjRHYTBmQno2ZkY4UDdqU3RZaUxzNmdtNkNndk80OVFlTjJCOU9LNEg0bytKZGMrSzNpbit5ZFIwbDU0Zk9pa3NieUFHTjdFZ3FONVhHT1R1STNFbkIrbGR0NFVnc2ZCL2c5Tk51N2xkUzFLeTFDVzZodVo4N2JWbUxEYXpjYnNCeW9COXVPSzRhdUhsVHhEbFNhOWx5dTNOSFY5T2w5ZDdXZHRqcmhyUVNuZVUrWk4yZXE2L2R0djUySGF4OGQ5QjhINmMrbmFicGw1ZlMzRUR6VzhuMk5tOHlVNVBQeWpjeDl1dFkzaHU4K0pXcytPdFc4TXZvT242VDRVMDFJcGsxQ0NVR2ErTW8zeUt5OUZJSkl4ak9NVkQ0eDhmL1lkZVdDWFQ3ZnhGREVna2o4bWN3dXJMMTUrWEhzT2ZyWFY2aDRwR3VKcDYyRjVyT24zVjlLMXNJa0s3WlNJOGtzK0NjTHp6MXpVNFhNSlZHcFNpNUxibFZrN08rM2ZvOVgwYTlNYTJEbEZjdHVXK3ZNN3Y1OTExNmRibm5iNjM0YzhCZU1OVGttWFZOUXY5SnRJNWJ1YVMxa01FREZpb1lGY1pia0w3VjBXb2VOTlMxSHc5cE50THBkNTRranZaWHlrZysxYjBaU2VDdUZ3TTQ1SndQWHJYSitQOWQ4UCtGQnFGMTRnYTR0bDBlMWt1dFlDWjNYU0tOK00vd0FURTdUOHVPTSs5WnVuK0lKdkVQaFhUZkcrblFYMXY0Yit4UXoyZGkxMnlpSThFS1BMKzc4aDllZWxjOU9VNlVaT0VKZXkwVFNiWHoxdmEzelRQU3JVNDFhaWpLUzUzczdKOUxXNmQ3K2xqaTdINEY2TDhJUEdkcmNYVm8yZ1RMTzJxeDJMcXJlVEdwSkJYR1NCdUJ4MzRyVzhZZkhLNC9hTXU3Ynd6YjNzMmwzMnFST0xTNnQxOHE2dVNwQldOQVFTdnlqTE13QXdPT3RhMnMvdE9lRy9qTTFqY2ZEL0FFTzMxbVg3VDlpMWE0dkZTUm9ZU3B5VHZmY3Z6SElBR1QyNDVyaWRDMGZSUGg1OFR0U2oxUnRVdWRmczdKSjlMU3lnS3gyTWJZOHhXS2tINWljNXlTQjM3VnZpTUxWcDR0UWRibXRaMmszc2xkZEZmVHlOcU5hRXNQN1ZVdVYyYXVrdDI3YlhhUzc2OXRqYytKbmpEWGZEK2dhNWRlSWJpM3V0R2p0SDB4YlNHNVNTYUpnNVJwWkVENWQyRzNuSEZadnduK0lVbmdLeXRiaTR1N2V3Ynd6REdYc1oxZVhhMGpxSVhZb2ZsNkhxRGpQb0t5UEdYaEhSZml0NDh0WWZEdHhZK0Zubm1XRzZ3ODhsdTNtbmZKT3dtWTVaV0hBVURPNDV6WHN2dy84QTJmUEIvd0N6cDRuKzFXZXVYUGlUVWZGYUJ0ZWtsa01pemhVS3gzRzBraEFyTGphcHh5ZU9LOW5ENEdjb092ekxiU3p0cSt0blp2ZDYydXREeTYxYVBON0xsYnYwdGV5OHQ3UFRWWDE3aE44VVpQMnRQQWtEZUh2RUZscGZpWlFCUERFMlNpcXhEZnU1TUVna2NNZTNORmZLZnhRL2Evc3YyaFBqc3VpL0MzNGUrSU5lL3dDRUx2TG0wMVBVNDVZckcwdU14a0JVZFpBeDJzTzRIV2lqRVVLL3RHNVVaM2VyK0gvMjdVY1dxY1ZDbk5OTHNucHJzN08xejJyNEUySGlINGsrT3RUdk5Cdk5OMURSWkx0N0dPMXM3NHl3UXZGR0pCSzVBUGxiaTJ3eEhrWUhOWFBqNzhLUGlENE4xand4SjRGbHU3RzQvdFJZNzd5anVqZU53ZDBEOVBrZCtqWkpETm5GWU9uZkZmd3g4SlAyaTlDdWw4UzZMb05qNGkweGpMWmFkRnR0bTFOcEZjUzR5VDg0M0RjY1pyRCtKSGpQeGhwM3hQOEFEOXZyT3BTZUlIc2RSYTZSN3F6WjQ1N2Nvd2RBQVFKV0VUeWZNcDQycmtIQnJsMGhHcFBsbEtWcnJmVlcvQnJiWHFkdE9VdWFtazR4VGF2cGV6VXRiOUdudjAwZlErZ3ZDL3hJMXp3UDhTYnVLYXhrMWk4YTNzNEw0THYrMFdjUUVnSmRRY0hid0FlK2V0ZVJQNEMxRmRKOFZYMWo0MmVIV3ZHMm8zc3RoWlRLVllGTW9rVW1TUzBTOFpCT1BtYkhXdEhWZjJhZkMvaDN4dnEveEE4SDZqY05lK01MV0p0MW83bnl1UzI5MEN0bUlqK0FqT2NuTmM1OFZ2SGZqVDRjZkNtd3MvRCtrV2VpUitMZGRsc1pMbUNlR1NFb3lERnpHdTNLN3VjS3dHRGpPSzQ2dnRKVVZodWU2YlV0YlNhZHI2N2ZlMjcvQUhJdUVvdXA5WWNMTnJsZlMrcVduNGJKUHozWW53WDAySFRMVFV0QmovY2VKTkp0b2t1WTlLS1hHbjJ3a0lMTWtZLzFMRmd3K2plOWM5OGFKUEN2aS9WRjAyKzBYVW8vR1hoMjZqZUtOSVVpZ3NZWmR4YVlIY0JJaDIvTXBIVWpQWTFyL0FEOWpTV2RvOWM4TWFoZE5xR29CN0RWTG1CdkpkWDJscEZaVlBYZGdZNlk1RlZQRW5nL1V0VmwxalQvQUJEcW5rNmRZM3psWnBMVll3MHNZNVZNQWJpQURuSE9NOTYyK3NKeDluVlhLMWRjKzE5TlZwdmErM25meUluVGFuelllYWFiVDVOMnRicmZ1N2JkTkR0OVo4ZHg2VDhJWWZEK2w2bEpxMFZ4cU5uTFp4MmsyMTBqSzVXTWtiZ29BSHpBOVJqcG12UVBoRCsxaHFuakx3UXVpYWhxV25XK3VXMDBzT29HOWoybUNBS1NNQURhV0s0NGJHZlN2TmZDR3A2TCt6LzRaandOTDhXV21zYVVyM3Q1R1VqS1BGRmlET1RsY0JtVUU5bDVycE5NOGVXdnhSOEtTNlQ0TDBqN1BhMkhsdkxlbTZTU1RWWW5YNTlqNTdOeGc5dWU5YytENTZFVlN3OVZxNnR1MW9ucXJwZWZXelh6SXhNWTFlYXJVcHJSK1c5dDNmMDJTMStSRDR1K08zZ0g5cEx3RnJuaERWcjYzaTFxM3M1Sm83alM0M1NlTGFDWTJqeDh5dnRISlU0QjQ3NHJUYjRqZUhkRzhINlBiNlBkYVBwYWVJUkZmVHJleHA1bW9xcUtXeU91NGp2a0VIbkZmT1hoWHdKNGZ2ZjIwNy8rMlBEK3ZhV2ZDTVMyTXVzMmt5eVc1KzByRVdEcVB1N2R5Z2s0QXptdmJ2SDM3RVdnK0Q5Y3Q5UTBmVm9vZEQxVEVjbjlxWEt4L1pMZ3VOdmxFNE8yVExLd0FPZmxyYVdBcHdjNmVGcVM5M2U2VjlWcTczczFhMW4xVjc3R1VHbyt6ZGFtclZOVlp0cmZhMjZmbDNzYTEzcUhodjRsZU1aQjRVMGZVN3Irenc4WUZoYWxyTzhpQndWa2pMQUkyN09HQXpnNStqdkIrbjNudy90ZEU4WDZoWjJ1bjZwcFpuUzBnMWlJUm0zRGxvdHU1ZWNqSkN1ZWRyWTcxZHZvOVEvNFhoYStDdGUweTFzOVUxTEdzMjJ1QzVRUVh5S1NQc3NXM0I4eFJIdUliZ2c1NXppcUg3VFhoSHhwby9pbU82VmRGbTBuU2RPbHVEWk9nUDhBYUM1SVdKaHU5U1R2d0JrQ3VXdlJXSGZ0YWE1YW1qMFYvUmFYMStmNG83YUZhbFZjYUVwSnhzOTMwNnROOVBPM3lOU3oxbnhkOFhkWWE2MWExblJ0TnV5d3NmSk1rVnhFeHdNTzNHUU1rbGZiclZmd0paYVg0ZjhBSCtvZUpQRW1uNncyaE1KTktzb0psYnlMTlVZbDNhTG5lV1lMZzlSVlR3SjhYdEswYTF0NXROMXd5YVJwT1lsbnRwUE5hMGticEZJdUQwQUFQNFZpRDlwZlgvQTNqdVNIeHhxbDQyZzY0NkR3OUpKcDRrTWNnZHZNV1JsSFE1VEJ3SzU0MTYwNTNhbHpheXR5MzBWcjN1dE4zOTNVamxwL0NyS1B3N3VMVDdxM3ArSjN2anJ4bDRaK0tmdzd1SkYwdlRiN1NVRTlzc3R6QXlpMktnajVIZmhRdzZlL0ZlTWFOOEs3ZlNiYlVMZlQ5VjFXOTBHUFExdEliYlNwR2wvczY0azJtTHpJd1FRTUFvUjB4WDBpUGpwb1BnN1g5SDhBNmxKYjZ0ZWE5OW9sWDdQTEhzRUtobklaU2M5dHVBSzU3NDM2aGEvOEpwNFUxQWFEY1dlbjZmSkpISFBwOHg4NlJpbjd1TmtDbmN1Vnp4bkJGZDlDVUkzNTVMbVdxVWxlL3BwYnQ2N1dPSDJrdmdVWFp1M01uOHI5L3dETGU1K1FlcC84RXRmamxybnhva1h4RHBUYVBaVzBrc2wzTklwWjVWeTJHVThxVkk0QjdacnZCK3pKNGQrQWZ3VVhVdGFXejFxMTFyN1ZiNmxaM01JKzE2T1NDcVRCc1lVNUtrSEdEMDcxK3BQN1NObHBmeFU4RjZmTjRvdjBzYmUxbVRGdmNXTXB1cks0a0tpRmtLa1l5eEEzRmZTdnpJLzRLMmZHYlN0RStFT29hTG9QaUpkVjFPNHNqYTNyT25rU1BORXdrUUZoeG5KQ2tqaml2cjRjU1Y4WGpLZUNwWFZLVFViTGRYMTFVVzJuK1ZyV1BFL3Npbmg4TFBGT0s1NDNkM2I3bGRKUDhkNzNQaFg0NCtDZkJQeGI4U2FmcC9oS1BWdEJ0ZEp5K3E2N0RhbDRyZFFtQXB3UUN6TVZQc0FhK1pmRjFzd3ZoYXJxRWVwU3h5bUdOb0pTelNIa1p4NkhHZmF2YVAyWnZpZFphQjhQcnp3cjRvMCtHeDhSUTNNazhsM2REempLSEpLanpGNEJBWUFEUElGZHYreUg4Si9EL3dBU3ZpUjQxMXpWTHl6K3g2RFp4UVdMcTRXUVNPcmxqd2VkdXhjRCtkZnJsSGlQRHdxeXc4NzMyMWo3clhyc3o4OHJaUFc1STFJV3R2bzlmK0FlQ0paM2VnK0hiZFVtMDJSWm90a2R4YnY1aVF5cWMvUGdEQjdaNXJyN3I0V1d1aGEzNGExQ0h4dmE2NCtwVzZYMXphVzZ4VzRLa2tHTXN6RmkyUWUzU3VJOGFmRDdWUEVtbWE5Zk5hcnBsdnBOMjBRaHVoNVhuRnNBYlY0emtESlB2WEg2VDhGdFAxdnhaWmYybGVUQ2FTM2E2ZUpHQ2xObkJpWFBUSEJ6M3IwcTBvUWsycnRkWHRiN3V4dzBhWE8wcDZQcDF2OEExM1BWUEZmeEUwdUx4SllYRXR4TnA5cTkyeVc5cGJvSkVVL2RWai9FekhuSkhUSGV2MnEvNEpXYU40cThhK05OTFF6MnVpYVRmV2FXc2wycmw1TDJCSXoxR0FOelkyNS9yWDRrK0NOSmUxMGFGcHRGMWJWSjg0MGlWQ1F0c3VRVkwvS2M1R1JqSXdUWDcyZjhFYWJYVVBoYit6YjVQaUxTNE5QZzFGbmllN0x0OW9rbGRVWUx2YmhjbGlPQjFGZkMrSVhzS1dIb1RtdVplamI2TjYrZHRXZlRjSnduVXFWb1IwdHJhOWw1ZmRlNlI5YmZFSFJySDRKYWZGcG1sK0lyUHd6SGZObEpwRUkrMFNzUVBtN04ySEJHQWMxeWZoM3h0cjN3L3dESGRuWjNrK2ozbW4zdythV3hsM0k3cVB2QWdZNXllQ0IyclM4V2ZGSC9BSVJ6eTQvR2VqcmRlR1picUNEVGRTa2FPU1Mxa2RrVkZrakIzYlMrQnVBeGprMWcvdFBmRzN3RDRYMDY0MGUxdUxTSFVGZFpabGpHVmFMcWNnZGpYNHZqc1ZUbXF1TGpEUldhMWxkZVZ0YnY1K1IrallQRE5jbUY2dlI2UnMvbm96MGJ4YjQwdmZBMTAyb1dPbjJvc1lvOXNzVE9USS9ZRjFBNVhKNjl1YStFUCtDelh4My9BT0VmK0VWOXBldFc5dmZYcjJUWENXTUZ5aWkzVW5qNWVkd3hnODRJcjZmOEUvRnZWSnhwdWppSzR1R3VJcEJIY3lOKzdsdHdBUXNlUms1VUh2bXZ6Uy80S3UrSFBETTJ1eTZnZFZ1THlTNnVaSmZJUi84QVVCVGp5NUJna2c4cjJyME9FOEJpTWZtTkREVW9OWGxmVjdhcmRMeSs0NDgycllYQjRPdFZyenUwbWxaTjMrYi9BS2V4K2UzaFJUZGVKOUV1TlE4TzIrbTJjc2NsMWF1OFN2YjNBYkhMOXdjNEl6WEs2dEo0a3RkWThSd2FmcUdtNkFiek54YjI4Y2NjTnN3R2NsQ1NDQ2ZRRGsxb1htbzY5cjBUWDFqRHA4ZW5mYkpiVFM3ZUFIekV3Mkcrbkl4elhhZUNiRHdUOFZ2aHluaC94TFpTUStKMWFVSjVCSmRaaU04TjkxV08wZGEvcERGWUduUmRrck5kMDdmSjMxdmJSbjQxUnhVNVN0SjNYazBlWitJdkRtb1FlQlZzMHZyT1JZWm1rKzFXZnl6ejlDd1BQSjVQSTdDdWkwbnhGcGZpbUtEUmRMOE54NlhmMmNZdUo3OUZLelh3VUZjeUZqMDVIVDYxeHZoZndYWWVCckNEVXRRMXkvc1pKTDEzZ3RER3hhYU5UZ2wySEs1Mjg4WTRxNXFQakdUWHZHNjZoWnlUTll4cnNqa3MweWJSaXBDNXo2OGs0elhaVHFVMWhuVmNsYnIzL3I1SEpVZzNWVUVuZDdkajJiNEZ2YzZMOFJkTHRkVWhYd2ZZd3ZIZjJtcXh4RE4wVis4dU81SU9PZTFmdDUrdzUrMGJjZUk3U0R3M1llV2RFdTdWSm9kWVpHVldiWXcydU9oQVpSMDlhL0FhUXRvV2s2Tm9PcGVNcHRYdU1SWFFnczBhUmxrN3BuSHZqaXYyRi80SlVhaDhWUEF2dzBXS3hzTHEyMEZiQXV0emUyWmFXTERieWtURThaNTZnNEpyOHY0MndzNVU0NHpDMUk4ajBjWFpTZCtxdWsydm1qNzdoakVSaktXRnF4ZlB1bnExcDAzNnJ5Zlkrdy9GUHgxOE8vRCtTejB1UFRiZldQRkZ1RDU4Uk8xMmRqbGlNOEViRGtmVVZ4M2l2L2dvUWxqOW44TFRRVFFUWDA1VzZpUk5za0NNZXBHUVFvNEFJeVNLL0xmL0FJS3lmdGVKNHY4QUZ1cGFUZFhHbVdzazF5SjVybExvRzhkUUR1TE5uZzhiZU9sZk1Yd2orTmVyWDJuUXk2UDRpbW1tdFp3Vm5rdVdMbGVDcUhuK0VBQUgrZGVQbEhBZUx4ZUUrc1JtbEtmVG1TYWpvdW1qMjJQVXpEaWJEWVRFK3ljVzFIcnkzVi9SMmF0Mys0L1R6NHhlUHRTK0hYN1h1aDZwb3VueWFITmV6Q002bGF1c2taVVpJT1FldVQ5MXZXdnR1NitNUStKdmgrR082czVydmJiQ0NYVVpIOGdYRDR3UUZYMEI2OThtdnhWdnZqRjRqK052amZRZjdXOFVXOWxKWVRJUThpZ3ZjSEk0SkJIQTk2L1hENEkzVng0cy9abG0xaXhsaWt0ZFBnUzBmVkxkSS9PbnllVnd4R0FNNUxIODZ6NDR5YkU0UEMwWXh1MVpwMzEyNjZhL2tkWEN1YllmRTRxcEtva2xkV3RvMDMwMS9yWTljL1pwK0JGcnBhU2FuTkRjVFgxckZNSWJpOEpNTWFNUVFpazh0MHhuSXhpcU9yWDJpL0N6VHRhZzFMVmJPVFdwWjB1Nzc3RmRoWHNMZVppU1FySFBsalBVY2sxei93Q3lUK3pCbzNqejRTM1dwZUtmRW5pTHhacUY0N08xcmU2cTVzTlBBWW1LS0tKVHR3QmdaYk9jVnp2eGQ4TTZMOEpmSFhpTHhaNCtzYmRmQ09qMmNMeithbzJUb3VkMFoyL00vQVRBSFU4WXI1U1ZHbENuU2pLMTI3T1Z2eXNyNytXcDdFS3JxMWFzb1hzdFVyNjZQZlY3V2Y4QXdEMFJQRTJwK0Z2RVZsWndTYWxkYUxyZ2oyM21HVW5BTGJpVU9jZ0RBK3RlYmZ0aW1QNGxlRGJOYkRVSnJIUjlQbW5jWUc0MzF3ZjQyQkk1REszUCsxVlYvR0dvZnRNL0ZUd3o0dWowRFVORitGbWg2Tk5hUjJZbWtzN201YVViVk8zZ3FvWGFCazg1cjBtVDRVZUdiVDRIcmF0ZDZUYitKcnRaSDBxTHlqSmNXY2ZER0pBekV1d1VjbmpKSHBWMXNMWlNWT3FuS0tiVUc5Yko3V2YzMjNMbzRpbktwR1RoSkp0SnlXcTFYZnJaUFhwdWViYVA0QXQvR1h3aDhEek5IcXR0TmRyNUtXYzc3N2pVWkd4c0ozQU1OdURuSHlnWTVyc1BHRnJxbmk0Vy9pclFiVFdyV2ZTVisyejJ5WFl0WUlXV01LWUR0Snd3UEpHT2MrOVlIdzIvYmo4TitLTkkxUHd2Y2E1cnNlcjJjVDJOdnFKMDZTVDdMTXk0ZmVWWHFwVVo1NzRGZVlXdjdSWHczOFllTXZFbmcvdzNkWFdxZUlOSGlUVnRUaFMzbXRKOVNDSGNmS2ptSTNOaGZ2Y2dINlZ5eHk3RXpmSzR2VFd6WExienV1bXUvWHlOdjdRb3hqelNhL2w2dTZ2ZTIvb3JkSGMyZjJLTkcrTXY3Vm12ei9FdTgwblJ0TjAyNGx1TkJsdFBFRng5dVo0NHBTc2tpUmhkaFZpdmZCN2RNMTFmL0JRNzlvcnhmOER2aEpKb041WlJlR2RPbmJ5WnRmc1p2S2h0YmNZQ2xSakVZemdkZU1qRlcvMlZQai9KNEJPdTZmcHVpK0pMSHdqRXphalp5M3hGMDhoa0FlVU15Z0FTR1JtTzBERmZrMy93VUMvYjcwWDQ5L3RIWGk2cjRzajhWZUNaTldFVU9nM0tUU1M2YTRja3lTbGNRN0ZZQWVXM3pEcFhxWmJpTVBXcjFNRGhLY3J4VDU3dHlWdE51OTNleWRqbXhGR3VxYXhtTG5GTFRsc2tuZnQ1V1c3MXR1ZWtlSXYyMFBDdncwK0dtdGFmNFI4WmFmRnFWNWNXVHhRNmVpeVJyRUpTMTNNekpsdk5lUENnNHhrWnI2dC9adjhBMnJOQytEVVZwOFJ2RW5oK1dhSHhEYlIyMHVyYW5LSVF0dW5SMWFiQkdBTTRIV3ZoTDlvUFFicjlzbTlzYmp3UmVSNlg4T2ZDY01SdWJxS3hOdVpyL2t2RkZIMW5RUnFoREtvVlNUazhWOXNmQTM5bFg0THkvQkhUN0Q0aGFKNGc4UzM4Y0N5Mm1sNm96VEZtZE54WlkxNEJZZGh6ZzF0bWxITDhMZ0ZpcHpsenlsc29wdEszWjdYU3Ziejh6bm8xc2JVeFAxZU5OT1BMcTFMUnUrOTF2WjZYdHV2STdyeEgrMjM4Ry8yckxEeFpONFExN1I3MW9YUDltemYyckFrOFU2L0s3QmQyOWxISlVjak5hbnhablR3LzRiOEZ5ZkRyeEphd3RFUTNpSXpXMjI0dWJBb2ZOYnk5dVNkM1Fqam5yWEVmQ1A0SmZDR09HNHUvRCtoNmI0VnVsbUZqTFpKQWd1cmJuNUk1UXZ6SngvZTlLbDFYdzNwOC93QVlWOE02TjQ0MXViVkxXTDdMcXVpYVRjaFJCQTN6YnJwd014eDdXUExrRGJudlhoLzJwbC9zM09FcHg1ZGRZYStlbTJ0L1JYUFV3K0R4YzZxaldTZTYrSzNsdjNWdnZUN25qZjdCUHcxMDN3NThjYmsrRC9GR3RlTHZDV3VDNjh6UUo5UUZyTHBzeXM4aG5NY2ZKVnZsVWJzSGpORmJueHMvNEtTL0MvOEE0SlJmRzdUL0FBVForQ1picncvcUdtLzJpTlEwcVZaSTVKWExBaFNNN2prY25QZWl2c2FlRXgyWTBvWXpDUWJoSmFPUzk3UnRhMmFYUStkeFdNdytBcnp3MkpueXlUdmFNbmJWSnF5YTB1dC9NOUsxcjRFZUVmRTN3dCtMM2lIVU5Eczd2V283QzVtanU1Q3hraGVLTm1qS2M0VEJKKzdqUGZJQXJsZmhwcHNlaGZCRDRWL1pwTHBmc2F5R0V2Y3lTRkRKYXlGemxtUEpMdnlmWDJGRkZmRlZxazNYaTIzdi93QzJvK3JnbEduTlIvbGorY2pwWlBGK3JmRGpTclBXTkYxSytzTCtXOHQ3TjNXZG1SNHBEODZsR0pUbko1eGtaNElyQytKdmk3VlBCMzdWbmlEdzdwOTljUjZMZmFhNlMyc2orY281WVpRdmt4dDh4K1pDRzU2OENpaXU3TW9xVlNTbHF2ZC85S1JHVjZLRFhhZi9BS1NML3dBRTN2aWQ0ZzBuOW8zUTlGaDFpKy9zdlV0TXZkUnVJSGs4d1BjSkJLaXlaYkpVaFFCZ0VEanBYcDN3K3ZwL2lYOEFQRGQ5cjA4MnBYVCtJbjNTU3lITFp2WmdjNEl6a0FBK3VLS0s0Y1pGZlY0eDZYZi9BS1N6c2gvR1V1dG9mK2xtM3JtZ1dmaE5kWVRUYmRMTVhHdVJTU0ZNN2lSdElHZW9Yay9LUGxPZWxkVjhVYlNId3Q0dDhFM1dtd3cyTTJvYTliQzU4aEFpUzdqaHNvUGw1SG9LS0tuQzFKT2hLTGVsdjh6anhrSXhuR1VWcnpMWDVRT2kvYmg4RGFUYzZkNDhqK3hyR3VzYVJibTg4bDJpYTRLcTRCWXFRY2dBYysxZkt2eGl2SnZCbnc4MHU0MDZhYUdhM21EeE8waGxNYkJNZ2pmbkJHQnpSUlhpOFoxSnh6RDJhYnM1U3V1ajBqMFBwdUJxY1pZS2M1SzdTaFo5VnVmUVdtYW5ONCs4VStCYjdWMysyWGRtN0NHVmxDdEhtQU1mdTQ2bGljKzlaWHgwOFJYMmkrT2RldjdlNGtXN3RkSGFPT1J2bjJxemdrWWJJUFBxS0tLOVBKWk9jYnkxMzM4cGFmY2ZMWnQ3bUpsR09pVGx0Nkh5NThYZkVONzRXMGVQVXRNdUpOTnZkVzhLdzYxZVNXdjduejd3T2krY1F1Qm5ERVlBd2M5Sys2UEFIdzUwYnhoNGNzN0hWTFA3ZmJRQ1dlSlpwWFpvcEF1NE1yYnR5bmNBY2dqcFJSWHM1azJxMkhhNnRYODlPdmM1c3RYdVYvTGJ5MGV4NXFkQnMvRkVuaGpXcjYyaG0xU3gxZTdnaG5DN0NxZlppK01MZ0hMSXBPUWM0NTZuUGVlQllCNHE4RzJ1dFh6U3phbHArcmVkYlNDUmtXQjFjcUdWRklRSEJQYm1paXNhTUl1Y3BOYXExdkxSbHliOW5GZEx2ODRuUitLZkQxcHIzeGtqczcyT1M2dGJyUmJtNWxpbGxka2FWTnUxOEU4TU1ua1lyOGJ2K0MwSGhuVC9BQVRjMnNPbDJkdlp4eVdmbXR0UUZtZG5JWWxqazgvV2lpdnJmRGVuRjVxMjE1L095MVBsdUtxa3Y3T2F2dHkvbXo4N2J2eFJxRjlxV3VXY3QxSTF2SkpFNVRBeGtSS0JqMDQ5SzRPNDhRWDJsK0oyaHRicWUxamp1RUtyQzVqNUhJNll6K05GRmZ0T09weFdYVUxKYm53R0hsSjR5cGQvWi9ROXVrMWE0MUh3bjROVzRtYVlhaUdrdWQvemVjd3lRVCtRcmhmRVdvVGEvRnFVOTIzbXphZnE0Z3Q1Tm9WbzQyQzVYSXhrSEo2NW9vcjUvR2ExN1BadjlEdnB5YXB4dDAyOHRUN0ovd0NDZW1yVFgzN1RQaHJRYmp5Ym5SN25TcEpwYlNhRkpJNUdHekJJWUgxNmRLL2Yvd0RadjArM3R2Mlp0SnQwdDdkYmRuRCtYNWFsQWQvQkF4Z2RCMDlLS0srTzhRcXMxam94VGR2WnkwdjVIc2NKUlgxUG02dVgrWjg5L3dEQlZMeDVxM2hUd3hZMituM2pXOExTQmlnalJobll4QjVCN2pOZm03K3h2NGp2L0hYeHU4UlNheGQzR3BPc0lRR2Q5MkFYWVlIdFJSWHdVYWNQN054TXJLOW8vb2ZZWWVwUDYxaDQzZHVhWDVINkFhSHExMTRQOEdhWDlndUpvLzdHc1dOa1pYTTV0OXlFSEJrM2VnNitsZmxML3dBRlcvaUhyTng4ZHJPM2Era0VOdzhieW9xS29jc1BtemdkNktLbnc3cVRqbU5LY1cwN3oxNjdJMzQ0aEYwSzBXdExSMCs4OGI4V3pONFAxUFEyMDNGbTBWdzBpN0FPR0lKSndhNFB4VHFFK2plS0k1YldWNFpKWWpjT3lubDVNL2VORkZmMHRkdXBOdjAvTS9GcFJYSkJXL3F5T0gxL1VKbTBPYldHZmRxRVYvTXF5RUFxQUV3UGsrNzNQYnJ6MXJEOFg2NWQydmdEU2JpT1pvNXBKVjNNdUJ1K1U5YUtLNTZFWXQxWXRhV1g2bFJrMTdPM2Qva2ZRMy9CS1B3Qm8veGkvYVp0Ylh4Tll4NnhiMlZwSEpCSE16WWpZeWdFakJIYXY2TE5WOE0yZnc3L0FHYmI2MTBXT1RUN2UxMGt0Q2tjei91amorSEpKSDRVVVYrUStLY1Z6VVY1bjNuQk9sYW8xL1doK0EzN2EzZ1RSL0VuN2JWMUpmNmZiM1RQcGNEc1pGenViSFUrL0hXdk5mQnZoVFQ5RThlYXl0bmIvWm81TFdTVXBHN0ttNGRDRnpnZmhSUlg2RmxmdTVaUmNkTnZ5UGw4UjcrUHFLV3UrL3FjQjRhOGFhcEZlNm50dkpoOWx1QTBSNHlweU8vWDg2L1liL2dudnExNTRnL1lsdXI2OHZyNmU0K3lTemMzTGhOKzhET3dIYjA5cUtLK1o0OGszZ20zM2Y1SHU4SSs3aVc0NmJCOGUvMnB2aUI4Q2ZpL29maEh3bDRtdk5GOE8zMmp5WEZ4WlJSeHNzc2dLNFlzeWxzamNlL2V2WlBoNzRhdHZHUGczd1hyV3N0ZTZ6cUdxYXJheTNUYWhlelhVYzdCMVlaaWtabytDQWNiY1VVVitQMGRjdmhWZnhjMi9YZDlkejlQbzZ6bkY3Y3Y2SStyUEczam5WTC9BT0tOdjRia3VJem9pM1VJK3lpQ05Wd0ZCSElYUEI1NjFvZkF5NmErOFMvRUMvbVdHUzgwR2I3THA4clJLV3RZbVJpeXJ4M0tyeWNuaWlpdkt5K1RlYlVHMzMvOUpaakpKWUJ4V3p0LzZVakwrQjJnV01zRWQ4MWpaL2JOVWpGMWRUQ0ZWZWFSaGtzU0IzejlLcCtIUGd2NFZ0Zmk3NCs4VkxvT250NGlqc1Z0WTc5NDk4MGNYa28yeFMyZG95ekhBeDFORkZlNWpLMVJZZm1VbmQzVy9UWFQwTWZad2VqU3RvL3hSd3ZnQzVhOCtLL2dteG14Slo2dGQzY1YzRXlnck1xb0NvOXNIMHhYekQvd1RiL1pmK0hueFYvNEtxL3RHNlg0aThINkRxMm1lSE5jbi9zMjBudFZNTm9US3dKVkJ4azQ2a0UwVVY5TmsxT05HbTNSWEx6VTliYVg5K085dHo1N05hczZzRXFyY3JQUyt0dEpiWFBmUCtDNS9nN1NQMmZQK0NmdXVhdDRKMHZUL0RPb2FmZldNTnZQWVc2Uk5FalhDb3lqQXhncndmWTE0Vit3emZYWHhZME8xOFNlSXIyLzFUV29vWkFseExkU0FMc2JDNFJXQ2NEajd0RkZkR1Q0ZWxWaGlIVmlwTk4ydWs3YUxhNTBRclZJMHNPNHlhdmUrdS92ZFN2OERkVXViZjhBNEtaZU92QzZYRXk2SHJuaCtHK3ZyYmVmOUltQ01BNWY3NDRIUUVDdWgvWno4QTZVTko4WTY0YmVadFg4U2VJa2gxTzZhNWxhUzlqVXJFcU9TM0toQ1YyOU1HaWl2bnNLbExMbHphM2hILzB1MzVIdDVqS1VNd3E4anQ3emVuK0JQODIvdk91L2FqL1pjK0h2aUh3N2VRMzNoSFJybFBEYnhwcG0rSExXaXVVREFIT1NDQ1JnazR6eFJSUlhiOWV4Tk9uQ01La2t1VlBSdGF0YTlUQ1dEb1ZHNVZJSnZ6U1ovOWs9IiBzdHlsZT0id2lkdGg6IDEuODQ5MzA2aW47IGhlaWdodDogMS4yNDkzMDZpbiIgYWx0PSLlm77niYcgNSIgLz48L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAwNyI+PHRkIGNsYXNzPSJwdC0wMDAwMDgiPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcxIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA5Ij4gPC9zcGFuPjwvaDE+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxMCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTEiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDExIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDAxIj48aDEgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMSI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPuesrDwvc3Bhbj48L2gxPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcxIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+MyDlpKk8L3NwYW4+PC9oMT48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDAzIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPlvopoHlsIbku7vkvZXljaDkvY3nrKbnhafniYfmm7/mjaLkuLrmgqjoh6rlt7HnmoTnhafniYfvvIzor7fliKDpmaTlroPvvIznhLblkI7lnKjlip/og73ljLrnmoTigJzmj5LlhaXigJ3pgInpobnljaHkuIrljZXlh7vigJzlm77niYfigJ3jgIJdPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNiI+PGltZyBzcmM9ImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVFTa1pKUmdBQkFRRUEzQURjQUFELzJ3QkRBQUlCQVFJQkFRSUNBZ0lDQWdJQ0F3VURBd01EQXdZRUJBTUZCd1lIQndjR0J3Y0lDUXNKQ0FnS0NBY0hDZzBLQ2dzTURBd01Cd2tPRHcwTURnc01EQXovMndCREFRSUNBZ01EQXdZREF3WU1DQWNJREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBei93QUFSQ0FFVEFaY0RBU0lBQWhFQkF4RUIvOFFBSHdBQUFRVUJBUUVCQVFFQUFBQUFBQUFBQUFFQ0F3UUZCZ2NJQ1FvTC84UUF0UkFBQWdFREF3SUVBd1VGQkFRQUFBRjlBUUlEQUFRUkJSSWhNVUVHRTFGaEJ5SnhGREtCa2FFSUkwS3h3UlZTMGZBa00ySnlnZ2tLRmhjWUdSb2xKaWNvS1NvME5UWTNPRGs2UTBSRlJrZElTVXBUVkZWV1YxaFpXbU5rWldabmFHbHFjM1IxZG5kNGVYcURoSVdHaDRpSmlwS1RsSldXbDVpWm1xS2pwS1dtcDZpcHFyS3p0TFcydDdpNXVzTER4TVhHeDhqSnl0TFQxTlhXMTlqWjJ1SGk0K1RsNXVmbzZlcng4dlAwOWZiMytQbjYvOFFBSHdFQUF3RUJBUUVCQVFFQkFRQUFBQUFBQUFFQ0F3UUZCZ2NJQ1FvTC84UUF0UkVBQWdFQ0JBUURCQWNGQkFRQUFRSjNBQUVDQXhFRUJTRXhCaEpCVVFkaGNSTWlNb0VJRkVLUm9iSEJDU016VXZBVlluTFJDaFlrTk9FbDhSY1lHUm9tSnlncEtqVTJOemc1T2tORVJVWkhTRWxLVTFSVlZsZFlXVnBqWkdWbVoyaHBhbk4wZFhaM2VIbDZnb09FaFlhSGlJbUtrcE9VbFphWG1KbWFvcU9rcGFhbnFLbXFzck8wdGJhM3VMbTZ3c1BFeGNiSHlNbkswdFBVMWRiWDJObmE0dVBrNWVibjZPbnE4dlAwOWZiMytQbjYvOW9BREFNQkFBSVJBeEVBUHdENGR2ZkVkMTRmbG1tdU5MaXQ3NlpGWHlwZm1raVh1YzlzK25hdWRtK0llb05JMTB0d3U5ZnZZSk8wQnVnN0ErbnRWajRtK0lvL0d2aU9XN3VyaU5MaFlpNVlOOHhBNFhkMjcxd2xyb3JDeE1ydHVoaHlmbGI3K08rSy9MOFBoNDFLUE5XaWxmb3R2a2J3b1J0emR6MW1QOW9IVWJlYk9tM2Q1Q3pSaU5nWjlnMjQrWWNIL3dEWFh1WHdqL2FTMUx3UHBRMTIvdXJQVTU3MVluanRKMWE0WlZUY3E3amo1TURJNHoxcjQxOFBMZDYzcWEycTJ0MXRqQlVJUVE4bnFCams4VjdQb25qU3g4UCtHZE8wblQ5VWppdXBJdDByb2g4eTBHUmxKZDJNOVBvUFd1VEZaZktqS01xTDVaZVc5dnZMakZwKzd0OTZQV3ZDM3g0YlcvRldxWDBKazA2NGtnYUsyVjVpMEsvTVBrLzJjay9lRlR2KzJmclhoendqZVNYVnhHM2szQ1cxeGJzaUZuQzV6ODRPN0FQVHJtdkM3Uy92dEkxR2ExanVvM20zK1k2S1E0YmtGbXlCZ2pCN1pxcnIxb05XMVF2RGRMNUVUc3p3S1F2bU14T09PdU9hTU5pSzFOdU1xa293bHVrL25lMS94SExEUjVyOHE1dlQrdnVQUVBFV2wzbjdVRnZlWGVqMk4zY2YyZTBFRXNheUFDRVN0dFFFNUEzRmpqMnIwNzRiZUlQRlB3MytIRm5vZGpiNndtblc4c2x4TGNYMFo4bUlSRUI0OGpJWmNrZlRpdmxlRFdSNE92cHJLT0c2bW5tZU9hN0t2OHFuZUNvSXp5QU9uZnJYdUh3ai9hUzBmeGI0VzhRZUUvRmw5ZWFiL3BZdTlJdnhNZkp0MUErZUV4QTRJa09DU09lQlY0akVZeU5SWWlpM1pOTk83VDZhcTM5TTFwMDZOUnVrMXZkYTJ0K1I2RDROL2I0MHkzOEphNTRaOFRlQzlLMUNXOFpqSE50OHVTM1JzNElJL3U5UjlUVUhnL1RiUDRweFhuOWcyOWphK2RHVVR6Smw4c0xuNWl6T1JnOERHSzRYeFRwbmgrU2FXK3VyTk5ZdDVZU2x2L1pyTEF6VEZRQWR4eXpZN3JqclMvQ1B3N3FYaEx4UWxycVZycW5oeU82ajg2S1hVTFZtRXNXUmdrRCtBOWovQUkxNi9EbkYrWllERSszeTNFU2s3cHVFNU53bDExVGF2NW5sNXhrZUd4VkgyV0pwcHBKcTZTVFNmWjIwNjJOcnhQNGN1TGZVZjdKTnZtNDA1UkhOSnVVN3Voem5QVDNGYS94QytGVmphYWxvaTZMaFYxS0tLT1pKcDhyQk1jQWxuSUFDazgrd3JhK01kL2Y2ek5mYXBid3RxTTdSREY0RVNLT2QxWGFNQVlDZ0RGY0w4TmJqVUU4TVhTYTFNMCt0elNMUER1ZmZ0WGtFQUE4NDV3YS9xbk12RWJGWWV0aE1UVGxGVVZUNXFpMWtuS2NieFY3MnRmN2w2bjRsaGZEM0RZaWxpS2JpNVRjMG9QYTBZdTNWYnRhUFcwdS9VZDhWL2hUZi9DSHhkUG85L0paM0x3bktUMnN2bXd6TDJaVzdpdVoyZkwzNXIwalZ2SFduZUkvaHpaNmExMUNrM200VHpVeE83REl3cEo1R1IrdGNIZFdqUTNNaXNReFZpTTEraWNBY1pVdUlNQjdXNmRTRHRLeWFUODBuc251bGQyUitZOGI4S1ZNbXhsb3BxblBXTjdhZVcrdHU5dFNuNVdLdmFOcDMydWZHMW0rbFIrVmpwL09ydWs2ZzJuUC9BTE9jbkZmZFN2YjNUNDZuQzh2ZTJJdFQwaG9yenk0MGJmakpYKzdWUTJ6UnZ0UFd1cnROY3NwYnFhVjQyVXpKczVOVGVITkYwcWZVdDExTXNhb0NjTWVEV0h0bkZlOGpwK3F4cVNYczVMVi9jY2VZZkxZNStsQmp3SzJmRTcybzFKMXRsak1hc2NGZS9OVUZVT3VlbkZieGxkWE9hVk9LazQzMks0anlQZnZVaFRCVmZUbmdWTEZaU0IrRlk3dW5ITFYwSStGMnRMNGVmVXZzYi9aMFBVY3RqMXhSS3BHUHhNbWxScVZVL1pwdTI5aXY0VzFsTkh1SS93QnpHN0tRUXdYTEN2YUxiVnRKdmJIVDJsamthZVFyOHcrVUUraHJ3M1RqY1dseXhoWGRJdk9BcFlpdm9QOEFZNitBMnQvRmpXZk91OTYyQ3lCZ2tpL2VQQnJ4ODJqU3AwM1htN0pIMHZETmF2VnJMQ1Fqek9YbG9yZFdmY1A3TmVnWFZuNE90MnVJTGVHT1pWMkNNY1lyNkkrRkhoaWExMUx6STN4YkFaSXpYQy9DN3dYSjRkMGlHMmtSbVJGQ3Jqa1l4WHEyazZtMmkybmx3Mjc0Y1kzZWxmZytjWXAxSEpRNm45STViaDFUakhtNkhmV0VpamJrMXFRNGtXdUowV2FhUjFiYzNIT0s2aXdtWXlManAzcjRuRVVYRjduMUZHcHpJMUZnNlZLa2VXcFlaY3BVaURqbnZYbXlrenRqRmJra2NlVnBIdDkxU3dyeFVoWEZZOHh0eXF4bDNPbks1UHkvcFdYZGFTcGY3dGRKTEh1RlViaUg1dDFkRk9zMFpWS2EzT08xL3dBTHczMXN5U1JobFlkeFh6OSswZDRDajAvUlRKQmJobTV3UXYzZi9yVjlRM3laVTE1bDhYOU5YK3pKSm1HNk9OVHVHTzNldm84b3hrNFZVZUxtV0ZqS20yZmpUKzJ6OE5yTFRkVlhYTGVHVkx5OGxJdVFPVXo2NDlhK2ZjRmM4MStoUDdhSHd0c2ZHdmdyVWRRMGRWazhwaVNNRlNDTTV4NjE4QlFhTmNYVjAwTVVUTkluM2g2Vi9TUER1TlZiQnJtZXNkN244c2NiNVhMRDVqelUxOGVxdDE3L0FES0dLVUJtNmNrZHNWclcvaG1TYWZ5NUpyZTM1d3pPKzRKOWRvUDZacTFCNGUwK0dVcGNhZy9sb2Nib3JabXo3OXVQcml2VXJZNmxUMDFrL3dDN0Z5L0pOSHptSHl1dlBXVFVWL2VsR1A0TnAvY2pCalU3L3dBT2FjeTdXREt4RzNvUWVsZE1QRCtpYkN5NjVORzNwSnB6aGZ4SVpqK1ZidWwrRkpwdHJRdzZENGtzZG56QzBtRUZ5bzlsYlpKdS93Q0FrZld2UHE1MUdNZWFWT1NYOTczZnViOTM3MmoxYVdTeVh1S3BHVC91dm0vQmEvY21jSk5xRWw3SEdzMGhaSStBU0JrZTFkMzhMUEc4ZWw3ck8zdW9kUG1raE84WHFac0w4ZERGSVYrNGZSbUczMWNWUTFmNFlTWDdyL1p2MnRtM0hmWlhFWGwzRVE5czhTZHVoejdWSG8vd3MxdTUxUFpwMEwzTFE4L0lERTY1NjhOZzU3R3ZuY3l3K0F6TENTcFlLc3FVbHJacjNmOEF0K0Rzck45VTR0N3hrejNNdHhHWVlERko0aWk2c2RycjRyZjNaSzcwN08vWnBHcDRwK0kwbmdSdnNlcDJ0MCtqcSs2S01ULzZWb2NyOHExdmNMd0ZiUEI1amNFQnVlVDg5L3RGZUJsamViV05IdTdQVXJDNGNtNDNRQ08za2t3T0xtM0dQczg1L3dDZWtlRlkrbld2cXhQMlpkYzhRYUV5VzZ3MmQ4c1RCN0c3T2JMVWtiNzBUTC95eUo3TXVCbnI2MThuK0lQTStISHhGdS9EdmlhM3YvRC9BSkQvQUdlR2VkUE9sMHdmODg1Qi93QXZFSFBiNWdPUm52OEF5enhGa3VHcDQyVkxNcWF3OVo3VGpyVG0vd0NaU2ZmcXBXZDNyNzM3eGZ2T1M0cXBLZ3BVSk9VZFBka3JTajVOZVhsLzI3cDdwNGJmcGIyeU5hWEZ0TmFzdzNMWjNMY2Mvd0FVRXZUOEc3ZDJxYjRmV0xlSHZFME4wczJxL1laUDNBbXNDZ250bmNFQU9qa0RISkJ5UUdCT0c2MTNmeG44SjZmcGFva2RzeGI3ejJVYitiYTNFWi81ZWJTYnJzYkhLRWZMMzlCNW5vRXQ1NGF1MnZkSGthNGlqVmtsdDVGRFNScWVxdWg0WlQ2Z0VldURYd2RUQzFhWFBRcVJzOW1uOEw5TDNzMzAzVDdzK3NqSkpxYTFYa2VycjRidmZDRjNxV242cnBzbDB5WWsxSFFKajg3RC9uNGhLazdaRlhuUEpBR0dETHpVbC80SWwwRFFkSDhTK0U5VHVMN1E3ZDE4alVvUjVWMXBkeUFjUVhDajdraTQ2aktPT1FUa2dGbmQ2ZDhjL0FkbzNoaXdpOFArSlBEV0dGakFqTDl2WnVza003TWZtWFlQM0o1NU96ZGxnRy9DMzRoNmhiNnhKTFl4Mm1uZUttRFd1b1dOMUdxYWY0alRjTjBNaU5oWTVzWngwQk9DQ3JkZmtjUlJuNzF0SlJlcWZtdE8rbm5kcm83cFhYUmlLZE9WdVhicC9YbDJQV1BndjhYcjd4ZFp6YTk0TjBPMHV2RVVrYXA0aThGZ3RIYTYxdEpSZFR0UUNOa2l1TVNLcDR5MkJ0Sm9yTCtIWHdKc1BpNWZ5My9nRy8xTFNiMjFlYjdUcExUZVhxM2gyZG55NkRITXR1MjV3cmprREFjQThrcjVyRlluQTA2c29WV2swOXBjMTB1MmpWMTJ2Nlhhc3pybzFhaWpiOHJmcWZNK3UrSzdoZFZhT0dObFdXTUtjanVlTTgxcFhHcnRZYVJMWnh6Vzhja1NBU21RWmFRNEdjSDI5S28zT28yL2lDL2ptVGY1ZG5BU041M3NPU1JuK1ZTUTIzOXV4SFZmczZ5UVFmZjJjYkc5ajZtdjJtamhsS0tqYTlqcHB4OTNVMXZEWHhHdlBoeDRuMGZXYkthYUcrc1pVdUlaaXU0R1JTQ01nOXM4WXJjOFVlUHYrRmk2dzE5Y1dlbjJ1cWJpTGllMkJVVDdzbG1jZE01TmVjNjVEY1hFc2EvdkZFYWg5anFkd0Evem11dytGRVVLdmRXOXpCOXZFeUFJeERCVmJJT2M5L3g5YThyTXFNYWNmYlcxUWUxbXJSdnB2WTFyalZwTk9uam1qdU5rY3ErV3M1VXJnL3hINmR2d3JjK0g5alBybXRNaTd2dGswdmxpOXVHQWlpVTVISTk4RVovL0FGMXpjbWlHRFVycSsxRzRzaFlLQ3FSenRzREhuaFU2dGoyNHpYSzZ2NGtXZVFXOXJjU1EyN2d0Z1NZQk9PTUg2OXFpamdGVlNkOS82cy9JNnZhSks4dXZZOUdYVTlLc0wrNnRJMjM2dERLMitaVHZHVHh0eWZUam1zZTcxVFQ5R1pyaFZTNHZJZHhQejdpMmNEa0h0N2RheHZEV2lMbzk3ZE5mckcvK2orZWRyTSs3T05xbkIrVW5QVW44S1FXbDBkVFdaYkdNdElRK0FOMGFwa0RINDhjWjlhOUNwZ0l5aDdLbHIxZHQvdk1ha3JxMXJXUGQvaDM4WnJmWFhqYTQwdlRkUHNiVkZpSnRiWFl0eG5QTEU4QSsrYzE2cDRLL2JPVHdYYzM5cDR0c0c4V1IzOW1kT2h0NXBpVmlnSkJBRERsTVlCRmZIT3QrTm11TDIzdDdGcEF6eVNTWGNTUHR0M1k0MmJVQUdNWTkvd0FLM29OVG0wN1MzazFHZjdTeEc4cmF6ZnZlTVlWbU9lZWZmcFh4TlRoZVNtNTNhVDZmMS9YWTNvVnFsK2RQYlR5KzcvZ0gyeDhQL2pYNEorS1Z6WStGNVBDLy9DUFNmWnBnbXBSM0FrV01zTXF6cXh3d0FVajF5ZTljNTR3OEpUK0dORDAyMHNvWWNUTVJEY01BWkx0UWVwSSs3eDB6WHlPUGpMZldua2l6aGh0NE9GWWxNM0RFZHczYjAvT3ZVZEYxcS84QUUvZ1czMVRVTHE4am11cGN3QlhNa2lEZ0RxY0FIM1A0ZE0rdGg1WmpScHhvU2Z0SVc1YlMxc3RkbTlmVGUzUTU1UlV0VW1uZTk0NlgyM1czelBRZFFQaCsyOFoydW0zMWxGQlB1SSsxb2NwYnNSbkFJNmtrQUd1azFINFMzRXVoelNXZG8wMHNUc2Q0bHl6QWR5dlllbGM3NEpoOEw2TGNXZDE0aW52bHVJVDlxRnNMeU9SM1lkTUtnR094TzQ4NHJ1ZEQrS05sNFoxVDdKQ3NzZHRmT1paWGluQWxVT1BsQnp1N1pyN3JndmpETzhseFZQRDRlcGVqelhkTnUzZE4zU1RzcjNzOUhiVkhnY1RjSFpmbkVLbFhFVTF6OHRsSmJyNU5XdS9MVThzV0thSVljWWtYaGdPMVNRd3NRUTJRRDdWNjVMYitINFlaRXNiR00zbG5JTGo3Vkl1OVZPNzVkNzUyNFBjRWRLbThUNlg0UmF5aHVaUHM4ZXB0QzgwNlc2YjRHSUlHT0NSeTJTQ09vTmYwSFUra0p3OVNyL1ZxdE9wZlZYNVU3dGJiUHIwZjMyUHcyWGdYblBzbldWV0NWOXJ2WitkdDExWDNYUEhsM1E4ZHVsVFF3U3o5RmtrSjlCbXQreThNeCtJOU5hNGhqOG1ZN2NSZ2JmTEo3c09jY2Z5cnN2aGI4TGRSdkhYYkdRUE5LRjJVN0Y5elg2bGszRitXNXJoUHJlRG5kTGRQUnA5bXVqUitkNWx3WG1XQXhhd21KaHZzMXFuNXJZOHRqdEdadUZaZ3A1QkZkVDRaK0UycitMOUR1TCt4aERRMjUrWkI5NnU3MVA0YVE2YnFNaVFUUXp5TSs2WW9QbFUrMWV5ZkEvd0ZyZXJXZHZZYVJwdmt0Y0ViMktZeU0vZS9XdXpHWndxZFBucDIrWldXY0x5cTEvWjEyN2EvRDM2R0QreXI4RVU4U1hrSzZoby9FWkFsa25qeHM5eG4xcjdJOEsvczFhVHFXbCtSRFoyc2tlTU1oandyRDNycVBBUDdMRDZEcHRqTGRYaS9hbEFNcTdRRVAxcjJqUS9DY2VuVzZ4Vy9sczRYcUY0cjhtenJpTjFxcmxTa2Z1R1JjTnd3dEZVcHI4cm56SHF2L0JQdnduWTNuOW9RNlZid1hFaS9kVlBsQnJ1dmdaOElyZndLNGhqdDdkWWxCVUtpWTIxOUFRZUcydkxUeTVWMjVHTTRxVFNQQU52YVRmTEdPVGttdm5hM0VGV2ROd3F6YlBmb1pIUnAxT2VsQlI5RVorajZUSGIyeTdVR1BwMHJvTk1zSXBZbDNKMDdWcFczaGhZbHdGNHF4SHBRZ2JDMTgzV3hhbHNlN1R3emlKcDJuUnFkd1h0V25EYVkvd0RyVkRwMXV5bkczaXRpQzE0NXhYazFxanVlaFNwNmFFY0ViQVZhZ1E0cHlRNEdLa1JkdGNjcFhPaU1iRGx3RnBkMU16VFdrck0wSE8vRlZidGxDTlRyaWZhdFl1cGFtKzRxdGJVNmJrOURHcFVVVVY5VXZQM25IODZ3ZkVPbnJxdGpKSElGWlhHQ1BhcDlXdUd0NVkyWS9LeDV5ZWxVTDd4TGEybHN6U092eS83VmUxUnB5Vm5FODJwVWkvaVBoMzlxendUZWVIN2ZWN08xVGJid004b3gyVTVyOHh0ZkUxcjRndXNNeVNlWTNUdHpYN1AvQUJyRmo0NGoxQ05tV09PZERHV0k3ZDYvT2I5cFg5bXV6OEwzZDNxVnN5K1hNeENIN29CcjkwNEp6V25HTHBWdEc3SDRQNGpaSFh4RVkxOE45aStuK1I0dGIrTzVOUXRObW82Ym85NXRHMHlQRDVjeEEvMmt3VDlUbXREdzdkZUhieHZMdWJIVUk1cERrUEJlSnNWUjIydW1ULzMwS3U2SjhKNHhZeHRlTmR6czVJUTI5dDVzSUgrOW5rKzFXNC9oM3BkdTVTVFZJYkhzUHRNRWtlZnhBUDYxOVpXeE9DMWhCeVQ4dWEzNGFmZ2ZCVXNGbWFVYWxXTVgvaTVML052WDhTSFhQQnVrK0pJMWl0TlltdFc3Qzl0UXNmNHNqTitnckIxdjRRNjFvSjNmWi90bHNCa1hGbTRuaCt1VjZmaml1dHZQQjgxbS93RG90bXVyeElNbVMwbkU0VWZSU1QrbFkrbStJTHJTYjU1N2U4dk5Ma0J3RWhPMS9vUi9qWE5ScjEycjRTc3AyK3pLei9HTm12bW42RjR6RDRkeS93Qm9wT0RmV0xhL0NXalhvMTZqUERIeFV2dkROcjlubGsrMHdxQis2blVTS1NQVFBJUDBJTk8xZjR6YWlseWwzWVdjek5FTnpSWjh6ZVBRQThqMTRZbjJOV0psc2RkbmFYVkxHYThZOHZOYTRoa3oySjRJT092VG4yNjFlOE5lRDQ5VmRtbXV4cHRuR1AzTTgwQmpqZHZRdjkwSDJKcjVuT01MbGMvZngxT1dHcUxhcEYyamQ5VktQdTYvOVBGRnZzZXpsTmJOSXpWUERWRlhoYjRYdlpkMDNkVzd4YlNPcytBZjdUK2svRXJ4R21pNnRkVEpNKzFEYlhMR0s0dFRrSE1lN0c1ZllqUFBRR3QvOXQ3OW1MVGZqSHBOdFozVnJCSmZ5UnVMSFVVVXRLRlVaQ3Z4bkdDZUFTUmdrRTRLbnBQZy93RHNNNlQ4YmRBYUx4ZHBzZDlHVG0zdTRXMlhGcWV6eFRMOHkvZ2NlMWRMNHY4QTJZL2pKK3pWcDV1L0RXb0w4Vi9DT25wbTIwN1UzRVBpSFRkdktpTzQvd0JYY3FQN3JxakVjQTU1cjhNNDF3T0twUmROdU5lbmZYbDkxUHMzSFZRbi9laFpTZnhSMWJQMnZJYWJxMFZWU2NKTzJrdFd2SlM2cnlscXVqMFB5SCtJZmgzeEY4SnRWdnZDT3VFeVcrblhCa2lpdUd3OXF4K1ZiaUNUKzR3QUdSa0hIUHR4ZC9OSlkzc2R3N2ZaNzZFN29yeFBrTC83NmpwL3ZMa0hQTmZvZiswUzN3My9BRzFmQk4weHRycnd6NDUwZnpWMURRN3VJV3VyNlZNQUNiaUNGaHZsaDNaTWtLNTNETExod2Qzd0I0ejhLMzN3ejhXU2FIcThkcnFsbEdkNkNLUW1LNGlQL0xhMmtISzdzZW5CR0dVNElyOHB2T1NTb3R1S3V1U1NzOU4xcnMxL0szMXVtMDAzOWpUdDEzL3Ircm1sNEMrSW1teXp5NmZxejNXa204ZEhsTnJQNU5uZlRJY3hQS05wOHQxYmtPdkJ6L0RqSjZUWE5Xcy9pVnFGeDRkOGJQRm92aVF5QVdmaWNMdWh1aU9FVzdDL2VVOEFYQzhqSHpCaDA4MWs4QnBxT25TM3VqelNhcFp3TVM4WWovMHl5QTUvZXhBL01uL1RSUGxPT2NkSzZCZGVqMDN3OVpMcUZxdXVlSGJqS3p4dzRqYXljbkorelNmTUU3RW9SdEo3QTlQS3hXRm9Ua3F0SnU2MDgwOU8vbDBlK25SSTNqejh0bnNkOUg0aDFqd0Q0bGpzZkcrcGF2NEs4VWFVV2kwN3hoWXFaSlo3Zlp0RWNwakk4Nk5vd05rcWtuQXdjamtGVS9DZmphVHd0NER0N1BWcktQNG9mRFhkNWtNUG1ORGZhTE56aEEzelBia25oa3cwYmpKVWs0TkZlUFZ3c3BTOTZtNVB2RlF0OTAxZFB1dGwwTm94aTEvd0cveFI0cmJhc0ZTUllmczhjMTFsQ1F2VFByK0hhdWgwRHhKWitFL0RpNlZQTkhlcnVGNUhIYng5SmpoY01lNENqZ0R1VFdKNEorSDkxNHRTTlNyUTJzWjh5ZTRKQ3FxRDd4R2Z2RWVncWpxTjNiNkpkeWZaVEpJclBpTnVtUU9oL0d2dnRGSnFPNTdVYnhoZVMwTjdXZGRudk5SMUNYY3l6WFh5S203ZXlqMHFqb2ZqWFZmQk1VMFNxeTlZeVdIci9YcFdUQnFFYzRqanVMaWFOZk15eGo1azUvejByVWJTSkRaSVptVzR0eW1WWXZoaVFjLzV6U2RHRTFlZXB6eVRuSzhGc09OcnFYanJVSnRUZUJyZlNvWkI1azVKYU9JNCs2Q2VwUHAxNXBiMktMVjVvTGY3UkREYjJyRlE2UWtISEpCT08rZlg4cVRXdkh1cFhtZzJla1RORW1tNmVTWUlGK1ZGSjdrRHFUNm11OCtITmw0dThTNmJKWjZCcE9sV2x2ZmdJOTNQR0pDY0xrNExaNU9UMEdlYTlMS2NEQ3ZYalRuNkpKWGJmUkxWZmkwWlk2cDlYcHVVZGVyYmRyZCs1aCtIdEdua3RabmhtVjd4WkJ0Y3lLc0RKanZrL1QycTVyVmhxR2xScjlvMWlGbFVnR0tBdS9sQTU5Z09mWTExVnY0TThaYVI0UDhBc09yYWhGcDJsTk9ZNUpEWmh3cTlReFlZT04zYkZVZkd2d1hrMGVTTzBPcE5xMXhjb3NvbE9ZVlZPaW5iM0hJNXp4WDBGVGhYR1JpNTBvU2p0ZE95ZDMyU2JrMCtqdDNQSm84UllKU1VKelQzdFp0clRmV3lTdDZuTStGcjZ4dHRVYU9hVDVWa0g3MHhGMlJPNUNnODlhN0Q0aCtOcmVPeGh0L0QranpXdW5YQUtzODBTczg1SFY4N1FGenh3T25xYTFmaEQ4TDlhOElyTkxjV1ZrODFnK1NzeWhsbWpJNUsvS2ZhdGV3OEczV3RTVDNsOWIzRFdOd3djSkRNcStXbVFkcFU0eG5IWDZWMVZPQzhaU29xcldwemNtcnBjdGtyZFhmWFRib2M5SGkzQlY2bnM4UFdoWk96YWFlK3RsNm5PV0Y3Y2VJTkIwKzN1dE10MXNXamttTndrS1cwc2VPTWI4WmJnY0QzcnI3endIcUdzZkQ3U2JpTzhsbXNyTXllVlpsTmtzU1pKenVCSVlrODhpdHlYd3paNlg0ZlhTTlZ1Sm8vTW5aN0lxd2xRSTJBQTVVZHVmWEZlZ2ZEblR2Q3MzaEdleldXOHVHc1dFWGtGbkt5OEFrcWVPRDZWNW1SY1BVbm10S2xpNmNxbDAxeXBmREt6czVPM1RSMnM5QjU1bVZiNm5Lcmg2c1kyZDd2VzZXclNTZDlkVmU2dHVlSStGL0NkcmRlTWRQRjlxbjluNzFLdGRPMjVjODdYSzU1NXlOdkI0N1Y2NUQ4UDlVOEpXZHZlYWV0cnJNTTB3WVM1TVNwdDUzRGVUMUJxblllQ3JLMDErNTFLMnMwVXpSbU40cFUzb29KR0R0ejk0WTYrOWJHdmE3L0FNSkg0ZmswdVMxV0tGanZVd3UwSlU4WVVZUHArVmZRNC93cHpoNHV2VWRKT0hMN2lpMVozOVBlVDNUVzJ6MVBsc3Q4UXNta3FiZFp4bGZYbVRYNHRXZmxZdWFaOFhob0dydzI4dWt5Tk5xMFdKWUkyV1NJN1JnS2R3T0Qzeno5S2h2L0FCSWRRMUVUSlkyZHVvaUNOQ2taK1VnK3Y2Y0N1UXZ0TmgwNmRScDlpanlReDdwaUpEdlk5aG52L3dEV3JiczljbThRYVpETFBaeDJVeWd4bFFEdVlBOEZ1VHo3anJYcitHdmh0aFBybnM4N3dsU1VtcnhjaytXUEwwYjB1MzAxWjVYaU40aFlpR0NUeWJGd1NXNlRUazc3VzNzdmtYTkkxV1RRcnE0K3orZkdkUllCMzh3eU1nQUdNWlBIT2VQZXZmdmhYY2VNby9EVi9GSnJWamJlSFpFV1I3U0MxSG1UdGpqZEtUdTQ5cStlWVEwYnF5L2V6eFh1UHdiaTFIV0xTQ0dUek5qY0ZXNEJQYXYxek9QRHJLWXpqaUtVZVNLa3BPSzBpMnRycGI2NjJaK1o4TytJZVo0aStHcnZtazAwcGFYU2VtLzlhRjM0ZVcxMXJ2eEl0YlMzdExpWlpwMEVwMlpHTWpPVFg2bmZBNzRWNmRwbWcyODBOdkdreklNa0lQYXZtZjRTK0NyUHdocE1OOWMyME51NFViaW96ejYxOWVmQkxXSU5XMEszTUxLVlZlUUQ5SytYNHR6S1ZhQ1ZOV1VkUFUvUnVFc3BXRmI5bythVXRmUTZ5RHdtdDZpN2xJeDZWcWFaNGJqc0pBeXFjL3pyU3NDcmpoYXZRVys0OExYNWhVeFU3MnVmbzFQRHgzU0lZYkJaUDRhdVcrbjdEMC9Tck5wWjRIU3JhVytCWG4xSzNRNjRVK3hWV0xhdU1WR2JRbHF2TkJpazJBZHF4OW9YeU1TQzMyaXJVWnpVQ25EVktIck9XcHJIUW1GQnFIemdwb00vK2MxRmkzSWtkc0NxODgrMDRwWG5YMXFyUEw3MWNZNm1jNWFhQ1R2dVhyV1RmRHltTGZ4Vlp1N3Z5MTVQNjFqWGV0Skt6THU1SHYwcnZvMDJjbFNTdFl3L0hza28weVNlUGY4QXUxSktyM3J3anhUNHpQaUtIN0xHMDBOeEdkd1hjVkxZcjMzVXRUVnJTUmpnOGZuWGcvak84czV0VG1tVkVXV05qZ3J3YSt0eWRyWnJZK2N6Uk5PNlo1bnIrdFhWcFlYTFhUZVFzSVlrSCtMQXI0Wi9hUytPdDE0cTAwV01MZnVtbmJjQ09SaXZxMzQ5L0d1MTBhM3ViRzZWVWVUSVJpTWs1NHI0VStKRjlhM09wM1BabWN0Z2o4dnpyOWU0VHdDbFAydFdIWm8vRitQczBsREQreG96dGU2ZjRITDIzaUc2c2xDUXpOQ0ZPZmtPTW1yMGZ4SjF1TmdHdjVwVUIrNU5pVlB5YklySGVITGRPdlNwYkMxODY0VU53dWVjaXYwQ3RoYUZSZnZJSitxVFB4aWpqOFZUZHFWU1M5RzBkRlpmRUMyKzFMSmZhSmFIbjVwYkoyczVqN2pibEFmK0FtdCtQV3RKOFZRdEN2aUNTMVZ2dVE2MWJpWm8vWVhDRDlTcTF4dHpwOFVyN1pVTU1qSGc1N2ZTcUY3cDdXTjBZeXdiR0R1SFN2RnhPUVlXdmJsdkZyYnJiMFVyMi83ZHMvTTlxanhEaktGK1pLVWV2VDcyck4vOXZYUjJkLzRlMUx3aWgyd3BKRy96UjNGdk1zOExyMDZnOEg2bjhxK292MlJqb2R2bzgxaHJjME1ONWRBRTJtb3crV3N3UFpWY2JaQVFmNFNhK08vRHQ5SlpYNmY2NW9wUGxaZVFNSDlLKzJ2Qi9nK2ZXdmhQYXphUjRpMC9VTFJZc1RhTjRsdGhxTnBNTzZyTGtUUmV4M09CL2RyODg0dXcrY1lLZ3FhYXEwNWV0L1N6dS9tNXk4b242andEaXNCaks4NnFYczV4V2kwdDY2V1gzUlhtenNOVStEVGVDdFFrMUw0YTY1UDRPdW5HNXJEeS90bWtURWV0b1dHM1ByQzZIbnYwcWJWdjI1dGErQzluYndmRkh3ci9BR1hwYzM3bVRYdEpadFIwaVluK0p3b00xdDY3WlZJLzI2K2FOYzhaYXA4SzVKSnRGMUxXUEFmbHlsWXJUVWcrdmVINVQzVkpnVmtnQjl5b0g5MzAwTmEvYlQxelJOSGoxYnhONGJoMHFkRU1BMXZUcFA3VjBPL1ZzWkUvbHFaRVhnRWVZaHh6ejNyOFR6WDJNS2JsaDI2TldPOFhzLzhBdDFyVC90Nk1iOTJmc21HeEVtN1AzaytxL3I4cm5zdjdUSDdIL3dBSS93QnVMNGNSYTNIYzJMYWpjUkU2UjRwMGlVZmFyRnlQa3pLaHk4WUpIeXQwOXVDUHh0L2FQK0cvaWo5bUQ0bTZsNEYrSjJuM21xUjJjclRXZXB3UzdMamEyZHR4QzdaVmxiQUxLZXZRc3JjMStubmhmNFo2VDhjdkNkNThRUGcxcXJmRHZ4aDV4aHVEcGs2emFKcThxNExxMXMySXBFWXNQbUFWc25ua0VWNVQ4ZlJyUHh1K0RkMzRSK1BYaDJLMnQ5RGtJMG54cm9kbzl5dWdUbjcwVjNDdVpvNFh3T29LZDFZZ0RIeStieGZzS1ZURXdhVTFlTTRwMjA4bHJ5dm92ZTVWZXpjTDh2VmwrTXBWS3M2ZENTazRPMGxvN1BzL1ArdEQ4MkJidFphZ21yZUdOWWU3a3RmbU05cXJXMXhGNjc0czUrcFVzcEhldXQ4TWVOOUM4ZHh6V3Q4bGg0WjhUWFVnSXZQTC93Q0pScW94ank3aTNBeEZJVC95MVRBQjZoZVdyamZpbDhJcjc0WGFxODBNaTNsaXN1MkhVYk9UZEc0NmpES1R3UjBQOWVBM3d6NDhzVHJNY21xS3krWXZsdmVKQXNraXFlRDVrWndzb3gvRU5yRHJ6akZmTllqRHhxdzlvbmQyMGxIZjBmUnJ5NzdLNTdkTnB5MDA4dW40bllXL2d2WFBBM2pXU1B3N2NYWGhieE1rV0o5TnVybFZXNFE5WklabXhITEVmdktEa2dZd1h4dW9wTGJ4ZS9oZlJZN0hXOUtnOGIrQlRLMGxpd3VESEphTjJFVndBWGl6eHVpWVlJN1p3UVY0c3ZheTFsUzUvTlJqTC8wcWNXdlIzdDNaMHlveFdqMCsvd0R5T2w4QS9EYUdINGEyZDU0dTFhNXM3T09GelkyS0tBU1crNlhQWGFjbk9PbU8rYXNmRXpSL0MybitHYmF4dDlQdGZzc0Vhc0wyR0FSdmNTWStiNWp5VkJ6ejdWMW54ZjhBQXJmQ3Z3NWZXVWJRYS9hd3lzTGJVWlpQTWFHSmdHU01BaGNzdkhJeU9jQ3ZGOUFOMThRZkVFVVYxUGVYMXJacUpHU1JzZVhIMU9PT0ZGZlVmdjNVbFRocHQwKy81bm9TNXFrbEtXMzRITzZqNGZ0LzdSa21zL3RFMW1wOHVONUU1WW4xeDBxdHJYZ2pXTk9nWkxsbzFWbDNvRkkrNEIxSDUxMW5qS2JSdEp1N3F6MG05bXZIQUxiNHBNUkkzb0QzeDYxeTJyNkpxVXR2SGZmYkdsdDVtMlpXVXY1SHNldFM2Y28xT1Z2VCt1b1ZxMFZHeU9rK0UvdzlqOFZXWDJlUml5eThCSVlsYTRaeDB4dTdDdlVybnc5NG8rRGR4YUcxYTF1QmEyKzd5NGtWNWtRS1FNcm5sc2tBNDk2ZDhEL0YraitBMXNOUHZ0VXRwSW10NVpyaWFLeVNWb2RvekhsbTUzRThjREk0NjE5UmZEK2Z3djhBSG40VjJ0cXZobTZzWnREdUpkUm4xNjBoRWwxTmJBRGNyeGpsZ01iam5HQ2VLK3V5dk1NbXl1VUsySnF5VlRtV3FYd1gzZlc2WDY2ZHo1VE1JWTNGYzFPbEZjbG03UGFYWmQxNi9uc2ZOL3dYOGFhOThSN2kxMC9VSWJlZUcxa2tGNUxKR2N2M0c1ZWdIVWRPdUs5QTFEd3pZNmhxcTNFbHVKSklZakFwM1lIbC93QjBqMHFqOFhOVi93Q0VKWFdQK0VWYlRiaTZZa3gzRWNXeVpnMk1NMGJkTXJqbXZPL2huOFNQRm5qM1d2TFdleEVOcSsrWldHUTN5Z2JPQVNQWDYxKys4UDhBRWVBcDA2V0VyUmxpSlZiY3N1Vk5OYmRYOWxhdjU5VDhVNGw0ZHpDdEtXT3drNDRlRk5QbVYydFhyMFd6dHA2STlnMmVXbmwrV0Z6d004NEg0MUZlaDcrMWEzWWhZbUJYQ3FBUitsU3lSa241dVQzeC9Ta1g1UngycjlmZUVwVFh2UlR1cmZMc2ZpUDlxWW1FclFxTldkOUhhNzc2V3VZR2orSFl0SDFGWXJyekdXY2p5bUlMbmQzM2RRTTljMTBkaXY4QVpWblBESDhzenhiWW5URzJKdW9iSDlQZW4yVi9KWTdoR3pBdWhRNDlEMXFLTDVmdk5JM0p4dU9hK1ZvOEowNEtwaHBwZXhrN3BSOTFyYmRyV1YzK0ZrMGZZMStOcHo5bmlxY21xOFZadVh2Umt0Vm9uZEt5ZnJ2cmMyZEQ4YjMrbmFRTFptaGthSnMrWXlqekpoZ1p6N0QwK3RZdDB6WE01WmprNUo0R090S3EvTDgzVHRnVXZsTS9XdlV5TGhuQlpWR2NjTEg0bTNkM2I4azIrMTdMc3REd004NG94bWFPTXNSTFpKV1dpODNiejBidjFJeDFCL2l4aW5FTXk5VjQ5S2VzTEZ1ZWxQUzFKSlBTdm9QWnBIejN0WnZjaHRJV2VWZHVjNUhhdnBiNEp4VFBiMmJTajVoZzdSM0ZmUHVnN1lOVGdhVXI1WWNCdmNWOUxmQjNYTFZMOEx1L2QrVGhBTWNHdm44L2I5bFpMdWZhOEVSajdkeWs3Ykh2RU56Y2ExYkxZMjk1SkZHd0JLWUIzRDJOZStmQkR4SXZoRFQ3V3plWnQ4bUJ6M3I1aStGUGlPVFd2R2NhcjhzY2ppTkFmNEJrVjlaZUQvQzJuU3d4elNOSEpNZ3lPZWxma2VkUlVJK3ptdE56OTl5ZXA3UnVyRDBQb1B3YmNMZmFkSElHKzhCMXJwTGVMWjcxd2Z3NDFlTVd5d3EzM09PdGR6YTNZSSs5WDVUanFialVhUitoNFdTbEJNdXB3S2tCNHF1Snd3NmluZWN1UHZWNXJPKzVOdXFOamsxR1p3UDRoVWNseVBXaFhFVGx3S2lrdU5yY1ZWbHU4a25kVk9iVWduOFhQMXJXRk50bWM2aVJveVhOUkcvMktlY1ZsUHEyWDYvclVGeGY1L2lyZjJQY3dsV05XVFZsRlEzR3Nxc1p5YXdKOWNXRnRwNjFsNnByWkErOWhjK3RkRlBDM1poUEVXUnE2ejRoend2UEdLd0d1VjJNd1B6SHZXZmY2NERIaEdIUFgxckEvd0NFbjhqVVREdUxaNisxZXhRd2I1ZER6YXVKdkxVdGVKdkZUV1lhRmR2ekRnNTYxOHNmRlB4NXFtamVNMjh1TGRBN1lEbk8wbXZxVFhkTXQ5U3NXWlNGWmh5U2E4M3RmaHBEclhpQ08wWUpjZWRLRlVFQWpKUEZmUVpYaUtOQlNsTkhqNWhRcVZyUmc3SHp2OFdmMlJ2R3Y3U3RsRHFYaHZUcHJ5UzNUOTRFR0Y0NTYrdGZMM2p2OWoveEo0VW5uL3RKSmJlNmpZcTBjcWtNR0hZMSs4UGdUd1phK0F2REZucE5wR2l4MjhZRHNveHZmdTM0bXZIUDI2LzJmb2ZIL3dBTUwvWE5QMDVicld0SGhhZG9WQjNYY1Nna3JnY3N3SFFkVDA5S3p5SHhXcjA4YXNKS0NWSnV5Zlh5dmZTei9BOG5pTHd2d1dNb1BGVkczVVN1OWRQbFpYdWZoSmZXVWxsY1NReS9MTkUyMHJqcFVtamFaY2FwZHFzUDN3ZlN2V3ZpWHJXb3phNDhtbWVHZE5qajIvTUp0S1M0WW5PTTdwUXhyYStGcyt0WE1Dbi9BSVIvUVpuNm4vaVR3UnVEOVZVTitScjkwcThRT0ZIMmxvZitERmY4cmZpZnozUjRXNXNXNkhOT3llL3M1V2E5Yi9vZVlYdmdDK2x0dlAyc3NrZUI4d1BGZFg4T2ZnaEo0dmVEenM3bUkzRWpHTVY3eGJhN3A5aHBVY1d1YU5ZYWZKSVFGSHpKdlBvTXYxK2xiV24rSjdMU0pZNFlmRGQ5YStZdnlTVGJvWTJQc3pJZVB3TmZMMXVNNXlnNFFocXUwb1AvQU51UHVjSHdQaElWWTFLczdyczFMOVZ1VmROL1k5MGQvRDF1MzJjTkkzM20zY21zSHhoOE92RUhnQ01XdWl3N29XKzl5ZnlydGo4VDljMFNBVEpvTnhxVUs1K1N4dkkzYjhGazJackpmOXJUdzdhVEZmRVZsNG44T3gveFNYK2tTckVudVpJd3lBZSs2dm1LZkVrNHk1cTdkdjd5a2w5N1Z2eFB1NVpEaHBRNWNQSGxlMTQydWN2OE9ialdGdjQ5T2V5a21sbU9HR3pjaC9wWFk2cCt3VFlhamJYSGlUUzcvVmZoM3F3Um51N2pTOWpXOTJnNVBtV3IvdVpPT29LZ24xOVBTZjJkL2pCOE4vSE9xZzZINHU4SjZ2TzNDeFcxL0U4d1BmNU03djByMWI0NytPOUowandhdWt6R1B6dFVCVUU0L2RxRkozQTl1UUIrTmZHOGNadGdzWmhKVmVTTXVYWnF6MWVubi9tdWxqM3NneTJXRVhMVnFPM1o2ZjFmOGRqeFcxK0RuZ1BVTkQ4UHBwZG5KcDl3dHg5bWlkSWx0RUxBWmVWbzFPME83T3pIR0FOdzlCajV5LzRLQ2Z0RWVKdjJIdkhQaC9XbXNZZGIwTFVJWkxhMzFtMVVQZmFlNmdGN0MvaWI5M2RXcnE2bEMrMlJjdmhpVitiMi93QUg2bkdmRThzQ3h5VFE3bzJoT2NrUHVabkk5c0t2NTFKOFlQZ2JaL3ROZkVmVy9BUGlpWmwwanhEWURVWVJDMngxWGF5QmxmOEFoYU5sUjhkR0NtdnhMUE05eHNyVU1YTG5nMTErenN0TjdLMXRIZFhTZTZUWDBuQytTNWJOVHhXR3Bxbk5hUGwrMWR0M2x0ek85M2ZkWGZkbjVmOEFpN1NmaC84QUdpNVR4cjhMN3FidzViYTE1ZzhWZUUwZ0Y5YjZSSWVmUFMzaythUzJmNWlkb0R4YmNnOGpIaFB4TCtDZWs2TDRqazB0cHJYdy9xaysyUzF6T1p0SDFPSnZ1eXdYRFphUFBUYkpuQnlDd0lJSG9IN1IzN09maWI5aEg0elhYaFA0bGVIWm10R2szV2V1YVRtMm5aQWVKN2VVQUt4MmtiazRCL2k1dzFjeDRmMXk3OGFhUStoQ09EeDVvYXUwbHU5dnRoMXEwQXlkNWliaHpqbGh6dkJ3WDRCSHpzWTRpaFAycWsrWHU3YXJ6ZTBtdHRiU2EyMTFmMEVvcDZkVnYvWFE4Nit3K0t2Z1Jxa204M1dsU1REWVFZMWxpbUhCNVJnVWRlaFZoa2RDUFlydmZCdjl0UGFYVnI0ZGowM3hwbzY1TTNoN1VZbmxhemNQOTVZTWlXRWc0eVkyeDFVa2ppaXRLMktwOC83K2xHVXU5NHI3MUt6WHByNm1rRk5LMEhKTDV2OEFKbzltK0QvN092aXI5c2pXMDFMV05UanZZWTR6YncyOXZJVTh0bGozS0RoQ3FnWkFPQVR6ampyVjM0bGZzRStOUDJiZkNMZmJyT3h1TG1TNllUSXNRa2xFYktCeWVxcDh3QXllY2ppdjNoMHY0ZCtFZjJZdmgvYTJGaHArZzZYcGVtZ3JaUUxDa1RsdHVNWVVmT3h4emdaTmZGbjdVUDdRUy90RmZGM3c3NFJqOEc2bEJhdEk3bVNGakhKZXpZTVkzaEJsRVRKYmxnZUFlMWZvMkl3V0d3MUp6clZMTmJ2eTZ0N2lXSXJWNXFuU2p2MDduNUovRC84QVlYOGVmRkc1MWkrMFh3bjRnMjZmYnkzazhYMklxa0NSakxFazlzYytweFcxOE10VTArd3RuazFDOTBIVGxuakZ2NVpnM05OSno4N0oxVTQ3anJYN1NmQjM0YWFUOElkQWswZlFROE50Wnh5WE04azByVFMzY2pzQXhabUpKSE9BT2dBcjgrditDcm43RVVQZ1R4cGErTXRDMG15azhMZUlzN0k3UUNOck81d1hrVUtQNFJndURuZ0UxK1VjTitKV0V4dWFTd3VGaFpSdnlTdmR5MGFkMDdXdnE0K1cvbjlweEZ3SGlNSGdJNGl0SzdmeEwrVnZiWDh6NWs4RzZYbytzYTNjUDVGczBkdmRMRUxwb2R3Q2dZVjhOMnljOC9yWHRud24rT21xK0Z0WnVJZEo4bTEzV3d0ekxiUmhUY0FIQkI1eHRJQnljVngvd0t0ZE5YdzAybjZwSEpkUExKdHhGakU4aEFHeGoxSXhuajlhaitKNjJ2aHk4a2I3UmE2VkpZeGxZa1lBYkZCKzV4N1pHTUhyWHA1dGg2RmVFcThxajVtMWRXV2piMmV0dExhSkovb2ZIVTRUaStWdzAyVHZiWTNmam5kYVQ4UmROazFMN1JCcDJyYUdqNXQ0QUZ1THhtR05rall3VjZZSC93Q3Vxbnc0K0QxanBudzUwM3hMWjJjMXJkWFRPdDZWUStWdVlrajUrNTR4Z0FZcm5kUHZ2SEhpL1JkUHQ3SFRiZjdITkp1Vy9tVlNxS1RuRzhqcmpqMXIxYlZyVyswdXkyTnV0N1NiYm0zV1F0RHZVY2tEb0Q5Sy9iUEJMaHZNcDQ2R08wbFJwdTN2Nk5wNjgwZDd5dnZvbGJxZmtuaWpuR0d3dVdWTUxOdm5xSi9DdmxhVDAwKy8wTU1RN2gvSTVwUHMvcDgzdFZnU0hIQS9PazNNRFg5a1daL0pUcVEySVJiWVBIUHZUeEJoTS8wcVlTcnQ2YzBHUVA4QXcvU2psWnB6VTB0eGkyNnQweGlucGJoUTFKRmI3L2JINjEraTM3QUgvQkpqd3o4WHZnR25pajRnTHFQMnp4QXJOcGNNRXhoK3pRZEZsSS9pTEhKQVBHTWV0Zkg4YmNjWlh3cmdWbUdheWFpNUtLVVZlVGI3SzYyVjI5ZnhzajZiaEhoYkg4UTRwNFhBeFY0cTdiZGt1MTNaN3ZaV1B6cEVlR3djakhyVFNkcm5uaXZZUDJ4djJUdFcvWlErTWQ1NGJ2dDF4WWtlZnAxOFUycmVRSG9mOTRkQ094cnlObzlyZG1yNkxLY3l3dVpZT25qc0ZOVHAxRXBSYTZwLzF0MDJQQnpiQlluTDhUUEI0cVBMT0RzMTVyOVBQcU5jREh5OUFhOU4rRUhqYTMwMktOWnY5YXBDajFOZWFpUGl0WHczTkhwdCtzc25NYWpuMU5kR0x3OGF0UGxZc3F6S3Boc1RHckg1OXJmOEErbFBCL2plRzAxbU82aG0renVweUdCNm12VC9BQWwrMFhKcHVzeHkvYmlWKzZ3TW5ldmp5UHgvTGFTK1piamRDdlZEMUZhbW5mRmczQ3NIaFNKRkh6R3Zrc1Z3NTdYV1N1ZnBlQjQ1cFUzeUtWbmY1TS9VSDRML0FMVGx2cUY2c2MwMEdOb0laVzRhdmVmQjN4UVR4QW9lSmw4dk9NNXI4ZVBDSHhQdUliUDdSWjNNelNSajkyRllqQjk2K3RmMkxQMmc5VzhRMi8yVzhqYU5vV0hKL2lIclg1dHhId2FxVUpWNGREOVc0YjQwamlaeG85WHF1MzNuNkNSYWtDblgzcVJiL2NPdUs4LzBUeGY5cHRrYVJzY2RLMjdMV1JKSDE3MStWMXNHNHV6UittVThVcGFvNmY3Yng5Nm15M3ZIV3NPVFZRa2ZYTlFUYTJwWGcxakdoNUdudGU1cTNHb2JQNHRvNzFuejZoSE9tNUpFa1hPTXFjaXMyOXVtdUxTUmdjTGdqNjFrNkJiUGJSU1IvZEJ3eWpQVTErWTV4NG1ZVExlSmFPUlZJKzVLeW5PL3d5ZXkvSy9hL2tlN2hzamxYd01zVW43eTJYZEc0Mm9EenNCcUxxODJvM3JXYkZKdE9jZk1hZEpQbE1WK3VjcTNQbXVidVViNjhhU2ZPY2MxVzFLNlJvMnpTM0p6SnhWZVVSczUzQ3UyRnREamwxTTIyaE0wemY3UFNuUWVFRU16U3Q5NDFvV01FY01tN3ZWK2U2V0tMcGpIZXRaNGlTZkxFaUZCUFdSeFhqRFZKTkhzR3dOeDZDcmY3TW1tTjRuK0pIMm1WY3c2YkNaeXZVQnpoVnorWi9LdUYrTi94QVhTTGVjZ0JtajVBOWE5Si80SjdhZE5mL0RMVXZFbHdDRzF5OU1jSVBhT0xqajZzVy9LdE04azhOazFTdTlISzBWNnYvZ1hPWEF5alZ6R05GYTJ1L3UvNE5qNkVNd3o3L3pwdHk2eXhNQ3YzaGprZGFSdHJuR1ByU3FtNVNyVitNODdhc2ZvUEt0ejhjZitDcnY3STB2d0YrT2phcm9zVTBYaG54UnZ2TGRRU1VnbXlQTmlIb0FTQ0I2SEhhdm1idzM0cXV0SVRiNWttN3RrL2RyOXpQMnZ2Z1hiL0huNE82anBNdHZEUGZXWSsyMlc0Zk41aWNsQWUyOWNyOVNLL0hUNHllQUxEd3Y0cXVZWWwyS3h5QVIwUHBYOVplRm5GOE0zeXFPRHhLdlZwZTYzM1MyYjlWK1RQNVY4VGVDNnVXWm5MTThGUGxoVWQ3YTZON3BmUGIxT0QxcngvcUdwNGFYY3BVakIzWnpWenduOFNaN0xWSS90a2tseGJ2OEFLMGNuekxWRlBBMS9yOHJTV3R1ODBTaklJRmRaNFQrQlUwM2h5NHZ0UURXclcvS2lRVitsWXlqbHpwY2xlTVducGF5ZTUrWDRDV2RWTVNxbEdVdE5idlJPMzRIb25oalRQRCt2STBjY2NtbnlTcmtHeHVKYlJ5MzFpWlQrdGFYZ0w0RmVLOVo4Y1F3V1BqelhyV0JPUkRmMjl0ZlJoZnF5Q1UvakpXZit6MThGdFMxeTgvdEJWa2RvMk9NNThzMTc5YStDcjN3enIrbTNOd3dWOXdHMERqbnRYNW5tMlQ1WlRyU2pSZ2xLMjhmZGQvV05tZnQyUjR6RzE4UEd0aUU3WDY2M1YrdDduUDhBaUg5aWZ4VnJ1bVRYYmVDZmdoOFRCakJXODB1YlJyMSsvRXdNd1UvN1F3YTQzVHZEME9pNkZEcGRwbzU4Tnc2ZEdYZlMvd0MxWnRVV3ltYVQ1NDF1SmlYZFJzT09nSFFBVjl2WFBpTmZDSHdKMXJWR1hiSkRhc0kxUHlscEcrVVkvRWl2aHY3U3NkMU95N3pHa3JFRXQ4MGcyN1JrL1Y2L0IrSktWT25XNUtiZC9OMy9BQmV2NG4zV1pZaHFoQ25iNHYwLzRKZjhQZUo3alFkYSsxUXgvdllBeENFZEVZb3Y4ZzFkci93c2Z6ZmlKcG1zV2NNTTF4cGNVa09KQmhyaTJNU082S2VvY2IyMjl1Y1Y1NXB5dW5pZk85dDExQTF1L1AzTmtiTjErcmlvTmNXNHNybXhtVnBsZ2F6Z0ljQW5EK2JMdS84QUhWUWZsWHhPY1lPRlplL3UxK24vQUFBNGN6U2VIVFZKM1NkN2VWOVYvd0NUSFRmOEZZL2hacC83VFA3SXc4YytIZnNtcTIrazJpV3QvcDEwUmkvaXlDSm9uSkhrM1ZzUzN6WUc1WkNyNVhiajhhL2kxK3pmcUh3dDArUHhQcFV0NWRlSFJOSEQvYUFRMjkzcGR3d3lJTG1QTzZOK0R0WVpSeHlwNmdmckY0dXVaUEV1ZzZsbzhVc3EyTjhQTjFHejNrVzExRzdFWjJqN3BJajVJd1NEWDU4L0Z6UTQvZzU4ZTllOEtlSG9mSEhndlROV1lpMXRMTlQ0ZzBhL2dQVEZ2UGwyWGNHQlVtUWdnaXZuTVBpTVRoNGNrN1NVZWp2ckhxM2E3VFhsRjN2cjVmbzhwWWJFeFZXbnArajZMK21qeFBTZkUvOEF3a3l4M0dxYVpkZUlyK0RPKzkwMmMyZXNLRHdCSXlnck12YmVWMzg4dGdBQXJxTkgrSENhN3J0MHVsNmJvdmlHOHR5enZKNGExbit6YnJyaGcxcGNjb3dKK1pZd0ZYa1l3S0tpdGlzSXBXVFM4bkpLM2xibVZsOGw2RFZHdWxhTFRYby84bitaKy8zZ2o5b3I0ZHJGOWl0OUYxNlQ0ajNVYmI5Q3Y3V1J0UnQzSEJMdk1TdTBFajV3NVgwcnozd1A4TnJ6NFJYZXRhbHJLSXV2ZUliaDV5ak45b250WXprTVdrQUhMOU1LTUFmV3ZkdjJwdkczaG1MeHJvR2c2ejRkWFdieTZ0NXI2M3VVakt5YWVZeUFzaXlqbE9UaklPYThUOGI2MWVlSU5kazFCZ3pEZUdKREZpVi91NDcxNHZqUnhwREM0ZjhBc1hEU1h0Wi9GYlMwZTNySjZlbHo5TzhMT0Z2cm1KL3RLdXYzY1BodjFsL3dQekpZQ3l4NmhNWC9BSGN0c1JuSEFCZEt1M2ZoR1Q0aGZEWFdQRHNjMFVWeGRXenZZeU9xdDVFNFU0STNjYzlEN0dvNG8xazhPYWg1S3J0TU1hcmdZL2pRL3dCS2I0RzFlNDArZU1YREtDcFVyamozcitZc0JtVlhDMW80aWhMbGxGcHByZlRWTS9jc3l3Y2NaaEt0R1NWdHJQMFIrVlB4YzhKWGZoL3d0Y1E2aHBGbnBtc3BxOTBEY3BMaTZqMmd0dDI1MnFBVlk0NTZDdkIvR09rYXg0cDhVeHpYQzNOejl0ZFFvZGg1ajRIM3R4NDZaT2EvU1QvZ3A3OEU3Vy8rSW1sYTJ0aWt1bStMRUt1NlI3dkp2SXdPZzdNeVlPTyswMThvMlhodlJ2RGZqUnRGKzBQZmZZN1I3bU9YZDVjZ2tHU294OUIwN1YvVCtVNTA4MXdFTXowczFacGJwcjgvVS9sbk5zSzhEaXA0TnA2UFR6WFExL2h2OE45YTB2dzNEWjJheDZ2cDdKR1hXL2tQN29qSDhKOUF4SDFIRmVqK0lyWFV0WmpodGJxQ0tIVDdjWWlWV0JXUGdBNEhVWnEvK3picE11cTZSZjZyZHplWGI2Z3NMeEpLeExLY2ZOMStsZC9ySGg2eFZYM0ZmTjZBRDByK3QvQ0JaZEhBVThWN3JyWGR0ZHQwbWxwWnRhTzY2SDgvK0ltRnhlSnJPazdxbG8zb3JQeWJzN3BhUFN4ODY2N29oMGk5TWU0TXA2WTVxaVkvODRyMVQ0a2ZEanpMUmJxM1ZwR1hQeWl1Qy80UlhVRmg4NXJPYnloeVdLY0FWL1N1RXhjS2xOU2IxUDVqemJLYTJIeExoR0w1ZWx0ZERPdDdWcDIyaGR6TjB5SzFZZE50bTFKTko4dmRxTWxxYnRXM1pIeXR0S2p0Nm5ORVZ0SG9GdXR4TnUrMFJ4dGNHRW5HNUIwL1d1QThNZkVCby9IRnhmSGMwMXRieVFRZ25La09TUUNmWWsxK01lSkhpZERLcTFLamdxaWZKTG1xVzFhVVdrNHZ5ZXQva2ZxM2gvNGQvWE1QVXI1alR0elJ0Qy85NVg1bHB1dW56OGo2VS9Zci9ac24rUHY3U25oL3c5TkR1MDVaaGRYenFEdDhoQnViODhiZnhyOXh0S3NiZlF0TXQ3T3poU0MxdFkxaGlqVVlWRVVZQUE5QUJYd24vd0FFT3ZncmRhSjhHZFc4ZjZvcmVaNHB1akJwc2JyekJhUS9Ka0gvQUczREhqcUZXdnUrSVpXdjRvOGFmRkhFOFdabFFqeSt6aFNnbHkzdjcwdFpQOGw1V1A2TzRCNEZ3L0RtRXFVcVQ1blVsek4yNmZaWHlYNHM4SC80S0ovc3JRL3RUZkFXOHRiZUlmOEFDUTZLcjNtbU9COHp1RjVpejZPQmo2Z1YrS0dyYVZQcGVwWEZ2Y1J0SE5ieU5ISXBHTnJBNEkvT3Y2S242ZTlma3ovd1Y3L1poLzRWTDhiL0FQaEx0THRWZzBmeGR1bGNSTGhZN29EOTRQYmRuZDlTMWZ0WDBXZkVPY0sxVGhUR3l1cFhuU3YwZjJvZlA0bDVwOXo4djhlT0RWWHcwYyt3eTk2bmFNL09MMmwvMjY5UFIrUjhacEZnY0duQldGV283UEIvenpRYlBCeWEvdVNOckg4bXVNbnVSeHV3ZzJqb2V2MG9pYnl4N2VuclVrZHJ0UHpWTXNJRWZUMyt0UzdEakZzMnZBZmliK3dMNzUxWHkzT0NmN3RmVDM3T3Z4ZXNkS25WWVRHdTNxUWV2ZXZrY1RMR2U5ZGw4TWIrOCszYkxYNVVad0d6MXJ3TTZ5dW5pYVRiMFB0ZUV1Skt1RHJ4cEwzbGY1bjZiL0R6NDJRNjlGRkdyQm1CQVBOZXM2UjRzU1NKUUdINEd2Z3I0WGVLNVBEenc3cGZMUmVTU2U5ZTErQ1BqWkNabGprbis4ZUJtdnhIT09IK1dUZE5hSDlKWlRucXFRWFB1ZlRpZUlONi9lcU02cnRmYUR5eDRGZWYrSHZIY1YxYUszbktRdzY1cm9mQjJwcnJtc0hhMjVMVmQ3ZTNQRmZuWEV1TXBaUGwxZk1LL3dBTk9MZnEraStic3ZtZlk1YW5pOFJDaEIvRS93QU92NEhiWEV1MnpXUCtGVjUrdmVvTEQ1YXJYTnh1ZnZ6MnA5cE4wci9NN1BjOHI0ekh5eGRadHluSnliODNxZnVOSENxbFJWT095Skw2VTI4KzcrRi8wTlV6ZGxpZWF2YWhEOXF0V0NETW1DVjl5SzV1RFY0NWlmblhkM0hwWDkzK0VuRkR6M0lZU3FPOVdsN2t1N3N2ZGw4MStLWitWOFJZUDZyaW55N1MxWDZvdXZQdVkxRGNXVHM0S25OTVNRRTV6VHJXOCswUzdjY3J4aXYxU04xc2ZQNlBjc0xFMGE5NmkxV2ZaYk1Eenh6V3FuTVZaV3F4NGhrMituRlkwNVhscWF5cHRSMFBHUGliNEx0ZFZrdVhQRE9QeXI2bytBWGdIL2hYSHdYOE5hSWlNa2xyWnEwZzdoMytkdjFZMTRuRDRWazF2eExhVzVVTXR4T2luNlpHYStyb0lWaVJWSDhJNHJ6K0xzVE90UnBZUlMwdTVQOEFKZnFhNUZoNDA2MDhSYlhiOVgraERCWXR0K1pxSDA3SFJxdEZoU0UxOFdzSFNTdFkrazlwSzVtWHRnNmpkOTdHYzErWGY3Zi9BT3pWWitHUGo5cWUxV2lzZFRBdjdWY2NZYjd5ajZQdUgweFg2cnR6WHl2L0FNRlJ2aHhwYmZDQzI4YmFoZFI2ZkI0UW0zM003QW45eEtWVWpqbk8vWmozWTE5VndIbVN5Yk4xVzUrV25VVGpMc3VxZjM2UDFQbCtNY3BqbWVYT2s0ODBvdE5MdjNYM0h3TjRLK0dGOHlMRkhibU8xalBVQ3ZYL0FBVDhFRThWMlhrYW1QTHNNWWRuSVhQMUpyeTc0SS90ZStGL0Y5ejRmakdzV0Z4SDRnVmJXQ3hoa2orMVdkNTh6YkpFMzcvTDJqQllvQUdIVWc1cm12MnV2Mm9iZldUUHBlbjMzK2o2U1NUQ2lGZzhpbkJPZWhZZ2tESEk0QnhrMTlSeEQ0dllHRVpSd1V1ZXJwWks2MGYydWF6VnRIODlEdytIdkR1Y3Y0L3UwN2F2UjYveTIwLzRiVSs0dkEvd0dzL0EyangyZW53ckhiS2Qvd0F2ZXRkL2hIWjM5N0hOTHVZSXdkUVR3R3J4UC9nbjUrME5xbjdXM3cxK3gyUGl4dER2TkhpRWJReDJrTTF5eVpBMzVkbTRCSVhCWGppdlZ2Rkg3Rkd1ZUxMamRmOEF4cCtLbHVraDVUUzdteXNSK0cyM0pINTE1K0I0cnE0NmlzVENMdkxmVmI5ZXY2SHJZcmgrT0VxUEQ2V1cybWx1bjRGajlwMjJrdC9odnArblF4d05EOXArMlhLU05nUEZFaHhqMzh4MEk5MXI1ajhXL0RnMm1qeDZwWnV6eFhVQjh0Q2NqY0MwaC9MWlc1OFkvaHBvL3dBQlBpaGNhVTNpYngzNGtqanNZaTEzNGsxaDlRS1RsZzdSeGpBQ2d4K1V4QUF5UjNyanRVK0xseHFpM2tTcXgzSEZzeE8zWXAyb1RqNkZoWDVubTFiRjRuTkoxSWJSc211bHUzcmRzd3ppV0RvWWRVY1I4VFdqOCsvNUdicFNlWGZyRzJXWStWY2wrZWZNZjVoK1VkSnJ0NTlyMFdOWk9aSWJpNDhwUDdzYkNOVS9VUFRydldCTFo2ZVRISDVkakxKRTdyL3kwd3NhcG44WE5POFFhTXM5MUpHWmxqOHlSTGJlVDhzZmxoNUNULzMydGI1aEg0WlM3ZmxwK3A4Ymt0UmNzMVQ2djAzU2IvOEFTV2VlK09OUmlzTFN6dDVKSklvN2lWclc1Mi9LMDZ4aVBqUHA4NzE3TjhhZkRQd24wWDlqMng4U2VOSTRialRkSmVOMG12NEpMankwZmFQTExSZ3ZHcGR3RmNjeHNGUGMxNVQ4YnZodGRKcEVOeEliZVMzTFJYRVRXOHl5NzJZeUZ5TnZZZ3ArbGUxZkEvU2ZEZjdRL3dDeS93Q0lQQStzTlkza1Z6RE5iM2x2Y1J1QUlaSkpkaElIM2NiVWIyOWErT3hOUnh4Q25CM2p0L1g5Ym42ams4dVhDK3ptck8rcS9KbjVhZnRnL3NvZjhMdThaU2E5OE4vRUZuOFhOUHVTSkZuc2lyNjFhd2tEWkhkeDhOTXlIS2ViamNRQVc2Z0FyeER4RnAraC9zcmZHN1Y5QTF1eDhRV0Y1cGswa1F2ZEh2SjlKdjdadVFWVm0zQm95T04yMzUxSUlPRFJYclVhMDZjZVdOTnRkTEpKZmRyYjAwdHRZM2xUaE4zZS9XOS84aitoajRzL0VQVGZIdXNuVk5OdUd1clc2dDQxaGxCK1ZvaU40SytnT2E0elNyU2E1dTIzREMvVGpGTXQ3RHpaSkZFYnh3d25aQ0UrVUJGNkFENlYwbWphUDVVSzViYXdHY0h2WDhXOFdjUVZjMHpHdG1GYjRxa20vUmRFdlJIOWc1Vmw5REtNQkRCVWZzcGZOOVg4MlFqVFJaNkRlTXkvTHRSZi9IaFhPNnpJMXJ0TWJMdVhrNTlLN0RXVXpvZDBwNEpLaXZQOWMvY3ZOSjh6U01mbE83N3RlRGdxbk0zSm5xWlplcEp0OS8wUkQ4WC9BQUovd3ZMNEZhaG84YzBjZXFXWU4vcHM0Rzd5N2lOV0kyKzVHNWYrQlYrUXRuZFhXci9GQzRsODV2OEFSMmFJU3VUbDltUTJmZk5mcjM4TE5mazAvVldhWDVvNUp6SW94d0JtdnpzL2J6K0NEZkIvOXF2eERFcUxhNlBxVXI2cnBzblFLc3dMN0IvdW5jdi9BT3F2MmJ3eHpDYWppTXY1bmY0b3JwcmEvd0NTL0UvSHZGbkkvWTE2ZU1pdE5uK2h6dmhMOW9lNDhNV1A5bXNvYnliZ0taakx0S01Sd0F1Y2MvMHIzcjlsTHh1UGpQNHQxYTMxSzRaWlpHamh0MEsvTTJBY2tmZ1AxRmZDaWFuRGUzc2Mwc1hIMnJrNStZQUQ1alh2ZjdFM2plMitHbmp2V1BHRjFKSE5ZNmZHaVcwTy9ERnBEZ3Jub0RnSHI2Vi9RUENXWVY4dnpPaGlJU3RHR3IxMDZwL2czYnNmaVdhWVduaXNOT2pOWDV0UDYrNCsvTk4rQUs2SGQrZkhHTHFOaHlrbklOTzhiZUZMWFRmQzEwOG1teHdlWEU3SmxBRkpBTlpmN1FQN2IyaGZBbjRFTnJWcmVXOTFybXZJemFWYWtnbUxJd0diL1pVak5mRy83Sy83UXVyL0FCZmw4WmVDL0VIaVdlSzQrSUVublcxeXgrYUc4NDJrSCtFTVBsSTlDUFN2MlhPdkZ5R0hycW5Uanp4Uzk2U2UxMXBhMmp0dSszcmM4N0kvQ0hFNDdBVmNYU1hMeTZ4VnZpdHYrRjdlWjV2NDM4ZXp5VzgybzNWNUl6M1R6UnFVYkcxUWZ1ajh6VGZoZlpMOFZmRmVsZUdkRlUyR29hcGZXOXJacUVHKzRNcEFMTjdqcldQZm0xbTBUeFZvZDlIZExkYU5xTXNFS01tMlFPT0dERHJrNC9PdnFML2dpQjhCbStMWDdjV21hMWQyYkxhZURiVjlTVGQ5MEZrYUpGK3U1c2o2R3Y1MXFWWFVxVkt0V1RzM0p0WHZkYi9PNTZPSHc2dkdtbDJQMjArRDN3NnN2aEg4TDlCOE42Ykg1ZG5vMW5IYXhESHpFS29HVDducjljMTFVTW55aW96SG5wVFpFeGpIVHY3VitRNHF0T3BYbFhsdTNmN3o2cFIwc2k1bmQrRmVLL3Q4L0FOZjJpUDJjOWIwaU5WL3RLeFQ3ZFlOakpFc2ZPMGY3d3l2L0FxOWlobC9oL1duWENDV05sT0NyREJCN2l2ZTRieit2bFdaVU16d3J0T2xKU1h5ZjY3SG01bGx0TEc0V3BnNjZ2Q2FjWDZOV1A1OHA3R1cydUpJNUJzWkcybFQycUx5OWdZZmx6WHYzL0JSRDRGSjhFLzJtOWV0YldGbzlNMVNRYWxhREhBV1RsbFgyVjl3K21LOEpObHVOZjYvWkJuRkROY3VvNWpoMzdsV01aTDVxLzRiSCtjK2ZaWFd5dkgxc3ZxcjNxY25IMXM5SDgxcVUxaVoxYmR5UU9LYjViS052YXIzMk1odi9yMEN6SUh6RDhxOXJROEZ3a3lrdHJ1cm92QWV0LzhBQ04zelNNZXYzUjZtc3FkUExWZHZyMHFhMWk4eUVldUt6clFWU0hLOW1hWU9zNkZkU3AvRkhVOU1QeGRhNFdOZHZsbFJqSzk2M3ZDM3hLa2kxR05XbDNOd1J6WGpwWXhxdnpjcjM5VFdob3VvTTdGbWt3eWNCeFhpVnNvcE9HaVB0TUh4WmlGVlNrN3Mrb3JMNDMzbW1XNmhiaFFGQU9DM1d2c0Q5bGhiaTgrRTFycTE0dTI1MWxqTUNmOEFubU9GL3dBZnhyODFmaG5ZWGZqL0FNWmFUb3NNalN6YWhjcGJyK0o1L1N2MWkwWFJZZkRlaDJsaEF1eUN6aFdHTlIyQUFIOUsvaGI2WUdkVThyeXJDNUZRK091M09YK0NHaVQ4bkozL0FPM1Qrc1BBK1ZUTTZsYk1hbCtTRm9ML0FCUFYvY3JmZVdKWk1mOEFBYWRiUzdwUFhtbzVkdmw1cHRvQWhyL052RzFuZU1UK2xPVk9Kc1c3OEwyd2MxNFA4WS9GRTN3ditLRWtMTWZzbDRndVlTZW1HUEkvQTUvU3Zjclo5cHhtdkVmMitmRDhsMThMSTllaFZqTm9jdUpDbzU4bVRBSi9CZ3AvRTEvU24wYStLNmVCNG5wNWRpSCs2eFg3dCtVL3NQNy9BSGYrM2o4NzQrd1VwNVhQRVUvaXBlOThsOFg0YS9JMC9EM3hYdGIyekVublJ0NmdObkZkSHBmeEhzWjMvd0JkSHU2WUJyNEYwRHgzZExDeVc5NDZxVHU0YXVxOFBmRTNWTlBUekhsWm1CT0dKeG12OUdjVndlbGUwajhCd25HQ2tsZEgzR2ZIVnFNeCtaLzllbVhHc3gzRUc5U09sZkhkciswTGZRWGtiU3liZ3ZvZXRkdHAzN1VWczZSeHRsZXpFbnBYalZlRTY5TFdLdWV4UjRvdzlUU1VySDA5OEhaaHJmeExzb1Yyc3NHNlZ6bnBoVGo5YStnczR5YStYLzJFZkZNWGo3eGJybDdISUpGc1lFUUVkaTV6L1ExOVFBakZmbVhFbE4wOGZLbExlS1MvQy82bjNXUzFJMU1LcXNkVTIvenQrZ3JEZFM0NHB1K2pkbXZDUFdIVngveDgrRlZqOGN2Z240cThIYW5ERGNXWGlYU3JqVDNTV05aRkJraktxMjFnUVNyRU1NanFCWFhHVEZJeDNyU2F2b0IvTjRQZ0g0bS9acjhZNjFybmlqdzNlYUhQNGRrZE5PV1RSdFB0dnRGd1M4UWxqRUFEQ05EODNKQTVVSDByZy9Idng0MUxYSnRMdDlXdkpyNjh0STFTNnVaZm02QWNBRG9GR1JqNllyNm8vd0NDOStpYTE4T3YyMHJwWnRRbWswdldyU0hVOU9obFA3dE1uRHFxNHh4SXJaejYrOWZuN3JFYzl6ckcrYytaOW9rSmJBLzFtY25JL3dBNHI0WEdZS25UeE0rUmFkTDcyKzVlcDlMZ1lwWWVNZm0vVi81TFErNXYrQ2RYN1dkajhKL0ZWMXJ5MjhjbjJWL0pqRE41WW0zQUxoemc0UWc0NmRRdGZwWjRqMDM5b0R4emJpYlMvRkh3cDhLV015QjBtVFM3dlZKdGh3Y2htbWlUT08rMGoycjhLUGgvNHlsdFBFRVdtMnNpNmZac3UwTThYelNISEdmb2U5ZlNkajhNZmdmOFQvaGhiZUpmamg4ZVBHbW4rWXpXOXY0UlM2bGxrUGw0VUNHTDUyS25qa0tGQk9PTVY2ZkQrWVZjTlVuaDRLNmw3eXZMbFM3Ni9kb2VWbm1GVGhHdXVtai9BRS9yelBYZmlYcUdzYWo4VmRZZzhRZUtwdkdXcVdPcFNSWEdwdEJIYnhPWTBLRHk0NC9sVWZkSGNuQXlUVXVpQnBMU05YWXJjWEdZZ2U2Z0Izei9BQ3JoL2dmNGZzTkQrSGR2YjZmYlRRNllMTXlXWWx6NWl4ZWVxb1c5eWk1STk2NzlJMjhtYVpWVU93VjR3QjBYOTJuL0FNVlgwN1VZNjJTYjFmejEzNm44ODV0akttSnhkU1VwTnBOcExzazdhRmkwa1l4elc3T3hqOHVONHg2dnVkMi9SRnFUWE5hWkk3aTBZcjUxMGlYbTRuTzB5TVZQNlI0L0NwYktOWHY0SkVBTWNOeE5CajFKV05CK3JHcTNpalNvL3NObmN4dCsvalUyY3BCR013c1g1L0NjQ3VMSDFlWktLL3ErdjVvNzhpdzc1WnpiMy9OYVA3MU16dFUxSms4S3l3cXpQSmF2UGJKR1c0QzdJMEIrZ0tOK1ZkcCt4UnFzWGg3NHJSNk5kM0VObmI2bnA0TWwxYzV3R0d3cUY1NStabUhQWW11SHRvZnRNYlhJWEp1b0lpRnh4dXk3T2Z4OHdmbFZQd0pvMzlzZkVKZEpTNmUyWFM1bHZZYmdMdWVOV3dTbzljREF4N0N2anMyU3NuZlQ5VDlINFhiZlBRZ3RkR3Z2MVh6N256ci9BTUhGL2dlODhKZnRLNkxmM1VHaXJwOXpvOEtXdHhJV0Y5TXd3SkZYNXNTUXhzQVZHUGs4OWhuRzBBcjFiL2d0VDhLdGUvYUYvWSswblZvYkc0MWZYUEJYaU5nWFdJK2NiT2N5UnBnWXpnNGlPRDBBSHBSWHNZT1ZPclJqT3BQWDE3YUgwRWFiZXNFL3VYK1I5N1dsZ0J0VTdmbEdCeDFxOUZiWk9PUFRwVWRsQndyTms5K3ZTclNPRmJLOU01NjgxL0FPTmwwUi9WZFNvN21iNGtnOHJUM1U5V1lWNTM0Z3Q4U2JzZCtjZDY5QzhXek5KcDJmdTduNzF3ZXJXc2x6SnRFakRIM1IycFlYU1B6L0FFUjd1U3lhVjJaTWQwc2QvRURHeWNnNUtIYm5QSFBUUHRYelQvd1dwK0g3ZU52Zzc0WDhaV3l2OXEwbTRHbTNMUm5vakhjakVlM3pWOUw2bkpjMjBYek5HMjBqcWxlZmZ0TitDTHI0d2ZzMytNZERqMnZkR3pOM2JKai9BSmF3a1NEOHdwSDRtdnR1Rk0yK281cFNxcDlVbjZQUi9tYy9HV1NyTWNxcXh0cWsydlZhL29mazNxRm0ycEpIRFoyNGtrdVFsdjUyTXR1L2lQNGl2WVBodFpSMzNnNjU4TzNUdkRvR2t5UjMrb1hVY1B6bGdRRlJXNCtaeVNBTTlpZXhyeHU1MVNUUTRKQ3FtWlVZaEhqUHpJM1FmenIxSy84QUZ5ajRGYVhiNmJMNWNtOXA3eU9VRlhlVGNWQko2TjkwNDlGUHZYOVJWSjFhYVRXbDNhL3IzUDVyNGF5V09aWTZPSGxwRmF2NWRQbWNCKzBaOFRiNzRnZU0yWm5meW9WV0dDTmh0RU1hOEtvSFlZeHhYUGVHdkVPcGVFL0VkbmYyY2trTWtMcXdZSERLUWV4NmlwWmcwQnZKN3JhMTE1YlNBbGQzTlFhVHFZMWpTMjgxdnV2OHJyK2xlcFRpdlpjdHJycjh6OWxyVktlRXJRb1E5MTJUVVZ0YVBUNW4wVjhScmFIeHY0YUhqclQ5bjlvNnR0VFYwUE9McU5PWnYrMmliZjhBZ1N2NjErajMvQnVCOE5UWmZzK2VJL0ZsekdUYzZqcUpzb25kY0V4eGpkeDdaZkg0VitTL2hueHJlWGZnbTRzTk5hUTNNK2JhU0ZsenZPTXFSenprNUdjVi9RZC93VEIrRWtmd1ovWXY4RDZTdHZIYjNEYWZIYzNZWGpkTzZoblAvZlJOZko1ckY0ZkFWT2JkdFJYei93Q0JjL0t1S01CUnA1ek92aG8ycHpYTWwyYjNYeWR6NkVEZk5Sdnl0TjcwQTErZGNpUExzTzNLUHJVcU52eUtnSnFhSGordFhUcHBQUW1TUGlQL0FJTE0vQ1grMmZoOW9IaXFHTmZOMHU1YTBuY0x6NWNtTUEvUmwvV3Z6Z1dEOTNnOWUvNFYrMS83Wlh3OC93Q0ZvL3MzZUxkSmppV2E2a3NIa3RsSzd2M3lmT24vQUk4b3I4VWRFMTFmR0RhbUZqa2ovc2k3RnF3MmJTV3g4MlBiZG12Nzcramo0Z1VLdVVVdUhhOS9hd2xKUmZUbHM1Sy9vN3I1by9sSHhzNEtyUEd6ejJpMXk4c2VaZFcwMUcvM2EvSmxPUjVFa2JrNEI5S2I1OGgvaXJhbnN2TmlLOGMrMVozMlBhZnVzQjlLL3ErRWswZnkvaXFWV25MU1QxS3pzMHYzdm05S2NqT0k5dlJTUFNySXM4LzNoNlk3MUw5aUhwVmN5Mk9XTWFsK2E1VFdJNDRQQnE5WVE3NDhObkNuSUFxV3kwNE96QnVObzlhdjJ0Z3NKNHpudDdWalVtbXJIbzRIQnp1cDlENkovd0NDWjN3NlBpejQvZjJwT21iZncvYlBjTHhuYzdqYW41WlkvaFg2SXp2eFh5Ny9BTUV2L0FBMFA0WDZwcnJLVmsxZTU4cENldXlQai8wSW12cDl6dUIrbUsveDErbFh4VzgzNDl4VVlQM01PbzBsL3dCdUs4di9BQ2R5UDlKZkJuSS83TjRWd3lsOFZWT28vd0R0L1ZmK1M4cUs3VDdqdEk0cFZiQjQ0cHNuRlJ4U2Z2TUd2NVJsTG1sYy9YT2hwV2NwSGZtcVBqM3dwYitQZkNHcGFMZEtHdDlVdDN0bkovaDNEQVA0SEJxeEMrR1dyaU5sZng2VjczRHVZMWNIaTZlSm91MHFjbEpQczA3cjhVZWJpOFBHckNWT2F1cEpwK2owUHlSdkpicndGNHJ2dFB1RlpaN09aNFpFL3VsV0trZnBXcEw4VGpjMnZsSGN1M212UXY4QWdvUDhPdjhBaENmMmk5UXVvMTIydXZ4SnFFV0J4dUkyU0QvdnRXUC9BQUlWNFc4VzN0LzlldjhBZHJoSE5zTHhEa21FenFsdFdwd242TnBYWHlkMC9OSCtkV2Z3eFdUWm5pTXR2cFRuSmZLK2orYXMvbWJWejR4TTBmM20zWndNR20ydml5U0dCbDNOODU1NXJqL0Vuam5RL0JNRm0ycjZyWjZhZFN1RnRiVlpTZDA4clo0QUFPQU83SEFHUms4ak93cVpmSHZnOGRDT3RlOVJxNE9yV25ocWNrNTA3Y3l2cXI2cTY2WFI0OWFXWVVxRlBGMUl0UXEzNVhheWxiUjJmV3grbUgvQkc3U1pKUGc1NGsxbVQvbC8xQllGSjlJMDUvOEFRcSt5QndLK2J2OEFnbFhvWDlpL3NmYVBKczJ0ZjNNOXcyUjFPOHIvQU95aXZvOFNjVi9JdkYxZjIyZFlxZjhBZmt2bEY4cS9JL3J2ZytuN1BKTUtudTZjVy9XU1QvVWNUaWdHbWs1L3JRaXJFTVY4NmZTRHFBMkthVytsQWVnVjlUOHVQK0RuRDRGLzJuOEhmQXZ4SnQxeE5vV29Ob3QyUjk1bzV4NWtmNEJvM0dmOXNWK05PajNGNExpMTh4bS8wZVFpSDVlUUNjL2pYOUlmL0JZajRMdDhkUDhBZ25GOFV0TGdqODY5MHZTVzEyMUdNbmZaa1hCQUhxVWpjRDNOZnpvK0VKSkliZUdabzFrYU1CUnZYY09RYzU5NithenFLaExuN24wR1V5NW9jdll0YWhlVFI2ckRNQTBra2M0RE8yQnRCSUJ5QngxcjBEeHA0VzhNL0VuUnJXN204UzZybzRzb0RjazZaYitkTE5NU3NYMmNnT21GYjVXWnVjQkNjSGtqelc2bFZwdkxaeU1uT2UyUnpXUDRuOFF6WFhpN3dsb1Z1clEvYk5TVHpCRjhwa0Nqajg5dy9LdkV3MVBucndlOXQrMXZNN015akdPR3FjMjFqOUpmaDdwUDJUd1hwTm96dEk4a2NjVHMzWEFqa2Z0K0ZkTGF6aDdLTmgxa2k4aE05UVZNakgvMEVWaTZIQi9ZN1NXNFptVzFrRWFIcnVDb2tlZngzVjBHa3hyWTMwak9xdkhheU9xYngvRVl3UDhBMmV2cXNSakxTdDZIODBVc0RmVytyMTFJL0QwY2cxRXhzdjdxT09DVlQvZWZkTTUvSDVGcU8rbGt6Y2Fld1BHYndIMU1yYlQvQU9pUlhVUldDTGU2WElxcXFxMHlTQWNmY2hVLysxTWZqV0xyc0twNG9qbUN0L3BrRU1FZnNVODEySC9qNi9uWFBVeHFjbDdSZTd0L1g0bm9ZWEJ6NVdxVXRWcS9uWmZkb2ptN3lHYUN5aGhqRzAyclR3SFBRa1J3QWYxbytIcnI0ZjFLMXV0U3RWdWs4c0xLQVNyQWhZOEVNT1FkeHorRmJjMXV3dXBHVlJMYW9JN3JrZmZNalBrZW5SVnJNOFJhWGNXRnhJdHVuN3Z6bWtiUDNSRzdFcUFmb29ydzgyeTFjdDRPNjFQcnVHODZkR2I1MGs5dlcvOEFYM250MmthNXB2eFpuMUx3M3JFelhtbmF4YjJ0MUNaRkRUSXNVVVRiV1lja2htNzk4MFY1Qit5cDQ2dC9EUGkyTzQxS1pmS0gydEF4akRHUDU4Q1AyR0Z6K0ZGZk1SeFZhais3aHNmcDBhYmZ2ZDlUNmpzZFN6aFc1NDZlbFhJTHp5ZjRmbSt0Wk5wSGxnL3QwclFKMmpPTzFmeDVpSXBzL3BDdFRpcEZIeE5xS1NXdnpENWxKSS9MRmNjMXo1dDV0Sy9URmRKNG54RkF2VDV1Y0d1YnRyWW02TWc2ZnpxWXg1VlpIdDViVGpHbGRFR3JXU241c2RRY2NWbDI2SkJxVVhtS1d0NUNVa0hZcTN5blB0Z210dlUzK1RiV0pxYm1PQThZQzgxVWFqcHlVMTBQWncvdng1SmRUOHMvMmdmMmNMRDRRL0ZIeGxwZHRjM3phYmFUc3c4eFZqa2psYzVBUWc4cHRKSVBYcFhDeHJKTHBrVmsxd3l3cm5hOHJscFd6enl4Njg4MTlVZjhGVFBMMG40aFdjMXZDby90eXdpdVpKQi9HNkR5em42YlIrZGZJdjhBd2w5bHNQbXplWE5HTWJTT3VLL3J6aDNHMWNkbHRMRXkxYlN2NnBXYisvUS9MOGx5ZkQ1VFVxS1Z1ZVVwYXZvcjZKZklxK0ovQzgwQjNlY3NxcU5oWUhKd2FwMmVnVFJRcXdqVllZeGhRb3hXeGJheEJxMXMwYStZcXMrU3pkOGYvcnE5RHFsdmF3dGJ5TnVaVndBQjByNmFOYWNZOHN0ejFLMkZvVmFycnQrN1k2UDlrbndzUEd2N1FQaDNTUTN5Nmhmd3h5REhCQVlFL29EWDlNUHcyMGhkQzhFYVZhS29qRU5zZ3dCakh5MS9QLzhBOEVrUGg0M2o3OXRUUUpGaVZvZE9EVHVUMFZqaEYvVnY1MS9RZGJ5aTNoVmMvZEdCOUJYeXZGVXIwb1FYVjMrNVdQeVhqSEhLV05oaDF0Q1A1dS82RjR0aGZ1azU0bzlxcnBkRVIvenBxM1c5dnJYeFBzR3JIeWZ0b2xvQWcwZWJzYjV2NTFUZTZPNC9XcElya0VjK25ORXFiUlVhMFpNZHFzaXo2YktoWGVzaWxDUHFLL0hIVnYyZTVORStPWGpqd3pIWlMyOGVtNnZjU2VjQmhaRWtrTHhBSHVSR3k1OStLL1pCR1FENWZ5cjQ1L2E1MHFId2o4WWJxOGtWVlRVa1Y4N2Z2RURIOHNWKzVlQU9NeEZEaUp3cFRjVzR0MjcyM1h6NitSOEg0aVlIRFluTEhERVJ2Ry8zZWZ5UGpPUDlublVIMVJvL01YeVZIVThackYxcjRMWEdpWHJMdmpZQThIZDFyNkExN3hUcDlyQWRzeXBJM1VWNXA0bzhTVzk5Y1RLSk4zSEJGZjN4bCthWTZyTDN0RjZIOHVadHczbEZDRmx2ZSsvNEhsT3JlSHByRzU4dVZWWEhRam5OVXZzbTJUYVJ1NUE2VjAyb3h0ZGtrdndweHpVZW1hSUwyNjJ0dEN5RUlyRnRvVnNFZ2svaGo4YStpeEdaVWNKaDNpY1ZKUmpIZDlGZDJQZ29aTFBGNHRZZkNSYmxKNkxmWlgvUXhWdFBLZFN2YzRQMHE1RmFlYzZxQVNUd0swTlYwcGJHNldOU3pZVUUraE5hZnc4OE5IeEw0NzBmVHh1LzBxOGppK1h0dU9NbXNjWm1sR2pnWjVnMzdrWU9kL0pKeXY4QWNqZkI1VFVuam80QzFwU21vVzgyMHZ6UDBjL1paOExqd1o4QnZEVm50Q3UxbWs3Z2Yzbkc0L3pyME9SdjNWVTlKMDFkTDArMWdqMnJIREVxQURzQU1WWW5JSjYxL2dqeGpuRlRNTXdyNDZyOFZXY3B2MWszSi9tZjZpNEhCMDhMUXA0YWw4TUlxSzlFckw4aU9VN1Zxc2x4KzgraHA4N2s5K0s1dTQxR1MwdXBOclozWFVjV0QyREZBZjUxOGRTaTVTc2VwUm84Nk91aGw0QnEwbHpnZjRWbFFPeVJpcmRvMi84QUd1akN6NVpuTFVwcnFmTkgvQlQvQU9IMzlwZUVOQjhSUWdNMm16Tlp5NC91UzRaU2ZveTQvR3ZoNjVLMjhUVFRUeFc4RWFtU1NTYmlPTkF1NW1ZK2lnRTErbjM3V2ZnNXZHZjdQUGlTMWpRU1RRMjR1WWxQOTZNaHY2R3Z4Yi9iNitMUThCL0RDUHc3YXUwZXBlSXNyTVFlVXRWSjNmOEFmVEFMOUF3ci9WWDZPSGlSVHd2aG5WbmlHbkxDVkpRakh2eisvQmVuTktYeVRQNUU4VHVBS21hOGIwTVBRVFVjUkZTbSszSnBKK3ZLa2w1dGZQNWYvYWMrTmx4OGJmaWJjWDZ5T3VsV0oreTZaRmpiNWNRSk84aisrN1pZbjNBNkFWOXhmczkrT2srTEh3YThQNjQwaXRjWEZ1TGU3NStZVHgvdTVOM3VTb2I2TUQzcjgybmJQNWordGZYbi9CTkh4ZUZzOVk4TTNWd3FTU3V1b1djTG5sOC9KSUY5OEJUajBXdTN3djRxclV1SitmRnp2OVp2R1RmV1Q5NVA3MVplcDl2NHNjSTBLM0MzczhMQzMxWGxjVjJpbHl0ZitBNitiUi9RNyt3RnBIOWkvc2plRFlzRUdTME1wei90T3gvclhzUjZWNXIreUxwemFOK3pONEh0ejk1ZEl0M09mVmtESCtkZWpialh6T01yKzJ4TlN0L05LVCs5dG5zWUdqN0hEVTZLK3pHSys1SkVtYUtidm84eXVPNTZBNG5GSm5KNHBoYkpvMzFabGV6S2ZpalFZZkZQaGpVdE11bFY3ZlVyV1cxbFVqSUtPaFVqOGpYOHVQeE84REw4SWZHM2lQd3pkQ1JadkR1czNPbkZBZVI1Y3JKa2NkZUsvcWEza2Y0MS9Qei9BTUZjdmd0L3dyejl2cjRnVzhhS2cxaStqMW1IMldkRmMvbTI3OGE4SFBvL3VGTjlHZTVra3IxWEZkajQ3OFQ2UzF4Q3FXeXlidHhLbHVjTGtkY2Qvd0RDdWM4Snh5NjMrMkI0SzB1TWxHdFpvMExaenRaZ1RuOVJYcll1WTlOczkwNng1enN3VkJJQjR6WGsvd0FDZFJ0L0UzN2MxaE5GSkxKRC9hRzdlRndRcTRYSUgwelhoWlRVbEtVbTFzdC9VN3VJSTh1R2FYVS9VUzVrRUZ5djNqSDlsTXVmY3pML0FFVTEwVm5jeDZocFhrNEt6VFl1RG5xTXlSRCtTbXVZc0kxMUUyY2JCdDEweXc5Y0ZSaVZ1ZnlCcnA0dExGbmN4a2JsVjRGdGszZnhFTks1L3dEUVJXc2NVcFQxUHhLZURuR1BNdGpjdTdyN1g0ZmtrWEJiN1ZJRnovY2RvRS85bFA2MVN2ZFdpaXZiZVg1ZHRqcUZ6R3VSL3dCTXJkQitwUDYwbGxleGlTNnQyMmhZTEcybUF6MFl5ek1UK1NDdWZtbnplVFJzMmR2bFhaLzdhek9QMThyOUtNZFV2VFg5ZVg2bW1TMDNHdEtQZGZrMC93QkRwZE0wZnp5aXN2a3h4cElqRnhnSHk0NGlCK2JtcXQ5UEhmNkQ1Y2NZYTh1STRuNUlYSVNOUWNIL0FJSFZXMjhaeXh5WFZuSjhyeWFoUHNPM29qc0Yvd0RhVlFtOVZKVmszRGJHYm0zWDZoa1FmK2cxcFRsS2RKY3h6NGlNYWRaOHU5M2UvcWVlZU0vRDExcG11M0VsaE5OWnpLWVdaV1VGWDh5SXlFNDUvdlVWdmVMRDl0MWl5eC95MWhBYytoamlpai9tRFJYTDlScHkxYVBhcDhRNHFFRkZPOWt1aDljYWNmTWhIcUt2N1dWTnRabW1UWkdPcHExZlhMUlFmTDljMS9DOWJ1ZjNOV2czT3hnK0tibHBMamFUOHE4YzFuQ2RJbDNaOTZsOFRYZTl6OTRONzk2eW1kV3QyRzV0eTR6U3B2bVI5Qmg2WDdwSWt1YnVPYU1uekZJSXp3YXp0VGpWN2ZoczdnRHgycHIzQ3dzcWhSdHFEVW1ZUW5jY1pIR0tjbkI2STlTbFI1V3JIeUovd1ZaOEJ3Mm53azhINi9hOGVWcUU5aklldWZNWHpGLzlBYXZnMjk4SXc2a1BOZEZKWGtZNzErbi9BTzNWNGVYeE4reVRxbTQ3anBXbzIxMENSblpsaWhQL0FJOSt0Zm50YldFTXlNdTZiZjA0eGpIcm12NlY4TDhkYkpJMDE5aVRYMzJsK2JaODdtR1d4cTRtVTZtcVJ5ZGlaYkJFZ1dGVkdlSHB6Qlk3dG1rYjVtQjV4M3JZdTdSSDFTT0hsanVIK2MxTmVmRDFyNittOG1aZHNZM2JXSFN2MG4yOEwzbG9mUFY4RFZjSDdGY3p2YTNZKzdQK0NCdmhWYnI0NzMyb0JjcTBTaFdaU2NDTUZtQVAvQTFQNEN2MlVhK3l3K2xmbVIvd1FSK0hTNkQ0WDFuVjVQTDg1ZzZnS09nWmtYci9BTnNqK2RmcEIvYUc1aDYxOC9ua1ZVcVJYWkwvQUQveVA1cjRxeDgzbk5lTCt5K1g3a2wrZHpianZNSmpkd1JUVXZGSjYvcldTdDd1ZnJTcGMvTlhnU29wUzBQRldOYlJybStHYzlENjFORGNveFB6ZnJXU1pjcXZJeUtkREtxdVdIVTF5Vm9TVTFGTFE3YUdKWEk1U1p0L2FObyt0ZktmL0JUalNWdC9EV2o2NXZhTnJXY1FrcU1rNytuNml2cGNYaktwelhodi9CUWZTMjFiOW5MVkxsRlo1dFBlTzRDcXU1bXc2NXdQcG12b3VGYzB4V1Q1cFN6RENmSEc5cksrNmF0YnI2SEptVWFHT3dzOExXK0dTOU9xNm41NytKOVphZTdsZHBsOHVFQlhKT01aSXJuN1h4Zll2NGZ1Tld1cnUxMCsxczVYU2VXNW1FY1VRVjlvSlkrdkg1MVR2ZGQxejRtM0dxK0hkSjAyR0RXWkx0SUlHeVZoU0xuekpwR1BLb3ZWajZWNDcrMXhKb0dwYVZwdmd2UldUV05OMGwyKzBhaXpsWHZibzUzT29IRzNKSUh0anVUWDlhWTd4MnBVYXRPR0FoSzBZT0xqTkpQbjBWNSs5c3JYc3JPN3Q2ZmxtUitETmJNWTFhbU5rdmVtbnpSYjBqdnl3dXQrbXQxb2U4YXBkUitIL0ZXazZUUGMyOHcxbTJrdkliaUIxbWhrakFCREk2a2hoMUhCNmcxeFh4cytJVGFUNE50cjZ4aHkwZDdIR2lrYmZOQWtVa2tlb1VkcWQreC80YnRmaXA4SjQvaHhxRWsxcnIyajc3bnd2ZTNFL3dBMER5WjNXeGJyNVVnUC9BV0lQclhFL0VYUmJ2UnROL3N6VzlPbWcxTFN0UzhtVkpNbG9XMzdXSkgwOUsvTjgwOFRNNTRrOXZncTgxR25xM0ZKMitGZXI1ZExyZlc2UHV2K0lhNWZ3NU9saUtNSEoydEdUMWRydjVjMnRtOUxvOTc4VUt0L3FpM01jZmx4elJJeWdkT1JuL0d2UnYyTHZCLy9BQWsvN1FtaHJ0TExhdTF3M0hUWUNSK3VQenJoWWJHZTUwV3pScGxramh0bGRSdS9od09nOUsrZ2YrQ2IrZ2lmNHM2bGViVGkxMDhyeU83T01mOEFvSnI5dzhSZUlWZ2ZDckZWWXlYTXFFYVdqdlp6VVliNmEybGUzUS9GT0Vja2RmeERwYzBYeSsxblUxVnI4dk5LNjh1WldQc3E1T3c3ZmJtcWp2bHFsMU9VTEl4cW9zdlhHYS94bnpTb25XY1VmM1hUaGVOeHpOMStsY3JxTW02NGwyamNWdllmdzVTdWtNaFVuZDBybWRTSVc0dUNyZjhBTGVOdi9RYTU4SEI4N3Y1Zm1qMHNKSGYrdXFPb1c0d2U5V0xXNXhKMXJQTDRDNTlQenF4YlhRZGVtM3RXRkdOM2M1YWxQUTBKdkoxUzFtdEp4dWh1WTJpY2VvWVlOZnpoL3Q0M2QxclB4aThUVFhpdEZKcGQrMm13eEgvbGxIRVNtUHhJSitwTmYwWUxkYkNDdlZUM0ZmaFgvd0FGaHZodXZndjlxWDRpeHJGNWNjMTdGZnhZWEFZVHhSeWtqNkZ5UHdyK2cvQ0xQSzlOMWN0Yy9jbTR5dDB2RzhVL2twUDd6aGxsdEdVNVloeFhPb3RKOWJOcHRlanNuOGo0dThMZUg1UEUyckxiUnEyRmJMbjBBelhxbnd1MWMvQ2o0NitDNzFtbGpXUFVFU1hZTnpHSno1WkdQb3hxZjRDZkQ3eWRBYTdsWC9TTG83eGtmZFRzUDYvalNmWVA3Vy9hcThMNll1V1pkVHNvZ01aNWFSV1A4eCtWZnZHSHpLVHh2TFJsYmwxdXQwMTFYelBOeHVXeFdBbEtzcjgralhrLytBZjFVZkJtd1hTUGhMNGF0bCs3QnBsdWc0eG45MnZhdWwzVmwrRFlQc3ZoTFM0KzhkcEVwL0JCV2xubXZ1S2QxQlg3SS9NNWFTZGh4ZWdQeFRPTTB0VVV0ZFJ6TlNialNab3JRekYzR3Z5WC93Q0MrM3dobnV2Mmd2RFhpSzFoVi90MmlBVERnWit6ekhKNVBKMnlLTWUxZnJPVHhYd1Qvd0FGNlBCcVhmd1I4RytJTmtmbVdPc05wN09WeVZFMExTTCtzQi9Pdkh6Nm01WUdkdWxuOXoveVBVeVdmTGk0K2QxK0IrUDN4MDhOV3VnZUgvdGthend4bUh6M0xydDI0Qkp3ZndyNTQvWTFsR25mdEoyTjg3R1lySEk3TjFJSkJPYSttUDJ6ZFl0My9abTFTNGtsVmJxSkk3ZUpkbTFtTE9BZjBKcjVoL1lQRDZsOGJGajJxV2EzZEZ6Mk94ei9BQ0JyNWpKSEw2bFVxUDBQWTRnU2RSVXU2UDA1aDhjMmZoKytqbnViaG1qc1pkd0lBRGY2bGgwLzRGVjNRL2oxcHV1M2RncmVkRkRETTdibTUzWWlrNmY5OUNyUHdSL1kyMUx4aWtPdmVJZHQ5RGZ6QTJpRmlJVlhNUzdqa0RKNVlZNmNacjZmdC8yWFBEdWlSelJUWFdqV3FMS0kwaUVpS0ZHMk5NSGFwNTVQNTE0azhWeXl2RStkams5QndjSmF2eTZIZ2ZocnhWcC9pQnJkWWJxR1M0dm9oR296ak95T1ZnUFluZmlzL1hwV3M3cWFSVmRIa3Q3T0hCSElLUGNNUit2NjE2NzhjZjJQTExUOURYVWZEdHZaL2F0UG5ua2lsdHp6SzNseEFBa2VwSjYrcHJ4clZOYnVpOXJhNjFieWFmcUZ2SElHam1HMXBQTGlUa0U5ZVhZL2lLMWpqSFVqWitYNW84K3Brc2NQVTU2ZmFYL3BMSnJxUnJqeFJmekwwVzJ0cGxBSDhUeVhESDlDSzBibUdTemhoams2eDNIbnZuMGtrbVA5QlZDeFprYTJrejg5MWFSNTkvTGpWdjhBMnBWdldkVWZXcks5bGorOTVkcW9IMGp5ZjFhdmNwVGZzbzI3SHhtWVVsOVpuM3V6bFBHVi9JL2haYmlQL1hOZDNVUzRISVg3VklCK2tkRlRYOW5pUzlqTExzdGZKZGMvM3BkOGgvOEFRNktjYXJDTk5KSDE1cFh6WUlma2RhaDFiVW10NDIrWUVmV3FzbW9lUmJBS2NkenhYTzZ4cmNpTTIxdDNYQTk2L2dtVTNMM1VmNkZVTUk2aytaN0JxbXQvYTVDallWc2J2d3F2a3ZEa2JmcURXVEpKNTAzbU54SXlEUDA1N1ZKcDkrcWJvK2VCeFczTHlKSTkyblRTamFKUEtaQ3ZVWXhWRFd0UlpMZjVtN2ZsVjZRS0FHOWljWnJCOFF3aG9DN0E3VnpuQjYxdFJqZlUyNWxjNVQ0NWFUSjRzL1p6OGZXRnV1NjRPa1NUeExuZ3lKaGwvVVYrYUZyZDNDVzI2VmZtSEJ4eFg2b2VFMHQ5YzhOYXpidnQyM2xsUEZ0STV6dFB2WDVnK0w3SmRNZnkxazJpTjJqWXFlVGcxKzllRnMvM0ZiRHZvNHY3N3I5RWVGbW1LOWsydjV2ME9Sdk5kajAveExDc29ZdEtwMmtIdnhYUlFhaEk5L00yNlRESm5Dam5OZVkzRWlONDJ0OHU4a2ZtS1YzSDd2ekQvQ3ZYdE0wSVBmTXNicTJRQ3JBOWpYN0Jpb1JwcU4rcVBsc25xVHJ5cVN2WlJsODlqOWZQK0NQSGhxYncvd0RzM2k0bVZsYTZkRkdmWmNubjZrVjliZmJkblBOZUIvc0Q2YXZocjltRHczRXUzZk5BSjN3ZU56QUd2WmpxTzVlZjUxNStPcHFkUjI5UHVSL0d1YzQ2VlRNYTg1ZFpTL00zSXI0SHZUMXYrV3JHdGI4R051L09La0Y2TThDdktyMFdySEhTcjNOdE5Rd3VQMXFlM3ZXY1pybmZ0dUY3L2hWeTF2Q0YvTHJYRlVvL3ZEdXAxMnFlcHRDN3pYQy90TlJ6WDN3SzhTTGJydW1XMFpsSDZaSDUxMHkzK0pQNTFUOFdmOFRid3hxTnF5cTNuVzhpQWRjNVU0cm93L3VWb1M3TmZtQ3IzaTBmbC9IOFByejRFL0JXOFRWdVBHWGpCUmNYeWtmTlpXN0x1VzFKN1p5QzRIZmpvSytjNy80U1NYbW92ZHlJbjJwbkRLVUh5cno2VjlOZkdDNnZQRS9pKysvdENSbmZ6eXVXNXlNbXVac1BCOGJYT2ZtQ2ZlTGtmS1FQU3ZvdWFGNU5LN2U3UDNEQTRWVXFGT0VOSXBhZlByOHpDK0gzZ3E0OE1uVGRSdFVraXZMY3ArOUhjOGNnMTc3KzBmOEFCbTIvYVErRnRuNDMwblQ3ZVBYdE5sZ2o4UUlnL2VGUWNKZFkvaXhoVmJ0Z2c5alhOV0dnUjNkcllSek5KSEhIRkhJTURqb092NDE2UDhBL0VzbncwK0pqdzNrWXVORTFxRTJ0NURKeXNrVERhd3g5Q2E0Y1BXOWxpVlZqODEzUjJadGdWak1DOFBMZmVMN1BwL2tlT2p3ODJpM2EzajNtMkdTRDdPeEw0aEM5aitZNkN2clQvZ25ob0VOcHB2aUxVNFdhWkpIanQxY29Vemdic1lQKzlYeXg4ZnZoWnFYZ2I0N2Y4SVQvQUtSWStGN3AxbnNkVFpHa1dXMllncVNmVmM3VGowTmZadjdFR21IVGZnM2RTN3BtKzBhaEtOMHE3V1lKdFRrZjhCcjFQRnZ4SGxYNFZlUzBxU29SazR6Y1VwWHFOWHZPN1ZuRldpdEhlL2ZwK084RjhKeG9aM1V6Q3ZOMUtrWXVLdTFhQ2JYdTJYZTdlcThqMW5VSnd6c2YwcW5OY3JEQ3pjOFU2N2JlMmFyWFlFdHVlcDlhL2hldDcxVnprdEQ5MHAwMVpKa1ZqcVAycEpHeldKZXpabXV2K3VnL2t0YWlSL1pvdUs1M1UzTHlYWHpzdTJaU2RwNjlPSzZzR291ckp4Mi80S1BUdzlOT1RzZGREY1pWYzFQSFA2MW5RU1pDMWFpVEhQclhtVVpIRktLV2hiaWZ2NzErWjMvQmJiNGIyZXBmSFBRZFNtaFZvOVUwTklwUi9ESTBNMG5YMzJzbytnRmZwVkcydzE4VGY4RnAvQXAxWHdmNEg4UUxJOGYyQzl1TEZ3TVlrRWtlOEEvVHl6K2Rmb3ZBT01kTE1vTzlycHI4UDgwVmhZL3Y0cnZvZm4zNFEwV0dPMG1YQzdjY0tPTm85UDhBNjllVS9zK2ovaE0vMitQQ2FRc1NManhSYnJHZXVBc294K2dyMlc1QzZGNEcxUytYL2wzdG1jSDZEUDhBTVY0Ly93QUUwck50ZC80S0IvQytQRzVwdkVFVG5QdHViK2xmMDV3eW5PVlNxKzFqemVMSktGS05OZDJ6K3JMU1Y4clNyWlA3c1NMajZBVll6ZzFIQWRrU2owQW9ZMStySldpajhXZTVKdnBUTG1vdTFLR3hRSWVUbWxCcG5tVUI2MEFleHlhK1R2OEFndFI0SVh4ci93QUUvdkZKM2VYSm85M1o2Z2o0enNLektoL05aR0dmZXZxNHljVjRwL3dVWjhQdjRxL1lVK0sxbkVva20vNFJ5Nm5qVWpPWGlYelYvVkJYUGlvYzlHVU82ZjVHK0ZseTFvUzgwZnpVL3RvK010VVQ0YWFmb2w0ay9sVFhubXBNU2RzaW9oR09uUEpIT2UxY0Ird2hNMXY4WTFNWWJ6ZG9DNEhxQ3Y4QTdOWFFmdHdhOWRTYXQ0ZjB1NFl1dHJhR2RXejk3ZTU1eC93R3NiOWdtMzh6NDgyWndTR2tBUHQ4ckgrWUZmTDRHS2pscjB0ZTdQYnppcGJFYzNZL1NUU1AycHZpRlkrRzdUVFlOTHMydDlQdE14dkpPZDJQT1E3c2UrSzZNL3RZNjlxTnFZenA4aHVHWkpIMnk1Mi9PbnIvQUx0Y1BISTM5bktWNGFTQklSbnFjczdmK3kxcWFLdjJxV1dIeWxrWnJORTNIK0U3M09mL0FCMFY4ckpMYzh1R05pNVduSDdqMGF6L0FHdVBFK2xzMDBtblhDd1IzN1M0WEJXUkdhTHFEL3VuakZkMThZdml2b3Y3UzN3cXZyelNiRzIwN3hGWXZNWUpWUVBIT3BOdXJnanFwd3FqOHpYanVsK0U3ZWV5dUZaN3FPNVMxaGxKTFpVRXl5ZFBwdHFUOW1hM2gwNzRrWFdqM0VyQ0c5dG11eEprNTVtMjR4bkhPd2Mxenpwcmw1MHRqME1MaUl1dHlMcXZVWHduck1rdW0ydm1rczlqSmNXSmRoOTlsaXQweitPSzNkRDFiK3pSNUxScTI2MllsajJLUnhEK2VheS9GV2xMNE04VlRhRCsreGIzanp4UEtSdmtpZGl1NDR3TTdveVB3cU82dS9tYVJmOEFscE5QQ0NQVGVCLzdMWHI0S3NwVUZGbncrZTRKMDh3bkphYXUzejFNL3dBZVhrcWJsai8xMm9yYnVNRG9FdG9oL3dDelVWSmNTL2IvQUJGcDdOdGFPMWl1SXlNZDFaSS8vWmYwb3JYMmpqc2VmQ0tVVmMraEwvV0pFczJHNG5ieG5vYTVtKzhRS05wOHphcW5rOXFkNGcxbFhqKzh1MWgxQjcxeW1xYXFKb1pGK1hhbzZMWDhKNFdYTkpXM1A5SElRVVk3RzZ2aURkdmZjV2pLSnRJUFhpb2RJOFJxSm1MOGJ1Z1BXc1BWVVdKNHBCOHFpTmRxNTZmS01jVlI4UDNUMzEraFpsNVlic3JYcVpoRndzUEN4VGl6MHhMbGJpeno1bjUxbmEvS3NOdnQ3NC9PcnZodUNONEhqa081ZmVuZUtOUGpsdDEyL043Q3VmRHlrcFhaRW10ams5STFQN0ZyMGNha0t0MUhJaFhIRFpVaXZ6TCtKMTA5bjR4MWFIYVI1ZDNNZzV6MGMxK2oydTNiYVg0cDAzYmxWYVFBNUhhdnoxK01BK3ovQUJZMTYzTFJ4bjdiTnkwWFFsaWY2MSs0ZUZkUi9XYXlmOHEvQnY4QXpQSHphbnpSaTBqd2pUcHkzaTdjeXRKNWJnc0FQOCt0ZTQ2WnJzVjlvWGxxRlc2a0FXQmxCVmt5T241a2ZsWGtzVm9GOFF1MGNzZnpFZ25ZUURYc25nWHdacFBpbnhCNGNhR1haZXphamFRK1NwKytXbFVFZ1k2QVYrNll6bHFWS2Fma2ZtOUg2eGc4SmlhMGZzcVQvQm43ZGZzNVdiZUcvZ3Q0ZHMyVmthM3NJVklQcUVHYTd5Ty9EZjFyalBCOG45bmVHck9EUCtwaVdQOEFJQ3RkTlFIbXFEaXVXY1UyNVA4QXJVL2pIRlZuS3RLWG16Zk9wckd1RmIzOXpVR2srSmZ0L21mdTdpRm9aSGlZVFJOR3hLbkJ3RDFHUndlaHJOKzBBbG0zTXVld1BIYWxiVld1Wmcwa3J5TmpibGprNDdWNU5hTW5KVzJPcW5LRVlOUytMOERmajFKWlIvZE5YYlc4eXYzcy9qWE5SMzRDam1yVnZmZkovaFdkU243NVZLcytYVTZDVzkrYjczNCtsWm1rVytyYVhjM2k2aHFHbTZoRExLeldiV3l1cnJDZWdsRGNCeGs4TGtjZGFpaXY5dys5OTZuRzR6d09EbXVXcFNrbnpKSG9ZYkdSVUhUYVd2NGVoOFRmRlh3UkZmZU1OVzR5WHVwZDN0OHhySWgwMjN0TFBhd1pRcEJaaXZIcDByM0R4eDRVODN4bnJRV05QbXVtSTQ2NUFyaTdydzNDKzZNS0dqWWpuYjE1cnVyWFZSMlA2SXlXU3E1YlFtLzVZL2tVTkhzVnN0THRmTWFQREpHa2FuSFVLQVAxRmFyZUcwdllGazNGWnJmRERQYy9sVDlkMENHMXNyV1R5NWJtWjFBVkZIK3FCeDA5K3RiZWphWVkxamtpVXFqS0F5U3R5T2E1NVZIZFdQV1ZKU1dwcWVQdEdUNHRmQVMza3VJbHVyencyengzQy94TmFzRG5Icmc3Znd6WHJmN0s5Z3VtZnM4K0gxWHpHV2VJekJwRHVZaGprRW51Y1lyemJ3OXE4ZmhMVDlZYVp0bHJkV3N5dVVPM0h5TVJ6Mk9jVjdCOElyTCt4L2hENGR0dThXbndodmM3QnpYd3ZpWm4yTHI1VlJ3RmRxVk9semNqdDd5VXRaUnZ2eTNTYVY5Mi9JK2ZvNURoOExqcXVPb3EwcXFqemViamZXM2V4dFMvTS9IWDZWQ3hJVDhhU1NURHMzZjBxcExxR0cyc3BXdjU1ZFBtV201OUJUcHQ3QzNjdkZjdFBJV2UrWFAvQUMxVWM5dUZyb0xtZk1iZTljcmN6YlpOUTZmNjVmNUxYUmw5TnJtK1g1bzlYQzA5R2RsYVNaUWZkOWF1TGM0V3NtMmsyaitkWElaTXJ4M3J4MURVNGF0UFc1YVdkbWt3T21PdGZPWC9BQVZYOFBOcjM3S0VreWpKMDdWTGVjbis2cERvZi9RcStoaEt5anR1cnpIOXVEU0Y4UmZzbCtOTGZhR2FLeUUvMDJPclovSVY5VnczVTluajZiWFJvaWo3dFdEODErWitPM3h6MVA4QTRSMzRGYXp1NGFhTklWSTZFc2VuNVZ4Ly9CSGl6L3RML2dvejhOTnFsakZxUG1ZSGZDc1A2MGZ0bDZwL1puZ094MC9kemRUcEtmY0tIeitwRmJQL0FBUXpzaGUvOEZLUEFPZVJISkxKOUR0cit4T0ZxZkxnK2IrWi93Q1NQbWVMcTMrME9IOHEvd0NDZjFBcDhxMGI2YVcyaWszY1YrbGREOGxIczJSU0tjMHdQelR1OVNCSVRpbXMrRjQ1UHBUZDFHNnRBdUc0c25LN2ZXc1g0amVINGZGZnc5MXpTN2hkOE9vV0UxdTQvdkJrSS9yVzBUaW15SUpVS3NOeXNNRUh2VXkxVmlvdXp1ZnlEL3RsWDAxejhhdFFzSDJNZEZXUFR4czZEWU9tZnFUV2gvd1Q4NCtPMXFyWUh6TWZwaUtRL3dCSzUzOXNhMGJ3eisxQjhTTEp1RnRmRXVvUkFaKzZGdUhBL1N0UDlnNjh4OFpJMjNkSXBtLzhsNXE4R3RROWxoSlVsMFZqMDhkVVZSdWIzWitrK20rR2Z0R2wyTXl6THVNNFh5ODlsam5iL0NvL0RPb1NXTnhDZHU3elpmS2IzQVdZMUI0YTFsclMxamozRW1OOGpKenlZR3ovQU9oVWFiKzVtczJZN2Rra3JFOU9mS09QL1FxK0hTazA3bmhWYWtWSmN1NTB1aitKcExxOHVQTTJxN1cwS0tDZXUwVHQvWDlLeXZoMjdhajhhSW9OMGtMTnBNY2cyL3hFU3pGbFA1aHYrQWlvRWcyMyttZjlOUE4zZSt5SFAvczFaN1h0eDRJK0lPamE5YnhTWEdJZkpaRWI1dHZseUhqMzVGVFVqeXhkdXg2T1YxWXp4TVZJOVkvYXVzTGZSYjJ6dnJOdk5tdGJLemxXUkR6THZtdWlRZnJubjhLNUZibG50clpNc3JSekdWditCU1NuL0Nxdmk3eCszeElHbXpLUjlsYlRMWlF1UG0zbzBvd2ZjRW1wcitUeVlyeFN1R1dHMlplZlZXYi9BTm1yVERTc3RUa3o2cEdkYjBYNW1iWjNlendwSmNtUW1RM3QwTWorNjEzTVIraWlpazF1Tkk5R3ViYU5kaXh2Ry8wTG1SLzEzZnJSWGNwOTBmT3lpcm5wM2lhL2UwUmNjUlp3Qm5tc1J2UHY1VkVNaXd3cTVNaTdQbWxIb005dmVzTHhMNGl1cjdVL3NxUWJvbnlQTUxEQVAwL3JXejRBMEEyV2tpNGtkcG50MUtJemtrcHgwNXIrS3NzeS9sU2xMYy8wVXhGWlFnV3ZGZXBMRXBqYmR1VWhkdzlBTWMxbStCOWJqdTlSVVJ5R1JzNXdEeDlLYjQrdm8vN012UG0ycnVPR3g2VngvZ2ZWdjdGMStGY2JGdVRtUDFZRHJYcDVoaGxPRGR0VUxBeXZUUHBId3ZKOXFWdDQydDZEMW84UlMvMmZHV1ppRHQ0R2F4L0JtcTdMbmFadk16OHhPS2Y4U0wxVjAvZHV5ZTJQU3ZKdzluSzVsVWI1ckhEK0l0YWlrOFMyTFhqZnVWazVJKzhwd1FNZmppdmd2OXBTZVBUL0FJNWVKbDJxMjY3ZGwrWHBrZjhBMTYrc1BHdmlLU2J4aHA2eHV5cUpRVzR6bkZmSnY3VHYra2ZIUFh1TjNtM0E0SGJLci9TdjNEdzFvcUdKbEpiT0wvT0o1K01xZTdaOWp5V3loUTZrRzc1SndhOU8vWnl1MjFEOXFmNGI2WEhHdTZUVkZ1WDUrOHFkQit2NlZ3TUdsRTZwTkdza1RaeVJ1Nm4vQUQ2VjNuN0FjTW5pUC9nb2I0V3Q1Y0ZkSlZ1QWVGTzB0bjI1cjkwdzlwMVZKL1pUZjRINWZ4amlaWVRJcXpoL3k4MC9YOUQ5dnJEVVBKdEkxQk9jQ3JjVi93RHZWeWE1aUxVTnJMejBHS3RXdC9rL2Vyam1rL2RaL0ZibEsvTWpwLzdTd0R6MXFBYXZ0bUh2eG5OWmEzd1l0MTRxQTNtNmNjOTg0cmh4R2h0U2JlcDBvMVFmTHoxcTFEcW55bjVxNXVXNnlxODlSVTBkN21QL0FPdldNby92R2FLVm9uVXdhbHRBNXEzSHFJMmRlYTQvU3Jwb3BaQzJjRTVIUGF0ZTF2dC8rRmJLbmRFcWJqS3h5dmpYVFZtOFM2cElyWVlxa20wZC9seC9TdWJtOE1lVkUwNCtZZ1lVRWZKbjE5YTYzV2xXZnhKY0xuYnVnakpiSFVaWVZOcFBoVFZmRU5ydHQ5TXZycjVTUTBjVE1wQVBIdHpYUFdWcHUvYjlFZjB2d25XakxKTVBKdTJuWFRadEhCelFQWVdrRXl6SXZsd1I3Z3crVWZLTWsvaFZydzVORnFueThPKzR1SHhqZDBOZWdUZnM0ZUp0YzhOd3dybzhubUtpYnQ3cXU3QUhCSlBUaXVYOFJmRGU2OEQ2eE12MldhMFpZZHN5RURkR3gvbjYvU3ZKclNjWGRvK3JvWWlqVmZKVG1tL0pvaThhMmRySjhQZFVTUWJXbWpBajNEcXpFS0IrSklyMi9UTFJkTTBHMHQxd0ZoaFJRUG9LK1ZmMmh2SEVPbWVPdmh2NFJndUZGNTRqMTJNelJidVRid2d5bmowM0tncjZxdjMyUnFvNCtVQVYrWCtJOG1xZEdQZE4vall6cldsVXN1aFZFck51TlFTalBPM25wbW5oc0xUSkpNREZma2NZdEs2T2lNV21abW96U1JEajlhNDIrMUNRemFoa3I4MXdneUQ3SlhaYXNTVlBHYTRYVllDSjd6R1R1dW95UjZmY3IxTUJGTk52K3RVZTVnMHJhbmJSSk5lV1JWWmZMa2JvMk00L0NyK2tSVDJsdnRubVdkczhNcWJlUHBrMVcwNVNpZmhWd1M0U3ZHcTNkNHJiMFBQcmErNzBKWko4WTVIRmNwOGVvVjFYNEVlTXJYNzNuYU5kREgwalkvMHJvSjVNaXN2eG5iTnFQZzdWN1pWM3RjV004VzNHYzdvMkdQMXIwY3JoeTFvUzgwWSt5V2gvUHgrMi9yalQrSmRIdGM3ZkpzMmRseDB6STRINkxYclAvQkEyeSsyZjhGSFBDcmQ0WTNPZlRKQXI1NS9hdzhTblgvak5xeTdHald6Q1c0Umh0S2JSeU1mN3hOZlNQL0J2Z3UvL0FJS0Y2S3gvaGhPUHhkYS90bklhUHM4RFRnMTBUKy9VL1BlSkt5cVltdktMNnY4QURRL3BaWTgwMVd6U1NQem1rUTk2KzU2SDV1U1VacHJOelFIeDcwaFhIVVl4VFdlZ01hY2RoZFIyYzBGdmxwcGVtazRGTnNvL2tqLzRLcDZIL3dBSWovd1VGK01tbmJXWGI0cHZaUUN1TUNTUXlEOUdybWYyR0ppZmpER3ZIelJTS00rOE1vcjJUL2d1eDRIdTlILzRLamZHU1NDMG1lME9wdzNMU1JvV1NNU1c4Ukc0OUJrNTYxNHgrd280UHgzMCtQOEE1NmJnVC8yemNWNTJZV1ZDb2wyWjBWZWJsNW4yUDBuOFBXZm4zdDRBU2ZLZm5ucCs3UWYrelZla2tXMWx2QWNiWVdZQUVad1NrWS9yV1RvZDFKYVhtbzk5OXpnYys4SS9yVnJ4Q3JLK29jOFNUam4wNWdGZm50TzdaNFZlb3IzUm96SzBMV2Jybjl5MXl1ZlQ5ekNQL1pxdjZ4cHB0VjBsbUgzQmM1NDZFVzhmWC92dXMvVVNMYlJKcFBtSmp2SlV6N0g3TXRTYTVxa3M4TzV2dXdYRjFHdWUzN2kySDlhMHJSZko5NHN2eEY4VEQxWDVsWHdsYXcydWo2U3NhS3ZtUVNFcWVBQ2lSblA1dm44YTZGNGwxT3czU1NNSkpvWWo4cEg4TWE4ZnJXZDhPVXRiclZ0QUZ4dGUzdFo3bU9RTndDQXRvY2Z6clkxcUtPMThhWGNkcS9tV1RSeXl4S1h5VVhaSGdIM0hOWjBsZS84QVhVNnN6aXVaVC93L2tpblBCYnlYZXBLekw4d3M4WjdBV3luL0FObW9yTjhTeU5iWEZxb1lxMTVEQy84QTN6YlFVVjB4aDF1ZWJHYXNjM1orTDIxUHhaZFEzRWhqa2ltYllpajdvemdaOThWN0o0VnV2TzBWOTIzNWs2ajEvd0FhOFMxdlJJdEg4WVRUN280bXZIQ21VRERaN1Y2ajRadWhwV2pUUnJJMG01UmdubnJnVi9LRUZUYWo3UFpwZjhFLzBBeHQyaTE0djA2TzkwYnkzWGFrZ3lTUGZtdVB1MlN4dHJWWTRBcGpPRWZQT085Ym5qL1g0YmJTZHNrcnFWalU3UjM0cmpJYjU3Ky90NDFQeVJqalA1MFl5RHRaaXdMOTA5aThLelRYRnREY1FKdldNQU1xOVNLdCtQTlNXNTA4WitYSTZIdFdYNERXYVhSMkVVcGpia0UrMVYvR2QzNU5weTJkdkhUcjJyd2NQVHZQbE5weXZLNTVMNDZLeGEzWnpOdVJZN2hTU0QwSGV2bGY5cUM2bWI0eWF5eWZkYVZTcmV1RVh2WDA1NHZuM3pmTXF0SHZBT2U5Zk12eHAwU2JWdmlKcUZ3cll0MGZETTU0VGdEZ2V0ZnRYaHpKUnhVbExwRi9uRTh6TW91VUxSNm5CMk1VbHVYa2FFY1pacER5UXVPZnBYZS84RWpMV2J4UCsyWmNhMHNZa2p0UzVaZ2VVM3JJQmdmaFhFZVB2RjhmaEx3QmZXb21NaXJISUl4dEdTekRHYzllY2l2VnYrQ0UybzJscjhmOVkrMzJyWEZvOXFYY0o5NWRoWHAvMzMrbGZ1dVhSbFVoVW5IVFN5dnNmaWZpdG1FS0dWUnc4cnRSVXBQbDFmUkt5MDFldGo5WUlkUkpYT2Z3elZxMTFQR09lZlkxenYyc1NUU2VXckxFV0pVTWNrRDYxWXRyb29QcWV4cno1UWFscWZ5WDdUVFE2cjdlUWZ2ZFJ5YzFYT283WnM1NzR6bXMxN3Y5My9qVlg3YnVrVUsyN1BHTTF5WXFWbW1kR0YxUjFQOEFhV0ZHV3p4MXFhMnZ0eTh0ajhhNXBiNXg4cmZlQUhGVFcxNnl5QWJ2dlZ5eWsrZTVzNDJWanFiZTh3ZVc2VmR0TlJ3bjN1aHJuYktacFQ4dVQ2Z1ZvVzNtSGdSeU5uMFUxMTBaSE5LUFZIbi9BTzFKKzJYYi9zWitCdFU4YVhIaDZMeEkxaFpwNUZzODVpU09WcFFpdkpnRXNnM2NnRFBwWHo1SC93QUY4ZkZueE8xMjNqOFBTK0g5TDBqUzlJaHZMOHg2Zk5jUi9hd3g4MjNCWTdtUnhnS0VVTUdZRGQzcm9mOEFnckg0RXZ2R1g3UFBpUzB0WVdhNGswWm1oaWZDZWE4ZHpBK0J1d0N4VUhBNm5zSy9QWDlqSDluN3h0ZTZ4SE0ybVg2YUZieURVcHJZdEdxbTRnWDkwV1ZqNnQwT1A1Vjd1SHdVSlUzSnJYdnAyV3grbjVIaXBUd05LbkdXc1U5TDdlODkxMFAwQm4vNExNYWZjYVovYW5pVHhONHkwQ0s1ODZEUzQ3aTJ1cllSRnQ3S1A5R0NGdHBFQjNZWnRyYlRqazE5VS9DZlhOVThWZUJMYTgxV3cxQzBWbGthSTMxeTF6UGNSRnR5dTdTTVh6dFlERG5JQXhYNVRmdFY2aHJYeEMwM3d6WTZoNGJrdTlEOElYUW52clhUUVduazN4b2tmbGxRZDI3Q2dsU1NHVTV3Uml2MHYvWnY4UitJL0ZIN05ta2F4cXAxSzQwKytoYWJULzdRY3RmV3NJUkZNTW1CakdVWWc4SEJHUlhqNTVoMUdrclh2ZmE5L3dDdjYyUHVPRzYzczhjdGQxYjlmelBBL0dQakNQeDUvd0FGWnZBZWgyN2JvZkNlbnN6cURuYkxJUXgvOGR4WDZEYWpjYmoxeml2eWovWVpPdGVQUCtDbmZpVHhUZmFicU50YjNGN045bWVlMmVOZkxHNExqY09tMEN2MUwxTyttdTVCSVl3T3gyTHRGZmkvaVZoWXVwVHB1VnBSakZjdG5yZTdidnNyTzIrdXVtelByc0RpSFhyYzlOYzBKT1Q1cnF5YXNrcmJ1K3VxMFZ0ZDBQbGwyUit2RlY1TGpGQzdtR1RuOGUxUVhPNG4rSS9RZGEvSkttSGNWc2ZRVTRwc2cxSzV3cHgxcmlwN25kY1huUDhBeS9STGtEcm55NjZ2VW1ZcWZsWUg2VnhrN0h6N3JjclkvdEdBRC95SFcrRmkwbWV2aFlybFo2RFpUL0pnSC82OVdqS0N0WnRnZG8vbWMxWVNabmZINDF3K3p1emduQkpsaGszaGNkYXZXbG1IWlF3OWlhcDJ6WmZwV2xCekY4d2J0MDcxMVlXUHZvNGEwdExIOHdQeDZ2NXRSK09YakNTYmFKUDdWdUFRb3h5SkdGZlVuL0JCVHhRbmhMOXZEU0xxUzJ2YndiVlJZcldFeXlFN2dlZy8zY2ZVajFyNXAvYXBzdjdFL2FiK0lscmpiOW04UTNzZUIyeFBJSytpUCtDSFZqZGFwKzJIQkRaK2ExMUxDaVJlWEtZemt5QWRSeCtZSXIrMzhHLzluaEpkby9rajhzeGo5MmE5ZnpQNllmRFBpdXk4YWVITExWZFBtUzRzZFFoU2VDVkRrT2pESXErcjhkYTVyNFo2NHV1ZUU3Wmx0L3NxeEtJd2lxRlJjZGx4eGdkT2c1cm9VWUExOVphU1M1ajRLbldoV2p6MDNkYS9nN0VyTm1sUjgxSDVncG9majVlZnBScXpST3hZZHNWSExjZVRHek4wVUU4Q2d0OHRSbVQ1cWR0QjlTbDRSOFVSK0xmRDFycU1VYnhSM2theW9raXNraXF3Qkc1V0FLbjJJcC9panhBdmhmdzdlNmpLdm1SMk1MVE11NVYzQlJrOHNRQjlTUUtzUXZoUG4ySzNmSFN1VitOTnphM253czhRMmJYVnNyWE9uelJLcnpoZHhLRVk2MUkvdEg0Zi93REJhcjRiUTYxKzEvOEFGcldyUzZXTGZjYU9aM2l5Uk1odEQ4bTlUM2JranZ0SHBYNTBmc0l5QmYyaWRIejBNaWc1Njg1SDlhL1YzL2dxTm8xenEveFgrSTloSEhmYXBjYWcrbDZscDBzRmo1bHE4ZHJiWEVheENWY3J1WU9RRlA4QWRHZXRmbG4reUQ0RTF6dzkrMEZvc3R4b3VyUXgrZW1YbHNwSTFYRWkrb3hYaXl2YXM1ZmFkMTl5UFF4K0lWU2hDbkhlRVdtdlZ2OEFyN3o5RTdjTkRjWFRNdkxTbCtuL0FFMGdyVDhRM0FtRTVDL2ZtRGYrUHdDcmZpM1hkWThlYXcycWFuQS8ybDdKSW1NZHY1YWtJOENMd0JqTzFSbXFNbWozVncrUHM4MzNQTVB5SC9uckY3ZTFmTGV6aHorNjdwYlBiOEQ0bjJsZmxUcXg1WlBkTFd6N1hzci9BSEl1WDhYMmp3M2RFOTlSWWo2R1MzSDlLYnE2SytqM25yL2FWei9LMUg5S2Y5aHVGMFpsYUdRYnJrUy9kUGVkZi9pYW96WEx0YlhDTncwbDdMSno3eVJyL3dDeTBxa2ZjSGc1T05lTDgwV05PZU8xMFU5UTY2cGRvUDhBdmkzSDlEV2hwcy9sM3NtNzczbHp4NDljRkIvU3NDQU5jczhheUx4cXM3Z1AzeStQL1pLMEk1bVp5MlRscnVkQmcvOEFUVEg5S3hvUS9VNzh5bjc2Zmt2eVJiMUVMcWZpdlJ3MzNZN0p1QjdKRXY4QVNpbzRyamRldzNiREpRWE1HZlRiTUZINkxSVjhydFk1Vk9TVmtYL0V2dzVHcENUekk5eFgvWlAxeldSNE9hKzArTzhzV2ptWXhPcXhTRUZ0NFBQWDJwbW4vdEg2UGRlSDVQTThaYWEwa2VWQU9vSUdJN2Z4VndtcS90U2FMb210N1Q0d2pkV3lTSXJzeURoVC9kSnIrVXNwd0dJNW5TY1p1MzkzL2duK2dHS3hVSFRiYmo5NTIzeEF0cnk2VzNXUzNtWmNBNTJISngxbzBHeG52cFk1NDdDK0Nuai9BRkRqMjlLOG0xTDl0Q0hVZFh2ck5QRlVNbHRDTW96VFBVbmczOW92UWZFZWt4SFVQRmNFTnljN281WnlwUHZnMTdlTHlldHljMVNuUHBzdS9rYytGeDFOUjVWT1AzbjFQNFowN1Z2N0hNVU9sWC95OS9zN25QMDRybi9IT2crSWdGRGFMcVcxbDVMV3pxUDVWNU1QaktJcmZ5TkswdlhOZWFRWkVrTVFTM0gxa2NnZmtEVUVQaHJ4cjhSWTJhNC9zancvYWdFNGkzWFU0SDFJQ2cvblhsWVhLWVU1YzlaY3EvdlNWL3VzMytBU3hNbS9jMTlJdjg3Mi9FYjhWTk8xVFRZbGU0Tm5Zd29SdWE2dTRiZFZ6L3RPeWpOZVllSmZnLzhBRXU5dUxqVWZETmhwTi9CSnVsVVBESFBITkd3Mjh5eHlISzU2TmpBejM2VnQ2cjhFTlA4QUQydHlYYzR1dGF2a3l4bXZHRXJEMTJyOTFmd0ZlVjY1OGJwdmhacUVsdmNlQnJhOG1jSDdEZHFubXZLdThnRjh5QUFBY1kyOXEvWE9DcWVIVTI4Sjcwa3RiOHV1dlJOWDZibnluRVdJcXhwTDZ3K1ZPOXVYbXZ0MTVXdjFYY2krTy83S1BqcytGYm5TOVF1dkJFZXNUQkx4N1dMVGhaelJKR2dad0d4eHd5bmJ0eVJqSFVaNlAvZ2tmYldmd3orSld0WFVtb0xydDFMYXZIOWwwU3pudUpRdVVKSnlpcUFEdEhYdUsrWS8ycS9qZGZmR1RVTk52dFEwbTAwKyt0L01qSWhVeGw0OFI3UzZnbkI0YnZYMDUvd1JHczJ0dkczaXJWSkFxeHgyWGtwempCTG9lbmZwWDdkaEtVNDRiOTQ5V3RiV3Q2YUpIODJjV1k5MTZGZVRUdEhSSjMyVDgyMzU3bjZDUS90RmFQYUVOY2VHZmlSR3E5Y2VIWkd6L3dCOHMxVHIrMTU4UGRQRzI4WHhOcGJEL29JNlZjV3cvTXg4VmJmV0ZmNW1aVnllckhyUlA0cTAreFhkYzMxbkF1T3NzeUlQMU5lZEtuRyt4K1B4cWMzd3cvTmxyUnYycnZoMzRnYnk3WHhEb01rcmNMRkpxYUs1L3dDQW5hMWRCRDQ5dFo5cjJzVmpKa1pVckt6ajYvZXJ5bnhYOFRQaGM4TWk2enJ2Z0V0L0VMcTl0QzM1TTFlVStMUGlGK3ovQUMzS3JENGo4SldNZzRMYWJxZ3R5UDhBdjB3RmNGYWlwTy9LL3V1ZWxoYU5XM3VSZjNmOEErdWw4Y05Pek9sbHBkbXpmTXd0N09PTlpHUEpkbHhnc2VwWThrOWFjbmpPOE0wZmx5ckNjOG1LTllUK2FBVjhjeGZHZjRYK0UzM2FMOFl0VXRPQmlNM2JYOFg0Q1JHNCtocXZxWDdkMWw0Y2VNV1hqclE5ZUN0OXlmUnJtRnovQU1DakJIL2p0Yy8xV2Nub245MWpvcVU4UzNkdDZuM0JENG12SkUrYTVtUCs5SVNUVmkzMTZSaytaNUhCOVdyNHY4TC9BUEJUdXl1YmhZYjd3ajRqdWp3Qk5wVmxOY1JuNkIwUTExbXVmOEZLZkR2aE8yamx2UEJYeE10NFpNRlpKdENFS045QzhnclQ2clcyYU9DcFJxMy9BT0NkdCszRit6bk4rMWI0SEhobTExUzQwdStrMCsrbWdFS0IxdXBCR29qamNIb3BkbEpQVWJSakZmbTkreUg0djhqNEk2OTRIa3RMaFd2TEs1ZTQ4dTVTeW5sODVrZ1pWa1lIQ29xZ2xjWnlRTWM4ZlhPdmZ0QTZ0KzNoNDg4TmVIdkF0bjRsOElRMk55VHFXcTNUcGI3WUhhSlhSZHU4NzlqRmdPTWxlb3I1TDhVZkMxZmdwKzBYNDg4RHRmVDZsL1pwdXJLMnVIUWp6SkdlR1VNVG5HU3VBU0RrRVY3bE55Z3VTVDZKMjlHLzgwZnAvQytGdGx0T2JWbmVTYjczMis3VTdyL2dqejRTdnZEbjdjL2hmUlliNzdacHQvYVhNZDFEY25lc2NhRkdjS3BPQnlTZS9VOEVWK2lYN2UyZ0wreVYreEI0d3N2QlFmVDlIdGJoWnJTUGFWdExWcFpRc3NFWlRCaldRTm5id0FTZHBIYjgzdkMrczZoK3lycnZoYjRrYVhaelh3OEo2eWk2eEhheU41ajJrNmcvTVFNZk53Qm51dUsrdS9GZjdRM2pqL2dwSit6WDhSdkJlay9DL3dBWmp3M3FHbE5xR25hdGUyeVFBWFZzL254N1ZETXpxN1E3UGtCd1hBUEdUWEJtZEdkU3ZERUorNnJYMVhmL0FDUGJvOHNXNE5mOE1mUFAvQkZDYTYxZjlybS91dkxXT0djTzRoUjJaSUFWa0lWU3hKSUhxYS9ZTHptamxDay9Mbm5GZml2L0FNRWZmRlhpVDRZL0UzWHRjMDNRRzE1dFBqMjNWcVpmSWtpQVJnV3lSamduQkJJcjlEZEMvYng4V2VKSTN1clA0TCtOTlJ0VkpYenJURWtiTVBRN2NIOENhL0dQRWJBVjhSbXJuU3RaS0srSkxwNXRINlB3N1Zvd3dhaTlOK2pQcU5yajVjYmlmeHFuZDNJSEFiODYrU2RVL2JzK0pkOXFiS3Z3bDhZNkxZZzRNdjhBWk10NU1QOEFnUHlMK3RaZXJmdGFhUnJDTC93bFZ2OEFHV01MOSszaTBaTENMOGRrbThqNnRYNS9QSThXdDJ2bEpOL21lOVNxVUcvK0FmVDNqcjRwYUw0SHR2TTFiV3JIVGw2QVQzQVF0N0JTY2srd0ZlU3QrMFpGcWMxdzJrYUg0czFsWk5VZ0Vjc0dudkZFNjdveHc4dTBFSG5wbnJYQitHZjJ5UGczb3VwdzI5bG9PdDIxOU02eHBKY2FPMGt6TVRnWmtKWnZ4SnhYMFo0UThEMmZpdndwTnFXazYvbytvelNYYVh4Z3Q3cFpNUnJ0WW9wVW5jK0Y2RGpQR2F4bFJxNFZmdll5MTd0Mi9DK25tMmJZak5jdncvTEd2VmpIbWRsZit2eEt1bi9FM3hkcU1lMno4RTNFUEhCdnRRaWp4OVFtNDFjczlYK0p0NGZsdGZDbW5yMkJ2TG1VajhsV3ZPN1gvZ29UOExiUy9tdGJqWExpMXVMZHpGS2sxaE1qSXdKQkJ5dnJXM1kvdDcvQ2ViYi9BTVZkWnAzK2FHVWYreTBSd21QanJHaTE4bUZTcGgzckd4NkJZV1hqNjVIK2xhOW9kci8xd3NaSlQvNUVrL3BXdC93ZzNpUFhiY1IzSGpPK2dVa1pheXNvWUd4OVNHcmdyRDl0ejRWM28vZCtOZElIZjVpNi93QTFGZEJvL3dDMTM4TnJpSHpVOFo2RzBLakxONS9DanVUV2xHam1NWmFVNUwvdDMvZ0htMTVVK1gzYmZnZmhyKzE3OGI3WHd0KzFyOFJkTnVQQzJnM2JXZXZYa0V0eExwZW5TeXp1SjN6STI2MHprajFZOWVTYTc3L2drbDhWTmMrSmY3WVdpNlJISnAraXgza2tGcUxuUzlGc0xlNnRvdk5CT3lSSUFSL0laNHhYaG43Wi9oOWZIMzdZdnhNMWJTOVgwTzQwdlV2RVY1Y1cxeU5WZzh0NDJsWWh2djV3ZnBYZS93REJINzRqNlQ4SFAyek5DOFFhNXFOdFk2ZHA5MUVaWkhKT1FKRkpJQ2drakh0WDljWUtITmc0YWE4c2I2ZVNQeC9HUmlxMG5MZlczM245RC9najlsVzhQaEcwajFUNGhmRTgza1laWlJEcnpXNm5Ec0FRSTFVRFB0V3FQMlJOUGxYOTU0NCtMVW4vQUhPMm9SLytnU0xYSHQvd1ZNK0JkdGJvMy9DY1dycWYrZWRyTzM1Z0pSSC9BTUZWZmdhMy9NN1JyOWRQdWY4QTQzWDFFYWNPVkovbi93QUUrVWxVZk1ka1AyT2ZEY3FmNlQ0ZytKbDhQUzQ4YzZ0Si9PNHA0L1kwOEF0L3JyRFhMc2pxYm54SHFVMmYrK3B6WEdIL0FJS3EvQXNmOHp4SC93Q0MrNS8rTjAyUC9ncWo4RDVKQXFlTXZNMy9BSFF1blhMSC93QkYxcDdPRytoTXBhNkhiUy9zVGZERzRLdEo0WkVqQThGdFJ1MlA1bVdyRUg3R253M2crNzRkeDZEKzBMb2dmK1JhNFdmL0FJS2svQmkzSTNlSnJ4ZnJwRjBQL2FkVjMvNEt5ZkErRDcvaWk4WC9BTGhOMXovNDVXZjd1KzYvQWZNZWpmOEFESGZ3MVkvdlBDV256OS8zMGtzby93REhtTkxkL3NnL0MyZlQ1b1crSGZndVR6RUs3NU5HdDVYR1IvZVpDZjFyZ3JUL0FJS3AvQTI5NEhqU09QSXorOHNwMS9tbFBQOEF3VkQrQ0l4L3hXMXA4eHgvcUpjL2x0cCt6cDM2ZmdITXR6OHAvd0Rndi80N2cvWnYrT04vNGI4UGFQb21sNmJyR2hhSmZ2QmEyYXc3cEl6cUVRQUM0QUh6WlBISlJmU3Z5My9adjhRelJmR2JSWTU1NW10WnJoSTVJMmxiYXlsaGtFWjZWK2hYL0J3MzhXdkMvd0MwZDhkNFBGUGh2VkZtczRkQXNiV0NPOXRwN1Jyc3JQZTVsaDh4QXNpWWNnRlNlVlBwWDVuL0FBNXZtMFR4N3B0d3p4cjVNb2JPY1Z4S2pHMVNNVi9Wa2VoaWRhY0w5VityUDFEdnZocGQ2QkVHMEh4TnIyandteE1uMlg3UWJpM1Q5OG93RWt6dEhHZmxJcXhhMkhqK0pmM1BpTFM3cFZzRmwvZjI4cW5CbC8yWDY4VTdUUGluNGE4UjJYK2g2NXB0NlBzUVQ5eGNMSmsrWVRqSzU5Qld5bmluUzRJR01lb0lQOUFSQ0d4Z0hlNXhtdmtvZTBlNi9BK1N4RXFrWGRtRFllSy9pWmEyOGlLTkZ1QXR2Rko4bC9jUlpCbWs3YlR6eCtXS2p0UGlUOFI0cnZ5MnRZV2J5RWt3dXRPQmhwbkFQS2V4SDRWcWFiNHYwNHkzUy9iclg1ckMzWG1WZnZlWk94Ny9BRXF0ZStLdElnMU9RcnFsaXUzVHJNYzNDY256N2dudjI0cmVwR1hMYVN1WVVLczNVVDEzWGNwM1B4UCtJVmxjTXN0bmVTYlpUTXlMcmpNdUdrbDdFQWZ3bjhxdEo4WVBHaVJXNWJ3eTAyNjVkeVhtdHBzNWtrN3V1ZTNYMnFucVBqalNmN2F2c2FycHpyOWx0MkgrbEpndDV0d1QzOUdINTFvbnh2cER1djhBeE50TkN4S3JZRjBuVXRJVDM5eFVZZU0yN3VQNTlqc3g5U2Q0dTNSZHpNLzRYWDQyYnc1dWo4TjJrZTI2dWxETWJKUi94OVNqR05oL3U0ejN4bWlvVzhWYU9mREpoL3RmVGQzMm1aeVB0S2Z4WEU3K3Z1UHpvcmRZZStyaCtETVBiVk5yZm1VZFovYWErRmRucmEzTU0ybU1uQWtYN01uSTcvMXJtOWYvQUdzUGhrTlJhYlQxdW1aWVg1ZzAvS1pLa1o0N2MxNmQ0OCtEWGgrTFVMaG90RzAxWThqYVJiSU5uNlV4STdUUjlPdUZ0TFdHTHliSXFBSXdGeVNnelg4dDRQRjVUelJuR2xVay9PcCtlaC9kZFRENDcyZGxVaXYrM0wvcWVYZUhmMnRmaGxwOEprODY2OCs1dzBqR3pYbi9BTWVxOVA4QXRjZkQyN0liekw5dk16ejloSElINDE2UjRNK0ZGdnExbkN6VzhCYTNUY0hNWStZNHJXaThKYWJwZHNtMTRUSWNzNmJlVU9NVk5mTnNtOW8wcUUyLyt2ai9BUGtUU09IeDhZM2xXai80Qi93VHgvOEE0Yko4SHhyKzdPb3RnamIvQUtOZ1kvTTFQYi90NzZMcGRzMGR2WVhjaW51ZUNmOEF4MnZWckRSMXVVWDVJd2lubkM0M1YxZW02SHMwYVNUeVF5Z1lHNWE0Nm1jWlBUZXVFYjlhai84QWtUWjRiSHlqclhYeWd2OEFNK2I0ZjJvbThXeVNTYUg0TThRYXc3S2Nzdnl3cWNaT1hLNEgwcnovQUYveFRKcXVreHUraDJsMXFGdUpHOHVTZGxaQTU2YmxJNVVjY2dqSXI2SCtKdmliVC9odHBONXFlcFhrZHRhd3hOdU1qWTV4Z0RIY24wcjVmdU5jODIxbXVvOXY3emRJQ1R5Qi9udFg2andYaW9Wb1RyNGFncWNkRmU3ZDk3cTcwN1h0M1BsYzh3SHRMVWNSV2NuWnV5c3VXL1d5djJkcjNXbWg0UjQwK05VbHRxV3VXRnQ0ZjAremE4UnJTUzVjTmMzRUtaNUNsbStVOEFaR0RnVjc5L3dTL3dEZ0Q0ZitMMXo0Z2JWcnEvbWhzNFkxalcydVpMVmdXYzVMYlNQN3ZxYStTZkYrby9iOWV1cDFWVjg1OTNCNjVyN1cvd0NDT1Z3MXZCNHNLbkNzSWQzUHUrUDYxKyswZGFTaHRaSDh3OFZ3VkhDVjY5Tis4K3A5VFduN0JYdzBsbVh6OU4xRzcvNjc2bmNObjYvTlhVYUQvd0FFL2ZoTmIyejNCOEkyajdUajk1UE0vT1BkNjZTeTFVYjErdk5iRnY0aGtpUmdyY01NZlN1ZXBHMmgrTzA4WlZscTVQN3prN2Y5bEQ0WjZlaWlId1hvZkhUZGJodjUxWXQvZ0w0SDBxN1g3UDRUOFB4dG5uRmpIbitWZEdMMW55MjRIRkpQS0pKVllINWxQTmVQVXB5Yk9xbmk1MjFiTE1Qdys4UDJpTDVXaWFUR0FPaTJrWXgrbGFNR24yZG5QRXNWcmJ4QUQrQ01ML0txc3N2a050VmlkK092clVVVjh6VDlQdWo4cXdqUjkrNFN4SHVuVndTcVk4QWRQU3JjSGx5eGJaVmpkR09HVndDRCtGYzlhNmhuQXlmZXIxcmRESVpqbHMvS01jZld0bzRjNDNWczduSWVHdmc1b253citMZXBlSnJXSG5XR212cnRZc3A1VUVSdDJaUUFmN3FPZitCWXI0UytOV2pwYWY4QUJUNzRoUVIyTjFxU3lYcHhHTWJJdzBjSkpBSjY0UDQvV3YwVWt1STlROFo2ZmJ6N1RiejJsM0hJRDk0cTNscWVQeE5mbnY4QThGR2t1L0JQN1cwTjVIOXZoajhUMkduNnU3eEtRWkxxSmZMY2h1T05zWUJBUGNkOFUrYTliMmZWeHQrSis2OEd0LzJCVHF5MlUzL2tmU0hnTDROZUdkTzhLWDNqanhGclJnMEt6dEZpMXJUb21mYnFjY1JabitSVHpLTnFEZmdsVjNBY212bEh4RCsxVjhhLzJyZjJoN0hVOUMxTFV0TjBteDFXUFY3RFFyS2Y3TFk2WmJ3bERINWh5cWVXaEFCWnpnYnNkd0s5Ui9aRitMK3FlUGRjMVR3WHAxaXVxRFhMeXpzMFc4WUFMSEs4YVNNc2VjN1FPV3dSa2xhNmZ4Myt4aGQvc2EvcyszT3Vycm4yN1ZtMUFMTjVOcXpKUEFxc0JhdDFJV1FINXM4WU9PdUswblU5blBYc2VoV3U5RnNyM1BhUDJJUGhkSEorMy84QUVtK3Y5SFMyc2RkbU9weDI1S3lRZWFVQmNBamc0WjkzSUdDdzRyN3hNS1FONWNhckhHdkFWUmdENlY4RGY4RTIvR09sZkVQOXFDMzEvVGROL3NPVFVmQ3EvYWJKcEhMUE5INWNUeWdNekZZOHJzVU1keEVlVDJyNzBrbUp1dHZwWDg3K0pEa3N6Y2ZLUDVINmR3MzcrRWpKZWY1a2R6R3JNZnJXYmZxck13L1NyOXkrQzFaZDRTV05mbnNwUzVUNnpEeHVmUEgvQUFVaytKY2Z3cy9abjFhVmRxM0dzU0pwMGVCeVJKbmRqL2dJYXZ6ZC9ZcS9hNzFyNEdmRXkzMDlieVgreGI2OGpZeEU1V0Z5Y2JoNlo2RVY5VGY4RnR2R2tqK0hQRE9nd3lqOTM1bW9TcG5rNVpVUS9oaVQ4Ni9QZndSOFBydnhWcjJsd1dURlpycVFtU1FuNUxaVXd4a0o3QlZ5VFg2Und6bG1IcTVQVSt0YlR2ZS9TMno4cmJuNEo0a1k1MXM2ZEdQL0FDN1NqODNxL3dBN2ZJL2JqNGIrT2RMMTN4SzFucTl0WXZIcmtZdnRMdVpZbFpaeXdCbWd6ajc2a2hnRDFWK1B1bXZUTGY0ZWFESWZtMFBTVzU2bTBUL0N2elgwL3dEYlQ4QzZqOEZUNEZ1L0VQaVhSL0VHaHhBMjE5UFlLMFhucTJGYmRHNVpWeDNBSnczUTRyNjAvd0NDY1B4OTF6NHUvRDdWdEw4VEk1MW53eFBFclhCbDh4THlHWldlT1JHNk1wQ2tnanNSK0g1L1N5M0g0YURqV1RTanBxbW0xcGFTNk5OV3ZiVlBmZEgxbkIvRXRhczRaZmlVbm8rV1NkOWxleitXejhqM2h2ZzU0VHVQbWZ3M29qZCtiS1AvQUFxUC9obnp3UGR5Q1NUd240ZmFSVGtOOWhqNi9sWFRRc3BIL3dCZXMvNGMvRTd3OThUTGE1bThQYTFwV3R3MmN4dDUyc3JwSnZKa0I1VnRwT0Q5YTFvMXF2T3ZlZjNzKzRyVklKcUxhdTlsMWZvZnpuZnQwYWRGcGY3WmZ4U3Q3V09PRzNpOFNYaXh4b3UxVlh6bXdBTzFlcWY4RVpyR0MvOEEyK2ZCSzNFVWMwUzNzSkt1b1lIOTR2WTE1YiszTmNmYWYyeC9peE12VC9oS0wzLzBmSUs5RC80SS93Q3BIVHYyN1BCVW1RRDlyaS85R3BYOWU0Ty8xU21uL0xIOGtma2VLdGVwL3dCdmZxZjFBMkhoSFNyRWJvZE0wK0p2VkxkRlA2Q3JjbWwyMHliWHQ0V1VISUJqR0JUb0pNTHo2MDd6Y2pOZlh4aXVWYUh4TjBOaDArM1FBTERDdjBRQ3BraGppSUlWUjlCVVJsNHB3bXFySW9zbDFZZjQxRVFvZm9QeEZNYVRpbXM1TW5CNG8wRVl2eEM4WTZEOFBkSGh2ZGF1Tk5zWWJtNWlzNFRjc3FDZWFRNFNKYzlYWTVBQTVKclNHajZmZFFDUmJTellTS0NHOHBlUjI3VjhGLzhBQldqNG5hdDhSL2o1OE5mZy93Q0hjelhrOGcxZVNKT1MxeXplVmJaOU51Wkh6MjRKcjd5OE02WkpvZmhuVDdPNGtFMDFwYlJ4U1NEbzdLb0JQNTVyd3NGanAxc3p4R0hTOXltb0wvdDU4emY0V0Z6SjZJL0IzL2c2bTBiZisxMTRkdUxlTlZsdGZCMWl1Ujh1RWE2MUJXSDQ4Y1YrVVBoTkFmRlZpdjhBZWsveHI5blArRGt2NEhhcDhWLzJyOU92bE1sbG9PbStETEUzdDZzUG5NdTIrdkNWamp5REl3REFrQTRBT1NSWDVUL0Y3OW5PNCtCbHo0UjhRUWFwRHJmaG54VVpaTk12RmlNRXJtRndrcVNSRW5Zd0pCNmtFTVBvSnFaM2dWakpZQlZGN1I2SmVmTGUxOXIyVGRyM3NyMk81TlNqRkxvdGZMVSsrZkUzN09uZysrMHpUV3VORTBpNnVKck9EZThNZXpKS01jNVRGWjBQN012Z0daSWwvd0NFZGhVN0VYL2o0bXdEKytKL2ovMlJYVTZGcWF5ZUV2RHNrY2l0OW9odHljZjljNVNDZnd4K1ZhT2tONTl0YXY4QUw4MXhzL0FKY0d2bThIVXFMNG16NS9QcGNsVnFrenpleS9aZThEeWFoT245ak50K3p3RWJidVlZSkZ3VC9IN0Q4cVpmZnN4K0JyZThCL3NUY3JXdHB0M1hVemNscHlmNCsrQlhmMmI0MVdIQ25FaUlENzdZcHovV3BOZENtMXNtVVozSkdtZjkxSlQvQUZyMnB5bGJjK1pwWWlmdE4yZVo2aCt6bDRJKzBYSlh3L2FvdjJlMjJZZVRoaVpNL3dBWDBxZWY5bXp3TktiNXY3RFJUSEZibEF0eE1NRW9TZjQrL0ZkTzVlNXRWYmtsNFk4alBYYU0vd0JhZEZkbVdHWmwvakVCNitrUy93Q05ZNGFVbDEvcXlPN01LMDdxejZmcTBjZk4remY0SVg3YXY5Z3gvdUJCL3dBdk0zOGFzMzkvM0ZGZGhxY3A4elVwTWJkMzJKZXZYRnNoUDg2SzZKVGFlNXgrM3FQVzdPNjhaNmo1MXd3Wm1CemdZL2lybTcyWHpHbmtMWjNScXA5UHZyWFJheHBiM0tTeVRSdEd5dVFNOGJxNWk2bHk3SmxXL2VScHg5VFg4YzBmaXN0a2Y2T1ZyL2tlb2VFbVd3OEhUWEJ3ekZNNXJuMDA0eld6dHV3M1k0NDllYXQzdDVOcG5oZU9DRmNMTDhyQUR0Vkd6MUF4UW92UVNEcG12bjZkT1Y1VFhWbXNVbXJNMExDeWFHT09KZnIrTmJlc2F6SDRmOEt6TmNUSXNjQ0YzSjRDZ2NraysxYzlGNGdXM21MQUtldyt0VS9HMTBQR0hoZTlzN3hSSkROR1lwRkg4U2tZSXFmcS90S3NmYS9EZFg3aFV2eXZrdGMrUmYyZ1AyaXZEdnh6dHB0SWkwM1hIaFM1RFEzYU5IR2pTREtxY0ZqbFRudmpyWEYvRUdPVHczOE9yK1R6YmRYanQ4WUU2N2huamtaejNxbDhUZmhzM3d5OFdYR2lzWm83VzRrRTFoTXBCWXhaNlovdkxqSE5jbjhWZkNOMVA0Y2hTQ1RXTlF1TGlWVVZYWXR1SFUvS0FCMnIrdU9IY3Z3ZFBEVTZPRHY3SnU4ZFc3M3RyNVB1dE5UODY0dnc4TUxob1kyalBublVwM20zWmNzazVKeFNWdG5lMi9xZVFhdWZMdlcrWWZkWGpQc0srMnYrQ1A4QWZMYTJYaXhXa3dXOGs0N2RYNXI0bjhRK0Y5UzhQWHBYVUxLN3M1SkNXVlpveWpFRGpqTmZhSC9CSWZTL3RyZUl0Lzd1SE1XWEdNNEJPUitvcjlHanlwZTlzZnpIeFZHYzh0cXhncnUzNm4zRkJxbU8vVTlhMWJIVXQ2ajV1bGN0clRqUTlXbXRQTkVxeHY4QUsrTnU1ZTFQdGRZOG9qdG5ucldsYWpmWS9CNk5aeDNPMWkxSEt0dHp6VXR2ZTczMnIvRnpYTmFkcXl6WU9md3JRczczZGNjRGpJSFhwWGxTb3ZtUFNqTk5IU3kzMkcraDcwMktiY2R6ZmxXVnFXcEJId1d4eG1vYkw0aWVCWnZFa1BoKy93REY5bDRkMXFSQVUvdFRkSGJ5azlBSkZVaGMrNVA0Y1Y1bVlaaGhjdmdxMkxiVVc3WFNidHU5YkoyV20reHRSb1ZhemNLS3UwcjIwMk9wdDc3eTAzWlBwOUtzTHF5eHJ1M0JlZTlZT3JXRjU0YTFCck8raGFHWlFHR0dES3lrWkRLUmtNcEhJSU9DS2lYVS9NaXczYnBYb1UrU3BUVldrMUtNbGROTzZhN3J5T0gyajUrV1dqUS94ZjhBRVc0OEcrSTlOMUsxOEw2NTR1V09LWlpMWFMxaWFhSlNZejVtSkhRRURHTUFrNUl3SytXdjI0UEdYaC80MCtJdkNPcHlMcTJtemFmWlhWcmNXOXhZdkZjV3hWOXloRmY1SEl6bGloT0F2Zm9mcWp3ZmNSM2Z4Q2hobVJaSVZzWkdPNzd1NHVnNUgwelh6bi93VTg4T2FmNGE4Q2VHWjlLajAvdzdJdmkyUzNrdjdlM1ZHajgrTHpESzIwQXRnc2Z3V3ZEclZGOWZVT3VuNUg5S2NFNGRyaG1GVHBkdi93QW1NTDltbndkcnZoWC9BSUtHL0N1Kzh2VFp0UDhBTGV3bml0aWtYbDVMaGZPM1lFaEVpb01yeWRxOXpYNkgvSFA0YncrSm52SnRTdGQ4TnBpNnRDMkdqM3ZHMFEzTDZmdkQrSkgxSDVlL3NQMytyYUw4Y2ZoWnJkMWMzR3Q2VDRzOFlOWXhOY3NWZU9XSndQT2pYa0FFdm5yd1ZINC9zdnJ0bmEzR3VXOXJkU0w1Y2tIbHlDZmlNcnZYamtkd09EMUg2MDhkVWpTVVpWV3JSVHU5bDNkKzF1clowU2NaODBvNmFuNXBmOEVmTGU2MHYvZ29mOFM3VzhXU05yWFQ1ZHFPNFlxcnlvNEdRU1A0dTFmcUVRWHUyKzd4WDV6L0FMQ21tYWY0TS80S3gvRit6dFZrdHJPR3diUG10OTNhWXdjSCs3eDNyNmYrTC83WjFsOExQR2xuSGI2ZTJ0YVREdGsxaDdZRXoyRURzVldjYzdTQndTaDUydGtZeGl2d2J4R3FSbm5FWXgxYmpGNmRyYi81ZDJ6Ni9LODh3V1dZQ0gxcWZMek5wZGV1L3A1bnZFNDNFMW1hZ05pazhtdERUciswMW13Z3U3SzRqdkxPNmpFc0UwUnlzcU1NcXcrb0lxdHE2N0lXSTdmcFh3Zkx6UlVsc3o3M0MxNHlTbEhabjVlZjhGczJhRDR1ZUc1dm1WSk5KTVI5T0pTZjYxOGZhaHFsejRLOEFSMnFueTd6V2labmtCd3kyMzhDZTI0NGIzRzJ2dXYvQUlMTGVIVTFMeFY0RmJ5OXphZ3MxdG5IWU1uL0FNV0srZjhBVWYyZXZEZmpZeVc5MWVYa090YkJMYmlPVUNQeVY0Q0FZUFFESDRWK2taTG0xRERaZFJqaUU3WGQ3Syt6MCtTL1EvbkhqaXA3TE9zUnpkL3pTZjVNK1hiWnBYdkdjeU0yN2c1T2MxK25QL0JFdjQzV1YxSHJmaFM4OHRkUWxNUDJhNGRzRm9rOHhoR2ZaUzhoSCs5WHhWNGkvWnJXMSsyTHAweGpsczJ3RWxPN3pnUUQxN0gvQUJGYkg3RC9BTVNKdmc5OGQ3VzVrM3hySE1vbWpKMnMyRHl2NGpOZDNFMG9acGxWVjRPWHZ3VjQ2YlBwZGRWWThiSmM1cVlQRXh4T0gzajM3UFIvZ3o5b3ZpWWI3eFBkVzJoNkRxazFxWlFIbnVyYzdKTWVpc2V4NTl6aXB2Z2I4SXZEdnd1azF4ZkQxamJXNjNOd3JYdDFHdnozbHhnbG1jOTJHUm4zSnJWK0QybC9iOUl2ZGZ1Z3EzZDByTWdSYzdBUndxL1FZQStudFc1NFQwMGFSNFF0TFVMNWJLWkpaRkl3Y2xqMTkrLzBOZnovQUpMaDhUUEZRbFdtNU9UY3ZsRzFsWmFidTY3ZE9wOWprT0t4V1k1eERFWWlWMnJ2eVN0MFhRL21wL2E3MUJyNzlwMzRsWEdEdHVQRTErK2ZYOSs5ZG4vd1RIMWIreXYyMFBCRTNJLzA2SWNqL3BvbGNYKzBEOFFMUFZ2R1hpbnk5SzB4YmpVTmR1bk53RWN6S3ZtRnVEdXh6dXgwN1ZvL3NRYXovWTM3VWZnKzQ0UlZ2VlluMHh6L0FFcis4cVB1NGVDZlpmZ2thNGg4em44LzFQNjBZcFBNaVVqb3d6VHQzeVZUMHU0WCt5TGVRdHRYeVZZa25HQmpOZk5QZy84QTRLamVEZkdIeDIxWHdxbGxjcm9Oak5IYlcvaVJiaUdTeHVaSEhIUjl3Qkp3RGc5Q1RnVjZtWVo3Z2N1aFRlTnFLSE83Sy9mL0FDMjE4MGZGU3NwYW4wM2V4dmNXYzBjYmVWTElqS2ovQU54aU1BL2hYQmFWNDQ4VWFEdDAvVU5CdXJxYTJUSDJ1UDU0cHdCMURMbm5BL2lDbjJyMERlc2lnaHR3NmdpZ2pIOU9LOC9QOGd4R1lTaFd3ZU1xWWFjVTFlSEs0dE8zeFFuR1VYYTJqU1RYZXhYTjBQSlgvYWhrZ3VoQzJsUnN6SDVBSjhieVA0UmtkZjYxMFh3NS9hSDBYNGlhaXRncXoyZDhVWmhITGdoZ001d1FlMkQxRmVNL3RaK0I3bndockszMWl2bDJPb3Y1b09QbGlsQkJZZTJlb3I1LytOL3hrdXZoVDhNdGU4YldOeEhhNmhEWk90dEdEODNuUEc2TXdIb0hHY2Y3VmZ5MWcvRXpqZkkrSUhsT2RWMVc5blZVWkp3Z3VlRGF0S0xTaTAzSFZYZlcxdERsZFp3bFptQit5NzR4YjlxVC9nczdybmloWkhtMDNRcDcyT3pZbkttRzJRd0lSN0ZtL1d2MEovYWEvYUQwajltUDRMYTE0dzFqNTROTmkvYzI0WUsxMU0zQ1JxZlVuOGdDZTFmbHAvd1JIK0llaWZDNCtNdmlKNHExQVc5bm8ybUMxano4MHR5ODhwY3FvL2lZK1Y5Qm5KNHJ5ci9nb3ovd1VJMXo5dFg0bnJwS3RKcGZndlM1VDltc1ZsLzFnR1I1MGhCd1hiSkhvQm5GZnVtQTRxbzRMQVZwODE2OVNjNUpiMlY3SnZ5VnRGMWEwME01WWxRcDgzVm5ML0dINDhlTXYydGZpRnFYaUhVTGlhU3p1cFdKM3lzSXdtVGlOQVA0QU9BTytNK3RmRS83YS94RHRiRWVFZmg3YS9Nbmd1YTV1SnprSFpMY3VqRlArQXJHbWZkaU8xZlIzeGkrUGNQd2IrR3FObzlpdzFXK1I0TEJXWEt3a0tmM3JEMEIyZ0QxWVYrZU90YXhkNjFxOXhlM2s4bHhkWEVwbGxrZHN0SXhPU1NmZXZLOE84bnhHTHhVczJ4U3RGTnVOOTVUYWFjbjhwU1hxOU5GcThyb3ppbldsOW8vU240UStJcGRhK0hYaFZ2NGZLajZlME12L3dCYXU3MEc5YUN5MDM1dnZYTWg1OW9wdjhhOGwvWnM4UXJxM3d1OE50R25saFZJeUIwS3h5aXZRTlAxMVJhYWVnSVBseVROejIvZHYvalgyMUdISzJuM1BNemlTbFVsWTBCZU5CcUdtTU00a1dUOFNJRy94RldyeTZhU3gwM2p0SWVucENEL0FGckRudXN6YVNXa1dQaWZMTWNLbjdsT3Y1MTBmalMzczlDdVk3U3p2RjFPMXMvUGpTN2pVcWx4L284UHpML3M4bkh0ajFydjlyRnk5bjFhYitTMC9WSHovSzAxTHpNTFNaR2t0TEgzdDM1K2tVWi9yVU9qT1ZraFJ2NDRRL1B0SEhVT2czMmRNc3QzVklaVkk5UDNNR0tsMDc1THUxRGJ2bHRYSTZmODg0cXl3Ni9yNUk5TEhXdWw2LzhBcFRKTlh6TmZCTjMrdUVMRDhMV0dpbVhMK1o0aTA1UWZ2V3l0alBwYndpaXVwMDdublJsb2V5K1B4bVIxL2h5Uml2T0xsRkdyN2NESDJoQitqVVVWL0ZlVHlib08vbWY2UzFOdm12elI2RnJrU25TRHg5MU9PZWxjeTY1V0J1ZDJWNzBVVnc0WCtIODJFZmlIWEVyZmFOdWZsM3J4UzZ1ZkswaTdaZmxiMS9PaWl1aU84ZlZmb2FWTno1Ty9hWi9jZkVud3pkTGxiaG9wVkxnOWh2eHgwN212QnYyaHRVdWJ0ZEk4eTRtazNPeE81eWU0RkZGZjFQd1pKL1VjTi9YVm40L3hNbEtqaXVicEova2p5UzZHWnAvWnlLKzN2K0NTSThxejhWYmVOcVJrZlhKb29yOUNyYTB0ZkkvQ2M2LzNPWDlkajZ3OFZTTTJyc1N4eWNacHR2S3huWDV1MUZGZXo5bGVpL0kvbTZwL0VsNnMyTk9sWU45NnR2U216T3YrOVJSWG5WZHp1by9DVzlYWStldjBGZksvN1cybDIrby9FS1dTYVBlOE5sNWlISkcxZ3ZCNG9vcjRUam1UV0JnMS9PdnlrZlQ4Ti83M1AvQy96UjdUK3lUNHUxTHhUOEFJNGRRdkpMeVBSN2tRV2ZtWUxRUnR1SlFIcnR5TTRKSUhiRmVneHlNZS9laWlyNEwweXhyb3B6dDk1eThRZjc3OGwrUm9lRXZuMU1NM3pNWXdDVC92Q3ZuMy9nc2xDcS9BdlNNS0FXOFJXd0o5amF5Wm9vcFlqL2tkUjlWK1IvUmZCdjhBeVNFUFNYL3BUTWYvQUlKNjZMYTYzNGIrQkRYVnZITTJtK0lMK1cySkdQSmJZejVHTys1RlA0ZWxmb2Qvd1VGK0lHci9BQTMwTFNielJidjdGY1BkaUF2NVNTWlJqZ2pEQWprY1VVVjV2RzlPTTh2cndtcnB4a21uczA5MHpreEgrNlQ5RDVWK0dXbXdYSDdSUGlyeEEwYS8yeHJXbFdNZDdjcjhwdUZhUjFZRUQ1UmtSb09BUHUxOUxmczRlRjlQMVhRL0UxeGMyY0Z4TmY2M05iWER5THVNc1N3UHRRNTdEMG9vcitYY3dxVGM1dHQ2UWdsNktNZFBUeVBpY2JKeXFVK2IrUkhxbjdPMEsydndiMEdHTmRzY01EUm9vL2hWV0lBL0FBQ3VvMWhBWStuWTBVVnZoOWNOQitTUDZYeUgvY2FQK0dQNUkrQ3YrQ3M5ckhKcS93QU0yWlFXWFViZ0EvOEFmbXZsYnh6STJuV0dtM01MTkhQRGQvSTRQSzVJelJSWDF1WC9BTUNoNnkvOUtaK0MrSkgvQUNPNi93RDI3LzZSRTdEUkVGNVBmVFNmUEk2cGxqMytRVndldCtITEcwK09HanlSMjhjYlRSbG5LNUc0Z0RHYUtLTUJKcXBOTCtSL2tqNGJEYm8vYkw5bWhqSjhGYmVSdVpGdG95RDZZU3RhOW5mN0JlU2J2bldCMkI5d01DaWl2ZzhsYjlwUVg5eC8rbEkvWXVBMHVhcy9KZm1meXorTWg1bXZhaXpjc2IrWTUvNEZYVmZzeVROSDhlZkRMSzJDTGs0Lzc0YWlpdjdYL3dDWFM5RGpsdlA1bjlZRit4bitEaDNmTjV1bGxYLzJnWThIK2RmejJmRktBZkRYOXNqeFpwZWhOSnB1bjZmcmNzRnZCRTUyUm9Kc0JlU2VBRGptaWl2em5qcVRsbTlPbExXUDFlVHQwdnp4MXR0YytIeFIra3Z4Zi9hajhmZkM3L2dsVDREMTdRZkV0NVlhMU1wc252UkhISk1ZaytWVjNPcDVDZ0RJNVByWFlmOEFCRHI5b0x4bjhkL2hiNHJtOFllSUw3WHByTytqOGw3bmFXajNMazRJQTlPbEZGZWp3N1dxVHpMQktjbS8zY2QzZi9sMmJYZHZrZlNuN2FrSy93RENnZFlteCs4dDNpa2pidWplWUJrZmdUWDVoL3R5NmpQY2ZzNHliNUdiemJzeE43cnVqNC9VMFVWK1grTUZPSzQ1d3JTLzVkMC8vUzVubjRyNG42SGdlcE8zaGI5bUhUbDA5amFpK2NtZloveTA2RG44UFN2Q3RHdlpYMTdETm5May9sakZGRlJrZXRLdko3dWMvd0EyY2VLK0plaDBYL0JWUHd0cC9nZjlvZndwWmFUYnJaV3NuZ0RSN3BvMFk0TXNzdVpINVBWaWVUWHdKY2ZmYjYwVVYvU2VSd2pIRFFqRldYTEhUL3QxSDBzZjRFUFErNnYyUFpHaytCK2o3am5hMHVQYjVaSzlHMHB2a3R2OTZULzBVYUtLOCtYOFIrcDhoanY0a3ZVZjR3L2VlRjlyY3ExdGM1R092N2lLci9oS1JycjRLZUQ1cEdaNXB0TGwzdVR5MjFJMFg4bFJSK0ZGRmViV2sxbUdIdDFVL3dBanphMzhML3Q1ZnFRNkNkK214NTU1bC84QVJNRlhZSEp2NGZhMmwvOEFRWTZLSzlqQzcvMTJScG1HL3dCLy9wVWlXSmQvaUhUYy93RFBxMy9vRVZGRkZkTXR6amg4S1AvWiIgc3R5bGU9IndpZHRoOiAxLjg0OTMwNmluOyBoZWlnaHQ6IDEuMjQ5MzA2aW4iIGFsdD0i5Zu+54mHIDYiIC8+PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMDciPjx0ZCBjbGFzcz0icHQtMDAwMDA4Ij48aDEgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMSI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwOSI+IDwvc3Bhbj48L2gxPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDExIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMSI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAwMSI+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj7nrKw8L3NwYW4+PC9oMT48aDEgZGlyPSJsdHIiIGNsYXNzPSJwdC1IZWFkaW5nMSI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPjQg5aSpPC9zcGFuPjwvaDE+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwMyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7nm67nmoTlnLDvvJo8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+5Zyo5ZOq6YeM5ZCD6aWt77yaPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPuWuieaOkuS7gOS5iOa0u+WKqO+8mjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7lvoXlnKjlk6rph4w8L3NwYW4+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPu+8mjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7mirXovr7mlrnlvI/vvJo8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA2Ij48aW1nIHNyYz0iZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFFQTNBRGNBQUQvMndCREFBSUJBUUlCQVFJQ0FnSUNBZ0lDQXdVREF3TURBd1lFQkFNRkJ3WUhCd2NHQndjSUNRc0pDQWdLQ0FjSENnMEtDZ3NNREF3TUJ3a09EdzBNRGdzTURBei8yd0JEQVFJQ0FnTURBd1lEQXdZTUNBY0lEQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF6L3dBQVJDQUVUQVpjREFTSUFBaEVCQXhFQi84UUFId0FBQVFVQkFRRUJBUUVBQUFBQUFBQUFBQUVDQXdRRkJnY0lDUW9MLzhRQXRSQUFBZ0VEQXdJRUF3VUZCQVFBQUFGOUFRSURBQVFSQlJJaE1VRUdFMUZoQnlKeEZES0JrYUVJSTBLeHdSVlMwZkFrTTJKeWdna0tGaGNZR1JvbEppY29LU28wTlRZM09EazZRMFJGUmtkSVNVcFRWRlZXVjFoWldtTmtaV1puYUdscWMzUjFkbmQ0ZVhxRGhJV0doNGlKaXBLVGxKV1dsNWlabXFLanBLV21wNmlwcXJLenRMVzJ0N2k1dXNMRHhNWEd4OGpKeXRMVDFOWFcxOWpaMnVIaTQrVGw1dWZvNmVyeDh2UDA5ZmIzK1BuNi84UUFId0VBQXdFQkFRRUJBUUVCQVFBQUFBQUFBQUVDQXdRRkJnY0lDUW9MLzhRQXRSRUFBZ0VDQkFRREJBY0ZCQVFBQVFKM0FBRUNBeEVFQlNFeEJoSkJVUWRoY1JNaU1vRUlGRUtSb2JIQkNTTXpVdkFWWW5MUkNoWWtOT0VsOFJjWUdSb21KeWdwS2pVMk56ZzVPa05FUlVaSFNFbEtVMVJWVmxkWVdWcGpaR1ZtWjJocGFuTjBkWFozZUhsNmdvT0VoWWFIaUltS2twT1VsWmFYbUptYW9xT2twYWFucUttcXNyTzB0YmEzdUxtNndzUEV4Y2JIeU1uSzB0UFUxZGJYMk5uYTR1UGs1ZWJuNk9ucTh2UDA5ZmIzK1BuNi85b0FEQU1CQUFJUkF4RUFQd0Q3eEhBd2ZXZ05qcFRBY21uVjlsekh6SEwzRkx0anRTQWsrMUFRMHBqcWVZZWdoVWp2VWdQRk02Q2xYRlR6QnpEdWxGQUhGR2FYTUxVVFBGTGlqZC9uRklXYWx6TU5SVlVnMDd5c0h2VEVjZ1U1VGswY3dhajFURktBQjFwdnplMUh6ZTFUekJaanl5dDNvRGdZcVBCOXFkUnpEVVd5UUg2MDR5NHFNUGdVNVRrVWM0K1Jqdk5vMzVGTks1bzdVdmFCN05pN3pTNzZiaWpGTG1RL1poNXVhQ3pab3g3VUU3UlJ6aDdQdU54OWFPaC9pcFI4MUJJQm81a1AyWXFqTklWNTYwMG4zcFFmbXA4eUw1VXgzWDJvKzc3L0FJVWNEdlRTYzk2WE9oT0NIRnNpamRodXROM1k3MGI5M2JOSHRCeGpZZHV6L0ZSblA4VlJrME13Rkh0Q3VVZVJ6VEMzTk44eWhuNG85b1Z5OVIyN25yU2gvd0RhL1NvakxtbTc2Zk1OUkpkK0QxL1NtcytEMXFKcERUUzVwOHhmc3lScE9hYjV2dlVaYm5yVFdmYlU4eFNpa1NlWWV0SVpLaWFlby9QbzVrSEtXVExpbU5QelZmN1JVYnovQURVZTBRN0ZwcFBlb3pObW9HbjNDbVBOanZSN1FkaWRwY0dvM2NGcWhhNFgrOVREY0tLUGFDOUN4dUZGVldrWW1pcDlvR3B1SzFPMzVOUWxqbmcvclFHUHIrdGJIRjdNbU1wRkJjbW9TL1BXblpQclFOVVJ4UHRUaDkyby9NeDNvM2sxSE1rUDJLSmxiQm9NbUtpM21sRW1LZk9qVGxSTUFNZi9BRnFNKzFRK2FTT2xMNXVQV3A5b0hLU2hhY3JZRlFpV2hac1ZMa3hjclpOdnB3Yk5RK2JtanpLejVnNUNiZFJuTlFoODB1L0ZITVAyZHlYTkFOUmhzQ2p6UDlxam1EMlpNR3dhQy9OUmI4MGdsOTZPWXIyYUp0OUhtVkQ1dEhtMHVaaHlJbUw4MEY4MUQ1MmY0cVR6ZnJSek1QWmsyL0ZJVFVKbS93QTVwRE9LTHNwUko5d3BQTXFBM0MwMzdUejEvU2k3SHlsamVEUjVsVjJ1UUIxTk4rMFlIWG1pN0RsTFJtNHBwbHF2NS90VEduNTZmclM1aDhpTEpsK3ROTXRWaksyYVF6NEZITUhLaXdaY1VlZGtWVyswVkZKTm51QlI3UmowTFR5NU5JMCtPdUtxR2IvYXByeWducm1qMmpHV3pjREhXb251K2Fxdk1QNzJhak55ZzcxUE1PekxuMnphS2phN05WbnUwQTYxRkpxU3JSemh5c3R0YzgxRzkzVkNUV0VEZncvblZlYnhER2pmZUFxZmFXSHlzMURkTVRURE81NzFrU2VKb1IvRit0UVMrS29SL0YrdFQ3WXIyWnVtUmlQdkNtbGdQNHYxcm5KZkdzTWEvZVg4NnpyMzRoMjhZLzFnR09PdFM4UXU1U29uWk5LcS93QVZSdmV4d3FjdFhubDU4V0lZRmI5NS93Q1BWejJ0L0d5R0pmOEFXRDhUWFBMR1FXN05JNGVUUFdMblg0NFYrOHRGZlB1ci9HOVR3c242MFZ3MU01cFJkanNqbDlScTlqNnU4LzJXbDg3L0FHUlZUejZCTm4xRmZSZTBaNGZLV2krYVhkVlVTOGYvQUY2WHpzZi9BSzZubVlLTm5jdEJoUnZxc3N2UFduK1pVODQ5eVlObWc4MUNKTVU1WnNEMXFlWmpqRWxERVVwWmpVSWx3ZTlMNTJlNS9Pam1aWEtpWExVdTc2MUQ1djhBdEg4NlVTWTd0K2RITXlpVU1EUzdxaDgzTk8zOFVyc0NUZGorS2dTNC9pcUlTYy9kcGQ2L1NpNEUzbVpvRDhWRHZIK1RTK2FEUzVnSlBPRkladUtqODFmU20rY0tPWUNUZHlCUnZPT0tqYWJOS0xoUUtPWUIvd0ExSCtlS2pOd0FPdFJ0ZFk3bWpuQ3paUG5ucWFYaXFodTgwMDNiQTlkMzQxUHRDdVZsdklvM3FCLzllcVp1L3dET2FqazFCVXp1YkgxTkRxQnlsOHpEKzZLWjlwVWVsWXQzNGtodFZPNXYxckIxZjRrUTJvYjk0QitOWnlySkRWTnM3U1MvVlJ5UitkUXZyRWFuN3kvblhrbXMvR2lHRm14SjA5NjV2VVBqNUhFU0JLUHpybmxqYWEzWnJIRHpleVBlWDE2RWZ4TCtkVmJqeFJDZys4dnZ6WHoxZGZ0RHhJalptWC92cXNMV1Aya0ZWUGxtN2YzcTU1Wm5UWFUwamc1dm9mU0YzNDdoZ3orOEg1MW4zSHhPdDB6KytYL3ZxdmszVy8yazJjc0JLMzUxejl6KzBGTTV5SkcvT3VlV2NRUnNzdXFQYyt4cFBpcEJuL1dEcjYxRy93QVU0Q1A5Y1A4QXZxdmkrYjQrWGN6Y00zMUJvWDQ1M1JQTWovbldNczZqZlEwV1d6UHNxNCtLMEtML0FLeGZ6clB1ZmkzQXAvMWcvT3ZraHZqWmRPditzYjJOVkovaTNmU1AvckdxWG5TNkcwY3NudWZXN2ZHT0ZTUjVuNjFTdXZqTENGLzF2NjE4bnI4VEwyVi85WTJXOTZrUGpXNm0vd0NXalordFl6enF4dEhLWk0rbGIvNDJ4eHRqekIrZFkycGZIQ05DUDMzNjE4OTNmaVc2WWZOSXcvNEZXZkpxODA3RW1Sc1Z4enp4blJESis1OUNTL0hSVDBtNSt0VXJyNDViNDIvZkg2WnJ3cUcva0ErODFFdDJ3SithdUtybmxUb3pxaGxNVnVldGFqOGRpRmI5NGZ6cm5OUitOODBpbjV6MTdHdk43MjVaajk3UDQxUm1lUi9jVnpTemFySTZvWlhTTzd2L0FJdjNVcFA3dzg5T2F3ZFIrSVYxZFovZXlmVE5ZSzJiZFdhbGtnQ2dZL1AxcmtxWXlwTHFkY01EQ095TktEeEJjWFRaTWpmblJXZGJqeXU5RmNNcXJ1ZGNhU3RzZnFUOW95S1VTKzRxbDlwLzJxVmJqSGV2Mmk1K1U2Rnp6UGVsMzVIV3Fublovd0QxMENmL0FEbWtUY3VLK085T0UyS3BDZkZLTGxxQUxubTA0VDRxbDlwTko5cGFwNWl0UzhadUtCTlZFM0pJcHd1c0NqbURVdWlYMHBSTWMxU0Z4eHpRTG5CbzVpb3BzdWk0Sys5SG41TlV6ZFovK3ZUZnRXS2wxQ3VWbDR6N2FCY1o3MVJhNTRwUHRKcWVaalNMNXVNVW4ybXFCdUQ3MGh1YzFQTXg4cG9DNTU2MG4yakE2MW4vQUduM3ByWFlYMW81aHFQa2FIMmdBL2VwclhIUFhpcy8rMEZVL2VxR1RWb3dNc3kwdmFENUdhalhmMHByWGZGWWQxNGppZy9pV3MrNDhhUXB6NWcrbFpTclJqdXpSVXBNNmhyMzNGUXphaXNZeVdyaTczNGh3b0crZGZ6cm5kZCtKWUlJRW1QcFhMVXpDbEJYYk9pbGdhczNaSTlEMUR4aERhS1R2WGl1UThTL0ZxRzAzZlBuYUQwTmVZK0kvaUtRR3pJUWZyWG5maWI0aVNYRWpCR1ppYzk2OFRFOFIwbzZRUFp3L0R0YWVzbG9la2VMdmpndzNCWDI4SHZYbjJxZkZlNjFHZHRzamJmclhEWDl6YzZwS2R6RWozTmFIaC9Td0dYY2M4OUNhK2R4bkVGV1M5MCtod2ZEbEZQM3pVdXRldkw5R2JMWVBUM3JuOVFudWlHTE0zUFhOZHhhMnNNRnVOMjJzUFh6Q0pHMmJmV3ZubzVuWG5MVnMrZy9zM0RRalpJODkxYTl1Y241bXJJbjFPYzdsWmorTmRack50dkh5cnkxYzdOcDdBbktqNjE3RkhFVGF1enhjUmhvS1dpTTB0NWgrWW5OS2xzem43cC9LdENEVEdrYjd2ZXJ5NlhzL2h6V2tzUVpSd3FhMk1QN0l4R1A1MVBiMlBIekgvNjFhTTJtdEdSbWdwR3E0MjFMcnlzTDZyRytwVE1Pd2ZLYUUrWnVUK0ZUenhyR1ByMHFLM3QvTmFvOXN5dnE2dm9TVzBmN3oxclZ0Yk1oYzgvNFUvVGRNVkl3MzhWWG5nekI4dkZjdFRGWDBPcW5ocks3TWZVU3BiSE83MXFvaENuMyt0VDNpc3JZYnRWZU9NcSs1alRqVXVyayt6TFZ0akh6WVpmclRaeXBIV29qSVI4dmI2VWdpTGMvaldjcGFqalRLenhOTEo2RE5EUjRZNDZWY1cyMzBTd01vNjFMcjZtOGFKUTJzZTM0bW5uYmlueVFOdU8xVDgxQzJ6ajd5MW5LcWF4cG9xdTJ3LzRDaXJBczJCKzdSV2Z0RVBrUDBnL3RSQU90SDlxcDYxNUFueFVqY2NTZm1hZi9BTUxOUnNmdnYxcjk0Y2JINHp5czlkR3JMajcxT2JXSXgvRTFlT1MvRkdOZitXMlB4cU9UNHB3Z1o4NXZ6cEJ5czltT3R4aitJMEhYb3d2VVY0ako4VlkxSCt1Ym4zcU0vRmlQL25veC9Ha1VxYlBjRjhSSUQxb1BpR005NjhMYjRzUmtmZWFtajRycm5HNC9uVXRvcjJMUGR6NGlYMXBIMTlmV3ZEaytLMkI5NWpUMitLZVZ5V1lWbTVSVzdOWTAyZTNmOEpGR2Y0cWtYWG95TTdxOE5UNHBveCsrMzBxekg4VkZVYmQzNDFuS3RUWFV2Mk1qMm4rM1ZQZWorMjF4WGpjWHhLYVZ2bGZpckgvQ2Z5REh6Vnl5eHRLTzdObzRHcExhSjY0TmJVZldtdHJxNSs5WGxzUGk2U2I3ell6VUdvZU1tZ1RKYXVTZWNVSTlUc2hrOWVXdGoxU2J4TkRGL0hWTzQ4Ynd4WncySzhlbjhjU1RPM3pmaG1zblUvR3pwSDk3cjJyam5uOUJkVHBqa2RkOUQyaWY0aHdyL0hWV1g0a0tPalY0SGZlUDVrUERNS2hYeDVOSkZ3NXJncmNSd2l2ZE95aHc5VWU1N2pkZkUzYU9HR2ZwV1RjL0V1U2MvZXJ5WmZFazBveHV5ZnJRZGJrWkQ4eHJ4Ni9FOHJXaWV2UjRaanZNNzdWdmlZWTQyK2V1UjFMNHVQdWJFbnQxcms5YXYzYnY4dGN6ZDNMZWFTQVcrbGNQOXI0bXJzZG45azRla2QrZmlkSkszK3NKQjdWTGIrSnBOUlhkbjlLODl0QzhqZmR3YzhWdmFXN3hwOHgrYXZQeFZTdlUzWjZPSCtyMGxzYXVxcVprWm5QSkhGY2pxeFZaMngrT2E2T2Rta2l4M0kvS3N1WHc0MGo3bUo1OXF3bzBiYXpaZGJHcTFvR0hGUHVPRkZYTFM2ZUNSZXZCeldwYitHMWpPY0U0OWFXWFNzL2RXdW1VWWJIR3E4OXlyZDZ4TklvMnNhcVNTbVhsanpWeVRTSFg4UFNvNWJCcENPcFgwcVkwNHJZMmpWY3RHVUo0Vm1qNmREVkdXd1ZtUEg1MXV5V1RLUGxYaW9KclF4L2VYNlZxcWlpckl6bHE3R010ajVCNmU5R1YybXJkMUZqamsxQWxrWFBDbW81MTFOWXgwc1o5NGZNNHh4VlVXakZ6L25GYlkwbGkzM2NVOWRIK1k3djVVZTNTUWV3dnFjKzJudEllZW4xcXpiMlFpSUlYTFZzUHBlRnpqN3RNanNnclZ6eXhBL1lXZHlTd1JTcWc0LzhBcjB0L0lrZTFWSHpkZmFsRUJiOFBTbkxac3g1Rzc4SzUzVlY3blJHbTdXUmkzRVhtdDc1cG9zOTQ2VnVuU2ZOUCtyYjhxa2kwaG8yKzdROFFyYUFzTzJ6Q0drbjJwb3NDVDh1TUN1cWkwZVNZZmRKL0NrbDhOVDdNckcyS3grdEx1YXJDbk53V2VDZDIyckVHbkNja1kvS3RXRHd2Y1N5YmZMYnI2VnVhZDRZZTFUbE10NlZsVXhDWFUxaGg5RGt6b2l4SUN5ajFGVXJxeXhKOG9yMEc5OFB0TEY4c2VTZXZGVVpQQ2t6THhDZnlxYWVJVnJzMDloZlJIQnlSN1d4UlhheWVDSm53eGpiOEZvclg2eER1VjlWZlF4SWZHOXdmNG1xd3ZqcTRWZnZmclhQeE5iaFB2SHIwcXhtM0o2ay9qWDdrOHd1Zmphd0xOWnZHOXhJdjNteDdVeHZHRXpqN3pmV3MrTklENi9TcFk3V0VtczVZOHFPQVplaThWVE5qNW1xMUhya3o0dzNXalRkT3Q1aCtGYW45bVdzYXJYSFBNN0hSSExXeXJEZHpUY2xqVnFBeU8zSmFyMXZaVzZJS3VXeVdxSG12UHFadkxvZGxMS1YxSUxWQS93Q1ZhRWRyaVBvYW5zM3MxT1d4ejcxcFJ6MlU0MmpGZVJYemFzOUludFlmSzZNVmRtRFBGdFdpemdhYzg3dmF1aWFLei92Y1lxUzF0N05lakxYSExIWWhvN280UENwbGV3dC9KalVCU2F2SVdidDBxNVp5V3NmTE5VeGtnbUI4dlBXdk1xUEV6ZlU3SWZWb0xRaFoyV0pjSEhGWk91VDdMVTVhdDV2Szh2MWF1ZjhBRWx0bUpteGlzNDRXdEo2dGxmV3FmMlVZMXJkYjNKTE5VOXhhTGN4NTUvR3E5dkJocTZqVHZEcmFoWkw4dU04RVZVc0pKTWw0cFcyT0R2TFpmTStWYXJ5UU1WMnFyWnoycjB3ZUFGWmY5WHo5S1NEd0doS1lYY1pNN2VQdlVPZ2w4VE9kVnBQWTg3amdrUDhBZTU2bXAxamtlUGFxdCtWZXYzSHdGdmJMZXpKRElxUWlZc3NpNHdlM1hyV1ovd0FJVEhiSERSbFQxd1Z4VTRlTkdyZjJiVHQyWVZLbFJmRmM4dXVORW11eDkxc0VlbE5qOERzRjNHTTQrbGV0UitGbzEvNVppcFp2REN5THRWUGx4emdWMFRpb0l4cHB6bHF6eUZOR1dDYmJqOEFLMk5NOE9mYXlPRCtJcnZGOENRTkp6SCtZclMwendhTFdYaER0eHdNVjVjY1hIbjVXZWxMRDJqYzRpMzhGRlI5M2QrRlQvd0RDR0ZsKzcrbGVvVzNoaFhkRnhqY1FNNDZWM1d2L0FBUnMvQ09pSFVMcTRqa3NvNC9Oa21MQlZVWXpnZlgzcmx6RE84TGc0cDFwYitWd280U2RWOHNGcWZPTW5nMXMvZHg3VTJMd0w1cU1XRFl6Z1Y2ME5NMGJVZEwxTkxObXZKdE5BbXVKSXdROEVicVNwS2s4Z1k2aXVIdmZIdGo0TWlsMU9TOHNyTzF0TFJwMVc3WlhtZHR1UXBqSFB6WndHNlY0RXVOY0M1OHROTi9najJhUERPS2t0clB0MU9adVBBeXBHeHh0K3BxdVBoN05Jak1zYkZZeHVZZ2ZkSHZYcEY5OFFQQXIrRU5RMW01dkpiT3h1Sm9yUUJOanMwampxVllaQUJIUmZhcXZpSDR6K0R2QzB1Z3JwK3RXR3FhVHJFY3RyTGQyeUF0S3d5eFhiM0lKQU9jY0NvcmNYUVZKMUlRNmFHdExodXZLYWcwNzN0cytpdjhBZjVIbm4vQ0J0SnRQOHFpdS9BQ3Q4dTEyL0NzZnh0KzB2YXdUYk5MbWltaDBlNmthU1h5ZHF0Q0NGS01NZmVHRHlDVjVyMmpRWTdQeFZwRm5xTmpJazluZVJMTEU2ZEdVak9SWGJnYzhoaWFmT2xaOVV5Y3d5R3RnNUpWVnZzZVF5L0RCM2wrVld4OUttZytGMGdYL0FGYkZ2cFh0VnQ0ZlFFcnNVNDVxL0I0Y2o2N1ZxNm1ZZG1jY2FLWFE4UWorRnNoSCtxYjhxdldId0h1dFNLN1ViNTJBQTV5U2E5dHMvRGtUUHRWVjVycjlHK0dsenFpMk54WnllV3RyZFJOS0ZJQlpkM1BYMnJuclpseVUzVWQybDJORkRtYWpvcjl6Z2ROLzRKOXlhZDRkbnVOVjh5YTR1SUcrend3dHRhQ1hBeHVCNmpudFhKNmwreDFwZGhxdHhhLzI5YXE4ZHNySWpITWhsQzVkU0IwNTRHY1Y5ZGZGM3hiL0FNSUw0YnZOYUlOMWN3cDVGdEU1WllwQy93QWlsdlU5ZWErVmZoMzhYNUk5Umprdk5Oc1JxMS9MY1MzMFVTdE96eUFqYmc5SXhqbmFlT3RmbitLNHNxd20zVGs3OW05bDMwNy9BTmJuMFdXNUxVeE5GMUxhTHRhOTdYNjYyWGM1L3dBUGZzdUxxdW1TWHNQMmo3TkVoSmRnTnhZZHR2b2VUVTNobjlubTFtUzZrdld2STRZNHcwWk50dGJjVDkwajgrYSt0L0IybFEydW5RM2orU3l4NG5Oc2taZVFCd0R0SFk5eDc0cnhIOXZQOXFIUmZobDRLaWttVWFHTGk5VVB0aVVrSnQ0VWc4cTVIUFB2V05QaXJHVG55Tis4M1pKSzkvNi9wRllYTEZpSzNzS01MMzY5ckhtM2lQNFRhUEJjckxwc3JTYWJnaVNmYVpCQVZBREZpQndNL2xtc2U1K0c4ZG5hZmFqOW1hMkxLZ2NTb2NzYzRIQlBQQjRySGgrQm54RjhXL0JqVmRVOExyZmVHaDRoQWp1N083Rys0bnR0MkhtaVluYnVZSHBqMnJpL0JQd0g4YS9CL3dDR091V00xbERxSCttMmQvYVhtcFRONXNRRWg4eFNCa3F4VURwZ2M5ZTFmUVlQTkswbWxVbDFWNytmbnRwODJ6cXJaUGhvMDVPTlJYVHNsMS9yMHVqMkRTZmgzREpEdThzZE00eDBxMC93NWhqWGEwZjZWMm1wYS9vUGd5TFQxYWRyaTZ1YmN5elJLQXpSa1l6Z0RuR0Q2ZGpWN1VacmQ1WkVWbDNSOE1vT1NoNE9ENkVaNlY3OUhFVXFyZkpKT3g4clZwMWFkbktMU2V4NTNiZUJMZFpHVll4dStsRTNncFZ5cUtNMTJVRUVYMm5kVnE1Z0FrUndveGpuQXBWcXNWc3pyd1VXNWU4anorUHdOSmNTQUZjZmhYUTZYOEpSUEVyR01jOXE2YXdzMXVKTnc5ZVJpdXcwS0JZWWdyQWNqUE5UVHhGOUxpeHE1WmFIbTBud3BqaHdubGM5VHhSWHFsMGtSSis2UG9LS1BhTHVjcW5ObjVQV254RmprSzdzMTBPaitNTGVZZ2ZlcmxZL2hoSkVRVlZ1dGRGNFkrSHMwdDNGR0ZZdEl3VWRlOWYwWlBEcEs5ejhnaldtOUR2ZkQxaStzMnJUVzlyTE5HbzVLclZlOXZJb1hQUldYamFlMWZlbjdLMzdKdW02ZjhKVWt1cmRKSm1oM096TDN4WDVnZjhBQlQzNHV3L0FMNDJYR242ZTZ4ODVaVjRBNjErZVVlTk1QVnpGNWVvdSt0bjN0dWZhMCtHNjBzTTY4WkwzVmQzNlhQU0xYeEMwVGJWeCtkVzI4VHlsQjhwT1BRVjgzZnNhZkhDKy9hRStOZWsrR2xabisyTU41SFBBNjErc0RmOEFCT1d6dlBDZHMwU3lKTTZaT1BwVythY1Y1ZGdxaXBWNzh6MTlFYzlESmNWT1BPbXJkSDNQaStQeGJMMkxESEhXcGw4VlRTdmordGZTbmlML0FJSjRqd3pwYzl4Tk5MdGlVdHlhK1QvRmZ4UzhIK0NmRzEzb3Q1ZUxITmFPVVB6anJXdUE0aXlyR08xR2QydDBSVXluTUthNXJhZDBkWHB1clRTdjk0KzlkWG9rSm5BTGJ1YTQzNFplTi9EbmpyeEZEcDFoZEpOTk13VkZVNUpyNkkvNFozMURSZFBpdURCSkpHeTV5cTEyMU1aZ296NVpUU1p6ZlZjWGE3VE9GajA5VDYvblZpQzFTTnVyWXJxWXZBakNVSTBicWUyUlV1cWVCSTlJVGZJNjdjODg5S0hqc0ZHM05KQ2poY1c5a3puN2EzVWZlTmFkbzBNTWY0ZGFmYjIrblRNUXN5c3k4SG10S0x3ekhkVy83dGxiSTZnMFN4bURXcVpjY0ppdG1qSUYvQzhuL3dCYXFuaVM1am5oVlZHZSthM1kvQnV4KzVxM0Y0RFM1R1dqYXZOeEdjWVdDOTA5TEM0R3RlN09iK0h2Z084K0lmaW0zMHl4UkZtbCtZbHpoVlVkVFhjZkVXMjBiNENhYkhxT29heG84ZWsyYXVsM0pmT1kyYWNBa1JvbzRQNG11by9aNDhNdzZGNHl1cmlTMVdaVnNwa1VNTWpjUmdIcUsrY3YyNXYrQ2Y4QTR6K00raE5hYVByVTBPand5eDNFTDZqY2t4Mjl4THhJR1hsbTZqQlBUQnI4dTRrNHVuTE1ZWUtsVTluVGF2SnJkSDIrUjVMaDZzWlZNUzFkYko3UHlYbnRZMWZCMzdjL2hiNGlhRHB0ajRjdXRETjVxOTdKREVib3I1a0hrNE1qTXZCRWJBamFTZWVmU3NMOXJIOXRuNGUrRi9oVGFhdnBPdXd2cWxxNFM0WFRHTWMwSitiZ25vcExLY2R5T3RmTkdpLzhHK1hqL3dBTlhlcVRheDQ4MGtYQzIwZ3NHMHg1V1l6RUlZdDQ2ckcyN0JZREk1clA4SGY4RVRQSFVtdHRvbmlyNG1hV1BDbXBTVHZJMmpadTdxZTRnWkZWbWp4a3huelcrZnR0T1JXMWJLY3RyVmZhU3hybEdObTAwL1YyZHUyaHZoOGRDbEc4S0d1dHJOZksvZGVocmVQZitDOU1HdWZEajdCb3VqWEZqcnRuQjVVRjhTcE83YU9YSFE1SU9jZHNVMzRBZjhGYXRaK01IaS93Zm91dExhM1Y1ZVhpV2swNmtvME1PVkJFaHhoczV5RDE0SXI0Vi9iMi9ZNDFUOWhYNHhXdmhYVU5jMC9YbDFMUzRkV3Q3MnlWbGpkSkN5bGNNQXdaV1JnY2dkajBOZWMrQVBGa21pNmxiM0VEeVF5d3lMSjVxdGpHRGtmclgzMkg0U3k2RkpZckJYMTFUdjVma2ZLeDRscU9Ud3VJcHh0cmZUVk4vaWoranlLMkR4QnNkYWZhd3FydHVYdHhXUDhBczhmRVd4K01Qd0c4TCtLb1ZXTk5ZMCtPY3J1M2JUakJHZnFEVy9xdXIydGpDMzNkMWZtbU00b3FjMHFjdDFvZTFoOHBXOFNXSFM0NXZtKzdpckxHSkFBdllZcm5vUEVMekx1UXJ0ejJxN2F5eVRJVzJuM3J3Wlo1UG11ajBYbHRsN3gwV2dvdDNyVm5IdCsvSW93Ty9OVC9BTFdIaCs0MVB3Zk5iMk1keG05ZUNLYTFlVm8wa1VOMnh3eHhuZzhZeldOWWVKb1BDK3RhVExOSkFrdDFkSkJBa3I3UE1rSjRBOTZwL3RjZkhpNGw4UytIL0NzMHR4WWFYOW8rMmFwZTJ0d3NKdDhLVmlEbGg5d3NjSEhKelh5ZkVPTWVMbkZTazFLT3EwZXZsdXQ3VzZuczhQNE9wVHhVWlVVbnUzcjI4dC9TM1UrZlBGL3h2dnZBSHdkczlQbjFYL2hJZFc4UkM4dDU1N0dQYmRhYkVXQzI2RmNvREd1Qms5QWNtdm5QV1BHVjk0c3ZkQWgxaWFJUzNFUDlrWHI3M1p4S3JIdU9DdUdYdDh0ZC93RHRJZURqNEZoMXZYTkpYVVk5TDB2UzQ3MmRvM1dOcFZjNTJBdmdNQ2VEanNUZ0d2SS9neDRwMHJ4aDRLZzFDVmRMczcrN21uYlRJQzBubVJQeVF2cVd5T3BPQ1NPd3IyTXF3dDhMOWFVZEc5N2EzYWJ0NVc3THQ4ajc3MmxDblVjYVh4TzcwODMyNmJwSGJhVHJseG9XdldkdmVYZVA5Tk9uQlRFMGlYTDlZNWl1Q1N3SUNrMWhueFRKcWVyYTNhemYycmM2WnA4KzVkT2doS20ydkhQek9wQTVKK1k0NmtjZTFjNzRadVlQQjNoV2J4UjRvbjFDM2pYVkdzN09ScmdzOXNjTDVqS0FjZHR3SXowT0s2clFmSHMzdzI4UHI0azB1WnBiRFVwb3J0WmtpQitaQXlzeFlmTXpZeVJrNXlhOUowUFo2Sk52YSt5YnZkcGVkaVpTY2s1UXRmOEFFMWJId3pwV3RheEpOTGVUV2VqNnBibXp0cmlSdk1kcm81dzNsZ2NKdTJnZ0RKTmZTWDdHM2lxZTcrRHR2cGQ1T1pkUThPeXRwOXdoR0hpMjlBd3lSMFByWHkxTHFOck40ZDAyeDhQMjAxenA5ak0ycXZlM0tnUjNVN1laNHVjRmNEYTIwK3YwcjFEOWtyNHgrSFBCSHhQOFJXV3BhMXAxaGFlS2d0L2FTeVNDRzBhVlBrZEl5MkFjY2NqcnRQTkZEMmlVb3dUdjAwMTA4dlRYNWVSNUdmVW5Wd25QTjM1ZGYwL0c1OVpXK3JySC9Eayt0V29kWWoyZlExeHVxZkZMd2hwc01jdHg0bTBLT09UaEdON0dBMzA1ckgxMzQrK0N0QnM0WnB2Rm1neFJYRzd5bU43SCs4d01uSFBZVm43U3UzWlJmM0h4Q3cwSHF6MCtMWFVEZWxiZmcvNGpqVGRidFlYdUxTUDdRK3hGdVp4RXNqZWdKeGsrMWZLUGlEL2dvWDhMZkNYaU45TnZ2RnRpdHdxZVlDbTZTTWdqUDNsQkg2MTV6OEkvamZmZjhGSHYya2ZDZWo2VHBOMXBQZ0h3NXFjZC9xZW9YQ3NxWEtxNDJLSDZEZGdnQ3U1WUhHdWpLcFZpNHdTdTI5RjVXdnZmeU12WllkejVHOWZMVm42SWZ0VFRhbE40ZHRyZlNMYTRtaDF4b2t1TGd5S3NWc3FnWVkveEFaUFlkcStPL3dCa3ZVTHZSZjJoUEZXbVhtcVhBdWJ5UjVKTFJaQTZ5U3F4MnpLZm9lZ1BldnNuOXNLNHRWOExhYm9PbjY5YTZZL2tzSW9HTzZXNDJBRWZONmRzbml2aXo5bjdVRThCK1BwcldPYWErMWhIbG5TNmtqUmZzMEJJTFNObmhnY0h1U1FhL041TldycGR1bnJkOTluNkgzL0Q5NVpYS0Z2aTh0Zkp0dlRwYlEvUkx3ZnJVbDFaMnJYWnVJWGhoV2VWbzMzdEd5SGhHT0JrZCtPbWErV2YyMGZEdmhYNGkvRWp3NnV1ZVRkTHFXc3A5bnNicE42WE13WlE4akVIN3ZiYjNOZlVIaERXck02cFoyc2QzSEpkYWhhL2FKSkVYL1IzWWdFNDdET1J4MXI1VjEzNFhhNTQwL2E5OENwcnh0N3JUTkwxNlNTSmcySG5ZbzBpc0FPd0s5T01ZclBCeXExS2tJODF0VzcrYVN0cjgveDNQRHlkUXAxcWxadmw1WU4yMmJWbnRwM1gzSDJkRDltbDBLM2poWGJwa2tjY2RxWXdQTGpJd2NEdmdjRGp2WERmSG40YTZOcW5nSFhKcjRXOGNWdkcxMnQ1Y2Z2SU5tMWVNWkhROXllOWVuaWMrR1lZNTVrc1JCSENHaVZtRVpqd1RsY0h2MHI1aC9hbCtKZDU0bDhiYXBhcXVuMzJqMlZva3hVM081RTN1dmxqeThGRHprZ0VZeU9lb3I2aXBqSzBLY1c3eWI2VzB0cjE3WDJ0cmF5UG1jc3dycjRpMEh5cGEzdjVyOGZ3djBQQS9qViswejRWOERlRTlOMUR3cnB4MXo3U1E5d0l2S1ZyYUp0eWlNZEFxak9TY2pwM3J4WDlvMzlyWHhWNGYxVFI3endscVVOcURkd3ZjSmVLem5WVXhsbExNRGpCSlRjdVJuRmZTV20vcy9lRDlNK0Ntb2F4NGhuMUhUOVU4U09uOXRLYlVIeUl3ektRQUVVUjVMcTJWWGJuc1FhODcvNFpCK0dtbGZGWFZOYXVOY3U5V2t0dE9oRVA5cTNxc3VtSUd6QThDckdpcm55MVVsaTI3ZG5xYTk3TGYzYytlcnAxWFZQeWV0bDExM1BwcWtzQTR1bENFcFd1bTlmTFZhYTJlaTdxejZucW53YStJRnY4WHZodnBIaWEyamEzWFZMZFp6QnUzR0ZqMVFuMUZkY3VwTEZIKzg3akZlVU40NitIUDdKY09uV09yYWgvd2l1ZzZzR3ZWTjdQOXBMM1cwZWFCc0JJVGdrNTY1d3VNR3NEUS8yenRGMW45b1BTZkIySUwyejhSVzBsMXAxL2JYa1hsT3FqS0x6aHR4QkIybm5qQTVyVjA2OVZ1Vk5PMnIrUzFldmw5NTRyb3hqN3kyL3pkajNXRFd2czc0MjllOWE5cDRoS3FEMDlxNVY3dkV1MHI5YXNHN1VLcThDdk9qaXBkeWFtSFQzUjFUZUlXa0hTaXNHMWRyaGZseWNVVlgxeVhjNS9xOFQ1b244QlFJZUl4K1hXdWwrRG53bFh4RjQvMCtMeWdVV1VPMlBRVjAwUGhMUDhPSzlrL1pVK0hKdXZFRFhYbEhnZ0FnZEsvZk00NHloRER6OW52Wm41emhlSFhHYWxQWkgwbjRmc1lmQ3Z3d2tqWGF1MkhHUHdyK2JyL2dzajRrYnhGKzFocksvTmlKc0Flbld2NlVOVjBzdFl0YXY5MWwyNE5mSWZ4OS80STZmRC93RGFEOFVYR3NhdHBzY2w1Y241cEY0SnI4THlEUDRZUE52cmxlRGtrbXRON3MrNGpUaFBCMWFEbnl1ZHRlbWgrY3YvQUFicC9zM040eCtNTjE0dXU0V2FHeElpaEpYanZrMS9RSnB0bkdMS05GQVpZMUE2VjgzL0FMSW43R1hoajlrWFFCcHVnMmNkckN2SEE1SjlTYTk4c3RSa2piOTIzSHRYTG0yYy93Qm9aaFZ4azAwcE95WFZKYkhMaUtFYWRHblFvdlNDMzd2ZHY3emgvd0JxdVQrd3ZoVnExd3VJOWx1N1p4NkthL2xpL2FxOGMzbW9mSHp4RGRKY1MvTmV2MzZmTlg5V1B4cThQTjhRL0FGOXBqTGxyaUprMm51Q01WK0RIN1lIL0JDcjRtM0h4UzFMVXZEOEVkMVkzMXdaRUJPQ21UWDBIQWVaWUhCWmhWcVl1YWlwUlNWOXR4NHFqWHI1WDdERDZ6NWs5N08xbnNZSC9CQ2J3VnFueFMvYWZXNmthYVd6MDRLU1dCWmNrbi9DdjZBUEVuaHF4c3RBaHQvS1VzSXhuajJyNHQvNEl5LzhFMzdqOWo3d0cwMnVSbzJ0WGhFa3pkZ2NkTSsxZmMvalMxV08xM013S3FPSzhuaWpPbGpjZFd4R0hmdWFSajZMcjgyWFRvK3hwVWNQTDRvcTh2VjYyK1d4ODEvRjNSNHZETVVseEZHdkNsZ0FPaHI0dS9hQytQZXFlSG9iaHR6TEN1ZUFlUWErNHZqVGRyTnB0eHR3ZmxQSUZmbHYrMjE0dmtzSTc1ZDJPV0FyNW5JYXVJeEdMalNsTnRYN24zMlVVY1A3R1U1eFdpUG4vd0NJUC9CUmZ4RjRiOFNQSGJYRW0xWFBmQXIxcndQL0FNRmJJZkRYZytOcnhpMHlnRHJrc2U5Zm5yOFE5U2E4MTJjdG5KYlAxcms5VXZKQ20zY2RvNkQwcittc053emg2bEdFZFUrdXU1K1I1aHhOVWhpYWk1VTRyUmFiSDcyZnNoL3RpNmQrMFZwS1RKTXFOdHlSa1Y5SWVFMmoxaFdrM1JpTlZKeWZRVi9PNyt6SCsxdnIzd0p2dHRqTzNrUHd5NXI2dDB6L0FJTEIrSXRCOE95VzhlN3pwa0txMjdvSy9POCs0VHptbmlaTEMrOURwcitaOUxnTTB5akZZZFRuTlFuMVRSK3hmd1g4Y2FYNG8rSTk5b09uMjhPcWFsRGFQT0kvTUNLdU1jc2NIYU05OFY3RjQzdUxIUlBodzFuckZ4WjJQblFJMDkxY1JscmVOVndDR2JJempKSFVaeG12emQvNE4wZmlscXZ4cjhXZkdMeFJxVnViNjdWTEd6am1ZN2hicklMZ2xRdnZ0QlAwRmZxQjhSUEJtbCtOL0FVT242NnZrMmx4Y3BiZnV4ODB1N0lDQUhnSFBmdGl2ejNNc0RpTU5qcWxIUjFJSkozMFdxVGF2MDBiMS9JMXFWc081UWNHL1p0cDNXL3FsK24zbnh2NG8rTTJpK0V2aXByVnZIYlM2OHQwOXZMQVlyd1dNRDJwK1F6bVJqdTJCc3J0WG5nbm5JckQvWmIvQUdnTkI4ZkhYTlUxTFU3ZTNrdDd5N3RiQVE3UXNkdUFpdGlUTzdMRTV5Y1oyZ0RuRld2aTUvd1NUMG05dXZFdW54NjllV245cFJDUFROVWhNa2wvYVJuOTRWa2xEWWI1aUZVRUFiVVhqam5sYmo5aFRSZEYxM1E5SnQ3ZlZOTzhNckQ1R3JhaFpSS0h1RzJMR3p5eXFNaVFNeFlIakJZbm50MmV5U2lxU2tsTG0ydHAzYnZkL2kvWGMra2pVeXlwQ1NVbTd4V3R0ZEYyYnRyNUx1ZkNQL0JkVDR6K0FmalBvdW55YVRvbHZiK0l0THVJNFliK1JIUzh1YmY1L01aeDBDbVE5RHlDT090Zm0zcGVxRzFJalhuZWZtOXg2Vis0SDdSdi9CSkg0VitMdkZyUjZqYTY1YTZiSEV0c3Q1SHJUU1hkeVdKQ3V5eUJ2bUJBeGpnazhpdmtxUDhBNElDNnRyZmkyOWowenhkTkZwZGkzblhIbjZlWG10SUhPSW5KQkFiNXV1T3d6NjEreGNLOFVaVmg4RXNIV3F1NnU5VTdmSzE5T3ArYmNSNURpc1JpL3JPQ2g3bGt0MWYxZCt2L0FBRFEvd0NDVm4vQlVQUS9ncjRHdXZCUGo2Ni9zL1E3VW1iVEwwcTBubHV4RzZNaFFjTDFJUDFyNnQ4UmY4Rk1mZ2pkWERLdmppd0pRQS82dVRhY2pQQjIxOGZhci93UW0xRHdmNGdTSFZ2aU5ZVGFEZU82MjE1WTZaSk16Y2xWYVJOMzd0Y2xjc2VPVHp4V1IrMVIvd0FFVWRSK0FYd2dmeFZvZmpiVC9FVnhZb3B1OUtraU52TklNNGVTSXNlVkdjN1NNZ0RxYThYSFpWd3ZtR05kU09KY1pTZXkydS9WZGZ1T3pEWXpQY0pRaW5oMUpXMGIzc3VtajNYM24yZFlmOEZYL2daWld6WjhWTXhSU2NMWnlrbkI2ZmRxdnF2L0FBVzUrREhodlNXYXkvdDdXTHJCMjI4Tm9ZeVQ5V3dPYS9GMncxS0dPYWFNSXE0R2NrNHIzRDltZjQwL0QvNFphbmNYV3FlRS93QzNMNmJUL3M5bzk0eVBEYlhCT2ZOQ2tZT0FPQWE2c1o0ZFpiaHFicXhqVXFOZEU0cS96c2lNdjRteFdOcXFsTndwcDlYZi9NL1M3OWg3eDM4U1ArQ2cvd0MwNXBIamJYdkROenBYd3Y4QUJMUzNWdkFvQ3ROTTJSRzNKRzVoNmo1UWE2VC9BSUtCL0VSZmo5b0dvYWQ0Wll3WDczc3l6d1hjbTY0QXRnZk0ya0g1UUNRTnZVa1pyeSt3L3dDQ3NsbDRSK0R1b1E2VHExcFozVXVueHJaUTZSYStTRWRseDVPMDhIRFpKSTRIVVY1U1BGdi9BQW1WeHFPcytIYjcrelo5U3R6ZmF0cXR6ZXBITEROOHJPSXl4NGNuT1FPU1NldGZtZU13RmF2aklZbWRMMk1hZWtWWjh0MDkyM3E5OVh1M29mck9SWU40WnpxT2FsSldzMCtqOHR0WHQ2SFhlQ2ZFVTM3UmorRjlWOGJRNlByV2s2TFp5YWJlTHF1KzN0ZE9jUmxJcEFpNE0yM0NzYzR3VkhIV3ZQZmhab1UzaXp4bDRndkxxNDAvVkxYVFNsb0RZV3BpWGVydW5taVJSbkczbjVjQTk2NTd3MzRGdnROK0tlaCtIWDFxSFVORCtJMDhiWE5yTnF4dVlMVlVkaTF3Nm9RRkxnbkFPRHlhK3QvMkJ2Z3piNmQrMjNvZWsrSDdpMTAvd0hvODk5RmVhYWhFMGN6NFh6RkxNdnpBNFFjazR5UU1aTmVwaXZaNGFFcVVaKzdKTngwc29xL3ZLK3JUYlhMb2tySzkrKzZ4U1hQWGpDM0p1cjcyMjJWcldkK3JQUDhBNFFmczBlSVBFMmgrSll2RTJpczNoTzFDcG9jMGxxWllJMmlKK1hlUm56R0J3TWpEWlBKckQxMzlsMzRsU2FqcFBoeUhSZFMwVFM0VW5saDhpRkhEUmNmZFk4N2lSako2WXpYN0IvRUx4TDRSMERWN094OFJXTU9qNmZDeGh0WXJpMVVlWVFTVzJBWkhQeTQ0NHhuaXZqLzR2L3RsNmY0UjhSZUtwUENmaDJTOE9qWHNjK21RdE03bTl0MnlyTEdtUVFwSkp3cHdjWnhYay9YVTZqblNrcE4yVnQwcFdzNVdlM3E5M2RuQmwrY1l1c21xZERTMTd0Nld2b2sxYjUydWZPbndzL1pEOFZlRGJQVUladkRzeTJPVWx2NzZlV0s0dkxlVXRrZVdBeEFiYU9WNjlPTVZuL0gzL2dubDRrK0xQZ0N5YnhicUZuYXo2ZVhoZzhzZmFaSm9XK1pEaU1iVUhKNkVuT2Z4OXUrQ1A3VW12ZkVYU1A3ZStKMW5wbmdEd3BiYWdtcXpYV24zMXRGYzNzTExpT0o0MWJlZCtHQnhoaHhuR1JtTFVQMjRQREdtdk5EZUxJM2duVWJkNHJIVkVra1NGWm9uM2VXZWhMTHp5cEkvZUFFbXByWXJIWWZFKzJ3cTVwcDdyVnBwZExYVHZ0WmZjYnhuWHhNWFN4RUZ5OVZiUnA3clY3OWY4am52MmEvMktkTCtEZnc1MGJRVjhMK0NaZGUrd091b1gxK2tzOTVjeU94a2dkQXdaQ05tQXd3cEJRNHpYYTZSK3pKY2F0Wnkvd0RFaDhFNlhmYWRMSk5CcWtPbXJLOE1VcVlrY3hzY0ZpVXdNTXYzV1Bldk5QMlkvd0JwTHhWOFVQSFdnM2xxc05qb1Z1Ryt3V3MrbnRHK3MyOGJrdjVrN2dpTXBrNVlGUmhUMzVxVDlxRDlzanhicXZpYUdQdzNaTmVYMmkzbDFkU2FZMGNrUDJpMVNORjZmZElETXhHY24wUFBPbUtsaWErSi9mWDU1YnR5YVNlcmFiZWkxMGR0T2pzY3RISzUwWit3b2N2S2xkV1Y5T2xsMVQ2YnBlZHJIbEh4VC9aSmZ3bjR5aDhhZkVhSFM1b05VdVZTYThnMDVmc2wxSHdxT3E1M3BKakJZRmVDRHpYMFA4Q2Yya3RJOEJhaGE2UHB0dnB0ajRSbXRKM01scWlxWjFoSFVZSHEyTVl5Y212blB4WDhlZkZQaVJyT3g4UTYrbXFhZmZOOXBOakpQdnRyU1FrSUVqYm5jM0dDTTRPQ2E3YnhWOEVFZzEvd3hkZUc0NXJPNm0wN0t4eklYdHpOS0NTZ3lkbzQ1elhIbk1wMTBxZUxtN1dkdGZkVmx0OG4xMnQwUG9zSGdjTXFYTFZpdVozdTByZlAxdCtKWS9haytQM2lQNHkvSG5TYnkxV2FQU1dFR2pXdzgzeTFpVnNqelFxNUxLQURuZGdtdWwrQVVlbTZwNCswdldOUzFDODF5MTBmV0Vna2d0NDlxWGtRVmdkb1BPRmJid2V0WkdsL0NEVmZBZW82Zll0ZldrTjk0aHdaSlZWSmZLa1RCTzBrRVp3NTlxOUMvWlUrQlhpSDRRK0t2c04xSGFhaGJ0TTBxU3hrU05BR2x5ZUJnQWhlNTRHYThQRjRpaXNQeTAydWFLc3U4dTcxNjMvelBZclZLTkxEZXpnL2RVYkpiYWJiL3dCZmVmYjN3VDE5Ulp5WGpTUjNEdzM4NWs4eVB5Ukg4d3l1T2d3TUtNY2NWM0YzOE90SHUvSCtpYXhMYVd3bXNaV3ZJSmxjS3psa1pPY2ovYS9IRk84UGFGWlE2V0Zra2p0MndHM1BIOHFodVFDUFUrdnZWN3d5WWRaRXRqZHlSeHBheDUzdWd4anQ4emRqeitWZVRsOHF0SnFFMG01UFM5dDEzN0g0L2pLeW5PVlNtM0ZhcDc3UFRRbThRNmRwZXMrRHJxNjFaa2V4bVVrL3UvM2lZQnhnanJrajlSWHh2cjM3U2ZnLzRmOEF4R3Z2Qk50ZlhVdDFjUUcyaFJiTnAxdEdVa2dUeUhCWWtnQUtNREFBejNyNit2cmFQd2Y4Tk5Vc3RQOEFzNHZvN2FTZEVtbExlYVdadVIxKzd3TUx3UGF2eW0rTjExNG8rRkh4WDhTV202YTF1UEZkdkRJazhTK2E4Y29VbVF1VHlrWVpzbkh6YzQ2Y0Qzb1ZKU3J4dzdsYjNHOTliMzd2ZTJydDVNOXJoakxxT0toV2RSdDJmdXE5dXExdFo3ZVc1dC90R2Z0MTYxOFRiS2JRby9zZWdwb1Z1cVBMSEpHeTZveXArK0tid0c0eUI1WXp6enVPSytJUEgzL0JSenhONEwxNjRsOE02MVk2a1ZzWHNSY21IWjVmbUw4K3hjWTRCeDA2anJpbWVNZE84UVBiYUhlWGx4WXl3ckxkd0pmM0cxR2FkbUN2STdPUUZqQy9kNENyanAxcjVTOGE2UFoyZXQzTFdkMHN2MmM0M29nS1ROL0VjamovQVBYWDdGd3p3L2hxNzVzUytlM3pWMDJucnV0bHAwMXVqajRteFU4dG84dURTamR0ZkpyZnJmcWEvd0FVZmpscm54Tm1oR3BhcGMzbHNaak9zTHRoRmMrM1N1aS9aSitNRjU0WS9hbCtIbDlldEJkVzFuck5yR3NWMGN3eGd1RTNZQkdNWkJ5TzRyeHU5bWFlYjVzc0FjbkhBL3owcCtnMzB1azZyWTNVWlVUVzh5eklTTzZuSVA2VitseXl1ajlXZENNVWswMXQzUitSenpmRXp4SHRweWJkMDM4aitsVzRpZ2wvZWZLTnd6MHB0cDlsbG5VTXU3bkJPT2xjUDhKUGlURDQwK0UvaDdXdHdaTlMwMkM0QlU4RXRHQ2NmaldwYWVJeGQzd0NqYnlNYzEvTGtveWhKeGU2MFAxNk1PYUtrajBTRzN0N1cxVmwycXRGYzYvaVg3TmJJcCtZOTgwVnl1VHVUN0ZoRm9Dbi93RFZYMGgremg0ZWkwSFJJNU5vM1lCL1N2RDlCMDc3ZnFFY2Y5NWhuaXZwZndIcG8wVHczSGxmdkFZRmV0V3g4cFJ2YzhQRlI1WThwME56Wk5xOHJTYlNNZFBhcUYzNTJuU2hQbUhhdGJ3OXFpeTdrSS9PcTNpR2RmT09CODJhOFd2eWNpcXA2bkRUNWxMa2V4bjNEWmpWc2M0OUt0YVJLMEw3c0hiVVBtTzBXNWw0SFExcDJOeEViQXRqRzNqOGFWTmMwNzM2RGxKcU5pb2J4djdRVnRvS2s5NnYzNldXcFJxcGhSbVBYSUhGWWtsNFpaU0Y1MmswMUxuN0pJck13K1huT2F3aGlMTjgyekxsUnZhMjVySFNGVlY4dGRpcjBDMWhlUGJsSmJOMDNmTUJpdEc0OFdMRkh4MzdnMTU3NDAxdG1uZG1mSFhnZDZXS3hOTlI1WWEzTk1QaDV1ZDJlSy9ITFdmN0NodUY4ekdWT0I2bXZ5bi9BRzh2RWJTaThtazI4c2VCWDZLL3RUZUlkcXpTK2NjQlNNRHJubXZ5ci9iVzhaTHFMVFFodjRpR1ByWHM4QzRkMU13alphWFAwQlUvWTVaT285N0h4YjRxdnZ0MnJ5TjJ6V1JOQ3M2dG5yVmpXZHd1NUcvMnZ6cWpMSjh4L3dBNHIrc3FNTFJTUi9PTmR1VW5LZlZrOXBBTFk1cXo5cVpueXpIL0FBcW1zaEtVQmppdEpLKzV6eHB0YXBuN3hmOEFCc0JvK2o2Zit5WDQwMWJUN3k5bTFhKzE5SU5VaG1oVlliZnk0eDVYbHNEbGdWZkp6akI0RmZwOURkV2Y5b2FiWjZqSkcwalhUVDI2bGR4SjJsaTV4bkdCL092emIvNE5uSTVKZjJBTlNtanM3QzEzZUpwNGhKRkdmT3ZDcVJIZEllY2tGdG94Z0FBVitpWGhpSjcvQU1TMnRqNWtzVTJueHRQY0Fya0ZlY0JXYkpKSGYycitXT0xLei90M0VKSzk1MjliTmFicm9yK1Z1cCtuWUttdnFrSGZhSy9JbnNmREZ2OEFEbmZIOW5qbXRaSlpya1JxN1NNdTVtWVpaaWNjazhlL0hwV05lYUN5K0ZyNnk4UHdOY2FsZFR4M0cyL2JOdkJNeUFnRWNaVWdaSTZkUHBYUWVMTmJuaDBkcjYza1pEQXpmS3lsUTIwbkJZa1pKR1JnRDFxanJYaldQVVBEOXRxVGZhbWt2Ryt6eHh2RVZaVVpSaHlvNjRJQTc5UnpYeXM4YzNWbkJQWlhWN0wzWlcyZnk3UDhqc3BSbTRxYlY5ZGQ3WFdxdXY4QWduai9BTVZKbzlRMHVTUFc3YzNWdERMSERQdmdRd1JaYlprNElJVmdSeUQ4cDV5QUs0ZnhGREQ0SXZQN0xzN1U2WEZiV0U4S1c0bEhteUJSdkpadHhFakxrNVpTY2p0eml2UlBGK2wzWHhHWFM3UzEwYTNsWFdra3Q3aWVjZ1NRd3JMM2lqeURuNWp1eVNBUjZWNVA4ZlBBL3dEd2pYZ0s1MHZhZGYxK05ZNXJTVHpneldvRDdOcWJ2bUVKakJEQTVQVDYxNUZHV0l0KytsdTA3OTFaNmZsMWFQc2NHcVRjYVhXNzA3ZEw3MlZ0ZDdQdDUrSGZFcjRuYWxacEhCREREcDE3cVY0OGtZMjdZVnRJMXhNVEcrU29PemduK0lqQTlmbi9BUGFDK0tlcE44UHY3SThZVyt1M1ZpczF6WmFZYkdJTE5lM0RSRlBKa3lkeUpFeFJoa2ZNRkFyM240amVEdFY4VmZERFZQRVhqUzFodGRRdFpIdHROVjJXTklvbllMSkt6TDgwcmZLQnNiNWNPVzR4WGpmaWxsL1orOElhOTRydUlaR3NkZWEzaDArNnVuV1o3QzZnUU01U0laWlMvWnllUVJYMTJTMDRRcXEzdlNXdHVyZDlrMWZvL1ByMXN6NmFxcVR3OW9XdmR4YjBhVDhuMTBmVFhlMXo4aGZHZWczWGd6eGZmV0VzVExOYlNzQ2pMeU9lUVI2aXJIZ2p3RHIzak8vRnZwT202aGZUTVZYRU1MT1BtT09UMEhKNzE3VjQrOGErRWRSL2FNMURYL0dVRStxV21yQjU3LzdLemVZMXd4M0hoaU5wNUdSMjNWOUZmRDMvQUlLZmVBdmhSWjd0RDhQVzhiVzhhSkRBTlBFWWtLQWJkM1BxT2VlU005Ni9wREhaN21GUEQwM2hNSzZrNUpYZDdKUCt2US9uekQ1RGdYaXFzY1Rpb3dqRnV5M2JWemovQUlIZjhFdi9BQjVxRCtHOVV2cmUxV080WXlYdG5MTnNtdFlGZmE1Mjlja1p4NzE5VWVCUGdycDFoR3VsMm4rajJGblp4cWxvYkxOOWVUcktkMGFzY2dNeTRKWmhuTmVSWEgvQmEzdy9jYTI5MU40UDFSdnR4UTNxd3pSeCtZQU9RaC9oR1RtdVE4WS84RnFkYTFUWFpKdEQ4SjZUWngyb0J0WHVCdW5pUEh6Ymx4ODNINDErWTVoay9GT2ExTDRpbFpMWlhTVy9yMDZNL1FzRHhKa1dXMHZaMGFxMXR0ZHY4dXZ5N24xcG9YN0tVMXo4U3BOYXZOTnQ5RjB1enVZR3RXZ2NTTTBZUXF6VFlCSmszWU9CaGV0ZlRIN0NYd2NzL0JYN1JNMGQxYWYyVXRuYXZkMlRLeTc3cVNaam01WDFadUJ0T01CZVBXdng3dnYrQ3V2eE92ZE52dFB0NDlMdGJQVUovdE55bmtGbW5jTVc1Skp3TW5vTUN2ckwvZ2ozKzNUOFJ2Mml2MmhFOE0rSTlXVzRhL3R6OW1kWW83ZjdJcThoZ1FQdXF1Qmozcnc4NDRQem5CWU9XTnhITEpRajhOM2RwZkxmNTlUYW54Ymc4d2xMQ1VKUDNrOWJXU1NXOTcrdmU1K2gzN1oyb1hIaVB4RnAra1gxK1liaFU4aXk4MU4yWkpOd1k1eGpJRzBjSEhOZm4vOEFFOTlVOEE2aHAvZ1dPSCt6Wk5IbGRydTVXM00xcklWa1FMTTdmZmRjUmpoTVlQZmsxK2gzN1cvampTL0JMV2R4cUdzM1dpMzJsMnQ1TGJvMW9sdzkzTEdCRzhuM1cyZmZ5cEI0eG50eDhHL0dyVFArRnorQ3ZCL2lMd3ZKcjAxM1pRU3dhdEJiMjI5bmdjSFlIY3NxY0VJU0NjOVQ5Zmk4anB6cDE1S28zWnZkN1hTOTNYcjJQc01ucmN1RXB2bHRIOWJ5MTJ0YTNycXp5bjQvRFRkYXM3clNOQmgwMit0N2U1MzZoSkZNWXJXS1ptK2Z5aVN4MklvWEdDUU1uMHIwTHg1cXNHaGZCaU8rdFZoYlJmRHVtdVpOTHZTVEVKWm5DTk1xbmEwa2JiYzdnQ1EzdFhubW1RM3ZpTHd4RDR5OFRhQmEyR242b2dzOU5zN2N4eVc5djVFWkNPMFM4bmQ1SkRNVHljNXptc2pYTFRWSmZoQnFWNXIyb1c5cnFEVHhUNmMrNEdKOU9abldTSlRuNVNYVE9HSEJ3TTVOZlpleDV1V2szcEdXdG51M1pQYTZkbnZaYWVaM1NqRnFNdXZucXIyK1Z2MCs4ME5LOE1XMnIvQktEeFpGcUdyWDNoK3cxV0UzbHFCcyt6enp4dVpBclNiVHRHRk9NNHgxNU5hdW5YdWkrRmpwbDVEZDYzNDQ4VjNsbEw1VWQxZXJOOXU4MEp0WGJIa3FjWUFVa0VGZStSV1Q4UlBHZWorSkp0RDBuU2RRaHVyNjg4aUpyT1dIRW1ycDVoS2J3bnlrZ050NTZnWUpwM3hDOENXUHdhc2ZHbWtlSDV0WWpYV1B1WGtrSWhrdHBJMkJLSWgrYU1aWmdvNEJJeU9SVlN0TktFK1pjejIydXIyZDNaZDI5RjczcnRkT011Zm81SytuYmIvaDl4UERENmg0eCtHVTJxYW8wa2k2aExOSHBlbDJkaXMxNXBrY1QrYXJEZnREQkhDS0NNbmI1bWM1cjdVK0JIaHU2MUR3RG8rcTYxcTFucWVvV29XYTJTMnQzOHRtMllSdGg0SHl0enQ0NTRyNHg4RzZYb1BoMzRiWEY3REpxSTE2YlJidTN0N2w1eE5kV2x1MkVrM3hxY29YWnMvT0FjWngwcUg5bTM5c0tUOWwvd0NHOXRxL2liV3RVdXRPWFZsMG1PM2VJUGJRd0ltRkNqTzVoaHNuQTR3S3h4bVgxTWZHVWFFZFl5c2xiVjMzU3Rmb3RlNy9BQjhyTW91aEQyc255eDF1NzZhZCszWS9TRFhmRGllSi9EdHRjTmJXc3kyckxlUGRpTGJJVDh1SStPUUdQcFY3eFZxdW9hL0xiMjlqSzJrNnROS3BqK3lRQXd4cVR1MmtNdlRiazU1cjRVOFJmOEZ2UGh6NGx1NDlJVzQxNnowV3p1NEpFdWphZ1NNdWN5cnNVNDJxQUF2UGZvTVYxZXRmOEZ6UGhkNGgwRFZiRzhieFRIOW5qaGZUUDdQdEFyelNEYnd6RnNBS2M1eGpJK3VLOG1YQk9hS1grN1QwOHUvK1I4cXM2d3RvdDFvUFYvYVR0OHZ2MFB2THdENHQxRHc2bG5wMGVwQy9tZTdpbXVMcWM3bDhrakM1NEFHY0hnRHFLdGZ0Vi90S2o5bjM5bHZ4RjQza21qKzNhUmJsNFduT1kzbFlnS0N2SEdDZU0xK2Z1ay84RnJ2aDNhK0hkVnVMelRmRXVwYWhERE11bmFYSFovdk9TcFNTU1U3VjJoZDJBY2tkUjFyekt3OGYvRmovQUlLOWZGL1MvRC85bDMzaDM0WGFIZVJUYXBZTmVlU2pKdU9Xa01uK3NsMjhCY0VEMDV6V21BNFR4OGF5cjVpdlowWTd1VFMrU1QzYjJWdXIrUno0akU0YWNrcURVNWIyWFh2ZHJSTHVmcVg0QytLbC93REhEOWorejhYWGVteHo2cGRhUkRxbG5ZbVR5bzJMU0s2S3hYTGJjS0NSbm5IV3Z6KytKbmo2NS9hWThiM09vWE4wVDRnMDI1bXREYXhvYmRJbWdUekVreTNCM0tjZmU0RVorWEJyOUE3ZTM4TS9DYjRYeStFYlBVcERwK2o2UEJIYVJ6M1NyNXNTeHJHQUNNSCtCamdaSnljY1YrU2Z4MitMbXBlT1AybUwvd0FJYVRhYTc0ZCt5ck5iT1hpOGhOVWRtWlJDRzNZYmRHR0c5dm02Z2UvSmxXRm5pOFhWOWtyUlNiVHZxbGQ2dnZwN3FWNzlkajZUSTYxS2hDU2FTbEpybGJ1a2sxZTNrdEwzMDEwdVZmRnZoTFZmaUQ0TzFiVmRVMFJ0RXRiRVNSVzFzSjFhNHUxa1F0SklGWDVZMElCT0R3Um5CNHI0ditLbWhMYTZyZnhpWm9WV2Y3UkRaVzBROHUzK1VCdHg2OU1kNit1Ymp4VDRuOElhUHFGaXVvVyttNjdhM0MyOFVhazNFMXJBaWxaVlpXVXFEMUE1SkpUcDBOZlAzeHkrSFZ6TGNUYWxkUE1zR28ycVhFTThsd3pUWFlBQy9Obmt0bms1OVBhdjFuaFd2N0NzNHlhVVhzbGQ5dTk5OWV0OTFzZWJ4ZGc1VnNQcXIrZTE5L3kvSGMrZHlpM2paODBIY2NjMFFyNWM2K1lkMGFqY1A4SzNOWDhHeWFGbzFqcVF1dE5taXZDNnBBbHlqM0VXT3BlTUhjdlhndGpOYzdMZXh4b0dYNW1VOUNlZWEvV0tjbE5lN3NmaE5hbTZidFBjL2FyL0FJSksrTXBQaXY4QXNQOEFoMk9YNVovRDhzMmtzeGJkdkNOdVEvZ2pxUHdyNlBYd0hjV2NpeVJ0NzlLK0xmOEFnM3YrSkUzaXJ3QjR4OEhTUTJxMitpM0VlcFJzV1BuTVp3VkkyNHh0SGw5ZXVUWDZKNnpJdWtSbjdyWUdPdGZ6THhWUWVIemV2U1N0ZVYxNlBYOVQ5ZXlmRk9wZzZUV3VpVDlWb2NiZGFZOXJicTBuTEh0aWluNnBySXUzWWJXK2xGZlA4alBZdXowRDRRYmRaOFNSL3dCMVNPdGZUZHRMR05OamgyOWh6NlY4Ny9zemVGV3VMbjdUeDh6WkJCOUs5NncwYmJmZnRYTlVxT1B1bnorT2pHZFd5Nkd0cGZsMmsyVDBQV3A5VnNrbS9mQmh0eDNyT3R5REVkeCtiM3FTN3VtRmt5cTFWR1VYQ3pXaDVzb3RTdWlyZGEzYjIwZmxzdzRQV3ExeDRpaCt3c3NjbTd2eFhQNjNvczJwVzByeHlOdTV4WGwwdmp1NDhDZUkvc3VvTzNseVBnRTlCWGkxOGZPRXRGdWV0aDhBcXE5MTNhNkhyMXJyL3dCblJ0eTVQdFZQVWJxNHV2M256S3ZXbmFGRkhydWxMY1E5R0FJd2V0YW4yT05MSHkyeGs4VnpTak9hNVpQUU9hRUpiR2RFelhOb0d6WEFmRXFaa3Q1TUhHMFo0NzE2bExvWDJMU1dtN1Y0MzhTZFgrV2RjSFBOWTFLVHB4U251enB3Y2xPcGVPMXo0ei9iRThWVFdTektQTTJrVitXLzdYSGlNdmR5YldQSkp4WDZVZnRSNmo5dnY1NFpzcmtFako2OG12eTUvYThtamk4U1RRb3gycWVsZnIzaGRoMDhRcm8rajR1cit4eVp1UFk4RXVaMm5sWXQxelZaMHkxV0pwRlVOZ2MvenFIcFg5SzB6K2RYRzZIL0FIVXAwZnpMMDlxYW9CR1A4bWpPdy9wOUtucVQwc2YwVC84QUJ1cDRjdGRML3dDQ2FPZ3MwVFJ0cUdyMzk3T3MwdkQ0bDJvNmorRmYzZU04NUlyNzVzTkx1TmFudHJ5enUwZ2VDMWRma3p0OHhzQWpranVPTTUvQ3Zqei9BSUlTYUtOTS93Q0NZWHczaFczamtrMUNDN01wYzRabGU0a0lBSjdZUFN2c3JUTEI3R3pNYjI3VHd3bG5lRkNWWjlvQkFHRHgySFBldjVQenpFS2VhWW1wTlhYUFB1dHBhYXI4ZCt1aCtrVVl1RkNFVTliTHQyMUxpV0M2YnBVTFhNYVhFZHlWUzdJbEhsNUp3TnBic1QrTmNaci9BSU9ZWFZwcDYrZGNMb0xyZFJxWEp5eEhxVGdzUGM0OXE3Q1hSQnI5cFkybmxsWUk3bFpvYmU1bTNBa09wWDd2VEdUZ0U4NHJHOFMrSllZTDNVb1VtaGFHM1dVVHBHRyswUGxkeTdXeUI4dXc1R1BUbXZuSzJIcHVuNzkwdTZkbTlMdGJiWHM5YjlYYXpPbkMxWnFWb2F2Vy9ic252NXRmTzEyZVcrSi9FNmVCN3ByV0dTNDB2VDJ0emNYRndvWld0VkIyc29iN29MSEhxZWdHT2E1YjRrNk5vM2pIeGJaV3JSR1M2bTB0VEZjK1djV2JPQ1Y4eVF0dzJjRUFoczF6bmp5eDFiWEx2VnJIUjd1M3ZaR3VsZTVlZThhTVd5U0FQZ3FNbGlxdHV6d0RuTlkveEYxKzY4Sy9EeTV1cG9yNklXZG1sd3V0UEFKRzFGZ1NGZlllWTFYYmtqbmtqcFhqcXZPcERiYlMzYmZSVzczL0FLMFI5clF3S2pLTHB6OTU5dXQ3V2JXL3kzZTl0MmVIL0hENG42cHIzalh4SmF6WDUxRCt6MjNhZDlxc2lJcDFNWVY0bCtRSVpBNE8wRU1TRk9UelhtT2pmQ3dlUDlIMWpRWkp0VjAyOWUwbDFHd2sxNVZlYU8xdDBMTXZ5c0V0M0JWbEFrWE9HR04zU3ZUdkZuZytId0I0bDFYeEpyVWw1ZGFvRmEzMGU2MXZVQWJJWFUyNW1LeDhLRHNRaFJnbjV2V3ZuTFVHdFcrSWRuZldXdVgzaUMxMWk0ZHRjaWxWekNKVVJqSEhIbmFHWmNya2ZkWXR5RDByNjdBKzgzZTkwazcyZTY2WDg3ZGQzcDVyNmJDeDVxS2pRMFhkV2ZTK2kwWGYxMVI4TWZ0Vy9hUGlKL1oydk5ENWx3MGNqM2pSd0pHWUhEbGRwSy9lK1VLZDJBZVNPMmE4SFhjdHl6YnNZT0J1SXI5SmZqajRKOEwrTGRFdU5EdFpMV3kxQzd1RmUzc1lZekFabmxWVjIrL3pMMHdCeHhpdk12MmF2K0NXc1B4T2g4VGVJUEhQMnJRTkIwT2MyN3d3eUNPVGN6RkN5N2dTVlE1UEFPN1pqdm12M2poM2kvQlVjRGZFKzVHT3k4bTlMZHo4ZTQwNEx4ZFRIS3RoclNjOStsbm92eC9NK0tyZXhrdW0zYldaSStTVmJuMXo5SzBJTktrdW5qV0ZrZDVPU1BRK25ldjBIdmYrQ1kzd1Y4SnF0bEI0ODF2VnRYZTdDeDI0Q1J4elFCbDNGMUFMTGtkQm5KelhzUGhuOWszOW0zNGErSU5Xc2RUOE1QZFhHaWFmUGYyOTFMZXpSeHNYd3NTdXBZa2xXOStvUFd0TVI0azVZbmFrcHk2L0MxK2Y2SThiRGVHK1p5dEtza3Z2dnV2Skw4VDh1RStIRTFwZjNHbTN0cnEwT3NRT0l2c2kyYithcm5xR0J3dyttTTEreS84QXdRbi9BT0NiWGlmOW4zV0p2aW40c3N6YmFoUHA3dzZUbzAwUkU3eHVxdDVyRnNiU2R1TnBHY05uaml2T3ZFdjdRY1BnYlM3RzYwSHczNFUxVHhkcTkrOTFKcU10aEhJYmkyV05RQ0dkYzdndU9wR0srcFBpUiszYjRwZncxb2QvYXpXR20zK25TcGJYK25NeXNieFd0MVpkc2dYN3hYQ2tLUGxmdVFLL1ArS09ONitZWU5VS2NIQ005SHFyNmFQMDE2Nm4ybUE0QnJZR3J5d2FiZDFkM3RhMzY3ZExlUnhmL0JSajlxSmZpaDRUMUszaHNyNkx4VlpzOWxjdlp1TnRyQ2dMU2lRSGtmM2NuSDE3Vjh6L0FBUTF1eG5zdFdzclMza3NkUFhUMXQ3alRiclZubmJVWmxjSGFrS1laU2NsaVIyN1lyUzhTL0VHYTk4YWkzdXA0WDFDNm51b05RdUwyWkJCR2toQWVOMjRPOFpBQVBYbXVMaGprOERYdDU0bThOMlphMXVaSkxOamJybnk3amVFWlZKM01OcTRISkp3M3BpdmtjdndqaFFsUm5mbWxaM3Z1OXRYOHRMbjZaN0dqUnc4YVZOV1VmUFQ1ZGJkdTI1M0ZsNDYwLzRkclkzRjVvK24vd0JrYVFKZE9rMHl4MHZmREdKZm1pTHlNU3pBU2IrVHdNNHljMTViYzNWNzhaZFJ2dnQwdXVSMytwMnFlWmZ6Mkt4V2Nzd2RuaDh2YW9SVllBam5HV1Jqbko1MFBFZncvd0RISHhNMWhiaTYvc1h3UHBjTnpGSGJKTkkweXlRZk9jeUJRZDBoYklJeDFQU3N6WHZCdXVlTHA3eTVzUzExYXd3S0wyU1MzVzJnalI4QXVJMHdCajVjYmVPVDYxN1dHcDA2WHZPYWMzMXZlMnoxZHJOMzg5ZmtUR25UcTAzS21tckxyNTlGK2YzZVJ0K0QvaDNiZUNmQmYvQ1FhaHAxalk2ckdpM3JvUTl4ZFF2dXpFeUZjWUJITzBuQXowNkNyM3hsK0dsNTR4OEk2YkpiM2cxQ2ZVdFY4cldMenl0c05sMWRHNkZpNUxZUEpJSTdDdXk4ZjJscjhIOVo4SGEwMWpjTG8zaXEzaHVibVBmaUxVWUdZcUpHVEk4dlowS3J5Y0RKSGFqclZ0cTJ0ZUQ0ZEUwVVRhTG9MUi8ybmNXZDdPZ251VkdUSk12eWx2dW9CMTlQVTF4ckVWZmJLdmZkNk43SmR1K2oxVy9TNFVYRndWdE8rM25mbzlWWXVhVjRQMC9TZkJjVDZuY2VaY2FwY1J0ZnoyemJYblF4dHRpeHVCV1RlUDRqdElZNUZlRmZHNzRJajRxYWpvOWxybHZmUStIdEtVUVdOanBpUmk0dVpuWUZnOHYzZWhISXpnY1Y3TDRTOFUyZHdpbTZ2WVkvc2FpNHVXdW9peEZ2SXJLRzJsaHVaVlBMWjRPZlNtK0lOYzB5Mmt0SWRGdk5OOFJUVytJN2pVSTdrUjI5d3lSaFZrZ2RTeS9LKzVlTWtsTTgxcGdjWmlzTlVkYWpvMDNydGE2KzdiYnkyc1lZckMwY1NuaDhXdVpTMThtazl2VFZmZ2VDZUV2K0NkSHc1dGJxV1R4SjRnMXF4dGZJZWVFWUJNcnFtOFJBaFNBUjBZbkdCelgwRjhOUDJEdmdIcFYzbzhNT2o2eDRndkxXQ083dTBlOSswV3MwbXd5TWpsQ0NxT3VjRUhuWU9sTThkNjFjZUJyWTIrZ05KcTJyVFJtR1NDMlRjWDh4aUhBVmhrRXhnNFlBSGc0NzFRK0hXdGFwNFkwdWFlMHVaTGZWZFN0a2k4cUJnd2lpRE50a2syamc0d3U3ZjJPYzlLNnEyZlp0aUtLcVZNUkpkTEoydjUyWGwxMVBPZkN1VXhuL0FMUFJqRysybithdmIrdEQzZjhBWm8rS253bzFYU3B2Rmk2SG91aDZLN3llSExpemtBdUwyMnQ3ZklRRmNrN0Nya1prR1F2VmppdTE4QWZ0RGVIL0FJYjZwNG84UGFyTWJ6VHRTRnhleFc4ZHFuK2dJeWhrakVnMnZJMlFPVDBDbkFGZktmaEh4QmNXTGFmZTNIaG15MDlyV0tXS1o1YnQ3UmI0S05yajd1QzhtUWM4bkQ0OUt4dmhaOFNyenh4SjRoOFNhZ3NtbnRvK3BsRlNOVE14UWdjSkVNTjVLZ0VaSXh6Z25rVjQrSXkrcFc5cExWeFhSdm1lcjBYZC93QmFhSFZITGFFTk5uTGJzcmJXM3MvTzU2UiswYisxcGZlSmZpQi9vMGZuWDBOdkFsb3B1VWhXS0JRK1RJTUVrbEFveHdldjQwdkZmd1hiVzlXMFR4TTFsb00ycVFzTHkzU1pCSmJ3dXBWaUptNEJEN2lBR0lQeTU3NXJ5eXc4VU5CNDYxQ3hraHQ0YnplTHlGR3Q5MXpJMmR3akJiT0k4SEk2OERyaXV3OGQrT0xyV2ZnMTRoazFSRnQ3clI3OVVzblc0QzI2bk9mTmNLcEJVRUFFTVNPYzlCaXQ2ZUVkR3BUVkZXZXpmVjgzNXIrbWVoaWFhaFI1STI1VXYrQjh2dkxWd2ZCMmxYZXRMcVcyMTFEY0xnTllXNnRmQ2RnanhraHovcXZtWkNSajVseG5wWHpEOFg1dFA4YlE2MUpvc1FzL3Q4eldzMWdGM1NRZ1prakhJeXBKM1pZTWV3elhzR2gyNGs4V1QrSTduVVpQN2E4VGFaSVhpTUFrK3p4a3FReWtqYXlzZHpZQVhZRkZlUi9GUHc3cUhodStqdWIrM2wyMklOeTF1QjVibmdaYzdBVzJuNVFDM0hYMXI2bkk3UXhITEdWNVdYMzlVdTZ2NTZIaTVwaDc0ZVRxZGUrdi9EZmlmSi9pTzJ1TGE5ayswUnRDMjQ1QlBROUNQWDg2eDU3ZVB6eVF2eW5qMnJyUEY4Y091WExYbm5mNlRkU3RtSkF4WGR5V0ozZXVjZmhYTzZqRTBxTkx0MjdnY2hRRndmcDJyOXZ3MVM4VmZjL25mTU1QeVZuWjNXL1ErenYrQ0dQeHRzZmhoKzJCL1psOWZSMmtIaXpUbXNZZk5iQ3l6aDFhTmMrcDVBOVNjZDYvWjdWckNiV1U3SDFyK2VQOWhMeHl2Z1Q5cmY0ZDZwSjVhMjl2cnRxa3haRmZaRzBnUm13ZTRERWpIUEhITmYwYWFOcGJDSldad1ZJQTRyOEw4VXNLcUdaUXJ4KzNIOFU3ZmxZKzQ0UnI4MkRjWDlsL25xZWI2NTRhdUxhNE9NclJYZCtLNExWVlpsMm1UZ1VWK1ovWEpIMmxQM2xjOWY4QWdGNFZYdzNvVWZ5OEFZcjBRb3FaYXNUd2xCOWcwYU5SK05XN2k2WkZIUEgwcDFLa0l4UGxhaWxPcGNmT1dJM0Q4NldLOVdTSHkyUHpVUVQrYkJ1STlxcnpXcGR0eTF3KzB0OFBVcXkyWmFqMHhsaU8wWTQ5ZXRlYi9HejRSTDRvMFNhNDIvdllBV0I5NjlSc0R0aCtadndxRHhFeHVOT2xoalU0WlRSVnd0T2RPNytScGhzVlVvMVU0bmlmN01meExGN0RjYU5LMjZleEppWUhyeFhzVWNRZWJlMzYxOHcvQ2pUWnZCLzdTbXB3dnUyM2gzNC9ILzY5ZlYxdmFyUGFnN3VjY1Z5NFduN1QzVjBQUnptTUtWWG1odEpKL2VSM1Y3SDlqWlQ5M0dDSzhRK0xzVnRGNTBpcXVjRWtWNnY0akwyVnU0L2hZZmpYei84QUdmeGJIcGNjNVlodVBtQlBOYytLcVhrb3kzSGxlSGNwWGgxUGlYOXRxNWpWNXBJVzh0Z2hPUjFITmZrMyswSnE3YWg0cW4zU2J2bkl6bk9hL1NmOXRmeGQvYTdYa2tUYlZXTnVCMkhOZm1COFYyOHpYWkdibjVqWDcxNFY0YmxpNmpOdkVHcTZlWFFwSERzRHVxTW5CcVptMlNkNmlrUE9Selg3cEZzL0Uzb1BLL2RJcDBDTk5LcTgvTVFQMXB0dXJTR3REUzdkSnRVdDRwWkRFa2txSXpoZHhRRWpKeDNyT1VyYm1OM0puOVMzL0JPbjRMUi9DajlqSDRYK0g3RmIyNnQ3SFFvWjN1SllEYnlTUExsaUNwNVFndDM0T0srbk5OdUZrbWFGQ3plZEVFazV3MlRqT2Zwaml2Sy8yWE5NbThCL0FId0xwcTNWeHFSdDlHczdmejVJanVsWHlrMnN5Y0Zjam5ucG42MTZoUGVSNkhiM0gyVlI5dUxBN1NQbWtCeHllbVF2dDBCcitTZWFMcVZNUzN1MjM1M2JlaVAwckVTYmFndmwvd0FFNW54THIxeDRhOGJqUy92VHJaejNWckl3M05Gc0s1M0RPU0YzS2MrbUs1SzU4YXgrSUkvK0VndUxGclNFUy91VSswaEduTEtQdktQbEdXMmdLU1NjRDNyMVBVL0RiZUxOUWl2TGk2TFN4eCtTRlhaNVVpdVBtQklHN0F3T00vNFZ4L2p2d09KUENkOUhIY1dmblIyeFh5a1RkREZzSERGY2dzZCtPK2VnQkdlZkx4MkZ4Q2ZQU1h1YnE5cjZiZk5hL0pka2RXQ3hOQ3lqUDR0RTNyMWV2MzZmOE9lVDJkNDArblRYbGtzTnhxWDJpYUtCM2drdDF1ZDNLSXhZZk15NUtBais2QjNyenY0bmVFMDhkYVJMcldsNmhmWEQydHU4MnJ4R1pvYlJHWmdSRnNJM01keTRLZ0hBSE9LdWErdXFXR24zME9wZjJoZjJkckNZYmUyc2JlYUY3aWJBSmxMTDg2S2M5QjBBUHpBNUZOdXRTajhEZUI1Yk84VjRKSTdWcjJWd2hTM2VGWFVGQ0Z6dFo1Q2Z1a05sVy9ENS9DS05SYzA5N1g2OUZvL1Y5ZTY3SDIwWXlveVU2VHUyN2ZKN3JwdDAycysreStaZkdtbFhta1BOTGRXZG1acjY3OHhwSWhHOXZJNWlNZ0RSZGRod29BQnlER0Jqbk5lVmE3OEdmc09tMzBOOXFzbWdQcGptL3dCVzFIYnV0NEFPSW1TREpMc1ZZbmFDY2xCMHJ2OEF4enEvaWFUUnRQOEFGWGlhMFFhaGJ1bXI2ZnA4Qk53c1ZsRXo0bWRFNmZOZ0FzYzhnR3VPdkpiTzNqMWp4OXEzaWk2MXorM0lHdDQ3S2VPTkVoWmx4dG5pSE85Unlvd0I4M0dPSyt3d0txUnU3K3ZXN3ZzbnF0ZGZJK2s5Nk1ZMjY5dGRkdncvNGJZODJzZmgvd0NIL2lEZFd1ZzJ0czJxZUlyUnpyQ2E3ZlNsWXJ4RmhVTENxcVBNRzBEZmpKQU1oQkZTdjhWdFJ2ZnNkcnJNMmkzbWk2Z3N0bnFGbGJYUjhtU1RjeDgxQXJiZ3FNY2d0MUk2ODEwL3c4OFI2UGQ2M0RlV3ZpZlQ5RjFDM1F3bWVSZzdyY0x1L2N4Qmh0VmpHQjhyQWpLcjYxeGV0aXo4VDZuYVcrbTJkeGNSTmJTUTI5cmMyaVFDZHdvYVF5QURJM0hJR09CK1pyMjFVZFN5cXI0VnBmcHByYStuWnEzWTBwMFY3YVNidXY2Ni93QmRUcklmQ1dxK0dmRE52cU5wZGFmSnBjbm1yWVhNamZ2R2pSVEl1VDk0SGI4b3pucFdYcTBkN3JXcHpYU05wMXJiK0pyVlo3MjdrT0pDdTBocFFpbk9GZk9EM0l6am10RHdyYVMvRWY0ZjZqYVF3UTZKcWx1dm4zR24zWlVSU1A1WU1ZdDQySTNrK1hqQzUzY0FWa2FmOFIvN0t0cE5CMXFQVGY3U3RiYnpBczRFZHlQUHhHNEJHQ3BHVmRWR1FjOURYTFRqTzhtdFpKNnJ5M3YyZlRVNkpYNVZIVDlkZS9tVy9oM0xwdHQ0UnNwcEpJVzBuUVh1WGwxV1dObXVacEp5b1ZRTThBTXluY1IyUHBWTzU4ZTJzV3VhVG91dWFoZVROZWExQi9hVi9iamVJaGhIUUE0Q3FOdWVNSG8xV05QMGp4ejRrc2IyM3ZOVXRZZEhTeUVNWGwyYXJIY2dNTXNyWXl6RGFlL1hwMnJhMWZ3SmFlSk5RVzR0bGEyaWEvRWtDM0V3V0RVb2lQSkVyRGxreHRZTVhPY0ZUM3E3d2pVYzZqVDN0YnZ1cjNTMXUyMnR2dUpsZFBsdnEvdytmNkhQNjdkNko4UnhxbDlwZXBYOXhwV20zK2Y3UXRVRDdGSnc3U0tEeHo2Z0hEWnJhOGRXcWZFMlhTcmlPK3NHVHcxT2J5TFVYSVdTVUt5N0VraDVEc2RnTEtTTWdkYXovZ1o4T1p2QjNqNitqa2pzZnRQakNHYTYxRHc5WXd0c3M0NC9NQncrN0JZL0llbVR4eUJ3Y1A0RTJPcGZFMzRqVy9oZVNHMDB2UWREbWt1OVJtYkRSM2JJUVBtS3I4a2hDZ0RKQXlmVTRyYmxqVGszUWxwVFNhZW16V3ZycW10THA2TzFqbGxKVGh6VmVtbnkvTytocWVOUGlMcFdzb3JhNHR2Y1dkckRKYlhLeVNHS2U4SmxPMlJZbFA3dk9XS3FwUEhPVFdqNC93REdjMFZ2OW44SnJhci9BR2hiUTNFdHZORnVVd013V01sSXp1akJWRGxXSlBKOWF0L0VUVzFzOU0xeWV6czlQdlBDOGhqMHFPNjhnbWJUWXhJVzNsOTN6c3U5aW9iakF3UWFnaTFhSHd4NHowMlBUTFp0TjE1ckUyUjFlODh0YmJWakZ1MnlBbFF1RlZrenh3UjM1RlowK1Z4VTR4N3RMcDBidXJhZWUvVG9hOHZOSlJhMHR0Znl2OTVGRDRVMCszK0gxdnEzamJVRE40cWQxaHR0SWtrWm9OTlIyYVJVaFVqOTNIZzV4azQ2WXlSWEwvRHp3MWFxZkVxV015emFsNVkzZmJDWm9JREZ1M1pBK2FOV1Y5d1VjRXFjOUs2YncxOEw5VThWUlBxRm5xV3k4dXJKcExoMkl1RlNXTWp6SEJQelJnZzQzRGFPZmFzL1YvRzFuYjZKSmNhVGJzdXRQTkovYVdvRE1mMmRTdUVCWTlWYlBUSGJQWTFVYXNwdVNUYjV0K3lzN3JUYTNiWFUxVVl3WHM0Tzd2OEFjYWtNK2wzV3J3YUxxRFEzVUVkcXQvUGNPQWlwTEdCc2d4a0VJKzRGaWVNRUR0bXBQRnc4eE5IMERWTEcxZThqRnROYVNXa1dGdW9uSmtiY21RQ1IxVWJ1Um5KNUZjamNmMlA0aXRyeSt1SmJuVUZsWGJKSmJxSGhtbUtBQmNZM0FCeUFvWWs0QlBURmRWcE45by9oVHdVOTVkMmlyYjJOOUV0dEpjdVh6SmdMZ0txa0I4T0Z4a1p3T2MwTDNOazc5dk1pdFM2OVV1dWxuL1hrY25QOFRyN3hONHoxUzE4TjJNTFRhY2t0MmtzVndnYXhDUmwyOHY1dm0rVW5BTzdHNGdFR3MzeEZCZjNrK24rTDdMVWJ5NDFEVUlFaFVXYUpIZ3N4SlI0M0dOcDJOMjQ1OVFhMFBoZDRXMEx3UDRwdnRhOEh3U2FmcGQ5YnlIVUxFUS9hSkZWNWNyNVlZTTZLVjNaSjdZeFczOE1kQnVkUjhkK0pMUzFlMXV2S2htdmRFbWxVK1pQYVIvTzRXTmVTMGFsU0RnWitZL04yN0trb1JrM2hscEZMZGF2bzAxcjY2UGJ1WlU1U2pUdGlVbHJyYi9QZTMvRGovREZ0cUQ2RnA4T3RTUnlYaHVyaGROUnBsa21qV1FLNWZadXl1MDRBNHh3T1RpcStpdzNYaHFIV3J5VllHdXRVL3dCSG1kQjhreW8yWlpHWmVHVU1WWWRCa0E1NHJrZEYxeVBXdkVtb2ExWTN0NDJvUTNiMmxqZUpFNnd6SEFVa293REJXKzhCd1IzcmVmVkpkS3RMWCsycng5VXV0UWNYUVcxY3BISUdEWmdHTnpnZ3NweHdSdHdRT0s1NitIbXBOUGZTNlMrZGw1ZjFzZWdtbzJTK0Y2LzhOZjhBcTVzNnI4T3JYYnBzMmt3MnV2UXFUSytwTk80bGtaVjRWaU9FQTRHQVFNRHB6VUU5M3BQeEw4RCtJdFAxRFRicTAxeTN1SkxlNXNZTHpiQWtVbXdJMGFwa0huY01IT2VPdFVmQ25oWFU3djROM0dsYm8xdk5XbWx1V2hzOG00bFpZMllsV1hqUGw5ZHdJQTNkTzI1cU1sajRSMSt3OG1PRzRzZFZzNDNpaXRVYmJjeGhpY2xtdzdZNXlSbkJCbzVwSnUxMjAzWjY5TE42M3RyK255T0tweXIzWk8vWDFYbi9BRjNNdjRuWEdsTjRGdDVQN0J0N082aG5FQ09pQmZLaGJZZHVGK1lNZm5HMERBeHhubkhsL3dBWUx2UzBzdGR2WXpjNjFyZDVINVNYeXpTeG15WHk4SkdxRWJEdlU3VytZL2Q0d1RYdFd0K01yTk5VbnQ1OU9aREhiUlNyKzdieVV0U3JGRzNaSXlyY0U4RWh1dWV2alB4SThEUjY5cWx6ZmpXR20wNldjdWtjTVpSWmlpREJRNEFWY25JREEvZTU3VjZHUzFlV2E1cnJyZTcxdloyL1hjd3gzdlVXclh0ODdYL3lQaXZ4aHBMUWVXdHZtTW9OeGozWmRUazVJOXZwV0ZyT3BmMmpNbUVBUlZWZUZDNUlIT2ZmMzYxNm44VXRNajAwd2F0cEY3Y2xvTGdsSkhnVUJUbmR3MzhSRFo3VjVMcUUwalR2NWpLenN4Sk9lNXI5Nnkyc3F0TlMvd0NIUDUxejdES2ppR3UvM0V1aDNVZHBxRU1tNWxYSUdlZmxOZjBkL0JmeHY5dStBSGd1OHRKMXVJYnJRYktYekZ6aGdZRTU1SlA1a212NXU0MUVVS3EzM1d5UTM0MSt5WC9CTDc0eDZqNHEvWTI4TTJzMTFjWHY5bkdXeFZueCs3Ukd3cURBSEFYSFhKOTYvUGZGTEJPcGhLTmRmWmswL212K0FleHdUVTVxOVNqM1NmM1AvZ24wMTQ5K0kwOXNtNk1GbUJ3UWU5Rlkrb2VFcmpYclR6RlZtb3I4YnAwYU50VDlLaktNVlpuNkNlSDlLTHF1NE1vVWMrMVIrSUxmeUhLcWZhdW1Ob21ueURIZnJudFdQcmRzcmsvTjE1SDFyemNUUnRTY1Z1ZkYwcXZOVXV5bllXMytoZGp4bW9ydTQ4b2JWcVd3ZG80eXJZOVBwVlNlTHpwbVVkZTVyaHFOZXpYS2J4ajcycGJzMUVrUitibnNhMUxDS0kyVDdtM0hhZXRZZHBadWtxcnVQSE9CMHJWYTBhMTArV1J5VitUT0szd2NwTFhsTXEwVjNQbGJYL0VFZHArMXREYnJ3WkVKSkgxRmZUME1zaTJNYnBrZ2l2bEh3OWFSZUwvMnZieHd5bHJOY1kvR3ZyYTB1LzdOc05wWGNNWUh0WE5nNzNsS1dpUGF6cXlWS0VkK1ZYT2Q4Y1hXN1NqNWgybkhXdmxmOW95YUhUOU11R2xrVnNnbkZmU1h4RHVmdDhETXJiY2RzZGErVnYycTdGcmp3MWNiV0pLZ2tucFhIV2twNGpRN3NoaCs4aW5vZm5yKzFscXBpdGI0cS95c3BHTTlxL09yNGszdm5hOU1GNkthKzF2MnZQRXMxdGFYVUdSOHlZejZjMThMZUlMazNHcnpNZTV6WDlMZUhHRGRQRGM3UEg4VE1VbnlVa1kwa2JiODA2R0x6bUM5ODBTc1pUNi8wclEwTzF6THVib3ZOZnFVcDJqZG41SGEvdWtkeEN1bndxZjRzZDZ2K0F0TXVQRS9qZlI3Q3pqTWw1ZlhzTUVLQWhkMGp1QW95ZUJ5UjE0cWxxN2ZhcHo2QTErZ2YvQnYxL3dUdC80YXQrT2QxOFFOUWt1cmZTL2hiZldPbzJnUkVhTyt2VmtNaXhTQmdjb0JIazR4MUZlVG0yWlU4QmdaNHV0OWxkTmJ0N0szcWRHQ3dyclY0MG92cnYyWFZuNysvQlR3Vy9oendkcHp6WEY1RGVycGR0REtNaGxaMGoyakJBSUIzRWdrRDBydGRMYUc2MUEzRE1XYjdPUkVYTzdPQ1F5Z0FkamdldkE0cmdQQWZpUysxM3hOZG1hYUdGWVovTEVkdTJJNUFjbHNaUEhUdFhTWEV0MVo2ckczMmJ5ckhsWkpCS0pIRXBPT0ZIR1NBZWVldlN2NVZ3ZUtnNlhOQ09sL3YxM2ZaZGVoOS9qS05UMnJVbnExL1M4emw5YnRwMnVkTXVMNW9kRjBWSnBibWFOeVdXYVl1Mk9ldnpFL2Q3Z2lyRnI0eDB2eExyK282VEpORkpmTEc2MitUZzNJUUF0ajB5Y2NkTTRyZjBlNVRYcGJqU1pkTjh0STV0eGFjcStFenc2ZytpOVI3MUJyM2huU2JhK2JVbWF3aWFSVERiWERLSTF6a2NjY2tkRGtldGVmVHc5U2ZMVWcxS0wrTG0wNldhNkt5NldWazM4anBsV3AzNUpwcDI5MjF1OTAvTjk3dlZJNE84OEd5YVZwSzJNOG4yYlV0YW1BZUtBc0pZa1ZzYml4NllVbk8zZzQ0OWErWmZqVHJtcmVPUGgvZGFIb2VvV2NHcTZmTTZYc2wwLytxVlhjNzFZTjhyNXhnNDZaeVJrVjYxOFcvaWo0ajF2d05xMmwrR3ZKWHhQcGJCWTU1b3BJMGVIZVFwUTRPUWVRZXZUQnJ5UDQxMzBmaURTOVA4VlhUeDZWckdyYVZGYncydG9ubkxleGVZWGFTWXF1MEVoVkdDUjA1N1Z4MDV3VVZLbHB5cXl2citEOCt1ejZIMkdVNGVxcHAxck50M1MzcytqdHZ5dFA4TlQ1dStLOEdreGVFOVNtdWJxeHVMeUJoQll5eHUvMlRMU01yUjI0eWM1Q2JpV0l4enh4WGpPaitFbThlK0lHMHZSN084dVl0VW4rMHc2Y3NnVmJPS05tYmF6RUVtTnRtRGdkVFhwM2pId3pwdnd5OEJXTmpiekxEcTF4T2tkbzBvU1dGenZkeElGWS9JN0tYVEo0QVg4YTVUd1o0aHRmRVg3VGZodlM3TzhzOU8wL1VvN2krdm9KbVZXekRHMjJNWTZiaUNRTytmZXZxc0RLYlQ5bHF0V25xdHRkdmxvNzczWFUrMFVvVXFjcFJiYVY5LzhBSmZoOHpoZmpwOEU0SlBCdXJYa2w4c2ZpbDRZWjdQVElvOTAybFhVY214aXpBbFhSMVlZWVk1SE9BSzlDMFg0bTZscm53KzAxZGZmUjdYeEhjTEU4Mm9FcWx1WlZHMWJmYWd3Z0lHM2VjbkpPZU1tdEh4eG9sdlorS3RVYlRwdGNrdUV0M054YjNNQWhtMmJoODVIWGdrakJJSjdDdkVQRXZoQStNUEc3V2VsaThzZkRzd2draHRMeTNWVWtZbHR1WEEzRmlTQ0FPN2RhOVREMW5pcWZzcXRsR09xZHR0RXJML2c3OXpHV0hVbkd1N3VUMDh1ajFYOWFIcU45OFE5Tm10SHR0Um5oamF4MDlHdEliVnBaaGR6NFliUTN5NDVicm5DOFkzY1Z4V3NXVnZMcDJwVGZiYmorMnZPV0M4MUdTMTgyODB5SUtoT05vSVpUbGx3VHVQbDU2TlZPMzhQeTZucnVzV2QzYXdpNzBlSzN0bkVGMnErVElTV1lqSDNTY0RJSnpuSEZkQjRqT2crS3ZCdXJhbGYrZHArdDJNWG42cENJL3dCN2ZwNVFLbDFIREhiSDFQVE9UbnBUcHdWS3BGTHl2YlhlMXZrNzYvSzl6YVhLNlRVYjJ2MzI3NmI2OXp2dmhxUHNqVy9pVXJxVGVHZFFqV0N3bjFCVWpsdkVqYk1seXNJWTdNSElLZzQ5TVo0eWJmeFplZUxicStoczVMeHJ6VnRUaXRiRXd1QmJ4VGNDTExNTUtvVTQyOERnOG5HYTBIdnRQMWJ3VXV2V2VscXVsMnVuUlFpMmFMWXNRa2pFa1Rvb09USXloeTIxY0RiZ2daRmVINkg0Y3Z2aVo0aG04TjZiZVhzSGhPN2VLZTR0TGVXVDdNck51a2ljc1RqY0J1d0NlTytLeXcySGhXbkp6VGlsWnZyWkxwNi9nKzZPYVBOR0h0bTAraXZwL1hUMTZJOTIrQ1h4VzhSWEdyK05QRHZnUFI5SjF6V0p0TEZwZDMycFhSaHRJb1JKaHB0L0NzSThaQnlvd2VoeFhrbWdlT1p2aGw4VzlaaTAvV05LMWo3TllTd3dYQ3hZZ2t1TVliQUpVczJTZHZQWHNhcy9EaVRVdkJ0bHBQaDMrMXByT3oxQ0daTDdUbGpFRFNNbnlKRTd1b3l4Mzdnbk9RU2VjVjJHb2FkcC9pdjRUK0hiVys4TCtIN0d6OEdXdHdiMitNZTFyN0lLTlBsY0VNcCtiUEl6akdCaXVqMmRDaTVSa3ZkbHAzYjZYMVhkYUpXVnBkU0pVNU9xNXExbXRlbHJMcnJyMjI4eCt0VFg3L0FTNyswTDlvV1c2T3BLcFF5R1NJL2Rra3h5RHZVcUIxd1FhNUtDOTBMNHFmRGp4VnIydFdjMnRYUDJaVzA2OXM1ZHFtYnpGVnJWRVlxMzNaQTN5Wi9penhWcnhaOFVkVmY0ZDNuaFR6cnkwOENxcTM4ZjlrNHVyaTloTWEvZWxWais3VURKUWZOMlBOYXZ3RThVUTZGOEtOUC9BTE4wMlM2UzgxQ0cwdFZsaTh1MUJFYm5lNEJETUZPQVFPY2xEMjV6cDA1MGFicWN2dmMybG5aSk96ZDMwZWl1azdMOHQ5dmQwdGUrbTcxLzRlNjFPSThhYWZxMnJhWDRaaDhMMzE1NFZzYldBeXlaUDJOVmNzVU1UTndlQmhkcHprdG5IRlIrSWZCMTB1ZzZlbW16eDZkZlhGeEhQZkNhK1c0a2RHa3dpUnhxTnhJS3RuZDFMakE0TlhidjRUYTVxZHRiNnhxMnNTNmpwK3JzdDRtakNjWFBrS1dLdUhPZDY3Q1diQUdUak5UcDhKWlBESGlYWHBHdkpycU9hRkdoaHU1d2JlQlVZT1BKSnhoR1o4NEhSc2s5YTlCWWluQktLbW0xZHBXdmU3VjAzMWF1M2QzWFptRWFhbExSY3ZkOXJYNmZjdklzYWRxbW9hRDRPdk5GWFVtTWRucTczMSt5MnUxYmlLS1FzakFLZW9SbllEQU9CN1lyYytISHhTMHJ3eGFhTHBPbjZiZmFrZkVLWEs2aEhjeDdvMnkyYmZ6Qng4MGJydURkam5JUFFaL2phMHRmQ1BoKzJoMFMraGE0MVF4WEVCdG5kcmkwRFJrU1d3bWZBZEdmcVY2bkFCNlZROEY2emI2UDRGOFJUYVY0YmsxN3hCYlA1Vnk5eGNQSEhBU0N4aVJHWUhjL3paQzhrbnFLNVZMbmp6OTM1TFY2YTlFazMzdGZRN0tsT0VxYnVtOWV2NXN5UEE5N3JQZ1dHZS90YnBkUWJVakpadmEzdUJia0VuTXNZL2paTUFnWjVJNHhYUXdUNmJmMk9rYTdxMXhhMi9peTR1SlB0ZHcwRWtjTnFvT3dGQXVNNzFKREt1QU1Icm5qUCtDUHc1dmZFZmdlNTFIVUk3VVI2RktWamdnblJab2xJd1l5UG1aV1FqazhINjl1MzhIK0JyZnhqNHYxdGJyVWJHemhqdEVra0dwM3krU29oSmNScXF2bmE1RzN1U2FyRTRoUnFTZzkxMVcva3RQTHkrOGo5eGIya1c3YVgvWHYzMCtSbHlhdG8valh4cnJtc1I1djRablJiSFRiT0gvUkJOY1JoRElZOEJ2bGRRQnRITllud244UzY1NEMrS2c4WlhrZW14V3MybHlXK213MzBRdURCY3lCSGFSSVM0MjVWSkU0TFk4emtIT2E2SHdocm5oMWRPanVyZXpqOEszRm5xZjJ1UzVpdVNzcW9nemJ4UWJNay9PQ1J4bkxET01WVjhRYWJIcm1nK2Zxa3ltK3ZkMGtqeWwzd3BRQlZESVBsVEFMY2NmZTZWTlBFcW0ybXJOcTJxdTByYXJUUy9uNW5QaUtmTXZacFBsMFdyL3JUOHpCOE82dGRKZjJLMmVzWGx0SmVUVFhqTE5HMFpqVUY5b1lLZnU3T2NjNUdjK2xkYkI0bjFrYTVOOWpudnJUN0xZeFhkdVlJMGhFVVVtNGtNQmwvblVJVk9jcURnaXZPOVM4ZlczaHEySGlKNDU1SnJHQVdNY3dVVFNyUHliZDkrQ1BMQUNsc2M0eU9wNDdDRFVmK0V0OE1ycm1zYWxxVCtNdFZ2M2sxSy9obVJGdW9pcXRpR0pRQ29VQlJ4d0JXbGFoYW56dlRwYTNYZnQydCtCVXBTbFZTNWI2YnY4QXJiYzV2d2MycitDZGRzZGIxUlk5VzhJSkZQYTN1a1htNWpOR2crVjQyVEdTZHBZS2NjTGs5YTVyNG0rS1pQaFg0NHVJOU92clc4OFA2Mkh2dEd2N1dQNW1pSUtMSHRiYXlnRU1DU01uSEFQV3ZXTlZzTGhmR0dyK0dGMXJUZjdKYU5KZ3NVcGpzWjl6SUVFUk80bmtzYzV4OHJjbXVKK0tWdjRldk5Hc0lMeTJWOVcwY3dXNVFERUNNR0lWRlljZmNJSllFNVk1UGV1bkNWNHVwZXJDOTlMTHM5VTJ1OTdYYjZibVdJcE8xcWI2WDF2YnA5M1hiL2h2bHZ4cDRSV3kweS84eThoaFpiYnpJbC9pSTY3UXZyay9nSzhIMVMyWjUzWnNub2NBWXI2Ly9hYzhBVy9oeURSMldXMVAyNmVaUHRCay9lS3hBQU1oN0RiZ0Qxd2ErV0xxM3pMTTgyZkppYllYM2prc0RqanJnNDV3TVYrdThNNHhWcUh0RTczL0FPRy9RL0d1TjhIR25XVnRQNnVZYysyWGJzUEs5QXZRVitsbi9CQ240cFE2djRXOFVlRHBnR2tzYnFPL2k1L2djYlh4ejJaUitkZm1pZmxrVUtweHlSM3hYMWwvd1J5OGZRK0FQMnNoSGNTUnhMcW1tejIrR1VaZHdWY0FkeG5hVCtGVnhwZ2xpY25yUmU4VnpMNU8vd0NWejVyaHJFdWptTlArOXA5Ni93QTdIN21lRjlDZ09seDdFWHAzb3JoL0JQajV0VDNlWElRdllFMFYvTlhzNUxRL1VLbEtYTnVmZG1vWDczTFlJMjQ5cXB2RzA0d0J1T00xb2FpNjNCMnFxcnhqajFxUFQ0UHNzdTEvdlU2a1c1YTZvK1ZqSlJXaGxSMmpTWFFVZmpVbXNhU2JEYXlETE5Xdkhwbmszbm1MNjVJeFV0NWErZU43RGNldk5ZMDhMSGthNjNLZGQ4eWZRNTdUcldiend6ZE8vdFVuaS9Xb3JQdzljczBnWENIK1ZTWHVvK1RJMjc1Vkhldk9QajE0bVd3OEJhZ3dmQjhwajllRFhGVXhFYU5OcW5xZG1Ib1NyVllwOTBmUFg3TVNONHMvYVU4UjZsYnlib2ttTVovQnEreHJtRmpZcnVVbmNNVjhyLzhBQk8vd2t5MitxNnBqY2JxNFp3MzQxOVkyeGtrdEhFaS9LbzRybXdjT1pTOC8wUFk0a3FKWXZranRGSmZnano3eC9wYlFXVE1wUDRIdlh5WCswYlBjRFNMdjdRekNKYzVQYXZyTDRnM0VnTWlqN3E1NzE4Zi9BTFczaVB5OUN1TGRUdDNLUzFjc2FFZmJKUlBTeUdjblVTUHkzL2JqMUdKSm5NWkhmT09oNjE4VjM3K2RkU04vZXI2cy9iUTFCWWI2U0Vkd1NjbjYxOG9URGJNYS9xN2dhanlaZkUrSDhScXQ4YW9Mb1ZKSVdUaGU1cjB6d0wrenA0eThYK0M1TlkwN1FkUnVMSlFTWmxoYmFRT3VEaXVQOEZhVEpybmpEVGJPTzNlNmE0dUVUeWxHUy96RGl2NmZQMlIvMmVQRE5qK3lWb3VtTnBGcmFzOW1Ga1F4ampLaXMrTmVMSjVRcWRPakJTbE83MWZSV1BuOGl5eWppRkt2aUcrV0xTMDN1NzkreC9McnFlbjNHbTNra054Rzhjc2JZWldHQ0RYOUVIL0J0NThOVThGLzhFMDdIVmRRVlliZnhSckY5ZGtJdTJTVlZZUWhpYytpdDI2Q3ZKZjJtUDhBZ2pKNFQ4VzNlb3lXZHVzZC9xRHQ1Ykt1Q21laHI3Mi9ZcytEY3Y3TW43TVB3KzhEeE45c0hodTFpdHBXZHR2bUhjV0xBZmkzNlYrZmNVY2RZYk5jdWhRcFJjWjh5YlQ5R3VtNjEyZlE5eWp3ODhEVWRhRlJTakpXWFI3MzF2MTBOM1JyZlIvRFd0ek41TENiVnJ3MjBFYVNCaWhVaFNkcTllQ0c1NkE5SzlKMW16L3RDMWpodUUrMGVZeUtRcitXUWNnaGdPdVFCbml2SnBDTlcrTzh1b2ZaZjNXbW9IbFpJeVdVYmdVMjhEcGtnL1FDdmJuamdab0JHM2x0SXc4dnpGTE9Uakk3NUJHYzlhL0xjbnBScjBhdEpXUzIyU3ZmcnQzdjNzdEVlbG1zblRuVG03dDJ2NmJXWDNXOWR6Z2ZpcjhRMitFUGh6VDlSa3VOTmttMVM1ajBxSzN1RzhyenJoMjh0RVYySUhPZnU5YXhqZUttbFdrZXN3MnVsYXBJclhObkxiNzJpamZBNVFPT3dJSkdEd0s3Ynh0WnlhcmNMRDVWcmNReFJpZDF1WVUyQmdYK1laemhpUXVDQmtBWnJnYi9BRTZIeHBwR3M2YjRna2wrMlF6bWJUcnAyT0JDb1hhektlRjVPTW5PUm4wckxGVTFDYXBSZXE3MjViMjFzOTAzYm83Sm0yQ2NKVTd5WFhWclYydnBwdFpkZXRqeTNUUGhkNHkwN3h0YTNIaWpXTkh2YnlZRzlXNGgvY2xRTisxU09RU1R0T2M0eGdWNVo4WFBFcmVLUGhCcjJqNlZidERyT28yOHNEWExxSW92TUJUYkVxZFdMQWxjZzhzdmF2Vy9FcjZoNE0wNzdkYjZUZmVMbnQ5MWhKTjlyTU1jY3BWU3haQ01FaFZ3QU1ESUJHYzE4NS90S1d5emVLNDlkMHV4dU5MMWpXSTF0NVcxQ1Z2czl1K0ZZUnE1R0lwQ0VPQ1IxREN1T2p5eXFjMGRHOVducjg5cmROMTBQdHN0aktyVlU2bHRMV2Fza21uZldLZDB2VmJyWThOaDhQdHFQd1UxcEwrRzMxRFdOUnVMZTB0cDlRdVBPdGRQa3c0M0JEajVSbVFIbmQ4L3BYa25pcldtK0VQN1JONWFXZXJXVTNpTFExaTBxRyt0NFRIYnZHRS9meVF1V3lwUVlBTGNNUHBYc09sYTlwWHhVMGU4czlXMWE4dDc2TVcwZW8zcno3VlNUenR3a1Fxdnk1RGtublB5Y0d2Si9HdXQ2ZmRmRS9XWWJWdE9adFBkb3JMVXBpWkcxTVlrU1p2Tno4eWxjNEl6a2dkNiszeTZVMjVxY2RFbnBhMi9MYmZwNWR0VDZMMmI5bzR2cTd2dDBPbTFieG5yV3AvRDFOZmhWTHhyMmRKYjJlNWlhUkpOalB0akxuakp5UmtBWk9LaDhRYXJxSGpqd3FzZmg3VVlibXlzZFBFbG5KcWRvMzJpYUNOMVVKRmh2bWROckVMbmdScWU5Y0w4WU5ZazhDYXZhMlBoR08xdFlkUnRvNWZzRHNibEdtYnBLRmRpMGU3Skl5UjA2VjZFL3dCdXVvZkVkbnF0MVoyYzNoK3dXT0tMVEZkb0xTN1pUOW95eE8wS1Q4d3gwM2taT0syalJqU3BxclpOTjNTZTZWMHRWcnRmZS9jcXZVYnR5cmxmb3JkditCb2VVZkN6NEE2dDRQOEFBK3JYMXpxa2JYUGlJTmZYVUVrd21WQkovcTJlTWo1Yzg1eTJRZW80cnRWMHB2RzF4YVcrcGFDclFXOW91cFhWNjF1V2t1N2NCZ3NxOGNSOVRoZ2VPNTYxay9zNGE1NGwxclg1dFFrOFJXVm0xNVlmWUhzaXU2YVpDQ3VKRmRkb2pkTjY1NzdlTVYzWGpId2hiK0V0TTBDR3p1WTVySzREUVBhSmVlYlBjVzBUS1RsVnd2azdXd3NZWWh0aDVycHpMRlNlSmNhclhPK3E2YVc4dTFsdXRMOURQQzAzVHA4a0ZwcnZ1M3VjWE5jK0tQRi9qZVRSN0R4RjlpdDVOTE54Zlhlb1cwY2NNS2p6RkNvNGNnWWpPTWpCUEF3TVYwVTdhVjhDL0dDNlhkVzl6UGI2SzBWcjlvMFpoSkpxa3BRUnhuNWdWWlYyZ0ZRQTNKQlBldUtQeE4wN1RORnZyQzg4UExid1hsMmxoRnJMRXhNWTkvS2xBY3Z1VmVFR001UE5lZytDOWIwLzRQUzZsWmZhcnUxZzBpVnIzUXpIWnZJNk5JNUFFYXNTWTJaZ3I0YkpVaytveE5aT0VVK1RUb2xiM3RydDJ1OUw3TmFKOU92VE9tMXpRZSszcHRiVmRPbHZtTDQ3c2RTMDlyalQ3aXdnbThRMnVtankxaWI5MTVlQy9tU0hhMytyQ3FUbm9HSUpYaXQzUkpiUHhaOEJ0TmJ4SC9wWGlYeGJaTk5QcGxnRmdhNHRJMExFTTNPNW5iY1NxZ0E3UU9hdy9pbjRGK0xIeGYxK0hUZkN1Z1gya2FUb3IvYkx6VGhJb3ViKzZsaEN6WE03TWVwRHR0S2dnZ2tIbXRYd2QreDc4VGIvQUVTeHZkYzFhWnROdmRFTm5ZV3UzOTVwcE1pa0lEZ0ZaRGd0a0RBREhQQnJHcFRvVThNblVuR01rNzlicHErbW0zUi9oYzh1VlpTbWsybDVYV3FhdmZycGRDNnpkeWFuOE52Qi93RHdnMC9oN1R2RE9ySTlqck4xZEFlVFk3bUtNbXhqbG5qajV5VHhuSGVxdW5mQS9SdkRLV09vTjRpaytJSGh1MWt2bTBmUzlNWC9BRWlKNENBMDh3Qk83R1ZZS3VNZ0RKNHIyTHdMK3dqcUhpN1h0RHVQRWxuZWFMNE44SjZWSkJieEM0V1M0dlpaV1lMNTIwQWdNejUyZGNLcEpBclk4RWZzUnRxbnhwMG0rc2RRWHdiby9odGJtYS9XMGtNSmVZS1Y4dFNISVZ3cktRQmxUa25uSXJqam1GQ1A3cUx0ZE4zdHJyZlJ2dlpXdXJXdnZ1YzhjWkNOMDU2UnU5TGE5dFZyMTZlbHRUNW44QitPcEw3WDlBOFZYMTFhdDRVdTRXbWl2Wk50dnZ2bzNEZlkxV1RJWGFxRU1GeTNJNU9hdWY4QUNiM3plTE5jdkpMRzQwalM5YWU0dDlLdWZQU2E2a2lWSW5DeUJsQzRiNWp1Q3IwYm41ZVBvVHc5K3pIOFB2Z2RINGprK3gyZmlEdy9yVi9KSmNyY3VFdmRIRG9Bc2xzeEd3T0R6bmFDMjdHUlhQOEF4VzBENGI2NTRQdFI0VjFpVzNodFpqYVR2cWs2K1hKRUEyOTVWKy91WGRqY01kVFRobVdFbEw5eW5ibzdXYTZyYnIwOCt5Ti9henF5NXVWMmRrOU5QK0I5M29lR2Z0SytJL3NYdzMrSG1sK1Zvdmhmd25jV1p1THV3MDl5MDE3UEZJM21va29ETnpJTnVHM0ZOOFpPNnNEVVBFcy9pQ0lRNkZhYWg0YVR4TmFXMXg0YVczVVNYUzN0dGNicEZ1WmlvTXBWWkp1U3FnY0RuSFBWZkVTMnMvaWg0TDhONkJvVVhoMjR2dkRlb3phcU5UdWI5M0Z5R2szdEdtT0ZoT0EyMEE1eDFQYnkvd0FmZkh2eHQ0RWp0TlhiUTVKZFAwSkxpMld3VXVWM3lIbHdTQmhUbmFkdlBKUEZmUTRLOGxHbmgwbk83YjVtbHE5dEd0YnUycjZLejdtT0lpNFUyNjZmSXRyWGVsMjc2WDNYejFaMTAycVhYZ25VOVdiVjJpdDVyb1NTVHlKYktYRTJ3Z1M3V1lZTFNaeVI5M0hmSUZWZkJYZy9WTlJ0cHJ5RHpOTDB5U0daV3ZJN3piY1RxaEhuR0lic21VcVN3QndwVTk2NXZXUDJsMitKbXIvOEpKNEI4TXI0Zlc4OE56NkpmYWRlM3F6L0FHcnlZQTgwaklNSGFDQ1ZIR2RvNUp6WEIvRGY0NmFEcmthMmMvaUswczdmUzdLM1dLYXl0cFlVZThXVERTeUIvdlNGTWd1dU1nL2hYWlR5ZkVLbEtVbzJsRzE3SzluZTNUOE43OU5tUkhQcVVwcUVIWlQyVGZTM1o3ZjFjOUUxSzkwbndWcE40dWx5U05ObytveXkyMDEzT2txWEJaVklNZzI1ekh0Y2Jza0U5aGl1cXRmSEI4Y1E2cDlqdXA3clE1RkdybUNOL0tlNkVZS3NpNVVaVExzUjA1Yjd2Qnh4L2lDWFJQalZQcW5pWHc1YzJ1cGFyWTNOdll4YVBicTI2eWdMTXpYQTQydHZiTzdJeGx2VnEydkhCMHF5K0RrTnJwZXJhTHBwYTR0bGdTOWhtV1lmSTd5UlJzQ0kwajUzRXVEdU9BdU9SWEhQRFJseXhxSnFiM3V0cnBON2ErYWVtNzZXTytPS2pKWGcwNHJydjFXdDMwTkxVZkNXbS9GSHdUNEh1TFc0bXNiZTMwNTdaaGV4b0Z1eEc0VlhqWUVaT3orSmdjWXh6MnpvdkYrbzJuaXZYTGp5OVFtalcxZTN0TGU0Y3ZJcEN0R25JSUJRakc1ZWNmS00wbjdOL2psZkEvd3d1SU5QMEhSdGFtczlHZTRsdk5SRHQvWjRCYlBra3NBek1IKzZvejh1YTVmeHY4TTlZOFo2cG9kOXBtdGF4WnlaTjlmWFR6bTNzZktkUmtLdU03QXlnOGs3dWNDaU5CZTFuUXF5dEhXemZxM3JidnR2ZjVGZldLc0lSbEZiZEw5N1h0NUw4VGU4QmVHYm53WFlSK0hMdnlZNzdVQ2RVVzZrMkxPNnJIdmUyeHl3SUtuQUpIQWJqTENvUEVjZW02TjQxdlBJdDdLODAwRDdXdHNaR2xsYmRocENxajVWakIzQW5HUWNkZTEyeDBmVk5RbHM5VTFpemsxR0xUWTVUREpGQ3F4cEVDeXh4dUhHVys2MlNwM2RCNjFhcy9nNXAveEJrMHUvdDU3cU82ZEk5U2dsZ1FCMnRkaFo0Q080NkRBd1QzcFNydzUzT3JMZlIyNy9BS2JmbllIelJkdm52OTU0WjhmTlJoOFUzTHpXT21yWnh3azJxeHFETERER0VEQmczSHpFNVBUdlh5bHI4Q3hYa3pvOGpQSTVRNTV4em5pdnViNGhlQzdPeHRMMHJZdzZYYndGbWxTV1p2TGpVNXlGSDhSMnFPTTljRE5mSWZ4YmcwZi9BSVNiVXZzTTEwdHI1eGt0R2EyOHMzQ0ZqZ25uQ2tER1J6eVNNOFYrbGNINHVMaTZjRTdMK3ZNL00vRURDcVVZMXI2K2ZvY0ZjSHlFUnZ2YzhIME5kNSt5OThRTHo0ZmZIN3d4cVZ2TmEyclIzOGNiVDNDR1NPTlgrUmlRcEJJQVluR1JYQ1hwaWxLNTNlWXVTMjc3cEhRWXB1a1hMV3JCa2J5MlFod2ZXdnU2OUZWYU1xY3Z0SnI3ejhsbzFYU3F4cVIreTAvdVAzSTBING95ZUdia2xicEpBdzR3M0g0VVY4MS9CSHgxTDhUZmhKb09yTzBpM0U5cWtjbmJjeURheEhQUWtHaXY1d3JZQlU2a3FjOTR0cC9JL29halRwMXFjYXFXa2tuOTUrLzhOcXpNSFBPYTBZcmJ6QVd3ZlRwVlRRcC90R041SFh2V3drcXFCODM2MTg5aDR4bkRtWitaVnBPTHNaZXF6UGFXallKM1k0cXBvbDNQY3lzSkdPTzJhMTlRaVc2ai92ZXRZVnhPMm16bFYrWDByT3RUVk9vbTNvVlR0S1BMMUg2cHBNVjNJY01xbjByd245cnpTdjdOK0hWeUViYTBpa2NlOWU1WExtUk53SjZaRmVjZkdqNFpUZkV6UldzekkyT3ZCNlY1ZVlVMDROVTQ2bnI1VFc5blhqT2IwVE1QOWkzd3pIb1B3dHRWalg1blVNZU9wcjJxNTFLSzNzM2paUUpQVDByem40TjZITjhOTkFTeWM3bGhHMEUrbFNlT1BIVVZyYk0zbWJXSko2MW5RcmV3dzk1Rlk2THhPTGxLUFZuUC9GVFVKTE9TUmp0OHZ1YzE4WWZ0UWVJclhVcks4eXlobHlvcjEvOEFhdjhBMmxQK0ZhYURiM0RLdHhEY05zWWc1eDA2MTV6cFB3MTAvd0NOSGhJNnBOY1I3YnI1MUJQQ2cvalhEVFRjMVhpbnkvNUgxMlQ0ZjZ0RDIxZlJQWS9HL3dEYkcxQ1NieG5kZnhLdkE5K1RYaCttZUJ0WjhRRGRaYWJmWFNzY0JvNFdZZnBYNzlYSC9CSFQ0ZC9GeU8zdXRWVVNPeC81WnR0ejlmWHZYdUhnUC9nbm44T3ZndDRSdDlMMHZRN09Rd3FGVm1qQlk0K3RmdUdYZUkxSEJZQ0ZPbFNia3U3U1g2cytMei9LOE5qc2JLck9xN1BvbHIrT2grRmYvQlBiOWtmeHRkZnRMK0U5U3Z2RGQ1SHBVZHlKSlpKWWlvQzRQT0RYOUhHbGFaOWsrSDFuRGJ4bUpZNGw2Y2NZcmdmQjN3NTBmd0RyMGMwbGpiMjhDOU5zWUdCV3Q4VnZqSDlrWDdEcE1rYVJ6SnRCeU9udFh3UEVuRW45c1Z2cmRkS1BLdVZSVys5NzZtMkZ3S29RamhNS25hL05kMjNkazl2UTNOSnNMUFdycGJ3eUxJYlVjcm5OZGw0Ym10VGVRd3F3WmdUSW9VL01NNXdCM1BJTmVCL0RxZHZoN3BjY09vYWtyM1dwVGhjc2VvSjlLOTYwR3hobldHM2h0MmUrWXNpU01jYmxQVDVoeUFlZ3h6WHpPQ3FPYzlFci9tYlpoUVZOYjNYUmtlbStLYkh3L3dDSUxtR0NEL1NKSFZaem5ydkpBMzlSMzdqajZWMG1uckRkWG9qbWptalpmM2tiTjh2ekwvRjdaNDU2R3VGOEt4TjRTOGE2N0ZlNlF0dlp5WEhtUnZGRis4TEpnQkNBd01tQ1NSa0RQUFhBcnROZTEyRzB0WVh2Ryt6eWNETXd3c3NoSENqUFk1N2MxNk5HVW8wcFRuSlhUZnUydGJYWHR2djVzODNGVTE3UlJncjNTMXZmcCttMWgvamQ1SVBDbDVKRnFEYWJOSkE2cDVrY2J0Qy9SR3gvRU1uZ2RQV3VLOFpiTlR0L3Q5bGIrZGNSbUdQVGVSNWMyRkpETWNFZ0VnSFBUa2l0cnhONG0wblRQQXQ1ZlRMTGIzV29ONUZsdmNrQjJCQ2wrUGxUSnlldy9HdVI4WDJnOE0zUy9aZHNqVDJTaVczQkJWU3E5UWNaWEdXNmVvNDRyejhkaXVSS1duSTBtN050cDYyMzI3MlZ1ak9uQTBXbjJsZHBYVms5cnI5UHY5VHkzdzU0d1hYYmJ4Tm91dWFGcW1zWEVHbzd0TmhnVHk3Uzh1SWhtU1JYSlVNb1pHSEdRTUFZNzE0SCsyejRJMFh4aG9PbytJcjZlL2oxYTRsamwwN1NyY0NSWXBZczcvUGozYkZPMlJpR1laSEI3VjdUOFg1cmhMYTM4Ulh0NHVreldyUlRyREhFc24yUDV0amRnWk4zWE9jSElOZUpmdFRXdW9XOXpvN3RKL2FHb2F2SUluV0prTXp4c3lnbVBhUVdJQzhaeVR2SS9oeFdHRHhMZGVQczFwSFMrMTc5Vysrci9EYXg5M2x0Rkt0R3BGOHQ5MTBUVm0wcjZXZGsyMStUUjQ1KzBCZkxEb3QyODMyYlQ0TlR0MTN5YWVnZVdVUWJOdm5zdnlrYkRJQUJ5UVBmbnlpUFd0SjhWNkxxRi9xRmxISjRaME93RjlvMEFSTFdGZ29ZL3dDanlxUXpGbXdHSHpFQmpYY2VOTHk0OFRXOENyb3o2YnBkMVl3Q2JUcGJmenZzM21PMjJYZUNHQmJ5dGpBNElCUFBTdUZqOEdhSjRZMFc0MEt4czlOdmxobk52YnRFV1pTakFib2QzSzVWenVCQXlOdURuakgxMkJrcWNMVkcrYTYyN2FYMTZQWmVsN00rZytycWNFbHZyK25uMjgyYVh3SHZiWDRsK0NManhkcm1pMmVtK0laN1pqYXJiV0lmN1NJOXV6WnVjQlI4M2NIZGc5NlQ5bkJyelc5TXZibnhoYXgzMXpkWGM3L1lmc2pMTlBJdVNIazI1MmhzWU9jNDJqZ1ZiK0tmeE8wdjRWZU4vRFBodlJkUHVMaTNYVFJiM0NBNFVTOVdqTVFVWXhrRU9laFA0VlByL2lXNDhkYUg0aTFTVnB0RTFYVk5VaGZUTHlKMUVsOWdQOGdHM2IrOERNQ0JoU0ZROGNtdGFqbkxtZkx5eHFOT0x2ZXl1N0pidEwwN0NqQnVrdDI3V3R0cnB2MTIxNy9wZytDcExiNGx0cXJXVnBwaDFUUlhrczViR1p5OXhzVjJkbXdnNVJGWWtBOEU5NmY0OThTNk44TDc2M2JSL0UxbjRrOFZYNGV4WFRwZEplWmRNQWNqQkxQc0NsQ20wZ2JsQ2tIbXMreTBQVXJkYmhQQVlzcjNXTlgxQ0VYVnZadi9BS2JjZVdXZVIzQU9BNjRjRUtPUnR6bk5XUGlIOFZuOEVhL285anE5bmEyVWMwa3V0UmVkWkNTOGVXUEtUQkpWWGp6R3o4cktSOHZBNHJwcDBZeXJPTUZ6SnAyajEwU2J2dStYcDVvMWxVYnR6TkpYVjBtdFU5TGFydjI3Ymx6eFo4Vk5LOFJlRU5jOElYMm4yVW1uNnk4RERYa2d5bHRjeFovZHh5dDNZbjF5b0I2MTFmd0QrRk45NDQwUzQwSzNnbWt0TlVoVjRvSjVWdGJ2VlpGM1k4dVFoaWlqQ2pkL0VGSngwcjFQOWhMOWhidzkrMVJISjhRUEZWcGREU1lyZDdaZExoM1JyTE1yRkdubWQxMnZJV2JkOGdYQUh1YSt3TmNrOEkvc2IvRGFHWmRKdEdlMWlFZW5RV0k4elB6TVJ2NmtOdHo3YzE0ZWE0eUdIaEdqaHIzdmQ5azFvL243dHUzbzlUeksyZFFwVlpZV2xUY3FqZHJlZlQ3dEhwYnlQUGRJL1l1MHJ3WDR6MHZ4SC93bEY5NFBHazZTOERvSnZNanZ5NWladHNtUXlBQWJTVHljbnAxcmx2Ry83UlBodnc2K3NlRU5JczQ3ZEdoa2VPNmFRc3hpS2ZNZDdrNDZaWmxPZmJOZUxmdFBmOEZDbCtKLzJpQ3hudUw2MHMzbHVKNUpPdDBoWUtnOHNBREF3eHgySDByeFJkWnY0OUEwM1dQdDF2ZjZ4Zldic0V2YzV0TFpvd2ZtVDd1UXUzanJrREhXdVNsbG1JbWw3WFNNZEYzZDlkZjE4dXJzWGg4dHF1bXA0K1Q1K2tlaXRzKzc2NzdYMHNldzYzKzNGckZ2NE9qMG0zdFliZHRHbTIyOGtNalhMU3JHdkdCN0tTQjE1NXpYTStEZjJrZkZkL0JONHUxZlV0VS9zMitsYWVHM0VTeHpoTnJCWTJ6d1d5cW5wa2hUeDNyejNWdkhtbStDU0xYeTc2SFdiV3lqbmVDUzJYYzZ5eHFlUGxKS3NweXU3cHU2OXEwUEFYeFV2dFMrRlZuSUk3VzN2dFBTU1c4c2I2M2pEQzBtVkl2TkJSdHpOeVNCZ0JjRTk2OUduazhLY0pTVk8ycTFmNlgxMTdyOVQxSlN3OElybGd0YjNmVnIxOWJmZVh2RXZqRzY4UVdkMDJyUWEzYnJFcVF4eFNTZmUzSXV6Y005UG1CNXdPMVUvaVpydHg0VzhKYWJCcW1oelhTMzVqMDRHT1V0SENya2hwRkJiQnljNEdTTTF6UGlPODFOSWJlVFNZWkYwK0ZSSGMzTjFFSnBicTFiQUVtMFoyNVBRZGVPOWJXcjZ0TDRrMUxUb1lWdWRMaDNzbW1UUENZcHBaWTVDeWtMSU1ZSlk4SG5pdXFHRWpDVUcxb241Nlc3OXVyL0FETkpWSmNxU2Rsci9TT1A4QldXakh4RHJYaCszbUVOMW85b1owYTZiQnlweXNmSERGdWdIQTQ3MXZhdjQ5YnhkNFZqYTYxQ3o4blJZV0Y1ZHVxK1RPaXFXVlZ5QmcvS0VBSEpZZFRtcSt2ZjJmcEhnblZXdTdsZEwxeDdieXJ0L3M1M0c4SmFSQnV5T1RrOG5nN2VuSXJLOE5lQzlPVHdPMnBhdHFNMm9SM0Z0OWsxR3ltZFZXWjFJSitWTUVFZ2c1T1Ruam5OZWpLbkNiZFdiYTFTN3R2cmJwcjAxN2JrMUsxNDJ0ZDlMbkxYL3dBSFBEUGpid2xhWDluWXphVGROSVVsSmphTS9OeUJuT1czTGtZNjRIZkZmTGZ4UStBZmlEd3A0MTFEK3o3RzZXMTN2TERGRW5tTUU1SUtrRG5HUFRqcHhYMnBEOXU4Vy8yYmV4NmZhMk9odFpQZDdFWUw5a0NPcXhGYzk5dmIxSHZXdDRnOFNYL2piNGZSdFoyMmwzY2w5ZEJyaTd1bEZuTEp1SmZ5dG5QUTUrNWdIcmdacjZISytJc1hnYXN0ZWFMZHJTZTJyNi9KL3dCTStiempJTUZqNlVWOE1sOXFPalg0YW8rTy9nSCsxYnBQd3MrRG10ZUZYMGZ5ZkVIaVNUYmY2K1puRXl3amQrNENqR0ZMT0dZa25sQnhYWDZ0OFhmQnZqdWE0c05kdkxyV2xYUzFnaGFGbjhqVDVnTm9ralVIQkFCWEl4MVdvZjJtUDJQR2swcjdkcHNkeC9iajNFb3VZRWdHMVF2UEpIUWRmNGZmTmZMRWVxNmo0S3ZieTNYekxhYVlHS1hkOHZIY1YrZ1lQQjRET0U4WGhadU0rcVQxVDAxdnZiVFMzUS9OTVptT1laRTFoc1hCVHA5SldlcTdQWGZ2Yys5UCtGcjZsNDQwRFJkSXNaYlhUdEp2TGExdDdwTGVEeXBiaGJaR2pES2NFczJ6RDR5QTI3b1FPT3cwcTlqOEVhSERhNkRIRHFHbTYxZHgyVDZiZW8zMnBOcjhTQThqY29kd2VRTVlKN1Y4VGZEUDlvZTIwL1RJZEo4UlIzdDlvN1hjY3QwYmFaWTdxUzN5dTlBeEIrYjVRUWUxZlFHcC90Q1hueDU4T2VIWnZBV2phUDRVajhGV3NWcnE3WGx3ai8yc2lNN1J6bEdHV1lyOHJFZFR0R0JnWitaelBodkVVWnBXU2hkM2JzbDVYZTkyOUZaYVBycnA5ZmwzRldEeE1GR25keXN0RnV2bDVXdmU1OUM2aDRqZzhLZUpyR3p1TEs4MWJRN1YydGJYSy92THROeEFadXE3VHV5UVNNRW44ZWE4ZmE1NGkrQml0YTJ1bWkrMUs3Z2EydHg1WU1nM2tqQVE1S0RibjV0dVNBTUhpdVcrRWtHcld1blc5MXJBdDViYXp1MWFIeTdrbU9PV1NFTis4R1NlRktrcjB6d2NHdlN2Q1BpSzYwL3huUFphOTltdXJpM2duL3MrSnJQOThKR2xNbjJobkdjaFdkaHRQRzBpdmlwWWRZZXJ5eXRLMjY3L0FOZGYrQWZaZTNVNlRrditEL2w2bm5uN1MvaG1iNFJpMzFDOHNiSFZiKytzWVpicTJTOWE3dDl4MmtNMkFCazVQSFhqbXZrTDRsZUQ3dTF2SkZ2Tmx1MEVZemF5ZkswSStVWVVIR1crYk9CNkgwcjlDUGloNFF1UEczd1Z2SnY3YThQV2VzQVMzbDVEWjJ5eHlUN1hpeEdnYmtNeXV4T09QbDZkYStMZjJoOUpqOGNYRjU0Z2d1TGk2dXBwMWlqdFB1dnZJdzVLOVNTUWNZQUhzT2xmYThINDVjM0pmcTAzcjVXV3Z6KzQrSDRvd3JxWWJuZXRsdHQ2L3dCYW56L3FLdzZmZHZIc1orZnZnakdEMDZaSDFxakpHa2MyQVB2SGdqc0swTGlaRmc4cVRpVm5PZU1ZeDJOVlpCNUwvTnRJWVlIZkZmcmtIb2ZodFczTm9mWlgvQk92eDdjWC9oRFZ0SW1iZEhwclJ5d0JuenNEN2d3QTlNcUQrTkZlTC9zSytMN25RdmpPc01LN283NjJtamxYSUF3bzNEcngyb3I4YTR0eXFVTXluS08wclA4QVIvaWo5cjROelNNOHJoR2U4YngrN1ZmZzBmMWhhTFA5b1RNY2c1NEZXclRWRERJd2xiNWZmdFhnUDdQM3hnMVBWSVdYVUkzWGNjOHJ3dGVtWG11VFhVeXRuYWg2bnRYNDFoOFpGd1R0cWp4OFZsODZkVjA1V0wzeGErTWR0OE85SSswT3hLOERBNzFucjhWb2I3UkxmVUpsWkkzWE9XSHRYSGVQdEtqOFc2cmJwY0w5b3RJeUN5OWdhcGZIVFZwSi9CeVdHang3QXE3VGpqakhhc2FtWU9VNWM3dGJaRzlEQTA3UWd0MjlYMFE3NGkvdGkrSGZDV25UU2ZhbFpvK0NvNjE1WDRQL0FPQ2d0cjQrOFVmWTlPUm1Yek5wSlBOZVA2RjRGczU3alhwTmMzYmNOOTgvSnU3WU5lZC9zNmFVUEFYeG5ra3U0dzJuWFUvN2xnQ3lqbkhCN1ZwUXFRcXdsT1RkMGZWUnlIRFU0U1MxYVIrazNoM1dianhUcDZ6TWpLR1g4YThYK091clRXZCswTWtqUXhSZk96RDByMjc0ZjMxckhwVnVGWUtKRUdNbjg2NUg0dWZES0x4VnFza2pLR1ZsMm5CNlpGY2VZVXB5aEdVVTMzUG44c3JRcDRpOVRSSDV3L3RKZkc2SDRuZUlZZEIwMlY1ck95SiswSHJ0UCtSWHpSKzBoKzE1NG0rQjBjTm40ZHZydFZ4a2hBeFZjY2M0NHI5STdiOWlIVDlPOFNYc2Y5bTdZZFNQelRBY2pyVkxWLzJTL2c1NEpnbTBQVXJleTFEVUxoU3lyT1E3N3Z6cjZUSWN3d3VGcXhWV2s1UVgyWGJYdWZVWm5qcU5YRE9oaFpOU3RvMHIyOHo0VC9ZOS93Q0N2L2pyd240aHNWOGJMZExvY2tnVVR5QmxYRmZyUDhJUDJuL0R2eFgwR3gxUFRkUWl2UHRLZ2phYzR5T2xmbUQrMURkL0Q2MkxlQjlSMFcwc29vWlJIYnZFb0RiYzlqMXJ0ZkEveFUwYjlsTHdOb3NHa3hyREhFZ2N0SkpuanRYWm4yRHd1TTVLK0ZwT25PVDBpdFl0ZDE1bkRUeXFwT0hKVWtwV1h4YUozODB0TGZpZmVQN1RIeHJqOEZhRzJBSkpteHR3ZW5OZVN0cTZmRjIyc1VpdW10MjNqYzZ1UnozcjQ5L2EyL2FhMTM0Z2FObyt2YUhxRWMvOW9UeFJQQXAzY2JzSEEvclgybjREK0hPbFd2N05saHFOMWVmMmZlQzJFa2twZmEyN0dhOEd0bE1JVUkxcDZPVGVuWFRmUTBqQjRPTVlOZTlwcWxmYzlWMDM0YmFiY2Fqb2ozdDFKTThNc1FqMnk0WXRrVjc5bzhUejN0bmI3WlAzYmh3OFp3UUFlN2VuUFE5Ni9OVDluNzlvWFV2aUgrMVY0ZjBmVDcrYTUwbTN1ZHI3bzk2eUJUempPZWNkKzFmcERlYS8vWVZoY1hHbitZckt4V1JaUmdSci9lNjlNY242VmxHbEhEeXRVMDJlbTdYb2VMbldGcTAzR0VwY3phZHV5MU9KK3l3bjQ2WEVkeHFWODE5TVV1WWdaak1JazI3ZHdIQ2diZ01nNTVIdlhvbmlTK3MvRXEyOW5mUnlYUzUvY3o0MnJ1WEhJWWNxYzRIVEZjRGFhVkkvaUd4dUYwU3htdUhXUzBSNExraG9nRVJ1TWNGaXpkTWdkelhjYVRxc2tGbEhMNVhseUtzc2NxdHRkRU83QmI2Z1o5cTVNTlZrbzFGUFJTZDNvM2ZiZTl1Ny93Q0dPSEhSdktFb3ZXS3R1dFBTMTJ0aU9mVExiVEx1TzZ2SWR5Mjh6cUJLQis2TzBibWpZL01RTWtaeFhOYTVmelRUMmR4Y0JyRXd5WlVTRHpUYzI3Y3NNNTVibFNCOWNWcmVKdkRNbXNSejNOdmYzVnhjVzdrZmZkNDBjakpPRk9BT0FRY2VvcnozeDNxeTZENFp1Tld2N09YZG83QjRwcmNqZklXQlB5N2g4dWR1QURrWXptdWZGVnZadExrc3RXbGZmdTlPMXRyMjlUVEIwWFZhczd2UmZmc3RlOXp6M1h2RGhsOFo2anAyNU5Kdkw2NFNRM05vN3E0aWJMbEpOeS9LMkZPQU92cjJyeEg0M1RhZkg4WWRMR3BDR1BRZkN0MHIzdHVzVWlOYlJobU81NXdkaXFIVUVmeGJzWUJ6WHR1cC9GRFVMSFNiL3dBVmFqYXgyK2szcXhUV3NEeXA1cGpPN3kyZmpJYnNISjI0TEhucFhsWHh2OEUybmlHZlVJNW0wNjUwT09JeVhVQmt6Q3kzRU85ZDZnL3ZBamdON2xnQmpGR0V0UnFRYnVscnBiYSttMzQvblkrMndFMnB0VmUxcnAzMXNrN1B2clpMOGR6d1RTZkdYL0N5RHFtdlc4MzJWZFcxYmZNdHpHa0lnVkN3RzExT0dVZ3Iyem5uakhQRStKdEI4UDJmaTNXTERUNzJTOHRHdUZTMmppbHlrcmhTc1pYYWQyUzRCM1p6d2M5YXI2eDluMHJ3bGIyYTNtbjM5dGVRdGJUM3NGcXF0YXNyaGpzVWdCaVJzWENuSXdlK2NjN3BNYTZSWWVGN1ZiZlU5TnNOS1A4QXA4OFNlZXp0OHpiV0tnQUFzUWNaQndSaXZyNk5HemxPRHMyOXZSYjkraVMwdnFmVHhvcUd0L2Q2ZmhiejhyZGpyTk0wTzdqbGIvaFBwcEkvRTNpQy9rZSsxU2VXTHpZYmVTQ0lLR0NubU0rVHdSenVZNTYxTWJxejByVlA3UDhBQzBLM2NkbnFrY0ZwUExjQ0d5VTVXSm1TUnM3dkw2QUx4aGllT2xjNWRmQkN6OFltK2F5djU3cSt1UTg0VTI3Vy9rK1k3SzQ1TzVodFVuNWdNY0FWdCtFTHpSOUwwaFk5YzAyM0xlRHpFb2xpa0czTzQ3V2pVRldrK1plZVRrblBUcHZXcWUwdkpOeWZWYXBMNVgrVmxidnFjdnNWRis2N3JvbHArRDExMjNORHdyOEpwZkEzeEwwWFVyN2RhMmRycXpTWHV0MnJvazJtU1NCaDV4WG5IS25xZVFLOXcrQ2Y3TE1YN1JuajNSL2lIYXRkSlp1LzluL2JSTEhMUEJuZjBWZ1YyK3F1T2M0NmMxNVg4TS9odHFuaUx4eHJOanBlbkNUVmRXWnJ1NWlsVnRvWmxkNDFVSEk4dG9zRmpsaU1IcFg2TWVFZEFoL1pyK0NkbkZkYVBadytJUnBvbWkrd3c0dC90Q29EakNnQldKSXhuMHhubXZFeDJNbkMxNVdhMHZyMTNWdlBvdXZ6UE16akdUd3lpcUxUcVQwWHAxZHZudmUzbHVjZHI4cmZzMi9zMWFqY2VHb0xCbzRWRnVZN1pVZzNGbHg1bTNQSkxCaWNEakZmbng4WmYyZ2ZFM2liUTVMalVieTh1bXVXa2E4c1k3M3lsaWppYzdXQ01HQmJEakRkMUZlbmZ0Si90QTZwOGY3TzF1THpVSVJKWmFxUk5CcDI2S0tDUkk5cnE4YkVobi9oSVBUSDByd1BVTlMweVNlV3p2clNiN1BmUVNYMDhLeXZsRXl5TWpFZjZ0ZTRHQVFyOXdCU3l2SzZWS282a2s1Tyt0OWV2VHRmZjE2bm9aVGg1VUtUbmlFdmFTZDIxdXROcitYZXlPVCtIV25qeG5lMmV1WHl3Mk5wWngvWXJocloxbjNUS21VUlkySTNLVklMTnRJejM0cjB6Ui9HV202SjhDejRudlRKWjdiUGJPVXpQSGV4eWJWQ3JIOHFvd1pBU1RuQkFQYXNHNjhQeVczZ1BVTCs4MHZTL0RkdlozQ2ZaTk5WWDh5N2pQVEIzQTV3QmpjVGtiajFybjlLMUxVTlAweldmaHY0Z2t0OUx2TCtSVFlhWUxkQ2dWNGhrRmt4c0gzVytZa2pKcjZtb3ZyUHZSMFVXdEU3dFIrMVpxOTJrL05KSTB4RlMrK3Uydm12K0grODdMNGxlQk5Nc3JmZE5id1dWL1lXcTNRdEZYYk1rYnhzUks2cjJUZU9UbkJDZ1ZEOFB2QVdqNjdlUmFwRzBNZmlDNUJUVE5RdUQ1cmFoY0RhMFVmQkFSaXBiQkk1STVwdmgrOTExOVQwUFFkZDFPUFdkYVd5T242VXFXZ1Z0VGFSZ0VpY25DdXFrRVpmS25IVE5SNmI0cXV2RDNndlhvWTdXMS80U1MzdDNsdDdXR04xL3NsMjJuenpJR0FaeGxTb0hDam5ITlpjbFdNZVNNOU85OTAzYnJyYmE5L1I2ays4NFJVbDd6Mlh5L0wvQUlKVCtIbHJKOFJiM1d0SmIvaVhOR1Q1cGxqOHBvYi9BSkFoVm1iSmpKUElPUUNlSzdidzIxN2IrQmRKdGRldTVFdnZOYXh0WkVFYlp1ZzZsdG93U04zeWcvN3VhODU4TCtNcjJUUWJpYTRiVDlhMDBXZ3VaTGh2T002ek5JaXU3RGNxZ2c1eHU2N01rZDZ5L0g3VGFHMXJjckxKZFJ3M2tsNGJtM3VHWEIrNmlwdEpFWU9jOERPQjE3MXBVdzdkVjA5azJyYmJwZkxmcXZ3M0xjVlh1MDlybm8zeGwxdlJmaDFZNmhEcTJtNlBKNDk4WGFpSU5QMFpMc1h0dGFMdlFtZWU0WmQ2cTU1QUJCSEdDUnlQRzVWOFVXbmd4cjd4QlBIWXpNSmJWOFdMZVpPdm1obExTNDJzck1PRzVJOXVLK2dQMlRvZkRYamI0K1Q2bDhSZGF0YldUeEpwSXVKcERNdXk1a2cyZVhGdlk0VXlna2J1NEdCMXI1SitLdng0OFJUL0FCWTFQdzdOYml6MEgrMFZ0b29YbGZFVnVzdTRIUFhHQURrRGtacjFzdG95cnlkR2pCYVdsSnQrZG1vcDMwL08xNzdIbGUxVkJ2NnhKeWF0YXkwZDFwcnZwYi9QVTlBMG0wdkwzeEJyV2grS0ZtMHo3SEd0cnRuUG14eXUrMXdvMjQ2a1pHZVR6MHJyTkY4SEtQRE9IbmhleFdjeFJ5QzNZUlRHTkFxc2pkVmZjT1ZIVDFySjhQNmJZZkVtV1c1czdXVzlqMEZwZFFSNGJmekVmeWRnajJ1QXJNRnc0T2NZNjlhaytFSGpXNDhiZUJyclNMdnpvOUUwcWVTS3h6RXJ6eVN5eUJueWVTaE9GNUJ6azQ2R3VmRnFVb3VTOTFSdGRkbS94dXp2b3k1Rm83dS80TkcxOE4vRm1peGFCNHNzZFllK3NiNVJJWWJQVDVRdDlxU2xTTm9iR2NER1hKQkFCeFh5eCsxNyt6M2VYbmg2RFdKTEdHeHVwMkVrVVNyaVF4TmtJem52dTJucjNCcjN2UWJEVC9oajRydHRhdU0zVjFicUpCRGVPei9hVUkrZmZqREZEeHdwSEhldlROWThJTnFrbG5IOW9qMUd5dnJhTy95OEc1YmVIYUJ0QklZaEYyZytnSjdacnF5L05IbHVJV0pvYXA2dno2TmVsanpzNndGREhRbGg2NjBrdjYrYWVwK1JNOGMya1gwa2MwYlJ5Umtvd2NmZDdWM1h3bytJRXZnZlhyUFVMZVNObWhrWHpGWmZsSzlTdjRnWTRyMno5dTc5bXF6MGU0dnZGbWkzZHZiNlhKY2VYRllmYUZua1JqbmNDeTkvbFk5UHk2Vjh3NlVQTW0rUmx5dzJybjg2L2NzSGpjUG11Q1ZXT3pWbXV6Nm8vbnZIWVBFNUptTHBYMmQwKzZQdjc5ay80MjZmcDJzK0tkTjNMY1dmaUtQemIyV0dNekxjS3VId25tWWZLbG1HUmo3dWVhNkNSN2Z4ajRsdDdPNHVwTlBMUlFoV2lkNDFFWEovZXQvZE9OeEpQUmNkcStHZkNmajIrOFBpQVc4aTdZM0JKa09WUEdPdWUxZlZId2grUC9oL1h2RjNoaUhVRGZYRWs1anNycTVWbWdqWE81QkU4Z2I1bElPQUNBUG1ZVithNTl3N1VvVm5pS0tiVFhUVnF4K3djTzhUVWExSDk0MHBmZGU1NnBwazFqNFhqMWUzMDNXcnZWcjRtYVJuc29aYmlRcEhBN0pPck9RcXhHVEN0emtBWndSWHkzOFg5U0dyVzFscUdwU1hGdnFUS3JPalI3bGZCSXprRUFmTDM1M1o2ak5lN1dNTnI0ZmVPVzNrdkpkZWplNFNjS1doU0NKU3dTTUJTQklHRGZOd1B1Z2V0ZWUvdEFIN0o0VjE3U2JpTFJ6ZFhCaWx0SjdhRGRkVHl4dHNkRVlaQ3hrRjJJQjVLOWUxY3VSeWpUeE1ZclZ1MTMxN2ZkYlg1SHJaMWg1endzNTlFdG5ib2ZLZmpDeEdqYThzY2l5aDFPV1Zsd1FUNmo2WXJIdXJseE95cVcyOEhiakhUcFdsck41UEhyVzY2a21sbk9DenVQdWtmWFBTcUxNMGZtZWI4eFlaM0Fjclg3TFJ1b3ErdWgvT3VKL2lTdHBydDJOTHc3ck56NGMxS0cvczVwWVpvYy9PaHdWeUNPdnZtaXMzYVdoYU1uK0xnOU9PdEZaVmNMU3FQbXFKTitnNk9NcjBZOHRLVFM5VCt0VHhWNFNmd2xvQ3RwOEsrWUJrNEdLNW54SDhWRjBMd3F5WE1pdzNXd2tMbnY2VmM4YWZIZHJmeFhEcGNOdTB6VGNZVmNnZldzbnhKOE5MSHh4SkpkWEs1bVZOd1gwTmZ4YjdSU255MHR0ajlocDBYSGxsaWRucVh2Mll2aTVwL2pSN3lHU1ZacnFOaXBSaHlLYjhZOUoxYVhVcDN0ZGtNSVVzb3gxcnhYOWxQNFMzM3c2K09PdmF0cUZ4OW5zcnlaZkpWbjR4ei9qWHRYeHV1N3k2OFdhYzlqZUJyUUQ5Nm82R2xXcEtVRzR2U0xYNDduVlhwMDZPTVhzbmROWDh2UStlL0dYd084VGZGdlFackczZVBUL3RVaEJsSEhHZWMvaFhaZU9mMmVyWDRPZnM3TFlySkhjYW5aeGI0NW4rODdBWi9uV3pxdng2MDN3ckdiRjFlRlk1Qis5SzlUWFFlT0xqVFBIbmd5SFVyKzYvMGVCUk1WM2ZlQTU1OXVLeldJOW5UVVVlaFZ4R0psVWg3UldoZTl1NThoYVArMFQ4WE5FOFc2QkhxbHExdnBMU0JHZFFmdSt1ZnBYMUo0SCtQOGIzVTBONXFNY2swaWp5NDkzelpOZU0vdEEvdGRlRWJ2d3ZIYjZTdHBjTmFxWVZJSDNXNlYrWS93QzBKKzFSNHorRG54alhVR3VwclJRZk9nalkvS3kvU3ZvOG55cXZuVTNUb1I1SnBPMjZ2WTdzZGhLS3cvMWpGdzluSGJiWDFaKzlWNThRVjBMd1d0eGVSNWFRNFhGZUZmOEFETnNOejhhSDhYNm16M1MzeUg3T2pIaE01cnd6OWdIOXZxMy9BR3RmaEV1bDMwbjJ2V3JVS0pBbys1Nkg5SytySCtJWDI3d0U4TFFzYml4WGFoOWNWOGptbjF6Q1kyZUh4TjR6anBiK3U1eFlmQ3p3OUsrSHM0ejZyWnhlelIrU2YvQmFmNFdhbDhIUGlqYWVJN2ErM0pkbmNrUVArcitZL2xYeHg0NC9hSzE3NG82ZloyVjVxTWdqdGxDcW9PSyswZjhBZ3VKOFRyWFVkTzB1T2FaWk5Ta1B6Umc1MktNMThoZnN3L3NVZUtQMm1mQnVxYTFvY0xTUjZkbjVGSHpPZU9uNTEvU0hBOWJDcmg2ampzeHN1VnRLVFM3MlI4WnhML2FIOXB2QllLVGJsQk9VVTdMMS9JOUYrQWY3UVdnK0Y5SHNiZlc1cEgvczl2TVFGc3FTT2xkTjhiditDbVhpM3g0UnBlblhrdHZvaTRqUkZPTjZqMXExK3pCL3dSTytJbnhodXByanhCSi9ZT2t3WllzU0RLK08yTzFlb2VIditDYnZnbVA0MmFYNGVYVUdWdE5sQnVmTWI1WmNFY2Z6cmp6REVjTTA4VzYwcGUxa2szWmF4WFgwdmYxUFN3T0t6L0VZZjJQTEdISmJWL0YrdjZNKyt2OEFnam5vbWpYWHdLL3QrK3NvNDlmMUlKQWduK1RiR2NIZU9NNXptdnNqVnRRc1VzcG52bFdHMTArWlpYa2xiYkZJU3dWRkpCejk0QVpJL2k3MTVmOEFzOStCTFB3L3FPbmFWbzl2Wng2WnB0c1NYVnNZd09NZjFyMml4OEpwcTJvMml6V3l6MjEwcksvbUxsWk9jaGdPaHpudWM4Q3Z4dkVPcGlhenFVNHF6YnQ5K2lmM2hqc1JIMnJxVkc3NlB6K1hiWTg4OExlSW9iWDRnWE45WnJKYjI4TjhpQ1JuSlJUS2lNMGFrL2UzYnVEaitEdFhVZUlOZS9zKzluamtpS2FmTXl4U3VTQzBqbHpnRlNCbFFDVHg2VndHaWVFN1RSdmk1cUVmMjZXMzB1eHVsdWpFMFNCUk1WWkZFWllidGh3T1FRTTVITmV0WDJsNlZmNkJieHozRVp2THBtbHQ1ZWZOWmdDVjU1M0JjY0g2am12bjZjYTlhblVqT1VWYTdXcXRkdXovQU9HOHJHMk05alNxd2NVNUpwZEh0YS80YXM0eUdKdkRFK3FhYmE2bGNMcUY3Y1E1dEpaR2VNUmtMbU1ObjVQbERFQTl5YXpQSFhodUhYeEhZNmhhd1d2aHNNa2wzRWpibkxrZ0luYnFNZ2tuSEpyWThTK0NMRzgxaHJxNHZqSGNYS3BHYjZGU0oxWUhjdjNSbnNSMXdNOXNtdWJTK3ZOVWptczRSSEM5dW9Ka054dWRwUXhIek4zR0RrRHBucmpGYzd4TW5PRk4yMGJTNnQ2M3M5Ky9TeWFYZTl1aWxGUDk3QjY2WDZXZGtycmI1WHUxK0J5ZmptUzFmUTdxMXRiT0hTL3NLU1c3elNQNTAxb0VZbFl6Z1kyNEFJQlBIT1NjMThzK0tQRFYxZmVDZkNONDJvd0xEcDJxL2FyMFRueVB0UWpSZ0VicytNbzJPQmdkYSt0Ylh3anJualErSklielZFdHJUVEpCRW4yU05QT3ZrQ2doWkhiZ3NXN3J3UTN0WHg3KzFKckV1dGZGR1R3MW0xczQ5SnRpd1I3Ny9TSi9NRE5KajVUd2dEREl5QXhBQjZWNmRHak9kZUxqWmFhYmJhcmJ5djhBZnJiUzU5UmtNbEp5b3A5cFNhdTdLM2Q5N3IwOVR4Ylh0U3MvRTB1bTZ0SkZhNmRvdXBTaWJUN1dDVVN5VzBvVjl5Y2hOdkRNZU04NHptdWIrT0hpTFNmQVBpRzExcjRiVzJxNjlvc1ZwQ0x1ZTltTWNWN2ZsWGpaa2p3QVBLTEtBVG41Z0QwRlV2aFhvTjU4VVBEWGl6WHRmMTl2RGVqK0hVVXcybCtCY1h1bndTTUEyTURjd1ZjOWp5Uml1dDhEZUV0RjhPZkN4ZnRNR3NOZWFYQks2MmI3Wkd1TGgrWTVZMlk3QkdmbFpqMTdBYzE5Nm93d2szRis4N3FMVjlPNzEwOGszZnJmc2UvS0tsRlhrN0xvaytxMHYzZHZ1dnJxYzFvZnhVdDViN1dOU3UvOUptYlI3bTN2YjF5ZUpHWlRqTE1Gd3FsK1ZBUFRqdlZId2REYXlMYTNXcmFsZmEvWjNGNDArazZYSE9ZYkZWYi9BRkxEYnlGVm1BMjg4QnVsWitnMitublZiYi9oSXJLRzZqMWh5RHBscGRZdDArY1phVkZQeS9kSERBNXhrQ3ZvUDRJZUZMZnh4YjMxcklsMXBlamFHck03dzJ2bFJ4VEZzUVF4cXBMeUFrRUVIQUJBSSs5V2VPeEVjTFRjb3A5TDdiYmFQZTkrMXJyYTV2SlJwdlZhZDd1OTlsYTM5ZHJIMVIrd0g4RExlKzBEUmRkMVJKckhXcmZNL214eFlqRVpkd0lsZmZoaU4yZDIzSkQ5UU1VMzl0ZjR4emZDenhGY2FYYitMTlFWWTVCWmxaTU00VVJLNHdjWVlzV1BVZGgxeFhiZUtkRzB2NGYvQUxPczFvR2t0bXRkSmlpa21rdldWck5GWEpiTEU3bkFKeWM1SkhJNHI0RCtOdnh2MDNVZk50OU5aZGRuMXdOS3VwWENMTlBiazRFY1FiT2Rxb1ZjcmdFZTlmRjRlaFBHVi9odnl1OTFkZko5UHoyN256ZVc0ZFlyRnl4ZFJ0eHUwb3RLeTYzdTcrZWh4T3RmR0RRdERXNnQ0YnFHMzAyMG5DWEt3Ui9KTWdiTWpFOG5henNoSk9lY2VtS2srSlVOcDRwOEsrSDF0cHRNalcrdlBNMUc0akcvY3JxcFZuQU9WWUtXT0NDQ01ISVBGWm1pZkIrSHhQNGtiVU5Rc2JqWG85UEwzTnpwc0VEUi9iTFlrZ3FXT0FjTjBPRHdwUGFzelVmaFRxbWsvQ1NTYlROU2h0YlBNbHZieVNRcEtGK1pYYUYrZC9HTnF2aGNxcllyN3FuaDhQQnh0UDNycmZWYSttcnR2dDE4ajNxbFNMbHpSdXRPblY2NmY4T2FXbzZqY2ZGTDRnTEpaUlcxcjRiMGU0TUVVOTNkaFd1VmkzQVNoRGhWQVhjT3A2anJUZkZ0dlo2TDRTdk5ROE02TFkydDAzbVQyaG1mOTVyY09BZ3d3eUZHOEZ5VHlTQVFCbXN2UU5GdXZDVHh0Sm91aDNsajRnaml0ZGFUVW8ybnNYTWhRc1YySGNwd0ZQeWxUaHU0SnJQdVBCdXFhUHJ0MWFRV3JYdGhvMDVXRzN0RkNSeGg0bTh4NDF6dkcwcUNDU0FCbml1Nk1hYmE1SGJ5Nk5kbnJ1Mi9MUjNWdW5EVXB6VDVKZkN1dnIxK1h6TlRVZEtqOEhHM3ZOWTFhOGptdHRsN0c5dXhIMlVxb2w4dU5UOS9HTTd1TzNhdXErRXZqdlMvR09nN1o3ZVNUeEJkWE1sN0xDa09KcnVFOG9kbVNHVUJkMk4zc01Dc25XOVNoMGpXSWJHNW1UV05RaHRSYVh0Z3NndUgzU3g3c3h1U3lsUnRVQXJ3TnB6NzhucUd2LzJIQ2J5eUxTWGwxQzhmMmkydFNJNGtMN1NyRWtGV0tvUVZJUEJIU3VhTkdWV243T1MxZlhiOExYdCtmUTZwOHMybmZwcDV2NUZ6U0x2U2ZoNXExM3BNZDVGck5yNGp1NW9KWHV5RDltM09Ta2tBVWtCZ3BZSGtybnB6WFZmRGJ3L3FQanVXYXdzcEpMbVc0aUZvNGV6YTFXU01vaDhza2NGd1FSeGtrTms5Y1Z4UGh2d0RjWG1sYWhlU1RlVnBQaDIxTDZJc2tjaDhxTHppOGlDUTV4SEdXYkRFWXpYcmZoWHdBM2o3d2pwc2ZnclJ0UXVoSGN0Y3JOcWIvWmJmVTNTRU5QZzd0NVpHd29aQmxzbXJ6Q3BUamQzNjc2YVBkZHRiV1ZsMVcraGxDVGhHeTkxdmUrM3I2ZjEwT1Y4QnpXT3YrTXg0YnNmczhPaXpRZlpGbmxaVGJ3M0tJUUZNaFliRkpWbUF3UndlVGl1T0hoSFNJL2pKQllyYjJlcWF6YjJxYWpMUEVmTWpHMGJtakJBMnNDdk83cDF6aXFmdzM4Vld1c2VNTG5UNHRXL3MyYjdDSjlRMWk1czQ1SW9HWjhPcUxMbU1vaFBEOEZSbmcxejJzYXZwc3ZpL1V2czgzbjNHVzJhbUkxa2lLcXJBbU1nRGNIUFFZd08xZGxMQ3loVW5GWCtIejF2MWUzM2J2cXUrc3BlMGZMZFd1dE5MSm4wSDRYc1p2RlRhaDRkMEtadElGamJlWmQzRnJDRnVGU1FMNXR1K0NWRzFobFdKR043ZGM4Y1A0ZGlIZ3Z4VGQ2UnFGakhwL3dCbkllYUd4aEwzTGh3VldVcXhRTXJNUVRna0FETllIaCs4bThEZkRQUjlTL3M2NmU4dllSRFBMQWppWjNVa3VadHh3eWtsVGdESXdhN0hTUGhocDh6NmxlcllzMnNmYW9Ma1MzRE15MmtjckFiVlU0T0ZrSkdEakJhdUdVSXc1bEozanQ2dE5KdmZicnI2cnp6bEYwOUUxWjIrUmExVDRYVDZqZlgwbDNvOFVkakNzVFMzTThqTkhZTnQzSTJRVGhOeWs4RW42VmxmRkxVTmUrRTNoOFdObm9laVhDNnNnYiswYnlXUzM4b0JSd0NCbGc1a1J2bTQrUVYwWC9DVHhhcmVOcE41RC9aK2o2ZzB1bi9hM25MU0pFSnl5dEtxQTd4bGdDeEJ3QmdWSDRxdkw1OUJnMCtHSmZFQ3ZDa21wMmFMbit6TWxWVm81R0JJVEFBeHU0MjgrdFk0ZW8wNHVvdVpkbTlOUG4vbDB1WnpqSno5bS9MWCtyOWVoNUI4US9oRnEzaWZ3OWNlRWRWYXpqMUtFeVhNalJJaFdiUDcyUTdpZmxkTWtqKzhPQjFyNEwrSkhnaTQrSFhqVzUwdHQyNjJmZzR5R0I2TUQ2R3YxRTA2NTFUd0w0L3VMR09LMzBtempWYm0xRXRwSGNPSE1XVkxlY3Jsd0ZkWk5wRzFsS2prQ3ZqVC9nb0Y4STdYd3pmMmV1YVhOdXQ3amRhekJncXZ1VUt3YmFvQUFZT09CMDU2VitrY0RaMDQ0djZwTnJsbnFsYnIrbnBxZkErSW1UeHI0Sll5QzkrRnRlNjYvbzl6NTVzcmhvMTNNVllzZUFlMWQ5OE5mSDE5cE56Y2FhYnk0aDAvVlRHTHBiY0RiSXlrc2pFY1pLazVISVBXdk10TnZMaTJkWGoyN3NFQXNNNEZibWwzekJJbGhjN2w1ZkM1WlQ3R3YxREdZZFRpNHMvSU1yeGtxZFNNNDMwUDBCK0hmaEcyOForR0xWdFlYVjRyZlJMZU80UTJzQ3FablowM2VheE9XM292QTdFRTl6WE1mRzJ6bTE3UWRNdmJHMHVMNmF6QlNGak1xUjZkR1FyS3JLTWhwUG1Za0VnRWtuR2MxeGY3TS94d2Z3UHAxcnBWL3FVS1F4aGIzYmxKQk03cWRwazRPN2JoUnRiSUdXR1BtelhwdmlHQ2JYN2E3MXFEV04rcFhTbVdhMGpURVprd0dETmJnQldRYmp0T0NCMDZWK0w0akQxY0hqdmYrRyttanM3MzdkNzY2K1dwL1FXWDRyNjFndWI3VFhmYjVXZlkrSXZHOERTK0xaR3ZKRzJTeVplVHl4dUdUazRYMjlLNTI4SDJXYVZWK2JPNERjUHdyMEw0d2VHWjlNMWR4Y1J5TTZ1V2xPMGdCdWhyZ2JpTDkwd0g4USs2Y3RuMy9wWDdEZ0t5cVVveVcxajhGenpEdWppcHhmZTVWUmNsZHpBNEhHTzlGSXJORVkyREtyam41aHhSWG9XUEc1Ym45SHZ4Qy9hRTFDMitOdG5wK2k2TzEyeXNVTGtFQWV1YStsdkJGL0hxbW5icjlsdDc2YU1IWVQzTmZNLzdOWGlDOCtMUGlhUHh2Y2FhMmw2YXlrS3N5YlhKSis5WHE5ajR2MG5XUGlGTTgxejVjVnQ5eGdjS2EvaUxHVkk0ZWFqRksvVlhQMzdHWVpWRXFjSTI1VnExcnIyTC93QVJQaG0xcm90NWVDV1NTVm1Pd0ljWTk2WHd6NFBudWRQZzh4bmJjb3k1T2R0WDArSyttK0o1N25TZFAvMHFaQjljMWUxcS9idy84Tjd5M2hkVzFOSWk0ako1UEJyemFkYVUzYU95UnpTalVqRlFudmY4R2ZHSC9CV0Q0Z1NmQ3o0ZXJaNktZenFPUTRJUEp4anJYenQreHIrMXZyUGplZTR0dkd1c0NDemlVUnJiNzhCbC9FMUgrMGw4VnJyNHFmRiszcy9GY24yZXhqbU1Vb1p2dTE4a2Z0TXdud2Q4VmJ4dkQ2WFg5a1JxQ2s2NUFQNVYrcmNQNUxTeHVEK3AxWXFNNUxtVXJYc3RORDZERnhsbDFLTGszSkxlM2Q5ZmtmVVA3UVh4QitIL0FNTS9Hck5iVGVZc3orZXFaR0dZSFBTdmlmOEFhbitPQ2Z0QmZHTGUxdjVOdEZFdHRicXY4NjUzU3ZFMDN4UitLV2s2ZmVYRndSTE1zY2toK1lvdVJtdnA3NGFmQ1Q0YytEUDJvZkQ5a3EvMi93RGFHampLRUJ0c3BJNjE5eGdzc3czRHpWYXJ6VkszSkpxM1Jmb2ZPNHJNcStlMHZZMEdvMDR5U2JlcmE3SHNIL0JBajREK0ovQVhqM3hGcW1yYWJjV3VqM1VTZVZMSXZEY04vUTE5d2Z0US9HUHcvd0REZnducUxRNnZEYnpLdU5vWWJzbXVnK00zeEUwbjlqUDRGUjZoOWhSTFZvZDNscU5wVVlGZm12NEF1N3o5di84QWJIc2RSK3kzWC9DRzI4NWE3VXNRaDZua0N2eWZGMFo4UVpqV3puR0wyZE9LdkpyeVNTanZxMytaNmVVNGVuaHFVS2RPN2pIU0szYjF1MjEwU1BLZFIvWlU4WmZ0cmZ0RWJXa3U1dERubjNTWGtvTzJGQ2M3Vnp4WDZwZnM1ZnN1K0Z2MksvaC9IcDJucXEyazBPKzRsWUQ1MjdrL2xXbjhWUEJVZnc1OFA2VHB2ZzJ4dDdmVFpKRWprbGlRYnY4QVBTdC80czY1cHRwOE9WMHZXcGx0NUo3WXJHN0grTEZjZWVjV1lqTXFWUEJKOGxLS1NVVjVkWDVsUndWUDJ2MXFuRzdxTjM2eXQyOGw1SE42QisxTDRkMC94QytuMk9vVzdSek15dUNjS3YwcjVNL2FJK0NYaUw0MC9IaVRXL0JONGZzTnZPUHRja0RiZHFnODR4WHgxOFF0SjhiM243U2Q5NGYwTzZ1YnRsblpvdkpjN1NuclgxRm8zN1dlay9zeS9BYThzN1hVL0w4V2JTbDViczN6YnNmNDE3MGVHYTJXT2xWd1ZUMnM2aTBqYTlsTHExMk83QzRpazVWWEdEaHl1emN0bmJxZm9iK3docXRxUEZUYUt1b1RYMTVZMklCVUhkNWJFZ1pZZHdEM05mVFd0eVcrajZUZDI4K29YVnJFc3BmN1NjS1Q4cCtWVG50aFI5QjNOZmx0L3dBRy93RDhiUEh2eGo4ZS9FTFVMclFZUjRXa3RoTE5xalJscmlhNFU1VzNqT1FNWUxNZmNqbXYxSWcweUhWOU5WSTJrVkdoS2pmSGhvMlpRY01HR0NjK3Z2WHorYVpYV3kyclBCenRLUzMxN3JWYVB6OHJiSHlXWVltalh4WHQ2YmZLN2RPM1hWYWVXbXU1NGo4SU5lMHZ4NzhSZFd1eGUzOTVKcHQ2eVFTWEtuZEdzWUpaV1hqR0MzQjU0UGZ0N3RkMnRqZFRhVnBNTytCZE4vMHBTQ2R2ekl5bkJPZWZ2Y2R1RFhrZndIK0dhNlQ4VGRjL2ZXTjFhVFgwazBVbHZDcXRkTXdVaG5jRWZkS2tBZjdSNjE2c2JiVmIzVUxtWmJFelhVS09naWVUNUdjZ2JDV0E1WEI2a2NlbGVIZ2FMcDBwU3B4dW0wbmJ5czN0NXBiWHVqZk9xdE9lSlNweTBTVnJ2dXJMdDUvZWMzNHA4ZXA0RzhXYVBvOEYxQk5wdW9nbTlDUUV6THZ3UWNuSUFDZzU0L2lIMFBQK0dadEM4VCtGditFbWp0WjVwcjJiRFJYcitYRmIrV3dDRlF5Z2hUSVY5RHhucDE2NjlXS1JkTk5xNTB6VkxGdk1udW9ZTVpMTjkwZGQrTnVEakJJRmVYK050ZHR2RmZ4R2owbVNPODFYVkJINVhtSGRGYlJwTW1aRktjcXdYeXdmbUJ3VHhtc0tsV0VVK1piYVJTczdYUzBUMWQwOU5yYXZWNlcxd2RGVkk4c0UwMHJ5ZlZwTjZ0YUt6dXRiM1Z0amsvaWw4WTlTMEx4VHBOOXFOcm9kaklzN1d1c1BKSTVoUWhDYmRlQi9GbFJ4ejh3NmNWOHRmSFBRTmN1OWRQaU8rc0xmeEZldHFKQ1hGc0ZNZW5RU0t4V0lodHJQbHdoQmJJK1kvVWZVUGludzFvV3BlR3JyUzc3VDdObzVvbDh2VTVtU1c0Y3F5WlBYY1crN2pHUUJ1NTdWOFYvdEJHWFFQRGwvYjJ0d2xyb045cmNVMDg5aGIrZGRDVEpTTjBXUmg4b1lEQkRjWWJwbm52eXlEcTRpTVZ1KzY3K2VqdjN0dWZhNUhHbkdEZExScXkyMGF2ZlIzMDdKZGtrL1BrL2liZHg2UDRnMUxTTk0wR3pzYmZWTlA4dTZ2cm0yMngzSWtkcFN5Z0RHMGRPT2hBRlV0UnVialcwYTJ0OWFoaTFqelpvdkl1REdzWWppS3FOcVJqQTh4RGdxZXlrak5iUGlENDR3ZkZYeEpyaTZobzg5bmN3eml6c2Z0TjN1dFZSbFZ0NnFGSTNieGxnQnlHNmpGWk9zZUY5VytGL3hTMCsvMVcxdEh0ZFgwYTRzWWZzdCtraVJzWUhDU3ZIajVGT1ZJSkh6QURIZkgyTktuSlJjWnIza3IzdW5kcExYVysvYjVIcVU2aWFqZjNYcnB2ZnkvcjdyRi84QVp2OEFoWmErS3ZFR3Q2bE5vY1dvYWxvOW9ITnl4M1E2Y0ZMQlhVRTRMTWNnQTlkcHpqR0srbmYyRC9nMUw0MStLQ2F0UE5iU2FmSVp0T0RUQnNYRThPeDVjeGs3ZDZrb2NqakdNWnI1UitHcWFib2ZpS2FiVDlTdjd5VFdVakVCK3psb1lySjF5ZmxZZk9Td2ZnNEdHNDcxOTlmc0EvRFAvaEd2R2RycUt3MzJrTjRoMFczZGJLNFJFbElkc21aR0RObGRxNFVER0JqMXhYalp2UDMyNXB0TkpkVjIwMTJYVG9yM1p3WjVXVkRDemNKVzVscHA1YTlYNi9nMTFOVC9BSUtXK0tMUDRjK0NyVzFXM2RiUGU5bGR3QmdGbGVRQlk1Q1QvRUdaaU1Ic1Q3VitjTWt0anAzeFV1TlZ1N1cxczQ5VXc3eGZheS9uQ0FoSkptREFGVkhCQnorR0srMHYrQ28vaEsyOEdYTWVvWFhpVzNtVzFtTXIyY3R4bHlWWW5DTGdrWVVqa1lCd09hK0MvR1B3MXY4QXhmNE1iV3RJa2svdENUelpiV01yS2x4R3NZQktBZmVPUnV5VDE1N0N0dUhNT2xHU3EvdStaOHZrdHROTkh0ZC9velBLWTA0WmJUbEI4Mmp2bzFlL3IrZllzWC8vQUFtSjhZMmQ5cGZpVFR0V3Q3NjJsanNOTmdrTWQ5Y3h5SmdTaU1ZREJ0NXd4Y1pKUEFGVGEwOXg0UzhPeE5vOExHYThWSUh0THVYYTFoY1JneHlsOW94OHpnRVl6Z1k5NjF2aDM0anYvaDlZdnJtdGFCWjZwNGkwdXlobDBhenZZMmxnbXRsMkswVFpIeWhJeW1NRElNZ0gwNXZ4QkxxbnhwdGJIeGI0TDBXNjBmU2ZETjhkUThSZUhibnpJN2UwbGVSbDNRbHorOVJsQUkzQlNDU09RTTE5VjdPVlJwMmlvUnNuTFN6ZG5hOXJidXl2dGUrbzR5VkNiaE51NzFTKzdUNVg2K2FGK0hFR3A2N2FYMm9YVjVieDZwTkQ5amxsdW1aMUUwcTdQTUVRL2lRS2NNM0JCNUJ4VFBnWmRKcEdvYXJDbS9VdktoV0xUN1M1UTdaMkw3WmtrVU1wR1FSOXpKSXlCanJYVmFOOGJ0TnMvSFhoZlI5TDhJYXhlVGVJWTVwOWNoZVR5SVg4c0JZL0tsZk9WM016RVl3TTRHU2VPTXVOU2gxL3hmcGd1SWJ6U05iczc2U2VlZHBER3M3cWR6UUZkdkl5RkEraFBGWEtOV3pVMGtwSzZTdGRKZGJiMnVyTFhicFptbE9wQ29uQ0NlbWp2cGZ5L3dDRzc3blUvRWk4L3dDRVlTMSt5d1dPaWYyZEJEQkV5S3p5M1JKZG5ER1FrcXUzQXdlZ0kvSHoweS8yM0ZxMm5tNmpoKzFYYlhGbHA5c2ozSm1rS28yTndBTzFnekZ2N3UzQXJxdmlocGx4NDlzNXRhK3gyV29hWHF4ajFLLzNHUkpOT2tDN0dYZU9ja3JrZ0hIQXJzL0RIampVdmlwYjZQZTZWQm9uaC9XZkNjVEZuTmhIRmFHQnd5eHNuZHBTZk1PY0FaeDFybnBUOWpUNW5adStyMDBmVHU5OU50TDNXNXJWaWxGS08vZS9XMnpWci9NNGp3OThXWjlhMVcxK0hjMTlkK0YxMXkyQzYxY3hvdXk2Z011NVlsSnlWVXFNbjJYM05kSDR3OFIzSHdLaTA3VUxueFZyMXg0WnVwSDB5UFNiVzlCdnJaQ0NqenE0UWlQRzc1Umc1QlBXc3p3QjRPYnc1QjUxL2F3dnJQaVNXYVI5UmtsQ0pwSmI1Vk94Y0FQdE9RRGdjZ2pPT0tYdzFzN0g3R3FTMmw1cUYxYmk3c2RXdFhWUkpMNWpFTEtqT05nd29JR0QvRDJQTmFTalM1K2I3QzNXbXJmMmszdGUxay9UWkhQVmkzZFFWMjMrRm5wNnIvZ0hCYVQ0V3RkTnM3NjNrOFAzbDVhbXpsczRyNTdvajk5bGhGY3NqREh5SjE0NjloWFVlRDlCazhmZUJ0RzhPNnI0eG4wblRJYmxERzFuWkp0S0lIM0tXQUQ5ZDUzWkl4eWVsZFZwSGpIWHRFK0NQaTd3N29NbW5MWitMSllMT3pndUVEWFduVHNqdElrUVVNVlV4bFF4eWVkb3lPdE44SmZDL1h0UDhLM2N1dTNOb3V0YWNqVGo3WXlJMFN4OEZsUUFBNXp0endDRCtmWGlNWkpSNXBOWDVsYnE5dDliMjdhZklpTkdEVGh0NTMvUzJuNCtwaTMydjN1bTZkSHArZ1EzbmlEUk5US1djNDFxODgyVHpnZk1Wb1RHcWhmdW5CNXlCWFNhN1BiK0JmRDlsOWx2cGJxNHZyYU81dTUwd2pTYnVTQnR5NVF1Q01EQnkzV3NQNGdmRVpkZDBnYVZKcGQ1TXVvUXh2YVEyd1NFMndqSUt6TnlUZzVPUFlIR0szTEg0YWFsNDZ0NzZ4WFdMVHdoSkplUWl6OHBSSTg0aFZ0MjBkVnljSEliSHpEam9LOC9XWEw3VDNWcjgvVzJ2M0piZFZZNnBPRkdEbDF2dDJNbnh6OFFwUEVlaDZmZVdjZmkrMTFLZTB1Tk10aFo2WWlvRmRpcFpwR2NzV0paaGpBd0FPOVErS2ZEOFB3NThTMjlwNGlzdFYxblZMWFJWRm5wOXBkQmhxa3BkQUhVTG5KRE53RDB6enpYY1M2VnJXdCtKWlBBUGh1NnVMeVBXTk9aWjlOU2FPSDdONWE1RHYwOHBseXh6Nk1lZTFjMzhRL0VWay9qT1diU1pOTnVmRW5odXpsMDlkU2lrV08yZFJzVkVRa2ZNRmNPQXdBTFk1NjRwMFozNVlSZzFHenYwZXUxM3VrOVZmMWFNWkp4ZG5KTytxdHV1eisrK2p1WlRhTGNhdkpwODExZFhSMUQ3SkZkNnJCY2pkTFlPZmw4amJoZHUwSmtEc0JnWnhYbEg3V0hoeUg0amVCcm1PWnJ4dFlOaWw3QkM4ZTBpSWZLUW95ZU9BY25ucitIc3ZoTHc1cGVxZkVqUjAxUUMzdUlDczF6TExjQlJkUHRZU3k0emhtWTV3T0JnWjlSWG92d2wrRzgzeGIrTHRucVc2TmRmMCs4aGpXU1MwUzR1SGdra2JiS2lzQVpOdkRZWTlPbUFLMXcrWmZWTVRIRVIrenIrTzNYVHV5c3pveHJZS2VIcnROVzFmazF0cC9TUHhwU1JyTytQeURkR05wVTl1MWFtbXRMYk9yUnlGUmo1M3pqUGZGZWkvdHpmRGU4K0UvN1gzeEMwRFZMdHRTdTdUWExndGVyRUlUZGgzTHJKczZMdVZnZHZhdk40SVJHaDJINVZHUm5xYS9vNmxpSTE2RUswZHBKUDcxYy9sUDJVcU5hVUwvQzJ1Mng2VDhEZkZVZmhyeFNsNS9vczB5b3lJYmtaamkzRGJ2STlSbk5mWTNoN1Q1L0dmd3MvdDY1dDROR3R2TWV5UzVsZGxWM0tEZkl6WXdUM1lEbkdPRDFyNGQ4RStLcGZETnc4c0wyY1gycUo0WkJQRUpGTWJEYWV2UStoNml2cUQ0Si9FalR2SG53OXM5UHZKdkx1TkZSb3JOWmJodGx6S1EyWENrNEJ3QU1nWjZET0svUGVMc0M1SlY0cDZOYmY1YmZuM1AyRGdmSHFMOWcybGYrdlU4My9hWGwxSHdsZlhXaXlhM3BPcVF6TUowdTlOamNyKzhBM0kwa2krWTR3RkF5Y0RIR2ErZmZza2hra1ZXT1Z6azQ2MTd2KzBXbHhhNnRxMnk3U1NHWjRsdTdXMmhFTVNNZ0lBQUJJWWpydXlmdlpKem12Q2I3VkZGN3UvMWUwQWZJTVo3Zmo3MTlSdy8vQUxzdVczVHA1THlYOWFueGZGOEhIRmUrL3Zmbi9YNUVFY25rN2l5bHV3VDFvcG5tL094RzRGanlUM29yMzdIeDUvV0w0NTBHejByNGJDM3RiZU8zaHdSc2pHMFY4MC90bDNVbmdqNERtNjBsdnNOeHRYOTVHUG0vV2lpdjRleGNWOWRqRzJsNC9tZjBKd3pKdXJaL3pmb2p5UDhBNEo1L0VqWE5aK0pVYTNXb3pUaGp6dUE1NStsZThmdEsrSzlSMGp4TnFWeGJYazBNeTI3QU1EMDRQYnBSUlhWaXFjVmk1UVMwdXRPbXg5TG1FSXZNWTNYMlQ4cVBGZDlONDUvYVB1SWRXbGt2SW1jc1Zac0FrZCtNVjdmKzA3NEMwZlN2MkxKYnEzMCszaHVONS9lS1BtL09paXYwYkdTY2NWZ294MFh1NkVZcitEVStmNUh4ait5UDRZc0xuOW9xeDh5MWprL2NTdDgyVHpqclh2SDdESGhxeDFMOXZJK2ZiUnlmWnRRM3hBOUVPUnlCUlJYMW5GRldmKzA2ditDdnpaOFBrTVlxaEd5LzVlUy9KSDFkL3dBRnJmRldvbnd2YjZkOXJtK3d0RGd3ZzRVakFyNS8vd0NDUWQ5TnBzbmlHM2hjeHdsajhvK2hvb3I4N3dmL0FDUjFkLzN2MVI5ZFJoRlZzTlpmWWtmb3orem9uOXUrRUx5TzgzWEN4VHR0RGtuYnpYajM3Zmw5TXZoZU9JU041YXVRQjZZRkZGZm0rWC83elQ5VitoMFlmL2tZZmY4QWtmSVA3THRyR243WG1sM0czOTlMYnR2Y25KYnIxcjU3L2F4OE8yZDMrM0pxMW5KQ0d0YnE2QmxqM0VCODllLzhxS0svZk9ISnlXYlNzLzhBbHgrcDgzeEJGT0ZuL3dBL0YrWit6bi9CR3p3bHB2dzkvWngxQ0hSck9LeGovdEZ6aE10L0FnNzVyN1UxS0ZUNGZ2THJhUHRFZG96by9kVzh2T1IrTkZGZm1tS2s1NGlzNWE2dmYwWjRlYlJVY1I3cXRyL2tlV2ZzNlJMYmVHYnE2aitXNCszUCs4QitiamZpdlkvQldudzZmcFFhRlBMTXdLUGduNWdXWWtVVVY1MlMrNm8yN001cytiOXRQMU9iK0lydGM2WEhHN01VamRRb0J3Qmw4SDlEWGtmZ25WWjdxeThVVHpPSnBsYVMwVjVGREZZdGpOdEdSeHlPM05GRmVYS1QrdnhmbC83YWV0bE1ZdkRWVTEyLzlLUjg2K0w3Vk5SOFVTU3o3cFpMQ2FXV0JtWWt4dDVLL3dDY0hpdkZ2aTVaeDNIaFR4TTBtK1EyOWxhU3B1Y3NBOHFNWFlqUEpKNTV6anRpaWl1ckk5MS8yNythUDBlbnBOcit0MGZMbmhLZG04R2E0NWJNbHI0aFdlRno5Nkp5VGtxZW96bmtEZzhaNkN2WmZDZDNKcVkrSkdvek1EZXl4eXEwcUFJeEVjeUtnK1hIQVZtR09tRGlpaXZ2c3kzbjYvOEF5SjFjc2JMVHQrYU5mVTdTTzArR090MzBhS3Q1YTdsZ2x4a3dLRVRDcC9kVVpPRkdBTW5qbXZ0TC9nbDNleWVKL2g1NGIxZS9LM09wV2VtdFpRM0RLTjhjS3ZJRlRnZEFBUHlvb3I1UEVhMGVaNzgwZnlQQjRrLzVGMHZYODFxZVQvdFE2bmMrTWYybWRVL3RLNG11dk1naDA5Z1hLZ3dPMXdyUjRYQXdRTWV0Zk1IaHllUnZqUDRtajNzcXg2aUlGMm5hVlR6UkhnRWY3QksvU2lpdWpLdmVvKzkvS3Z6UFJweFVhRUZIUmNrZjBNRDR4NjdleGZFMjRzMXVyajdQNGIxZVcwMDFONXhheERlZGc5UmxRZWM4aXZZci93QVY2bC93Z3VsZUxXdnJtVFh0Y2VTUy91SkhNaVhSdDNDUTdvbXpIaEY0QTI0Njl5YUtLOTZyN3ROY3VtaS9SbFk2bkgyZExUK3JYT1VqOElhYjRkK0pXc3pXdG5GdXROR2dTRlpjelJ4aVcyVXZoSHl1U2UrTWpBeGl2TlBqUGZYQStFTjVJdHhjUnlXQ3hQYnRIS3lHSWxZK20wais4My9mUm9vclRBU2NzVFM1dGZnL0d4NDEzeTFQa2RoOEpkQnM3andWOEp0UGtnVnJYeFRwVjdQcXluTzYrZEdjS3p0OTdJQUE0STRyZy9GOTlObzN4bE9uMnNza0ZuSnJvaE1TSEE4dU1EWW5xRlhjeENqakpvb3J0aEZQRlRUV252OEE0UzArNDdjTE9UakZ0NjIvVWgrSytyWE5qNHBzZEtqbWNhYmVRMnR4TGJINW8ya1l4Z3ZnOUNRQnlNZC9VMTZMNVgyMzR3Nm5CSTBqUWFmNFhkTGFNT1ZTRUxKTXd3QWNjRmljKzlGRllWa3ZxOGY4TC9PSnJUZnZKK2YrWjVocTl1dHhybmk2U1FlWStsNkVpMmhjN3ZzK0hnQUs1NkhCSXoxNXE1OEhkZnZmSGZpUFVtMXU1bDFlU1ZsaU1sNGZQa0NDTVlVTTJTcSt3SUJvb3JzeEgrNVNmOTFmb09zclRiWDgzNkVldVFMby9qSHhaTGE3b0pZNWJ5MWpkV0lhT0tIYUkwVTlWQ2pJNDZnODVyb3ZIYWYyNW9QaFhVTHd0Y1hrdHBITzhyc1N6U0IwVU9mOW9ESXoxNW9vcWNTa2xCcmYvZ0N3dXVMVisvNkdiOFZKWC9zMjQxZnpKUDdVZzFkRVc2M256aXU0REROMVlZNHcyUmpqcHhXUDRZOEk2WnEvN1ZkN3B0eFkyN1dDelhkeUlBdTFGazJLd0lBeGpCSndCd00wVVU4Sk9YMVp1K3ZMTDlDY1VrcXpTNmY1czVId05xRTNpSDlwZTZzTDZScnF6c2JzTGJ3eWNwRUN4emdlK1RYczk5OFE5YytGM2lmUWI3dy9xbDNwTjIybHJjbVNCOEV5SXVGUDRBa1k2SFBPYUtLckh3ajdlbkcybkpIOHIvbWRTOTdtakxWWGwrWithUDdRdmo3V1BpaDhaZFcxM1hyeHRSMWJVWnpKYzNEb3F0SzNJeVFvQXp4MkZjcENnOU9nNG9vcitoTU5HTU1QQ01GWkpLeVhRL2xQRlNjc1RVY3Y1bWEwY2EvWUF1MFlhUEo0NjgxNng4RXJ4cjc0YzJ0bk1zTWtNbW9wdTNSTHZ3WTVNamZqY0J3T0FjY1VVVjVHY2Y3czM1LzVuMTNEYVgxeUgrSDlVZTJXUHdzOFA2eTNoZUc0MHlGNDlRc3JxUzRDc3lHUmhHTUhLa0VkZTJLK1BmSGxuSFkrSkxpR0pBc1VGNUpGR3ZYYXF1UUJ6UlJYazhKMUp5bkpTYmYvQU8xSTZPTW9ybGgvWFF4cGtIbms0Nlp4ajYwVVVWOXNmbjhrcm4vLzJRPT0iIHN0eWxlPSJ3aWR0aDogMS44NDkzMDZpbjsgaGVpZ2h0OiAxLjI0OTMwNmluIiBhbHQ9IuWbvueJhyA3IiAvPjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDA3Ij48dGQgY2xhc3M9InB0LTAwMDAwOCI+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDkiPiA8L3NwYW4+PC9oMT48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDEwIj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTEiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMDEiPjxoMSBkaXI9Imx0ciIgY2xhc3M9InB0LUhlYWRpbmcxIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+56ysPC9zcGFuPjwvaDE+PGgxIGRpcj0ibHRyIiBjbGFzcz0icHQtSGVhZGluZzEiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj41IOWkqTwvc3Bhbj48L2gxPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDMiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+55uu55qE5Zyw77yaPC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gbGFuZz0iemgtQ04iIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPuWcqOWTqumHjOWQg+mlre+8mjwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7lronmjpLku4DkuYjmtLvliqjvvJo8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+5b6F5Zyo5ZOq6YeMPC9zcGFuPjxzcGFuIGxhbmc9InpoLUNOIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA0Ij7vvJo8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBsYW5nPSJ6aC1DTiIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCI+5oq16L6+5pa55byP77yaPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNiI+PGltZyBzcmM9ImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVFTa1pKUmdBQkFRRUEzQURjQUFELzJ3QkRBQUlCQVFJQkFRSUNBZ0lDQWdJQ0F3VURBd01EQXdZRUJBTUZCd1lIQndjR0J3Y0lDUXNKQ0FnS0NBY0hDZzBLQ2dzTURBd01Cd2tPRHcwTURnc01EQXovMndCREFRSUNBZ01EQXdZREF3WU1DQWNJREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBei93QUFSQ0FFVEFaY0RBU0lBQWhFQkF4RUIvOFFBSHdBQUFRVUJBUUVCQVFFQUFBQUFBQUFBQUFFQ0F3UUZCZ2NJQ1FvTC84UUF0UkFBQWdFREF3SUVBd1VGQkFRQUFBRjlBUUlEQUFRUkJSSWhNVUVHRTFGaEJ5SnhGREtCa2FFSUkwS3h3UlZTMGZBa00ySnlnZ2tLRmhjWUdSb2xKaWNvS1NvME5UWTNPRGs2UTBSRlJrZElTVXBUVkZWV1YxaFpXbU5rWldabmFHbHFjM1IxZG5kNGVYcURoSVdHaDRpSmlwS1RsSldXbDVpWm1xS2pwS1dtcDZpcHFyS3p0TFcydDdpNXVzTER4TVhHeDhqSnl0TFQxTlhXMTlqWjJ1SGk0K1RsNXVmbzZlcng4dlAwOWZiMytQbjYvOFFBSHdFQUF3RUJBUUVCQVFFQkFRQUFBQUFBQUFFQ0F3UUZCZ2NJQ1FvTC84UUF0UkVBQWdFQ0JBUURCQWNGQkFRQUFRSjNBQUVDQXhFRUJTRXhCaEpCVVFkaGNSTWlNb0VJRkVLUm9iSEJDU016VXZBVlluTFJDaFlrTk9FbDhSY1lHUm9tSnlncEtqVTJOemc1T2tORVJVWkhTRWxLVTFSVlZsZFlXVnBqWkdWbVoyaHBhbk4wZFhaM2VIbDZnb09FaFlhSGlJbUtrcE9VbFphWG1KbWFvcU9rcGFhbnFLbXFzck8wdGJhM3VMbTZ3c1BFeGNiSHlNbkswdFBVMWRiWDJObmE0dVBrNWVibjZPbnE4dlAwOWZiMytQbjYvOW9BREFNQkFBSVJBeEVBUHdEOExVWmtVRDlLMU5DVVRYSzdoemtWYm04QjZwY1NBeDJkeHRiR0NVNHJkOEsvQ3JWQlB1bGgyYmVTRDJyMHNQa3VZVmx6UnBPM2V4OXZoOFpocUdKVUtsUmI5MFdMbHZLMC90OTN0WEQ2ZzRlNkxmM2owcjBmV2ZDdHhZNmZJekQ1Vkg0VjV4cU1USmRjcjNyc3hlQnIwMG5VUjdtZDR5blZVZlp1NjhpL3BkdnZrVGJtdmY4QTRNYVUxaDRia21IQVljL1d2Ri9odjRadlBFMnRRd1dzYlNNM1VBZHErZ3ByV1R3VjRVYTNaZkxrV1BPUGZGZlA0NnQ3cXBMNG1lemxOT1VLSFBiNGp5ZjRuNnlMcnhSSXF0L3EyeHlmenJ2dEgxRHovQXlydEh6UmtBazE0dDRnMUtTLzF0cEdiT1g5UGV2YnZoelkvYi9DTVc1dDI0RVZPSWJVVTVMWm85REQ0aFZKeTV1alI1aFplRVgxN3hDMGFyKzhMVjZMSCt6amR5NmZ1M0wweUs2UDRaK0RVaDhUVFNNTWpPVko3VjY3ZDZuYjJGcUViampIU3VIR1p0VnB6NWFKdFU1SVRjWUkrT1BGL3dBUHJydzdmN1pvMitYN3BJNml1Ym5rWkdLN2VuSFN2c2p4SDRLcy9ITm9WS0l4Mm5hM2NWODdmR0w0VlhIaE81YVJZLzNaNk1PbGVqaHNkOVloYVN0THQva2M5ZkwrYVB0S2VqNnIvSTgvVk55ZmU2aW92czdGK25OU0tYakxidmJpcEFUS2VQdzlxN1k2dE5IaThpa3JNM1BoN29UYXByVnZHRk83Y01nVjlGZUtMai9oSFBCY2dqSHpSeGNaNzE1ait6djRWazFMVWhjYmNpRWhzK3ZXdll2Ri9obHRic1BKOHZPNFl4NlY0dVpWbDdaUmV5MVByTXZveHAwWVhQQmZCM2d1YnhUNGozYmZsTGJpU08xZlRYZ3p3MUg0WDBWZjNlM0M1eGpxYWcrR2Z3dWgwV0pmM0tqdVNCM3J0TCt5Vll0dnk3VkdLOG5IWXgxSldXeDJOV1dteDg2ZkgzeG5mWDBzbHBHakxIMlA5NFY0THErbVhBbjNNajg5U0srM3J6NGI2ZnJFbSs0V051ZXBIU3ViOFYvQjNSYmhDbmx4azlqWFJReDlLTVZUc3pteG1IcFY0SlN2RStPR3NXS2h0amNlbFJmWnRwL2kzWnI2MnN2MmNkTDFDRnZLWDVsSFhPSzhkK01Id21md2Jlc3dWVlRKSUlIQkZldGg4VlRxdHhnOWY2MlBHclpIYUxsVGQ3ZVZpRDluYlNUZStMTGZkbklmSXozcjZYK0tWMHVrZUJaaVB2ZVVlUHdyd1g5bUN6ODd4RHU2bUpnUWZTdlcvd0JvN1dHZzhJVEt2OFVaRmVQam43VEZRajJzZWxScHhqU3B4OGo1cDBhUTNIaUtWbTNOeVNlYTFyK1B6dFNoS2x0MWM3NFN1bm0xWnMrbjUxMGZuQ1RWSWNqSUdNMTlwaEhlbHIzTjhETlNvWC92SHUzd28wQnB2RDhlVjI1WFBybmdWd3Z4MTAxbzkrNFoycXhJelhzSHdVaFgrd0YzZjg4aGpIYml2Sy8yb1pSRkxKNVovaGJQNTFqa2xhVHpoUld4NHZGTjNHVDlUNUo4U1NlVmROanNTTVZlK0Y5b05ROFZXOFpHVjVKclA4Ukp1dUg1Nk1SbkZhWHdwbE50NHN0MjI3dG9QRmZaNWxVbTgwKzQvQ3NIYm5WKyt4N1I4UkpCWitIbGpVbGR3eDE0cnlpVzIrZGlBMzUxNkw4Uk5SZlVMR05kdU52YjFyejEzOHhtVXF2WGl2MldsRnVqRnk3SHlPR2lvdVNqM2Y1bEs5aUxLY1o0cWdZdHpaOXNWdEdNVG5hRTNESDU4VTcremxnLzFpOWZUcFhnNWhLSE5lVFBjdytFcXpqZEl4UHNjakg3dFFteGtpY3RqMnJwSjRmS1A3djZZRlJ6MndXejNPZzNldmV2bWNUR0ZSN0hzUnk5cU9yMkl2RFdzQ3cxQ0F2eXF1Q2Z3TmZvcCt6bisxUG91ZytBSVZXYVA5Mm1EbHNFR3Z6amoweG0rYU1lK0ttaHY5UXNZV1ZablZXNEl5YStYelhJWTRuM2I2bjAyVDUxVndhOStMYThqOUdkZC9hNmo4WGVJQloyODZsVzdodTFlOC9zNjZiL0FHZzBOMDc1M0hOZmtYNEQ4YlhtZ2E3YjNHOXYzYkFrWjdkNi9RVDltajlxdlQ0ZkQwQWU0Q01BTWdubXZpODA0ZG5obys0ajd6QWNSZlcvaDBSK2oyZzY5RFk2ZXE3bCs3VlhWdGVXN1ZncHpYelg0WC9hRVR4Rk1vZ2xabGJqT2E5YThJNit1b3hyODI3Y09sZkoxNk00cTBqM2FjWEwzalExbURlMmF5R3hHRFhSYXJEbURQNjF5V3BUZVJ1cnk1WFIweHFXTWZ4WGNxc0xmU3ZOdFN1dHN4R2E2ZnhycmdWVytiSEZlWDYvNGk4cVJtenhYMDNEcWFuekhrNXhQOXpZNmExMWo3T25iL0dybG5yUG15cml2TVQ0N2plWFl2ekhPSzdEd1drMnFzcmJUdDYxOWptV2Qrd2hZK1p5dkoxVnFjOGowWFNMd2xjK3RhYTN5cSsyc20zc210TGRlb3g2MFNYYXMyRFVaUHhIenUxenF6cmhtRTRPeU9nZ2kzOHEzMG9xcjRlMUFjNTVvcjlPd2VjeGxTVForRFp4d1M1WXFUakUrUjlRK0VOaTcrWFo2YTAwaDRDb2hZMUpvMzdDZmp2NG1YQ3BwZmgyNGhWanhKT3Zsai9HdjJ2OEcvc00rQ2ZCS3FzT21XKzVlK3pyWGY2TDhLOUg4T0ZSYjJNS2JUeDh0WVpqeDlHYTVjTlQrYlBuTUp3N1dqNzFlZXZsL21malg0VC9BT0NFbmpYWHZEMHQ1cmQ3YjI4T3pQbHdvUzM2aitsZm5iKzIvd0RzdTMvN0xIeGZtMEs2YnpJM1h6WW45UWEvckYxNkZZZkRrMGNjSzRLSGpIdFg4LzMvQUFYdytIYjJ2eFowZlZmTC93QllXaFk0L0VWOEppTWRYeGlsS3FmbzNEOWFjY1JUd2ZNMnBhYW5nUDhBd1RzOEhXMnI2aHFGMWRSTElZdHFxU09uV3BmMnZmRU1PbitLcnV6dC93QjJzWTV4WFYvc0M2Vi9aUGhMVXJobDIrWTRINWYvQUs2OFMvYWo4VHJxbnhJMVRPMC92U2cvQ3Z6SEJSZFhQYTdscW9KSDlONDdEd3crUzBMN3Bmalk4aXVKMnVMeGlmNzFmUTN3T3VSYytHSW85ck15OWZhdm55RmxqWXRnZGVwcjNmOEFaN3ZsK3d1bm1EY3g2ZDYrbXpDem90dmRXUGhzciswNzZzOUk4T2Y2THJEcUZLak5ZM3h4OFIzT2xhY3BoWmt6am44YTJiSzZXSFZseGo1ajFQZXNmNDkyTWQzNFlhWWZlalhkMDcxOC9Sa25YaTVLNTYxSCtJbklxZkJ2NHU3cm1PMXVHTE0zeTVQZXU5K0p2aGkzOFgrSHB0c1lrM0tTQUIzcjVVMG54TSttNmlySzIweG5nNXI2SitDUHhOVHhIcC8yVzRsVnBNYmVlOWVwamNOeU5WcVhUYzlTTTQxTlk5RHhteC9aNjFUeEJyRndzU3RIR2gvdTVybGZGWGdtOThGK0pXMCs2VGJJdklQOTRWOTFmQy93NUdmRWNpTkdoV1laV3ZIL0FOc2I0WVBIOFFOUHVJWWRxdWRyNCtwckdqbWluV3RQUkg1L2lNWldwWjhzREwrSFBiL2h5YjltVHdoOW44TnhzMExicE9TU0s5WWwwV015QTdmdTR6Vlg0VmFmYjZGNGZ0OEJWVlVIdFRmRlhqRzNzUE9aWkZWRnpYazRyRVNuV2JYVS9TWnlqVGloMnFlTDdYdzlHZDJGeHp4WG4valA5b2F6MDkzVldMRWYzZXRlVi9GajR4eTZwcUUwVnZMaUZTUUNEOTZ2TGRZMTZhOEpMTmxtNmsxNjJIeTJGdWF0dVlZakZVNlVmZTM3SHNtdWZ0U3piR2poNDdaUGY5YTUyMStNbXRlSmRVUklKWlBtSUhBcno3dzE0V3V2RWw5RkRHalB1YXZvNzRIZkFOTktkYmk0UlRJT1ZCL25WMXZxMUNMY29wR09IeEZTb3VhU1VZL2l6djhBNFRQZGYyWkhKZEsyNWxCeTNldk5QMnFkWGdFU3hxcXF6RWs4VjZmNDg4VzIvZ0hSbnh0Vlkxd09hK1QvQUluZkVTVHhwclRNMG01Tnh4elhCbGxOenJPdjBLcVZ1VmM3Mk90L1p0NDE5MlUraFAwcjBiOW83Yy9oV1FiZjRjL2hYbTM3T1U4WTE1VkxMMlBKNm5OZTUvRmp3d1BFWGhPZmJ6bUp0dFZqSzBZWXlFNWVRTkpLS2ZZK1FQQ3d6cWNoeDByZWlrQTFpTmVjWjdWVXRkSmJTdGV1SVdWc3FUVjZ4UG1hN0d1MytJRTE5aGc1SjAvbVRnNkxwMDFGL3dBeDlPL0NGUkY0WVhidVVsSzhmL2FVbVpKcGR6TjkxdmwvR3ZkL2hKWXRGNFRqM0lyZnUrUGV2RHYyb0NyNnU2WTI1QkErdGNmRDlTTHpsSThUaXFNcFFtb255YnJzbTJZOC9lSnJRK0dseXNQaVdCbTU3ZGFyK0k5T2FPN2tVajdwT09PdE04SXUxbnF5dVYrNzc5Sys4eDhaUnpMbmE5MjZQd3pDeGZPb3QyZHoySHgvZTIxcnBrWHpCWkpGNDU5cTg0bnZsWjIrWStveFZ2eFA0a20xY0lyY21NWUJyRlVzR1BIUFE1cjlLcVp2ejBvUnBSZWlQTGxsMGFGV1VWSyt1L3FhbHRxcXF3MmpQSFhGWHJhNjg3cjhwckF0N2hvbis3a2R2YXIrbnlUVFMvSVBZMTRlSWs1UG1hUGN3R0lkMUZPL2xZNlNHMml1QXZYQTdrWjVwc21qTEkvNjU2aW0ybHZNcWZOOHYwclNTOENEYVY2REdlNHJ6WjFHdEQ3YkQ0U0U0KytyZXBRdHRJVGR0QzRiMUlwYmp3MDBxWjh2SlB0V2diOUEyVkh6WTY0cXpiNng1VWJLcTl1dnBYUE9wS0xPdFlPamJsdG9jOWNlR1dzb3dXWERZeU9lbFNhYnI5N29reStUUEpHcW5QRGRLMXJqVUZ1Vkk2L0w2ZGFvbXcrMHJrcnhpa3BjNnRKWE1wWUZVMnBVSFkrbFAyYXYybDdYVFZ0N2E2bmJ6dUFTNTcxOTZmczgrTHo0cGVGMWJNWjUrdGZrTDRVc3hwdXZXOHBiQ3E0SjU2VitsWDdKbnhSczlPMEsyWHpGVmxYbkpyNFRpYktrb2UwZ3R6Nm5MOGZVbEZScW4yTnJIazJtbTdtWWNDdkd2aUQ0NHQ5UExqekZYNm1zNzRtL3RHMituNmErTGhlbnJYeHY4ZS8ydlk3TzhaVm0zTXhQQVB2WHhHSHlYRVlpWExHT2gzMU1YQ25xMmU1ZU52aWZESnYyekE0OTY4cjE3NGhIVXJyeTQzenoycjVwMXo5cjE3NW1qajM1Sng3VjJ2d0c4ZXcrTEw5V25reTI0WkJyN0hBNUxQQzBPYTJwOC9YektuWG5hTWxaSHZmdy93RERsenJseWtqSTIzcm12by80YmVEdnM5a3BhUHNPbGNsOEdOSnNyblRiZmJ0UHlqakZlK2VFZkRjYVdTa0wycjRYTnNSVXFWSHpIdjRHUzBVVGtkZjA3N1BGOTNIRmNiZHp0RlArTmVxZU05SjJJdzI5cTh2MXUyOHU0NzhHdk13dUxkR1YwZlJScHFVYk12YVBxV3c1ejlmZWlxT254TXdHMEdpdnFxUEZQSkJSWjR0ZmgrblVtNTJQMlVrZ0huZi9BRnFsazA1cHp0VmYwclpkYmUzazJoUWZxS3NSN2ZKWmxGZTdLczdhSS9uRlVyNk01KzcwVHpMRmtrUDNoaXZ5Si80T0FQZ2hITjRCR3FSb3pTV1U0azRIWTErdldvU1BLN2ZNZllDdmhuL2dzUjhNRzhWL0FMWFBrM045bWRsNDZFRE5LTlNjVmU1M1pYSlU4WlRtbHRKZm1mazkreVhvVWxqOEc1Wk1NcGxMc005NitRZmpONXNuamJVbWRXK2E0ZkIvRTE5MWZDTzIvd0NFUytDOGNNdTFXU0ZsSjZkYzE4LytMUGhKWitKWlo3ajcwa2pFazVQZXZoc2x4MFByK0pyUzJsTDlXZjFQeFhHRHdkSERwMjB1Zk1DN2x5UGV2WmYyZExyejdsays3anNlOVovaVQ0QlhGbk16UWZ2TzRHRG11aStDSGdLKzBYWEc4eU5sUmgwS25xSytveGVJcHpvdHdmUS9QOERnNmxCdDMwTzcxdTRrc3RRaGsvaDNEa1U3NGt3dHFmaEdjaHM3VkRBSHZUdkhsbzhWbnUyc3hVNXdLczJrZjlyZUdmbTUrVG5pdkFvMUxPTlRzejFLTXJXYlBselZBYmZVWlA4QWVQYXVoK0hYaXlYdzlxa2NpdVZHNzFxRDRrYVlkSjhRU3J0SDNpUHFLeGJTNklQM2NETmZWTGx0ZnVjOUd0S2hpTDNQdUw5bmo0aVI2emRXTWpzck1wQ2s1Nml2UlAyaFBoOG12V0VkNEZMR1A1Z2NWOGZmczVmRVI5RjFxRzNjL2ZjWU9laHI5RDduUm0xbjRWeDNraTVWb0EvNlY4Wm1tSGRERXF5MFo0L0ZGRkxHNGJHd1dsMGZNTjFxRTJqNktGKzd0WEhTdkJmaWo4UmIyRzRtdC9NTzFzNTdaelgwcDR0c28zdG4zWXd1ZTFmSXZ4cjFaYm54WE5HTnUyTTdCanFLN012Y0pWV3JiSDJGU3NsZXh4dDdjdmN0bnF6YzF0ZUIvaDVjK01OVGhqQ09GWThuYjJxNThOL2g1TjR1djQrTUozeXZwWDAzNEU4R1dQZ25TRlpsaldSRnlXTmVwak1ZcWNOcnRuSlR3cmY3MnByNUdaOE92aERZK0RkUFdab3p2MlpMTjF6WFZlSC9BQlhDTGhvVllmTDA1cnk3NHcvSDVOUGlrczdObDVHTndJT0t6dmdGNGd1TmJ1cmlhWm1jTjh3TEhvZWVLOGw0V2NvT3BWL0U5S25GY3JUZXZZdWZ0VStJbS9zb1I3c2VZYzE4MXZjYnJnbnRuUDByMno5cWpYZk1saWgyL01vUE5lRlJ6YjVQN3VmMXIxc3ZwcUZKYUh6bWJWV3B4aGUzVTdiNGI2NitrYXZESXJCU3JpdnJ2d2xmeCtLUERTamNyYmt4WHhGb3Q2SUpWYmNPdmV2b1Q0Qy9GUVJySGJTTXFzb0dQbTYrdFk1bGgrZWtxa0ZxajBzRFc5clNVZXFNVDR6ZUJWOE5lSUpyaU5kc2NuSjRyZ3RNZmI0aGpJOVJYcjN4ODhYVytyeWVXckswbUJub1FQOEFQTmVSYU1kM2lGT1A0aFh1WlE1eXc4WE5Ic2F5Vk52dWZYZndpdTFmd2lwWWJmM1lGZUJmdE9USk5yKzBTYmZtUE9mZXZmUGgzRDVIZ2hDcS93RExNSFA0Vjh0ZnRUNnkwV3RNbUN1NW1PZlhtcDRidzZublRaOHJ4aFY5bFRuUHNlZjZuWmFiZVBpU1NObTZNd05VcmJTdFB0NU4wVWlsdmM5YTVpYVpuZk82bGd1Wk54WmV2MDZWK3Z5clIybWo4Vit0Snl2YlU2V0xTWVo1bmZjcHg2RVlwQjRURHhzeXNqTXh6d2F4N0o1cGx3TnpmU3VpMGFWckloblhrOVBhdXVqbXRLbnVqdXcrQmVLZHVYNWsraWZEWTNMSzBuQzl3UFN1aHQvQlVkc3ErWEhHeEhYSEJYL1BGVjQvSGkyVVlYN29xVnZpQXVVRzFkeEhOYVF6Q25WZk5NK2h3MkR3MkZqeTAwdWJxeTdKNFR5b0cxZmM1enQ5NnIzSGdxVXlubFdYajJ4VitEeHpER29NZ1VxM1ZjOWFzbngvWXpGZDBTTHRBNEI2MXRHdFFsc2owNFFnbHpWbnI2bFBUL2g1Sk5GdUdBUHFlYXYyL3dBSjVybUxjQXUzNjlhMHJUNGxXZHZBVzJxM09kb3djRDg2MDdQNHNXZU54aFpYOUR4VWV4dzcxc2RGTEdVSlBraWpDZytEOXc3Y0tvNDRKT00xS2ZnOWVMR1ZXRm02OUQwcnRMSDR0NmJFaSthbzNZejIvd0FhMUxmNHE2Zkd1QXU0TWNEa2MwbkduYjNVanQ5cGg3WGNUekovaEZmMngzRkcvSHRYWmVEZGY4UStDbFVSTEp0WGdjWnhXdmNmRm5UZk1aV2o1eHp5T0tyM2Z4VjArVTdWakFWZTVJeFdNc0ZSclIvZlJ1akNlYVVLTWZkaVNhLzQ1OFJlS290aDNCZWNuT0s4VitMUGdIVTdxYnpQbWJlZTVyMUNUNHgyVnV4Q3hxeEhIMU5jdDRqK0tFZXIzQldSRlhBQkJ4MDVyME1EbGVDcHhzb0t4OG5uT2RUeEZMMlZLRzU1QnBYd3p2bnVkelFTYlY1NlYzZmhQVTUvaDZGdUZWZ3lubm1xMS84QUVCVnV2OVcyM3VjZEtaZjYvYTZ0cFVqRnZtN2dIclhzWWJMOEJ5OGlqdWZCKzN4OUdyZW11V0szdlkrdHYyVXYycm9MNjhodFpwRlZ1QVF6VitndndlOGNXK3Y2VEdWZFczS085ZmdmcC9pNjY4TDYvSGRXa2trTFJNR0JCNisxZm94L3dUOC9hb2Z4NVlRMjdzeTNFSlZKRnozcjhINDY0V3AwYXNxMkdYdTl1eCtvOEk1ODYzN3VyOFI5NWVMNGxsdG05Y2NjVjVYcTJrK2Jka2JUeWNWNnBid1ByV2tLL3dEZVhOYy9jNkRIYVRHU1UvZDVyOGJyNGRwNkg2emg2bDQzT2YwSHdwNXNlV1VyUlVmam40dzZiNElzK1pFM1pBKzlSV2F5eXZMM2ttYi9BRnltdEd6OWZEQkp1NlZwV3FOc3hpdE8xMHVGSWR6YlQzK2xRU3p4TEp0VHI3VituU3FLVHNqK1dGQnhXb3pTL0RVZHpJWkhGZU1mdDdmRFd6OFIvQkRWNFdWU3pXN3FQeEJyMnExMUNSSEtybXZPUDJrOUl1TmY4QzNrZjNoc1lrZXZGY05TTTUzVGRqc3c5U05PY1hicWZ6L2Z0SlhmL0NyZmh6cUZ1dnlORTVpSHNTYStWdEgrT2MybnA1Y2pidTVIcFgyMS93QUZGZmhaY1g4K3RXYVJsRVdjeVlBcjgxZkVGckpwZXJUMjdIYTBibFQrQnJsNGN5bFJ3ODNXVjI1Tm45R2NTWm1wcWpLR3E1VitLUGRkQitNdGpxUlh6Z0ZPZVJ4WHBIZ3pVdE4xT2RYaks1TmZIZHZmTkRKa00yUGJ2WGErQS9pbmRhUGZSZnZIS3EzT2ZTdTdGNVBDVVg3UFE4R2hpWVZORm96NnI4UmVHWWRTc1daY0gwNHJtOUwwNzdIQzhPMGVtT2xiWGd2eGhIcW1nTEl6QTdreU0xeTE3NHZqWHhMOW5WMXl4NUE2MTh6aDZjN3VuMk91bEZ5ZktlVGZ0QytGdkkxRlowWDd3NU5lV3dLM21MOHZUdGl2cDc0c2VERzhTNkdKSTFEc29yd1did05mUTZwNUpoZFdac0RLNHI2akExSXlvcFBkRHI0T1UycHgrWnNmQ1hRN2pVTmV0MmlWbDJ1Q1QweFg2OGFGcEVKL1pjdFpDQjVuOW1veE9PK3dWK2N2d2IrRzc2RlpyTk1xNzJBT0IycjdpMHI0ak1QMmZvclBkejlqQ1l4L3MxNFdkVDl0VmlvYkl5enFwVG9ZYUxxYlhQbkQ0aFgyM1RKdkxQekhOZkxOdDRBdS9HM2krVXNoMnRKOHg5SytpOVR2Sk5WbGtqWldLNUk2Vkg0UjhJMjJqczg3UnF2TzRIRlpZZXNxTjNiVm5xMEpSbkM3VzlpcjREK0hOcjRHMG9PNnJsUmtraXZOUGoxOGFkcVNXVnJKdFVaM2JlL3RXcjhkUGphdW1Xc2xuYXM0ZnBuc1BwWHpmcnV1eWFyY3V6TVR1Sk5lbGc4UE55OXRXMWZUL014eDJLK3JxNytMcDVEcDlWazFHOU1qL05rNXhYMEIrenZwNVRRWG1PRlBBVWUySytjN0diZGNLbzduazE5TGZBeFFQQnJIWTI1ZU9lMkJXMk12N0p2elJ3NWJWbEpTbTNjOHYvYVB2bWZ4SExIdTNiV0l4bnRYbFJiQis3MjlPbGQ3OGZyL0FNenhUY1pQektTRDlhOC90NUdiMTlLN3FjVW9LNTQyZDF1YkY4cThpOWFUYm1HNU92VEZkVjRPYTVlNVJZZDI5andSMUZZZmhqUUo5V25WVlJteWNBVjlDL0JyNFJmWW80N200UlMzOElQOElyUEVZcW5TaGVSNk9VMFp4L2ZTMi9NOCsxcTJ1clovOUkzZVowT2M5YXkvRFNsdkVrZnk5WEdmYXZSZmpqSEZaMyt5UGI3Z2RxODg4SnYvQU1UK05zOFo0OXE5VExhbnRLVVp0Ym4xRVpPYzZkKzZQc1R3THRIZ0pWL3V4VjhoZnRXb3plSUdaVjNmTXcrZ3pYMW40TXZBdmdSZHArWXhZNCtsZk12eHgwaiswL0VFalNEUHpIQS9HamhlcENubTA1eTZIeXZGMkJxWXFNcVZMYzhKMGJTWHZMbjVrK1VIcFhVNkw0UGoxS1hhc2ZIOFRlOWIraitGNFkzM1RCVlJUbmFCOHhyb1k0WWJLMjRUWXJIakZmb0dLeDZxeDVZTFUrVHluaE9ORjgxZDNTOGprMzhNeDZWR1FGWHBqcmlzclVMaU5GWmZsK1h0bXRMeFpxelF1M3pGbDZqSGF1YnQ0SnRTdWM4N1QxSkZkR0R3YWNPZXFZNXRqb1U1cWhoWTY3RlVHUzl1Tm9WdG9QWHRWcTVScmNCdHVTb0dLMEYwOVlSOTNwMXhVTnlmS2NxeWs1OXFpWEk1Y3NUaHA0U2RPRGxONnZxVUxuVVdjTDh2dmdWV2E4S01mTFZ0eHEwWW11SmpHb3o5QldoWldrZGxIKzhVYnZwWFI3V25UV2lPS09GeE9JcVhjdE85aG1qV1VpSVhrM0x1R2NWcHhhajVaNys5VTlRMTJPTzN4eHVxZ25pQ04wNzdnUFNydzlHcFhkMnREdnFaaGhzREgyY1pLOWplRjJzNi9LeEI2WlBhcnR1V2tqQzdud0JYTTJXb3FlcjlzanBXbGI2MHpvRmorWGpCNTYxNmloR20rVkhQUnpHZUlYTkkzN1pCTmNoTjJRUmpyM3BKTEFJN0x1YmQ2a2lxdGpyaXhSamNnOU05NnVEVTF1TTdUdDYxaEt0YjBQb01IUnBUMWxxeUw3QkdEdTZuMnJJdjdjcGU0WGhzNHdSMXJhVjg3aVBtWCtWVXJtSGZjcjh2NlV2cnpVZmRKclpYQ1ZyYUs1a1gybFpiRE44dTNJK3RUYVpwcVI2ZE1XWE8wVnNMYWVZT0UzTjJxN0JvVFJhZXpTS2laNEF6eWEzdytMa3JTZWh4NHJKWWM3YVc1NS9aK0YvN1dkbTVVRTRIdFgwUCt3YnFzSHc4K0k1ODZUeTQ1U3BHZStNMTVUYVJ4MlV6Y0xuSjdWcjZMZlRXcy9uVzdlVklwRzFoeGcxOHhuVlI0aXBPRDJaNkdYNUZSdzJIVTE4ZmMvWW5RZmo1cGVuZUY0MmE0ajRUUFd2Q2ZqeisyeHAranh6SkJkQm1BT01HdmhLLytOdmlhRzA4azMwMndyaktuZ0N1UzFQV3I3V0xqZmNYRHpaSSs4YStKbzhMVW5VNXBucGYyaGlJdzVVZXBmRnI5by9WdmlKZE9JSlpWaFo4Z2c1emcrbEZlVDNtb1IyTnF2bC9lenh6eU9sRmZWME1KaDRRVVl3UncxUGJ5Zk01SDlqMm5SdGN4L014Mm1uVDZlc1VueWlyV2pXNi93Qm5STXZSbEg0MUxMSGhLL04vYlBvZmxiaW51VklySGpkM3JMOGJhWkhlK0hyaFdYZG1OaCtsYkN6aU1OdVBGWXZpelhZYlhTNWhrTjhoNEZRb3lrMmg4eVdwK01mL0FBVXIwWTZMNHcxcU5ZL3Y4OUsvSGY0b1IrVjQ1MUFNdTBlYVNCK0pyOXRmK0NvVjNFbmlLK3VKRkMrY3JLUDByOFZQakdmdGZqVzlrMjREVHNxL2dlSzlxbktHSGhaNmFINmRsY2NUaU1GR3ZLWE5HeVgzSE82Um9kOTRndVBKc3JhVzRmc3FJU2E2eGZnejRxOFAyaTNsMW85OURBdnpiMmpJcjJUOWpYUmJYdzNxVm5kWGtPN01nWndSOTRacjYvOEEyaXZpeDRIazhEckRZMjBjbDB5YmRvR051UlhmaGNSZ2FudVRiNXZMcDZuNjVoZkI3aUNybDlMTmNLNHVNbGRwM3VyZDMwUGozNE4zT3BhbHAwZW54MjExTmRTSGFrYUlXWituQUZVdkhYZ3J4RjhQdkgwTDZ4cGQ5cDdUTmhEUEVWREQxcjZIL1pMK0lQaDd3UjhUSTlZdlk0bHRzTWpFcm55Yzk2dmY4RkQvQU5xM3diOFNuMDNUTkZraHZKck50enpoZW5zT0s1Rms4WVYzTlJ2Rm5OVXkrR0doTjFuYW90TEk0Znd6bzdlSU5MampBREZzQUQxcmZrL1pyWkxUN2JORHVicUQvZHJ6bjRZZkVhYTBWSkUrWlZPUlgwUjRWK0tEZUxQRDhjS3J0WHB4M3Ixc0hsbUVpcnpobzBmSjRyRTFPUnFNck81d1BocndyNVdxdzJyUkhsZ3VCWDBvM3crZ3NQaHpBcng3VjhzZFJqcUtrL1pqK0JVUGpMeGZIZVhrYk5HR3lBUjFyNk8rUG53eHN0SjhEaUtGRlZsVEF3T2xmSFZaWWVWZVVhVWRFZk44Unh4V0l3dnY5TmwzUGdYeHY0SDArd3RTMFcxVzVyeW40aVhjM2gvUUoyVmg5MXR2SEI0cnZQakhxTjNvR3ZQQ3pIeXd4cnB2Z1A4QUJPeCtPZ3Q0OVRsWHlKR0NsZlFacjJWaytIbFRoVXJiTTYrRGMycTR5TlNuS0w1b2RIMTlEODJmSG5pTzYxaldKMm0zczI0OXVsYzN2ZG0rNmZyWDdDZkgzL2dtSjRGMDN3ZzF4YlJ3TE9BR0RoQUcvblZIOWxUOWlYNFppMmtpMVRTdEp1NWx5Rzg4QWsvbWE2cTJUUVVlZkRTYy9KTFkxbEtyWHI4dUwvZHQ5M3ArQitTT2pLMGwrdTdoUWNWOVFmREYxcy9CS3Nwd3pKeitBeFgwRCszL0FQc2YvRHp3WHB6WFhoMnowL1RycFd5UHM1NjhIdG12bnJ3emF0cC9ndDFhVGJJcVorbGVCbldEcVlhakYxVTFkNkgwbUJ3dEtoQ1VZVkZQelI0QjhZTHByenhWY05uY1dja2tDc3J3dm9FdXFYaXFxOGs0RmEzaXEwYlYvRWtqY3NXYnA2VjYxOEVmaGZIQkdMcTZUSkJ5QVJ4MnJtZUxqU3B5Y3ZrZWJVeS8ybUtsV25zalgrRDN3cWgwaTJGemRJclRiUWZtSFN1OTFMeGxaK0c3Rmw4eEk4Q3VlOGMrT3Jmd2xwN0xISXZtRVlVWnJ3cnhOOFFyclZyaVF0SXpCajY5SzhpbkdXS2ZQVmVoNmlTaXVhYnN1aHYvQUJFOFpmOEFDUzYzSzZ0OGdKQU9QMXJLOEhmdk5jVGI2L25XRHA5dzE0V1pteDNycXZoanA1dWZFRVpMYlVWd00valgybURsR25RWFpIbzVmZXZpS2NZN1hQcXZ3VEI1ZmdpTm1VYm1peGo4SzhWK0lkaEUyclRPMzNza0Qxelh1ZW0zTVZ0NFdXTlhYN21PRDdWNFg0Mm54ckV4L3dCb2tlM05lTmtOWnp6Q3BMK3R6cnI0ZFN4RXJIS3ZwR1YzRmR1MFp5ZlNzUFg3bG9HWmQyT004ODVycUx5NFlSZk1EbGxQZXVWdVlYMUM0MnQ4dWVQcFg2TlJrMCtabmg0NWM3ZE5IUHZwMDJ1WEczeWNybjcxYkMrSEliV0JWVlYrNytkYWtMUjZmYWJGVXQ3K3ArdFY3cTZkaDk0RGowcnZwNHgxSGFUdEU4R1dSK3hUbmE4bjFNczZZcTVBVmZsNXpnVldrMGRacFF2bDdtSnJSc3JHNHU1MjI5TThrbi9QV3I5MWJtelJ2dXV6QWNtdW1WZkRwMmpxemxwNEt0dldzb21QSjRkZ3Rnd1JWQnp5UldaZTZET3l0dFhjb1BVR3RnM0daTU44elo3VkpMR3lMdTNNcll4WFJoOEpLVHZKSGxZN0ZZZFI1S2NqaHRWMEtaV2szSzNCN1ZXc1BEMDkzTDhzWllzTUx4aXU2a3MvT0RNNjdtSTVJcTVvMXNzT256U2hOMjA3T2Z6UDlLOUtwR3BUcCs2ZkxZZkE0ZXRYdk5sYndaK3l0NGs4V1dFTjNITnBGbmEzWlpZSmJ1OUVhenNEaGd2VThIZ2s0QXoxcUM1K0NuaVh3N3FjMWpmYVhkMjAxdXhXUldpT2ZxT09WOStocjBieEI4WEw3d2JwK2wyMXRGYitWSFp4QkZkUHU1QVlrZlVzVFdEcnZ4NDFieEhwL3dCbm11cnBkM0JUek1vUjlLK1dsak0xYzNPU1hJOXUrNTlSaHNxd05OZnU1YStaeHJlSEpiZVh5OXl0Sm5HQnppcjJuK0ZMbVhjcWxmTUJPRTNZTGZoVU5wcWpMUHVQM2h6bjNyYWl1TFcvS2xYS3paK25wWFhMRnlVUGZQUXA0V1BOKzdaRFk2WTF3ZkxFZno5RDlhanZOTmF5dUNyTGwxNmowcnJOQzA5TkxzWmJ5NmJkNWE1UUU5VFdEZFRIVUxobTQrY25OY2tNUTNMVFkrZ28wb3VDWFV6SmJvdDkwYmR2SEFwOXZJNXN6L0V6ZmhUcDdRd3Y4MjMxRk50NHl4YmcvaDNyZWVMY1VUSEQrOWRtZjVUQ1J1Q3ZOYm1pd255ZHUzSUp5YWtzZE1pVjkwa2U0Z0RJSnhnbXBMKzRhM2hVUXg3VnpnaXZNOXNtOVIxTU5VaXZkUXVwd1pnMi9oejJySTFGUHMxdXJGdnVuL1A4cTBKTlFrbGkyRmlHeG1zdit4N3pXN255N2VLU1ppY0FJcEpQNFV2ckZLTzdPV1dGbktQdXJVeGJ1NU1yOVB1bnJSWHJuZ1Q5anJ4UjQzQVpyT1N5aTI3Zzg2NDNmaFJYUFV6ekFVNWNzcWlUTVA3SHhiMTVUK3RqNGVhdXVxK0ViS2JjUG1pQjYxWTFUWFk3WU1COHpWNDEreXo0d204UWZENjNqa2tMR0pjZGE5SHVSdVg2VjhaUnc2c20vSm40dmlwT2xWbFQ2cHRmYzdFRjdxMDBraHcyTjNhc25YU1pyWnVwM0ExYW5mTFZCZnFUYml1K01WSFk0M0pzL01QL0FJTEErSFBzZWdTWFhLckhLQzJPT0Rpdnh0K01mMk52SE51a0lHMXBGTFk1N2pPYS9lYi9BSUsxZUFQK0VnK0ZXb1lYY2ZMMy9UQkJyOEJ2aURhbGZpR0kySHpmYU5vL1BGYytZWWZtbXF0K214KzRjQTVrNm1UZlZMSzhKL2cyajZMK0U4TnJaV1VYOE81Y0ErbE4rSTFuL2F0NzVjYk13VmVtZUQwcHZ3NnQ5MmtSblBRWXFQeFJxcHNkUjh6YmtyNi9TdWJLK1NXS2tudWYzNW1FcHg0WXAwa2xheUp2QmVnLzJYYTdXVlFaQnoxckMrSmZ3cHNSQTE4bmxpVDcyYXQyM3hJV1J0dTM1dS9OWkhqdng1TmM2UThZWCtFZ0VHdnM4TEtxMjA5aitWYzl3bGFWWnppdlVaOFByaUI0dHFuTzBZNDdWOUYvQXlTSk5OalhBTzV2eXI1QytITjljV0YwN01HOHRtTmZSM3dlOFpmMmZZeHlidnV0dTYxN2VWMXFYSzFOWDBaK0s4UlVzUkZwMFpOZThyK2x6OUh2MlV0UFd6MHFHWGJncXVjMXYvdEplTzQ3ZlNuaVAzZ3ZyWHo1K3pSKzF4WS9hRjAyUU1ycUFQWW10cjlwVDRoSnE5djVrZTQrWndNVitHeXd1WTBhbFNmTG81UDdtejduTXNWbFZPbkNGYWF2Wkh4bDhmOEFXSnRjOGFUZVh4R3JtdmZmMkVQaDR2aVN5ODRYRWl5SVJzVUhBSnJ6ZTkrR0s2OWR6VHlLM3pIUDFyMWI0Qkkvdy8wNlA3UHVYeXpuNVRpdnVhbUt0Z3FWQ1B4SkhnY04wWTBNZFBHUmQ0eTEvd0FqMWI5cEw0TmVKYkR3N05jUWFsSzBFY1lmeXl1Y0Ryak5mSE1IaW02MDdYcEZrbllNVGdrSEdLK3lQaWYrMGtMejRjM05wSm56R2kyWlkxK2VHdGVJYmh2RTkwMGp0dGFVa2M5cStvNFB6eFlPdHNtZkc4WVpIaU04cDFmckUrVGxkNGt2eDUxU1M1ZU80YWRtWGNWWldZa0hJcnlMWHZFa2xycDd4d241WDR6N0d1aitNdXZOZFdhcUpHWnQ0UFg2MXh0dnBwMUdKVStZZE0vN1BldlM4UU1WU3h0T0ZaeHNlejRSNU84RFFxNGVwUG5WN21MNE4wYU9UeEQ1azIwTG5KM0RPYTlLMWY0aldQaGZSdkxWUjVtM2hSaXZQOVR0L3dDeHBHTE0zQjR4MU5jTDRzOFF0Tk0yV2IwNVBTdnltdmdhZFJxYmVuWS9UTTBqUW9RNTJ5VHh4NDdrMXE4ZDVDZm1PUnowcmw1NzN6RitYMXFsZDNmbXk5OGZXdFh3N29MYXE2cmpkdTYrZ3FaUlZySHhieFZYRjErU21iUGdtemsxS1BhdlJqeVJYby9oT0JkTHVFOHZqYWM4MWtlR3REajBpeDJnZk42MXAyTDR1ZnAyQnIzY05GVGpHbjJQMVhJY3QrcVVveW44VDM4ajBsL2lUSnBXbDRZcVdJMmdkcTRmVU5aRTkxSkkzemVZU1FjZE9hZzFXNGFlUDd4UDQ5S3licWY3UEYxK1p1MWVqZ3N2cFU2em5IY3ZOZVNFbkpMYzBMKzVEUWJWKzh3SFQrbFIyZWttMkJMQW1SZ1NUakZVdEplVzVsLzJSelc5ZjZpcVdnSEgzZWZldm9KUmZKeW8rUXAwWmUwOXBMYTVnWGxxc0tZTzRsdWFxUmFmNTUzTXgyajlLdnVmTitabVhnNUlQTlZMMit3UGtZQStvSGFvbzBIS1ZrYVl5ckZMbXVTL2FvN0tNS20wRHY4QTUvT3FPcFg0ejhwM0tCNjhtcys3MVRZV3czM1R4eFZLNjFUQSs4dUFlbnJYMGVDd2tLVFVwbncrZFlxVmVMakI2bWpER1BQM3V5N3NjakhTb2RVdS9OK2I3cTU2bXM5OVcrN2dsY2pGTXVUSk1vK1VzakhPY2RhOW1PTWlwWFBrcFpMN25LcE0yN1MvUllQdktkeHh1em10VFRyMk9YU1pnckJseWVvNm11WFN6OGxlUmhxNlRROUJlOWl0L0xtQ2djdG4rR3VYRTVqU3Raczc4RmtNNDZ2Y3RmRU8wVzVqczAzZk5IYlJBc08zeWl1Yy9zUWJWSTc5NjZYVk5OdWRVdjJXTlF5OElTRHhnY2Y0VjBHaWZDbWE1czQya2sybFJ5Q3ZTdVNPS28reVNrenMrb1Y0VmJJODVqMDRSWEJEWngxR2ZwVnF5MFM0bmtKdDRwV2JHUGxUTmV6ZUgvZy9hMmUyU2JiTXlqcDJyckxEd3BISEdValdKZlRhSzhuRTEwL2RwSzU2MURDOG52VkpIaW5oM3dWckdwb3NMeHNzZmJ6QWE2WFQvZ2pxVjVQdFpUSDdnY1lyMVBTL0REVzBtWm1WVlhwaXRnYXZhMkl4NW03dHRYcWF3VWEvS2J5ekNsQnIyYlBOTFg5bTN6b1Nwa2ttbVk5RkI0R0t6dFQrQWNPaFMvdnJwaHU2eHFNdCtOZXZ0NDF1SklURmJMSFp3bmhpaCtkL3FmOEFDc3MyUW1sTDdkdzc1RmNuMWV0T1h2dXlPdU9aZTd6WDFQTHI3d0hiMkduNzdlMVpuUVp5N2ZlL0NzSnRQa1J2bXNZTnVjNUdmOGE5dzFMVEk1Ykw1VlZmYkZjanF1aXFzM3lxdUFlbU9LSzJYUVVmK0NkdUJ6aDFQY21ybFg0V2ZEWFF0WDFRU2E5Q3NkcGtFaU5Ua2pqalB2WDFMNEw4SWZEOXJLT1BSZEl0N0JoZ0xLUUM1UHZtdm55MjF0ZEhpV05vNC9LN2VncmU4TS9FSTZUZUs4TFpoL2lYUFFWK2U1NWxPTXFQMmxDbzAxMHZvejZuQjFhTDBhUG9vYVgvQUdYSjVMS3EraEhRajJvckc4RGVNNFBHT2tyQzhtNTQvbWpjbm5IcFJYd3M4WWs3VmRKTGRIb2N0dEQ5WC8ySy9FWWswdHJYUEs1QUZmUUV4T0d6ME5mSS93Q3h0NGsrdytLMmhMZkxJQVIvS3ZyQ2E2eU01NHI3eks2bnRNRlNuL2RYNGFIOHZjWFlYNnZtOWVuL0FIbS92MUtqM0NvV1h2bXFkM2RlWW1QU2tudVY4NXZjOFZYTEF1Yy96cjBZN256aVBuLzl2RHdtM2lYNFgzaTdOd01UTDA5cS9uRCtOOWdkSytOTjViN2NOQmVNdVBURFYvVDUrMGJaeDZ4OFBicUVLck50SXIrYW45dEx3MUo0WS9hKzF5elpkcW03TGpqc1dOWGlJT1ZDL1kvUlBEdk1PVEdTd3Y4QU00djdtajBUNFd5U1hWbkRDb0pZZ2REMU5kTDhRUGd4cVgyRnJqMUc3Rllud0hqSjFmVDEyNUprVWNqcnlLK2x2aXBjUjZib2JBcUFXVHA2VjgxbFZPckN0elBxM3VmM3p4cHhCVXdlUTRlalR0cWo1QXRmQVdvRm1YeTE0OWFvZUl2Q04xYUp0azJzRFhzRHpSM04xSjVLcU05Y1Z5UGorQnJYVFpKRzZLTTVyNy9BMUozY1QrZE1Wbms2bk5leHg5bm9NVmhwSWNtTlpHSGJpdW0rSGw3S2xwdDNmS2ZldktiL0FPSUJsdmZzKzdhRjQrOTByMGI0WTZncGdqQllIbkE5Nnh5MXpUbEdUNnMrSHpDOHRUM2I5bXkwbG44ZEZ1MlJpdmZ2aVRJb1dHTTdTZU9LOEUrQyt0TDRhMUZycHZsR2VEWG92L0NjdDR1MWY1Y3NpbXVUR2FRYVBpZU1NTE5WSVZWczBpOWNwNUVYVEZkSDhKYnFDNnZQczgyMHFXNHpYUGFpVEpiSHRWWDRkYXBKYlg3czNES2VEK05YaDhESEVmY2RHR3pPcmdNSlNrejA3NC8vQUFwaFR3VGNYRnF5Ny9MenhYNTMvRU9YVU5BMWlmZXZ5cTNXdnR6NHUvR1NlUHcxTmJ0SVN1M0IrbGZFdnhrOFVmYnI1djNmeXNlU0t6cWNKNHB4L2N1M21lSGplTjhIUG1wVkhxemliN1YzMXlaUXkvTjA1cTdienJhb3lydFhqSkpOWVdxUEpiYlpJMU9EMElGVWI3VVpmc3gzTXlsZW96MU5kR2F4cmYyZkNsaUg3eVo5MTRlOHZOVm5GNmIvQUpHVDQzMWlScG1ETjh6YzhkaFhuV3NYRFN1M2ZtdC94UGZ5K2N6Tm5qb2MxeXQ1TzdLM3JYeThwVzkyNTdQRUdNNTU4cFZWR1NmN3U0OWdEWHBudzM4clNyWHpKWTk4aEhBN0N2T2RKUnpOdVlCaXZJcnF0TzFCb0xmamorbFlmSExrdVljTXloUnFPdk5IYlBxaG1HNWNBKzNhbmFYY05MY2ZMMXJEMHU3YWEzM1p6a2V0ZE40RXMvTW5hUi91ajE3MTlQaHFhaEZINlRnc1RQRTFvcVBVWFVKR3Q0OFkyN3V2dldjUDlKbEg2NHE5NHltOHE0d3ZmMHJKajFOYlZlK2NkejNyME1IZVYyWVp4VWhIRWV6bTlFYTZ2OWloNllJRk1hZHJuNzN5aFJ6azFreStJbGRmbStibXFkMzRqWmt5ckQ4RFgwR0ZvemtybnoyWlp0UWpwRm1wcVdzZVZEc0h5cW5UbnRXTE5ycVJLZDNLNTllYXh0ZDhSeUdKbVVBNVBlci9BTU52aFg0ZytMTW5tMnNJanNZNVJITE52SHk1eDBIV3ZTZE9qaHFiclZwSkpId21PNGdVcXZzcUtiYjh2NlJDTDhhblBzaGpkbVkvZEE1cTVINEh2OVJ1Z3FXc3kvN3k0cjd1L1pkL1ozOEkvQ1MxaDFpMVN4azhRV2RzeXl2cVA3MkNjc29CK1Vna1o1QjZpdk52ak5xbW02dlBKZldObkF0N2NURlRhMnNXMUkrdkE3MStlTHhFcDRuSFN3ZURwdHhWdmVmZjA3ZVo3ZUh5S1ZTS25WYWJldWg1bDhEdmdURTJzUjNtclIyTThOdmgvSm1PNVd3Yzhqb2ZwWHIzeEo4UmFmNGcweVBUckx3dnBVVnZjS1lSTlpXb1dPT1QrK3E5anh5QlhEK0dmQy9pTzlSbWowN0VmVUF0dHdPOWIzZysrOFkvRHZ4OWJhbEhwOGR4WXhrZVpic0E2c01ZSkdPaDlEWHNZWEhZMVRuVXFPOGV5dHI1Sjl4NWhrZUdrb3loRmUwV3pmUi9lY0czd0ptaERYVnd0ejluallqZUFDaFBwejArbFhMZjRZdGZXcWkzamFTTGFDQU9tZlU0OUs5aThaV3YvQzBOY3Y3alQ5VC9BTEZrdjR4OW9zN285R0hjTmpQUHZubnZXbjhGZkF1bitFNXZzZHhlejNWdTZoNVZVWmtpSXp1S2orSWQ4anNPbGZVNFhKcFpqaGxpY0RleTNpN0pwK2ZiOG4wUEJyWnBMTGFqam1ja3V6U2RyZXRqdzZ4K0VWOWFTckt5eUpIam9GT0szYkRTWkxBcXAzWTlUeGl2c3RQMmZ0QjFMU2xrczlkdC9tVGVGa1RHQWZYUFN2TmZpcit6UE5wOXUxMWEzbGpjSXZKOHR1MzByVEQ1VEs2ak8xL1ZFNHppQ0xwdWRHN3N2NVpmaHBxZU5hZkFzejRac1k3K3RhYVN4YWZIdjNaNHdBUlVjZWdTYWZKSXFveDJubHNkYXg5WHZjU3NyTUYyMTMxTUhSb3k1RkpOK1I4L2c4Zlh4dFAyM0k0eDgxWi9jUzZ4NHBFMzhSWDI5YXlvYnhaU1dWdDNOVkpiZHI0ZXVPYXJFR3laa1ZXSEhidlhQVW8ydks1NkZPWE5Ia2l0VGVqdmdwSlZ0b0hxYXZhUHJDdklSNW03dDlLNHUya3VyN2Q4b2lVZG1PQ2EzdkQybVNMRXpiaHZKOWE1SzFhRVkyUFd3dUZrbnF6cHBybmZHZVNlNHJJMTIwUTIzbVorWnYwcS9CRnRVTEl4M0w3MWsrTU5XZ2dnOHVOdm01NXgwcnc2Mk12b2U1aE1ESlRTaWNmcjE3SVFmTGtrWTV4anRpc1ErSzU3R2JLc3hIb1RUNys0a1JtSVptK240MWc2bkt5UHpqbXZQOXQ3M0sxb2ZjMGNIeXdQVHZoMSswSk40VnVWOHp6TVlJeitGRmVRelhPOFo1R1BTaXZGeFhET0NyMUhVbEhWblhIRlJpck5YUDNzK0RmeGEwUHdDOWxxZDVxTnZiaFZBY3ZJRUZlMDZyL3dVYStIdHJaamJybW15TW81eGRMWDRTZUJmajVkZnRhK1BORzBieEI0Z3VORnRaZHNQbGJQczZ5ZC9tR2VweGpjT00xekh4VytBS2E3KzFkYTZENER2OVFiVDlVbEZuNWJUTTRhZnBoZWVtYTlIQzhMMWNCaTQ1UldzbTA1UmxlOFpMZDJmMytuVS9tL080dk5NRExpT3BVU3RKUmxCUmFsSFd5dW4xZDEvbXo5Z2YydWYrQ3RlaCtGdmgzY1A0VDFiVFpOWWRna1FXZFhJOThEMHI1UTBYL2dyVDhXdFV5MXZxQnVWNjVqdGl5L25YZ0hpei9nbUI4VVBBM2hIVU5TdXRFMVIwMDFTOG02MWZHMGRUbkZVL2hXUEgxcjhJb0x6UzlIbHZyR0taNFMwY09XQlhranBYdTV6NGQ1azZNWjRHb3BUNnBQUzNrMTFQbStGdU91SHFEbmg4ZlJUVjlKeVYzNk5kUHZQb2J4bi93VjYrSzFoNFgxQlpyR0xVSkk4Qlk1SVdqeUQxNTlxL1BMOXNYNGs2OTQwK05ROFVUYWZOTjl1aFNXUm80U0VSOG5LNXgycnRmamI4ZlBGOXhESm84dWc2aGFQTXdCbWVCbEs0STc0NzE2aDRWMW54SmIrRnROR3VlQzVwYmQ0MEJtK3p0dElJSFBLMThMaXNaajhrby9WTTB3OTUxSHB6VGpGNlcwamUxL21mbzlITE1Cak1WRE5NbHJlelVWOWxYVGVqMTlQSSthZkFuN1lVM2c3VUxlVDdISjVsdTRPQ2NaSXJxL2lEL3dVcjFMeFJDMGJhWUkxSXdEdjZmcFh2dmkvd0RZUTBQNDNocE5KMCtPSFZObm1Bd3A4by8zc2RLNWVUL2dpMzR5MUN6TnczMk5ZZW1TY1lyNjNLc21sanNGVHgxQ203U3ZvMnJ4YWJUVHMrNlpoeEY0d1l1bFZsbG1hNDZNWlU3Y3Q0Nk5OSnF6Uzh6NXcwdjl0elVMYThacExOR1ZqMEJ3UitsTDR4L2JGdVBFK210YXgyZmx0S09jTm4rbGUwK0x2K0NYZHo4SnREbjFTK3VyU1g3T2pPVSs4T0FUWEgvQkg5ajJQNGsrSHJIVzdxRVc3U1hCS3FQbHlBZU0xdkxBNHFsVWxUVk96dGMrWmp4dlFuUldKZU1pMDVXdlo2Zmd2eVBPTk0rRVB4TTFqd3ZlK0tyVHdQNGt2UEQrbUw1dDNmeDZmSzl2YnAxeXpnWUErdEhnajlveWJRNUkxa3RsS3FjZ2R4WDcxL0JIOW8vNGJlQS8rQ2YvQUkwOEFUV1pqMXJWOUxsdElJakFOc3p5UWVXRG5HT0R6elg1TlA4QThFeDdpNEwzQ1hFS0prN1F6RGl2bThydythMWxOMUtQSlp2Zi9nL2ZwcHFkdUk0M3lxalY1S21OakphYS9FbjkycStaaitDLzIxTkxld2p0NUxRcTNjajFyMDd3UisyOTROOEkydjhBcHBqamtibms4MXhXbS84QUJQbWJTcjVUSjludVZVNTRrNmZsVC9IUC9CUFM2OFdMR2JhUzF0MjZBaCtsYVZzcXpLYytYMmVucXY4QU13enJ4QnlURmV6aEt1bW9yZEovNUhyT25mdCsvRG5WcDlyYWhieDd1enlCZjUxM1h3dC9hUytHUGlIeEhaMnY5dldFTWQxS0ZkdlBYaXZsenc1L3dSczhTZUlHM040ZzAyQld3ZVFjaXZmdjJlLytEYTd4bDhiTHdRNmY0dTBtRm8xM21TUlNvSDYxdXNoekNpdmJ5ZkpGZjNrZVRUNCt5T3Avc3FtNXQ3SlJrLzhBMjArZ2ZpTit6NTRIK0pGaGRYR2wrTUlValdJTnRqblIxVmlPcDU2VjRoNFAvd0NDZTJoL0VxMm5tdVBGU3plVHU0Z0s4a2REeVRYb1Bodi9BSU5ldml0WlR6aVA0Z1cxbERFeFZ0bDA2NzhmUTE5SWZzUy84RVJOYytDK28zRTAvaUw3ZE0zeXViaVZwRXlQUVo2VThQak1ka2xlcG1PTXFmV0tXbkxUaTQzMjIzN24wbU94WENlZWNQU3luQTRiMkdNYmkxWGxHU3NrL2U2YTMvQS9OUHgvK3lOcUhoZTR1SVZqdUpMZUZ5aTNEUW5Zd0djSFBTc2pTLzJGZGM4U2FGY2FveFczdFlUOStRWTh6NlYrN0hoajlqalNmSFVHcmFUcm9zVnV0SnVWaGRvOEdLUlRnL21RZndyai93QnZqL2dreko0MStGZjJqNFk2bzJsYTFwa2ZtSlpQL3dBZTE3Z2ZkT09oOURYeGtzOHhlUGpLdmlZS20yN3hpbnpXVDFTYjc5ejNzdXpEQzVWeVlhalVjdEVuSnExMmt0YmVaK0V2aTM5aExXNTRXYUdTTnZ3eC9XdUR2LzJHUEZWcFpTWExSeDdGYmFGenl4OXE5NCtLSDdRSHhBL1o4OGFYdmh2eGRvTTFwZjZmSVlwRWxqS3RrZHhrZEQ2aW9kQS9iUjA3VXBsUyt0R2gzY24rNmFpVldxNmJjcWFkMW8wejZYMmxMRnRUay93UElmaC8reEpxTjZaSDFMZkgwSVJFNi9qWE0vRi80QWFwOFBHbWtoUnBMV01GczdmdWl2dDd3RDhUOUU4WFd5dGJTeGZPT2dZWnJQOEFqRjhQRjhiK0hiaXp0WWZNbXVVOHRBQm5jVHdPbGZONGZOYXRQRWN0VFJIZC9aeTVIS0wwUHpwOFArTVpMYTcrenljYzRJOWE5WThKWFlOcXJMenh6aXZvNS84QWczdStLMXJQb3QzY1htbldjM2lCUFBodDVZbkRRS1J1K2IxUDBGY2o0RS9aNG0rRHZ4UjFqd2Y0b1dCdFYwbGpESnQ1UnZRak5mY1VNZFVXRmVMaGVkT0x0ZGR6cDRSektkR3E2TlozZG00cnJ5M3RjK2Z2SCtxU1JYWHlydTV4a0hvSzVxNDF4dkxIeXR6WDE3NHovWmMwM1dXYVdPTXFUMkE0cnp6WGYyVUZXVGJFNjhkUTBmVS9XdXJDY1VZRzN2WFIxWnRsZUt4TldWV25PeWZSbmdQMng1d3VGYm5xS2ZMSjVjSitYcWVsZTJuOWxlNGhoSzdrM1l3TUthMVBDMzdEMnFlSjUxOHlUN1BiL3dCL2FTVCtGZXREanpKcVVQZnEyc2ZOVDRheGs3MmFiUG0yU3prdjQ5cXBJV0o0VWMxOUYvczRhWGRlQy9obk10dll5THFONUtITHlMdDJqSEZleitCZjJPTkI4RU51V0o3MjZBSDd5UWREN1YwRi93REIyU2VYY3Y3bEYvaFhwWGhacHg1Z2N5cC9Wc08zeTZPNzZuYmxQQjhNUFZXSXhFcnZzY0g0T3VkUXQ3eVNhNnVHWnBsL2VJdWR0YkVkbmJTM2JUeHdKNWpIa251YTZpMThCdHBjTGJWV1Jod1N3cXJINEh1SkRsVjIvaFhIbCtCcHVmdDcyOUQ3TDJ0S0h3SWQ0ZjFGNExqYXNLN1c0UGI5SzY3UlBDa2VyU3F4UURjZW1LeWRBOEEzRHN2eU51ejFJcjJ6NFRmREZyUVJYRnhHemJUd0NPdjByOVA0V3kxVmF1bnduemVaVVo0dWFVSTJaeHZpMzltWC9oTi9CRnhOWS82THJWakdack9kUmhpd0dkaDlWYkdNZTllNGY4RTd2Q0h3MzhWL0JTejFqVy9CK3FEeFBienlXYzBVcUV4M002NTN0RmdET0FNc3ZVVjBObFlXdW42ZjVuRzNIU3ZEUEEveE52UGh6NGw4WGFUWi9iMjB6Vjc4M3R2R29ZaTN1VjZQRmpvM1VIRmZwVWxoc0xGeWN1Uk95YlR0ZEx2WStYNHp5dXZpY3UrclVGNzhXbW4xODFycDU2OWpzZjJxZEx0NC9GOW5ybWkyY0Z2cG1wSzhmbDJ6Y1F1allLdXZWWEF4bFQzelhLYVRZWEY3cDdKSXErV3c0NzVGWGhyMm9mRVJwcis1WXJIZFNtWXFEd1g2RmlPeE9CbXRHM2VLMHROblJsSFFWK1daeG5WRjR1U3dyZktlbHcza3RlbmdLZExHYXlTMTYvZSs1NHQ0eThNUldWM050VURrOXE4ZzhjK0VtV2Q1VitWYzg0cjJINHFhMEl0WG1YZDBKNlY1L3F0OEw2emszYmZ4cjU5NTVPbFZ1MmVyVHlPS2k3STg3aGEzMHVBSDc3ZTlVTHErRnhJekt6THgwQXptcitxK0hMaTQxRjlyTjVmWlFLam44T3NtQ0EzSFd2b3NQbTBLc2ZlZTU0MWJKblNxWGFzY3pjeXMrN2JsRG11cDhEM1N0RCs4ZG1JOVJVUytIeEsyN1lTdzRyZTBid3NiZUE0K1ZqejBwWWpFUm1yUk5vMDFCKzhSNmxmTEZKbjhLNHZ4amZmYUdWVk8zbk9hNkR4VmF6eHo3TUhqb1JYUHJvTWw1Y2ZQbjhSbXZGcVZlV1YyZlVaWlRnMHB2WTV1NWdXQUVxN3N6ZGF5TlJnYVRuMzlQclhvZi9DQ1IzSkRNMk9ueWp0VVYvOEFEbTNVcTI5dmNkcXpwVm95bGVUUGFxWWluQ1BLZWN0WWVZQmpyOWFLNzkvRHR2cDYvSkN2NDk2SzlHTlNMUjVVc1JGdlNKNFZvWGorUFh0Y3RJbVdmVGRRUzQyU0NQNVJES0RoV1VZeXZ6Y0VEdnpYcTluOGVwUGc1OFcvQWZpRCt6N214dUV1UmV5WFR5bGttbFNUYkpoU1A0V1VqSG9SNjF4MzdYSDdIZmo3OW1xODBQeFZyM2grWFRkRjhSelMydHJmTEtKSXJxYUxhWHdRYzV3eW5rQTBmR0MzaytNSHcwc1p0SERYRjFwZDdEUEtTdTN5alBiZ1RqNkdXRUgwNTk2MW9jVlVwVjFpOFJUVjROeXN0bEszTE5wZHBKcHRiWFB4RE5PSHE3d1dJeXhTY3BSYWgxdk9EMWo4NDI5ZDBmc3A4YlArQzYybStPL2docTJuMi9pYlE1cHJ6VDNoOGhJQUpIWmt4ajYxK2Zud3QvYjMxcjRML0E2NjBuVGJGZFVua3ZKYnZ5eVBsaUJISnorSFN2a1B3cit6eDRzOFFYRWMxdjVjRWU3bGpKakJyWCtKdG5yWGdYUlZzSWZNYWFNR09lVkRnblArTmZWMGVQTXFvNFZ5d1VWQ1c5a3R2Tm53dUQ4RjhmVWxLcm1ibEtsRlgxMWs3YkpKZXVyNkdwOFkvd0J1RHhMOFNkY2tNMXJESEpuZnRRZmR4ei9TdnFmOWpIOXMzeDU4ZXRQMHpRN3p4SjRXMCt4dElkczdYZ0RTUUlwQzVLOXozN1Y4VStHdjJVL0UzaVhURTFDUjdhMVc0ajg0TExMdGtaVDN4WDBIK3dQNEQ4UC9BQXM4WDZsRDRpMWkxdHJtOFVSUk1jTWluM3I4azQ2d2NPSnNHOFhaVjZrTllwdEx5ZktmZThOeHE1TEtPRTVIU291OWx2YnFyL3JjKzAvZ1ArMnhhL3NRNlg4UUpQR0duMm11NlM4VC9Zcit4dGlYbkl6dHoxMnEyZXVjQ3ZodjRpZjhGaFBpM2ZvMXhaeHpXT2pYVWpHM0xOSVZjWlBROEE0NlY2ZDhjZmlycmVsZU1kUThCM0ZwcE9zZUNkZDh0Sk5WalVmTXZjTG5vQm1zTzYvWjNpOFBmRm1ENFgrQy9DYzN4VXN0V3RVdUxTUU1FVFRwSkJsZ1hZRUtxNXp1SkdLbkk2Mks0YTRmK3RWWSt6Y3RaTG1UV2pldXZ3NlBYdlk4ak84dndIRW1jZlZhampQMmEwZkxxcjlQUGEvbGM4SjFQL2dwWDQyOGJ4L1k5VmFPUzN1UGtmYVdMWVBIclh1WGptODhWZkEvOW5UUS9FbWwzR1lkVHVOc2NFbVk5eW5uY3VlbytsYlh4Ty80SisrQWYyTHJDeW04UmFwcEhpYjRzWDBnbXQvREZxMit6MDlUM2xmdUY5d000NEhldk92Mm1mQW5pcjQwL3NocjhTOVE4VlhGNFBDMnBmMlZObzhhK1hiV29ad284cFZ3T01yeVJraXVmSStOc1ZuZU1WVEErOVNXa3B0TlgxMDVZdGFxK25Ob3UxeThad1RnTXJ3ZjFmRnhWMjI0cVBkTFc3dnBvdGozL3dDQzJ2cjQzL1l4OFYrT3JuWHJwZkZHanltRzAwNDNBQW1iYWhVZGU1WWo4SytWN3IvZ29WNDh0TlVtczd1Mzhrd01VZVB6V3lwSHJYSC9BQXovQUd1L0UvZ3I5bmpYUGh4WjZIWjNGbnIxeDlvZSthSW01aE9GQkN0ai9aR0QyeWZXdUYwYnc5ZTNsOFpMblQ3NTFrUHpQbkpKOXlhK3V5WERaNnAxbmlhaWFjM3lYL2xzcmJKZWU1NG1hWmZ3ck9OTGtwcU5sNzI2dS92MVo3NTRTL2J5OFQvMmhJclJLUmNmTHVMazdLYjRrL2JTOFE2UGRmTHZabU83aVhiaXVXOEZlRi9EdG5GRzExWjN5emZ4SGYxL1d1cjAvd0FIZkRqV2RSRGFuYjZyOTNIeXNlUDFyM280WE1wU2NsS052NjhqNTJWUGhhTlN5cHY4YmZtTzBiL2dvNzRxMG9vclJTdHQ3RzVOZTlmQlgvZ3VoNDYrRnNFYTJXbXErM2ptNVpXTmVYMm53cCtCYktETGIrSUdiSC9QUi84QUd0U3orRy93VVFxc2RscTNYQTNTUC9qWFpSeS9NcXk1ZmFSUzgwZGxQT2VIY3ZsejA2Y20vTFYvbWUyYWwvd2NFZkU3eEZjc3NOaXNPN1B5bThkbFA2Q3VpOEtmOEYzZmlzbWlUV2JhZkh1blB5eVFYRHhzbWV2MXJ4L3d6OEl2aEw4a2tPbFhUSGprdTMrTmVvZUYvaDc4TGRPMDJPZURSZk9tWHFoYzV4K2RUbXZCV094MUZVcStJZ29lUy9XeU5NdDQweVdsaXBWY0poSjg3M3ZiWDVYZjVIZld2L0JYVHh6TjRQdDlMMC9TMnRaR21GMWQzRDNETkpjdjE1STdacjZZL3dDQ2V2OEF3VlYrSUdzL0VCOU04YVdyYTFvK3FTank1SVNUSlpIcGdBOVZyNTErRy9pWDRkNlZNcXY0VnRXM2NZZkRjVjlNZkJmNDhlQy9DalF0cC9oZXh0M1hHQ2thZ2cvbFg1em1IaHZMTG8rMHBWMUpydGIvQURQc01MeFJETkkrem5Ra3I5MWI5RG9QK0N2WDdJR2kvdGk2MTRVazBidy9jVDY1aHZOdWJlMCtaNHowVjJ4Nit2U3ZDZmh0L3dBRzVlb2VKTFdPVFVab3RKamNaL2U0WmgrQTVyNzYrR2Y3WUdtYWhKSDUrbXR3TUR5K29yMlh3cDhXQjR0aTNXOFpqVThnTml2ei9GVWxVeFBMV3JTaXY1Vm92dnNldzYyTndsQlFvd1ZsMWJ1ZmtoKzAzL3dRMWgvWmc4RHRyV2krSmJpODFCQmxZSTRkcXNRTTQ2MTh2L0RYNHV6ZkRuNHI2SHB2aVMza2pFV29RcEs3TDBYZU0xL1F0NHc4S1dualRTcExlL2hqdUZrVWpETG5yNlYrWFA4QXdVZi9BR0FJZEI4WmFmcm1rMkttSTNhTTdCZVFONHJlamg4SHpQQ1l5OFl5K0dkOVU3YlB5WjNaZm5HSXFVZVc5NWRWMzlENzcrTS9pSFQvQUJWOFFQQWN0anRlMyt4eVNvUU9NR1BpdndFL2JuK0swTmorM3Y0ejh0dm1pMUo0bS9DdjNndnRMdDdieGY0S2pSMWFHMTBkaVdIWTdBSy9tKy9iMW11aCsycjhRcmtSdnVrMXFjcGdIa2J1SyswNFJrcGNQMXAxUHRUdDViTmZvYlpUV25oczlvVXFWN0tsSy96bWo2YjhQK0tZZFYwMkZsZFdETG5yVmtXaVg4NEVjWVozT09GNjE4L2ZzOWVIZkduaSs5dHppZTEwdVBCTWt2eWdqMkhXdnJmd0Y0ZHRkQWhWcFAzc2d4bDI2MStKY1RWRmc2anBVNTh6ZmJwNm43UlJqN1dONzZFSGhYNFFxNVM0dTQvY0lSWGRXSGhDRlkxWDVZRlgwcHkrSTRVQSs3dFgzb090RFVGMnhzdjUxOG5Sd05TcmF0V3Z5L2daeVZSZTVUc2lIVTlPZ3RZL0xoQ3NlNXJLbDBoWFhPUG0rbGFwaFkrN1VScmc0MjhkYzE5MWsyV3hxVFhSSTUvNGNidlZuTnplRjVwdHpKdHdlTUZhZnAzaFdTV1pWYVA1czQ0RmRLWmdzZVFQd3FUU0x4WTV0N0RsYS9ZY28rcTA1UmhWdlk0Wnk1MDJqcFBoeDRGakYyaXpLb3llY2l2WEYwR0d6c2wyd3J0VEJ4aitWY044Tk5kdHA3eGZNSzRZWU9hOVk4aE5TMGZldjNZVnp1SGV2MjdBNGpCVWNPdnE3Vmowc0hSaS9oUE0vaUJxOFdpYVBkeVRNcXhScXpBWnhnQVpyNTA4SmVQclc5c2J2ZEl6TUxvM2R1NGIvVXYwN2Z3c09DS2IrMmo4YzdwWnBkSDA3ekd1TGcvTVl5QnRYcG11VCtIZ0dqNlRhUjNDdDVrY1FNODZxR0R4TWVjOXNnKy9ldnovQUlvNGtuVWs0WWFWckhSV3llTlNIdEt2ZlQ1SHIzaGJWNXA3ZTRrV0ZZSTdwekx0UVlWU2V1QjZHcHJtNyt5d3lTRWZOamdrOUt6L0FBWnFFYy9oMURBeGFHTWxBekQ3d0I0ck44ZWVLL0wwNlMzalg1bkhXdno3RDRtVWVhclhaMVU4dlVZV1NQSmZpRnJIMnpYSnVOM3prbXVWZ3NwN3krM011MkZUbkhyWFNhaG94dmIxaW9ZczNYM3FlMDhQdEd1NS9YR0srYnhPZFFsTnppemFPRmpIWTU3VXJiN1JPRlJWVUtPMVg5SjhIUTZrbUc0WStsYUw2RXJQbnBXallRclpZSVlBMTFaZG5Yc2t1eHg0M0NScVFzYzFkZUFsdFplY3JqOHFkRnBLd252aXV4TWkzc20xaHU0NjFXMUxTMGpWdkxGZllZZk1sVVNha2ZLWW5DSmFOSEc2cm8wTnd2ektNajJySXUvREs0eXFqSDByc2IvUjNhQXQvZEdlbFpyUWNZWnM3cTd2YlU1ZkV6Q05LdENQN3M1T2ZTL0liMkhiMHFyZTIrWCtuU3V1djlJVmszQVZoYW5wK3grRjRxdWFDK0U2S01xczM3NXowK25Bc0N3L0tpdFZMRnBlTWZyUlMrc1c2blJLbjNPcDFEd2I4WGYrQ21md0I4V2VGZEN1ck83OEsvQ2ZWdjdYYU8rbXl3bE1McVk0R1ZDU1NoSHlqZ25ieDByeEg0Q3phdDhNUEZPczZQUDRaMWE0dXRQMDZCZFVzelpPc3RudGxJM09qQUVBYmdjNDdpdjBxLzRKUWVPYkg0VCtFcnFDMzAvVDdmdzc0MjFWTDY4dmhNejNTVEtpRXA1WUJKVGREdHoyQlBVVlExSDR0ZUZ0Yy80S0cvR1RVTlJ2UHMrajYxcDdhZXR5MFRmdlZLTWhDakdUZ0gwcjRMRDV4VHhQRStJeWFmTHlXbXJwN05XWHp1Mzk2UG4rSk1KV3dXSFdNVVc1UmFiWGRKcTY2MmF1L3V2MVBqM3dqKzBCOFA4QVVmRTY2WHF4azAwY29RdHZnN2o5M0hIcmlyUGdQNEg2MThVVHIxdmJhSG9wazNmdUh1N2tSeVlISWJhUjNCSEZlTDZ0K3hyNHAxK0dIVXROdkZ1R3VJbGFPUUtmbXdCeUNPMWUvZnM3ZkJQNG4vQ3o0Uno2NWZMZTZoaTlsRWwyWEw3VTJJQUNUNllya3pMSWMxeS9MNTR5bEhrcFQ2dGRlaXYrWnRUNGl5L0U0cVdBbzFPYXBUaTIwbnJaVzNXbjVIa1B4ay9aeThRZkQzVzdXVHg5cjJtYVV1cU0xdmFyYlhTa3hxbUNCam9PQ0s4cnN2Mk9mRTN4QjBxNDhSK0hkYjB5NDBlRFU1TENKcGJrck5LeUJXTEFBWXhoaDNyN1EwYjlubnczKzJKcmVwV2ZqeisxTHFUU0pVYUY3ZTY4dnlpMGVXNHdRYzRYOHE0RFEvaGRwL3c4OFhMNE4wTzN2dEswV3p1bW5FZDNJMlM3QmQzTEFjbkF3Szg2bnhFc05WZFhMWnBWYVBJblRhYlRiVjNKZFg1cTU4N25OWEUxTUdxT01wODBacHROTzFsZlJOZWovQXp2amI0V2I0Yi9BTE1IZzJORFozMnVYdDdKYVgwTnc0SWpUWmtPamRlT1B6cnUvd0JpRzE4Yy9ETDRVYS9wdWkrTGwwNXZFaDJDNWloRDNjUklLcWtjcDVYcjE3ZHNWMXZpMzRLZUEvaTE0d3NmRE91THFVbDFZMmtWMUI1RjM1UWpMZ2J1TUhyZ2ZsVmkzVFIvZ1RvOHVnMjl2ZjJ0cjVzY3NSbUR1eXR5ZnZFZDhBMStyeDR1NGY0bXdsWExjYlQ1cWtaUmJqVWl1VzdkN3hUYnVrMXR1ZmsrRDRkelRMTVZUeGVHcVdpNHUvSTNkMldpYnRvM2MrQ1AybXZoSjR3L1paK0w4ZDk0azFTZTQxTFU1SkpvN201bU16eVlQSlppVGsvTU9hK3cvQkg3RkYxcmY3T1dsNmV2eEx0b3RMOFR3dzZ6cU5oSlliaEhLeUJ4aHQvUGJyaXZFLzI2ZmhYNG0vYWc4VzZQTGF6MmtkcnBhUEZINWpIZTVjZ2tuOGhYMWQ4Vy93Qm43eGg4QnZCM2dNM0VpeDIrc2FkYTJZQVBDRVFxdU1lK0srWTRnekxGNFhFWVdqZ2VTazNOUmxhS3RKSjZSdDA4ajd6SU9IS2VOcDRpcm1QTlVnb3Jsdko2TnAzMmExUGhuNGsrQ3JYNFovRWErMFd6a2cxV08xMmhKa2kyNzhnSHBYMWxKL3dTOTh2d1JwZXJ4K0xyU05yeXlTN25nZTBLaUhjZ1lqT2UyZmF2b1Q0M2ZzNStCZEw4THlYYStEOUZrMWl4dHNwTXNPMlNhUkU0Skk2a2tDdUQrSUhpWHh0cGZodXlzOVcwSFdMT2FhRTIwcWZZWlBJczF3Rnl6cjhwSDQxOHZpUEZiRTVsVXd6eWUxT1NyT0U2Y3VWdVVkTFd2c3QxcHJkN2xaYjRTNEhDZTNqbUg3NkVvcHhlcTVkNzNzOWVtNnRvZkZYeEErRnQ5NFc4YTNHazJxcnFOdkhJc2NWd0VLTEtDQWNqcjYxOUozMy9BQVMyajAvUzdPNWo4WFdyU1MyaVR6bzlxZDBSS2dsUVFlY1pyM1Q0dWZEdndYcHZncGJwdkRlbHZmYVRwd2tXNlFGVE02b09TUWVlZWEwdGJYWHZEbmdQdzdxR29hWHJFa25pTFRZamNHR3hrZUxUOTZLUmxnQ01BSFBGZDJJOFhzVG1PS3dpeXI5eisrOW5VaExsZk10TlUzc2xxdDB6SExmQ1BBNE9qaUpZMzk4bkc4Sks2NWQraTNlM1RvZkR1ci9zcmVKTko4VDNGamEyY041Ynd5Ykk3Z3NVRW83SEhiNlYyM2duOWozeEpNNk5kV2Vtdzl4dmw2L3BYMkg4VnZEWGhmVVVrMUN6MHkzRTFwYkdWYnFKblZaZHFEREVBNDUrbmVzWmRKdU5Pc0xOdFpqMVhScmk2aWxrRHZwMHNsb293aGlQbUlwQTNBdDM0eFgzMlNlSzJHekJPMEZUZnRYU1NrN050SnY3dExldGwxUGpzeThKbGdWN1RubFVpbzh6Y1ZmcWx0YmZXL3BxZVNlR1AyUS9FVHI4c2VpeGVuNzNIOUs3ejRkL3NWZUlwTlZWcmpXUERWcEdUenVjdC9oVzNlNkxxK25XUG1OY2FlZCtDZ0UyQ3dQZkZMcW53MjhRZjJDTlFmVXJXRU00VlZTVDVpYSs0emppdkZaZlJqSEcwNHdVOXJ1OS93QXp4dUYrSGNyeGRlVmJBMUpUbEIyZlN6N2JJOWwrSy84QXdUS3RQaDk0SDBYV0lmaUhvVnhjYW9nZVNHT0FmdStNL0w4eEpIYlBGVGZEUDlrL3d4WVdxemFuOFFGV1QrNUZFcS8xTlpQd1ArRXVxYWhwOGw5cXVwUU5aMmFaTzV5Y2ZTcVhqZjQ5ZUEvQU04MXZOZkJwRkJBQ0lXd2Z3cjg5L3dDSWpOWHc4S2FxUHY4QXBzZm9sVGhPVTdTVmFVSDVXUHB6NGIvQ0g0ZDJIbHBGNG12dFFuUDNWRFlCUDRDdmZQQUh3OGcwTkZlejgxb2dNcVpIUElyOGdQaXQrMUJhNjVvSlh3djRrdnRJMUtKeVltampZWit0ZXNmQXIvZ3FMcTNobjRCeDZKNHE4VDNWeHIxdmRERjNEYXVyUEFNZFNPTTlhK0s0aHpqR1ZhYnhDdzhYNVJYdi93Q1I2MkM0ZGNWeSszbkxwN3owOWJKSDZPL0dUOXBXRDRZNlM4YldzWG5ScnlTMmNZRmZMbXJmdFRXLzdRdmlFYVRJMGJFdnRSQU9NMThBK0xmK0N6VVhoLzQyZU1ORDFMUzczeEJvOTdzaXNyNldkbWExSlFaSlRHY1pQYm12WlAyUS9pejRWdGRXdlBFR29YRWx2Tm96eE5jUk1qYytZdTVTdkhJSU5mRmNTVWNaOVRwWWwxMUtWUlhkTkpwdzIwYjZ2WFczVkh1WlhrOGNQVmtxZEt5VnJUMzVyNzI3YTl6NkUrTS94TDFuNGZlSnJPeFdhVGNMTXFqYmpsUjB4WHhuNGsrQjNodnhiNDB1dGJ2Tk50NWIrYVJwR2QxeTI0bnJYdG43UXY3Vm1pL0VieGd1b2FXa2swY2NYbHB1UXI2MTRQclBpYS8xR2VUeTVCRHZ6amIycjBLR2Faai9BR0JSeS9DV2pKeWZQZlIyNk0rOHl6S2NEU3FQRjE0M3FXU1hsNUQ3M3d0YmFLMjIzVkVqWG9vUFNzN1ZibVRSbzFhUldDc01xY2NHcHJDeHZybTIvd0JJazgxeDN6MXFNV3MwbWxhdkRMKzhTRlk5aW4rRWxzVjRPSDRjcnl4UE5YbHphbzl4NHlsRldndERrL0VIaUcrdkpsVzJWbGp6OHhCcmEwTFc1NExaZVczWTU1NlZxYUY0TWh1VTJ5c3NiRWNaOTZiZGFCRHBGMDBKays3K3RmbzJNd3RHVUlVbkg0VGhoVWJiNVRTMGJ4VXpZV1E4NHJxTEF4M2lLYzF4bWs2Ri9hTjdISEZJcXF6QVUvV1BHMFBncWVhSm0zZVF4VTVPTTRPS3hvNFduR2FqRFJrU3B5YjBPem1pUk04ZE9heTcrZGJiYzM4SUdUV0JvZnhPbTFxVWY2S3V4eUFQbTdldGRCckZyNTJuc3dYNVc0Ny9BT2UxYllmUEtVc1I5VmcwNUo5R1JVeTV4aTZqSzNoelZyelZOVzJSVE5DcTg0QnIySFIvRm1wYVg4T2RWV0tacGJoTE9UeXdUZ3MyMDRyeWY0Y1dxeWF2TmtCV3gvV3ZRUEUrcFIrSFBBOTlOSXJNcGlLN2Y3M0dLL1VsakhRd2wzc2xjK2R5bjIwOFphbTkzK0I4TTZCNHl1OVkxcSt1ZkVkdmNRMzBraEN5UzVDdHljRG5waXV1OExhYmRhNXEvbCtkTXRyM1lQOEFLaW5xQjlhMVBpYjRQaytLV252YmkzU3pWZVkzVS9NRDcxd3ZnZlc5VStHdmlTUFFOVmprOHFUQWltSkpHUHI2ZnlyOFpqeEZReFU2bGJuVUpwNndUM1hsL2tmc1ZIRDBxc1c1UDRlbmYwUG9lYlhyUHcvb0NXZG9wWUluRzBWeFdvVDNGOUkwMDI3Y2VpazlxMGhwMGtVU01xZzdsQno2aXNuWExob2ovZHJ3Y2R4cFRycjJGT3lYNGtWS2xLM0xGYUVNRjNEQ0czRDV1bFYzMUtJeUVWUWNTWFU1Q3J4MXA4R2ozRTdibFU3dnBYUGgvWlNYTmM0cWtZN3JRYnFYaUtHMGJiL0YwcXFtc3RjWitkYTBIK0dWOXJVbTRXc3pudHRGWExmNEo2dEdGWVdOd1A2MTdGUEc0T25INGxjbjZ2R1ZPOGR5UFNidFRDR1lqUHRUcGI1am5xVitsV0Q4T3RjdC9sajArYmI2NHExWi9EaldwdUdzNVZIb1Jpc1o1L0NqSk9FdnhQRHJZV1RkdVV5NVdhN2oyNElGVTVOSHdSOHVmcFhmYVo4Sk5RS0w1MGZsK3ZOWHYrRldTUm41aCtOZEQ0dmhKYVMxT2Y2bk9PcVI1VGM2Sk5JMjFWYmFlT2xOSGdPNHVpcXRHL3plMWV6V2ZnaTNzaGxsREVmcFZoOUZoR05zYWordGJVZUw1TldXcHp6cFdleDQwL3dxa2hWU3hia1o1b3IyMjI4RHpheEV1RTRYdmlpdG54WkpPelpqS203N0ZyOWdYeEJaM2ZnZlM0OVAxQzArMDJ0NWNTU3BGSW0rQUdaOXVSZ2xjZ2pHZU1HdVIxblU1TGY0aGVPdFFqOHRMbStaMHVKTUwrODV5QWVNSHIycnBQMkp2aEhwdmgvUUlySFE1dm5lL3VzMzBtVm1sV01CU3JZQS9pUFljWXJ4RHhiSDRpbFg0azZ2OXFXR3gwdTlhRkFyYm1sdzVCQUFHVzZZNXhYekhEdEsvRzgzU2xkT1RldW1rbmN5NHh3c2NWbHRURktyR0trcjJkNzZ5MDB0cnVlMXlhcEQ4T2ZnTDRPaXM0TGFhZVBRWm9vMVE0VVA5c2dqQk9lZU04MWgvd0RDVS9FNzluelNmR0dpK0sxMCs3MHZXWXJpR0szdEx3elF3U0pIR1M0M0tDQ1ZrWGtkZndyeHUxOGJTZU45RjBYN1FacmVHMkcyS09NNFZWYWRaQ051ZTdLRDlhOVMvd0NDbCtxM254RjhjLzJIb2VvWFViWG1wVHJ1dEpCODZ0RGJMMTl5UHh4WDYzbTJNOXRoWThQMStWMHBmV0tqVGJXcXJSNWRleWpLV2grVVpKbEtvNW5WelJmeGFpaEJ1MjBWQzhrdldTVi9raTE4RDdDeitHM3d4aTE2MXZvcHRaMWJVTEg3VFpLNGtOdkhNaXN2NUk0cjJ2OEFhamprdWZDZXR0YTNFTnBjM1Z0SVRQS3gycklNSXJuMkFBNmRoWHg5OE5mZ2Q0azhGZkVpTFE5WDFDOHM0MnVySzB1b3JvQlhVeHFvMmdkc2dEclgwMS93VXY4QUNFM2ppOTBmUmZDTWJHKyt6U3dDR0tURFR5eHdCUFhHTXIzcjhCNGd5eW5EaWFqVW9WbGVjbEs4YnV5Vm1ydjVXWHFmcXVGcVJ4RkdTVWZkMFZ1OXRIOS82SHl6OE12RUdyK00vajMvQUdoZlBaMjgwTnZGYlJ6QzhYWktxZ0tDQnR5YzljSEZmWG54bjFlK3ZZdFUwenpsK3hUV2U2RW43dTVZaUZQSHBrMStiL3dBVHhSNGsrS2N0cWJXNGl2TkFLTGR3cVF1eEZJeVc1NVBIYXYwdy80S09RYWZwZndNK0gxcll4S0o3VVF0S3lINXBSNmNIdnhYb2NmVWFWUE1NQnlSVUtsU1VtNWF2V0xqWjI4cnUreDgvaytEVkdwaVd0WVhTUzdiL21mQy9qWDltRHh2OE5mRjAxMWVlS1BEMDF1bHlKOHJjeXY1U0RIR0NnUGJ0bXZyYjlvLzR3ajRyZUdmaHRheWFwcHJSVFR3eG95bHQwWXlFM0VIdU1WOGsrSnBmRkh4Vi9iQzhTNkRiVzkzSUxXSEl0VEl1eFZBQjNISjJqT1JYaTN4Zy9hUm0rQTN4T2p0NHRMbTFvV042N20xdTNaRnQyUjhrS1JuSUxad1JqR0svUktlSHhXYjRQRDQvTVd2YXdsekxsVFc4ZEU5YlhXNWwvYUdEeTNtb1BTazBtOUwyMTcydnJzZnJqKzMzNGEwdndSZCtBTGJRNzZTYVBVYjJDUFVKRlArc2pMamNUbituclhGZnRwYTlMTDRSMXpSWGtrc2J6WEkvczlsNWlsV21MdW9YYUQxNjE1eDRhK01YaEQ0K2VEL0FBM2Y2MW9wa2ZXTkh0OVJnVVhrKzYwa2FSdysxd3dPUXdISTlLNG5YL0dHcWVOUEVtbTIvbWFscUg5aCtKRml0MXVicVM2Y3hxeTRYYzVMWTc5YS9GOFBsY2FtT2hoNWZ1NmxLbzVOcU9qdTAwbDE5MjNYelBvNVk2bW1vMDI1YzlyWDlPdjVIRS9HYjlyelhJUEVXbi9EVmY3SFd6MFZEcDE5ZnhRU200dTFYZzc4dVFEZ1l5dUsrcC8ya1Bpd3VuL0NCcE0zVmphejZNVXNDNmxmTnhFRlVLVDE5T0srYmZIZjdNQitCZmlqVU5XOFphYmI2Zyt2YTBicU41VVArcjJTakFQSEJabFBYcW9xajhWdFhtMUs3c2RMc2J5OWswdTJzN2FlRzFrdXBiaU9KbWtiS0tIWTdWeGpnWTZWN1dLd3VXNCt2aHNMUXRUZE9VcFRtbDhUdXI2MzNUWFV6cVlyMlUzU2s5WFpXNmVacTZmKzB2cjJ0ZkRYUTdLeGswV3hzZEZzRnQ3dFo0WlhudndpQU9aRzM0Qk9EMEFyNksrSVh4ZGJ4ZDhFYkhWbVg3TGI2MXBEUzJTdmxWbFBsNFZVSjY4NEFBNTdWODEvdFJmc2JhOThEZkJtaCtKcmVhMXNmK0Vtc1pKVnQza1pWSmZxQ052TGZOeHpYdTJ1ZkN2Uk5XL1orOEJhVHJ0azExZDZGNGVzVVYxdVpvMmljUUlTVjJzQUR1SHBYSGpzZGdKNFBENG0zN3Y2dzVjMFY3emRyeVQxMWIwZDM4aXFWS3BhVTV2cGIrdnZPUThhL0dCdFQ4RWFmb3R0cm1rNlRxRnJ2dDVVdTdDUTNDeU5HdTlWY09QdTdlUGw0Sk5YZE44V2VJdGE4TzZmcWF5Vzl4bzhhTTBzazh4VHl5a0ltZmprNDJrWTk2NURTUDJYNzc0eS9zOWVGZkUwaCszWFdwWDEzYVFxR2thNFowa2tHZDNMTWRxNDlUaXRHRHhMYitCLzJiVThLM3Y5dFI2L0VsNUFZMzBpNWhZRnJOSWt3WFFCc3NDQnpYNlJrL0Uwc3l4Y3NMVXFjOEhYdFpwWGlwYzEydXVsbGZkSitwODlpc2pvVWFjcTFPRnB4ajA2MjIvcmM3RHh0KzF0cmZnMzRmNlhiNlhwcXoyK29NMGwxS1p5b2pRS1d6akhQSlhyWDV5K0w1dkdueGgvYU5hU3gxNWJPYlg5VStTTDdZZkxqZDNBeGowNTZDdjAxK0N2Z3pSZkZYN0orbnllSnRMdGRhdkd1N2xJWHV3V21UYS9saEFSZ2o3dlN2bUQ5b0Q5bCs3MG40a3BxR2g2THFQaCs4MGU4YWUwQzZaY0tMZ3FVS2tTQ01yOHBIVXNCMHJseXZpREwzbW1JeStFT1dkT1VselNlamFmUjM5T2gwWWZKS3RXakNjcE96U2RsZS96T04rTWZ4SjFEOW5MNGxUZUY3N1VWRjVacXNjMXhDbTZNbkdlNHorbFgvaDlGNG0rSU9sdEpZNmhmbFoyM1J6eHR1aGRUNjU1cnFQZ24vd1Q0OFRmdFcvSEszWFhyaTUxanhGcTF4Z1dza3lvWjI3Ym1jZ0Q4U0JYMEQ0aCtIR25mQlpXME9LMSt5emFTcGl1b3ZseEU2dVVLakhCNUhVWjllbGVieFZ4azZONk9CanphMjVrbnk4eVN1aytyNitoOU5nZUdXcWFxVnJYc3JyUzl0Yk5yZTJqU2RyT3pzZU8rRXYyYU5MOE9SemFsY1cvMi9VcDJEenpTRGN6TlhhZUlESGJlSWJ4YmZkR3NzVVNueXp3MkVIOHVhMHJmeFJEcU02d3gzSDJXT1Jnck8zUVYzMzdQUGg3VGRabjhVTHFGclozeXdKYlJ4czRXUlZMT1NjSHR3cEZmbnVEelBFU3J2SDR5N1VkZitBZW04UEZXcFFYOWFIajlqY0xiek44M2Z1ZWxYQnE4YkVmTjgzcm10ejlwU2ZTL0RYMldIVGROdDQ3aTlDckg1U25jenRKdFVEcnllQmdlMWVWZUt2N2M4RnhUUHFHa2FsYnRBUXJxMERnb1NNalBIZXYxTEo4MHcySnB3eEVQdHJSUGZlMzVsMDhETnlzenZZL0ZqV2tvMnNjZzg4OWFzM25paUlRWFRmS3EzQVV5YzljY2l2bUxYUDJqNUd2ZkxoUm96R3hWdzV3UVFlNHF0cS83UTgxMXA3UXJnU04wTzdpdlFqVHhVTVRHcEdHaDNmMlRVbjBYM28rbmROOFlSM2U3YktGd1BsSlBXcWVvZkVtUFNwbXVkOEphSkRrdGdnanZtdkU5UzhEZkZ2dzU0YXQ5Um04RytKVnNyNkZab1pvcktSZzhiS0dWdU00QlZnUm5yWG4rci9FKy91bzlROE82NEpQRDk5YjJvbHplUnVramc3U0Z4alBJYklQcFhvZld2clVaU2pKU3MrbXR2dUhYeW1qUWpIbXFwTjlENlkxNzlvTFNQQ09yYURjdjVVTU41YXBlU0xFY2dEY1FTQitGY205dDRuK012aTVkUTAreE1taFRTK1lsMHBES1FUbmtnOEgyUE5lU2ZEUFJMNzQ2ZUl0UDB2UzdHODFLNTB6U1ZzaEhHbm1OTnRabVpsSHBnMTlUL0JIUnRjK0gzaFBWTkZrMFc2dExwYmZGdXR6RTBTU05sZXBJQUdBRFh4UEVHYVluQ1V2WTAzKzlkMWJzbjFNcVZPTko4MXJ2OFB3T2cwTHcvWitGdFBpaW5kVm5ZWkk2WXJVdU5iL0FOSFlSN21WVklHRDdWOGkvSGI5cC94RmRhN0RwY2RyY1dON0RJWTNmZ0s0enhqMS93RHJWOUdmc3E2WnFtcitIV1hVR0Z4TDVlK1JpTTQ2VjlCNFc4QTQ2cHo1cFdhYWRyTHIzMFBCNGd6ekQ0V21vMW5aeTBTN25hZkNleG1rMXFSbitWV0FBUHZtdFg0L2F2SmIydHRwOFB6WU82VEI2ZldwNUxxSDRlNkhkWGx3VlF3QW5HT005aCtOZkxIalQ0NTZsZStNTGpVbzd3a05JY3h1ZDBZR2ZTdjBmaWJIMDRZWjBxbWw5UDhBTSt6NGQ0UHFZVEwvQU8wOFNyYzN3L1AvQUlCNnJZd1hWektxckdRYy9uV3JxSHdudC9HTmxzdkUyeUlNbytQbVErMWFQd0R2NC9pYjhKdkVXdDNjYzFuZWFONWF4ZVE2aFhMQmprZ2c4Y0NvL0NYaks0dTVaRm5rM01vOU1WL1AxU2psbGZGU3crRlh2UjNmVGE1bGlLbnM2TG4wT09zTGJVdmhyckM2ZnFwYWJUcERpS2NEN28vejFGZHBkL0N6L2hJN0pab1c4eU9WZHl1dklJclgxRVErSXJGN1M2aFdXT1FkK3FuMUh2V2Y0SThTVGZCL1Zsc2I5bXVkSHVXeWovOEFQTC9QZXZOeFdUT2pVNTBycG5uNFBHTEV5NUtmeGR1NVQwbjRHdkJMaHN0K0ZkejRVK0RWdmJ4cjVrZTczSXJ1N2VHRFVJWTdpMzJ0SElBeU11TU1Eelc3cDJqeUczM2NkT2dyR3JPdFRqeXhPcjI4SXUxVGM1Y2VGcmZScmRjUnFPUFNxbHlZNDMrNk1WMFdxd1NTQmxySnU5S1h5eHViQnJsNWE3MWR6c3kvSFU1U2NMbVRjVDI2amhSK1ZSaUFTUHVDOFZOSkREQXg1eWFndXJwVVJ0cmRhRlJxTjJaNkZTSE5vT2xsaHMwK2JyV1ZxR3BMZG41UUJpbzdtMGx1WHllZnBWclJ2QWw1cWM0WncwVU9mdkVkUlU0aWlzT3VlUjVPSXB5VzVpaXhtMUM0MlFSc3pFODExWGh6NFp3MjBMWFdvVEJGakc0Z25BRmRCcHVsMittS3NOdkdwZmpMWTYxaGZGZU83dU5JZTFqWmxWaDg1RmNWRE5KeXFxS2RrZVJXaXR6bFBGL3hzMHZ3N2N0YjJPMlJVTzM1YUs4UjhZYUpORnJUUm96ZkwxSTcwVittNFhCNEdWS0xsTFd4elJvcHE5ejYwK0RVMm1YZmpGcnpSNGJlM3NaTGU1bXhFNitVSlJEYkdWZ1FPck81SlBPVG5welh5ZjhBRWp4bll3ZkFQeEZjUjNWZzA5eHFKbXVJeklNQU5jdUZCK294d2NmclgwQit6NzRpdHZEWGh0bSthSC9ScmkzWkk3WU1oODFWQmZobCtiS0wrVmZQdmp6OWwremgwTmJlYldIdXJXUzUrMjNOc2JGQnZKREJWWU96cmdidDNUZzQ5SytiNE94c3FHY1BFUVh2cUtWbnIzMi9ROC9paU1LdUQ5bEJLMGxIbWV1bHBLV25yWkxybzJjTHFYaHJWdkJQaXJTWU5jME9PUFJMcU8xa3M5UTArTzVtaGxua1NPUmJjN0k5cXlBU0RJSkF6M3J2ci80eWVHOWYrTC9oMkdiVnRKaHZJdFp0ek5GY1FTdEpLdm1xR1FFRENzY1lCUEZlMi9DajRPYTc4YVBnMWFlRnZDZDlQcTJvTHEwMnN2SGNKQ2tyUnhSUjhrNzQwMnFJd0FPcDdacjRpOFEvRFh3WDRlK0tWeEZlYW5kWEdzMk4yMDdIelk0V0RoczRDZ0U4ZTVOZm8rVVpoUE5ZVlo0KzhaUXZCT0t2ZnU3TmFkRDV5dGg1WVNVSndqelFkbTNwcGY4QTRiUnZlenRzejJMNDAvRjY3MDN4dDhUdkVEUjJTdmRTVFMyalJ6c1pJUExpSVE4cUJ1SFVZOXErVmYyVS93QnRiNHJlQ05ZdnZGV3RlTHRUdlBKZUo0THE5MUtKcDRneEpmeTFrT1R1eW9iQXhnSE5lMmF0b3VpYXRwMm9YVGFkYjZoTGM3bjJYUkVyU2s5aHVPQjlCWHk3OFhmMlo3WHhKNG5hNzArNmwwdTFZZkphdkNyK1R5VHRCREFZR2NENlZwbE9Dd3NmM2JoOFBLbEpwWFZrckpQZTU1R2FWOFJHcERGNFM3Y0cvY3ZaTys5OWVpMkYrS3Z4YzhaYUo0LzFUWHZEK3FYMmszbmlhVnpLOW5kaUZwRWJraGlyZmRQb1RYMUw0Ty9heXV2R1h3ejhEMmV0U1EzdXFhZGIyNjZoUFByZjJpZktFRm5NV01aeC9EbnZYZzBmdytodXZDbHZZNmg0bEVmbHdMRXFKcE1DYmR1MERKM1pQVHI5YTVYNGEvQW5UZkRueE5nMVBUL0dFaTNWdVpKTXcySWxhTTRJT0ZENVBXdld6YkIwTWJOU3JMU04ydEw3cXpTZlE1NFZjVkRFS3JTamRWTEtTdlpSN3UzVm5vUHdaL2FQMTd3RiszN0g4UnRTMVZiWFQ3ZlZKbnUydVpCKzloWU1GVXJuNWxHVjQ5dmF0bjRoZkd1OStNdmpUV05hMGJUN2U5anVyNlZsbWptdHlvQlluN3I4TDI2K29yaXZpajhHb2ZpajlwaHROZjE3VnI2TTdaVEpvNlF4akdXNUprSFAxclkvWisvWisrSTN3NDhOZVhwY09zVzloZlRpVVBidmJJSlNWQTYrY1NNNDcxNk5QTktXSHdYc0pXVWRHazNicGJzYzBvU3dtWktkVzBZVFQ5K1cyOTdKUHBzZmEzeEUvWjV1ZmhCL3dUejhFK1BwYjVuMXlQeTJ1b2JSa1o0b1pwWGJ5K2hYSVppZVBXdVg4RVNSK0d2aUg0WjFpeDFDUmJhVzZYVmIyTzVJODlCakhRWUFPN25vYWcrSTlqOFR0Ui9aeDAvdzIyb2VJcnVPS0JROWxOWkkwUnhraC9OT056QS8zWE5lSVJmQUR4ZDQzdDR0VTFpUFhmdEVLcmJvOE9wUVcrRUF4OHdJWThZNjVyOHh5ckQ0WjFLK0l4ZFNLazUzaktMdnBwcFpycnF6Nm10bTJYd3hFYTFLckY4dHRMcjh0djhBTSt6ZGJsUDdXZmgzeHAvYW1yTE5iK0M5RE1zQ3d5Ym1hVEtsZVNvNXc0QkhJelh5MTRBMCsxMVR3WGErSXBkUW0wKzRqdjRiT1NPOUk4eG9GeTNRRlJnbmpQc2VLOU0vWmY4QWg5NGgrQzNoVHhYWTIxamROSjRrc3ZKWnBycU80enl1VG5LZ2NMLytxdUp1djJRdFM4UkdScnpVOVdraGhsOHhvN2VhMlRZUmsvOEFQVFBjMTQrVDBzRGhjVmlxVlNmN3RyM0pMVjNlN3QzZTJvOFJtMkFxMVBiT3BHL3F2OHo2US80S1dmdEFlRi9Hdnd6OEcyZHJxMW5jU3cyeUxFZ2MvdURnWTdlMWRSOGR2RGtuZ1g5aWp3cjRsa3ZHdXRhMUMwVlN3QVlGTm9DNUhzTWZsWHpINGcvWjF0YmZ3OWFwcVg5cVNXYUFBU1QzeXR2L0FPK0hKL0N2WVBqQjhWcmp4TDhEOUQ4THpZV3owNjNGdkd5bmxseGdmcGl2amNWZzZWQ2xoTUZoNVNsQ05SeWx6V3RyYlplbWorUjZlRng5UEVSYzR5VDlMV0UvWlk4ZnphSjRuK0gvQUlIUyt0TGkxczRyMitqVlpqdkVrbHROSVcyNDQrY2tEbk5hL3dDMHZiNmxiNlJOTmNYa20yM3ZMYklZNUFBWW5PYysxWXYvQUFUYitGR2gyZjdVR2k2bGVMZFQvd0JuMnNxeGlTVW5PUVFPTTQ2c2M5NjlPL2JFOGE2Qm9YN1J1dlFYMXZiUjZUY1d5cjVaaHk1YlBHMzBQSXpYZGlxT0hyY1R3cDVjMUhtZk5iczczKzUzc2pwZFBuVG03dS85ZjBnL1p3K0hWdllmc0syZXFYMTAwMm9XN3BQQ3crWFkwMGpTbmpQT04zT2UrYWwrSmw0emFYcWwxTk16ZWJGSklNbnFENmUxZU4vRGY5c3ZSTlo4Q1dQZ1BUdFd0N3k0dXRRaXRFdFk0SkZZRXRzeHVLN2YxcjNqOXVpNlBnM3hkNEQwK3p0L0xqWFRqRktHRzd6eVZIeTRIYzlBYStXeEdFeFZmT0ZSeG51eXJUYnUvTjdudjBQWjBrbFRYb3ZKSmYxOHo1czE3NDkydndyOFZmMmxEZDNWdmNXL01jME1ubHZHMjBBTXBIT2ZwelhFcjhiN0h4ZWsxeEROTmNGajh6TVNTYzgxNkJmZnNlYU40dThVWG1wYXRhM0MyODh4bWl0bmxPNkpUL0NjRWcvblZENGgrQjlLOEFhUjlpMFhTVnQ0VkFPSWwzTXg5VFgyR0l6REFZYXZQQTBtNmtsSnErbkwydXV1dGtlb3FsVjRkVTVTZHIzdG9yZm1jZjRqMXJVUEUzZ09QUzdXTTJxdGNOUDV4Ykc3S2hRQVB3cjNqL2dscDhKWkx2UWRldU5WMVNTYU80dnZMOGxpZmxXR0dSOTVQdVRqZzE4bmVKUGovYmFmcTB0bklPTGY1Vndwd2VPbGZUSC9BQVQ2K1BNc1BoZldJWTlQa0N5TE1ZdjNtT1dqSzUvL0FGK2xWbThjZXNxbkhsWEk3ZEYxMi9yOENhTk9wQ0VyclN6MTgraHgvd0FZb3JqeFA4ZHZDRE5OTGEydG5yMXJFSXBRTVhnRnlUdlQyWEF6WHF2N1FHbm0rOEIrSm8yejU5MG5sT3pmTGtnUmpyN2MxaC9BTHdqYi9FWDlyZndpdXRRdmVXR20zajNTS1g0eW9aZ0JuMzUvQ3ZvWDlwL3habzJqZkhUVmovb05ocDVkb3B2dEtCdDZxWTA0eURna3I3ZDYzbFJwWWpGWlZoS2RxYzRwSjI3ODErWitiN2R3cVltUFBGUVhSdlR5YTA5WHVmaHo4YWZFRnhvM2liVTFzWFU3THFZN2dRY2dNYTVMd1Y0eXV2RmtzZm5TU1Jqemxpem5nNUl6L1N2bzN4L3FQZ2p3OThTdkUybDNDM0Z6WXZxYzZnUXdiNDUwOHdoU2QyZWNIcXRaZnd0L1o1OE9lTVBqbjRXL3NQVDlXaDhQU2FwYnlYOGQ0VkNtTVNCbUFPT1ZJR01FRSs1elg3alZ4a3FQdEhPRFVJcDY5TkVmbkdQcDVqaWNiN1dsVTl6VzhiNmVSK3kydTNsdm9IZ3lIeTdxTllrMDZPSlNTQW9SSVF2SDVWK05QN1ovaU8xMWY5b25WTGpBY2ZZck9NWUdRQ3R0R09QcFg3U2Z0TGVJZFA4QUNQaEQ0Y3dRUXdySHdidEFCaVdOaDg2ajA0T0I2Y1YrWDMvQldMd2paMy83V2VyU2VGL0QrZEJ2ckczbWpZUkV2YlNsZm1YZXYzdnVnNE9jWnI4dThJY25xeXl6RTV6VGtueno1YmRiTFcvM3Y4R2ZaNDJwSjRhbWxCNnZSLzRmZDE5YjM5RGYvd0NDUG1zV1dzL3RWZVp0aGhoc3RBblhhVXh2aytSQWZjL04xcjdJK04wNnd3U1NZVzQyenY4QUlXT0JoVDFyNWovNElWZkNxSFIvanZxdXBhNWF5TE9zVVF0MmsrWENBc1hBSHVkdi9mTmZTMzdTM2lTM3RmaUxyVTBrWSt5eU5ONVNJY0NOdU9UK1ZmS1ovaDQ1aHhoSEJ4bHkyaXQrNlRsYS9uZXg2V1UwWjFsS0Rqc3Ivb2ZOdnhPK0UraS9FUzhhNnU0Yk8xdUpEdVF4UlkySHIxcjZhL1lJOEdhVjhQUEJHdFE2NUN0N2VOQzBrVzhaQ0tXVWJmYzQvblhnT2g2K3ZpZTQyS3ErWm5ra1ZwZU92aTFxbnc1bWFHM210MWE4dG83ZVZqSHVLNWtEREhwbllvSjlDUjNyOXJ5M0ZZM2gvQVJxVUp0cE9MY2I3NjIwKzhNRGt1RngwNmxHdFM1cFI1ZVZ2YU4ycnY4QUliKzFqOFJwTlVtbTA2U1Q3UDVWek1wVUp0VGFEOG9yNWhzdEh2ditFajhyN0RKSkhJQVJLbnpJNDlLN3k5K01HcmVNOVRrZlVOTnRXYUtYeVFFQTZBY0hyazVBNm52WFplRE10RXZtUndRYnVneDkzNjlhK0R6N05NeHhGZVZhdFpxN3N1MStwOVpubVlWcXRWWWVUVHAwbHl4VzNxOU4zZnFlMy9zcGZDNjhiOWszeHhyTExGWjJjWkdDK0FYS2dESDZtdUwxbjRiYWhvM3d5dGZGRVRoN0s4dTJ0RWtUKzhveWUrZXZyWGU2RDRydkQrelZxL2grMXVJNDF1THBaR0NJZVFNSHFEN2VsZVM2cnFtdWFONEgvczIxdXB0UXRWM1hTMjU1UkpDeDUybkhJSEZmTTVUU3cwWGlxOVdMNStXS1ZucXB1MnUrMXRENXV0aGEwcU4wMXkzV25rMXQ2M05EUS9Hc2xnaWk2VnBPMlIxcm9MeUcxOGRhVTl0NWcvZWpqKzhwOWE4ZjhIK0lOUThTeVhWeHFrRWRxVmNMRWtjZTNJSFgrbGQzNE50dnQxNm15U1JkcmRqakZmUjRlbGpLVWVYRU5TWG52cWVMaXNyUzk2RDVaTHFqcmZnWDRodS9ET3NTZUd0U21kV2dKTUc1anl2b1A1MTdvdmlRV2xrdTF2bXI1aTFtM3VmRVh4YnM1ckNaNC83TENsNU9vY0E5RDlhOVRzUEZVazF4dGtEQmVncjFjdXc5Q2RQOTc4cjcyNkh4ZWUwOGRUcXFkTk5wclZyby93RGduYjNuaU5Xalp1dTcxcmh2RmZpV1o1aXNUbFZ6V3RkZnY3WEtucUs1V1cxa212ZHBYdml1eXRsOUtPcVIxWlhLY2JTdnFUV09velR0dGNISjcxcVdtblRYUkcxU3pIZ1ZxZUdmQ0p1Mlg5M3dldGVrK0YvQTBGdUZaMVg2VjRkV2pUcFBta2o3aWptRldVTDFUbmZBdnd6YTRaWnJwYzl3dGRyTjRNZDdYN25seHJ4MnJwTk9hMTBpSmR5cVdVZEt6L0VmaUNiVVAzTnVoOWdvNlY4am5Fb3pnNVNNYStPYk9WazBxMzBvdGpidTlhNG54N3E4ZHh2dDdkUkk3WlV0ajFyMVN6K0ErdGVMOUh1cjVydUcwdDdlTnBHM25IQUJQV3ZueSs4Y1d0dHI4dHFycXpST1Z5RDF3YStGNXAzNW9vODk0aUQzWXkzK0U5dk9QUHVWVU0zWEk2MFZyWG1wVGFyWkw1RzRVVnIvQUdsaStzeGUwZ2VhK0hkWThTYVpxK2dMb2tjMGtNY3JMZVcwa2NadFhoMmNNWEtGZzI0blBQUVk0NjFuL0dMdzlwK3QyT3J4WE0wMGEzM0xtQ1prWlNEd1ZZY3FjMStWMnNmdGsvRUx3OXE4MXZaK0lyNkdHSnNLcVN1dkg0RVZOcFg3Zm54RzB4V1Y5UnQ3NFNISkYwanlmK3oxL1IrUjhNL1VjVkhHM1U5SFpXczllNzh1aCtVWjF4bGc2am5oK2FTYWRucGRMbDdIMTdheVgzd3h1SkcwN1h2Rm03YThjTFEzN3hzVllGU0dZRExEQlBIVDFGZVMyWDdKV3ZlUC9HRFh2aCsyMTZTNHRZMnVydVUzbzNwSDBadVI3bjFyeWNmOEZDL0hoKzliK0htK3RtLy9BTVhVa2Y4QXdVVzhmUk1XV0R3OENSaml6Yi80dXZiclU4VkhtZUZwUlRrNzZ2VDdsWTRhbkdtRnJVWVlhdk9Vb1IxU3M5KzU5Q2FQNEI4U2FOYXRheWFzMHNha2VVMHJiNVl3QjNPT2ZyeFRyejRlYWhxcnExNXJNaTg0Y3hnTHY5TTE4NnYvQU1GRFBIa2paTUhoMy93Q2IvNHVtcC93VUo4ZXgvZGk4UHJucVBzUi93RGk2NUk0Yk1vL0NvL2gva2NiNHN3bDA3djdqNlEvNFV2cGw5YnQ5c3VyeWM1NEMzQlRQMXhVUGhIOW52UTlKMXFTNGVPOGJjQ0ZQMnB3eWo2Z2cxODdwL3dVUCtJRWZTUHcrUDhBdHcvK3lxeFlmOEZHUEg4ZDRqU0xvSGw3aHZ4cDR5Vnp6am5yV2VLcFp2VWp5SzF2OFgvQUhUNG93WFB6M2QrOWo2aHV2aDdvdW1NSGdoa21tV1VPUHRNcnpaK3U0bXRuVE5SYTAxeUdaTkwwYnkxQVVSL1o4cngzeG5nMTg3L0c3L2dwTHFTK013dmdIN09ORFMzakc3VXRQamFaNXRvOHdqR1BsM2RLNHMvOEZJZmlVUXc4L1ExM0hKSTA1UDhBR3VPZVc0K3ZSVUp3amEzV1d2NUhmbUhGR0ZwVnBZV3BVOXBHTDNqckYrYWVsMGZldytLRW1vUi9ZSXRMMFUyY2E4Q1dKcE5qZXFndmdmVEZaUGl2NDN4NktZQ3VpK0U5OFJ3R09uSXhZNDc4MThLU2Y4RkNQaU5MSXpOZDZUdVlZLzQ4RXFzMzdlbnhBYVRjYm5TeTJNWit4TFh6NjRJeFBQelNVYmVyL3dBamxseEpra25lVUgvNEQvd1Q3dW0rS2NPb1dMcXVtYUF0eHFITDdiUUtxL1Fack0xalhyRFROR2hna3M5RldhTWhoSWJWUzdlM1h2MHI0aFg5dTc0Z0srNFhlbTUvNjhVcEpmMjcvaUZLdURmYWYxei9BTWVTVnRSNEx4Tk9YMmJYN3Y4QXlEL1dmSi81WmZjdjh6N2s4SytOeHFmaUszamswdlFWaWxJRzM3SU5palBVYzhHdlZ2RnZpVFMzczlzUzJrTWNhQUxHckRhRGpzTTErWUxmdHcrUFhITjVwL0hJUDJOS2hsL2JVOGR6cHRhOXNkdWMvd0RIbXZOY2VPNEJ4ZUpxUmtwUmlsMFYvd0RJNzhQeHBsRkc3aEdTYi91ci93Q1NQMVcvWlA4QUhQMkQ0eDJNcXZDWVZKM256QW1CN0d0RDlxdTQwL3h0OFdMK2FUN0hkMis4ZjYwckl2NjU2VitTcmZ0bWVPbkdQdDFvbzR3QmFKeCtsYW5nNzlwMzRsZU10ZnQ5UDAyU085dXJodHFwRlpvV0pQNFZ4eDhPOFZSeHF6QlZJcmxYZHJ6dmV4NitFNCt3RlZ4dzlLTTNKdlMwZGZsWm42aytFRTBIVEl0THQ3T1BUYmRsbmpMR0lLckE1NmpGZlJ2eFhpdFBHM2lQVE5VdWxqa2V4dDFqdHc3aVF4NEdDM1BRbXZoWDltWDRRK0xOQzAxZFk4YmFqQkxlTXVZck9LSlZXSHZsaUJ5YTlHOGYvdEpSK0VMZHBaYmhZMGhISngxUHRYNVRtV1h6bmpsREN6OW80dmRYMWI2SS9XTURoSjA0cXBWaTAzMGU2OVQycnhSNHJYVDQ1ZGpKbjJGZUYvRlB4OUlXa2taeDVmVDVlMWVVMzM3WUd1ZkUvWG85SDhMYWZOcUY1TjBYQUFVZDJiUFFEMU9CWGp2eHErT3V2YWZxMCtsU2FsYjNVa0xiWmpER3V3T09xZzl3RHhudml2cnNqNEt4RHI4MktzcFBYbGIxczMyMXNkVmFTY0hPbzBrajBMWHZoN291czN0eHFseGFtTlZHOHFwSURmVEZldWZzOGVOZEY4SmVDWm1XNnRMQ1M0K1V4bVVLeXI2RUU1elh5RG92eHcxU01BM21vUWhXNEFlTk1EOUs1UHhKOFU3NmJXWGFDOWhLcjFJaVRCL0hGZnErSzRPcTE2RlBDMUpXMVRkdGZSZERoeEdaWU9uaGxVblByYXl0ZjdtejlOL2dmOFQ5UHNQaS9vOTVhNmhZckhETDh6bVVCTUVIcWM0clgvYkg4VmFQNDQrSXMxME5ZMG02U1J0OGhpbVRhRDE5ZVQwNXI4aGRaL2FGOGRhZmVOYjJPcVEyOXBuNVZXMmgvWDVheTc3NCsrUExTUnBEcmF0NmxiYUxINWJLd28rSEtqbWxQSHFiL2Q3SzIvbXo4K3IrSW1YVUhLTHAxUGRiMXRIL0FPU1ByYjRwZUhkUHUvRk10NUlxWERsaVVLWVBmT2EwUGc3NGwvc2J4bnBzbnp4d3h6TG5mOG9Ya0R2WHhxdjdUL3hDaWoycDRnbmpHTWZKREV1Qi93QjgwTiswOThSbVFSLzhKUGZCRDZLZy93RFphL1J2N1ByT2c2TGpMVld2YnVlWlI4U3NqanJLblYrU2gvOEFKSDdpL0ZYNDJlSFBFR2srRzRicnhCcGR3dG5HaWtMS2pDQlIxeVIzcjVRL2FIK044UGpINGdYVjFaNmVkUWlqUGwyNVZHS3NxNUFQMS94cjg1eiswSjR6bFRNbmliVS9NVVk1MjR4K1ZYL0RIN1FYamE2djIzZUlkUitVWTNiZ0NmMHI1N2gzaGRaSmxqeStITk9QTTIyN0xmeVI5TmhmRVhoakUxSVVxa2E2YjdLbmJ6KzBmcVgrd3Q4UnI3VHZHLzI2NHM0OUhhTVlIbXhtTlhINDlhOTA4YWFML3dBSnBlWEYwc1RYSG5Fc0dWY2hzMStRT2dmR3Z4ZE0yMXZFbXIvS000RTVGZlQvQU96WCsyaGZXR2p3NlhyZXEzYlNSL0trMGt4eTMxTmZsSEYzRE5lbmp2N1l3U2JrdE9WVzBTVzYzdWZyR1NZcko1UTVzRzZtdlNTaitqWjlHV2Z3ZjFUUmZFaXkyK20zbmxzM0lXSW5tdlN2Qi93VHRmRmRscmQxNGcwOVI1MEhrV3FUa3B0WWM3aUFja2p0NzE0SmVmSGViVWYza2VyWFNMaklBblBQNjE4MS9ISHg5NG1YeFpkWGxyNHAxeUtPZVlCWW9yeVZRdVI3Tmp0WFhnY1ZpODZ5ZVdCeEVuQ2NXclBxMXYyUjBTK293YzR4Y3J5dHNsMzlVZlRuaS80UVBvK3ROYTJlbnpOSENlV0MvZTlPYWJiZUVycXdaVmExa0cwZHhYejc4RS9HV3RDNjh5ODhSYXpkYlZ6c2x2WkpGWDhDYTFQaVY0LzFFU0dLSFZicFZ6ay92V09mMXFKVUVxeXcxUk9WbHY4QTBqeFp4b1JxdFF2YnV6NjI4TzYxSHBQdzZ1N0dQNXJxNElMUnF1NXNEbmcxODAvRXo5cFBUOU4xdTdzYmUybWE0dHo1TG95NDZaN0hCNjVyeWpRdmliZStFZkh1bDZwcW1yelNhZkROdWtVU096QVlJNmQ2KzNmaHQrMForelg0NytHYlcrczNuaGk0MWV6OFBYR3hkUjA5bFo3eHBHMkRjOGVDd0JCSE5kRXNQU3l1bE90N0dWUlN0ZExWN3BhYWJhM1llNU9hcExYbS93QXp3UHdYNHhodmRQTTgxMWF3TEo4eFF2Z2l2VVBobnJOamVXY3pycVZySEw5MVkza1ZWY1k2N2ljZTJLN3o0ZC9zdS9zcytLLzJlbzlXdS9FVm0zakI5MHIyVU4zTEVDY2txZ2pDK2dBNFBOZHY4TGZnQjhPZkIzd3M4VHRmK0ZOSDAyQzRrVzQwV1BVVzNYSWpPZVFXT1c2TDI3Q3Z0S1BEOE1jcFJkUlFTVjM4dW01MVp4bFVzTGhwMVk4MGxDZkkvZGNiNnBYanpXNW82M3V1bXVoNFhiYW5xV2k2bE92OXFlSDdkWm4zTVh2NGkzdDBhdFhUUEYwM25TTExyMmtob1dDc0ZiSXljWXdRT2V2YXZtUFdmaDNISDRxdW5Gc3pOOW9kby9rK1ZRV0pHSzY3d2Y0UXhmUXRjTTMzd2R2NDE4WGlzZGhvdU5LRUw5Tno1R3RpS2JsYU1iK1o5UmVIdFh1WFJWYStobVgwV3UxOE5lSDQ3djhBZVNoV2ZJd0FPdGVjZUg0TndYYWRveFhwbmdYVjQ3RWhRdm1OMnlhOXFXSGxCYzBXMnVsMmViR2NVOUk2bmY4QWhEd2hkWDBtMkdIYVBVOFY2djRHK0FWL3JaVnBidTN0NCtwM01LOHZzUGlhTkV0R2trWlkxVVpyZ2ZIZjdWV3Rhbk0xbnBOekpGRTNCZEdJSnI1Yk5zUktDYzZqU1NOS2xhcTFhTHNmVG5pYndkNFo4QjdsMUxXN1hkSDk3NXdjMTVkOFFmMm1mQ2ZnMkV3NkRwdjlwWFBUelpSaGE4U2dqMURXNFRkWDA4c3JQeVN6WnJLMWxyZXlpTzhoajBBcjh5eG1ZVHhGUzNRemxlSzk1M09uK0puN2IzaTN4VjRUdU5DczRiWFRyYTRHMTJ0MEt1UjZaelhtWHcyOEF6YWhmK2RKNWp0STJTVzV4V3JwT25XMTNONWttMFpQUTEyT21lS05OOE1SN21raVhhUFd1V3BWbENQTFRXcGhTMWJ2c2R2NFM4RFFRV2FibEc0REhORmVJL0Z2L2dvSDRTK0VVQSsyYXRheHR1MjdBK1c2anNLS0tQQytkWXFQdHFPSG00dnFrLzhBSTFsbW1EcHZrcVRTZnFmaHY0OGgreitMcjZQKzdLUldQWFFmRk9GYmY0aGF1a2E3VVM1ZFZHYzRBUHJYUDEvWU5IK0hIMFIvTWVhZjc1Vi94Uy9OaFJSUldwd2hSUlJRQVVacmE4RmVDYnZ4eHFiV3RydDh4RU1oM0hzUDYxcWY4S3dlR1JsbW1ralpUZ2paVTh5dlk5YkM1SGpjVFQ5dFJoZVBmUTVIT2FLNnk1K0g5dkczN3U2ZGg3b0ttcy9ocERPZjNsMUludVZyU01KU2FqSFZzMlhEMk9idHlyNzEvbWNiUlhvRng4UFBEbW5RSzArcVhMUHR5eW9vNE5aMG5nL1RiaDEreHpYTWkrcmYvcXJURVllclFWNjBYSDEwRCt3TVE1Y2taUmI3S1NiL0FBT1FvcjE3d1IreTFxbnhBS2pUck9hNExEajk4cTUvT3RyeFArd3Q0MDhKMi9uWFBoblVXaHhuZkU0a3gvM3lUWGtTemZCUnFleW5WaXBkbTBkbitxR1kydnlyNy84QWdIZzlGZWxhTjhQZEwwelZtdDlYMCs4Vm96Z29XTWJDdExXUEEraEtqRzFzZG93ZHU1aVRYYjdhRDJhTjZIQmVPcVFjN3hWdWwzZjhqbHYyZnZoVi93QUxyK0wraCtHZnRTMmE2cFA1YnpIK0JRQ3h4NzRISHZYNmE2Sit6MTRFL1k3OExpNGovc3UzOHFNYnIyWmdiaVErNXgvS3Z6MzhMYXJZL0M2NlM5aTArSWFzdUh0SlF6SzF1L1pnYy9wVnZ4SjQ5MXI0ZzNMWEd0NnZlWDBraDRXV1VzcS9RZEsrUDRnNGJ4dWM0aU5PRlowNkNYdkx1L3Y3ZHo5RDROcllQSTZFdmEwMVBFTjNUWFNOdEZkclRXK3g5Ty9Fci9nb2pwdHBCTkRwOGMxMDNJVmtHRnJ3WHhSKzByZWZFUFZoOXJqWkltNkRmd1B3cmlUb2tkdzN5dW1QV2lEd21yZk1zaXJ0UEpOZTlrM0FlWFlHU25TV3ZkbnFZempET0oxT2FseXhqMlMvVm5vL2hYNHA2ejRGZ3Zqb015MkRhakY1TTBpTGwzUTg0M2R2d3JndGV1THErbmQza2RwR3lTeDduNjEwWGhuUzJFMEZ2TktpZWNkcWtuT0syTmMrRnQxYm9ycXNjaXNNaGczVVY5Rmg4SGg4TlhjMUZjMHV0bHJZNnNaVmxqc05kVkxkMWUycDVOZFc4a3lsU1czTjN6MHBMV3draWhZTTJTdmYxcnRyN3diTmEvTXlqYjY1ck5tMEpsTGNEdFgxR0hyUWRyV1BoY1JrazR6NTNkbkszRmo5cS9yeFJkNkFwdFdYbmNSMTcxMERhZWJkOE1CK1ZUTll0ajd2WHRpdXB1RGxaTTg3K3lWSlM5cEhjNE9mdzdORS93QW9MZlVWR2RHbmpmNWwrWHBYb01sb3NLZnZOdWUvUFdxMTBJd0JoZTNKeFcwcWxLQ3ZVYVh6UEtud3pEN0RaeFA5alNLNURENlYwbmhmdzNJa0lJSHpIa210SzFzN2U1YmR0WDZWMG1qQzN0NFF2QStsZURqc2RoM0Z3VWo2WGh2aFZmV1BheTI2RGZEK2h6TEprbnI2VnVMWlNBS1YzQXJ5S20wMXZNZFVqMnV6bkFyMEdENFZ6VzJsckpOdGFSaHVJUmdjVjhKanNaUXB5MTZuN3ZsdUJvMGFTaHpISTZUNHMxYlNiYnk0YnVaUjZFMHQ1clYxcU1PTGlScFNXMzVibm1yV282RTlsY21OVVpnRGc4Vm4zMmpYMG9NZHZrYnZXc0tHRGpOZTBoRTlhVlNVRmRMbU9zOElhMUZvK21ibW0yUEozempGWm11ZUtwNzFHYnpWYmRrZGNtdWVYd3hyU3hBTXFzdlhnMTZMOEUvMlF2R254MjBqWEw3U2JlTDdQb0VRbnVkNzdXQUlQVDhCV09Kd1ZMQjN4V0pmTEhxM3NqbnFaaEszdlFhZm1qejFOSXVQRWwyc2NlNlRqdWE2TFJmaFpOYm41b3l2VExZd0s5eitOdjdBZmlyOWpuUXZCK3NlTW83VjlOOFh3RzZzbnQ1TjBpWXh3NDR4MXpXT05JMEcrdDI4aSttaWt4bGxMa0VacmQrMG5Ibm82eGV6U3VlVEhHZTFtcWxGM1Q2L014dkRHbnRwa2NNYXlIZWdBQkhHUHdyMUd5MXA1TkdqODY0a1pWR01Gc211UjhMZUVyUkp2bDFDVGRuSUx1RFhTeWVFTHE3dFFzVjlHeXIxQmpIOUsrV3gyVDFaMUcwWjR5ZFM3VFl5MThUUnBQOEFJM2V0elM5Zjh5VGQ4dTdyblBTdVZpOE0zZW5URnZLaGwybnFNaW12cWpSS1Y4bGxidnRQRmZNNDdLYXUwZWh3VTczUFZMWDRnUzJ1MEM0UEhCK2F1cThML0ZWN0FlWTA0VUR1V3I1dmVhYThuM0xKTkg3Y2l0enc3cDE1ZVNmdkpuWmM1QXlhOFBFVWNUQ0g4Vi9lelJ5V3lQZk5ZK0xWMzR4a1dCSlNzZlRJUFd0N3dmcGNjUVdTUmxKOTY0SDRkZUZKZ1JJNCtWUjM2MVQrUFB4KzA3NEtlR1pKN2ljQ1hHMUkxUHpNZllWNEZiRDRySFZvNGVuZVVub2pDVlNNZmVaNlY4U3ZpOWErQ3RLYmRjUXhvbzVMT0JYelA4US8yNXRDOE1UdkpkWG5tdGs3VWkrYitWZkovd0Fadmo5cm54azhRelQzRjFQRGE3ajVjS3VRcWl1Qmx0V21kZHhNaHlUbGpYNi93LzRTVVkwbFBIemZNOTB2eXVmSzVqbkxiYW9LNy9BK2p2Ry8vQlY5N1dOb2RGMHVSbTVDdk1jQWZnSzhMK0pIN2MveEErSXdkWk5VYXh0NU0vSmJFcit1YXc1dEJoblErWkdyTm4rNzFxblA0QnRKanhHMGYrNmEvU3NwNEZ5ZkNLOU9pbSs3VjMrSjhQbWRYUEsra0txUzdMM2Z4MS9NNURVOWJ2TmFtYWE2dUpyaVJqa3RJNVluODZLNk82K0dwQ3I1TXgvNEVLSysyOW55cFJqb2o0bXRrdVpPYmNvdHZ2Zi9BSUp5dnhGbkZ4NDMxU1JlalhMNC9Pc1d0RHhUY2ZiZkVGNU1GS2lXWm1BUFlFNXJQcjRPbXJSU2ZZNDhkTG14TlNYZVQvTUtLS1VpcU9VU2lqclIwb0E5VS9aaHRJMjhRM1UwaWJsWlJHUHIxcjJUeEhiNmY0blAyTzZqQ0tGSldWVkFjSDY5NitlL2hENGtrMGE5a1JjNGJEWkhhdmFkSTFkZFV0VE5IS3NqWnhzUDN2OEFQSDYxODNtVWFpck9TWis3OERWYU04cmhSM2F2ZjFiWngzaVg0YlhXaHp5TmF0OXBoWDVnZStQY1ZpdmRtNlh5WmtPTThqcFhjZUlkV3U5T0luVnYzaW41UjZVMTcvVHZHU0w5cmpqdFoyQUJsaVhHVDZrVjJZUE1hdEp4bkJ0TmRVZHVPeWFoS1RwMG51dFU5bWVmWGZoRzJ1MGJ5NUpJL3FNMUZvR2pmMkJkZ3RMNWtXZlRwWFJhL3dDR2RRMFZIZTJaYmlFRDc4WjNjVnpiMzhrajdaRktuT01WNldPelRFNDVKNGlYTWZKeXl6QzRDc3B3cGNrbDYyL3lQcGY0RC90RCtEL2g0SWt2bXUxS2daS1JaNTl1YTlnMW4vZ283NE1zZFA4QUx0YlhVNzV0dUJsRlJSK1pyNGN0dEdYVUxIZEhJRms5MnFqZTZIYzJpN20yN000enU2MThMak9EOEJpYTN0cXQ3K3A5Qi9hR0pwcjJpaGRIcS94LytPMXY4YU5jaG1oMHUyMCtPRWtxeWo5NitmVmgxcVg0US9CTFdQaU5yZG96SjltdEE2bDNrSDhPZlN1cytDMzdMRWVrNkhwMnQrSkZWVnZQbmhpZCtnNmpJOWE3alUvakpwL2drdlkyY2F4dkcza3lqYUEyRDBJcjBaV3djRmhxQ3R5clRyb2FVTVJVeERmS3J0OXRqelAvQUlLVS9zMmE1OEpQaVBhNnBNYmErMG04czRDbDFZeC91WW0yL2NPT00xODY2UHFNYzExR3JTZmVJSEpyOUpQMmF2Mm1QRFBpYTFsOEUvRXF6dGRUMEhVc3BGY1RJSk5nUDNSazlLdy8ybWYrQ0o4ZXNXc25pTDRTNmxIcVZqTVBPV3hlWUVybm5DdC9RMXpZYnhFdytGeFR3bVpROW5mNFpQV0wyM2ZSbmc0N2d6RksySXdUVW4xanQ5eDhwNko4TmJYVk5PVzRTOGgrWmVWTGREVmlMNFlySEdmOUtqK1U4THVITmNiOFNQaEg0NCtDbW92WTY5cEdxYWJKQ2NIell5cXQ5RDBOY3JING12NVNWYWE0WDIzR3Z1c1BuVWFzZmFVMnBSZlZOTTgvRVlpZEthaE5PTDdOSHIxLzhQOEE3STBNeTNpN1c0eUQ5MnRpMnNyeElUYno2Z0dWZjlYaCtnL092RllQRUY0cTQrMFRFTDIzVXFlSnJ4MVl0TkprZERtdEpZNk1sWjN2OGpvbzQrY0xOUy9BOWExUFIyajNadWd5c09PYTV1NFNUeUdWcE9oNlo2MXlVUGlTODI4M0xOajFOT1hXYmdjN2p0OTY1NDQ1dzFqYzl5R1pRbkgzelN2aXlTOE45M2tDb1Jxemo3ekhKOXF6L3dDMFpESnVKem1yRWwxSEtxN3Z6OWF6cFk2dEc3aTl6bmxVaFUxV2hOT3pYVDd0M1BwVGJ5Q1JvZm9Qem9oa1JaTndmNlZlRW0vK0hPZWVLWHRweWJiZXB0VG8wNXhhYk11eG5hQTdXNzlmYXV1OE9pR2ROcmRjWjVyRlcyaVo5emZMK0ZhVU1HeFZaSk85WlNsS243eTEvTTl6S2FicFM5NnpTUFRmaGZvRmpmYXpHazBpcXVRUjZBMTlFV25oQ3owN1Q0ekNpeWJsQkxaNjE4bWVHOVR1Tk91bzJqa3d5a1lOZlEzZy9YdGUvd0NFVisxQzNtbVNGY2tvdVZBcjViT211ZUxVcko2SDIxU28vWktTKzQzSS9DMXZjM2NqU1JvUjZCUlZmL2hEZFB2TlU4c3hwMTYxeXIvR1NUVGIzRnpheXEyTW5pdHp3aDhSSWRiMUpZNFZaV2s1NVd2Y3c3clVNTzYzU0t2OXhOSEdPay9hTTdxRDRNV2N0cDVpckNxbXZvYjlqWTZMOExmZy93REV1TzR1SVliaStzMVZCdXdUa012SDUxNEcyczNGcFlibWt3dU9CMXJ6TDRsZU4vRWxsZVF0cGU1NFpKQXN5OU53ejZWK2VZclBjVG5tRnFZR3JUOXlWdFYyVFQvUTRaNTdVcVZHbitaK2l2OEF3Vnp2dEgrSTNoWDRTYWJCZFJ6UjZUb2U0cUR3QzJBUDVWOFBTZURyV3hrQ20zK1hPQXdXdEhXOWMxKzF0ck9QVzVaNXB4Ym9VM3lGdGlkZ0NUd1Bhc1h4RDRpay9zd0VidmxPZU9hK215SGlsWWFqRENTb1QwMHV0VHg4TGluUWpHbERaWC9GMy9VbXVmaHBKTktyeDJueXMyYzV4aXJVWGhSdEVWUTBrdHVWTzQ4NXpYaS94ZS9hOHZ2QU05dkRheFNUTXBIbWJnUmdWN2g0VCtJRnI0NitGRnJxdDBwaW11RVZndmNaNXI5TS9zbXBqTUJMSHRjc1YwZTdOSHhsUmVQaGxjbzNuTDhQVWh1cDV2S3pISXNrZURsZ0tyMkZ2OXFiOTRCOWZXbXQ0a3M3YTNhR0YxNjhrbnJVY1dzMnNjZitzSFh0WDVmbUdIaWxhSjdrNlN2c2RGcCtod3lsVlZWYlBHRFhhZUdmQXR2QklyT20zSXp6WEM2TjR4czdLYU4vTUJBNlpxRHh6OGM3ejdFOGVseE5OTGpHY1lDL1d2bGFtVzFzVFVWT0swWnl6cUtLTzIrTkh4MDAzNFBlRnBXam1qYTdaQ0k0Z2NrbnRYd0o4WGZpWHJIeFk4VFNYMnFPKzNQN3VQUHlvUGF2VS9FR2phcDR5dkd1OVltZVNROUFXK1ZhcVEvQjZ5MXVJb3UwdG5xcDVGZnEvRFhER0R5MkNtdmVxUGQ5dkpIeStPekNNbnk3SThUZzhQTmRKdWkybGw2cm5rMURQcGNrRHR1VXEzb2E5NnQvMmVoYk1yUjd3eW5yNml0SFUvMmZvZFJzMVlyaVZmNGw0TmZZdkUwbzZIa3VXSHZ2b2ZQRVVERmVlZDNiSFduZlp6dUc0SHRYdEY5K3pmTkV5K1QrSWJwVk1mczMzMDhycUZac2NxYTJoajZVVnViUlZDMStaSGtyV3pZK1hnZXRGZXFUL3M3Nnhid3NVZzNuT09UMW9ybyt1UWVzU3ZaMEg5dGZlZWEvSGo5bXUwdXRMYnhINFFrTjlvODN6c28vMWxzVC9DdzY4ZXRmUDkxYVNXVTdSeUtWWlRnZzE5TmFMZWFsOEk3cGZFR2d6ZjJsNGV1RHR1TFYvbThzZDBjZjFvK0x2d0owZjR6K0Q1UEYzZzF2THVvaHZ1OU8vaWlKNjdRTzNXdm5jVlNVWXE3djJmOEFtZk44UmNMUXhUbmlNSERrcXJXVU9rdjcwZlUrWWFCVTkvcHMybXp0SE5HMGJLY1lJeG1vd09sZWVmbGNveWkrV1NzeHVNVXV5Zy9PYWJqQm9KT2orSDBZZTh1R1k0d25INTEyL2gvVldobDJxekwzSE5jTDRDdkZ0Yjk5M1JseGl1aWl2ZjhBVENVSjRQRmVYaW8zbnFmcFBER01WSEN3bEY2M2Qvdk8zdkxtWFZyTlZrd2RvNjQ1TmN6Y1hrbW56SGEyZHA0clpoMVR5ZEY4M2NNNHdSNlZ4bW82djlydW1DanZ6WE9xT3RvbjErZFpoVHB4aE8vdk03UHcvd0NPSnJWenRaZHJEREtSd2Z3clF1L0NsajQwS3RDRXRibDE3bmFoSXJ6Tjd1V09aUWpmZHJ2UER1cXRkYWZGdVliby9sNG9sRndRWlRtY01lM2g2OGIyN21QcVhocTg4TDNKREszeW5rZzVGUjZsY3ZlNll3Vmp1R0RYWFBjK2JsWkI1aW5xQ2FvM25oMkM4THlXdjd2SDhKTlRHcXJuVlh5ZVVZdU5CKzYrbitSNmw0ZzhZNjU0cCtHdWs2akRNODJuckNzYjdPdHZJdU1tdVcxYlhtOFZDS1M0Wkk5UWlYWnZ5QXN3SHI3MUI4R2ZpNWVmQkhWMisxMjhlb2FQY050bnRuNkVkeVBmRmV4YWw4RVBEdnh6dG0xandQcUVVTHpEZTFqSVI4akh0Nml2RnhlSzlsVi9mcjNla3YwWjZXV3lwUWlxYmp5dGREeE1YZHhZNGpmZW1PZ1k4ZmhYdHY3T0g3ZVBqSDRBWFVNZHJlUGVhZXB3MEVyRmdCN1Y1MTR5K0hQaVQ0ZWsyK3NhWEtzUDhNaGpPMGpwd2E1azJjZHhFZkxrQ0hQQVBiOGE1c1RoY0hqNkxwMVlxY1g4ejNJei9sUDArOENmdDEvQzM5cG5TRjByeHRwZGpITGNLRmNUUjVVazhkY2U5YzU4U3Y4QWdrTDhIdmpsYnkzL0FJTjFSOUl1WnZtQzIwb2FNay83Si9waXZ6aVJielRDclJzVDNCU3U1K0hmN1VmaXo0YVhzY2xucU54dFRIeU14cjRxcHdiaXNIUDJ1U1ltVlA4QXUzdWlhOEtGYVBKWGdwZXU1Nk44WC84QWdpZjhSL2g4OGsyZ21IeEJiS2VBckNOOGZUT1AxcjUwK0lmN0x2anI0V3pTUjYxNGExU3oyOVdNSktEL0FJRU1pdnVQNE4vOEZkTlkwVkk0ZGFRU1JyZ1piNXNqODYrZ3ZDbi9BQVVqK0h2eEdnU0hWcmV4WXlERFoyLzFxZjhBV2ppakw5TWJoMVZpdXEwZjRhZmdlVFc0WnkrVWZjOTM4ajhYSjlQbXRVYk1mVHJVSnVaR1hHMGxmNVYrMmV0ZkMzOW4vd0NQOGU2YXkwbFpwdTY3VWJKOXhYbTNqYi9naS84QURIeHFyU2FEcmQ1cDdQOEFkQ1RoMS9JZzE2bUY4Vk1COE9OcFRwdjB1dnYwL0k4UEVjSTFWcmg2aCtTc045bmpiOTN2VTB0NGtpZktlblUxK2dIam4vZ2hQcjJuK1kyaStKTGE2VCtGWm9pdjZyWGl2anIvQUlKSC9GZndpV2FQVDdlK2hUdkRJY3QrQkZmVllIampJc1QvQUE4UkZldDErYVI0dGJJOHhvcTNMekh6T3QwUkpqOGF1UjZ3MXRnRDhxN0x4ZCt4ejhTUEJ4ZHJ6d3hxa2FwMUtSRngrbGNSZCtFdFcwU1JrdmJLNnQyVTRQbVJGZWZ4RmZVWVhHWVN2NzFHckdYbzB6eTVQR1VYYVVHaTIzaU5uKzh2eXIzcWRkZVh5dDN6ZlFWZ1A1c1RuY3JBK3VLY2x5VWorYjd1T3RlaFVoRnhkbVZUemF2R1h2M09zMDN4TjViZ3JJM0hjMTdCby83Vk90K0h2aHlORHM1TGNSeXVYa2ZiOHpqb0JYenhaM2FoUDcyZVJYUitCOUxieFY0Z3RyRVNlWDVyQWM5cThYRllTbFZTOXNycU92OEF3VDZiTHM3cVRpcVc5enZiYngvcm12WGJYWDJkcmlQbmR0VGl2UWZoUjhYclcxMUpJcjYxK3p6YmlBZHZGZlV2N01IN08yZ2FUOElFTThQbXorV1NYd1BtclgrQy93Q3hKcFB4SDhVeVRUV29TMzNrNUsxNDNFbkZXQ3k3QXVoVXU0elZ0TFgrUjloak12OEFad3B6akp5Y2w2SGljdngyME9HZGZ0RTBZalhybXVUOFMvSExRZkdYaUJJZE1rM2VXZVNveHoycjJyOXQzOWd6U1BBMEVWeHByTkR1ZlpJcW5oaDYxNEI4THYyTGRjdS9FVzdUSUpyaFYvaXh1cjl4OEllRThyelhoK2xpY0o3MUtUYmQ3WHYxVDlEK2YrUHVOcStTNCtWR0h1MU9WTk42eHMrdHY4enBmRWZ4QzFHM0VjMXdKcmhkb1ZDMmVucFZyd1g0OFhXNzFZN3ExZU9QalBXdlZ0Ui9aazE3dzc0WmpPcDZmSjVLZ0Rmcys3WFAvRVA0SytLUEEvZ0NUWHJYU1d1cldIQll4cjh3WDF4WDIyZStHdE9sUmJ5eUd2YlQ3MGZPY0srTGtjUlg5bm0xVlJWOUpMWitUM3NlRC90Y3dhVHBxeFhWdmJtZG1Jd0F2ZkZUL0RIOW9xRi9BOXZheldOeEVrUUNZQ0VqZ1Z6M3hHOGZYVUVheWF2cGhpaUxCdHJmZXhXMTRPK0xQaEI5TWpFbHUwWllEbmFLOGFqbGM4SGxTdzJOYlVydlcxL3lQcGY3YnI0ck9YV3l4S1VGYlc5bVhibjQ1NmE4amJRVlBUa0VWMC93OThRMi9qZ0pEYVNMSkt6YmRwK3RTZkRMUi9CZmpIWEZXNE52NWIvd3lBS0RWNzRXSHc5OEJQMnpOQTFLM1ZielFmdEFrbXQ4NVhnZy93Qks4cUhCZUJ4bENuaUpTaTR5bW90TFNSOUxXOFNzWGhhOWJMNTBwYzhJT2QzckYyVzEwZXA2TCt6SjRpV0dLZTQwMjhodFhBS1NOQzIwajY0cnBkUCtCaTI2L3ZWWmNkZmw1TmZZWDdSbi9CUlB3WmUvRGkzdGRLc2RyTkNBenpiVlZPQndPYStEZmlUKzNIWjJ0MUlMZll6Y25DYzE5WGdQRFhJSVV1ZkZVbkI5bksvelB4N012R0xpT3RpUFo1ZTRTajNVSDkycjFMdnhmK0RrZWcrQnI2OGpqSytWR3pBNTlCbXZsajlqSHhUZWZFajR1M1ZqY1RLdHJFMlFEeG5tdW0rUGY3YmVwK0pmQTkxWlF4TXEzQ2xOeGJvRFh6WjhIUGlEcUh3MDhiUjZoWUFNOG1WWmY3MWRsVEs4aXdtS3BRb1FUaHJmVy9wdU9qblhGV053VlY0dWJVM2Jsc3JQOGo5VlkvaFJwUVJQTW5pNEhQTlRINGUrRzdkVkQzRVEvd0NCMThNNmwrMTE0cnVJRlpZZ09uQUI0ckh2ZjJudkUxNUtxbVNSZDNPVVBTdmZYK3IwSDdsR0gzSStWbGd1TWFpdE9yVi9GZmtmZlgvQ09lRVlKUG11SVR0OTZ0UlRlQjdJL1BORHVXdnp6YjQyNjVkSDU3eVlOM3kxVFcveEJ2TlJLdGNYa3VHT0d3MUU4NHltaXJ4cFFYb2wva0tQQ1hGR0pkcFZhcjlaTmZtejd3OFUrS3ZCc2NRVzJraTNaNUlJRkZmSXZoUHhoNGZ0K2I2ZWVWbEhJQkpvcnk1K0ltWDA1Y2thVi84QXQwOWluNFM1N09LbDdWL09VdjhBSStTL0FIeHAxSDRiK0pic2hqY1dOMFdqbnQ1UG1WMUo1NHIzVDRWWE1FVm1mRTNoV1o3aUZPYjZ4ejgwYW5yeDNGZlB2eGgrRzk5OFB2RjE1RE50bnQybEpodVkvd0RWekFuZ2lxdnd2K0tPcC9DdnhFdDlwOHpMdStXV1ArR1ZlNElyK2U2TmZtb3FIMlgrQis0NEhQOEFHWk5qNTVkbXNYeXhrMXF0WTY3cnVuMithUHFENHMvQnZRUGpsNE1PcmFKQ3R2cTBXUzZKZ0IvWEk5YStTL0ZIaHE0OE1hcExiWEViSTBad2MxOUdhWjhRVjhUUUhYdkRFbjJhYnJkV1FQM1Q2aW9kWXM5UCtPa1JobGhqdDlXVUVibUczekQ2WnJhR0FxUmhlOTEwUGY0ZzRmd21heFZiQ3lTcU5YVDZTWHIzUG1lak5kVjhSdmhicVh3KzFPU0s2Z2RZOC9LMks1WEZjK3ZVL0g4Wmc2MkZxdWpYaTR5WGNzYWZkL1paMWJualBTdWgwWFZGdmxiNXZtQjZIdUs1Yk9LbGdtYUNSWFhzYXpxVWxORzJCekNlSGw1ZGowdlRoOXV0V3QvTUNlWVBrOTZ3ZFIwMjQwVFVQTG5oWUwvZXhWYlJ2RUMzRzFUOGpkQVBXdXowYlY0NzlGZ3ZsKzBRNXdBVDAvR3VHTUhUZkxJL1E2RXFHWjA0OHN1V1MyZlQwWng4RTI2NjIvS04xZEpvek5abGl6WU1neW9IcFROWDhDL1o3aHByT1R6SSt1dy9lRlY5TTg1OVdWWmxaZGk5RFUxbzJkalhCNGV0aEszTFdXdDlHdGowYnduNEExL3hoNGF1OVUwL1RicTdzYkVoWnBZMXlFTlpQbU1IWUViV0hVSHFEWDZHL3dEQkpEdzdiYW44QWRjVzRoUnhKZE1jc01qaXEvN1N2N0JPaC9GTnJuVU5FV0xTZFYzRWxrWEVjcDl4MHI4OXFjV1FwWmhVd3RlTmxGMnV2MVgrUitsVXNQUDJNWitSK2ZzUWp1SXpITU55bjlLWFJaZFI4RDZwSHFHaVgwa01rYkJnVWNqbjZWMFB4UytEWGlMNE5heTluclZqSkVvWWhKMUdZNUI3R3VYRnlSSUNyTUIzeFgxRk90VHJRNW90U2l6bnFVNFR0ejZQdjFQcDc0VWZ0N1JlSnJHMTBmeHhwTnZkUnFCSDU2TC9BREJQV3ZUVi9aaStGZngvaTh6Uk5VR2sza2d5RVJnQmsrMksrR0pHaXVtVldHMWdlR0I2VnZlRlBHbXBlQ3J1TzRXU1NTQlNBU3JFRWZTdkV4V1JjamRUQlBsOHVuL0FPdWhXY045VDZsOFQvd0RCSjN4dHA4UG5lRzlTczlXVHFxc3hSbS9TdktQakIreFI4VHZnZmEyOTE0bzhIMzFyYVhRM1JYRWNlOUdIMUZlbWZBZjl1YnhKNFB1YmVUVGRja2xTTmdUYTNCQnp6bkhOZllQaXIvZ3NsYS9FelJOTTAzeEI0VlpyZXlnOHFSa0tzckhvU0I2VnlSeDFlakNYdGsrWmJhYi9BRFBROXRSbWtvdXo2MzZkcmFhNitoK1MxeGFSeGpheXl4eUE5R0dDS2pXMWt6dWpsYjI1cjlKdkVmaXY0Qy9IY3Q5c3NiS3d1WnU4c2Zsc0Q5UlhHYTUvd1RhK0gvajdkTjRiMTFiWGR5b1NYY0IrRmNFdU1jTFJmTGlvU2o1MnVqR3BicHI2SHc5cG5qYlhQRDQzV2Q3ZFI0UFJYTmVnZURmMnp2RzNnaGsyNmhOS3E0eHVZOXZ4cjJqeE4vd1NQOFkyQlp0RzFpd3ZsNmhaQVFUWG5QaWovZ25aOFhQRHpNVzhPZmJrWCtLQncyUjlEV245c1pEamxhVlNEL3hhUDhiR0VtbTd0SG9IZ1A4QTRLeitJZEVDUjMwYzBpcjNVbHZ6eWE5dDhELzhGY3RIMUR5MTFGVVVOZ0hldVA2MThLYTUremY0MDhMU3lMcUhoSFdiY3J4L3g3TXcvUVZ5K3Y4QWdqVVBEaDNYMWhlV2Vlbm5STW44NjRhM0NHUTR2V25aWC9sYS93QXlZcW8xZUxQMXIwYjl2RDRkK0xiRGRPMW14YnFQbHBsNzhVUGcvd0NPZ1Z2TFBUbjNkUzBTSE5majVOR3lObFpHSDBOUGgxalViVWp5YnVkZHA2QnlNVjUvL0VNNkVYZWhYbEgrdlU1NmxhZTByUDVINnNhMyt6ZDhBZkgrUzFscE1iUDNWVlEvcFhIK0lmOEFnbFo4Ri9GeXQ5aHZIdFdmb1liakdLL09DSDRqZUlMSS9McWQ0UFQ5NmF1MjN4NDhYYWRqeTliMUJHWHArOU5kZFBndk9LSCs3WTZTOVd6am5Vb05XcVFYM0gyMTRnLzRJaWVGNzFtZlMvRk41SDNBY293L2xYam54TS80SnJhcDhDUEVkamNXT3RRMzBheUFuS2JXeG4ycnlEVC9BTnJ6NGdhVW43anhEcUFIdTJjMTNud1AvYXU4UmZFWDRoMnVuK0lOU212QktDc2U3MXJzV0Q0bXdjSFVyWWxWSUpPNnRyK1J6d2poRlVUcHhTZjllUjlvZkNqVWY3RDhCUTJjbnpNc2VQcndLOUs4QWZIN1IvaFo0ZlpiaGxWbEIrdWF3ZkR2N05jbmkvNGYyMnB4M3oyOXhKRHVpMmo1Vit0Zk4vN1kybVhuZ2I0ZFR6U1hESmN4akJJNDU5YS9PbzJ6ckVyRFZaM2Q3VzdIMFdLOXRHbkdUNkZuOXRIOXRpMjErK2EzRDd0emZLb1AwOTYremY4QWdpN3JYZy94L3dDRG9kUTFscmZ6bGtLc3I0OU9PdGZpbHFlb254VGVReTNVeGtiSXlTMzUxOXYvQVBCUFR4R25oMjNNTnZmbUdQSUdBMzNoWDk0K0EyV3JEWk5XeWFFbWxmZGRMOXZ1UDVQOGRzSzNQRDQ3U1RWL1IyYWRuNUg3RWZ0cStMUGgzcC93eHVvYlQ3QzB3ak9QTFZmU3ZoVy8vYUswSC9oVGQ5YVN3N3R0dThKUXJ3ZURnMVQrT1hqYlQ0dkNNbm5Yd2RuWHB1elh5TDhWZmpEWStFZmg5ZmViS0Zaa2JaejFKcjk2d0dCV1c0ZFVYSnkzZDVQVS9uMk9IZVkxdmJTanl1NnNrckxROGwrTFh4TjBQVTcrUmIyV0VSeHNRc2ZYaXZDL0hYakhSNzI2MjZYQzhjYWpxQmdFMXphSC9oSTljWnJpNDh0WnBTU3hQUUUxMFdvYUxvZmhXMWFHU1pydVZ1UVVJcjVqRlpsV3FxMUtDNWI5VDlZd2VEaFFuZWM1T1crbm9UZUNQaVYvWTRrM1RNcnFOeTVQVDJGV05QOEFqdmNTZUxvN2liTWdVNDY4ajZWd09wUzI2TTdROXorVlNlQXIyM3N2Rk52Y1hrZm5XOGJndW1lb3ovOEFXcjRqTm5UblZwMHJSWEs3M2oxUHNNQmpLOGJwU2I1bFozMTBmVFU5L3dER0h4RzFIeGZhd3h4WE53c0tyOTBzYXc0TkdsS3NXWm1PTVpKTmRQZWZ0SWVFYk8yamlqMGVSdkxBemhSenhXTGUvdEZhUGRtVHlOS2srWWNESTRyd0sxT3JpNnpuVXJOTHpQMDdMODB5N0xhRWFORERSdWwwYVRQTy9pUDRxU3p0L3NheHFyWnlTUmcxSDhIcDdmV1BFMXZITTIzNXVjZWxjLzhBRXZVZitFbzFzU3BHWS9NNENqNjFiMFh3OXFYdzhsdE5RbXRabzQyT1VaaGdOWHA0ZkExY1RQMlMwcHhTVG41K2g4TGllSXAwc3crdFRWOWRJMy9BK2w5WjhNYVk5cEg1Y2ovZHhqR0Q3VnpGNTRGaHVaUDNYbWRNNDQvd3JnTFA0NVRRRmZNdHc0NmRjMTZONEorSXR6cXRtczBOdW85UWNkSzlMQjhIMEUrWDZ4S1Q4a2lzdzhVc2RDUE5IQ1JTN3VUZjVKRmV6K0VrK3BUS1ZXVGF4NXdQL3JWMi9oNzltKzQxTkZIMk4rTzU0SDYxV1Q0dTZscFM0Q3g4ZERucFZHNy9BR2p2RVNYSGx3M1N3Z2pBMml2ZXBjSTVkRCtMelA1LzVIeU5meE16MnFtcUNoSDBWL3piUFVmRGY3SlUwZ0R6TmJ4cGpvVy8rdFJYam1yZkhMeFQ4dS9WNXdyZjNSdG9yMkk1QmthVnZZWCtiL3pQRmx4bHhUTjh5eGR2UlIveUYvWmkwQ3orSnZ3ejhaV0d2VzBXcVd1bTJYbTJxVERtQnZWV0dDUHBuRmZKbmlhMGpzdFp1STRsMnhwSXdBejBBb29yK1FzdmsvN1J4RU9tbW5RL3FqeE1oR2ZET1Y0aWF2Tjg2Y244VFNlaXZ2WmRGME5UNFk2emRhUDRzdC9zMHp3N21BWUR2eUs5dytKRm5IcG1yYWJkMjZpRzRtQVozVDVTeG9vcjdYQXlmc212TThEZ21UbGx0VlMxNVpLM2x0dDJQWE5XOE8yUGpyOW5OYjdWcldHOXZJRk95WnhoMS9FWXI0ajhYV2tkbHE4a2NTN0ZESEFIMW9vcnhmdHk5V2RQaVJUaDdDbk95dmZmcVpkS2g1b29yYUorT2s0R3gxeDdHdTAwV1Z2SmpPZlNpaXVQR2RENmpobVRWZlE2NnhsWVFLMmZteFdUSTVsMXhuYmxzWXpSUlhMVzNQMUxGU2JwMDArNStwSC9BQVJ5VUg0QTNxL3d0Y3ZrZXRlemVNejlpMVI0NC9sanlUaWlpdjUvenova2ExdjhUUHVNUC91OFBRNVg0bytCOUo4WStFTGlQVk5QdDcxUEpKeEl1ZTFmbUY4Y1BEbGw0VytJOTlaNmZicmJXc2JEYkdwSkEvTTBVVjlMd1pVbjdaeHU3VzIrNDRjWjhaeWFkZndOWDdaaUVDL3dzT1I2MFVWK2w5U0tIWDBIWDZmWVl3OFA3dHNubFRpdSsrRTJ1WGQ5YWxKcG1rVUhBRFlORkZjdGFLZE4zWFlVanAvRVdudzNOdnVrakRIZ1pybEQ0bTFMd1pkTStsYWhmV0xMeVBLblpjY2ZXaWl2SGhUak9iaEpYVnRuNm82Y0pxN005dS9aei9hbCtJQnY0TGR2RkdvU1E3dHUyUUkvSDRxYS9STDRDK045VThTYVpidGZYUnVHYkdTMGE4L2tLS0svSGVPc0xScHpmczRKZWlTNmlpM3oyUHBUNFU2SFo2dnFkcXQxYXdUS1hBSVpCWG92N2JuN08vZ1h4VDRCczExRHdub2QycFFaOHkxVTU0b29yNUhoOWY4QUNMajZ2Mmx5V2ZWYTlIdWp5YzBxVFdaNFdDYnM3M1hSNkg1WmZ0UWZzWC9DN1RMYTRtdGZCdWwyc2lra0dGcEk4Y2Y3TEN2ejkrT1h3MjBYd25mekxwOWlMWlZIQUVydC9NbWlpdjBUZ0xINHFwcE9wSjZyZHQvcWRWYjRtZVMzS2hKMjIrdFZwamhqUlJYN2hUMlBNeEEyTWJsTmJYd2h1SkxQNHJhTEpHeFYvdEtqSSt0RkZZNHYvZHArai9JNHFmOEFFaDZuN0IvQnp4TmZ3ZkQrT0ZibVFSckdNTGdjY1pyNHcvNEtaNjNkVGFhMFRUTVkybEdWNHdldEZGZmduQmNZclBFMHVwOW5tTGYxTmVoOEIrSjcyYTJ2SS9Ma1plZXhyMUg0T2ZFVFcvRFdsdDloMUs0dHlyakJYSEg1aWlpdjc3OEgyLzN2eS9VL2svajVjOVNTbnI2L0k2elMvaS80bThVK0pWajFEV2J5NmpWdUZkaGo5QldEKzB2ck4xZFcxdkZKTXpSNTZmaFJSWDZubWtwZXdrN241NWw5T0t4dE5KSThSdkhLRk52Y1ovU21PN09pa24xb29yOHVkU1RuWnMrNjJ2WXVlSHJLSzkxU0dPUmR5czNJejFyZDhZYUphNlBxaXJiUWlKZGdPQXhQOHpSUlhkS25INnE1VzF2K2hPSGIrc3dYa3pOa1lzZXRRMmt6UjNhN1c2R2lpdm04UDhKOUJVYjUwWE5RWW03dFQzM3IvT3ZwejQwNlhiM0g3T2xuTEpERzBpd293WWprSGptaWl2dHNqLzNHci9YWStONHEvd0NSalM5VitoOHEzSHlNdVBXdWs4RTYvZVdLTXNOeElpOERGRkZkM0R2OGRuVm1rVnlXc2E5eDRyMUI3N2ExMUlWOUNCVTFycWR4TklyTkl6TUc2MFVWOWJVNm5nMUl4VWRFZENaMm1XUGMyZXZhaWlpdVZiSGxYWi8vMlE9PSIgc3R5bGU9IndpZHRoOiAxLjg0OTMwNmluOyBoZWlnaHQ6IDEuMjQ5MzA2aW4iIGFsdD0i5Zu+54mHIDgiIC8+PC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxMSI+IDwvc3Bhbj48L3A+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDE4MTAuaHRtbCBiL1Rlc3RGaWxlcy9UMTgxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYzczMGYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDE4MTAuaHRtbApAQCAtMCwwICsxLDE0MyBAQAor77u/PCFET0NUWVBFIGh0bWwgPjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz48dGl0bGU+IDwvdGl0bGU+PG1ldGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJQb3dlclRvb2xzIGZvciBPcGVuIFhNTCIgLz48c3R5bGU+c3BhbiB7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQorcC5wdC1Ob3JtYWwgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtMDAwMDAwIHsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250IHsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitwLnB0LU5vcm1hbC0wMDAwMDEgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIHsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDAzIHsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgZm9udC1mYW1pbHk6IERhdmlkOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9CitwLnB0LU5vcm1hbC0wMDAwMDQgeworICAgIGZvbnQtZmFtaWx5OiBEYXZpZDsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUgeworICAgIGZvbnQtZmFtaWx5OiBEYXZpZDsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitwLnB0LU5vcm1hbC0wMDAwMDYgeworICAgIGZvbnQtZmFtaWx5OiBEYXZpZDsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDcgeworICAgIGZvbnQtZmFtaWx5OiBEYXZpZDsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIHRleHQtaW5kZW50OiAwOworICAgIHdpZHRoOiAwLjUwMGluOworfQorc3Bhbi5wdC0wMDAwMDggeworICAgIG1hcmdpbjogMCAwIDAgMC41MGluOworICAgIHBhZGRpbmc6IDAgMCAwIDA7Cit9CitwLnB0LU5vcm1hbC0wMDAwMDkgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBmb250LWZhbWlseTogJ0FyaWFsJywgJ3NhbnMtc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCB7CisgICAgY29sb3I6ICMwMDAwMDA7CisgICAgZm9udC1zaXplOiAxMHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTEgeworICAgIGNvbG9yOiAjMDAwMDAwOworICAgIGZvbnQtZmFtaWx5OiBEYXZpZDsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMiB7CisgICAgY29sb3I6ICMwMDAwMDA7CisgICAgZm9udC1mYW1pbHk6ICdBcmlhbCcsICdzYW5zLXNlcmlmJzsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMyB7CisgICAgZm9udC1mYW1pbHk6IERhdmlkOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LTAwMDAxNCB7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK2JvZHkgeyBtYXJnaW46IDFjbSBhdXRvOyBtYXgtd2lkdGg6IDIwY207IHBhZGRpbmc6IDA7IH08L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2IGRpcj0icnRsIj48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbCI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij48aW1nIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFMRUFBQURwQ0FJQUFBRGtsa0VJQUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBUngxSlJFRlVlRjd0ZllkM0krZDk3ZnQvbkhmeWt2akZWaExIeVltZmt6em5PYklsMlpLdFpRTTdXTkZKVkpJZ3dRcUNKTmg3NzczMzNudGZMcGU5bDlXdXRMdGFhYlZhdnp2N2pZYXpZQU5Ca0FRcDNuTVBEakFBQm9QNTNmbVZyODMvK01zOTd2RSs3alZ4RDBQY2ErSWVocmpYeEQwTWNhK0pleGppWGhQM01NUzlKdTVoaUh0TjNNTVE5NXE0aHlIdU5YRVBROXhyNGg2R3VOZkVQUXh4cndsRGZQZmRkOTk4ODgyTEZ5KysvUExMSjArZTdPM3Q3ZTd1NGdsZXZucjE2czJiTi9UbjdpN3VOZkdYNzcvLy92bno1MTk4OGNYKy92NjJFU0FTd1ZjZ0hYeVgzc3Nkd285YUUzQUp1UHAzZG5ab2E1c0U2T09PT1k4ZnFTWmV2Mzc5OU9sVDJxcVhCanpIMTE5L1RlLzY5dU5IcHdrNGZGelp0REhOaWp2ak1INUVta0NrT0RnNG9BMTROYmdiRHVQSG9vbHZ2LzBXQnFOTmQ4VzQ3UTdqUjZFSlhMdTB1YTRMdDlwaDNIMU5mUFhWVjdTaHJoMXdHRy9mdnFXUDQvYmdMbXNDOXZqaWl5OW8rOXdRbmoxN1JoL043Y0dkMWNUMzMzOS8xUm1sa1VDbFF4L1RMY0dkMVFRdVVOb21OdzNrRnJlcnVmTnVhdUwxNjllMFFTd0RTQ3pvSTdzTnVKdWFzSkNvd2NiTGx5L3BnN040M0VGTnZIanhncmFESldGblorZTc3NzZqRDlHeWNkYzBnY2g5YlcxVEZ3VzhGMzJVbG8yN3BvbUxwcGJOemQwVkZZMnBxVVZEUTJQMHBxdkVWMTk5UlIrb0JlT3VhZUtpVHFLd3NLYXNyTDZrcEM0L3Y3S3ZiNWplZXBWQS9rc2ZxNlhpVG1uaW0yKytvVSs4MGFpc0xKK2ViVnhhcWU3cExjek5yVmhmMzZEZnVETHM3KzliZU9QbW5kTEV1VU1pSkpLdzVPUUNkcGhZWHEycnJVOFlITWxZWEM2b3FDeENIS0hmdUVwWWVPUG0zZEVFTHI1elIweDVleXZHeHB1Ym1qcTZ1Z2JJbHEydGpaVzE1czZlMU83ZXRFZVBpeUswU2ZQemo4aGJWd3BMYnR5OE81cDQ5ZW9WZmI1UEJ3S0VsN2UwdXpkL1ptYXFwYVdiYk56YTJscGI3NE9yZ0N4R3h5cmo0ckxKOWl1RkpkY2dkMGNUeGxRY01QL2tkRXR3U0dCV1R1ekRoelBJTGpjMk5zbGI2eHVUVTdQNWtFVnhTV0YvL3dqWmVLV3cyT2FLdTZNSkkwZGRBK3NiMDRYRnNlRVJvWU9EZlNrcEJVZ3lQditjNytrWkVCR1JPRGxkVkZvUnI5T2xNRnE1T2p4Ly9wdytkQXZESGRIRW16ZHY2RE50SExhMmxtZm55NVZLZjJ0ckFRVEJVQ2FMbUpxcDR2RlZYSzZ5cHFibFNwVUJFZE5IYjJHNEk1cDQrZklsZmFhTnh2THlrcE9URDFzUWhFNU9NcEE4RndnMFY2b015MnlydUNPYU1HSHNUR3BxSWFPRHMybHY3eHNkblpHZVhzempCWkl0VW1sRWMzTVh2YU5MNE1zdnY2VC9nQ1hoam1qaW92TjJSa1ltcmEyRmpOVk5JNVF4UFQxSDc5RWs3TzN0MFgvQWtuQVhOR0hDYUluQ3dob0RBNXRHRnhmRkpXVmhnUTBWZDBFVHhyUk1IQWRrZ2FCZ1lHUEM2dHI0dG82VStJUXdLNnYzTXRBVENXOUI3OUVrV0dDYjVsM1FCSW82K2dSZkVNdkxLN0NvZ1kxQkd4dEJhYmwrWURpanRUM0YxVlZpOE81eGRuY1AwbnU4T0haM2R5MnQrK011YU9LaS9lTU5EUjBhVGJ4U3FRc0tpaU9ORXljeUpUVmlaQ3dMeXZEMVZSbThaY0RzN0RKNjF5WUJmbzcrSjVhQnU2Q0ppODcvSklaRUtoQWFtc3pZOVVRR2h3U09UV1QxOUtXcEE5VUdiM0U0QWtkSG9idTdoTU1SZW5xcVdscTZUZTVUUmRGRS94UEx3RjNReE9IaElYMTJqWU9uWjRDWFYyQmtaSHBtWmhtWGU0NFBrUGdvaDBZeW1sdVRFNVBwS0JNZkg3L3dPR05ySjMzL01QSHBsN0VycTJINStkTFlPTCtjbk5TcXFpWVRsSUdpeWFMQ3g0OVJFM0Z4MllHQmNlLzhSRkpWVmF1Zlh3eWpnQlBKZGZQdEhVaEg0b2xvSXBVR3p6L0tYMXd1WUhOMUkvdndpOWpHUmxWbFpVaE9Ua2w3ZXkvOVMwYkRvaVlTM2dWTm9NcW5UNjF4Nk84ZmdYdFFxYUpCb1RDa3EydW90TFR4N09ZS096dFJmV09pTmpJWXorM3R4YUZoR2toazRmRjc0bGpmekZ4ZVZ1ZmtCdVhuVjZLb29YL01PRmpVWVA4Zm95WUFyVFpWcjgrR2dSRStCSUxnMnRwMlBEbXRORDJOSGg3UzdKd290dHZZM2sxOTlpd2dPMGVkbDFkK1VWbFl6cnlnSDZrbVptZm4zZHo4SWlKUzRSN2k0L05rc3NpNHVKeWNuSXFMeWdKRVpHbnZUR0ZrY2ZoRnd0YVdmM0t5QnFYTmhRWjR2bmp4Z3Y0L040MGZxU1lBZUhqVUhTVEhqSTdPNVBFMGVuMVdTa29SMjk1RzBzcEtrSnNmemNqaXkrZlJnNFBLeXNyTTBOQkUrc2VNZ09XTXNybjFtakJteU4ySjJOallGSW1DNFNwZ1ZMZ0hxRUVrQ29tSVNOTm9FckRGMVZVZUdSbnI1ZVhIR0o1UUpGS25wYVdYbGhabFpHUTZPTHpuVk1vcjQ0Z21sbFp6Mzc0TmlvNE9VQ3AxOUk4WkJ3c1paWFByTlhHWldWOGpJNU4yZG1JNENWZ1VQa01xallCRWlLc0lEWTM5eTE5V3dZT0RxWkdSdHZUMHpJeU1yS2FtU3JLUmNHdHJITkpoTkNFUXlFdEs5V0I2Wm1SZWZrQlVsQnlsS2YxTHhzRkNxbzlicnduamgxY2R4L3o4SXc1SGd2Q1JsbFlDbytibFZjTkpKQ1lXNExtVGsvVFZxMGRzQllDRGd5MTZmY0tiTjh2TWx1WGxRVVlUNE5KcTNkSkt4ZU9WOHZXdHpHKytpYU4veG1oWXlNaXIyNjJKUzA0TnpjNHVJN1pFMUVDbWlkS0RaQmcyTmlLTlJsZFJVY3pZbmlHaUJtVEIzdUxwU2NjWEJLRGs1QUo2MXliQlF2ckRickVtVE9zT1pRT2xBVEdubTVzeU1qSTlKQ1NSRktoK2Z0ck16S3oyOWxxMjdRbmhQT3p0ZmRoYnVGdzUxTURuQitIcmlENkppYm4wM2krT3c4TkQrci9kS0c2ckpyNzk5bHY2UkY0Q25wNEJVRUJOVGRuTGx3dE9UaktGUWdjbmdXaFNWRlNBWElHeE90S0N5Y2xPNW1WMGREenpIRlNwSXVCWHBxZm5rRkdtcGhhNnVDZ3Vta1l3Mk4zZHBmL2VqZUpXYWdMNStTVW5qNitzcktJV3RiWVdCZ1pxaVdsTFM4dTh2QUt0cmZteHNRbU5qUldNeVVHa0VYeCtBSHNMbXpKWk9JUUZsN084dk1MakJVSVRPbDA2L1RNWGh5VjBmTncrVFZ4K3BjdkZ4U1hTTmdWQk1Ja2tQQUU4UkVoSVZHdnJDU0dqdGJYR1lBc2g4azFtUUM4eVZ1dzVNN05VSU5Bc0xDelNQM1pCV0VJNWVzczBnUnpDdE5ZSU5tQXdlSWpDd2p4MkJURTMxK3ZyRzF4Y1hNQnNPWTB6TTkwb044anoydHBLSWdpUWFjeWVtSmdoYm9POHZCQXNZU3pGYmRLRThWVUdybGU1WEFzM2pxUVB4UVdNUkwveHptQnhjWm1ibTBmcEFrUEVDTmpiWUtNQnU3cnFSMGJheUhOa0lmZ0pSaE5CUVVmRjU4aklKQ0pJZEhRRy9kcG9XRUlMOTYzUnhKZGZma21mTmlNQUhWaGJpelJCMGErL3hTbCsyOVBkbDVGUnZMR3hXVlBUa3AxZDh2MzNhNHlOTDBRSTRwMlRtRzl0N1VaRm1wdjczbXdBZDNkLyt1Y3ZBVXNvUjIrQkpwQjJHVE45bzZHaFE2V0tJb21DcmExRUxBNXg0OHEydHVqQjh1UGpzNkdoOFpPVEF3Wm1OcDZscFVVTEMzM015NW1aZm9QdWRieWtEK1VTc0lST2Mwdlh4UGZmZjMvdWtCa1VFUUVCZWxnRnRXVnVia1ZLU2tGK1h0SGU5cXk3dTlMRlJWNWNYTm5SM3J5eE52VDI3VkgyWUNSZnYxNGlUNUI4c0FYeC9mZXJ6UHdmaG1ieEU1WXdZZENpTmZIbXpadHptNjRSRVdReUxaZXJyS3BxbWlyUmpEVkc4RG1DdGM2TXIxOHNiV3hzMjl0TGpFa2JUK1BxNmtoOWZXVktTdHJHeGloN2UydHJlMVJVdW9FbUx0UUxlZ2JvUDM5enNGeE52SDc5MnBpYUU3VWZuTVRxeW5oL1QvVkVSMlJCVVlqV1EveGtxd0dhd0U2cXF5cEZJalhibk1kcFlPK3ppVktsdHJZQm5nbkZpNEdydU15SWZqWnV2QnkxVUUxODg4MDN4dFNjMDlOemlCZHJLLzFQZHBzVWN2VmtlNlNVNXpPZEY0V1gzM3k5aGYzTXpFd2h6QnZZMVlEd0JPeWlGSHpWRVBOdGQrcXJHdTNyaVJMMjlxZFA1OHJMYTVrcHhhZzI0K0t5a2NFNE9jbkt5dXJKeHN2anhtZUdXYUltak8vSUNBdEw2dXlvaFFMMnR4cUZBdVZJVEtDZnMvQmdvUUpidm50TlRjOGRIKzMxOXc5bjIvVTRkM2NuYW12TDJGdStmekx5cWpRSVpHOUUrWnFZbUgxMWM4d1ozSGc1YW5HYU1ITFZBSGh2dlQ3TDBkRVg1Z2NuUjB2ajlaRjZUMUY5YUFCZWZySFgrdll0TmJ5eHFDRDd4TzVOd3BjdkY4YkcycEU4eHNRa25QRXhjRzF0cktTaytob0VBZHo0WkhQTDBvU1JyVkxOelYxSThqa2NTVWxSTXRGRWNVRmlmVzZzc3cxL3F6Y0hMMTk4T1l1OVFSWXltZWJnWU1yQXdPQlhYODNuNUdSbFptYnM3ZlIvL1dMMDZaT2hRSFVFSEliQngwQ0VsYmEydXVibUR2cTNyeDQzWG81YWtDYU12Q0VQbVJLdUNRcm5jbjBmejFDcEE0aGtJaWM0VU9jbGViTGRpSmV2djZWT2EwTjlmVlZWNlhFYkkxSklwWnJ4c1pabmg1M2s2K0Q2VWwxNFdCUTczMFFoMnRmWG5KTlRzTEN3UVAvMnRlREd5MUZMMFlTUnpaUkVFQWx4K3NRbzI0SzhoS0htMzhPYy9kMzUydkF3YjN0aFIxSUVYajdkNzRDUGVQYnNLNWtzaEdsZ0lKeWI2MFVaQXZmd3haT0JKN3ZOakNBSTk3ZWEybHBMV2x0cjB0TFNRME9qNFlmUzB3dnBINzVHSUxtbVQ4b053U0kwWWJ3Z1lLZm0rdXk0NkVDbHIrMmoyZUsya3YrNXQ5bmc1U1V2ejlCenJBUzdqeXBoMmxjdjE3QlByVFp4Y2ZHbzFSTHVJUzh2MThORE9UTGN0TFlRejVZQ3c5aVlTSm1VU2tmQWFGMGt4T2Zpb3FCLyszcHhzN2NkdkhsTkdMbFNBQVRoNUNRZDdpK0d3WkwwNHRCQXdlS1VaclQ5VDJrcGVtY25ueFNKTklRdnhWdXJpelVQSHo2dXFHZ3VLTWhsQlBIczJWeGdvQlllWW14QUQvY3cxZWRLRE04bXZBNUVrSlVSUzE1RzY3UjRDZEkvZjcyNDJWRVVONndKSTZ1TWhvWU9DR0p1aWlveUJ6cDFLZEdmWlNWODNGcjhrK0swWDFwWjhUSkRndHhzQlhXWjBYZzNMeWVydTN2RXk4c2ZOUVVqQ0Q0L0FCWHB5a0xCYVB1ZkZ5ZlZQZFgvM0ZqdUx2Y1ZFdk9EVmVYVWlQNm9TQ3IwRUJKTjJOaUk2Q080UnZ5b1k0ZVI3UkN6cy9QdzRVUDlWY1JhSWNFaG5VMytlREkvSXBlSVZjNU80b3JzSUpzSC9PM2xHbXowODlQRnh5Tks1RENDZ0h2dzl3dmZuaXpIdTNORHd0MzE0b0hHajl5NHZxMU4yV1NIYzFQbE5qYkM0S0RnL2EzR2xUazZhU1dhOFBRTW9BL2lHbkhqaTF6ZG1DYSsvZlpiWTFvcVNYZEdVV0VKTVZWOXBjYkRYVWFlby82RTJWSmoxU0ZxaFVZb0p4dERRaEk5UFB4TFM0b1lRVVRwOUp0VmlZK25naWU2T1owVlA0TjNTZGYvU3VIclJqNlBkTVJINGc5dERiZCtocGNqclorUTdVUVRLbFVVZlJ6WGlCc2ZxWHN6bXZqdXUrK01IQzZWbVZrcUVnWHZialQxTi94bWRiSGEwY0c3dVNFTE5sdGFxT1p3eEM0TzRxR3FNRHRiWVhOaEFyR2xuMSswdmIxdlJFUWNFVVJZcUc0dEkySi90SUM4dS9rNEZiR0R6MVBNVEpTUkxiQTlmTWJTWEY1bjVRZjdtNVhkMWI5Z3RrTVRseHliYnhwK2pPMFRTS0NNbk9FNU1UR0RpRDQ4MEx5MW5ObFgveC9SdW5BSGUzZDRlTmdNRVFRMks1RkkycVZpSjFzQkxuZGlTNVVxZ3ZTYnU3a3BCQUwveDhuQlcvbVI1QzNDd2Q0Q2xUS1FQSytwVElPd3hnZlRINDByQnBzL0hPdjR2TGYyM3laN25SZkdWWUZxYWxrQnN5eUNlVkU4ZmZxVVBsTTNoQnZRaFBITFR5RnE2SFFwQjFzMUU5MzJuVFdmSXAwTUQvakR6S0FYVWdFWXpOTkJ0S1NXcEhtSjlINVVla0ZZVXBqaTYwc3RVV1ZseFcvUkJhNkZ5dzVYcXNsYlN6TmhlSVN4SjBkTDhXUmhwZ0tDNkdpaDJqM25oa1dyRDJNbWV4dzJGcFBJaDhWaWFpYlA0dUlTZlNqWGlCdS9QOVIxYThMNC9xMnlzbm80aVVmenJiRFFkTDliVm5vTXpEdzlyTjFjcVlXM2g4SEtSYUxWUUluUVh0RFhtRWtNQ1pMT3NBY1ArQTBSZ1hoM3B5WDFjTHQyc09tLzhSYmNBQ0tPdjE4USthUk1Hc0FVR3FoT0QzY2FFRmJJUzlEQndZZkhDNlFQNVhyeDQrb0RlL1BtalpIRDhCY1dGcEVXcEtWUkZ6RzRQSjhBSFFTcnFlb3hLeU9XY2hJY0laekVxRkxNc1JhUWFFSkkzczFUKzBFUTYzRUIreHNWRDBlbG5SVS9ueG53YkMvN201eFVTV2RiTGo1V1Vacmk0Q0JaVzZKS0ZSQk9nandoaEhTd2svVDBZdnBvcmhjM1BwUDRXalZoL0FKMWlZbTVxRCszVmx1SWtYbzZjbUVrWkpkSU0xRTM0bmxKY2NoMHVTYmRXeFRrcTJKc1Nab1pWRjYrRUFTNFAxR0VqZEFFSEFDS1ROUWRzVEdSRUJBOERRU0JaSUw1b2dGTGk2ajE4SzduTGg3SGdZcU1QbDgzaE92VGhQRWo4ZUVrRURWcXFrdGhZMktrdEJRcWJWeWNyMHhKaXNZVGhWdzJWNlFabW81enN4VkVob2FRejBBM1ZsWUNEa2M0a0VWRmphMUNIVFlpT1IxbytNMXc2OGZkVmYvWVd2cXpCSjB0TnVaa3hUTnQySVRMYzlTSEdhSTY1WEtWOU5GY08zNHM0NnlNTHo0Qk9Ba3Z6NEQ5clNaa0JzUkl3VUZVRmNBNGlkWTA5Y2hBRkdRUjRTNXlzQmZqdW9kY2NPbmpyYkp3SmJUQ1RpM1hGcWd5RlZhSGFFWUhpNGlUbUJpaDJzakI4UzVLSlVnMXlFc1FiMkUvZW4wV2ZUVFhqcHZ0N0FDdVNSUG4zdEdQQVhFU3RkVlVpNEt6RTVWQXdPMTdlVkZMZnhBbkVlUW1KcUVCblBXWDhGd2s4Q0o4SGpYM1JpNzBIUm1KbWM5Vjc3YWRFQmVRUStBUmNRRjFMTm1DS3FPMzlsZklMdkZJdG9ERUo1bXducUc1UUoreW04TjFhT0pDTitHaG5JU1hQMGtiWVJzOElnOXdadDE4cFY5K3BBbHd4ay9pNWtLOWl6Z0NpV0RMWms0NFkyQTJTZG1wa0t1SCt3dkpscmtoNGNLWUhJNWtwTzFUc2dWRVdPRndKTmR3bzlFVFlRbFR5NjlERThaUDRWcGVYa0c1VVZLVWptdDM4ekdWTU00TWVuVlZmdURxUWd0QzZDWVpHWXFlS2ROVWlFUjZkMkdCUUlTS2RORFBCeFZwdDR6U3lucVU2bkN0ampFd08xR0FGRkJRUUJQazVlYmo5UDZHL3p2YzhrbFA5Uys2cS80WjVTNDJicS9Wb1k2bGtwTEJmdnFZcmhjL2l2a2RGN3FwZkdGaGpZTzlEMm1VWEppcDRMcUs0TjRuZTUwRC9JT0lKdlI2TlFTUm5oTmM0eVA1Y3JENnpZdTV3NzdLd1JBL0tLTkVLR3FYU1lZYjAwbUZ1VGlsd2VONHB4VWVHVkpEOUdyU21aZkxzMVQ3Qkhra0pNbUVsUlh2Z1JVdk9mMWlLNVNaQlphd0xNbVZhOEw0Y21Oalk5UGQzVDh0aFI3QmdNclRUeW1IZTE5OW1BSTdPVGxTQVNKSHF4enRpOUpKZlYvTXRwQ2VUNHJmTDcrWWJuclNsTHM2WE5IVFdWU1VuNFNjMUZmQ1Z5a0R3dFVmTVYwYm9EWThESjZBZVhtY3BJWFVQK0lqZDIvSEJ3OTQ2VmxKOU1GZEYyNjhZUnU0Y2swWXYzaGxRME1IN0FIM1FNeURqREkyT25ScEpneEd4WGEraU9mc0xKYTdVRzJYaFVxL2pZM1JxcXJTdWJuZUkyVzh4NVhYMzB5LytMSzNKTWNGK2VuY0ZOVlJEc0pQa0NlbkVSOXdjdkVPamZ0L29FejlxUjNITXkrdmhENithOEhMbHkvcEUzZHp1RnBOR04rU0RVaWxFZW9BcWt1Q1VDSldrV1lsY3UzNmhYMFNHbVBOc1JYV2lFVTFZbkZPWnNhYk44dFFocjkveERGQkhQSHQyNld4d1hpUlVBV0ZWWlduSnNaSG5kRlVCY2JINnJ6NFhLSUpNQ2pxZC9hTy9KR1JDZm9Rcng2V3NNTHkxV3JDK0liTGtaRkpHSjRaNXdJUGIyWEZKNWxCVmthc2k2c3ZNVkp1UWJDYUsvYjM4SG45ZXFtOXZUWXhNVm1uaXpQUXdYSFcxNVlHK0tpbUlsVHdNWWxCZ2FRb1BaRUlPbndmbThSY200N2g4S0phNzdKR2tWcjdpVkFzcFkveWltRUprOHFCSzlURWhWYTRUVTR1Y0hLU0lyc2tYVmI5M2ZsdXJsNk1uVlJxS2RGRWVNS0hvODBKa2I1K2RYWGxTVWtwZzRNdEowN0tBTisrWFFIcDU5OHVaaXRWSG5ZQ2FLSlVKUEx6OVNOZG80VDRVYWpFUitLdlVnYTZ1RkFOWDI0ZTN1SFIwdkpHK2VCTVhIVGFIM3hVTmsxTkYxdFEzVFJZUXVBQXJsQVR4Z2NPWkpjdUxvbzRmUnpWT1RrVmlPSXpXZThTNHZmcDNMQUlObk4zbHdkSE9oRk5nUEtnVDEyNVFvVWk1TldyUnk5Zkxod2NUTEc1dWpyUzM5K2NscGJpNitQLzNldjVJNGw4dStqT0VhSm1pZEVvRmtMbGVpM2RockU0WDRrZ0JWYzBPbGdFNTJSdkwwcks4cEg1aWVHbDdPd0VLVmxCOEJZWkpTNFNtZWZtNXBXM1dGakkwdnhYcUFuajJ5N2IyM3R4ZFE3M1UxMVdDMlB5aFhGVmtGcFpYMktObDdDVHRiVWdPT2EzakNhU1V1TEd4dHBoK0pxYWtnaGRVR1FzTHlVOU1DTkRtNW1oVDAzV3gwVHAwbFBqa0ZSU2paV0g5S3BUNEZkZnpZZXJ3OGJidENxWnJGOHVkdU5RYWx0ZHJNN0ppdDljb1dhY0V1SXdRbUovMnpXcUxhNEpkbkVWNDZVcVNOQXpydU5KYkI0OW5xWVA5MnBnSVlFRHVFSk5HTjhzRVJhVzVPNU9kMjlPOWpydmIxWUtlSHpTVHpFeFVpd1dCekNDQURVUmJyQXhzc3UyOWpMMmRqQXh5NjZxUVRVOEhMZStVcGFURmRmVWtNZG9vclcxSmtjVEJFMUVxYVNCTGtKbkc2cUZ0TE10ZDMrcjhmRTAxZFNOQWdjK3c5WldTTzBuMTZxc1NWelRGdVF0RUVFV3lnQ2VCNSt6dG03S21tWEd3MElDQjNCVm1qQitUZE9WbFZVYkcxRnlJajJnY21VdUNyYlJobEtUTmNEbWhxeVFNQTNiOEtHUkFsUWNPVGxaM1gxbFBlTlJoVFhlUlhXODl6NFE5Lzl3clR0elBUdzlqeGE4OWZVSm1neWcrdENqM0VUV0QvakpmQW5aUHdqUGhNZWg1dDhqeVhCeEVaTTllSXZzeFBJSGFVWE9iaDVla0lVemwwc2Y3cFhoN3QvVHhjakpuMEI5ZlRzVE9BanJhOUtaQWlRckkxNGJReGNkaE81ZUh1bDV5dUx5aFBMNjBJYnVnSW9XSDJTQ3VwU1AyWjhSK05wSUJBSS9MK21YejZqMTdaQmtoTWpVRUFUb1pTZlF1d3R6ZmFnSjZUc3JlV3NMY2VOZGRyTkQvSzZxZjZndWRCSUpQUEYxLy9DUGNFanUzbzU0cmt1eXRyYjJmdkNBejE0OHoreXduTUFCWEpVbURnNE82TDk3SHJUYVZGUWNSQUhneG1KU3RJNGFZRWRlUm9UcnRISE95ZmsyaVBHbERVSVVoeWc5SWhJL3pLdnlhT29Ock8veXIybVg5MDNHUUJscFJmWkVFS3FRVDJ4c2VOTTYvMEtCaU84cGh5WmlZcU9hQzBNaGlIcUp5TTFXOEZndEtaUktGWEkxSEJKK1luRlMvWEJVK21qQ3Y2RTJReXltOVdmTDhYUndkaVBQZmZ6K0RJbG90VmZZcG1rNWdRTzRFazJnQ3FYLzYzbFlYOS9nY0h6ME1kVFFOektHZHJMSGdSbFhEWXJGZ1NsNTlsQUFYRUpCdFJjcERvbXBPb2JEa2YxaEN4NnIybVRkWTVIWWlHelV6dDZyUUJ1NEVDQkcwc0J6RXMzUHRrVkZCNDMyUmtFS25uWlVWOW1TV3BMdUkwMk1qMEtWaTU5QTRqSS80b09TQi81SklxR0xYbWdDSk05QmUwYzNHeHNod2h4OTNPYUc1UVFPNEVvMFlmeE41VW5GMGRxUUNFSEVSdGhOZE51VnB2M1NUK1pDcWxCUUtGVG5WcmkxREdocTJoV1ZMZEtCNlZoa0QrbkZsRmZYcDM4R2xjQlZRQzRRRFJJTGJIVDNkbkRuU3BhQ2ZMSzhSVUo3d2J5L1dPUXRIMjJQbW15S1NQRVNabmhUVGVQdFVuRkZkTWplWm9PTGkrL01STm5lK2c4VGltclN4V0laRVlHakM1ZXRDZUlxS2lvYTZlTTJLeXdxY0FCWG9nbmorNzMwK2l3T1IwSTZRbjFFQWtUM1pMMUxmZzZkYjY0dDFmcEtnMkVTdUFTNGdmNnBtTjZKYUZRRWNBeU10Y0QwWW9maWVqNmVCRVg5enNxS1g2U1V3L0JpZXdGcXptS2hhREFwZEZYak02RVNlM01Fc3lsK3c2TXhNUnJGd3dGcXpFNUtValF6YVJoRTdIQjE5U0g3ZE9hNlBIaHdsTHFHNlAvYmpzTUxDTkRUeDIxV1dGVGdBSzVFRThZc2NVckE0d1dHYUNKUURjNE1ldkc5WExvcS8wRWk0RlRrYzRtUnhvY3JBalZoTUVsczVwK0thcjNydWxSd0dQQU54d3VOekJLcVVVc29zNEltRUNPZ0Nia2pwWWxTUDhWYWhBSXZ3N25DVnFsNHJDdHlNaTlRSktIVGwrSCtRamN1dmZvUk9OaGI0T2hJMXgzd045WTJmQ1F4Y0Q4UVhGajhiejBGanFpUHJpSjhXRlRnQUs1RUUwYjJoUzRzTE1JaDE5ZGtFSk1vNWFydVpqOXJhd0dUWUxZMEZvVkhVbjZDWVVxQkxjVEIzc0ttcTR1YjNFa0lCWUNJRkNrQ3lacFdPVjBaTXQ2bVRmQ2tvc1pja1NZclc1TVNTNlVSaERnQVptd21OSUdYeUVqaXN2N01GM01kSFBrSVdIQkxTRm1pVWo5UmFQNklkMXRhdXVtak54TXM1TjQrYkpoZkUxQTkvWGZQQTZsQ2x4Ym93YlJJTFpIM09UdjVrSmRnZmw2bWk2c0lidHpWdzltRHovRVVjbkQ1Qm9aeHZVVjJJTi9IQm1FK0tPcERSaFBZRzhrWUdpU2lZRmZoY2pqbElTQ0kwVDRxd1NSYUVUc0kxeDdTVTlSQkQzZFpUaGE5UkFuS0VPekJQL3hqZUFXeHpOdkpXVWlTR0FRczFEV3BoWTV3UXZuNWxmVFJtd083dTd1VzVpUUE4MnZDK0FRVHlRU2ZkelE3UXh0T3plbGp4bXFEc2ZyRThHZ0JZM0kyRWVEVjJ0L0wxSitLNVE5OC9QN2tGMHExVCtEckJRS1JUdUxqNTY4WWE0d2dJa0M4Z0N6STh4cXhLTkpIUVhaT0JtSzVjVVhNekRDa05TZ3VmUDMvaEYxUnVhcW5HRWtNbkFRMGdUSVljY1ROM1RzMDlNSjNmanNETno3bDYwU1lYeFBJbU9oL2ZCNlFUQ0RMSS9ZQVk2T293ZG1rUGlSVUIwUnFJaDNneWR1SFExRlprTVlKUmhiSDZXSlBqZlQzVjhvblM2blpIMFFIREZHQ3V0a0tSdXZvT1NNb2V2SG80dXpGOWt5K3Z2N3dRTmdWTk9IQmM0TVVtbm9EUUdRd09lVmNudGhlb1FpaGovN1NzSVNobHlmQy9Kb3dja1R1L1B3ajJLK25nNXFwUnk3WmVKMHp0aUI4TUJhU3k4TDl3ajdKS25OK1Y0dFNQZGZ4V1orelJXREFZSldNWXlXWUt0Q2d1RUFhOFRCQVBLbWkxTENRNW9md2thZjNFenJTYTlOc3IrUU10MzR5UDBLTjV3dFFlaTJNMCs1S0hhQ3hkNlNhcXFBSnhDYXlXeHdBRWxzOGtTZ2ZlSHFhYlN6RmphK1hleHJNcndramk0NnFxaVk0YWpJNmNtNVlkTGpUa0tiL0JCWmlvanZJNVNxS2F1VGx6UkpvZ2pST3BCWndtRFlyYmRMdnNCM0ZDT1FDczJGTGFabUtZeTJBTXdoMEVVWndoWHlPZ0dpQ21pQlVFQ2hYeXZQRDZEQUJRaERRSW42UmpQRUh5UUJkRUZISjFjTkpIdlJIOGtNZ2NsczhJczFFa2tIL2djdkIwdG9rMkRDL0pzNWRTWjlBcTAxVktTbjNBRUlURzR0Smhla09CcHJnY0NSaGNSOVJiUktOSXBnZmZnTHNtNHlCdDRDUjhBaVZwQmM3NGdPZEl4SElNRFNoNHFtVXNCeWVNTTFMSkhVUUlNMmNVSW1IRmVLNlJQL2EybkJIVzBGMzBkSE9sK2QwRDhmOHhTSVZtVXVDUjRtWXVuYzVxQXI1ZzZPTEszWUlIUVJHL2c0bExsRUd0SUkway80RGw0TWwzUGZyTkpoZkUvU2ZQZzljcnJJZ0wzRnRJV0Z1U05oZDlZdlc0cC9rSnY0TDdNRU1vejNjYmNWTFdJTDBjb0hOZlVHSnVWYklMVkFYUUJOdGd5RndFb1UxM3NnRWU4WjEwWWtpUDdYc2NLMXViekJ2dXlwdUkxbFRJaGI3T1F1OU9aVG5zTGNTWUcvVFhWU29JdHhhcGxZb0tNaWoyOGVnUlNJSWUwY1AvQ2hQUWprR3VLV09ZYTJUaTRDMGlVRWYrQUQ5Qnk2QkcxODkrV3lZV1JORzluUXNMNi9nNUE3MjBrc0s3YXprUFo0T21ac3F4MFptL3NYQlRwZTlnd2lXZ0FMZ0VuSXIzWkhySWE2VGhtMFEwWVMwYkVJdUVJcklSNUNRZGhRYUtHNDM3cytXN2Zaa1VSTEpDRjJMVUR6Wm9wZXpNZUJ3ZjZHMU5TVWFLeXVCVFAwWi9BUXFHc1FtL0J4a1J4M3F1MzRXYUlKajcwMy9CMU5obWZVbkcyYldoSkhUQUllR3hxZ0xicTBPeG9pTmllenZ6b2MrV3B1eTJKcG9heWwxY2FVMEFTT1JSZ2g5K21jMTdRb2lDQkEyUXhwUjFTYURrOGlyOExhMjVsZlZIalZVRzA5b2tjdy90cmVYQkVWUzdnSFpaVkt1RGRTQWNxT3VNMGdnNFVGOCtLMnd1RDg2dTF6V1QxaGFTL1p4bUZrVFJqWk9JTUVVaTZnNWV0RVJZWjcyUXBzSGxOTW1aRFFScmc1MWRhZmJzQ1hLenhIVVEySXBoMEcyc0JtUitHRk1Falh5aFpuSFlReEpzWU92dUxoUXE5N3crTktjTWdtS1Q5Z2U5UVYyQzgxQmJTRTZmbGFSUHdsZVBSUFJQTDZFL2c4bTRlRGdnRDVURmd3emF3TDFGZjN2ejBSeWNvRStSbis0VXIydTkzK1lFWUM2WUtoWXc3RjZUeE9PZGlKSEowK29nVGdKNVB6T1hCZTRkRVlLYkhxTDdKRDlrUyt5K1dqaWFLa3JocVJUZnJ6VDZwMGdxSEpVR3huVlBScVRYZVlLZjRCMGxkbHRiWWRTcXFCcVlEeEp6cmRwNnRGSVpTcjZQNWdFWERQMG1iSmdtRmtUWDMvOU5mM3Z6NFJHRSsrdkNFb1dVNFBoeG5vaXFRVkdKbU1qM2FpSVRrWllRUzQ4QjFGQllhdytRVzVqNitYcVFWMjdBUkVmZVFvNVVJWi8rRWVNMlFqdDdEMDhQSTU2czhEK2h0L2cwV0FaNWQzMTR0V0hNV09kTmloRVM5UC96ZEhCMjhsUlVGYVoxRDRVaW9JV3lTelMxWTdoY0R5QkFyQmJaZkFmSlFvbnBMR2syU28wMmo0bExaNytEeGVINVVjTmdodlF4TUxDb3F1cnd0ZFZ2QkFnbnZHVHhLbmxRb0d2ekZ1U3g2ZGFJVW5pdVQ5UjVNWVJyaTNWekV5VU9UdjVURStXUmtZckhaM2RVQ0o2Q3V6dDdEd2dEazBNVlN1Q3BCeFFCOUFOb0RBOE10Yk9pZzlnK1BieXZ4dnZzbVdhcEFqaFBNcUx0RlpXdkFEL29QRHdpS0NvajVHbW9NUUY0UkxnSnhCQmtMcGl6MjVlam9HNjMrTkpWT29uU0Z6Z2pYcDZtdW0vY1VGWWVLM0J4ZzFvSWpFeDE5R2VXamVpVXliV3VBalN2S2h5TVlzbnFoWlRnNlNSZGNKc08rM3BOdTlpUVdkYnJvK0U5djhITzIxMUZVb2ZxUS9NU1kyUnRPSWhHVVNTNGV2L0ozd3hLeU9PZkF5RTFXZUgrTzlXRTZDOEJVTnNtUjBPQ0ZRNjJ0bDZodmovMGQyTnlrSmc4c2prajNMS3ViQTZhUXNwYXhMRE4wQnFyaDVIODByZ09SeWN1QnViYS9UZnVBZ3N1WVhxT0s1YkU5UFRjKzRlOHA3TzZLN3FNQjVIa0NDV2IvVlZQNWxyRnpzSW85N0ZEdEpOdWxWT0xSYURKeFdsS2Ryd28wbWtjOE9pZzYzcWhzSmZSMGZySHJ6TFRLRVBCMmN1bmpERGVwZm5kSDExditxcStxZlc0cCswbGY0djlycEVrNk9sZko1Q0d4WVVyNmM2NWZFdGtMRTZpTHlTcEpsNERxL0Fic3FFK0J5Y1BPbS9jUkhzNys5YmVQRnBnT3ZXaEU2WG5wQ2dIZS9RYXFUU0FFL3BzeTlteUZqN3BlNHFPeXUrOVFNNlQ1eUoxM0FkcU9GM1dSbXhhU2w2c25GN0phZXI3dFBSamovMzF2MEs0aGpyOWMvTlNYUDZZUWtiWmtJNlNLWnNQQnc5R3ZvTEZoY2tDZ1ZLRXB1UXlaSnYyZHBSTFZRR1RDOTJRR0JpeHVnUytvVit6SFcvY09QRXpzNk9KVGRabmdnemErTHNUbEZrRXRiV3d0bDA3YWlTR2tCYmxKRkdCRUVvNWZ2WldRbUkvY2FDWk80T1lqeUoxbW1acGthd3FWSTZNK0RKWHM1eWI3UEIxVVdLM1RKYkROamNrSVhvZzRLenRDaVpEUElEQzNLcHUzVlFtbUFOdW1RVFVZbHAwaVlVK0ZwN2VsMzQxZzBXMjlGMUJzeXNpYk9uZGVUblY0WUc2VlkxUGxGdVFyRzdiR3VMbW56QjhPQmd5c2xCc2poZmViaFcxeTRWODF5cGFUbUI2bUNtT2dXcnlxS0lEMkM0djlVSTAwckU3MldSYk1MVElGNUFXdzIxR1l3dkNReWdlcjlBUjVlamxRVVl3a25BZnpBNUxDSHFIWGQzSC9xZkdBZkxIQjV4THE1VkV5SlJjSHRDK0dPMXhNbWFIK2dYL3VyVkk3WW13TTZPbXJhbTdJT1prbnFKU01tbjdzbWdrS3RKZnpvaFd4K0VwRVU4UERTVXZkRmdYVnlHcUVFUWdDQWpCd2RxTGlqb3pIVWxIZkdWTFZJeXFCT0VoL0RnY3hnMWdOREhnd2U4b3FJSytwOFlBVXRZY2NZMFhKOG1KaVptWUlPRkVHbUZTQlRpS2lpS2lSNGJhMmZVOFByMWtyOS94RmRmemZkMmwrLzJaWmVMb0FscXlwNkh1NHlzQ3dBemI2N1VIdGRFUjBzT2RwdVpScmRxazZXMTJldllNVVJ5Mmx2N0s2U2MvZDM1UkJDZ0I4OEY5V2R4UFo5cHJVSXVhV3ZucWZnaHV3eUsrbENpL0J4T1FxN3dOLzcrb2w5ODhRVjlSbTRocms4VHVia1ZqdmJpNGRFWXRWUTZxQkNQYUZUNm1IaEdFejA5RFdueENWKy9uR2x0S2RscFNNcnlGcWw5cUhEZ3h2VmRmVnlOa2hLWE9NTEtjVTJRKzNqVlZLYkI1SThtL1ZCdVRQVngyOHYrbHIzaTNlNTY4ZHBDM0dTdjYwRGpiOXJML3k1Q1E5VXBoSEkvTVZsK3BHZGNoeWVKdVRhS0lDczdqaGU4QXBuMmd5ZnZwTU5kWFROMkR2R3RGZ1J3ZlpwUUtuVml2dS9EekFDZG5wcTZpVFJUNksxaU5KR1dsajVZay9uMis2V0MvUFN0UWwyYWwwam5IM2k0WFd0dHhaL3FkZTJzL0tDei9PL2JxeDhVWnRGemdSaVNtNitRYW1KMmlEOC80ck94bUhTaW4wQnkrbmdxY0x6VGlxekFTaGdVNW92WVVkNHNHWmlPSlowYVhqeUp0N2VmazVNTTc3cTVxZVR5c0t5Y3pMbUhvL1RmT0ErM1hSREE5V21DeTFXRytFcUhwdVBtQ3FqMXNLT0Y4c1hGQWViK240bFIrcmFhdERkdmx1SmlZemFTTlRvM1lXd0kxUzZKMkRIZDd6WTk0RDdTK3NtSmZrS2xESVR4eUhqOGlXN08za1laWkVIR1JoZ1E1U3M0UFVMZE1ZcXMwUXlxQWowWk5aUTFpZ0xET2RZMkFwTW5jZHdCUVFEWHB3a1lJRVVraFJvSTYvTXlPenZyb1lhVUZLb2lMVTFMUVZHZ0RnaFBTRWhhaTFDRWM0WFpzZHFkbFR5eFVOaGQvVThkNVgvZlZ2eFhsVmsvelVxME03QTBXVldaekFZbWQzZ2pDMWNjSjdZdlRxcVpXd1J5T0ZTYWlab3pJdkZEaEl5eUpuRjlsNzhMMTBza2tkTkhmRUhjRFVFQTE2Y0pGeGRGR2tzVHpSVUZjWEZKZW4yQ1hCNEtUYlRWVVJmNjlscjk3a29UM3BVN0N2SVRxWVFBYmdDR0pEMlpNRHd6YlpBaE1lM3FJajFKNUZ3R3Yxdk9IV2ttUEJDZUlIOGt1U1FZck9OZ1MxSnlKbjNFRjhHZEVRUndmWnFRU01KQ3ZPazdhNEF0aFpscWRhUklwSTZQVHo0NG1Db3Z5U1BqZGZkbnkzcmxZbWlpcm9TNkRaTmMrdDdjUGZab1RSQlNnQlZCOXNhejZlQWdjWGJ5UVRrcWt3YmdpejUrZjJZMGdlSUNXK3JyMitrak5ocDNTUkRBOVdraUxDeUo3MFF0aVQxWHBCbHYweW9FS3BWQVZaU2ZzN1EwVkZpWWg3bzBLNFB5QVh2RCtVbGVRaDhIUWJhZUNoTytJbmZHbk1jMU1keGZhTHdtRUZsUTF1TERTRXZ4MHQrUFdxK1owWVJmR0RWcTNNcEtzTHg4c1RXSzdwZ2dnT3ZUUkVVRjFlQTQ2MDlQMWlQZW9sZXRTSS9RVlpRWDlmYzNSMGZyTjFkcWQ5dlNrRXk0MlFyUzlaOGU3alFFeUk4U2lPT2E2R3lqN3YvRGRhV0trUk9IenpBY2F2NzljT3ZINUFZK0RiVVpDRU9rWUdFMDRlcEJ6UzZSeXlQb3d6VU9kMDhRd1BWcFluMTl3NFVqZ2c4WTY0cWNxUXlaOGFPRFNMVllQRm1iV1ZWVkdob2EzZHFVMTVlbXhXZWdDYVNUWXgyZjY0TC9SQWJKZ2NjMWdUTGtuU2FvWHBJVDY4Lzl6Y3JWaHpFUFIyVmRsVDl2Sy8xcnRjcmI2dDFTckJXbEtlUnVJRVFUWkg0d21KcGFTQit1RWJpVGdnQ3VUeFBBeEVDUHI2dEU2aUJJOHhMVlMwU3JHcCtOTEYxUlhOeVRyWWJFaEFRSEJ4LzRpVFNWSDFRQ1RkUlV4S0YwTE00N1dyT21veVhIUUJONTJkUWQ0ZHhjUFZGL2RwVC9kTExId1dENERPSGNrSEM4MnhaK3dvM3JTMmFIeHNmcXNDdWlDYW9UM05tTmFHSmtaSkkrMXZOd1Z3VUJYS3NtS0t3dGJlUkdyYWVFYnJXVzdTdy9XbGhZcktsK2IyQ3RwNE5vVUNHMmZrQU56SVNCbVVsYUlMWVlhQ0l4UGdxR2xQbUlOeCtuRzl5V2dTSDhSSC85djNkVmZsQ1Qrdy80Y0ZhU016WkNHYVFvOWVEWms5UVNWQ2dpNllNOEQ1WndSNFdyZzVrMVlmenRXd2lRWkV5Tkg5MEpjbUdtZ21OTnJZQU1DNUdtU1dZdENoQ2FZQzhyQTRhSGh1S1RNbDhKUE1wcHpSSWdza3NvZ3lRZjVOWU5LSEZKM0dIbzZlMDdPenRQSDlaNXVQRmIrMTBwekt3SjQ5Zk9KZEJxVXc5MzZCdEdndms1Q1JJUDhjZ0FkZlVUVGJBSks1S1NnU0dwSi8xVlN2YnRZazhqRWt3T2h4cVRBVUlUMkQrKys4Q0tCejhoVTM4MlBUdEFIOU41dU50T0FyaEpUYXlzck1aRXY3ZEV2c3pYSjBMcjl6QTd3TkZKWkl3bXlGd2RnNDJuRVlHR3VmRVRORUhxVXBITU1Tbkh1YmhhVFIrVEViaU53MlF1QkROckFwa1hmZWFNd05EUVdIUGpVZnNqdFNTSU5hOGtobG9YZ09za1BxNkpubzVjNXBaL2hEQ3E4Wm9JVkFjenkxMUFIS2crOE4zTXpGTDZhSXpHTFJxQmJSck1yQW40VmZyTUdZR1NrcnFaU1hvdzNPRjJiV2V6RGtZYUM2VVdIK0k1OFp1cXFQRVRiRUlseklVT0xzMVE2OXFjcTRuUjlqL2hjV014eVVmaXo0empKYXZoMk5nSW82TXo2S081Q0w2KzZkdEhYeW5NckFrakZ4b2dpSXVEaFpxSmtVQWtFNDZPd3JVMGYyaEM0ZVdMU01HOFJRaE5lTGhUZzY4SVp3YXBrZmhuYXdKUzY2NytCWjZnS2tFaHlveTlJL01Ec0RlVnlwUWJ3ZDNHa2JmR3c4eWFNUDd1WDRCT1IvVm9NRVJjQ0F5UUwrWlE3ZDhLTCttSm1pQko0dDU2eWRaeTVtZ0hOYTBERFBKelJkM0IvaVRod1ZiMXpCQi9xT1YzeUVCUmk5cFlIeldCRTIwaHEzQjM5Nk9QNW9MWTNkMjlxNG1GbVRWQm56QWpzTEd4R2FVN21xVUQ0anJPU2d0WnF2V2pOT0hoYzF3VEpDdGtYaTZNcTVCL1lBdDdBb2dCcC9wY054K25JM0IwMWRteVYwOUR3WUo4QWc0R1g2Y1B5Q1FndDNqNzlpMzk1KzhLektrSjQ1ZlpCc2JHcG5LeWpvb09rdkgxZCtmdno1WkJFeUhlSjJoaThkMWFoZmdrZVlsOGd2dnVYclM0M0puUEdKRGNTWFoyaUQvUUdjVWV4NHV2SUk2UWNYdlQwM1AwTVprRWhNdGJNVFBZZUpoVEV4ZTZCM1Y5Zld0TjVaSFY2eXVwd2ZXVXZiY2FvQW10bCtRMFRaRGhNeURDQnhrRGNZWW15QUR1eFNrTmFoWm1IQytJcnlBU2tmRzlsNzgxT2RLTFd6cHMvMFNZVXhQR3I0d0pwQ1Jua2lxQWpKZEpqUEZ3Y0tEdnM3SWVGNURnS1NvdFNpWXZHUkpOTUhraUNOT2VyUW1HVmVXcDdMdEk0aXNRQkprSGdQS0hQcWJMQVRVWHJncjZYTnhtbUZNVHhrd2dacUFKMHZaMUpxek1SUTIzL21GaFRLNzBzUkh3ZUtRSGF6TTNJczFMbEpOR1R3bGtTRWJRa0hZTDBsbEtOTUhuMGN1Z0hpY3planNySTViTVRpWkVISUVmUXA1aGJTMUlUTXlsaituU2dNTjQvdno1YmM4d3pLbUo4enZBV0hEalNzbUFPWlFNT3l0NTNoNXVUS3E0MDVDVXh4ZEZoYjAzalljNEZTZ2dKNG5xNnlJOTR5UkpaQmVvRE1sZHlDZDdxUjR2TUNveWdqMCtUK1B2anRJWGVRYUswcUNnR1BxWXpBUmtHTGU2SkRHbkpveHZ4RVRSWVdORHpmQkVVVERhWWRWYjgyKzJOdDdhb00vR3UyeXhjVzh3cjF3a0NsYTkxNFZCWmhMenZYMVM5WGFIT3cwOU5mK0tseWRxWW1lMTRQRjB5R2pINS9NalBwM2xmei9hL2lmNElmYnl2S0JhWVplUnBoOXUvVGdxek5QYjYxTExFWjJHcDArZjN0SlFZazVOR045Z05URXh3MVNHa01WSXR4OU15eVNWaDQ4cUswUWlpZmQ3N1pqeHNUcGM2Sm9BWG55MDkyU3ZVMS85cjFGbkpzVlNTMUdkNkNmbWhvUndQN0E2ZWNsZXhIbDN2VGdxOUVHWXhtZXM0MEZ6UXhhSEk2WVB5OXdnb1lRK083Y0g1dFFFZlNhTVFIdDdEenN4SkpQMVNLSkEySzd3c2JkN3J4bXFvalFsTTAyYm9MTUpWRG0zbC8xTlcrbGZEemI5TnhrWFk2QUo1Q2dRUkcvTnYzWlcvTHkxK0s4NnluOEtWNEVjay9uQTNrYVpQc0pKNGN2RFo2cXlmNDQ5ZEhjUDBrZDJCYmgxb2NSc212anV1Ky9vYzJBRVNrcXEySzBGOEJBd0RGTmtncU5SYW14aG1pTEFwWVZxRkNhVnhlcVE0QkJTcW9Ea2l5ZjZpYzNIcWV3Um1tekJnY1Y1Z1RKcEFENkQ1L2g2bUZsWDJ6OFJ0eWlVbUUwVHh0K0pHa2hPem1GM1VpRGRnMm1abCtCQ1B0VWZ4cTRVUUlRYjJJL3RZSWdtMlBmcU9ZMEdtbWlvelNCSzJ0OXF4Skh3ZVA1WGQvODNCZ2dsU01NdHZ5b3hteVl1VkhUb2RFbk1LRHE0ZXVRS0JuYmRiVXVEc2RrT0h5VE5qbXl2UURRQk1sdE9JNW1jemhBU0lVbHVjVUVpZHVMcG9UQlhLOFc1Mk52YnMvQnVWYk5wNHNtVEovU2ZOZ0xxQUYxcFVUTHB4VWFxaUhEQTdnUUg5OGNMdVhZQ1p0VWlRb1FQbUo5OXU0MmVEbW80blRHYUlFUHUyQy94cmMyVlduK0ZBREZMd0ZjSUJCcjY0SzRGaDRlSEZ0c2lialpOWEtoSFZDSFhsT1NyT2lzK2dDQTZLLzYza0MrTWlxU2FFeGdlcnRZSUhZVk1BWW5pYzZqNTkzZ2lFMVBMQkpDTklDNTNvZ2wyMndNOWtmQ0hHUUNFN0dRRkpNMWZBejBaem81VWh3aWlVbmhZZkhOekYzMTgxNFZuejU3ZDJYcy9HWDhQTUFLeFNOMVVKU2ZsWW4vRGIxeGNmTm0xSXFIU1dZanQ1RG5xMWU2YVh4NXNWZGNVL1BwRVRiQk5QalBnaVVlbUNqMk4rRlpxdk5ES2lqZmQ3NGFVb3JHK1RDcTkySVFmczJCM2Q5ZlMra3JNb3duajcxaFA0TWIxS2MzOHNMZnVWNjNGUDJrcC9sdVk1L2prWUMyZmFuc2dwY2ZEVVNtNCtqQm1vcHVEb3BUNURBa0JJQk1hSUxMeExtcVpYQlNyY0VJblR2ZEFMYm84RzhHeDgwWTVTbjRDS1VWOVRZWlNHWG1sUmVrWnNLaDYxVHlhTVA0bXN3UXVMdExoTHNwYWk1TnEwaEVGcTdETkJtYjQrMk43ZjNmK3htSlNUODB2dXlvL2dJREF2dnBmTTU4aHZXSWd1NnlBRHFDZU0vekU3bm94Tk9IaTVHSFA4Y1IzV3lvZEYyWXE0Q3JhV3NvMUd0T1hUcjQ4VUs5YVFpZ3hqeVl1T29RZmxtQzhQY2tUWVh2R1pvUzE4ZFJ3UzlJN1NwSURwbG1DNFltYXdJY1JEcUFrWnN1SjlQYWt2c2g4VnlZTmVMTGJMQkpwSmlabTZLTzhDVmhDS0RHUEpveHYxU2FBSlppbEtzbDhMSU5hRVJ3b3B4YVVZVGRqSENjS0I3WmRDUkUrVGd3WkJwUkxxZGdFRXRsUlRXRUwxWEFWcG8zYU5TOE9EZzV1c0NveGd5WXVtbUFDc0FSam04dzBhczRudTNBZ1hCcWkxaEU0b3grY2tOaVZyUWtqQ1JHUTcrSUpYaFlYSkRZM1pNRlZTS1ZoOC9PUDZBTzlVZHhVVldJR1RTQTVvditFMFlBbEdOdkFFN0JmSG5HcndZbERyY3ErOHNnd3JMQko3UHJPbkladm5VM3l1eUFaeTRQZ0ZSc1RpU2ROOWNWYWJTcDlvRGNOaEpMcmIrQXlneWFlUDM5Ty93T2pRZG9RR2R1YzFqaXQ0a2xoczlxeW83RzF4MG51MHNOT1VkbXJJSjdCOEJCcTNCNGhJaGZDa0pjWDFST0xvT2JrSk8zdkg2R1AxUUp3elNPNHpLQ0pDODM5SXZCd2x6SEJBcG80Y1dYa2c2M3FXQ1hsSjZKQzdjYTdiRW1ydzNGaVYvZ01HVmRIT3IxR1dqOWgzajJSTTROZWVBeFcwOU5EUUZMZlFoT2s5RTFOVHJxUnRvb3pzTE96YzIyM2hER0RKdURmNkFNM0dqQWtVM2VvbElITUhjTU5XS2FscG9QS2ZVOWRYeDBraTEzbVpXa2ZUNGNNTlA1bXVwL2JXdkpYMEpEQnN0eHNkbGYvQW9LTERyTmxORUZTQ3NRT29pM28xZHBhWU1MQ1ZsZU5KMCtlWEVPR2NWbE5YR2hjTGdNUGR6bGJFeWNXRjlzck9XMnhkakNZcmExM1o4WFB5S0xKeDBtR1pKSWV0WWVqMHBXNUtOSUtmaHIzMWt2NjZ2NGRIaVVqN2pOR0V4eU9lSCtyRVVsSm9KcHVUWS9XUmJ1NEtDNjZ0dFUxQUZmZ3ExZXY2TE4vTmJpc0ppN2FXa1hBMW9TUHhOK2dyNHZoY291R1kwc3RibXJRZzhVbTBVUnF2QXdSQWRKcExmNUplOW5mbnJZK0NRaXA5ZGYvQnh4SlVjcHY4RVdlRngxQlJnZUxrRks4YTZXZ1BrWmEwdlQ2TFBxSUxReFBuejY5dWo3M3kycmlRdDJoRER6Y0ZXVGxXeEJ4eEdEMUdZWUg4K1VxRCtxV0xleGgrQVlreTVJUVQ3TzJrTEMyOE43Y3NoTTVPMFNWT1YwdDFLMkVDdklTeUExL2poOURTSEFFdGx0VXNzbkczdDdlRlMyTmNsbE5JUGVoai9FaWtFbXBLVGZrMUtNVU5CZ25jY1N0aGhSdktzMk1qejIxbENETEY3RUgycHpMemNkVWtVTGFRRkdDRWxVWmROYURaQ3FpUUtBeGZqbis2OGRWTEh4d0tVMllsa3dBS21VSXMxQVZ6dnZ4emc2UVRPRnFWRkxsNkJtM2JDRmp0STViOUZ5UzBSaVFKak1JZzl5S2pFMU5FTlcrYnNZSklGY0IxSDNtalNPWDBvUUpMUk1FMEFTakEvZ0pnODRPMHE5Qnh2VXZwbEJMSWNPOWsxVjJqeFA3d1FmWWc2K01JYklLUE9LTDBBU3lTemN1MWNoaEVLRVd4dVRFVllEWFA3VGlRamc4UERSalBYSXBUWmlXVEFEcUFDMHo5US9tWkRvN0RyZHJOeGFUQnB0K085NWwwMUg2dDZnZ2xyUGxmSWVqKzQ0ZUo3YmpYZU0xTWRuamdFZlMyb0Z2SVpmRUU3SldKbE1TNzY0WEk3NE1OUDdYM0pCQUtyVENXL1ljc2ZFcm9OMEk5dmYzemRXdWRTbE5tTkF5UVJDbFMyQnFEY1FGcGdZaHJDc1ZRaG1rczN1N1BsSHZUbW1DZmFjNE5rbUJZR1hGdzNOaldqQkhXai9aV2NucnEvcy84RU4rQ25xNkFQRUg4RWJza2VKelE4TEgweUZOWlorVEd6dElKR0hYTUk3M01vQTV6TEpTaXVtYXVORGdmUVBvZEFuTVRFQjJlb2lyRTBWQnBPYlBiYVYvamFxeXYrRTN1OTJadFZycWJneis2cE9YVGtaTXdic2dRZ0Q3VnFMSGVialRnS3FrcStxZjVrZDg0SXJ3RXNVbjh5NVpRbzlFTkJ3R0ZJUEt0cjNzYjNBWWNWcDY4Uk9aVEd2aHNrREtmL2xpeEhSTm5IM2J5TE9Sa3B6TnRBU1FOa1NHbzRORlVWbzEwOW05UDFvdzNCbHBZODEzY0R4aEpScHdiNlBNeVpFYUx0WFR4T3VxL09Ec1huS2tFU050bjAzMk92ZlUvTEs3K2hmTWJGS3d1U0VMTzJIUE90bGF6aVIzS0lYYWtNTVNXWVNHSmxweUdVSnd5U0ZicG12aTJiTm45Q0ZjSEZtWkJVeS9sMEVobXBrV3k2eEVCaDRzVk15V2FLUXlxZ0dieFA3amxBZ3BUYlEzNlNhNk9lZDJrSko1UHNkSDNNRHdMaTYrSEk2WUdkakJKa29TMHRuMlRoWUpGaTZMZzRNRDJrZ213WFJOWEhRY0RSdlZWZlU0dVFibm5SQjUzM3NseGtiOWFxQWtoMGRGOUJOTFZqQTAwQVB2Rm1UeVllbkVlT3BXUDZhUmxMWEhSM3dSWWp0cDNRSlZxaWdMRHlLWDZXRTNVUk1YV3Fib09GcGFPbkJtajdjSERQY1gra29NKzgzWHdtVVBBOFFjRytGcExWZTVHZFNkT05JU3FaN3VFN3RPak9UcVlqWFNTYmFxVnQ3ZFRJb2hhaVdpQ1ZBa0NsNVlXS1QvaitVQlZ5eHRxb3ZEUkUxY2RLQzJBYnE3QjNGYW1lWnRFRlhvU051bnFBbmpJaDJaallUcmNRRndGVUZja1VwNWNzTVVVaEJLRSs4S21kTzZUb3hrYkV3a0NXb2trMENTeTd4RlNKcE5JUjBIQjRtN3U5L05EdDQ4R3lhN0NoTTFZVnJYRjRQcDZUbWMyWjRmYmpDOHQxNnlNSzVvSy8rNW80T2dKdWNmVVhxd1U4WE56REJvSXNWTDZPNTY4dEFiWkFBcTM4OUpycW9PZUcrcXo0bEUzV0d3aFNFcFNydGFJa2M3UG44MEVkQmU5bmNMWTNLeXZBa2gwZzdTRm81SG9VRGw0aUlmR2hxai81V0Z3V1JYWWFJbVRCaEh3OGJ5OGdwT0szdW14dVBwa01wQ3NkUlhkbndNL2xZUmRWT2dWcW5ZM3RhdzlFQTlTU1lZRnFiK0owb0RPSC91S2JvaEpJVkdiKzJ2MkJzTmlOb1kzZ0orQWxMb3EvOFBnM2RCUmhiSVp4WHlRQTVIY3ZsVjBxNENUNTQ4b2ExMVFaaW9pY3NrbUFUSTE1aTVYMVNqWWROdnBXSnVYUGduM2RYL1BOWG55aGdBM0s2TWhTWVdrRkpZQzlpbHg4NXF3ZXdndjZmbVgyY0h2VnFLLzVkTzgwZlVMTXpVTVFNaU5xRzI3SzcrbDhYSndOYmluMENDcDkzYkFaWjJkdko1UEJNMTNlOUcrbHlPRTdLQWJod2RxRTU4VnhjaC9rdDJkaG45eHl3RzF4bzdUQmlvZlJ6dTdpcDJ5MFIvTzlVQU1OQnhRdXZDZG4zaVRKbG1zaTVNN3k3TVQzOHZYWmdiRWo2YThGOWJpT3VvL2h4ZjUzSjlSY0t6MmlmZ1ZIRDFuKzBuRUltZ2lZSHVsQlBYNWlYYzM2eEVUWnNZWmFjTmxSWm1VRGNTQXpXYWVNc3BSbloyZGt6dUdETkZFeVozaDdJaGxZYXpGN2FGenlCRFpJOXpwejJkM0ZadVVDSDJFeDBON2NkRjNGZi83OVF0eUtuV3hyL0tqdnNYR0Nid2xIemlZS3NhYWhoby9LL095cDhqU3lCcnFaNUdKS3FuTmFXek9UUGcyZHFVUFQzb0EzRVRXYmk3K3pjMGRPRGZ6YzgvMHV1emxFcGRVRkNjVHBlZW1scVltVmxhVmxhUFIrWjVmWDA3Y3Uwcm1qZnc5T2xUMmxvWGh5bWF1RXdMSmdPY0xKeEUwcnE4dlZhSE5QNjBrbUczTzNPeUtXS3FOaFFSSkVINm5tNUlyVWhtaVdrQ3FSN1VySXl6eHRSc0xDWWhnVVVXWXJEZGdHTzlTcGlaRE9VOWpidnJ4Uk5kMU9CaEJMdnFuSjl6N0hpa1d3UVVpWUpLU3FvZVB6NjFVa1cxMHR6Y2xaaVl5K1VxaVpMQ3dwSnFhbHJNNkdZdTA4SnRpaVl1ZW9PbkU0R3JCNmVETkJDUnVwOHBRd3k0UDE0SU5kQU05bjJ5VVcvd0FjS1NkenM1ZFhqT1JUalJ6U2t1U0NRTCtwOUJNcWFMM0JzZGZpVlFIWXpxR3NxRy84T1JJTW1RU1FPeU1oTGFXd29mTDdUczd3enQ3NHpzNzB6czdjenM3Y3p2YkMvdWJLOXNiS3hXVlRWNWVsSmRMYUNUazZ5d3NHWjlmWU0rUjZiaWtyTUxUZEdFeVYza2JNQi80aXpnVkNKZjgzQ1g0U0k3YllURWU1b0lsT3dObjl6T1dGeVFoQjJlMWdwcEpKRW9JUGNjYWYvalZLOXpaOFhQRUIwTW1xMU9JN0lReEQ2bXBSVVZFTUpLVGxaOFZHUUVDaG04QlgyZ1dvSFUySzB5aEh0YkxWbnA5QkJBa01jTHZFeS8vT1dubTVxaWlRc3RQM0lhRUhmeC93TURnbkhpcUNjL0RKZytUa1lUajVKVm80UFJzOTBuaHhqU1RYVzhiZFFFb2hBbDJhdkI5clBaMFpLRENNanViVGNnZExNNFh6azZXSFJjRm1CclV3NGpDM3Q3WDlOYXc4d3kvOWdVVFpnMkJ0TUF1QlR3NSszc1JPUkVuTkYzQmNkQU5ERXlGRDFYcEJtYVBzb1lVSTZTSi9BeDJBK2NEZlBXYVRRb2RObUV4NExOd0pIZW9MWTZ4VUJQUG50dGIyUG83eGQwZkhFVlFyZ1FLQVlmcUNoTk9iR2JEVXhKaWlHYUFKRmgwR2ZLYUpoRkVJQXBtamc0T0tDUDRuSkFia1grLzJtOWtZVElNWWttVUpGQ0ZyUEZtdjNac3NQdDJyTHNqeE5pZk9HVDRTSEltRXB5OTU3VE9ObnJ2TGRlMGxuNWdjRjJpQUJaQ0J3N0RvTWNENXZFa01nU0VBc014djR3Wk5aSm1od3RoUzZaS1c0R3hPR1JmVExqQkF4SXhvd1JJcmVnVDVOeE1KY2dBRk0wY2NsR1RBTDRDVDZmdWo4RHlMNkx3bkh1dEtRU1RUQWN5QTJTK2REbkRuUjFFWkRKNmFkMWlxTFFRSmt3MFBpZlUzM2MxdUtma053UVRoN1pESmxHQnNMTjREbGl2elk4TEZxbkJhRVNXTkZBS1BoTWZLd09ZWUprUHlTK3NKczc4Y1VUWFFYMHhCUW1wMmtYMlFielF5Qjlwb3lBR1FVQm1LS0pDeTE3ZUNLbXArZHdIWkIvYnRnNWZvemJWWEZzUVdTOEc5MFBPamtLTWhLRnNOellVREVaWk11TUJUK1JnMDMvamZLeXIvN1hNeE5sc0Nzc2hKK0cvZURWY1gwYk9Db3lCNFFRNFIrZlo4WlBFRUpETXFrcUpzeXV0VnJTVXZUWGM4TWkwdWdKcWVGZ0RQNFJYc0kza0MveWVZb1RIUWtpRnlOUUVFNlVQbGxuNGlwbWVaaWlpVXUyVDZEV0VnaG9Ed0dlVm9JeVhJdFVFalVzcVNVUlhPcFNzN2JpUndRNTFGWEdUZytwaHZ1TGNKYXhNU1E0QktmVjRMdUVLQmNYSjlVRFRmL1ZXUEFMUDE5cXpDMnUxTk4rZDJHTWFnTHBydmtsZXlQaDNGUTVva3h3VUxDQjgrRFllZVBYVVZGRFd6Z0dQR0d2OW9wU2lGU25JTFRGSHZESFprMGx0U1FvUTJPbW9GM1JuYWRNMGNRbE84clQwNHVaZjM1MjFBRDNSdktueXpYRG96RjRqUE9nQk1Gejg0VmhsRko3WE9JeFdqRkpVWEhTejNZMk1GVitkZ2pIanJwNTJOa3FuTzUzV3hoWGRaVC9kS1QxazlQbUdNS3AxRlNtaDRlR2VicUxuQng1VmxaSHRvUmNJRGdTZ0tBZTRzRGdBSEMwSjVZYmhCQ0tnUjg2KzI3NlZ6Y0pEREJGRTRESmFlYnk4b3FORGUzODRmWlB1N0laYm1hR2pmVkVJcnRNeTZKY1MxUklLR3h2Y0puaTdKOHRDTVJ5MkVraVZwMDJJWUJ3YjZPTXVKT2hsbytHV2o5R1FtcndnZU5jbm85cnFQU1AxRWFnZ0NJSGcyTnpkNVBpdDlRQkdwVFpjQktucFp3TWNmRE1lRTlDblM2ZFBsOG40YXB2VEdlaUprd2V0RTJhcWtBWTZWeEJ3RWtnWk14VWhwU1hodHBZOFl0ejZDb1V1U0hLQVZ4WVVOWFpaZ2FSWk9BeVBYZWNKcmo1T0IwZW9yL2hQN3VyL3JHejRtZWtGOTVJd3E0TnRSbFJrUkhNNVk0anhPSEJwWjB4QVJxRVluQXF5RmNJenhnR2ZLWHVnWUdKbWdCTXlEUVhGNWZzN2FsVGhvdUpxZXNRZzNFcW5aMm91Y0tncXl0MUtqdmJjdmRIQzlZaUZOREVwRXJpWkNOb3JucXYwZHJJeFdnUTJzbTRDb1B0WjNCdElZRU1vb0daVVgvQ0NTRVZ4UUVqU1VRMlVGR2FjbTZ6R0VRQUlVSzRzVEdSQ0IvRVJlRUphbHBVUnV4UnBhT0RSUVloQTJuRWFZSzRhdmZBd0hSTjRQZ3VPb3FpdnI2ZC9ITXltZ1luSFdjTkx4RjBjekxpeXNvajhwT0RVaktEazhLRDQ2U0tWWTBQU1MzRHVjSWMzZEVRZTJLd00xWVRZQWpEd0FDTU56cHR3SVFCOFhrb01sQWREQ2xBclBEL2hGQXFJMXhrdFZrWnNiRG83UERKTFExbkU5a0RqZzA3SjhrUWlDZWhvZnJUY2doRTZtdHdEd3hNMXdSdzBXUXpMaTRiL3gvNUlNNDdjbmc4d1ZYU1hKZTUyWlM2cGxXTzlrWE5GbXVHeHFrUk5BeTdaZUlFbi9mbS9aR3hVdXlWVTg4bCtRcTd2RHlSY0Nld05BSU5sSHBpU01KaHczTkFMb3d0eWQrQkQ0QTdRYjRNNmJBSGp6SEVuckZERWx6Z001anZndkFpZVRrcGp4NE8wT2ZvZmVDcXUrb1ZTSTdqVXBvQUxoUkJKQkpxeUJxS0xsd29PUFhCd2VxKzdsaW9nWmovWWJvZjZnczhNb0lBcThYaWc0WDNHcGlwVmJwWEM0NHZSb05hQUFYRjhlNkd3KzNhb2VZUFYrYWlodHYrc0RRVGR1TFFLZGdNUnJXeEVVSU41d2FhZzYzcStiSGc5SmhmeFViSnZOd2NiYXhwNjBJb0VBY1pDUWIxNEdBUUtXQnlKQmJrQXlDZXE1U0JpRUZWNVduOVBaV3JLMk03MjJ2MDJYa2ZVTU5OM2RMaHNwb0FqRyt1NEhDb3N3T3pKZW9qdTlJanA1b2o0QnZZQ21BNG42T0dQcVpxUWxGM01NWWdNd2U3S3YrQldveW05RzlJK01EWlIyNFBXK0lTUDgyY3hFK2N1RW9ha29QOG5BUzRLOVNLN040TktBeld4Y1VOb29ZMDJEUHFWZXh6WXpHSjNMN1FnUGc4MHlCQmlBc0FoL2N1MmFRNnpmZDI1cmEzVDUwMXRQdHVLZDNyU1IxT2hCazBBWHp6elRmR2RJeVJFNVFlSERnYkxJWGhKNW9qcGl0RDJGSmdPTm9iTlZjUU9EUWRoOUxENEl4dlBrNUZkVUNhajdUaFlVZ2g0YlRQdnJpSkd0ajluUGc4M0JXU1BxZ0J5U0RqWFNBUmtwWWlxVVErZ2J3U3JwNjBTWk4yejVEZ2tLSzg4T0swLzl0ZStmdU84cDlXWmYrOHZmb0I4bVZJQjdrTGpzUWdOT0FuOE5iaGJ2dit6c2p1enVMMjloWjlMazRDMUdBSk53SXlqeVlBVktmbjlxRzd1L3NKM2FrMDIvb0IzODlabU9ZbHFwZUloaFZpQTBHQWswMFJJeU14OHhYaHhGUndCamp2dy8yRk1CaHlQUmdTVEV2Um4xM21NYVJiblJleTRGR0tDeEpoSi9oNTVJblkydzlOMm0ySHU2MndLTHdGb2o3WjdlRk95OEZPMy83T0lONkZCSkY0SWxkQXhvQW9FNkQwZ0Z5Y0hJOXNEeUpUaG1pZ0p5Z1Z1MElXdWI3U3VyOHpzYk85UlAvLzA0RXJDbVhGamF5YWV4eG0wd1NBdjNSdVc5Yk9SbDk1YnJ6TW5VN2dHWEp0K1Q0T0FybmplNVR4WkRqTE1ML0JoMkZPS0FPQm1VMFlDUjgySVBNdTRqcDBnR3NkWGgxR1JjbHd1TnR4c0R1OHR6T3pzME5HdkczdDdVd2Q3bmJ0NzJEajdNNzI4cnVOTkhhMlYvWjJwdkg1MDNpNDI4c1FTc0tIZjlqdE9ZQnZzQncxRUpoVEV3RDgzdGxyOU9OTVBkbHR4bFc0UFpRL0dLbHU4Sk1WU3FXcEloK3RsOFRmVlF3ZGlPMEZicllDZXlzNnNTY1hIeHd5TVMzSjhBbnhuREU1eUd3SDRVSklBUW12Z0VwaGNyUVVibVpwb2U1d3QrZGdkM0IvWit5ZEc3OWg0UHBCS25iamtlSTR6S3dKQXFRWFp6UmQ3RzdQd3FNU010Y1pYRFRyVXV2Q1JVejR6ckViRXVHWitjQnhIdXgwSGV3T3ZCdjhPSVZzN3QzSVIxeXlad1h5NndUQ0JDNmJHMXgyLzF4Y2lTWUluajkvYnBZUldYY0d5TGR3VGl3cVRKeUlLOVFFOE9iTm00dmU3dVZPNHNtVEo1WnphNmR6Y2JXYUlEZzdsTnhoa1B6UkxHdE1YU2V1UXhNRVgzLzl0YmtHY2xvNFNNYnc2dFVyQzh3ZmpjSDFhWUlBRncwdUhWeEE5UG03UTdqdFVtQnczWm9nd0ZtN00yN2p6a2lCd2Mxb2dzSHRkUnQzVHdvTWJsZ1RETDc5OXR1dnZ2cks4ajBIa3VWbno1N2RTU2t3c0JSTk1FRDVqckNDUzlCeW5BZVVDbWNHSFZoKzA0SlpZSEdhWUFPUjVjV0xGeWp1cjFrZmlBdUhoNGZ3VzZpaTc3QS9PQTBXclFrMmNJMGl2a0FpdUdSaE1QT3FCSHREVUlENG5qOS9qbC81RWVxQWpWdWppZU9BU2w2L2Z2M3k1VXVvQkxFR2dGWUk0TzMzZmdBdWVsZ2RqM2lPdC9BeGZCN2FRb1NDK2VHS2Z1UUtPSTVicklsN1hCSHVOWEVQUTl4cjRoNkd1TmZFUFF4eHI0bDdHT0plRS9jd3hMMG03bUdJZTAzY3d4RDNtcmlISWU0MWNROUQzR3ZpSG9hNDE4UTlESEd2aVh1OGo3Lzg1ZjhEaU5KNUpnenMrUG9BQUFBQVNVVk9SSzVDWUlJPSIgc3R5bGU9IndpZHRoOiAxLjg0Mzc1aW47IGhlaWdodDogMi40MjcwODNpbiIgYWx0PSJQaWN0dXJlIDEiIC8+PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbCI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDAxIj4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj4mI3gyMDBmO9eY15nXldecINec15nXpNefINeQ16TXqNeZ15wgMjAxNCYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDMiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXqdec15XXnSDXqNeRLCYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXkdeX16jXqtedINec16bXkNeqINeV15zXqteV16gg15DXqiAi15DXqNelINeU16nXntepINeU16LXldec15QiLCDXlNec15Ag15TXmdeQINeZ16TXny4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7157XqNeS16Ig16DXl9eZ16rXqteb150g15HXkNeZINeU15XXoNep15UgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7INep15TXldeQINeU15DXmSDXlNeS15PXldecINee15HXmdefINeQ16jXkdei16og15DXmdeZINeZ16TXnyDXlNei15nXp9eo15nXmdedLCDXqteR15nXoNeVINep15nXpNefINeU15nXkCDXnNeQINeo16cgIteh15XXoNeZIiwgIteY15nXldeY15QiLCAi157Xmdem15XXkdeZ16nXmSIg15XXm9eVJyDXkNec15Ag157Xk9eZ16DXlCDXnteo16rXp9eqLCDXmdek15Qg15XXnteS15XXldeg16ouJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9eU15TXqteo15LXqdeV16og15zXp9eo15DXqiDXlNeg16HXmdei15Qg15TXldec15vXqiDXldeS15XXkdeo16og16LXnSDXlNeq16fXqNeRINee15XXoteTINeU15nXpteZ15DXlCwg15XXmdeX15Mg16LXnSDXlteQ16og15nXqdeg158g16nXkNec15XXqiDXqdei15zXmdeU158g15TXoNeb150g157Xl9eb15nXnSDXnNen15HXnCDXqtep15XXkdeV16ouJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9ee16fXldeV15Qg16nXk9ejINee15nXk9eiINeW15Qg15nXlNeZ15Qg15zXm9edINec16LXlteoLiDXkNedINec15DXl9eoINee16TXktepINeU16fXkdeV16bXlCDXlden16jXmdeQ16og15TXnteZ15PXoiDXlNee15XXkdeQINeb15DXnyDXqteq16LXldeo16jXoNeUINep15DXnNeV16osINeU16jXkteZ16nXlSDXl9eV16TXqdeZ15nXnSDXnNeZ16bXldeoINei157XmSDXp9ep16gg16LXldeTINeR15jXqNedINeU15nXpteZ15DXlCDXnNeY15nXldecLiDXkNep16rXk9ecINec16rXqiDXnNeb150g15DXqiDXlNeQ15nXoNek15XXqNee16bXmdeUINeU16DXk9eo16nXqi4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY715zXlNec158g157Xodek16jXmSDXlNeY15zXpNeV158g16nXnNeZICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY715HXmdeqICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyAwOS03NDI1NzMzJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXoNeZ15nXkyAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsgMDUyLTIyMzE1MjUgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9ee15bXkiDXkNeV15nXqCAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsg15DXkdeZ15HXmSAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsgKNeb15PXkNeZINeV16jXpteV15kg15zXkdeT15XXpyDXkdeQ15nXoNeY16jXoNeYINec16TXoNeZINeU15nXpteZ15DXlCDXnNeY15nXldecKSYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7157XmNeR16Ig157Xp9eV157XmSAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsg15nXmdefICgmI3gyMDBmOzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDAyIj4mI3gyMDBlO0pQWSYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyApJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXqdei16gg15fXnNeZ16TXmdefICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDciPiYjeDIwMGY7ICAgICAgICAgICAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsxJD0gMTAyLjMgINeZ15nXnyYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij48c3BhbiBjbGFzcz0icHQtMDAwMDA4Ij4mI3gwMGEwOzwvc3Bhbj48L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7MdepIteXPTI5LjQxINeZ15nXnyYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7KNep16LXqCDXlNeU157XqNeUINeg15vXldefINecICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyA5LzQvMjAxNCkgICAgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXlNeV16bXkNeUINeZ15XXnteZ16og15zXkNeT150gJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7INebLSAyNSQmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY715HXkdeq15kg16LXodenINeV15HXkdeq15kg15TXntec15XXnyDXoNeZ16rXnyDXnNeU16nXqtee16kg15HXm9eo15jXmdeh15kg15DXqdeo15DXmS4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY715TXpNeo16nXmSDXlNep16LXldeqINeR15nXnyDXmdep16jXkNecINec15nXpNefICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyAgNisgKNeZ16TXnyDXnten15PXmdee15Qg15DXqiDXmdep16jXkNecINeRICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyA2INep16LXldeqKS4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9eq16fXqdeV16jXqiAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsg15TXp9eZ15PXldee16og15zXmdek158g15TXmdeQIDgxICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY715jXnNek15XXnyDXnteZ16TXnyDXnNeQ16jXpTog16fXldeTINeS15nXqdeUINeR15nXoNec15DXldee15k7ICYjeDIwMGY7PC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPiYjeDIwMGU7SkRDIDAwMTtLREQgMDA0MTtKVCAwMDYxICYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyArOTcyICvXp9eZ15PXldee16og15TXkNeW15XXqCDXkdec15kgIjAiJyYjeDIwMGY7PC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDIiPiYjeDIwMGU7ICYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyvXnteh16TXqCDXlNeY15zXpNeV158uJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXnNeR16LXnNeZINeh157XkNeo15gg16TXldefINee157XnNeZ16bXlCDXnNeU15XXqNeZ15Mg15DXqiDXlNeq15XXm9eg15QgJiN4MjAwZjs8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwMiI+JiN4MjAwZTtCUEhPTiYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyDXqdecINeR15bXpy4gKNeo16cg15HXotec15kg16fXlSDXkdeW16cg15HXkdeZ16rXnSDXmdeb15XXnNeZ150g15zXlNeV16jXmdeTINeq15XXm9eg15Qg15bXlSkuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9eR15nXpNefINeg15nXqtefINec15TXqdeq157XqSDXqNenINeR16TXnNek15XXoNeZ150g157XlNeT15XXqCDXlNep15zXmdep15kg15XXntei15zXlC4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY716rXp9ep15XXqNeqINeQ15nXoNeY16jXoNeY15nXqiDXkdeo15XXkSDXkdeq15kg15TXntec15XXny4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDkiPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA3Ij4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj48c3BhbiBjbGFzcz0icHQtMDAwMDA4Ij4mI3gwMGEwOzwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+PGltZyBzcmM9ImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVFTa1pKUmdBQkFnRUFTQUJJQUFELzdnQU9RV1J2WW1VQVpBQUFBQUFCLytFQXVrVjRhV1lBQUUxTkFDb0FBQUFJQUFRQkdnQUZBQUFBQVFBQUFENEJHd0FGQUFBQUFRQUFBRVlCS0FBREFBQUFBUUFDQUFDSGFRQUVBQUFBQVFBQUFFNEFBQUFBQUVnQUFBQUJBQUFBU0FBQUFBRUFBQUFCa29ZQUJ3QUFBRkFBQUFCZ0FBQUFBRlZPU1VOUFJFVUFBRVlBYVFCc0FHVUFJQUIzQUhJQWFRQjBBSFFBWlFCdUFDQUFZZ0I1QUNBQVFRQmtBRzhBWWdCbEFDQUFVQUJvQUc4QWRBQnZBSE1BYUFCdkFIQUFxQUFnQURVQUxnQXdBQUQvNGd4WVNVTkRYMUJTVDBaSlRFVUFBUUVBQUF4SVRHbHVid0lRQUFCdGJuUnlVa2RDSUZoWldpQUh6Z0FDQUFrQUJnQXhBQUJoWTNOd1RWTkdWQUFBQUFCSlJVTWdjMUpIUWdBQUFBQUFBQUFBQUFBQUFBQUE5dFlBQVFBQUFBRFRMVWhRSUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCRmpjSEowQUFBQlVBQUFBRE5rWlhOakFBQUJoQUFBQUd4M2RIQjBBQUFCOEFBQUFCUmlhM0IwQUFBQ0JBQUFBQlJ5V0ZsYUFBQUNHQUFBQUJSbldGbGFBQUFDTEFBQUFCUmlXRmxhQUFBQ1FBQUFBQlJrYlc1a0FBQUNWQUFBQUhCa2JXUmtBQUFDeEFBQUFJaDJkV1ZrQUFBRFRBQUFBSVoyYVdWM0FBQUQxQUFBQUNSc2RXMXBBQUFEK0FBQUFCUnRaV0Z6QUFBRURBQUFBQ1IwWldOb0FBQUVNQUFBQUF4eVZGSkRBQUFFUEFBQUNBeG5WRkpEQUFBRVBBQUFDQXhpVkZKREFBQUVQQUFBQ0F4MFpYaDBBQUFBQUVOdmNIbHlhV2RvZENBb1l5a2dNVGs1T0NCSVpYZHNaWFIwTFZCaFkydGhjbVFnUTI5dGNHRnVlUUFBWkdWell3QUFBQUFBQUFBU2MxSkhRaUJKUlVNMk1UazJOaTB5TGpFQUFBQUFBQUFBQUFBQUFCSnpVa2RDSUVsRlF6WXhPVFkyTFRJdU1RQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBV0ZsYUlBQUFBQUFBQVBOUkFBRUFBQUFCRnN4WVdWb2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFGaFpXaUFBQUFBQUFBQnZvZ0FBT1BVQUFBT1FXRmxhSUFBQUFBQUFBR0taQUFDM2hRQUFHTnBZV1ZvZ0FBQUFBQUFBSktBQUFBK0VBQUMyejJSbGMyTUFBQUFBQUFBQUZrbEZReUJvZEhSd09pOHZkM2QzTG1sbFl5NWphQUFBQUFBQUFBQUFBQUFBRmtsRlF5Qm9kSFJ3T2k4dmQzZDNMbWxsWXk1amFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQmtaWE5qQUFBQUFBQUFBQzVKUlVNZ05qRTVOall0TWk0eElFUmxabUYxYkhRZ1VrZENJR052Ykc5MWNpQnpjR0ZqWlNBdElITlNSMElBQUFBQUFBQUFBQUFBQUM1SlJVTWdOakU1TmpZdE1pNHhJRVJsWm1GMWJIUWdVa2RDSUdOdmJHOTFjaUJ6Y0dGalpTQXRJSE5TUjBJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFaR1Z6WXdBQUFBQUFBQUFzVW1WbVpYSmxibU5sSUZacFpYZHBibWNnUTI5dVpHbDBhVzl1SUdsdUlFbEZRell4T1RZMkxUSXVNUUFBQUFBQUFBQUFBQUFBTEZKbFptVnlaVzVqWlNCV2FXVjNhVzVuSUVOdmJtUnBkR2x2YmlCcGJpQkpSVU0yTVRrMk5pMHlMakVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSFpwWlhjQUFBQUFBQk9rL2dBVVh5NEFFTThVQUFQdHpBQUVFd3NBQTF5ZUFBQUFBVmhaV2lBQUFBQUFBRXdKVmdCUUFBQUFWeC9uYldWaGN3QUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFvOEFBQUFDYzJsbklBQUFBQUJEVWxRZ1kzVnlkZ0FBQUFBQUFBUUFBQUFBQlFBS0FBOEFGQUFaQUI0QUl3QW9BQzBBTWdBM0FEc0FRQUJGQUVvQVR3QlVBRmtBWGdCakFHZ0FiUUJ5QUhjQWZBQ0JBSVlBaXdDUUFKVUFtZ0NmQUtRQXFRQ3VBTElBdHdDOEFNRUF4Z0RMQU5BQTFRRGJBT0FBNVFEckFQQUE5Z0Q3QVFFQkJ3RU5BUk1CR1FFZkFTVUJLd0V5QVRnQlBnRkZBVXdCVWdGWkFXQUJad0Z1QVhVQmZBR0RBWXNCa2dHYUFhRUJxUUd4QWJrQndRSEpBZEVCMlFIaEFla0I4Z0g2QWdNQ0RBSVVBaDBDSmdJdkFqZ0NRUUpMQWxRQ1hRSm5BbkVDZWdLRUFvNENtQUtpQXF3Q3RnTEJBc3NDMVFMZ0F1c0M5UU1BQXdzREZnTWhBeTBET0FOREEwOERXZ05tQTNJRGZnT0tBNVlEb2dPdUE3b0R4d1BUQStBRDdBUDVCQVlFRXdRZ0JDMEVPd1JJQkZVRVl3UnhCSDRFakFTYUJLZ0V0Z1RFQk5NRTRRVHdCUDRGRFFVY0JTc0ZPZ1ZKQlZnRlp3VjNCWVlGbGdXbUJiVUZ4UVhWQmVVRjlnWUdCaFlHSndZM0JrZ0dXUVpxQm5zR2pBYWRCcThHd0FiUkJ1TUc5UWNIQnhrSEt3YzlCMDhIWVFkMEI0WUhtUWVzQjc4SDBnZmxCL2dJQ3dnZkNESUlSZ2hhQ0c0SWdnaVdDS29JdmdqU0NPY0krd2tRQ1NVSk9nbFBDV1FKZVFtUENhUUp1Z25QQ2VVSit3b1JDaWNLUFFwVUNtb0tnUXFZQ3E0S3hRcmNDdk1MQ3dzaUN6a0xVUXRwQzRBTG1BdXdDOGdMNFF2NURCSU1LZ3hEREZ3TWRReU9ES2NNd0F6WkRQTU5EUTBtRFVBTldnMTBEWTROcVEzRERkNE4rQTRURGk0T1NRNWtEbjhPbXc2MkR0SU83ZzhKRHlVUFFROWVEM29QbGcrekQ4OFA3QkFKRUNZUVF4QmhFSDRRbXhDNUVOY1E5UkVURVRFUlR4RnRFWXdScWhISkVlZ1NCeEltRWtVU1pCS0VFcU1Td3hMakV3TVRJeE5ERTJNVGd4T2tFOFVUNVJRR0ZDY1VTUlJxRklzVXJSVE9GUEFWRWhVMEZWWVZlQldiRmIwVjRCWURGaVlXU1Jac0ZvOFdzaGJXRnZvWEhSZEJGMlVYaVJldUY5SVg5eGdiR0VBWVpSaUtHSzhZMVJqNkdTQVpSUmxyR1pFWnR4bmRHZ1FhS2hwUkduY2FuaHJGR3V3YkZCczdHMk1iaWh1eUc5b2NBaHdxSEZJY2V4eWpITXdjOVIwZUhVY2RjQjJaSGNNZDdCNFdIa0FlYWg2VUhyNGU2UjhUSHo0ZmFSK1VINzhmNmlBVklFRWdiQ0NZSU1RZzhDRWNJVWdoZFNHaEljNGgreUluSWxVaWdpS3ZJdDBqQ2lNNEkyWWpsQ1BDSS9Ba0h5Uk5KSHdrcXlUYUpRa2xPQ1ZvSlpjbHh5WDNKaWNtVnlhSEpyY202Q2NZSjBrbmVpZXJKOXdvRFNnL0tIRW9vaWpVS1FZcE9DbHJLWjBwMENvQ0tqVXFhQ3FiS3M4ckFpczJLMmtyblN2UkxBVXNPU3h1TEtJczF5ME1MVUV0ZGkyckxlRXVGaTVNTG9JdXR5N3VMeVF2V2krUkw4Y3YvakExTUd3d3BERGJNUkl4U2pHQ01ib3g4aklxTW1NeW16TFVNdzB6UmpOL003Z3o4VFFyTkdVMG5qVFlOUk0xVFRXSE5jSTEvVFkzTm5JMnJqYnBOeVEzWURlY045YzRGRGhRT0l3NHlEa0ZPVUk1ZnptOE9mazZOanAwT3JJNjd6c3RPMnM3cWp2b1BDYzhaVHlrUE9NOUlqMWhQYUU5NEQ0Z1BtQStvRDdnUHlFL1lUK2lQK0pBSTBCa1FLWkE1MEVwUVdwQnJFSHVRakJDY2tLMVF2ZERPa045UThCRUEwUkhSSXBFemtVU1JWVkZta1hlUmlKR1owYXJSdkJITlVkN1I4QklCVWhMU0pGSTEwa2RTV05KcVVud1NqZEtmVXJFU3d4TFUwdWFTK0pNS2t4eVRMcE5BazFLVFpOTjNFNGxUbTVPdDA4QVQwbFBrMC9kVUNkUWNWQzdVUVpSVUZHYlVlWlNNVko4VXNkVEUxTmZVNnBUOWxSQ1ZJOVUyMVVvVlhWVndsWVBWbHhXcVZiM1YwUlhrbGZnV0M5WWZWakxXUnBaYVZtNFdnZGFWbHFtV3ZWYlJWdVZXK1ZjTlZ5R1hOWmRKMTE0WGNsZUdsNXNYcjFmRDE5aFg3TmdCV0JYWUtwZy9HRlBZYUpoOVdKSllweGk4R05EWTVkajYyUkFaSlJrNldVOVpaSmw1Mlk5WnBKbTZHYzlaNU5uNldnL2FKWm83R2xEYVpwcDhXcElhcDlxOTJ0UGE2ZHIvMnhYYks5dENHMWdiYmx1RW01cmJzUnZIbTk0YjlGd0szQ0djT0J4T25HVmNmQnlTM0ttY3dGelhYTzRkQlIwY0hUTWRTaDFoWFhoZGo1Mm0zYjRkMVozczNnUmVHNTR6SGtxZVlsNTUzcEdlcVY3Qkh0amU4SjhJWHlCZk9GOVFYMmhmZ0YrWW43Q2Z5Ti9oSC9sZ0VlQXFJRUtnV3VCellJd2dwS0M5SU5YZzdxRUhZU0FoT09GUjRXcmhnNkdjb2JYaHp1SG40Z0VpR21Jem9remlabUovb3BraXNxTE1JdVdpL3lNWTR6S2pUR05tSTMvam1hT3pvODJqNTZRQnBCdWtOYVJQNUdva2hHU2VwTGprMDJUdHBRZ2xJcVU5SlZmbGNtV05KYWZsd3FYZFpmZ21FeVl1SmtrbVpDWi9KcG9tdFdiUXB1dm5CeWNpWnozbldTZDBwNUFucTZmSForTG4vcWdhYURZb1VlaHRxSW1vcGFqQnFOMm8rYWtWcVRIcFRpbHFhWWFwb3VtL2FkdXArQ29VcWpFcVRlcHFhb2NxbytyQXF0MXErbXNYS3pRclVTdHVLNHRycUd2RnErTHNBQ3dkYkRxc1dDeDFySkxzc0t6T0xPdXRDVzBuTFVUdFlxMkFiWjV0dkMzYUxmZ3VGbTQwYmxLdWNLNk83cTF1eTY3cDd3aHZKdTlGYjJQdmdxK2hMNy92M3EvOWNCd3dPekJaOEhqd2wvQzI4Tll3OVRFVWNUT3hVdkZ5TVpHeHNQSFFjZS95RDNJdk1rNnlibktPTXEzeXpiTHRzdzF6TFhOTmMyMXpqYk90czgzejdqUU9kQzYwVHpSdnRJLzBzSFRSTlBHMUVuVXk5Vk8xZEhXVmRiWTExelg0TmhrMk9qWmJObngybmJhKzl1QTNBWGNpdDBRM1piZUhONmkzeW5mcitBMjRMM2hST0hNNGxQaTIrTmo0K3ZrYytUODVZVG1EZWFXNXgvbnFlZ3k2THpwUnVuUTZsdnE1ZXR3Ni92c2h1MFI3Wnp1S082MDcwRHZ6UEJZOE9YeGN2SC84b3p6R2ZPbjlEVDB3dlZROWQ3MmJmYjc5NHI0R2ZpbytUajV4L3BYK3VmN2Qvd0gvSmo5S2YyNi9rdiszUDl0Ly8vLzJ3QkRBQW9IQndjSUJ3b0lDQW9QQ2dnS0R4SU5DZ29ORWhRUUVCSVFFQlFSREF3TURBd01FUXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXovMndCREFRc01EQlVURlNJWUdDSVVEZzRPRkJRT0RnNE9GQkVNREF3TURCRVJEQXdNREF3TUVRd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBei93QUFSQ0FDaEFPMERBUkVBQWhFQkF4RUIvOFFBSHdBQUFBY0JBUUVCQVFBQUFBQUFBQUFBQkFVREFnWUJBQWNJQ1FvTC84UUF0UkFBQWdFREF3SUVBZ1lIQXdRQ0JnSnpBUUlERVFRQUJTRVNNVUZSQmhOaEluR0JGREtSb1FjVnNVSWp3VkxSNFRNV1l2QWtjb0x4SlVNMFU1S2lzbU56d2pWRUo1T2pzellYVkdSMHc5TGlDQ2FEQ1FvWUdZU1VSVWFrdEZiVFZTZ2E4dVB6eE5UazlHVjFoWldsdGNYVjVmVm1kb2FXcHJiRzF1YjJOMGRYWjNlSGw2ZTN4OWZuOXpoSVdHaDRpSmlvdU1qWTZQZ3BPVWxaYVhtSm1hbTV5ZG5wK1NvNlNscHFlb3FhcXJySzJ1cjYvOFFBSHdFQUFnSURBUUVCQVFFQUFBQUFBQUFBQVFBQ0F3UUZCZ2NJQ1FvTC84UUF0UkVBQWdJQkFnTUZCUVFGQmdRSUF3TnRBUUFDRVFNRUlSSXhRUVZSRTJFaUJuR0JrVEtoc2ZBVXdkSGhJMElWVW1KeThUTWtORU9DRnBKVEphSmpzc0lIYzlJMTRrU0RGMVNUQ0FrS0dCa21Oa1VhSjJSMFZUZnlvN1BES0NuVDQvT0VsS1MweE5UazlHVjFoWldsdGNYVjVmVkdWbVoyaHBhbXRzYlc1dlpIVjJkM2g1ZW50OGZYNS9jNFNGaG9lSWlZcUxqSTJPajRPVWxaYVhtSm1hbTV5ZG5wK1NvNlNscHFlb3FhcXJySzJ1cjYvOTBBQkFBZS85b0FEQU1CQUFJUkF4RUFQd0RzMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3JaSkk0MEx5TUVSZXJNYUFmZmlyR2RYODV3VzZNdGt2TnR4Nno3S0Q0cXZWOEZwQVlVZk9XckcvRS93QmJma0FWSFNnQkliandwdy9ad1d5cC85RHMyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VlRubml0NG1sbGJpaTlUaXJDUE1HdEdlcnpOd3QxUDdxSHgveW0veXNDUWdkTzhuNnByUlc0dlhObFpOUXFwRlpIVS95cCt4L3JQalNiWllQSm5sMGFlYkFXZzlOaUdNdFQ2cGNBcXNucS9hNWZFMk5JdC8vOUhzMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMktyWkpFalF1NUNxdTVKeFZpT3U2dXByTEtlTVNWOUtQdWY4bzRMU0FoL0t1alNhbGNmcGpVWS85SFEvNkhFM1JqL3YybjhpL3NZaEpaeGhZdXhWLzlMczJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VlpKSkhFaGVSZ3FqcVRpckd0YjFxTUlYYzhZayt3bmRqNG5CYXBQb21peitZYnNhaGZBcnBzWitDUGNlcVIreXYvRllJK1BBQXo1TS9WVlJRcWdLcWlpcU5nQU93eVRCdkZYWXEvd0QvMCt6WXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxaDd1OGh0VTVTR3JIN0tEcWNWWXByWG1FRDdacTMrNjRsNkE1RzBnSWZTZkxOOXE4cTN1cjhvclA3VWR2MGR3ZW5ML2ZhZjhBRDQwbTY1TTVqalNORmpqVUlpaWlxb29BQjRaSml1eFYyS3V4Vi8vVTdOaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWYXhWdkZXc1ZieFYyS3JYZEkxTHV3VlIxWW1neFZKN3pXOWlMV2dRRDRwbS93Q05CZ3RXTFhlcTNWNWNtMnNGYWU0azZzTnpnWkFNZzBMeXBEWmxidS9wY2FoWGtDZDBqUDhBa2Z6Ti9sNFFGSlpIaFl1eFYyS3V4VjJLdi8vVjdOaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyV0txTnhkdzI5REtTcW45cWhwZ3RVRFBxalIvR29Fc0ozNVJtaEE5MU9DMDBsbDE1anVRanZhU1J5QlB0S3lrT3Z6M3djU1JGSnA5Y2VXc3QzTVpPNFRvby93QmpqYWFWYkhTdFUxd0J5VGFhZWVqa2ZFNC80clgvQUkyeEFSeVpmcG1rMldsd0NHMVNoL2FrYmQyUCtVMlNBUVNqY0tIWXE3RlhZcTdGWFlxLy85YnMyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4Vm8rM1hGVUpKcUN3dHdtalpYUFQrVWovVzJ3V3FtMnNXdTY4dUVuWU1PdU5xZ3JqVmlnS3p4K3BHZjIwUFhBU21rcm4xaDFnZVcxbStzUkEwZUo5eVA4bHNpU3lFVW11dFJFaUxkMnBNTWlta2tZUFEveFE0Q1dZQ1hYTjZXbFdkUGdaaDhTanAvbFlFMHl2eXQ1YXRaTGVQVTd4ZlZlVDRvWVdId3FLL0M1SDdUTmxrUTF5a3k4QUFVR3dIUVpKZzNpcnNWZGlyc1ZkaXJzVmRpci8vWDdOaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWVTVab29sNVNNRkh2aXFEazFxelEwSEp2Y0QrcHdXbWxCL01Oc3AyaWMvZC9YRzFwUms4endnZ0pDM3VXSUgzWU9KUENxUmFyRlBWcWtnZFN1MGkrNUg3YTQyeHBWa3ViZVNNUjNuRjRaUDd1Y2ZaUHNmNVd4U3hqWFROcHpobUJsdG02TjNVWkFtbXlJdEpIMVNXSitTdVh0MjJaTzMrc01iWmNLRyt0TkhNenhuNFpCUng0aklwNXI5UHNMN1VaM2hzb2pJVysyM1JGSGl6WVFGSnBtbWxlU0xLM0N5YWczMW1jYjhCdEdQYW4ybi93QmxsZ2kxR1ZzblZWVlFxZ0tvRkFCc0FCa21EZUt1eFYyS3V4VjJLdXhWMkt1eFYvL1E3Tmlyc1ZkaXJzVmRpcnNWYUxLT3BBK2VLcWJYVnN2MnBVSDBqRlVQSnF0b28rQmpJMWFBS1A2NExXa3VmWEpKSGRWK0dNVkNzT3YrVGd0bFNYdkpOSklqdTFUTFd0VDNHd3BYSTJtbEl0eXJURktoSTJLb09WNmIxd01sQVgwa1RBcTFDT2hHQzFwRkpyVlZZT1AzY20wOGZiL2pJbjhyWWJSd3JqZS9XN1NheW1QTXg3eHVlcFhFN3BBb3NXNHVITUlCWTFvcWdWSndVenRsMmgrU0h1WTF1ZFZMUkkxQ2xzdXowLzRzYjlqL0FGY21JdGNwOXpOclcxdDdTQkxlMmpFY1NDaXFNbTFLMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4Vi8vUjdOaXJzVmRpcnNWZGlyV0tySllZNVZLdVBwN2pGV042cnAwa0xGb3pTdlE5ajg4Z1dZU21PN2JrVWY0WEhVWUxaVXJSdHkyWHNObEhYNkJpaDNySWVKa0o5RGx4UTdGMUIrMFF2VEZWODFOaURXaUtRUnVhZkYxL2w0L3RyaXFDbG5GTjltN2pBbWt2bm5yZ1pVZ0paRDJ3SlE3U3NEaFZWdHIxbGxRazlpcHcwbG0za25UYk40Sk5UWkE5MFpHUkdiZmlGQSt4NE44V1RpR21aWmJrbURlS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt2OEEvOUxzMkt1eFYyS3V4Vm9rQVZPd3hWSmRTODFhYlpzWVlqOWF1UjFqalB3Zy93Q1hKOWtZTFZBUmVhNWpQRjYwWTR5TUZaRTZLR1BYa2ZpZGx3V3k0VS9rNFR4MGI0a09MRmkyczZZMGJjMTJicWorUHNjZ1EyUktVdzNibzlDU3NpNExaRUlqNnhHSTZyOElGQ1ZBcVdQZi9WNWZ0NFVJZU8rYUhsM0RBclErQnh0bFNDbnVPVDFCMjduSTJsQ3lUZDY0VnBEczVZNzRxaU5QMGpVTldrZUt4akR0R09UbG1DZ0E5TjJ5UUNES2xTNDhyZVlyV1FCN0tSeDJhS2tncWY4QVVyaHBBa0hvWGxQVGJyVHRIV0c3QVdkM2FSa0JyeERVb3AveXRza0d1UnNwM2hZdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4Vi8vOVBzMkt1eFZwbVZWTE1RcWpjazdBWXF4elZQT3VtMlphSzFCdkp4L0lhUmcvNVV2VC9nY0ZwQVlocWV1NnZxNUt6eWNMYzlMZUtxcC9zdjI1UDlsZ3ROS0ZuR0VaZmJvT3d3SnROM2krRU1CdUtIN3Q4aWxsT25Tc1ZDSDdKRlZPU0RFaEdYRm9rOFRSeWQraDhEaHBqYkE5WXRaTGE0WldGSFUvZVBIS3kzZzJsMzFrMHdKVW5ucmhWUWVid3hWU0xWNi9SaFcxdFRzQUNXSm9xamNrbm9CaFFYcXZsZlJ2MFRwaXh5VU4xTis4dUQvbEViUi84QVBQSmhwSlRuQ2gyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3YvMU96WXF4dlcvTjhPbnp5V2x0Q2JpNWoybFpqd2lRa1YrSmo5di9ZWUxTQXhPNHZ0WTF1Y1JQSTA1YXRJRStDRUR4S1YrS24vQUJaaWxaZGFQYzJQRXpxdEc2RlNDb1BoZ1JhMVlsQTZZcWo3RFNiNjliL1JvU1VyUXl0OEtEL1pmdGY3SEZXVzJQbDZHM1JUY1A2OGcrMEtVVDd1dUdsdEV5d0xFUVl4Uk93SGJCU3F5eUw2UmR5RkNqNG1Kb01VRkl2TU5yRmUyWDF1RWhuUVZERDlwTUVneWlhWUJNU3JuSUJ2VVM1T0ZGdEhmQ3E2S0tXZVZJSVVNazBoNHh4cUtzVDdZb3Q2QjVYOG5qVDNGOXFIR1M4b1BUaTZyRjlQN1V2K1gremtnR3FVclpYa21Mc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXIvL1Y3TmlyeS96REswdXJ6bGxwd1BwZ0gvSTZuL2dzQ3hhMHZVSDA0VFN4UnJMTklGVlZjbFJRRW5abERZRXBnWmRSOHdRV3NDd09zME1ralB4b0lTSEE0RmoyNGZGaFd0MlE2VjVWdHJkUkpmVXVKdXlmc0wvelgvc3NWVDlWVlZDcUFxallBYkFZVU9KQ2drbWdIVW5GV042MzV4MHV3NVFJUlBNT3dQd2cvTmZ0WUNtbUhYUG11L3VYcUFPQSt5SEhUNUo5bklzcVRIeXpyY3pTUzI5Mi9OSGFvcjBCUFgvWTRncktLVWEzYS9WcjZXSWZaclZQOVU3akkxdTJST3lYWVZUWFJmTGVvNnU0YUpmU3RSOXE0Y0VML3dBOHgvdXhzTklKQWVpNlJvR202VEhTMmpCbUlBa25iZDJwNy9zLzZxNUlCcUp0TThLSFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXEvL1c3TmlyRzlmOHJOZjNIMXUxWkZtWWZ2RWVvREViY2dRRGdwSUtucHZrNk5LU2FnL051dm94N0wvc202dGpTMnlXT0tPSkJIRW9SRkZGVlJRRENoZmlxU2F4NXMwblNrUE9RU3pkQkZHUWQvOEFLYm91QzBnUFA5VjgxNnpxN01pc1lMVS9zTHRVZjUvellMWlVrd2lBTlNhdDNZNzRwSzdrQWZidWNDcHpwMWhlSVJPWW1TRndDc2pDZ1B5d1V0aFgxODhqYnVkMjRjV1B5T0pURlBmTHZrcEFzZDVxdEhMQVBIYWpvSzcvQUw3K2IvVXlRQ0pTWm1pSWloRVVLaWlpcUJRQWV3R1NhMTJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3YvL1g3Tmlyc1ZheFZBNm5yTmhwY1JrdXBRcHBVUmcvRWZveFY1L3JYbmZVTlRyQllMNlZ1ZHE3Ny94ZkkyekVlOUFmNFoxTDBHdmJnQm5BNWxXYjR1UGR1STJXbUttU1hzZDZkQjJ3SlJtbTZQcUdxemVsWnhjZ1B0U0haRi8xbndvSlo3b25rblRkUDR6M1FGM2RqY013K0JUL0FKRWYvR3o0YVkybWVvNmUwNmt4aXRSOW53cDRZb1krUEs5NWVYY0R6QVJXc0wxazViTXdCQjRvdUNtUUxNc2t4ZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZi8wT3pZcTdGWFlxODUvTUNlS2ZVWWJmMHcwa0FKTFUzK0xvdUFwanpZN1pYSzIxM0RjTWdaWW01Y08zVC9BSTF3TXJUU1RYTloxZU80MDZ5dDJYNnlBaGtpRGVvSXd3WndxLzhBRnZIZzd0K3hodGlRRTgwWHlFS3JjYXEzdUxWT255a2YvbW5HbEpabkJid1cwU3cyOGF4UkxzcUlBQVB1d29WY1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpci8vMGV6WXE3RlhZcXhQemI1WG52NWZyOWlPVnhRTExGMDVBZlpLOXVXQlVxMHp5RmZTcXNsN0l0c3BOV2lIeFBUNWo0RnhwTnMxMDNTckhUSVJEYVJCQiswL1ZtUGk3WVVJekZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxL3dELzB1ellxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWC8vMCt6WXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYLy8yUT09IiBzdHlsZT0id2lkdGg6IDEuMzIyOTE3aW47IGhlaWdodDogMC40ODk1ODMzaW4iIGFsdD0iaWIyMjI1IiAvPjwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIj4mI3gyMDBmO9eX16nXntecICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIj4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIj4mI3gyMDBmOyDXlNeh16TXpyAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMSI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMSI+JiN4MjAwZjsgMTAwJiN4MjAwZjs8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMiI+JiN4MjAwZTtWJiN4MjAwZTs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTEiPiYjeDIwMGY7IC7Xm9eaINeg16jXkNeUINeq16fXoiDXmdek15DXoNeZINeV15zXlSDXmdepINec15TXqteQ15nXnSDXntei15HXmdeoLiYjeDIwMGY7PC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTIiPiYjeDIwMGU7ICYjeDIwMGU7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXnNeR15XXqSDXldem15nXldeTICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyDXkdeS15PXmdedINee16rXkNeZ157XmdedINec157XlteSINeU15DXldeZ16guINeg15vXldefINec15nXnteZ150g15DXnNeUINeU15jXntekJyDXlNeZ15AgINeR16HXkdeZ15HXldeqIDIwKyDXntei15zXldeqINeR157XlNec15og15TXmdeV150u15nXqSDXnNeU15HXmdeQINee16LXmdecICzXptei15nXoyzXnteY16jXmdeULCDXoNei15zXmSDXlNec15nXm9eUINeg15XXl9eV16osINeg16LXnNeZ150g15zXlNeX15zXpNeULiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTMiPiYjeDIwMGY716nXmdee15Ug15zXkSAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMyI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMyI+JiN4MjAwZjsg15HXkdeZ16fXldeoINeR15TXqCDXp9eV15nXlCDXotep15XXmSDXnNeU15nXldeqINen16gg15nXldeq16gg157XkNep16gg15HXmdeq16gg15fXnNen15kg15TXmNeZ15XXnC4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9en16jXnSDXlNeS16DXlCYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7157Xqden16TXmSDXp9eo15nXkNeUINeo15bXqNeR15nXmdedJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXntep16fXpNeZINep157XqSYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY716rXqNeV16TXldeqICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyDXnNei15bXqNeUINeo15DXqdeV16DXlCwg15vXnteVINen15XXnNeT16fXoSwg16HXmNeV16Qg15DXmdeYLCDXk9en16HXnteV15wg15XXntei15XXqNeoINek16LXldec16og157XoteZ150uJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXpteZ15zXldedINep15wg15TXk9eo15vXldefINeV16nXnCDXm9eo15jXmdehINeU15jXmdeh15QuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDE0Ij4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEzIj4mI3gyMDBmO9eR15DXnSDXmdepINec15og16HXpNeV16gg157Xoteg15nXmdefL9ee15XXodeZ16fXlCDXmNeV15HXlC8g16jXoteZ15XXnyDXnNee16nXl9enICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEzIj4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEzIj4mI3gyMDBmOyDXoNeX157XkyDXkdeQ150g15LXnSDXpNeo15nXmNeZ150g15DXnNeUINeZ15TXmdeVINeR15nXnyDXlNeT15HXqNeZ150g16nXlNeg15og157XkdeZ15Av15Qg15zXmNeZ15XXnC4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7157XlteV15XXk9eUICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmOyDXnteW15XXldeT16og15TXnteY16LXnyDXnNeQINeq16LXnNeUINei15wgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7MjAg16ci15ImI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjsg15zXoNeV16HXoi4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY716rXmdenINeZ15MgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7ICjXnteW15XXldeT16og15nXkykgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY7INeb15PXkNeZINeV16jXpteV15kg15zXkNeo15XXliDXl9ec15nXpNeqINeR15LXk9eZ150g15XXkdeS15PXmdedINeq15fXqteV16DXmdedO9eq16jXldek15XXqiDXnNep15nXnteV16kg15nXldedINeZ15XXnteZLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDUiPiYjeDIwMGY715HXqteZ16cg15TXmdeTINeg15nXqtefINec15TXm9eg15nXoSDXnteZ15vXnNeZ150g16nXlNeq15vXldec15Qg16nXnNeU150g15zXkCDXoteV15zXlCDXotecIDUwINeeItecLiDXkNeg15Ag15TXp9ek15nXk9eVINei15wg15LXldeT15wg15bXlC4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA1Ij4mI3gyMDBmO9eb157XlSDXm9efINeZ16kg15zXlNeV16bXmdeQINeb15wg157Xm9ep15nXqCDXl9eTINee16rXmdenINeU15nXky4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTMiPiYjeDIwMGY7157Xkden16nXqiDXnteb15wg15fXkdeo15kg15TXp9eR15XXpteUINec15TXkteZ16Ig15HXmdeV150g16jXkdeZ16LXmSDXlC0gMTYvNC8yMDE0INeR16nXoteUIDA5OjMwINec16nXoteoINee16EnIDMyINep15HXqdeT15Qg15TXqtei15XXpNeULiDXkNeV15PXlCDXnNeb15XXnNedINeR15DXnSDXqtei157Xk9eVINeR15zXldeXINeW157XoNeZ150g15bXlC4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMTQiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDQiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTMiPiYjeDIwMGY716jXpyDXnNeQ15fXqCDXqdeU15XXk9ei16rXnSDXnNeZINei15wg15TXktei16rXm9edINeq16rXl9eZ15zXlSDXkdeq15TXnNeZ15og15TXpifXkNenINeQ15nXny4g15DXqiDXnteW15XXldeT16og15TXnteY16LXnyDXmdepINec16nXnNeXINeZ16nXmdeo15XXqiDXnNeY15XXp9eZ15UuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDE0Ij4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA0Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEzIj4mI3gyMDBmO9ei15zXmdeg15Ug15zXlteb15XXqCDXqdeU16bXnNeX16og15TXmNeZ15XXnCDXqtec15XXmdeUINeR15vXnCDXkNeX15Mg157XkNeq16DXlS4g15DXl9eTINeU15vXnNec15nXnSDXlNeX16nXkdeV15nXnSDXlNeV15Ag16LXnteZ15PXlCDXkdec15XXlyDXltee16DXmdedICEhISEmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMTQiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAxNCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMyI+JiN4MjAwZjvXkdeo16bXldeg15kg15zXkNeX15wg15zXm9edINeV15zXkSLXkSDXl9eSINeQ15HXmdeRINem15HXoteV16DXmSDXldep157XlyAhISEmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXkdeR16jXm9eULCYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNCI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNSI+JiN4MjAwZjvXqdeo15Qg16TXqNeZJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDE4MjAuaHRtbCBiL1Rlc3RGaWxlcy9UMTgyMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZTdmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDE4MjAuaHRtbApAQCAtMCwwICsxLDIxNSBAQAor77u/PCFET0NUWVBFIGh0bWwgPjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz48dGl0bGU+IDwvdGl0bGU+PG1ldGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJQb3dlclRvb2xzIGZvciBPcGVuIFhNTCIgLz48c3R5bGU+c3BhbiB7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQorcC5wdC1Ob3JtYWwgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtMDAwMDAwIHsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250IHsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitwLnB0LU5vcm1hbC0wMDAwMDEgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBmb250LWZhbWlseTogR3V0dG1hbiBZYWQtQnJ1c2g7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtMDAwMDAyIHsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDAzIHsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgZm9udC1mYW1pbHk6IERhdmlkOworICAgIGZvbnQtc2l6ZTogMTZwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwNCB7CisgICAgZm9udC1mYW1pbHk6IERhdmlkOworICAgIGZvbnQtc2l6ZTogMTZwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitwLnB0LU5vcm1hbC0wMDAwMDUgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBmb250LWZhbWlseTogRGF2aWQ7CisgICAgZm9udC1zaXplOiAxNnB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtMDAwMDA2IHsKKyAgICBmb250LXNpemU6IDE2cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDA3IHsKKyAgICBmb250LWZhbWlseTogQWhhcm9uaTsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDggeworICAgIGZvbnQtZmFtaWx5OiBBaGFyb25pOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3AucHQtTm9ybWFsLTAwMDAwOSB7CisgICAgZm9udC1mYW1pbHk6IEFoYXJvbmk7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIHsKKyAgICBmb250LWZhbWlseTogQWhhcm9uaTsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC0wMDAwMTEgeworICAgIG1hcmdpbi1yaWdodDogMC41MGluOworICAgIHRleHQtaW5kZW50OiAtMC4yNWluOworICAgIGZvbnQtZmFtaWx5OiBBaGFyb25pOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3NwYW4ucHQtMDAwMDEyIHsKKyAgICBmb250LWZhbWlseTogQWhhcm9uaTsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIHRleHQtaW5kZW50OiAwOworICAgIHdpZHRoOiAwLjI1MGluOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTMgeworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LTAwMDAxNCB7CisgICAgbWFyZ2luOiAwIDAgMCAwLjUwaW47CisgICAgcGFkZGluZzogMCAwIDAgMDsKK30KK3AucHQtTm9ybWFsLTAwMDAxNSB7CisgICAgbWFyZ2luLXJpZ2h0OiAwLjAyaW47CisgICAgZm9udC1mYW1pbHk6IEFoYXJvbmk7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQorcC5wdC1Ob3JtYWwtMDAwMDE2IHsKKyAgICBtYXJnaW4tcmlnaHQ6IDAuMDJpbjsKKyAgICBmb250LWZhbWlseTogQWhhcm9uaTsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9CitzcGFuLnB0LTAwMDAxNyB7CisgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdGV4dC1pbmRlbnQ6IDA7CisgICAgd2lkdGg6IDAuMjUwaW47Cit9CitzcGFuLnB0LTAwMDAxOCB7CisgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLCAnc2VyaWYnOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIHRleHQtaW5kZW50OiAwOworICAgIHdpZHRoOiAwLjI1MGluOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTkgeworICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgJ3NlcmlmJzsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorcC5wdC1Ob3JtYWwtMDAwMDIwIHsKKyAgICBtYXJnaW4tcmlnaHQ6IDAuMjVpbjsKKyAgICBmb250LWZhbWlseTogQWhhcm9uaTsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9CitwLnB0LU5vcm1hbC0wMDAwMjEgeworICAgIG1hcmdpbi1sZWZ0OiAwLjAyaW47CisgICAgZm9udC1mYW1pbHk6IEFoYXJvbmk7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3AucHQtTm9ybWFsLTAwMDAyMiB7CisgICAgbWFyZ2luLWxlZnQ6IDAuMDJpbjsKKyAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsICdzZXJpZic7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK2JvZHkgeyBtYXJnaW46IDFjbSBhdXRvOyBtYXgtd2lkdGg6IDIwY207IHBhZGRpbmc6IDA7IH08L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2IGRpcj0icnRsIj48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbCI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBlOyAmI3gyMDBlOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij48aW1nIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoZEFDQUFOWC9BUC8vLy8vL3pQL016UC9NbWYvTVp2K1ptZitaWnYrWk0vOW1NLzltQVA4ekFNek16TXpNbWN6TVpzeVptY3laWnN5Wk04eVpBTXhtWnN4bU04eG1BTXd6TTh3ekFNd0FBSm5NekpuTW1abVptWm1aWnBtWk01bG1acGxtTTVsbUFKa3pNNWt6QUprQUFHYk1tV2FaekdhWm1XYVpabVptWm1abU0yWXpNMll6QUdZQUFET1ptVE9aWmpObVpqTm1Nek16WmpNek16TXpBRE1BTXpNQUFBQ1ptUUNaWmdCbW1RQm1aZ0JtTXdBelpnQXpNd0FBTXdBQUFBQUFBQUFBQUNIL0MwRkVUMEpGT2tsU01TNHdBdDd0QUNIL0MwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaCtRUUVFZ0FBQUN3QUFBQUFkQUNBQUFBRy8wQ0NjRWdzR28vSXBITEpiQllIMEtoelNxMWFyOWlzZHN2dGVyL2djSFVnTHB2UDRvVlFBRVc3MzRTQklFQ3YxOGxmazNCZ2VzREJiRUoyZzNaZkd6Z1poSFI0ZjBvQ2dVZ01pcE1ZV0NZNG1BdVRoRjlzVVZKYm1wdUtXRGdZZzZlakFZeU5Vd3NhcXB4V2lLSjBHQ1ducVlxc3JVd2x1TCt4ZEFKV0xTeUVHcis0bTcxTkdjckt0YXBXbzlEU2Q4MU16OURRMDFRNGREakhpc0NUMmI3Y3lvb1NFZ0VNVlpqeGhIUGU1MG5weWhnQ0V4TzNFdzkrck1SUW9RSVRJUlk0TkYyclkwL0pObVVuQ0JMa3ArTEVCQThCcTBpTUI4NE9RanJqQnZGcVdLU0VSSUkwVXRMZ1IxSENsUkFoQ01iQUVZTkdEQmFpRm5DVVJSSUpCUCtVTWxTb1RNbVMzY3VZSjFObUNoZnZXazhsUTRXbVZNRnlnbEVyTUU5S1ZjcHhKOE9uU0xZT3JjcnlLRktVS25IUTZJb3BKTmdrYUdsTUpEdmhTdFNrUTJleUxSSGc3UkVQYU9sVzdWdGw2Rm14WE5uYThIdUVvQXpEWkZXc3FqSkJaVmFKUXhOM1pXekVnTmlnRkNlRVNFR25Tb2lwTUE5blpvdUpzeEVYS2c5OGtDczZoQU5TVEpDbVZqMlVOUTdYUkZqVXFFRUR3b0dVaitXT1V1SWhac3JEbUZVeVlBMWNTSVBoTlQ0Y2dKQlowcWFSUTRSS2hZNjRRNEN1RzZvVHdGNGp3Z0d4SG1JUlE1TGlMdDZVNWdNZ2JLMitCSFlYQnh3UXd3MHAzU2JNTzBqWUZ4ME4rWjBYVDNVbXNPZUNkZ2NNRjVJZEM5V2hBUktwYVlYL0ZtbDBsSUNlYThMZGdNTU5IMUE0SENXYnpHZUVDdVJoVm9kT2JESDJ3QWs3NUpoaWlnSFdvTXNnTll3QzNrOHFlU2daVXpXKzlVQ09UTzVJSVFtYkJHa0xJUTBrVWFSV0JqcVlKRWtHeE1Ea2x6R2tTRUdBVWY1SWlCNWhHV2tIQnF4bDFGQ09LVXp3Wlk1aHVuY0FYM1JJczJLR0FWU1M1a21JMUNHaWIyOStLY01FSU16SlpBd3A2RkNIbFBxdHVGd1RoNlRDa1EwTDdQZGdNdzk0dVFNUFRQS2o2SnowcElMQmNHYnlwTVFoNGpDVlNCMmE0b0JtSzEvMllPc09WRTFnSzZpajd1QWZIZXlwQWw0UjhSeXp3QXNua01OUkw3WGFLbGV1TXRqYVF3d2dJR0R0dFJNc3NFQ3dzU3pCMFFzdm9EQUttemkwUU91bjB0bzYvNWV1dGw0TFFnWFhJb0FEZTVCK3R5cEhNc2l3Z1NxYndoR1JZR1NCa01LMXZjSWdhYmRKZkN0RHVNTG9aQzRjNndMTXo3VXBmRG53dFRYZ3FZcUxSbHdTVDc0b2VCY0xmMjY0WUdRSUFJZHdLNXpXMHFrRFBmVjByTEFNT0dpc3NiSndQQkN4eFB6RXhLUzFLWnlnUTQ0dXhESXNBUXFEKzJOQ285amdwaGpjVGVBaHp5elI0VUtPc0FqekZSTHh2SkN2Q3gzbGFkQW1PcUZCVkFnMW5YU1lZSGJjckhVU3JIcTk4TmgxMEozbklEZzgvWVVCWjZQd3JKRVN3U1Ixc2xyalpzUURIODg5dGpRWnBGcjNiMmFvcEN2Z0o2c2didUdxRXVHeDF5OXd4TmVyZ203Q3Boa2VTRzRyUlpTZkJET3dOVndZQUo5YzQ1QXZ1TDVkdVArQURZNWpNQ3NZWTlsNktIbk9Za1l2dDZOb3dyWGNuZnNXZHQydWg1TmVHSkxQSUcxS082UnJmYm84REYvdnBFWWdyendtanRkOGtONWFBQ2ExOU5QVFVBTVAxN2Zmd3c3MFlzQ25IU041LzMyeGpoTlM3aGRFc2Vzc0RUSlluL3V1bHozaXhXd0lzN3VmUEY0bkRCRjU0UVRTNDRjTFhNQStBTjZnQmpjWTRQV0dkd04wOVlBSG9DcmFJb29BZ2RtQlRZRS9tcDhkSUtjRkhyZ2dCcmVhb085aWdKM3FhVkJhT21BUCt3aVlOY0lRQVFVSlZDQU9iREFJVWJpdGJlU2pncTBteU1RWTBIQjRPcmloRktXMUExMDhUd2hBVkp3UTdhYTFFandNQzB0c1lnK0dZQUxob0FvQUFKamlEWE5VaDR4NEFHUmJaQXZtQXJDWUxJVC8wVlpKSkVBQTBHaEROYnFQQi9RWXdnTkFscnc0WW9LSWM4VEJGYXZ3d1JmeVlBWktRQ01BVE9USEFXWk5DQWJJSWdvTTJaVTUwcEdGak94QkhvY3dBRWxpQndlVnZONE9BbEFDSVlBTUJSN2paRnYwa3o5eXVPQUtLQmpsRVBhSVJoMm1FbnNudUFFQjNpZ0RGSENnQmJMa2lMWk1VVGhRaXNHVTdFSGxMMWQyQTAwS0labSt1WnNxTVBERlp3TGdWUFRxQVEybW1hTWJ2UEthMkdSTExROXlobDVpSndVaWlHYzhMU0NDRmFnUlZIS1RBUWVHa0U1MU50TU1wUVFBUEMyZ2dJSWFOQW9Hb09jS3h2bkhIYmhnZGlnZ1l6OHZOY2R1Zm1FQUVoQUJRUTNLVVFSRW9hRDBaS2dxYjRDOEx5SnpvdUJMcEM2dG9GRURjUFNsL3dlRkFnSU1Hay9yd1E5NU5YZ2U0bENLaVNNU2dsenhxQklZTFBDSm9obzFDZ2t3cUVKdlZRUGt2U0NuUWpncFQ3WEdrZDF0d2FVRkhZQUJEQkNIbzNyMXBmS013ZXd1V0lPQXhMS2Z6YXNHeWJvUVU1Z3FJQUZ3VFFBQ0RHQlVyQ3BWQkNxWUhYYk15bE1WS21LdFdqZ0FSK2s2Z0puQzFLc2ZmV20rOGlVQ0Z3eG5DRkpOSitnSVFTT09zQ0FEenRRQ1J3bWFXSVBPdGFndTlTZ1UzQXJTZUthZ0JwQkY2ZXAreXBwRlprR3dOTDFBVm1XYUFNSkc0UUJKNVdodVNWdGFFZFFGYVJPZDdEd3d1NlV0Y0ZRRXNwMnRWdzNMMitZcUlKN29uS2hhMldMVkt6QlhBUmJZcUVHN0dvWHJPdmU3OFp3b0l2bTFyQzdzbHA0aTZQOW9YWGY3WGRKbUY3MHBTR2RhL3hvUDEyWUJzZmpWYW51eGkxNTUrdGUvZWpHa1g3V0ZwQzhrSUFxSWtxY0NiQ3RQb243Q3JqQkY3d3Bpa0lNS1cvakNPWkRCQ3VTWmd2Z3EwRU9LSUM0bXFwc0ZsMFlCQlA1MU1FYjlLMW9wUkRpZUs1QUJobWQ4WVEzTFU0RW13OUpCNmd1R2drNGdDditGd2dUKzIxS2pGalNlS3FDeGtwZGN6NjY4SUhVU3FRTlE4eGFHSXdOWm5nV0FBcEhuYVdSNkx2bkxOSmJuQ2FGOEVsckd3Nkpla0djSXRDeFBLRHhneS9JVUxRV1FER1lNdjJBRFlEWnRyaUpqcEE3MHF3eitoUUtLUlZBQkIyeGdBM0J1Y3dMaUtlTTZXemlYQU1HemtsVWdBZzlJREFRZUdsUm12eENDUUxQNTBJaE90SC8vVitEb0NnUGsxS2lXTkkycEpqV0NURGtEWitpMFBDVWdhQkFjZXRDaWptZXBjNERxWHZkYTFUbEFHZFVJSWdtRWlPSm9Xb0FBa2JOczZBMTRJTmZ4cExDaisrRHJhcCs2d3BZR1dMWUowcUN3SVRzTHN2YnZqdy9kQVdqcnV0VFdUdmNEbnJ3ejFBR0dJQ3ZjV2hpMmJPdERtMXNFcFg2QnVxdTlHNG1nVHNkRmxEY1kvbHZ2UTc4WjJ0S3U4NzU3WFpzT1FmbUFYeEJCd1VHOWdRNUFJYU9pZHJTK0YvNkE1dXpHNFpUYlYvN1VBR2hRZHdERnQvN0VrSW1jOEM5dlhOMGUvempLQUpLNkUyNEMxb0R1Z0wzamVXdGFYL20vR3Q5M3cyV09hb3pRSEZDem5NU211ekRrbll2ZzBMSit3Q2Y4RzNSclMwRG1xZUU0UUVSZy85bmwxZTBNVHc5MTJEM3Rabms2T3QxWUY1eldBUUlDRGNUcXIyQS85TFBISG1RdFZ4M1ZRLys0MGRkKzZqb0lnRStLTklNSWRCNXFwOHV6QWdONDg5bDdIWE9pODczWGJWdHRPRlo2aFpXVG0rNXdCck8xR3crVHgxdTdZV1pZT2VHZlh1NUVMNW5hMXQ3TlB6eGZiUkJJSTBObU1JQTg3VjN4ak50WjYzdG5mYlc1SGloN0Facm5pSzQ5bkpOYzRUdnIvdmk5NXIzWEI4RXhNRlFBK0RxZis1WjVqZnpxSjk5enpDakR5ajBBYWx6L3R5TFdELy9XTzJtTzBNZVQ4QnZ3dnRrM0lIN3JlNkRZZVpxdkcyWnZlTE8zMy9vZ0NJY29jQ0Q1QURRL0RDdFhiK29uQWk5M2Y3b25BcmJ3S3N3MEQyNGdlMkVuZGpBR2FRWjRnUDlTQmhMeU4zOFNkMnYrSlFPb040R2VoNERoWUF2TFZ4cHYwR24xSm4waTRJRzZoMml2QWpvK05Sa05DSHdRcUlLc2gyampVQXQ4OG0xZThId25LRTgwK0hoNEZsODVnVEJ2SUlPRDlvTjhod0k1QURhdkVoS3c4d2NadUhOSXVIWTVVQkJqMDN0UENBZm5KNFZUeUhFNW9IemhNQTc1MHdvOFYyNHkwSVVMdHdFcTRHRWRvUk41NGppdEVBT2pob2I3OWdJaUVHQ3dFanFaNHdZWTVGOTBtRzR2OElYS05DTWdZVGh3TUJ4eUdFOS9hRzBWMWhYanBZZUQwQXJZNFlPTDZHdUMyQldyQlh1TmdCMDNFRSs1VjRsZnlJYng0RGJDUllKL3dCNlVXSWtQQUVUS1oxbHIwbitTT0ltZXFJb0hwenhyVW42bktJc1NwNG9vRUY1SzJlUjN1SGlJbkppS2RKaUlKOFFhd2hDTC82R0lmMmlISWlDS2NrU0V3b2lLNTRlR01uQmozK05YUGpTTnk4aU1TQ2gyQWZhTEVJY0cybE1EeE9pQjhPU0wzek5ma1RnRlFRQUFJZmtFQkJJQUFBQXNEZ0FBQUdZQWFBQUFCdjlBZ25CSUxCcVB5S1JTS0Jnc240T29OUHFzV3EvWXJIYkw3WHEvNExCNFRDNmJ6OWdGazRwdWl3ZUNnSHcrZDQ1TndvSHA0ZTdTLzNSakd6Z1pnSEoyZlUrR2l4aGNKamlRQzR1QWlVbVNrNFpjT0JoL25KZ0JpSlZEQ3hxZmxGcUVsM0lZSlp5ZWhxR2lKYTJ6cG5JQ1dpMHNnQnF6clpPaVFobSt2cXFmV3BqRXhuWEJCTVBFeE1kWU9ISTR1NGEwaTgwRTBOR0FFaElCREZtUTVZQngwc0hkdmhnQ0V4T3NFdzk4V2pFcUtwQ0FMRGlTeTNQYnozeWR1SGZ2bllvVEV6elF5MEt3SERVNisrUmMreE9yVWdtQzkyaG9wUEhPb0lRdElVTGNpNEVqQm8wWUxDNHRjSGhxRzRTTU1sUnMxTmdSSEVpUkdEVkdxbFp1MmJiL0lUTmxhbFRSY1lKTkxTRXhDdFhwa09XL253U1d6aXphOFNiT2pCdHgwR2dLYVNKVUlWaHBGSnhBdEtxV29EbG5rdVJhSXNCWEQxaXBUZ2pSMFcyV21WZWxNdVZxNDJ0VUZUTFFralVJS3N1RWpVa0p6dHpiMUs4QnFUSEx6azBoSjB1SW9TSHpMdVlLeVM4QkZ4c1BmQkE3TjRTRFRFOXdadFk4a3pNT3Z5eHExS0FCNFlER3dHSXhLZkVnVW1OZXhSc1pjUDdhUUhhTkR3Y2dMR2FBcWVJUW1VSi82KzBRb09tR3I4WnJSRGdnMVlNcFhFaFNvRTJya1hxQWZaMi9sakR1NHNDQkdEYzBuclkxRHNsNDREVE1WeThIMVVSMkY4Z2RJTnRFZFBnemh3WklaS1lVVnBUSlVZSjEyOFIyQXc0M2ZCQ2diSXhNQXA0UktraW4vOWdjSzNFVnpBTW43R0NpaFJhNlY4TXJmOVRRM0JFdmJiU2dDbk80SnNvREp1YUlZb0FrVE9MaUtvQTBrSVNNU3MyM240aHVHQkJEamt6R1lDRUY3dm5JSWlCNElERWpqWE5nd05sQ2FERHA1UTVPYm5kQVczSVlnNkdCQVRSaXBWS0V6UEdnaldkNCtjNlhPY2FRZ2c1ei9IZ2VocnBWTVlnbkR0bXdBSHI4a2ZIQWtqdndZT0tjZERLSmppY1l5RFpsUzBvTVlnMVBoY3hCS0E1VmlzRmtEejF3UkJZTm9DcmE2SHB5WlBlSmMwV1VzOHNDTDV5QWpVTmpmQXBxaHgzSkFHb1BNWUNBd0svQVRyREFBcXFhc29SREw3eUFBaVphNHRDQ3A0bnVHcXBrRSt3S0xBZ1ZBSXNBRHRucE9RbXJRbGdLaVF3eWJQQkpvVjhNSlArWFhDQ2tBR3lqTVBCcGJCTEl5cUNzTFNzOSs4Vlk2eFlGYkFwTXVndHNEV1Irc3FFUmo1UkRMZ3JNMlpKZUYvWXNTTmU2SVlDYW84QW14cUFET3VrZ1hLOE1PQlJjOEt4ZkhNcHZ2eDJKbE9PdktaeWdnNGt1bUFKdXZjbXl5QThtTm5DNVJjUVRvMXlVSEM2WVdJb3RUeUZSemd2a3V2QlFtZmxNc3BJWFE5MmpHa2JyMGpFeTBVbFlpclM5VGRlNGRKbC80S0N6RmNyUjVLRlNJWkVsSzlHb0dmR0F3bHczYlV3R2szb04wbHdjWFRtalNNdXlUU2tSQ1NQOWdrTnRaZXJtSkZwbTRVRmdJTXdGcWtGNlk4UnhxalVRR0FDYVJ1TkFickt1RWJpQURYVmowR2tWRzcxRGFnOHl6TFVncUdKbDFHMnhtRWhpOU5hRHUvYi9kVFdXVjNOZEZSN1E5STYwR3UwZzdmRFM4dkM2dDMwYVFidnRrTlFkc2o1akkxSFU4QnJWd0FQeDJQZXdRN2NZb0VsSFJjc3o3MnJkZ0RqN0JBUjBhUVE4RFRKWW56M3h4c1BlOFJDYmkyL081Ylk4K0FSQzFmYmdnZ3ZYWTk4TmFuQ0Q5eEh2ZFRlSVZnOTRvS2lZSGFJSUVOaWMwdXpISXUvUjRUVktjTUVMTFBZL1VNa2dCc1lSbmdGM3BZUHNYQTkrUTdNTEVWQlFQL3Zod0FaL3VNVFZyQmE5SWZqdmYvK0xBUWhmcDRNUituQlhPM2pGN29UQXdyaTVzR3RzSzRHK2puRERIUFpnQ0NhSWphUUFBSUFmanRCRWMxakk0bVNBZ2lOeXhXOEI2QXNTYmdpcUdoSWdBRlFVb1JXenh3TjBET0VCQzZ1ZEZ5RUJRekRpLzJDSVJPQ0JDMkxBZ3hrb2dZb0FtTkFhM3pjMElSaWdpRjJjbzFQOFpnTU1GcUVIWmh6Q0FBQnBIQndNa25nN0NFQUpoTEF3RkNSTWtWMDVEL213NFFLM1ZRR05WRFRoSll0M2doc1FZSXNvNEVBTFFPbVFZVzJDYlk3TUFpV3pZOGxWV213SE4wQ2tFR2pwR3JCOUFnTkx4QUlWSTlXdFVQblNSRGZvNURDSnlaVlI2bU1McVRST0NrVEFUVzVhUUFRcnNLS2l0aVlERGd5Qm10WEVwUlltQ1lCdFdrQUI4SXluRkF6d3pSV2NEbnNOM0J3S29Jak9wc2pCY0o5SVpoVUdJQUVSdkRPZUNFV0FGT0Q1elhzT0Q1aTBXK0lzKytsUG9vbnRDZ1kxQUVJM0tzOG9JQ0NlM0h4b0RXaFhnOTI5amFJT21keTVoR1FGQzB6aHBmOHdsVUlDNGxsUGk0MTBjeThvcVJBbWl0SkxtU0pFbzB1Q1J1RTVBQU1ZZ0FBeFRlb0FOdHJOR0d4dWdEV2d4eWQ3YXRGY0txR2pIRlZBQXJhYUFBUVlBS1pEcGFrSUFHTXY0MGkxcC9mN3hKdWVjQUNFZm5VQUgrV29VcVBBVVhLUlN3UXVrTTBRZUlwU1RIQUZqMGhBNkRzWG10QzN6bE1CQ3FWclZoWHdUUkdrb0FaN1JldnQvbEFDU1pRamttMEY2UVdJNnRFRUdEWUtCNWdwUWtXN1dJWnljd0xUUk9zblFtUytxMnEybzBtTmEybG5xd0J1cGhhbHVTc2ZKSUpLQk5reTlxRHhST29VZkV2YjRuSlRzcm05SUxxT1FOckdKaFNzcEMzdVlpMUFYVzZtUUxMbldxNFI1anJYc05LMnV0ME1yM2pYMGs5VDdGWUpDWkQvd2dSQTBFMEZHTGFiTHAyQ2R6ZmEyQlhFSUFmNHphOStjeUNERlhRekJkY0Y1UXhqbUlHSEhVR2pVbUF2ZktWUTBHNG1WZ29FNEdoOVpiRGZDdXUzdjkya3BVb05BUW5BRmdHZUU1Q0NlS013QWZGbUZLYnc1S1lLTE16aUZvUFRpeEZUUVlOMGE5VWpwRmpFM1N4QUZFenNUUlIvczhWQXRuQTNKeWkrSW5IWXdFam9aZ2gyM00wb1BJREhEbzRDQlZRYzVQMitZQU5CdHE1clBxaTNNbTJxQ3VHTmdvSXI0SUFOYkFES1RVNEFOeWxjNWZ5aVlCNFB3REtMVmFEbHBzVDRTdk54aUVDUEVJSXdNOW5NWjBaemVGZlFadnpDK2REemtMT1FSVUJlZS9UTUlIQmhrN004bktEd1NrRE1JREN6Z2dYTnpVTG5BTkdnaHJPaS8vRXJBMjVPOEdSVXdVZ1g5NndFRSt1NHpCdndBS2U1ZWQ4Mjd5SFV1SDVBaGJrcEJ3LzRqQ3h4MkdRV1RCeGlNM2RnMXAwdWRLNXpYZUZTbjhBQnZ5WkxaYlJnNGt5Ykdka2lLUFFMbHMxdFJIY2diZXRTUWFTOW8wSXNoTmZhWm43eXJHdGQ1VzY3Rzg3VUtvcFNpb1lGZEFONkF4MklRb1BSM09adHY3dmJpWm1ZWkRBQ29pMEF1Z1BzMWZRVVNteGlkZ1BaMy8vTzlXb3dBb0laelRnRFcrakF0Ym1wNlV2aldMejlqbml1SmJDYXhPak5YTlhZZ2dnMnZ2SU45RmtFRDVoQ2VFTXU4bENYUEFRU2VFRGt3cVp5bHJOY0JGTlFkN2JiWFhOUTN4emVlT1k1dGMwczY1YWJXTVEwTHpxY2o0N29jRWlpQTJpNkk3VTFIcXJvbjNPekFnTjRjcHVsZm1qZXJFWWVvTGJhaHFzVHlTUzMvTmhlQnptUXlRNW5zMmRHSWJqR2w4cEZ3UFdWSDV2ZkxMNDEzUjlRY202RHdCZ0cycnZUOFMzb0NrTjg4Q1ZIKzdKRkFBbUFBZ0pjU2VqbXRSa1A1UlhqOThxRGgzTnA3dTV1eWlQeEhGcW9BTWZ4SFd0K2h4N1JvOC9NdjAwUGlRRlBHd3NNOXdDZ055M2VnN3orMEZSL04rMVBId2d0TUp6ckcrQjlOM093Z2Q5UFhmWVI5d0J6cmpFb2JXUWhDQUFoK1FRRUVnQUFBQ3dPQUFBQVlRQm9BQUFHLzBDQ2NFZ3NHby9JcEhJNFdEb0hVS2h6U3ExYXI5aXNkc3Z0ZXIvZ3NIaE0vaTZFQW1sNXpZVUtBdkI0dkJrMkNRZW1CL3NxNzh2REd6Z1pmbkIwZTBjTWhJb1lXaVk0and1S2ZvZEZrWktFV2pnWWZadVhBWWFIQ3hxZWsxaUNsbkFZSlp1ZGhLQnNKYXV4cEhBQ1dDMHNmaHF4cTVLSEdieThxSjVZbDhIRGM3L0J5OFJXT0hBNHVZU3lpcFRMd1lRU0VnRU1WNC9mZm0vTmU5ZThHQUlURTZvVEQzcFlNU29xajM0c09KSEljWlRBd1NmeDhla3FUa3p3NE82S3YyL1A1TlNESTYzUHF6VWwvTVdqUVpGR09vQVNzb1FJRVM4R2poZzBZckN3dEFCaEtVb1FKc3BRVVpIaVJXMGFPVXFrQ0FuYU4yU1VoclJrU1ZIRnhmOEpNTEZzbE1pVEprS1QrWElTS05yeTU4V1lNaWRXeEVIajZLT0dTb1ZJcGZIUDZZUXNPMmUyOUdpMVJJQ3NIcVI2L1huMlNzdW9USTFhdFpGMXFRb1piNTJxK0hSbFFzV2gvbHJLUFZyWEFOT1ZBQ2VFU0FIblNvaWVHK0VLdHZxb0xnRVhGUTk4NEtvNGhBTk1UbVJHbHR5U01vNjZMR3JVb0FIaEFFVzhYQzhwOGNDUkl0ekFGUmxRenRwQWRZMFBCeUFJVGlUcDRSQ1dQRy9IN1JEZzZJYXN2bXRFT01EVUF5bGJTRktFRlV1UmVZQjZsYk9XOE8zaXdJRVlOeWgrcHRVTnlYYmNOTHczLzZiVVJIUVh3QStvYmlnSFh4d05TRVJHbEZTTXdWR0NjNVNrZGdNT04zeVFuMnFMU0lLZEVTb29GMWdjSlZtMXh3TW43T0Qvb1lNT21sZERLMzNVY0lseEtWVTA0RjQyYWJqR0F4N0dDR0orSkVoaVlpcCtOSkNFaWtTdE41K0xZaGdRUTR4RXh1QWdCZWJaU0tJZmRpQ3hJb3VwVUZaUUdCNm1NQUdSSGhvNTNRRm13VEVNaFA0RndJaVRSQWtTeDRHbVVVbWtEQk9BZ0dXTU1hU2dReHczZmdlaGJGTUUwZ2xDTml3QUhuMWRQRERrRGp6RW1NNmJXSXJUQ1FhcUxYbVNFb0ZFWTlNZ2NmeUpRNU5iRU5uRHBqdjROTUdtaFNLNnczaHdST2VKY1VWOGs4c0NMNXd3RFVKY2FMb3BWNTdLc0drUE1ZQ0F3SzY4VHJEQUFxYVNzZ1JDTDd5QXdpVVlQTkpDcG9UZXVtbFhuMjdLS3dnVjhJb0FEdEhWV1J5a0NNa2d3d2FlQUlyRkNUR3M1UlFJS2ZBcS95b01kd3FiQkxFeUdFdExTY3RpMGFtNVR2R2FBcEhwOGxwRGw1NU1hSVFqMzNpTEFuR2toR2VGQzUwU0ZZSzVJWEJhNWE1WjZpRE9PQVBES3dNT0FBUDhLaGFDZW9ydlR4ekZ1R3NLSitqZ29RdWtvRW9Bdk1XU2FNOGxOa3k1aEhBVEREanlSWEF3dk1Nb3RDU0Z4RGN2ZU90Q1FsN09JMGxKVmJnVUFrZ1N3YldXSEI0SG5VU2tSY2VyZEJ4YmU5a0hEallqWVlEVEtQUmdZZFFQQnhSME5VYzhVTERXU2crVGdhTmNuelpGUmRFK09TQkh4Njc5S0JFRUYvMENRbVpSZXFZa3lWSUJXN1FBNlMzUnhhWFd3RjhBWVE2Tmc3ZkZtc2JmQWpiUWpRR21TdUM5S1p2S3pScFl0c0ZlRXNuUVdROXVHdEpjVHc3TmMwdTROUC9EclJUdDRPenV6dktBdXJaNEd0SDY2NC9RelRFOVlSZVJ6dTI0MDFBREQ3eEgzOE1PMldJUXBod1BEVSs4cW5UN2dVTzlSMENRanJPdlBTODk3NzZuanZFUW1HOFBEdVcwSEhnRXVadE80SUlMME5NZ3d3MDEzSEErNzZpN1FiTjZ3SU5Dc2F3UVJZQUE1bzdtUGhKZFR3NTJJNElMWXNDcCs0MHVCcjdSM2Y5dXBZUG9RQTk5UUdzTEVWRFFQdmZod0FaOXNFVFZxR2F6SHR6dmhUSEFJT3Awc01FYTNtb0hyYUNkRUVnSU54TjJMV2dsQUI4QlhBakRIZ3pCQktscEZBQUFZTU1OZWlnT0JmR0F3WHhvRmI4RmdDNURJT0tta2llRUFDeFJnMDJVSGcvRU1ZUUhHTXgxVkh3RUNxMklBOXJ4WUlJOG1JRVNsZ2lBQllYLzhYeEFFNElCZUlpQ05CN0ZpbGUwV3crNFNJUUIwTkUzT0xnajczWVFnQklJd1dBb0lKZ2ZyL0tkN2szREJRUWdKQkc4dUVRUEtySjNKN2dCQWFRb0F4UndvQVdUUk1pdk5MRzJDRHJoa05GSjVDY2xkZ00rQ2lHVnBsa2JCb1E0UndBd0tsczlvTUVzUFhRRFNONFNsMWF4SkQybzBFbmZwRUFFMElTbUJVU3dnaVlXS21zeTRNQVFrRmxGcjRWckNvWUV3RE10b0lCeW1qTUtCcGptQ29RcHhoMjRBSE1vT0NJM0VjSUN5TGxyQ1FPUWdBaklhYzUrSWlBSzVad21PeGQ1ZzlhQkQ1WHpsSlFWbmJCUEEvVHpvZWVFQWdMTUNjM2RVYTkxTmFDZDIrYTVRc1RCYWdrV2lJSklSMHJTQkpoVG5aeXFRZXRla0ZFaElCU1oveDI5eEVlUDROQnlEc0FBQmlBQVNYY0swSDVHTXdhWTQxOE4zQ0hKVk1yT2UzNUFVeElpQ2xFRkpPQ3BDVUNBQVVoYTA1T0s0Qzd4OGcxUnVhbk1TWDNObFVNNFFEK25Pb0NKUXBTblBlMm50N3dsQWhlb1pnZ3ZUV1ZNSzJVVkZtUUFyRVBvSnpuVFdrNnBqdFNoLzRSQ1V3TUt6UlRVQUs3SWZHQWNSa0FaSFliVnB4ZXdxVVFUUU5Zb0hNQ2svY1RzWUFrcmdxKzhMSlVwUUZqQ2dFUUV5RWFVcDJiZHJHb1ZBTTFqK3ZFRjhVZ0J1QWh4c1F3aEJIUUVTSzBDTE1CUGMrcFVwTHBkclhDaDZVZDQ5RWdSVjdGdEN4dzdCTTFPVXdUK3BLcG1oVHRZM2o0M0JjVHppZVBpWWM4V2ZZTzVoVVNyZUt1Nld0NUc4N3pvRmY4QldSQ0NnclhvTFE2dFVCWjRpNUNBS0xRcG1ncW9iRFJES2xMeVB2UzVLNGhCRGdaTTRBTG5RQVlyaUdZS3NOdGVjejNKdXpqUWtSTWNHZ1VRbkplLytUeHZZS05BQUlnQ1dBWUdEbkdCRVJ4TkQreHNSWkg0aGdrazdJUnlUaUFLNklYQ0JOSnJnY3IyRkpvcUVMR09ReXlEallCZ1p3T1JpQXhzTU5NcGxGTUVNSTVtQWFDUVhtbVNkTGNpMkxHVUJ3eGJBWW5NeE82OXkyNnFFTTBRTURtYVVIaEFrNk1aV0FyZ2VNb0dmc0VHcWp5YXFQejR4ejhwazJubWk0VHpRc0hDSXFpQUF6YXdnVEdET1FIUUJER2FDWXlDQjNTbXpTdDZXSnNHOURyY0ppRUVkdjR5bi92czUvT3VZTkFEZm9BRTJvem83Y1lEalpSTTFqZi9Na0FGU0VkVEFuY0dBWi94WEdsb1lqb0hENkFOcHlQRERrL0w0NDhNbVJsZkdJcmVKZTk1QXg1b05UUUZqT1llejNvakJHbUhzbEV3NEpVTXFKR1UvTnAvcHBEZUYvTzVBOEoyOVpSZmNHeGtLL3ZiN1NDd2NmMGhqczRSQW1sVVNLK3ErWnp0S08rNDJ4c0J0N3puM1E1c2k4QVRxRWgzTk5mTlp6RUxtOWc2N25heTZVMXdaVU56cm4yZ0FyOG52WUVPUUVHZmxkNzJhRUJROElxRFc1L0h3eEVoenBDbmExdDQxU0tkY1hvQkx1VVhXUHprODhidSt3aEI2aWwwZ04zUVhEV3FrNHplUVpzYzVUZzN1S29rZ2RjNncxd0VmRGIxQTBSNlhwdm4vT2hpcGlmc3VKYnVuLzhjeVZId3Q3dW5qUFNqZzBBRGxqcDMwNEVkbW5OS1Izb0FVeTk1MVpFZUJ3R0VxWTNVZmptbG53N05DZ3hBeklNZU85blAxTjNtYUhJSVhjYzIyMnN1WmJsWGZWNzZWanZRN1QzbUhlZkI3MGdId1REOG8yK2c5N25oRVU4ejR1VXVna2NZemhYVTd2cmcvWnhqS205ZzhuNnYvQS83SUxBa1ZDRHZYQzg4NkZjditrZk1kUW9pOThDa1dZM2VnS3dlOUswZnZkQ1dJSEsxYjREMjBjekI1Mi92ZHc4a1FocCtZdHNTZ2dBQUlma0VCQklBQUFBc0R3QUFBR1VBWkFBQUJ2OUFnbkJJTEJxUHlLUnl5UndPbmxCb2MwcXRXcTlLQVhiTDdYcS80TEJZT0JpYnoyamtRaWg0cHQvaGdTQkFyOWZMWWhQWjlJQnY3WUIyWWhzNEdZRjBlSDVLREllTkdGc21PSklMallHS2FwV05XemdZZ0oyWkFZbVhRZ3Nhb0paWGhaUjFHQ1dkbjRlaWx5V3V0S2QwV2xZdExJRWF0SzZWb3dRWnY3K3JwMWVaeGNkMnNuREV4Y1dnVmpoME9MeUh0WnJDMGRLQkVoSUJETlNTa29GejA5emR0QmdDRXhPdEV3OTlWekVxS3VhQUxEaVV6SUxDMEg2ZHVIZnZuWW9URXp6UXMwS3dYRFU3KytoZ0ErVE1Ud21DOTJob3BQSE9vQVFzSVVMY2k0RWpCbzBZTEZZdGNJaEtHQUVJR1dXbzJLaXhJemlRSWpGcW5HU3RuRC8vbDBOb3p0U29vdU9FbTFkQ1loeTYweUhMT2tDRk1LVnB0Q1BPbkJrMzRxRGhWTkxFcUZLWkZxdzZBWXRRblRSSmRpMFJBS3lIckdTTnRyVkNFK3ZVcGwxdGdDVndUNGJRRUJNQVQxQVJ5c3FFalVvSjBzVHJkSytCcVRLTHZndVJnbzZWRUVSRDJsM2NWZEplQWk0Mkh2aEFvMmhJQjRlYTVOUzhtV1puSEh0WjFLaEJBOElCb2tRektmRWdVcU5keFJzWmRBYmJZSGFORHdjZ0xHWlVxYUxVMHI2WDN1MFF3T2tHc01aclJEZ3cxY09wWEVkU25FV3JrWHFBZlo3QmxqRHU0c0NCR0RjMG9yNDFEc2w0NERUTVZ5OFgxVVIyRjhnZE1OdEVkdmhqaHdaSWFDYmRVSlhSVVlKMUxzbDJBdzQzZkJEZ2JJNVVBbDRSS3Z5bS8xTWRLM1UxeWdNbjdHQ2loUmE2VndNc2dOU1FTVVV3YmJSZ0hhOWQ4b0NKT0tJWUlBbVZ1RWdIaTNRMGtJU01TODIzbjRodkdCQURqa3pHWUNFRjd2VUlKQ0I2SUxFZ1lheDB0aEFhSnFZd0FaTW1Pcm5kQVd6UndReUdCdjZZaEhTRjFQRmdqV2VBS2NNRUlJQ0pZd3dwNkZDSGorZGhxRnNUaEh6aWtBMExvTWVmR0E4c3VRTVBPTDVqSjVqb2ZJTEJiRk1DQXFoWFBSbFNoNkU0VkFrR2t6MkV1b05rb1RMNjZBN3IwWkVkS000UlVRNHZDN3h3UWpZT2hRRnFxS1ZKSmtPb1BjUUFBZ0xBQmp2QkFndXNpb3dTRHIzd0FncVpZQ0JKQzU4dXltdW9ZMDNBYTdBZ1ZCQXNBamhreDJkelNoQlNqZ3d5YkFES29WME1GUDlYVlNDa0VPeXBNUGg1TEJMSnlyRHNMU3RCMjBXMTY3NFRiQXBNdWh0c0RXV0NzbUVSa1l3ckF3ck1uWkxlRmk0c0tCaFpJWWphSmJCaDZvQk9Pa2NrTE1rTDVPSlFjTUcwZHZFQXYvMU9wZ0tPd0tad2dnNG11bkJLcS9VcXl5SS9tZGl3SlJYS0RiWlV5aDNSNFlLSnB0d0NWUkxsZ0N5REN3K1ptVThqSzVuRlVRZ21ZV1JYWEhhUWJIUVM0aXI5d3RNOUFlSVBEanN6WVVCTklhQ1E2NVgzaERUWXJFYW5kc1FEQ24rZER6TVpWTnJURlJ0Wnk3WjBJakViZDBzSWYyeXZRMnhwNm1ZbHpscmhRZCtoR3ZRM1FSdXJXZ09CQWFRNWx4R1NrS3ZzYXdRdVlFT2xHSGphQkZXaHp1a2hyb3A1YTJ3bWxORHI5V3RnVzRQL3VUWFhUZEgzREx4cXRNTzB3RS9MZyt2Zi9tbkU3TFJ6Y29qSWdiQlE5aEZ2RGNaNzd6VFV3RVB3MlBld2c3Y1lhTjdNOFo0bjd4QUxlZ09DZzc1SzFHUXQ5VEpZbjMzd3c3L09NUkhoaTMvM0xROHl3ZnM3THJod1BRMHl1RUVOYnZDKzRMbnVCdExxQVE4WUpUTTYxR2NJRVBBYzArekhJdS9aQVRaS2lJR28rcGU2R0JqbmR3WGtsUTZ5Y3ozNEZTMEF1UnNDQ3VwblB4dUl6VUdWS01Iemh0Qy9Hc2JBZzY3VFFRaDN5S3Nkd0NLRkJGamg0ZXozbE1HVkFIMUdxS0VMTkRnRUU4aUdVZ0FBQUE5RGFLSTZMTVFENUVJQkVUc3p1QURvQlFrYzdNRU1DUkNBS0lKd2l0bmpBVHFHOElBczJtMkw1WEJoRjNFQVJCckcvNEFITTFCQ0ZBRXdJVFMrcjJoQ01JQVF0UWhIcDNUUml4Z3N3aGlkc0VmajRNQ1B3ZHRCQUVvZ2hDeWl3R09GeEJUNTRsWUNGMkNoakZFa0lTU0ZkNEliRUFDTEMrTkFDekxwRkdJcHoyaUpyRUlqcy9QSVVWcnNCb01VQWl0cFo2WlRZQUNKVTRqaXBMelZBeHJZMGtRM3NLUXVkOW1aOGpYdkNxRTBUZ3BFUUUxcVdrQUVLNWdpbzVRbUF3NE1nWm5OakZzc216Q0FLRTdUQWdwSXB6cWhZSUJycnNDWWFkeUJDenlIZ2lhQzB5bHlqQnN3bHpBQUNZZ0FuZW9NS0FLZ2tNNXJ3ak9TTi9BYStsWjV6M0k0YzNtTEpNSS9EUkRRaXE3ekNRaFFKeldCdHoydjFTQjNkR3RvT2JSMkNHYzVSRWhOc0VBVVZzcFNLQ1JBbmYvdUZGVU52UGFDandxQm9TSnQycm5LWVRva1VEU2RBekNBQVFqUTBxSU9vS0xWaklIbkJGZ0RlbUFTbkxkVHhzT1VjRkdMS2lBQldFMEFBZ3pBMHAvQ1ZBUXE4Snh4bkpwVEN5NXZuRVk0UUVDNU9vQ01XdFNvVDdBb3VjZ2xBaGZNWmdnNEJhZmlBaEdpOFdVQXJVWUlLRG9KS2xDMnNsTUJBNDJyVlJWd1RSR2tvQVo0RldubEFtRlNDQ1ZCclJxOUFGQXhtZ0REUHVFQUx3MW9hQmRiVUdxV2hRQWkzZXM1L29xa0pBUlVCSnJkYkZIZFN0cmFLb0NheTJ5b1ZMdlNVeUxRbHJFQVZTZFJvL0JiMnhxWG1nM05aeVlhbzRUUk5sYWdYUjJ0Y1JkcmdlcFNNd1ZRaFdVNTZtZ0V1TUxWcTdhMWJqWEhTMTYxRk5Lc3hPci9DV0NMa0FBbzBLbWFDakJzTlZVYUJmQld0TEVyaUVFTzlzdmYvdVpBQml1b1pncXdhei9wSElLMWt1aXRFU2dLQlJDTWw3NzlIRzlpcFdCUi9NckF2eGp1TDRDcmFiK0lGYWw1MjIxQ09pY0FCZkkrWVFMa25TaEwwMGxORldUNHhUREdwbE5lTUxsN1pLa2NFUjBDaTB0Y3pRSThJY1hXWFBFMVlVemtERmR6Z2pVbXlIa3F1MDhsVkRNRVA2N21FeDRBNUdvbWxnSXRMckovWDdDQklsOVhNbFc1VWdmUVZZWHhQc0hCSXFpQUF6YXdnU3BMT1FIVXZMQ1crWXVDZVR5Z3l5OVdnUWc4MEM4UVNPZE42MTJDbWFQTTVqYTdlYndybVBOKzdjem9lZUE1dzBEem1Rb3FXd2dzakZjQ1p3WUJtOUY4YUdvcU9nZU5EcldkL3grZGc0bjE2eDZNMk1jcVdwVUU4dnA0elJ2d1FLZXBxZDg1ODBIVXVIN0Fmdm04TGw3ZlF6OU5ZelVTeUV0aU5uZGcxcDVXZEs1elRXT1VTZTR0TnFiUjBheEFYazJ6R2RraVVQUUxsaTFxMWhCRWNoOStvV1d1VUUxcnM1bktzNjYxbHJuZDZNQjRlM0x6bzBLaDU5MkJKL2p6MEhQZU5yc2Z3QnZXS09odjV0TGJHcTVnYkFkdk9nb29Uckc2aWF6dlpmZmIzNENaeDk4bVdJa01ZT0hhMU53MHBubE0zbnh6MjkwUUR3R2pGU0p4akx5cUVvRU9sNkZGd09ZUVVQTUJVUml2eDNFdGdaQ0haTi96RU1INGRFcWppNjhjNDlTTUFycXp2VzVjMnp6aU9IOEFDRFRBcWVYNVhOWXNYN21VZnp4elJvTWM0aVJQdXAzcklGa0F6ZEh4Q2gzQU9OQ3JXWUVCVUhuT29YNDR4TFVlNnF4TjFobzVOa0xVanozMkZCY1oxMnEvT2R0RmpTOUxoNzNOR3ppMm0yRjhhNk5yUmg1N0Z6VUltSkVtUzBlZDVZS3ZNb1lienUyc0oxN1VPbThUdUt3UUJBQWgrUVFFRWdBQUFDd09BQUFBWVFCb0FBQUcvMENDY0Vnc0dvL0lwSExKSkE0R3phaDBTcTFhcjlpc2RzdnRlci9nc0RpNUVBcWU0N1JXRUdpNzNWQ3ZTVGd3UGRUVXQ5N3QzZUF5ZTIxeGVFaUJnUmhYSmppTEM0WjdoRVNOam9GWE9CaDZsNU1CZzNnTEdwcVBWWCtTYlJnbGw1bUJuR2tscDYyZ2JRSlZMU3g3R3EybmpuZ1p1TGlrbWxXVHZiOXd1NzNId0ZNNGJUaTFnYTZHaE1lOWdSSVNBUXhVaTl0N2JNbHEwN2dZQWhNVHBoTVBkMVV4S2lxTGV5dzRqY1I4eHIwbjdlM2xLaWNUSHVwVThtMWI5aVplRzJkNlZvMHBrYThkalljMHl1MlRZQ1ZFaUhZeGNNU2dFWU9GcEFVRFF4R0M0RkNHQ29nUEpWcXJlTEhoUTBiTXRoR0RKQVRseVljcUpFNVlXY1Zpdy8rYkx3ZUdyQWNKS0VxZEVsbTJkQWdSQncyaGl4RFNGTUtVaHI0Sk9aTldzZWtTWlVhb0pRSk05Y0FVNllRUUVzVlNRYm5VYUZDb05xWVNhQ2VESzlaOW02aE1nT2d6SDhxM1F1VWFNR295NjlrVWJhaUV3R214N1Yrb2krUVNjQUh4d0FlclowTTRvTVNrWldQSEtDSGprTXVpUmcwYUVBNDhyR3Qxa2hJUEZ4KzI5UXVSQWVTcERVelgrSEFBd2w4R2t4UU9PWGx6dHRzT0FZUnVtS3E3Um9RRFJqMkFrb1VrQmRldUQ1RUhpQmQ1YWduZExnNGNpSEhqNFdaWTJaQmNwMDFEZS9KdE5FMDBkOEg3Z0dtRWIraTUwWUNrOFUrbWlMVlJnbktFbEhZRERqZDhVSjlwaHFUU0RSSXFHT2VYR3lCQnBjWURKK3lnb1lJS2lsZi9nNE52MUJEY0VTUkI5SjhLYm9pV3hnTWF0c2hoZlNRNEltSXBlelNRaElrL25mZWVoV0FZRUVPTFFNYWdJQVhpeVFpaUhuTkFlT0liR0VBR2tCZEFScm1Ea004ZEVGWWJ2ekNvWHdDSUtOblFIMjRNcUdJWFVaWWpaWXN4cEtDREd6TnV4NkJyVGZpUnlVQTJMTUFkZkZvODhPTU9QR2hvNXBsQWVwTUpCcVlkcVVlY1VjVUVpQnQzNHBBa0ZrRDIwRU5FV05FZ2FaK0FmdGRHYzVvSVY4UTJ0U3p3d2duUERKUkZwSkpHS0pFTWt2WVFBd2dJeENyckJBc3N3Q2tvU3d6MHdnc29UTklrRGkxQXltZXJreG8yUWF1eWdsQ0JyQWpnMEZ5YmpuZ3FoQi9ieUNEREJwcmdXUVUrWnBrRlFncXlBZ3JEbTdnbW9hc012TUlDLzFLd1ZWelZyVTZ5cGdBa3VMTFdjS1VtMUIyaFNMVXlvQUFjTE4xTndjNS9hSFViZ3FRdDBxdGhERHA0ODQwUit5N3lnclU0M0h0dnFWWG82ZTY3RWwzVVlxd3BuS0NEaGk2QWt0NFI1Kzdxb0R5VDJQQmtGQU1YekxGT2JiaWc0U2V3dVBFeUVkdE1MSU1MQkdINWppTWdyV1ZWTzU0MTFPMGJGK2U4ODdRU1cvdkMwQ2tHamFVZU9EeE5Ja1JubmZpVFJWaVJtbk1nTmhyeEFMOVRELzFMQm9iR0ZBVmFpMkhsTmNFcTlEcTJTRVhzTzNIYWk0UzFhSmlPTk1tRUIzV0JjSmFrKzh6ZGtNT2Ixb0JmQUZzaXNZalVmQXVGM3dJMkdJckJvK3FsdEpla01uVDlrNlJIbi9Uc3JaTTBJcm5QbFVPMVJ6T0I0TEFjRWg1NGZ2OXNxdy90UU96dXhQSndPclJ3R3NHNmFOc1lXakU4V2hPZzArNFAxY0FENzlEM3NNT3pHR3o1aGtMREV6OFFDMjFqelc0UkVLRDFFTEdyT1I4OTc3NmovdkFRVW1zL2xQVk1qMlpFUDdlNzRNTHpOTWh3UXcwM25NLzc2VGNZVmc5NDBLZVNZUWw4VWdPYSt5eVJINEFad1FVdlFKajlRQmNEM2VqT2Y2M1NRWE9laHo2Y0JhQUVSVUJCK3hhSUF4dm9RUkpOWTlyTGVtQy9Gc2FnZ3FmVEFRWm4yS29kcEdKMlFoQWh1a2c0bEx1VjRIc0VZS0VMZXpBRUU1U21VQUFBQUEweHFDR2REWUZ3L2VLaDYrNFdseUVJVVZMSkMwQVNMN2pFNlBIQUcwTjRnTFZRMERvZW12QnV5WmtkRDF3UUF4N01RQWxKQk1DQnVuZytuQW4vd1FBNlJJRVVwMGhGK2ZVZ2VVTVlRQngxZ3dNNjhtNEhIeFRDR0ZFUXNUMG1pbnRqSzRFTENBRElJV2d4aVJzMFpPOU9jQU1DUUJFRkhHaUJJNFZTS3dibVRINU5HR1J6Q3FsSmhPM2dCbmtVd2lpSmR6Vk5ZQUNJY0FRQW9aNDFxVlpxNkFhTGxPVXNJZE05ZUVRQms3cEpnUWlXdVV3TGlHQUZTK3lUejJUQWdTRU1rNWhqUTZVU0JBa0FaVnBBQWVBTTV4TUdZQUJucnNCU1h0eUJDNlNHZ2lKZWM0cC9XeDhTQmlBQkVYd3puUGhFd0RqQjZVeDBIdklHclB1ZUtOL0p4M0lwd1o0R3dLZEN4ZmtFQklSem1idWJIdXRxTUx1ekVWUW9qSk9uRVN3d3pvNTY5S01KQ0tjNUVWWUQxcjJBb2tJWTZFVVRCWW9LSlNHaC8rQWtwd0VJOE5HYTdoT2Z6SXlCMVBaWEEzVTBjcVU1RTRBMmk4RFFoU29nQVVoTkFBSU04RkdZaWxRRUtwQ2Fibnk2MGg2Q2dnVkhPQUErbVRvQWh5N1VwamZGcDdXc0pRSVhtR1lJS2dXcUk0U1NBUndTQVovZkRDczRsK3JSaE9yekNVYmw1ekpUVUFPMFZwVnF6MmpFTmw2bTFZZGVJS1lOVFFCWHgzbUFrT0xUc1huVnF3Z21JTXkvYXFKQ3dESUNUZytMV0p0Nk5iS2dWY0F5Szd2U3g4VnVFWno3ckFJc2NNOXcwclNqcWcydGJKZjVWOWhOd2xSRWdLd3pSWkRQcGtKV3RubGw3VzVUVUZ0TmlHbW9ZRTB1T1lHNzJ0MHk4N25QL1FwQmM4WTVBaVJnbkJNQUFUTVZzRmhtY3JTalRsM29ibGNRZ3h5WTk3em96ZitCREZiQXpCUVFkNVlsY0VCR0tVU1VPeXBnbk5yMTdqanJ5Y3k3anBNQTRsM21DbVNRM2dLamQ3M01uR1VLOHFFanJDM0FyUUJXd0FUR0NkMG5UQUM2Q1Awb09KZXBBZ043K01QUGxPTEFHaUtkTjJqcnJhS2xNRE1MOEFRTU4xUER6dnl3akEzTVRBVzZ6MnZZcXRwUWhjRE1FTFNZbVU5NGdJdjcrd1FLY0hqRzZYM0JCbWE4VjlISVlNUmVzeE51amZEY0orUzNBZzdZd0FhR0RPUUVMSlBBU0Q0dkN0THhnQ1Y3V0FWTkZncVU1K2FCZ2VCU0NDR284bysxdkdVdVAzY0ZZVFl2bWZlY0RqUFRXQVRTWllmTTlrR1doblJnRVMyQU1CSGl6RXdKV0JrRVdzNnZuWmVaNXh6dytkSms5ck41WmJCTUJXNE1LUXpPUUdiL0R3cGRGbWQ1QXg2WTlETExHMlk3WVByVkR5andNdHZnZ1psaGhRMGdaQUtHSjZ6bERxaWEwbm1HTmF3THpPa1RPTURXV0VsTUV6QU1hUzMvV2dSNWZvR3dwODNuRG9DdFd5b29kSW1qOE54bWExbklxbVkxa3FsTmJqSWJTeWMvcWE4U3ZFM25EWFRnQ2Z6bGNwaWxYVzVxOTZWZ2hta0loYUpBNXc1b045SWR2VENHeFMxamV0Y2IxcDlwQ0FoT0ZLQUFaQ0FLSFhEMk1pUHRhQlZEZDk0SGg3VUVQdE9YdWVVNE9keVd1QWkwek9nSGRQUzVHTTg0cGprZUFnazhRSEZZQzNtZFJ6NXpFWFFVM05BZXQ4b3Z6WEp6ZTYzQklGKzJsbE5OY3d4VE9PVTdKM1BQK1h5TlJuUmdTN0piZHNUckxISm1WbUFBUWc1ejB2Y01uWnZQb09QU1RKdHZjaXJKWTVyN3V1b1ludkhXeWR6MXh2emoxZXJpdGdpbVBuSmZ5OXZEcmw3N0F6ZytiUkQ4UWo5eUw3cTc3VnhnZyt1ZDQxOFh0Z2dXRWM4OVNJc0l6SFQyNElmY1lmTXFXZTlrem96YnliMTR3RDZJQ1JXWXVMdFJMVy9NODFuemphbDM1L3VtQ3lZSTNBTjBsalIwK1dINlBTKzkzS3YzL0J1aUlQQ3BiMEQyek16QkJtcXY5TlFmM0FQQWNZYWRvc0dFSUFBQU93PT0iIHN0eWxlPSJ3aWR0aDogMi4xNTYyNWluOyBoZWlnaHQ6IDIuMzc1aW4iIGFsdD0iTU1qMDI4MzEwMTAwMDBbMV0iIC8+PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbCI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDAxIj4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDMiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDQiPiYjeDIwMGY715jXmdeV15wg15zXlNeV15PXlSDXoNek15DXnCDXpNeR16jXldeQ16ggMjAxMyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA1Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDYiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY715zXoNeV16HXoteZ150g16nXnNeV150sJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwOSI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9ee15XXoteTINeU15jXmdeV15wg15TXldec15og15XXnteq16fXqNeRLiDXkNeq150g16LXldee15PXmdedINec16bXkNeqINec15fXkdecINeQ16jXpSDXkdeq15XXmiDXqteqINeU15nXkdep16og15TXlNeV15PXmdeqLiDXlNeY15nXldecINeU16DXlSDXmNeZ15XXnCDXnteo16rXpy4g15jXmdeV15wg16nXmdek16LXmdecINeQ16og15vXnCDXlNeX15XXqdeZ150uINeW15Qg15zXkCDXoteV15Mg15jXmdeV15wsINeQ15zXkCDXl9eV15XXmdeUINep15DXmS3XkNek16nXqCDXnNeX15bXldeoINee157XoNeUINeQ15PXmdep15nXnS4gJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNyI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXnten15XXnSDXqdee16LXldeo16gg157Xl9ep15HXldeqINeo15HXldeqLiDXntei15zXlCDXlNeo15HXlCDXnteQ15XXkyDXodeZ157XoNeZINep15DXnNeUINeV15nXl9eTINei150g15bXkNeqINeo15HXmdedINee15TXoNeV16HXoteZ150g15fXldeW16jXmdedINeU15HXmdeq15Qg16LXnSDXqteX15XXqdeUINep15TXnSDXqNeV16bXmdedINec15fXlteV16gg15XXnNeq15XXqCDXkdeUINek16LXnSDXoNeV16HXpNeqLiDXnten15XXldeUINep15DXqtedINeq16nXldeR15Ug16LXnSDXlNeo15LXqdeUINeT15XXnteULiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDkiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNyI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXnNeU15zXnyDXnteh16TXqCDXotem15XXqiDXnNeg15XXodei15nXnTomI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA5Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY715TXm9eg15XXqiDXmNeo15XXnSDXoNeh15nXoteUICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY715vXk9eQ15kg15zXpNeg15XXqiDXnNec16nXm9eqINeU15HXqNeZ15DXldeqINeU16fXqNeV15HXlCDXnNee16fXldedINee15LXldeo15nXm9edLCDXkdeb15PXmSDXnNeU16rXmdeZ16LXpSDXotedINeU157Xl9ec16fXlCDXnNeY15nXldec15nXnSDXldec16fXkdecINeU15PXqNeb15Qg15zXkteR15kg15TXl9eZ16HXldeg15nXnSDXlNeT16jXldep15nXnSDXnNek15kg157XpteRINeU15HXqNeZ15DXldeqINep15zXm9edLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDkiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNyI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXldeZ15bXldeqLNeT16jXm9eV16DXmdedLNeR15nXmNeV15cg15XXqteZ16fXmSDXmdeTIC0mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMTEiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC0wMDAwMTIiPiYjeDIwMGY7MS4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXqteV16fXoyDXlNeT16jXm9eV158g15zXpNeX15XXqiDXl9em15kg16nXoNeULiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAxMSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAxMiI+JiN4MjAwZjsyLiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9eV15nXlteUINec15TXldeT15UgKNeb16DXmdeh15Qg15vXpNeV15zXlCkuINeU15XXmdeW15Qg15zXoNek15DXnCDXoNei16nXmdeqINeR15vXoNeZ16HXlCDXnNeg16TXkNecLCDXmdepINec15TXpteY15nXmdeTINeR16nXqteZINeq157Xldeg15XXqiDXpNeh16TXldeo15gg15zXlNeV16bXkNeqINeU15XXmdeW15QuICAgICAgICAgICAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXotec15XXqiDXldeZ15bXlCDXlNeV15AgMjUkINec16DXldeh16IuINebIteQINee15TXoNeV16HXoteZ150g15nXqdec150g16HXm9eV150g15bXlCDXkdeb16DXmdeh15QuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDExIj4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtMDAwMDEyIj4mI3gyMDBmOzMuJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY715HXmdeY15XXlyDXqNek15XXkNeZINeV157XmNei1586INeb15PXkNeZINec16LXqdeV16og15HXmdeY15XXlyDXqNek15XXkNeZINeU15vXldec15wg16TXmdeg15XXmSDXkdeU15nXmNehINeV15zXkCDXnNeU16HXqtek16cg15HXkdeZ15jXldeXINeh15jXoNeT16jXmNeZINep15wg15fXkdeo15XXqiDXm9eo15jXmdeh15kg15TXkNep16jXkNeZLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAxMSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAxMiI+JiN4MjAwZjs0LiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9eZ16kg15zXptec150g15DXqiDXlNei157XldeT15nXnSDXlNeo15zXldeV16DXmNeZ150g157XlNeT16jXm9eV158gKNek16jXmNeZ150g15XXldeZ15bXlCkg15XXm9efINem15nXnNeV150g16nXnCDXm9eo15jXmdeh15kg15TXmNeZ16HXlCDXldec15TXmNee15nXoNedINeR157XlteV15XXk9eULiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAxMSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAxMiI+JiN4MjAwZjs1LiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9eR16rXmdenINeU15nXky/XnteW15XXldeT16og15TXmdeTINeo16bXldeZINec15TXm9eg15nXoSDXl9ec15nXpNeqINeR15LXk9eZ150g15zXlNeX15zXpNeUINeV16rXqNeV16TXldeqLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LTAwMDAxMSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LTAwMDAxMiI+JiN4MjAwZjs2LiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9eR16rXmden15kg15TXmdeTINeZ16kg15zXp9eX16og157Xmdeb15zXmdedICjXqdek15XXqNek16jXldeqINeV15HXp9eR15XXp9eZ150pINeU157Xm9eZ15zXmdedINei15MgNTAg157XniLXnC4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMTEiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC0wMDAwMTIiPiYjeDIwMGY7Ny4mI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXntep16fXnCDXnteW15XXldeT16og15TXnteY16LXnyDXnNeQINeZ16LXnNeUINei15wgMjAg16ci15IuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwOSI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9eU15jXmdeh15Qg157XoNeq15Ei15Ig15EgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY7IDI1LzIvMjAxMywg157Xodek16gg15jXmdeh15QgJiN4MjAwZjs8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMyI+JiN4MjAwZTtUSyAmI3gyMDBlOzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEzIj4mI3gyMDBlO+KAkyYjeDIwMGU7PC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTMiPiYjeDIwMGU7IDc4NyAmI3gyMDBlOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY715DXqiDXlNee15jXotefINeZ16kg15zXqdec15XXlyDXmdep15nXqNeV16og15zXnteV15HXkNeZLiAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA5Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY715nXqSDXnNeU15LXmdeiINec16ki16ogMyDXnNek16DXmSDXqdei16og15TXlNee16jXkNeULiDXm9ec15XXnteoLNeR16nXoteUIDEyOjMwLiDXkNee16rXmdefINec15vXnSDXkdep16LXqCAzMiAo16LXnCDXmdeTINeU15PXnNek16cg16nXntem15XXmdeZ158g15vXoNen15XXk9eqINee16TXktepINec16fXkdeV16bXldeqKS4g157Xkden16nXqiDXnteb15wg15TXoNeV16HXoteZ150g15zXlNeS15nXoiDXnNeg16fXldeT16og15TXntek15LXqSDXoteV15Mg15jXqNedINeq15fXmdec16og16rXlNec15nXmiDXlNemJ9enINeQ15nXny4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA5Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY715vXodejINeV15TXldem15DXldeqICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY715vXk9eQ15kg15zXlNem15jXmdeZ15Mg15HXk9eV15zXqCDXkNee16jXmden15DXmSDXqNem15XXmSDXqdeU16nXmNeo15XXqiDXmdeU15nXlSDXl9eT16nXmdedLCDXm9ee15Ug15vXnyDXnteV157XnNelINec15TXpteY15nXmdeTINeR16nXmNeo15XXqiDXlNen15jXoNeZ150g154gJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY7IDEwMCQuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNyI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXlNeU15XXpteQ15XXqiDXlNeZ15XXnteZ15XXqiDXlNep15XXmNek15XXqiDXnNeQ15PXnSDXlNefINebLSAyMCQgKNeQ16DXl9eg15Ug157Xp9eR15zXmdedINeQ16jXldeX16og15HXlden16gg15XXoteo15EpLiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmOyDXodeb15XXnSDXlteUINeQ15nXoNeg15Ug15vXldec15wg16fXoNeZ15XXqi4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9eR16DXldeh16Mg15zXodeb15XXnSDXlNegItecIC0mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9eb15wg16DXldeh16Ig15nXqdec150gMjUkINei15HXldeoINeV15nXlteUINec16DXpNeQ15wuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNyI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXm9ecINeg15XXodeiINeZ16nXnNedIDMwJCDXntehINeg157XnCDXkden15jXnteg15PXlS4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA5Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY716jXpteV15kg15zXqdee15XXqCDXkNeqINeQ15fXqiDXnten15HXnNeV16og15TXnteo16og15TXm9eh16TXmdedINeV15bXkNeqINeR15vXk9eZINep15DXpNep16gg15nXlNeZ15Qg15zXlNeX15zXmdejINeQ16og15TXm9eh16Mg15TXoteV15PXoyDXotedINeh15nXldedINeU15jXmdeV15wuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAwNyI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXqdei16jXmSDXlNeU157XqNeUOiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiPiN4MjAwZtebLSA1My45INeo15XXpNeZINeU15XXk9eZICAgINecICN4MjAwZjwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCI+I3gyMDBm4oCTI3gyMDBmPC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIj4jeDIwMGYgMSQuI3gyMDBmPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+PHNwYW4gY2xhc3M9InB0LTAwMDAxNCI+JiN4MDBhMDs8L3NwYW4+PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmOzE0LjY2INeo15XXpNeZINeU15XXk9eZICAgPSAxINepIteXJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCI+I3gyMDBm15stIDg2LjY4ICDXqNeV16TXmSDXoNek15DXnNeZINecICN4MjAwZjwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCI+I3gyMDBm4oCTI3gyMDBmPC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIj4jeDIwMGYgMSQuI3gyMDBmPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udCI+PHNwYW4gY2xhc3M9InB0LTAwMDAxNCI+JiN4MDBhMDs8L3NwYW4+PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmOzIzLjc1INeo15XXpNeZINeg16TXnNeQ15kgPSAxIOKCqiYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY715TXpNeo16nXmSDXltee16DXmdedICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY716nXoteV158g16DXpNeQ15wgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY7157Xp9eT15nXnSYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmOyDXkNeqINeZ16nXqNeQ15wg15EtIDMg16nXoteV16og15UtIDQ1INeT16fXldeqJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXqdei15XXnyDXlNeV15PXlSAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXnten15PXmdedJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY7INeQ16og16nXoteV158g15nXqdeo15DXnCDXkSAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjsgIDMg16nXoteV16og15UgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY7IDMwINeT16fXldeqJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA3Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9eq16fXqdeV16jXqiAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDExIj4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMTciPiYjeDIwMGU7LSYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9eQ15nXoNeY16jXoNeYJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtMDAwMDExIj4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMTciPiYjeDIwMGU7LSYjeDIwMGU7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9eY15zXpNeV16DXmdedINem15nXkdeV16jXmdeZ150mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMTEiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAxNyI+JiN4MjAwZTstJiN4MjAwZTs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY715jXnNek15XXoNeZ150g16HXnNeV15zXqNeZ15nXnSAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjsg15TXqdeZ157XldepINeZ16fXqC7Xmdep16DXnSDXkNeW15XXqNeZ150g16nXkdeU150g15DXmdefINeb15nXodeV15kg15zXmNec16TXldeg15nXnS4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMTEiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAxNyI+JiN4MjAwZTstJiN4MjAwZTs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY715zXkdei15zXmSDXlNeh157XkNeo15gg16TXldefINeV15HXotec15kg16fXlSDXkdeW16cg15HXkdeZ16osINee157XnNeZ16bXlCDXnNeU15XXqNeZ15Mg15DXqiDXlNeQ16TXnNeZ16fXpteZ15Qg16nXnCDXkdeW16cg16nXoNen16jXkNeqINeR15kt16TXldefIC0gJiN4MjAwZjs8L3NwYW4+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMyI+JiN4MjAwZTtCUEhPTkUmI3gyMDBlOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC0wMDAwMTEiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAxOCI+JiN4MjAwZTstJiN4MjAwZTs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY716bXnNee15Ug15DXqiDXqNep15nXnteqINeR16rXmSDXlNee15zXldefINeV157Xodek16jXmSDXlNeY15zXpNeV158g16nXqten15HXnNeVINeV15TXqdeQJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY715nXqNeVINeQ16og15TXqNep15nXnteUINec157Xqdek15fXlC4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA5Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMDciPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY715fXqdee15w6IDIyMCAmI3gyMDBmOzwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE5Ij4mI3gyMDBlO1cmI3gyMDBlOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDA5Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGU7ICYjeDIwMGU7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMjAiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMiI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXqteo15XXpNeV16og15XXlNeZ15LXmdeZ16AmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXlCYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE1Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9ec157Xqdeq157XqdeZ150g15HXqteo15XXpNeV16og15HXkNeV16TXnyDXp9eR15XXoiDXmdepINec16fXl9eqINeQ15XXqtefINeR16rXmdenINeU15nXky4g16jXpteV15kg15zXp9eX16og16rXqNeV16TXldeqINec16nXmdee15XXqSDXkNeZ16nXmSDXm9eS15XXnzog15DXp9eV157XldecLCDXkNen15XXnteV15wg16fXldec15MsINeq16jXldek15Qg16DXkteTINeU16jXotec16og16fXmdeR15QsINeV15vXk9eV16jXmdedINee16LXldeo16jXmSDXp9eZ15HXlCwg15DXkteT15nXnSDXoNeT15HXp9eZ150uJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXntee15zXmdem15Qg15zXp9eX16og157XmNec15nXldeqINec15fXldeqINeV15In15wg15zXl9eZ15jXldeZINeU15nXk9eZ15nXnS4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMiI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXkNeV15vXnCDXldee15nXnSAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE1Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO9eQ16TXqdeoINec15TXkdeZ15Ag157XoteYINeX15jXmdek15nXnSwg16TXmdeo15XXqiDXmdeR16nXmdedINeV15vXlScg15zXoNep16DXldepINeR15nXnyDXlNeQ16jXldeX15XXqi4gKNeQ15wg16rXotee15nXodeVINeU16jXkdeUINee15PXmSAhISkuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXnNee16LXldeg15nXmdeg15kmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXnSYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmOyDXkdeQ15XXm9ecINem157Xl9eV16DXmSDXkdeY15nXodeV16og15nXqSDXnNei15PXm9efINee15HXoteV15Mg157Xldei15Mg15DXqiDXodeV15vXnyDXlNeg16HXmdei15XXqiDXqdeQ16bXnNeVINeo15vXqdeq150g15DXqiDXlNeY15nXldecLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY7157XmdedICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvXmdepINec16nXqteV16og157XmSAmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjvigJMmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjsg16TXldec15DXqNeZJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY716EmI3gyMDBmOzwvc3Bhbj48c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAwOCI+JiN4MjAwZjsuINeR16LXqiDXp9eg15nXmdeqINeR16fXkdeV16cg157XmdedINeZ16kg15zXkdeT15XXpyDXqdeU16TXp9enINeU15XXkCDXnten15XXqNeZLiDXoNeZ16rXnyDXnNeo15vXldepINee15nXnSDXkdeb15wg157Xp9eV150uINeQ15nXnyDXpteV16jXmiDXnNen15fXqiDXnteU15DXqNelLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMiI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAyIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE1Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9em15nXldeTINeQ15nXqdeZICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY716DXotec15kg15TXnNeZ15vXlCwg15vXldeR16Ig157Xqden16TXmSDXqdee16ksINee16nXp9ek15kg16jXkNeZ15Qg16jXlteo15HXmdeZ150sINen16jXnSDXlNeS16DXlCwg157XoteZ15wsINee15jXqNeZ15QuJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXnteR15fXmdeg16rXnNeR15XXqSDXm9eT15DXmSDXnNeU16bXmNeZ15nXkyDXkdec15HXldepINeU15PXldee15Qg15zXlteUINep15DXoNeVINee16rXnNeR16nXmdedINeR15nXnteZ150g15DXnNeUINeR15DXqNelLiDXlNeR15XXp9eoINeX157XmdedINeV15HXoteo15Eg16LXqdeV15kg15zXlNeZ15XXqiDXp9eo15nXqC/Xp9eoLiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMiI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXoNeX157XkyDXmdeU15nXlCDXkdeQ150g16rXkdeZ15DXlSDXotee15vXnSDXnteh16TXqCDXqten15zXmdeY15XXqNeZINee15XXodeZ16fXlCwg16HXpNeV16gv157XqdeX16cg15XXm9eVJy4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTAiPiYjeDIwMGY715TXptec15fXqiDXlNeY15nXldecINeq15zXldeZ15Qg15HXm9ecINeQ15fXkyDXldeQ15fXqiDXnteQ16rXoNeVLiDXl9ec16cg157XlNeU16bXnNeX15Qg15TXldeQINei157XmdeT15Qg15HXnNeV15fXldeqINeW157XoNeZ150g15XXkteZ15zXldeZINeh15HXnNeg15XXqiDXldeh15XXkdec16DXldeqIC4gJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNiI+JiN4MjAwZjs8c3BhbiBjbGFzcz0icHQtMDAwMDAyIj4mI3gyMDBmOyAmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE1Ij4mI3gyMDBmOzxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDEwIj4mI3gyMDBmO9eX16nXldeRINec15TXqdeQ15nXqCDXkNeqINeY16jXk9eV16og15TXmdeV150g15nXldedINeR15HXmdeqLCDXnNeU15LXmdeiINec15jXmdeV15wg16LXnSDXnNeRINek16rXldeXLCDXkNeV15bXnyDXp9ep15XXkdeUINeV16LXmdefINek16fXldeX15QsINeR15vXk9eZINep15TXmNeZ15XXnCDXmdeU15nXlCDXntep157XoteV16rXmSDXldeX15XXmdeZ16rXmS4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMiI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0icnRsIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAxNSI+JiN4MjAwZjs8c3BhbiBsYW5nPSJoZS1JTCIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMCI+JiN4MjAwZjvXkdeq16fXldeV15Qg16nXoNem15Ag15HXqdec15XXnSDXldeg16nXldeRINeb15XXnNeg15Ug15zXqdec15XXnS4mI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDIiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY715HXkdeo15vXlCwmI3gyMDBmOzwvc3Bhbj48L3A+PHAgZGlyPSJydGwiIGNsYXNzPSJwdC1Ob3JtYWwtMDAwMDE2Ij4mI3gyMDBmOzxzcGFuIGNsYXNzPSJwdC0wMDAwMDAiPiYjeDIwMGY7ICYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTUiPiYjeDIwMGY7PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY716nXqNeUINek16jXmSYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9InJ0bCIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMTYiPiYjeDIwMGY7PHNwYW4gY2xhc3M9InB0LTAwMDAwMCI+JiN4MjAwZjsgJiN4MjAwZjs8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsLTAwMDAyMSI+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY715jXnNek15XXoNeZ1506INeR15HXmdeqICYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmO+KAkyYjeDIwMGY7PC9zcGFuPjxzcGFuIGxhbmc9ImhlLUlMIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDA4Ij4mI3gyMDBmOyAwOS03NDI1NzMzIDog16DXmdeZ15MgJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY74oCTJiN4MjAwZjs8L3NwYW4+PHNwYW4gbGFuZz0iaGUtSUwiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMDgiPiYjeDIwMGY7IDA1Mi0yMjMxNTI1MiYjeDIwMGY7PC9zcGFuPjwvcD48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbC0wMDAwMjIiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDAiPiA8L3NwYW4+PC9wPjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVGVzdEZpbGVzL1QxODMwLmh0bWwgYi9UZXN0RmlsZXMvVDE4MzAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzFhMWM5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1QxODMwLmh0bWwKQEAgLTAsMCArMSwzMzUgQEAKK++7vzwhRE9DVFlQRSBodG1sID48aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+PHRpdGxlPjwvdGl0bGU+PG1ldGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJQb3dlclRvb2xzIGZvciBPcGVuIFhNTCIgLz48c3R5bGU+c3BhbiB7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQordGFibGUucHQtMDAwMDAwIHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIGJvcmRlcjogbm9uZTsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9Cit0ci5wdC0wMDAwMDEgeworICAgIGhlaWdodDogMC4yMGluOworfQordGQucHQtMDAwMDAyIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAzNS41JTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzg4QzU4OTsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK3AucHQtTm9TcGFjaW5nIHsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiA4cHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC0wMDAwMDMgeworICAgIGNvbG9yOiAjNTk1OTU5OworICAgIGZvbnQtc2l6ZTogOHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDA0IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiA2NC41JTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzg4QzU4OTsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK3RkLnB0LTAwMDAwNSB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMzUuNSU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNGRkZGRkY7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitwLnB0LVRhYmxlU3BhY2luZyB7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBsaW5lLWhlaWdodDogMi4wcHQ7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDJwdDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LTAwMDAwNiB7CisgICAgY29sb3I6ICM1OTU5NTk7CisgICAgZm9udC1zaXplOiAycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Cit0ZC5wdC0wMDAwMDcgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDY0LjUlOworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgYm9yZGVyLXJpZ2h0OiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjRkZGRkZGOworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQordHIucHQtMDAwMDA4IHsKKyAgICBoZWlnaHQ6IDEuNjBpbjsKK30KK3RkLnB0LTAwMDAwOSB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMzUuNSU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNEN0VCRDc7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250IHsKKyAgICBjb2xvcjogIzU5NTk1OTsKKyAgICBmb250LXNpemU6IDhwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAxMCB7CisgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICB3aWR0aDogNjQuNSU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNEN0VCRDc7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9CitwLnB0LU1vbnRoWWVhciB7CisgICAgbWFyZ2luLXRvcDogMnB0OworICAgIG1hcmdpbi1ib3R0b206IDEycHQ7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogNDRwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LU1vbnRoIHsKKyAgICBjb2xvcjogIzIzNDgyNDsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDQ0cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMSB7CisgICAgY29sb3I6ICMzNTZEMzY7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAzNnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordHIucHQtMDAwMDEyIHsKKyAgICBoZWlnaHQ6IDAuMjVpbjsKK30KK3RhYmxlLnB0LTAwMDAxMyB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgd2lkdGg6IDEwMCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLjAwMXB0OworfQordHIucHQtMDAwMDE0IHsKKyAgICBoZWlnaHQ6IDAuNDBpbjsKK30KK3RkLnB0LTAwMDAxNSB7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICB3aWR0aDogMTQuMyU7CisgICAgYm9yZGVyLXRvcC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICM0NzkyNDk7Cit9CitwLnB0LURheXMgeworICAgIG1hcmdpbi10b3A6IDJwdDsKKyAgICBtYXJnaW4tYm90dG9tOiAycHQ7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTRwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNiB7CisgICAgY29sb3I6ICNGRkZGRkY7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxNHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordHIucHQtMDAwMDE3IHsKKyAgICBoZWlnaHQ6IDAuMzBpbjsKK30KK3RkLnB0LTAwMDAxOCB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogMTQuMyU7CisgICAgYm9yZGVyLXRvcDogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICM4OEM1ODkgMS4wcHQ7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworfQorcC5wdC1EYXRlcyB7CisgICAgbWFyZ2luLXRvcDogNnB0OworICAgIG1hcmdpbi1ib3R0b206IDJwdDsKKyAgICBtYXJnaW4tcmlnaHQ6IDAuMTBpbjsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7Cit9CitzcGFuLnB0LTAwMDAxOSB7CisgICAgY29sb3I6ICMyNjI2MjY7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAgeworICAgIGNvbG9yOiAjMjYyNjI2OworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RyLnB0LTAwMDAyMSB7CisgICAgaGVpZ2h0OiAwLjcwaW47Cit9CitwLnB0LU5vcm1hbCB7CisgICAgbWFyZ2luLXRvcDogMnB0OworICAgIG1hcmdpbi1ib3R0b206IDJwdDsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDhwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMiB7CisgICAgY29sb3I6ICM1OTU5NTk7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiA4cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Cit0ci5wdC0wMDAwMjMgeworICAgIGhlaWdodDogMS4wMGluOworfQordGQucHQtMDAwMDI0IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAzMi40cHQ7CisgICAgYm9yZGVyLXRvcDogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgICBib3JkZXItbGVmdDogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6IHdoaXRlOworfQorcC5wdC1Ob3RlSGVhZGluZyB7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDE4cHQ7CisgICAgbGluZS1oZWlnaHQ6IDEwOCU7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjUgeworICAgIGNvbG9yOiAjNDc5MjQ5OworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMThwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAyNiB7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICB3aWR0aDogNDgyLjRwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjODhDNTg5IDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjODhDNTg5IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogd2hpdGU7Cit9CitwLnB0LU5vdGVzIHsKKyAgICBtYXJnaW4tdG9wOiAzcHQ7CisgICAgbGluZS1oZWlnaHQ6IDExNS4wJTsKKyAgICBtYXJnaW4tYm90dG9tOiAzcHQ7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiA5cHQ7CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLXJpZ2h0OiAwOworfQorc3Bhbi5wdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjcgeworICAgIGNvbG9yOiAjNTk1OTU5OworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogOXB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorYm9keSB7IG1hcmdpbjogMWNtIGF1dG87IG1heC13aWR0aDogMjBjbTsgcGFkZGluZzogMDsgfTwvc3R5bGU+PC9oZWFkPjxib2R5PjxkaXY+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAwIj48dHIgY2xhc3M9InB0LTAwMDAwMSI+PHRkIGNsYXNzPSJwdC0wMDAwMDIiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9TcGFjaW5nIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vU3BhY2luZyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9InB0LTAwMDAwNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1UYWJsZVNwYWNpbmciPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDYiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDciPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGFibGVTcGFjaW5nIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA2Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMDgiPjx0ZCBjbGFzcz0icHQtMDAwMDA5Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vU3BhY2luZyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250Ij48aW1nIHNyYz0iZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFFQTNBRGNBQUQvMndCREFBSUJBUUlCQVFJQ0FnSUNBZ0lDQXdVREF3TURBd1lFQkFNRkJ3WUhCd2NHQndjSUNRc0pDQWdLQ0FjSENnMEtDZ3NNREF3TUJ3a09EdzBNRGdzTURBei8yd0JEQVFJQ0FnTURBd1lEQXdZTUNBY0lEQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF6L3dBQVJDQUdNQWs4REFTSUFBaEVCQXhFQi84UUFId0FBQVFVQkFRRUJBUUVBQUFBQUFBQUFBQUVDQXdRRkJnY0lDUW9MLzhRQXRSQUFBZ0VEQXdJRUF3VUZCQVFBQUFGOUFRSURBQVFSQlJJaE1VRUdFMUZoQnlKeEZES0JrYUVJSTBLeHdSVlMwZkFrTTJKeWdna0tGaGNZR1JvbEppY29LU28wTlRZM09EazZRMFJGUmtkSVNVcFRWRlZXVjFoWldtTmtaV1puYUdscWMzUjFkbmQ0ZVhxRGhJV0doNGlKaXBLVGxKV1dsNWlabXFLanBLV21wNmlwcXJLenRMVzJ0N2k1dXNMRHhNWEd4OGpKeXRMVDFOWFcxOWpaMnVIaTQrVGw1dWZvNmVyeDh2UDA5ZmIzK1BuNi84UUFId0VBQXdFQkFRRUJBUUVCQVFBQUFBQUFBQUVDQXdRRkJnY0lDUW9MLzhRQXRSRUFBZ0VDQkFRREJBY0ZCQVFBQVFKM0FBRUNBeEVFQlNFeEJoSkJVUWRoY1JNaU1vRUlGRUtSb2JIQkNTTXpVdkFWWW5MUkNoWWtOT0VsOFJjWUdSb21KeWdwS2pVMk56ZzVPa05FUlVaSFNFbEtVMVJWVmxkWVdWcGpaR1ZtWjJocGFuTjBkWFozZUhsNmdvT0VoWWFIaUltS2twT1VsWmFYbUptYW9xT2twYWFucUttcXNyTzB0YmEzdUxtNndzUEV4Y2JIeU1uSzB0UFUxZGJYMk5uYTR1UGs1ZWJuNk9ucTh2UDA5ZmIzK1BuNi85b0FEQU1CQUFJUkF4RUFQd0Q3ck1hU25HT2xhdWk2YkdDQ1JYTWFOclNYS0tTUVNlOWRMcDJwb29VYnV0ZllUc3RUNStsTnkwUjJHa0trQ0FqQTIxcExxUUp3RGdHdVZYVzFTTlFHcXpwMm9HNFlBa2tHc3BWRG9oaHI2czZ1QzVEQWNrNXJWMDVSSXE1QklOYzdweExNb3oxcnBkTkFpUU14QUZZdGhPS2lpOElGV01ram1zL1VKVmlCT0J4VnFlOVhhY0VBQ3VmMXpVZ3FOejFIclhpWnpqSTBLTGsraHBoS1RuSkl5UEV2aUZMTkdaamdDdUoxRHhYSmZNUWhJRlErT05iTnplQ0lNY0RrMWoyejdqblBXdjhBT0x4YjhVTWRqYzFxWUhDejVhY0haMjZ2cWZyV1RaUlRwVVZPUzFab2lWcERsbUpKcE1ISTlhamlKd005S2t5Y25BNXI4T2xWYy9la2UrbzJEYmtnZ0hGZC93Q0ZnV3NJd01rNHJnVSs4TzVKcjBYd2xGaTBRWTR4WDdwNEF3bExPcWpqMlI0WEVUU29LNWV1Sm1oak9BZUs1SHhocWptM1pSR1dKOUs3YTVpRFJrRmV0WWVwNlFMZ0VsQWEvd0JITWp1cVdwK1c0bHg1cm5tMmxRbExzdmhrYlBROTY2blM3TnAyem5yVmgvQ2J6elpSQUQzNHJxZkNYaE1OR0VrQkpIdFgwSE5vYzhwOVRHR2lzOFJ4MkZaTGFaS3R3VkFKNTYxNmJkZUdGaGlLb01rMWp5K0U1RWtMQVo1elV4cUV4a2MzcEdsM0t6QWhtSi9uV3drMGtCSWZJTmJXbDZHM0JLNE5SNmpwRzNKSVA1VlNub1p5YU1XZVpyeks4a0dzZTg4Tm01bkh5a25OZFJZYVZtUWtnWXJRczlJUjdnQXFEVU5uUE5LNXl0cjRSR0JsTTRxMUQ0UEJZa3FjVjZGYStIRUtBaGVLU1hTMGlrSUNqRk9Vd2NVY1hCNFBBWUVMeUs2Znc5NFlWUW8yam1yOFZvcTlnQjlLMTlFVkVJSEZKeUNNZFNTeThOSUVBS2dFVnBXbWpMRGdGY0FWYmlrVlZCR0FhVnJwZU9SbXNKU2R6UkpCQmFoTUFEQXErZ0hrNEhYRlo3M1pRZ01wVUVaR1JpbngzdmJQRlp0TWVoRmZaQUk2R3NEVm9kNk1PY2l1Z3VTSkFmV3NxK2d5RHh6VVRqb2R1SG5ZNFRXN01pWGNBZURXYklNTnp4bXV2MVRUUkprZ0ExaDNla2tnNEdDT3RjRTROTSttdzJLaTRwTXl6anBrbkZENEtFWlBOV0pkTllkUTFJdGd4SStVNHFMUFk2L2FRM3VaVThlTWpBR0s2WHdnU0kxQnptczg2WnViQkZiV2dXbmxrREFGRk9tMU5NNThaV2pLbmE1MkdsU0FJTUhKclhoT1V4Z1lyRDAwN2NEaklyV1M0RWFqNWdRSzlLT3g4dlZTdVU5VmdETXdOWUYzcEFkeWNZQnJiMVhVVVBjWk5VL3RDc3VRUWE4ak1NdGhpRTFOWENqWGROM1JneWFBcHlTb3pWSzgwSmRoK1VDdW9WVWtZZzRHYWJQcHdaVHdDSy9QczM0RncxYW00S212dVBkdzJiVGkwMnp6Ylh0Q0RSa0JldnRXWm9YaEJtdkNYWDVRZUJYbzkvcEtGc0VBazB5ejBjSTRJQUg0VitFWmg0RzRmRlpqREVWWTZSZDdmNW4wdFBpUnhwT0tLdW1hTXR2YkFCY1lyVzBlTVJ1UmcxYmpzZ3NPU3RWK0xhVEk0TmYwZHc5dzlEQlVZVXFjYkpIeW1KeGJxeWQyYmxwY0JNZWdxNWFYaStaMXJsNU5YRVM0eVFhTEhYTjAvd0I0ajhhKzdwdFJTaWVYS2hmVTdhVzlYeXdCZ0dzKzZuM1o1eFdYL2JmeWpMZEtobjFwTnB5M1d1aUw3SEhPRmlTL2xISUI2Vmp5c3p5Y0FrVkpkYTdFbWNzTTFtM1BpU05HSnlCaW03a0pJdlRPd0FHQURVWkc3cVFSV05xUGpHSkZIemdZOTZ5Si9Ic1lJeElPUGVxVzRXUjJBdDQwWWs0SnFUZW9VQmNBVnhZOGJwS0IrOEJKOTYxckh4REhKR0R1QnhTM0JJM0pia0l1YzFoZUlQRUl0MWJKeFJlYXVER3hEQWdlOWNGNHYxeG1kZ0dKSTRyT3BQbFIyWWFqenlzVGF6NDRXRXNTK0I5YTVYVnZpbkZic2QwcWcvV3VIK0lQaXlXMFlxckhKcnk3WC9FOGp1V01qQTV6MXJ4NitQY1hhSjlsZ3NpalVoelNQWk5ZK0xxWU9KQng3MXczaS80MHJCdUFsSkl6ME5lYTZ0NGxsYU00a1BJOWE0dlh0YWVZdUhjaysxY2RYTUtqMFIzMHNocEozWjB2aXY0NzNNdDI4Y1RzU08rZWxaZmgvd0NMZDdMcVM3NUR0SjlhODMxaWVSWmlWR0EzZXIzaEtGNWJwZHhKeWE0WXpxeWxkczlHcFN3MUtueXFKOUgrRWZIc3NxS3hja2ZXdXpYeHE1c1RsaUNhOG04RVdyQ09QSkFBSGZwWGR3MmtmMlE1WUU0cjZHZzZpV3A4UGovWk9YdW5OZkVMeG85cGF6UHZiUGF2amY4QWFZOGVYdHpiM0FqMzcySkErdGZYdmpqU29KcmQ5eDM1L0t2blg0eCtFSUx0aXF3eHNRYzlNMXRPVlJvdkFTcHdseldQaFRXOUwxQ2E4bGFRTXpPU1NUMU5WcmJ3bGRUbmNRMlR6aXZvVHhMNERpaW1aakdtUWVtSzU2ZncycU5ncUs1NVZKclJzK3FobWlzZnFsNFUxNTVJVk9TQ0s2MjAxaGtqREVrWXJ6end2TGpCSkl6WFF6Nm1TcW9DZjVWNzJJcTIwUHpuTDhMZXgxVnJyOGtzaWd1UW85K3RkYjRadjl5cVNjZ0gxcnpqUzV3ZHZUT2E2N3cvcVMvYUk0TW56R0dSaGVNZld1TlR0cTJldmlNT2xEUkhwZWpUN21VazF1cmU4Z1pKQ2l1SXNkYWl0ekdIbGpCQjUrWUd0dUhWeExFV2lCa0o3OUIrZGRDbXJIenRlRHVYdFUxTjBpT0dBUFgzcmx0ZThRSHluQmJEQVp4NjFiMUsrZGlTUUZPUFVjKzFjbDRna2FWV1VrQW5wMnhYNVQ0aVpoVXBZR3A3UGV6UGJ5YWpGMUU1SE1YOThiclVKR0pKR2Fuc2prRWtrMVFodFpZNWNNckVzZlN0ZXdzSkF1V0dCWCtZR1B5ekcxc1ZVbktENW0yM3AzZHo5ZGhWaW9KSmxtRlNWNzRGT0xaSkl3UWFhVWFMR2M0RlJ2TVFTQmtBVndWcU1xWHV6Vm1YR1Y5aTFwOFpsdTBVYzVQTmVvK0ZyVUxFZ0l3TVY1LzROMDFwN2dTTUNBVHh4WHAyZ3crU2luQXpYOWIvQUVkdUY2bE9Nc2ZWamJuMjlENDdpZkZxM3MxME5QOEFzcnpCbkdRZjBwcjZBSHg4b3hXeFlZQ0RJQkZTdFBHajR3Y1o2OVFLL3VMQjArU0NSK2JWWnRzeDdQdzhpT01xQ0sxTGJUWXJUQkFBSjRxU1dSVUJJd0FhclBkN255VG4wSGF1cm51WTNOQllvbEFEWU9mVGswODZkREl1UUJ6NjFseTN6UkF1Q0RnVk5CcTVVQUVrRWNVSmk1aSt1a1J4QW5BQXJHMWUwU1IyQUE0NHEvSnJSOHNnTUJXWE5lRzRKYk9LMFRFNUZlT3pXSVlVQUVkcXU2WmFocFFjWXhVRVlMZ0hnWTlhMGRQUll5Q3pCU2VucitWUG1NMG5jMzdlMkNXZ0pBQkFyS3ZsUG1rNDVyU1hWWXloakdTUU1rNHdLeUx2VW81WldNYm8yT3ZPQUtsc3BzaGNrWjVxWFRicGtrUEpHS2dON0UyZHp4akhmY0NLdGFQZldkdThra2dFNDJuYUVZZGZXcVFrZWgrSHZBbjJtMGltdTV3cXV1UWlIbkh1YTZPeThQMkduZ0dPQkNSL0Uzekg5YThydC9ITnhEWUI3YVZ3SXZ2SVNEZ2UyS2t0L2kvSmdicFFTUFhpdU9yaEtzMzhSMlU2MElwZTZkNzhRdE1XNzBiN1JFQUpiVTU0N3IzRmNIQmZsc2M1eFVlcmZGdVc0c25WSkZJWWZuV1RwT3FtOWpFaFhaazQ0NkdxcFVuU2lvelpGU2ZPK1pJNmVDNDNnQWs4MDY0aEVnemprMVJzN2pwazFhKzFBRHJ4V2pWeVl5YUtselpkZU9EVkM0MDFlU1FNVnBYV29vQmdZSnJEMVhXb1ljNWZjZlFHbzluYzZZVjVJZ3ZiV05DZmxCcWhjU3BFQUJnWXJQMXZ4ZGJ3UnN6T3NZQTVKSkZjTnIzeGdzN0RjUmNDUlJ4OHZOSHNFZFVLOG1kNUxxQ1I1SklwOWhyeUsyU3dBK3RlTDZ2OGZ0T1JRQmNnRTlqMXJEdXYya3JHSm1WWjB3disxbXJqUlJ2YXBKYUpuMHZGNHhndDF6NW9YSGZOTW0rSk1DcVFKbFA0MTh3ajlwT0NTTXQ1aWhSMHljZjFya2ZpRisycG8zaE8yWnJ5L2hSaDBqQkJZL1FBNXBWSjA2YXZOMk9lZUhtdDBmVitxL0VhTVNrZVlBUHJVVnA4VUxmQVZwbHlQZk5mblI0ci93Q0NoVXVvWG4vRXAwcS91QkllSkdCVlJWQ0Q5c1B4akV3bGdzNHh1eDhySzM4NjgyZVowTCs0bS9SRFdFYlYyN0g2ZTZaNDhodU1GWERBMXYyV3V4M0tnczRYUGF2ek44TGY4RkF2Rm1tZ204OE55M0NJT3R2SmtuOERWTHhEL3dBRml2R1BoZnhCRmJKNEVtZ3NjY3ozVE1NL2tLVXNUUm5GeTErNDU1UWtuWkkvVXBVaW5iY3JBaXJFTm1wd1FCWDUvd0Q3TVgvQmFQU2ZIbmkyUFIvRmVrdHBEekhiRk9qYjQyK3ZBSU5mYy9nLzRsNlA0MzB1TzcwcThndVlYQUlLT0RVNGZEMEtudndkeUpWcHA4c3REY25qTU1lT01Hc3ErWVJqSVBKcWE1MXdNU2h5R0g1R3NxNHYxSkl5T2U1cnRkTlJWa1hUa3lHOWZka2dITlVZcmt4dVNUZzFhdWJnQ01rRlNCV1kxd2pFZzRCcFJwM1oxcXNsSFVsdXRlYTM1TEVZOTZ5TlE4YmVRcHkyZnhyTzhUYTBscWpoblVDdksvRy94SmkwME9CS0R0N1pyb2lyYm5IT2Fsb2owWFZmaVFrZVFaQU1lOWM5cTN4VlNGR1BtQWcrOWZQSGpYNHlUaDM4dVVLUHJYbk91ZkhtOHQ5NGFYY285NmlkWlJWMk9HRmxJK2wvRVB4dVdMY0JLU1Y5NjRMWC93Qm81N09VcWpNUjNPYStiZGMrUHJ1emZ2Q04zWG11TzFyNHl0Y014ODAvblhsMTgxakhZN3FXV1gzUHN6dzMrMGFsMUtnZVlIUHZYcVhoajR5UTNVQ0V6QTU5Ni9NZXgrTU54YWFpSlVsWUozR2E5VDhIZnROZlpvbzk4NUFJSGV0TU5tVVpyM3RDSytYdUQwUDBLUHhGaWx0Q2ZNemtldGN6cjNpeFpCSWQyU2Zldm1Qdy93RHRPeDNTb2huQkgxclh1L2pXbC9IdTg4WTlBUlhUT29wYkZZU0RoTFU2N3gxcjhjMDhoSnppdk1mRW11SXBZQWhjVlM4VmZGQ0I0Mll6S1Q5YTh5OFNmRkdITGtTRDV2ZnJYallpanFmYjRIR3hqQkpuVmFwNHNLUkg1dVJ4WEo2dDRzREZpVzRGY0xydnhYaWhaaDVnd1BldVExcjRyUmNrU2M5YTVGUk5LK1pwYkhwdDk0c2o0eTRKTmFmaEx4ZkNsNHFsd09SMXI1OXV2aVlKcENSSngyNTVxZlR2aUxJc2daSDJrSE9TYTdLRkt6dWVGaXN3bE5XUjl3ZUVmRmtQbEtQTUI0OWE3T3c4UkxMRm5kd1Iwelh4ZDRNK09xYWZ0TXM0TERzVFhkMm43VHR0YndaTThhZ2Y3VmU3R2NPWFZuek5TcE81N3A0eTE1RkRBT1BwWGtQamkraW1hUml3SkZlZmVMLzJzTE03Z0p3V0hRQTE1dDRrL2FYTjZ6Q05TNVByd0s1WlZxZDlHZE5LVTByMk8yOFJ4UlhFamtGUml1UzFPQ0dPUTVaVndhNGZVdmpWZVh4UHpJZ1BwV1ZQOFFwcmxpV2tHZTVybXFUVDJPaU5Xb2Zxcm9VcEVhNEdUV3NabU1pWkpKTlplZ3c3VVVIakZhcng1Ykk0d2Z5cjJzUW5jenkrYVZqYjBtVXFRUVFjY1YwM2gyNFdTVUE0RERvZTljZHBzMjBCY0VrbkZkRnBGMWlWWFVuR2ZTdUNVN005bVVGS0xSM3phT3VweHd0NTBrVXFZS3lLZVI5UjNIMXE5cHVwSFM3bGJTOWpSWlQvQUt1UkNka3YwejBQdFdacEY4WmJlTldJR09oQjVyWG0wMkxWclo0Wk1zSDVEZFNwN0VlaHpXNlhZK1p4RUxPekxXcDI2ekp1RHNRNHoxckR2TEZya2JXd3dIdFducGx4djA4eHpsV21nWXh0NzQ3MVd2THhiWmlCZ250elh6K2JaTkhHUnRKYUJoOFE2VDBNMWREV05kMjFTRjllMVRRd0k4WktxU1BwVDRkWWptZkJLaGljWTdab3Q3OURjeXFDRG5CRmZtZWQrSHVGY0h5VTE5eDdtR3phZDlXVWRRZ0J5QUNEOU1WVDB2UTN1WmdaQVN1ZWxiTStKU2Z1NFA0MWEwbUxZd0JJSTdjYzErSDRqd2NwNDdNNDFLcTkyUFRvZlJSenYyZEhRMlBEV2xpQlZHMzlLNml6a0VMQUhHQldMcFY1R0ZJRERJRk91OWZodFpOcGJEbnQzcitwZUZlR2FXVzRhTkttckpIeHVNeGNxODIyZGJEcXlwSGpka2VuclRZOVlXVWxRM0dlYTQvL0FJU1paVXlDUVI2OFVscnJoRE9WWWdEbjZWOXVxaTJSd2ZWM2E3T3RrMXdKT0lXSUlZWkJIUEZKTmZyRjh4SjI0eU9LNHEwOFlXMDhqdVpsRFFTYlNjOS9TdU4rTEg3VEdtK0JQRU5qWWVZalhGd3B5dWZ1Zy94SDJxdmFKYXRuTEtsclpIc00rcUtMYmVHd0NSMVB2VEpkZWlWYzcwWTV3QUQxcjUzK0x2N1YrbjZENGVqVzNtVmJ1NHdFVW5vUDd4cjVsK04zL0JTRzc4TTZlZEg4T28xMWZzQ3NsMUlTVlFrY3QvOEFXckN2bUZDaXJ6a1ZSd1ZXcS9jUjl5ZkZuOXFId244SDlPa24xM1dyU3oyS1c4dmVESTJCbkFVY2sxODJlTXYrQ3dHazNFYnkrSE5NRDIwWng1MTlKczh6c0NxTGtuOGNWK2QvaURXZGIrS2ZpUzgxclg5UnVyeVc1QlVCbVBLazR3UFFZNDk2bXNQRHNsd1lVQ0tvQXpnREMyNmV2MXg2MTg3aXVKWjNhb3F5UGJvWkRIUjFYYyt5TlMvNEtzK0x0Um1WNEpMSzFqNU8xWWpnRDNKUGVzcUgvZ3JaNHZpdlNJNDRyaU9OVHVkOHF1N3NPT3YwcjVXdU5HVzV1R2lReUxIRjk1dlFldjhBOWFvem84VWhNMTFJSXJXTDdxYmdCajhPclY1RTgveGIxVTJqMG9aUGhsbzRuMG5xdi9CVXY0aGF4SVhmVkliRjV5U0JERHZBOU9EeGlzUzgvYmwrSk9vWEMzRW1zNnhkdEt1RldPWllZbTU3QkJ4ajM1cjU2dXZGK2hhWVJMSTVuWWZMSEhDdTUyeDc5aCtGVzQvaTg4T21TSjluRnRBY01xS015RS80L1FBVngxYzB4a3Q2a3Z2T2lHWFlhTzBGOXg5RTZOKzFWNDdrM00rcHp3ekVINVRjdkljK3ZKNmUxVFd2N2NmeFU4QXh0ZVJYd3ZSRGx2S1ZHWU4vaFh6djRUOGVhemU2eEI5a3M0SU43aGd6aHBaQXVlcEpPQlhvWGhxUFhOU2ttZTUxRzQ4eGpnQ0NNS2lqM09BRFJRelBFUWFiay92WVZNRFJrdmhYM0gxaCt4bi9BTUZkWWZpQjRwWHc5NDR0Qm9sL2NOaTN2SCtXQ1k1KzZ4UFJ2NTE5aDYxY3ByVUMzdW15cXdjYmpzYkt2N2l2eUs4VWZETy8xcVNNeldzVjV0SEVzalJER1Axejc1cnJ2Q3Y3UzN4UStFRm5IQkQ0bmVHMXQwMnhXNFJKSWtBSEFPUVdOZlpZUGlpaEdrbzRpOSs2L1U4SEVaRlZjM0tpMVo5R2ZwamJlSjVZbEtTbkpIQjdFVjMvQU1QdFdYVU5NS3F3SlhtdnlDMGYvZ3FqNCswWHhlTHZYanArcjJUSGJMREdvaGtVZXE0QUJQc2ErNlAyT3YyMi9EbnhaOHFTeHZrUG40RHhNd0R3dDZNSzlDR1pZZkZLOUdXcTZQUm5KVndGYWo4Y1Q2MGp2eWg1eUtnMVR4QjlraUozZGFzUm0zdjdWR2pkUVpSa2M4R3ZQdmlEcTArZ1gyeVVNSW0rNjNZMTFVcXQzeXM0M1Q2bW5yUGpEeVZZZVlRU005YTg4OGRmR20zMEN6bGRwbEpVZEFlVFhIK04vaVRMTTBrY2NnVEp3V0p3QVA2MThsZnRUZkdUVU5Ha3VJNGNwRkNDZk1ZNEI0NjFqaTh3aFFqcWRlR3dicU05WStNSDdaT2wrR1lKYmpWTlNpaVJQdXdpVEovTDFyNVErS1gvQUFWUXRaYjk3WFNvaktCbkx1M0MvaFh5OThSUGlsZGVPOWN1b05wdkhZa2IyWTdZL1U4Vnh0NzRVRnJzZ0VCalp2bVoyNm12Q3FaeFdudG9qMjZlSGpEUkkra0ovd0J2QzgxT1l1N0ZsZjhBaEhBcVdIOXJxOGx0bW5UZVlsK1VxelpJOS9wNzE4MDJlblBIeXlGaVRoVkhTb3I3eEJjZmF2SWdSbmdUNVpjZEhIcFhJOHlyYktSM1JxVFNzbWZSbHgrMVRxK3ZoNDdlVm80d0RrcWR4NDV4VVhnL1daL0dtb1MzVjJZbGhpWUI1N2tuYUNlZ3o2KzFlZC9BTHdCcXZpbnh4Rm8xc3U1cm81VmlQbFNMWnZNamVpaE9meHIyeSs4R2pYSXJWdExZalRMR1VRb3VCd3VjTktjZnhIbjZkUFNvZFdkVHJkblBOWGQ1TTcvUVBqUDRWOEs2ZkhhUjZoRmQzTVNoQ3RyWUdRWjc4OStlOWRsNGErSTlyNG5nTE5hYWcyM29SWmhGQTlTT3RmS0l2WmZoZjQzdk5QMVRScExpYXprWU93T053WDM5L3dDdGV5L0NieGZvdmpuVllUY2FMTHA4ZHlOek45cEFJNEI3Z2Q4OSsxYjBhODQ2TjZISFdvSjZvOU04VTc0RnphMjhCbFliZ0NmTFkvbU1WNWQ0ditJbXQ2YkZKRnFIaDZlNXNnYzdpd1pRUHJYVytQMzhEMjltOEVHcFhtbjN2M1VTZTZaVVB1Q1RnMTVucm5qalV2QnA4dUs0aXY3U2NIQ2VhSERZNjhFMU9LbTA5YjJmYlVpaEMrelZ6SnUvaUw0VnVvdzF6bzVzWjQyREpMamFNK3pkSzd6NE0vdG9lSS9oSHJDeStIdFpaN1IyQmUybWxES3c5cThYOFVlUGRIMWlTU05iZUhTN3ArR0VhZ3hTSDNRLzBybkwyMHN2c1lMNmFnWTV4UGFPWThINkQvQ3VXbFduZjl4VXMvUFEzcVVJeVg3NkYxNUg2NWZBTC9ncEZvZnhUMDZPMDFXVmRKMWdBQXE4Z0tTbjJyM0xSUGlwWmF2YXJJbDFHNVBvYS9BdncvNDR1Tkl2eDltMUs0aWtqYjVZcDFJY0VkOGpnL2hYMDcrejcrMzVyUGhSSWJIVkFMNjNDaGZNVnkyUHo1cnZwNTVPRFVNU3ZtWVJ5Nk5yMDNjL1dEVWZHOFF0aXlTQmdmVHJXSGUrTlJ0TzU5dmZpdmphWC9nb2Q0YXRkUEV0eGZDMmRQdlJ1MjF2MXFUdzkrM1I0WitKTmhKSm8rdDIxeExGOTZMZmhsL0ExN1dHeDlHbzF5eVJ6VjhPNHhzejNuNGwvRldLeWdtQmw1VUhQTmZNSHhDK1BLM0Y5TURNQ2lrZ2ZOMXJpdmp6KzA5RkRhemlPWmpJVlBmSk5mSit1L3RCU3ozcnFaY0JpVG5yUmlNWkZTdEV5d21GYmQyZlJmakQ0M1JHUnNURHIwSnJ6THhaOGJFbERneTRVOERCelhnSGk3NHpTcll2TzB4M014VWM5YTRUeFQ4WG5JaVFUWjJyazg4NU5lZFV4TXA2SHFSaEdKOUE2bDhXWTVDY1M4QWNjMWozSHhDTW4zWkNRZmV2bmQvaWt6RWt5RW50elN4L0ZDNWx5c1pQSGV2S3hHRm5OM1RPcW5pSXhQZjVmSHJ4eDVENEE2ODFWUHhYbHNwY2lZZ0RwejByd1c2K0tWekhHZk1kbEJyT2wrSnBrNGFVa0gzeGl0TU5ocFErSjNNNnRkUzJSOVJhUiswSkxiWUp1Q0FQOXF1aGcvYXFhMmhDbTVKSTk2K01wZmlRQVdIbVkraHF0TDhTdU9aQVB4TmVrcXJXaVp5UGMreHRYL2FsZTlVanp5ZnhybHRYK1AzMmduRXJIUFBXdmwyVDRsZ2pIbUFmalVNbnhMQ2dIelAxcUhLKzdMVlJyUkgwTGY4QXhjZTdKTzhEUEl5ZWF5N3I0aGVlMldsSlAxNHJ3ZVQ0bVp4aVRQclVVbnhOT0JpVEdEVFUwaWVlWFZudWpmRUFSbmlRQWZYTk5iNG5PdkltQXhYZ3NueEhQYVFrbW9YK0lwWVlMc1FhUGFFczk3ZjRueUZpZlBiUDFxS1Q0b3lzdUd1Wk51T200MTRJL3dBUW54d3pISDFxSS9FQ1FqaG1PYU9kRFNQZDVQaU1HNTh3a24zcUNUNGhBZy9Qay9XdkRUNDhsWVkzRWtWR2ZHODU3c1B4bzlwMkZZOXNmNGhxcE9aQWMrOVJ2OFJBVHhKd2E4VGZ4bE8vY2o4ZWFhZkZkdzV6bkFxWFVZMUd4L1J6bzZzc1FaTXN3d2NkQml0YTdkVWdEaklBR0NEMUZlUmVDZjJrdEd1YnFDMXZuTm1adUVsSUpVbkdNSG5INVYwM2l2NHZhRll5cWgxS0NXVndNUklDQXc5U1RYdlZzZFJjWEpNODdDMDZrWkpOSFUyczd6ekFGMlNNbm5CNU5kUnBIK2p0R1lpN2dkUVdPQ1A4YThSVDQzUnhTdVVhR05Wd1NTY3NCK0FyWjBuOW96UTRiTXM5NU14OUF2Sy9YTmVXc2RRdnJJOTZkU1hMN3FQb3pRTmJndUZCVmtjaGVpODQvSHRXdko0bU5xZ08rT01nZmRQSkk5YzE4NGFKKzAvcFVVVWd0N3VNUms3Z3JPQTN2eFdwZC9IeURYclpwSUdBV1A4QXZObGZvVDBycmhtT0h0OFI0OWFoVWs5VWVuei9BQkhqdC9FTjRubXF3S3EyQVFNR3NEeEo4V1k3Y3NSTUVRZFNUL244cThrUGl5VzgxRzd1VWxaM1lZVVJnTXpjL1hBcmlmR25pYlU0bExQQTZSalB5TnR5ZmN0bmo4QVRWUXg4TFhUUnJTeTF6YVBkOU4rTGR2TE1valoySHJuQit0YTFyOFJHODB5Uk91MlRxTjNJL3dBYStVUERIeEpsTnl3YjdMRWk0eXBPNHZ5ZXlrOGZYLzYxZWxlSFBHOGtzUWRvd1F3NDJaZFR6N1l4K1ZlYmljUkdxK1c1MFZNdmRMb2ZSbWkrTFd1SXd6RkdVK2pjL3JXdkI0c2g4ckNQaDA0d2VvTmVGNkg4UTU0bENJeUtNWTVQdDByVmgrSks3RUxySXNnNEI2ZjVGWVlmQlllbjd5MVp4MWxVZlE5clR4UklnREpOR3J1ZVIxMmpwK2RObDhTU1Fna2JISk9XUDhScngrMytKYVNSTXY3eFpBY3R1T1JWZy9FcElsREdRYlI5MGRTYTloVm9wV1JGTER0YXM5UmZ4SUo4c3JoVzdxYWoxWHhldHRweXpJK0NSems0RmVXWC93QVNQS3RSTzdSb281NGJrMTV4NDIvYVdodmJ1NTAreW5SSmhGMEp6eDN4Nkd1ZXBYakRXVE90eHZHeVFmdFAvRi9XOUF0cG85SnZKSUhER1JCR2VTVzZuajJ3SytkL0ZualRXdkZuaWlhN3ZMeTVudUVSSVduZko1NHlCK1ZldFg2alg3V0MrdTJlVkhpQkt0aks3aVNEK3RVTEQ0Y3c2cmVDSUZBaVprbVBmSGY2bnRYbDFuS3E5WkRwOHNOYkhrbmpieGxxbXBHVmhKY094QWpqSkpKT2V3L3g5NjUrMytGYzdXcTNGMEM4ekg5NFNEOG9QT1B3OUsrc2ZDbjdQdW5HTTNWODBNU1l5ck9NaUZjOUIzTGZRZGZ3cURWL2huWTI0ZExPSmhCQ003NVZ3Y24wSFkvWG9QZXVHdmczTFc1MDBjU282V1BsK1B3UElMaElsakNwbkhJeGozUCtGSnJGb3VsSVlyWXBLa1EzRjNHQXpkMjl3T3dyMTd4RDRSU081V0sya2VTV1JpcDJxU1Q5Ty80MXlYaVR3akhwWmNYcE1UdDIya3VmcU8zU3ZNZUNzN3llaDZVYTkwckhsVjFiU1hrREdhNWUxdFV5V1ZPc2g5U2V1ZjVWeldwYVpCcnN5Zk5QZHhSSDkzR2dLeElmcWNBbXU5OFJSUkVPOCsyTkkrRVIyM0UvUWRCOVRXRDlyRnBKSEdZMlo1dnV4bzJHSTl6alBQb28vS3VPbzFmM0Vid2ozWm42VjRFYWE0QldOVmxYbjVtM0hGZGRiZkMvVGRHdGx2TlRlT05YRy9CUGI2ZEFLd1BFWGp6L0FJUXV6Mm1GWjdtVC9WMmNQQnoyM3R5ZVQ5VFdOYTZmcjN4Vm50N2ZWNXlHWmpOSkRBZGtGcEVPaXRuNkU4NVA0Vnp1bk9lcmRrYWN5V2lSNmZvbmpMUWRKMHlhOHRZbE52QVJHc2hHNHlPZWlyamozNHE5RGV6NnZwNjZoZVN6MmNCVXNxR1ZZOEFkOEVkZllBMVQwUFNMUFQxdGJleHRJNXhacWRqU0RFQ01lQytEMVAxLy9YRjRrOGI2RjRlVzRhYVp0YjFjcnRZSTI1SWpqN283REh0WEU1cm01WW15ZzdYWlI4Ui9FbElsU0d3U2QwUWZNOG1RdjErWTVQNUN1TjEvNHdhaG9BRW9MT3JETzNrL1VZNy9BSlZSMVhYOVQ4UXl2TkZiUVd1ODVYZVNRQlZRZUhyblVHVVR4cEl3NUxzKzM5QWVuNDF2R1dtb2xaYUlpWDRpcDQxa01kN3BEeVJubG5FT1NQZlBCL1d1eStHOXRjZUJ2RVZwcW5oYlZMelI3MkhhNXhsaEt1Y2xTRHdmeHJtNExPWFRaNDQ3ZTBhVm00L2NrRUw5WFpzZmxtdXUwYXl6RWx6TE8wRWFIYkt6T3JlWHg2akdSWFJSeE1vVFVvTzFqT3JHTW90VFAxVC9BR1N2ajdjL0YvUTlKdDAxQTNON0RHRnVOeWhIM1k1K1d2cDN4aDhLNVBHdmhNUlhNTGJ5dkRxQ1dCOWEvRm40SS90QlQvQ0x4bmIzbWg2cGVQUERJQUdrL2RSa1o1NVluY0svUzM5bDMvZ3J4b091eWFmNGU4WVJ4NlhxbDBDbHJNV3hGZEVZeUFUMFBzZXZhdjBiTE1WREZVRkw3ZmE5dnVQaXNkaDVVS3Z1L0QvVzU4NGZ0QlNhdjhHZmpRTk0xeEpWdFpEbXpjS1JGS1BYUHFLK2QvMitQRTBlb2VIa2l0aXF6VEx1ZkhVOGZ5QXI5VlBpdlkvRDc5b3UyazBuWG9WYU5wUE50NWVqeE1UbktPT2xlWWVKditDUnZ3bStKQ0srb2FsNGl1VXgwUzhWVGoweUJXV0l3RlNUYXZjdWhqWXdTYlIrRlBodGs4TmFtcGx0L3RETUMrd243emUvdFdoTllIVTQ1WkpnR3VKMnlHSEFYMitsZnBWL3dVVi80SkMvRDM5bi93Q0ExMzQ1OEZYK3V4M21qdWl6MlZ5d25pa2laZ3BiZGdGU001cjg2STdVeDJEVE44cUlTL0hZVjQyTHc4cURTa2V2aEswYXliajBPTjhRWDBHaldjMHVSR2lqeXdlK1QxUDlLeHRQMVNTOWhoTUVYbDI1NE80WmVRLzBxbHJlb1RlSWRkVnc1aXRZMzJvby9pSlBVK3ZyWFhlRTlNT3BhU2ZMSmVhQ1VwbnFxdG50WEdvNlhaMDN1N0gwcCt6NjBYd2wrQmV2NjR5bE5aMXEwR2xXY2gvMWxyRXdCZHhudVE2RFBZQ3NId2o4Wlg4TnhPbHNxU1c3ank0MVlkTzI0aXNyeGY0bmYvaEROTTBxUnBSSGFXNHR6c0h6WndHSjkrY2ZsWElLaG5DdzIwMXRNa1FBVldQbHZ1NzhIQkIvU3JwVm5xd2xTUzNQY2RSOFF5ZkVaMXVvNGd0eXNZRXJSeHFDMkIxSjk2aTBSTDNTN0tlOFNTM0tJdmxRN3lYZFNjbk9PblQrVlovd1MxSlBEKzZHN2pYY0NFY2VZQ0Q2L3JYcVdzK0ZiUVN3ckhMYTNOZ0pDK053U1hsY2dIUEI0WS9uVzlPb3IyTWF0TFM1OFcvRzN4OTR4VFdXZThFVnhaU0ZsQWExUlFOcElCeUFEMHgzcnpEVVBpMzR3ME5aYld3dG9JRVlsMGpUY2N0NkVrOGdqSGJIU3ZyanhqOEw1TlRndXJTWGE4TTdQSkVHWGNxazlRRG5qK1ZlVitKUGgrYlJiTkd0SVVtamJ5aEkzSTNEb0NSL0NSeG50WHJScE54VGt6ekpTV3lSNUg0YytMV3ZhLzRRZVM3MHFFelJ5RkhDWmpaU09TTUVFWjlPT2F0K0ZQMmtyRFN0V2FDZHRVdDQxR1pGWUxJRjVBNEhHUnpYdHZnWHdKcGVzM2N4TnFZeEtQTGtpWmNrRWRqNzUvUTE0ZCswSDhBeDRmOEFIZHhZdEc4SDJ5SXlXMHdCeE1NZzRQOEF0REdENjFqaXNCRzNQWTBvWW5YbFRQYWRMMDNRUGlQb0szVVZ4RE1KazN4dXE3U3Z2N0VIdFdmYytHVjBkbzVFdjJnY2NDVEoydjhBWDByeXo0SHphbDRTME83c2JrU3VMWjkwYm5nai93Q3RYcDNnRFdIOFE2YzhVc21aVVkvS3hCWWM5Q080cndhOVJ4VGcraDY5R21wV2tXL0ZOdzNpWFNSYlhseENKZ21Ga1g1UzMxN0d2TDdMVGJ6d0xxOXpQYk5ORklQbldTM2s2RUhuZ2UzUDRWNjdkK0ZyVFViY2IxQVE4Rm9zZ3FmYjBybWZFL3c1Z2dVbFhubVlLU3JZQ3VCajFIV3NxTld6OTBxclF1dFRuZmlSOFFOYzhXZURZN3FDUjd5V0FGWFpPR0k0NmoxcnhlYnhwcVR5N0pvNUMwblVFSEsrdGU1K0VWK3ltU0F2SUdISVpsM2pQdjdIcFc3ZGZBL1R2RWRrOTNiS2lYTWd5K3hjaHZ3cnRXTVcwamxXSDB2RStYdkdtczNlb3ZiUXc3a2pHTWx1aDdubjhLNGZXOVl1bjFGOGxqamdEMXI2QStKSDdQbC9zSzI4Yys3ZGdLa2ZYMnJnOVgrQVdwZUh0Sm1tMUsya2lSVTNLRHpKOWZZVjIwcThMTFV5blRkenk2TFc3azd0b0tLblU5VFN2cmVvU01BSkdoUSsvTlMrSlhYVHJhT0NGUWhITE5qSlkxa0dVcEVaSlhMRThBVjFKSm1EUmR1L0VseEJHWWhNMGdZNVl0eUtwdnFNa3lzeXV5c09veng5YXBPKzRsczVKcGJlUWlVQWREeFZKSVZ5UnI2VTVKZGlLYWJsd2NGMm9GcTdzU0JnRGpKNHBrdTJOUUEyNGpxZTFKSkNZNFhEc2NsaUFmZWs4eHQyQ3pZcU1OamtuazgwQmdHeWVsVTBoSWtMbFNlZ0IvV2dPV3dDY1lwZ2JrRWs4ODBaSUlQcjNvWG1ORHcyVk9EazBLZUNlYzB6ZmdFNUFJb0RaeUJ4bWsyREpkeHdRQUNUK2RBWWs5elVlOG5BR01DbFVoTzVJUHBSY29rempCSFEwNVd3dlBlb2xKejE2OXFDNUkya2dFVWdKZ3h4N0NuUmdGdVNCVUlKSU9TQUJUd1JqbkdQeXFXeG8vWVBVN3E4aWdSUTBaaWlPRE5JcWdwOU1kVFN4NmxMS0FUSzR6enVrT1djZXVPMUY3TGJDWjNFclNnY0RkOTBmN28vcldEckdxd3hxRmlZRm5PQUMyZi9BTmRmS1Rxems3STlXTk9NVHI5UDhWd1dFWUY5ZENSRHhqQVA0Y1Z6dml6eFpMSEhpMGN5eFNINVRHZ0g0ZGY1MXpmOWtUNnBPSXhNeU4zN244Y0RpdHF4MDJIVGJSb21sYVdSQVFXQTJvZlkrdjRWaks2M1phYTZHWEQ0aHZkTm5FaGtkMkhPemR6WHBYZ2I0NlRXT2t4VzE1RkxKRVpBMjFnV1g5YTg1dUx6VEltRytaU3c3ZFRVRTNpZTBqbENwRk1SMitmYnUvcldsS3U0dlFtZEpTUHFyVHZqRHBOOW9rVVdtUTJ0bzdIOTRYVWJnVDE1NU5VNXRaanc3U1hhT0MzZjVnM3QweitsZk91amVNN2phOE52Yk5DcmprcVIvd0RYcS9vUGlmVXA1aERkU3NpbzJRcGt5RFhXc1pHYTk1V01ZNGFVWDdyUFpENGxzb1ptV0syaFlNY0hDbkpQNWNWcmFYNHN0b1NTRGNXakhxdThZK3VDTTE1M0JFMm9Jd3RiNnpnVGI5MHZ0ZGo2Y1ZuTm8xeUxuTDNnekdmVUVZK3BOYzA3clduSTZZdHZTUjd2WTZ0SmZ6aHJPNHlEajdyWjNmZ2F1YXpOZVdzSDJsN2FRbnU2cVNvcmcvQlVNTm5BTGlJUzNrZ1g3a2NSQlUrcEk2L2hYYTZGUGRhckJpNG1rdzNTTjFjTXZ0eDAvR25ISDE0TDNsY3psUmczb1lXcitKOVN0dEwrMFJ4U0NGZnZIbmcrdnNLd3YrRXB1SnRGa3Y1Ym9JWXBDaEN2OHk5TWNmalhwdXRhZmZXa0NwQzBNMGJyOHlxeWx5UGNIcitOZWMrS0JaWEF1N0RVTFZyUmI4S3NjeW9CKzlIekFiVDNKR09Eam11aUdhVGxhTWlYUlNYdW93UEUzeFhsdXRKWVQzSllNcFZWM2JNNEhYOWE0M3dxYmJVL0VGdGV5enRKTTI1TTdzREhvZlQxcmsvR1BpQ041TTJNeUdLRjJWUmNMbGM4WVZqa2xjKytSNzF4ZWcrTDd1ejF1VGZDWXlYdyt4c3FPY2ZsWGZTeFNsSDN0V2Nzc08xTFRRK2pmR1B4Y2cwZlNJWVlYaGxBQUJBKzlsZWcrbGEzd2I4ZnlBRnBZNUpwcGVRVHlpODU1L0UxNTk4T3ZodC93bEtDNXZTMDBVV1RnRDd3SFBHZld2WHZEdXNlRE5HUklyZWE0U1lBSUltajJCWk1jNS9rS3lYdEpQbTJOM0dDWExhNTZacFhpcHRRdTRZQVJKS1J6Z1pWTWZ4SDBwM2lQU2RTOFJ4dWtBTnJwOGVTMGpEQkk5Y2YwcVB3RnJPbDIwU1IyMEx6R1FuTEFncUQvTCtkYitzVzM5cDJqekk4c0ZwQUQ1NVlmZkk3SXZjKzVGZWhobTM4VE9LdWt0WW84cjhVVzB1ZzIwa2VtSXNqL2ZON01BVzlNZ2RPTzFlRWZFbnhSSG8wN3dXeGt1OVFsSHozTTVMa2Y3cWUvYXZmdGU4UFgzais1a2lpWWFmYVJrQ0tQQmtkbHp5ekFkVzlCMDlmU3NXRDltZ0YybDhtNWRuUHpOSTJYSjdsbTdINlZXSXczTXRBdzlhejFQbWVMd3ZxT3IzRFRzeEV2QlozR2ZLejY5Z2ZidDllS2xnMDIyMFNLU08zRG1TUlNzdDArVExPYzhoYzlGSHR6WDBSNHcrRHRuNGQwWnBiMjh0dE5zSWpqeTRSdzMvQW1JNStnYjhhOGo4WCtMOUowV3lkTkowNEJZaGo3WmRnWi80Q0QwNitncnhhOUdOTDR6MDZWUjFQaE9TMEQ0WEplM0xYRjB4Z2lZRWh6dzJNZGdlZ3gzN210U1M5MC9Tck1XRnBHc1Z1cmJuMkRKa1ljRGU1KzhSam9PbnRXRTl4cS9pKzhNTVVsd1ppY3UyNHFZMUdNNS91OXZmdDFxanFQaFc0ZDR6RzAwb2srV05COHZtQWR5UDRVNUdCMWI2Wko4MnRGMjdYT3FEU1pSOGYvRWkrOFN3UFlhU1RiNmVEc2Vmb0dJNjQ3dWYwOXpXSDRlOE96M2s3eFFqQVZjTkxNMlI3a0FWMnFlQ1lyV3htbWxLdExIMEFIQU9RRHRYMFhPQjZuOGFnTmkxbWpCRUFMY2hRZUFUL0FIajNPT1Q2RDllRzF0RWJOM015WFFSQmJNNlhNRCtTY0dRdDdldjlLekwyU2Q0RmZFa01lY0ZsSHpTZStmU3VwdjhBdysrcDZPMGtjWkNJM3luR041eHo3QVp3U1QvU3NQVnJHZExGMHRuQ3ErQkxOS2NDVTRIVHZ0NmdEcWV2U2x5YWh6SE8ydmlacktjRnA3Z09ySHlnM08wOU56OWNqbmhSL1BpcStvK003N1Y3eEhjTGN4VDdmTEVUYk1jWmJwK1kvbFVmakszajhNMjBDd09xczYrYkpKSW01bVk4QUFIc3ZQYkhTcWVxM2R4cWNkaThyQmJhd2daWlhQQmRnTWs4WXh3VnJwZ2tyU1puSzcwUmU4STZtMXRxTXQzY1hIbTJPd05GSE9oV2Zkbk9RL3J3ZXVPdlN1bjFuNHN5WEZySWw0YmxjaGZKNytTQjBLa0hnZ2VsZVQzSGlWc1JwTVpZYk4zQWpEU0RjU1NQbTU5dTNwVVZ6cmtrRU0wc015TUlqNXBVTVdSMUxCZVFlRDNyMHNOWHFSZDA3SEpWcHhlbTUra3Y3Qkg3YlV2aXFXSHd4cnQ2WnRXc0VEMjB6dmw3dUFjQnZjam9hL1NuNFMrTWsxblM0bVdRdVNCM3pYODh2d3M4WnlhUDRodGRYdEJKRnEyaU9YaEtIRzlNamNuMEk3VityLzdDL3dDMnRvSGp2d0lMMTlWdFltdFVBdUk1SlFza1QvM1NwNUJ6WDFXQXpMMjY1WnYza2VGamNGN1BXT3g5eitMclBUdkUrZzNHbWFqYlFYbG5lUm1PYUdWUXlTS1JnZ2c5cS9GYi9ncTUreGUzN0t2aVdiVWRFaWYvQUlRL3hCTmkxSTVGbEllVEVUNmRTUGF2MDBqL0FHcHRDbW5hUzcxQkxKVzZHVElYSDE2Vnd2eCsrSm53Zi9hYStHZXIrRDljOFhlRmJxQzZqS012OW94Q1czZkh5dUFUa01wNXJweHRIMjBOZDFzY09GeERvenV0ajhGcnRSWjNhUWdFT2NuNkd2VS9nNjhlbHd6UnpSTXh1VldVRGRqNXgxN1Z4ZnhqOEJmOEtrK09OLzRZbTFDeTFhRFQ3Z2kydmJXWlpZN2lGajhyWlU5Y2RSMk5kMVoyVStpWHRwTXNUUEVVVWpISUFPT2Y1MTg1T20xb2ZSMDVwNjlEcFBFRTl0cWRzRWxpa1dWWFBtUnErQytlUWM5aGpJL0t1ZnVZTFBYOVZqQUZ6RzFzUnc3S1FTQmpoZ1A1MXVXRUUydi9BQkh1d1kxamdXVHltQTVLaGw0Sno2Vm1lTC9DN2VITldNSlFNRDB4MWIzcmxrN0k2bEc3UjFIZy9SemIzNkk4aks4emJ6OHdKeG5QR0RuUHRYZUw0cXU3V3lSUVhaaU5yYmVvOS95elhBK0Q5T2UyU0ZJYmhIdVp2bVpqdURJT3ZIR0s3blF0UHVyclZvbzUxZDQwalBPY0J1U2NpdVdOZFJrcFhPdFlkeWpacTVRMXUzdjliZ3piM0NvNm5hckt1VkpIUWpIUDRWeVd0V2VwV2F2QmV3RW1ZZjYyTXNVUDU4ZzhWN3BvdmhxM2l0SmdzSU80YjhKR015TCtKSEk2MWdlT2ZDdHhCWUpKcDk5SE5ES2QwWmtqeUQvc3QzVTE5WGwrT3AxSTJtZlA0L0F6cHU4VHlEd2E3WDJxaTN2cnI3SmZ4RUxDNVloWlFPUUQ3ajE2L2hXejhXUEJSK0kranRhM3ptM3ZyUWJvWnY0V2JHUDEvSTF6M2ozNGdTNks3MmVzNk05dTZITVZ6RVF5K3hCNzFXMG40eDJ1cDZDTGFhWWgwT3pKR0dBSjlmU3V1cFhvOHJnbWNNS05WTlNzZVJOYlhQaGI3ZmJYMXVzZHlxQlBNUVlENFBYbnFLNnI0Y1dJMWV4VzdpSWp1b1FBeS9kM3I2MVY4U1c4L2pOOVFpdTRvcnFPMSthT1FIRXFwMDV4NmVvN1ZEOE5aMTAyUjdaYmdCMDVUSnd3eDI5NitYcjhxYjU5VDNzT25weTZIdEdnNlMrbjNNRFBFRGIzZzJzZUdWWDlUOWZXbStLL0NiMmNMSklwa3Q1anhrNEsrNFB0V1haK0taNWRJRVJrQUtINWgxejZHdWpsOFMyM2lId3BJc3BWWlVHR0dPWW45ZmNHdkJyVlVwcHcyUFhoU3ZHelI4cGZGL3hWcmZ3dDhaU3kyakY0bE80QWZlWmZYSGYzcm9maGo4Ykw3VUxJYW5CY3RiRjVCRTZiZUlteDAraE5YL2pYNFR1TmN0eEpJNFFnWTh4ZW1lekErNC9XdVc4TmVEWmZESHc4dHd5NG11cEpDNUl4NWk5ajdFR3ZYcFlpbktucXRUeUttSGtwMjZIcjJoZkYzWDF1SWhleDJjMjl0d3lCdEs5cys5YW54QzB1YnhwcGl6MmxsYnlPd3dVVWprMTg2M1hpTy8wdVd6WVB1alptaElQUGZnL3JYcDN3bThiU1hrYU5FN3h5UjRCVXNTQTFFb05Xa21WQ1gyV2p4MzQwZkJQVTdPZDU1dFBqanRINnlLb0R3SDNIY1Y0aDRrOExYT24zQlZ0bXhlaDNjZld2dS94dHFVbmlLN2VPOGhpbHQzR0h5ZXRmUFh4ZitCVUY3Y3lQWVBHdHRGOCtFY013VTlzQ3ZUd21KZHVWbk5pS0MzaWVBcnBVODUyb29ZOThIcFV0dmJMWlNFdXUrUk9jQWNDdWgxSHc3YmFNeGkzelJnZFNSdExWVG1aWjdHU09BSWlMenV5Q3gvT3ZRVStoeDhwZ1hjOGtqRXN4R2VkbzdWQUdQUUhCN2lyVnhwMGtRWndSSXVlU3ZPUHJWUXFSam5KcWswUzRzWGZnY0U1SFNuZVoxeVJucHhVUXpnWTRKL0tsQnkzSElGTzRKRHcyYzRJeUtWbUo0R01DbzE0emc4MDduQU9lS1Z4cERsZmRrQVpHS0N4QUdUMTZVMEVNQU1qQm95U1JqUEZGeGNvOUhQQTZFZHZXbERnNTRQRk1CeDFJeFJuT01qMnBObEpEdy9UT1FSUzc4ODhnKy9GUmtrZGVjZmpTbHh5T1FUU3VGaVJIT2NrOWFjcmp2MHFFTWVCMUpweU1Wd000cE5qU1AxaXQ3cTk4WDNRanM0VmlpWEcrUnZsUlBiUGMrd3Jhc3ZoOTVjQmtNcnZKL0ZNNXh4NkQwRmQ3ZGVHYlhTWFd5MCszTSt3WUNSakFHTzVOYzc0azhONjFleHlJNFMyVHBqZU1qbjJOZkx5YlMwMFBUVFRkMmNyclhpclMvQ3R1OGNMR2VjREJiUFgvQU90WEwybHpyWHhDbktXcE52YkU0TERnWXJibjhDYWREZUt0M0sxNWNFNDhwT1YvRTEwc2NRMDJ3V0tCRWoycU1nY0t2NDF5dVM2YW15VE9ZdHZobkRvTWVacGhOTXg1WTVQNVZvMi9oUXFGWVFCMDlXR0QrVlIzUGlCTFYzSmxXV1JldzVBTlo2K0tkUjFPWXh4czBTK3ZURlJKdStoU1IxV242YTFxaGlTMUJEWjNIY0VGT3V2QXNNNmVjUUlDUmxqdUp6K05jemJ0ZHlUaFkybW5rQjVMSGlyOTlwbXJYcUtrcjNPT2lxaThDc3BOclV1RUxzcytIdFhzTERXVnRvVmxtY044eEI0RmVvZUhiV1BVZ0dlM1pZaDkxV0F5MWNQNFArSFVsdGNMSkpGSkpJQmtrcmpGZXZlRHRQTUZ1akdJdnQ0Mm5yWEpVeExVajBxV0dYTHFhZHByR3B2cGdoczVWczdXTmR2bHdMdHo3czJNbXFlcWVLcm13MFI3ZTJtSXVTZHhJRzV6eDBydFVpRjdhcWpSbElnTWJVR1B4cmcvR1hoQ2FLOVM0aGlBYU53UTJUa2owcHJGdDZ0bWJ3UzJTT1pnOGJhaG9rd3VKWjdseWZ1bEY1VStoSHA3aXVnOE8vRnJUdkZUeHg2c2tWN0FXQzd0b0RSc0QvRU04RUd1ZTFXRzY4UDZ4Szd1QmFPZHk1SFhQT1B3NlVsL3BlblhHblNhemJSUk5MRVZMZ0RZcDdmTUI3K3RaS3ZlVnVvcW1INVkzYU9mL2F2L0FHYzdyVWRJR3QrRTVmczhrY3B1Slk0Rnp2eU9kM2NnNC9uK0h6MzRXMUtUVlBGTnRETENzVnhBKzI2aUNtTitPTjNQQkE1NDYxOUtlRlBpMWRXbXRpek1ieHduNWZ2YjBrSDAvd0FLei9qUjhHclB4UkVkYjBtTkxlL2IvV1JSa0tXLzJsSTcreHIwTU5qbkdYSlUrVE9PZUgwdWh1b2VJYnhsdFpiSklJN2RVUk1XL0FJMi93QVdPL1dzTHhMZlhrK29Rekl1SHVHQ0ZnY0x1NEhYNkVWYThLNlpKTHA5bEZFeFM0c3VaRkg4UncyVGl1dTFUd2lrK2grYkhFc2trQkFHTWdNZUNwNC8zYTkxeW5OWFJ4eFVZdXpMbnd5K0trdmhRMjF2S0NDamdFTnprOEVqOWErbS9DbmpUUVBIZWl3WFUxMmtLSmo5eWpZR2NkLy9BTlZmTFhpVHc5SmFHMTFEeXNyZXFzcElHTnJNcC9JNUZaM3d2K09vOEIrSUpZSkhXR0JId1drakRZTzdHYXZDVjNGOHNoVjZLbXJ4UHRheDhTNlJZWEtycGVtd3U3L0tKcEVKWnNkK1FBQitGWXZqUHhPNWprbVJYdTVWNFZVR0lsYlBjbmpIK2NWem5objQvYUhyYVdyS2pYVXJESTJZQ25nak9PdWUzSUkrbFp2eGk4ZVhldVdpV21td2kyM0g1cFpBQ3FuajdvUERNUGZJSHZYczA2eWVoNUU2TWs5anhENCsvRVNLMTFJTnFMeDMxNU5ueWJlTmlVSDBIOTBldkE5TTE1YnAvaERWUEYrdXBjMzVWUkg5eVBiaUswQjZIQis4L29PM3QyOXcwejRFMmVuNnpMcVdvM1VsN2Rzdm55UEt1NHBrOEZpY2trbm9QNjgxY2J3VUxlU0pZNDFGNWRzQmJSSG55VVBWMi8yaU0vZ1BxYTh6RlVMeTVtZWhScldqWkhGYUg0SmkwKzFqdDdXM0N4T1FzaDQzeWtrOEgxemsvd0Q2eldaNDAwQmJUWGtzTGRZL05ad3J1d3ljNTV4NmdESnpYc2VnYVpwTnRxczk3SURKYTZMRzBnVUVGcEh3Y0hINEU4K2xlTld0dmVhdDlyMSs4WS9hTlZEcll4cXZOdGJLY3lTa2R0NXdxbnFlT3hGYzA4RStXL1Zsd3hGMit4eWkyemE3NG5lenRaTVJ0RVVrbVBJaGpVWkxmWEl6am9NZ2V0UTNmaHBycTVrZ1F2YldrTEdJQitwVVlaeVQzWTVBSjl5UGF2VXZobDhJQm9maDI3dWI2RGRxR295eHJNaW5hRUp3MGR1RDZLUG1mMTNlMWNkNDExS3p0ZGZ1WTRaV3UxdGwyTzR3Qm5jQzU5QU1zY2Robm5vQlhrNG1rb2FSMU82ak55TTY0ZDd2VDJzWUlZR25sVlhTSG9rYWc4RnZVZHo2bjJybnZHZWxSNmRBc1NGWjcxbHg4My9MTW5reUgwSjV3TzFkUnBVNldLenpXN05OZFhBd0p2NFA5bEV6Mkdja25xU3BySXVMR1RYTlhTeXNsR29YanlnekFFQlpwTWNLVzdJZ3dTZlhBNzF3d2RyM05wWDZIbUdyK0MzMWZXcmU0dVRKS0FNeFI1enVVTm5lZlRuR0FmWDhLenZGT212WWVGRmdnVlpHTE9jdDkwQVlHVDY1T09QYXZVZmlEZjJmZ0dCZElFeVgrdlhmenp2Q3VVdG9pZUZIb092UGZCUGNaeGZFZncvdmRjMHFHM1lTckcwQWw4dUlaZU5NZ25JL3ZIMzc0cldFdWIzbnQwRTFaV1BuVFZORGE1dUV1SlpDMGRya2x3T0puNmNldmZING1yWGhtM2E2Vm9KRlJBd1pVejFWeDgyQ2ZROVByWGY2djhQN2pVbUlndEhoaHRNaU9NaklVK3A5d0IxNlZSZjRlM0dsNktJREdBV21aaWNjNUlYbjZjQWYvcnJwOXVrck5reG90dlE1UFJOYWswTFZkNHlyeUJTVjZaNlZqL3RJYVZQYTZQSDRqMGE0dXJLNmJhWi9zOGhqTzRjcS9IY0grZGIvQUloMFV5YWhJUXBkNFFJK1B5elR2aUo0WXZZdmgzUElVTDIrd2lRSGtyNkhIMXE4TmlyVll5VDFKcjRmbXB1TFI0b2YrQ2hYeGl0TkRiUkpmR3VweVdTcDVmemJXa3hqR054R2E1SFF2RXR6ck9zeXlYZHhQY1NYSkpra1p5ek14SFVuNjF5M2lHeUZ2cXNraWJIU1Vsc2RzNTU5NjNQQlBrZmJJektKVUE0YlljbjJQTmZXMUp1VWRXZURUcHFMc2tldi9DRFJaYjdYVWljRjJhM2VVYnNramF2V3ZyLzRYYUVOVjhKYWVreUw5cHQxOG1WZHVTNjd1RDlPbk5mTjNnWFV0TzBwOVB2OHBITkcvbFBFemd5YlhYYWNnRGdZTmUvTDhTVThPNk5aWE5odGpFQUhteXQ4eTdPRCtkRkhDeGNaU2t3cVYycEtNVWVxV1h3ck9pL0V0NWhDUTE4b2ZHQ0Y2SGpuOGE0djR6K0JSSDQrTnFHWkprVUhhV0xjRW5nVjZCYy9FZUx4RHAyaTZsWTNER1MwaWl1bkx0Z1lVL01EN2JUV1g4VXpiK0l2RTBXdnd5R0padjNUT1JsRUJVRUVIOHhYalkyazR4c2oxTUpVNXBYWnp2aGpUb29OUWk4cGl3TVlRSEhKQTQ0L0t2YlBoeG9NVnpBSmJoRStYaFFlMWVhYUZwaVhIaVZ4YlJqeVVBQ05qcVBYMno2VjdGNE4wcG5nV05TSVIyUFhOZkxWSlBuUHJhRlAzRXpJOFhtWHcya2p3bFRFbnpZWGdxUGF2TzlYMXE3dW9aTG0zZVRlTTQzWlhmOEFVZENLOTcxWHdoRmRvQSt4d2c1ejBQR0s4ODhkZUdudDRHVzJVam5nQWNmbFhYaGNkVW9zeHhHQmhWV3A4eGZFRlcxaVI0cDAybFNTQXZRRDI5UHBYalhpclFMM1JkUmVTeEt5REdUR1A0MTloNjE5Si9Fand1MXJkczA4UVJqMWRldGVSZU1QRGNzRCtkQ0M4YUU4ajd5YytsZWpISE42M1BJcTRKcDdIbDFyOFFaOUwxWVhFY214aU1GV0dRd0k1QnEzcGZqUk5TdTFrVXhzNWJnZ2dNcDlLZDQwOEN2cmFQYzJrWVM3UlNXalVjWEFIT1YvMnZhdk0ybE9tWG56UEpieVp5Q1I4cDU2Zi9xcm9qS05hTnJuRktMcHl1ZlQzZ3JWcHJ5M1VobzV5bnlrRUJXcmNpdTQ0WGxEQ2FNeUFvY2pqMnJ4NzRZZUpKbXRvcG9ycFdsZy93QmRDTzQ5Ulh0bWxheGFhem9pTktCTEhKMVlLUE1UMS9XdkF4TktVSjJSNjFDb3B4T1cxZTFrdXkxalBHNFVrRWNuQTl2eHJkOFMvRDBhcDRXU0loQzF2Ykt4YnBnbnBuM1BGTzFpS0xWTElFS3htUWhZNUZCQVpjOEErOUt2algreTRIam1NaXhYQkN5QmhncmpnZld0WVJseWFibU1yYzJwNHQ0NytIVWx2YTJycWhNaVNCR3h5QzNldGJ3MW9keDRVdkVaa01Za2tVKzV5VGdmcFhwa2t0aHFkckpjdFBDeStZWldRa1ozRWdjVjBFM2cyMDhXYWhwNFZvV2NuejVPbUZBNmRLMGppSzBWYVMwTTNTZzNkTTRXNkR6YVBJbDBnS1M1QWZvZnBYZ3ZqelNMcncxNGlrdTdlNWNDTThnL2VBOUQ2aXZiL2pSZXgrRjViRzNsdWpHbDNLU3BVWnljNEFyejd4enBGdjQ0ME9aclZtVzV0RkpZRWNzTWQvV3V6RFZuRnFUMlpqV3BxUzVWdWp5ZlVOSXMvRmxwTk9MVVEzdzRML2VEREdjNHpYbnVxZUczc3BKQkxMR2lvY0RZU1NCNm11cXZkY2JUaEhDUXlOTzVLbkcwa0FZNS9Pc1hYbHZQS2RYS3VHYmNnWWJXZGU0OXovT3ZmcDFMSGx5aGZVNWVhNXQ0YnRtaWViZG5CSUF3YU5Rc29yb0NhMkl3MzNrNkVIMkZPdnRNL2NtZU9OMUIrOENEOHY4QTlhcWtERlkxNVpRVGo2VnZHWG1adUpBUjVaSXdSaWtKWEFIT2FzM1diaE41QTNvZHJlL3ZWWmUrZU1lMVh6Q1VRQkhZak5HVGdjZGFjSWk2RXFBTm95ZXdGTkF3ZWNtaTQwaFZJNU9BS040WHVNQTBpZ2tZeHlhVHFNQTVPYUxpVVJTUURnRElGSVd5QmtjR2x4eUNjZ0NnNUpCeWNlcDcwcmxLSUE4ZTNwUnZBQjdIMXBPQXBIVUNrQzVJem5GRndhSGh6d0FDQUtEME9Sa21tazhaNElGQjlNQW42VkxZMGo5emRRaHRQQXJnYWplbWVkOGtoVHdUWEJlTHZFZC80bGxraXM0NVlvdWdDREc2cHJMd3pxZmovVWpOZEdRUXMyVnoxYjZDdlNiSHdGYjZWcEdMa0pieUJjQlNmbWY2MThxb3lrOVQwSlRqQTh3MEx3aTJuYWNibTZDdkwvY0I3KzVyRzhTNmtMdFdXV1JVVmVpS2NDdXA4YTNiMmgrenZNdHRBVHlUd0FQYXVOMXFIUzVTSTdLNU1qSDc3c0NmeXJTT0g3c2hWOVRFZVdINWxoaWtuWTlRT0ZIMU5hT2crRzczVXJwV0R4VzBCNVpsNXg3Vmt6NmpwK2d6bFVMenlubkxualBzS3MybmpGNTVsUWx3V1B5eHAwcktva3RqV25GeU81MHJUTERUWHcwd2taVHkyYy95cnQvQ2EyMGs2QUJpcmRDN2N0N0FWd09oYVk4NnhpNFJZakp5RkhXdlhmaGRvRVVrV1hSWGNINWQzTzBWNXRXVnoxTVBSdHFkTnBIaFJybU5HOHRWUnZVSElyVWowaDdCMlZRSElQSXhnZlVWMDFxNGkweUdNb3BjOEVEcFQydDJtazN1aVp4eGdjVjV0YVNXaVBXbzA3OUNIdy9ibFNqTTRqM1lIUEZabmpHV05aWkVWRXdXeUd4Vy9FZ2tnQWNoUkdlNHJHOFIyRDZxbmxiQkdXUEpDOG11UjFuYXgxUncvdlhadzk5YVJhaGJPc3NRY2cvS0tnOExmRGk1MWEvbGhoaVpsblhhMFpISzl3ZU9EWGZhWDRYdExlQllnVEt4NHd3cnRmR3NHbWZDYjRlUUdDSVBxTit1NSt2N3RmOEFFMXZob2M5MjNheHo0dU5yUWlydDdIaEYzNEswcjRjTkpIWndKZVhwWWx3VHVFWjlQenJKMUxXSmZzUmVkYmF6Qi9oVnhuTmJkN05kNnplU1hFU29Jamwya0oyRmNlbzdnVjRmOGNQaS9OYTZpbHJwMGZtcXBJYVVxRHV4NkExMFJmT3REejVVbkNWbWRyb0cyLzFsNVZoeE9RUnZVQTcrRGpJSGMxMDl1VGI2VmNoaE1HalZKTmc1eVE2aitwckIvWnV0WDhUUlcwdDI2eExjRGE3QWZkejkwbkh1QjBIUTB2eEU4U040YjFTN1NSOXBDbkJBd1g0empQMVd2b2NseFNtblRiMlBGekdseXl1anRibFlkVjhJeWZPcXpXc2FPcVk2S0dPUjdIQVg4NjhWOGUrQklZUEV0NWFBRWhwUUkzSXdTR0FZWnIxWHdUNGd0ZkVWdGVxSk14YWhCc1U1eDVlNVZ4K1dLNVg5b1NHQ0h4UkNZQnRXUXhEZG5hVGhNZno1L0N2WW5UOTdRNUtWUnJRaStHY0xxaUNTNVNHV0ZNSXpNQW1QVG42MTZmNEYwODIycVNTM0RYRjA2Y2plRHRBOU9lMzQxOCs2TnJqYW5LN00yRkVoRDV4aFBtNFA5YTlQMHJ4bWJ1emVHWHpXa3RTQmd2dERBY0hPZlgyOTYxcHpzYlRwODYwUFc3U3phMVNhL2tpa3VZMUplRzNJQmFkOGNNM3Q2ZWdybkl0WHVKN1Mvd0JTUUNXL3VRWTQyNTI4c0ZPUFlkZllBZTljem8rdDN1dHZMYVdhQVNrYkZkbjJpQUU4dG50eC9PdTU4TStGWkhVWEFpV0czVlBMOHlRZ2dMdXlYeDZuQlA0aXRZMWxKNm5KUERPS0tGejRlWHc5OE8xbG1jcUwxd3JaQjNUWlB6c2ZZZ0Q4Q0FPYWZwUGdHZlI3Q081bjJtK21JajJNQUZVcWNoQjJ3R1lESHBHdnBYUkxwY1hpN3hoWVNTenhKbytsb0dpaUJ5R2Y3eExkczU2L1NsK0x2ak9MUjQ3cDdjSzBrMjZLelVnaGtYSjN5OGRNbm5Qb285UWFWV2FhdVRUcFN1a2tlZC9HSHhmQjRJOEtyWlEzS3czY2hhS0dRTU04NTg2WSs1eXdIc0srYnBXUGl6VWJoRWRyWFNWSVZsR1RKTU4zVmo2a2ovUFd1citKRWszalBYOXBXVHlZZ0lvVmJPMVZCNTRIY25rLy9YTlhZL2huY1h1aldsamJrMjhWdysrNG54dGFRQWJRQjdmZTVyd2NUT0t2SnM5cWpoNVdTT2YwNXJueGpxUXM5TlFySEVCQzBpTnRXM1QrNHVPcm51ZU1aUHZXOXFXdTJId3V0RzB6U3dwMUdVQmJpNEFERkIxRWErckU5ZlFWTHFOOWFlRGRKYlQ5R2pLTTI3Zk9GeXpjOUYrdU92dDJybkxmd2ZmYWxNWlpWVnJnZ2xJZ3dBalU5U1QySjdrKzllSE51YjEwaitmcWVoSERXV201bStEdElPdDY3Sk8wU0dTNGZkUE81SkJ4Mko3NEdCZ2RQeUI3R2ZXclcwdGJ1VnBsZ1NRaUlsVCs5bUc3Sng2ZmRVY2RCbXNnNkRmMmhXMXRVa0oyL3ZaRlhBS2puWW83RDY4bW1hRjhPTlR2TDFkME04MHNqQXNYT2Z3NjhEMkZFNmkzYkxqZzIraGIwVFJaZkVzMDkxSEFzTnMrUkVDTWJ1L0dheS9HL2dHUzF2WTdlQlE1U0JaQVF1UmxsQk9QcG45SzlWOE8rRFgwNEJiMlZTNUFYYWk1TWErZ3h3UHhyMGJRZmhaWmFrSXJtYUFGTm9Edkl4M1l4eGdEdFhOUEV0czJoaEhGbngvcGZ3R3VKM2tabzhBamN6WXlUanQ5YXhmR0hoK0d5MDU3TzRTU0RncElyREk2ZFFEMjVyN0Y4WmVDWXRGdWtrdEVZUURIS2o3aEI2a2UzNjE0L3dESC93Q0VkdDRqMGg1N1F2SE1pa3E0SHluNitsS2ppWHpybU5aWU84ZEVmbGw4ZFBoNVA4UFBGMXpBNmp5V2xNdHN3NVYxSko0OXF5L0RiQ0VKZXhnQlVHTUgrOTZWN3Q4ZmZETU9wd1NhYnFyR0dTRjlzVTJNbUY4OFpQOEFkUGY4NjhMdHJPYlJkWGt0THVNd3N2eWxNOEE5aVByNjk2Kzl3bUo5clJWOTBmSFlpaDdPcTBkZDRQMXJ5OWNSMmRoRGNnaHdlY05qajlhOVhzdmlKY1RlSG85Sjg0Q0MyK2Jqa3l0M1A0ZHE4VHR3Yk9ZYlFSSEprWkhVR3VzOE5YN01ZV0pJSitVazBxbFdTMllVNEp2Vkh2M2gvd0NLRnhwM2h1RzFWM010NmkyeDVPRlJUbkErcHIyRFJOWWY0bDZUcG1sMjdNa1Z2R3NUT0d4dUtrWlkrZ3dQMHI1YzA2L1pJb1hKQkhta3I3Y0x4K1FyMzM0Q2E1QnBlcDNFSkJrU1prbFhCd1JHY0VqUCtlbGVYaThWSkk5SEQwRmMraDN0NG9yeTNnMDZQL1FvVXdac2N6YlFNdWZZMTNYZzYraGdoUXlOZzlnRDE5NjU3eE9rYStBWXpGTEhERmJUdjVlMGN5TGhEalBjL01EN1ZTOE82N0ZIQWpLeEF4eHhtdkRVK2YzejZYRFI5M2xQVlh1MXVvU1FSbCtCZzhWemZpaXpFa0xBS2NpcVZqNHFhUEIya0szUDRWTGYrSmx1WWdTcWdKNzV6UktPaDJ3cCtSNW40OThNalVyRjk2aHBJK2g3N1QvZ2Y1MTVkNGs4R09pRjR4Z3VwS2s5Tnc0SS9MQnIzclZacmU4REVzTnBQTmNKNDMweGJkMjJFRlI4eWpHUUQvOEFxcTZUdG96SEVZWk5IZ1AvQUFoOFdwYWt5S2pRM0tmT1l3ZG9ZRG5LbnNhNFA0Ly9BQUxGdnA4ZXFRS3BNcFAybU5GSUtucytPMmVwSDRqZzE3RjR3OFBTMkdwaTRoM0p6NWllM2Y4QUt1MDAzdzVZL0Z6d25JMGM2MjJyVzhHSm9Hd3kzQ3FPY0FjZ2pyNjR6NlU1NGlkQ1NtdGp5SzJDNWxZK0hQQ1Y3Y2VGOVJWWkN6Ukg1QkpqSzQ5RC9qWHNudzYxU04xZTJGeElnbEc0S0RrODl4Ni9oNlZWK0lud3dqOE02cEpOQ2hTRXVReWJNcW50OVBlcVBoM1RCWVNMTGJzWlVVaGdGNWUzUDgveHJzclY0MVlYUFBwMEpVMmEzaWEvMVB3ZGZuTjVKSkNXeXZPVmtHZlVqOUs1YlZQSGJYOSswTXR5ekxKOHVHQlVxZlExNkpjdkxxdWdHRzRoVzdpMmtobFg1eHh6OVI3R3ZHZmlEb1RXRTBreWgwOHM4T001QUhZZytuclcySFNsSFVpbzdNMGYrRXFsKzN3eExLeEprSEJPZU85ZXVmRGJ4cExwMmpYVjJaVldXWmZManljOFo1TmZPZmh5Vjd2VVBOZDJHM2dkZUFldjQxMVUvd0FSenBkcEdpTVJDQUFxOXdPZy93QWExcVViMlNNMU5MM21kYjhUZFZieFVZbXVRQVlaQ0lzOVFlMkt6ZmhWcEREWHBaSkpuZU9iZzU2bnRpb05aOFMyR3Q2SkRjR1lJUWhPZlZ2VDYxUzhHNnhQS0kydEFjOGpKNzQ3MG5GOG5LeVUvZXVqdTd2OWpqU2ZFR3Z5M1J2cmVPTlV5c2NxRWdjYy9xYTUvd0FkL3NkVy9pT0NBUStJOUxqTm9NcHNCSDg2cGVOdmlMZmFYSXIzMTFkSVhRWWpRNEpIdlhuUGpUNHpYcG1TQ3p1N2FDT1NNa3F6R1NUUDRjVnJSaldkck1tYmd0R2pjOFIvc2QrSXJYTW1qU2FWckFsVUI0VnZVVmo3QUgrbGVSZkVqNEw2L3dDQXAxVFUvRDJvNlNPdVdRc2hQczNRMXQyUHhadkxTOWtVWCtvR1ZsTGNBS3FrYzhkNjZIUy8ydnZHRnJZTll5UzJtc2FleHdiZThYekNCNmMxNkZQMjhYMFp6UzltK2pSNGcwTWkzRXk3RzVIWVZCOWxPd21SZ3YxUE5lci9BQkEwYlMvSFdsdnF1bTJSMHEvZm1TRlgvZFA2Z0RzYThua2lNY3JLMmNxY0d1MmxVNXZJd2xUc3dlWU9tMVNRbzllcHBuUmdjNXpUc2NFak9LVUljWkl3TTFwekVxSXdkYzR5VFFBQmdkTzFQV0k4Y2RhREhrNUhJRkxtSHlFZk8zSjVKb3dBQU1ZTlNlWGs5K2FGaUpZWXdBS0hJYWlSODg1R1FhT2hYSGVwUExISTVwQkhnZXVhT1lmSVI0eWNIQnpRZ080RThnMUlZeUNlQ0JRSTg0SFhOS1VnNVQ5MnRmOEFIMm5lRzdjalM3Y3krV01lZEtRaS9oNjE1TjRqK0wwK28zTXF5M1c1bVBCUUU3YTJ2aXY0bDhQZUdZM1NOa25sQTVZdHVyd2Z4cDhVSUpneVFIR2VQbDRBcndwemEwaWpTblRUMU9qOFNYbm1zMXhkWHozWjVJRHNRRi9DdWFtOGJSeHpsSTVWUU54OGd3YTR5ZnhWZVhURllvR21EbnUzU3JtZytHNTlkdlkxTGlPUW5KQ2pOYzg2alM5NW5YVHA5RWRGcGx0RnJOK1dhVjF5ZVMzSnIwTHdocDl2WlRxTFpQTW5JKys0eVFLcGVDZmhjSW94S1NHeDFQWEpyMVh3YjRJZ3NyVXlzQVc5eFhtVjYrNTZPSG9KanZDUGgrZWVaWG55eGZ2MkZlcStFTFY0bWpqakdGUVlyRzAzU2JkSVk1a2xYYW81QTdjVjBXajZxc3BqYUVBTXZCSUhXdk1xMXJucjBhSjNFWU50REc1Qko0ejZDdE8xQzNFUWZZQXZUcldOb3QwendzWlFTWDlhNmp3OVpnMjREWUlKeml1S2MyMmVsVHBKUkk0ckJjcVNvSVkxTTJucDl0QVpRUXk4WkhTdFI5TFVTYndPQ0tjMWtYUU1BZHluaXNYRmxvekpkRlMwbkVpSnpuTll2eEF0cGZFRXFQT3psVkdBUFFDdTBlUHpiY25uT0t6OVMwZGI2eks0QVBVY1ZGcEpOSXVOdVpTZlE4cDhTNmJETm83MmNLTWpUZnV5d0dmbDcvblhobnhhK0VpMm11UXhlV3FReWo5M2dnRTRCeU1mU3ZwM1VkRGExTE1GSHk4MTUzOGEvREVtcWVHcDU3VUQ3YmFIejRzZGNqdFc5R3EwMG1jdUt3eWttMFpIN085blk2TkJiV1NTS1dsWXB2YjVTckRwK29yeXo5cm5WRzBieERNVEl4SlIzMjl5M0J4K2VmenFMd1Y4VDNzZkVMczUyWjJTb29PQ2h6em4zQnpYbmY3Y1B4QU45cXl6bzZwNUV1M2FEa0VGT0QrbGV6bHJjYXphUG5NYlRiaW0wYjN3aytLalRhVXpJNmd2NWFnRCtFRTlCK3RiSHhLOFhqeEpwbHJNSGN6UWdKSnpuNWtMRCt0ZUMvQmZXWkl0TW5rUnhobVlMK0JydXRDMVNXNDA2K2lQUkpWSlBmNW5HZnAxcjNJNWphVFRQUGVGVnJvZzhOK0tKYlB4ODlxcktiZTRuQ1k2amtIL0FQWFh0bncvdll0UWtrbWQxTG1OV0lKd1RuanIyTmZMMWpxcjJ1dFd4T0JPMTZNTm5xQTJEWHFmZ3J4aTF0Y3Rsc3EreHNEampJL2x4WFM4UWs5VFNqRG9mVVhnSHc1YXpCNVpaWGdaajg0NEo0L3ordGRiYzJkNUdSYnBmTE5FK01aSjJ4cjZiVDMrbnJYbmZ3MitJV24zK25HQ2FRaVNXSFloN0RJSkovbFhwbmh2VGhxVm9zMDA1Q1J4bGdBMk40emdWMjA1UmxIUXptbnphbWV0ODZNRW5qRnJFemI5Z3lHZlBRRTl2WEhzS3dQSEdzdzYxZXlnYnBIWlFwNHlvVWRFQ2pqQTY5ZVRYZFhHa3hYQmFWcFZreWR5Zy8zU2NISHZ6V0hxUGd5RHpwU2s3bzBRM3J1T2ZseVFSOWM0ckNxcFc4amFoQ0RrcjdubnR2NFZndDRqY3lLa1VVWUxOdVhkSzNzQjJxdnFtbjNXdHhQS0laWUlBTUpHRGhueU9NbjBydGRZMEk2UFBHMGlLWUpnR0dEbkI2Wi9IRlYydS9ralVqRzBjREhiUFN2RHhMMXN6M2NMVFRWenpXLzBZYVJFckcyM2JPQVIxV3JIaEt6aXVwMzgyMURxbkpIUHplbGRwY3dKZHRJam9nQko1SXFsRnAwQ1Q1alV4dXArVVkvWDNyenFrbDBPeU5LejJKOUwwS0ltU1owaFpuUENiY2NaNXJvOUk4TEpzUjR3cFdUcUF1d0Q4cXBhWEEwc3NlOEVTampJSEJGZDM0SjhPWEZ4S2loU3lTZ2pCQTdWeHQ2bmJDbkZMbUtlbi9ET1BVc01xTGpqUE9DSzZIVC9BQU0zaDlWRjFHN1J0d3JBOGowSjlxN2Z3NTRGTnBjUnBJeXhyS01xVDBQUTRyWjFEd3RGZjJwWmhJWW5PR1VEcFhSVHc3a3RUbXJWVW41SGsycitGUExtYVJZeGNvUjkza3VSL1VWNW44U2ZDWXU5T25tdFVOcE5naHJlVmRxUzRISUgxOUsrbFl2aDVKWmtOYXJ0aUk0TERkai9BQS9Dc3p4ZjhPNU5YMFY0YnVPRzZHU1R1alUwcDRTYTFTSFNyd2VoK1BIN2Z2Z0pyRFNKTlJnV05SS05qaE1BaDE3RWV0ZkhjT3VIWDdhS080TzY1aCtSV1BWZ1A0ZmV2MTAvNEtEZnN3UXovQTN4RGZXRm9rZHphUkc2TVNaSklYcjdaeG5wWDQzWE1EYWZyTTZJektWazNJUndldVJYMWVSUG1wT0wzUjhqeEJTOW5YVWxzenZORllYRUl0NW16bmxIUEJIc2ExOUprZXluMnVmbEl5cmRpYXhkRnVsMWkxU2RRRmsrN0t2KzBPNHEzUGVTeHNwQzdrQnd5K2g5ZnJYWFV2ZG80SWJKbm9BMUVRMk1NaUhCVWlVYzlmVVY2djRBOFp2YTNWaXJGU3BRS0c3bGM1R2ZYZy9wWGh1bDNMM1ZtSTFJZG91VkdlbzlLN0x3WHFwK3lCV0xCNGNBQWprZjU1cnlzUkM1NmREYyt1N2I0bVNYUGc5YmU0bExyQmNFS3dPUnl1UHkrVVZOb3Z4ZnQ5T3Rpb0c4ZzR3ZVNUWGxQZ20zdWZFK2hyQkN6TG1jRnNIT1JqLzY5ZXdlQ1AyZXJTNXRvMnZMcVRjM0pBWUFpdUduQmJXUGFvMzVWWXMyUHh0dnRTY3BCWksyT0FTM1Q4cXR4ZU9kV3UxMm0zalZ6MHk1cnNkQytDR2k2RmFMc2tEc3h5U3paT0swUCtFS3MvTzJoVktwOTN2UTZPdWgzMHBycXp6MU5YdTdwUjVzYlJzRGs4OGZTdFEyUDl0V0tOSXhESU5vOTY3WFZQQWtIOWxzVkNrbm5JSEpyTTB2UWl0cDVZQjZub09SV1VyeFowL0VlZDZ0NE8yT1RLb1pGcml0U3Nidnduck1lb2FhelJiR0dIWG92c2ZZOUs5NjFYd2U5NXBVaWdIZVJrY1lJcmx4OE1sbHMzYWRpcGJoeC9lSHI5ZjhLRnJ1WTFxSzJQSS9IbW8ydXRpTzdrZ0d5VDVaUm5Qa3VSeVBvZXgvbjM0ZldQaHVsbklsM290eUhqZE10SGpvZTQ5eDdWNlQ4US9CejZJWkRBUkpBM3l1dlp3T1FEK1dSNlZ3RnQ0am4wRjVJcmR2M0xITEtCa043ZjhBNnFxRkxzZUxYb3VMWm02QnJxNkxlRVg5dE5ESWgvaElaR1hIVmZhdU04ZnZwMnMzc2s5c1ZERE9VWnNFRSt4cnFQRlh4RHRieGZLdTRrZ0orNnhHVlkrdU94cmgvRU5xdXFONWtheFNJUnd5RTVyMGFiVVVsWTh1Y0hkczU3UjlHTmhkeUNKU0JLZVVQU242aDRMdWJtK0dZWk5qOU1Ma0QwcVMxZ3VMVFVJMUFsWlNlQ2VUWG9PZytJN3V6aldCclVTamI5OEN0YXRSeGR6SlUrYlE0aVQ0S1h1cXcyc2Njc2tNS0RuSXdPZXRkNW9md3JpMFBRQUladk1sVGpJNmttdDNSYm03MWRTckFwR293T01ZcXZCZlFhUnFVc2s3U3Q1WitVRTRXdU9kV2NscXpvaFFqRjNTUEl2alo0WWxzdGRXVFUwbmp0bFZlY1lCOXE4WThUWE1MYXBKSmJXOXZnOElHYkpGZlovaXkxdGZqRG8wdHRkUnFHSy91eUZ3UnhYeG44UnZBOXg0TThYWFZsTXJIeW1PQ2UvTmVqZ3F5dFo5RGt4TkZwM1d6TS9STG5VRElVa1ZIaDVLcUFveHdja0h0VWVpK0NMclhiMEV1STRTY3N6dUJnVWxqYmZZNHBKRGtEYVZVZXVlcHFaNzVyZTJTR0liRmY3K09NaXZRZFhzY3lwZHpUOFErS2JiUnRMZzB1dy9lQ0pqNXNuOTZ1SXZiZk55NVVnaGptdE80dEMwNUpQSjVGTmF5REpnZ0UvU25HYWloeWhjeWZzNXlRUmtDbkczWmxIZXREN0p6d0NLWDdFQmtZNlUzV0JVak9Gc1JqQXptZ3dIampHYTBQc25PUFNnMnBHZUNDS1BiRDlrWjYyNUM1eG5QTkkxdXc1d01tdEZyVWdrNEpGSDJUMHljZXRMMnFEMlptRzNiUEFKb0VCNmNaL090RDdNU0NCemlsTnFPUWM4ZnBUVlZCN016dnN4MllISkJwQmJZSXowSFd0QTJ1RGpCR0tQc3JIQUlQRkNxZ3FaOTErTWZFVStzNmpKSVBObUR0bkpPUldRbWh2UHRabURNeDVVRHBXaWZHVnA1TEpJa2NDZG05SzUvV1BHbm1ia3RENWluK0xPQlhteWs1YkJDSEx1YmxyRlk2V1FIa1o1U2NiRTVyMS80WStDb0pOR0Z4SGJsSGs1SmJyWGlId3MwbWJ4YjRvaU0wbUlZMnpnRGcxOWcvRHpSNFZ0SVkwUU1pcnlldlFWdzE3WDVUcHBwN2o5UDBxRFIvRGtLaEFzc3pBQStnNzFjczRIdWdJWTVDRkl3ZmVwTlp0ekxhVzhhbmNGSnhqcWFrMERUM2drSTNEZWY0UjJyeDhWSzJoN3VEaHBjMzlKMDc3TFpiRGxzZGM5YTNmRGUrT1lwRkdDekhqanBUZEY4T1NUeEtXd29icWU5ZFg0ZDBOTlBsWGFvSUhVOVRYbVRiNkhyUWliT2hhVTBZUjVDV0k1eFhaYUhBb0pKQTR4V0hwOEpkU1JrWnJvZEdoT1FTYUlSdVc1V1J0UVd5eUFFZ2tpckgyRU1BVlhCNmRLU3hqSVlZenRQV3RLRk1uQlVqMXJlTkl3bE5tVkpZK1J6c0cxcXJSMlFSeXJGUVQwK2xkRWJNU2pCQklxbHFHbHBHcFBJSTU2MVR3ejNRUnJyWm5NNjdwVVVscTRDZ3NldGVQZkYvWDdUd1JwazBrc3F4NTR3ZWMxNnQ0NThSZjhJOXBzc2dLdXlqNVIwSnI1MjhhZUhyNzRqNjAxeGVSdE1YK1dDSWRBZlg2MUVxRWI2bXZ0SGJRK1kvaUpyNld2eEVFMW9mTGh1bkxiVjR4ay93Q09UK05lVy90WGE5SnFtcEpHU1dXUmdTUG9DUDB6L0t2dHo0bWZzbTJvOER5WHBRUHFjSUV5RURHM2FQdWl2enovQUdndFVtWFhiMTIrZHJDVmt3TTVYNVJ3ZnhGZWhnVS9iSkpIaVpqRnFuZnViWHdKMVNPNjArYUdSMjJSVHNwd2NFRWtWNi9vOW5OWjI5ODdFbzAxdWM3aGtqR3c1L1hnKzFmUG53SnZBTHlkVVlsYnVKWFFjbkxESVAxSkJINWl2cG0zbFZZYkF0RXpKZVdMbVRqbGlySEovSmYwcU1VK1d1MTNPT2tyMDB6eFZkUSsxZUtvY0hEUjNicXZiSUhldDVmRVQyd3RvNDVIQUxiR3puSTNMa2ZnQ0t3OWFzeHAzamE1U09NT2xwZHpSNTZjaE1uOVJWTjc1bTFpMmlaaXd1NG1kTTg0S2c0L1N2VWNybzU0YU05dDhDL0VlU3p2TEdZU3RHQXpJeEo0R0YvdzRyNkYrSFh4eSswZUVoYkZ4dnQxWlV6eVc1QjUvSEZmRUdpNi9MZVF6cEdTeGprRndvQTR4am4rdjZWNmg0QzhWeXJCSE5BNUxUTG5BN2xUMHJTT0tsVFowcWtxaVZ6Nnp0UGlvYnUydDNFaXFyTHNIY2tjZjQvcFQ5UzhXdTMyaHQ3SElNVHFDTVp6eWZ5cndlYnhlOXZvVm5kUWhnZ21rVVk3NUFZRDg5LzVWdGFmNHpmVzJaa2xBKzBFU2NuQUpQQkgrZldsVXh6bEU2S1dGVjAwZXFXZmk2VFVMZFlYSG1MSDhnSkhPTWtqOGE2ZlROQUdyNlU4aUlTNmxYWG5weHovQUo5cTRid2JaUE0wNnZISVRKQ0xoRDdBL012UDQvOEFmTmQvNER2L0FMRmN2YmtsbzNqWUJzOFl5Y2YxRmVQTEVPYjlEMktWS3l1akx2OEF3NUxLa2JxaHlCdU9PQjcxVEhoNlJiaEFvSWpCK2JqbFBmTmVsNk5wY1dvV3NhdUNHT1Y0NmU0L0dwZitFT0FYTVF3NTZqSEJyWDJQTkhVNkZOSjJaeHVqV2JSenhKTEc2TVhQUFVFY1Y2OTREYUN4dDRtamRESkhsZ3pEQVBIVDlBYTVTMDAvN0Jkb2pSQUt5Z0FFZC9ZMXQ2WEFJcmlLTlFTR3lWSFE1ejBybDlsS0V2SXBxNnNlZzZRWDFGSFVnc0VKS1k1d0syZE1nZEl5amdNcmNISFEraHJHOEsyc2xxeXlxN25PTXFEN2RLNmRMUlNvWkFRVzZqMXIxY1BIdWVkaU5GWXNhYkFxOEVJU2VvSndSK0ZVUEVXbEsxczRHN0I2N1JqODYxOU1LdXV4d0R0NkhyVGRXdC8zREFZT2E2S2tORG1wVDVYWThFK0tuZ0NMeE5wRjNaM0MrYkJjUnRFNjlpcEJIUDUxL1A3KzF6OEZycjRGZnRBYTFvTnhHNlF4VHVJR3h3eUU1US9sWDlKT3NhQ2sxd0FjaFhVZ2oxcjhvLzhBZ3QxK3pOTE5JUEdXbndicDlNZGZQS3J5VXpqSitoL25WNWJWOWpXU2UwdERsemlsN2VqekxlT3ArZFBoTytXMGxrRFoyeXB2SFBSbDZuOHE3RHc5cHNQaXN5b3JnTVVKMnJ5U1IzeFhtK2hTdkRxQkxFWjNIQVBvYTd6d2xxNjZYZDJqc2lwSkdCTU1IOFJuOEs5dkZ4ZTYzUG5zTkphSm5aV0hoNTlNMHlVcXBiZGxjZ1k2VjJmd2kwb2VMV2owNllxdDdMKzd0NVdHTUU5RmIxRmR0NEY4QUw0MDhPUlhkdEdqd1hVWmtBUElQR1N2MUJCRlcvRmZ3amwrRzh1bGFwWk1ydGRKNTZSNCtaSGljWlZoM3p4WHpjOFZ6ZTVMYzkybFJ0cWpiOEQ2ck44S3JXL3Q5U2dranY3ZVl3bUVyaDl3NmpGTHJ2N1JPcTIyMlM1MUswMEszWG5hVDVrcFg2ZHFyL3RBZU5adkdPdDJXcDJWc1k5UjFDQlk1MklKQ3VxZ2JqNzdjZmxYemg4WGRBbmg4VlcxbmRYVXNzUmpFMGtqRS92V0p4Z2V3cjBjdXczdG9LYzlDOFhqM1FqeXdWejN5My9hemt2ZFJNY1BpKzVTWGNGVldpVmtJN2RPYTlwK0ZYeHMxQzVsdDRkVWxXVkxoY3czTVJ6SEtQNkgycjRTOEFhQjRiMVM3MUdYVVYxQ3huc2JTU1N4bHRRcEJ1Qjl3UG4rSElPY2M4MTljUTJsdDRGMGZ3ZXQxRktzWGlleWl1R1JBZDFyT1FPUU93TmVsak11OWxUNTQ5RGx5M09KVnF2czVvK2x0TThaZmFnSXBHeU8xYi9oZTJXK1ppUUJrL0thOHYwL1M3alM3NjBqY3N6ZVVDYzk2OWUrRXVtU1hWd01MNWlEcU9tYStjeFVvdVM1VDZ1bE5wWEx0NXB5MjhLc3loQ0R5ZTRyemY0eWZFV3g4SDZLOGhWREsrUkhHdkJjNDdlbGUzL0U3d3MxcHBBbGhSa2tkY0ZUL1N2Z0wvZ29SNHF2L0MwTnhhMmNqd3poMGhsa0k1alJoL0Q2Zld0TURSOXBMa1c1bmpjVEdsU2RXUnhueE8rUDkzZjZsTEMrb3cyaTdzckdvREZmWTFnNko0emZXN3RveVFMZ0RjY2phcmoxL3dEcml2QlBEZGlkWjhTeTJrdHpPSVNHWlpCbDIzWTl6ME5mVi93KytCTjc0by9acjByVzd4M3R0UWtsTUVNd0dHWmM4SDNyMjYyVjhrSEo5TlQ1akRabzhSVlZOTFZuTjZsNFlrMTJCbVNJTXlnNUJHQ1BwWEwzMmx3MlFLVFMvWjVGNUFCQU5mVUh3VS9aL3dCVDFqdzJZWmJOcDV5Tml5bGl5bjM1cjV0L2FJOENUK0NmaWpxRnRkeE5FOXUyMEtPZ05lTlRxWG55Sm5maU1QeXg1MmptTFdHUzMxTlRHOHM1YkIzTzNINVYzMmtYcDArM0JLbDJmcnQ1eFhLZUNySWF0Y29oY2hoZ1pJcnZaYlpOS3QxaFZWWndQdmV0T3ZJNGFkbnNWUDhBaEw3aTBrRWR2YnV6TnhnOTZkWjJabXVsbTFVcXhsUCtyemdBVlp0bGo4b3ZJMkNCeGp0V1BmeWVkZEFFdTY1eDNybGltOTJicEhvV3JlRlY4TjJFVnpFNnZIS0E4YkwyOXE4Ti9hcjhHeDZ4SGE2cEJFcVhEamJLdzZIM3IyRFJ0VlA5Z2kzbmtMaU5ma3p6eFhubnhPdkRxV2xQQkdDeVl3Q2VwT2ExcDNocUtjT1pXUG12VXJFV3BTTHFGNU9SMXFvMWtEZ2taQnJxdkZ1bGVUZkZjYlRua1ZtZjJlQ0JuQk9lSzdZWWd3ZEF5UHNBS3JrRWxmZW0vWThMeUFEMnpXeWRQT0NDTWtValdHQjB6bXErc0NWQXhCYVlJSkF6UjlsVW5vU2Y1VnJEVHlPY0EwZzA0cm5JT0tGWFJYc1RJTnI4Mk1kYVNTMUNzQUR1RmE1c09PZTM2VTM3Q09QbEEvU2o2d2hld01uN09NQTRBcGZzZ0E0R00xcWZZUVNlTWZoVGhZajArVWQ2ZnQwRG9NeURaWnlBT0JTR3pKeVNCa2RLMkRZakdBTTAwMkhKR01DbXE2RjdFeHhaSEJJSCtGTit4WjVINjF0ZllPQUQxUHRUZnNROU1VbmlCcWdlOTNuaHU0bUc5L09janFPYW4wL3cxS3VJeEVZOTU1cjJuVXRNOE56UWJyUzQrWTlGeUNhNW1heXRvYnI1Vmtjam9Ed0t5VlNXek9aVTFjM1BnMTRabWduU09HSU5JdzQ0cjZVOEc2TStnNkFHdXBWVmlNc0Y1SUhwWHo5NE84VXpXTXNVRm9GaExrQjVPK1BTdmE5QjhXVzhkdEhadTRZcVBuNTVOY2xhU2ltMmJ3aEp0ZGpwNW1OM01qUUxzVG91ZTN2V3Y0YjAweFhHNlJ3ekE1STcxek9sNnlzMnBMRUNvUlRnZHE2M1JwVWE1WWh1Q2VhOFNyTG1lcDcyRmlra2p0TkNVU3FBQ0FQU3VvMHVBSUFBQnpYSGFOS1ZkZHVTUFd1dzBxNnp0SUJPS3djZTU2U09pc2JjYkZJQnlhMjlLalRnQUVZTllkcE1YakcwY2l0dlNGMjRKUE5WQ1BZenFiSFJXRVlSUmpKOUswclpRTTVISjlLeXJLN3d3QTVJclJ0cmxDaEdSeFhmVHBuREo2Nmx4SXp0eTJNMWkrTExscmEwZGdRY2R1dGFNMnBDSWhUZ0U5RFdKNHFZeld6RUhKOU85ZFBLa2hSdnpJOHM4WG1mWEpXRzVtUk9vOXMxZDhHK0ZvOU5LVHpiUUVHNDV4eFZuN0VyelNPeUJWWVlKN1Y1L3dESEg0ODZYOE9ORW1ONXFFVmpCR3VaSkNlY2VnSGMxbmg4TnpUMnVkTmFxb3JYUkhXZU1QRnRscTF3K20yOGl2S3dLc0FjOWEvSS93RGJjOExYSGdyNC9hL3B5Um1PM2FkNVJ6Z3lmS0NRZitBa1Y5Q1EvdDZhaDQyOFhUMlhnZlNMZWFTM0paNTdxWERNTS9lT08zdDFxaisxSit5NzhRUGlyOEw3dng1ZEpwZDFxOXVpdlBaV2lsbWFFZmU1NXl3WCtWZFZPUHNNUmFyWlgwUE94YWppS0Y2VjlENU0rQTJyblRkVFNLVmlyMms0WEpZNDJrZ0g2ZEJYMlhaV0NQNE0wcTlNakVRWEpTVTdobll5QmNEOFdOZkNYdzgxSDdONGprZ1pXRFhFZklmN3dPTS9tR0JGZmNYZ1BVb3RYK0VXbmgxRHlUZk14Ym9HQ2w4QUQwd1B4RmNlY3c1SzBaZHpod1B2VTJqeGZ4UGVPdXM2Z3pLRmtXZG14akhPMWx6K05jNDAvazMvQUljRFNCbFVrRW5nWjNISS9JR3VwK0x0cU5NMVhVWkkxWUpGY05GZ25uaHNETmNFMTJaYldORGt6UVA1cVk1QUFZajh1YTlDaXVhRnptbXVXVmpkMExXLytFWjhYUnBJTXhwSUFSamhsWTlQNlYzbmd2VS83QzE2NnNDNUlpY21JRVpPUWNZL0xtdk5QSE1ickhiYWhHR0lWWS9NSTZISzRiOGlNL2pYUjZGcmhoMTIydTlvSlFSU0huSVpkb0RFL2wrbFlWbzNWMGR1SGxyWStsUEJHaFFlSi9DZHpwNDR1WTVFdTdadDJGY0U0Sy9yajY1ckM4R1hNaUNleGtWMWx0MkpCNmREMC9FQW44S3EvRFh4RUk3U05wWkhpanRuZURjdlVSc053UDFHUWZ3TmJ2akMxLzRteDFDM3dFdTNXUmd2QkRnWVlmbVRYQkJ0TnhsMVBXb1J2STlvOEUrTy9OOFB3eVJsUmNSQXg0UFZnUU10K1FGZHI0UW5LMnNkeUJoYmhTRHp3clo1QS9ERmVGZUZib3BiQm8yQ3NEdFZjOFY2djhPdFNlT3lhM2szTUNmTlh0ai9BQ0t5akMwajFZVWxZOWQ4TTVWSVdKWmdBSzdHd1dOYmRHd0R1eG4xcmgvQytwTGQyZ1poZ29RTWUzcitIOWE3ZlJ5a3NhNUtoQUs3NmJabldwRGRWMGNTM0VickdCZ2M5NlMxMDR0TkZJd0t2SEp1VTl6V241NlROa2xUakdCNjFQYVdKTjBTTWZMaGo2SE9lSzNkSk01WFU1ZEdkRG9kMGtWcTNBMzVCOWhYUndTYmxVRWphM1B0bXVWMDdlc3JJQU9CelhTV0JKalVFRThZcmVuR3pPT3MrWmFGMkJCSE9WNkUvbFZtNXQyS2tyZ3FlMU50NHlHQndNajFxelBLaVJGbVpRb0hQcFhVNFhSeWMxbWtjOXJOaHVCZDBFYXFPTjNiM3I0cS93Q0NndmlmVFpQREY1cHM5azk2TlJSclZrSXlEdUdPbGZSbngvOEEyZ3JmdytEcGxqaTR1WEJCMmMvaFh5cjhlL0VPbFcrbHduVjlTdC83V3VXVi9MeUdraEc3OVBwWGs0aVhOSktIUTdxVk44dDVkVDhXdkhIZzZYd1Y4UU5VMDVnMGNsbmNGTnJIRFlEZS9zUlZyU2ZPYS9qbUlaMUo4b25IUVl3QitWZXQvdC8vQUExbDhJL0dPZlU1MEtXK3Fuelk1RkdWNTdINml2RU5PdjV2RDJwSnYvZTIxeUFldVJYMXRLcDdXaXA5MGZHVHAreXF1UFM1OWsvc1ovRlpJZkI5NXBFa0t2TnBjL254TXo5VllZWlNQVEl6K0pydGRDU1h4SjRnbmluZVJyTnJ0cmkyVWtueTFJR1ZHZTNUOGhYeTUrenhya2ZoZnhCTmNpY0MzdW9pcklmdkRqdlgwUDhBQjNYYi93QVplSVZoMDlDRHQ4anpDUGtpQlBMZTV3TUFWOHBqcUNwMXBUWFUrbnk5ZTBoR0xPKzhHL0RsL0VzOS9OSEMwMGNFclF4a2NrOEFFL24vQUNwdmpuOWsrdzhlUVc2WHRqZDI5emFaOHVlRk5yTG5xQ0NNRVY5VGZDRDRQYWRvdmg2enQ3Y0VDTlFXWThzN0hrc2Zjbk5lb1FlREkwUUpGR2hBOXMxejRmTXAwMzdyc2UzVXl5bTQybXJud1A4QURUL2duSFozSGlHMXVyMjQxQzd0cmFSWlRiTkFzVWN1RG5ERWRSWDFGRjhJdE8weTVUVWJpd3Q3cTlnUVJ3bVZkeTI2Z2NCQWVCaXZiOU84RmxRQ3lFZ2M5S29lTnRDajAvVDVIS2pDanYwcm94R2FWYWtlVnZRNTZPWDBLVHZDS3VlRDY5YWlmVlE1VUNSZ0FlMks5RitFa0gyZGdVeUNldnRYbjJ2NmpHdXNNZ0lNak5Ycm53aDhPU3ZZUnk3U04rT3RlY3BUazNKSHFScHhTU08yMVNPSFdOTVdHNGpEWTcxNTE4YS8yUGZEUHgwOFBTUjZucGtOeXNxYlM0eXNvOURrVjZlK2hTeVppQVlFY2owcnBQQmxnd3NYU1ZTSFRnLzQxZUVyMUZVMUZpc1BEMlY5ejg3TDcvZ2tQcE9tYSswdW0zV29KQWM1VGNDdy9IR2E5eCtIL3dDeUxOcHVoNlpwZHc4MHRocGFCSTRpdkI5ejcxOVFhdnBzZm1raEJrZTNOVkxjbUpnQm5KN1lyMHEyWTFYSGtuSjJPQ2pnYU1IejA0Sk01cndaOEtyWHdqWnFzRUd4Unp0N1YrYW4vQlFEd3BOcTM3VEd0d1FxWTBHMGo4cS9XK3dzV250TjdkaHhYNXZmdDBhQTlwKzBscU1xeEJsWlZMWkhYaXVhbFV0Tk5HT1BwdDA3ZVo4dStDdkQ3NlBxQVNabFhhZVRqRmVoV2VsNmZlRU5KSU9QZXVmOGQrSDVaaTgxcXhSK3ZIR0s4NnZkVDhRYVpkSHkya1pRZVFNODExT1hQdWp4WTBuQjdIc0YvYldFSlpZVTNLZjFyRHZ0T2pWeTZydEhXc1R3djRtbnVGUTNFTXp2amtBRTVyc3ROMCs0OFNTckd0cTl2RWVDNUdLeWttdERlT3ZRd0lKVGNxWTRJMmNkTTlxdy9FbWxKWlBJOG1HUkJrRDNyMlNMd3JaK0dOTGtrd0pDRTR6eGsxNGg4VlBFRGZ2WUZRTEpJVDBQT0t4clYrV04yYlVxTjJlUWVJb3hxV3JTdU1iU3hINjFTWFM4bnBXODJrdVNTUmdHa2x0RmlpS2djbjhhNUZpalowREJrMDhiK0FPYVkybWpQSFQrZGJEMm1lMk9hak5tQVRrWS9DcldLSmRBeHpwNDVBQkdEVFRZN2NZNi9TdFZyWHFNbk5OZTIyNUhKSnE0NGp6RDJKa05aQlNDVGpGTWF6R1FRQi9qV3JKYjU3QVZFMXBnRVl5VFdpcitaTG9velJhQlNTUU1mU2w4bmR4dDYxb0cxR2VCZ0dtL1p3cHoxRmFLdVM2UlFGdVBRSE5KNUM1d1FlYXZtM0F6eHlhYjluVThjZGFhckNkSW9tM0J4Z2MwZ3RnVDB5ZlRGWDFnR2VjY0g2VTBRZzlDQlE2d3Zabzk1MGU4YTVabVFrYmVNNDVycHRNMDk0Z3MwN01BUm5tc1R3cVlkSDA2V2U0UXNjL0tEV2xhM1Z6cms0TEVoQjA3Q3ZTcXlQR3A3blI2TnFhUTNxeUlBQWh5VDJyYzB2eGs4T3B1KzltTG11V2cwMlNPTW9Ea2srbGFGalpwQ2dKSkxqMDdWNTFhVjlEMHFNRDJqdzNySm5FTXpaVWdkdTlkL3dDSGRZeklNRUFOMDlhOGY4SDYwbDVwVVNxY3RIeFhvbmdVdGN1aE9UdHJ6SnF5c2V4aG9IcldnM1lDcVNlRDByc05GdTFkRklPY2NWd3VrTGdKZzV4elhWYVRkZVVvQnhnVm1sYzdHanM5TnVzTXU0bkZiVmxmQlhCSGJ0WEYydXNvT0FjRW1yeWVLTGUwRzZhWkl3QjNOZEZLQzNabE03RTYySURra0FWUGErSjRnUUN5ODlzOUs4aThRZkZJWFZ3YmV5a0RrOVdCelRkQjF1K3U1UjVnWlFHNjVycGpQc1pPa21yczlyL3RWYmtibFlFanBtbmlJYWxFUTVLc3c1OUs1dndzc2wzQ29kc0U5SzdEUzdJeFlCems5SzJ0ZEhKSzBXZWNmRU80Ync5YWlDSWZQSWNMWEtXUDdFR2gvdERlSGRWbThSNzduZEE3d29KR0dXQUpWZnhiZ24zcnUvaTFGRlp6RzdtQThxMVFzZmJrVW5nYjQ2di9BR1FZTkkwK2FiekYyaVFyc1FmOENOZTVrVmFsUm02dFMyaDQyZTRiRllpbEdHR3Y1MlB5bThOL0Q5Zmgvd0R0d1grbmFab056b21seDNNc1pzWlhNalFSWTVVc1FOd0I2RWowcjlMdmdWb2MwM2cxTGVlMmthM2RNWWR1cWtkTUdzYlVmZ05hK052aUxjZUlkV2h0RHFseVFrcndyc3dvUEEzZFdyMkR3dG9Odm9Gb2tGcnVNYWorTG11RGlMRVU4WGluVnBxeVBVeWZDVktHSGpUcWF5UHlwLzRLZmZzV0g0RWZFVzM4ZGVIclV4YURxTXhXNlZGd0xTUmlUK0NrNUk5OGowclcrRUYrMXg4SklwRmpSb3JXN2hrSGJDU0tRZWZUcVBhdjBwK04zd2UwdjQwL0R6VmRBMWkzU2V6MU8zYUNRWStaY2pnajBJUEk5eFg1NGVFZmh2cVh3cjFmWC9BV3BnK2Rwdy9keWxNaWVNTVRHNCt1N1B0bjJyd2NiV2RTZ3ViZVA1Rzg4RjdPcHpSV2t2elBOZjJpOUtXeE90U1cvd0M5VXNzNTdrZE0vaGc1cnhNWE82K0FUS2d3Ymh6alBPY2Z5cjZNL2FHaGpzcjJJeTdqYjNzZmt5Y2RCZ0ljL1RIYjFyNTJ2Tk1sdDlYRVlJQlFTUjV6bklDK3Y1VjZtWHo1cUtQRXhVTFRQUUl2RFQ2LzRDdTRvNC9NblJESXFqa2tLTTQvSmFvK0YwWCt6TEdVcVpSYUw1TXdIWFl6bmFUN2pqbjZWMGZ3ZjFZMlVvZC85U3lQdUI1QlhKSS84ZE5VTkQwcUMwOGRhbHBKWnhiM0lhTU1EakFCd1B5K1UvaFVLWHhMc2JVMWFTWjNIZ2E2TmpwN3BNN05ITGhRT3hJSUFKL0J5UDhBZ05laVNhbjUybkNSUVFYZEdPVG5CS0RQNjVyeXZ3cmJYTTF0TmF6S3l2Q3hMZ25KQlVZUDA2NXIwV3lCdjdHT0JBV2FSa3dPK0IvOWJOYzAxcmM5ekRLN3VkajRXM1hNc0NoVHRJQTlzLzVGZXIrRUpHZ21WaVNGVUFIMEZjUjRKOFBTTXFBWVhlTTdzZENNY1Y2Tm8xaXRvQVdPL0dNWjcxU2llakdidWQ5NE52d01JVkpWdmxKUEdhOUMwaVZVdHdwT0FvNzhWNXQ0Y2czdXJLV0FIT0J4aXU0MGlGbUtGMmtJWTlNMXBCYWlxczZLMGpNekl4WUtHKzZNL3JXMXBzTHhzU1NTU1IrVlVkTXNRaWc3QWNlcDZWclEzQ3hMa1lCSitsZDFPTDNQTnhEdWFGdENFbFJnQ1NQbEE2WXJvYkJBa2FrdG5CK3RjN1pYOGJNV0xxYzlQUVZyV2w0cklRV3dXOTYzU1c3T1pyM2JHeGQ2akhZV3BkbUEyZnJYazN4MitQTnQ0TDhNWGNyWFNXOGNhRm5rWmdxeERISkpyYitKWGlhV0MzZEkyQVZGeThoT0ZRRHZYNVBmOEZMZmpSNHIrSXZqcTU4Tk1iL1QvRGNlQkN0c2hZNmljNTNzUjJ6d0ZxcWRPVmFYSW5aZFgyTXFsU0ZDSHRKSzh1aTducXZ4RS9hUTFMeHI4WXRUOEFhSzl4b2VzeTZlYjBheEtpeXZLalJDVlJBTWtBTWpBaHorVmVkZnM2L3MrUTZ0NGhlNzhRM2VyYXBjcEo1bSsrdUdrUm16MXhWUDlnbjltdnhOcmZ4Q3RQRXQ5cDkzWTIxcGF0YXcrZUc4MllNdTNvZVFNVitoWGhiOW1hejB6UkVFMFVVZHpMMlZNTXYxNG94bE9uQ2txZEJlcjdtV0M5clVuN1hGUGZaZGo0Vi80S0hmczlTK01maDAwa2NFYzAxbkh1aFlJRGtEdFg1cjZQNGJ1OVd2NTdXSzNEeVc1SytXMkFRdzQ0citpNjkvWlVzdGUwbVJicC9Qaks0Q0ZjaXZ4cS9hZi9aNXVmMmN2Mng5WDBtV0l4V2w3TWJ1MU9QbFpHYlA2VmhsK0tuVGpLRWw1b3JINEdGU3BHVVBSbmpmaEg0YjY0aFJQN05tdG1sSVFzUVFxZzhaSnI3Wi9aeStINThOMmxzb0FMUjRKMmpqUHJXRm9YaFZOUzhEeXlORUM0WFBBNXIxYjltMjFPcDZHZHdBbGlrTVpIcGppdkl4K09sVnVtckgwK1ZaUXFFMHIzdWZTbndrRG1LRU9ReDQ2OUs5cjhONkx2UUVvQ3A5dWxlUS9EQzNXMUtBa0VnWkZlMCtFTDBUSUZJd1J4OWE0YUtUZXA2MkxvVzJOVk5FU09FTU5vQTlxOE8vYUk4WkxZQ1czaUlDeEE1eDYxN3g0bDFOTkg4TzNGekl3VlkwSit2RmZLUGp3eStNWnJoaVNnZGlRVDNyc25GV1NSNDhJcHR1UnlIaFh3dExyMTBMeTRKQUxaQTdWNzU4Ti9FRWRnOE1Mc3BDZ0FZNlY0SGQzbXJhWDRjbnNiYVFXMTRWeERPRTNxUHdQZWsrRHQ1NDcwelVsL3RLNGcxZUVOa3NzWGx5S1BiSEJwVVhVU2FQUVZHazFlNTl2K0ZiMnh2YnBHa2pWMVVjKzlYZFd0RnQ3dVM1dFZVUmtZWmZhdlBmaDVQcVdxNmE4a01jY0VtM0NlYVR5ZnBXejRhMFB4SllYTjdKcW1wUlhhU2pDSWtXeEY5aDMvRTExMmFpcm84K2RPQ2N2ZStScGZhSXIyWWhzQUU0TmFkajRVaWx3NFlOa1pGZWZ4K0lIczljbHQ1QVZLSG9lSzd6dzlyd2FGQ0NNSGlzbzhzbjd4ckNoSkpPSmRsak9ueEZlTUd2encvYjVtU0Q0OVh5a0FHU0ZQcDByOUVycVQ3VEUyU01WK2MzN2RGNG1vL0h6VkVSUS9raFVKenlEaXRWR3pWam16Q21sVHYxUEJMeTFqa1J2TkpZbjM2MVFpMEsydUh3MGVjOSt0YStxV0FWQzIwb1I3MXltdjhBalp0REJRWUpGT3BVakRVOG1GTnZZNlNIUjdQVEFyNVJRT2VsVXRWK08xcjRjZG9vNGtsQTR6aXZMUEVYeEx2cjVtVlhZTDZkcTVHOTFXZThZbVJqazE1OWJIWCtBNklZYitZOUI4ZGZ0QzMrdG84VnN3aFJ2UVY1emVhdFBxRXpTelN0SXh6eWFyT0N4SkpKSnBrbVdBQUJ3SzRaemxOM2t6YU5OUldpSFBjczNVakhwVVRPQU4zQngrZEJqWXFRRG1vM2lZOUQwb2lrSnhZU09EakdjMUU4Z0pJejAvU2xNYmJTQWVuQnFOb3pnOVNLMGlrUTB5TjVNc1JnREZNZHgyQU9QV25QRWNaQUp4eFVma0U1R09UVzBiRU5NamVUR2VuODZhWExZNjRxUXdOemdITkt0cWVEZzFvbWtRNGxVbko1emtVd3NjSGtZTlcvc2grOEY1eFExaGtmZElJNllxbFVTSmNHVVM1em5KSlA2VTA1eGtBNTlxdkN3YmFjcVFhWTlwaGVRQmo5YXRWSWt1REtUU0ZSbjFxTm5iZzRKcTY5c0NwQXhnZGFqTUtqUHY3VmFtaUhBK2hMRjV0U2dBQ0tvQTV5bytXcnRqNGh0cktFQlY4eVZQbDloV0g0SThVd3kyNlN1NGtkMzJzaDdBMW8zZHRhd2EybUFCRklTU0NlQWE5aXBUdGRNK2NweTF1am85RjFNWGNEeXlOOTQ0VlJXamIyMGx6bmFDcUdzdlFiQ0Zyd3hJeDJSZ0hKNkd1anN6NTBzYUtDTng1OU1Wd1ZYYlJIcjRhVnpyUGh6b3JKQXFqQURIOGE5azhIYVlzQVRHQW9GZWNlRW9WZ1dNSmc4WUZlbGVIWmdrU0Vua2RmUVY1MWFPcDdOR1ZvbloyRExFZ1BRRG10Q0RXNHJXRXM3WUE5YTRYeEo0MWgwTzJERnlUOWE4MjhXL0d1NTFEZGEyUll5U2NmU2lGSmwrMVI2cjR3K1BGdG9jN1FXaE04NEdBcWM4LzBybmJQVnRjOGRYQWt1SG1qalkvTEd1UldaOEUvZ2pxM2pTNVc2bkxSUnZ5MGpESmI2VjlBV3ZnelNQaHhvNWt1SFVHTmVYY2drMTEwNmQ5RVp5cTh1ck9mOEUrQ283RHlwWjhod09kM0pyc2sxU3kwMUZVc2dJNlk3VjRGOFYvMnM5UDhPYWcxdlp0QTdLY1lNeXF4L0FuTmNNLzdSTi9yMGdkb1pva2ZvdzVGZGtNTTQ3b2hWbzFOVXo3WThOZUxMYzRDeUFFZTlkOW9QaUNHOENndUF4cjRxK0VQeGtrdm5NTXNwTHI2bm12Wi9EUHhJZFpvL21JeDcxeTFadW14eXc2bXRHZXplTTlKRXRzWmtWSkNPb0kzQmg3aXVNWGY1NFFoWW93Y0JVVUtvcmU4TmVOazFlMzh1Umd3WVk5Y1VhdG9pTVBPaHdlY2tWejFwUytLSnRob0tIdVNKZEkwYU9SRmNBazEwMmw2WUV4Z1lJckE4TVhpTS9sdGdNUHdOZHJZUktpQWd0bkdjMHFMYzFxYnVYS3lDODBVK1FDcWhnZVNLK2VQMm8vMmZZdFh2cmZ4SGF3b3VvYVpsWlNCZ3p3L2VLbjFJSUJINCt0ZlU4TWEzRUhxQ0s1enhwcGlhanAwcXRHQ28rOENQdkR2VHhPSHZCMk42Y2xOV2tmbGIrMkg0UFovRGNWd1pJeXR2TVZYQnh3MGh4NzlDSytaUEU5bkNtdnpCQ3lJek5KRVQyVjBCeDlCbjlhKzVQMjBQaCswT2thakJpUmphSGdZNnFHQXorUzUvR3ZoL3dBWmt6YXZPeVlDUlROR0FPdTNBVUQ4RFU1TlZ2UjVXOXJvK2J6R2p5MVdqcHZCTUVpV1Vhc0dEQzJ3VkhCSjhzQ290V3VTUEhWbmNoV1VwTDViNDQzakFCL25XMzRLdDB1WUk0bkJWL0wyaHVuOFBBTlpldWFYSmI2NUF1MGhwTU12R01FRGsvcFhYU21tMlFxZHJIclZsNGNXMzhXenFBR1M2WGVSMFU1QkI1OStEWFNmRDdUalpTenRQZ2xXQVVkZWhybWZDOTJyd2FaZHlibkhsTEU1NTVJNC9sdFA0MTJGNXM4TTNnTHVERVUzQnM1SEJ4L1Q5YTU0Nk96UFd3NzZIcHZoaWNSQkFXSklPUjJycU5NMWFCU0RMSUFxbmdrMTRaYS9GMktGOXRyRzl3NjlBTTRPSzJ2RHNHdmVOTHRaR1NTQlhIeXJqaGEwVnp2VXRMSStndE4rSm1qYUlxQ2U3akdNZHdLMU5PL2FKMG9YS3BCSExjRXRoU2c0UDQxNHVud2cwclM0V3ZkZTFVMnFMOHpQSk9GL253Szgvd0RpUCsyTjhJL2hNV3RyVFV0VDE2K2c2eDJyYndwOXlNQVYwVWFGV283VTFjNWErSnAwOWFqc2ZZUy90Qk5JZkxoaENrOWR6Z0VDclZ2OFc3aThqTGxWVE9jQThscStTTkQvQUdnWnhwR25hdkw0VDFIVDlNMWlNVDJkM2NzVEZjSWZTUUFybjJKRmVpMkh4YVRWOU1TZTJnZUVKOTVDT1Y5NjZKNGF0VGZMVVZpYUdJdzlhTjZUVFI5RDZENHVudkpGdzVVRTVQMHIwRHd2TE5mVEt6QjJBNm12bkg0Yy9FcGJ5ZEF3d0QxejFyNkwrR2V1SmZ4eDhvVVBKeDFxSVRkN01qRXhhaGRJVDRzZUFGOGRlRGRRMGRabnRHMUNCNHZOVDd5a2p0WGtYaG45bGpTUEROdEZBdG9sNU5HTVBMT056RSt2TmZTV3VhTWJpMldTSUZTdkl4V0pIWnZJK0hRbHU1OWFKVk9XVmptdzdiU2tqbC9BM2dhMThOWWtoc29FbVhnTUV3ZnpycjdmUzN1cEZad2VQU3IxbHBaVURDREE5cTFiT3dDc3U1U01ISm9sS1UxWTFTU2xjbnNyQlVzd2dBQk5mbmgvd1dpL1pnazEzdy9wWGoyd2dMWGVnUzdib3F2TFFNZVQrQnI5S2RMc1ZranlWT0Qzcno3OW92NGUybmp6NGQ2dnBGMUVrc0Y3YlBDd0l6MUdLS3NHbzNSdGg2YWxQbGZVL0l6NGFUcGNlQm55Umd3NUJGZW1mczRRalMzdlV5R0R6RnYwSEZlR2FkcmlmRHJVTlg4T1hFcWlmVGJ1UzJ4bjV0cU1SL0t2ZFAyY1VlUFJEYzNBWlh1V011MDlWeWVCK1ZlQlZoNzF6N0NnMUp4VzlrZlJYZzI0WDVTQ0I2aXZTZkMxMDl1MjdkSnVJeU9LOHcrSHV5K3UwaklBVW5xYTlkMUxUWDBMd3pOZUE0U0dFdXpld0ZYUWoxN0JqcTZwcXo2bk4vRjM0anh5Mlg5bWViZ2s1azU2ZTFlZVJRVzEzRGtFTnpnWTcxODkvRVg5ck8wMGp4SmVTWDFscWdoV1J0cnJFV0RjOWE1dTMvNEtMZUVkS2tXTXBxeU9wL2l0WEEvbFhxMDZFM3JZK2Rhak42T3g5VFIrRklieDFJSVk1NXp6aXZTZkF2Z2Uzc2RHZVpGVU9vN0N2aXF6L3dDQ2svaHN5Qlk1V2dFbUJsb0hPZjBycnZEWC9CU3JSTFc5RnN1dFdZaVAzeEo4cTQ5S3BVS2kxU091bGdaU1hLNXBmTSswdkFjOGc4MVFveWpkYTdpMGsrMS9LeHkyTzlmQnVrZjhGYi9Bdmg3eE90bGNhM1lSTktmbCtSdGplMmNWOUFmRHI5dW53ZDR6c2ZQajFDM1ZDdWQ2dGxUVjA0VGpibk9iRzRPU3U2YlR0MmFkam8vakZHdWlhM2JYS0JVTXAySDNxMTRkMThxc2FFa0U0UFd2TVBFbnhVSHhwOFd3MitsdTBsbFp5WmFYQkFZKzFlbmVGdkRNektqdXVWR09TSzRaejVwdHhPekJTVUtLVXpxOVc4U3g2Vm9NOTNLd1NPQ0l1MmZZVitVbngxK0lHcGVJL2lqcitxeU1RdHhkT1ZWdXk1T1AwRmZwL3dDT2RCazE3UjNzRnlZcEVMUzdUemdEcFg1ei90Wi9ELzhBNFFieEpjc3NMeHd6T2V2ZWpNbzFLRkNPSWxvbmM4dXZpNmRURWZWWTdyVThFOFQvQUJIMUhJQ3FwQjU5NjQzVjlVdTlWY3RKa0J1MWRKcVZnTG1ac1lJWDJxbzJrQmhnRHBYeDlYTnBUZTUyUndsdGprbXNISnhuTlF2cFJic1FUWFh0b3VjWkFJcGgwVEFQeWcxQ3g0M2hqa0cwZ2s0SUpKcHY5a0U4QUVnVjE3YU42QVk5NmIvWXZPZHZOV3NmNWtQREhKRFJDQm5HU2FUK3hDTWpiK2xkZi9aQUF3UWNuOHFSdElBNEl3S2F4NFBEbkd0b3JBZzdRYWEyakhCTzM4SzY5OUdIWGJnMHg5SEE3RE5Xc2Y1a1BESEhObzV4OXdqOEtUK3hnQUR0NC9PdXZiU0JrNUdNVXc2T3VSZ0VZclJZOGw0WTVFNlBuQjJnWjdVbjlqc2Y0Uml1cmZTZ09NWUJwamFjcThZelZMR3NoNGV4ekEwbjVzQUFVTnBCM0RjQVNQU3VtTmdPdTNPYWI5aFVER09UVFdNWXZZSE5TYU5nWTV3ZTlVcnJTOGc0RmRiY1dxN0RnREZaMTFhakdRQmsxdFN4VFpFNktPVW1zV1hQR1FLaE5tNUdjWUJyb0xtMTU2QUFWRDltRzg4REZkOGNSb2Mvc3RUVCtHT3V4YWRySWt2Qm1OUHZxZUJtdXQxTFhrMU1tVlhBSk80YzQ0ejJyem5VN1pySFVVbGpBRVYydlBwbW85TDFpZmMwWkp6RXB5YzlxKzVsQlNWejRXRXJPNTdUNFk4YXhLMFZ0TEtFbE9Oci93QjcyTmVsYUxGNThNVHB5NXdlT2ErVXg0aHVKWVlXQkt2SDBQZXZhZmdiNDh2N3g0NEpTV1RBR1R6aXZKeGVINWRVejE4SFZ1N0gwQjRYdXlwVldBQld1eEd2cnBPbk5JNzhrZmpYRDZMSXNybzZNQ2NESXBueEExR1lXS3d3Z3M4dkF4WG5LbmQ2bnVSbGRHWDQ1OGFYZmlQVXhiMnBlUXVjQlIxcjFINERmQWZMeFhtcHhtU1J5RzJ0MnJDK0F2d3FWYnRkUXZpSGxZNUFQT0sraFp0YXRmQ1BoeVM2bEtwSEN1UU1ZL0N0TFgwUnJUcDIxWnRhaDRxMDc0YjZDR095TXFNS280SlBvQlh5cCsxNSswYnExLzRldll0TGMvYWlqSGFHL3dCV1BiM3E3OFJQaVplK0s5Vk1va2RYa0pFVWVlSWx6MSt0ZWcvQXo0RGFaOFJQREYzTHF5eE9NbFdFZ0hKeDFyNmZLTXZoS1NsTStZejdNblNUaERVL0xYNGgrQi9FMmcybGg0ajFPN1dTSFhYazhoMXVsa2tKUWpkdVFFc25VWTNBWjdacjZrL1lFOEcrSWZIT2szVXR6SkpKbzl2Q1Mway9JM2UyYWorTFAvQlBqVWIzNDFKcFdsWGNOM283WEhtaHd4SmpVbjd1UFd2dG40T2ZBK0g0ZCtCSU5GczRFampqakN1UVB2SEZQUGFrWVM5akRYdVZrdEtwT2w3U1QzMlBHL0FIZ1diU2RVZTZBWUIzUEhiR2E5WThQQnlGSnp4NlYxYy93NVcxdHh0aUFQVGdWUXVkQ09sUXM1QlFLSytScXR6bHFmVzBrb0t4b2VHZkZEV04wQUhJeHg2Q3ZUdkR2aVpkUVZNdVc0eFh6bGUrSlJhWHdVTU1nOG12UWZoMTRwTTVSUStTY2Q2aXJKbzNoRzU3STltdHl5eVJFcEoxeXZGYVduK0liN1RtRWNxQ1JTT0dIQnFuNElqR3BNaXN3VUhITmRKNGl0b0xDMStRcTdLZnpwMEtNbjcwWFl5bk5LU2kxY3M2TjR4U2JLQmxEQTRJNzFjMUs4U1NBc1FDQ0Rtdk1kYnZIMEMrRjJyNVIyK2NaNHJmc3ZHQzNtbk13WmZtWDh1SzJkVFJ4WjEwNlYwcFJQbS85cVBRN2ZWZGMxT0Z4dTh5TWtoVzVLa0VFZlhLZ2ZqWDV1L0VQdy9KcGZpSFViUWtscmUrS3VjWU9lT2ZvUXVmeHI5QlBqQjRza1g0eGFqYlNPcW8wYUdNc01qcHlQMEpyNDMvQUdsUENqYUI4VnJnUjgyMm9xa3lua2t1aHhuNmxmNTE1V0FueVZadzc2bmw1cFR1MDE2RmZ3ekdGK3ovQURCZDhnN2ZuVkptTnpMQ1pRUE1nbk1hdC9kQnpqOURXdDRidGdMblRnektoTE5KbjA0cUZ0R2FWcmdxVkpTNEJ6MzZkZjFydm9QWFU0MUhWSGRlRHRHbmF3K3pTcVVlQmp3UmphUVQvUWo4cTdyeEg0SFh4TDRic2pjU3RpQmNBRElMcm5CQitoOVBXbmVDZEtqMURSYlM4VlZMSW9TVEhVbkhCUDhBbjByMFNQd2srbytGSWZMVENvN0lNZHM0T1B6elJLV3FQUnBRVWJObkZlQ2ZoN3B1bkxHVmpSQkgxT2NHb1BqTiswallmQ0xSSFd4OGtYTVl3Wlg0U000N2VyZTFhTjliYWxwWWVHS0VCMjQzTnppdU52djJUcFBpVHFLWGwvTVo5cmJ2TGZsQWZwMHJ1dzdwcVM1elN2S2ZMYW10VDVSL2FHK0ozamo0aVg5aGRhbGRhZ21sYXNwYUVHVFlaQU8zK3lNSHBYTi9BSFZMcjRWZUw3elVtZTJqaXU3UzVzNVRPaXpHU09aSGpaZHB6MVJ5TTlRY0VWOTUzdjdGS2VLTkhYVHRTdDRMcTBVZ29tMWdWUHFDT1J4NlYwSHcwLzRKbGVHZEsxbExoTkJTN2VKZ3lQY3M4aURwemhqajFyNldqbU5Lbkg5MmZKWW5KcTFlVjZydWREK3paNEtuK0lQL0FBVC9BTkE4QWlCSmI3VTJrdW1sbVRLNmRDMGhaUG9TT1FPMmE2ZlN2MlZMTDRHK0Iyc0lOVnVkVWtraU9mTjZSbnJoZjhLOXc4Ry9EcUR3TG8wY0ZyRWlOR0FBRUdGQS9yVlB4cnBiM05teFlFczNIclhuWmpqcFY3T1QyMlBUeTdMMWhyeHA3TjNmbWZPZmhLeHVkTXZGVmdWSWJBcjZIK0VldXkyUmlEUGdFZ2MxNTZmQmh0dFFFcko4b1BwWFErR3RWWFQ3a0x2QlZUMlBJcnduVWs1OHg5QzZLY0xIMHpvbXRtK3QxUXRsY2NWS2xsaTdCSXdwT2MxNTM0SDhaQjFWRklZZHVhN2szN1RCU3JuSjRHRFhTNmlucjFQS1dHbkIyWFUxVHJWbGFTK1daRjh3ZHF0UjZ2RXhEQmdRM3AxcnpqeHRwZHhOREpjeE95VFFmTWNmeEN1VjBuNHhwWjNSdDdtVXBJbkdHNE5hUnFXM1IwMGNKekpOUFUraHJUV0VFQVFNTW11ZThaYWpHOWxLR1lFQlRYQTJQeFpXNTJvZ1lrZHgwTmNYKzBwKzBUWmZDYjRTYTVybW9Ub2tkbGF2SUJubG0ybkFIMU5FNnQxWkhmUXdqaDcwdEQ4NGZHL3c3MHJWdjJyUEdtb0tCSVgxV1JsR2NxRG12WlBDVm91bVFJaUQ5MmNFa1Y4d2ZBLzRxRHh0NGd2TlRtY0NiVVozbmZub1hZbkZmUm5oeldnOFNaZmNvNmMxNWVKcHlpN05IdVpkV2c0cVVPcDdoOEx0cDFDRXBKbkpyNkxkSWRVK0g5MWJ6WTJTUkZDZndyNVorRTJwaDcrTW1Rcmc4VjlBYXY0MXR0TzhHeFFLNEx5WUI1NXJMQys3ek01TThkMUZMVm5oM2pyOW5mUnJ1SmttdDBsVmpqN296WG05MSt4UjRjMWFabWh0MFZnZWhYTmZSUlU2OWtJMjRDbjJIaFo0Sjk1UWpCOU90ZW5ocXJ0WThXbk9WR3p1ZUdhQit3bG9xU0swK2syOXdneGpBcm9ZL3dEZ25oNFAxaTZSNWZEOXFtNGMvS09LK2cvRHlJa1JCNmpzYTZPeGtpanRRTnVIUE9hNjRQdWR5ejZjVlp4UG1aditDWEhnZGIrT2FIUTdSblQrSmtCeFhxdmgzOWt2UVBBdmdxNWhnMDIwUW1QR1JHTTlLOWowaWRIUURKQXE3ckZzSjlLWlNCc0sxclVzbzZIa1l2TTZsWnFOcks1ODcvQ1Q0ZXdlR3I5NDFqQ0x1ejZWN0tzcVdObnVHMVkwVE9Ud0s1VzZzRTB1L1oxd2hKNzE4OWZ0NmZ0djIzd2U4RlA0ZjBtNFNiWDlTWHlrVkd5WVFlQ3g5SzgzQlllVTZpcHhXclo3K0h3OHEzS29kU3g0dC9iV2wwdjQ2WGRscDdMUHB0bis1a3djaGozeFhDL3RzM1ZqOFFQQmtlczJoVXJLbTRnZndtdm0zNFQzMXpjemk1bmxlU2FkdDdzeDVKUEpOZW0rTXIrNmw4RlhGc3BNdHZLcE9PdTAxOWh4WGtUbmtzb1VsZHhWejZuT3VES1VhZFBHNFZXbkZMbTgwZUFQWnJrNUFPYWoreHFNOEhpcDVwaEhJeU1DcktTQ09sUnRjRG9PMWZ6aXVZOE54c1F5V29JSEFIclVid0FMMEJ4K0ZUU1hBT1FNWTlxaGt1QmpCeldpYkphUkY5bkdEeHdhUVcrUWVBYVV6Y1o0Rk5hNXowNHEwbVE0b2E4SXljRGltR0VFZFJ6K2xPZWNBZzVJSXFGNStTUWNtdElwa05JSkl4eU9CbW9uaVZoemppbzVMb2M1N1ZDMXljWkJPYTNqQm1iUks2ampvQlVjZ0czSUk0cUJwOERBUEpxSjdzOUNTYTFqVFpEWk5LeThnRUVtb0pHWGNNa0hIV29KTG5qUElOUlMzQkhJNXhYUkNtek9SWUxLZS9Xb25kY2tqQS9TcXJURW5HY2tWSDVqTURnOFZzcVpEWlBOS3BYZ0FDcWR5Z1BROG1sa2tibmpwVVRzVDYxdlRqWXpraXBKYkJpZlEwMFdveUNCMTlhbWJrNXdlTzFOa1k4WkFycFVtWU9KSE5wemFuNFJzSEFJa3poZUtyWDNoMDZaYnh1QmlTNU8wRHVmZXUwOE82T0lOQmlzaXlzRVlrc2UzSFFWSGE2SC93QUpKNHNqSUJlT0ZTY0FjS0IwcjlHOW9veGJQenRSdkpJNU9EdzhZNUlnUnZMc0Z3TzllMi9BL3dBSHJhdkd6RUwzQVBKcm43ZndXMFdvUm1TTEd4ZHdIMXIwbjRmMllzM2h4d0dyeXNSVnVyWFBhd1ZPMnA2Vm8raStSRUNBY1k0cTNINGNYVU5RU1NVRXJHT2xYL0RNYTNTQmVDQlhYYWRva2NpN1FvTEh2anBYSTJleFRWdHl4NFV1STlPaldOQUFGOU9ncXY4QUdEeERMTm95eElHZU5CdUtnNTNIc0tUVWRFbTA3RHhNY244SzBkRjhPblZreGNZY3RWU25HQzNPeUx1andQUU5LMWZVOVptbWFCOFNuYnRJemptdmVQaHY0UDhBRVYzWXJHOTNMYjI1RzBvcHdXRmRYb253OXRMSmxaSVYzbjJyMER3L3BrZGxicmhCbitWZEVjeXFKZTY3SXdXWDBwTzdpbS9Nei9BM3d3dFBETGk0Q2I1MzVKYmxpZjhBQ3U4MGJTUXFra0RlL2J0V1ZiU3NyWklJR2V2cFhWZUdiUnJrSzNVWnptdU9XSmRSbmI5V2pGWEZrOExMT0ZBVUZSWG0vd0FmckdMd3Q0ZGFVOE8zQUhUTmU3V21ucUV3UUFvNis5ZUIvdGdwTGVYTnBBbVJFbkpIWTFxb0pSY2pramVWUlJQQmRMc1p0YjFET1dCSjRyMTc0WCtEYnBHVmlHQ2l1WStIV2dvOTdGdVVGZU9jVjdiRkRGcDFoSERGSXNaWWNsZVcvd0RyVnhRcHlxejFQWGxGVW9KbXo0ZjFuK3hXRVpJM0w3OWExcjdXYmk4VmR5a0llUjcxbmVGZkR0bkRIOW9jTkxLT1E4aHpWL1VOV3QxdEpKV0tpT0g3ekhwWHB4cGNzYlJPRlM1NTJpam52RjB5M3VseVJ1d1VnZCtLZDRQMGx2SytaaTBZU3NyUzdrL0VpOHVWdGdCWjI1S014NUxtdTQwZlNQN0o4UFNsemgxR01ubmdWNWxhRDlwWm5kSnVqZUhYc2ZDMzdSL2k5YmI0d1h5c1VZMlYycWtjZ2hXaWJPVCtOZWYvQUxRR21SK01QQkZ2ckVlMXJuVFdXT1RiMVpUZ0UvcitsV2YycHRTV1Q0NCtKRjNnSzBiU2owK1JjSCtmNlZUK0cvaUNIeFRiVGFYY0ZIT3BXZStJbkFWaVFlRC9BTUMzQ3ZObkhsa3FpNkhtVnBjMDVRWnhXbDI0aXVyRXVBZGx0MEIvaTIvL0FGcWppdlV0cDVsVVpDWEJCeWVTQ0ZPUHdKcTgxZytuYTFhaGxJTU1jdWM4SElHUDVrMXpFN01aN3BnY1pPNXZydVVaL1N2VHd5dXpoV2tqMzc0UTZtcHNIakJCallBZ0gwNmY0ZmxYdFhoRFVSZCtIN3VBc3FxcFY4ZTRJR2YxcjV0K0RtcXUrSWtJeEpFUjE0NCtiK2xlM2VDdFVWWTVVSUVnZUxyNkVFR2xYVFVqMXFNVktOanB6NFhoMUs0WWtFa25JOXE2M3dsNE1XemRDRURxYTVYUjlTWmJrZ05rZzllbUs3L3dqcXF6aEFYSlllbFRHYlRPNVVYWTc3d2pvS0ZWVXBnajFGZGxaZUgyVkJ4blBTc0R3cEpHNVJpUVMyT2xkMVlrZVdBb0dHcnVwTnRhbm5Wb1Btc1prMmpnSmxod09nck52UERCdnBCbVBLanRYYVcrbm1hVUJoa2dWTmVhZkhZUXRJUUNxakpQcHhYUXFkOXpHY3VWSGdIeGZ1Ykx3TllqeldWWjVTZGtmOFJyeGFUeHdGMUFNcGRBeDQ0NHFYOW83eC9Ocm54Y2VTUlpXczRuTVVaSDNVd2NmenFoYmFaSGVvcEFVc2VRZlNzYTZTMFI2ZUV3ODFGU2JQWHZoUDRxODk0MVpqdUdPaHhYdXZoQnhmeXFXY0JCMXI1UDhJNmszaDY0WGNyc3dQUWNtdlovaDk0MzFIV2tFRnRZWFVPY0F5eXFVVmZmbnJSUWcwN3RHdUxvUjVlWnV4NnJyc3NjdXFDMGh3NmxkenQvZEZlU2Z0RStCTlB1dkRVMXlYRnBjVzRMcEtEdE5lcWFaYkRUYkJpN0ZwR0dYa2Jrc2Y4QUN2THZpN29ML0Vhd3VZdzd0QkJrS3FuN3pWNk1vcU5OdG8rZGppSk9xdVIyUzZuaXZ3eitJMTlMSTFzelRUbE9BMkR6NzVyNUEvNEttZnRHM2ZqVFdZdkE5ak9UYVdwRXQ3dGJPOXV5MTlkK05OWmcrQlh3dzFmV3RUZUt6aHNZV1lad0NTQndLL0tUWGZITW54UDhiYWxyVXpsbnY3aHBCazV3Q2VCK1ZaNE9qZDg3NkhmbTJZM2dxTVhxelA4QUFXdjNuZ1BVMWtpTENJbkpYdFgwcjhOUGpsRnFkdEdHbUFiakl6eUs4RHV0TEJpakxJcFdRWkZVWURjYVBjQ1cya2VOZ2VtZXRkR0l3OEt2cWViZ3N4bFFkcjNSOTQrQXZqRWxoTWhXVWMrOWVwMlB4V090cEVubmhsUGJOZm5wNE4rT0U5Z1ZpdnNxRjQzZzE2MTRQK0w3ZnU1TGE1ODFmN3U2dkhyWUp4VnJIMFZQSDA2eVR1ZmUzdzE4VG9aVkR1QUNmV3ZXZEcxdTB1dHFBSXhINDE4UWZDNzQ1dzN2bHh2TjVVZzZoaml2ZC9CZnhXZ0VTN3AwTFAzelhQU2M0UGxhSFZ3VWF2dkkraGJHeXM3bVJWMkxrK2xkRlplRmJLZEZLSzI0ZTllVGVIUGlMYnNpTTBxa2tkYzExbW0vRlMzc29peGxRZmpYYlRsMVo1MWJBeVdrVHZJZEZodFVPV0FDMXhQeGIrTm1qL0RyVEhhOHZZWWxVRUFNd0JOZVhmdE1mdHdhTDhIUEIxemR6M0tmYU5wOHVKV3l6dDlLL0pqNHMvdGgrS3ZqUjhiRjFTLzFXZjdCTElVanRGWWlPRmM4Y2V0ZXRnTXZxNHlWbzZSNnYvSTdzcDRmblhyUjlycEZ2Vm4zSCswbCszM3FEUno2ZjRRMCtlOHY1UnRXWXJpT1BQZXZrNlA0WGEzNHc4VHphNTRpdXBidlU3bHR6bHlUczloNkN0ZnduNHlaWkkyZWNaZjE1elhicHEwT3JXaGRDTjQ1T0R5YSs5eTNoNmpoUGVqckx1ejlweW5oWERZWnFTZk1aUGh2UVcwYVpWQ2JVUTEzK2d6eDMxdTBMamNrZzI0UE5jdGFPdHhPQ3NoSUhIUFd0elJwamJ5QUg1U09jMTc2cHJsc2ZUVmNPbkRsUEsvaS93Q0QyOE9hcTg4U2tSU0hQSFQ2MXhQbm51M0ZmUmZ4RThQeCtKTkZjc0ZKSzVCTmZPdXJXRDZWcU1zRGdnb1QrVmZ6cHg3d3lzdnhudDZLL2QxTlY1UHFqOG40aHl6NnJXNTQvREw4eU5wQzNRNEZNYVRvYzhDbW5nWkp6VEdiam5OZkNxQjgyMks4aDVBTk1MOU1ucFNQMXhrNHBtL2FDQ0FUV2lpWnRqbVBJd0NTYWhtSlBHU1AwcDRZdG5HRG1tdU9EZ0E0cTR3WW1WcENjNEhlb0pNODllYXRTeGtra0E1UHR4VUxSTUR5TWMxc2tqRm9yRXNPeHdUMXBqNTZrSG1yRHd0a2NBQ296QzNHU01WcEZrbFowWStsUkdNc0R5Y0NybmtrOUFPS1BKS3QwTmFLWkxpVVd0MlU5T3ROYTNJQkk2MW9mWnllTUU1cGoyaEhZZ21xVlFubE0xNGpqbmtWRVlqMUJHUldwOWlMWnlEaWtHbm5zT1JXaXEySWNUSk1EQVo1cGhoSzRJeXBQZXRnV1BRWXlEN1V5U3hJUFE4VmFySWpsSWZHM2lodEE4UmFjdVFJcFlzRWRpU0JYcEh3RXNiTk5VTHo0ZnpGQkc3cDlLOEMrSU9zdHFPcFJxV0xQQVF5K3ErMWR4OElmR2NxWGtoYVFnUktvNjErbDQyazNUc2o4MHc4L2V1ejIzeGxmV3N0N2RtTEVSVWNBZERpby9CdXNqaFdrVWxNTU9jVjU1cmV0UGMzZ2RKV0t1T1BlcGRCMVdTQzRWMExBOUNQU3ZFbEhvZTFocWxtZlN2aEh4RkhpTTdqanZuclhvZWlhNkdSUWhHRDNyNXo4SWVLeUk0MVpzc09velhxZmc3eFFrc1NnT0NDUFdzWHB1ZXpTa3JYUFZQdHlUb0ZJM1pOYlhocVZFZko0R2VSWERhWHFhVElDU2R4cnA5QnZBc2lnREJyT2F1ZWhTU1BSdExCZmFWMmtDdWswNkRlUnpnRHQycmlkRTFiWVFDVGdWMWVrNmkwaEJVRTVyTGxkanNVVWJVZGg1c3lxQmtWMlBoQ3haQW93U0JYTmFOSUhBM2NIMXJzL0RzNnhsUXUzQnJTalQ5N1VkUmU0ZEo1SGxXWllBOGl2S1BpeDRRZzhXWGlwT0dBVWRxOWFrbDNXeHp3QU9LODU4WTNzZHJmeUVzUGxIU3ZVVUxxeDVOdVdWMGNCcFh3KzA3d3VXTVFkbVgrODFUYVZjdHFGOFZVTXNhdCtkVjlXMVJ0UXU4UnNWVUhtblcrdldmaFhUbm51cGxqakhPVGdacW93VjdST2lDbk4yZXJPMmZXSXJHd0JuZFk0bDY4OG12TS9qaDRyMWFTS3hzTEszbHM3ZS9KS0Z1RElvNm5INDhWVThaL0VleTFMU1Vhd3UzdmRZa2tWclNHQWJvNGNNRDgvcmtjWXIwWDRYZkMrKzhWYWpIcjNpbVUzRjZ5ank0ZWlRcjZBVjBTZ29xeTNaN0dFY2NLbGlLcXRGWDMzYjhsK3BaK0FYZzV2Qy9neU5KbFlUVDVrYk9jNXJyUEVGeUkvRFVyRTRLcWM5czRyZGZTVWhKOHRjS09BSzgwL2FBOFZud1Y4T2RjdW5Pd1cxcExLdnY4aEkvV3ZHeFVlVm5qdkZlMnJTcXZxN241by9HYlhoNGorSnZpbTdkeTdTUlhqeHFEbjVkelk1K2dyaXZoNTRwa3RKTEY0NUdWN0dVcUJucXBQVDZaeitkWFBGTTdXdW95QmlBNjJjaVNFOWZtRHQvTCtkY2Q0TW1hTy9oY2tGWHdHOU1nZy8xcm1VVTR1NTVzcCsvYzkxOFZoTGkrdnAwUWhYVkhoSUdkL21NQ1FmZXZMOVdrTFBlUU92bFNLRlREY0RPNzEvQ3ZSZERsT3A2YWxvMHFiM0N4Umx4Z05nRWpQdHlQcHpYbXZpcVJiZldudExnbGJ5TmdTRHh1eXpjTjdnWXJmQkxRenFQM3p0dmhOcXNtblhzRWNnQ0RJNEk3VjdkNEkxUm9iZHlaQ2Q2YnYxeFh6MTRIdlpvM1JXVm5JYkl6L1N2WVBEdXFtQ0pVeVJsQU91UFUxcGlZM1BZd2JQV3RLMVlUVFpWdUdiNlYybmhmVjF0N2xXUW5OZVFhTHJQNzFTR0lQYjYxMm5oWFhsYVVFdHozcmpsRm8ra3d0TG1XcDlEK0J0ZUx3cVdJWGoxNU5lamVIOVRES29ES2NqcFhoUGd2V3d5b0F3SkE5ZWxlbmFCclEycUFSa0QxcnRvTW5FWVJMV3g2cnBkd0ZDdHVBSHVhei9pTnJDMi9ocTZrUTRieXlGSHZpc1MwMW43Tkg4ejVCOSs5Y1A4QUZQNGtHYVFXbHV3TWNaeTdaemsrbGVuU2xjK2Z4VkN6dWp5VFZmQWt1cFN1endLVElTY3VNNXFpbnd2bGhsQWprYUpzOUIycnNqckJ1QWR6SVMzNlZZMCtlSXlocEpWSVBXcm5TaTBaUXhOWG05MDFQaFY4T0xTMnVFZVZmTWw3dWVUWHBNOGNlbTNBMkhha1l5ekU0QXJ5clVmaTVaK0Y3R2VhMURYQXNZekpPVS8xY1Nqa2xtNkFWNG4rMHArMWZOOFEvaDlMb25oUHhESEw0ZzFNcWkvMmFQTWp0STIrOFhrNmJzZEFLY1l3akc4aW80Q3ZpYTBZN3Q5T3YzZjU2SHJ2eHovYkcwN1JycVR3OW9FOGQ5cXArU2FSRGxMYjZrZC9hdTArRmQyOC9nUzJtbll0SkltOTJQVW4xcjVBK0ZuN08xeDhPOUVzeGVzODJwMzdCbkx0dWtZbitKdmY2MTlIZkdQNGhSZkFYOW1QV2RkbUlqR20yREZPM3piZUJXYmxLVzZQVno3QTRiQllhblNwYXR1N1orYmYvQmJYOXJhZnhONHJUd0RvRndmc2xvL21YNWpiaGpuaGErTGZoOTQxZlRncVRCbHh4bXFmai94bGQvRVh4anFXdFgwclMzV3BYRFR1U2NuazV4K0FxbGFvRjRHQWErdHcrV3hWRlFlL1UrS2xsN3JWWFU1ckhzOEhqaTN2Tk5SUzREcHlHNzQ5S3piN3hmQkZ1UG1aL0d2TVRlU0lOcXN3QnBqVHM1R1dZbnZudlVmMlBaMzVqZFpYSzl1WTdpLzhlUUlEOHhZbXMyUDR5M21pemg3S1dSQ3A2YnVLNWhpeEJQQkEvS3FrMGU4Z25CSnJhT1YwMHZlMUtlWCt6dEpOM1BXZkQvN1lPcWFXVWE1all1djhhSEJyMGJ3ai93QUZJN25TQ2lTUTNFMk9nWHFhK2IvQy9nTzk4YVh3Z3RvenNIMzJJNEFyMmp3WDhHdEg4RzJZbG1WWnJuQStaeHlLdW53N1NyTzZWa2ZWWkhrbVo0MTg5T1hMQmZhZjZkejN2d3ovQU1GSzlWdklGOGpTYjhBakFMWVVWcmF6L3dBRkFmRnVwV2p4V3l4V1JZY003WklyNXQ4Vy9FSFRQRDhUUnhoQTRHRkNja21zN3d4cHVzZkUrN1dTV1I3R3lQUTlIZjJGZGtPSHNCVGt1WmN6UHNxT1hZYW5WVkRtZFdmWld0ODdiSFJmR1Q0NlgvakthUmJ1L24xSy91T01raytYN0FkcTVqVFBERXNYZ3E1MUFuRjFBeXlFRTRZQUd1eTFMNFp4ZUhMU05iQklFZVEvTTdydmZQcmsxREg0VWtnM1RTK1pjN3hod3h3cC9DdmFwNGVNVW94Vmt0a3VoOUZTeXFvcFhxTHBvbHN2UHpadWVFdkZ6YWpiMm9oUm1rWk1nOWhYckhneTdhd3NnenVYTGpuakFGZVFhWjRpYXltVkk0b2tSQjhvMmpJeDFHSzduUi9IczlyWnBJOXFYUmNENU9jVjZFS2RSL0VmUzRKeTA1bWVpMnZpT0xUc3lYRm5LSUZ4ODhmellycXRCMWF5MXV4ODJ6blNWZU1qUHpKOWE0SFIvR2R0cXNMTVVXUEE2Y0VHcU9odEo0ZDFtUytzMkNBdDg4WVB5eWoweDYxdXFWa2V3NE8xMHoyQWo3VHA4a1lKM0tNclhqdnhmOE9ySGRSM2FLUUcrOWl2VS9EbXRSWDRWVk9BNDQ3SDNGWXZ4VDhPZWZvMXdxZ0ZnTjQ5cStSNHp5dFl6SzZzTGF4WE12Vkh6UEVlQ1ZiQ1RqMVdxK1I0WThPQVNDYy9TbVBHY0RKeGo4NnV6V3JESUk2VlhhQTkrbzlhL21SSnJSbjQ0MnlySUFBRGc1SFdtRlJ5VDFOVy9zcFlrRVVmWkNPeHJSV0liWlZDZ3JqYVNSUzdCanFSVm43R2R4T0NjMGZaVDNCRkYwaEpObFVSN3VuUVZISkVlNDRQSnE4YlU5cUdzaWVBTUNvNXh1Sm12RHVCd01uMXBQczRJeGpKclEreG5iZ0hPUDFwUHNaN3FTT3RXcEVPSm5tQUVFWUhGS0xZODRBNHE4YlVqZ0RIYjFwclczSHFCNjAweVhFcEMzenhqcFNHREl4aXJ4dHozR01VMzdPVkI0QnhRbXhORkF3WjZqclNDREhCNUJyUU52Z2tnQWtVeG93TzNXcmpKdlFWaWlZQU9NRTFISmJrNE9NWjlLdnlSRnZtQ2s0cU5zakF3T1B5cDh6SVBuN3hCclRTYW9zd0o1azJ0anZXNTRkMWQ5SDExWEx0NUYxZ0U5Z2E1blg3SDdPTUFFSklGZFQwQU5ibWpTcHF1bHFoQURvUDFGZnRWVkp4UHlhbTdNOWQwS016QXhzeEtuNWtPZlh0WFRlSE5KRTkwUVdYQTZrR3VDK0ZXcEhYTkhUYTVhYTFiYVIzeFhwRSttK1phUnZCSXNWeXc1eHdyKzFmUDFxZHBOTTlhalBSTTNOT3QxUzhCWkdqd2VEL0FBMTN2aHkzbVdOSGpJWlIzQjRyeU93OGIzZWkzS1EzQ0V1cHhoaG5jUHJYbzN3KzhhNmI0Z2lJam1hQ2RUZ3J4a0d1V3BDUzFzZW5RcjI2bnFmaG5WWkR0RDlSMnJ1dEIxVU1GSlpRUlhpeitLYm53NWVKdlBteEhuZGl1MThMZVBZZFRoUUsyMXUzT2E1WkpvOXFoVzVsYzlnMGEvSHluZWVhN0RSTlJIeWplU0RYazJpNjRHQU8va1YxdWhhOWwxQllEUHZWTTlHazducjJoWFNsQVdmbjlhN1BRTGdGRllISkZlV2VHdFdWeWdMRnNjMTNlajZ5dXhRcHo3VlZOZFRTY25zZHNkWEVjREZpU1FQd3J4UDRqK0tIdU5hbUt5Qll5MlB3cjAyZDVMcXdmWVRsaGl2R2ZIL3cwMURXOVJiZGN0YjJ4NEtwd1Q5VFhVNnF1azJjYjVWSTVyeEY4V3RQMEErV0g4KzZiaFlZaHVkdjhQeHFMd3Y0YjF2NHBhaUpMdTNNVnU1K1JKUHVvUHA2MXZlR3ZnZlo2REtKTGVDQnBXUEx0eXhQMXIxSHdYNFhlRXFHWUFqaml0bzFvcDJpZDFQRzA2RUc0Szc3c24rR1h3TTBqd3I1Y3dnaWx1ODUzWUdCOUs5UzAzVFVzSVNBdU04aXMvUXROVzNRZnhOM3pWNjcxTmJkdHBiTDl2YXRmYVJTdWZQWXJGVmNUUDNwWExJVmRwR0JtdkR2MjZ2RGt1ci9BQVAxazJ3SmNSQXRnZFYzQXNQeXpYcm91WlpaVGs0QTk2NS80djZlbXIvRHZWcmVVQWg3V1JlZjkwMTVtSms1SzZOYUZCeDNQeG4rSmVvdStxM3BqeUZQQTlRTndWYy9obXN2d2hZYjQ0SlhKUkhYUFRrRUQvREZNK0psMFY4UVhVTWJjZmFCR09jZzdRUC9BTmRTK0c0SkxUU3BncEllTmNnRThEY1FLeWhUYWh5bkc1WGxvZGFtdlBiYU9CR2MzQ1RHUkZEQVpBK1hBK3FrMTUvOFpmaURIZGVNb1dsQmp1VUhsczdIbVlvQndmY0FqbnZqNlZkOFM2bEo5bDA2ZTJMS3NrZ0pKNmdFa2NmVUUvbFhFL0hlL2kxMlhVN3FLTkJjMlRSUHZCS2x5cEFKL0VNRCtGZWxnY091WkpuUGlKUytLUFE5WitIR3YrZmJ4bFhCVmdEZ1Y2OTRldVpHaUJWaHVZYzU1eDdWOFhmQy93Q09UZUdOU2hpdndzVnJLY1JzT1NoNzU5dS80MTlVZkRMeDlhYTVaeFNSenBJamo1V1U1QkZHSnc4b1BWSHQ1WmlJMVBVOUxzOVhraGlBS3FHSEdOdU0xczZENG9hMmxLeUFLVDM1RlkrbUZOUUNBTXJMa1l6eitWYXN1ak1zb0JYSTlRSzRwUlhVK3R3azBySHAzZzN4cVlRaFNRQUVEdnpYcVhnN3hjSGRXOHc0OU0xODc2RUpMTzVqQURiUVJuMnIzNzRRK0g3Uy93REpkbGVkaHpqdFUwOTdJOU92S0twdVRKL2k1OGRaL0IxaXR0YVdrMXpjeXJ1K1hnS1ByNjE4NitOdjJtdkUxdEk1YlJMbDBPU05qaitkZllIeEwrR0ExdlRGdW9vRU56Q21BTVpHUFN2bm54NTRUaUxTcVlUREt2QlRHQVRYbzA1T09qUGxZMTRWSmU4dGp4SFUvd0JxN3hpc0xyWmFGQWszWTNGd1NCK0FGZWZhNThYUGpUOFE5U2VGZFZzdEtzSDQyVzBSVngvd0k1cjJhOStIc1Z6Y2ttSXg3dWM0NzFlMGI0TmwzUjR4SVZKNml1aFZQSTlpaFR3VHM1YWZPeHlYd3krRi9qTHhmb0VlamVKZkZON1Bvc3ZFbHVIQ3F3enp1eHkzNDE3am9Id0E4T2ZENWJKZkRVYnJORXY3NW5BT1g3RmNkQlY3NGQvQmk1RHFYYVlSKy9TdmJ2QVh3Y1pRcDJiRUg4UjZtaUxiM1Z3eGViWVBCci9aZCt0dXZxOTJjcDhQdmgxTnFHcXgzdDZXZVJPbWVnK2xmUGYvQUFYRitKcStCZjJWSXRCaGtLVDYzY3BDVkJ3U2c1UDZDdnZTMzhNd2FCWjRJQVlENzJLL0V6L2d1SCswb3Z4Uy9hTmk4TmFmTUpiRHd5bTE5clpYelQxL0lWMVlPaTUxNHA5N254T094ODhWVTlwVTlFZkZzRnVNaHM3aDNIU3JDUkVNY0RnVlV0NzRuQVpjSDJxM0ZkRHN1YSs0cHRIVGhZd3RvU0NKaTJOdVJUUkVXNXdPS2VreE9NS1JUMWJlRGxDQ2VhdG85RlVVeUFRNzJBSjRQRmFQaDN3ckxydCtrU0tRbWZtYW83R3psdnAxaWpRczdFY0R0elhzbndzOEdyWWlOREdIY2ZlSjdtdGFWRG5sWTl2SnNqK3Qxa3BMM1Z1WC9EK21XUHd3OEtOZFNnSWVnUFhjYTgwOGFmRm05OFJYelJXVzVWWTRBRmJmN1EzaTE5WDhVUTZIWmtMRlpLQklSMDNHdVowUFNvYkloRkFhYlB6UDZDdTZwTi93NGFKSDBXWTQycFZxZlVNRytTbkRSdGQrdGlid3I0UkRYQXVyOXZObEJ6aHVRdGVtK0ZOYUZ2SVVqTE1JaDZZQTlxNExVYnNXVUlSRHRMY0RCNXJYOFBUbUMwVWw5cE9PUnpTcFFTWjZlVjBLZUdYczZTMTZ2cS9WbnB1bTZoTExkSzBtWExnN2NqY1B4clV0cmhKWXpHUUF5L1B1SEFPZTM4NnpmQ0ZvTG5Ua1ozeUI5M0k3bXRlSFFpNmxsWkZVNVZ1ZzJpdlVwd1ZybjJlSHB2azUyWk4xcGNNa29hS0liMTZZSElQK0ZkUDRaZ1czczBTWnNDWHFEeDE5cXk5UDBjdzZrV3l5bFBsR1RnZm5XbXR2SWpFeVNxU25LNE9UK1ZiUjduVFFpbExuQzh0VGJTenRHNGFNWkNxQmpQdWFzYVpyYUNVSzZFc2NFZWg5NmtoS3ZCSHZPNEhPVGdjSDF4VDc2MkU4RVJSZVl4dEo0elZPV3VwMlg5NU5IVytGTmRhM3Y0bkJZUnMyMXUrRDYxNkhxRm91dndvbTRCcFBsL092SGZDVEN3QzduSkNzQ3dKN1Y2cHAxK0xPM1c1SlBsRGF3UDQxejRtbkdVSEY5VExHMDFLTFhjeWZGZjdMZXBXTVJ1TFlHUkcrWUFpdlB0WStIOTlvY3hTNHRwRUlPT25CcjlDZmhmcmVtK0lmRDltbHlxT0pJeGplbnRXcDR3L1pkMFh4dlltYTFpalNRaklDZ0VHdjV4ekxockR6cVNXR2x5dFBaNm44L3dDSXhlRWpWbFRkNHRONzdINXByNGVrbGtJV0p5VDJDNXF6SDRMdTJ4aTNrSlBiSFd2dkxTZjJRTFZHWkd0VVdSZW1GNjF0V0g3SWx1cEJOcU0rdTJzY1B3UGk2aVRja2ZQMTgvb1VwT0Q2SDU4UmZEM1VMakcyMWtEZW1NVkpMOE10VFRKTm8rUHBtdjBWL3dDR1U3YmhoYkxrZjdOUy93RERMZHZJZ0J0bEovM2E3bzhBVm10WjZuSkxpV2l1aCtieCtIdXBic0Mwa09QOW1sVDRaYXJNcHhhU1o5eFg2UEwreXJhNXlMWmNqL1pxZi9obGkyR0NMWlFmOTJxaDRmVmZ0VE1KY1YwazlFZm0rdndtMWM4QzBZZmdhc1dud1QxbTdZWXR5b1BzYS9Sei9obDYxQUdMZGNqL0FHYXRXMzdNMXNnQit6cUI5SzdLZmg5L05Oa1M0b2cxb2o4OGROL1pwMWJVTUZneVo2WUhXdG0xL1pIMUdiaGxrNDlxL1JMUy93Qm5xM2gyZ1FKai9kcmR0UGdSQWk0OGxTUi9zMTZkSGdIREw0cnM4eXR4Vk5mQ2Ztcy83SVY0QVNGbHo2RVUxUDJTYnhDQTRrYlB0WDZWeWZBaUJYUDdnYyszU3FrL3dKdDFJSDJjRWZTdWxjRFlTK3hGUGllYjNaK2RFUDdJc3pJU1k1Q1RWbTEvWXhlNVlNNlM4ZGhubXYwUmorQjBLWUhrcno3WnE3YmZCUzNVRDl3dWZwWFN1Q3NIMWlaVnVKS2x0R2ZuY3Y3SExzTnZrT0ZISEF4U1Rmc1dBa0VRTU04ODEramNQd1Vnd1FJUitWUlhQd2JnVVlNSzVQdG10WHdkaE9zRG1oeExVdnF6K2NmV3kwNEtNUXdFSXp4ejdFVlkrSGNqWGN6cmtLR1hQVEF6V2pyK21wcDgxdWpJV25hTmNvZUNWOVRXUnFtckR3MmxyTEdEdWtZRXF2QVgyckplOUhsUE1UMXVkNzhPdFJqOEIrTkVrZFNZTDhiV1hvRlByWHNsdnA1S0xNakIwVnc2L1N2RG9yZE5YdDRia01TekVPdkhUMUZleGZDM3hHMnE2TVlDNk5KYUQ3dWZ2Q3ZIeGF2N3krWjZGQ1Z0RFUxeUMydWtCdTR2a3VPamdZMkgxckFnOE4zZmgyN1dZdXdCL3dCWE9oSzU5RllkL3JYVGFiY1cybzM5eHBGNDRpU1VHVzBmMy91NSt0YUZyT3YyZDdHOFFPQU51V3JraTJ0RHJoS3p1VU5IK0lOeTVXSzkzcElueTVQS3NLN0h3OXIzMmU0amtpYkVUOWNkQjlhNFdmdy9jV0FjcEg5cHNzNXd4eTBmc2ZhdFh3anFjT1doRzVGUFluT1JXRldLM1I2dUhxMjJQZS9DM2loYnVGV0RESjZpdTEwZldpQ0NTUWZTdkMvQzJyblQ3bFZMWmpia2U5ZW5hQnJhdXFFSHA3MWtsZEh1VUt1aVo2LzRYOFJrRlFHYkk5YTlMOEtheXJCQ3h5VFhpUGhlOURZWUVrK21lbGVnK0d0ZE1DSXhJeDZacWRqc2I1dEQyM1E3cEpZUU9PZXRVL0dsZ29zeTRVRW1zSHd0NHBXYllHWUFDdWsxYTlpdWRPSUxMa0NyYlRSdzFZTlNSeGRyZHJITVZKSUdhNnZ3MXFTYjFHUUFPOWNQckRKYnprcTNKT00xYThQK0lqQVFwSUpCeFdQTzBLVVZKV1BZYmZWZHNZeGpCcU9LQnIyWXN4SkI3VnkybDY0MHlxQ1FDVFhSYVhxV1dBQkFBcmVOVG1WakdGQngxTm16dFRFNUxBRlJ4elhLZkhUeEJGNGYrR1d0WExNQXNGcEkvd0NTbml1Z3U5Y2p0NFdMT3E3UjYxODZmdHFmRTVibjRkNmxvZG5jSUxxNGd6SjgzS2duQ2pBN2s5dmFqRVNqQ0Y1TTBWMUZ5WitYVjFHYi93QVJaSXlBNzNNaDlkem5BL0tuYXpxcmFUb3pvQUhGMitRUnd3RzRBRGozL2xYYS9FN3dkSDREOE1tZDFEenp4eHBFUndXTEx1WS9sL25tdks5Y3VYU2FJQnpOSmJ4cE93emdLcWtzQitKSS9LbGgycWpVdWg0dFNiaWlMeHBxKzNWOVAwNHVJeGF4d3VUemtjc1QrUS9uWE0ydmlmUzliOFdhcHBWeko1YXpoa1Z5ZXB4akovbjlBSzFQSE01dGRhYTVrQ3l5VEtrWno5NERBei9oWG5WNTRiOGp4UWJtSnB2TWVUek1oYzhZNDUrbjhxOXJDeFhMYnlFcWxSdTBWY2oxalFCcDczVnZOR1kzdDVjTUQxQkdRZjVWcStFdkcycS9ES0w3VnA5M2lMT1JBNTNJUjNPTzFYNzZDYlVyYU8rVkFic2hZWkZrWEtTQlJoV0k5eGdaOVFmV3MrZlM1NzJQYkpDWVhZOHJqY0I5RC9TdWlWVk9OcG5vVTZiY2VmbDVYM1BldmhKKzJ6YVhFVUthbERKWXlIZ3lZM0lUL1N2cGY0Wi9HelIvRk1jWlc1dDUwWURHMXdhK0N2RHZndGZMamh3ZDQrOW5wazE2ejhPL2hUTGEzOExMSzl1WEgzbzNLNDlEeFhtVmFWS1YzQjJQc3NtdzFXdkJKdTU5N2VHTlcwYlVFQkpUTGNWNjM4UHZGTmhvVWtTeFNScUc3ZzhFL3dDTmZFdncyK0d1dlJRcUU4VVNSWkh5ck5odjFOZHJiYVo0OTBtZFJCcXVtMzBTOWQ2c2hJL0N1U2VGcXIzbzJaOWRQaGlxNmQyOUdmb0xwUGkyMjFLeUFNaUZsSEl6WEQvRS93Q0hkaDRqWnBvQXFURWNrZEdyNWJzdjJpdkV2dzJTTnRZMDY3amlRak1zUU1zWUhyNjRydU5KL2E1dDllc0kzalA3cVVmTExuNVQrTlFzVTE3dFJXWjhWaXNsblJxdEo2bXBONERsMG5VUkZQRXJJVHdjWnJ2ZkEvaGF6a2h5WVZPM2djY1Z5T2svRmUwMXdJMHJvVndEa0d1cjByeGpab25seHlLaXVPRDJKcmFsVlRlNXdZbkMxNHF6VFBTL0R1bldlbm9oRWF1NTdkaFhYV0Yra2FFZ3FGQXJ4ZlFQaUZHdHc4VHpvR2o3ZzhWbS9GLzlxN3c5OEhmQ2srcWF6cWR0WjIwS2trczRHN0E2QWR6WG8wYWlaNVZiQVRXck56OXREOXBheCtBSHdOOFFlSUx1ZFkydExaL0pCSUJkeVBsQS9HdjUxL0czaXE4K0lmalRVdGJ2NUhsdXRUdVh1SkdZNU9XT2NWOUpmOEZGL3dEZ29WcVA3WEhpT0xUTk9ra3R2QzFveGVPUEpCdUd5UUdiMjlxK2JiQ3dFdzV5TVY5UGxPRWNVNmt0MktsaFhVa2xEb1ZJclVFQWtETldvcmNJQWNrTjlLMDdmUkEzT0NCMHExSG9xeGtBZ0UxNzBLUjlCaHNvcWRVWmNVSmRoZ1o0cWVPeWtkMUFYSmJqanJXekRwZ1lBS0FCNy9TdWg4TStGNDQ1MGtaUTc1NDlLMGpUdTdJOS9DNVBLYlVTeDhOZkFwZ0tUVElETElmcGdWNnI0ZXRvOUtEdnNDZVNwY2tIcGdWa2FCYncyZ0RPdnpFLzV4V2pxbHliZnd4cWNxTnVBZ2M1QjVVNHIxOFBSVUkzUDBMTDhKVHd0RDNlaXVmUDk1ZW0vd0JiMUxVSEpra3VMaGlDZS9QRlhMYTRUVDdZTVNHYzhzVDYxaVdjb2Nvb1k4WlkvV290VHZYZVFSaGljZGE4L21zcm41eGg4V3FjWFVmWDgzdWFUNmtkUXZRY2tnZTlkVm9NdVdpQUdTTWRUMHJrTkJzWGxrQlhKcnM5QzA4bVZBekhuamlycFhjajZQSitlUzUzMVBXL0N1WWRPUUVoRk9EazlNNDRQMXJiZVI1WUNtMVQzejM5cTUzUUpXdGJOWXlOd0lIY1orbGFGM3FDK1FTcFpuT0R3UVRYc3dXaVIrZ1VhaVZOUlpvSkF5MkJmekF5cTJHNzUvOEFyVSsyZkU3U0tWTEFEQVBCejYwMkdBUTJFWUxTcXo1d01EMHBzVGJuVUtHWWdaT091S3RiRzBaNkk2Q3dielhKMnFGUEdDZWMxYk9sK1pBekhjcEp4eHptczdTbVdUYXdVRnM5RzZtdXJzWUJjUmdBRUJoMDk2YTBPcW16SUZxOWhxTVJZa3E0Qlk0NHJ1ZFR1akg0TFJWUHpPd1ZSK05jN3FOZ1ZqQWZDcWpBblBhdXIwclNKTmJ1dEd0b2dXUjdoZHdQVEF4V09LcUtGTnprOWlNVk5SaHp5ZXg5c2ZCYjRXTGFmRFRTTG1WVlptdDFaajZIYlhiK0I5ZGd0cjU3VnBRR2pPQldMNFFtMUhUL0FJYnhCbEFodDR3VGpzQUs4NStIL2orRFh2R04wRmtiSWZid2ZRMStBWXViZUk1OXJ0cy9tdkdZYVZTdFZsVjF1MjAxNm4xSFlhWmIzRThjeWhTR3J1ZEs4RlFYVnVyckd2STlLOEt2ZkZ0eDRlMDZHNFYyZUZNYnU5ZXgvQWo0cVFlTDlQV05tQWNjYzE5Znc1bVNkUjRXcDhqNExQY3NxUnBmV1lhcGJteS9nS0laR3dZcGkrQTRqbkNBa2UySzdDZkE3QVpxSElERWdDdnRWR1BZK1E5ckpyYzVkUEFzT2NiQUNmYW50NEZpNXlnQkh0WFRxd0RqSUdhVmp3ZmVqbFhZNXBUbGZjNUtUd1RGM2pYRk1IaENGQjkwY1YxRXZjVlRsQkJJeDE1cWtrYndxUHVaa1BodUJWT0ZBeDZWWWgwU0ZWQTJqQXF4R2NNUm1ubzJEbnRRektwY3BYR2l3Y2tLS3BYT2t3cWNoYzFzeUx1VSsxVXJuSlU0NjBrd3B5MU0wNmRDUDRCeFVzZGpFRUh5Z0UwTXc2VVJTNE9EMnB0bWxSdGtvdFk4WUNBQ29MaTFqSFJBYy9qVXdsNXBza2djWjdtbFk1NzJaL0x4clY2NDFLQyttWXRjSkdGWkQ2MXk4by90T2VXU2VRZlo1VG5kL2NOZEJleEovd0FKRElza29samtoMzRISVhnMXljMXkxdmVOQk1xdGJ1Y0RIQVd2aDR4MFBlVWowTHdScVlOZ0lsT1JHZmw5L2V1MitIbXVONFM4VDJ6a3ExdmRBcWM5czE1RDRIMVpyVFVSRktNZ25BT2NaRmVwVzBLejZmRXlqY1VmekU5UUQxRmVaWGphVGk5bWR0TjZKbnBmaUhUb2RUWlh0eXlUb2ZOaFlIRzA0NmZTdEMzMXQvRm5odnpBb2kxSzNHMlZNYzhWekZsNGtGdllXVXpZQVllV3pkY1ZyR0dScHY3U3MzSnVVLzFpQVlFZzlhODZUNWJIYkZYRjA3eHUxbHVlVWZ2SVd3eXQvRVBRMXVFMk9xYVc5OXA2TUdQMzR3UnVVOS93cm5mRVduSnEwSnU0V2NOTEhsNDhZL3pnMWgrQ1BFbDNwT29qWXdWd2RwUUhqQTlLSkpTVjBkTkp1TFBUZkJmaWQ1STJ0NVdEQWNydTYvVDJyMDN3UjRoaW1VUm1RcXk4YlQxcnh5Wld1cFk3KzFWSTVWNWRGT04zci84QXFyWTBieEc3Z09pUEZQSDBCUEJJN1Z4dFdlaDYxR3ZZK2s5QjFvd29vQkJQMXJyTko4VE5FcWhtQUI5RFh6ZDRWK002b29TNWJETHdjbmtWMldsL0YrMEdHODRPbzcrbFJLRFBVcFloZFQ2TTBEeGV3MnFIYklyci93RGhObEZtY3lIZ2Q2K1dZdmpwYTJyQm9yaE1qamsxTFA4QXRIUVFXeFpwd1I2azhDczdUV3lOS2xkU1I3dDRnOFlxWlNkNmtBZXVLYm9uakdKaDgwZ0REMU5mSytzL3RoZUd6TElyYTdwcXNuM2xFNFlyK1ZjZnJQOEF3VUs4SjZKdVdMVXBieVJBVHRnalk1eDdrQVZwSERWWjdSWnl5eFZHT3JrdnZQMEYwVHgxRnNVR1VBanZtdGgvaTNaYVRiczAxMUZHc1l5V1pnQUJYNVVlS2Y4QWdwWnJ0OXA5dzJoV2h0VlU3VWt1SDNNeFBjS1B3Nzk2OHc4V2Z0QytPUGlUTWtlcTYzZTNVY2pnR0ZHS3g1UFFiUndmeHJwcDRHcEJYbG9jMVRONkMrRlhQMHMvYUUvNEtONlA0VDArN3RmRDA4V3JhaEVwQmRHekRDY0hra2Rmb1AwcjUzMGo0cmFoOFFmQkY1cWwvcUVrMnJUWE1VekFuUG1aazdZOUFSeDBGZlAvQUliMGRyand6ZnlsaW9RSEdTY3R4bjljVjBId3c4VlRSNlRjMmhPeFB2RGFld0k2ZTNBcnljelRsRkpiSm1jTVZLbzdNN2o5cWJ4QzJxNlJwRWJBR0sxQlRhZ3p2WW9OeC80Q0ZJOXMxNFJyVnhKRktVY0xHMDJ4WDI5UU1EQStuSS9LdlMvSGNyZUk5SnNHbGtsUldoWlN1TThzM0pIdmorZGViYW5FbDlyazBreENvSkMwWWkrYkE2Z1lyME11U2pSVWV4d1ZvdHpPYitJSGllYlR0YWlOeGJtYUFoQVFCd1FlY2Y1OUtyNnRwSUdwQ2UzeVlURnVYSFVBa2dDckhqbnc3Y2FteEt6QUlGR0NEMTRGWjFwcmNsdHFOdERMbFlVakVZQVlaQkF3RDlNOXZTdmFna29wbzdLVkowcWlsUFZNM2ZDeHZiamJia21WYy9jUFhHUFE5YTJMRFFTbW9TaFF3OHZKQ09PTW5wMTk2azhMRmIrOGlFT1dCNE9CeXA5SzZkTEJwZFJzN2VLUWhjL3ZaRHlHZkg4aC9qWEppWk8xNG4ydEhCODlOY3VwVzBqd3k4V1JHZ0RPUG40NHpYcVh3L043YTZmR0pWRHBHMndFQUhIOWF3N0RUWmJXSVJNVElFT0M0R1I3VjZQNFRoV3doaEJFU0Vna2dEanI3L1N1SjM1a3RybjErVjRGVXB4VzEreDEvZzJBWEt4QlpYaVpteGdZWDhjR3ZTZEF0bzdPQVNKdmtrSEN1eEFCK2hHZjVWd05wZHhUd3A1a2FTTXZRaGM0SCtUV3BhVzhiRUJCSkhuM0l6WGJDRFMwVno3L0FBOVAzYld1ZWdhajRpaUZpSXBJamNveTRJYVFFRDlQV3ZPUDdPczQ5U25TRzBrdDRyamwwUE1USDFDOUFmY2MxdTIvaDk3M2FZWWJoMjYvdkhKVWUrS3YyUGdSeXhOMHdPNGZLcWpnR3JxNE9kVldrdEI0aktxZGRjdFNLc2NQY2VLZFErSDJveHh5MkV2MlNVRGJORWhsVVo3a2RjVjFzK3MrSzFnU1psdFh0bVVNbmtxU3JEdG11MzhQZUV4QWl0T05yUThZUFN1aHRORzA5QXFDNDh0ODhybkFIRlBENVZDRHU5VHludzFoNFNidnpMejZId1IrMTMrM044U2ZndE8xcFo2WloyVVVtUWwzZ3VLK0YvaXg4ZjhBeGQ4Ykw0M212NjNmYWlvYmlKcEQ1Y1o5bEhHSy9aLzlvSDlrenc3OGUvQ1YxYVhDcXM3cWRreWdNRk9PNHI4cC93QnFIOWkvWFAyWHZFN2kvdHpOcE03SHlybFZQbE9NOU05algwZURvVW9KY3NkVDhnNDI0Y3gxR2Z0cWJiby8raytwNHVtdkNHZFZZRWJRRi9TdWw4TzZsSGNsZHJqUDFybWRYME0ya3FQdVYwbkhtSXk4Z2c5dnFEeFVlazNFdW0zYU9wSVhQSXpYc1VxampZK1F5dk1hdUhxcFRWMGVyMmtJZU1IZ1ZaU3pKa1hCR1FPOVU5QnVoZFdjY2lzQVN0YTZ5WkFKNkRqclhzUmQxYy9ac0xSak9LYTJaTll3aUlBa0tDUjNyb2RNZyt6VzZ5dG5lZmJpc0xUWWpjenJHTm9IY1Yyc09qbDdCcFEwWVZGeGoxcnV3dEg3UjcyRXd5ZDdkRGtOWCtJVFdGMjBJWlNGT2ZlcittL0VTSzkwUzdobGs1bWpLZ2U1cnpieDFhdkJxazVSbUkzWnJGMGJYcEdsTWJsZ1YvQ3M1NHR4bHlzK1J4SEU4Nk9JZENvdEhkSXQyVTZ3VDNRSUpFVEZhcytHZElQaURVV1lraU5UK2RZMXpjczl6TUZ6bDIvT3UyOEYydzB6VHc3RmNzQU1IK2RjZE51VHNlQms4UHJGZFU1ZkRHNy9BTWpic3RMaHNNSXE0K25ldWgwalRWaFFTRndObU1BaklHYXdyZThXSWJpd1lqQXhuSUFxeWRmOHRtV09RRVAxOTY5S2xCUjFaK2xZZVVJZVNSMXR4cjRnWk1FRlY2Y1k0eHlhTkYxZzMybzI4U09Odm1aY250elhNeFNTU0ZjTUdCejh2Y2U5Yi9nYlNoRk84ek15cXY4QWVHUURtdWhUdTdJNmZyTHF6U2pzZW02dkxKSUFpZk12WGN1TnZTczdTR2Uza1lPTWpIQlA4WHRVZWlYaHVaVlFFRkZIM1IvRjdVUGRpMHVId01kZXEvZHJvVHNqM0l5Vmt6ZnRyaG9tWENSZ3QzR1FUWGUrRmR0N1l4dXlrTUR0NmNHdk1kS2FTNXVGVWxncjhMOVAvd0JWZXMrRDdEeTlJalZtY0VrR21ub2RsR1RrUzZwWWpERmdTTWMxN0wrelQ4T0I0aGdndnBZaThkdEprY2RLODQwM3c3TjRtMWFHeXRJakpOT1FpZ2M4K3RmWmZ3TitEY3Z3NzhIVzBNZ3lRb1ovY25yWHlYRm1ZZXh3bnNvdjNwZmwxUGsrTWMyalF3eW9LVnBUNmVYVTZ1ZlZJTks4QTNjRFBpRllEa24rSGl2TWYyZlBoeEJPczkwaWttV1ZuREgzTldQang0MUJrZzhPNmNmTXU3MXdKUXY4Q1Y2ZjhFL0NZMFhRNEkyWEJDalA1VitWeW1xOVZOOUVma09OcUtuU3NucXpUbjhMZmJkRmt0M0JJMjk2cy9Dcy93RENPM2tJaXlqUnR0T09Nak5kTmUyeVI2ZE5KeGhGUHRYSDZQYlhBbGFaQ1FOMmZTdDZmN3FyR2NkMGVKVWZ0NmNxYjZuMHRhWG4ycXdpa3prc281cGtrL0k0NlZ6dnc4MTQ2dDRlakRaTElPYTJKSitUa212MWJEMWxVcHhxUjZvL0s2OUYwcWtxY3VqTHNjNEtnNUZTZVp1R1FSeFZDR2ZncnlNVk5GT1J4V3R6aW5FV2R2bXpuclZXNWJBQjRxYWFRTU9vcXBjU2ZMN0NpNDRNWTB1Q01ZeUtjczI3SFNxc3N1QVBla2luNmc4anJUYk5KSXZiZ3lBWnlLcVhEakpCNXB5VGdFZ25HYWd1NVBUclNNVTdNcXp0dGZJNzB4WlFweUNCVFpwTWQrUlVMemdBampORnpmb1dQUElJSTV6U2lZbkF6VkF6NDR6MXBGdVNyWUp5QjcwR0U0bjh5bmlud1hjK0haaGVPaEViUW1JN2VWNi9xSzRhOUtTMjRrQ2t1cDJTTDB6NkVWOVBlSnRHajFqd3pKYlQyNGp2VytZcndCSVBWZmV2bnJXZkNFMmlheExZM0pVUlhITU1uM2UvOHhYd0dHeEtrclBjOTZkT3pNeXdtWVhTS0NTMkJ0TmV0ZUV0VFJ0S1h6RlluaGMrbnY4QW5YbFdtUkJwMnQ1bUl1clZzbHNENWhYYitGdGFTZmVvQUNJZ1hIdVRXV0xoOXBIUmg1ZER1cnk0WWFETkdwWVB2STRIQTk2dGZDMzRuaXp2VXNieGxaRHdqTjZkeFZXeXZWRnZDam91OXdWYjM5SzRYVW1PbTYweWdsRlpzajFVK2xjUHMxVWkwenJqTnhkejZnR2hSenp4WEZzVWV6dUJncU94OVJYRitMUEFkem9PdHZQYUlmTFp0M0F5UjdpdWIrR2Z4Y3ZkQVpZWjFXNnRSOTVjNUkrbnBYdS9nelh0RytJMWlZbzU0MWNESzd6dGVNK252WG16VTZUdExWSG9VNVJrdERpZkRjRDNVQll0c2w3bkhCLyt2VzBrQ1F1WGxCQTQzTUJ6OWE3QmZoa3RxWkJJVlI4ZndqaCsrYVlmQkFua1pXa1VSU1pHMDVESGpnZEtqbmk5VXp0aWM1cHVuVytyM2lxaUJwSE9BUVB2Zld0OWZocGZScnVFY1VhbjFQV242UjRRZndocUwzc0JNc052dFpoa0hZVDZldUs5UDA3eEpwV293cDU5czZTaGM3V1U0YjNIcUtxblVYVTNUdXJIbXVuZUN2czdLWldpR2VjWXlhNGI5b3p4YmIrQS9BZXBYSVlLSUlTSXdUZ3V4NEEvTTE2eDQ5OFoyNGlraHQxampHUDRRQVFLK01QMnN2aURKNDFSN0MxbEwybHJJQkp4Z3lIK3Z0WG80WlJuTldPVEdWblRwdHZjOGU4UFJzR2xhVWxYdlR1eVQwQjNmelA4cVRVTFNYVEpDMENCNUpCajVoa0RIYjg4VlIxbTdrMDZXTmlvQlNJTUI2SEdRUHdBcnBYdkYxclNVblZRRllDVGovUCtjVjdOVnROUzZNK2NwdTY1UjNoM0VsOWFXSkc5WTFNc3VPOGg0QS9BL3dBcTlGOE9XcUczdUxnbzBjU2pDODRMTVFRQVBROVQ5Qm12T3ZDTVJqRThxakNsd2lqdXpaL3hOZDM0dCsyYUhCb3dzd21YYzNNbWZ1WkhIUDBHZnpOZVZpM2VhZ2RkSjJqYzlJK0gxOEp2Qm10TktBSkNvRVp5Y0FodUNQcmtDcXZoKzYrenlOc0tnUGhjQS9lWEpHZnAwcXA0UzFhT01hMUhHb2VDYUpQTEErN0dNREk1NzdxajBXenhxQ0JIR0hVeDg5ZHBPUmo4RFhnMTRYNWt6MWFGUzFtZWhYZW52ZStEMGppS1NTd0VyR1JuRzRBSEg5SzhuVlhzelBKaEZsTzVWQzhsUU1BR3ZXL0I1bGlnbWhHRW10OXJMa1pERVlHZnFCWEUrSnZDWXRmR0YxQ1ZXT081WnBsSzVIREtEK21hbkw2cXM0czdKVTd6UnpkN3BxK0pFY3hTTWtnVWxrSUl3QjZWeWVzK0RaL01obkEzSkY5L241Z1BVVjNOcHA2V3QyUS96SkNtUzZIRGZRL1U4VlBhM2xxYmZZSXBWY24rSk4rQitPSzl1TW5heVBvb1lOVjZYSWtaZmhGekVQS2lrQlYxQVp3TUYvcDZjZnlydWROMGU0dG80OXJsdHVOdWVjZTFZMmkyZW52ZHEwQmhqbEh5dENYMkU4OVZCNi9UM3Iwbnd2YTI5OXA0VU1pTVZQSmJvUngrZGNVcDdwbnQ1TE5lemNKN28wUERzVFhiTExMR0ZCd0d6d00xNnZwWGhLMml0TFVzd0FrajZFQW5PN25GZVc2UkxKRlpzeklKR2lsRWNnTGNyMUg4eDFyMVh3cEl1b1dNVHMrR2hiQ2pKNEl4eCtWWjBhbk5WaW41bjNXVDF2YVY0cVhTL3dDaDBlZytGNGJTNkxsSFlSbm9Cd3cveHJzTk90STdlY01iY0tvUHk1QXllT3RjM3B1cXF0b2ZPa0tweVNXT0FQVHBXNXBYak8yZXhWVmplZWNOdEJYa0hqM3I2SG1najd1TFNPdHNiVVhDRFlzYXNSeHpqZ2V0YUduZUhSTEw1akR6Q1d6bnNLNWJUUEdhd09oYTJrallqYndBUVIvalhhK0cvRU1WODRXRW9wYnMzQnFvMUlzcHlhV2h0MjNoMWJsU2prTkdlL2MvaldENDcrQ3cxN1RaL3dDeTcyVzF2Q3VWYmRsU2ZldWd0SnByZGlWS0RhZVZ6My93cTliYW9RNHk2Z24rRUN1aUV1NWtxbFNENW9NK1RaUGp0NGkrQTNqVk5LOFV4VFFySTIyT2NmNnFaZnJYck92YUo0Wi9hYStIczlqZVc5dGZXMTNFVmtqY0J1U09vOURYYWZHcjRLNkg4Yi9CdHhwMnF3SXp5S2ZLbUF3OFRkaURYeUg4UE5SOFIvc3AvRStYd3pyVWtrOWtaTTJWMXV3SjBKNEgxRmJLNmxkYkZTcTBzWmVqVmlsSjZlVDhtdlBvZkZ2N1pIN0lsLzhBczArT2JteTJTWEdpWGJOTHA4NUJ5bnJHZmZGZUdyYUJpcEFPRDZWK3duN1ZuZ2JTZjJoL2d6ZFJUaUg3UUlpOEw5V1NRRGdpdnlCOFN4VGVDL0ZkN3BkN0d5UzJzekpranFNMTZ1SHE4eTFQNSs0d3lHbmxPTFVyV3B6MjhuMVgrUjFQZzY0YU94MkVuQ2RLMzRyb0Joa25pdUwwalhvVWhETElvSDFyUlh4UEdxakVpREh2WHNVcXFTU1BkeXZOcUVNUEdMbXRQTTd6d3RPczE4QUhDNDc5SzlIdGd6Nks4YURjTnZYcFhoT20rTDBpY0ZaVkREMFBXdTMwWDRyUkphcXNqcXdQQkc2dlZ3MklpbFkrdHl6T3NNMVp5UmsrSzlKKzBYczJWQ25KN1Z3R3VhRzFoT0pZemhoemoxcjAzeE40cjAvVTdjdkV5UnlMMTlHcmc5WDFXRzdKVk1zeHpYTGlZUmZVK1I0ancyR3FYYWtyOUdVUEM2cHFFN1BJTUJEbHMxMGlhdUhqSVhhTzJLejlFOEczejJoOGkza0xUbmNUakEvT3VpMFg0VjZsY3NUSXNhRHFkMGdyS2xDU01NbXd1SXAwMUZSMWU3S1VGeEpkdGhBVnozNkExb1dFY2x2SnRsQUlQR1FjODExR2wvQ1dlSndzdHpiRFBRREpyWHN2aENsd0EwdC9DQnljb3BKSE5ka0l5ZTU5WlJ3TmJkN25MVzE5SkhrOGpCN2s4MTFlaDY0MFdta0hPK2JBRzN2N1Zxd2ZDdXpoQmpXNkxnL3hiTWl0M1RQQWVucVNET1NzUzV5RjRCejYrdWE2SXhhUFR3MkVxeDFaa1d0eWJXRkhDdEc3ZHQ1NU5iRnBjdnFBVUZNNTY1cTFMNGV0V3RvOGtia2JJOWNWcWFIWVFXWThzeE5KSXd3aERZQzk2M2ltejJxRk9hM05Qd2Jva2s4cUFES0RuQjV4WHBVUUZwYXd4TUFyS2VnNzF5M2hTR09Ca0xMbGw5T3RkUHBqQyt2bFJtRFlIVTl1YTF0WkhyVWtvbytnUDJKdmg0ZkVmakdYVVpZeTBkb0FvSkhHVFgxbDQxOFJXL2hyUWpib0ZrdTVGMnh4amtrK3RlYS9zMmVHL3dEaFhQd2N0SGdoV1hWZFNIbWhjYzg5Q2ZZQ3ZRUEIvd0FQYmk4dkd2dFNZelhVdlBQUlBZVitOOFFZK1dKeHM0MCttbnBZL0FPS3MxamlzeXFWVy9kaTdMNWY4RThvOEhmQ21lRHhETnF0OEROZDNMN2lUenRIb0s5NDhJNmNiZXdYY0FLbXVmQ1NJQnRVQVZxVyt5MnNWakFBS2l2RHBVWFRkajV5dGlQYlJUNm1CNG4xZ3h5eDZmRVNYbU9YUG9LdXhhZWxwcHk4QUhIRlFYT2x4emFuNStBV3FQVzcweFJBTVR1N0FWMTAzcTNJNVphV1NPMytFVnlSWXlxUVFBeC9uWFdTVFpQdFhDL0NQVVBNaWxYQkJVMTEwdHdNbm5GZm9tVXp2aFlXN0h3R2F4YXhjN2xwWjhOeDNxY1hIVEJ6V1dMakhjODFORlB1SE9hOUZzOHFjVFFhWU1Nbm1xMGtvNkhvYVlMa0VFZWxRVHo3ZUJTVE1ZYU93Mlo5dmZKcU1UN2M0NUlwazgyUnoycXNaOEhnNEJxbEk2VXJvdmljRGtIT0taTk1DQ2MxVVM0QjRKTkVrNHdUbm1sZlU1cWtiRVYxS0FXSkp6VkthNjJrblBGT3Y1c2M4MWwzbDBRTWc5S3BNdUxMTStvQldKeWFoZlVRU0NDVGlxRWx5TytjbW9EY2VoTkRSYmhjL0FiVVBIazFsT2kzQ085bW55a0VmTkFmVWUzdlR2RW5nZTErSitoR0NOMFc3akcrM25BNGJ2ajFCcmIxZndPK28yU2kzUld6em5HUmowK2xadWdTM0hnNmFLVFlGaFYvTG5qR2NoVC9BQlYrV1JtcHBUcDZOSDBVcWZLK1dXeDR2NHAwcVRRSkJKTEdWdXJZK1ZPZ0hMc09uNEdxK2c2b2RKbGlNakFtNmZ6QU9tQVBYNkd2WFAyaVBBc3R5aTZwYmt0RklBazdLTUFnOG8vdFhobW9TVFdseEVDQVdSOWdCL2hGZW5oNXF0UzFPZHB3bWV2V0dwQzR1VXlTRmRRNm4zN2lzdjRsNlE5eWd1b2psZHZ6NDVBOTZwK0hOYUJ1WVlYVUFsUnQ1NzExclFHK2dlTlNnV1VkeG50WG5jN3BWRDBGRlRnY1o0WHZaNVlQS1Z3THVMbFdCeUhIcFhiZUF2SERUYWlzYk85bmRvMkE2OEFtdk1OYXZIK0duaStPVzRRcGJzM1R2elhvMHVtd2E5RmJhdHBycThjNEhtS282bnNmclY0bFJXcldqMllzUFVkL1ErbnZodjhBRWU4bHNZWXRTRFhVU2pHOU9TQjZnK250WGJLOGVwMjZ5VzBqWEZ1ZXlqa2UzSFN2Q1BnM3JrbDVaK1ZIS3lUd0RIWHI3RUd2UVo3cTcwYTJGNXB6dkJLaC9lUm9jcWZYS212bmFsUDNtbG9lM0IzWE1qbzlRMDN6MVZMVzRkSkFjbU9RK1dTZmJQeXRXWjRyMTI5MFNBUnp3WEtScU1xNVhHUGMrbjRVendsOFo5RDhYdTJuNm95MjE0aFB6U0tRcDlmY2ZyWFdQWUdhQVJhZmRXOTFhdDk2TXNKWTJIcC9uRkZPTWsvZUxkWkpIelI4UmZqRkxxOXpOWTZZOEd5STR1WGtMSzhneDBUc1B6cnhIeDFleVhNMGNSYVNORU81Z2NIblBYY09menI2NCtJL3dvMFRYR2tjMnJhWmNxR1ZtaFVORzNIVWpHUlh6WDhSL2hqYytEbmE2Q2YyaFpSTmdTS1FVR1QzQTVCelh1WUtjTDZhSGs0dHlscXp6YnhWcG45c1dvblpUTElxY0ZSaG1KT2VmdzcxRjhPRWt1N0o3YTV6REhHQ0FXR0NSN0R2elZ2eEI0dUduR0dXRzNOcktUa2JGNHpqcVFmNlZWMGU4T3VYNzN5NVNkejh5NXlIOXgvaFhyeXU2ZG1qem9KS2VoME9sRmJpeVVRaFk1Qk1CR3JkU0FSbjhjL3pycnZFVEc3MGEzaFZpOGtMRGNRU05xN3NnSDYvNFY1MVBxeDAvWGJVb3dWU0M0T2UrYTY3UnRVbXZqR1pOb1M2ejVoN1p6WG1ZaWs3cVoxVTVMVkhSK0Z0VWE2bGVOR0Vmbkp0SXhrbkI3bnYwcnRkTzB1R1BUNDdreTROcSt3Z2ZUSWIrWXJ6SFNKMzBqV29vV0pKaWRpM0dEOVJYcG1rYWdKTktuaGhLbVZodUtEK1BuL1A1MTVPTGg3Mm5VNzZEOTMwTzVndDhKQmV4RElkQXNxNDVIcVB5cm5maWhwLzJQVWJTN1dRb1NXUTdsSVlnSGRuL3ZuSDVWdi9BQTVkZkVHaFhJZGlrNnhBcUFPNFVIUDRZcUQ0M29kYTBLMlJFUlpZays4QmtLMjBEcjY5UHpyeXNKSnd4UEwwWjdWR1NhVXV4NU1tc1BxVndnTFJMSUpDUys3TzQ5ZWNWOUlmQW45bnZ3NThYZkJqVzdUeVd1clRKNWtjcS9NeXQyWEhwWHpiNE1qWFJkYUFkSTNtM3FNTnlBZTlmV1B3SytJclRhdmJzdG5DSFFBQ1JFMnZ4OUs5WEYxWEZya2V4OVJsOVduemNyUG43NHBmQjNYL0FJUStPNXJiVkxHVVF4TWRsekRHelJ1T3h5UndmclhUZUd2RU1GL2F4TXpDT1YwTzRnY0U0NUovblgzM3F2aCtQNGg2TkJKTnBxVHpiQXI3a0h6RDhhOHg4U2ZzU2VIL0FCUGNzOFVUNlhjTSsrUm9CNWF4ais2RlBCSnJLZUxpNUxtWHpSMVJqN0twN1NMMFBsblVkZUZqZUkwTGNYTEtIQ1lLdUFlRDdITmQvd0NGdmlsYmFWdHRUR0RQTVJ5VHpuUEIvWEZXL2lwK3dONGowYTZTNjhMNmxEZnhRTnU4bTZQbHMyT3dZY0g4YTRid3Q4S2ZGT2llSjU3anhGb2wxWStVUWlBTDVrYkFmeEJseUtxTHB5bnowMmUvbDJQajliWHMzdmJjOWo4S1J6YS9JMFVya0F1RHR6eGpOZWwrRXRPaDArNkNGUGtZOGpBd0QrRmVhZUdQRU1MelJLUW9aWThmL1crdGRyWmE4cUtJa2JKT01rSFAwUDhBbjFyNkREeFNXdTUrclVJZTdmZG5kUTZWYVNUZ05Hckt5NURZeFZ1MjBkWUpQUHRIYU5sR1ZCNk1heGRIMVZsakF5Q1JrWmIvQUphVnNXZXVHUUFGUWdYa2Y3WDByc2ROU1dxTjB0TEcvd0NIL0ZvMWNMREkyeTRUY0hVaXRxR1lSQW52OWE4NTFmV2Y3SThRV3Q0QVBMdXZrYmpIUHIrV2E2aE5XZGhrcVZ5T1RuZys5VFQwdkY5Qit4N2JIVUxmc0hLazdzODE1WisxZDhGSVBqQjRHWjdkVWoxZlRmOEFTTGFRRG5JN1o5SzdaZFdEd2xTeFBBT2ZlZ2FvSlZZRWdxUmowcnFnK2h4VnFFbGFjZDBmRldtZkhHUFEvRDE1cFY5SXNkNWFxWTNSdW9ZVjhNZnRvNk5EY2VMNGRZdHd1TDM3K0JqSjlhK3gvd0Rnbzc4RVp2Qm5pbUx4YnBFVEphNmdRbDJFNkszWnErUnYyaTRXdi9BbGxQdkRNckErOWRkQzZsWS9QL0VLY2NibE5WMUZhVUdtdjgvdVBDWXl3VWJXSUZYcktJeUpuTGZuVkpBU29JR0QrbGFlbTQyZ2s1QnIwWXh1eitmTUltNVdMTnRidHV5Q2NENjVyU2p0MjhzSGMyZnJUTE9OZHk1R0t0eXllWEg3Q3VtRWJJK3Z3ZUhVWVhaUXVvSHdUNWorcDVQTmRKNEQwcUd4aCsxM09IZHZ1QnVRSzVMVmRXRWFFTGttcjFucjg4bWpSc2l1eFFZT0FUVndtbElNdXhlR280cDFKcm01VmRlcDZaSDRrM2tBU2tJTzMvMXE2SHd6cmFlYXJTRUZUd2E4YzBDZTh2OEFNamVZZzdkcTZyU3RYbXNXQWtMSEhldTZqV3Z1Zm9tV1owNjhWTnhhVFBlTkhzbzd5TU1wTWlIZ2J2dkwvd0RycVMrMEdld0plTXNWQXlRVG5QdFhNZkR2eDJzNkpESklxbkhWampINDE2aGFYTVdwV2lXOGJNU3dHV1BjZjFyMWFWcExRKyt3Y1lZaUY0dlU4L3R2RVUxaGNGU3JST3JFa1p4eFdvdXNTamF4VmtCeUZ4eUdINCt0YityK0VZWlZZdkVBeEk1NDVxdGJlR1ZoM0JzYlFTQVNlbGFxSFUxV0ZuR1c0dWpTbTdDYnNxMG1mWUgycm9iSXh4M09DcEppWEo1NjFRczdGYlNOSWxWUVFRUWM5ZnhyUXM0bWlkMlZHWUVubmdnZys5YXhSNkZHTmpvZEtrRFRCd2ZsZm9WUFN2UXZoRjRmUGlEeFphUUtwWlpaVkIrbWVhOC84UHdneGdJNUNqQkFBL25YMEIreWo0VzgzeEZIZGJTd2g2WkdBRFhCbXVLV0h3czZyNkl3emZGckM0T3BXN0ovZjBQdVg0WTJzTnZwRnRGNWFEeW93Z09QYXU2aTh1UEcwWUFyejN3Vk41TnJHTTRPSzdLenVUdEc3bGpYNDNDcHUyZnk1aVl5bFViZlVtdnBXYVFFYysxVmJ5NkJRQURHT2FubmwyNUpHUm5wVlM3WlhJWTg1N0NwbnJxYVV2ZHNRQ1pTQVFTV3pWVzhnTnplbG40VlIwcWZLeFM3aU1EdFdickdzcmFXczg1SUNvQ1NmcFdWS04zWTZLeTJTT3YrR2NQMldHZVE4Qm1PSzZPZTZBSk9hK045SS9iNXQ5SDhmVGFST2hoZ2lsOHNQbjVUelgwMTRLK0lOcjQxMGlPNGdsUnk0QjRPYS9TY0RRZExEd2kreDhweEh3OWo4SFYrc1ltRm96MVhvZFVMdnBrNElxZTN1eGs1eldPTHdja25tblI2Z0ZZNFljMTFYUGw1dzBObGJ2NXNFOFUyN21MSElPRFdaOXVHUVF3SnA4MTBHUVliZ1VybkkxWjNKcHB4NVo1eWFxTmQ5eWFqa3V4eUNTYzFuM044RUo1QXhWcG5WVDJORVhtMXdjOWFXYThBeGh1dFlrdXBZR2M0SnBEcXF5SmdIbjYwek9yRHFhTjVjN2tiQnhXVmRUbGtPRGdpbXZxSG1LUm1xZHhkamRnRTAwakdDdG9FbHlRY2s4MUUxMTdqTlZicTVWRG5PYzFUa3Y4QW5rZzRxMHpxakc2UHg3MGE0VHdwNGdSSmtEV2NwK1VrNUI5aC9oVno0cS9EQzM4WGFXZFMwU1JVbFNQNTR3QU4zdFhvMS84QUJLSFg5SWxqdFhXVlhHUjNLbjFyemxJdGErRjJyUzJkN0JPOXFjaGQzUVYrTFVhL1BQMmxKNnJkSDFVNmVuTEk0bndUZVByZWlYZmgvVndwa2pWb1ZMakc4ZHZ4QnJ4SHh4NEJ1ZnNVMG9CRTFwT1lyZ0tQdU1Ed2ZvUlgwTHFXelZmRmR0ZlFwc2FSZ2pnRGo2L1dxL3hJK0VjbWllTlRmeU5peDhRd0JKRTI1WGVCOS84QWxYcVlmRWNzM0tPejEvek9PclQwc3o1bDA1cFk3U081SllTeHlHUDYrOWVoK0JOWC90VEVVdVE0K1ZnVHorR2E1K1h3MmRMMWg3WjBKdFZjeEJzY3F3UE9hNy93cDRPc3BqYXpyTDViVGdCempJQkJ4MTdkcTJ4MDQydWlzTEpwMktIeFcrRzBQaS93NXRuUnk2OHh6SU1NbjE5cXkvZ3JhWGZoT1p0THV5MGlFbnlwRHdyZlN2Yk5NaE9oM3kyVjhpWEVMRENNTWZ2RjdFZHM0clY4VmZDSFR0ZjhPQzcwV0FOZDJjbm10RGdySWc3L0FFN0gwcno0NDI5UDJVOXVoMHlvV3FlMGljdDRDalhTUEV5eTdYak0yZHc2QnZXdllSZFdseFpHVGY1VXFqR001TGM5Szg2MVR3emNXbWsyK29ScTdLNEJjRWZNamREa2Y1NjF2NkhQTnFma0NWUVVBSFBRNHhuK3RjamtucWowY08vc3M1N3g3NFl0MHZsMUNFUGJTRncyNGpDN3V1RGpzZlVmNDF6V2plTWRXOEgrSlh1Yk80dUxhSjMydkZ1eU1FNUJIWS9YcFhvSGlXK2tJZU1HTXhMZ0VGZjA5eCt0Y1JmYU9xVHp1am1TMjI3b1dCM0JNbnA3aXRlYlRVbWFhbFpIZWFQKzBCSHFRTVdyMmFQR0Q1WmtVbFRuR2VQVUVjMWlmRkh3S3VzYVROcmZodTRXNENxR2tqR0NRdmNPdnB6MXJsN2pTV1Boa0VydmZ1UWM3ZXVQeHdQMXJtTkQrSUY3NFd2TExVYmE3bGdGck45anU0K3F0dUh5a2p1Q2NDdEtNSDhVT2hqVWtyOHNqeTM0cWFCRnFFY3NrY1lzdFJCeThMbmJHNXoyOVBwMC9sWEYyTVZ4cFZvRW5VUlRBOGdqYVFjMTc5OGV0QzA3NGgrRlRydGpDTGU0aWJ5TDZDTTRWSk96RDJQOUs4ZHY0QmU2ZVk1Zzd6V2FMdGJJTE9NNHg3MTdlSHhDblRYOVdQT3EwdVdiSzJ1U21lQ0dWV3k4aUJodHdTcEI1NFB1QWE2RFJybHA5R2drQmN2RzNIR0dKMmo5T0s0NjZsWjVFRWpCV1JzQUgrVmExanFSU2FORkxSeHNveWM1eFdsU25lS1FVOTduYlA0cGcxQ3pnYnkxTnpic3NiZ0hHN2tZSituTmRQb0hpTDdOWlFHVkFHOHh4djNENXR4QkE2ZE92NTE1dG9Vd1hlN0FlYURrZjNaUDg1cm9aNTIreEJQbXh5d0o2Z2tBZnBYRFd3NmE1VDFLRk52VTkvOEFnanEwT29YYzBNTXBnU1VJTjRHNEtXY0tTZlVBRW10alVOS2J4Sm90eWpFb2tPeVpnRGxzQWdNQjc4VjVuK3lscXN2OXAzTU53Mllkd1pTT29HRCtnTmVxZUIwZlR2aWpxT2x1KytKQkpiS0QwWjk3SCtlUlh6T0pvdUZXWGVObWVqaDNzbWVRZUtQREV1aStKZE11aEVVdHJpUXBqR0IwL3dBZUsrcXYyVDlBZzArd2t2YnBRWlpjZVVHR1FCMnJ5N1hmaDlCNDUwaExlVXlyY3dsZ2VTQ2h5TnBydmZocGIrSnZBT25RdHFPblhFdGxFZG91WUZNaUtCd053SEkrdlN0YTFUMmlWajNjRkxrYnVmWUhnTHhKRWdTTTdRQUIxcjBOOUdzUEVXbEE0VVNkUXc0STk2K2R2aDc0NHROU3Q0bkZ4RWZWdHdKcjFYUnZFTHpSTDVOd0dRRE9SMHJsVStYUm5wMUpxVm1pYlZQQ0Z5anlCWFYySDNRdzROY2xyV2lhaGFYZ0V0akhNcCs2d09CWGMybmlhUUlGdWd3Wmp3ZTRGYnRoYVFhemJBWlZpRGtack9WcGFJVXBjdXJQQ3RiL0FHZjdUeHZFWlRhSFRiOWVVbGhHQm4zSFExNU40MDhMNnY4QUMzVXZLMUpYVlFma25BekhJUFRQYjZHdnRtTHc4dHBsUm5hYTVmNGplQUxMeGJwRnhaWDFzbDFiVEtWWUhxTTl4Nkd1M0I0NnBRK0xWSDBPVGNWVjhKSlFtK2FIYnQ2SHgzUDhkYkhRN1F2YzNTQjF6bFEyVG5IVWUxVTlKL2JFMHpVN3Q0b1VrZFl6c2FVamdIMCt0ZWJmdHRmc3dhMThDMGwxWFRHdU5UOFBUTWNOeVpiVS93QjF2VWU5ZWFmRC9SSklmQTluUEtDSkptTXhCNEp6L2dLL1J1SDZWTEd1OTd4UDBIS2VJWTR5dHkwbG9scWZZaCtNMXA0c3RkUGlnbldSbW1CSVk1MkRIT2ZhdlI3UHhiYjNGc1N6cnZHQUFEWHcxYlhWemErVkpFOGlMeHpua0RQV3V0MEQ0czZ2b2Npb0xoNWtYR1F6WkdQeHIyc1J3NVp1VkdYM24xa0tzT3VoOWgydmlIQklCQlFqZ2prMWN0OVcyc0VBWWpxU1QxcjUwOEwvQUxTSW5tRWR6Yk9GVnRoWlQ2Y2s0cjBuUi9pYmI2dlpwTGJ6S3luMEk0cnhLMkJyVVA0a2JHa29RbXREcXZpaDRUMDM0aGVFYnpUZFFqV2UzblFqRERPUHBYNVIvdFdlRW04R2E3cUdqQ1V5Mjl2SWZMeWM4WjRGZm94OFEvaUxlV0dnWGMxcUhtWkl5MkY1enhYNW8vSEc4MXJ4aDRvMU82dkxXNlo1SFp2bFFzRkh2VzJIaTNZL0p2RUJSaFE5bEhWeVR2YnNlRktmTGNxY2NIR0swZE1PNWNIak5aOXdERmV5STI0SFBweUt2YVhnNHdLN29IODk0U1ZwbTNiTnVqSEJHYUo3Z3NoR1NUVExTS1djb2tTTkpJM0FDakpyWXVmaGo0aC9zODNRMGk4OGdjNUNFNHJyaW0xb2o3Q202czZkcWNXN2RsYzVXV0ZaNXdHQUFKcjFId2hjYWZwK253MndqalZTQnZPT1dyaGZEL2gwNnBldUoyZTNqaVB6bkh6WjlLNzNSL0FsdnFvUkxXKzhtYkh5K2FmbFkraHJURHhkNzJQWDRXd2RhRXBZaFFUdnQzK1IxS2ZEZUhXN1VUNlpQRzdrSE1MY0hqMHJtTlQwaVhUNVhobmphR1JEaGxZYzFQcDJzNnA4T3RiVzJ2b3BMZVFINVdQS1NqMVU5RFhwbHAvWnZ4TzB0RW5BaXU4WldVY0VleDlhOUdNSXowMlorZzRlalF4VVhHa3VXUzNUUEpkTnZwZE1uQlVrRHQ3VjdEOExmaUdzNkpIY01DVjQ1Nm11SThjZkRIVVBDMkdtaUVrRGs3SlIwYXNIUnRTZlI3NUdKWWJXNE9hMHBTbENWbnNYaEs5WEIxYlBZK3BWbFhVNEF5dVhWc2NZR0Q2ZmhWRzZRMnNxS29aR0pERWRSWExmQzd4cXVwV3FJMGhieStnOWE3KzZzbXVyUHo0Z3FISEk2Z0d2VGpLNlB2cUZhTmVtcHhLZHJiUnp5WXlNZjNTT090WGtqSW1iQUtxMk1weng3MVRpS3NRenNBd1hIQTRiL3dDdlYreFVNNEc0cm5BeVR5YWFXcGNWc2IzaHl4OHlhTkZ5Y0hzYSt3UDJYdkNKc05CaG1aQUhsdzNJcjVtK0YvaGh0VjFtM1RKeEk0ejFQRmZjSHdqOFByWTZaQWdVS3FxQlh3M0dtUDVhY2NOSGQ2djBQaGVPOGVvNGVPR1QxZXI5RWVqK0gxOHEzVHJrVjAybnprS3BZRWNWaWFWYVoyYlJpdGlOR2dRaHgxNlYrZXdiUHhlc2szY3VQZEIyT1RrQ3FUM0tpUWtuNWMwa3NnRVM4RUUxblR5R0RMTVNlYzRyWG9ZSmt1b1hvUHlvY3NlSzRMOW9IeGxENEUrR1dwWGNzZ1RaRWNjNHljVjFWenFTeEJwWElWWXhrazlBSytFUCtDaDM3V2R2cjhrM2h6VGJnTkJDY1RNcDRKOUs3OHN3Y3NSaUkwNHIxOUQyOGp5K2VNeGNZVzBUdS9ROE92ZkdqNnJyOTNldElkMDB4azY0NEo0cjZWL1pPL2E0dWZDOXpiNmZxRTVNSENvNVBBOWpYeFA0YzEwNmhMdURFb1QzNzE2QjRYMUw3T2lFRWh2WTg1cjlVblNqS0tndW14K3pabGdNTG1HSCtxMVkzWDVINjllRGZpWFplTHRQamxnbmpabkhPR3pXM0pmWTV6WDV1ZkJiOW8zVS9BVjNDanp5VFd1UndXeVZyN0wrRW54eXRQaUpwY2JKS3JPUndjOC9Tdk5xVXBRZXAvTzNGZkEySXl1VHF3OTZuM1BYQnFIeTV6a0dwWXRRM0lSbmtWemNPb1pYR1FNMU5EZmdIN3h4V0RrZm5GU20wYWt1b1lKNU9CNlZuWCtwQldPQ0RWVzh2Z2paejE5YXlOVDFQUElJT0twU05LS0w5enF3Mi9lR1I3MUJIcm9YS2c5YTVtODFZcWVUa0dxaDFvckoxSXFuSTZKMDd4T3pYVndId0QxcEo5VERZSlBTdVNHczVBSU5TUHJKa2l5V3pnVVJtY0VvTk0ydFIxRWJRUVFhem4xTTU1SVBhc2lmV0NjL01EVkZ0V0dTUXhHRFZ4bWRsR0doOEMrQ3RPOFQrQnBmM3Nza1N4dGdiK1FSWHI4UGl6dy80NjBiK3o5ZXRZR21aTWVlRkFBck1sOGUydDhSQmNXaERuajVreUtySHd6YmVJSkhFVnZDck56dUJ3VFg0UFdsQnU3WExJK3dpcFBTV3FQSnZpWDhEcjN3OTRtUzYwZG12ckdaeHQyajduUHRYWmZ0TWVCM1B3V3NuQ21POXRZRUNrTDh4ZkF5SzlyK0dQZysyOE9RZWJxdHpFOENqSWpKR0I3Vnl2eDFtMGJ4WTdwZDZoSEJheEhja01KQlpxN01Makc1SlNaellpaDI2SHgzWS9EaVhXYkdPOU5nd2VkQjUrUU9vSFg4YWd1ZkRFT2p3eXh3T2lyQTRKS2pkakl3VjQ5d0s3VHhUOFNZZFhrMUhRTkVqa3RrUkdFTWpjYm1IK05jQjhQL0FEdFAwdTVqdW1kSkpsT2Q1emtoc25OZGN1YTdrM1pkaktOdWgzOGVsUjZuYVF6NVpkaDVDOERCNEl4V1pydnhFaytIclFXdW9FdmJCbEVVcUVMSkhuMzlNOWp4VnJ3RnJqVFdyQWphUTdLZnp5RDllYTVmOXBUVDIxYTgwcVhPRnZWeEllNUtuSlA2MXhZS1BOWGRLV3gwMVpXcHFhUFVmQ1hpaXo4VDI3Skk2U1J5L1BGSU9DMlIwWWRqV3hvdWpXOXJGTkdzWVJWSEMrdU80UDQxODYvRFhWN3p3enA5bmMyeXZMcHp5dmJYRWJFbkdOcEREMCs4Szl2MER4T3ZsQ0c5ZVZWbGpEUlQ0TzZJbis5N2M5YWRhSHNwdEo2RzJHcVhTa2MvOFRiZkdpWEVNWWNTeWNobFBYampGZWYvQUExK0k4Vjk1ZW4zeGphU1E3WTVlZ2tQT1VZZTR6ejYxMzN4Sm1rdHRCRVVxZ3ZHVHVZZmRQY0gvd0N2WHpQcjBodDdpMmtzWGRTdDZITWVlVnd3eUZQY0RQMXIxTU5TOXJDd1l1b28yWjlLVCtIMTArKzhxSXViTFVSdWpKNWFKOGRQekZlTytNdkRjaDFqVzRIUjRwNW9rbUtyOTFtamJJWWUrTTVyNkIrR0RXM2pYVG90R21sUjd1V0pKSUNUekdjZENmcmtmaVBldWU4YStCN3RQR2R4YlMyNVpybUoxWXN2K29kZXB6NmREK0pyUENWZVM2a1lWbzgxbWp4MldUK3lQaDc0b211RmJ5TDJLM1JSdSsrNTV6bjZidWxlUVdkeTAvMnBrQVZBb1FBZGlUblA2VjZqKzBWcmNFTnRaNkxZSE5yYXI1cnV2SG1rakc3OE1ZL0d2TmJHMTJhWTBpOGlWeVNUN2NmNDE2MkZUNVhKOVRscXJXM1k1aWRXKzFNNzU0YjlhMk5CdDN2SkE2aGlVVTQ5RDdWWFMxU2U2SW1jUm9oTzRnWlA0VnY2YnFRdExOYmV6akVNWUdIYnE3REhYUDhBaFhmSjZJVktHcWJKOUsweWEzaVI1VlZDQ1NBMkZQNUd0OWQ1dFFEZ2xXejE2bXNUUW1lOG5HOFpRY0RjY2tDdWpTeE1rR1ZMSXA2T1J3RDJ6N1ZsWGd1NTlMQ2pGUVRPeStBOTBkUDhYcEVnY0Z3d09PcDNLUmo5YTlVMExVVHBIeHJ1QmNxSTRMbWRyZ2xlUVdBREQ4RDFOZVlmQW1CN2Z4QzBoS2lWQnRBUFVrbkhIMHptdm9UdzVvV202cnJjYjNLS2pUc2lEcHdNRFBYMngrZGZONDlKVlpMdWh4cDNsb2JPdXdwNGY4VHpwYnFIODdFNEdNaGdSbXZTdmc1OFFUYU9zVjBRUy9VRVpGYzc0eStIcjZoWldPcDJzcWdXa0hrT0QxWWZ3dDlhcCtGOUs4UWVHWTdlOXZkSG5tc0hHVGMyNDgyTXJuR1RqbGZ5cnhhY09hS2oxUjZ1SHFKSzBrZTMrTS9oWjRiOGE2UzExYUtkTDFRQTR1Yk52TEpQcVZIRGMrb3JJK0RkcHJIaFBVVEJxbW9HK1NJNERFYlE0N0hBcm1kSzhYdmVnSmJYSVpTY2dqN3BycDlHMU80MHhJNUpVTWhac1o5S2MxTnF6T3lta3ZoZTU3Yloyc0dyVzhiQUFTQTlhMnJHM1RUTFVLbWVSbkFyenJ3MTR5ZTNtWVNMaEh4dHgwTmRiYWVJMWJhVmNNQ01ZcTRSN2hOVFM4anByVFVIdWNLeHdCamowcVM3OHVjRm1JSjcxekxhd2JTYktQdUxkODAxL0VMVGZLSENoZXA5YWRSOURDRVczZEhtbjdZZmgyRzgrQyt1K2J6R3Naa0hmQnpYd1FzS1F3b2pCVldPSDVBT0FCN1Y5eS90eStLbzlLK0FOK3F5Qlh1eWtQdHlSWHdUOXErMGtCM0RBRFlDRDgzWHBnZGVLL1NQRDJpMVRxVk83c2ZvUEJLdEtyVmZraWE0Y3BaTUFDcWo1Y2pQTlI2WmNQUHFVWUFQbHNjTVIwNDZWUnU3bVJMUnR3eWhZREI0STQ1L1NvdEoxaU45U1FaSG1GTXNvd1J4bkdlMmNWK2tPUitnU3hldWgxWGhxNFhEc1FxRVJzNU9jWUpZK3RhbWxlTkRwOHFtR2FTTTQ2S2NBKzljOVpYeTZkNGIzeVJGUXhWV3dlRDE0NDQ1L3JWWk5SaUYwcXBrSWNPZU1GUjJGVEtDa3VWcTUwUnhDU1N1ZWllSmYya1pmQkdoTEZjYWJIZXBkcVVWdyswQSs5ZVIrRVBIUzZycjl5MGtTS3NyL01tM0k1UFNyM3hReGQrRzBKQStWZ1Jtdk92Q2wrTFRVZHpPd1luZ2h1RHowK3RjTWNKVHBWTHhWanpNYmlJeHJMbVBLZjJsdmhITG8veHhudGJHSFpiYWlGdUV3UGtRTjEvWE5kZjRGL1pmMGJWdE1pV2ZWTG1POVljbFFOaFAvd0JhdmFmSFhoUlBIWGh1M3ZnZ2E2dGhzM1l3U3RjRnBkeEpvK29MRUVLc0RnRWpnSG9jVlgxT0NtNU5ibnc4T0Nzdm9ZeXJpYTBPWlZIZExwRlBvckVlbmZzMUw0R2thNmh1RnZzL2NjakJXdHZSTlNtMHlaazNFRmZ2WnlSaXV1MGpVVGMyejI3RWtGUVJ6MEpGWUdyYVFMZTdWbUNBSXhVc0RnaXVsVVl4K0Urc29aYmg4TkJSdzBiSXIrSS9oem8vajIwTG1HS3oxRmg4c3NZd0pEL3RWNUZyM2hDKzhHYXEwVWhaWklUK0RlOWUwYVd1NlFLR0NzaERZNXczdm1xSHhoMEpOWjBsYnhRdm13cmduR1NWcWF0Rk5jeTNPYkg1YlNuVGRhbXJTWGJxWUhocTB0Zml6NFRmUzlTWGROR1A5SG5IMzRXeHh6WEErR3ZFRi84QURieHBOcEdvaG81N1dUYnlPSkY3RWV4RmEzZ0xVcE5FMStORVpnWDU0N2Mxdi90VGVFRHJOaHBYaUczVlJKR29nblpjQStxazQ2ODVyS1NmSXFrZDBlSmo2ZFNXR1dZWWYrSlRzcGYzbytmbXQ3bm9uaGpYN1R4cHBaaGxWSlluSDNTZVZOY044VWZoQzJrTTExYVJsb3p5UU93OVJYS2ZCdnhqSlpYVVVjanNXVmg5T3RmUjJsQzM4VWFVaUZVWXNPQXd6WFhCcXBDN1Bvc0ZVcFpsaGxLV2pQbmZ3UnIwMmc2a2l1ZHFMMjdWOUkvRDNYSS9FT25yR3pBeHV2WHIyL25YaWZ4ZitISjhKYTRab1ZYYWNiZ3VOdWZTdXorQnZpRWdvamxnYzhIUGYrb3E2S2FkbWI1VTUwS3JvVFBRZFIwNXJlNEtNcE1SSUNnZFI3MWYwUzAzTUM3WUlIQnpWalhJRWthT2JCS3lqdG10RHdob0M2aHEwVnZDck0wcmdZNTYxMFNtb3hjbm9mUVZKUmluSjZXUFpQMmJmRHJ5M1N6T29LSEdCanZYMTU0R3RSRGF4cnQ0QUZlUy9DajRjcm91aTIwYUtFbmpVRW5IVTE2NzRWVjdVTEhLQ0dyOFJ6akh2RjR5VlZiYkwwUitHOFJaaXNYaUpWTDZkUFE3L1JBcXhna1pJcTljRHpJd0Z5VDJyTDBxNUlaUVFNQ3JON2VtUERFbkJybVMwUGpKcDgxeU8rSlczSkp3MVpFK3FLRTJsU1IwcG1yNnY1L0FjaFJYRmZFcjRuV1BnTHd4ZWFscUU4ZHZiV3NaZG1ZZ2RCMHJTTWVoTVl1Y3JJOC8vYlkvYUZ0UGc1OEtyK1FYQ3BkVG9VUWJ1YS9JM1hmR045OFN2Rk1ySzBqK2RJV2R5YzV5YTduOXJuOXBUVnYybnZpWmNpQnBVME8ya0tRTG5od0QxckwrSHZnNlBSN1ZaWkZBZDYvUStIOHZkR2x6U1ZuTGYwUDFQaGpBU3AwdVdLdHphdG1ybzJrTnB0ckNnUEtnYzlxNkswMVZyVUFaSUs5cXJGMGt5U2NBRGdWREx5YzV6anRYMDBZbjNsT0NndERydEo4WWVUdEpZa2p2WHNud0YrUExlQzcxbk11SWlRV0dlbnZYekpKZk5GZzV3UU0xRGVmRTFmQjBhTElIWjV6Z2owRmMrSmFVSGMrWjR6eCtIdytVMXA0aTFyUGZ2MFAxZCtGZjdSR25lTTdHTW1kQklSanJYcE1HckxLaXVyQmxib2EvS0w0Ty9HV1ZMaUthMHUzaWtBQkViTmpkWDJuOEFmMmtZTmNzbzdhOW1BbEFBd3h3YzE1TmVnN2MwVCtPNkdaeHFTNUtpc3o2SXU3N2RFZm00Tll1bzNoQ2todWFTMTFSTDJBUEU2dWpqZzVxbmRIT2VjVndLclk5U25HeGwzOStRU0QxRlprdXJFSHFBYW4xbENDV0hQcldIY2xoazQ0clZWVHVqRk5HdERyUnhnbkJGU1I2MFNwQUp3YTVvM2hRakpJelEyb0ZXeUd6ajNvNXptcTBkVFp1TlhJa1lFODFTdU5aS25PY0VtczIrdkNWREJoa1ZtMzkrU281d1Q2MWNhaUhSalkrTklQMmg3MEZROW90eVIxNXdSVmE5L2FubXM1SGhXQnJTVHM2amRYbm53djByWHZHand4MmxqY1g5dzhvaVZFUXN4NXgyNjE5TGF4K3dONGtoMFcwdXJuU3BiYWE0UU1Va1hERDY1NlYrVzFzdGNJKzBjTkQzNDRxRitWeXMyZVlhTDhhYnp4OWF2RXQ5SS9tWlVydUlLbXI5dnBtbzZoTEV1K1NXYllWTFk2WjcxNlY0Ui9ZOTFIU3dmTXRZWWlPNDY1cTdyM2hTNStHaFo1N1pwb29Gem5iZ2ZTdkpuTDN2M2FPMk1vOHZMSm5HZUFQMlhMWjdodFJua1NPVThzZXAvS3VUK0xmaC9TUENzTnlzUWp5bVNNZmVhckh4VS9hZDFiUTlMblIwajBpeWNsWWxRQVNUKzVQWVY1Vm92aXlYeDdMY3h6eW1XVzV0VFBBT1NPaFZoK21hMWVIck5lMHFzNTFXZ255eE5mNGF3UGQ2NXFGb3U0c0hXVlBmY3ZiOUtsK05WazkzcG1uS2loV2dkNHM0eVJ2R00vbmlydndtc0Z0Zml4cHlPcm9rOEVTT0QvZUhCL2xYZWZIUHd3ZkROeHAxNFlsK3orVzEwUXlqYmxDU1B6S2dWTktmSmkwMEZUV2pabmwzdzdzTkd0UERHc1djU1BQZDJ0d1N4emhGT3pKQUhmbFJYWk5EL3hUYlhERGV6QkdnT09QTFlINVQ5RHgrSXJ6bjRCbGRRMTIvaGsydC9hTnc1T2VBMmNybjg4MTZSQmNuUWZDNUVpL3U0SkRESVdHUXFkZ2UyRG45S3ZFUzVxN2o1aXBLMU82S2VyNllmR1BoSzVzRndic1JFd2tkWEE1Mi9oWHlScVVWemFlSmhhdEc2c3R3UXk1NVZ3ZUhIcDIvQ3ZzYlJrV1NOYm0zQUhrT0hYbm4zR2F5L2laOE0vRFdnYXhhYXZwK2lqVU5ZMTFnUTgyR3RiVTl5RlBYblAzdTJLN01yeFNwU2xUbWd4Vk55aXBJNWp3TDRhMTFmR1ZoYzJRRnRCOWppMzNEa29oQkJiSS92QXF4empwbXZZZmlYcktlT2ZDVXE2WGVDZlVWVlJKT0I4MTBVUHpJRDNJeHo2KzllQWZINzRuWGsvaTI4c0xIVUF5V2NBam04czdVVmxqQzdVLzJRUjFQSlB0Z1ZxZnN6K01ialViYVRTWG1aWjNCbXQxSXpzbVVESUhzNDQvQ3RzUlJmS3F5NmRET2xPL3VzOGkrUDhBbzd3YXhhU3R0UmJoR2l3T0FHVThqOC8wcmkzcy9zbW5wR3pyOG8rYkJ5TTQ1L1d2bzc5bzM0ZHA0dDhEZjJoRENOa042SkdHTU5HNVU3bDQ0QmJBSHY4QVd2bk82UW5TQyswbzhqa3NyakJCSjVINjE2bUZxeHFVNHVKbEpOVGFaeTkxY0EzN3FvK1ZpZXZXdDN3ekF0Ky9tRXNrU25jNTZCYTUrYUl6WHJaS29BNU9WeVRXN2EzSzJsajVFWXdyc0RJeDY1cjA2a2JKSTJoR3pWemY4TjZuQkpNNGlVSkZFcCtaaGwzOXpXenAxK2srOVRJekt3eGc0TmN4cElXQ0s0amlJTE1Sazl6bnNLMWRHSVYwQmRWSzlTZldrcWNYYyt2d01JVGllZytCN3IreXRkczVJV0JsV1JGSXh3UVdBcjNyUUx0ZFMxMnpoaWtWcGJjSVdRTnlPRHovQUMvS3ZuTHdZWXYrRWx0RmpaM0lsUWs0eC9FSzlDbGh2TEx4aTEvWVhFcVRHRlZqd2VjN2h3ZlVZcnhjZFFYdGRleGppcWZzcDZIMTk0UTFsdFQ4R1hoTWU0SytDTWNLdVQvTGl1MCtDWGk4NkpieVcwcEVsdkd4WXJqZ0FubjlmNTE4cWZzMC90RlgxNTRqdmRLMVNETU54RE1VZE9DU056QmNkQ2NDdlMvaForMGQ0WTFEeGpiMkR6U1cwazh4dHpIT2hVTm5qQVBTdkF4V0NsRzdTK0hVMG8xb3R0SHIvd0FXdmg1cG1vNnVtdGVIMmp0THduTnhicnhIY0QxeDBERDE3MDNTdDR0a1IxM1o3SHRXWDRrbUhoM3hCTlppNUxxaERLVmJrcVJsVCtSRmFXaW8xN0NTczQzUDBQcFdjVkoya3pzZzRwZTZ6cXRQRVZuc1JsSlRBSTllUm10S3gxSVJ1Nm9UZ2Q4ZEs1S0c5bXRraFNkaTd4RXJrZGgxL3FhMEJxZzJnRWxTZVJpbm90VFZ5bHNiOG1yekpjUkFFN1J3RFQ3elUydG84aHdDZWF3L3QvMnJCM0RLamlzelhOYk5uYXNXWUVMWE5VYmV3azBucWVTL3Q4ZU5UYytBYk93V1FsNVp3NUFQcFh5VmIzclFHVDVsSmNEN3ZKT2ZldlhmMncvRlQ2bmYyNkJtVUkrQmpuRmVHTGV5U1FFWWJhcEdmOEsvWU9DS1BzOHZ2M2JQdk9FNmlqaDVTWFYvNUYyVzhNS0tyN0hjNUhQelk0NzFGb3lHUnJsbFV1cXhNQUF1NGRQVHYvV3FFdDBjNTZLTUVoZnZad1RtbldOeEsybnpLU0hEamJ0ZkpISkhwelgyYTduMWNhdDVIUlMzQVR3bVVDb1hURzVkcFVnZ2ZrZndxanBPcE1ib0FGeStGK1plUTJPMzlLVzRsV0x3ekl6TmpNdUFOeHh3TUhyeitIYXFPZ08wYlJrRGVIK2JMTm5hUGJuMXEyZFU2dnZSUjAzaUNIN1pvVHgvTVM2N3RwN0N2SDVabjByV1NNQWxEeGs1QlA4QVd2WHI2N0FzQ3d4OHFrRUhyK0FyeS94TlpNMnNPZ1I1R3lXQUNnazQvcFdkYVBVNGM1VzAwZXAvQzdXUnF1a3RhT0FnbEcwcnR4ZzQ2MXpYanZ3OS9aK3FGZGhBaTVVNXlXTlEvQzdXVmh1QUEvSjR4azRydGZIdGlOUnMzbmp3U0FNSEdUeU1WY1Z6UlNPeW0xaU1JbjFSeVBnL1dpa3lLMk1qSEdBVkpIYjJyZDFheUYvNXJJcFVMMDJudWV1Zld1UXMyUkw0bkpTVU1NSDdweFhZcGNxYlF5c1FXVWpvTURwL244NmNGb1JoS251T01qSzB1Qm81bVh6Q1NlQ1IvRVI3ZHEwSnJUKzFOR2VBTmhwRUlJSTZpa1NKSHVvM1lsV0JZS2V3SHJrVmR0bUZtNUxaSUJ4bk9RUjZacTlEb3B0V2FQQ1BLYlR0ZkNrT0doY3FUMzROZXdXR2twNDY4Q1htbk1RelRRRXJuR2R3NUI5ZW83MTVwNDlza3N2RkV6S05vWjk0eHpuTmVnZkNiWEN0L2JvWDVVYmVDY0hqMzRINEd1ZWxIVm84TExrbFZuUWx0SzZQRWJDMGw4UGF1eXNHalpHd1IwNUI2R3ZvUDRTNjYxell4aGl3YmdBZ2cvblhCZkh2d3BGbzNqSXp3b0ZpdXo1blRnSHZYVC9DaG10N05SaG1RRDB5UDg5UHlINEdIZzR5YUt5aWhMQzRtVkxvanZ2aWI0YmgxL3cyOGdRRWhmbStYQVArQnJ6L0FPRldueTJmaUZveXY3dFdBQUhRZmhYcmtjQnYvQzl4R1FqRUozNTZlMWM1OFBmQzRzdFVrbGtjblp6MDRBejJOZGlqMVBwcTlGT3BHb2R4ZEZQc2NTWUpLOUQzcjJYOWxUNGRuVWRST3F6eHMwYUhFZTRaQmIxcnkzd040YW44Y2VKSWJhQlM1a1liampoRjlhK3kvaGI0Umg4T2FWYlcwTWFxa1NnZlUrdGZJOFY1dDdDaDlXcHYzcGIrUy80SjhyeGRuWHNLSDFlbS9lbHY1TC9nbm9IaGJRMWp0d3dVQmdPbGI4Rm1TNnlFRU12YjFxSFJBc0VRSUJHYXZ5eUtpN2hqRmZtVVlINDVVcXR2VXQyR3BGU0J5Q0tOVDFieTRpR2JPS3piaWRZL21EYlZITmVGL3RxZnRlYWYremI4T2JpL2IvU05SbVVwYXdCdVhmdFhUUnB5azFHS3UyY3pwdXBLMFRmL0FHZ2YybXZEM3dSMFNTNzFqVUliY2dIWkh2Rzl6NkFWK2R2N1ZuN2MycGZIOTJzTFl5V1dnQnZ1YnNOS1Bldm1yNHMvRy94aDhhL0d0enJmaUM2bHVXbGN0SENXT3lFZGdCV0xwZXEzdXU2Z2x1eXVxZzlLKzN5bkpvVW1xbFpYbDI2SStreVREMDRTVXFzWGZvbWoxelFMQzBuYUZZVlVidVRnVjExeEdzZHVxSVRrZE1jQ3NId1hZd2FQWklaU0dsSTllbGFOOWNFWlZXSkI0enhYMlVFZnJPRlNVRXcrM1BId1NOcTgrOU9GK3JvV3lDUHJXRmVYclJra2toVG5tcXlhdVE1VVpKYm9LcVVyRlZjVkdDYmIwTjRTRyt1U0ZHRlU1UDhBaFJEcHR0cWwrRGZJbTBIQ2x1bFE2ZEl0bFpzN1NLcEF5MlRqOEt6UDdUSGlLNGFHRjNSZ2NiaDBOY3ptcjh6UDVUOFYrTTVabmlmN1B3a3IwNFBXM1YvOEFzZVA3T1R3Z2tkNXBMSHkwT1dWVDkwK29yMEw0SmZGeTcxdlRsdjFuZUs1dFI4MkQxR2NjMXh0OVBEcC9ocHJVUnZjeXVwQnp5ZUJWSDRZK0d0VjArM21LUXRiUnpnZ0Vqc2E0NnFibGVLMForVVVKSkxsYjFSN3Rwbi9BQVVvMXJRdkZNT2lSUlBNVmJhemJ1QjcxNzU0Vi9idmp2ZkppdVVKWnNCaWVjVjhWK0VmZ1BERjRodWRVdWJqTWttQ2VlQml1cTBrUldONDBjTEZnaDZtc1Zsc3FrdGREdFdieXBMUjNaOTkrRS9qZHBYajZaWWJlUlBOWWRBYzRyb0xtQUU4Z2RQenI0OC9aajF4cmY0aUk4ODNsUXJnSEp3T3RmWUZwcTF2cVVSYUtWSkFPNE9hNHNmaDFRbW94WjlUaytPbGlhUFBKV1puWGxubk9CeUtvVDI3RVpVNHJlbVZXVTV5TTFSbXRnU1FBVG11QnpQVWxDNk1hY1A1YlpCNHJDMUc4WlNRZU1WMTF4YWxWeUFPbGN0NGowODUzRGpKcWZhV09lS3RJM1ArQ2NHci9EejREMjV2TllndHBkYW53Uks2Z2lFZWk1NmZXdS8vQUdxUDIzL0RtbzM1aTB3UitTaWt0S0J1TGV3cjgxLytFdTFzUklvbmtTTUg3NGJyN1YxRWR5dG5vbjJqVnpOZVRFWmpoVWhWVmZldmc0WnJQMlRvMU5ibnFWTXNwKzFWWmJuclBpTDl1aVRTTGhSYTJTeXJJUzI4Z0VoUjNxOGYyazlKK0pYaFV0cVVLMjhreDJSaDhEZWErVlBIK3RTNnhmV3NOaGJMYlJ5TVE2cDk3MEEvclhQWGV1M2VwZkZ6UzlHdGhjU1E2YkNkNlJnczBqbnFPUHdyaGhnbzFaZnUvVTZaVlZCZThqcmYycGZESjF2ZktvRXNiQUdMQndxalBGY2I4SnY5R3ZkTW1WZGpXcGEza0I0QUJZREg2MTZOOFdQRVVTMlZsYW1NU0M2VHlXR2VZbUl4amp1RFdMbzNnaHRKOElHNGFTT09hTzkrY25PY0tBZjFHSzBWV1NwZXltUzR4NXVkSFdhSnBaaStNSGhWQUVCdUxwRUxLTURhWDQvU3ZXZjI3clZiSDRTNlNzVWF4dE16MnhDL2ZiYTVZRDg4VjVUNGN1eStxYURxN1B2V3d1U3JjOEtReElQNUVWNjk4Y05ZZzhUL0FBL2ptdUpFYTNzSldtUmY5b2pwOUNjSDhLODFLU3hFSkcwa25TYVBsVDRUd3hhUDQvaXNZNVEwMXEwS00zKzJRenQvU3ZvWHgzNEoyQ2F4WklsaHZZbUxPRjNCdm00WWZSV1UxODQrQUxaTkI4YWFWcVY1SUVmVTlXbUJ4ejhvQ3BuOHlmeXI2dThTWGNGNWVhWENnRFF5UmtBOTMzSmpqL3YzVzJOcHlwVmxOZHIvQURRcUVsS052VThsOERhdEZkM043cHFLb3VMUWJYSVhHL0krOFBiSUkvQTFOOFJNcjhJNGRVdzBqYUhLNVVCdHBkaU1BSDJ6ZzFpZUU5RXZOSytPMnRXMlMxc0lUalAzdm1Zc3Y1YnE2RHgxRVI4RFBFc0RsWE1NY2pKdk9BR0hKUDhBVDhhNlo4c3NWR1MrMWEvekU1WG92eVBpanhYNHBtajFXNU53WEp1UUE3ay9lSndTZmZrVjIzN1BQaks1MHJ4TEN3QmZ5eHZqUDkwOXNIdURYS0o0UHVmSFVJT25vcnNNSHkxL2VFanAwQU9UWHAzZy93Q0hrWHdtOEt5NmpmRll0UWRjaU0vZFRIUUFIdnpYdVpwVGhUcDhqM1p4NFNibTdyWStnZkd0dlorSWRCdjNpQ1RhWDRtdE15Ull3WXB0dTdQcy93REVQUTRyNUIrSnZoMTlQdHB5QUlwNDIvZWc5QzNUUHNDUm44YStqL2c5NCtYeGY4TkwvUzVXVnIyeWtOMUN4NVlna25hUFVaUEZlZGZIcnd3dC9kckRDb0Rha0ZZREdQdmpiajJBWUN1REs3MDZycFBhNTIxSTgxbWZOa0ZuZFMzQ2h0cFFrWXdjaXRHMmk4bTdLeUVLRy92SEZOODU3VkFpZ3hiRHlBT2FsaXRoTko1eEJLcHljOS9hdnI2dFBTNXRLZzR4VXpVczRsdDVXZFh6bmJrQVovSDYxcVdLdzNFeFJ5eElHVDBYR2VjbXMzdzFHYmkvalJoa3l0c0FJNjU0L3JXaEhaZjJ0YXJDQ2dsWDVSamdrZjQxZzROYXhQYndTbXRhWjEzdzNLVCtJSVVWTUpFNVlzZnZFaFR6OUs5MytHVnZiYWxyRnZMS2dZY0hIcFh6MzRPMGlYU0xxY3EwcG1DTnVYSnlDM2I2NHIwUHd0NDhuOEU2blp5S0htdDMyUnVySHB6alA1VjVlTHdzcXM5TnpzcVFuVm5zZlVQdzIrR1BoaWJ4ZFpYWXRZbG5nbERBak9RZWhQNVY2UzM3UGZoTFNkV21EYWZCOW9pbFloZ09jNTYxODFmRFg5cUhRTEh4QkVibDVvSFdUSHpJUVY1cjJuNHhmdFhlSE5FdjdmVlgxQm80TlJ0SXJtTkVpWnk2bFFDZU8rNEd2R3JZTEV4bW9xK3FOSTBPV1NUaTFmeU96OGYrRkxUWDJXNGhKaXZkUFJZTWhzZWJIMVg2a1p4bXNhMjFUL2hHWWw4eDJVSHA2WnJ5elV2MnU3S2Z3MnVxMk50YzNjYzg1Z1VTRUlNN2NxVDlUdUZjYzM3ZHRwcnkvWjduU1RDNm5CNUQ0OS9wVllYTDYzTHl0WHNVcUZTMTR4MFBwR0x4UWRSUlhVZ2dIMXdhMExUVlcySEk1UFRucFh6anBuN1Y5cEhDRkZ2SXFqcDh1QitsV3B2MnZMU0ZNcmJ6U09UMEF4L09xbmxWWnUzS2FRdzlkNktEUG9xYlZQczBhaDNDanFlY1Z4bmp2eDhqRHlJNVFSbm4wTmVFNnArMWhkWDhoUDJOMVVmZFhlQVRXYkQ4ZWJQWHBzU2lTMllkbjZab2psTlJhdEJYd21LaXJ5Z3loKzBWckxYTnhibFNGTy9nOGMvajJyeXVlN1ZyZmFxaVFrODg5YTdQNHM2d05YampFZTJZSE9jYzE1emNYQ3E4bVBtQkhETHgwSGNWK29jTTArVEJSWHFmWmNOVHRoRS9ObDE1Mll5b3hZT2ZtR09jY2NkZnhxeHAwNlBZc3hLb1drUVl5UWNaOWY2VlNnbEsyeVRzQVdLRWNkKzNPTzJLazg0YWZEQ25CK2RjNFlxU1FDZng0cjZLSjlOQ3BaNm0vcjB4azhLb1ZjNzVHYkozN3Z3RlplbFhQbFNSRXNyTXhJSFhqMnhWbldHQ2VHclp1TVNTTVQwNDU5cXc5SXVDSjFFaExzTWpBUGZPQitYOUtvNktsWlJuRTdxOFpaOUxMSzRLQW5jQ3ZUMS9XdUgxSWlIVTVKSkZESVZaQmdZYmNlTzRyc3RPa1dTMVZkd2xJUmdCMFAxOTY1cldyZGlxa01BVnlkM0J6VG1rMVkyeDFxbE14L0NsNCtuYXRHb0pDN2lTYy80ZHE5WDBtOGkxYlRXZ0x3OG9lNU9lUFQ2L3lyeU9JRlhCeVF5dDJCNDVycVBDL2lFUUt1OHNHWm1KeGtuNllwMDMwTWN0eEhzN3dlekgzMEEwdlVaSVpRUWpPU0NRR0FCK3RhMXZJc3NJUkpTRVE0NFBRRDlLWFhvbDFtMFM0WGFKRkdDVlB6RDJ4NjFRakxMTklpaGVSZ0FZeU9PdFcxWTY1eDVKTzJ6TEduM0tMY0FNeTdwZVEzUW10YVdGbXM0L01PU21QVDE5UlhNMjg2bVV1UXdBQUczMCtsYm1qM2h1Ykl4c1F6TmtnOWhqK3ROV0xvMVU3bzRMNHMyb090S1FvQ3F2QjZWSDhNZGFOaHFjU015cUEzUGJkeDN4V3g4UzdJM3N3a0lJUk9PZXRjVlpCclBVMGRBYzl3T3RZTldsYzhHdE4wc1Y3UmR6Mno0cmVIby9GL2hxem1WUTBnT005d2ZxTzMrRlV2RHVqSFE5SVNXUWxSMHdEZzVIUWoxeUsxUGhwcTY2L3BNZHJKdVpUd08rRFYzeGhiTzh3aVVBd29SanQwNjEweFhVK2xhaksxZU83TmJ3anE1K3hTS1NDR1RHVDA1cS9ZUm1lUklyZFE3U3R0d09hNTNSV1AyYnk4NXgrQUZla2ZCUnJHRFU0N2xaSXBwNDN3aEdDcStwK3RjdU54Y2FGTnpsdjBSMFVaeXFXaWV6L3M3ZURyZnc1WmlWMEJ1NXNieVJqYjdWOURlRzlxUUl3SXpYbFhoU1cwMWFWWkVLeFhCN2poVDlhN3ZUTmRPblJpS2I5M2pvYzhHdngvTTVWcDFwVmF1dCtwK1pjU1pQaXFWZVZXdDd5ZlU5RXN0VVdPSURjT090Rjc0Z1JWd0NCaXVNWHhSRVVKVndLemRhOFpRMkZ2Sks4cXFpZ2xpVHdCWERDVjlqNHFyaEhmVTZEeFA0L2gwZXh1TGllWllZWWxMTzdIQVVZNjErV3Y3Y254MFg0OGZFNmMyOHhrMHpUV01VSXp3eDdtdXcvYnQvYmR1ZkZ0MWNlRlBEVnc2V3NaSzNWd3B3VzlWRmZKMWhxVWtGd0JJV2JKNm5ubjFyN3JoM0tYQi9XYXk5UDh6M2Nrd2FweTlyVlhvYStuNkUxOUlvS2hWWWRjWXFLOTBkZEgxQVNSUmhYWHVLMGJiV1FGVW5JSjR5T3ROdnRVanU0UUhIemV0ZlpxS1ByK1drNDZibW40UjhUQ2RtRWgyc25RZHpXeGNheGdIQkpCNisxZWJhaE1kTW5XNGhrSUFQekR0WFRhZjRwaXV0T1dabVQ1aDgzUFNpTTdhTWVIekZRdlRxUGI4aTVxR3FHVmdxRWxpYXlkUjhYV3ZoNEhld2E0UFFlbGN2NHMrS2x0cFRTUldoRXM3Y2J1d3JCOEg2VHFIai9YRVlJMHJNY2x1b0ZjZFRFY3o1WW40eHgxeDlPcHpZTEFTc3RuTDlFZHZwT3I2bDRwMVJCdWN4TWVFSFlWNko0WDhQWGI2dkZiMnFJamdZSlBYSXEzOFAvQjloNFRzVTN4bDUyKyt6ZFQ3VnNRK0pGaThkMlVGdkNpS3c1UHFlYUsxS1hzM2MvQjZkV0h0VTkzYzdIdzE0SUZuY3ROZG9yc3d5ZTR6WE4rS2ZFVjB1c1NXMXV1eUpDZVFPZ3pXcnF2aWU2MCsrWUdRdkd2M3UxWjlyY3hhM2RTN1ZBZVFkVFhaaEtjVlRTT0xFVkpPb3loSDQwbXRsK3pya2dmZmVwTEx4UkRhWUVlNW1mN3pIcFZ4ZkMwY1NHSXJ5M1UxbmFoNGFFY0RKamFwUGF0MUZyWXhVazl6b0I4U1lkSWlGeEZNWWpHTTVVNEpyMy84QVl3K0tPcCtOeTczTXJpMkJ4R0hPR0l6WHg3clduc1dodElrWnQ3QWtlb3pYMGorejlxc25oVzRzWUlNTHRLaGdQUTE1R1p5dXVXMjU3K1J6VUt2UGZSZnFmWTd5RUVnODU2MURPK0c0TlEyZDU5cHNJcFRrbDBCUHZVZDFMamxjZ0ExOHU5ejlCU0xDdUpSZzRKclAxUFRmdEFJMjV3YW50WnNIMXpWdFFDMlc0QnJHb3ptcXhzejRPdUlFMU85QlJDa01UWVFlL3dEaldxOFhtV0ppRWlsM093ZTVyRmdsYTMweUJJeVU4MGhTUjFHZTQ5NjZqd2JwY056NG1FTWdMSmJ3aGx6MUpKNUo5VFg1dTFkY3g3eldwdzJ2Nk5GNGNpbjFlY2hZckpTVlA5NXV1SytlZkR2am02dmJ2V2RjdEx1ZVBVZDdLUExKRE1wT2NBK3VQNTE3MysycHFzdWc2QUxhMjJSeENNc1JqcWNkNithZmgwZ2s4T3JLU1E4MGhaaU9Na3NhK2d5ZWlsUmRSOVR6c2JOdVNSN0o4SFBHTVhqbUM1MC9VcEVGMHNSYUFuN3dici9PdlNQRVhtcDhOTEtHUUZMcWFSeGdjWkNxQmsrL0ZmUC9BTUxXTVhqQkpGNGR4dUxkK3VLK2lmRzVKbTB5TE9FanN5NEh1YzVyanpDaW9WN3JycWRGSDRMTXIrQnB2dC93dDFlY0Vac0hqblhIUEdOcE5Xdml2NHR1SmZBMFduaVZrRnc2dVQwSFBUUHR4V0I4S0pXWHdQNG9oREh5eENSajZ0bXFYeER1WHVOTWgzbk8zeXNmbUJYTW9XcXIxTFdzR2VhZU45YW1zL0ZPaHh3TVArSmVrUmJ0aVJpWkdKL1A5Syt4TFhYSTlXOE9lR2RUZ2t0NUVoa0NnamxjT0FmNnNQeE5mRXZ4SXVYaThiWFNJZHF0Y2tuSHRrRDlCWDBoOEV0YXVCOEJyVUZneGhpM0tUeVFRUmorZGJacFRYSkNmeSs4bkNTM1IwVnA0Z1hVUGpYSkVzS3NrNEs1QTVYWUgvb0JYU1hQaFNPNStGbXJTejI0a2l1REpGSkd3SjNaeG5qOFBYdlhuM3dRMWVhOCtNcW1VcStXdWp5TTlJNjl6OFVXS1d2d29sU01zb2FLUjg5d1RMZy9vSzhLYzJxMFV2TDlUdlVWN1BYcWZQZGxvVCtCdE5WZEgwQzJpamtIRHBFcUVaOWM1UDUxNWI0ODBIVS9FdDNMSnFyK1Rhb1R2THk3UVB4NDVyM2pWTHVlMDB4bzQ1cFZXUk10ejF4bXZDL2lmR2J6VzI4eDVHSVIzeVQwSVVuSUhRZmhYdlU0dW83OWU1eVNTaXJEUGhONG9zUEQvamFPQ3psTWtESVkzM0xnRUVZRzNIUURyVjM5cFhVSk5OOFRhQmV4RlBzOHR1VmxBWUFNQTRLOGVtY2ZTdVErRXRuSFByaGtJSVpUZ1kvSG42MTFuN1NWaEhORHBhTURpS0NFRG5zM1VWdmhZS09MUzlVYlExaHFmUHV1V1lzdGN1STVBVzJPY0FIR1AvclU2MlVYS0FGa1VKa1l4akkvQ3JQamFJSnFzekFuY2hDNTlSZ2RhaTBMVDQ3bUF5TnVEYmlPRFgyTVh6MHp1b3k1NmRtWGZENk5GTWt3QUsyeDNKd2Z2WTQvWEZUNk5keUNWVnRrM1RFNEdlcE5YZEdzSTU5Uit5dHVFT0ZUQU9NYmhrbjYwcldhYVd6TEJsQmtBblBKL0d1ZWs5R3V4M1paVnN1WHFkSHBsNjFsYUFTYlpaSkcrYkF4d0JqSVBjODFkR3BCVlV5T3doSjh0eU9TbzdIK3RjdGMzVHBjeHhKaEVSQ29BSjlUNjFwZUhyeDV2UGdmRFJHRGRnOWlEa0dvblNzdWM5dDAzRmUxN0YzV1VpZTlqbUFVQ1U1K1grSS80VjN2aUc5WHhGOE1kRWNBeVMyb2x0Q0Rqa0E1NjlzQjgvaFhFNjlHdjlrVzBnVUI0MXdNY2R6L0FKL0N0WHdYZnkzUHcxMUxlUVRiM01aUTl4dVZnZjBBck9vbEtFWkxvenJxWWptcHhsMlpPK29McFh3eWx0d2Qvd0M4V1dNWndUdEo1L0ltdk5ydlVSY2t1Z01jeW5wWFhlS3BtUzEweUVIQ1BhdG4zK1N1QjFCeUxRdURoZ2Nacm93c1Z5dnpaV0hrK1J2dXpzL0FmalpiNkg3UEtBdHhFY0RuTzRZNi9wWFdSdEc0T0FvUFkvNDE0YnBGNUxCckVMbzVWbGtBejdacjFQUnRRbG5kQXpaRERtdDV3WE5ZNmNEakh6OHJOeTh0WDVMSXdZWU9RZW4vQU5hb05YdDBaWTI0V1FybHdEMDlQeHFadFFta2pDbHlRbkE5UldOcU53NEVneURnOWU5U3FkbmM5dXJMN1RLbHJldkxxVXlMSTRqUmNMazVBT2FJYkF5a3VSempHTTlQZitkVWZEN0dUVUw0bmdvbVFSMTYxMHR0RWpXckt5aGdVM2M5YzRyN0RMSS91Rlk3Y3NTblNidGJVeTBuU0MwWUZlUXJKeWNiVFZKYnRnMElJWjNlUWtxdmZqclQ5YUcxbUE0REFaOStQL3JWU2xjcTFyZzRKeWM5K2xkelowMUoyMFJ1YXhxV05GaGlDbFhjRnZUbjEvV3FtajI0Vm93Q1E0Sno5S2gxT1ZwWUlISjUyRWZoNmZyVnJUZjNOcEZNQmx5ZHB6MElJcW91NkxVK1pxNWF0TmJrc3dZbGNnb1FRU2VEN1ZZdm5TK1VrT0I4dkl4eU0vNTdWemQ5TzhkNlZERUFIQXEwbDQ0bGhVRUFOd2NmbG1xYnNid3J1M0tTWVdRNzJLbFQ4dkl4bjFQRlNXMGNrRndzZ1lseDh4N2x2YXEvbWtPcWtCdHhJSk9jbm1sOHhsTHB1SkhCNTYwV00zS3p1ZE5aYWtoalpuWUtHTzdaZ2pCTk9tY3l2dXgwTEE0SkhHS3g3T1ptU1VzZHhISFBOYU5yZXU5bUhPM0orWHBrVmZOb2RjY1Eyck1rV2RWaVpBUUhibHVoQnEzcEVxUWJpeGRRM1B2OUJXYmNONWNpS29BeUc1N2pqclZsd1dsakJKd0Z6K09EVFd3MVV0cVIzSUY4SjQ1Rk1rYlpLbklINGZTc3h2Q0tMTUdDc2lrOGNldjg2MjFnVmlqRVpMNUpyVU9FU1FnQWtBQVo3VkxWMlpWRXB2VXNlQWJiL2hHSURJU1N4SXdCMC96bXRVelM2M2VzcXE3U000eGpCQXFqb3FpOEtJK1FyTUFRT0s5TDhNYVBiMkRYTWtVYXExakdHanlBY2tucWZXdWJGNDVZZU8xejBzSW5LMEl2UXFOOExacm53ektobEtYTXE1bEtmOHNWOVA4QWVOY0pvMm42ajhNZFgzVzRtZUJHeVltUDNCMi9FMTlBNlZHSTVCRmtzb2dGd2M4bDNQYyt1S3dmSG5oMjFWQzRRaGlOeFBjazlTYStRcjRxZGFmTk5udVBDeFVVNDdvM1BoUDhmTE9hMVNPZVlSU25ncXh3UWNWN040SStKMWxyNnZaenVzc1RqaHQyU3YwcjR6MVRSYmRKSFpVS3NNa0VISFE4VnErRWIyNzB4bGEzdmJ1SmsyZ1lrOWV0Y2M2S2xveUtsWlRwdWxXaXBJK3ZZZEkxS3k4VlFtTFVJYm5TSmo4eW5Ja2ovR3N6NHY4QWdiVmZFZmxRNlBxa0MyWlAra1JzZm1jZHhYaCtoZU90WXVKbGprMUs2ZEJ4Z3ZUZmlsOFROWThFZUdIdTdDNUtUbGM3bXkzOWFpamx0SzYwUG1jWlJ3YXRKVWt1VStWLzJpZkNTZUUvaTVxVm1GWElZTTNwbnZYRkd6RE9EakpCNjlxMVBHSGltKzhYZUlycS92NWpQY3p0bDJJNjFtU1NNaHdEZ1ovclgzZUhqeTAwbjJQRDkyVjVXM0h0dGdVc0dCenp6VmE0dlE4WkFPRFZhOHVuWThuZzFIR3UrS1Z5U1NneVBTdEpUc3JubDQ3R3FqQnl0c1ZkWDFTSzBnWnBtQ0tlb1BVMXhHcWVNcmlkSGd0bmRJangxN1ZCNG0xR2Evdm5FamtnSEFBNEZWTGFKUmJzK1Bteml2S3JWbk4rUitGOFE4VzRqRjFIVHArNUZhZWI5Uy80YTBLVFdyMVV3ektEbDJ4bkZmUlB3cjBPMDBMdy9pSlZobEF5V1BGY1A4RzlEdHZzc1pNWVlzTWtucVRWbng5NGl1N0M4ZUNDUVJSS1NBRkdPOWRHSGhiVS9Qc2RQVGxmVTlUdFBFdGpZc2Z0TjVId01jbXM1ZkYybHkrSVlKWUx1TlRFM1U4bHVjMTVCcGRyL2JhR1c1a2xkcy8zc0N0eDlNaDAxSTVZbEljRGpQUGF0NTFOTE04dUZPTjdvK2t0TzhLUitLTFF6eFhVYlR5NE8wOERIOURUSXZDRTFqTS83b0pJdlZhOE4wcngvcTFwQXp4WGJ4dkFnS0ZlQ1BiNlY3eDhLTmZ1dGI4T1dzOXpLWlpHUVpKNzBZZU00eXMzZGRQSVdKVk5xNlZuK1pRMURVNXJjckNWQ2tOZyt0UStJRWtrZ1F4RXNTTWRhMTlhdGttMUNRc295M1dxVUZxdjJZbkxaVWpITmR5ZWh3MjZuTitIRWFmeFlva2pMR0VET1JrZTllbmZEWFdEcGZqcXlqSkRGbjQ2OGowcms5SmlTMjFUS0lvWXRrdDNPYTMvQUF1Zy93Q0ZqYWZ4MGsvcFhCV2h6U2twZGoxY0pKeFVMZDBmYytpc0p0R3RTQUFHakJGTE9wM1lHTUdrOFBnZjJEWjQ0eEd2OHFuWkF6RUVjQ3ZrcHE4bWZwMGZoVElJTWhoMUFKclJTSWtBOG1xOXRFdTdwME5iRnBDcndCaU9SV1U2ZHpuck5YUC8yUT09IiBzdHlsZT0id2lkdGg6IDIuMzMzMzMzaW47IGhlaWdodDogMS42MDA3MWluIiBhbHQ9IlNhbXBsZSBQaG90byIgLz48L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTAiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTW9udGhZZWFyIj48c3BhbiBjbGFzcz0icHQtTW9udGgiPkphbnVhcnk8L3NwYW4+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxMSI+IDwvc3Bhbj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIj4yMDE0PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDA1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRhYmxlU3BhY2luZyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwNiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1UYWJsZVNwYWNpbmciPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDYiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAxMiI+PHRkIGNsYXNzPSJwdC0wMDAwMDIiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9TcGFjaW5nIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA0Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vU3BhY2luZyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1UYWJsZVNwYWNpbmciPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDYiPiA8L3NwYW4+PC9wPjxkaXYgYWxpZ249ImxlZnQiPjx0YWJsZSBkaXI9Imx0ciIgY2xhc3M9InB0LTAwMDAxMyI+PHRyIGNsYXNzPSJwdC0wMDAwMTQiPjx0ZCBjbGFzcz0icHQtMDAwMDE1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURheXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTYiPlN1bi48L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF5cyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNiI+TW9uLjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXlzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE2Ij5UdWUuPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURheXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTYiPldlZC48L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF5cyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNiI+VGh1Ljwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXlzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE2Ij5GcmkuPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURheXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTYiPlNhdC48L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAxNyI+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTkiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTkiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTkiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjE8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjI8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjM8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjQ8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAyMSI+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMTciPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj41PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj42PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj43PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj44PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj45PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4xMDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MTE8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAyMSI+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIyIj5MaXR0bGUgTGVhZ3VlPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIyIj5KYW5l4oCZcyBCaXJ0aGRheTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDE3Ij48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MTI8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjEzPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4xNDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MTU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjE2PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4xNzwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MTg8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAyMSI+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMiI+UGFyZW50IFRlYWNoZXIgQ29uZmVyZW5jZTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMTciPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4xOTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MjA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjIxPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4yMjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MjM8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjI0PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4yNTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDIxIj48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjIiPlJ1biBmb3IgTGlmZSA1Szwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDE3Ij48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MjY8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjI3PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4yODwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+Mjk8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjMwPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4zMTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxOSI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDIxIj48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAxNyI+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTkiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTkiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTkiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTkiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTkiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTkiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMTkiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAyMSI+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRhYmxlU3BhY2luZyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwNiI+IDwvc3Bhbj48L3A+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDAwIj48dHIgY2xhc3M9InB0LTAwMDAyMyI+PHRkIGNsYXNzPSJwdC0wMDAwMjQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm90ZUhlYWRpbmciPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjUiPm5vdGVzPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDI2Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vdGVzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDI3Ij5UbyByZXBsYWNlIHRoZSBwaWN0dXJlIHdpdGggeW91ciBvd24sIHJpZ2h0LWNsaWNrIGl0IGFuZCB0aGVuIGNsaWNrIENoYW5nZSBQaWN0dXJlLiA8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm90ZXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjciPlRvIHNlbGVjdCBuZXcgZGF0ZXMgb3IgY2hhbmdlIHRoZSBjYWxlbmRhciBjb2xvciwgY2xpY2sgdGhlIENhbGVuZGFyIHRhYiBvbiB0aGUgcmliYm9uLiA8L3NwYW4+PC9wPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm90ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjciPlRvIHRyeSBvdXQgYSBkaWZmZXJlbnQgc2V0IG9mIGZvbnRzIG9yIGNvbG9ycywgb24gdGhlIENhbGVuZGFyIHRhYiBvciBEZXNpZ24gdGFiLCBjbGljayBGb250cyBvciBDb2xvcnMuPC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRhYmxlU3BhY2luZyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwNiI+IDwvc3Bhbj48L3A+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9UZXN0RmlsZXMvVDE4NDAuaHRtbCBiL1Rlc3RGaWxlcy9UMTg0MC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MWExYzkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvVDE4NDAuaHRtbApAQCAtMCwwICsxLDMzNSBAQAor77u/PCFET0NUWVBFIGh0bWwgPjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz48dGl0bGU+PC90aXRsZT48bWV0YSBuYW1lPSJHZW5lcmF0b3IiIGNvbnRlbnQ9IlBvd2VyVG9vbHMgZm9yIE9wZW4gWE1MIiAvPjxzdHlsZT5zcGFuIHsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9Cit0YWJsZS5wdC0wMDAwMDAgeworICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisgICAgYm9yZGVyOiBub25lOworICAgIHdpZHRoOiAxMDAlOworICAgIG1hcmdpbi1ib3R0b206IC4wMDFwdDsKK30KK3RyLnB0LTAwMDAwMSB7CisgICAgaGVpZ2h0OiAwLjIwaW47Cit9Cit0ZC5wdC0wMDAwMDIgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDM1LjUlOworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgYm9yZGVyLXJpZ2h0OiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjODhDNTg5OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQorcC5wdC1Ob1NwYWNpbmcgeworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDhwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LTAwMDAwMyB7CisgICAgY29sb3I6ICM1OTU5NTk7CisgICAgZm9udC1zaXplOiA4cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Cit0ZC5wdC0wMDAwMDQgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDY0LjUlOworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgYm9yZGVyLXJpZ2h0OiBub25lOworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiAjODhDNTg5OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIHBhZGRpbmctYm90dG9tOiAwOworfQordGQucHQtMDAwMDA1IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAzNS41JTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0ZGRkZGRjsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK3AucHQtVGFibGVTcGFjaW5nIHsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIGxpbmUtaGVpZ2h0OiAyLjBwdDsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMnB0OworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtMDAwMDA2IHsKKyAgICBjb2xvcjogIzU5NTk1OTsKKyAgICBmb250LXNpemU6IDJwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RkLnB0LTAwMDAwNyB7CisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB3aWR0aDogNjQuNSU7CisgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogNS40cHQ7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUuNHB0OworICAgIGJhY2tncm91bmQ6ICNGRkZGRkY7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgcGFkZGluZy1ib3R0b206IDA7Cit9Cit0ci5wdC0wMDAwMDggeworICAgIGhlaWdodDogMS42MGluOworfQordGQucHQtMDAwMDA5IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAzNS41JTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0Q3RUJENzsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQgeworICAgIGNvbG9yOiAjNTk1OTU5OworICAgIGZvbnQtc2l6ZTogOHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDEwIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworICAgIHdpZHRoOiA2NC41JTsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIGJvcmRlci1sZWZ0OiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogI0Q3RUJENzsKKyAgICBwYWRkaW5nLXRvcDogMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKK30KK3AucHQtTW9udGhZZWFyIHsKKyAgICBtYXJnaW4tdG9wOiAycHQ7CisgICAgbWFyZ2luLWJvdHRvbTogMTJwdDsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiA0NHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtTW9udGggeworICAgIGNvbG9yOiAjMjM0ODI0OworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogNDRwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIHsKKyAgICBjb2xvcjogIzM1NkQzNjsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDM2cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Cit0ci5wdC0wMDAwMTIgeworICAgIGhlaWdodDogMC4yNWluOworfQordGFibGUucHQtMDAwMDEzIHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIGJvcmRlcjogbm9uZTsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAuMDAxcHQ7Cit9Cit0ci5wdC0wMDAwMTQgeworICAgIGhlaWdodDogMC40MGluOworfQordGQucHQtMDAwMDE1IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgIHdpZHRoOiAxNC4zJTsKKyAgICBib3JkZXItdG9wLXN0eWxlOiBub25lOworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjODhDNTg5IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogIzQ3OTI0OTsKK30KK3AucHQtRGF5cyB7CisgICAgbWFyZ2luLXRvcDogMnB0OworICAgIG1hcmdpbi1ib3R0b206IDJwdDsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxNHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE2IHsKKyAgICBjb2xvcjogI0ZGRkZGRjsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDE0cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Cit0ci5wdC0wMDAwMTcgeworICAgIGhlaWdodDogMC4zMGluOworfQordGQucHQtMDAwMDE4IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHdpZHRoOiAxNC4zJTsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjODhDNTg5IDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogc29saWQgIzg4QzU4OSAxLjBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjODhDNTg5IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjODhDNTg5IDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7Cit9CitwLnB0LURhdGVzIHsKKyAgICBtYXJnaW4tdG9wOiA2cHQ7CisgICAgbWFyZ2luLWJvdHRvbTogMnB0OworICAgIG1hcmdpbi1yaWdodDogMC4xMGluOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKK30KK3NwYW4ucHQtMDAwMDE5IHsKKyAgICBjb2xvcjogIzI2MjYyNjsKKyAgICBmb250LXNpemU6IDEycHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCB7CisgICAgY29sb3I6ICMyNjI2MjY7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxMnB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordHIucHQtMDAwMDIxIHsKKyAgICBoZWlnaHQ6IDAuNzBpbjsKK30KK3AucHQtTm9ybWFsIHsKKyAgICBtYXJnaW4tdG9wOiAycHQ7CisgICAgbWFyZ2luLWJvdHRvbTogMnB0OworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogOHB0OworICAgIGxpbmUtaGVpZ2h0OiAxMDglOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIyIHsKKyAgICBjb2xvcjogIzU5NTk1OTsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDhwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK3RyLnB0LTAwMDAyMyB7CisgICAgaGVpZ2h0OiAxLjAwaW47Cit9Cit0ZC5wdC0wMDAwMjQgeworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgd2lkdGg6IDMyLjRwdDsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAjODhDNTg5IDEuMHB0OworICAgIHBhZGRpbmctdG9wOiAwOworICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1LjRwdDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAjODhDNTg5IDEuMHB0OworICAgIHBhZGRpbmctYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjODhDNTg5IDEuMHB0OworICAgIHBhZGRpbmctbGVmdDogNS40cHQ7CisgICAgYmFja2dyb3VuZDogd2hpdGU7Cit9CitwLnB0LU5vdGVIZWFkaW5nIHsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMThwdDsKKyAgICBsaW5lLWhlaWdodDogMTA4JTsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyNSB7CisgICAgY29sb3I6ICM0NzkyNDk7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiAxOHB0OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQordGQucHQtMDAwMDI2IHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgIHdpZHRoOiA0ODIuNHB0OworICAgIGJvcmRlci10b3A6IHNvbGlkICM4OEM1ODkgMS4wcHQ7CisgICAgcGFkZGluZy10b3A6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjODhDNTg5IDEuMHB0OworICAgIHBhZGRpbmctcmlnaHQ6IDUuNHB0OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICM4OEM1ODkgMS4wcHQ7CisgICAgcGFkZGluZy1ib3R0b206IDA7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgcGFkZGluZy1sZWZ0OiA1LjRwdDsKKyAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKK30KK3AucHQtTm90ZXMgeworICAgIG1hcmdpbi10b3A6IDNwdDsKKyAgICBsaW5lLWhlaWdodDogMTE1LjAlOworICAgIG1hcmdpbi1ib3R0b206IDNwdDsKKyAgICBmb250LWZhbWlseTogQ2FsaWJyaTsKKyAgICBmb250LXNpemU6IDlwdDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitzcGFuLnB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyNyB7CisgICAgY29sb3I6ICM1OTU5NTk7CisgICAgZm9udC1mYW1pbHk6IENhbGlicmk7CisgICAgZm9udC1zaXplOiA5cHQ7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9Citib2R5IHsgbWFyZ2luOiAxY20gYXV0bzsgbWF4LXdpZHRoOiAyMGNtOyBwYWRkaW5nOiAwOyB9PC9zdHlsZT48L2hlYWQ+PGJvZHk+PGRpdj48ZGl2IGFsaWduPSJsZWZ0Ij48dGFibGUgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDAiPjx0ciBjbGFzcz0icHQtMDAwMDAxIj48dGQgY2xhc3M9InB0LTAwMDAwMiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob1NwYWNpbmciPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9TcGFjaW5nIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0icHQtMDAwMDA1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRhYmxlU3BhY2luZyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwNiI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAwNyI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1UYWJsZVNwYWNpbmciPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDYiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAwOCI+PHRkIGNsYXNzPSJwdC0wMDAwMDkiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9TcGFjaW5nIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPjxpbWcgc3JjPSJkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRU2taSlJnQUJBUUVBM0FEY0FBRC8yd0JEQUFJQkFRSUJBUUlDQWdJQ0FnSUNBd1VEQXdNREF3WUVCQU1GQndZSEJ3Y0dCd2NJQ1FzSkNBZ0tDQWNIQ2cwS0Nnc01EQXdNQndrT0R3ME1EZ3NNREF6LzJ3QkRBUUlDQWdNREF3WURBd1lNQ0FjSURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXovd0FBUkNBR01BazhEQVNJQUFoRUJBeEVCLzhRQUh3QUFBUVVCQVFFQkFRRUFBQUFBQUFBQUFBRUNBd1FGQmdjSUNRb0wvOFFBdFJBQUFnRURBd0lFQXdVRkJBUUFBQUY5QVFJREFBUVJCUkloTVVFR0UxRmhCeUp4RkRLQmthRUlJMEt4d1JWUzBmQWtNMkp5Z2drS0ZoY1lHUm9sSmljb0tTbzBOVFkzT0RrNlEwUkZSa2RJU1VwVFZGVldWMWhaV21Oa1pXWm5hR2xxYzNSMWRuZDRlWHFEaElXR2g0aUppcEtUbEpXV2w1aVptcUtqcEtXbXA2aXBxckt6dExXMnQ3aTV1c0xEeE1YR3g4akp5dExUMU5YVzE5aloydUhpNCtUbDV1Zm82ZXJ4OHZQMDlmYjMrUG42LzhRQUh3RUFBd0VCQVFFQkFRRUJBUUFBQUFBQUFBRUNBd1FGQmdjSUNRb0wvOFFBdFJFQUFnRUNCQVFEQkFjRkJBUUFBUUozQUFFQ0F4RUVCU0V4QmhKQlVRZGhjUk1pTW9FSUZFS1JvYkhCQ1NNelV2QVZZbkxSQ2hZa05PRWw4UmNZR1JvbUp5Z3BLalUyTnpnNU9rTkVSVVpIU0VsS1UxUlZWbGRZV1ZwalpHVm1aMmhwYW5OMGRYWjNlSGw2Z29PRWhZYUhpSW1La3BPVWxaYVhtSm1hb3FPa3BhYW5xS21xc3JPMHRiYTN1TG02d3NQRXhjYkh5TW5LMHRQVTFkYlgyTm5hNHVQazVlYm42T25xOHZQMDlmYjMrUG42LzlvQURBTUJBQUlSQXhFQVB3RDdyTWFTbkdPbGF1aTZiR0NDUlhNYU5yU1hLS1NRU2U5ZExwMnBvb1VidXRmWVRzdFQ1K2xOeTBSMkdrS2tDQWpBMjFwTHFRSndEZ0d1VlhXMVNOUUdxenAyb0c0WUFra0dzcFZEb2hocjZzNnVDNURBY2s1clYwNVJJcTVCSU5jN3B4TE1vejFycGROQWlRTXhBRll0aE9LaWk4SUZXTWtqbXMvVUpWaUJPQnhWcWU5WGFjRUFDdWYxelVncU56MUhyWGlaempJMEtMaytocGhLVG5KSXlQRXZpRkxOR1pqZ0N1SjFEeFhKZk1RaElGUStPTmJOemVDSU1jRGsxajJ6N2puUFd2OEFPTHhiOFVNZGpjMXFZSEN6NWFjSFoyNnZxZnJXVFpSVHBVVk9TMVpvaVZwRGxtSkpwTUhJOWFqaUp3TTlLa3ljbkE1cjhPbFZjL2VrZStvMkRia2dnSEZkL3dDRmdXc0l3TWs0cmdVKzhPNUpyMFh3bEZpMFFZNHhYN3A0QXdsTE9xamoyUjRYRVRTb0s1ZXVKbWhqT0FlSzVIeGhxam0zWlJHV0o5SzdhNWlEUmtGZXRZZXA2UUxnRWxBYS93QkhNanVxV3ArVzRseDVybm0ybFFsTHN2aGtiUFE5NjZuUzdOcDJ6bnJWaC9DYnp6WlJBRDM0cnFmQ1hoTU5HRWtCSkh0WDBITm9jOHA5VEdHaXM4UngyRlpMYVpLdHdWQUo1NjE2YmRlR0ZoaUtvTWsxankrRTVFa0xBWjV6VXhxRXhrYzNwR2wzS3pBaG1KL25Xd2swa0JJZklOYldsNkczQks0TlI2anBHM0pJUDVWU25vWnlhTVdlWnJ6SzhrR3NlODhObTVuSHlrbk5kUllhVm1Ra2dZclFzOUlSN2dBcURVTm5QTks1eXRyNFJHQmxNNHExRDRQQllrcWNWNkZhK0hFS0FoZUtTWFMwaWtJQ2pGT1V3Y1VjWEI0UEFZRUx5SzZmdzk0WVZRbzJqbXI4Vm9xOWdCOUsxOUVWRUlIRkp5Q01kU1N5OE5JRUFLZ0VWcFdtakxEZ0ZjQVZiaWtWVkJHQWFWcnBlT1Jtc0pTZHpSSkJCYWhNQURBcStnSGs0SFhGWjczWlFnTXBVRVpHUmlueDN2YlBGWnRNZWhGZlpBSTZHc0RWb2Q2TU9jaXVndVNKQWZXc3ErZ3lEeHpVVGpvZHVIblk0VFc3TWlYY0FlRFdiSU1OenhtdXYxVFRSSmtnQTFoM2Vra2c0R0NPdGNFNE5NK213MktpNHBNeXpqcGtuRkQ0S0VaUE5XSmROWWRRMUl0Z3hJK1U0cUxQWTYvYVEzdVpVOGVNakFHSzZYd2dTSTFCem1zODZadWJCRmJXZ1dubGtEQUZGT20xTk01OFpXaktuYTUyR2xTQUlNSEpyWGhPVXhnWXJEMDA3Y0RqSXJXUzRFYWo1Z1FLOUtPeDh2VlN1VTlWZ0RNd05ZRjNwQWR5Y1lCcmIxWFVVUGNaTlUvdENzdVFRYThqTU10aGlFMU5YQ2pYZE4zUmd5YUFweVNvelZLODBKZGgrVUN1b1ZVa1lnNEdhYlBwd1pUd0NLL1BzMzRGdzFhbTRLbXZ1UGR3MmJUaTAyenpiWHRDRFJrQmV2dFdab1hoQm12Q1hYNVFlQlhvOS9wS0ZzRUFrMHl6MGNJNElBSDRWK0VaaDRHNGZGWmpERVZZNlJkN2Y1bjB0UGlSeHBPS0t1bWFNdHZiQUJjWXJXMGVNUnVSZzFianNnc09TdFYrTGFUSTROZjBkdzl3OURCVVlVcWNiSkh5bUp4YnF5ZDJibHBjQk1lZ3E1YVhpK1oxcmw1TlhFUzR5UWFMSFhOMC93QjRqOGErN3B0UlNpZVhLaGZVN2FXOVh5d0JnR3MrNm4zWjV4V1gvYmZ5akxkS2huMXBOcHkzV3VpTDdISE9GaVMvbEhJQjZWanlzenljQWtWSmRhN0VtY3NNMW0zUGlTTkdKeUJpbTdrSkl2VE93QUdBRFVaRzdxUVJXTnFQakdKRkh6Z1k5NnlKL0hzWUl4SU9QZXFXNFdSMkF0NDBZazRKcVRlb1VCY0FWeFk4YnBLQis4Qko5NjFySHhESEpHRHVCeFMzQkkzSmJrSXVjMWhlSVBFSXQxYkp4UmVhdURHeERBZ2U5Y0Y0djF4bWRnR0pJNHJPcFBsUjJZYWp6eXNUYXo0NFdFc1MrQjlhNVhWdmluRmJzZDBxZy9XdUgrSVBpeVcwWXFySEpyeTdYL0U4anVXTWpBNXoxcng2K1BjWGFKOWxnc2lqVWh6U1BaTlkrTHFZT0pCeDcxdzNpLzQwckJ1QWxKSXowTmVhNnQ0bGxhTTRrUEk5YTR2WHRhZVl1SGNrKzFjZFhNS2owUjMwc2hwSjNaMHZpdjQ3M010MjhjVHNTTytlbFpmaC93Q0xkN0xxUzc1RHRKOWE4MzFpZVJaaVZHQTNlcjNoS0Y1YnBkeEp5YTRZenF5bGRzOUdwU3cxS255cUo5SCtFZkhzc3FLeGNrZld1elh4cTVzVGxpQ2E4bThFV3JDT1BKQUFIZnBYZHcya2YyUTVZRTRyNkdnNmlXcDhQai9aT1h1bk5mRUx4bzlwYXpQdmJQYXZqZjhBYVk4ZVh0emIzQWozNzJKQSt0Zlh2ampTb0pyZDl4MzUvS3ZuWDR4K0VJTHRpcXd4c1FjOU0xdE9WUm92QVNwd2x6V1BoVFc5TDFDYThsYVFNek9TU1QxTlZyYndsZFRuY1EyVHppdm9UeEw0RGlpbVpqR21RZW1LNTZmdzJxTmdxSzU1VkpyUnMrcWhtaXNmcWw0VTE1NUlWT1NDSzYyMDFoa2pERWtZcnp6d3ZMakJKSXpYUXo2bVNxb0NmNVY3MklxMjBQem5MOExleDFWcnI4a3NpZ3VRbzkrdGRiNFp2OXlxU2NnSDFyempTNXdkdlRPYTY3dy9xUy9hSTRNbnpHR1JoZU1mV3VOVHRxMmV2aU1PbERSSHBlalQ3bVVrMXVyZThnWkpDaXVJc2RhaXR6R0hsakJCNStZR3R1SFZ4TEVXaUJrSjc5QitkZENtckh6dGVEdVh0VTFOMGlPR0FQWDNybHRlOFFIeW5CYkRBWng2MWIxSytkaVNRRk9QVWMrMWNsNGdrYVZXVWtBbnAyeFg1VDRpWmhVcFlHcDdQZXpQYnlhakYxRTVITVg5OGJyVUpHSkpHYW5zamtFa2sxUWh0Wlk1Y01yRXNmU3Rld3NKQXVXR0JYK1lHUHl6RzFzVlVuS0Q1bTIzcDNkejlkaFZpb0pKbG1GU1Y3NEZPTFpKSXdRYWFVYUxHYzRGUnZNUVNCa0FWd1ZxTXFYdXpWbVhHVjlpMXA4Wmx1MFVjNVBOZW8rRnJVTEVnSXdNVjUvNE4wMXA3Z1NNQ0FUeHhYcDJndytTaW5Belg5Yi9BRWR1RjZsT01zZlZqYm4yOUQ0N2lmRnEzczEwTlA4QXNyekJuR1FmMHByNkFIeDhveFd4WVlDRElCRlN0UEdqNHdjWjY5UUsvdUxCMCtTQ1IrYlZadHN4N1B3OGlPTXFDSzFMYlRZclRCQUFKNHFTV1JVQkl3QWFyUGQ3bnlUbjBIYXVybnVZM05CWW9sQURZT2ZUazA4NmRESXVRQno2MWx5M3pSQXVDRGdWTkJxNVVBRWtFY1VKaTVpK3VrUnhBbkFBckcxZTBTUjJBQTQ0cS9KclI4c2dNQldYTmVHNEpiT0swVEU1RmVPeldJWVVBRWRxdTZaYWhwUWNZeFVFWUxnSGdZOWEwZFBSWXlDekJTZW5yK1ZQbU0wbmMzN2UyQ1dnSkFCQXJLdmxQbWs0NXJTWFZZeWhqR1NRTWs0d0t5THZVbzVaV01ibzJPdk9BS2xzcHNoY2taNXFYVGJwa2tQSkdLZ043RTJkenhqSGZjQ0t0YVBmV2R1OGtrZ0U0Mm5hRVlkZldxUWtlaCtIdkFuMm0waW11NXdxdXVRaUhuSHVhNk95OFAyR25nR09CQ1IvRTN6SDlhOHJ0L0hOeERZQjdhVndJdnZJU0RnZTJLa3QvaS9KZ2JwUVNQWGl1T3JoS3MzOFIyVTYwSXBlNmQ3OFF0TVc3MGI3UkVBSmJVNTQ3cjNGY0hCZmxzYzV4VWVyZkZ1VzRzblZKRklZZm5XVHBPcW05akVoWFprNDQ2R3FwVW5TaW96WkZTZk8rWkk2ZUM0M2dBazgwNjRoRWd6amsxUnM3anBrMWErMUFEcnhXalZ5WXlhS2x6WmRlT0RWQzQwMWVTUU1WcFhXb29CZ1lKckQxWFdvWWM1ZmNmUUdvOW5jNllWNUlndmJXTkNmbEJxaGNTcEVBQmdZclAxdnhkYndSc3pPc1lBNUpKRmNOcjN4Z3M3RGNSY0NSUng4dk5Ic0VkVUs4bWQ1THFDUjVKSXA5aHJ5SzJTd0ErdGVMNnY4ZnRPUlFCY2dFOWoxckR1djJrckdKbVZaMHd2KzFtcmpSUnZhcEphSm4wdkY0eGd0MXo1b1hIZk5NbStKTUNxUUpsUDQxOHdqOXBPQ1NNdDVpaFIweWNmMXJrZmlGKzJwbzNoTzJacnkvaFJoMGpCQlkvUUE1cFZKMDZhdk4yT2VlSG10MGZWK3EvRWFNU2tlWUFQclVWcDhVTGZBVnBseVBmTmZuUjRyL3dDQ2hVdW9Ybi9FcDBxL3VCSWVKR0JWUlZDRDlzUHhqRXdsZ3M0eHV4OHJLMzg2ODJlWjBMKzRtL1JEV0ViVjI3SDZlNlo0OGh1TUZYREExdjJXdXgzS2dzNFhQYXZ6TjhMZjhGQXZGbW1nbTg4TnkzQ0lPdHZKa244RFZMeEQvd0FGaXZHUGhmeEJGYko0RW1nc2NjejNUTU0va0tVc1RSbkZ5MSs0NTVRa25aSS9VcFVpbmJjckFpckVObXB3UUJYNS93RDdNWC9CYVBTZkhuaTJQUi9GZWt0cER6SGJGT2piNDIrdkFJTmZjL2cvNGw2UDQzMHVPNzBxOGd1WVhBSUtPRFU0ZkQwS252d2R5SlZwcDhzdERjbmpNTWVPTUdzcStZUmpJUEpxYTUxd01TaHlHSDVHc3E0djFKSXlPZTVydGROUlZrWFRreUc5ZmRrZ0hOVVlya3h1U1RnMWF1YmdDTWtGU0JXWTF3akVnNEJwUnAzWjFxc2xIVWx1dGVhMzVMRVk5NnlOUThiZVFweTJmeHJPOFRhMGxxamhuVUN2Sy9HL3hKaTAwT0JLRHQ3WnJvaXJibkhPYWxvajBYVmZpUWtlUVpBTWU5YzlxM3hWU0ZHUG1BZys5ZlBIalg0eVRoMzh1VUtQclhuT3VmSG04dDk0YVhjbzk2aWRaUlYyT0dGbEkrbC9FUHh1V0xjQktTVjk2NExYL3dCbzU3T1Vxak1SM09hK2JkYytQcnV6ZnZDTjNYbXVPMXI0eXRjTXg4MC9uWGwxODFqSFk3cVdXWDNQc3p3MyswYWwxS2dlWUhQdlhxWGhqNHlRM1VDRXpBNTk2L01leCtNTnhhYWlKVWxZSjNHYTlUOEhmdE5mWm9vOTg1QUlIZXRNTm1VWnIzdENLK1h1RDBQMEtQeEZpbHRDZk16a2V0Y3pyM2l4WkJJZDJTZmV2bVB3L3dEdE94M1NvaG5CSDFyWHUvaldsL0h1ODhZOUFSWFRPb3BiRllTRGhMVTY3eDFyOGMwOGhKeml2TWZFbXVJcFlBaGNWUzhWZkZDQjQyWXpLVDlhOHk4U2ZGR0hMa1NENXZmclhqWWlqcWZiNEhHeGpCSm5WYXA0c0tSSDV1UnhYSjZ0NHNERmlXNEZjTHJ2eFhpaFpoNWd3UGV1UTFyNHJSY2tTYzlhNUZSTksrWnBiSHB0OTRzajR5NEpOYWZoTHhmQ2w0cWx3T1IxcjU5dXZpWUpwQ1JKeDI1NXFmVHZpTElzZ1pIMmtIT1NhN0tGS3p1ZUZpc3dsTldSOXdlRWZGa1BsS1BNQjQ5YTdPdzhSTExGbmR3UjB6WHhkNE0rT3FhZnRNczRMRHNUWGQybjdUdHRid1pNOGFnZjdWZTdHY09YVm56TlNwTzU3cDR5MTVGREFPUHBYa1BqaStpbWFSaXdKRmVmZUwvMnNMTTdnSndXSFFBMTV0NGsvYVhONnpDTlM1UHJ3SzVaVnFkOUdkTktVMHIyTzI4UnhSWEVqa0ZSaXVTMU9DR09RNVpWd2E0ZlV2alZlWHhQeklnUHBXVlA4UXBybGlXa0dlNXJtcVRUMk9pTldvZnFyb1VwRWE0R1RXc1ptTWlaSkpOWmVndzdVVUhqRmFyeDViSTR3ZnlyMnNRbmN6eSthVmpiMG1VcVFRUWNjVjAzaDI0V1NVQTRERG9lOWNkcHMyMEJjRWtuRmRGcEYxaVZYVW5HZlN1Q1U3TTltVUZLTFIzemFPdXB4d3Q1MGtVcVlLeUtlUjlSM0gxcTlwdXBIUzdsYlM5alJaVC9BS3VSQ2RrdjB6MFB0V1pwRjhaYmVOV0lHT2hCNXJYbTAyTFZyWjRaTXNINURkU3A3RWVoelc2WFkrWnhFTE96TFdwMjZ6SnVEc1E0ejFyRHZMRnJrYld3d0h0V25wbHh2MDh4emxXbWdZeHQ3NDcxV3ZMeGJaaUJnbnR6WHorYlpOSEdSdEphQmg4UTZUME0xZERXTmQyMVNGOWUxVFF3SThaS3FTUHBUNGRZam1mQktoaWNZN1pvdDc5RGN5cUNEbkJGZm1lZCtIdUZjSHlVMTl4N21HemFkOVdVZFFnQnlBQ0Q5TVZUMHZRM3VaZ1pBU3VlbGJNK0pTZnU0UDQxYTBtTFl3QklJN2NjMStINGp3Y3A0N000MUtxOTJQVG9mUlJ6djJkSFEyUERXbGlCVkczOUs2aXprRUxBSEdCV0xwVjVHRklERElGT3U5Zmh0Wk5wYkRudDNyK3BlRmVHYVdXNGFOS21ySkh4dU14Y3E4MjJkYkRxeXBIamRrZW5yVFk5WVdVbFEzR2VhNC8vQUlTWlpVeUNRUjY4VWxycmhET1ZZZ0RuNlY5dXFpMlJ3ZlYzYTdPdGsxd0pPSVdJSVlaQkhQRkpOZnJGOHhKMjR5T0s0cTA4WVcwOGp1WmxEUVNiU2M5L1N1TitMSDdUR20rQlBFTmpZZVlqWEZ3cHl1ZnVnL3hIMnF2YUphdG5MS2xyWkhzTStxS0xiZUd3Q1IxUHZUSmRlaVZjNzBZNXdBRDFyNTMrTHY3VituNkQ0ZWpXM21WYnU0d0VVbm9QN3hyNWwrTjMvQlNHNzhNNmVkSDhPbzExZnNDc2wxSVNWUWtjdC84QVdyQ3ZtRkNpcnprVlJ3VldxL2NSOXlmRm45cUh3bjhIOU9rbjEzV3JTejJLVzh2ZURJMkJuQVVjazE4MmVNditDd0drM0VieStITk1EMjBaeDUxOUpzOHpzQ3FMa244Y1YrZC9pRFdkYitLZmlTODFyWDlSdXJ5VzVCVUJtUEtrNHdQUVk0OTZtc1BEc2x3WVVDS29BemdEQzI2ZXYxeDYxODdpdUpaM2FvcXlQYm9aREhSMVhjK3lOUy80S3MrTHRSbVY0SkxLMWo1TzFZamdEM0pQZXNxSC9nclo0dml2U0k0NHJpT05UdWQ4cXU3c09PdjByNVd1TkdXNXVHaVF5TEhGOTV2UWV2OEE5YW96bzhVaE0xMUlJcldMN3FiZ0JqOE9yVjVFOC94YjFVMmowb1pQaGxvNG4wbnF2L0JVdjRoYXhJWGZWSWJGNXlTQkREdkE5T0R4aXNTOC9ibCtKT29YQzNFbXM2eGR0S3VGV09aWVltNTdCQnhqMzVyNTZ1dkYraGFZUkxJNW5ZZkxISEN1NTJ4NzloK0ZXNC9pODhPbVNKOW5GdEFjTXFLTXlFLzQvUUFWeDFjMHhrdDZrdnZPaUdYWWFPMEY5eDlFNk4rMVY0N2szTStwend6RUg1VGN2SWMrdko2ZTFUV3Y3Y2Z4VThBeHRlUlh3dlJEbHZLVkdZTi9oWHp2NFQ4ZWF6ZTZ4QjlrczRJTjdoZ3pocFpBdWVwSk9CWG9YaHFQWE5Ta21lNTFHNDh4amdDQ01LaWozT0FEUlF6UEVRYWJrL3ZZVk1EUmt2aFgzSDFoK3huL0FNRmRZZmlCNHBYdzk0NHRCb2wvY05pM3ZIK1dDWTUrNnhQUnY1MTloNjFjcHJVQzN1bXlxd2NianNiS3Y3aXZ5SzhVZkRPLzFxU016V3NWNXRIRXNqUkRHUDF6NzVycnZDdjdTM3hRK0VGbkhCRDRuZUcxdDAyeFc0UkpJa0FIQU9RV05mWllQaWloR2tvNGk5KzYvVThIRVpGVmMzS2kxWjlHZnBqYmVKNVlsS1NuSkhCN0VWMy9BTVB0V1hVTk1LcXdKWG12eUMwZi9ncWo0KzBYeGVMdlhqcCtyMlRIYkxER29oa1VlcTRBQlBzYSs2UDJPdjIyL0RueFo4cVN4dmtQbjREeE13RHd0Nk1LOUNHWllmRks5R1dxNlBSbkpWd0ZhajhjVDYwanZ5aDV5S2cxVHhCOWtpSjNkYXNSbTN2N1ZHamRRWlJrYzhHdlB2aURxMCtnWDJ5VU1JbSs2M1kxMVVxdDN5czQzVDZtbnJQakR5VlllWVFTTTlhODg4ZGZHbTMwQ3psZHBsSlVkQWVUWEgrTi9pVExNMGtjY2dUSndXSndBUDYxOGxmdFRmR1RVTkdrdUk0Y3BGQ0NmTVk0QjQ2MWppOHdoUWpxZGVHd2JxTTlZK01IN1pPbCtHWUpialZOU2lpUlB1d2lUSi9MMXI1UStLWC9BQVZRdFpiOTdYU29qS0JuTHUzQy9oWHk5OFJQaWxkZU85Y3VvTnB2SFlrYjJZN1kvVThWeHQ3NFVGcnNnRUJqWnZtWjI2bXZDcVp4V250b2oyNmVIakRSSStrSi93QnZDODFPWXU3RmxmOEFoSEFxV0g5cnE4bHRtblRlWWwrVXF6Wkk5L3A3MTgwMmVuUEh5eUZpVGhWSFNvcjd4QmNmYXZJZ1JuZ1Q1WmNkSEhwWEk4eXJiS1IzUnFUU3NtZlJseCsxVHErdmg0N2VWbzR3RGtxZHg0NXhVWGcvV1ovR21vUzNWMllsaGlZQjU3a25hQ2VnejYrMWVkL0FMd0JxdmlueHhGbzFzdTVybzVWaVBsU0xadk1qZWloT2Z4cjJ5KzhHalhJclZ0TFlqVExHVVFvdUJ3dWNOS2NmeEhuNmRQU29kV2RUcmRuUE5YZDVNNy9RUGpQNFY4SzZmSGFSNmhGZDNNU2hDdHJZR1FaNzg5K2U5ZGw0YStJOXI0bmdMTmFhZzIzb1JaaEZBOVNPdGZLSXZaZmhmNDN2TlAxVFJwTGlhemtZT3dPTndYMzkvd0N0ZXkvQ2J4Zm92am5WWVRjYUxMcDhkeU56TjlwQUk0QjdnZDg5KzFiMGE4NDZONkhIV29KNm85TThVNzRGemEyOEJsWWJnQ2ZMWS9tTVY1ZDR2K0ltdDZiRkpGcUhoNmU1c2djN2l3WlFQclhXK1AzOEQyOW04RUdwWG1uM3YzVVNlNlpVUHVDVGcxNW5ybmpqVXZCcDh1SzRpdjdTY0hDZWFIRFk2OEUxT0ttMDliMmZiVWloQyt6VnpKdS9pTDRWdW93MXpvNXNaNDJESkxqYU0remRLN3o0TS90b2VJL2hIckN5K0h0Wlo3UjJCZTJtbERLdzlxOFg4VWVQZEgxaVNTTmJlSFM3cCtHRWFneFNIM1EvMHJuTDIwc3ZzWUw2YWdZNXhQYU9ZOEg2RC9DdVdsV25mOXhVcy9QUTNxVUl5WDc2RjE1SDY1ZkFML2dwRm9meFQwNk8wMVdWZEoxZ0FBcThnS1NuMnIzTFJQaXBaYXZhcklsMUc1UG9hL0F2dy80NHVOSXZ4OW0xSzRpa2piNVlwMUljRWQ4amcvaFgwNyt6NyszNXJQaFJJYkhWQUw2M0NoZk1WeTJQejVydnA1NU9EVU1Tdm1ZUnk2TnIwM2MvV0RVZkc4UXRpeVNCZ2ZUcldIZStOUnRPNTl2Zml2amFYL2dvZDRhdGRQRXR4ZkMyZFB2UnUyMXYxcVR3OSszUjRaK0pOaEpKbyt0MjF4TEY5NkxmaGwvQTE3V0d4OUdvMXl5UnpWOE80eHN6M240bC9GV0t5Z21CbDVVSFBOZk1IeEMrUEszRjlNRE1DaWtnZk4xcml2anorMDlGRGF6aU9aaklWUGZKTmZKK3UvdEJTejNycVpjQmlUbnJSaU1aRlN0RXl3bUZiZDJmUmZqRDQzUkdSc1REcjBKcnpMeFo4YkVsRGd5NFU4REJ6WGdIaTc0elNyWXZPMHgzTXhVYzlhNFR4VDhYbklpUVRaMnJrODg1TmVkVXhNcDZIcVJoR0o5QTZsOFdZNUNjUzhBY2MxajNIeENNbjNaQ1FmZXZuZC9pa3pFa3lFbnR6U3gvRkM1bHlzWlBIZXZLeEdGbk4zVE9xbmlJeFBmNWZIcnh4NUQ0QTY4MVZQeFhsc3BjaVlnRHB6MHJ3VzYrS1Z6SEdmTWRsQnJPbCtKcGs0YVVrSDN4aXRNTmhwUStKM002dGRTMlI5UmFSKzBKTGJZSnVDQVA5cXVoZy9hcWEyaENtNUpJOTYrTXBmaVFBV0htWStocXRMOFN1T1pBUHhOZWtxcldpWnlQYyt4dFgvYWxlOVVqenlmeHJsdFgrUDMyZ25FckhQUFd2bDJUNGxnakhtQWZqVU1ueExDZ0h6UDFxSEsrN0xWUnJSSDBMZjhBeGNlN0pPOERQSXllYXk3cjRoZWUyV2xKUDE0cndlVDRtWnhpVFByVVVueE5PQmlUR0RUVTBpZWVYVm51amZFQVJuaVFBZlhOTmI0bk92SW1BeFhnc254SFBhUWttb1grSXBZWUxzUWFQYUVzOTdmNG55RmlmUGJQMXFLVDRveXN1R3VaTnVPbTQxNEkvd0FRbnh3ekhIMXFJL0VDUWpobU9hT2REU1BkNVBpTUc1OHdrbjNxQ1Q0aEFnL1BrL1d2RFQ0OGxZWTNFa1ZHZkc4NTdzUHhvOXAyRlk5c2Y0aHFwT1pBYys5UnY4UkFUeEp3YThUZnhsTy9jajhlYWFmRmR3NXpuQXFYVVkxR3gvUnpvNnNzUVpNc3d3Y2RCaXRhN2RVZ0RqSUFHQ0QxRmVSZUNmMmt0R3VicUMxdm5ObVp1RWxJSlVuR01Ibkg1VjAzaXY0dmFGWXlxaDFLQ1dWd01SSUNBdzlTVFh2VnNkUmNYSk04N0MwNmtaSk5IVTJzN3p6QUYyU01ubkI1TmRScEgranRHWWk3Z2RRV09DUDhhOFJUNDNSeFN1VWFHTlZ3U1Njc0IrQXJaMG45b3pRNGJNczk1TXg5QXZLL1hOZVdzZFF2ckk5NmRTWEw3cVBvelFOYmd1RkJWa2NoZWk4NC9IdFd2SjRtTnFnTytPTWdmZFBKSTljMTg0YUorMC9wVVVVZ3Q3dU1Sazdnck9BM3Z4V3BkL0h5RFhyWnBJR0FXUDhBdk5sZm9UMHJyaG1PSHQ4UjQ5YWhVazlVZW56L0FCSGp0L0VONG5tcXdLcTJBUU1Hc0R4SjhXWTdjc1JNRVFkU1QvbjhxOGtQaXlXODFHN3VVbFozWVlVUmdNemMvWEFyaWZHbmliVTRsTFBBNlJqUHlOdHlmY3RuajhBVFZReDhMWFRSclN5MXphUGQ5TitMZHZMTW9qWjJIcm5CK3RhMXI4Ukc4MHlST3UyVHFOM0kvd0FhK1VQREh4SmxOeXdiN0xFaTR5cE80dnlleWs4ZlgvNjFlbGVIUEc4a3NRZG93UXc0MlpkVHo3WXgrVmViaWNSR3ErVzUwVk12ZExvZlJtaStMV3VJd3pGR1UramMvcld2QjRzaDhyQ1BoMDR3ZW9OZUY2SDhRNTRsQ0l5S01ZNVB0MHJWaCtKSzdFTHJJc2c0QjZmNUZZWWZCWWVuN3kxWngxbFVmUTlyVHhSSWdESk5HcnVlUjEyanArZE5sOFNTUWdrYkhKT1dQOFJyeCszK0phU1JNdjd4WkFjdHVPUlZnL0VwSWxER1FiUjkwZFNhOWhWb3BXUkZMRHRhczlSZnhJSjhzcmhXN3FhajFYeGV0dHB5ekkrQ1J6azRGZVdYL3dBU1BLdFJPN1JvbzU0YmsxNXg0Mi9hV2h2YnU1MCt5blJKaEYwSnp4M3g2R3VlcFhqRFdUT3R4dkd5UWZ0UC9GL1c5QXRwbzlKdkpJSERHUkJHZVNXNm5qMndLK2QvRm5qVFd2Rm5paWE3dkx5NW51RVJJV25mSjU0eUIrVmV0WDZqWDdXQyt1MmVWSGlCS3RqSzdpU0QrdFVMRDRjdzZyZUNJRkFpWmttUGZIZjZudFhsMW5LcTlaRHA4c05iSGtuamJ4bHFtcEdWaEpjT3hBampKSkpPZXcveDk2NSszK0ZjN1dxM0YwQzh6SDk0U0Q4b1BPUHc5SytzZkNuN1B1bkdNM1Y4ME1TWXlyT01pRmM5QjNMZlFkZndxRFYvaG5ZMjRkTE9KaEJDTTc1VndjbjBIWS9Yb1BldUd2ZzNMVzUwMGNTbzZXUGwrUHdQSUxoSWxqQ3BuSEl4ajNQK0ZKckZvdWxJWXJZcEtrUTNGM0dBemQyOXdPd3IxN3hENFJTTzVXSzJrZVNXUmlwMnFTVDlPLzQxeVhpVHdqSHBaY1hwTVR0MjJrdWZxTzNTdk1lQ3M3eWVoNlVhOTBySGxWMWJTWGtER2E1ZTF0VXlXVk9zaDlTZXVmNVZ6V3BhWkJyc3lmTlBkeFJIOTNHZ0t4SWZxY0FtdTk4UlJSRU84KzJOSStFUjIzRS9RZEI5VFdEOXJGcEpIR1kyWjV2dXhvMkdJOXpqUFBvby9LdU9vMWYzRWJ3ajNabjZWNEVhYTRCV05WbFhuNW0zSEZkZGJmQy9UZEd0bHZOVGVPTlhHL0JQYjZkQUt3UEVYanovQUlRdXoybUZaN21UL1YyY1BCejIzdHllVDlUV05hNmZyM3hWbnQ3ZlY1eUdaak5KREFka0ZwRU9pdG42RTg1UDRWenVuT2VyZGthY3lXaVI2Zm9uakxRZEoweWE4dFlsTnZBUkdzaEc0eU9laXJqajM0cTlEZXo2dnA2NmhlU3oyY0JVc3FHVlk4QWQ4RWRmWUExVDBQU0xQVDF0YmV4dEk1eFpxZGpTREVDTWVDK0QxUDEvL1hGNGs4YjZGNGVXNGFhWnRiMWNydFlJMjVJamo3bzdESHRYRTVybTVZbXlnN1haUjhSL0VsSWxTR3dTZDBRZk04bVF2MStZNVA1Q3VOMS80d2Fob0FFb0xPckRPM2svVVk3L0FKVlIxWFg5VDhReXZORmJRV3U4NVhlU1FCVlFlSHJuVUdVVHhwSXc1THMrMzlBZW40MXZHV21vbFphSWlYNGlwNDFrTWQ3cER5Um5sbkVPU1BmUEIvV3V5K0c5dGNlQnZFVnBxbmhiVkx6UjcySGE1eGxoS3VjbFNEd2Z4cm00TE9YVFo0NDdlMGFWbTQvY2tFTDlYWnNmbG11dTBheXpFbHpMTzBFYUhiS3pPcmVYeDZqR1JYUlJ4TW9UVW9PMWpPckdNb3RUUDFUL0FHU3ZqN2MvRi9ROUp0MDFBM043REdGdU55aEgzWTUrV3ZwM3hoOEs1UEd2aE1SWE1MYnl2RHFDV0I5YS9GbjRJL3RCVC9DTHhuYjNtaDZwZVBQRElBR2svZFJrWjU1WW5jSy9TMzlsMy9ncnhvT3V5YWY0ZThZUng2WHFsMENsck1XeEZkRVl5QVQwUHNldmF2MGJMTVZERlVGTDdmYTl2dVBpc2RoNVVLdnUvRC9XNTg0ZnRCU2F2OEdmalFOTTF4SlZ0WkRtemNLUkZLUFhQcUsrZC8yK1BFMGVvZUhraXRpcXpUTHVmSFU4ZnlBcjlWUGl2WS9ENzlvdTJrMG5Yb1ZhTnBQTnQ1ZWp4TVRuS09PbGVZZUp2K0NSdndtK0pDSytvYWw0aXVVeDBTOFZUajB5QldXSXdGU1RhdmN1aGpZd1NiUitGUGh0azhOYW1wbHQvdERNQyt3bjd6ZS90V2hOWUhVNDVaSmdHdUoyeUdIQVgyK2xmcFYvd1VWLzRKQy9EMzluL3dDQTEzNDU4RlgrdXgzbWp1aXoyVnl3bmlraVpncGJkZ0ZTTTVyODZJN1V4MkRUTjhxSVMvSFlWNDJMdzhxRFNrZXZoSzBheWJqME9OOFFYMEdqV2MwdVJHaWp5d2UrVDFQOUt4dFAxU1M5aGhNRVhsMjU0TzRaZVEvMHFscmVvVGVJZGRWdzVpdFkzMm9vL2lKUFUrdnJYWGVFOU1PcGFTZkxKZWFDVXBucXF0bnRYR282WFowM3U3SDBwK3o2MFh3bCtCZXY2NHlsTloxcTBHbFdjaC8xbHJFd0JkeG51UTZEUFlDc0h3ajhaWDhOeE9sc3FTVzdqeTQxWWRPMjRpc3J4ZjRuZi9oRE5NMHFScFJIYVc0dHpzSHpad0dKOStjZmxYSUtobkN3MjAxdE1rUUFWV1BsdnU3OEhCQi9TcnBWbnF3bFNTM1BjZFI4UXlmRVoxdW80Z3R5c1lFclJ4cUMyQjFKOTZpMFJMM1M3S2U4U1MzS0l2bFE3eVhkU2NuT09uVCtWWi93UzFKUEQrNkc3alhjQ0VjZVlDRDYvclhxV3MrRmJRU3dySExhM05nSkMrTndTWGxjZ0hQQjRZL25XOU9vcjJNYXRMUzU4Vy9HM3g5NHhUV1dlOEVWeFpTRmxBYTFSUU5wSUJ5QUQweDNyekRVUGkzNHcwTlpiV3d0b0lFWWwwalRjY3Q2RWs4Z2pIYkhTdnJqeGo4TDVOVGd1clNYYThNN1BKRUdYY3FrOVFEbmorVmVWK0pQaCtiUmJOR3RJVW1qYnloSTNJM0RvQ1IvQ1J4bnRYclJwTnhUa3p6SlNXeVI1SDRjK0xXdmEvNFFlUzcwcUV6UnlGSENaalpTT1NNRUVaOU9PYXQrRlAya3JEU3RXYUNkdFV0NDFHWkZZTElGNUE0SEdSelh0dmdYd0pwZXMzY3hOcVl4S1BMa2laY2tFZGo3NS9RMTRkKzBIOEF4NGY4QUhkeFl0RzhIMnlJeVcwd0J4TU1nNFA4QXRER0Q2MWppc0JHM1BZMG9ZblhsVFBhZEwwM1FQaVBvSzNVVnhETUprM3h1cTdTdnY3RUh0V2ZjK0dWMGRvNUV2MmdjY0NUSjJ2OEFYMHJ5ejRIemFsNFMwTzdzYmtTdUxaOTBibmdqL3dDdFhwM2dEV0g4UTZjOFVzbVpVWS9LeEJZYzlDTzRyd2E5UnhUZytoNjlHbXBXa1cvRk53M2lYU1JiWGx4Q0pnbUZrWDVTMzE3R3ZMN0xUYnp3THE5elBiTk5GSVBuV1MzazZFSG5nZTNQNFY2N2QrRnJUVWJjYjFBUThGb3NncWZiMHJtZkUvdzVnZ1VsWG5tWUtTcllDdUJqMUhXc3FOV3o5MHFyUXV0VG5maVI4UU5jOFdlRFk3cUNSN3lXQUZYWk9HSTQ2ajFyeGVieHBxVHk3Sm81QzBuVUVISyt0ZTUrRVYreW1TQXZJR0hJWmwzalB2N0hwVzdkZkEvVHZFZGs5M2JLaVhNZ3kreGNodndydFdNVzBqbFdIMHZFK1h2R21zM2VvdmJRdzdrakdNbHVoN25uOEs0Zlc5WXVuMUY4bGpqZ0QxcjZBK0pIN1BsL3NLMjhjKzdkZ0trZlgycmc5WCtBV3BlSHRKbW0xSzJraVJVM0tEeko5ZllWMjBxOExMVXluVGR6eTZMVzdrN3RvS0tuVTlUU3ZyZW9TTUFKR2hRKy9OUytKWFhUcmFPQ0ZRaEhMTmpKWTFrR1VwRVpKWExFOEFWMUpKbURSZHUvRWx4QkdZaE0wZ1k1WXR5S3B2cU1reXN5dXlzT296eDlhcE8rNGxzNUpwYmVRaVVBZER4VkpJVnlScjZVNUpkaUthYmx3Y0Yyb0ZxN3NTQmdEako0cGt1Mk5RQTI0anFlMUpKQ1k0WERzY2xpQWZlazh4dDJDellxTU5qa25rODBCZ0d5ZWxVMGhJa0xsU2VnQi9XZ09Xd0NjWXBnYmtFazg4MFpJSVByM29YbU5EdzJWT0RrMEtlQ2VjMHpmZ0U1QUlvRFp5QnhtazJESmR4d1FBQ1QrZEFZazl6VWU4bkFHTUNsVWhPNUlQcFJjb2t6akJIUTA1V3d2UGVvbEp6MTY5cUM1STJrZ0VVZ0pneHg3Q25SZ0Z1U0JVSUpJT1NBQlR3UmpuR1B5cVd4by9ZUFU3cThpZ1JRMFppaU9ETklxZ3A5TWRUU3g2bExLQVRLNHp6dWtPV2NldU8xRjdMYkNaM0VyU2djRGQ5MGY3by9yV0RyR3F3eHFGaVlGbk9BQzJmL0FOZGZLVHF6azdJOVdOT01UcjlQOFZ3V0VZRjlkQ1JEeGpBUDRjVnp2aXp4WkxISGkwY3l4U0g1VEdnSDRkZjUxemY5a1Q2cE9JeE15TjM3bjhjRGl0cXgwMkhUYlJvbWxhV1JBUVdBMm9mWSt2NFZqSzYzWmFhNkdYRDRodmRObkVoa2QySE96ZHpYcFhnYjQ2VFdPa3hXMTVGTEpFWkEyMWdXWDlhODV1THpUSW1HK1pTdzdkVFVFM2llMGpsQ3BGTVIyK2ZidS9yV2xLdTR2UW1kSlNQcXJUdmpEcE45b2tVV21RMnRvN0g5NFhVYmdUMTU1TlU1dFpqdzdTWGFPQzNmNWczdDB6K2xmT3VqZU03amE4TnZiTkNyamtxUi93RFhxL29QaWZVcDVoRGRTc2lvMlFwa3lEWFdzWkdhOTVXTVk0YVVYN3JQWkQ0bHNvWm1XSzJoWU1jSENuSlA1Y1ZyYVg0c3RvU1NEY1dqSHF1OFkrdUNNMTUzQkUyb0l3dGI2emdUYjkwdnRkajZjVm5ObzF5TG5MM2d6R2ZVRVkrcE5jMDdyV25JNll0dlNSN3ZZNnRKZnpock80eURqN3JaM2ZnYXVhek5lV3NIMmw3YVFudTZxU29yZy9CVU1ObkFMaUlTM2tnWDdrY1JCVStwSTYvaFhhNkZQZGFyQmk0bWt3M1NOMWNNdnR4MC9HbkhIMTRMM2xjemxSZzNvWVdyK0o5U3R0TCswUnhTQ0ZmdkhuZyt2c0t3ditFcHVKdEZrdjVib0lZcENoQ3Y4eTlNY2ZqWHB1dGFmZldrQ3BDME0wYnI4eXF5bHlQY0hyK05lYytLQlpYQXU3RFVMVnJSYjhLc2N5b0IrOUh6QWJUM0pHT0RqbXVpR2FUbGFNaVhSU1h1b3dQRTN4WGx1dEpZVDNKWU1wVlYzYk00SFg5YTQzd3FiYlUvRUZ0ZXl6dEpNMjVNN3NESG9mVDFyay9HUGlDTjVNMk15R0tGMlZSY0xsYzhZVmprbGMrK1I3MXhlZytMN3V6MXVUZkNZeVh3K3hzcU9jZmxYZlN4U2xIM3RXY3NzTzFMVFEramZHUHhjZzBmU0lZWVhobEFBQkErOWxlZytsYTN3YjhmeUFGcFk1SnBwZVFUeWk4NTUvRTE1OThPdmh0L3dsS0M1dlMwMFVXVGdEN3dIUEdmV3ZYdkR1c2VETkdSSXJlYTRTWUFJSW1qMkJaTWM1L2tLeVh0SlBtMk4zR0NYTGE1NlpwWGlwdFF1NFlBUkpLUnpnWlZNZnhIMHAzaVBTZFM4Unh1a0FOcnA4ZVMwakRCSTljZjBxUHdGck9sMjBTUjIwTHpHUW5MQWdxRC9MK2RiK3NXMzlwMmp6SThzRnBBRDU1WWZmSTdJdmMrNUZlaGhtMzhUT0t1a3RZbzhyOFVXMHVnMjBrZW1Jc2ovZk43TUFXOU1nZE9PMWVFZkVueFJIbzA3d1d4a3U5UWxIejNNNUxrZjdxZS9hdmZ0ZThQWDNqKzVraWlZYWZhUmtDS1BCa2Rsenl6QWRXOUIwOWZTc1dEOW1nRjJsOG01ZG5Qek5JMlhKN2xtN0g2VldJdzNNdEF3OWF6MVBtZUx3dnFPcjNEVHN4RXZCWjNHZkt6NjlnZmJ0OWVLbGcwMjIwU0tTTzNEbVNSU3N0MCtUTE9jOGhjOUZIdHpYMFI0dytEdG40ZDBacGIyOHR0TnNJamp5NFJ3My9BbUk1K2diOGE4ajhYK0w5SjBXeWROSjA0QlloajdaZGdaLzRDRDA2K2dyeGE5R05MNHowNlZSMVBoT1MwRDRYSmUzTFhGMHhnaVlFaHp3Mk1kZ2VneDM3bXRTUzkwL1NyTVdGcEdzVnVyYm4yREprWWNEZTUrOFJqb09udFdFOXhxL2krOE1NVWx3WmljdTI0cVkxR001L3U5dmZ0MXFqcVBoVzRkNHpHMDBvaytXTkI4dm1BZHlQNFU1R0IxYjZaSjgydEYyN1hPcURTWlI4Zi9FaSs4U3dQWWFTVGI2ZURzZWZvR0k2NDd1ZjA5eldINGU4T3ozazd4UWpBVmNOTE0yUjdrQVYycWVDWXJXeG1tbEt0TEgwQUhBT1FEdFgwWE9CNm44YWdOaTFtakJFQUxjaFFlQVQvQUhqM09PVDZEOWVHMXRFYk4zTXlYUVJCYk02WE1EK1NjR1F0N2V2OUt6TDJTZDRGZkVrTWVjRmxIelNlK2ZTdXB2OEF3KytwNk8wa2NaQ0kzeW5HTjV4ejdBWndTVC9Tc1BWckdkTEYwdG5DcStCTE5LY0NVNEhUdnQ2Z0RxZXZTbHlhaHpITzJ2aVpyS2NGcDdnT3JIeWczTzA5Tno5Y2puaFIvUGlxK28rTTc3Vjd4SGNMY3hUN2ZMRVRiTWNaYnArWS9sVWZqSzNqOE0yMEN3T3FzNitiSkpJbTVtWThBQUhzdlBiSFNxZXEzZHhxY2RpOHJCYmF3Z1paWFBCZGdNazhZeHdWcnBna3JTWm5LNzBSZThJNm0xdHFNdDNjWEhtMk93TkZIT2hXZmRuT1EvcndldU92U3VuMW40c3lYRnJJbDRibGNoZko3K1NCMEtrSGdnZWxlVDNIaVZzUnBNWlliTjNBakRTRGNTU1BtNTl1M3BVVnpya2tFTTBzTXlNSWo1cFVNV1IxTEJlUWVEM3Iwc05YcVJkMDdISlZweGVtNStrdjdCSDdiVXZpcVdId3hydDZadFdzRUQyMHp2bDd1QWNCdmNqb2EvU240UytNazFuUzRtV1F1U0Izelg4OHZ3czhaeWFQNGh0ZFh0QkpGcTJpT1hoS0hHOU1qY24wSTdWK3IvN0Mvd0MydG9IanZ3SUwxOVZ0WW10VUF1STVKUXNrVC8zU3A1QnpYMVdBekwyNjVadjNrZUZqY0Y3UFdPeDl6K0xyUFR2RStnM0dtYWpiUVhsbmVSbU9hR1ZReVNLUmdnZzlxL0ZiL2dxNSt4ZTM3S3ZpV2JVZEVpZi9BSVEveEJOaTFJNUZsSWVURVQ2ZFNQYXYwMGovQUdwdENtbmFTNzFCTEpXNkdUSVhIMTZWd3Z4KytKbndmL2FhK0dlcitEOWM4WGVGYnFDNmpLTXY5b3hDVzNmSHl1QVRrTXA1cnB4dEgyME5kMXNjT0Z4RG96dXRqOEZydFJaM2FRZ0VPY242R3ZVL2c2OGVsd3pSelJNeHVWV1VEZGo1eDE3VnhmeGo4QmY4S2srT04vNFltMUN5MWFEVDdnaTJ2YldaWlk3aUZqOHJaVTljZFIyTmQxWjJVK2lYdHBNc1RQRVVVakhJQU9PZjUxODVPbTFvZlIwNXA2OURwUEVFOXRxZHNFbGlrV1ZYUG1ScStDK2VRYzloakkvS3VmdVlMUFg5VmpBRnpHMXNSdzdLUVNCamhnUDUxdVdFRTJ2L0FCSHV3WTFqZ1dUeW1BNUtobDRKejZWbWVML0M3ZUhOV01KUU1EMHgxYjNybGs3STZsRzdSMUhnL1J6YjM2SThqSzh6Yno4d0p4blBHRG5QdFhlTDRxdTdXeVJRWFppTnJiZW85L3l6WEErRDlPZTJTRkliaEh1WnZtWmp1RElPdkhHSzduUXRQdXJyVm9vNTFkNDBqUE9jQnVTY2l1V05kUmtwWE90WWR5alpxNVExdTN2OWJnemIzQ282bmFyS3VWSkhRakhQNFZ5V3RXZXBXYXZCZXdFbVlmNjJNc1VQNThnOFY3cG92aHEzaXRKZ3NJTzRiOEpHTXlMK0pISTYxZ2VPZkN0eEJZSkpwOTlITkRLZDBaa2p5RC9zdDNVMTlYbCtPcDFJMm1mUDQvQXpwdThUeUR3YTdYMnFpM3ZycjdKZnhFTEM1WWhaUU9RRDdqMTYvaFd6OFdQQlIrSStqdGEzem0zdnJRYm9adjRXYkdQMS9JMXozajM0Z1M2SzcyZXM2TTl1NkhNVnpFUXkreEI3MVcwbjR4MnVwNkNMYWFZaDBPekpHR0FKOWZTdXVwWG84cmdtY01LTlZOU3NlUk5iWFBoYjdmYlgxdXNkeXFCUE1RWUQ0UFhucUs2cjRjV0kxZXhXN2lJanVvUUF5L2QzcjYxVjhTVzgvak45UWl1NG9ycU8xK2FPUUhFcXAwNXg2ZW83VkQ4TloxMDJSN1piZ0IwNVRKd3d4Mjk2K1hyOHFiNTlUM3NPbnB5Nkh0R2c2UytuM01EUEVEYjNnMnNlR1ZYOVQ5ZldtK0svQ2IyY0xKSXBrdDVqeGs0Sys0UHRXWForS1o1ZElFUmtBS0g1aDF6Nkd1amw4UzIzaUh3cElzcFZaVUdHR09ZbjlmY0d2QnJWVXBwdzJQWGhTdkd6UjhwZkYveFZyZnd0OFpTeTJqRjRsTzRBZmVaZlhIZjNyb2ZoajhiTDdVTElhbkJjdGJGNUJFNmJlSW14MCtoTlgvalg0VHVOY3R4Skk0UWdZOHhlbWV6QSs0L1d1VzhOZURaZkRIdzh0d3k0bXVwSkM1SXg1aTlqN0VHdlhwWWluS25xdFR5S21Ia3AyNkhyMmhmRjNYMXVJaGV4MmMyOXR3eUJ0SzlzKzlhbnhDMHVieHBwaXoybGxieU93d1VVamsxODYzWGlPLzB1V3pZUHVqWm1oSVBQZmcvclhwM3dtOGJTWGthTkU3eHlSNEJVc1NBMUVvTldrbVZDWDJXangzNDBmQlBVN09kNTV0UGpqdEg2eUtvRHdIM0hjVjRoNGs4TFhPbjNCVnRteGVoM2NmV3Z1L3h0cVVuaUs3ZU84aGlsdDNHSHlldGZQWHhmK0JVRjdjeVBZUEd0dEY4K0VjTXdVOXNDdlR3bUpkdVZuTmlLQzNpZUFycFU4NTJvb1k5OEhwVXR2YkxaU0V1dStST2NBY0N1aDFIdzdiYU14aTN6UmdkU1J0TFZUbVpaN0dTT0FJaUx6dXlDeC9PdlFVK2h4OHBnWGM4a2pFc3hHZWRvN1ZBR1BRSEI3aXJWeHAwa1Fad1JJdWVTdk9QclZRcVJqbkpxazBTNHNYZmdjRTVIU25lWjF5Um5weFVRemdZNEovS2xCeTNISUZPNEpEdzJjNEl5S1ZtSjRHTUNvMTR6ZzgwN25BT2VLVnhwRGxmZGtBWkdLQ3hBR1QxNlUwRU1BTWpCb3lTUmpQRkZ4Y285SFBBNkVkdldsRGc1NFBGTUJ4MUl4Um5PTWoycE5sSkR3L1RPUVJTNzg4OGcrL0ZSa2tkZWNmalNseHlPUVRTdUZpUkhPY2s5YWNyanYwcUVNZUIxSnB5TVZ3TTRwTmpTUDFpdDdxOThYM1FqczRWaWlYRytSdmxSUGJQYyt3cmFzdmg5NWNCa01ydkovRk01eHg2RDBGZDdkZUdiWFNYV3kwKzNNK3dZQ1JqQUdPNU5jNzRrOE42MWV4eUk0UzJUcGplTWpuMk5mTHliUzAwUFRUVGQyY3JyWGlyUy9DdHU4Y0xHZWNEQmJQWC9BT3RYTDJsenJYeENuS1dwTnZiRTRMRGdZcmJuOENhZERlS3QzSzE1Y0U0OHBPVi9FMTBzY1EwMndXS0JFajJxTWdjS3Y0MXl1UzZhbXlUT1l0dmhuRG9NZVpwaE5NeDVZNVA1Vm8yL2hRcUZZUUIwOVdHRCtWUjNQaUJMVjNKbFdXUmV3NUFOWjYrS2RSMU9ZeHhzMFMrdlRGUkp1K2hTUjFXbjZhMXFoaVMxQkRaM0hjRUZPdXZBc002ZWNRSUNSbGp1SnorTmN6YnRkeVRoWTJtbmtCNUxIaXI5OXBtclhxS2tyM09PaXFpOENzcE5yVXVFTHNzK0h0WHNMRFdWdG9WbG1jTjh4QjRGZW9lSGJXUFVnR2UzWlloOTFXQXkxY1A0UCtIVWx0Y0xKSkZKSklCa2tyakZldmVEdFBNRnVqR0l2dDQybnJYSlV4TFVqMHFXR1hMcWFkcHJHcHZwZ2hzNVZzN1dOZHZsd0x0ejdzMk1tcWVxZUtybXcwUjdlMm1JdVNkeElHNXp4MHJ0VWlGN2FxalJsSWdNYlVHUHhyZy9HWGhDYUs5UzRoaUFhTndRMlRrajBwckZ0NnRtYndTMlNPWmc4YmFob2t3dUpaN2x5ZnVsRjVVK2hIcDdpdWc4Ty9GclR2RlR4eDZza1Y3QVdDN3RvRFJzRC9FTThFR3VlMVdHNjhQNnhLN3VCYU9keTVIWFBPUHc2VWwvcGVuWEduU2F6YlJSTkxFVkxnRFlwN2ZNQjcrdFpLdmVWdW9xbUg1WTNhT2YvYXYvQUdjN3JVZElHdCtFNWZzOGtjcHVKWTRGenZ5T2QzY2c0L24rSHozNFcxS1RWUEZOdERMQ3NWeEErMjZpQ21OK09OM1BCQTU0NjE5S2VGUGkxZFdtdGl6TWJ4d241ZnZiMGtIMC93QUt6L2pSOEdyUHhSRWRiMG1OTGUvYi9XUlJrS1cvMmxJNyt4cjBNTmpuR1hKVStUT09lSDB1aHVvZUlieGx0WmJKSUk3ZFVSTVcvQUkyL3dBV08vV3NMeExmWGsrb1F6SXVIdUdDRmdjTHU0SFg2RVZhOEs2WkpMcDlsRkV4UzRzdVpGSDhSdzJUaXV1MVR3aWsraCtiSEVza2tCQUdNZ01lQ3A0LzNhOTF5bk5YUnh4VVl1ekxud3krS2t2aFEyMXZLQ0NqZ0VOems4RWo5YSttL0NualRRUEhlaXdYVTEya0tKajl5allHY2QvL0FOVmZMWGlUdzlKYUcxMUR5c3JlcXNwSUdOck1wL0k1Rlozd3YrT284QitJSllKSFdHQkh3V2tqRFlPN0dhdkNWM0Y4c2hWNkttcnhQdGF4OFM2UllYS3JwZW13dTcvS0pwRUpac2QrUUFCK0ZZdmpQeE81amttUlh1NVY0VlVHSWxiUGNuakgrY1Z6bmhuNC9hSHJhV3JLalhVckRJMllDbmdqT091ZTNJSStsWnZ4aThlWGV1V2lXbW13aTIzSDVwWkFDcW5qN29QRE1QZklIdlhzMDZ5ZWg1RTZNazlqeEQ0Ky9FU0sxMUlOcUx4MzE1Tm55YmVOaVVIMEg5MGV2QTlNMTVicC9oRFZQRit1cGMzNVZSSDl5UGJpSzBCNkhCKzgvb08zdDI5dzB6NEUyZW42ekxxV28zVWw3ZHN2bnlQS3U0cGs4Rmlja2tub1A2ODFjYndVTGVTSlk0MUY1ZHNCYlJIbnlVUFYyLzJpTS9nUHFhOHpGVUx5NW1laFJyV2paSEZhSDRKaTArMWp0N1czQ3hPUXNoNDN5a2s4SDF6ay93RDZ6V1o0MDBCYlRYa3NMZFkvTlp3cnV3eWM1NXg2Z0RKelhzZWdhWnBOdHFzOTdJREphNkxHMGdVRUZwSHdjSEg0RTgrbGVOV3R2ZWF0OXIxKzhZL2FOVkRyWXhxdk50YktjeVNrZHQ1d3FucWVPeEZjMDhFK1cvVmx3eEYyK3h5aTJ6YTc0bmV6dFpNUnRFVWttUEloalVaTGZYSXpqb01nZXRRM2ZocHJxNWtnUXZiV2tMR0lCK3BVWVp5VDNZNUFKOXlQYXZVdmhsOElCb2ZoMjd1YjZEZHFHb3l4ck1pbmFFSncwZHVENktQbWYxM2UxY2Q0MTFLenRkZnVZNFpXdTF0bDJPNHdCbmNDNTlBTXNjZGhubm9CWGs0bWtvYVIxTzZqTnlNNjRkN3ZUMnNZSVlHbmxWWFNIb2thZzhGdlVkejZuMnJudkdlbFI2ZEFzU0ZaNzFseDgzL0xNbmt5SDBKNXdPMWRScFU2V0t6elc3Tk5kWEF3SnY0UDlsRXoyR2NrbnFTcHJJdUxHVFhOWFN5c2xHb1hqeWd6QUVCWnBNY0tXN0lnd1NmWEE3MXd3ZHIzTnBYNkhtR3IrQzMxZldyZTR1VEpLQU14UjV6dVVObmVmVG5HQWZYOEt6dkZPbXZZZUZGZ2dWWkdMT2N0OTBBWUdUNjVPT1BhdlVmaURmMmZnR0JkSUV5WCt2WGZ6enZDdVV0b2llRkhvT3ZQZkJQY1p4ZkVmdy92ZGMwcUczWVNyRzBBbDh1SVplTk1nbkkvdkgzNzRyV0V1YjNudDBFMVpXUG5UVk5EYTV1RXVKWkMwZHJrbHdPSm42Y2V2Zkg0bXJYaG0zYTZWb0pGUkF3WlV6MVZ4ODJDZlE5UHJYZjZ2OFA3alVtSWd0SGhodE1pT01qSVUrcDl3QjE2VlJmNGUzR2w2S0lER0FXbVppY2M1SVhuNmNBZi9ycnA5dWtyTmt4b3R2UTVQUk5hazBMVmQ0eXJ5QlNWNlo2VmovdElhVlBhNlBINGowYTR1cks2YmFaL3M4aGpPNGNxL0hjSCtkYi9BSWgwVXlhaElRcGQ0UUkrUHl6VHZpSjRZdll2aDNQSVVMMit3aVFIa3I2SEgxcThOaXJWWXlUMUpyNGZtcHVMUjRvZitDaFh4aXRORGJSSmZHdXB5V1NwNWZ6YldreGpHTnhHYTVIUXZFdHpyT3N5eVhkeFBjU1hKSmtrWnl6TXhIVW42MXkzaUd5RnZxc2tpYkhTVWxzZHM1NTk2M1BCUGtmYkl6S0pVQTRiWWNuMlBOZlcxSnVVZFdlRFRwcUxza2V2L0NEUlpiN1hVaWNGMmEzZVVic2tqYXZXdnIvNFhhRU5WOEphZWt5TDlwdDE4bVZkdVM2N3VEOU9uTmZOM2dYVXRPMHA5UHY4cEhORy9sUEV6Z3liWFhhY2dEZ1lOZS9MOFNVOE82TlpYTmh0akVBSG15dDh5N09EK2RGSEN4Y1pTa3dxVjJwS01VZXFXWHdyT2kvRXQ1aENRMThvZkdDRjZIam44YTR2NHorQlJINCtOcUdaSmtVSGFXTGNFbmdWNkJjL0VlTHhEcDJpNmxZM0RHUzBpaXVuTHRnWVUvTUQ3YlRXWDhVemIrSXZFMFd2d3lHSlp2M1RPUmxFQlVFRUg4eFhqWTJrNHhzajFNSlU1cFhaenZoalRvb05RaThwaXdNWVFISEpBNDQvS3ZiUGh4b01WekFKYmhFK1hoUWUxZWFhRnBpWEhpVnhiUmp5VUFDTmpxUFgyejZWN0Y0TjBwbmdXTlNJUjJQWE5mTFZKUG5QcmFGUDNFekk4WG1YdzJrandsVEVuellYZ3FQYXZPOVgxcTd1b1pMbTNlVGVNNDNaWGY4QVVkQ0s5NzFYd2hGZG9BK3h3ZzV6MFBHSzg4OGRlR250NEdXMlVqbmdBY2ZsWFhoY2RVb3N4eEdCaFZXcDh4ZkVGVzFpUjRwMDJsU1NBdlFEMjlQcFhqWGlyUUwzUmRSZVN4S3lER1RHUDQxOWg2MTlKL0Vqd3UxcmRzMDhRUmoxZGV0ZVJlTVBEY3NEK2RDQzhhRThqN3ljK2xlakhITjYzUElxNEpwN0hsMXI4UVo5TDFZWEVjbXhpTUZXR1F3STVCcTNwZmpSTlN1MWtVeHM1YmdnZ01wOUtkNDA4Q3ZyYVBjMmtZUzdSU1dqVWNYQUhPVi8ydmF2TTJsT21YbnpQSmJ5WnlDUjhwNTZmL3Fyb2pLTmFOcm5GS0xweXVmVDNnclZwcnkzVWhvNXlueWtFQldyY2l1NDRYbERDYU15QW9jamoycng3NFllSkptdG9wb3JwV2xnL3dCZENPNDlSWHRtbGF4YWF6b2lOS0JMSEoxWUtQTVQxL1d2QXhOS1VKMlI2MUNvcHhPVzFlMWt1eTFqUEc0VWtFY25BOXZ4cmQ4Uy9EMGFwNFdTSWhDMXZiS3hicGducG4zUEZPMWlLTFZMSUVLeG1RaFk1RkJBWmM4QSs5S3ZqWCt5NEhqbU1peFhCQ3lCaGdyamdmV3RZUmx5YWJtTXJjMnA0dDQ3K0hVbHZhMnJxaE1pU0JHeHlDM2V0Yncxb2R4NFV2RVprTVlra1UrNXlUZ2ZwWHBra3RocWRySmN0UEN5K1laV1FrWjNFZ2NWMEUzZzIwOFdhaHA0Vm9XY256NU9tRkE2ZEswamlLMFZhUzBNM1NnM2RNNFc2RHphUElsMGdLUzVBZm9mcFhndmp6U0xydzE0aWt1N2U1Y0NNOGcvZUE5RDZpdmIvalJleCtGNWJHM2x1akdsM0tTcFVaeWM0QXJ6N3h6cEZ2NDQwT1pyVm1XNXRGSllFY3NNZC9XdXpEVm5GcVQyWmpXcHFTNVZ1anlmVU5Jcy9GbHBOT0xVUTN3NEwvZURER2M0elhudXFlRzNzcEpCTExHaW9jRFlTU0I2bXVxdmRjYlRoSENReU5PNUtuRzBrQVk1L09zWFhsdlBLZFhLdUdiY2dZYldkZTQ5ei9PdmZwMUxIbHloZlU1ZWE1dDRidG1pZWJkbkJJQXdhTlFzb3JvQ2EySXczM2s2RUgyRk92dE0vY21lT04xQis4Q0Q4djhBOWFxa0RGWTE1WlFUajZWdkdYbVp1SkFSNVpJd1Jpa0pYQUhPYXMzV2JoTjVBM29kcmUvdlZaZStlTWUxWHpDVVFCSFlqTkdUZ2NkYWNJaTZFcUFOb3lld0ZOQXdlY21pNDBoVkk1T0FLTjRYdU1BMGlna1l4eWFUcU1BNU9hTGlVUlNRRGdESUZJV3lCa2NHbHh5Q2NnQ2c1SkJ5Y2VwNzBybEtJQThlM3BSdkFCN0gxcE9BcEhVQ2tDNUl6bkZGd2FIaHp3QUNBS0QwT1JrbW1rOFo0SUZCOU1BbjZWTFkwajl6ZFFodFBBcmdhamVtZWQ4a2hUd1RYQmVMdkVkLzRsbGtpczQ1WW91Z0NERzZwckx3enFmai9Vak5kR1FRczJWejFiNkN2U2JId0ZiNlZwR0xrSmJ5QmNCU2ZtZjYxOHFveWs5VDBKVGpBOHcwTHdpMm5hY2JtNkN2TC9jQjcrNXJHOFM2a0x0V1dXUlVWZWlLY0N1cDhhM2IyaCt6dk10dEFUeVR3QVBhdU4xcUhTNVNJN0s1TWpINzdzQ2Z5clNPSDdzaFY5VEVlV0g1bGhpa25ZOVFPRkgxTmFPZytHNzNVcnBXRHhXMEI1Wmw1eDdWa3o2anArZ3psVUx6eW5uTG5qUHNLczJuakY1NWxRbHdXUHl4cDByS29rdGpXbkZ5TzUwclRMRFRYdzB3a1pUeTJjL3lydC9DYTIwazZBQmlyZEM3Y3Q3QVZ3T2hhWTg2eGk0UllqSnlGSFd2WGZoZG9FVWtXWFJYY0g1ZDNPMFY1dFdWejFNUFJ0cWROcEhoUnJtTkc4dFZSdlVISXJVajBoN0IyVlFISVBJeGdmVVYwMXE0aTB5R01vcGM4RURwVDJ0Mm1rM3VpWnh4Z2NWNXRhU1dpUFdvMDc5Q0h3L2JsU2pNNGozWUhQRlpuakdXTlpaRVZFd1d5R3hXL0Vna2dBY2hSR2U0ckc4UjJENnFubGJCR1dQSkM4bXVSMW5heDFSdy92WFp3OTlhUmFoYk9zc1FjZy9LS2c4TGZEaTUxYS9saGhpWmxuWGEwWkhLOXdlT0RYZmFYNFh0TGVCWWdUS3g0d3dydGZHc0dtZkNiNGVRR0NJUHFOK3U1K3Y3dGY4QUUxdmhvYzkyM2F4ejR1TnJRaXJ0N0hoRjM0SzByNGNOSkhad0plWHBZbHdUdUVaOVB6ckoxTFdKZnNSZWRiYXpCL2hWeG5OYmQ3TmQ2emVTWEVTb0lqbDJrSjJGY2VvN2dWNGY4Y1BpL05hNmlscnAwZm1xcElhVXFEdXg2QTEwUmZPdER6NVVuQ1ZtZHJvRzIvMWw1Vmh4T1FSdlVBNytEaklIYzEwOXVUYjZWY2hoTUdqVkpOZzV5UTZqK3ByQi9adXRYOFRSVzB0MjZ4TGNEYTdBZmR6OTBuSHVCMEhRMHZ4RThTTjRiMVM3U1I5cENuQkF3WDR6alAxV3ZvY2x4U21uVGIyUEZ6R2x5eXVqdGJsWWRWOEl5Zk9xeldzYU9xWTZLR09SN0hBWDg2OFY4ZStCSVlQRXQ1YUFFaHBRSTNJd1NHQVlacjFYd1Q0Z3RmRVZ0ZXFKTXhhaEJzVTV4NWU1VngrV0s1WDlvU0dDSHhSQ1lCdFdReERkbmFUaE1mejUvQ3ZZblQ5N1E1S1ZSclFpK0djTHFpQ1M1U0dXRk1Jek1BbVBUbjYxNmY0RjA4MjJxU1MzRFhGMDZjamVEdEE5T2UzNDE4KzZOcmphbks3TTJGRWhENXhoUG00UDlhOVAwcnhtYnV6ZUdYeldrdFNCZ3Z0REFjSE9mWDI5NjFwenNiVHA4NjBQVzdTemExU2Eva2lrdVkxSmVHM0lCYWQ4Y00zdDZlZ3JuSXRYdUo3Uy93QlNRQ1cvdVFZNDI1MjhzRk9QWWRmWUFlOWN6byt0M3V0dkxhV2FBU2tiRmRuMmlBRTh0bnR4L091NThNK0ZaSFVYQWlXRzNWUEw4eVFnZ0x1eVh4Nm5CUDRpdFkxbEo2bkpQRE9LS0Z6NGVYdzk4TzFsbWNxTDF3clpCM1RaUHpzZllnRDhDQU9hZnBQZ0dmUjdDTzVuMm0rbUlqMk1BRlVxY2hCMndHWURIcEd2cFhSTHBjWGk3eGhZU1N6eEpvK2xvR2lpQnlHZjd4TGRzNTYvU2wrTHZqT0xSNDdwN2NLMGsyNkt6VWdoa1hKM3k4ZE1ublBvbzlRYVZXYWF1VFRwU3Vra2VkL0dIeGZCNEk4S3JaUTNLdzNjaGFLR1FNTTg1ODZZKzV5d0hzSyticFdQaXpVYmhFZHJYU1ZJVmxHVEpNTjNWajZrai9QV3VyK0pFazNqUFg5cFdUeVlnSW9WYk8xVkI1NEhjbmsvL1hOWFkvaG5jWHVqV2xqYmsyOFZ3Kys0bnh0YVFBYlFCN2ZlNXJ3Y1RPS3ZKczlxamg1V1NPZjA1cm54anFRczlOUXJIRUJDMGlOdFczVCs0dU9ybnVlTVpQdlc5cVd1Mkh3dXRHMHpTd3AxR1VCYmk0QURGQjFFYStyRTlmUVZMcU45YWVEZEpiVDlHaktNMjdmT0Z5emM5Rit1T3Z0MnJuTGZ3ZmZhbE1aWlZWcmdnbElnd0FqVTlTVDJKN2srOWVITnViMTBqK2ZxZWhIRFdXbTVtK0R0SU90NjdKTzBTR1M0ZmRQTzVKQngySjc0R0JnZFB5QjdHZldyVzB0YnVWcGxnU1FpSWxUKzltRzdKeDZmZFVjZEJtc2c2RGYyaFcxdFVrSjIvdlpGWEFLam5ZbzdENjhtbWFGOE9OVHZMMWQwTTgwc2pBc1hPZnc2OEQyRkU2aTNiTGpnMitoYjBUUlpmRXMwOTFIQXNOcytSRUNNYnUvR2F5L0cvZ0dTMXZZN2VCUTVTQlpBUXVSbGxCT1BwbjlLOVY4TytEWDA0QmIyVlM1QVhhaTVNYStneHdQeHIwYlFmaFpaYWtJcm1hQUZOb0R2SXgzWXh4Z0R0WE5QRXRzMmhoSEZueC9wZndHdUoza1pvOEFqY3pZeVRqdDlheGZHSGgrR3kwNTdPNFNTRGdwSXJESTZkUUQyNXI3RjhaZUNZdEZ1a2t0RVlRREhLajdoQjZrZTM2MTQvd0RIL3dDRWR0NGowaDU3UXZITWlrcTRIeW42K2xLamlYenJtTlpZTzhkRWZsbDhkUGg1UDhQUEYxekE2anlXbE10c3c1VjFKSjQ5cXkvRGJDRUpleGdCVUdNSCs5NlY3dDhmZkRNT3B3U2FicXJHR1NGOXNVMk1tRjg4WlA4QWRQZjg2OEx0ck9iUmRYa3RMdU13c3Z5bE04QTlpUHI2OTYrOXdtSjlyUlY5MGZIWWloN09xMGRkNFAxcnk5Y1IyZGhEY2dod2VjTmpqOWE5WHN2aUpjVGVIbzlKODRDQzIrYmpreXQzUDRkcThUdHdiT1liUVJISmtaSFVHdXM4Tlg3TVlXSklKK1VrMHFsV1MyWVU0SnZWSHYzaC93Q0tGeHAzaHVHMVYzTXQ2aTJ4NU9GUlRuQStwcjJEUk5ZZjRsNlRwbWwyN01rVnZHc1RPR3h1S2taWStnd1AwcjVjMDYvWklvWEpCSG1rcjdjTHgrUXIzMzRDYTVCcGVwM0VKQmtTWmtsWEJ3UkdjRWpQK2VsZVhpOFZKSTlIRDBGYytoM3Q0b3J5M2cwNlAvUW9Vd1pzY3piUU11ZlkxM1hnNitoZ2hReU5nOWdEMTk2NTd4T2thK0FZekZMSERGYlR2NWUwY3lMaERqUGMvTUQ3VlM4TzY3RkhBakt4QXh4eG12RFUrZjN6NlhEUjkzbFBWWHUxdW9TUVJsK0JnOFZ6ZmlpekVrTEFLY2lxVmo0cWFQQjJrSzNQNFZMZitKbHVZZ1NxZ0o3NXpSS09oMndwK1I1bjQ5OE1qVXJGOTZocEkraDc3VC9nZjUxNWQ0azhHT2lGNHhndXBLazlOdzRJL0xCcjNyVlpyZThERXNOcFBOY0o0MzB4YmQyMkVGUjh5akdRRC84QXFxNlR0b3pIRVlaTkhnUC9BQWg4V3Bha3lLalEzS2ZPWXdkb1lEbktuc2E0UDQvL0FBTEZ2cDhlcVFLcE1wUDJtTkZJS25zK08yZXBINGpnMTdGNHc4UFMyR3BpNGgzSno1aWUzZjhBS3UwMDN3NVkvRnp3bkkwYzYyMnJXOEdKb0d3eTNDcU9jQWNnanI2NHo2VTU0aWRDU210anlLMkM1bFkrSFBDVjdjZUY5UlZaQ3pSSDVCSmpLNDlEL2pYc253NjFTTjFlMkZ4SWdsRzRLRGs4OXg2L2g2VlYrSW53d2o4TTZwSk5DaFNFdVF5Yk1xbnQ5UGVxUGgzVEJZU0xMYnNaVVVoZ0Y1ZTNQOC94cnNyVjQxWVhQUHAwSlUyYTNpYS8xUHdkZm5ONUpKQ1d5dk9Wa0dmVWo5SzViVlBIYlg5KzBNdHl6TEo4dUdCVXFmUTE2SmN2THF1Z0dHNGhXN2kya2hsWDV4eHo5UjdHdkdmaURvVFdFMGt5aDA4czhPTTVBSFlnK25yVzJIU2xIVWlvN00wZitFcWwrM3d4TEt4SmtIQk9lTzlldWZEYnhwTHAyalhWMlpWV1daZkxqeWM4WjVOZk9maHlWN3ZVUE5kMkczZ2RlQWV2NDExVS93QVJ6cGRwR2lNUkNBQXE5d09nL3dBYTFxVWIyU00xTkwzbWRiOFRkVmJ4VVltdVFBWVpDSXM5UWUyS3pmaFZwRERYcFpKSm5lT2JnNTZudGlvTlo4UzJHdDZKRGNHWUlRaE9mVnZUNjFTOEc2eFBLSTJ0QWM4ako3NDcwbkY4bkt5VS9ldWp1N3Y5ampTZkVHdnkzUnZyZU9OVXlzY3FFZ2NjL3FhNS93QWQvc2RXL2lPQ0FRK0k5TGpOb01wc0JIODZwZU52aUxmYVhJcjMxMWRJWFFZalE0Skh2WG5QalQ0elhwbVNDenU3YUNPU01rcXpHU1RQNGNWclJqV2RyTW1iZ3RHamM4Ui9zZCtJclhNbWpTYVZyQWxVQjRWdlVWajdBSCtsZVJmRWo0TDYvd0NBcDFUVS9EMm82U091V1FzaFBzM1ExdDJQeFp2TFM5a1VYK29HVmxMY0FLcWtjOGQ2NkhTLzJ2dkdGcllOWXlTMm1zYWV4d2JlOFh6Q0I2YzE2RlAyOFgwWnpTOW0ralI0ZzBNaTNFeTdHNUhZVkI5bE93bVJndjFQTmVyL0FCQTBiUy9IV2x2cXVtMlIwcS9mbVNGWC9kUDZnRHNhOG5raU1jcksyY3FjR3UybFU1dkl3bFRzd2VZT20xU1FvOWVwcG5SZ2M1elRzY0VqT0tVSWNaSXdNMXB6RXFJd2RjNHlUUUFCZ2RPMVBXSThjZGFESGs1SElGTG1IeUVmTzNKNUpvd0FBTVlOU2VYazkrYUZpSllZd0FLSElhaVI4ODVHUWFPaFhIZXBQTEhJNXBCSGdldWFPWWZJUjR5Y0hCelFnTzRFOGcxSVl5Q2VDQlFJODRIWE5LVWc1VDkydGY4QUgybmVHN2NqUzdjeStXTWVkS1FpL2g2MTVONGorTDArbzNNcXkzVzVtUEJRRTdhMnZpdjRsOFBlR1kzU05rbmxBNVl0dXJ3ZnhwOFVJSmd5UUhHZVBsNEFyd3B6YTBpalNuVFQxT2o4U1hubXMxeGRYejNaNUlEc1FGL0N1YW04YlJ4emxJNVZRTng4Z3dhNHlmeFZlWFRGWW9HbURudTNTcm1nK0c1OWR2WTFMaU9RbkpDak5jODZqUzk1blhUcDlFZEZwbHRGck4rV2FWMXllUzNKcjBMd2hwOXZaVHFMWlBNbkkrKzR5UUtwZUNmaGNJb3hLU0d4MVBYSnIxWHdiNElnc3JVeXNBVzl4WG1WNis1Nk9Ib0pqdkNQaCtlZVpYbnl4ZnYyRmVxK0VMVjRtampqR0ZRWXJHMDNTYmRJWTVrbFhhbzVBN2NWMFdqNnFzcGphRUFNdkJJSFd2TXExcm5yMGFKM0VZTnRERzVCSjR6NkN0TzFDM0VRZllBdlRyV05vdDB6d3NaUVNYOWE2anc5WmcyNERZSUp6aXVLYzIyZWxUcEpSSTRyQmNxU29JWTFNMm5wOXRBWlFReThaSFN0UjlMVVNid09DS2Mxa1hRTUFkeW5pc1hGbG96SmRGUzBuRWlKem5OWXZ4QXRwZkVFcVBPemxWR0FQUUN1MGVQemJjbm5PS3o5UzBkYjZ6SzRBUFVjVkZwSk5JdU51WlNmUThwOFM2YkRObzcyY0tNalRmdXl3R2ZsNy9uWGhueGErRWkybXVReGVXcVF5ajkzZ2dFNEJ5TWZTdnAzVWREYTFMTUZIeTgxNTM4YS9ERW1xZUdwNTdVRDdiYUh6NHNkY2p0VzlHcTAwbWN1S3d5a20wWkg3TzluWTZOQmJXU1NLV2xZcHZiNVNyRHArb3J5ejlyblZHMGJ4RE1USXhKUjMyOXkzQngrZWZ6cUx3VjhUM3NmRUxzNTJaMlNvb09DaHp6bjNCelhuZjdjUHhBTjlxeXpvNnA1RXUzYURrRUZPRCtsZXpscmNhemFQbk1iVGJpbTBiM3drK0tqVGFVekk2Z3Y1YWdEK0VFOUIrdGJIeEs4WGp4SnBsck1IY3pRZ0pKem41a0xEK3RlQy9CZldaSXRNbmtSeGhtWUwrQnJ1dEMxU1c0MDYraVBSSlZKUGY1bkdmcDFyM0k1amFUVFBQZUZWcm9nOE4rS0piUHg4OXFyS2JlNG5DWTZqa0gvQVBYWHRudy92WXRRa2ttZDFMbU5XSUp3VG5qcjJOZkwxanFyMnV0V3hPQk8xNk1ObnFBMkRYcWZncnhpMXRjdGxzcSt4c0RqakkvbHhYUzhRazlUU2pEb2ZVWGdIdzVhekI1WlpYZ1pqODQ0SjQveit0ZGJjMmQ1R1JicGZMTkUrTVpKMnhyNmJUMytuclhuZncyK0lXbjMrbkdDYVFpU1dIWWg3RElKSi9sWHBuaHZUaHFWb3MwMDVDUnhsZ0EyTjR6Z1YyMDVSbEhRem1uemFtZXQ4Nk1FbmpGckV6YjlneUdmUFFFOXZYSHNLd1BIR3N3NjFleWdicEhaUXA0eW9VZEVDampBNjllVFhkWEdreFhCYVZwVmt5ZHlnLzNTY0hIdnpXSHFQZ3lEenBTazdvMFEzcnVPZmx5UVI5YzRyQ3FwVzhqYWhDRGtyN25udHY0Vmd0NGpjeUtrVVVZTE51WGRLM3NCMnF2cW1uM1d0eFBLSVpZSUFNSkdEaG55T01uMHJ0ZFkwSTZQUEcwaUtZSmdHR0RuQjZaL0hGVjJ1L2tqVWpHMGNESGJQU3ZEeEwxc3ozY0xUVFZ6elcvMFlhUkVyRzIzYk9BUjFXckhoS3ppdXAzODIxRHFuSkhQemVsZHBjd0pkdElqb2dCSjVJcWxGcDBDVDVqVXh1cCtVWS9YM3J6cWtsME95Tkt6Mko5TDBLSW1TWjBoWm5QQ2JjY1o1cm85SThMSnNSNHdwV1RxQXV3RDhxcGFYQTBzc2U4RVNqaklIQkZkMzRKOE9YRnhLaWhTeVNnakJBN1Z4dDZuYkNuRkxtS2VuL0RPUFVzTXFMampQT0NLNkhUL0FBTTNoOVZGMUc3UnR3ckE4ajBKOXE3Znc1NEZOcGNScEl5eHJLTXFUMFBRNHJaMUR3dEZmMnBaaElZbk9HVURwWFJUdzdrdFRtclZVbjVIazJyK0ZQTG1hUll4Y29SOTNrdVIvVVY1bjhTZkNZdTlPbm10VU5wTmdocmVWZHFTNEhJSDE5SytsWXZoNUpaa05hcnRpSTRMRGRqL0FBL0NzenhmOE81TlgwVjRidU9HNkdTVHVqVTBwNFNhMVNIU3J3ZWgrUEg3ZnZnSnJEU0pOUmdXTlJLTmpoTUFoMTdFZXRmSGNPdUhYN2FLTzRPNjVoK1JXUFZnUDRmZXYxMC80S0Rmc3dRei9BM3hEZldGb2tkemFSRzZNU1pKSVhyN1p4bnBYNDNYTURhZnJNNkl6S1ZrM0lSd2V1UlgxZVJQbXBPTDNSOGp4QlM5blhVbHN6dk5GWVhFSXQ1bXpubEhQQkhzYTE5SmtleW4ydWZsSXlyZGlheGRGdWwxaTFTZFFGays3S3YrME80cTNQZVN4c3BDN2tCd3kraDlmclhYVXZkbzRJYkpub0ExRVEyTU1pSEJVaVVjOWZVVjZ2NEE4WnZhM1ZpckZTcFFLRzdsYzVHZlhnL3BYaHVsM0wzVm1JMUlkb3VWR2VvOUs3THdYcXAreUJXTEI0Y0FBamtmNTVyeXNSQzU2ZERjK3U3YjRtU1hQZzliZTRsTHJCY0VLd09SeXVQeStVVk5vdnhmdDlPdGlvRzhnNHdlU1RYbFBnbTN1ZkUraHJCQ3pMbWNGc0hPUmovNjlld2VDUDJlclM1dG8ydkxxVGMzSkFZQWl1R25CYldQYW8zNVZZczJQeHR2dFNjcEJaSzJPQVMzVDhxdHhlT2RXdTEybTNqVnoweTVyc2RDK0NHaTZGYUxza0RzeHlTelpPSzBQK0VLcy9PMmhWS3A5M3ZRNk91aDMwcHJxenoxTlh1N3BSNXNiUnNEazg4ZlN0UTJQOXRXS05JeERJTm85NjdYVlBBa0g5bHNWQ2tubklISnJNMHZRaXRwNVlCNm5vT1JXVXJ4WjAvRWVkNnQ0TzJPVEtvWkZyaXRTc2J2d25yTWVvYWF6UmJHR0hYb3ZzZlk5Szk2MVh3ZTk1cFVpZ0hlUmtjWUlybHg4TWxsczNhZGlwYmh4L2VIcjlmOEtGcnVZMXFLMlBJL0htbzJ1dGlPN2tnR3lUNVpSblBrdVJ5UG9leC9uMzRmV1BodWxuSWwzb3R5SGpkTXRIam9lNDl4N1Y2VDhRL0J6NklaREFSSkEzeXV2WndPUUQrV1I2VndGdDRqbjBGNUlyZHYzTEhMS0JrTjdmOEE2cXFGTHNlTFhvdUxabTZCcnE2TGVFWDl0TkRJaC9oSVpHWEhWZmF1TThmdnAyczNzazlzVkRET1Vac0VFK3hycVBGWHhEdGJ4Zkt1NGtnSis2eEdWWSt1T3hyaC9FTnF1cU41a2F4U0lSd3lFNXIwYWJVVWxZOHVjSGRzNTdSOUdOaGR5Q0pTQktlVVBTbjZoNEx1Ym0rR1laTmo5TUxrRDBxUzFndUxUVUkxQWxaU2VDZVRYb09nK0k3dXpqV0JyVVNqYjk4Q3RhdFJ4ZHpKVStiUTRpVDRLWHVxdzJzY2Nza01LRG5Jd09ldGQ1b2Z3cmkwUFFBSVp2TWxUakk2a210M1JibTcxZFNyQXBHb3dPTVlxdkJmUWFScVVzazdTdDVaK1VFNFd1T2RXY2xxem9oUWpGM1NQSXZqWjRZbHN0ZFdUVTBuanRsVmVjWUI5cThZOFRYTUxhcEpKYlc5dmc4SUdiSkZmWi9peTF0ZmpEbzB0dGRScUdLL3V5RndSeFh4bjhSdkE5eDRNOFhYVmxNckh5bU9DZS9OZWpncXl0WjlEa3hORnAzV3pNL1JMblVESVVrVkhoNUtxQW94d2NrSHRVZWkrQ0xyWGIwRXVJNFNjc3p1QmdVbGpiZlk0cEpEa0RhVlVldWVwcVo3NXJlMlNHSWJGZjcrT01pdlFkWHNjeXBkelQ4UStLYmJSdExnMHV3L2VDSmo1c245NnVJdmJmTnk1VWdoam10TzR0QzA1SlBKNUZOYXlESmdnRS9TbkdhaWh5aGN5ZnM1eVFSa0NuRzNabEhldEQ3Snp3Q0tYN0VCa1k2VTNXQlVqT0ZzUmpBem1nd0hqakdhMFBzbk9QU2cycEdlQ0NLUGJEOWtaNjI1QzV4blBOSTF1dzV3TW10RnJVZ2s0SkZIMlQweWNldEwycUQyWm1HM2JQQUpvRUI2Y1ovT3REN01TQ0J6aWxOcU9RYzhmcFRWVkI3TXp2c3gyWUhKQnBCYllJejBIV3RBMnVEakJHS1BzckhBSVBGQ3FncVo5MStNZkVVK3M2akpJUE5tRHRuSk9SV1FtaHZQdFptRE14NVVEcFdpZkdWcDVMSklrY0NkbTlLNS9XUEdubWJrdEQ1aW4rTE9CWG15azViQkNITHVibHJGWTZXUUhrWjVTY2JFNXIxLzRZK0NvSk5HRnhIYmxIazVKYnJYaUh3czBtYnhiNG9pTTBtSVkyemdEZzE5Zy9EelI0VnRJWTBRTWlyeWV2UVZ3MTdYNVRwcHA3ajlQMHFEUi9Ea0toQXNzekFBK2c3MWNzNEh1Z0lZNUNGSXdmZXBOWnR6TGFXOGFuY0ZKeGpxYWswRFQzZ2tJM0RlZjRSMnJ4OFZLMmg3dURocGMzOUowNzdMWmJEbHNkYzlhM2ZEZStPWXBGR0N6SGpqcFRkRjhPU1R4S1d3b2JxZTlkWDRkME5OUGxYYW9JSFU5VFhtVGI2SHJRaWJPaGFVMFlSNUNXSTV4WFphSEFvSkpBNHhXSHA4SmRTUmtacm9kR2hPUVNhSVJ1VzVXUnRRV3l5QUVna2lySDJFTUFWWEI2ZEtTeGpJWVl6dFBXdEtGTW5CVWoxcmVOSXdsTm1WSlkrUnpzRzFxclIyUVJ5ckZRVDArbGRFYk1TakJCSXFscUdscEdwUElJNTYxVHd6M1FScnJabk02N3BVVWxxNENnc2V0ZVBmRi9YN1R3UnBrMGtzcXg1NHdlYzE2dDQ1OFJmOEk5cHNzZ0t1eWo1UjBKcjUyOGFlSHI3NGo2MDF4ZVJ0TVgrV0NJZEFmWDYxRXFFYjZtdnRIYlErWS9pSnI2V3Z4RUUxb2ZMaHVuTGJWNHhrL3dDT1QrTmVXL3RYYTlKcW1wSkdTV1dSZ1NQb0NQMHovS3Z0ejRtZnNtMm84RHlYcFFQcWNJRXlFREczYVB1aXZ6ei9BR2d0VW1YWGIxMitkckNWa3dNNVg1UndmeEZlaGdVL2JKSkhpWmpGcW5mdWJYd0oxU082MCthR1IyMlJUc3B3Y0VFa1Y2L285bk5aMjk4N0VvMDF1Yzdoa2pHdzUvWGcrMWZQbndKdkFMeWRVWWxidUpYUWNuTERJUDFKQkg1aXZwbTNsVlliQXRFekplV0xtVGpsaXJISi9KZjBxTVUrV3UxM09Pa3IwMHp4VmRRKzFlS29jSERSM2JxdmJJSGV0NWZFVDJ3dG80NUhBTGJHem5JM0xrZmdDS3c5YXN4cDNqYTVTT01PbHBkelI1NmNoTW45UlZONzVtMWkyaVppd3U0bWRNODRLZzQvU3ZVY3JvNTRhTTl0OEMvRWVTenZMR1lTdEdBekl4SjRHRi93NHI2RitIWHh5KzBlRWhiRnh2dDFaVXp5VzVCNS9IRmZFR2k2L0xlUXpwR1N4amtGd29BNHhqbit2NlY2aDRDOFZ5ckJITkE1TFRMbkE3bFQwclNPS2xUWjBxa3FpVno2enRQaW9idTJ0M0VpcXJMc0hja2NmNC9wVDlTOFd1MzJodDdISU1UcUNNWnp5Znlyd2VieGU5dm9WbmRRaGdnbWtVWTc1QVlEODkvNVZ0YWY0emZXMlprbEErMEVTY25BSlBCSCtmV2xVeHpsRTZLV0ZWMDBlcVdmaTZUVUxkWVhIbUxIOGdKSE9Na2o4YTZmVE5BR3I2VThpSVM2bFhYbnB4ei9BSjlxNGJ3YlpQTTA2dkhJVEpDTGhEN0EvTXZQNC84QWZOZC80RHYvQUxGY3Zia2xvM2pZQnM4WXljZjFGZVBMRU9iOUQyS1ZLeXVqTHY4QXc1TEtrYnFoeUJ1T09CNzFUSGg2UmJoQW9JakIrYmpsUGZOZWw2TnBjV29Xc2F1Q0dPVjQ2ZTQvR3BmK0VPQVhNUXc1NmpIQnJYMlBOSFU2Rk5KMlp4dWpXYlJ6eEpMRzZNWFBQVUVjVjY5NERhQ3h0NG1qZERKSGxnekRBUEhUOUFhNVMwMC83QmRvalJBS3lnQUVkL1kxdDZYQUlyaUtOUVNHeVZIUTV6MHJsOWxLRXZJcHE2c2VnNlFYMUZIVWdzRUpLWTV3SzJkTWdkSXlqZ01yY0hIUStockc4SzJzbHF5eXE3bk9NcUQ3ZEs2ZExSU29aQVFXNmoxcjFjUEh1ZWRpTkZZc2FiQXE4RUlTZW9Kd1IrRlVQRVdsSzFzNEc3QjY3Umo4NjE5TUt1dXh3RHQ2SHJUZFd0LzNEQVlPYTZLa05EbXBUNVhZOEUrS25nQ0x4TnBGM1ozQytiQmNSdEU2OWlwQkhQNTEvUDcrMXo4RnJyNEZmdEFhMW9OeEc2UXhUdUlHeHd5RTVRL2xYOUpPc2FDazF3QWNoWFVnajFyOG8vOEFndDErek5MTklQR1dud2JwOU1kZlBLcnlVempKK2gvblY1YlY5aldTZTB0RGx6aWw3ZWp6TGVPcCtkUGhPK1cwbGtEWjJ5cHZIUFJsNm44cTdEdzlwc1Bpc3lvcmdNVUoycnlTUjN4WG0raFN2RHFCTEVaM0hBUG9hN3p3bHE2NlhkMmpzaXBKR0JNTUg4Um44Szl2RnhlNjNQbnNOSmFKblpXSGg1OU0weVVxcGJkbGNnWTZWMmZ3aTBvZUxXajA2WXF0N0wrN3Q1V0dNRTlGYjFGZHQ0RjhBTDQwOE9SWGR0R2p3WFVaa0FQSVBHU3YxQkJGVy9GZndqbCtHOHVsYXBaTXJ0ZEo1NlI0K1pIaWNaVmgzenhYemM4VnplNUxjOTJsUnRxamI4RDZyTjhLclcvdDlTZ2tqdjdlWXdtRXJoOXc2akZMcnY3Uk9xMjIyUzUxSzAwSzNYbmFUNWtwWDZkcXIvdEFlTlp2R090MldwMlZzWTlSMUNCWTUySUpDdXFnYmo3N2NmbFh6aDhYZEFuaDhWVzFuZFhVc3NSakUwa2pFL3ZXSnhnZXdyMGN1dzN0b0tjOUM4WGozUWp5d1Z6M3kzL2F6a3ZkUk1jUGkrNVNYY0ZWV2lWa0k3ZE9hOXArRlh4czFDNWx0NGRVbFdWTGhjdzNNUnpIS1A2SDJyNFM4QWFCNGIxUzcxR1hVVjFDeG5zYlNTU3hsdFFwQnVCOXdQbitISU9jYzgxOWNRMmx0NEYwZndldDFGS3NYaWV5aXVHUkFkMXJPUU9RT3dOZWxqTXU5bFQ1NDlEbHkzT0pWcXZzNW8rbHRNOFpmYWdJcEd5TzFiL2hlMlcrWmlRQmsvS2E4djAvUzdqUzc2MGpjc3plVUNjOTY5ZStFdW1TWFZ3TUw1aURxT21hK2N4VW91UzVUNnVsTnBYTHQ1cHkyOEtzeWhDRHllNHJ6ZjR5ZkVXeDhINks4aFZESytSSEd2QmM0N2VsZTMvRTd3czFwcEFsaFJra2RjRlQvU3ZnTC9nb1I0cXYvQzBOeGEyY2p3emgwaGxrSTVqUmgvRDZmV3RNRFI5cExrVzVuamNUR2xTZFdSeG54TytQOTNmNmxMQytvdzJpN3NyR29ERmZZMWc2SjR6Zlc3dG95UUxnRGNjamFyajEvd0RyaXZCUERkaWRaOFN5Mmt0ek9JU0daWkJsMjNZOXowTmZWL3crK0JONzRvL1pyMHJXN3gzdHRRa2xNRU13R0daYzhIM3IyNjJWOGtISjlOVDVqRFpvOFJWVk5MVm5ONmw0WWsxMkJtU0lNeWc1QkdDUHBYTDMybHcyUUtUUy9aNUY1QUJBTmZVSHdVL1ovd0JUMWp3MllaYk5wNXlOaXlsaXluMzVyNXQvYUk4Q1QrQ2ZpanFGdGR4TkU5dTIwS09nTmVOVHFYbnlKbmZpTVB5eDUyam1MV0dTMzFOVEc4czViQjNPM0g1VjMya1hwMCszQktsMmZydDV4WEtlQ3JJYXRjb2hjaGhnWklydlpiWk5LdDFoVlZad1B2ZXRPdkk0YWRuc1ZQOEFoTDdpMGtFZHZidXpOeGc5NmRaMlptdWxtMVVxeGxQK3J6Z0FWWnRsajhvdkkyQ0J4anRXUGZ5ZWRkQUV1NjV4M3JsaW05MmJwSG9XcmVGVjhOMkVWekU2dkhLQThiTDI5cThOL2FyOEd4NnhIYTZwQkVxWERqYkt3NkgzcjJEUnRWUDlnaTNua0xpTmZrenp4WG5ueE92RHFXbFBCR0N5WXdDZXBPYTFwM2hxS2NPWldQbXZVckVXcFNMcUY1T1IxcW8xa0Rna1pCcnF2RnVsZVRmRmNiVG5rVm1mMmVDQm5CT2VLN1lZZ3dkQXlQc0FLcmtFbGZlbS9ZOEx5QUQyeld5ZFBPQ0NNa1VqV0dCMHptcStzQ1ZBeEJhWUlKQXpSOWxVbm9TZjVWckRUeU9jQTBnMDRybklPS0ZYUlhzVElOcjgyTWRhU1MxQ3NBRHVGYTVzT09lMzZVMzdDT1BsQS9TajZ3aGV3TW43T01BNEFwZnNnQTRHTTFxZllRU2VNZmhUaFlqMCtVZDZmdDBEb015RFpaeUFPQlNHekp5U0JrZEsyRFlqR0FNMDAySEpHTUNtcTZGN0V4eFpIQklIK0ZOK3haNUg2MXRmWU9BRDFQdFRmc1E5TVVuaUJxZ2U5M25odTRtRzkvT2NqcU9hbjAvdzFLdUl4RVk5NTVyMm5VdE04TnpRYnJTNCtZOUZ5Q2E1bWF5dG9icjVWa2Nqb0R3S3lWU1d6T1pVMWMzUGcxNFptZ25TT0dJTkl3NDRyNlU4RzZNK2c2QUd1cFZWaU1zRjVJSHBYejk0TzhVeldNc1VGb0ZoTGtCNU8rUFN2YTlCOFdXOGR0SFp1NFlxUG41NU5jbGFTaW0yYndoSnRkanA1bU4zTWpRTHNUb3VlM3ZXdjRiMDB4WEc2Und6QTVJNzF6T2w2eXMycExFQ29SVGdkcTYzUnBVYTVZaHVDZWE4U3JMbWVwNzJGaWtranROQ1VTcUFDQVBTdW8wdUFJQUFCelhIYU5LVmRkdVNQV3V3MHE2enRJQk9Ld2NlNTZTT2lzYmNiRklCeWEyOUtqVGdBRVlOWWRwTVhqRzBjaXR2U0YyNEpQTlZDUFl6cWJIUldFWVJSako5SzByWlFNNUhKOUt5cks3d3dBNUlyUnRybENoR1J4WGZUcG5ESjY2bHhJenR5Mk0xaStMTGxyYTBkZ1FjZHV0YU0ycENJaFRnRTlEV0o0cVl6V3pFSEo5TzlkUEtraFJ2ekk4czhYbWZYSldHNW1ST285czFkOEcrRm85TktUemJRRUc0NXh4Vm43RXJ6U095QlZZWUo3VjUvd0RISDQ4Nlg4T05FbU41cUVWakJHdVpKQ2VjZWdIYzFuaDhOelQydWROYXFvclhSSFdlTVBGdGxxMXcrbTI4aXZLd0tzQWM5YS9JL3dEYmM4TFhIZ3I0L2EvcHlSbU8zYWQ1UnpneWZLQ1FmK0FrVjlDUS90NmFoNDI4WFQyWGdmU0xlYVMzSlo1N3FYRE1NL2VPTzN0MXFqKzFKK3k3OFFQaXI4TDd2eDVkSnBkMXE5dWl2UFpXaWxtYUVmZTU1eXdYK1ZkVk9Qc01SYXJaWDBQT3hhamlLRjZWOUQ1TStBMnJuVGRUU0tWaXIyazRYSlk0MmtnSDZkQlgyWFpXQ1A0TTBxOU1qRVFYSlNVN2huWXlCY0Q4V05mQ1h3ODFIN040amtnWldEWEVmSWY3d09NL21HQkZmY1hnUFVvdFgrRVduaDFEeVRmTXhib0dDbDhBRDB3UHhGY2VjdzVLMFpkemh3UHZVMmp4ZnhQZU91czZnektGa1dkbXhqSE8xbHorTmM0MC9rMy9BSWNEU0JsVWtFbmdaM0hJL0lHdXArTHRxTk0xWFVaSTFZSkZjTkZnbm5oc0ROY0UxMlpiV05Ea3pRUDVxWTVBQVlqOHVhOUNpdWFGem1tdVdWamQwTFcvK0VaOFhScElNeHBJQVJqaGxZOVA2VjNuZ3ZVLzdDMTY2c0M1SWljbUlFWk9RY1kvTG12TlBITWJySGJhaEdHSVZZL01JNkhLNGI4aU0valhSNkZyaGgxMjJ1OW9KUVJTSG5JWmRvREUvbCtsWVZvM1YwZHVIbHJZK2xQQkdoUWVKL0NkenA0NHVZNUV1N1p0MkZjRTRLL3JqNjVyQzhHWE1pQ2V4a1YxbHQySkI2ZEQwL0VBbjhLcS9EWHhFSTdTTnBaSGlqdG5lRGN2VVJzTndQMUdRZndOYnZqQzEvNG14MUMzd0V1M1dSZ3ZCRGdZWWZtVFhCQnROeGwxUFdvUnZJOW84RStPL044UHd5UmxSY1JBeDRQVmdRTXQrUUZkcjRRbksyc2R5QmhiaFNEendyWjVBL0RGZUZlRmJvcGJCbzJDc0R0VmM4VjZ2OE90U2VPeWEzazNNQ2ZOWHRqL0FDS3lqQzBqMVlVbFk5ZDhNNVZJV0paZ0FLN0d3V05iZEd3RHV4bjFyaC9DK3BMZDJnWmhnb1FNZTNyK0g5YTdmUnlrc2E1S2hBSzc2YlpuV3BEZFYwY1MzRWJyR0JnYzk2UzEwNHRORkl3S3ZISnVVOXpXbjU2VE5rbFRqR0I2MVBhV0pOMFNNZkxoajZIT2VLM2RKTTVYVTVkR2REb2Qwa1ZxM0EzNUI5aFhSd1NibFVFamEzUHRtdVYwN2VzcklBT0J6WFNXQkpqVUVFOFlyZW5Hek9PcytaYUYyQkJIT1Y2RS9sVm01dDJLa3JncWUxTnQ0eUdCd01qMXF6UEtpUkZtWlFvSFBwWFU0WFJ5YzFta2M5ck5odUJkMEVhcU9OM2IzcjRxL3dDQ2d2aWZUWlBERjVwczlrOTZOUlJyVmtJeUR1R09sZlJueC84QTJncmZ3K0RwbGppNHVYQkIyYy9oWHlyOGUvRU9sVytsd25WOVN0LzdXdVdWL0x5R2toRzc5UHBYazRpWE5KS0hRN3FWTjh0NWRUOFd2SEhnNlh3VjhRTlUwNWcwY2xuY0ZOckhEWURlL3NSVnJTZk9hL2ptSVoxSjhvbkhRWXdCK1ZldC90Ly9BQTFsOEkvR09mVTUwS1crcW56WTVGR1Y1N0g2aXZFTk92NXZEMnBKdi9lMjF5QWV1UlgxdEtwN1dpcDkwZkdUcCt5cXVQUzU5ay9zWi9GWklmQjk1cEVrS3ZOcGMvbnhNejlWWVlaU1BUSXorSnJ0ZENTWHhKNGduaW5lUnJOcnRyaTJVa255MUlHVkdlM1Q4aFh5NSt6eHJrZmhmeEJOY2ljQzN1b2lySWZ2RGp2WDBQOEFCM1hiL3dBWmVJVmgwOUNEdDhqekNQa2lCUExlNXdNQVY4cGpxQ3AxcFRYVStueTllMGhHTE8rOEcvRGwvRXM5L05IQzAwY0VyUXhrY2s4QUUvbi9BQ3B2am45ayt3OGVRVzZYdGpkMjl6YVo4dWVGTnJMbnFDQ01FVjlUZkNENFBhZG92aDZ6dDdjRUNOUVdZOHM3SGtzZmNuTmVvUWVESTBRSkZHaEE5czF6NGZNcDAzN3JzZTNVeXltNDJtcm53UDhBRFQvZ25IWjNIaUcxdXIyNDFDN3RyYVJaVGJOQXNVY3VEbkRFZFJYMUZGOEl0TzB5NVRVYml3dDdxOWdRUndtVmR5MjZnY0JBZUJpdmI5TzhGbFFDeUVnYzlLb2VOdENqMC9UNUhLakNqdjByb3hHYVZha2VWdlE1Nk9YMEtUdkNLdWVENjlhaWZWUTVVQ1JnQWUySzlGK0VrSDJkZ1V5Q2V2dFhuMnY2akd1c01nSU1qTlhybndoOE9TdllSeTdTTitPdGVjcFRrM0pIcVJweFNTTzIxU09IV05NV0c0akRZNzE1MThhLzJQZkRQeDA4UFNSNm5wa055c3FiUzR5c285RGtWNmUraFN5WmlBWUVjajBycFBCbGd3c1hTVlNIVGcvNDFlRXIxRlUxRmlzUEQyVjl6ODdMNy9na1BwT21hKzB1bTNXb0pBYzVUY0N3L0hHYTl4K0gvd0N5TE5wdWg2WnBkdzgwdGhwYUJJNGl2Qjl6NzE5UWF2cHNmbWtoQmtlM05WTGNtSmdCbko3WXIwcTJZMVhIa25KMk9DamdhTUh6MDRKTTVyd1o4S3JYd2pacXNFR3hSenQ3Vithbi9CUUR3cE5xMzdUR3R3UXFZMEcwajhxL1crd3NXbnRON2RoeFg1dmZ0MGFBOXArMGxxTXF4QmxaVkxaSFhpdWFsVXROTkdPUHB0MDdlWjh1K0N2RDc2UHFBU1psWGFlVGpGZWhXZWw2ZmVFTkpJT1BldWY4ZCtINVppODFxeFIrdkhHSzg2dmRUOFFhWmRIeTJrWlFlUU04MTFPWFB1anhZMG5CN0hzRi9iV0VKWllVM0tmMXJEdnRPalZ5NnJ0SFdzVHd2NG1udUZRM0VNenZqa0FFNXJzdE4wKzQ4U1NyR3RxOXZFZUM1R0t5a210RGVPdlF3SUpUY3FZNEkyY2RNOXF3L0VtbEpaUEk4bUdSQmtEM3IyU0x3clorR05Ma2t3SkNFNHp4azE0aDhWUEVEZnZZRlFMSklUMFBPS3hyVitXTjJiVXFOMmVRZUlveHFXclN1TWJTeEg2MVNYUzhucFc4Mmt1U1NSZ0drbHRGaWlLZ2NuOGE1RmlqWjBEQmswOGIrQU9hWTJtalBIVCtkYkQybWUyT2FqTm1BVGtZL0NyV0tKZEF4enA0NUFCR0RUVFk3Y1k2L1N0VnJYcU1uTk5lMjI1SEpKcTQ0anpEMkprTlpCU0NUakZNYXpHUVFCL2pXckpiNTdBVkUxcGdFWXlUV2lyK1pMb296UmFCU1NRTWZTbDhuZHh0NjFvRzFHZUJnR20vWndwejFGYUt1UzZSUUZ1UFFITko1QzV3UWVhdm0zQXp4eWFiOW5VOGNkYWFyQ2RJb20zQnhnYzBndGdUMHlmVEZYMWdHZWNjSDZVMFFnOUNCUTZ3dlpvOTUwZThhNVptUWtiZU00NXJwdE0wOTRnczA3TUFSbm1zVHdxWWRIMDZXZTRRc2MvS0RXbGEzVnpyazRMRWhCMDdDdlNxeVBHcDduUjZOcWFRM3F5SUFBaHlUMnJjMHZ4azhPcHUrOW1MbXVXZzAyU09Nb0RraytsYUZqWnBDZ0pKTGowN1Y1MWFWOUQwcU1EMmp3M3JKbkVNelpVZ2R1OWQvd0NIZFl6SU1FQU4wOWE4ZjhINjBsNXBVU3FjdEh4WG9uZ1V0Y3VoT1R0cnpKcXlzZXhob0hyV2czWUNxU2VEMHJzTkZ1MWRGSU9jY1Z3dWtMZ0pnNXh6WFZhVGRlVW9CeGdWbWxjN0dqczlOdXNNdTRuRmJWbGZCWEJIYnRYRjJ1c29PQWNFbXJ5ZUtMZTBHNmFaSXdCM05kRktDM1psTTdFNjJJRGtrQVZQYStKNGdRQ3k4OXM5SzhpOFFmRklYVndiZXlrRGs5V0J6VGRCMXUrdTVSNWdaUUc2NXJwalBzWk9rbXJzOXIvdFZia2JsWUVqcG1uaUlhbEVRNUtzdzU5SzV2d3NzbDNDb2RzRTlLN0RTN0l4WUJ6azlLMnRkSEpLMFdlY2ZFTzRidzlhaUNJZlBJY0xYS1dQN0VHaC90RGVIZFZtOFI3N25kQTd3b0pHR1dBSlZmeGJnbjNydS9pMUZGWnpHN21BOHExUXNmYmtVbmdiNDZ2L0FHUVlOSTArYWJ6RjJpUXJzUWY4Q05lNWtWYWxSbTZ0UzJoNDJlNGJGWWlsR0dHdjUyUHltOE4vRDlmaC93RHR3WCtuYVpvTnpvbWx4M01zWnNaWE1qUVJZNVVzUU53QjZFajByOUx2Z1ZvYzAzZzFMZWUya2EzZE1ZZHVxa2RNR3NiVWZnTmErTnZpTGNlSWRXaHREcWx5UWtyd3Jzd29QQTNkV3IyRHd0b052b0Zva0ZydU1haitMbXVEaUxFVThYaW5WcHF5UFV5ZkNWS0dIalRxYXlQeXAvNEtmZnNXSDRFZkVXMzhkZUhyVXhhRHFNeFc2VkZ3TFNSaVQrQ2s1STk4ajByVytFRisxeDhKSXBGalJvclc3aGtIYkNTS1FlZlRxUGF2MHArTjN3ZTB2NDAvRHpWZEExaTNTZXoxTzNhQ1FZK1pjamdqMElQSTl4WDU0ZUVmaHZxWHdyMWZYL0FXcGcrZHB3L2R5bE1pZU1NVEc0K3U3UHRuMnJ3Y2JXZFNndWJlUDVHODhGN09welJXa3Z6UE5mMmk5S1d4T3RTVy93QzlVc3M1N2tkTS9oZzVyeE1YTzYrQVRLZ3diaHpqUE9jZnlyNk0vYUdoanNyMkl5N2piM3Nma3ljZEJnSWMvVEhiMXI1MnZOTWx0OVhFWUlCUVNSNXpuSUMrdjVWNm1YejVxS1BFeFVMVFBRSXZEVDYvNEN1NG80L01uUkRJcWpra0tNNC9KYW8rRjBYK3pMR1VxWlJhTDVNd0hYWXpuYVQ3ampuNlYwZndmMVkyVW9kLzlTeVB1QjVCWEpJLzhkTlVORDBxQzA4ZGFscEpaeGIzSWFNTURqQUJ3UHkrVS9oVUtYeExzYlUxYVNaM0hnYTZOanA3cE03TkhMaFFPeElJQUovQnlQOEFnTmVpU2FuNTJuQ1JRUVhkR09UbkJLRFA2NXJ5dndyYlhNMXROYXpLeXZDeExnbkpCVVlQMDY1cjBXeUJ2N0dPQkFXYVJrd08rQi85Yk5jMDFyYzl6REs3dWRqNFczWE1zQ2hUdElBOXMvNUZlcitFSkdnbVZpU0ZVQUgwRmNSNEo4UFNNcUFZWGVNN3NkQ01jVjZObzFpdG9BV08vR01aNzFTaWVqR2J1ZDk0TnZ3TUlWSlZ2bEpQR2E5QzBpVlV0d3BPQW83OFY1dDRjZzN1cktXQUhPQnhpdTQwaUZtS0Yya0lZOU0xcEJhaXFzNkswak16SXhZS0crNk0vclcxcHNMeHNTU1NTUitWVWRNc1FpZzdBY2VwNlZyUTNDeExrWUJKK2xkMU9MM1BOeER1YUZ0Q0VsUmdDU1BsQTZZcm9iQkFrYWt0bkIrdGM3Wlg4Yk1XTHFjOVBRVnJXbDRySVFXd1c5NjNTVzdPWnIzYkd4ZDZqSFlXcGRtQTJmclhrM3gyK1BOdDRMOE1YY3JYU1c4Y2FGbmtaZ3F4REhKSnJiK0pYaWFXQzNkSTJBVkZ5OGhPRlFEdlg1UGY4RkxmalI0citJdmpxNThOTWIvVC9EY2VCQ3RzaFk2aWM1M3NSMnp3RnFxZE9WYVhJblpkWDJNcWxTRkNIdEpLOHVpN25xdnhFL2FRMUx4cjhZdFQ4QWFLOXhvZXN5NmViMGF4S2l5dktqUkNWUkFNa0FNakFoeitWZWRmczYvcytRNnQ0aGU3OFEzZXJhcGNwSjVtKyt1R2tSbXoxeFZQOWduOW12eE5yZnhDdFBFdDlwOTNZMjFwYXRhdytlRzgyWU11M29lUU1WK2hYaGI5bWF6MHpSRUUwVVVkekwyVk1NdjE0b3hsT25Da3FkQmVyN21XQzlyVW43WEZQZlpkajRWLzRLSGZzOVMrTWZoMDBrY0VjMDFuSHVoWUlEa0R0WDVyNlA0YnU5V3Y1N1dLM0R5VzVLK1cyQVF3NDRyK2k2OS9aVXN0ZTBtUmJwL1BqSzRDRmNpdnhxL2FmL1o1dWYyY3YyeDlYMG1XSXhXbDdNYnUxT1BsWkdiUDZWaGwrS25UaktFbDVvckg0R0ZTcEdVUFJuamZoSDRiNjRoUlA3Tm10bWxJUXNRUXFnOFpKcjdaL1p5K0g1OE4ybHNvQUxSNEoyampQcldGb1hoVk5TOER5eU5FQzRYUEE1cjFiOW0yMU9wNkdkd0FsaWtNWkhwaml2SXgrT2xWdW1ySDArVlpRcUUwcjN1ZlNud2tEbUtFT1F4NDY5SzlyOE42THZRRW9DcDl1bGVRL0RDM1cxS0FrRWdaRmUwK0VMMFRJRkl3Ung5YTRhS1RlcDYyTG9XMk5WTkVTT0VNTm9BOXE4Ty9hSThaTFlDVzNpSUN4QTV4NjE3eDRsMU5OSDhPM0Z6SXdWWTBKK3ZGZktQand5K01acmhpU2dkaVFUM3JzbkZXU1I0OElwdHVSeUhoWHd0THIxMEx5NEpBTFpBN1Y3NThOL0VFZGc4TUxzcENnQVk2VjRIZDNtcmFYNGNuc2JhUVcxNFZ4RE9FM3FQd1BlaytEdDU0NzB6VWwvdEs0ZzFlRU5rc3NYbHlLUGJIQnBVWFVTYVBRVkdrMWU1OXYrRmIyeHZicEdralYxVWMrOVhkV3RGdDd1UzV0VlVSa1laZmF2UGZoNVBxV3E2YThrTWNjRW0zQ2VhVHlmcFd6NGEwUHhKWVhON0pxbXBSWGFTakNJa1d4RjloMy9FMTEyYWlybzgrZE9DY3ZlK1JwZmFJcjJZaHNBRTROYWRqNFVpbHc0WU5rWkZlZngrSUhzOWNsdDVBVktIb2VLN3p3OXJ3YUZDQ01IaXNvOHNuN3hyQ2hKSk9KZGxqT254RmVNR3Z6dy9iNW1TRDQ5WHlrQUdTRlBwMHI5RXJxVDdURTJTTVYrYzM3ZEY0bW8vSHpWRVJRL2toVUp6eURpdFZHelZqbXpDbWxUdjFQQkx5MWprUnZOSlluMzYxUWkwSzJ1SHcwZWM5K3RhK3FXQVZDMjBvUjcxeW12OEFqWnREQlFZSkZPcFVqRFU4bUZOdlk2U0hSN1BUQXI1UlFPZWxVdFYrTzFyNGNkb280a2xBNHppdkxQRVh4THZyNW1WWFlMNmRxNUc5MVdlOFltUmprMTU5YkhYK0E2SVliK1k5QjhkZnRDMyt0bzhWc3doUnZRVjV6ZWF0UHFFelN6U3RJeHp5YXJPQ3hKSkpKcGttV0FBQndLNFp6bE4za3phTk5SV2lIUGNzM1VqSHBVVE9BTjNCeCtkQmpZcVFEbW8zaVk5RDBvaWtKeFlTT0RqR2MxRThnSkl6MC9TbE1iYlNBZW5CcU5vemc5U0swaWtRMHlONU1zUmdERk1keDJBT1BXblBFY1pBSnh4VWZrRTVHT1RXMGJFTk1qZVRHZW44NmFYTFk2NHFRd056Z0hOS3RxZURnMW9ta1E0bFVuSjV6a1V3c2NIa1lOVy9zaCs4RjV4UTFoa2ZkSUk2WXFsVVNKY0dVUzV6bkpKUDZVMDV4a0E1OXF2Q3diYWNxUWFZOXBoZVFCajlhdFZJa3VES1RTRlJuMXFObmJnNEpxNjlzQ3BBeGdkYWpNS2pQdjdWYW1pSEEraExGNXRTZ0FDS29BNXlvK1dydGo0aHRyS0VCVjh5VlBsOWhXSDRJOFV3eTI2U3U0a2QzMnNoN0ExbzNkdGF3YTJtQUJGSVNTQ2VBYTlpcFR0ZE0rY3B5MXVqbzlGMU1YY0R5eU45NDRWUldqYjIwbHpuYUNxR3N2UWJDRnJ3eEl4MlJnSEo2R3Vqc3o1MHNhS0NOeDU5TVZ3VlhiUkhyNGFWenJQaHpvckpBcWpBREg4YTlrOEhhWXNBVEdBb0ZlY2VFb1ZnV01KZzhZRmVsZUhaZ2tTRW5rZGZRVjUxYU9wN05HVm9uWjJETEVnUFFEbXRDRFc0cldFczdZQTlhNFh4SjQxaDBPMkRGeVQ5YTgyOFcvR3U1MURkYTJSWXlTY2ZTaUZKbCsxUjZyNHcrUEZ0b2M3UVdoTTg0R0FxYzgvMHJuYlBWdGM4ZFhBa3VIbWpqWS9MR3VSV1o4RS9nanEzalM1VzZuTFJSdnkwakRKYjZWOUFXdmd6U1BoeG81a3VIVUdOZVhjZ2sxMTA2ZDlFWnlxOHVyT2Y4RStDbzdEeXBaOGh3T2QzSnJzazFTeTAxRlVzZ0k2WTdWNEY4Vi8yczlQOE9hZzF2WnRBN0tjWU15cXgvQW5OY00vN1JOL3IwZ2RvWm9rZm93NUZka01NNDdvaFZvMU5VejdZOE5lTExjNEN5QUVlOWQ5b1BpQ0c4Q2d1QXhyNHErRVB4a2t2bk1Nc3BMcjZubXZaL0RQeElkWm8vbUl4NzF5MVp1bXh5dzZtdEdlemVNOUpFdHNaa1ZKQ09vSTNCaDdpdU1YZjU0UWhZb3djQlVVS29yZThOZU5rMWUzOHVSZ3dZWTljVWF0b2lNUE9od2Vja1Z6MXBTK0tKdGhvS0h1U0pkSTBhT1JGY0FrMTAybDZZRXhnWUlyQThNWGlNL2x0Z01Qd05kcllSS2lBZ3RuR2MwcUxjMXFidVhLeUM4MFUrUUNxaGdlU0srZVAyby8yZll0WHZyZnhIYXdvdW9hWmxaU0JnencvZUtuMUlJQkg0K3RmVThNYTNFSHFDSzV6eHBwaWFqcDBxdEdDbys4Q1B2RHZUeE9IdkIyTjZjbE5Xa2ZsYisySDRQWi9EY1Z3Wkl5dHZNVlhCeHcwaHg3OUNLK1pQRTluQ212ekJDeUl6TkpFVDJWMEJ4OUJuOWErNVAyMFBoKzBPa2FqQmlSamFIZ1k2cUdBeitTNS9Hdmgvd0Faa3phdk95WUNSVE5HQU91M0FVRDhEVTVOVnZSNVc5cm8rYnpHankxV2pwdkJNRWlXVWFzR0RDMndWSEJKOHNDb3RXdVNQSFZuY2hXVXBMNWI0NDNqQUIvblczNEt0MHVZSTRuQlYvTDJodW44UEFOWmV1YVhKYjY1QXUwaHBNTXZHTUVEay9wWFhTbW0yUXFkckhyVmw0Y1czOFd6cUFHUzZYZVIwVTVCQjU5K0RYU2ZEN1RqWlN6dFBnbFdBVWRlaHJtZkM5MnJ3YVpkeWJuSGxMRTU1NUk0L2x0UDQxMkY1czhNM2dMdURFVTNCczVIQngvVDlhNTQ2T3pQV3c3NkhwdmhpY1JCQVdKSU9SMnJxTk0xYUJTRExJQXFuZ2sxNFphL0YyS0Y5dHJHOXc2OUFNNE9LMnZEc0d2ZU5MdFpHU1NCWEh5cmpoYTBWenZVdExJK2d0TitKbWphSXFDZTdqR01kd0sxTk8vYUowb1hLcEJITGNFdGhTZzRQNDE0dW53ZzByUzRXdmRlMVUycUw4elBKT0YvbndLOC93RGlQKzJOOEkvaE1XdHJUVXRUMTYrZzZ4MnJid3A5eU1BVjBVYUZXbzdVMWM1YStKcDA5YWpzZllTL3RCTklmTGhoQ2s5ZHpnRUNyVnY4VzdpOGpMbFZUT2NBOGxxK1NORC9BR2daeHBHbmF2TDRUMUhUOU0xaU1UMmQzY3NURmNJZlNRQXJuMkpGZWkySHhhVFY5TVNlMmdlRUo5NUNPVjk2Nko0YXRUZkxVVmlhR0l3OWFONlRUUjlENkQ0dW52SkZ3NVVFNVAwcjBEd3ZMTmZUS3pCMkE2bXZuSDRjL0VwYnlkQXd3RDF6MXI2TCtHZXVKZnh4OG9VUEp4MXFJVGQ3TWpFeGFoZElUNHNlQUY4ZGVEZFEwZFpudEcxQ0I0dk5UN3lranRYa1hobjlsalNQRE50RkF0b2w1TkdNUExPTnpFK3ZOZlNXdWFNYmkyV1NJRlN2SXhXSkhadkkrSFFsdTU5YUpWT1dWam13N2JTa2psL0EzZ2ExOE5Za2hzb0VtWGdNRXdmenJyN2ZTM3VwRlp3ZVBTcjFscFpVRENEQTlxMWJPd0NzdTVTTUhKb2xLVTFZMVNTbGNuc3JCVXN3Z0FCTmZuaC93V2kvWmdrMTN3L3BYajJ3Z0xYZWdTN2JvcXZMUU1lVCtCcjlLZExzVmtqeVZPRDNyejc5b3Y0ZTJuano0ZDZ2cEYxRWtzRjdiUEN3SXoxR0tLc0dvM1J0aDZhbFBsZlUvSXo0YVRwY2VCbnlSZ3c1QkZlbWZzNFFqUzN2VXlHRHpGdjBIRmVHYWRyaWZEclVOWDhPWEVxaWZUYnVTMnhuNXRxTVIvS3ZkUDJjVWVQUkRjM0FaWHVXTXUwOVZ5ZUIrVmVCVmg3MXo3Q2cxSnhXOWtmUlhnMjRYNVNDQjZpdlNmQzEwOXUyN2RKdUl5T0s4dytIdXkrdTBqSUFVbnFhOWQxTFRYMEx3ek5lQTRTR0V1emV3RlhRajE3QmpxNnBxejZuTi9GMzRqeHkyWDltZWJnazVrNTZlMWVlUlFXMTNEa0VOemdZNzE4OS9FWDlyTzAwanhKZVNYMWxxZ2hXUnRyckVXRGM5YTV1My80S0xlRWRLa1dNcHF5T3AvaXRYQS9sWHEwNkUzclkrZGFqTjZPeDlUUitGSWJ4MUlJWTU1enppdlNmQXZnZTNzZEdlWkZVT283Q3ZpcXovd0NDay9oc3lCWTVXZ0VtQmxvSE9mMHJydkRYL0JTclJMVzlGc3V0V1lpUDN4SjhxNDlLcFVLaTFTT3VsZ1pTWEs1cGZNKzB2QWM4ZzgxUW95amRhN2kwaysxL0t4eTJPOWZCdWtmOEZiL0F2aDd4T3RsY2EzWVJOS2ZsK1J0amUyY1Y5QWZEcjl1bndkNHpzZlBqMUMzVkN1ZDZ0bFRWMDRUamJuT2JHNE9TdTZiVHQyYWRqby9qRkd1aWEzYlhLQlVNcDJIM3ExNGQxOHFzYUVrRTRQV3ZNUEVueFVIeHA4V3cyK2x1MGxsWnlaYVhCQVkrMWVuZUZ2RE16S2p1dVZHT1NLNFp6NXB0eE96QlNVS0tVenE5VzhTeDZWb005M0t3U09DSXUyZllWK1VueDErSUdwZUkvaWpyK3F5TVF0eGRPVlZ1eTVPUDBGZnAvd0NPZEJrMTdSM3NGeVlwRUxTN1R6Z0RwWDV6L3RaL0QvOEE0UWJ4SmNzc0x4d3pPZXZlak1vMUtGQ09JbG9uYzh1dmk2ZFRFZlZZN3JVOEU4VC9BQkgxSElDcXBCNTk2NDNWOVV1OVZjdEprQnUxZEpxVmdMbVpzWUlYMnFvMmtCaGdEcFh4OVhOcFRlNTJSd2x0amttc0hKeG5OUXZwUmJzUVRYWHRvdWNaQUlwaDBUQVB5ZzFDeDQzaGprRzBnazRJSkpwdjlrRThBRWdWMTdhTjZBWTk2Yi9Zdk9kdk5Xc2Y1a1BESEpEUkNCbkdTYVQreENNamIrbGRmL1pBQXdRY244cVJ0SUE0SXdLYXg0UERuR3RvckFnN1FhYTJqSEJPMzhLNjk5R0hYYmcweDlIQTdETldzZjVrUERISE5vNXg5d2o4S1QreGdBRHQ0L091dmJTQms1R01VdzZPdVJnRVlyUlk4bDRZNUU2UG5CMmdaN1VuOWpzZjRSaXVyZlNnT01ZQnBqYWNxOFl6VkxHc2g0ZXh6QTBuNXNBQVVOcEIzRGNBU1BTdW1OZ091M09hYjloVURHT1RUV01ZdllITlNhTmdZNXdlOVVyclM4ZzRGZGJjV3E3RGdERloxMWFqR1FCazF0U3hUWkU2S09VbXNXWFBHUUtoTm01R2NZQnJvTG0xNTZBQVZEOW1HODhERmQ4Y1JvYy9zdFRUK0dPdXhhZHJJa3ZCbU5QdnFlQm11dDFMWGsxTW1WWEFKTzRjNDR6MnJ6blU3WnJIVVVsakFFVjJ2UHBtbzlMMWlmYzBaSnpFcHljOXErNWxCU1Z6NFdFck81N1Q0WThheEswVnRMS0VsT05yL3dCNzJOZWxhTEY1OE1UcHk1d2VPYStVeDRodUpZWVdCS3ZIMFBldmFmZ2I0OHY3eDQ0SlNXVEFHVHppdkp4ZUg1ZFV6MThIVnU3SDBCNFh1eXBWV0FCV3V4R3ZycE9uTkk3OGtmalhENkxJc3JvNk1DY0RJcG54QTFHWVdLd3dnczh2QXhYbktuZDZudVJsZEdYNDU4YVhmaVBVeGIycGVRdWNCUjFyMUg0RGZBZkx4WG1weG1TUnlHMnQyckMrQXZ3cVZidGRRdmlIbFk1QVBPSytoWnRhdGZDUGh5UzZsS3BIQ3VRTVkvQ3RMWDBSclRwMjFadGFoNHEwNzRiNkNHT3lNcU1LbzRKUG9CWHlwKzE1KzBicTEvNGV2WXRMYy9haWpIYUcvd0JXUGIzcTc4UlBpWmUrSzlWTW9rZFhrSkVVZWVJbHoxK3RlZy9BejREYVo4UlBERjNMcXl4T01sV0VnSEp4MXI2ZktNdmhLU2xNK1l6N01uU1RoRFUvTFg0aCtCL0UyZzJsaDRqMU83V1NIWFhrOGgxdWxra0pRamR1UUVzblVZM0FaN1pyNmsvWUU4RytJZkhPazNVdHpKSkpvOXZDUzBrL0kzZTJhaitMUC9CUGpVYjM0MUpwV2xYY04zbzdYSG1od3hKalVuN3VQV3Z0bjRPZkErSDRkK0JJTkZzNEVqampqQ3VRUHZIRlBQYWtZUzlqRFh1Vmt0S3BPbDdTVDMyUEcvQUhnV2JTZFVlNkFZQjNQSGJHYTlZOFBCeUZKeng2VjFjL3c1VzF0eHRpQVBUZ1ZRdWRDT2xRczVCUUtLK1JxdHpscWZXMGtvS3hvZUdmRkRXTjBBSEl4eDZDdlR2RHZpWmRRVk11VzR4WHpsZStKUmFYd1VNTWc4bXZRZmgxNHBNNVJRK1NjZDZpckpvM2hHNTdJOW10eXl5UkVwSjF5dkZhV24rSWI3VG1FY3FDUlNPR0hCcW40SWpHcE1pc3dVSEhOZEo0aXRvTEMxK1FxN0tmenAwS01uNzBYWXluTktTaTFjczZONHhTYktCbERBNEk3MWMxSzhTU0FzUUNDRG12TWRidkgwQytGMnI1UjIrY1o0cmZzdkdDM21uTXdaZm1YOHVLMmRUUnhaMTA2VjBwUlBtLzlxUFE3ZlZkYzFPRnh1OHlNa2hXNUtrRUVmWEtnZmpYNXUvRVB3L0pwZmlIVWJRa2xyZStLdWNZT2VPZm9RdWZ4cjlCUGpCNHNrWDR4YWpiU09xbzBhR01zTWpweVAwSnI0My9BR2xQQ2phQjhWcmdSODIyb3FreW5ra3VoeG42bGY1MTVXQW55Vlp3NzZubDVwVHUwMTZGZnd6R0Yrei9BREJkOGc3Zm5WSm1OekxDWlFQTWduTWF0L2RCemo5RFd0NGJ0Z0xuVGd6S2hMTkpuMDRxRnRHYVZyZ3FWSlM0QnozNmRmMXJ2b1BYVTQxSFZIZGVEdEduYXcrelNxVWVCandSamFRVC9RajhxN3J4SDRIWHhMNGJzamNTdGlCY0FESUxybkJCK2g5UFduZUNkS2oxRFJiUzhWVkxJb1NUSFVuSEJQOEFuMHIwU1B3aytvK0ZJZkxUQ283SU1kczRPUHp6UktXcVBScFFVYk5uRmVDZmg3cHVuTEdWalJCSDFPY0dvUGpOKzBqWWZDTFJIV3g4a1hNWXdaWDRTTTQ3ZXJlMWFOOWJhbHBZZUdLRUIyNDNOeml1TnZ2MlRwUGlUcUtYbC9NWjlyYnZMZmxBZnAwcnV3N3BxUzV6U3ZLZkxhbXRUNVIvYUcrSjNqajRpWDloZGFsZGFnbWxhc3BhRUdUWVpBTzMreU1IcFhOL0FIVkxyNFZlTDd6VW1lMmppdTdTNXM1VE9pekdTT1pIalpkcHoxUnlNOVFjRVY5NTN2N0ZLZUtOSFhUdFN0NExxMFVnb20xZ1ZQcUNPUng2VjBIdzAvNEpsZUdkSzFsTGhOQlM3ZUpneVBjczhpRHB6aGpqMXI2V2ptTktuSDkyZkpZbkpxMWVWNnJ1ZEQrelo0S24rSVAvQUFUL0FOQThBaUJKYjdVMmt1bWxtVEs2ZEMwaFpQb1NPUU8yYTZmU3YyVkxMNEcrQjJzSU5WdWRVa2tpT2ZONlJucmhmOEs5dzhHL0RxRHdMbzBjRnJFaU5HQUFFR0ZBL3JWUHhycGIzTm14WUVzM0hyWG5aampwVjdPVDIyUFR5N0wxaHJ4cDdOM2ZtZk9maEt4dWRNdkZWZ1ZJYkFyNkgrRWV1eTJSaURQZ0VnYzE1NmZCaHR0UUVySjhvUHBYUStHdFZYVDdrTHZCVlQyUElyd25VazU4eDlDNktjTEgwem9tdG0rdDFRdGxjY1ZLbGxpN0JJd3BPYzE1MzRIOFpCMVZGSVlkdWE3azM3VEJTcm5KNEdEWFM2aW5yMVBLV0duQjJYVTFUclZsYVMrV1pGOHdkcXRSNnZFeERCZ1EzcDFyemp4dHBkeE5ESmN4T3lUUWZNY2Z4Q3VWMG40eHBaM1J0N21VcEluR0c0TmFScVczUjAwY0p6Sk5QVStoclRXRUVBUU1NbXVlOFphakc5bEtHWUVCVFhBMlB4Wlc1Mm9nWWtkeDBOY1grMHArMFRaZkNiNFNhNXJtb1Rva2RsYXZJQm5sbTJuQUgxTkU2dDFaSGZRd2poNzB0RDg0ZkcvdzcwclZ2MnJQR21vS0JJWDFXUmxHY3FEbXZaUENWb3VtUUlpRDkyY0VrVjh3ZkEvNHFEeHQ0Z3ZOVG1jQ2JVWjNuZm5vWFluRmZSbmh6V2c4U1pmY282YzE1ZUpweWk3Tkh1WmRXZzRxVU9wN2g4THRwMUNFcEpuSnI2TGRJZFUrSDkxYnpZMlNSRkNmd3I1WitFMnBoNytNbVFyZzhWOUFhdjQxdHRPOEd4UUs0THlZQjU1ckxDKzd6TTVNOGQxRkxWbmgzanI5bmZScnVKa210MGxWamo3b3pYbTkxK3hSNGMxYVptaHQwVmdlaFhOZlJSVTY5a0kyNENuMkhoWjRKOTVRakI5T3RlbmhxcnRZOFduT1ZHenVlR2FCK3dsb3FTSzArazI5d2d4akFyb1kvd0Rnbmg0UDFpNlI1ZkQ5cW00Yy9LT0srZy9EeUlrUkI2anNhNk94a2lqdFFOdUhQT2E2NFB1ZHl6NmNWWnhQbVp2K0NYSGdkYitPYUhRN1JuVCtKa0J4WHF2aDM5a3ZRUEF2Z3E1aGcwMjBRbVBHUkdNOUs5ajBpZEhRREpBcTdyRnNKOUtaU0JzSzFyVXNvNkhrWXZNNmxacU5ySzU4Ny9DVDRld2VHcjk0MWpDTHV6NlY3S3NxV05udUcxWTBUT1R3SzVXNnNFMHUvWjF3aEo3MTg5ZnQ2ZnR2MjN3ZThGUDRmMG00U2JYOVNYeWtWR3lZUWVDeDlLODNCWWVVNmlweFdyWjcrSHc4cTNLb2RTeDR0L2JXbDB2NDZYZGxwN0xQcHRuKzVrd2NoajN4WEMvdHMzVmo4UVBCa2VzMmhVckttNGdmd212bTM0VDMxemN6aTVubGVTYWR0N3N4NUpQSk5lbStNcis2bDhGWEZzcE10dktwT091MDE5aHhYa1Rua3NvVWxkeFZ6Nm5PdURLVWFkUEc0VlduRkxtODBlQVBacms1QU9hait4cU04SGlwNXBoSEl5TUNyS1NDT2xSdGNEb08xZnppdVk4TnhzUXlXb0lIQUhyVWJ3QUwwQngrRlRTWEFPUU1ZOXFoa3VCakJ6V2liSmFSRjluR0R4d2FRVytRZUFhVXpjWjRGTmE1ejA0cTBtUTRvYThJeWNEaW1HRUVkUnorbE9lY0FnNUlJcUY1K1NRY210SXBrTklKSXh5T0Jtb25pVmh6amlvNUxvYzU3VkMxeWNaQk9hM2pCbWJSSzZqam9CVWNnRzNJSTRxQnA4REFQSnFKN3M5Q1NhMWpUWkRaTkt5OGdFRW1vSkdYY01rSEhXb0pMbmpQSU5SUzNCSEk1eFhSQ216T1JZTEtlL1dvbmRja2pBL1NxclRFbkdja1ZINWpNRGc4VnNxWkRaUE5LcFhnQUNxZHlnUFE4bWxra2JuanBVVHNUNjF2VGpZemtpcEpiQmlmUTAwV295Q0IxOWFtYms1d2VPMU5rWThaQXJwVW1ZT0pITnB6YW40UnNIQUlremhlS3JYM2gwNlpieHVCaVM1TzBEdWZldTA4TzZPSU5CaXNpeXNFWWtzZTNIUVZIYTZIL3dBSko0c2pJQmVPRlNjQWNLQjByOUc5b294YlB6dFJ2Skk1T0R3OFk1SWdSdkxzRndPOWUyL0Evd0FIcmF2R3pFTDNBUEpybjdmd1cwV29SbVNMR3hkd0gxcjBuNGYyWXMzaHh3R3J5c1JWdXJYUGF3Vk8ycDZWbytpK1JFQ0FjWTRxM0g0Y1hVTlFTU1VFckdPbFgvRE1hM1NCZUNCWFhhZG9rY2k3UW9MSHZqcFhJMmV4VFZ0eXg0VXVJOU9qV05BQUY5T2dxdjhBR0R4RExOb3l4SUdlTkJ1S2c1M0hzS1RVZEVtMDdEeE1jbjhLMGRGOE9uVmt4Y1ljdFZTbkdDM095THVqd1BRTksxZlU5Wm1tYUI4U25idEl6am12ZVBodjRQOEFFVjNZckc5M0xiMjVHMG9wd1dGZFhvbnc5dExKbFpJVjNuMnIwRHcvcGtkbGJyaEJuK1ZkRWN5cUplNjdJd1dYMHBPN2ltL016L0Ezd3d0UERMaTRDYjUzNUpibGlmOEFDdTgwYlNRcWtrRGUvYnRXVmJTc3JaSUlHZXZwWFZlR2JScmtLM1Vaem11T1dKZFJuYjlXakZYRms4TExPRkFVRlJYbS93QWZyR0x3dDRkYVU4TzNBSFROZTdXbW5xRXdRQW82KzllQi90Z3BMZVhOcEFtUkVuSkhZMXFvSlJjamtqZVZSUlBCZExzWnRiMURPV0JKNHIxNzRYK0RicEdWaUdDaXVZK0hXZ285N0Z1VUZlT2NWN2JGREZwMWhIREZJc1pZY2xlVy93RHJWeFFweXF6MVBYbEZVb0ptejRmMW4reFdFWkkzTDc5YTFyN1diaThWZHlrSWVSNzFuZUZmRHRuREg5b2NOTEtPUThoelYvVU5XdDF0SkpXS2lPSDd6SHBYcHhwY3NiUk9GUzU1MmlqbnZGMHkzdWx5UnV3VWdkK0tkNFAwbHZLK1ppMFlTc3JTN2svRWk4dVZ0Z0JaMjVLTXg1TG11NDBmU1A3SjhQU2x6aDFHTW5uZ1Y1bGFEOXBabmRKdWplSFhzZkMzN1IvaTliYjR3WHlzVVkyVjJxa2NnaFdpYk9UK05lZi9BTFFHbVIrTVBCRnZyRWUxcm5UV1dPVGIxWlRnRS9yK2xXZjJwdFNXVDQ0K0pGM2dLMGJTajArUmNIK2Y2VlQrRy9pQ0h4VGJUYVhjRkhPcFdlK0luQVZpUWVEL0FNQzNDdk5uSGxrcWk2SG1WcGMwNVFaeFdsMjRpdXJFdUFkbHQwQi9pMi8vQUZxaml2VXRwNWxVWkNYQkJ5ZVNDRk9Qd0pxODFnK25hMWFobElNTWN1YzhISUdQNWsxekU3TVo3cGdjWk81dnJ1VVovU3ZUd3l1emhXa2ozNzRRNm1wc0hqQkJqWUFnSDA2ZjRmbFh0WGhEVVJkK0g3dUFzcXFwVjhlNElHZjFyNXQrRG1xdStJa0l4SkVSMTQ0K2IrbGUzZUN0VVZZNVVJRWdlTHI2RUVHbFhUVWoxcU1WS05qcHo0WGgxSzRZa0Vrbkk5cTYzd2w0TVd6ZENFRHFhNVhSOVNaYmtnTmtnOWVtSzcvd2pxcXpoQVhKWWVsVEdiVE81VVhZNzd3am9LRlZVcGdqMUZkbFplSDJWQnhuUFNzRHdwSkc1UmlRUzJPbGQxWWtlV0FvR0dydXBOdGFublZvUG1zWmsyamdKbGh3T2dyTnZQREJ2cEJtUEtqdFhhVytubWFVQmhrZ1ZOZWFmSFlRdElRQ3FqSlBweFhRcWQ5ekdjdVZIZ0h4ZnViTHdOWWp6V1ZaNVNka2Y4UnJ4YVR4d0YxQU1wZEF4NDQ0cVg5bzd4L05ybnhjZVNSWldzNG5NVVpIM1V3Y2Z6cWhiYVpIZW9wQVVzZVFmU3NhNlMwUjZlRXc4MUZTYlBYdmhQNHE4OTQxWmp1R09oeFh1dmhCeGZ5cVdjQkIxcjVQOEk2azNoNjRYY3Jzd1BRY212Wi9oOTQzMUhXa0VGdFlYVU9jQXl5cVVWZmZuclJRZzA3dEd1TG9SNWVadXg2cnJzc2N1cUMwaHc2bGR6dC9kRmVTZnRFK0JOUHV2RFUxeVhGcGNXNExwS0R0TmVxYVpiRFRiQmk3RnBHR1hrYmtzZjhBQ3ZMdmk3b0wvRWF3dVl3N3RCQmtLcW43elY2TW9xTk50bytkamlKT3F1UjJTNm5pdnd6K0kxOUxJMXN6VFRsT0EyRHo3NXI1QS80S21mdEczZmpUV1l2QTlqT1RhV3BFdDd0Yk85dXkxOWQrTk5aZytCWHd3MWZXdFRlS3poc1lXWVp3Q1NCd0svS1RYZkhNbnhQOGJhbHJVemxudjdocEJrNXdDZUIrVlo0T2pkODc2SGZtMlkzZ3FNWHF6UDhBQVd2M25nUFUxa2lMQ0luSlh0WDByOE5QamxGcWR0R0dtQWJqSXp5SzhEdXRMQmlqTElwV1FaRlVZRGNhUGNDVzJrZU5nZW1ldGRHSXc4S3ZxZWJnc3hsUWRyM1I5NCtBdmpFbGhNaFdVYys5ZXAyUHhXT3RwRW5uaGxQYk5mbnA0TitPRTlnVml2c3FGNDNnMTYxNFArTDdmdTVMYTU4MWY3dTZ2SHJZSnhWckgwVlBIMDZ5VHVmZTN3MThUb1pWRHVBQ2ZXdldkRzF1MHV0cUFJeEg0MThRZkM3NDV3M3ZseHZONVVnNmhqaXZkL0JmeFdnRVM3cDBMUDN6WFBTYzRQbGFIVndVYXZ2SStoYkd5czdtUlYyTGsrbGRGWmVGYktkRktLMjRlOWVUZUhQaUxic2lNMHFra2RjMTFtbS9GUzNzb2l4bFFmalhiVGwxWjUxYkF5V2tUdklkRmh0VU9XQUMxeFB4YitObWovRHJUSGE4dllZbFVFQU13Qk5lWGZ0TWZ0d2FMOEhQQjF6ZHozS2ZhTnA4dUpXeXp0OUsvSmo0cy90aCtLdmpSOGJGMVMvMVdmN0JMSVVqdEZZaU9GYzhjZXRldGdNdnE0eVZvNlI2di9JN3NwNGZuWHJSOXJwRnZWbjNIKzBsKzMzcURSejZmNFEwK2U4djVSdFdZcmlPUFBldms2UDRYYTM0dzhUemE1NGl1cGJ2VTdsdHpseVRzOWg2Q3Rmd240eVpaSTJlY1pmMTV6WGJwcTBPcldoZENONDVPRHlhKzl5M2g2amhQZWpyTHV6OXB5bmhYRFlacVNmTVpQaHZRVzBhWlZDYlVRMTMrZ3p4MzF1MExqY2tnMjRQTmN0YU90eE9Dc2hJSEhQV3R6UnBqYnlBSDVTT2MxNzZwcmxzZlRWY09uRGxQSy9pL3dDRDI4T2FxODhTa1JTSFBIVDYxeFBubnUzRmZSZnhFOFB4K0pORmNzRkpLNUJOZk91cldENlZxTXNEZ2dvVCtWZnpweDd3eXN2eG50NksvZDFOVjVQcWo4bjRoeXo2clc1NC9ETDh5TnBDM1E0Rk1hVG9jOENtbmdaSnpUR2Jqbk5mQ3FCODIySzhoNUFOTUw5TW5wU1AxeGs0cG0vYUNDQVRXaWladGptUEl3Q1NhaG1KUEdTUDBwNFl0bkdEbW11T0RnQTRxNHdZbVZwQ2M0SGVvSk04OWVhdFN4a2trQTVQdHhVTFJNRHlNYzFza2pGb3JFc094d1QxcGo1NmtIbXJEd3RrY0FDb3pDM0dTTVZwRmtsWjBZK2xSR01zRHljQ3Jua2s5QU9LUEpLdDBOYUtaTGlVV3QyVTlPdE5hM0lCSTYxb2ZaeWVNRTVwajJoSFlnbXFWUW5sTTE0ampua1ZFWWoxQkdSV3A5aUxaeURpa0dubnNPUldpcTJJY1RKTURBWjVwaGhLNEl5cFBldGdXUFFZeUQ3VXlTeElQUThWYXJJamxJZkczaWh0QThSYWN1UUlwWXNFZGlTQlhwSHdFc2JOTlVMejRmekZCRzdwOUs4QytJT3N0cU9wUnFXTFBBUXkrcSsxZHg4SWZHY3FYa2hhUWdSS282MStsNDJrM1RzajgwdzgvZXV6MjN4bGZXc3Q3ZG1MRVJVY0FkRGlvL0J1c2poV2tVbE1NT2NWNTVyZXRQYzNnZEpXS3VPUGVwZEIxV1NDNFYwTEE5Q1BTdkVsSG9lMWhxbG1mU3ZoSHhGSGlNN2pqdm5yWG9laWE2R1JRaEdEM3I1ejhJZUt5STQxWnNzT296WHFmZzd4UWtzU2dPQ0NQV3NYcHVlelNrclhQVlB0eVRvRkkzWk5iWGhxVkVmSjRHZVJYRGFYcWFUSUNTZHhycDlCdkFzaWdEQnJPYXVlaFNTUFJ0TEJmYVYya0N1azA2RGVSemdEdDJyaWRFMWJZUUNUZ1YxZWs2aTBoQlVFNXJMbGRqc1VVYlVkaDVzeXFCa1YyUGhDeFpBb3dTQlhOYU5JSEEzY0gxcnMvRHM2eGxRdTNCclNqVDk3VWRSZTRkSjVIbFdaWUE4aXZLUGl4NFFnOFdYaXBPR0FVZHE5YWtsM1d4endBT0s4NThZM3NkcmZ5RXNQbEhTdlVVTHF4NU51V1YwY0JwWHcrMDd3dVdNUWRtWCs4MVRhVmN0cUY4VlVNc2F0K2RWOVcxUnRRdThSc1ZVSG1uVyt2V2ZoWFRubnVwbGpqSE9UZ1pxb3dWN1JPaUNuTjJlck8yZldJckd3Qm5kWTRsNjg4bXZNL2poNHIxYVNLeHNMSzNsczdlL0pLRnVESW82bkg0OFZVOFovRWV5MUxTVWF3dTN2ZFlra1ZyU0dBYm80Y01EOC9ya2NZcjBYNFhmQysrOFZhakhyM2ltVTNGNnlqeTRlaVFyNkFWMFNnb3F5M1o3R0VjY0tsaUtxdEZYMzNiOGwrcForQVhnNXZDL2d5TkpsWVRUNWtiT2M1cnJQRUZ5SS9EVXJFNEtxYzlzNHJkZlNVaEo4dGNLT0FLODAvYUE4Vm53VjhPZGN1bk93VzFwTEt2djhoSS9Xdkd4VWVWbmp2RmUyclNxdnE3bjVvL0diWGg0aitKdmltN2R5N1NSWGp4cURuNWR6WTUrZ3Jpdmg1NHBrdEpMRjQ1R1Y3R1VxQm5xcFBUNlp6K2RYUEZNN1d1b3lCaUE2MmNpU0U5Zm1EdC9MK2RjZDRNbWFPL2hja0ZYd0c5TWdnLzFybVVVNHU1NXNwKy9jOTE4VmhMaSt2cDBRaFhWSGhJR2QvbU1DUWZldkw5V2tMUGVRT3ZsU0tGVERjRE83MS9DdlJkRGxPcDZhbG8wcWIzQ3hSbHhnTmdFalB0eVBwelhtdmlxUmJmV250TGdsYnlOZ1NEeHV5emNON2dZcmZCTFF6cVAzenR2aE5xc21uWHNFY2dDREk0STdWN2Q0STFSb2JkeVpDZDZidjF4WHoxNEh2Wm8zUldWbkliSXovU3ZZUER1cW1DSlV5UmxBT3VQVTFwaVkzUFl3YlBXdEsxWVRUWlZ1R2I2VjJuaGZWMXQ3bFdRbk5lUWFMclA3MVNHSVBiNjEybmhYWGxhVUV0ejNyamxGbytrd3RMbVdwOUQrQnRlTHdxV0lYajE1TmVqZUg5VERLb0RLY2pwWGhQZ3ZXd3lvQXdKQTllbGVuYUJyUTJxQVJrRDFydG9NbkVZUkxXeDZycGR3RkN0dUFIdWF6L2lOckMyL2hxNmtRNGJ5eUZIdmlzUzAxbjdOSDh6NUI5KzljUDhBRlA0a0dhUVdsdXdNY1p5N1p6aytsZW5TbGMrZnhWQ3p1anlUVmZBa3VwU3V6d0tUSVNjdU01cWlud3ZsaGxBamthSnM5QjJyc2pyQnVBZHpJUzM2VlkwK2VJeWhwSlZJUFdyblNpMFpReE5YbTkwMVBoVjhPTFMydUVlVmZNbDd1ZVRYcE04Y2VtM0EySGFrWXl6RTRBcnlyVWZpNVorRjdHZWExRFhBc1l6Sk9VLzFjU2prbG02QVY0biswcCsxZk44US9oOUxvbmhQeERITDRnMU1xaS8yYVBNanRJMis4WGs2YnNkQUtjWXdqRzhpbzRDdmlhMFk3dDlPdjNmNTZIcnZ4ei9iRzA3UnJxVHc5b0U4ZDlxcCtTYVJEbExiNmtkL2F1MCtGZDI4L2dTMm1uWXRKSW05MlBVbjFyNUErRm43TzF4OE85RXN4ZXM4MnAzN0JuTHR1a1luK0p2ZjYxOUhmR1A0aFJmQVg5bVBXZGRtSWpHbTJERk8zemJlQldibEtXNlBWejdBNGJCWWFuU3BhdHU3WitiZi9CYlg5cmFmeE40clR3RG9Gd2ZzbG8vbVg1amJoam5oYStMZmg5NDFmVGdxVEJseHhtcWZqL3hsZC9FWHhqcVd0WDByUzNXcFhEVHVTY25rNXgrQXFsYW9GNEdBYSt0dytXeFZGUWUvVStLbGw3clZYVTVySHM4SGppM3ZOTlJTNERweUc3NDlLemI3eGZCRnVQbVovR3ZNVGVTSU5xc3dCcGpUczVHV1ludm52VWYyUFozNWpkWlhLOXVZN2kvOGVRSUQ4eFltczJQNHkzbWl6aDdLV1JDcDZidUs1aGl4QlBCQS9LcWswZThnbkJKcmFPVjAwdmUxS2VYK3p0Sk4zUFdmRC83WU9xYVdVYTVqWXV2OGFIQnIwYndqL3dBRkk3blNDaVNRM0UyT2dYcWErYi9DL2dPOThhWHdndG96c0gzMkk0QXIyandYOEd0SDhHMllsbVZacm5BK1p4eUt1bnc3U3JPNlZrZlZaSGttWjQxODlPWExCZmFmNmR6M3Z3ei9BTUZLOVZ2SUY4alNiOEFqQUxZVVZyYXovd0FGQWZGdXBXanhXeXhXUlljTTdaSXI1dDhXL0VIVFBEOFRSeGhBNEdGQ2NrbXM3d3hwdXNmRSs3V1NXUjdHeVBROUhmMkZka09Ic0JUa3VaY3pQc3FPWFlhblZWRG1kV2ZaV3Q4N2JIUmZHVDQ2WC9qS2FSYnUvbjFLL3VPTWtrK1g3QWRxNWpUUERFc1hncTUxQW5GMUF5eUVFNFlBR3V5MUw0WnhlSExTTmJCSUVlUS9NN3J2ZlByazFESDRVa2czVFMrWmM3eGh3eHdwL0N2YXA0ZU1Vb3hWa3RrdWg5RlN5cW9wWHFMcG9sc3ZQelp1ZUV2RnphamIyb2hSbWtaTWc5aFhySGd5N2F3c2d6dVhMam5qQUZlUWFaNGlheW1WSTRva1JCOG8yakl4MUdLN25SL0hzOXJacEk5cVhSY0Q1T2NWNkVLZFIvRWZTNEp5MDVtZWkydmlPTFRzeVhGbktJRng4OGZ6WXJxdEIxYXkxdXg4MnpuU1ZlTWpQeko5YTRIUi9HZHRxc0xNVVdQQTZjRUdxT2h0SjRkMW1TK3MyQ0F0ODhZUHl5ajB4NjF1cVZrZXc0TzEwejJBajdUcDhrWUozS01yWGp2eGY4T3JIZFIzYUtRRys5aXZVL0RtdFJYNFZWT0E0NDdIM0ZZdnhUOE9lZm8xd3FnRmdONDlxK1I0enl0WXpLNnNMYXhYTXZWSHpQRWVDVmJDVGoxV3ErUjRZOE9BU0NjL1NtUEdjREp4ajg2dXpXckRJSTZWWGFBOStvOWEvbVJKclJuNDQyeXJJQUFEZzVIV21GUnlUMU5XL3NwWWtFVWZaQ094clJXSWJaVkNncmphU1JTN0JqcVJWbjdHZHhPQ2MwZlpUM0JGRjBoSk5sVVI3dW5RVkhKRWU0NFBKcThiVTlxR3NpZUFNQ281eHVKbXZEdUJ3TW4xcFBzNEl4akpyUSt4bmJnSE9QMXBQc1o3cVNPdFdwRU9Kbm1BRUVZSEZLTFk4NEE0cThiVWpnREhiMXByVzNIcUI2MDB5WEVwQzN6eGpwU0dESXhpcnh0ejNHTVUzN09WQjRCeFFteE5GQXdaNmpyU0NESEI1QnJRTnZna2dBa1V4b3dPM1dyakp2UVZpaVlBT01FMUhKYms0T01aOUt2eVJGdm1DazRxTnNqQXdPUHlwOHpJUG43eEJyVFNhb3N3SjVrMnRqdlc1NGQxZDlIMTFYTHQ1RjFnRTlnYTVuWDdIN09NQUVKSUZkVDBBTmJtalNwcXVscWhBRG9QMUZmdFZWSnhQeWFtN005ZDBLTXpBeHN4S241a09mWHRYVGVITkpFOTBRV1hBNmtHdUMrRldwSFhOSFRhNWFhMWJhUjN4WHBFK20rWmFSdkJJc1Z5dzV4d3IrMWZQMXFkcE5NOWFqUFJNM05PdDFTOEJaR2p3ZUQvQUExM3ZoeTNtV05IaklaUjNCNHJ5T3c4YjNlaTNLUTNDRXVweGhobmNQclhvM3crOGE2YjRnaUlqbWFDZFRncnhrR3VXcENTMXNlblFyMjZucWZoblZaRHREOVIycnV0QjFVTUZKWlFSWGl6K0tibnc1ZUp2UG14SG5kaXUxOExlUFlkVGhRSzIxdTNPYTVaSm85cWhXNWxjOWcwYS9IeW5lZWE3RFJOUkh5amVTRFhrMmk2NEdBTy9rVjF1aGE5bDFCWURQdlZNOUdrN25yMmhYU2xBV2ZuOWE3UFFMZ0ZGWUhKRmVXZUd0V1Z5Z0xGc2MxM2VqNnl1eFFwejdWVk5kVFNjbnNkc2RYRWNERmlTUVB3cnhQNGorS0h1TmFtS3lCWXkyUHdyMDJkNUxxd2ZZVGxoaXZHZkgvdzAxRFc5UmJkY3RiMng0S3B3VDlUWFU2cXVrMmNiNVZJNXJ4RjhXdFAwQStXSDgrNmJoWVlodWR2OFB4cUx3djRiMXY0cGFpSkx1M01WdTUrUkpQdW9QcDYxdmVHdmdmWjZES0pMZUNCcFdQTHR5eFAxcjFId1g0WGVFcUdZQWpqaXRvMW9wMmlkMVBHMDZFRzRLNzdzbitHWHdNMGp3cjVjd2dpbHU4NTNZR0I5SzlTMDNUVXNJU0F1TThpcy9RdE5XM1FmeE4zelY2NzFOYmR0cGJMOXZhdGZhUlN1ZlBZckZWY1RQM3BYTElWZHBHQm12RHYyNnZEa3VyL0FBUDFrMndKY1JBdGdkVjNBc1B5elhyb3VaWlpUazRBOTY1LzR2NmVtci9EdlZyZVVBaDdXUmVmOTAxNW1KazVLNk5hRkJ4M1B4bitKZW91K3EzcGp5RlBBOVFOd1ZjL2htc3Z3aFliNDRKWEpSSFhQVGtFRC9ERk0rSmwwVjhRWFVNYmNmYUJHT2NnN1FQL0FOZFMrRzRKTFRTcGdwSWVOY2dFOERjUUt5aFRhaHluRzVYbG9kYW12UGJhT0JHYzNDVEdSRkRBWkErWEErcWsxNS84WmZpREhkZU1vV2xCanVVSGxzN0htWW9Cd2ZjQWpudmo2VmQ4UzZsSjlsMDZlMkxLc2tnSko2Z0VrY2ZVRS9sWEUvSGUvaTEyWFU3cUtOQmMyVFJQdkJLbHlwQUovRU1EK0ZlbGdjT3VaSm5QaUpTK0tQUTlaK0hHditmYnhsWEJWZ0RnVjY5NGV1WkdpQlZodVljNTV4N1Y4WGZDL3dDT1RlR05TaGl2d3NWcktjUnNPU2g3NTl1LzQxOVVmREx4OWFhNVp4U1J6cElqajVXVTVCRkdKdzhvUFZIdDVaaUkxUFU5THM5WGtoaUFLcUdIR051TTFzNkQ0b2EybEt5QUtUMzVGWSttRk5RQ0FNckxrWXp6K1Zhc3VqTXNvQlhJOVFLNHBSWFUrdHdrMHJIcDNnM3hxWVFoU1FBRUR2elhxWGc3eGNIZFc4dzQ5TTE4NzZFSkxPNWpBRGJRUm4ycjM3NFErSDdTL3dESmRsZWRoemp0VTA5N0k5T3ZLS3B1VEovaTU4ZFovQjFpdHRhV2sxemN5cnUrWGdLUHI2MTg2K052Mm12RTF0STViUkxsME9TTmpqK2RmWUh4TCtHQTF2VEZ1b29FTnpDbUFNWkdQU3Zubng1NFRpTFNxWVRES3ZCVEdBVFhvMDVPT2pQbFkxNFZKZTh0anhIVS93QnE3eGlzTHJaYUZBazNZM0Z3U0IrQUZlZmE1OFhQalQ4UTlTZUZkVnN0S3NINDJXMFJWeC93STVyMmE5K0hzVnpja21JeDd1YzQ3MWUwYjRObDNSNHhJVko2aXVoVlBJOWloVHdUczVhZk94eVh3eStGL2pMeGZvRWVqZUpmRk43UG9zdkVsdUhDcXd6enV4eTM0MTdqb0h3QThPZkQ1YkpmRFVick5Fdjc1bkFPWDdGY2RCVjc0ZC9CaTVEcVhhWVIrL1N2YnZBWHdjWlFwMmJFSDhSNm1pTGIzVnd4ZWJZUEJyL1pkK3R1dnE5MmNwOFB2aDFOcUdxeDN0NldlUk9tZWcrbGZQZi9BQVhGK0pxK0JmMlZJdEJoa0tUNjNjcENWQndTZzVQNkN2dlMzOE13YUJaNElBWUQ3MksvRXovZ3VIKzBvdnhTL2FOaThOYWZNSmJEd3ltMTlyWlh6VDEvSVYxWU9pNTE0cDk3bnhPT3g4OFZVOXBVOUVmRnNGdU1oczdoM0hTckNSRU1jRGdWVXQ3NG5BWmNIMnEzRmREc3VhKzRwdEhUaFl3dG9TQ0ppMk51UlRSRVc1d09LZWt4T01LUlQxYmVEbENDZWF0bzlGVVV5QVE3MkFKNFBGYVBoM3dyTHJ0K2tTS1FtZm1hbzdHemx2cDFpalFzN0VjRHR6WHNud3M4R3JZaU5ER0hjZmVKN210YVZEbmxZOXZKc2ordDFrcEwzVnVYL0QrbVdQd3c4S05kU2dJZWdQWGNhODA4YWZGbTk4Ulh6UldXNVZZNEFGYmY3UTNpMTlYOFVRNkhaa0xGWktCSVIwM0d1WjBQU29iSWhGQWFiUHpQNkN1NnBOL3c0YUpIMFdZNDJwVnFmVU1HK1NuRFJ0ZCt0aWJ3cjRSRFhBdXI5dk5sQnpodVF0ZW0rRk5hRnZJVWpMTUloNllBOXE0TFVic1dVSVJEdExjREI1clg4UFRtQzBVbDlwT09SelNwUVNaNmVWMEtlR1hzNlMxNnZxL1ZucHVtNmhMTGRLMG1YTGc3Y2pjUHhyVXRyaEpZekdRQXkvUHVIQU9lMzg2emZDRm9MblRrWjN5QjkzSTdtdGVIUWk2bGxaRlU1VnVnMml2VXB3VnJuMmVIcHZrNTJaTjFwY01rb2FLSWIxNllISVArRmRQNFpnVzNzMFNac0NYcUR4MTlxeTlQMGN3NmtXeXlsUGxHVGdmbldtdHZJakV5U3FTbks0T1QrVmJSN25UUWlsTG5DOHRUYlN6dEc0YU1aQ3FCalB1YXNhWnJhQ1VLNkVzY0VlaDk2a2hLdkJIdk80SE9UZ2NIMXhUNzYyRThFUlJlWXh0SjR6Vk9XdXAyWDk1TkhXK0ZOZGEzdjRuQllSczIxdStENjE2SHFGb3V2d29tNEJwUGwvT3ZIZkNUQ3dDN25KQ3NDd0o3VjZwcDErTE8zVzVKUGxEYXdQNDF6NG1uR1VIRjlUTEcwMUtMWGN5ZkZmN0xlcFdNUnVMWUdSRytZQWl2UHRZK0g5OW9jeFM0dHBFSU9PbkJyOUNmaGZyZW0rSWZEOW1seXFPSkl4amVudFdwNHcvWmQwWHh2WW1hMWlqU1FqSUNnRUd2NXh6TGhyRHpxU1dHbHl0UFo2bjgvd0NJeGVFalZsVGQ0dE43N0g1cHI0ZWtsa0lXSnlUMkM1cXpINEx1MnhpM2tKUGJIV3Z2TFNmMlFMVkdaR3RVV1JlbUY2MXRXSDdJbHVwQk5xTSt1MnNjUHdQaTZpVGNrZlAxOC9vVXBPRDZINThSZkQzVUxqRzIxa0RlbU1WSkw4TXRUVEpObytQcG12MFYvd0NHVTdiaGhiTGtmN05TL3dERExkdklnQnRsSi8zYTdvOEFWbXRaNm5KTGlXaXVoK2J4K0h1cGJzQzBrT1A5bWxUNFphck1weGFTWjl4WDZQTCt5cmE1eUxaY2ovWnFmL2hsaTJHQ0xaUWY5MnFoNGZWZnRUTUpjVjBrOUVmbSt2d20xYzhDMFlmZ2FzV253VDFtN1lZdHlvUHNhL1J6L2hsNjFBR0xkY2ovQUdhdFczN00xc2dCK3pxQjlLN0tmaDkvTk5rUzRvZzFvajg4ZE4vWnAxYlVNRmd5WjZZSFd0bTEvWkgxR2JobGs0OXEvUkxTL3dCbnEzaDJnUUpqL2RyZHRQZ1JBaTQ4bFNSL3MxNmRIZ0hETDRyczh5dHhWTmZDZm1zLzdJVjRBU0ZsejZFVTFQMlNieENBNGtiUHRYNlZ5ZkFpQlhQN2djKzNTcWsvd0p0MUlIMmNFZlN1bGNEWVMreEZQaWViM1orZEVQN0lzeklTWTVDVFZtMS9ZeGU1WU02UzhkaG5tdjBSaitCMEtZSGtyejdacTdiZkJTM1VEOXd1ZnBYU3VDc0gxaVpWdUpLbHRHZm5jdjdITHNOdmtPRkhIQXhTVGZzV0FrRVFNTTg4MStqY1B3VWd3UUlSK1ZSWFB3YmdVWU1LNVB0bXRYd2RoT3NEbWh4TFV2cXorY2ZXeTA0S01Rd0VJenh6N0VWWStIY2pYY3pya0tHWFBUQXpXanIrbXBwODF1aklXbmFOY29lQ1Y5VFdScW1yRHcybHJMR0R1a1lFcXZBWDJySmU5SGxQTVQxdWQ3OE90Umo4QitORWtkU1lMOGJXWG9GUHJYc2x2cDVLTE1qQjBWdzYvU3ZEb3JkTlh0NGJrTVN6RU92SFQxRmV4ZkMzeEcycTZNWUM2TkphRDd1ZnZDdkh4YXY3eStaNkZDVnREVTF5QzJ1a0J1NHZrdU9qZ1kySDFyQWc4TjNmaDI3V1l1d0Ivd0JYT2hLNTlGWWQvclhUYWJjVzJvMzl4cEY0NGlTVUdXMGYzL3U1K3RhRnJPdjJkN0c4UU9BTnVXcmtpMnREcmhLenVVTkgrSU55NVdLOTNwSW55NVBLc0s3SHc5cjMyZTRqa2liRVQ5Y2RCOWE0V2Z3L2NXQWNwSDlwc3M1d3h5MGZzZmF0WHdqcWNPV2hHNUZQWW5PUldGV0szUjZ1SHEyMlBlL0MzaWhidUZXRERKNml1MTBmV2lDQ1NRZlN2Qy9DMnJuVDdsVkxaamJrZTllbmFCcmF1cUVIcDcxa2xkSHVVS3VpWjYvNFg4UmtGUUdiSTlhOUw4S2F5ckJDeHlUWGlQaGU5RFlZRWsrbWVsZWcrR3RkTUNJeEl4NlpxZGpzYjV0RDIzUTdwSllRT09ldFUvR2xnb3N5NFVFbXNId3Q0cFdiWUdZQUN1azFhOWl1ZE9JTExrQ3JiVFJ3MVlOU1J4ZHJkckhNVkpJR2E2dncxcVNiMUdRQU85Y1ByREpiemtxM0pPTTFhOFArSWpBUXBJSkJ4V1BPMEtVVkpXUFliZlZkc1l4akJxT0tCcjJZc3hKQjdWeTJsNjQweXFDUUNUWFJhWHFXV0FCQUFyZU5UbVZqR0ZCeDFObXp0VEU1TEFGUnh6WEtmSFR4QkY0ZitHV3RYTE1Bc0ZwSS93Q1NuaXVndTljanQ0V0xPcTdSNjE4NmZ0cWZFNWJuNGQ2bG9kbmNJTHE0Z3pKODNLZ25DakE3azl2YWpFU2pDRjVNMFYxRnlaK1hWMUdiL3dBUlpJeUE3M01oOWR6bkEvS25henFyYVRvem9BSEYyK1FSd3dHNEFEajMvbFhhL0U3d2RINEQ4TW1kMUR6enh4cEVSd1dMTHVZL2wvbm12SzljdVhTYUlCek5KYnhwT3d6Z0txa3NCK0pJL0tsaDJxalV1aDR0U2JpaUx4cHErM1Y5UDA0dUl4YXh3dVR6a2NzVCtRL25YTTJ2aWZTOWI4V2FwcFZ6SjVhemhrVnllcHhqSi9uOUFLMVBITTV0ZGFhNWtDeXlUS2taejk0REF6L2hYblY1NGI4anhRYm1KcHZNZVR6TWhjOFk0NStuOHE5ckN4WExieUVxbFJ1MFZjajFqUUJwNzNWdk5HWTN0NWNNRDFCR1FmNVZxK0V2RzJxL0RLTDdWcDkzaUxPUkE1M0lSM09PMVg3NkNiVXJhTytWQWJzaFlaRmtYS1NCUmhXSTl4Z1o5UWZXcytmUzU3MlBiSkNZWFk4cmpjQjlEL1N1aVZWT05wbm9VNmJjZWZsNVgzUGV2aEorMnphWEVVS2FsREpZeUhneVkzSVQvU3ZwZjRaL0d6Ui9GTWNaVzV0NTBZREcxd2ErQ3ZEdmd0ZkxqaHdkNCs5bnBrMTZ6OE8vaFRMYTM4TExLOXVYSDNvM0s0OUR4WG1WYVZLVjNCMlBzc213MVd2Qkp1NTk3ZUdOVzBiVUVCSlRMY1Y2MzhQdkZOaG9Va1N4U1JxRzdnOEUvd0NOZkV2dzIrR3V2UlFxRThVU1JaSHlyTmh2MU5kcmJhWjQ5MG1kUkJxdW0zMFM5ZDZzaEkvQ3VTZUZxcjNvMlo5ZFBoaXE2ZDI5R2ZvTHBQaTIyMUt5QU1pRmxISXpYRC9FL3dDSGRoNGpacG9BcVRFY2tkR3I1YnN2Mml2RXZ3MlNOdFkwNjdqaVFqTXNRTXNZSHI2NHJ1TkovYTV0OWVzSTNqUDdxVWZMTG41VCtOUXNVMTd0UldaOFZpc2xuUnF0SjZtcE40RGwwblVSRlBFcklUd2NacnZmQS9oYXpraHlZVk8zZ2NjVnlPay9GZTAxd0kwcm9Wd0RrR3VyMHJ4alpvbmx4eUtpdU9EMkpyYWxWVGU1d1luQzE0cXpUUFMvRHVuV2Vub2hFYXU1N2RoWFhXRitrYUVncUZBcnhmUVBpRkd0dzhUem9HajdnOFZtL0YvOXE3dzk4SGZDaytxYXpxZHRaMjBLa2tzNEc3QTZBZHpYbzBhaVo1VmJBVFdyTno5dEQ5cGF4K0FId044UWVJTHVkWTJ0TFovSkJJQmR5UGxBL0d2NTEvRzNpcTgrSWZqVFV0YnY1SGx1dFR1WHVKR1k1T1dPY1Y5SmY4RkYvd0Rnb1ZxUDdYSGlPTFROT2trdHZDMW94ZU9QSkJ1R3lRR2IyOXErYmJDd0V3NXlNVjlQbE9FY1U2a3QyS2xoWFVrbERvVklyVUVBa0ROV29yY0lBY2tOOUswN2ZSQTNPQ0IwcTFIb3F4a0FnRTE3MEtSOUJoc29xZFVaY1VKZGhnWjRxZU95a2QxQVhKYmpqcld6RHBnWUFLQUI3L1N1aDhNK0Y0NDUwa1pRNzU0OUswalR1N0k5L0M1UEtiVVN4OE5mQXBnS1RUSURMSWZwZ1Y2cjRldG85S0R2c0NlU3Bja0hwZ1ZrYUJidzJnRE92ekUvNXhXanFseWJmd3hxY3FOdUFnYzVCNVU0cjE4UFJVSTNQMExMOEpUd3REM2VpdWZQOTVlbS93QmIxTFVISmtrdUxoaUNlL1BGWExhNFRUN1lNU0djOHNUNjFpV2NvY29vWThaWS9Xb3RUdlhlUVJoaWNkYTgvbXNybjV4aDhXcWNYVWZYODN1YVQ2a2RRdlFja2dlOWRWb011V2lBR1NNZFQwcmtOQnNYbGtCWEpyczlDMDhtVkF6SG5qaXJwWGNqNlBKK2VTNTMxUFcvQ3VZZE9RRWhGT0RrOU00NFAxcmJlUjVZQ20xVDN6MzlxNTNRSld0Yk5ZeU53SUhjWitsYUYzcUMrUVNwWm5PRHdRVFhzd1dpUitnVWFpVk5SWm9KQXkyQmZ6QXlxMkc3NS84QXJVKzJmRTdTS1ZMQURBUEJ6NjAyR0FRMkVZTFNxejV3TUQwcHNUYm5VS0dZZ1pPT3VLdGJHMFo2STZDd2J6WEoycUZQR0NlYzFiT2wrWkF6SGNwSnh4em1zN1NtV1Rhd1VGczlHNm11cnNZQmNSZ0FFQmgwOTZhME9xbXpJRnE5aHFNUllrcTRCWTQ0cnVkVHVqSDRMUlZQek93VlIrTmM3cU5nVmpBZkNxakFuUGF1cjByU0pOYnV0R3RvZ1dSN2hkd1BUQXhXT0txS0ZOems5aU1WTlJoenlleDlzZkJiNFdMYWZEVFNMbVZWWm10MVpqNkhiWGIrQjlkZ3RyNTdWcFFHak9CV0w0UW0xSFQvQUlieEJsQWh0NHdUanNBSzg1K0gvaitEWHZHTjBGa2JJZmJ3ZlExK0FZdWJlSTU5cnRzL212R1lhVlN0VmxWMXUyMDE2bjFIWWFaYjNFOGN5aFNHcnVkSzhGUVhWdXJyR3ZJOUs4S3ZmRnR4NGUwNkc0VjJlRk1idTlleC9BajRxUWVMOVBXTm1BY2NjMTlmdzVtU2RSNFdwOGo0TFBjc3FScGZXWWFwYm15L2dLSVpHd1lwaStBNGpuQ0FrZTJLN0NmQTdBWnFISURFZ0N2dFZHUFkrUTlySnJjNWRQQXNPY2JBQ2ZhbnQ0Rmk1eWdCSHRYVHF3RGpJR2FWandmZWpsWFk1cFRsZmM1S1R3VEYzalhGTUhoQ0ZCOTBjVjFFdmNWVGxCQkl4MTVxa2tid3FQdVprUGh1QlZPRkF4NlZZaDBTRlZBMmpBcXhHY01SbW5vMkRudFF6S3BjcFhHaXdja0tLcFhPa3dxY2hjMXN5THVVKzFVcm5KVTQ2MGt3cHkxTTA2ZENQNEJ4VXNkakVFSHlnRTBNdzZVUlM0T0QycHRtbFJ0a290WThZQ0FDb0xpMWpIUkFjL2pVd2w1cHNrZ2NaN21sWTU3MlovTHhyVjY0MUtDK21ZdGNKR0ZaRDYxeThvL3RPZVdTZVFmWjVUbmQvY05kQmV4Si93QUpESXNrb2xqa2gzNEhJWGcxeWMxeTF2ZU5CTXF0YnVjREhBV3ZoNHgwUGVVajBMd1JxWU5nSWxPUkdmbDkvZXUyK0htdU40UzhUMnprcTF2ZEFxYzlzMTVENEgxWnJUVVJGS01nbkFPY1pGZXBXMEt6NmZFeWpjVWZ6RTlRRDFGZVpYamFUaTltZHRONkpucGZpSFRvZFRaWHR5eVRvZk5oWUhHMDQ2ZlN0QzMxdC9Gbmh2ekFvaTFLM0cyVk1jOFZ6Rmw0a0Z2WVdVellBWWVXemRjVnJHR1JwdjdTczNKdVUvMWlBWUVnOWE4NlQ1YkhiRlhGMDd4dTFsdWVVZnZJV3d5dC9FUFExdUUyT3FhVzk5cDZNR1AzNHdSdVU5L3dybmZFV25KcTBKdTRXY05MSGw0OFkvemcxaCtDUEVsM3BPb2pZd1Z3ZHBRSGpBOUtKSlNWMGROSnVMUFRmQmZpZDVJMnQ1V0RBY3J1Ni9UMnIwM3dSNGhpbVVSbVFxeThiVDFyeHlaV3VwWTcrMVZJNVY1ZEZPTjNyLzhBcXJZMGJ4RzdnT2lQRlBIMEJQQkk3Vnh0V2VoNjFHdlkrazlCMW93b29CQlAxcnJOSjhUTkVxaG1BQjlEWHpkNFYrTTZvb1M1YkRMd2Nua1YyV2wvRiswR0c4NE9vNytsUktEUFVwWWhkVDZNMER4ZXcycUhiSXJyL3dEaE5sRm1jeUhnZDYrV1l2anBhMnJCb3JoTWpqazFMUDhBdEhRUVd4WnB3UjZrOENzN1RXeU5LbGRTUjd0NGc4WXFaU2Q2a0FldUtib25qR0poODBnREQxTmZLK3MvdGhlR3pMSXJhN3Bxc24zbEU0WXIrVmNmclA4QXdVSzhKNkp1V0xVcGJ5UkFUdGdqWTV4N2tBVnBIRFZaN1JaeXl4VkdPcmt2dlAwRjBUeDFGc1VHVUFqdm10aC9pM1phVGJzMDExRkdzWXlXWmdBQlg1VWVLZjhBZ3BacnQ5cDl3MmhXaHRWVTdVa3VIM014UGNLUHc3OTY4dzhXZnRDK09QaVRNa2VxNjNlM1VjamdHRkdLeDVQUWJSd2Z4cnBwNEdwQlhsb2MxVE42QytGWFAwcy9hRS80S042UDRUMCs3dGZEMDhXcmFoRXBCZEd6RENjSGtrZGZvUDByNTMwajRyYWg4UWZCRjVxbC9xRWsyclRYTVV6QW5QbVprN1k5QVJ4MEZmUC9BSWIwZHJqd3pmeWxpb1FIR1NjdHhuOWNWMEh3dzhWVFI2VGMyaE94UHZEYWV3STZlM0FyeWN6VGxGSmJKbWNNVktvN003ajlxYnhDMnE2UnBFYkFHSzFCVGFnenZZb054LzRDRkk5czE0UnJWeEpGS1VjTEcwMnhYMjlRTURBK25JL0t2Uy9IY3JlSTlKc0dsa2xSV2haU3VNOHMzSkh2aitkZWJhbkVsOXJrMGt4Q29KQzBZaStiQTZnWXIwTXVTalJVZXh3Vm90ek9iK0lIaWViVHRhaU54Ym1hQWhBUUJ3UWVjZjU5S3I2dHBJR3BDZTN5WVRGdVhIVUFrZ0NySGpudzdjYW14S3pBSUZHQ0QxNEZaMXByY2x0cU50RExsWVVqRVlBWVpCQXdEOU05dlN2YWdrb3BvN0tWSjBxaWxQVk0zZkN4dmJqYmJrbVZjL2NQWEdQUTlhMkxEUVNtb1NoUXc4dkpDT09NbnAxOTZrOExGYis4aUVPV0I0T0J5cDlLNmRMQnBkUnM3ZUtRaGMvdlpEeUdmSDhoL2pYSmlaTzE0bjJ0SEI4OU5jdXBXMGp3eThXUkdnRE9QbjQ0elhxWHcvTjdhNmZHSlZEcEcyd0VBSEg5YXc3RFRaYldJUk1USUVPQzRHUjdWNlA0VGhXd2hoQkVTRWdrZ0RqcjcvU3VKMzVrdHJuMStWNEZVcHhXMSt4MS9nMkFYS3hCWlhpWm14Z1lYOGNHdlNkQXRvN09BU0p2a2tIQ3V4QUIraEdmNVZ3TnBkeFR3cDVrYVNNdlFoYzRIK1RXcGFXOGJFQkJKSG4zSXpYYkNEUzBWejcvQUE5UDNiV3VlZ2FqNGlpRmlJcElqY295NElhUUVEOVBXdk9QN09zNDlTblNHMGt0NHJqbDBQTVRIMUM5QWZjYzF1Mi9oOTczYVlZYmgyNi92SEpVZStLdjJQZ1J5eE4wd080ZktxamdHcnE0T2RWV2t0QjRqS3FkZGN0U0tzY1BjZUtkUStIMm94eHkyRXYyU1VEYk5FaGxVWjdrZGNWMXMrcytLMWdTWmx0WHRtVU1ua3FTckR0bXUzOFBlRXhBaXRPTnJROFlQU3VodE5HMDlBcUM0OHQ4OHJuQUhGUEQ1VkNEdTlUeW53MWg0U2J2ekx6Nkh3UisxMyszTjhTZmd0TzFwWjZaWjJVVW1RbDNndUsrRi9peDhmOEF4ZDhiTDQzbXY2M2ZhaW9iaUpwRDVjWjlsSEdLL1ovOW9IOWt6dzc4ZS9DVjFhWENxczdxZGt5Z01GT080cjhwL3dCcUg5aS9YUDJYdkU3aS90ek5wTTdIeXJsVlBsT005TTlqWDBlRG9Vb0pjc2RUOGc0MjRjeDFHZnRxYmJvLytrK3A0dW12Q0dkVllFYlFGL1N1bDhPNmxIY2xkcmpQMXJtZFgwTTJrcVB1VjBuSG1JeThnZzl2cUR4VWVrM0V1bTNhT3BJWFBJelhzVXFqalkrUXl2TWF1SHFwVFYwZXIya0llTUhnVlpTekprWEJHUU85VTlCdWhkV2NjaXNBU3RhNnlaQUo2RGpyWHNSZDFjL1pzTFJqT0thMlpOWXdpSUFrS0NSM3JvZE1nK3pXNnl0bmVmYmlzTFRZamN6ckdOb0hjVjJzT2psN0JwUTBZVkZ4ajFydXd0SDdSNzJFd3lkN2REa05YK0lUV0YyMElaU0ZPZmVyK20vRVNLOTBTN2hsazVtaktnZTVyemJ4MWF2QnFrNVJtSTNackYwYlhwR2xNYmxnVi9DczU0dHhseXMrUnhIRTg2T0lkQ290SGRJdDJVNndUM1FJSkVURmFzK0dkSVBpRFVXWWtpTlQrZFkxemNzOXpNRnpsMi9PdTI4RjJ3MHpUdzdGY3NBTUgrZGNkTnVUc2VCazhQckZkVTVmREc3L0FNamJzdExoc01JcTQrbmV1aDBqVFZoUVNGd05tTUFqSUdhd3JlOFdJYml3WWpBeG5JQXF5ZGY4dG1XT1FFUDE5NjlLbEJSMVorbFllVUllU1IxdHhyNGdaTUVGVjZjWTR4eWFORjFnMzJvMjhTT052bVpjbnR6WE14U1NTRmNNR0J6OHZjZTliL2diU2hGTzh6TXlxdjhBZUdRRG11aFR1N0k2ZnJMcXpTanNlbTZ2TEpJQWlmTXZYY3VOdlNzN1NHZTNrWU9NakhCUDhYdFVlaVhodVpWUUVGRkgzUi9GN1VQZGkwdUh3TWRlcS9kcm9Uc2ozSXlWa3pmdHJob21YQ1JndDNHUVRYZStGZHQ3WXh1eWtNRHQ2Y0d2TWRLYVM1dUZVbGdyOEw5UC93QlZlcytEN0R5OUlqVm1jRWtHbW5vZGxHVGtTNnBZakRGZ1NNYzE3TCt6VDhPQjRoZ2d2cFlpOGR0SmtjZEs4NDAzdzdONG0xYUd5dElqSk5PUWlnYzgrdGZaZndOK0Rjdnc3OEhXME1neVFvWi9jbnJYeVhGbVlleHduc292M3BmbDFQaytNYzJqUXd5b0tWcFQ2ZVhVNnVmVklOSzhBM2NEUGlGWURrbitIaXZNZjJmUGh4Qk9zOTBpa21XVm5ESDNOV1BqeDQxQmtnOE82Y2ZNdTcxd0pRdjhDVjZmOEUvQ1kwWFE0STJYQkNqUDVWK1Z5bXE5Vk45RWZrT05xS25Tc25xelRuOExmYmRGa3QzQkkyOTZzL0NzL3dEQ08za0lpeWpSdHRPT01qTmROZTJ5UjZkTkp4aEZQdFhINlBiWEFsYVpDUU4yZlN0NmY3cXJHY2QwZUpVZnQ2Y3FiNm4wdGFYbjJxd2lremtzbzVwa2svSTQ2Vnp2dzgxNDZ0NGVqRFpMSU9hMkpKK1RrbXYxYkQxbFVweHFSNm8vSzY5RjBxa3FjdWpMc2M0S2c1RlNlWnVHUVJ4VkNHZmdyeU1WTkZPUnhXdHppbkVXZHZtem5yVlc1YkFCNHFhYVFNT29xcGNTZkw3Q2k0NE1ZMHVDTVl5S2NzMjdIU3Fzc3VBUGVraW42ZzhqclRiTkpJdmJneUFaeUtxWERqSkI1cHlUZ0VnbkdhZ3U1UFRyU01VN01xenR0Zkk3MHhaUXB5Q0JUWnBNZCtSVUx6Z0Fqak5GemZvV1BQSUlJNXpTaVluQXpWQXo0NHoxcEZ1U3JZSnlCNzBHRTRuOHluaW53WGMrSFpoZU9oRWJRbUk3ZVY2L3FLNGE5S1MyNGtDa3VwMlNMMHo2RVY5UGVKdEdqMWp3ekpiVDI0anZXK1lyd0JJUFZmZXZucldmQ0UyaWF4TFkzSlVSWEhNTW4zZS84eFh3R0d4S2tyUGM5NmRPek15d21ZWFNLQ1MyQnROZXRlRXRUUnRLWHpGWW5oYytudjhBblhsV21SQnAydDVtSXVyVnNsc0Q1aFhiK0Z0YVNmZW9BQ0lnWEh1VFdXTGg5cEhSaDVkRHVyeTRZYUROR3BZUHZJNEhBOTZ0ZkMzNG5penZVc2J4bFpEd2pONmR4Vld5dlZGdkNqb3U5d1ZiMzlLNFhVbU9tNjB5Z2xGWnNqMVUrbGNQczFVaTB6cmpOeGR6NmdHaFJ6enhYRnNVZXp1QmdxT3g5UlhGK0xQQWR6b090dlBhSWZMWnQzQXlSN2l1YitHZnhjdmRBWllaMVc2dFI5NWM1SStucFh1L2d6WHRHK0kxaVlvNTQxY0RLN3p0ZU0rbnZYbXpVNlR0TFZIb1U1Umt0RGlmRGNEM1VCWXRzbDduSEIvK3ZXMGtDUXVYbEJBNDNNQno5YTdCZmhrdHFaQklWUjhmd2poKythWWZCQW5rWldrVVJTWkcwNURIamdkS2puaTlVenRpYzVwdW5XK3IzaXFpQnBIT0FRUHZmV3Q5ZmhwZlJydUVjVWFuMVBXbjZSNFFmd2hxTDNzQk1zTnZ0WmhrSFlUNmV1SzlQMDd4SnBXb3dwNTlzNlNoYzdXVTRiM0hxS3FuVVhVM1R1ckhtdW5lQ3ZzN0taV2lHZWNZeWE0YjlvenhiYitBL0FlcFhJWUtJSVNJd1RndXg0QS9NMTZ4NDk4WjI0aWtodDFqakdQNFFBUUsrTVAyc3ZpREo0MVI3QzFsTDJscklCSnhneUgrdnRYbzRaUm5OV09UR1ZuVHB0dmM4ZThQUnNHbGFVbFh2VHV5VDBCM2Z6UDhxVFVMU1hUSkMwQ0I1SkJqNWhrREhiODhWUjFtN2swNldOaW9CU0lNQjZIR1FQd0FycFh2RjFyU1VuVlFGWUNUai9QK2NWN05WdE5TNk0rY3B1NjVSM2gzRWw5YVdKRzlZMU1zdU84aDRBL0Evd0FxOUY4T1dxRzN1TGdvMGNTakM4NExNUVFBUFE5VDlCbXZPdkNNUmpFOHFqQ2x3aWp1eloveE5kMzR0KzJhSEJvd3N3bVhjM01tZnVaSEhQMEdmek5lVmkzZWFnZGRKMmpjOUkrSDE4SnZCbXROS0FKQ29FWnljQWh1Q1Bya0NxdmgrNit6eU5zS2dQaGNBL2VYSkdmcDBxcDRTMWFPTWExSEdvZUNhSlBMQSs3R01ESTU3N3FqMFd6eHFDQkhHSFV4ODlkcE9SajhEWGcxNFg1a3oxYUZTMW1laFhlbnZlK0QwamlLU1N3RXJHUm5HNEFISDlLOG5WWHN6UEpoRmxPNVZDOGxRTUFHdlcvQjVsaWdtaEdFbXQ5ckxrWkRFWUdmcUJYRStKdkNZdGZHRjFDVldPTzVacGxLNUhES0QrbWFuTDZxczRzN0pVN3pSemQ3cHErSkVjeFNNa2dVbGtJSXdCNlZ5ZXMrRFovTWhuQTNKRjkvbjVnUFVWM05wcDZXdDJRL3pKQ21TNkhEZlEvVThWUGEzbHFiZllJcFZjbitKTitCK09LOXVNbmF5UG9vWU5WNlhJa1pmaEZ6RVBLaWtCVjFBWndNRi9wNmNmeXJ1ZE4wZTR0bzQ5cmx0dU51ZWNlMVkyaTJlbnZkcTBCaGpsSHl0Q1gyRTg5VkI2L1QzcjBud3ZhMjk5cDRVTWlNVlBKYm9SeCtkY1VwN3BudDVMTmV6Y0o3bzBQRHNUWGJMTExHRkJ3R3p3TTE2dnBYaEsyaXRMVXN3QWtqNkVBbk83bkZlVzZSTEpGWnN6SUpHaWxFY2dMY3IxSDh4MXIxWHdwSXVvV01UcytHaGJDako0SXh4K1ZaMGFuTlZpbjVuM1dUMXZhVjRxWFMvd0NoMGVnK0Y0YlM2TGxIWVJub0J3dy94cnNOT3RJN2VjTWJjS29QeTVBeWVPdGMzcHVxcXRvZk9rS3B5U1dPQVBUcFc1cFhqTzJleFZWamVlY050QlhrSGozcjZIbWdqN3VMU090c2JVWENEWXNhc1J4empnZXRhR25lSFJMTDVqRHpDV3puc0s1YlRQR2F3T2hhMmtqWWpid0FRUi9qWGErRy9FTVY4NFdFb3BiczNCcW8xSXNweWFXaHQyM2gxYmxTamtOR2UvYy9qV0Q0NytDdzE3VFovd0N5NzJXMXZDdVZiZGxTZmV1Z3RKcHJkaVZLRGFlVnozL3dxOWJhb1E0eTZnbitFQ3VpRXU1a3FsU0Q1b00rVFpQanQ0aStBM2pWTks4VXhUUXJJMjJPY2Y2cVpmclhyT3ZhSjRaL2FhK0hzOWplVzl0ZlcxM0VWa2pjQnVTT285RFhhZkdyNEs2SDhiL0J0eHAycXdJenlLZkttQXc4VGRpRFh5SDhQTlI4Ui9zcC9FK1h3enJVa2s5a1pNMlYxdXdKMEo0SDFGYks2bGRiRlNxMHNaZWpWaWxKNmVUOG12UG9mRnY3Wkg3SWwvOEFzMCtPYm15MlNYR2lYYk5McDg1QnluckdmZkZlR3JhQmlwQU9ENlYrd243Vm5nYlNmMmgvZ3pkUlRpSDdRSWk4TDlXU1FEZ2l2eUI4U3hUZUMvRmQ3cGQ3R3lTMnN6SmtqcU0xNnVIcTh5MVA1KzR3eUdubE9MVXJXcHoyOG4xWCtSMVBnNjRhT3gyRW5DZEszNHJvQmhrbml1TDBqWG9VaERMSW9IMXJSWHhQR3FqRWlESHZYc1VxcVNTUGR5dk5xRU1QR0xtdFBNN3p3dE9zMThBSEM0NzlLOUh0Z3o2SzhhRGNOdlhwWGhPbStMMGljRlpWREQwUFd1MzBYNHJSSmFxc2pxd1BCRzZ2VncySWlsWSt0eXpPc00xWnlSaytLOUorMFhzMlZDbko3VndHdWFHMWhPSll6aGh6ajFyMDN4TjRyMC9VN2N2RXlSeUwxOUdyZzlYMVdHN0pWTXN4elhMaVlSZlUrUjRqdzJHcVhha3I5R1VQQzZwcUU3UElNQkRsczEwaWF1SGpJWGFPMkt6OUU4RzN6Mmg4aTNrTFRuY1RqQS9PdWkwWDRWNmxjc1RJc2FEcWQwZ3JLbENTTU1td3VJcDAxRlIxZTdLVUZ4SmR0aEFWejM2QTFvV0VjbHZKdGxBSVBHUWM4MTFHbC9DV2VKd3N0emJEUFFESnJYc3ZoQ2x3QTB0L0NCeWNvcEpITmRrSXllNTlaUndOYmQ3bkxXMTlKSGs4akI3azgxMWVoNjQwV21rSE8rYkFHM3Y3VnF3ZkN1emhCalc2TGcveGJNaXQzVFBBZW5xU0RPU3NTNXlGNEJ6Nit1YTZJeGFQVHcyRXF4MVprV3R5YldGSEN0RzdkdDU1TmJGcGN2cUFVRk01NjVxMUw0ZXRXdG84a2JrYkk5Y1ZxYUhZUVdZOHN4TkpJd3doRFlDOTYzaW16MnFGT2EzTlB3Ym9razhxQURLRG5CNXhYcFVRRnBhd3hNQXJLZWc3MXkzaFNHT0JrTExsbDlPdGRQcGpDK3ZsUm1EWUhVOXVhMXRaSHJVa29vK2dQMkp2aDRmRWZqR1hVWll5MGRvQW9KSEdUWDFsNDE4UlcvaHJRamJvRmt1NUYyeHhqa2srdGVhL3MyZUcvd0RoWFB3Y3RIZ2hXWFZkU0htaGNjODlDZllDdlFQQi93QVBiaTh2R3Z0U1l6WFV2UFBSUFlWK044UVkrV0p4czQwK21ucFkvQU9LczFqaXN5cVZXL2RpN0w1ZjhFOG84SGZDbWVEeEROcXQ4RE5kM0w3aVR6dEhvSzk0OEk2Y2Jld1hjQUttdWZDU0lCdFVBVnFXK3kyc1ZqQUFLaXZEcFVYVGRqNXl0aVBiUlQ2bUI0bjFneHl4NmZFU1htT1hQb0t1eGFlbHBweThBSEhGUVhPbHh6YW41K0FXcVBXNzB4UkFNVHU3QVYxMDNxM0k1WmFXU08zK0VWeVJZeXFRUUF4L25YV1NUWlB0WEMvQ1BVUE1pbFhCQlUxMTB0d01ubkZmb21VenZoWVc3SHdHYXhheGM3bHBaOE54M3FjWEhUQnpXV0xqSGM4MU5GUHVIT2E5RnM4cWNUUWFZTU1ubXEwa282SG9hWUxrRUVlbFFUejdlQlNUTVlhT3cyWjl2ZkpxTVQ3YzQ1SXBrODJSejJxc1o4SGc0QnFsSTZVcm92aWNEa0hPS1pOTUNDYzFVUzRCNEpORWs0d1RubWxmVTVxa2JFVjFLQVdKSnpWS2E2MmtuUEZPdjVzYzgxbDNsMFFNZzlLcE11TExNK29CV0p5YWhmVVFTQ0NUaXFFbHlPK2Ntb0RjZWhORFJiaGMvQWJVUEhrMWxPaTNDTzltbnlrRWZOQWZVZTN2VHZFbmdlMStKK2hHQ04wVzdqRyszbkE0YnZqMUJyYjFmd08rbzJTaTNSV3p6bkdSajArbFp1Z1MzSGc2YUtUWUZoVi9MbmpHY2hUL0FCVitXUm1wcFRwNk5IMFVxZksrV1d4NHY0cDBxVFFKQkpMR1Z1clkrVk9nSExzT240R3ErZzZvZEpsaU1qQW02ZnpBT21BUFg2R3ZYUDJpUEFzdHlpNnBia3RGSUFrN0tNQWc4by90WGhtb1NUV2x4RUNBV1I5Z0IvaEZlbmg1cXRTMU9kcHdtZXZXR3BDNHVVeVNGZFE2bjM3aXN2NGw2UTl5Z3Vvamxkdno0NUE5NnArSE5hQnVZWVhVQWxSdDU3MTFyUUcrZ2VOU2dXVWR4bnRYbmM3cFZEMEZGVGdjWjRYdlo1WVBLVndMdUxsV0J5SEhwWGJlQXZIRFRhaXNiTzluZG8yQTY4QW12TU5hdkgrR25pK09XNFFwYnMzVHZ6WG8wdW13YTlGYmF0cHJxOGM0SG1LbzZuc2ZyVjRsUldyV2oyWXNQVWQvUStudmh2OEFFZThsc1lZdFNEWFVTakc5T1NCNmcrbnRYYks4ZXAyNnlXMGpYRnVleWprZTNIU3ZDUGczcmtsNVorVkhLeVR3REhYcjdFR3ZRWjdxNzBhMkY1cHp2QktoL2VSb2NxZlhLbXZuYWxQM21sb2UzQjNYTWpvOVEwM3oxVkxXNGRKQWNtT1ErV1NmYlB5dFdaNHIxMjkwU0FSendYS1JxTXE1WEdQYytuNFV6d2w4WjlEOFh1Mm42b3kyMTRoUHpTS1FwOWZjZnJYV1BZR2FBUmFmZFc5MWF0OTZNc0pZMkhwL25GRk9Nay9lTGRaSkh6UjhSZmpGTHE5ek5ZNlk4R3lJNHVYa0xLOGd4MFRzUHpyeEh4MWV5WE0wY1JhU05FTzVnY0huUFhjT2Z6cjY0K0kvd28wVFhHa2MycmFaY3FHVm1oVU5HM0hVakdSWHpYOFIvaGpjK0RuYTZDZjJoWlJOZ1NLUVVHVDNBNUJ6WHVZS2NMNmFIazR0eWxxenpieFZwbjlzV29uWlRMSXFjRlJobUpPZWZ3NzFGOE9Fa3U3SjdhNXpESEdDQVdHQ1I3RHZ6VnZ4QjR1R25HR1dHM05yS1RrYkY0empxUWY2VlYwZThPdVg3M3k1U2R6OHk1eUg5eC9oWHJ5dTZkbWp6b0pLZWgwT2xGYml5VVFoWTVCTUJHcmRTQVJuOGMvenJydkVURzcwYTNoVmk4a0xEY1FTTnE3c2dINi80VjUxUHF4MC9YYlVvd1ZTQzRPZSthNjdSdFVtdmpHWk5vUzZ6NWg3WnpYbVlpazdxWjFVNUxWSFIrRnRVYTZsZU5HRWZuSnRJeGtuQjdudjBydGRPMHVHUFQ0N2t5NE5xK3dnZlRJYitZcnpIU0ozMGpXb29XSkppZGkzR0Q5UlhwbWthZ0pOS25oaEttVmh1S0QrUG4vUDUxNU9MaDcyblU3NkQ5MzBPNWd0OEpCZXhESWRBc3E0NUhxUHlybmZpaHAvMlBVYlM3V1FvU1dRN2xJWWdIZG4vdm5INVZ2L0FBNWRmRUdoWElkaWs2eEFxQU80VUhQNFlxRDQzb2RhMEsyUkVSWllrKzhCa0syMERyNjlQenJ5c0pKd3hQTDBaN1ZHU2FVdXg1TW1zUHFWd2dMUkxJSkNTKzdPNDllY1Y5SWZBbjludnc1OFhmQmpXN1R5V3VyVEo1a2NxL015dDJYSHBYemI0TWpYUmRhQWRJM20zcU1OeUFlOWZXUHdLK0lyVGF2YnN0bkNIUUFDUkUydng5SzlYRjFYRnJrZXg5Umw5V256Y3JQbjc0cGZCM1gvQUlRK081cmJWTEdVUXhNZGx6REd6UnVPeHlSd2ZyWFRlR3ZFTUYvYXhNekNPVjBPNGdjRTQ1Si9uWDMzcXZoK1A0aDZOQkpOcHFUemJBcjdrSHpEOGE4eDhTZnNTZUgvQUJQY3M4VVQ2WGNNKytSb0I1YXhqKzZGUEJKcktlTGk1TG1YelIxUmo3S3A3U0wwUGxuVWRlRmplSTBMY1hMS0hDWUt1QWVEN0hOZC93Q0Z2aWxiYVZ0dFRHRFBNUnlUem5QQi9YRlcvaXArd040ajBhNlM2OEw2bERmeFFOdThtNlBsczJPd1ljSDhhNGJ3dDhLZkZPaWVKNTdqeEZvbDFZK1VRaUFMNWtiQWZ4Qmx5S3FMcHluejAyZS9sMlBqOWJYczN2YmM5ajhLUnphL0kwVXJrQXVEdHp4ak5lbCtFdE9oMCs2Q0ZQa1k4akF3RCtGZWFlR1BFTUx6UktRb1pZOGYvVyt0ZHJaYThxS0lrYkpPTWtIUDBQOEFuMXI2RER4U1d1NStyVUllN2ZkbmRRNlZhU1RnTkdyS3k1RFl4VnUyMGRZSlBQdEhhTmxHVkI2TWF4ZEgxVmxqQXlDUmtaYi9BSmFWc1dldUdRQUZRZ1hrZjdYMHJzZE5TV3FOMHRMRy93Q0gvRm8xY0xESTJ5NFRjSFVpdHFHWVJBbnY5YTg1MWZXZjdJOFFXdDRBUEx1dmtiakhQcitXYTZoTldkaGtxVnlPVG5nKzlUVDB2RjlCK3g3YkhVTGZzSEtrN3M4MTVaKzFkOEZJUGpCNEdaN2RVajFmVGY4QVNMYVFEbkk3WjlLN1pkV0R3bFN4UEFPZmVnYW9KVllFZ3FSajBycWcraHhWcUVsYWNkMGZGV21mSEdQUS9EMTVwVjlJc2Q1YXFZM1J1b1lWOE1mdG82TkRjZUw0ZFl0d3VMMzcrQmpKOWEreC93RGdvNzhFWnZCbmltTHhicEVUSmE2Z1FsMkU2SzNacStSdjJpNFd2L0FsbFB2RE1yQSs5ZGRDNmxZL1AvRUtjY2JsTlYxRmFVR212OC91UENZeXdVYldJRlhyS0l5Sm5MZm5WSkFTb0lHRCtsYWVtNDJnazVCcjBZeHV6K2ZNSW01V0xOdGJ0dXlDY0Q2NXJTanQyOHNIYzJmclRMT05keTVHS3R5eWVYSDdDdW1FYkkrdndlSFVZWFpRdW9Id1Q1aitwNVBOZEo0RDBxR3hoKzEzT0hkdnVCdVFLNUxWZFdFYUVMa21yMW5yODhtalJzaXV4UVlPQVRWd21sSU11eGVHbzRwMUpybTVWZGVwNlpINGsza0FTa0lPMy8xcTZId3pyYWVhclNFRlR3YThjMENlOHY4QU1qZVlnN2RxNnJTdFhtc1dBa0xISGV1NmpXdnVmb21XWjA2OFZOeGFUUGVOSHNvN3lNTXBNaUhnYnZ2TC93RHJxUyswR2V3SmVNc1ZBeVFUblB0WE1mRHZ4MnM2SkRKSXFuSFZqakg0MTZoYVhNV3BXaVc4Yk1Td0dXUGNmMXIxYVZwTFErK3djWVlpRjR2VTgvdHZFVTFoY0ZTclJPckVrWnh4V291c1NqYXhWa0J5Rnh5R0g0K3RiK3IrRVlaVll2RUF4STU0NXF0YmVHVmgzQnNiUVNBU2VsYXFIVTFXRm5HVzR1alNtN0Nic3EwbWZZSDJyb2JJeHgzT0NwSmlYSjU2MVFzN0ZiU05JbFZRUVFRYzlmeHJRczRtaWQyVkdZRW5uZ2dnKzlheFI2RkdOam9kS2tEVEJ3Zmxmb1ZQU3ZRdmhGNGZQaUR4WmFRS3BaWlpWQittZWE4LzhQd2d4Z0k1Q2pCQUEvblgwQit5ajRXODN4RkhkYlN3aDZaR0FEWEJtdUtXSHdzNnI2SXd6ZkZyQzRPcFc3Si9mMFB1WDRZMnNOdnBGdEY1YUR5b3dnT1BhdTZpOHVQRzBZQXJ6M3dWTjVOckdNNE9LN0t6dVR0Rzdsalg0M0NwdTJmeTVpWXlsVWJmVW12cFdhUUVjKzFWYnk2QlFBREdPYW5ubDI1SkdSbnBWUzdaWElZODU3Q3BucnFhVXZkc1FDWlNBUVNXelZXOGdOemVsbjRWUjBxZkt4UzdpTUR0V2JyR3NyYVdzODVJQ29DU2ZwV1ZLTjNZNkt5MlNPditHY1AyV0dlUThCbU9LNk9lNkFKT2ErTjlJL2I1dDlIOGZUYVJPaGhnaWw4c1BuNVR6WDAxNEsrSU5yNDEwaU80Z2xSeTRCNE9hL1NjRFFkTER3aSt4OHB4SHc5ajhIVitzWW1Gb3oxWG9kVUx2cGs0SXFlM3V4azV6V09Md2Nrbm1uUjZnRlk0WWMxMVhQbDV3ME5sYnY1c0U4VTI3bUxISU9EV1o5dUdRUXdKcDgxMEdRWWJnVXJuSTFaM0pwcHg1WjV5YXFOZDl5YWprdXh5Q1NjMW4zTjhFSjVBeFZwblZUMk5FWG0xd2M5YVdhOEF4aHV0WWt1cFlHYzRKcERxcXlKZ0huNjB6T3JEcWFONWM3a2JCeFdWZFRsa09EZ2ltdnFIbUtSbXFkeGRqZGdFMDBqR0N0b0VseVFjazgxRTExN2pOVmJxNVZEbk9jMVRrdjhBbmtnNHEwenFqRzZQeDcwYTRUd3A0Z1JKa0RXY3ArVWs1QjloL2hWejRxL0RDMzhYYVdkUzBTUlVsU1A1NHdBTjN0WG8xLzhBQktIWDlJbGp0WFdWWEdSM0tuMXJ6bEl0YStGMnJTMmQ3Qk85cWNoZDNRVitMVWEvUFAybEo2cmRIMVU2ZW5MSTRud1RlUHJlaVhmaC9Wd3BralZvVkxqRzhkdnhCcnhIeHg0QnVmc1Uwb0JFMXBPWXJnS1B1TUR3Zm9SWDBMcVd6VmZGZHRmUXBzYVJnamdEajYvV3EveEkrRWNtaWVOVGZ5Tml4OFF3QkpFMjVYZUI5LzhBbFhxWWZFY3MzS096MS96T09yVDBzejVsMDVwWTdTTzVKWVN4eUdQNis5ZWgrQk5YL3RURVV1UTQrVmdUeitHYTUrWHcyZEwxaDdaMEp0VmN4QnNjcXdQT2E3L3dwNE9zcGphenJMNWJUZ0J6aklCQngxN2RxMngwNDJ1aXNMSnAyS0h4VytHMFBpL3c1dG5SeTY4eHpJTU1uMTlxeS9ncmFYZmhPWnRMdXkwaUVueXBEd3JmU3ZiTk1oT2gzeTJWOGlYRUxEQ01NZnZGN0VkczRyVjhWZkNIVHRmOE9DNzBXQU5kMmNubXREZ3JJZzcvQUU3SDByejQ0MjlQMlU5dWgweW9XcWUwaWN0NENqWFNQRXl5N1hqTTJkdzZCdld2WVJkV2x4WkdUZjVVcWpHTTVMYzlLODYxVHd6Y1dtazIrb1JxN0s0QmNFZk1qZERrZjU2MXY2SFBOcWZrQ1ZRVUFIUFE0eG4rdGNqa25xajBjTy9zczU3eDc0WXQwdmwxQ0VQYlNGdzI0akM3dXVEanNmVWY0MXpXamVNZFc4SCtKWHViTzR1TGFKMzJ2RnV5TUU1QkhZL1hwWG9IaVcra0llTUdNeExnRUZmMDl4K3RjUmZhT3FUenVqbVMyMjdvV0IzQk1ucDdpdGViVFVtYWFsWkhlYVArMEJIcVFNV3IyYVBHRDVaa1VsVG5HZVBVRWMxaWZGSHdLdXNhVE5yZmh1NFc0Q3FHa2pHQ1F2Y092cHoxcmw3alNXUGhrRXJ2ZnVRYzdldVB4d1Axcm1ORCtJRjc0V3ZMTFViYTdsZ0ZyTjlqdTQrcXR1SHlranVDY0N0S01IOFVPaGpVa3I4c2p5MzRxYUJGcUVjc2tjWXN0UkJ5OExuYkc1ejI5UHAwL2xYRjJNVnhwVm9FblVSVEE4Z2phUWMxNzk4ZXRDMDc0aCtGVHJ0akNMZTRpYnlMNkNNNFZKT3pEMlA5SzhkdjRCZTZlWTVnN3pXYUx0YklMT000eDcxN2VIeENuVFg5V1BPcTB1V2JLMnVTbWVDR1ZXeThpQmh0d1NwQjU0UHVBYTZEUnJscDlHZ2tCY3ZHM0hHR0oyajlPSzQ2NmxaNUVFakJXUnNBSCtWYTFqcVJTYU5GTFJ4c295YzV4V2xTbmVLUVU5N25iUDRwZzFDemdieTFOemJzc2JnSEc3a1lKK25OZFBvSGlMN05aUUdWQUc4eHh2M0Q1dHhCQTZkT3Y1MTV0b1V3WGU3QWVhRGtmM1pQODVyb1o1Mit4QlBteHl3SjZna0FmcFhEV3c2YTVUMUtGTnZVOS84QWdqcTBPb1hjME1NcGdTVUlONEc0S1djS1NmVUFFbXRqVU5LYnhKb3R5akVva095WmdEbHNBZ01CNzhWNW4reWxxc3Y5cDNNTncyWWR3WlNPb0dEK2dOZXFlQjBmVHZpanFPbHUrK0pCSmJLRDBaOTdIK2VSWHpPSm91RldYZU5tZWpoM3NtZVFlS1BERXVpK0pkTXVoRVV0cmlRcGpHQjAvd0FlSytxdjJUOUFnMCt3a3ZicFFaWmNlVUdHUUIycnk3WGZoOUI0NTBoTGVVeXJjd2xnZVNDaHlOcHJ2ZmhwYitKdkFPblF0cU9uWEV0bEVkb3VZRk1pS0J3TndISSt2U3RhMVQyaVZqM2NGTGtidWZZSGdMeEpFZ1NNN1FBQjFyME45R3NQRVdsQTRVU2RRdzRJOTYrZHZoNzQ0dE5TdDRuRnhFZlZ0d0pyMVhSdkVMelJMNU53R1FET1IwcmxVK1hSbnAxSnFWbWliVlBDRnlqeUJYVjJIM1F3NE5jbHJXaWFoYVhnRXRqSE1wKzZ3T0JYYzJuaWFRSUZ1Z3daandlNEZidGhhUWF6YkFaVmlEa1pyT1ZwYUlVcGN1clBDdGIvQUdmN1R4dkVaVGFIVGI5ZVVsaEdCbjNIUTE1TjQwOEw2djhBQzNVdksxSlhWUWZrbkF6SElQVFBiNkd2dG1Mdzh0cGxSbmFhNWY0amVBTEx4YnBGeFpYMXNsMWJUS1ZZSHFNOXg2R3UzQjQ2cFErTFZIME9UY1ZWOEpKUW0rYUhidDZIeDNQOGRiSFE3UXZjM1NCMXpsUTJUbkhVZTFVOUovYkUwelU3dDRvVWtkWXpzYVVqZ0gwK3RlYmZ0dGZzd2ExOEMwbDFYVEd1TlQ4UFRNY055WmJVL3dCMXZVZTllYWZEL1JKSWZBOW5QS0NKSm1NeEI0SnovZ0svUnVINlZMR3U5N3hQMEhLZUlZNHl0eTBsb2xxZlloK00xcDRzdGRQaWduV1JtbUJJWTUyREhPZmF2UjdQeGJiM0ZzU3pydkdBQURYdzFiWFZ6YStWSkU4aUx4em5rRFBXdXQwRDRzNnZvY2lvTGg1a1hHUXpaR1B4cjJzUnc1WnVWR1gzbjFrS3NPdWg5aDJ2aUhCSUJCUWpnamsxY3Q5VzJzRUFZanFTVDFyNTA4TC9BTFNJbm1FZHpiT0ZWdGhaVDZjazRyMG5SL2liYjZ2WnBMYnpLeW4wSTRyeEsyQnJVUDRrYkdrb1FtdERxdmloNFQwMzRoZUVielRkUWpXZTNuUWpERE9QcFg1Ui90V2VFbThHYTdxR2pDVXkyOXZJZkx5YzhaNEZmb3g4US9pTGVXR2dYYzFxSG1aSXkyRjV6eFg1by9IRzgxcnhoNG8xTzZ2TFc2WjVIWnZsUXNGSHZXMkhpM1kvSnZFQlJoUTlsSFZ5VHZic2VGS2ZMY3FjY0hHSzBkTU81Y0hqTlo5d0RGZXlJMjRIUHB5S3ZhWGc0d0s3b0g4OTRTVnBtM2JOdWpIQkdhSjdnc2hHU1RUTFNLV2Nva1NOSkkzQUNqSnJZdWZoajRoL3M4M1EwaTg4Z2M1Q0U0cnJpbTFvajdDbTZzNmRxY1c3ZGxjNVdXRlo1d0dBQUpyMUh3aGNhZnArbncyd2pqVlNCdk9PV3JoZkQvaDA2cGV1SjJlM2ppUHpuSHpaOUs3M1IvQWx2cW9STFcrOG1iSHkrYWZsWStoclREeGQ3MlBYNFd3ZGFFcFloUVR2dDMrUjFLZkRlSFc3VVQ2WlBHN2tITUxjSGowcm1OVDBpWFQ1WGhuamFHUkRobFljMVBwMnM2cDhPdGJXMnZvcExlUUg1V1BLU2oxVTlEWHBscC9adnhPMHRFbkFpdThaV1VjRWV4OWE5R01JejAyWitnNGVqUXhVWEdrdVdTM1RQSmROdnBkTW5CVWtEdDdWN0Q4TGZpR3M2SkhjTUNWNDU2bXVJOGNmREhVUEMyR21pRWtEazdKUjBhc0hSdFNmUjc1R0pZYlc0T2EwcFNsQ1Zuc1hoSzlYQjFiUFkrcFZsWFU0QXl1WFZzY1lHRDZmaFZHNlEyc3FLb1pHSkRFZFJYTGZDN3hxdXBXcUkwaGJ5K2c5YTcrNnNtdXJQejRncUhISTZnR3ZUaks2UHZxRmFOZW1weEtkcmJSenlZeU1mM1NPT3RYa2pJbWJBS3EyTXB6eDcxVGlLc1F6c0F3WEhBNGIvd0N2Vit4VU00RzRybkF5VHlhYVdwY1ZzYjNoeXg4eWFORnljSHNhK3dQMlh2Q0pzTkJobVpBSGx3M0lyNW0rRi9oaHRWMW0zVEp4STR6MVBGZmNId2o4UHJZNlpBZ1VLcXFCWHczR21QNWFjY05IZDZ2MFBoZU84ZW80ZU9HVDFlcjlFZWorSDE4cTNUcmtWMDJuemtLcFlFY1ZpYVZhWjJiUml0aU5HZ1FoeDE2Vitld2JQeGVzazNjdVBkQjJPVGtDcVQzS2lRa241YzBrc2dFUzhFRTFuVHlHRExNU2VjNHJYb1lKa3VvWG9QeW9jc2VLNEw5b0h4bEQ0RStHV3BYY3NnVFpFY2M0eWNWMVZ6cVN4QnBYSVZZeGtrOUFLK0VQK0NoMzdXZHZyOGszaHpUYmdOQkNjVE1wNEo5Szc4c3djc1JpSTA0cjE5RDI4ankrZU14Y1lXMFR1L1E4T3ZmR2o2cnI5M2V0SWQwMHhrNjQ0SjRyNlYvWk8vYTR1ZkM5emI2ZnFFNU1IQ281UEE5alh4UDRjMTA2aEx1REVvVDM3MTZCNFgxTDdPaUVFaHZZODVyOVVuU2pLS2d1bXgrelpsZ01MbUdIK3ExWTNYNUg2OWVEZmlYWmVMdFBqbGdualpuSE9HelczSmZZNXpYNXVmQmI5bzNVL0FWM0NqenlUV3VSd1d5VnI3TCtFbnh5dFBpSnBjYkpLck9Sd2M4L1N2TnFVcFFlcC9PM0ZmQTJJeXVUcXc5Nm4zUFhCcUh5NXprR3BZdFEzSVJua1Z6Y09vWlhHUU0xTkRmZ0g3eHhXRGtmbkZTbTBha3VvWUo1T0I2Vm5YK3BCV09DRFZXOHZnalp6MTlheU5UMVBQSUlPS3BTTktLTDl6cXcyL2VHUjcxQkhyb1hLZzlhNW04MVlxZVRrR3FoMW9ySjFJcW5JNkowN3hPelhWd0h3RDFwSjlURFlKUFN1U0dzNUFJTlNQckpraXlXemdVUm1jRW9OTTJ0UjFFYlFRUWF6bjFNNTVJUGFzaWZXQ2MvTURWRnRXR1NReEdEVnhtZGxHR2g4QytDdE84VCtCcGYzc3NrU3h0Z2IrUVJYcjhQaXp3LzQ2MGIrejlldFlHbVpNZWVGQUFyTWw4ZTJ0OFJCY1doRG5qNWt5S3JId3piZUlKSEVWdkNyTnp1QndUWDRQV2xCdTdYTEkrd2lwUFNXcVBKdmlYOERyM3c5NG1TNjBkbXZyR1p4dDJqN25QdFhaZnRNZUIzUHdXc25DbU85dFlFQ2tMOHhmQXlLOXIrR1BnKzI4T1FlYnF0ekU4Q2pJakpHQjdWeXZ4MW0wYnhZN3BkNmhIQmF4SGNrTUpCWnE3TUxqRzVKU1p6WWloMjZIeDNZL0RpWFdiR085Tmd3ZWRCNStRT29IWDhhZ3VmREVPand5eHdPaXJBNEpLamRqSXdWNDl3SzdUeFQ4U1lkWGsxSFFORWprdGtSR0VNamNibUgrTmNCOFAvQUR0UDB1NWp1bWRKSmxPZDV6a2hzbk5kY3VhN2szWmRqS051aDM4ZWxSNm5hUXo1WmRoNUM4REI0SXhXWnJ2eEVrK0hyUVd1b0V2YkJsRVVxRUxKSG4zOU05anhWcndGcmpUV3JBamFRN0tmenlEOWVhNWY5cFRUMjFhODBxWE9GdlZ4SWU1S25KUDYxeFlLUE5YZEtXeDAxWldwcWFQVWZDWGlpejhUMjdKSTZTUnkvUEZJT0MyUjBZZGpXeG91alc5ckZOR3NZUlZIQyt1TzRQNDE4Ni9EWFY3end6cDluYzJ5dkxwenl2YlhFYkVuR05wREQwKzhLOXYwRHhPdmxDRzllVlZsakRSVDRPNkluKzk3YzlhZGFIc3B0SjZHMkdxWFNrYy84VGJmR2lYRU1ZY1N5Y2hsUFhqakZlZi9BQTErSThWOTVlbjN4amFTUTdZNWVna1BPVVllNHp6NjEzM3hKbWt0dEJFVXFndkdUdVlmZFBjSC93Q3ZYelByMGh0N2kya3NYZFN0NkhNZWVWd3d5RlBjRFAxcjFNTlM5ckN3WXVvbzJaOUtUK0gxMCsrOHFJdWJMVVJ1ako1YUo4ZFB6RmVPK012RGNoMWpXNEhSNHA1b2ttS3I5MW1qYklZZStNNXI2QitHRFczalhUb3RHbWxSN3VXSkpJQ1R6R2NkQ2Zya2ZpUGV1ZThhK0I3dFBHZHhiUzI1WnJtSjFZc3Yrb2RlcHo2ZEQrSnJQQ1ZlUzZrWVZvODFtangyV1QreVBoNzRvbXVGYnlMMkszUlJ1Kys1NXpuNmJ1bGVRV2R5MC8ycGtBVkFvUUFkaVRuUDZWNmorMFZyY0VOdFo2TFlITnJhcjVydXZIbWtqRzc4TVkvR3ZOYkcxMmFZMGk4aVZ5U1Q3Y2Y0MTYyRlQ1WEo5VGxxclczWTVpZFcrMU03NTRiOWEyTkJ0M3ZKQTZoaVVVNDlEN1ZYUzFTZTZJbWNSb2hPNGdaUDRWdjZicVF0TE5iZXpqRU1ZR0hicTdESFhQOEFoWGZKNklWS0dxYko5SzB5YTNpUjVWVkNDU0EyRlA1R3Q5ZDV0UURnbFd6MTZtc1RRbWU4bkc4WlFjRGNja0N1alN4TWtHVkxJcDZPUndEMno3VmxYZ3U1OUxDakZRVE95K0E5MGRQOFhwRWdjRnd3T09wM0tSajlhOVUwTFVUcEh4cnVCY3FJNExtZHJnbGVRV0FERDhEMU5lWWZBbUI3ZnhDMGhLaVZCdEFQVWtuSEgwem12b1R3NW9XbTZycmNiM0tLalRzaURwd01EUFgyeCtkZk40OUpWWkx1aHhwM2xvYk91d3A0ZjhUenBicUg4N0U0R01oZ1JtdlN2ZzU4UVRhT3NWMFFTL1VFWkZjNzR5K0hyNmhaV09wMnNxZ1drSGtPRDFZZnd0OWFwK0Y5SzhRZUdZN2U5dmRIbm1zSEdUYzI0ODJNcm5HVGpsZnlyeGFjT2FLajFSNnVIcUpLMGtlMytNL2haNGI4YTZTMTFhS2RMMVFBNHViTnZMSlBxVkhEYytvckkrRGRwckhoUFVUQnFtb0crU0k0REViUTQ3SEFybWRLOFh2ZWdKYlhJWlNjZ2o3cHJwOUcxTzQweEk1SlVNaFpzWjlLYzFOcXpPeW1rdmhlNTdiWjJzR3JXOGJBQVNBOWEyckczVFRMVUttZVJuQXJ6cncxNHllM21ZU0xoSHh0eDBOZGJhZUkxYmFWY01DTVlxNFI3aE5UUzhqcHJUVUh1Y0t4d0JqajBxUzc4dWNGbUlKNzF6TGF3YlNiS1B1TGQ4MDEvRUxUZktIQ2hlcDlhZFI5RENFVzNkSG1uN1lmaDJHOCtDK3UrYnpHc1prSGZCelh3UXNLUXdvakJWV09INUFPQUI3Vjl5L3R5K0tvOUsrQU4rcXlCWHV5a1B0eVJYd1Q5cSswa0IzREFEWUNEODNYcGdkZUsvU1BEMmkxVHFWTzdzZm9QQkt0S3JWZmtpYTRjcFpNQUNxajVjalBOUjZaY1BQcVVZQVBsc2NNUjA0NlZSdTdtUkxSdHd5aFlEQjRJNDUvU290SjFpTjlTUVpIbUZNc293UnhuR2UyY1Yra09SK2dTeGV1aDFYaHE0WERzUXFFUnM1T2NZSlkrdGFtbGVORHA4cW1HYVNNNDZLY0ErOWM5Wlh5NmQ0YjN5UkZReFZXd2VEMTQ0NDUvclZaTlJpRjBxcGtJY09lTUZSMkZUS0NrdVZxNTBSeENTU3VlaWVKZjJrWmZCR2hMRmNhYkhlcGRxVVZ3KzBBKzllUitFUEhTNnJyOXkwa1NLc3IvTW0zSTVQU3IzeFF4ZCtHMEpBK1ZnUm12T3ZDbCtMVFVkek93WW5naHVEejArdGNNY0pUcFZMeFZqek1iaUl4ckxtUEtmMmx2aEhMby94eG50YkdIWmJhaUZ1RXdQa1FOMS9YTmRmNEYvWmYwYlZ0TWlXZlZMbU85WWNsUU5oUC93QmF2YWZIWGhSUEhYaHUzdmdnYTZ0aHMzWXdTdGNGcGR4Sm8rb0xFRUtzRGdFamdIb2NWWDFPQ201TmJudzhPQ3N2b1l5cmlhME9aVkhkTHBGUG9yRWVuZnMxTDRHa2E2aHVGdnMvY2NqQld0dlJOU20weVprM0VGZnZaeVJpdXUwalVUYzJ6MjdFa0ZRUnowSkZZR3JhUUxlN1ZtQ0FJeFVzRGdpdWxVWXgrRStzb1piaDhOQlJ3MGJJcitJL2h6by9qMjBMbUdLejFGaDhzc1l3SkQvdFY1RnIzaEMrOEdhcTBVaFpaSVQrRGU5ZTBhV3U2UUtHQ3NoRFk1dzN2bXFIeGgwSk5aMGxieFF2bXdyZ25HU1ZxYXRGTmN5M09iSDViU25UZGFtclNYYnFZSGhxMHRmaXo0VGZTOVNYZE5HUDlIbkgzNFd4eHpYQStHdkVGLzhBRGJ4cE5wR29obzU3V1RieU9KRjdFZXhGYTNnTFVwTkUxK05FWmdYNTQ3YzF2L3RUZUVEck5ocFhpRzNWUkpHb2duWmNBK3FrNDY4NXJLU2ZJcWtkMGVKajZkU1dHV1lZZitKVHNwZjNvK2ZtdDdub25oalg3VHhwcFpobFZKWW5IM1NlVk5jTjhVZmhDMmtNMTFhUmxvenlRT3c5UlhLZkJ2eGpKWlhVVWNqc1dWaDlPdGZSMmxDMzhVYVVpRlVZc09Bd3pYWEJxcEM3UG9zRlVwWmxobEtXalBuZndScjAyZzZraXVkcUwyN1Y5SS9EM1hJL0VPbnJHekF4dXZYcjIvblhpZnhmK0hKOEphNFpvVlhhY2JndU51ZlN1eitCdmlFZ29qbGdjOEhQZitvcTZLYWRtYjVVNTBLcm9UUFFkUjA1cmU0S01wTVJJQ2dkUjcxZjBTMDNNQzdZSUhCelZqWElFa2FPYkJLeWp0bXREd2hvQzZocTBWdkNyTTByZ1k1NjEwU21veGNub2ZRVkpSaW5KNldQWlAyYmZEcnkzU3pPb0tIR0JqdlgxNTRHdFJEYXhydDRBRmVTL0NqNGNyb3VpMjBhS0VualVFbkhVMTY3NFZWN1VMSEtDR3I4UnpqSHZGNHlWVmJiTDBSK0c4Ulppc1hpSlZMNmRQUTcvUkFxeGdrWklxOWNEekl3RnlUMnJMMHE1SVpRUU1Dck43ZW1QREVuQnJtUzBQakpwODF5TytKVzNKSncxWkUrcUtFMmxTUjBwbXI2djUvQWNoUlhGZkVyNG5XUGdMd3hlYWxxRThkdmJXc1pkbVlnZEIwclNNZWhNWXVjckk4Ly9iWS9hRnRQZzU4S3IrUVhDcGRUb1VRYnVhL0kzWGZHTjk4U3ZGTXJLMGorZElXZHljNXlhN245cm45cFRWdjJudmlaY2lCcFUwTzJrS1FMbmh3RDFyTCtIdmc2UFI3VlpaRkFkNi9RK0g4dmRHbHpTVm5MZjBQMVBoakFTcDB1V0t0emF0bXJvMmtOcHRyQ2dQS2djOXE2SzAxVnJVQVpJSzlxckYwa3lTY0FEZ1ZETHljNXpqdFgwMFluM2xPQ2d0RHJ0SjhZZVR0SllranZYc253RitQTGVDNzFuTXVJaVFXR2Vudlh6SkpmTkZnNXdRTTFEZWZFMWZCMGFMSUhaNXpnajBGYytKYVVIYytaNHp4K0h3K1UxcDRpMXJQZnYwUDFkK0ZmN1JHbmVNN0dNbWRCSVJqclhwTUdyTEtpdXJCbGJvYS9LTDRPL0dXVkxpS2EwdTNpa0FCRWJOamRYMm44QWYya1lOY3NvN2E5bUFsQUF3eHdjMTVOZWc3YzBUK082R1p4cVM1S2lzejZJdTc3ZEVmbTROWXVvM2hDa2h1YVMxMVJMMkFQRTZ1ampnNXFuZEhPZWNWd0tyWTlTbkd4bDM5K1FTRDFGWmt1ckVIcUFhbjFsQ0NXSFByV0hjbGhrNDRyVlZUdWpGTkd0RHJSeGduQkZTUjYwU3BBSndhNW8zaFFqSkl6UTJvRld5R3pqM281em1xMGRUWnVOWElrWUU4MVN1TlpLbk9jRW1zMit2Q1ZEQmhrVm0zOStTbzV3VDYxY2FpSFJqWStOSVAyaDcwRlE5b3R5UjE1d1JWYTkvYW5tczVIaFdCclNUczZqZFhubnd2MHJYdkdqd3gybGpjWDl3OG9pVkVRc3g1eDI2MTlMYXgrd040a2gwVzB1cm5TcGJhYTRRTVVrWERENjU2VitXMXN0Y0krMGNORDM0NHFGK1Z5czJlWWFMOGFieng5YXZFdDlJL21aVXJ1SUttcjl2cG1vNmhMRXUrU1diWVZMWTZaNzE2VjRSL1k5MUhTd2ZNdFlZaU80NjVxN3IzaFM1K0doWjU3WnBvb0Z6bmJnZlN2Sm5MM3YzYU8yTW84dkxKbkdlQVAyWExaN2h0Um5rU09VOHNlcC9LdVQrTGZoL1NQQ3NOeXNRanltU01mZWFySHhVL2FkMWJROUxuUjBqMGl5Y2xZbFFBU1QrNVBZVjVWb3ZpeVh4N0xjeHp5bVdXNXRUUEFPU09oVmgrbWExZUhyTmUwcXM1MVdnbnl4TmY0YXdQZDY1cUZvdTRzSFdWUGZjdmI5S2wrTlZrOTNwbW5LaWhXZ2Q0czR5UnZHTS9uaXJ2d21zRnRmaXhweU9yb2s4RVNPRC9lSEIvbFhlZkhQd3dmRE54cDE0WWwreitXMTBReWpibENTUHpLZ1ZOS2ZKaTAwRlRXalpubDN3N3NOR3RQREdzV2NTUFBkMnR3U3h6aEZPekpBSGZsUlhaTkQveFRiWEREZXpCR2dPT1BMWUg1VDlEeCtJcnpuNEJsZFExMi9oazJ0L2FOdzVPZUEyY3JuODgxNlJCY25RZkM1RWkvdTRKRERJV0dRcWRnZTJEbjlLdkVTNXE3ajVpcEsxTzZLZXI2WWZHUGhLNXNGd2JzUkV3a2RYQTUyL2hYeVJxVVZ6YWVKaGF0RzZzdHdReTU1VndlSEhwMi9DdnNiUmtXU05ibTNBSGtPSFhubjNHYXkvaVo4TS9EV2dheGFhdnAraWpVTlkxMWdRODJHdGJVOXlGUFhuUDN1Mks3TXJ4U3BTbFRtZ3hWTnlpcEk1andMNGExMWZHVmhjMlFGdEI5amkzM0Rrb2hCQmJJL3ZBcXh6anBtdllmaVhyS2VPZkNVcTZYZUNmVVZWUkpPQjgxMFVQeklEM0l4ejYrOWVBZkg3NG5Yay9pMjhzTEhVQXlXY0FqbThzN1VWbGpDN1UvMlFSMVBKUHRnVnFmc3orTWJqVWJhVFNYbVpaM0JtdDFJenNtVURJSHM0NC9DdHNSUmZLcXk2ZERPbE8vdXM4aStQOEFvN3dheGFTdHRSYmhHaXdPQUdVOGo4LzByaTNzL3NtbnBHenI4bytiQnlNNDUvV3ZvNzlvMzRkcDR0OERmMmhEQ05rTjZKR0dNTkc1VTdsNDRCYkFIdjhBV3ZuTzZRblNDKzBvOGprc3JqQkJKNUg2MTZtRnF4cVU0dUpsSk5UYVp5OTFjQTM3cW8rVmlldld0M3d6QXQrL21Fc2tTbmM1NkJhNSthSXpYclpLb0E1T1Z5VFc3YTNLMmxqNUVZd3JzREl4NjVyMDZrYkpJMmhHelZ6ZjhONm5CSk00aVVKRkVwK1pobDM5eld6cDErays5VEl6S3d4ZzROY3hwSVdDSzRqaUlMTVJrOXpuc0sxZEdJVjBCZFZLOVNmV2txY1hjK3Z3TUlUaWVnK0I3cit5dGRzNUlXQmxXUkZJeHdRV0FyM3JRTHRkUzEyemhpa1ZwYmNJV1FOeU9Eei9BQy9Ldm5Md1lZditFbHRGalozSWxRazR4L0VLOUNsaHZMTHhpMS9ZWEVxVEdGVmp3ZWM3aHdmVVlyeGNkUVh0ZGV4amlxZnNwNkgxOTRRMWx0VDhHWGhNZTRLK0NNY0t1VC9MaXUwK0NYaTg2SmJ5VzBwRWx2R3hZcmpnQW5uOWY1MThxZnMwL3RGWDE1NGp2ZEsxU0RNTnhETVVkT0NTTnpCY2RDY0N2Uy9oWiswZDRZMUR4amIyRHpTVzBrOHh0ekhPaFVObmpBUFN2QXhXQ2xHN1MrSFUwbzFvdHRIci93QVd2aDVwbW82dW10ZUgyanRMd25OeGJyeEhjRDF4MEREMTcwM1N0NHRrUjEzWjdIdFdYNGttSGgzeEJOWmk1THFoREtWYmtxUmxUK1JGYVdpbzE3Q1NzNDNQMFBwV2NWSjJrenNnNHBlNnpxdFBFVm5zUmxKVEFJOWVSbXRLeDFJUnU2b1RnZDhkSzVLRzltdGtoU2RpN3hFcmtkaDEvcWEwQnFnMmdFbFNlUmlub3RUVnlsc2I4bXJ6SmNSQUU3UndEVDd6VTJ0bzhod0NlYXcvdC8yckIzREtqaXN6WE5iTm5hc1dZRUxYTlViZXdrMG5xZVMvdDhlTlRjK0FiT3dXUWw1Wnc1QVBwWHlWYjNyUUdUNWxKY0Q3dkpPZmV2WGYydy9GVDZuZjI2Qm1VSStCam5GZUdMZXlTUUVZYmFwR2Y4Sy9ZT0NLUHM4dnYzYlB2T0U2aWpoNVNYVi81RjJXOE1LS3I3SGM1SFB6WTQ3MUZveUdScmxsVXVxeE1BQXU0ZFBUdi9XcUV0MGM1NktNRWhmdlp3VG1uV054SzJuektTSERqYnRmSkhKSHB6WDJhN24xY2F0NUhSUzNBVHdtVUNvWFRHNWRwVWdnZmtmd3FqcE9wTWJvQUZ5K0YrWmVRMk8zOUtXNGxXTHd6SXpOak11QU54eHdNSHJ6K0hhcU9nTzBiUmtEZUgrYkxObmFQYm4xcTJkVTZ2dlJSMDNpQ0g3Wm9UeC9NUzY3dHA3Q3ZINVpuMHJXU01BbER4azVCUDhBV3ZYcjY3QXNDd3g4cWtFSHIrQXJ5L3hOWk0yc09nUjVHeVdBQ2drNC9wV2RhUFU0YzVXMDBlcC9DN1dScXVrdGFPQWdsRzBydHhnNDYxelhqdnc5L1orcUZkaEFpNVU1eVdOUS9DN1dWaHVBQS9KNHhrNHJ0Zkh0aU5SczNuandTQU1IR1R5TVZjVnpSU095bTFpTUluMVJ5UGcvV2lreUsyTWpIR0FWSkhiMnJkMWF5Ri81cklwVUwwMm51ZXVmV3VRczJSTDRuSlNVTU1IN3B4WFlwY3FiUXlzUVdVam9NRHAvbjg2Y0ZvUmhLbnVPTWpLMHVCbzVtWHpDU2VDUi9FUjdkcTBKclQrMU5HZUFOaHBFSUlJNmlrU0pIdW8zWWxXQllLZXdIcmtWZHRtRm01TFpJQnhuT1FSNlpxOURvcHRXYVBDUEtiVHRmQ2tPR2hjcVQzNE5ld1dHa3A0NjhDWG1uTVF6VFFFcm5HZHc1QjllbzcxNXA0OXNrc3ZGRXpLTm9aOTR4em5OZWdmQ2JYQ3QvYm9YNVViZUNjSGozNEg0R3VlbEhWbzhMTGtsVm5RbHRLNlBFYkMwbDhQYXV5c0dqWkd3UjA1QjZHdm9QNFM2NjF6WXhoaXdiZ0FnZy9uWEJmSHZ3cEZvM2pJendvRml1ejVuVGdIdlhUL0NobXQ3TlJobVFEMHlQODlQeUg0R0hnNHlhS3lpaExDNG1WTG9qdnZpYjRiaDEvdzI4Z1FFaGZtK1hBUCtCcnovQU9GV255MmZpRm95djd0V0FBSFFmaFhya2NCdi9DOXhHUWpFSjM1NmUxYzU4UGZDNHN0VWtsa2NuWnowNEF6Mk5kaWoxUHBxOUZPcEdvZHhkRlBzY1NZSks5RDNyMlg5bFQ0ZG5VZFJPcXp4czBhSEVlNFpCYjFyeTN3TjRhbjhjZUpJYmFCUzVrWWJqamhGOWEreS9oYjRSaDhPYVZiVzBNYXFrU2dmVSt0Zkk4VjV0N0NoOVdwdjNwYitTLzRKOHJ4ZG5Yc0tIMWVtL2VsdjVML2dub0hoYlExanR3d1VCZ09sYjhGbVM2eUVFTXZiMXFIUkFzRVFJQkdhdnl5S2k3aGpGZm1VWUg0NVVxdHZVdDJHcEZTQnlDS05UMWJ5NGlHYk9LemJpZFkvbURiVkhOZUYvdHFmdGVhZit6YjhPYmkvYi9TTlJtVXBhd0J1WGZ0WFRScHlrMUdLdTJjenB1cEswVGYvQUdnZjJtdkQzd1IwU1M3MWpVSWJjZ0haSHZHOXo2QVYrZHY3Vm43YzJwZkg5MnNMWXlXV2dCdnVic05LUGV2bXI0cy9HL3hoOGEvR3R6cmZpQzZsdVdsY3RIQ1dPeUVkZ0JXTHBlcTN1dTZnbHV5dXFnOUsrM3luSm9VbXFsWlhsMjZJK2t5VEQwNFNVcXNYZm9tajF6UUxDMG5hRllWVWJ1VGdWMTF4R3NkdXFJVGtkTWNDc0h3WFl3YVBaSVpTR2xJOWVsYU45Y0VaVldKQjR6eFgyVUVmck9GU1VFdyszUEh3U05xOCs5T0Yrcm9XeUNQcldGZVhyUmtra2hUbm1xeWF1UTVVWkpib0txVXJGVmNWR0NiYjBONFNHK3VTRkdGVTVQOEFoUkRwdHRxbCtEZkltMEhDbHVsUTZkSXRsWnM3U0twQXkyVGo4S3pQN1RIaUs0YUdGM1JnY2JoME5jem1yOHpQNVQ4VitNNVpuaWY3UHdrcjA0UFczVi84QXNlUDdPVHdna2Q1cExIeTBPV1ZUOTArb3IwTDRKZkZ5NzF2VGx2MW5lSzV0UjgyRDFHY2MxeHQ5UERwL2hwclVSdmN5dXBCenllQlZINFkrR3RWMCszbUtRdGJSemdnRWpzYTQ2cWJsZUswWitVVUpKTGxiMVI3dHBuL0FBVW8xclF2Rk1PaVJSUE1WYmF6YnVCNzE3NTRWL2J2anZmSml1VUpac0JpZWNWOFYrRWZnUERGNGh1ZFV1YmpNa21DZWVCaXVxMGtSV040MGNMRmdoNm1zVmxzcWt0ZER0V2J5cExSM1o5OStFL2pkcFhqNlpZYmVSUE5ZZEFjNHJvTG1BRThnZFB6cjQ4L1pqMXhyZjRpSTg4M2xRcmdISndPdGZZRnBxMXZxVVJhS1ZKQU80T2E0c2ZoMVFtb3haOVRrK09saWFQUEpXWm5YbG5uT0J5S29UMjdFWlU0cmVtVldVNXlNMVJtdGdTUUFUbXVCelBVbEM2TWFjUDViWkI0ckMxRzhaU1FlTVYxMXhhbFZ5QU9sY3Q0ajA4NTNEakpxZmFXT2VLdEkzUCtDY0dyL0R6NEQyNXZOWWd0cGRhbndSSzZnaUVlaTU2Zld1Ly9BR3FQMjMvRG1vMzVpMHdSK1Npa3RLQnVMZXdyODEvK0V1MXNSSW9ua1NNSDc0YnI3VjFFZHl0bm9uMmpWek5lVEVaamhVaFZWZmV2ZzRaclAyVG8xTmJucVZNc3ArMVZaYm5yUGlMOXVpVFNMaFJhMlN5cklTMjhnRWhSM3E4ZjJrOUorSlhoVXRxVUsyOGt4MlJoOERlYStWUEgrdFM2eGZXc05oYkxiUnlNUTZwOTcwQS9yWFBYZXUzZXBmRnpTOUd0aGNTUTZiQ2Q2UmdzMGpucU9Qd3JoaGdvMVpmdS9VNlpWVkJlOGpyZjJwZkRKMXZmS29Fc2JBR0xCd3FqUEZjYjhKdjlHdmRNbVZkaldwYTNrQjRBQllESDYxNk44V1BFVVMyVmxhbU1TQzZUeVdHZVltSXhqanVEV0xvM2dodEo4SUc0YVNPT2FPOStjbk9jS0FmMUdLMFZXU3BleW1TNHg1dWRIV2FKcFppK01IaFZBRUJ1THBFTEtNRGFYNC9TdldmMjdyVmJINFM2U3NVYXh0TXoyeEMvZmJhNVlEODhWNVQ0Y3V5K3FhRHE3UHZXd3VTcmM4S1F4SVA1RVY2OThjTllnOFQvQUEvam11SkVhM3NKV21SZjlvanA5Q2NIOEs4MUtTeEVKRzBrblNhUGxUNFR3eGFQNC9pc1k1UTAxcTBLTTMrMlF6dC9Tdm9YeDM0SjJDYXhaSWxodlltTE9GM0J2bTRZZlJXVTE4NCtBTFpOQjhhYVZxVjVJRWZVOVdtQnh6OG9DcG44eWZ5cjZ1OFNYY0Y1ZWFYQ2dEUXlSa0E5MzNKamovdjNXMk5weXBWbE5kci9BRFFxRWxLTnZVOGw4RGF0RmQzTjdwcUtvdUxRYlhJWEcvSSs4UGJJSS9BMU44Uk1yOEk0ZFV3MGphSEs1VUJ0cGRpTUFIMnpnMWllRTlFdk5LK08ydFcyUzFzSVRqUDN2bVlzdjVicTZEeDFFUjhEUEVzRGxYTU1jakp2T0FHSEpQOEFUOGE2Wjhzc1ZHUysxYS96RTVYb3Z5UGlqeFg0cG1qMVc1TndYSnVRQTdrL2VKd1NmZmtWMjM3UFBqSzUwcnhMQ3dCZnl4dmpQOTA5c0h1RFhLSjRQdWZIVUlPbm9yc01IeTEvZUVqcDBBT1RYcDNnL3dDSGtYd204S3k2amZGWXRRZGNpTS9kVEhRQUh2elh1WnBUaFRwOGozWng0U2JtN3JZK2dmR3R2WitJZEJ2M2lDVGFYNG10TXlSWXdZcHR1N1BzL3dERVBRNHI1QitKdmgxOVB0cHlBSXA0Mi9lZzlDM1RQc0NSbjhhK2ovZzk0K1h4ZjhOTC9TNVdWcjJ5a04xQ3g1WWdrbmFQVVpQRmVkZkhyd3d0L2RyRENvRGFrRllER1B2amJqMkFZQ3VESzcwNnJwUGE1MjFJODFtZk5rRm5kUzNDaHRwUWtZd2NpdEcyaThtN0t5RUtHL3ZIRk44NTdWQWlneGJEeUFPYWxpdGhOSjV4QktweWM5L2F2cjZ0UFM1dEtnNHhVelVzNGx0NVdkWHpuYmtBWi9INjFxV0t3M0V4Unl4SUdUMFhHZWNtczN3MUdiaS9qUmhreXRzQUk2NTQvcldoSFpmMnRhckNDZ2xYNVJqZ2tmNDFnNE5heFBid1NtdGFaMTN3M0tUK0lJVVZNSkU1WXNmdkVoVHo5SzkzK0dWdmJhbHJGdkxLZ1ljSEhwWHozNE8waVhTTHFjcTBwbUNOdVhKeUMzYjY0cjBQd3Q0OG44RTZuWnlLSG10MzJSdXJIcHpqUDVWNWVMd3NxczlOenNxUW5WbnNmVVB3MitHUGhpYnhkWlhZdFlsbmdsREFqT1FlaFA1VjZTMzdQZmhMU2RXbURhZkI5b2lsWWhnT2M1NjE4MWZEWDlxSFFMSHhCRWJsNW9IV1RIeklRVjVyMm40eGZ0WGVITkV2N2ZWWDFCbzROUnRJcm1ORWlaeTZsUUNlTys0R3ZHcllMRXhtb3ErcU5JME9XU1RpMWZ5T3o4ZitGTFRYMlc0aEppdmRQUllNaHNlYkgxWDZrWnhtc2EyMVQvaEdZbDh4MlVIcDZacnl6VXYydTdLZncydXEyTnRjM2NjODVnVVNFSU03Y3FUOVR1RmNjMzdkdHByeS9aN25TVEM2bkI1RDQ5L3BWWVhMNjNMeXRYc1VxRlMxNHgwUHBHTHhRZFJSWFVnZ0gxd2EwTFRWVzJISTVQVG5wWHpqcG43VjlwSENGRnZJcWpwOHVCK2xXcHYydkxTRk1yYnpTT1QwQXgvT3FubFZadTNLYVF3OWQ2S0RQb3FiVlBzMGFoM0NqcWVjVnhuanZ4OGpEeUk1UVJubjBOZUU2cCsxaGRYOGhQMk4xVWZkWGVBVFdiRDhlYlBYcHNTaVMyWWRuNlpvamxOUmF0Qlh3bUtpcnlneWgrMFZyTFhOeGJsU0ZPL2c4Yy9qMnJ5dWU3VnJmYXFpUWs4ODlhN1A0czZ3TlhqakVlMllIT2NjMTV6Y1hDcThtUG1CSERMeDBIY1Yrb2NNMCtUQlJYcWZaY05UdGhFL05sMTUyWXlveFlPZm1HT2NjY2RmeHF4cDA2UFlzeEtvV2tRWXlRY1o5ZjZWU2dsSzJ5VHNBV0tFY2QrM09PMktrODRhZkRDbkIrZGM0WXFTUUNmeDRyNktKOU5DcFo2bS9yMHhrOEtvVmM3NUdiSjM3dndGWmVsWFBsU1JFc3JNeElIWGoyeFZuV0dDZUdyWnVNU1NNVDA0NTlxdzlJdUNKMUVoTHNNakFQZk9CK1g5S282S2xaUm5FN3E4Wlo5TExLNEtBbmNDdlQxL1d1SDFJaUhVNUpKRkRJVlpCZ1liY2VPNHJzdE9rV1MxVmR3bElSZ0IwUDE5NjVyV3JkaXFrTUFWeWQzQnpUbWsxWTJ4MXFsTXgvQ2w0K25hdEdvSkM3aVNjLzRkcTlYMG04aTFiVFdnTHc4b2U1T2VQVDYveXJ5T0lGWEJ5UXl0MkI0NXJxUEMvaUVRS3U4c0dabUp4a242WXAwMzBNY3R4SHM3d2V6SDMwQTB2VVpJWlFRak9TQ1FHQUIrdGExdklzc0lSSlNFUTQ0UFFEOUtYWG9sMW0wUzRYYUpGR0NWUHpEMng2MVFqTExOSWloZVJnQVl5T090VzFZNjV4NUpPMnpMR24zS0xjQU15N3BlUTNRbXRhV0ZtczQvTU9TbVBUMTlSWE0yODZtVXVRd0FBRzMwK2xibWozaHViSXhzUXpOa2c5aGordE5XTG8xVTdvNEw0czJvT3RLUW9DcXZCNlZIOE1kYU5ocWNTTXlxQTNQYmR4M3hXeDhTN0kzc3drSUlST09ldGNWWkJyUFUwZEFjOXdPdFlOV2xjOEd0TjBzVjdSZHoyejRyZUhvL0YvaHF6bVZRMGdPTTl3ZnFPMytGVXZEdWpIUTlJU1dRbFIwd0RnNUhRajF5SzFQaHBxNjYvcE1kckp1WlR3TytEVjN4aGJPOHdpVUF3b1JqdDA2MTB4WFUrbGFqSzFlTzdOYndqcTUreFNLU0NHVEdUMDVxL1lSbWVSSXJkUTdTdHR3T2E1M1JXUDJieTg1eCtBRmVrZkJSckdEVTQ3bFpJcHA0M3doR0NxK3ArdGN1TnhjYUZOemx2MFIwVVp5cVdpZXovczdlRHJmdzVaaVYwQnU1c2J5UmpiN1Y5RGVHOXFRSXdJelhsWGhTVzAxYVZaRUt4WEI3amhUOWE3dlROZE9uUmlLYjkzam9jOEd2eC9NNVZwMXBWYXV0K3ArWmNTWlBpcVZlVld0N3lmVTlFc3RVV09JRGNPT3RGNzRnUlZ3Q0JpdU1YeFJFVUpWd0t6ZGE4WlEyRnZKSzhxcWlnbGlUd0JYRENWOWo0cXJoSGZVNkR4UDQvaDBleHVMaWVaWVlZbExPN0hBVVk2MStXdjdjbngwWDQ4ZkU2YzI4eGswelRXTVVJend4N211dy9idC9iZHVmRnQxY2VGUERWdzZXc1pLM1Z3cHdXOVZGZkoxaHFVa0Z3QklXYko2bm5uMXI3cmgzS1hCL1dheTlQOHozY2t3YXB5OXJWWG9hK242RTE5SW9LaFZZZGNZcUs5MGRkSDFBU1JSaFhYdUswYmJXUUZVbklKNHlPdE52dFVqdTRRSEh6ZXRmWnFLUHIrV2s0NmJtbjRSOFRDZG1FaDJzblFkeld4Y2F4Z0hCSkI2KzFlYmFoTWRNblc0aGtJQVB6RHRYVGFmNHBpdXRPV1ptVDVoODNQU2lNN2FNZUh6RlF2VHFQYjhpNXFHcUdWZ3FFbGlheWRSOFhXdmg0SGV3YTRQUWVsY3Y0cytLbHRwVFNSV2hFczdjYnV3ckI4SDZUcUhqL1hFWUkwck1jbHVvRmNkVEVjejVZbjR4eDF4OU9wellMQVNzdG5MOUVkdnBPcjZsNHAxUkJ1Y3hNZUVIWVY2SjRYOFBYYjZ2RmIycUlqZ1lKUFhJcTM4UC9COWg0VHNVM3hsNTIrK3pkVDdWc1ErSkZpOGQyVUZ2Q2lLdzVQcWVhSzFLWHMzYy9CNmRXSHRVOTNjN0h3MTRJRm5jdE5kb3Jzd3llNHpYTitLZkVWMHVzU1cxdXV5SkNlUU9neldycXZpZTYwKytZR1F2R3YzdTFaOXJjeGEzZFM3VkFlUWRUWFpoS2NWVFNPTEVWSk9veWhINDBtdGwrenJrZ2ZmZXBMTHhSRGFZRWU1bWY3ekhwVnhmQzBjU0dJcnkzVTFuYWg0YUVjREpqYXBQYXQxRnJZeFVrOXpvQjhTWWRJaUZ4Rk1ZakdNNVU0SnIzLzhBWXcrS09wK055NzNNcmkyQnhHSE9HSXpYeDdyV25zV2h0SWtadDdBa2Vvelgwait6OXFzbmhXNHNZSU1MdEtoZ1BRMTVHWnl1dVcyNTcrUnpVS3ZQZlJmcWZZN3lFRWc4NTYxRE8rRzROUTJkNTlwc0lwVGtsMEJQdlVkMUxqbGNnQTE4dTl6OUJTTEN1SlJnNEpyUDFQVGZ0QUkyNXdhbnRac0gxelZ0UUMyVzRCckdvem1xeHN6NE91SUUxTzlCUkNrTVRZUWUvd0RqV3E4WG1XSmlFaWwzT3dlNXJGZ2xhMzB5Qkl5VTgwaFNSMUdlNDk2Nmp3YnBjTno0bUVNZ0xKYndobHoxSko1SjlUWDV1MWRjeDd6V3B3MnY2TkY0Y2luMWVjaFlySlNWUDk1dXVLK2VmRHZqbTZ2YnZXZGN0THVlUFVkN0tQTEpETXBPY0ErdVA1MTczKzJwcXN1ZzZBTGEyMlJ4Q01zUmpxY2Q2K2FmaDBnazhPcktTUTgwaFppT01rc2ErZ3llaWxSZFI5VHpzYk51U1I3SjhIUEdNWGptQzUwL1VwRUYwc1JhQW43d2JyL092U1BFWG1wOE5MS0dRRkxxYVJ4Z2NaQ3FCaysvRmZQL0FNTFdNWGpCSkY0ZHh1TGQrdUsraWZHNUptMHlMT0Vqc3k0SHVjNXJqekNpb1Y3cnJxZEZINExNcitCcHZ0L3d0MWVjRVpzSGpuWEhQR05wTld2aXY0dHVKZkEwV25pVmtGdzZ1VDBIUFRQdHhXQjhLSldYd1A0b2hESHl4Q1JqNnRtcVh4RHVYdU5NaDNuTzN5c2ZtQlhNb1dxcjFMV3NHZWFlTjlhbXMvRk9oeHdNUCtKZWtSYnRpUmlaR0ovUDlLK3hMWFhJOVc4T2VHZFRna3Q1RWhrQ2dqbGNPQWY2c1B4TmZFdnhJdVhpOGJYU0lkcXRja25IdGtEOUJYMGg4RXRhdUI4QnJVRmd4aGkzS1R5UVFSaitkYlpwVFhKQ2Z5KzhuQ1MzUjBWcDRnWFVQalhKRXNLc2s0SzVBNVhZSC9vQlhTWFBoU081K0ZtclN6MjRraXVESkZKR3dKM1p4bmo4UFh2WG4zd1ExZWE4K01xbVVxK1d1anlNOUk2OXo4VVdLV3Z3b2xTTXNvYUtSODl3VExnL29LOEtjMnEwVXZMOVR2VVY3UFhxZlBkbG9UK0J0TlZkSDBDMmlqa0hEcEVxRVo5YzVQNTE1YjQ4MEhVL0V0M0xKcXIrVGFvVHZMeTdRUHg0NXIzalZMdWUwMHhvNDVwVldSTXR6MXhtdkMvaWZHYnpXMjh4NUdJUjN5VDBJVW5JSFFmaFh2VTR1bzc5ZTV5U1NpckRQaE40b3NQRC9qYU9DemxNa0RJWTMzTGdFRVlHM0hRRHJWMzlwWFVKTk44VGFCZXhGUHM4dHVWbEFZQU1BNEs4ZW1jZlN1UStFdG5IUHJoa0lJWlRnWS9IbjYxMW43U1ZoSE5EcGFNRGlLQ0VEbnMzVVZ2aFlLT0xTOVViUTFocWZQdXVXWXN0Y3VJNUFXMk9jQUhHUC9yVTYyVVhLQUZrVUprWXhqSS9DclBqYUlKcXN6QW5jaEM1OVJnZGFpMExUNDdtQXlOdURiaU9EWDJNWHowenVveTU2ZG1YZkQ2TkZNa3dBSzJ4M0p3ZnZZNC9YRlQ2TmR5Q1ZWdGszVEU0R2VwTlhkR3NJNTlSK3l0dUVPRlRBT01iaGtuNjByV2FhV3pMQmxCa0FuUEovR3VlazlHdXgzWlpWc3VYcWRIcGw2MWxhQVNiWlpKRytiQXh3QmpJUGM4MWRHcEJWVXlPd2hKOHR5T1NvN0grdGN0YzNUcGN4eEpoRVJDb0FKOVQ2MXBlSHJ4NXZQZ2ZEUkdEZGc5aURrR29uU3N1Yzl0MDNGZTE3RjNXVWllOWptQVVDVTUrWCtJLzRWM3ZpRzlYeEY4TWRFY0F5UzJvbHRDRGprQTU2OXNCOC9oWEU2OUd2OWtXMGdVQjQxd01jZHovQUovQ3RYd1hmeTNQdzExTGVRVGIzTVpROXh1VmdmMEFyT29sS0VaTG96cnFZam1weGwyWk8rb0xwWHd5bHR3ZC93QzhXV01ad1R0SjUvSW12TnJ2VVJja3VnTWN5bnBYWGVLcG1TMTB5RUhDUGF0bjMrU3VCMUJ5TFF1RGhnY1pyb3dzVnl2elpXSGsrUnZ1enMvQWZqWmI2SDdQS0F0eEVjRG5PNFk2L3BYV1J0RzRPQW9QWS80MTRicEY1TEJyRUxvNVZsa0F6N1pyMVBSdFFsbmRBelpERG10NXdYTlk2Y0RqSHo4ck55OHRYNUxJd1lZT1Flbi9BTmFvTlh0MFpZMjRXUXJsd0QwOVB4cVp0UW1rakNseVFuQTlSV05xTnc0RWd5RGc5ZTlTcWRuYzl1ckw3VEtscmV2THFVeUxJNGpSY0xrNUFPYUliQXlrdVJ6akdNOVBmK2RVZkQ3R1RVTDRuZ29tUVIxNjEwdHRFaldyS3loZ1UzYzljNHI3RExJL3VGWTdjc1NuU2J0YlV5MG5TQzBZRmVRckp5Y2JUVkpidGcwSUlaM2VRa3F2ZmpyVDlhRzFtQTREQVo5K1AvclZTbGNxMXJnNEp5YzkrbGR6WjAxSjIwUnVheHFXTkZoaUNsWGNGdlRuMS9XcW1qMjRWb3dDUTRKejlLaDFPVnBZSUhKNTJFZmg2ZnJWclRmM05wRk1CbHlkcHowSUlxb3U2TFUrWnE1YXROYmtzd1lsY2dvUVFTZUQ3Vll2blMrVWtPQjh2SXh5TS81N1Z6ZDlPOGQ2VkRFQUhBcTBsNDRsaFVFQU53Y2ZsbXFic2J3cnUzS1NZV1E3MktsVDh2SXhuMVBGU1cwY2tGd3NnWWx4OHg3bHZhcS9ta09xa0J0eElKT2NubWw4eGxMcHVKSEI1NjBXTTNLenVkTlpha2hqWm5ZS0dPN1pnakJOT21jeXZ1eDBMQTRKSEdLeDdPWm1TVXNkeEhIUE5hTnJldTltSE8zSitYcGtWZk5vZGNjUTJyTWtXZFZpWkFRSGJsdWhCcTNwRXFRYml4ZFEzUHY5QldiY041Y2lLb0F5RzU3ampyVmx3V2xqQkp3RnorT0RUV3cxVXRxUjNJRjhKNDVGTWtiWktuSUg0ZlNzeHZDS0xNR0NzaWs4Y2V2ODYyMWdWaWpFWkw1SnJVT0VTUWdBa0FBWjdWTFYyWlZFcHZVc2VBYmIvaEdJRElTU3hJd0IwL3ptdFV6UzYzZXNxcTdTTTR4akJBcWpvcWk4S0krUXJNQVFPSzlMOE1hUGIyRFhNa1VhcTFqR0dqeUFja25xZld1YkY0NVllTzF6MHNJbkswSXZRcU44TFpybnd6S2hsS1hNcTVsS2Y4c1Y5UDhBZU5jSm8ybjZqOE1kWDNXNG1lQkd5WW1QM0IyL0UxOUE2VkdJNUJGa3NvZ0Z3YzhsM1BjK3VLd2ZIbmgyMVZDNFFoaU54UGNrOVNhK1FyNHFkYWZOTm51UEN4VVU0N28zUGhQOGZMT2ExU09lWVJTbmdxeHdRY1Y3TjRJK0oxbHI2dlp6dXNzVGpodDJTdjByNHoxVFJiZEpIWlVLc01rRUhIUThWcStFYjI3MHhsYTN2YnVKazJnWWs5ZXRjYzZLbG95S2xaVHB1bFdpcEkrdllkSTFLeThWUW1MVUliblNKajh5bklrai9Hc3o0djhBZ2JWZkVmbFE2UHFrQzJaUCtrUnNmbWNkeFhoK2hlT3RZdUpsamsxSzZkQnhndlRmaWw4VE5ZOEVlR0h1N0M1S1RsYzdteTM5YWlqbHRLNjBQbWNaUndhdEpVa3VVK1YvMmlmQ1NlRS9pNXFWbUZYSVlNM3BudlhGR3pET0RqSkI2OXExUEdIaW0rOFhlSXJxL3Y1alBjenRsMkk2MW1TU01od0RnWi9yWDNlSGp5MDBuMlBEOTJWNVczSHR0Z1VzR0J6enpWYTR2UThaQU9EVmE4dW5ZOG5nMUhHdStLVnlTU2d5UFN0SlRzcm5sNDdHcWpCeXRzVmRYMVNLMGdacG1DS2VvUFUxeEdxZU1yaWRIZ3RuZElqeDE3VkI0bTFHYS92bkVqa2dIQUE0RlZMYUpSYnMrUG16aXZLclZuTitSK0Y4UThXNGpGMUhUcCs1RmFlYjlTLzRhMEtUV3IxVXd6S0RsMnhuRmZSUHdyME8wMEx3L2lKVmhsQXlXUEZjUDhHOUR0dnNzWk1ZWXNNa25xVFZueDk0aXU3QzhlQ0NRUlJLU0FGR085ZEdIaGJVL1BzZFBUbGZVOVR0UEV0allzZnRONUh3TWNtczVmRjJseStJWUpZTHVOVEUzVThsdWMxNUJwZHIvYmFHVzVrbGRzLzNzQ3R4OU1oMDFJNVlsSWNEalBQYXQ1MU5MTTh1Rk9ON28ra3RPOEtSK0tMUXp4WFViVHk0TzA4REg5RFRJdkNFMWpNLzdvSkl2VmE4TjByeC9xMXBBenhYYnh2QWdLRmVDUGI2Vjd4OEtOZnV0YjhPV3M5ektaWkdRWko3MFllTTR5czNkZFBJV0pWTnE2Vm4rWlExRFU1cmNyQ1ZDa05nK3RRK0lFa2tnUXhFc1NNZGExOWF0a20xQ1Fzb3kzV3FVRnF2MlluTFpVakhOZHllaHcyNm5OK0hFYWZ4WW9rakxHRURPUmtlOWVuZkRYV0RwZmpxeWpKREZuNDY4ajByazlKaVMyMVRLSW9ZdGt0M09hMy9BQXVnL3dDRmphZngway9wWEJXaHpTa3BkajFjSkp4VUxkMGZjK2lzSnRHdFNBQUdqQkZMT3AzWUdNR2s4UGdmMkRaNDR4R3Y4cW5aQXpFRWNDdmtwcThtZnAwZmhUSUlNaGgxQUpyUlNJa0E4bXE5dEV1N3AwTmJGcENyd0JpT1JXVTZkem5yTlhQLzJRPT0iIHN0eWxlPSJ3aWR0aDogMi4zMzMzMzNpbjsgaGVpZ2h0OiAxLjYwMDcxaW4iIGFsdD0iU2FtcGxlIFBob3RvIiAvPjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxMCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Nb250aFllYXIiPjxzcGFuIGNsYXNzPSJwdC1Nb250aCI+SmFudWFyeTwvc3Bhbj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDExIj4gPC9zcGFuPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTEiPjIwMTQ8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSJwdC0wMDAwMDUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGFibGVTcGFjaW5nIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA2Ij4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDA3Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRhYmxlU3BhY2luZyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwNiI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDEyIj48dGQgY2xhc3M9InB0LTAwMDAwMiI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob1NwYWNpbmciPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMDQiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9TcGFjaW5nIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48cCBkaXI9Imx0ciIgY2xhc3M9InB0LVRhYmxlU3BhY2luZyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwNiI+IDwvc3Bhbj48L3A+PGRpdiBhbGlnbj0ibGVmdCI+PHRhYmxlIGRpcj0ibHRyIiBjbGFzcz0icHQtMDAwMDEzIj48dHIgY2xhc3M9InB0LTAwMDAxNCI+PHRkIGNsYXNzPSJwdC0wMDAwMTUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF5cyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNiI+U3VuLjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXlzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE2Ij5Nb24uPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURheXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTYiPlR1ZS48L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF5cyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNiI+V2VkLjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxNSI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXlzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDE2Ij5UaHUuPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE1Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURheXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMTYiPkZyaS48L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTUiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF5cyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAxNiI+U2F0Ljwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDE3Ij48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxOSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxOSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxOSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+Mjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+Mzwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+NDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDIxIj48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAxNyI+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjY8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjc8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjg8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjk8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjEwPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4xMTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDIxIj48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjIiPkxpdHRsZSBMZWFndWU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjIiPkphbmXigJlzIEJpcnRoZGF5PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMTciPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4xMjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MTM8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjE0PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4xNTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MTY8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjE3PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4xODwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDIxIj48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIyIj5QYXJlbnQgVGVhY2hlciBDb25mZXJlbmNlPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InB0LTAwMDAxNyI+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjE5PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4yMDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MjE8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjIyPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4yMzwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MjQ8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjI1PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMjEiPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMiI+UnVuIGZvciBMaWZlIDVLPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMTciPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4yNjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+Mjc8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjI4PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQtMDAwMDIwIj4yOTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyMCI+MzA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtRGF0ZXMiPjxzcGFuIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjAiPjMxPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LURhdGVzIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDE5Ij4gPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJwdC0wMDAwMjEiPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDE3Ij48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxOSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxOSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxOSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxOSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxOSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxOSI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1EYXRlcyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAxOSI+IDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icHQtMDAwMDIxIj48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMTgiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDAzIj4gPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0icHQtMDAwMDE4Ij48cCBkaXI9Imx0ciIgY2xhc3M9InB0LU5vcm1hbCI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LTAwMDAwMyI+IDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9InB0LTAwMDAxOCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3JtYWwiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC0wMDAwMDMiPiA8L3NwYW4+PC9wPjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGFibGVTcGFjaW5nIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA2Ij4gPC9zcGFuPjwvcD48ZGl2IGFsaWduPSJsZWZ0Ij48dGFibGUgZGlyPSJsdHIiIGNsYXNzPSJwdC0wMDAwMDAiPjx0ciBjbGFzcz0icHQtMDAwMDIzIj48dGQgY2xhc3M9InB0LTAwMDAyNCI+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3RlSGVhZGluZyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyNSI+bm90ZXM8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJwdC0wMDAwMjYiPjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm90ZXMiPjxzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJwdC1EZWZhdWx0UGFyYWdyYXBoRm9udC0wMDAwMjciPlRvIHJlcGxhY2UgdGhlIHBpY3R1cmUgd2l0aCB5b3VyIG93biwgcmlnaHQtY2xpY2sgaXQgYW5kIHRoZW4gY2xpY2sgQ2hhbmdlIFBpY3R1cmUuIDwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3RlcyI+PHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyNyI+VG8gc2VsZWN0IG5ldyBkYXRlcyBvciBjaGFuZ2UgdGhlIGNhbGVuZGFyIGNvbG9yLCBjbGljayB0aGUgQ2FsZW5kYXIgdGFiIG9uIHRoZSByaWJib24uIDwvc3Bhbj48L3A+PHAgZGlyPSJsdHIiIGNsYXNzPSJwdC1Ob3RlcyI+PHNwYW4gY2xhc3M9InB0LURlZmF1bHRQYXJhZ3JhcGhGb250LTAwMDAyNyI+VG8gdHJ5IG91dCBhIGRpZmZlcmVudCBzZXQgb2YgZm9udHMgb3IgY29sb3JzLCBvbiB0aGUgQ2FsZW5kYXIgdGFiIG9yIERlc2lnbiB0YWIsIGNsaWNrIEZvbnRzIG9yIENvbG9ycy48L3NwYW4+PC9wPjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtVGFibGVTcGFjaW5nIj48c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0icHQtMDAwMDA2Ij4gPC9zcGFuPjwvcD48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9UMTg1MC5odG1sIGIvVGVzdEZpbGVzL1QxODUwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwNGJiNQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9UMTg1MC5odG1sCkBAIC0wLDAgKzEsMTggQEAKK++7vzwhRE9DVFlQRSBodG1sID48aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+PHRpdGxlPjwvdGl0bGU+PG1ldGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJQb3dlclRvb2xzIGZvciBPcGVuIFhNTCIgLz48c3R5bGU+c3BhbiB7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQorcC5wdC1Ob3JtYWwgeworICAgIGxpbmUtaGVpZ2h0OiAxMDcuOSU7CisgICAgbWFyZ2luLWJvdHRvbTogOHB0OworICAgIGZvbnQtZmFtaWx5OiBDYWxpYnJpOworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogMDsKK30KK3NwYW4ucHQtRGVmYXVsdFBhcmFncmFwaEZvbnQgeworICAgIGZvbnQtc2l6ZTogMTFwdDsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KK2JvZHkgeyBtYXJnaW46IDFjbSBhdXRvOyBtYXgtd2lkdGg6IDIwY207IHBhZGRpbmc6IDA7IH08L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2PjxwIGRpcj0ibHRyIiBjbGFzcz0icHQtTm9ybWFsIj48c3BhbiBjbGFzcz0icHQtRGVmYXVsdFBhcmFncmFwaEZvbnQiPjxhIGhyZWY9Imh0dHA6Ly93d3cuZXJpY3doaXRlLmNvbS8iIHhtbG5zPSIiPjxpbWcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUtzQUFBQ0VDQVlBQUFEdkV0djZBQUFBQkdkQlRVRUFBTEdQQy94aEJRQUFBQWx3U0ZsekFBQU93d0FBRHNNQngyK29aQUFBLzdKSlJFRlVlRjVjL1hWOEcxZkNQUTduZ1dYb1FtbmJicmRiWm1abVNpbE4yaVpwbUpuQmNSSXpNOXN5eUdMSmttd1paTW1TVVdabTVwanRPTXhKMi9PZU85MCt2Ky9uL2VONjVORm9OSnA3N29GNzc4d3MySklpeDA2RkV0N1dmQnpOeWNGZXZSNDcxV29jTVdaaGRWUWMzQXhtN0pJcjRLNDNJdFJlZ0JCckhqeDFXaVNYRk1IUzBvakJHNWRSMU5NT1UyVVpES1VPcEdTYm9MSG5RSmx2aE1xV0NZM0RDbnRUQS9yUFg0UytyQkp4MlZhRWM5L2g1aXpFY0Y5SmhYWWtPbTFJTG5ZZ3A2TWRqYWZQb1AvYUQ3QTBkc0pZMDRLQ3ZsR29xdXFRMWRtRDhEd2JGQlUxTURhMG9tcHNCcDFuTG1QNEdsQTJNQUZaZmhuc1hhTm9uTCtDU1hCZDl3UnFoMDlpNUVlZ2g4VjFjaGIyRTBNb0dCbEUyN216R0x4NkRTZXVBM210dmNqcEdVTjBUUnYyMkVxd3Q3b0orOXU3c2FlOUErdnI2N0N1c1JHZjJHMzRvc3lGandxSzhINStJWlpVMUdOVlhRZFdWclJnUlhFVDFycmFzTG1tQjE5WVNxWC9WeFRWWTF0RkczWldObU5MY1NXMkY1VmlxOTJPWTlWVjBKNmFoNG5uNGxoVkE3WTdLckNyckJuZld5dnhmV0VETmpjTjRsdnVhMWxOTjVaV3RtRlJjVDJXbERYaFcvSGExWUl2U3VyeGRYbXI5UCtheGo0czUzSmRiU2MyVlBQL2tscnNiZWlFWi9jb0R0VjN3Yk5qR1A2ZEp4RFJPNG53amhGRU5QZERNM0lLdWFkdXdEQjFDWUYxZlFodkhZVnNhQTRKL1pPSWFPcUdhbWdjTlR4WEF6eC90UmV1b2ZNR1VENTlDcDJYcnFObC9peHFSaWZRT0RLT29UUG5jSWJibmIzeEk4NWMvd0VuVHM1amVQWWs1aTVkd2V6Rnk1aTVmQTFkTTJmUVBuc09rOXpINUE5QTc1a3I2RHQ3R1FQbnIyTGs4Zzg0emUvb1BuT1IrNXhHemRnczYvS3FWRytEVjRGaUhwT2hjUXhSZFVOWTU2ekZjcDZqTlpXZFdCRG9jQ0s4dEF6SHMzT2tFbEpjZ3VPV2JCeFVhU0dycWtiZTREQ2lDNTFJTEMxRldtVUZFcHdGaUdmbHBaY1dRVjdraEttMkdtbDJLOVJGRHNpNTFQQjl0Y01HWGFFVlNwdUZyKzJvR2hwQno5bExzTGIxSUNyTGhwaDhCK0xzRHNRNENoREpmVVVXV0JITjE0bWxKZERVTnlDM3F3OHlleW5TaTJ1Z0pYZ1NpOHFSVUZ6T2JRcGhHeHpCSUgvVUdNc3dUOWdJVDBUSG1ldW9HaitONXJQWFVUWTJqNHlHTGlSWnkyRHJIRUhCaVduWVptWlJoNTlnbmh4QkFCdVBvYXNkam9FaENmRGRGMytTOW1XYnZ3bzNWdmoyOGpxc0xuTEJzM2NZZ2F5YzlTVVYrQ2JYamlWNURueHF5aVV3V3JDOHFBcCtVK2R3dUdjY0s0c2JzTUpSaTZYNWxWaFJVSU0xaFUzWUlBQnNyOGEyb2xvY3JtbEd4T0FvQXR2YXNkOVpoS091Q25oWE4rQmdZUVhXR1BPeG83QWViczBqQ0p3Z2dHYXVZVlZWSnhaeFA5OFdOZUE3dnZjdGdmOWRhU09XdVpyeEhZc0E2SnI2SG54ZjBjekcxQUgzd1duNGpNN0FyWDBBeDdxRzRNZkdmYVNoRzBFOUUvQnI1MzViaGhEV09vU29sbUhFdFo5QWJOc29RdXNIRU5FMnh2ZUdFZFk1anZDdUV3Z2hXQk83aDVCejhneGNGNitpNU9SWjlQSzh0Ri81RVVOYzluSmQ5K216R0Q1M0NhZDR6aTl5blNpWFdXWXVYc1RVdVF1WXYzNERjeVNCdVdzL1lXRCtNam9tejZILzlEV01FWUM5NTY2aTcrSU5kSjY5aUtIclA2SG53aFUwenN5amltQ3RuNXdubWYyRVNkYm40SG1nZXVnVWl2cE9RdDQyZ2IzMS9kalFNb0sxRFFOWTRFZmdlT2ZhNEpXVEQwK3lYb0M5RUlFc1FXVGFpQUtDcnJrSnVxWkdNbWtKSXJJdGtCRlVhWVVPbUdwcWtVYWd4NWd6WVNpdmdLYWtGSW44ZkdwQklTeDE5ZENRS1EydVltUlVsRU5mVVEyTnF3YnkwbW9rczZKMVRaMEVhZ25DYlFVSXpNbEdtTTJLaExKU1JEa2RCQzlCWDFHSHRKSWFwSERieUJ3bjRoeWxpSFdXSXBVTXF5R3JPa1luMFg3cEJzemNqOXJWQUZ2UEtKeURVOUR6aEdjUm9KYWVFMGduVTJyWU9PTHJteEZhVjR1NHZrNkV0TlFqb0xJVU9UT1RxRHg3QVhtOW8yZzZjd00xcDMrRXZIMFVSd3RyNE5IWWpSM09TaVQwVGlHa3NoMjdEUTU0T2VyaFlTZndyTldJNmhpSGJQSUNOaFpVWTExUkRkYTd5S1RPYW54dnI4UUdBbXRyVVRQMmwzZmdhRzB2M0N2YWNiQzREcDVWVGZBc3I4V3g0Z3FrRDAraWhoVmN4eExiTzQyREpXMzh2bWJzcXhuQW5vWWhySFEyWUEyWlpBdEI2OTQ5aVgwRTFQZUZkVmhPaGxsVDNvTHZ5d2pjUWpZRXN1aFdLcytCNWg0Y2FlL0ZzYlplaEE5TklHWG1OT0pPekNLeWI0cEFKRHZ4ZDhrSFo1RXhmZzZxd1Rta2RrMGhmZkEwWWp1bjRFOGcrRGIwSTV3Z2ppYjdKdkRjeVhrdTFWMkRLSmc4aVI0ZVl6OUxIeG0wL2ZSNUNheWo1OG1jVjY3akV0Y0xvRjVoRVF4NzZzWlBJTTV3bGtVc1JabWhjbzF6b3luQnJBUnJFOW0yWkdBRXJXZk9vLzNNQlF4Y0pTdnp2ZkdmZ0ZsdVA4SHRlMDllUjhQb09VenovNndUNTNHb2JnQ3JLcnF3cnE0ZkM3eXRkZ2pBUnJtcUVGdFpCMVZITC9MR3A1RlVXUVZaaFF0YUFsVlB3Q1lYRlVQcEtvTzF0UTFLc3ErSy8xdWJXNkFsS3pzb204cGlGM0tiMjZHbTFLdEtYQVJ2TVl3VlpjaHRiRUthc3dRcERoZjhkQmFvYWxxUnhaTVJuRnVBY0lJOU9OOUdzT1lqbnF3YXg4OG82eHBRd1JNK3dZTnRQWGVkTE5tSkpJSTgxRnFBTURhRWNKdFRBbTFLV1RYaW5XVklLSEFSekM1RTJVcmhrMmxGQ3ZjZlcxN1AzMU9Mc0lwYUJGRWR2S3NxNFZsVENmZnlVaHpuYjRocWFrWmtaVDFrdGUyb092Y1RMSlRIQUFMaW1MTUd2blZkT0VvbWk2VHMyQ2F2SUpsU1ZFTE55cCs4QnQzd0daU3k5VWNUUkZ1c0xxek9LY0tSMW42c0tTakhEZ0pwWFg0RmRwYzA0VWgxTjdiYmF5U3dIcTlxZ3pjYmpqY1Z3cFBIRmRzOWdqeldjTnJvV1J3dDc4UnVaeE4ybGJaalQxVWZ0dk03MXhRM1ltZGROdzQwOXNQTWMyQmg4ZWdldzZheUJ1eXNJVHMzOWVKdzJ5RDJVejBPcy9oMURpRnljQUlKSTFOUVVMSzFNMmNoSDU1R0txVmRNM29TcGhPbmtEZDVGdmJwQ3pEM1R5T2pieHIyazlkZ1lvT1Q5VXdodElrc1Mvc1JSeFpPSWNPbXRnNGd1YjRUbGVldW9JbHlMZXJDM2pzRUI5V3VlV29HVXdUWUJSNlRBT29GZ2t5QTl1UzE2NWltOU0vOThCT215WnJ6WERkTEVBcndDYUFPVXIyNldaZlY0N09vUERFcE1lc010NWxpNlNhSUc2ZFBvK2ZNTlF4d3g0Tm5mdUwyUVBQOFJlU2ZtRVBheUJrY2F6bUJMWlY5V0JCYjI0aDBnaTJJVEJmcUxFZlcwQ1R5S1kvQ0JnZ2dCZWRhRVpLYmk0aWNQSVFhellnd1prSkdKczRrWUxRRWFESmZ5OG5FOFdSbVBTVTBqUURTMFZlcW5FN0liVFpZdUgvUm9qclAza0JVZGlFUzZkTUUrSUp5N0lnckxxVUZJR0RwbFNPNGJYeHhNU3hkdmVnVHJZMC81QVJMQnlVa3IvOEVRVmlQY0djeDFDM3RLSnMvZzhaTDEyQWZIaWZMVHFQNkRDMEdLeXZRUm12UzBnM1Q2QlRDYStvUTBkQUlkMHJ2ZnFzTnZwWFY4S3Fzd1JFMm5LTzBGVzcyRXZpVGxaUElKdUYxblRoQ1p2U3ZhT1g2YW9LMkRnRUVuUStYUWRVZENLU3NIaVRUKzdYMXdZMnlmcmlxQmU0RTRLNkNDdmkzRE5LTGNwdU9FOWhEa0crMFYyQlRRU1YybGpiaEFQZTNyN3dKdTJsbjlySHg3QzZwa2w1N05QZkJpNHk1bjZEZVhkMURrSFpqWFNtOUt6M3E5MlcxMkVIRjhPK2JRTnI4TlVUU2R4K2lMdzNzbTBReXJVclk4Q3pjNlVtUFZMY2ltTktmT2pvTEZTczF0WWRnYSsrRGl1RFZkbzBnWjNRT3BTZnBDVTlkUnYzOEpiU2V2b3dHZXNqcTZiTm91dkFEMnRqb1NzLzlBTzNBTkJLYitwREMzNkZqbzhqb0hZT1JEU3AzWkJMR3JnR1kybnVRU3dLcklZRU5YNzRxTWVjdjhpL0FlbzdMaWZPWE1IRHFuR1FSK3VsREIrbHhlL2htRysyWnNGbGx4RlRycVV1b0pWdDNjUnNCMURtV2ZnTGNOWFFDSmJRdVBSZC9rQWhxbUFEdnAvVVF6RHI4MHpVMG52OFJ1b0ZUQ09zOWl3V2VOZ2RDaWlvWXFIS3dUMm1DVDVZRG5pWWIzRE1zMktQUVlGKzZpb0Nscjh5bnArUzJTV1E0WFdtRkJGUVZLOTVKb0J2THE1RkxlVlp5UCtrRWdwenJZNHhHcE5OS21DdHIwWC9oT2owUG9LdHNRVmdXUTVyRmpuQ3JBNkY1K1FqS3NramUxZERRQkZOekt3ejFqY2hzN29DcHNRTlduclJLbnVEODRRbll4aWFSM3RnQ1kwOC9yQ2NtME1jZkl6eFZGMCtZWTJLT2JGcExPMk9YR0RPOHBnSGg5TDdCMVFRWWp6V3dyQVpCZ3Awcm14RGZOb0FRTWtkZ1V3OE9FSUFiYzUxd28wd25zdEp0YkJqbTZTc29ZMmdMWktEeG9SOE5xdStHZ2F3Z1k0TTdWTmVDM2Z3ZTkvbzJISzl2aDJkdEd3Sm9HNUpHNXhIS2NPZmQzSXZOOWpKNjFScDYwVnBzeWEvQ25wSUdIS25wZ0E4WitEaHR5dTdTZXV4bCtOcFJ5dUxxd3A2YWZrbitkOWIzTWFSMVlCTy9ZeWYzTDBBdUdzUWhNdmFoaWlaNE4vWFQ5dzdDbDh3YXduMUZ0QW8ySElLTUpZWHI1QVN3Z2VzTEJtZFFNM3NCN1FUa0lIL0hPQ3QvaGlGSHlMSUEyVHpQMXhqWEQzSjlPeG0raklDMmpaMkNZL3dNaWlaT281aE03Q0tnMWMxZGlPZDV5Mmp0UVRHOWU5L2w2NUpVaTJBMFQ4a1g3Q3FLMk9mRUJRWW4yb1F4Mm9NUk11K1FrSDAyaHZLNTgzQk5uWUdGTnFWKzlqVGFCS0N2M01BRTN4L20vZ2JwZzN2UFhaYjJMWEtEeUNMMURGcXVpUmwwWER5SmsveGZsSXFwYTBqck80Y0ZXMVE2N05ObjRuZ20wNnJSanFONksvYW5teG15Q3JCYmFjQmhReVk4VE5tSXlIZWlXYVEzN2lqTnhxQkR5UjlnYUJKRjZTaEdla0V4c2h0YjBUQjlVbUxUZUtNSm1nSW1mSWFKM0xvMkZCSjRkaWJVdU53aXhPUVZJWkkySUNBakV6RUV0SzIzQngxTXlFMG5UeUcvclpQK3RnckcybFlveWh1UVh0bElCcTZBcnIwTHN1bzZKTlhXSXI2aUF2S0daaVNTS1UzZGc3Q056eUNaalNXTXdJeXRKNkI1ak9xUlVjUVIvSEZWalpDVG1TSnR0RGtNUHRicHE3RHlETzhucTI0bDhIWTB0TUNiREIwOWRRb2haRmx2c21OYzh5QUIzNFZZTGpNbXppT2t0Z3Nlcm5yYWlXYnN0QlZqZjBrbDRxaytpV3drM3ExZGlEa3hRNC9hQ3QvV1huald0VXVCSmJDUlZxZHhCUEc5c3docUdzSXhWeXU4NjNyaDB6Q0lnTFlwZ204Q3h4dkdjS2g2Q0c3MVRQQ05ROWpINzluZjJJbkRiS2dCSFVQd2FXU3FKK3NIdFBRaWdxd1hROVpMNkoyZ0I2V2NFMXlaSjA0amIyUWVKUlBuMEVybEdpVDRSSmlaL2c4NEJaaUVweVF1OGNOUFArSkhoc3pMREVGVFo4OUozblBnNGpVeTN3L281L1lEQkZBaldiaDI0Z3lCOGlNcVRsOUNadjhvaXNpR0paVHVaZ2F2Z1V2MHE5eFdCQ3dScE00UytPSTdSaGl1K2s2Znd6amZHMkVSeWxqQjVHOGNHRVVHNjBjb1lEMEQyeWpYVHpCOHpkQUd6SEs3eWFzLzRRU0xBR3ZkL0hrVXN0NEVvNXY3QmxGK2NwckJqZzJPTE4xUEdoL2g5MGpNR2xEb3dpRmROcnl6R1diS21uQlluWTFkY2dPMnA2cXhLMDJOb3pvenRJMXQ2R2RyeWFZTVI1a3QwSlc1NEJvWVJCWlpySkJzbDlQVUJoTkJhcXB2UWl5RFZnYlpOb25MN0RxQ0t0ZUI2b2w1SHZCRnlBb1pYdmg5SWRsNXRCZFdHTnZiMGNNVEtTU2crOW9OdEYyNHhDVWdLNm1HekVWd2tnMUR5ZGl4MWZXSUpGalRlM3BobnBoRVNnY0JXTVVRMXRvSjdlQUlvaGlrNGxxNkVFaHZHRWZaU3FLZHlKa2grTWtXb2d0R3RGem56QlVvK3FlZ1BYa0orOGltRzh1cXNLMm1FWHZxNkNkcEh3NFYwZHNXMXlLQUlTYTBxZ09xL2xub0IyWVJMR3lCdllvaHRCUitERjgreFZXSTRIZUZVbFVPc0NINVVna0MrSDhNQTF0OEgwTU5XUys1WXdMT00wQW52OWQ4NGh4OG1leWphbnVRMGprSmVlODhvcHZIRWRNNmliaXVrMUNUT1hTejF5anBwNUF5TW9lVTRTa2tkZ3hBTVhBQ2h2R1QwREtVcWZ2R2tUMTVDaFVYZmtRZEFkbEllZTNoZVJyaWI1c2lhUGhWa2lTZklTQ0VSSE1UWEx6MkE0Z0xRdlJIWEx0NkVUZCt1Q0s5NWtja1JweSs5cVBValNTOG83QmRkZFBuVUVtV0hlUm5XdmwvSmI5am1FdWhYcUpPZXNpRUFqeURaRVBCcEpOa1VRSGU5dWw1MUo2WWtrSlkwOXhadUhqZXMya2IwanBwU3hoeUc4NWZROTNjT1l5dzFYVE1uME0vL2JDd0FiMVUzSTV6MTlCNjZVZG1oK3R3MEtyb1NScXhuYjF3WHI2Q1ptNVRSQ0lxSGp1SkpyYTZCVHRVR2twbkxRS0ZselBuSWJ5b0d0WG5iMUFTNXVGT1pzMGtoVHRIeDhtRVZvYXNRcWdxbWZ3clhhaWZvNGY1NlFZYVQ1OUM1Y3dNNms5UlJzYkdrVkJVQ2xOck41eEQ0NVNQS1JTeHBZU1RSU01MeUthRkpkQjM5aUN0cVFsSE04MElMUzJHODlScGxGMjRpR3FhZE1QQU1ESUdtVjRwUFdHVTZLQ1NXdmdLOEpEUmpwUFpmT3RiY1lSc0dzYkdFZFRlQWM5cVNyS3Jna0dsR2g1VkRmQWxJd1YzRENLRXhiK2FYcHpNVU1ZVElTeURBRTNtNll2d2JTTjcxZFZqQndQazBaWTJlbEVDdExRV2ZpVjFDQ2FMaDFRM3c4eVFZcDI5QW1QZnJNVEdqcUZUa0JjMlFGZmVpblFlajVseW45SEpGTTB3bWQ0M2hPeFQ1MkZoSmFUMW5XQ1pZQ05xZzRFc2JSdWNSQjc5WXprYmpPaXg2THhFSDBld3RYSlpUeVpzWWpxcFBIMGRGWlMrOHRPMEgyek1WYWU0cEhRMnNPSkhlY3lpNzdIdnlqV3A2MGpJc1BDTVFvb0ZNQVdyL1FKTUFjQmZ5bzhFMTQ4RXJWamVJRHl2RUtCWCtFcEE5U0xMbVI5L2xKaDNnbUNaNDNhbitMcUxLM0s3SjJCc0c0V3hkeHFLVHZyWDRYbFl4bjhPWnhYMG4vVm5yNkdKUVVnd3J6Z3U0VDJIQ01DSzBSazB6dkhZZWR3Vms2ZFJNRDRIQXpPRWVaSWdacXVvT1htRjd3dmZmSTNBbTBNeEc1MnBkeGlPbWZPbzRUbm80SDdTZW1mZ1U5K0xYU0lQMEgvSEU3aWh4SUovYlRQMFkxUElQME1iRUZWQnZ6azVnemd5NUVFZFBXdU9BNDZwZWNsdnhCV1dRMEVRaUw3TkdvS3E3dXdaMkliNlVYdUdCM0h1RkVQT09kUmZ2RURQdzFZL05BcDFSdy9pNlJsVENCcmYvREo0NUJaTFRPU1dVd0J2ZXRuRHRBOGVwUzY0RlJWalgwRUJEaFFXNDJoVnJWUUVhUFk0U3JHN29CUTc4d3F4bituK0lKUCtJVGFldlFUdG5ySTY3R080MlV5cDMxdlhnTDAxdFRoQVMzQ0l5OE8xRFhBak94NnVhYVVmYk1iZTBnWWNJdU41MDNORmNGMVNXejhTMmdmaFRlYmZUVVhZV2NHQVJjQWVJZGhDS2hxUlJ0OHBxMnFWVGw3dS9GbUVFdWh4MVcyd0RORC9uYm1CYnFMaEJGV2xoWlUyd2hZdWZGVFA1UnVVeDJsSzF4enNMQmF5b1pXZ0xHVEZHTHRQb1Bia09ReFE0c1lKQmdHeVRucmV3Yk5YMEU5NUZjd2ltRXdDNGxXQ2wvWktKR1VSUkpvbXo2Qmw2alI2S2JzejE2OUxqRGwxOFpMVWozbnVoZ0FkRS9oMU1pV1JlSjMvLzFKK0pBQWxxUmZMSDhpb1YyL3c5Yy9nRldBV3FmMGNnVHAzbmQ5OWdmN3k3QVdjSk5BRWFNWHZhWm4vQWJhQms5QzNqeU8xYVJDcGJTTkk3VHpCYzhmWDdjTXcwbnBrRGswajk4UkppUVhyQ05oVzdyaUJqYTkwK2d6eGNoR09FN1BJR1J4SEpwVWdoN0plY09FR1E5NWxaQlA0UllPektCeWFwWjBib01mdWhwb05PWlhuS2FWckhHWjZncGkrazFKL3MraFhYc3o2VzF4WWpkV3NQM2NxZWNya0ZESlB6V05CYUhFSlpFek53V1RXQUpzVFFmbUZDR1ZJOENOZ2ZCaytJaWpabXJadWVoZ2VERUdkVnRlSWpKNGV5QWlZSk5HQlB6bkxIOWFEQUFhWW83WVNCcE5HZUZGRzNjdmJwSUN4bVY1eER3UEZnZm9lcWZ0bEZjRzNtc0JiNnF6QU1rcjlsOVlTTEdWQy9vekI3bnV5MWpJUlRCakVEckFjclcxbmNtWmFwbmZkUWNiYlF2KzVvckFVeXdxYzJPZ3F3NGFTRXF4ekZoSjhsVGpTekZCQ01HOHRxOGZCbW5iSjcvblZ0WklwNldVSnZKREtWdmlRblkrWDE1R1JHeEhJRmh2RS8rME1GRU5rb0txcFM2ZytmUlVsQkpUNFBiR1ZEU2lldnloMWlEY0tDZVRTM05XSElnSlVnRXRLcmxjb2syU09BU0hOOUhxZDUzOUFMd0hRUU8vWFJUOTRndnNWckNYQTJrYVdxUnVhUUFjbGN1RENGWnlnUGd1d0RsR0tCV3UyMDlNMWNwdXUyZlBvbkQ2TnFhdlgveThVaWVVNUlrK3dLQTlGOHFCQzN2bFJYTG54QTY3K1FHbi80U2NKbUh3cHZiN0dzUFBEZjlZSnNBcVFueVBEemw2OVJLQ2V4Y2lwc3hpbnIreWZPWWVtRS9OTSsrZFFNWDBKem9tTHlCNDlEUXVWTldOc2xtRHRSVXhEdTdTTXJHMUJPTStiR09reVRaeVVpckpYOUVMMElJazJLcFgyUzlFMUlHV0dUQ3BOM3BrcmNETHNWYzlmKzlubXNlRVcwb0tKendnRkN5UkJIS2M5RXI0K2d6L09nN2JyUFVzaFByUzVzTWhSaVc5SVdMdEpNUDVkM2RCTVRHR0J1cU1MMnE0ZWhwVTZwTlEySWFtQ2NwdVZqMEF5WENTUkhVOFBLSkoyR0VHYkpEeHByK2dhNllNN1E1ZVB2Umc2VmtCQ1d4OE9rMGwzWkRseG1HRGJYMXlQN2E1bXJDaW93cUtjWXF4a2FQbXVxQlpmTzJ2d1lYWXhQc2wzNFFOcktSWTZxdkZoYmltK0xXdkd4MXovaGJVY1gxa3JwR1M4T3E4RVc1d0VPcG54Kzd4aXJDK3J4WWJ5ZXF6bnNhd3BLYVBmZE1HZFZzQ2RJV29mMWVFd2orMVFkUXVadFFVZVRNN2l0UnRCN3VscVFnQ1R0VjlKdlZRQ3loc1JWTkdBQktabjYvQWNLdWtuYThmT29ZL1VJN3hiL1pVZm9lbWlCMmNvcUR4ekNVWHpwNUU1ZWdMbXNURm82SmZMVHArV3V0UkdpWUpSZ25PS2FCS3NKWll6Uk5JSlNyelVBVDU3U2txL1V3VFBCTkV5ZU9ZeTJzakFFOXkveEpZRW0raWVFZWxacEdNcCtYS2RrUGhwc3ZhY1lGVUNWRWk5MkQvdEl5NFNmRmU0TGNsWUFxRUFyUUN2S09ML1g0b0E4ZzJ5clFDdWVPL1NmK1QvUE10WmhwWlQxeGlPK1A3c1JmclB1UXNZb1BYbzU1ZFVUMTJBdFg4YXRsRXE2NmtMYUdIcXIrWHhsVis2aG5JR0l3UFpQNXpaSlp3Mkw3UzVFekZkUTRqcDZFUHF3QmhTNmRkTlZHUWgvWGtrTmdVYmRVSjdQNVMwWkFWc3lGV25yaUc5Z1lBbVZzSVp1T002aDZRdVFSRThmUmhrUTArY3g1YTZQbnhBYkh4YVdvY1YxUjM0eGw1T1FxcVdWRk05ZXhJTGt1Z0JFMW5aRWZaQ2hPVFprVkRNcEV0SmpxMm9RVFM5WUNSbE55aS9BSWMxZXFtZjAwSmZtYzREOXJCWUVlUjBJWnhnOXVFT04raXpzVmFmZzIvU2pmaFdsNE12RFZsWW5HdkRaNWw1K0pwcy9YRm1QaGFUVFQvSmNlSWppeE9mNVpiZ013TDU2MXd5SkVQZHh1STZmSjlWaExWNXBmQnBHNWFHQ3NYWXRuL3ZGRFlWMVZIK0c3Q2V6THVCNFdZakE5ZjJvaklvejF5QThlSVZCRFIxNEVpeDZFZHRnVmRGQjIxRnV6VGtlS0NtQmNmSXFqNWsxU0MrSitOK001bWk4eWZQSVgva0pBWllzNjNUVjJDdG9YTDBUYUdlTnNESkNoRmRZNDBYTDhNMU93c1RBWm94UUJ2UlJBWm9ySU5wWUFBVkJMQmdDZ0hNY2ZvNHdWek1FT0MvbUtIZjc1MDlpNXFSY1ZTTWpFbmRNMVA4SHVFeHA3bWh4SklzZ25FRlFFZDQvR01NRXpQWGY4QVpmbDR3b0dEVE16ZHVzRnpEK1o5KytCbHMvdzlZaVJzSnFPSjdmd0dyZUMzS0x4NVdBRlo0VmdIc0MzeHhnYXdxUVA4TDhNVTI0cnRFWXhESEpNYndxeG11aW9abjBNV2R6UEp6b25OZkRJbWFtdHVoSkRobHJWMkliR2JwSEVCRXp6QmlLZm5SOUpjeVNucFM1ekQwb3llaEk5aFZ2V05JNHZ0UlpOdnNxYk9vNThIbVVNR2lhZEZFWUZTU3RZTm96VVJYbjMvSEtBN1dka3NqZDh1b3dOODI5dUlka3RUN0pLNHY4OHF4eWxhTzNjd1V3ZjNEV0pBalJpZEdKNlZpWUtXbnVtb1FZc21YUnBYaVhDVklyYTZDcXI0TzhxcEtKSllVUTFaYWhsaDZUUlZsTjVrSjNOOVpoaU5XSjdZWWNyQWx5NGF2VTdYNFJwT0JiNDFtckxMbjQ5dnNiSHlabVltUGRBWXNwU2Rka2wrRXo4bmNpeXdPTERMWnNKSTJZQStaVG5UNzdPQjdlNnpGVXQrbFYzTS9qalQxNGdBUGZnMFBmcTJ6VmdMcnB0SWFIS2hyeGdFMnB2RGVBY1QxRHlLNGlYSmYzNEdJeGg0bTdDSEVEMHpEdTJNWUIrbWRqOWQzSW9Bc0dzbDltZGpDcTFsTDlheU1MdFp3NTlrZjBNUUFVZE0zaVRhR3F2cnBVeWlibVVQSjFCUjk2alZVVDA3RE5UbUpXc3BtL3ZnNDBsdGFZS0YvZDlEd2Q1SWhSMW1oSXRWS0FCU014eVdkQWVhdjNHQml2b2hXc3VzSTdjQTRFN2NJUmxOTTBvSTFoeW5CSnk1Y3dpelpUY2o5TEpsdWhvQ2RvemNWWUJUbEV2M25CYVlrVWNUcnk5eXZBSmRnVGdGTzhiOEFuZ0NuQUp4Z3l0T2tVdEVRSk1EK1Ard3JQaWZXaVhLUit6cDcvUVpPODN2UGNDTm1Ic203anZGTk1ZclV3NTBLeGhmZFU3OTBTMVVPbllDai93U2NERS81MCtlbGJyUG9GZ2JaeG41cEJDeVd2ak94WjV4U1RSV2F2UWdqclV3MHdTaDZUTXowc3hYOERnTWJnWHFJOW9BV0tZNXFmS2l5R1NtbnJpSndhSTVBclpQbVFxeHVHY0xISkpaWENkRDM3TldTNGk3T3B1M0xLOElXNG5LQlNQcGkxTWpVMWdsbFpTM1V3ZzRVbHlJODJ3aVpNd2ZhU2liNDZqSm9YRVZJdEZvUVlkSWpOc2NpOVF5SURuMFBZeWIyNnpLd1VhSEJhcFlsTWptV0tWUllhOUJnVFlZS1M5SlQ4S1U4QlY4bzVQak9sSW12dEFaOG1LTEExL29zTE1zZ0cyZFpzVFhQeHRCVmlvMWFQVFpydExRU0pRaGw0emxNbWRsR3Y3U2VIbk0xL2VWYStzMVZ4UzdzYjJyR3NkWlc3Qzh2eFJFMnFNaU9kcVR5aENiMWpVaERqWmxFVHR6RUtiTHlLRUxZOGhNR0o2QTh3UlJLTkRXeEFxck9YNFdHVWxUTElDUDg1QkRsc0o4K3NwOFZLQ1IrZ0N3a0ttem8vQ1cwVFowazZFNmorc1FNTXVyYmtNMWpLcWJjRlFsZ2k1RTBNbkRIcGNzWUZaTTR5SHkvZ0VKSXZaaVlJY0FzaGg0RklLWXVYTU1rdjN0ZzdoVEd1VzhCWUFFNEFTWUJ3Q3VVZldKUUtoY0k0RE5YcitEVTVVczRmZkVpemw2K0xLMFQ3Q3FBZXBIN0ZBeDVqditMUGsvUk1UOSs2UXBPOGpzRk00djlDcUNLL1lwRzlBdVRpcytmdVhJTlU2SmY5TlFaV29HckVzQWxhOExQOWxFaUdwbER4cTVkd05nVk5xcExGOUIvNWp5RDRSWE04dnVFR2dpN1ZIemlCb1BrR1dUVHcrU3h0V3BQM1VBWUdkYVhmdFN6dlJmcE02ZVJORUFRZDQ5QU1UaUY2S1llcERHZytUZDBZWHRCT1ZKUFg1ZUdrdDE3cHZCNUhtMGhXWFJoV1J1ZXl5bkRlN1FHRy92bnNhVm5CbTluRitGajJzQ2RkWjFZRU9zb1FreEJJVFExREV5T0VpUXlzU2RZYlVncnpFT2FJeE9XdWhKWXFvdGdLTFVqcTRvZXRkaU94R3d6Z25VYXVDWExFR2Exd2lzN0Z6dTFPaXhQVE1JYXBSYnI5UWFzVnFiak8xazh2dVUyRzh3bTdDUWJiK0YzZlp0aHdjZHBHaXcyV0xEV1ZvelZ0QW9yemRuWVFBYmVsRzJCZTFrSmtxY21zTCtoQ2FzS3k3QW8yOFpRNVNKSUs3Q3BvcFlNVzBLZjJreXIwSXpJbmc2b3hrZGc1UGJxSWRxVHZnR216SEdvUjZhUlBuWVM0V3pkWVMyOVNPZ1pndWJFRkVyb3YrcFpJUVVUMC9SbVF5Zy9NWTV1V29taEsxY2xXZTY5VERZOGU0cEI2U3lheDhZeHdrVGJNVHBEUHlvWWtKWmg1aUtjL1lKcHI2S1FBU0twZ2NmQW9DZHZyRWZ0L0J3NlR4T0VGeTVnNHZ3Rkp2OXpHTDEwVmZLZ2dublA4bnVaTXpETDRIT0NsWCthLzB2cm1kd0Zld3FnWHY5QmNDSERFdVgveW84M2NKSHJ6MTI1OG45Z0ZmLy9BanhtT3B4bk9jV0FOY0gzQndpOG9YUG5NVU4yRmZzVkRlYVhiWDloWmZINkY4Q2U0ckVKc0o2OGZQMW4yOEVpN01vb0ZhT1BiRHAwY1o3cU1FTnczcEFhbFFEcEw5YWxreHZyNjJkb0Q5c1JVVFBHSkg4S2dYM1QyRWk1M2toaTJVMmI2RTRMRnNTUUcwblBhcGkveEhJRk9XdzlQczBEOEdvZmhwYkhmcVI3RW11cU83R3hZd3pQR1J4NE9hOENiNWUzNCtQNmZuaHkyLzN6UCtKbFpwcTNyUzdzcFUxYjRKdGhScFROZ1VTQ0lLMmtna3hhQjYyckV2b3lKN0pyQzVGdU5VRmZsQWRyWFRteXEwcTRySlNtQUVabm1SRmd5RUNneFFLdnpHeDQyUXF3VGFmSFdvVVdTMlZwV0pHdXhYZXBhbnl2TVdHNTNvS1Y5S2xySFJWWXlpLysxbGFKcjNnUVMvai81N25DdjlxeHJNZ0ZOd0pvUjNNTGR0YldZWk9qR0x2TEtySGFZcU5ucWNZZVZ4V09ON1lpdUtNYklkd210YjhQeHJFUjVFK05vL1RrSFBLSFI1SGRNNGdTTWw0ZTJWWFIySWNzQmlnblQxSU5XYWllSjdtQmxXWVpHa0kyUDFzMk1ZR3k0VUgwWER4UFZyeUN3Y3NNR3BlWXhFL05NZUdmbDRERjNBRXFveVNIODl4SDc1a2YwVVRwYXVhNmZDWjJBOWs4dHE0TzZxNU9GRS9TNTg3TllPRGNHYlJ6Mzkxeko5RjM2clFrbzdOWENUenVRd0JJc0d2WCtCUWE2ZjFQLy9RekU4K1RQYS95TlE4UE42NExTTkZmRXJCQy9pVTdRQkFMZ0lsM0JGT0t6d2ptUEVVbG1CU2VsK3d1R2tmM1NRR3c4L1NiWk0vL1A0QmVJamlFMXhWRmdIZm03QVhwOHdMWW9vaEc5UXNZUlJISGU0NWhUS3dYM2xXYWE4cFNUaHBXOVoyR1Qxa1BqbGYyNDBCNUw3YVV0bU5UZVJ1MjFYZGpxNWdOeGh3alpxK0ZkUTBqWm5BYWliUUh5V3pva1NOemNLZHQyRVdBYnEvdHdhYkdBYXhnbUg3TFdvVlhySlY0UHE4U0x6a2I4UlQvZjZHNENVL2xWdUtGN0RLOFM0dXdzS1lEQ3dJc09RalB0eVBDS2laQmwwQkQ5dEpWVmtQaHlKY21VMmZTQm1SVnVoQnQxQ0UreXlSTitVc3ZMQ0pRalhCWHFMRTNUWUd0eWVuWVNwQnVWT2l3MDV5SGZmbkYyR01ydzBwOUxwYnA4N0RNUU85cWR1QmJDNU0vRDJoRFpTZVdselJMZldwZjBaOTh6bEFsZ0x1bXFnbmYwUU92SXNNZklKdjZWekxObDlSSVhVNWk0c254Z2hJa3RYUWljM2dNbFdTRlhyTFNLQ3Q1bkpYVFE0YnNuanNueWE0NHdlMnoxOUF5ZHdPdFBPdk5ySjE4aGlaRll4UGs5T0NsNHlmUU1EdU4vaXVzTUc0N3pHWHI3Q1Q2ejU1Rzc5d2NlcVptQ1NyS09sRXh3OUkxZVJHVi9UTk05OWVrOFhRbkUyL1cwRGd5K2tlZzZleEcwY3dzT3NpQXZXUy9FNVRxNGZQbldDNUlzangzamVtYnFWcFV2Z0NOQU1ZOEdheWYxbUtFVWp4TFZoZkFFeUM4VG1CZUoxaC9KS3RlWXNBNmQrTzZ4TG9TT0FtMk05ZXUwMnN5eWZOM2kzMEorUjhsUzRzR2NZSldaSVNlZDRqZks4cm8rWXNTaXdzdmU1NUFGN2JobDJBbVBpczFrdXMvU3NjbnpwZXdLa0lKeHVsakJaT0tjb3JOWjRMZjFjTGpMS0pTNVp3NGc5U2VhWGhXZE1PdmpUYXRjUlE3YXZxeHFhb0hHNnE2c0pwKzgvdnlCcXhrblcxeFZtTXprLzArcnR0ZDNZb2w1Z0lzTWhaZ1hVa1QxbFB1RitWWDRVc0M4NHVLVHJ6bXFNVkxqam84bmxPT3AvTnI4V2hlRmU3TExzZERCTzN6aGMxNHFhZ0pqNUxrRmhUTjBuL05uSVNoclV1YWRwZFlVSXlZSEN1U0M1eUlKcERUNlYvRi8vRjJNV0c2VUJxTjJwK3F3aTZaQXR1VFZkaklzaW1kc3AraXhUcUZDVnZOK1RqTVpPOUhxbDlqTGNVaVRTNisxdWJoZTNxUjFmbVYrQzZ6aEsvTHNjN2VnTFgyV214M3RXTjdTU3YybG5kaEt4UGhabHNOanBhMUlMNm1IUnEyVG5QbktITDdwNURkT3dFRHcxWXhUWG96MDdZNHVhS1NSUkZoZ3VjY1BOY2dXZUF5YTM1MGttRmg0aExHK1ZxTWYrZjNEaUtadnlXanBnYU5VNU53OWZVeFhKM0FDRDJaS0tNWHlZQ3MyRE9NMFpJc2NwOWkwb2NBY3ovM1d6RnpEcDM4RGpHTFhyQzNxYjBQQlFNbkpOODdKcmJsZXRFZEpWaEpTS29BZ0tod0lmY25CV0N2L2lTRk1NSFNvb2l4OGJieFNYUk56MHBqN0JJREVxUTNDTTVyLzVGNzhkdkV0Z0pZQW5BekRHV2lDQUNPek0yamQyb2EzUXlEQTZkT1lZcWVXUnlyTkQyUCs1c2drQVVRQlNEUEVxVVhlRjdFZVJMN0Zmc1Q4ajl4NGFvMHBlOW5ZSkk1R1FvNzJZaTZUNTVGNitTTU5Hayt2NzFibXFacFpEMVkyWElOazFjUTNEcUJ3MVVEMk9IcXh1YnlIdWFLUVd4ckhzYnFtazU4ODU5dVN2ZDI1b1hSTTRnbkUzc3p4SDVmMml4NTB5VUZ0ZmdxdndaZkZUYmhnNElHdk1PNmY3R3dFUytWdGVNSld5MmVkVFRoYVVjajdyYVU0eC9aTHR4QmEzQUhROVp0T2pzVzFQT2tWZkFFaU5sTXN2SnFxVGRBK05kNCtrbVowd1ZUVXpkOEdJU003ZjJJNDN1SGRWbllJZGZqZ0NFUEI3TWMyR08wWVErWEs5TXlzRExkaExWcUMxbVZZTXgyWWxWMkliWTZLckhkVVlXZGptcXAvM1VmVS8zeHNsYjRrRjJQOFNBREtyb1FVTllKV2NjMFVqcVpHQWZPd3o3M285UUpMOGFsUlJkUko4OXcwZWc4dEZXdFV2ZUtZRTl4Y24rUk45WUhCWXNWd2Q4eVBua2V2ZjJ6WUJ0RXo5aEZzdVdQS0IyYWhMVm5BSVU4K1gxa0lQRjVFU3ArOFdLaWdnVzR4THBac3ZBSmhvazVWbmc3azJ2NStEeHkrMFlocjJ1QnZLRVZtWDJEa3Q4dDdCMUd4OXhaMEZiOVJ6S1pvbG54QWlqaTJBU0RpblduZVdBQ01HY0lGdUZiSlFELzU3M3VrNmRSVHlzaC9PWXBNcW5vb2hJTUs4cDVLc1lwZ2xiczU1ZEdLVUFxTGgwUlJjd2hGU0FYKzV2bnRpTGNpV01XdjBYOEptazlpNWdvUFhmcEdzNnhzUWhtL1FXczRwaEZ2KzRBNjc1OS9oVGE1c1NjMGd2b1BYc1JQYWN2U3JPMTJtaWhxaWJQb3U3Y2o5S1FxQml5TG1TSkhidUFUWVV0V0VQV1cxUGFnUTFrMXkwTnc5aFFONEMxMWIxWUo2WStOZzRqL05TUE9FTEFMaUtBUHk5cHhNS2lScnhycWNBSDFocDhVdFNHTndycThieWpIZy9rVnVBeEV0VURaTkpIODZweGIyWTU3c212dzE4eXkvQWJneE8vTXhUaXI4WWlMTWlhbUlKMWVnNEdNazlxYlFNTWxGbHgzVTBaYWI5SUpPangwMGl0YVlWdDhoUXMvTi9MVVNhTlZJbSsxZmpPSWVpbXpzSksxTWo1bnJnMFFneVQ3clVXWXk4bCsyQlJHVUpiMmlIckhZSzhid2hwblQxSXJHMUNPbE4xQTJXMmhzYTduV2V0Zy9RaDByYzBoNUVWMnNyL20zbXk3RFAwbnhNbllXUm9zakNONjdzSEtjRW5LZXRYcFpFbGtlVC8zOG9SSUJUWCtZaExLVVFxN2pySlpFdkE1ZlFQdzBrVzYyQUYvN0t0WUdZQm1oNm02R3F5U0R0WlpwU1YxM1BtQmtyRXZFNDJEQ01EZ3FxdUdlbTFqZEMxZHlDenV4ZWxZeE1ZdlA2RDFDVWx3Q2NxWHhUQm1nS1VRbzRIenB6RkZDMkJBSlFJUWI4d3BBQ2UrRzVSSk9sbEVkMWJkUXg2Z2drRmdINWhVdUZueFhEckZPVkMrRkxoZXdVNGYya0UwL3llTTFMLzZjK05RMnc3UjhrVyt4YnZpM1VUdEJUaWVxa0pndkFNR3lIekpTNnhDQjh1dmwvTW1ITU5qY0xlMVlPeXdkSC9UT0g3UVpxNU5jNVNNWGdlaG9ZUktKdFBTQk53d3JzbTROWXdJTTI5WFZQWmdkWFZYVmhCR1Y5YTNJTHZpMXF3MGRXTG5UVWoyRlYvQXV1ckI3Q3pkMDZTK2VleWl2Rm1jU1BlcDY5OTAxNlA5NHRiOFhKK0ErVzlCYytWZCtCdWF3WCtTYURlUmRBK1RKRGVrMVdPMjJrSGJzcXR3bCt5cTNGVFRqVitUNUF2Q0t1dWhhSzNEem95aGhpaFVqUzJvR3g2SGpuZHc2aGxSWXV1SE1GeU1SWDFpQ096ZU5MWHhyYjNTRjFGNlF3S0dnTGJjUEljMGtlbmtOSi9BdkwrTVVyRkhMSlBub0dpZnhERzBUR1UwY04xa0RWYXJseUdZNkFmMXZaMnFmdERBRWNVOFhxTUZkRkdHc3B0R1VGeVdRTUNDZlJqQlE0RVZkVWlsSTBva3NjVldkOE1lWGNQN0NkblVYWGhIS3JPbkVRMUE1RnJabEthdDlERlpOeEI5aEVUVjdvSWRqRmhJbWRpQm9iUkU4aVpua2JaMmJQb3VuSk5HcThYbFNvcXRHcm1ORUU0aUd4NjBKeWhLZVQyVHNMVU1pUmRJdE42NVNkMEUyeDE5SVI5WkM3Qjh1TmtPL0U1QVVEQjdJSUZMOUNUL3NKK1FucEZQNnFRYU5FcklBQW90anZGNHhrL2Q1Mys4Z1pPQ0REd0dFVGpFclBtRzJuRHhzU2dnUGc4UVRkUDBQMEN1Rkg2MEo3WmsraWZQeTNOeGhmYmlQZkVkLzNDNkdKNzBUaEd6OU8vbmorTEVaNmJLV3JORUVQajRPbXptR1NERklNV0Y2azg4OUpBeGxXMHM5R1hrVUNLMlpDYmVieGlEcXJvTnhiMUlOVUhpM1h3RXFKZFBRaDBkY0czdGhkdTliM1kzZENMalEwOVdGSkd1YTlxeDdjRTdTSXk1aUpuRTVhVFpkZVU5VEtQZE9Icm9uYThTZS81S3BuejljcDJQRXV2K3FTOUJzOFNqSThUZU04WE5PR1Y2bjY4MkRSTVlGWVNsQ1c0TmRlRlorbUhYNm9meHQ4STBEL21FS3k1ZGZoVFhnUCtsNkJkRUZIZkFIbHZQOHhrREZWSER3eGR2YWc5Y3hINTNRTW9HWmxBQzF1MnFQeTBsbGFDdWdmQlZSVUliYWhIV0hNalFocnJFZDNXaXJqMk5pUjF0aU9oclVYYXhqUkVKdVBKcUtUMzZXSkZEcEFCUkVXTHloRnNJazdrQ2ZMUkNHNmc3ZW9GMk1aSGtjNzlKRGExd0plKzByZk1CVFhUZFhCVEk0NVhWT0JZUlJXOGF1b1EzTklDYndhOGtOb3FLQWQ3a2RyUnhFYldDV1Y3TTVRZHJUQ1BEa3VOd3pRMmlTd3lWa0pQSDN5YjYrSGJXaytmMVNnZG80bDJwNFdNSWlZbUM5YVZON1Fob3FvZU1jM2RDS0tDeERYMlFkczNCWDN2Q0dwWXlkM1hma1RuT1hwZndXdzhkc0Y2Z2ttRlpNOWRGbDFRMTVtOEdZYTRUb0JIQkNiQnFCTmt0Sk5VZ0Y4dS9SRDJvbnY2REJwSFoxRTdPb2VHcVRQUzlENUJCbUkrcDVnMUwyYmlDM0JPOHZQVFAveUlLWjY3Q1lKLzRnb0JMZ0lVRzQwSVZLSUlsaFdEQUtmL0EreXpaT0tUREdTaXpQUFlScTlkeHVDbDg5TGdnL0RNRndsRUFWYitaQ2s4bmlERmlpbDlZcDdESU44VEUydkVMQzh4akN6c1YrYmNEd2h1bjhRUnlycEh5eWc4eWFvSG13Y1pqZ2xRZWxJQjFrV3VKbnp1YXNhbkZjMVlTT0IrV3RXSmo4cmI4UjdEOHpzRTcxUG1FanhGai9wc1pSdnVMYWpHZzdTQUx6R2JQRThnUDBHd1BsYlNqZ2ZJckgrMGxPQTNtWVg0VTJZeEhpNXV3MU9WL1FSckRYNWpMc2YvWmxZU3FMWDRiNVlGNFhWMVNLTEV5YnU3NEdjdndENlZCcDRtTS95TW1mRFNaY0RiYUlaWFZoWjhyUGx3NDNKRGVocld5Vk94TWlVSjM4WEhTTXZsQ1hGWWw1YUNaZEVSV0JYSDEzSHgyQlFUVDYrYkpmVTBIRmRyRUo1alFWNVBCN0s3bXBGWWFvZXB1d25xOWxyRTFwWWh0ckVLTWEwTlNCcnFKU2dyY0x5cUhFRk45ZkNxcklCUGJTM0NPanNJdG5aRXMxRUo4UHJYVkNHNHBoTFJ6VFhJbkJtRFpxUVBJVFhsOEN0MzRWaEpNWTZWVitKWVRiMDBJMnRuZFRrT3RkWER2YVVlZmkwTjhIZVZROHVHMkVBUFYwM0RHOS9jQlM5NjhkRDJYbWtJTVhsNEZvcVJHV1NOenlKdmVBTDFaMzYrREVQSXB1akluN3h3VVpMZWlRdGtJN0w2UEJ2Y2FUR0lRTlVZblovSHdPUVV6aExZQXRBQ3ZNSUdpS1d3RENOa3RLYVJXWlIyamNKQkMxVjVZaGI5TkpJQ0pHMEVqbURZUHU1L2pPdzZUYVlUbDRsMHpaMUNPMjFheThRazJtblp4aG1DSksvT0lrRDZpN1dZdkhZVlBTZm5wTjZNa1F2bjBYMW1YaXFpVjBKTWRoYmIvRkxFYnhIc0tTWTBpNnN0eEh5SXNsTmk5dHhKV1BySG9ld1pSMkR2TEE2MGpXTnY4eWoyTlkwdzlmZGhTMVUzdHRiM1l5dVZaM3ZQQkpiV2QrSEQwbnA4UU5CK1FMQytWOU9COTJ1NzhGRURHWk55LzNaRkQxNGdHQjhnWU84dnFzZmpmUDE0Y1RzZXRqWGlBWHN6N3N5cnhlM01MWC9sKzdjeVZQL0ZWbzJiY3lyeFoyTVovcHhWVFFEWDRGYzVkZmhmYXlQK2k4c0ZXMVdwMks2Ukk0cVZIVlJVQUhkekJqeXlMZGluMFNLQU11eHV6a1JzZFEwaVhKWFNaT2ZqK1RZYzRMb0RXZG5ZSUZkZ3V6WURtMVU2ckUxVllJTkNTZEFxc2N0b0lvQVRzRGd5RXQvRnhtSkpWQlJXSlNkamswcUJaWWtKV0NOUHd4cEZPcGJKa3ZBOVFTNEdFTmJwTlZpbFZ1RGJOQmsyR1hUWWw1MEozOUppS0lhSDRGTmVqcVMrQVFUVk5lR0FBSDl4TVNMSnVpbDkzVERQVGNNd093bTNZaWZjeWtweG1HRGVVVmlLM1F5SnU4blVtMmx6dGxJSmRqVTMwVS9WRU1EMThLeHZRa0JURy96cld4RFFJQnJCTUh6SXNFZXJHK0RCSUNVYkpEdlQxb2pwYmgwRWpaaThMWG9CUkFXM25tY0FZY0J4ZEhXamJYWVdNejhRckdRMTBhVjBqdXg0alpHYndWd0Nxd2hKdjNoV1VRUWJUaEZwd2dxNGVrZFJTdllXazVYRmZSSjZydDFndVk3ZTY5ZlFkVUhJOTNuYWlmUG9JSUNGcDIxbTZoZGRZWUloZittQ2t2Yko4b3RxdGRQbXRNN01vMmVlckUyUUNsQ09YcjBxcld1WW1FWDdtWi92cVNDWXM0N0hvZXFlZ0t4ekRKSE5ZbEpKTDBKYlIrQmQxNE5qQkp0NzMwbnM2WnJHanFaUjdLZ2R3cTdxUVd5djdwTzZxZGJRcTI3cEdNZmltbTU4V3Q2S1QyZ0ZQaURZM3FJdkZlbituYkkydkViV2ZKNGg3RWttK3llNGZMU3dGUTg3MjFnNjhGQlJKLzZaMzRUYjh1cnhWd0wyOXd4VnY4a2xnK2FVNDFmMHJiK25WZmhEWGpOWnRSNy9tOXVFQmR4dWdZVTJJTERJaG9OR0RYeHRPZGl2VTJKN1dqTDJFalFyb2lLd05qRVIzNFdFWWwxOEF0WW5KT0w3aUdnc0NRekJsejcrVW5uMzhGRjg3aE9BTHdPQzhhbGZBRDRMQ3NiQ2dCQXNqb3JHd3RBUWZCakVkUkZoK0lpdnY0amhad25ZeFRJWjFwT3R0MXB5c05HVWlVTkZKZkFtaUR6SWlydXRPUkp3MTJzVVdFOEczNnhXWXFmSmlQVnFOWTRWdTZRNUFIdHpiZGlUazRlQTZtcTRPeDN3cjZxRUw2MkplMWtadHJNaEhhT3ZQVmhkanpYMkVxWlZybU9nVzFQcXdwN21WbXdvTGNObXZ0N0M3OXhxTDhTUjhscHB5cUQ4eERROEs4bTZqYTNTcEppc2MxZFF4cUNSU2RDV01obVhVeXJGOEdvejViaUtDVDZmOWlLYisydGdhQk96NVFYVENyWWpnZjNmRkwzTGxHSUJKckZlRk1Hc2srY0pSc3AvTTltMWYxNTA1Ri9ESkQ4amZMdGdieUhGUS96YzRMVXJVcWUrNko4VjltUDQ2aFZNQ2VEemZiWUQ4Q1dJUVlpSk04SW1OTERSTko4OWh4N2FDQ0h2QXp6bW9mTU1aZHhXek1PdG1qb0pjMGMvTEFOVUNqYSticTVYREo5RVFGMGZ2R3A3NEVFdjZzSGc1TmN4SnBXamJXUFkwVENFamJVTVNZMWsxdVp4Ykt2cXgxb20rSFVsSFZoYjJZTVZaTm92R0pnK0pFamZLVzFpYVNab08vRkpXU2RldHpYZ1ZjcjVjd3hRVHhjMjQwbUM5VEZIQ3g2ME5lTmVld3Z1ZGJianJvSTIzRUoydllsQjY0LzJCdnlHbjFuQWtMV0F3RjJRVjROZlo5Zmp6cW9SM0Z6YWgvK3gxdUpYQlkxWThQbXhRL2oweUg0c0QvTEhONzVlK003UEc5LzUrK0M3SUQrc0NBL0dOd0UrV09UamdTVStudmprOEVGODVYRU1pN25OMHVBQUxEeCtERjk2ZTJHaDUzRjg2TzZHRDQrNzQyTVBEM3pPejMvcTQ0MlBmYjN4UlhBZ0ZnWUc0bU0vUDd6cjZZVzNQRDJ4S0NZT240VkY4TFUzRnNmR1k0dkJnRzBHUFRhbzB2RzlMQUhMVXhLeHpXTEVrVEluRHBVVVlwczFENnN6akhBcnI4SktqUUVyRkdxc1NsZEtuOXZCOWR2MFJoeTBPWEcwcEJKaDdmM1lWMWdwWFJPMXQ2d0creGtNTitRN3NLK2lCdTVrNW4zRjVWSXZoYmlHUDdpcUNTRXN1cEVwYVc1clNGV0RkTFdBa1FGVE5UeEMvOXFFaExwR3BMZDB3Tmp4Yzc5cVVkOEljbXFiMGNWZ05uYnhxblFaaVNUSEJJV1UrSC82QWFlWndzK1NJVS9SR3B5OGNvbi9YNWU2c0dZdi80REJrK2ZSTWpxRFliTGNDRk9QbUl6ZE5jZHdlT29NZXM2Y3dlREZpNWltN3hSQS95WHBDOVlVU3dGV3dhak1lTklFZ3N0RXJtQmJZUjFhQlp2Uys4NXpBK203dUVrOVBiS3Rkd3pxNWg0a05uWks0VGQ5ZkI0eUZ2K09JWGkzaVlzWWUrSFRPZ2kvWmxxcDltR2tqTXdqY2VRMFlrWXZZay9OQUFIS2xGL2VLWlVOcmc2c0wydkhVb2FtenhtV1BpR1RmbExYalE4YXV2RWFyY0FiUlUzNHBMQ0Q2enZ4Q2oycjZOQi9ycWdaVDdFODdHakdQUVRtUC9NYmNRZUJlN090Q1grdzF1RzMxbnI4aGtEOGxiTUYvKzBnWUFuYy83SXhWSEhkMHoxenVKL00vcXVjVXZ3dXZ3SUx2amk4RndzUDdNSnlYMCtzRHZERjFxaHdiQW9Kd2thQ2RWdDRJRmI3SE1NeUFucVZ4eEdzOVQ2R05WN0grZm9vMTN0d3ZSdSs5M0RIc3VOSHNKaEEvdnJJSVN4MlA0eXYzQS9oV3o4ZkF0a0RuM2tjeDZjRStHY0U2a0p2Ynl3SkM4YzJsUnFlRGllK2k0N0JGMlRqTDRORDhBbEJMMEQrVFhnSWxzWkg0Y3U0U0h5ZGxzQWl3ekt0R292VDB3bTBzcCs3dzFxN0VGamJLUFVTdU9VWElMQ3lUaG81K3pZaEhkOG1hN0ZhYThFcWxRbXJ0Q2F5ZUxaMG5aUjNmU3RNNXk4amlISWZTdmxQNlJ5QWVYd09sUXdjb3ErNVlQYXNkSE1IYWZMd2lTa0dybVlDZGhnSmpjMHdEUXd4Q1A3STFNeEFRb1lWYzFKL1lVM0pqOTc0T2VpY0lZSm1ibHpCMlBrei8yRlVNY0JBdjBncS9IKzduWDd4bW1KNTR1SjF0SXhOb1pVQnQ1ZmVkSXlKWHZLaFlvQ0N3VlJJdWRSandnWXdjWkhTenRCM2hXdyt4UVkxeW1NUmFYK0NUTjUrK2h4R2VJeWkzMWRZQXpIOTBUbzhqOXl4czlEU2gwZTNpV2w5b3dqb0hJWmZ6d2c4K2Z0OTZOSDNWemRMamZwZ1dUVkMyL3BRUktDTG9lbjRzZk53YnowaERZdUtVTFdCRE9wT3hrMWx5MUh4QUdONVVPc2FCL0VtdzlZckRGZ3ZWYlhoaGRKR3ZPRmt1S0xrdjFyY2dwZkxXdkVpZmFyb25ucU05dURmemtiY1NSRGZWZHFPbTR0YjhTZEhFMzVOY0FxZy9wcXMvVDlGcmZndmZ2NS9DK3J3SzFNaC9rcVEzcEx2d3A4dER0eG1MY2FDdFY1SHNkSFBFM3NpUTdBL0tnekhaSWx3WTFCUzUxcVFZYzFHdkNKVktqS3lucVVnSDNHMENUNmhRUWltcklmR3h5RTJMUldKbE91bzFHUUVNSEI1RUd3N3ZUMXhPREVPdXhOaXNTVXlBbHVqbzdDZDNuVk5TRENXQndSaVZWZ1kxcEZkUDNVL2hrVUU4SGRrM3MrT2thWFpFTDVoZy9rbUxCRExrMkx4Y1dRdzNxV1ZlRDhzRk85SFJPTFQ2SGg4SEI2RFJYSEpXSldtd2o2TEZaczFHZGlibFlkOXVZWHdGUk91UytyeHZkSWtUVmxjcnpGaVdhb0tLeFU2ZW1JeklqdTY0VTQvSzdyRHNpYm5VSFhsSittT0l5MEVVdEhKY3pDU05VMkRKNlFlaGJqbUZtU2NHRVZxU3lzYzA5TlNhdTg0ZXhGZEJQVXBBVHlDUXZTdGloRXZBU3dCWGdIY2syVFc0WE9ueUtnWHVJMFlHcjNPVUhRTzNUTXo2SjAvSmNtNkZIQUlKZ0VxY2NGZC8velBNL2VueEsxNXJ2dzhQMVpjdWlMbUEvd0M2bmw2NDlsTFpPa0w5SzIwS1BPMEt1SzdSWStCdUdwVTNPVkUrRkhCd2oxc0tkcWhPWVEyRHlQMXhGa2tqWjZtSjZjUFpmZzVYTjJCNDQxOTByMExRaGltZk5wNjRkZldJMTMwNk1IR0g5cmVDZi9XRHVtZVgxc0k1RFgwOFNzSjVKMEVZeG9OdDVpMUpucUh0S00vNFdEVnNOVFIvMDVkRjE3dEdNQ0xyZjE0cWE2WHdPM0FLK1h0ZUxXQ3kycUdyTnBlUEZIWmhmdm9aZTkyMFFKdzNUMU53N2lWVnVLUHBSMzRYVWtiZmt2dy9wcE0vTC8wdUwrejFlQmUxdU05K1VXNEo3c0FkMmZtNFFGek5oWkk5Nk1xeUlHU3dJelJLaEZOdnhpV2tnQzFWb0hjSERQMDlMRUd2UXBLdVF3Tyt0b1VnaWdxUEFqeTVFUm9sWElZTkVxWVRYcGtHRFRROERPaVJIS2JjSHJQRUwwYS9neFZFV1lqa213MnhPVG1JQ3pMZ2dDakVmdVNaTmlUbEFRL3N3bSs5S1U3Q2Z5MXdVSDQzdGNIeXdQOXNNamZHM3NNV3V5M1pPSmovd0RKTW53U0ZJNXZZaEt4a011VlNhbjRMREFVWDRWR1N1dS9pcExSRjZkZ2hTWWJLM1VXck5lWnNkbGd4bDR5NzFwOWh1U1BSVmxGVnQra00yQ3pVZ3Z2Z21McDJyT3NrUW1XY2RobUtmKzkvVWhzYXZyNTZvREJRWmo3KzlGeTVlZHJwb1lKSGpGd0lRQW1QT1gvMTMzMDgwd25BVmd4NmpSQmRqeEYzemwzN2FMRWhrTm5UMHVCUi9UUkNrQ0pRTlJ4NWdKR21aUkc2SU9GRGVpYklaRFBYcFlBS09iRUNya1hRVW8wQUZIRXZxVUd3VVp5K3RyUGpVUDRVdGZ3R1BJSGhwRTdNQ0pOWFN3Y202VVNUQ0t4Znc2ZXpTUDBvQk5Tc3ZmdG5vRnYzd3lPMDVNZUlsajMxM2RpZjAwYnRoU1VZb2V6UkxvT3pxdTJCZ0gxZGZCditQbmlTNTkyY1V1alZxeWhkZHBiMVlMWWdWbm8rczhqcldVT3UwMVZXSk5kZzgrS20vQ3lxd0dQMGtZOVVkV0tsNm83OFJ6OTYvTms0dWRjTFhpbW9oMVBWWFhpSVM3LzVXckduVngzQndQWjNmVEl0MWQxNGE4bExiaUo5a0VxWk42L0N1YWx6WGpZWElCMUErUFlPVEdQcFF5OUsyb1l0T1RhTkNTbEp5Sk5JNVpKMEpnME1Gb3lFQjBUZ3RUVUdNamxjZEl5TVM0VWFrVWlvc0o4RVJzWmdEUlpGRlR5ZUtRbHhVREZ6K25VcWJCWTlDZ3JLNERWa1F0VmxoRnBtV2I0eGNYQ1BUd1V4OG11bnZHeENGWXFFYVJTSXRWaGg4eWVqMVJuQVNJelRmRFRFTmhhRGZ4MFdnSTZFN0pDSnlySWFMa0V5N1lFR1JaNytXT3hEOEVjRm8zRkRIR2ZlL25pY0tZRnVmT25hUU9xOEdWc0F0NEtEc1A3MFlsUytZeWZXWlNVak9VYUxSYUtvS2pWWW9sS2hXMXNORWZMS3hub0tuRFk3c0FXdnI5SDlHNWtaOE8vb3B5bERCSFZWWEJRbGwwVFU2ZzdlWW9KL1liVXZTUkFKc0E2Y2sxTStMaUdPVEdSbWYrTGFYcGlCcE9ZMEN5bTNzMmV1NGpSMCtLaXYxbTBUa3lpY1dLQ1NmMDgrc1NnQlFOUkxTVmJNTG9ZaFJQWDdOY1JxQlZrOUU2eXV4aFpFOEFYbmZqRXNRUk9NYUFnSnI4SVJoWmxodXVFTmFoaXloZDNxRWxtOEZUM0R5R3RaK0RuNjZObUx5S29jUVFCSGRQd2FCbkRZWUoyVjhPZzFPMjB2V1ZZNnRSZlgwWFdMS21XZ3VpbWZDZnpRVGw4ZUY2OG5JV0lxYWhGNWNucjB1eXlyRk9YNGNYUXVhZUNWcXU4UmhvNjMrYW9SakR0eFk3T0UvaUVJSDZCKzNtTlFQMjZleElyVzZheHNMUWJMOURyUGw3YWdrY0kzSWRkYldUVkZ0eFYwb0RiU3hweGUxbVRWRzR0cXNkdGpscmM0YXpIdndycmNYOWhJKzFDTTE1akEvQWNPWU04L2tiNTNGV3N6eXpBMGxROUZvU0ZlQ0Fvd0IzSlNXRklTNDZHWHBNQ28xNk9uQnd0bE1wNEtCUnhTRStQUlk1RkRXdXVEb3JVYUFJMUFocEZQUFRxSktRbVJmNWZVWEhidkd3OTJUVU44Y2tKU05XcUVFNHJFQkFkam9DWUtQalFYb1RLWlBCTGpFZWNYb3RFVXdiazFoeWsyWEtSVVY2S3JOb3F5R2sxa25LeWtHRE00UHRHK0tYS0VaNWhocktzQ2lHWk9kZ1ZLOE9PdUFSc2lZN0ZZUUpRM3RvQ2IwY0IzdmYySWJQRzRzUHdhQ3drVUQ4U2ZwanMvWEZjSEQ1T1NzVEh5VWw0ajQzbDArUVVmSzFRU0NCZXFWWXptQlhBemVtQXA2c01PL2k5Ujh1S0VWblB5cHFlbFVLTkFJVVkxZmw1TUVOMDRGL0V3TlhMS092clJoZkJLSVk0aFV5ZnVYWUQ4eGV1WWY3TVpVd3pqUStlUE11d0pHNGtjUlVOYzZkUU5EWXB6YU8xVGMzQktrYjR4cWVSTnpFTDYvaXNkSnNlTFptc2hLL0Z4WXVpVVF5Zi9Ua3NpY2swdytkdm9HUHVQTHJPTXBRUnFJTGxoUzJwSmZWbWpFNGltRkl0cm92eXI2Y2ZweGVOSDVwRjNOQlpwTTcraUlDZWVSeHBuOEFlK3MzTnpVUFkzREdDNWRYdFdPUW94MWQ1RGl6TmRXS1pJUlBiS0xVZUJVVUlLM2FoZ0lGVC9GNXhISmFSV1hqejNIdlVOY085b1JrN2hTV29iTUNtbW1aOFZWaUJOKzJsZUxPNEdoOVd0dUlyeXYyU29pNjhZNm5GcTY0dVBGSFJTY1p0eDZPMEF3K1NXZThwYThiZEJLc285eFRWNFY1bkRSNW1lYXF3Rmk4U3JLODU2L0F1UTlzU2duWWZ3OVorVXhGMnFmT3dKZFdJVFFrYUxFaU84RUphdEMva01YNVF4QVhCU01EWkxSb1VGMXFnejBnbHE1SkJWUW5RYTJXUTgzVjhkQUNaMVEreW1DQVVXbzNJTXhPUXdSNklEUFhpZS80b0tzaEVYWFV4VW1rbDRoT2lFY2V3RkJVVGp1VDBGT2pNQmlReU1BVkVoOEk3TEFoaFNYRUlZZm9Qb2FWSXBkeG5GQmRDWmJNaXhXU0FOc3VFL0VJSERMbDVTTlRxa0dUTVFxekJoTUIwTlFMVkdzVG0wSktRZmJWMU5UaEsrN0kySmhJYjZhZS9pWTdHb2xqNldyS3BBT3NIVWJGNGg4RDlXSmFNRHhJUzhTNForUE0wT2I1TVRzT2lsRlI4azVLRzc5TVZXS0ZJWnlCVDRvaXJHSWFKTVRTVENZWC9FMHdtMkhUd3NramQ1OUZ4U3R6UVlSanRNMVAvMzB3dEFrakk4bVd4SkJ1SkxpWEJ1T0x6Z3BIRmtLM2tqVm15WnM4Z25vQUtiKzZVU214N0gySVpHR1ZjaXVIc0hDSGxjMmNwN1JNRUw3K0x6Tlo0N3JyMHY3YTFSN29YbVlGRlhIbHFvRVJHZFF3eUdBMVF3anVsaWMxSDZyaHNHNFovMnduRW5iZ0F6OVp4NmJhUmgzdW1zYU45RkdzYityQ2F6UHFGdUlJMHJ3amZadHF4SWlNSDIwMVdlTnFLRWVPcWdiS21GZnE2RGlTWDFzTFRuQXVQUER1TzJvcHd2S1JjbXY2NXY2aEN1dFBpcnVwV2ZNUGxRbnNGUG5KVTRrTUNiM25ERUpaM1RFbGRWdmN5UEQzRTBQUUl2ZXEvR1pyKzdhakJROFVORWtDZlpIbStvQW92NVpYaXJid3lmTVgvbDVDMXZ4QlRDZFU1ekN4NmJGZGtFYWdaV0JzcngxNkZFUXYwY2I3UXh2a2hPejBTeFpseWxGb1VzSnBTa1ptUkpqR3JtaVhUeEhCbFVrQ1hUcWFWUlVLVEVnTkRlZ0xNNm1TWVZUSW95YW9wc1VHSUQvZUJJMGVINnRKOEpNZEhRcFlRS1huZHROUkVwSE9wTjZpZ042cGh5czZBVXFkQWRISThRaE9pSk5DRzhuV3NXb0VrK3RSNFpScms2alJrV293dzVWZ0kzRXdZckZabzg2eTBGcGxJczFpUVhlRkNHdDlMejg5RlZLWUI0ZGxtUkpPVnZlaUIvV3gyYkNYQTEra3k4QzJaZVdGOEVqNVBTc0ZIOFRLOHg1QzJNQ0VGWC9EMUlpNi9qazFraWNmU1pCblcwRjhMZGcxd2xhSm81QVFhSm1ha0R2bVM3bDVVRHd4S3ZsTkkvOVQxYXhobjJKbW1seFdYazRqcnFrUTMweSsrVWdCVnNKOG9YU3lPMlF2UTlFOGdvV3NZRVczOUNDWXd2UnM2Zjc3ZFVHTW5qbFkzd3B1c0tHN1VFZEhSTDgyM2tBOU5TRGRiMHd4TklYUHFqSFNkZld4TEQ4SWF1K0JEVnZPdWFVRmdxK2duN1VRSTVUaGw0aEtpaGs1aEw1UDNUcVp3TVk3djF6MEJON0xwenVwdWJLM3J3NDZtSVd4aGd2K0cwdnVwc1FCZlpkanhyVFlYMzJzeWViNHNjTXZNaDcvVmlWQUMwOStjQjErakJSNTZFb1RWZ1lqU1N1bW1Ic2Z5bkRpVTQ4RFdqRHpzRmplaHl4ZFhvTlpoZVdtRGROWHlKNFhWRWpzK2tGV0crM09yOGFDMUZnL21jNWxYaVVkdFZYaVo3UG9KRzh6cnRncDhXRkNCVHl5RldNaDlmV2V5NFh0REx1dkxnQ1Z4Q3F4TzBXR2JPZ3ZyVWpSWUVadU1EUWxwV0pDdkNFZXBVWWFxWENYS0xPa29NQ1RCYWtpR25pQlZwc1ZBVGIrcVZ5UkFseFlIWFNydGdDWVZwUVNiUFVNQmxmQ3g5TFo2K2xkbGJBaFN3djJRUlY4cnRrc25VSVUxMENxU29VeE5RQXBCcVVoTG9MM0lRRXRyTGNwY2hVaFRwU0JabVF3NUExdzR2VzlRSEZrNE5RbkIvR3lpUEFGeVhRbzBXVHBrV0xOZ3N1Y2hrejdYUXJiTkt5NkNyYlFJYVF4LzRyUHBaaTB5Q0ZSektSazlOeHZKamtMNDU5cmh5Uk4vSUNzWFczVW1iTkpuWXEzR0tGM0JzRnFody9JRU9WYkpsRmpPRS9FOVE1dm9UanRFOEx2bDVlQklkcVowMzFodFRTMUtob2ZRTkR1SHNTdFgveTlFaVRGL2tkaEZFU0NWcnEraXB4UmRSMEtxVzFoS3BzNUtONFZJYWVsSFNFVXovTXFiRU56U0o5M0F6YXQxQVB1cTIrZ2xlN0N2cmgxN2ExdHdoS3pwMlVud2RmVkRmdUVxb21kUHdhT0RZRzRtT0FsU0FlcGpEZTA0d3VWeGd0MjlzUWZlYllNRWVSOENtMGVob200bkRGL0UwYm9SN0svdXhRN3VYMXkzdEt1eEczdWE2ZnVydTdDMXNodmJLcnJ3dGI0UVh5b0lFRXJzQ2lVRGFib0pXd21NdzFtMEFqbFdIRE5uU2ZmbjljL0tSZ0NMR0RKUElsakZEZnJjMUVic1NkZmpvRDRiK3dpd1RicGNiTW91eENabkZSWmJpL0YrVGdGZUlscy9tMU9HSjNNcThIQkdFUjdLY09ESnpDSThZeTdFaTJZbjNzdHo0VzJkVldMUkpmeTh1Q0o2WlpvZWE1UFZFb3V1akU3RjBpUWx2a2xXWW1GRUhMNkprMG1CZWtGNVpqTHE3VHBVV1ZVU1VQTU5pWERtcUpCbGxFdU1hdENRR2VsUlUrSkNvQ0lvcytocDdVWWxHa3Z5VVpwamdNMUExbFVtU0NCMW1wV29LOHFEeTU2SlRGMHFtVGlSU3ptTWFsb0krdUhraEZBR3NXUlVsVHZnY3RtaDFxVkpnRlVhbEloT2lZVi9WSWdFMk9DNENHaHBSVlRjbnlaYkIzMnVFZHFjVEJqemMyQ25weXlyTG9lajBBYUgwd3BYZVJFS1Mrd29vbnlYMTFZam0vNVRuWitQb0l3c0JHYmI0R1BKeDdITVhMaGI3TktkWVE1a1dyRXZJMXM2MlljTkZ1eFRabUNmU2djL3F3M1JMaGNpdWY5Z3B4MkJaT3lFc2hMb0crcVEwOWFNMHA0ZWRFNU5ZZjQvWFV0aVFvc280aXJRc1NzL1lJQnBxSTZwM3RJOUlFMk9FWjN3RWJVZGlHem9Sa2g5Ti94WXhBMStrNll2SW5yaVBIYlhkR0Ezd2JTTm9OclYwSUh0dGEzWTE5SXQzY2pEdlc4SWh3YUhzYnVqQys2ZGd4S1FEekc5NytOMk8rcGFzYitkWUt4cmcvL2dGQXhzUGRsWEFCdXRSdHJrai9CdW1aSW10bStyN3NENnlpWnNybTJEVys4RURuZE9ZbDF4QzViblZHS1J4b1lseWp4OHI4NGxVTm1JMHd6WXJjdUVEK1UrMU9GQWNGNHVRWnFGWTJ6QVBvWU1CRnV5a1ZCVURDKzFIdTVwYWh4WEdSRkEyeENRNDhSUmhwKzlCT2VPL0JLc0x4QlhMeGZpazl3Q3ZFNGd2bUowNHAyY1VueG9xOFQ3MlFTeTJZR1B1UDVUWFI0K2tHbnd0ZHlFbFVvek5pcE4yTVlHc0prRXNvWGtzVE5WZzkxR01uNnFDcDh6VUs5WHFObVl0RmpneWtxRE9UVU1LUkVlU0kvMXBjU0hRQzZLS2hhYXpGUm96YW5TYTRVcUR1Yk1kR1NaMDZGVngzR2JNR1FhVTJEV0pTRmRGb3kweEdDb3VKOTBtZWcxaUVaNlNoUVNhUTFVOGxpWTlDa3NCQys5cndoaElxelo3U1prMEZxa3lPTWxGazFVeWhDZEdvZFloUXlLVEEwVTlNS0o2a1RFeU9NUVRxQUh4a2JTTXNRZ1Naa0tsVjZORkxLMTBjZ0dWcENOWElJNUo5Y01XMEVlakxRREtYbzk0aG5Hb2l4VzJnTWJnclB6ZVdJTEVNQVRHV2dya2U0MjQwMlo4elptNDZncUF4NGF2VlFoNGZuY25tRXZ5bWxEU0tHZG9MVWh2clFRNnBvS0dHdXFrRlZUaWJMMmRuUXkzWTh4OGZlZFBNV2tQeU5OUWhHVFFzUU56TVFRYlNoVGN6Z0RreCtCNHZlZlcyTWVZdm85VWtOMmJCN0UzcHB1dUxVT1l4L1pjVmQ5Rnc2MGsva0kxdjJkL2RoSkg3dVRIblpMV3lmVGRnOE90UFhSYzdaTDk0RGF6Z1MvZ1dEZVhOL0s3YnB3bUpaQ1RJUVdzNk04YTRZUTNEbUxKQnBsajY2Wm41OXBRRys2c1lwSm52NzFRTzgwNWI4Tzcydno4YW5laGk4RW82a3RUTmxhTXBvU2gzUkd4QlN3b2JQQjZzcEtHWEo1empRNkJKbUZ2YklqbVFIVVE2bUdWNW9TVWFaY1JKdnprVjVXaDNSeFlXQnhCWTRVRkRNVUZXT2p0UUFycVdxTFRmbFliSEZLdjlHdGRSRGZaZEYyYUN4WW0xTWszWjUrVVNKVkxWbUR6UVRyQWU1UEVNZTJ4RFJzalV1UjJIdDdvZ3FySTVLd0tUNE5JWTVTcVN6SVRJdEFRb2c3Z3IzMklpTElIU2xKd1VoWFVOYTFDZlNLYVJKWTA5VXhVR25vVVRQVFlNcWdyTXZEb1VwbjhDSTQ0d2p5NkxBalNFc0lnQ290QkVuUjNqQnE0cENhSEk3b1NCOGt4QVVpSlRFVUNoSFU1REhTZXJVeURtb0NVYWxPUUJKQm5hU2dOeWJ3NUJsS3BORExDaWJOS3JEQWFEVkJhVklqUVpsQ0lDY2hLaVZSR3BSSVRwY2hsbFpCbGt5Ym9rMm10OVVnejJHQnJUZ2YxaEliY29vZE1KZTVwSnNjaS92SnhsTEdRZ2xhY1JPUHlJSVNSTmlMcGR1K1IvTzlDQUphM0hZemhkWWl1ZGlPVkJkRFczTTFWRzBOaUNKYmg3SUJ4QllWU0Evb1NDdXlJNE9zWHR6VGlmTEJBUlQxOWlHL3N4dU9rVEhVbmIrS0NoWjkzeWpDYXBxUU1EU080RzdLZEhNM2pqR3NpSHUwSHEzdndlRTZBdFRWaHUydVZ1eXE2Wkw4M2dicHRrcVYyRlRaU0YvWmdYVlY5ZGpjUklBS3BpMnR3MDc2d2YxVlB6OVFRMXlhdnBGQnpHMTRIRzdkd3dqc241R204VzNNcmNRZVZ5Y090STdnaTZ3aXJIWTFZM2ZucUhUMTZISisxOXJhSG55Wlg0bTNOWG40V0d2RlYyUzNKV1MwNytrSnQ4cFY4S0hYVHl0MklyZTJDbzdHZXBUdyt6VU9jV3YrSEFUVEVnWFJYaDFNVFlGWGFqcGtWQ2Vkb3d3R1Y2MTBaWWtQN2NHUjdEd2M1bm5jb2pWZ3RaeE1tSldQVGFLSFFkd3dqNEZ0TFgzeFVuN1habTAybVZ5UHBURnBXSldvWUlneXdKM0FkeWRndHliSnNURXVHWWZVR2RnV0w4ZWEwRGhzNXY4SE5BYnNWWkpaVXlKOWtVcEFKU2VFU0VES3p0YWdzYkdNbmpJUERyc0JXUXhiYWtVazVFa2hFaUExWEpya0VWREhCMEVSNVEwQjlqcEhCanE0Zld0Wk5peHBrVEF4ck9YbnFpVW1OcHJTdU45UXhFWUw0UHBMSlkyc25NcnRZdmk5Y1lsaFNDUGdGUHAwZ2xLR21MUkV4SkpwelRsRzVPWm5RV3ZVUVphZUpvMmdKU25sREdXSmlDZG9vd25XcUlRd3hQQ1lGZnlPRExzUkdZVVdaSlhia1Z0VHdtVVpVdkx5a01DVEhXZk5RekI5bUsrSllTRTdGMEZpSWd4bFRneE8rT24wQ0RObklENC9HekUyTTlrbEUwbGwrYlFBUllnb0xFQzRNeDh4cFU3RWx6a1FTN3VSV0ZhQXRPb1NwTmFVUWRWWUMwVmpBOUtibXFCczYwSmFjNGQwUDlqZ3lucTRWZFRpZUxPNFYxY1hFM283RGxhMVlrKzVlTjRBV2JhMkd4NWt1NVJ6Z0dmWEdIWlV0a3BQV2xsZlhJMXRERS9pbGpsYnlyZ1BXb2Y5Uld3MFhaUFNLSlFBdkxBQmE3anZEWTB0MkVLN3NadjczbC9IN1ZnOCtxZXh1M3NFaThzYjhDVXR3UGR0QS9pV0RXSXh3ZnAxVVNNK01aZmlVMjBCUGxmazRqdUZCY3NaWmphbGFYQlluNEd3dkd5azBkcVphNHRRMEZDRnhvNCs1SlhWSWtDcnh4NFN4QzdXaTV0S2psQUdWMld1QTVhU0txUXpiSVhTMCs1WEtyRkxxY0plalJiYkUxS3hKMFdKdmJSVzRnNlZlN252dzhZczdCVnN5ZS9hTEZOaFBZRzRrVURkbVc3QUFaMEZoMHg1T0pDUncyTlJZVTFpS3BjS2ZCMFlqdVdSc1RpVVpjRmgwVkN5czdCQUZ1Mkh4R2hmeEVYNVFaWVlnc3dzQmFvcjgxRllvSWZGbUFpRE1oSVpxaWhvVTBPaGpQZUhWUk9QcHNKTUROVVhvZEZoUkJ0ZmkyS1ZSOE5POXMxaEtDc3dwQ0RibUFwblFRYXFLcXl3RXJnR01yVmdaVXVtQWpZN0E1ckRqR1I1RkpKcEN3eFpHcVNxVXhHYkZpK3hhR3hxSWpRWmFtVGxXY2ljR3NUTEdNTG9uOUsxV2dJMUJZbHBLWWhJakpHMmo2Wk5TR0FRa3hrVlNNNVNRMDFHMWhaWllhS1hUYUxQbGJFUzBvc0xFV2ZMUjZqRndrckpsVW9rZ1N3ZTZDR0FHcEdWZ1NSN0RoTDUyY2c4UFNLc0dRaWduUkJnbFZXVUlwa2xnWFpBQURhaGd2dXRvVXl5eUp0cW9LaXZnNkt1QWJxV0RtaGJ1NkVnTTZad0djUjFQbzFOY0src2tmb29JL3RIeWJURDJFdW0zR0F0eGRHbUFWaHBIVUxIejJBM3dlczdPSWYxcFkzWVNsQ0xHOU81dHc4aWVHQWFSeWpqeWVQbmtUSjlTWHI2eXpiSzdvYjZGcXlwYWNRbXN0L3l3bktzNVQ2MzFOSTJkQXppNjRvR2ZFNkcvcnltSForUWpiOGlzNjVzSEpMNkxqL1NVWXExRG55ZGJzRjN5UXliQ1Vwc1QxWEMyMlJFckMwYmNtY1dkQ1ZaeUhIWk1DaHVvZFExeVBObmhhZE9EWGVOQWxGMkt4TDV2eUxQZ1ZSbWdRUXlaNnl0UUpyL3ZETXREWnZqNDdFekpnbGhPUXkzWEJkb3QwdVg2WXZHY0l3WlFqRG5zcUFvckl1V3dZM0ozemV2R0w3MHVtN2N6MTVESmpZcG1Qd1Rrc202Y1Z3bVlVMXlpalJZczFHWmpsMnNwd1VoZmdjUVJSc1E1THNIOFZISG9WZEZJTk1RZzl5c2VPUmt4c0Zxa2FIVW9ZWWpOeDJLSkgvb2s0UFJXR1JHUmJZU1JmU3JEbnBabDBtT0VtTTZYRmw2TkJZeTlPU2FVTXBLTDdacVVVWjJkdVpxYVEwUzZHTWprWjRXamJTMFdDVEpvaW5sNFFnS0QwQllORzJDTmgzNnpBeWtLTk1RbmhDTkJMYmlMR2NCTWdtcUpFcVBuSzNPeUIrczBXWkF4cFlYbVNoRFdGSUNmR0lpNFJrVGdhQ2tlSVNseWhDUm1vcG9wUUx4SmdQaUxFWWtXck9SYk05SGtzMkt1Rng2TFVxYUdQWU4wdWtRbVptSkJHc3VFdlB6SUtOWGxWSHlFMWxwa2ZTL1FXVGFNQWF0K0tKQ0pOQkdwQlVXUzU5TktuSWkwcFlIVlYwMWpNM05zRFEwUTE5V0JWVkp1WFNqNWJ5QklSZzZ1NkRnZXduVjFRaW5IVEdNalV1VFE4UzRldmIxSDNHd3NnNWJ5VXgrREVqclNtZ0JDdXZ4dmJNUnk1eE5XRm5jUVYvYWpVMzB1U3U1ellieVJpa3NyU0pRbHhaVVl3VzNYKzZxeHhxK3Y1d1N1MWtNQnB5OWlxOUxhdkdKbzBycTYzeWIyMzNPZlh4WTJJU3ZTdHNsVnYxUVg0QlBWTGxZck0zRFY4bVU0U1FOdGltTU9LSXpTUW9qbnF3VHE2R2xLakNpdUtvQWZTTkRhT3JwZzhabWd6K0JHR0drVFNnVXRzb3VQY2RNNWFwRWRrY1BaSzRLSE04d2szMFZsT3hFN0pNcjRXdkp4U0c5Q1Z2VGxkaVJyc0llMXRsT0FuRWRQZWxLZ25sNVpEd1pOUlBiVXRYWW1NelBwZjZucEN1d01VMk9WUW1KV0JZZGcrMXFXaFF5OWpxQ2RvTThIUXRFT0lvTmM2ZlhaTUJLOUlOUkZZNlN2RFRVRm1sUVg2SkRSWUVLZG5NU2RDbkJTSW55Z0NFcFNPcmljdW9UVUpTUmhGSnpHa3FGM0tkR1F4NGREQ01Ea0VtVGloSWIyWk9lMTJKSVFvWTZYdktyWWpSTWVFeVZOaFVKS1F4VDlKeUJFWUU0SHVnSjd4Qi9CRWFGSWpnbUhHR3lHUGdtUkNGV3AwSXNMVUJnZURoQ1FzTVJ3eFlYRnk5RGZISWFnWnFFQ0xhNGFMMEdrVm9WZ3NtMndhbkppSkxMRWFOU0lwUk1FS2hKUjdCYUxGa0lZRDl1SDBDR0RxSDB5NTJGVUREaHBoTjhNZ0hrSEF0aUtUWFJXVVpLbXhHZVpqMzh5Y3FoQkhac3JoVXBqa0xJeEdPUENMNUVVV244dkx5b2hKVmNKVDAzd1Z4VkIwdFRDN0lZd0RKYVcyRHI3MFZPVndlVWRiWFFkclFoWTJnQVNwYm9qblpzNS82Mk1wRDQ5NStRR0hSdHNiaVZaeE9XT2hyeGZVa1hsaGUzWW1WNVBiMXJBOVpXTkdOOVZUc085ODRnL1BSUE9EcHlCb3NkTmZpbXVCWmZPQ29ra0g1WldpLzFXYjR0VXJlakh1K1JSVDl3Tm1OaFlSc1dsM1hpYXp1RGxUSWI3OGwwK0VMMFl5YXBzVHlCZnBHeTdHOW1FS1VsMGpueWtVbmYzOURpUW1OekJmSVpNQ3VhR2xGUVVZVlVocXhZRWNERUExQk1GaXBTTG5TMEllbTE5VGpPOWVLcWtBM1J3bDhTckFUbmtRd1Q5dEc3Q2krOE1Wa3VBWEVUcmNGcStrOEIxclcwQ2l1aUU2WC90ekd3aWUzV2tueFd4c2JqKytob2ZCc1dnYTlEUXJFMkpRMGJTVlFiVXVSWW4weXdSZ1lmcGN6SG9McllqRng5UExLVUVhaklsV09zTGg5RDVSYTA1R3RRYkVpRWc0Q3J5RmFoenFaSHVVV0JnVm83K3JsTmEwVTJ5cDE2S0ZNSXRKQmpVbUJTTXYzclRjbFE2MkloVjBZaFRSU0dyaFIxSEQxcEpJTGpnM0U4eEF1K3NjRUlpSStBYjF3WXZHTkM0QmJtaS8yQkhqZ1U2b05ERWQ3d1NncUZ2eXdDd1dUZzBMaElCRVNHd0Rzc0FONVJ3VGdZNG91RGtRSHdvcjhOMEtiQlQ1V01VQjNCYTlRZ2lGWWlJRDBGUG1sSjhFNG0rNUp4QXdqaVlMVUswWlE4R1cxQUhMMVF2Q1dieTB4RUdlblpNclRTZmJ5aXlPNFJXU2FwVnlETVlZVXYvdytrSmZDbkRBVm5taENheWRkNkhVTDRtUWgrVnZqaEJLYmwxSkppcUtzcW9hdXZsWXFCSWNYVTNnSmpXeXNNN1cxSWI2aEhDaXMvdmFzSHNmU3lZalJJYy9JY2NzbTJibzNkMGszblZqTklyYXZvd0hlT2FpbDByU3Vxd2haWEMveUdUaUgxQ2hCekN0alRlQUpMOHF1eGtpSHQrNHBXTEMxdnhmdTVMaXlwNnNLU3VnRzhuVitITi9NYjhGNUJJMEhjZ1NVRS9rSkxLVDVXV3ZDUlRJdlBFOUt4VlBoRmxRSEg5Sm1Ra3huVkRGWmFLb3E5d29HSzZrSm1CU095K2Z0TGFtc2tzS3FvU01tWmJMU21UUGpUaTNyUmk0cmJUaDNoY25kU0tnSnk4eEZzYzJBWFFiVTlLUVVIeFQzTEVzbUdKSlpWOUozcjQ1S3drNkZyRS8zb3FxaEUrbFU1ZGluMFA1ZDBEYmFrRUpDSnlkaWoxa0U4NnNxM3NBaXJVbEt4WHEzRmVnSDRkRFhXeUJSWWtCRG1oWlJJVDJnU0EyQm1tcS9KVjZJbUp4VXpkWGIwNUtsUnFVbUVuWURKWlJCeUtPTlJvSXlGTnNvVGxUa0tGR2ZKa0tXT2hDWTlGQkdSeDNITWR6LzhvbndRTHVQL1pPbjR0Q0FrMC9QS3RmRUVzQXpKcW5qS2R4ajhDYklEbm9keE5NZ1R2akhjTnAyaFNrL3pucDRBci9ndytDU0Y4WFVzUWxJakVFTEFoaVZ3bTNpeWEyUVEvTVA4NGNQUHU0Y1NyR0UrOEVvaEN5c1RjU1F4WEhvZHFFeUNlMnc0L05KazhKTEY0MWg4Tkk3R1JjTTlKZ1p1TVh3ZEg0Zmo5TUNpZVBLRStGQmVmQlJ5Z3Azc3ExVWpXSzlGRUVFYlNNQUszN3BYa1F3M3ZSSUgxR24wZG5yNDBWNzRjaHQzSm1PeDlERWI0R0hTd1MrSHJHUFBRelF0UldRZUUzUTJHNEVBY1VVNUZEWFZTQ1lqSjVkWFNsY1B5d25XaExvbStKWlVJcUN1QmR2eUM3SGVWb1FOcFpWWXgzUzl2N1ZYZWdaV3dzeEZKdngyck15bUw3VTFZSTJ0Q2N1c2RWamxiTUZpYXhXK3NsWGgwL3dxZkdTcndhTEtIbXdjUElzM2JjMTR6OW1Pand0YnlhcGRXSmhiaFhjcC81K3BMUGlLS1h4eGJDcFdKNlJJanpjTkpGUHFLOHRocVN4RlZyR040Q3hGUVFremhqMExWUTExcUd4dVFRN1ZRNHdheW5Ob3BjaW8zZ1RQL3ZoRUhLQzZlZWdNOERTWTRhN0x3QjR5b0FEcWJzR0VaTm1kZkgrL1Frc0FLOGkyR2h3M1p2TmM2ckFsTVIySHRKbllrYUxHRmdKd2kwd3VnWGh6VWhwMnE3UVNZTmV6QVh6UGZTM2wrcS9EWS9GdFpCS1d4YVJnZ1lNZ0t0REdvVDVmaGJGR08zNGFiOGJGM2dxY2J5NUJaNVlTeGZTWjJWSCtTUGQxUTVyUFlXVEUrQ0U3SlFSV3NtVytKZ29aOGhBSnJJa3lQL2dFSDRaNzRDRWM5dHNQN3lBM3hDVDRjMzBvNGhLQ0VFODJqWW9LUUhpNFA2Smp3cERBZ0JRWlRlQ0crTUdYNjN3akFuQXMyQXRIUTcwUlF1REZKRVVnTXRJZllWd1hSbERIaFBJWWttSVkrblN3RitRaUtqNFNVU214U0ROckdhNVVaT1l3ZU5IN1JzaFRFSzVJUlNBVHJPLy9sVlI0cHlURG5WN29VRXdzRHRCT2VLU2w0M2lxbktCTHd4RytkMWlXaElPeVJCeE9vZm1ublRoT3kzQ2NZTnpLc0xlSFlOMUZUMzJVUWN6SGJJUlBoZ0dIdUU5M2pRcUhNcGltc3d3NFNwOTdoTWZtVGdzaTN2Zk0wT09vbUVWR0NRM05ZYURMeVdQSUswQ0N2UWp4QlF4cEJHWmtrUXR4OUx6ZVpMZWQ5Z0ljcks3Qktwc2R1NnFad2p1SHNZZitjMk9PQzE1Tkp4QXplZ1VIYTRid1hXWWxsaEt3YTF5ZCtEQ3pCTy9sbE9QdHZDcnBldndsemVONDNkbUdkd3JiOFVGQkV4WVZrWFgxVHJ5Um9NUENGQjIrSnFNdGpVbkFIcXBNQkJOMkFnT3NxYXdRdHFvU2xOYVhvNHloTWE4Z0I5VU5WWERWMThEVjBJZ3MycDhVa3dteXJCeXFrbGtDNnhISzgwRUM2cEJjQVRlbEZrY28rV0ptM0pxd1NIcldkSGpRMzI2UFM4QStNdVplMm9BalpHUC9iQnVPYUl4U1ArcWVORFYyeWxUWUpsTktBd0I3MHJVU2tQZXE5Qko0dndrS3c1cjRORm9ESmI0TFQ2UXRTTUxYWVlsWVVKdVRqZ2JLL2t4VEFVNjJPTkJkb0VCalpoTHFUVEtVTU9GWFVOSzduQlkwaWtrcktkSFFSdnBBUi9hc3MyblJVWjZOcWdJdDdKWlVhQWplc0VnUGVBZTc0N2ovSWNUR0IwS3JTNENPekN4bWRDWFJ6MFlHZVNIUTh4akMvWDBRRlVUZ0JyT0VCU0dHRWg4WlJ6dEEwSVlsUmtLZnBZTlNLWU1pTlJZR0xyTzBDaGpTazZFbDhFeE1wcGtFakZ5ZGprU0dNTG5Sd0padkpFanBiWk9UR0s2VWlDWklQQW0rNHlrcDhFNm5UNlVzQlpJRnZDa3JSM21DRDdIMTcrSEozVTZQdERrcUJ1c2lJbm1pdzdFNlBCVHJJeU93SlM0V2UyVXlIRkNrWXhPL2M0dFdqZzJxTkd3aHUrNGhHSGZUSDdzeG9PMVdjajA5K200ZTd5R3JCVHQxQ2h6UjY1Rk02UXgyT0ppQzlheElIWDJkUVhxTVVteXVuZDZZb2MzcVFFeGVBUlQwZk9iQllla0pOQ0gxZFlqcTdjS2UwaUs0MTlZaXZHTUE2L1ZXYkRZWFFUbDNBL2xrV2pHRGFtLzFBRUltcitKQTF4USt6aTJUSGp6OEhqMnN1UHhadWthL3VCMHY1TmJpblp3cWZHbXJrM29BM2tuVTROTzROQ3lLaU1VR2dpZ2t5d3c1TFk2eDJJNUNzbWxWU3pYYWVsdmhkRGxnempHaHBMSU1SbHFsVFA0R0phMlNMSVBCTnp0UGV2U3BqMEtGNHd4T0hnUnBjbGtGNGdyTGNKamhhVHVsZmovOXFwdEdpMDJSVkRDZWF3SG1JMG8xa2wzVktKaytLVDNQTE5oYWlOM0piUHpKWkZZZTA0YllGS3lOU3NLSzBHaXNpVTZRd0xvdGhkSWZSMHRCajcwK1RvVVZNWElzQ2lWWXV3bzFLRklFb2RvUWdkUE4rUml2TktBcFI0WWFwbjhyZmFZaEtSZ1pLUkV3RTdqcTJBRElhUnUwc2Y0b05NalE1RFJKL3RXU0hnbVY2RE1OODBaTUJKbVRSY3pTc3VYcVlNMGt1SFNwc0dhb1lhS2twa2FFSTRtZ3lDU29jZzE2QmpFcnFsd2xLT0RKRTUzOWNXUkxYYWFXakJ5SG9HQS9hZGFXeFpJSksxTjdCdjJtWEtOQkloTmlqRUlKTDRMcUdGT2pZRTRoNTRJMXR3WUdZNk5mSURad3VTWW9CR3VEQ2NDd0tLd05qOEwzUWVGWTRoZUVSVDZCK05vM0NGOTQrK016VVh3RHNOQS9FSjhHQkVpWDJId1hHWVZ2QTBPeElqd2EzM0QvWDlNK2ZKT1l3Qkl2elgvZHdwQzJuc3k4bnFGdEtlM0FNakw1QnAwV2E5UGwySzB4SUtxaUJqNzJRdXpVNkxIM1B4M2FCK1dVUXZyRTQyUVFmeVp3TVNBaDd1QjRQSU5NYmMxSEZQMWhlRU10dk1yTGtEbzZBdlhFRFB3cW0zREFWaTdkK242N3RRTExkRFlzczVSZ1Uza0wxcFEzNFgyTEhWK1VFcWpPOHAvbmxkb3I4WWFyVmJySDZWdFpMbnhNb0grb3lzSEh5VHA4U1VaYkVocUIzVlNQbElJOHFQSXlrRmVjaTVvbUZ4b1lxRHE2bTFCWTVwU0FXc0Q2a05IZnk0MUdKQnN5SUNPekt1bEpSWisxSjMvM29TUVpkbE9keEFUNnpRVG16b1FrSE5YODNDaEZQM2FNc3dqN2twT3huZWZ1WUZvYTVGUUsxOXhwT01lbkVlRW94YmI0RkJ4UTZta1ZmcjVmbXJBRHErbGxWMFRFWTVNc2pTeHJ3QjRlODliWWRDd0xqTU4zb1VrL2c3Vy9MQU05eFRyVVpDYmdWSWNUbzlXWnNDdURrV2VJUTE1V0NyU3FhQ1FuQmlFMUlRUXBCS3VLeTF5eVpiVlZKL1cxZHJyeVVKbXRSWkZKaVR4TkdzektOS2hURXhBYkc0aTB0R2draWM4bFJSSzRHU2lsZk9kazZHQ21mT3JrWXZoVmlSd204SXFxY3JocUttQzI1OEJVWUVGeFl4VUtLVVArc2JIWTQrRUp2N2c0QkZONjNNbUEyM3dDc01yOU9KYTVIY1dpZllmeDllSGpXQmNhaVMyeE1ueExBSDV5NkJnV3VudmgwNk5lK1BESWNiem41b0VQai92Z1UrOGdmT3diakUvOHd2QlJRRGplOVFuRld6NGhlTnMvRE8rRlJPSHRrSEM4RmhDTVYvMkQ4RGFCK2xsUUZMNE1pY0duYlBGditRVGhnNUJJYmhjaFhiQzRqaXo1bGw4d1FhckJkMHJCV29uNE1pRVpYL0VZdnVRSlgwWUpXMDZaK3lveUFldms5R2xLa1l3cGQwb2RmUnhEaERrWGZwWjgyTWVuVURwL0J0NjBDQWNKaWtPMERJZkpaRzY1ZVVqdDdvVlhZU2w5YmJYMEpNR0EraDVzenkvSHh2d3liSFA5L0d5RjVXV1YrSnhCWjJGUkdUNHNyc0NiRGhkZWMxYmdwZXhDdkpkWmpIZVVPWGdyVVkyUG1md1hNM2wvSHg2QlF3eWM4bndUbk5WTzFEUVVvYnV6QnRXVmRyaktuY2gzV3RIZTJ3MEhmWFlNN1ZFNlFhb2lRSlY1QkxmZGlVaHgwU2FCdVM4dUh0dkNJNmxPaWRoRTZkL05KTzlELyt1cHo1QktVSFkydHJHQjd5Q1plRkNCeEZQVll3cUxFWmhuZzBlR0JXNWFJNzJzRW1zaTR4bkFlSTdZa05iRXlLUmVBdEc0eFNNQTFDMjk4TGNVa25XVHNUcFdqdS9qbGJRQk5oVWNoZ1Fvb2oyUXovU2VvNHBFUXNSUkpDWDZNc2xISUNFNWxHaytoa3dYQnJOUkRrZXVBWGF5cFppOGtxZE9nSjBNYXRlbUlFY2hneTRwSG1reFVZaWpGL1VPUGdiZlNHLzRoSHZDaDR3cnh2OU51U1lvOUFyNGh3YmlHSzJBWDJRb2dwTmlwVzRxdDhoQXVETmNSV1ZwWUtoeFlTL2xlZkdCSTFoMHdCMWZzbngxMkFOZkVvUWY3SFhIUjI2ZWVQK0lOejQ4Rm9EWEQzcmhUWGMvdkhqQWt3QU13MnZIZy9IS01YOENMQlF2dVBFOUxsODZUdmFNU2NWSDBjbDQyU2NjcndiRjRBWC9LRHpIOG13d1gwY2s0SG1XcDhKaXBmSkNSQnplb2xkNkx5d2Vid2RFNFZXdkVMemdFWWhuUEFMd3ZGOG9YZzZQd1d2YzVpTXl3M3VVc0E4WUFCWlMwc1JTeU8wN29YSDRPQ29WbjFLK3ZvaFQ0TU93Qkh4TDhINGVub0Fsc2NsWXg4Q3gxMlJCOXZROEdpbnZubVRaZlZxR0ZJSlpQSmJVSzhjbTlWTWVwVS8wb1d6S3V3Ymg0V1Q0MG1aaG5TbFhtdG4vTlFQUzBqd3J2cVFmWGtpd0x5NHF4ZWZPVXJ5ZjU4Um5CZVY0VjVPRDF5aWhIeVpyL3g4TEVFYzdwSUNwaUl6S1ROTGVWb3F4Z1FhVU9relNoSHN4dDZLbHR3ZWxEUTFRV3l4SUkxaHQxWlR3OWpZa21pMXdKMGk5S08zK2VnUGNTQjZDV1FWN0hrbm5PdnJaRUFKN0sxVnBmV2dvdGtSRjB2T3I0V0ZnNDh4aytIUVdTZ01FQWJRLzYyTVRDZEk0YkVoTWtaaDBMUnY2bW5peXRGeUpnOFlzSE0rMXdaZStYdlFTck9YNTJwaEtKVXZQd0FJZEpUdzY5RGdpUXoyUkltUGlEdkZBT0gxcFpJdzNZaE1ERUV6QVJjUUZJVUVXQVVPR0VtYXpDaW1KREQ4Qnh4RWRlQnl4WE1ZeUJNV0hCU0lxTkFoK1ByNDRkUFF3Tmg3Y2ppUGNqMGoxb3Z2cFdGUWdqb1FGWUxlZko5YTc3Y2VhSTRmdy9jRjkrT2JBYm54OWNEZStjdHRETU83RlZ4NEg4SlgzY1VtbXZ3MWh5MHRVNEdNQzdMbDlSL0dTdXk5ZVBoYUkxd1VvZlNNSnZFZzg1eG1PWjczQzhiaEhHRjRLU2NLclVlbDRPU0lGcjBmSThEYjkwRkpqUGo1aXVOaFFXSVhrOHovQmQyZ0d6MFdtNGdOdG5sU2g3K2h5OFU2R0ZXOFljdkd5SmdzdnFUUHhCa0h4dnNJa2ZXNXRWZ2s4Ry9vUU5UaVArT2tMMHNTTUY3amZMelB0V0p4cHcxdlI2WGd0T0FHdkJDVGdqVEFaM2lBRHZCS2RodGZDVS9DaWZ4elhwZUF0SHMrN01Xa3NLZmlBTFBKNmNDVEJuUXlQaW5wRXRmVmdoeUViaTBKaXNUNVJoYlV4Q214bXNQQWpZRDFNUDQvNmlQNVE5MnduM1BJS2NUQy9CR3YwbVZqRDk1WXp5SGgyZENCMGZBSXJHTkErWUVBUmR3ci9Nak1mNzZVWjhFNlNDcTl5dnd1alpWaEtnTVNVTWRrNzgyRjJXTkRjVm9icHNSWjAxVGxRbEtkQmJwWWF2ZjFkR0owN2lkYUJJU1RSYmlteXNsRFMzSXlDeGdaRU1LVWZKQkNQRTZUaFpQOUVCcThqREtnQ3JFZHB5OFF0KzcwSjRvMmhZZGdZRmlxRjAwRDYrS01HTFE1cjFWS28yMFpyc0l0Z1g4dVF0NXdXU3dCMUo4T1hLRnZvZDdmUTJvbCtWVEVJSUZreEttbDRlVFdjRjY0alkrWU1GaHoxT0l4Tk96ZmhvTWNSQk1SRTRHaElvRFFoT2o0cFhKTHhlTkhWeERRZUVNeFFGQnNtelhieUQvREM4ZU1IcFhMa3lGN3NQYkFUKzl3T3dNM1BCMjVCUWRqRDVWYWZZOWdUNm9PZG9iNVlmZXd3RnUvYmljWDc5K0M3STI1WWVzd2RueDg4aUlXSEQrRmpOemU4ZStnQVh0MjdDeS90MjRXM2o3dmgwNUJnZkJxUmlHL1N6ZExOaU44bVF6MGRHSTJYV2VFdnNyd1FMY2VyaVRxOEZLZkdPM0lMM3BKbjQrVlVNMTVNTStNMWJUNWVTRFhoQlZiOEJ3VGU5cm91ckJERGxJMTlDRDN6RTNaM1QrSWhBdXo1ZEF1ZVZtVGhLWlluVlJZOHJzckNRd1RvdzBvem5sQ1o4YkcxREx0YWgyQWk4Mlg4QU95djZzZk95aTdzYmgwbGt4WGpNNGFiSmJZS2ZLNnhZMVZPQmRibTFXSnJlVHUrdGRmZ2ZZTWRuMmhzZUR2UmdGZGlWSGdyeFlEWGVEd3Z4YVhpMmNoRXZFZzJmb20vNzEzYWhVOEl6Q1dwQnJ3YkVJc3Z3MU94SWxHUE1GY0xTazVka201eHBHSFEya0xRYlNGRHJrdGlrTkZtWTVQV2pOM1pWcXhsQ2c5c2FrRnMveUMrNSt0M3cyUHhXVUk2WGdtS3hGc3h5WGd2S1IxdmhzZmhzK2drcVJjZ3BxUVV5c0lDNUpYWjBOcm13c3lKRnRRNE0xQ1VyVUJGcVJWREkvMW82ZXRIZG9rTGtXbHlSRE9jaWdHQllHWUNOM3Ard2F6Q3M4Ym1NOWtUdEpJVllFamR5OURtbHBxS285eGVMTVdFbHdEYU85K2NMT3hYcHVPQVNvRk5aUFd0REsycklwZ2RhRWZXMGpxSjBTMHh5dlY5ZEN5V2N2MEdnbG1NWUsyZ2ZWakZSaUJ1cXVKdXlZTjd2Z01mQmtSaVFXUjhOQ0prOFFnUUVzR2RlVkIrandRR0lqb3VIQmF6R29XRjlDdE13YkVNT3FGUllVaWxKdzBqcVBlNzc2ZTgrMG5BOXFIc0h5U3I3bVhaeWxDejJ0c0h5NDhmd1JJQytETUM5Sk85ZS9EcGdmMzRsTUQ4ME8wSTNqbDhCSzl6K2Z5QlEzaHkzMEU4dy85Zjh2REM2d0dCZURjaUF1K1NCWjRMamNlVFlVbDRPRnlHQjhLVDhHQzhBZzhucWZFZ3kyTmtqWWRaZWZmR0t2R3NPZy9QcUhJSnRtemNTNUErb3Mvbk1nTnZtZXg0aGNCN2w4ejZLaG4wUzRhVVR3dHE4RFI5M0dNRTl4T3FQRHpHeno2dXRlRlJBMHRHQVI0enNXUTY4WFNXRTg4YmJkeStDdnU2cDdDamJnQWZLUEx3YVVZaGxqanI4THpjakRmNFBaOHc3SHlzdFdPWnVOOG9RU3Y2UHQrekZPRWQ3dU5UTXJLNDFjNDN0bXBwV3Q1Ym1tenBBWFh2WitUaGZWME8zcERyOFNwQitGSjBLbDZQU2NmYjBTcTg3TThHeXU5SkdUNGpQYmRVWFBJczd4ekZZZ2FNcjhPU3NaaHN2VGdpRmNzSS9QV3FER3pVR2JHRi9ua1RMWU80N0h5ZHlvUTE4Z3g4UTh2eFFSeVZKVG9lSDVIQlA2R1Avb1psY3l5SlJpV0hwU2dQd3lOdEdPK3ZRMGQxUGxvcThqQXkwSXFhdWtvWTgrMDR5SUFhUWM4YXk1Q1YvQit3QmxPaXc4bWNSMlVwOEdIQ0YzMnQyd2t3TDZiK1l3VGNNUVdUUDhPVUZ4bjVHRC9uejFDOFh5bkhWb2JTWGFuSkVyUHVWNnV4bHNCY1FjWmNMbklHbVhWTEN2MG8veGZnRkJOaDltZGtZQnNCdTVPTjRsaG1Eb0pMeXJGTmIyWkdDTVVDSlVPUm1LM3ZHeEdDSTBIK09CWVNDdC93TUFRRStrQ2VFZ2RqaGhZSjlLS2hrUkVJakNMYjZuV0lVOGpoRVI2RVVMSnN1Q29OUitOanNEazRDQ3Y4ZkxISWcxN3lrQnZlM3JFYmI3Rzh2ZWNBM2oxNEJHOGNQb3FYRHgvRGMvU2J6eHp6d1NOSHZQQ1lWeUNlRG80bTA4andQS1ZLc000ekxFK1JnVjVRbXZDazJveC8wNi9jbWFyRXJXbEsvSTRuK3c4OCtmOWdxdjZYem94Ymt0VzRtOXZjcFREam43cHMzRVladjk5YWpFZHluWGc5dDBoNk1OeVNpbWJwaVI5djU1VGlPYjBOOXljYkpKQStwTWpCQStwY1BLREp4MzIwQlBlSjl3ejVlTkJjSUYwR0xLNE5laW5UZ2RkTURyeEtzTDNCN1Q3THE4U1hqanE4eTVRdHltSm5BMWFXZDBvMzBuM0g0TUI3Qk9nN1pOekZsZTM0Sk05RjluVkpnUDY2b0JxZlpwZmdtOElhTExKWFNMZW0vNjY0RG50N3hyR3N0QW12czZHOWJ5akFHMnhJYjJ1czJFYVF4NTQ0TFYzNnZFS1RoeGM5by9CT1NBcXRneGF2ZXNmaUE0SldlT2t2bUtyZkQ0NlNndUkzOFhJc1owUCtscXF4Z2t6OWRab0s3NUo0M3FjM0ZHQmR3akR6SFVQaGpwQVFKR2RvME5GVmk0N0dJb3gyVmVEMFpEZXVYSmpEMk1RSk5QZlJBaEFjZ2ZFSlpGVVRERTRuRXN4R1JESTRoVE5nK1JLb1VaWWNlS3MxclBNUUNhUVJ1Ym1JczlseG5ONVY5RmtmVnlxbGZtYlJCYmd4T2tvcWgxUnFNcXhLR3VYYWxwd3FsZlZrWmNHMHF5TWpHYkppc1kyTWZNaWdoeThEWFZDZVEzck1xSGoycm5oNDlKZk1Cd3ZFeFgvSnlWSFNGYW5SWkVsUGYyOEVoUWRMYktwUXBpQTVWWWI0RkJuaTVHeHBwUGtFblZhNk90V0RRZXBJWkJnMitYcGkwZjU5K0dEM0xyeTMvNkIwLzZ2WENNN1hEeDdEeS91UDRGbVdKdzhleFdOTTVRS2NUNGJHU0dDOGx3SG1pVlE5WHNtZ2JPdHpjYjlNalR2bzdlNUpVT0ZKc3RDZDBTbTRqMG42YjB6WXZ5ZEQvSUd0OFBjc2YxTnFjYWZCZ3IvTHRmZ0xKZSt2OUxTM2NqLy8xT2ZnRmcwQnJNM0VQL24rSTN6OWhzV0J6WDBUV0ZoV2owZlNUWGlRalBnNHdYQlBpaEZQR1oxNE1yTUVqeE5nRDVtY3VKL01Lc3E5eGdMY3gyTzZtNDNsYVVzQlhpWWJ2cERsd01zWmRtbFljMnZIT09KcEM5N05jT0t0REFlK2N0WmpiY3N3UGlJZ1AzQlU0dzJDL0pQaWV1d2RtY2RIWXBZOFFTcm1rMzZVV1VqN1VFcXdWdUYxTXYwbVdnei9jejloV1UwbjNzK3Y0R2RyOGJHNGcwbDJLUmFXTm1OcFNTUFdGRGRMelAxV2FoYmVUTGJnUFhrT25nd2tZeVpvOFNidDBPc01nRytHeHVKVGhoQXhtZm16aUdSOEZKQ0lENFBpcEI0S2NRbjYrK0wrWkRJRnZ1UjJxNlBpc2NrL0VQRUdEUWFHMm5HaXJ4Rnp3ODJZSFcxRGxhc0FydXB5Nkt4MmVORXloSk1sRmRrV3BPZmtJSVloS1VTbGtib0h4WVJzTVZkaWIyd2N0bFBPQlpPSzJXeFJ1WG5TQTFHOEZPbndWQ3FrZTBKc1lNamFSaEFLMElxaDJWMzBvbTRhMGZkc2tDYTg3SlNsSXBBaDBUSXdDRk5mSHp3elRkaVdsSUJEM0dkVW9RdWVXVFlzajByR2k0ZTg4S0pmQkJaRWVlOUNPc05VampZZVdkb0VXUFRKc09YcW9kU2svRHpSSkNxVVRKcktnMC9GTVVyMDF1UEhzSGpyWnF3NmZJQUI2UUNXN051SGhidDNNNldUUWZlNzRZMERSL0g4L21ONC9yZ2ZudklNd09PK0lYaWNyZi9SNkFROGxKQ0dlMlJLL0lPdDVMWTBIZjVFWnZ4dGdnSy9vYXhKSlVHRDN5WnFjUlBMbXdTR2tPRkhtQUwvUVc5M2wwS0wyOGtXdHlTbjR5OE1PUGZLRFhpSU12OWd1aEV2WmxGNnlWUXY1SmZoWC9TYkR6QWdQYTIzNEVtbEFSL1lYWGd3Ull1YlF4SndmNm9SenhCZzk2ZG40Vkd5cFpEK2h3bGF3YXIvSW9PSmNxZmFnanZvWFI4bjBCKzMyUEdveFlZbnNndndIUDkvMmV6QW9zSUc3T3VaeGU3MlNZbE5uOWZrNGhWTElaNm0zWGlSYlA0YWoyR2h1QVZrdmd2djVoU1JZY3Z3U1U0SlZwUzE0TmpvR1hoUFhzU0tjdkdnaURhc2FSN0NXM25sZUo3cysweCtPWjRzcU1EanptcThVRnFQNThuUUwyUVc0N1hzY3J4a0xzTnJXUlY0MzFxTEY5VjJ2RXpiOHl3QisyaG9ISjRsWU45ZzJuODdLZ1Z2aENiaWRmOEV2T0RKQU9vZmhFOWlZL0JoVkt3MGNyVXdNQklySXNsZVlSSFFGTmlrZnRXeHdWWmNtaC9DNUZBckhMWk01Tmh5RWFOUUkweE8rVGNhb2N6SlJxeFdpNVFjQzVJSlVBRlc5NlJrN0FnTng2Nm9hS2xYUUV6TzltVEFPa3A4aUhrVFBpcWxOQnJvenJCMG1LRGRTYnV3bHl4NklFV0JIVXo4WXVLTHVBaFJqR3h0SVFtNTAwYkl5aXNSVjFLTWZiUUxPMG1FM3VJSlFIbDJMS0hmZnV1b1AxNzJDR0pnVGNJQ1hhSVBDa1YvcWl3WThzUkFPSEkwc0ZvTlVKazFDRW1KeHg1L0x4d2lnNjVtS0JMQVhMenZBRVBTVVN5aDFDOGhpMzU5eEFPZlV0N2ZQbmdjcng3eXdHc2VnWGlWWWVpcFlESW8vZGhUWkw2SFdmNlZJTWR0Z2dtVFZmaFRxZ2IvUS9QLzN5bHEvQzlCOTk5eUl4WWs2N0FnUVkwRlNWb3lxQjZQVWhwZnBTei9tOG42THJMc3c5enVIbjd1bjBvZEFXbkV2K2o1SGxWbjRRRUMvRFd6RXgrNUd2RnVTUzBlWXFoNndaU1BONDFXYVJyZDd1Rlp2SmxkaUVkVW1YaVVqUGF3aXV6RUFQUUlKZmRKSFlISTF3L3ArRDBNY3YvS3NPRnVmdWVkRERIL0p0dmZvN1BnUHFiK0J3alVleGpDSGxQbjRGdXluOGZRR1VSTVg4RVNzdVhiM08rTGFpTWVVK2p4YktZVm45YTFZdHZVYWJ4SVZuN2Y1c0lIbG1MYWhUcDRUbDNDOTFVZERJRDB2dFp5TW13MXZpdHB3dGNWYlhpYy92aCtzdmR0L002bmFRdHUxMWw1TEZZOFJCdnlRWFVmbnMydXhtTVp0REZjaW9rcTcyU3pJZEJYZjVWZmlpOU1lWGlMNS9YVmlDU3BOK0tka0RSOEZKYUt0d0pDOEdhQUw5NExETUhIQk82UzRIQXM4L0tYRXIyVndMRFpzbEJUa285THMwTVk2cXBIYlZVSlZHUlF2NWg0NmJMM01Ick1FSWFsQTBFTTNBU2VtTVFpNWxPSXJxdHRZVCtEMVozYmlJQzFpZFppWjNRMGdtZ1hEakVrN1k2TlJYcFZOWklZNkhiU3VvblJRdEVmdXowNlRycUVTTnozVjZ6YnhvYTBoY3d2ZWhSMnhjZkJqYXdzS3l1RmRXd01jVTJkV01SR0tIcCtYdkNPd0ZQZURGaHFsYml1MzArYUxlWFB3QlFTSFlLUWhCaTRoWVZpQlVQUWQwZmNzZmpvVVh6RTlQN3hrZU1zSG1SUWQ2WjRIM3gyTEloSjNnOXZ1QVhnQTdicTUvMllRaWxIenpFTVBjTjAvbUJpQnU2TW90K01Tc2N0VE81L1k1cjlBMFBGcitpdkZzU2s0bjlUK0Q4QnR5QXVIYjltTVBnZnB1Yi9UdExodnlKVGNGZXFGZzhRbkEvU0ZqeVdxTUhEVE5VUHlIUUV1d0ozbUxMeFlBNVprYUFVNjU0Z0c5NnJNK0UrbnVUN0NaeTNDWlQxOUllWkRDZ3hGNEc3R05RRVVOOG5vejJvek1aemxQVG41RmtNWHJtNEx6WWRkOVByM1d2SXc3MzB0bjhqdTk1S0FOOURrTjVEdHZ3bjJmZHV2UjMzNngxazYwS0pUYjlrdU5wT3VmZXFhRUJFVzQ5MDU1RHcrZE40aVo3dTBheHNQT2tvd3FNNStYaWRZSDA3b3dpTDhodWxoejQ4UVRZWDdQdVMyU1k5Qjh5dGV3eEx5eHJ3ZkNZYml6a1A5MmNYNHlsVEJUNnRHY0xxMlF0NHhGYU11eFZaZU14WWpHZXRnbTFyOFpUS2puY3phU2NjNVF4dUp1a2hlTitxTS9CRnFnNmZ4V3RnbmdFaWFvZnh0bmNnM3ZQM3hhZCsvbGdkSG83OVpGbVBxQ2dVRkJXaTNHbEhIVXN2Wlgra3RRRzF4WTZmaDdBcHYySmtNTWxvbG9vN1dkaU53UFJtOEJZOUFZZkprbTZKeWRoS1p0MFJFNHREQktzWXNsNUhyT3hNVE1BdVN2aVdtR2l5S1VrdUlSRkpoY1hRMVRYQW5XRko5QmlJM29PQURKTUVjQkhPTmdXSFloLzNLY0R0ejJDbHJCVVBYNm1EdVc4WVlXSW1XazR4WGhHNENvakRTejZKeEl3aUdvZUNqbUduenhGczluRERXdmREV08vbGdRMEJJakFGNE10am52and5REc4NytXTkY1bmFYMlByZk4wM21PQ014NnMrRVVSOUpONWhLbjhsUm9HbjZhT2VTOUhoU2FieGYwUlE2cU8wdUMxR2c3L0hxUEhuR0NWK3oyMytFSy9DN3duWVAzQzdmMU1teFZLVXYxQjZGMURLZmgybndtMlU5MzhRcUxmRnlQRFAyRFRjSDBkMkRrL0hVMmxtS1ZEOWtSN3NkM0VwZUpDcCtxRUVQUjVpSmYwalNZbjdtSWp2SThoZk0rYmhPN0tPMStBMDl2VlA0bW1sQlUvVGw3NXNxNklGc09CWk11a3J0QUxiNnZ2aDFqdEZiMW1DWC90RjRYWUNXanpHNWs5a3Y3dklzSGZ3LzV1VnVmaTdJaGQzcUcxNHhGQ0lOODJGV0V3bXo3cjRnelNadXZaSG9QSW5TSGNwL0VoaHdQdGs0VThxRy9FWS9kYWpCUHRyaG1LR3NYSThaeUNBQ2RhbkxFNjhZU3ZCcDl6T3JYTUVRWE1Yc08vRUhGNjBsZUtSekNJOG4xV05WNjBFY0hFRi9tM0t3a3RrNXBjekNYcG5DOWxhQkx3V3VBK2RoZC9VT2VrSmpHS0FJUHNHa0VKd0wyVkQvREpRaFEvZG92RytaeUJXSlpBbHF5dFJORHlFOHE0T05IVzBZSHlnRjYydUV0UllzOUZXWElUYWdnTG94V1ZEQkdRaVUzMDhtVTlmV0lSWVNyd0hBWG1RZ2RzaklRbkh4SXdxZ20wTG1YcUxzQUgweFB0VDByQkhsb0wxWWlDQUFYeE5SQmlXQmZwTHJ3TXpzNlNIaFJnYW1uNmVqOEh0dHRGRzdtQ0RFYUZzUjBTazlIby9mZlZlZ250dlVxTDBtVmlIRTZsTjdkaEwrL1llVmZOSnYxZzhjQ3djcjhWb3NlRGJBMXZ3eGI0dCtIalBGaXoxcHJ4N0grTVgrdUdqdzRleE5EUUNDMzM4OGNaeFQzekNaUGxhYUJpWlU0YlhlWkRQMDNNOFRnL3lSTElTenhOQS80cE14aVAwaHZlUlZmOU5RTjRXbVk1L3hHbHdwOHlBTzVNSjNpUTlicUVYdlpreWYzT3lGcjlsR0xpZjh2ZDNHYjBvd1gxcnNoNTNwcGx3SzRGM0N6OS9hMHd5N3BDbFMxNzFIN1FNOTNOL2o4ZnE4QmpEeHI5bEdaS2MzeEdhaHJmUzdWaEVlUlJwL2FrMEkxN1JVejRaMWg1bUVIaktrbzJuTS9Qd3VNRktiNXROejVxSmZ5VmxrSjJzV0d5dlFlSThVRUxBN1NycnhnTlJHdHd2R05WUmc1dE1CYmlkakhZSEFYMHpwZjl2Qmh0dUpVRHZvZlErdy9mZTFtZGpxNk1NMGUyOVNHenVRSUN0REVIMk9tUU9YWlR1dWlJbW5SeWN1SVRYQ212Sm12U2pPaWVlTnhmakxZYW81ekxwZjQzWldPS3Foc2NFdlc5ckh6NjNGT0V0QXZVVmF6WHVNNWZpQ1VjOW5oSTlHa3pFb2VlQXdPa2ZzZFRWamZmTUxuaU5YRUxLWlNyRzJSL2cwVDJLMEw1eEtFOWZ4ZGNhQzU3M2ljUkgzaklxWGd3K09IUWNlNWl1WSsxMkpGak0wR1Jub2JXOUJkM05EV2dzS1VSUGJRVkxGVm9KWnBQUmdLaUVCTVNLU1VBNlBVTHBJNzNKaktKNDBhTUdNL2tIRWNTN0NGWkJZZ0o0RzRtTmRTRmgyQzA4ckJqSlNreGlZRXFXUXRWT2VsWnhxVTlVZ1ZQYWJwTzR6U2x0UXhoRG1CZzhPSlNhOW5QZkxEMndGNzl2TndIclJxOHJobVJMcG1lUk8zMVM2aTkra2tUNGxGYzBuZ3lSNFRsYXN3VWY3ZG1HejkwUDRzM2QyL0daQjhFYTVJZWw5S2lmQndkakVkSC9lVWk0ZE5lU3BRdzNYeXMwZUQ5VmdmZVk1aDVuUzd1ZmtuQlhRZ3B1ams3RUE4b01mRnJKMWs4cGV5Q2RERWdQZWdkbC94K0phdHpGMS85S3k4RGRsSHF4N2haSzc1OHB6WDloK1VlOEVuZkVLWEZUWUR6dUpxdmVHU25IUGRIcGVEQktqa2Y1T1JHb2JtR0RFUDJwajhWbDRLRTRBNTVXV0hGM0lqMXN2QjdmRnJUaERSbERUcndabjJlNTREWjJYcG8xZjF0Y0V1Nms4ZjhidzhYOXVqemNKOC9HUXdUcE0za01La3piZ3FXWDIydmhXWDhDbnlSbTRRMWRJUjdVRnVDditnTDgzVndrU2Y4L3liQzMwQ3JjeE9WZjZXZHZwM3cvYU03SDg2WWN2TW5HOEgxT0xwSW5wdUVVRDlNZ1FITW1BR1hIWmV4Mzl1TVZNcWxvZk0vUVg3NW1xOFhMWXBubnduUDgvRXRadVhnLzN5RmRRK1U5TUlXdFpXMzRRT2ZBYTdrRUs0RjZNNFBjVTdReUgrYVhJSnhnOVJ1L2hDOHNaWGczUFFjSHFnZXh3OVdGcjJoWmRqUjFJKzNzVDlqdmFzWXJnWEY0NWtnUXZnaEt4ZHQ3ZmJBeExGb0tPNzZwTXVqdE50UzFOS0RRYVpQbWJiUlIvcnNicWxEdktrSWpBYXMzRytBWkdveHdCaUl4RFhBWDJmUkFSRGlCbWlSZElDaXVyRGhDa2xydjQ0ZDEvb0hZVDFCdUVwMzd2djdTSkJZUm9IYW4vRnhXQmdkaFZVaXdOUHRLL0wvNG1BZTJVZlk5RFViRUZSWFJsNHJRRlUrdkdpbTk5bUdRV3gwVWdyMXBjaHhVYVJGZDRzTEhuajRNNkFGNDBpc01Md2JMOEI3SjVuNmU4d1Z2NzltRGJ3S0Q4Q0hEa2lqZjBKaC9Rek84N1QrM2lQUngxY0pNeWRFUHprSFZQNHN0ck15RjlKL0xtVmEzTnZkamJkdVFOUElqd1BuUGxBejhqZjcwSDJUUVc4aXdmNDlOeGQ5aUNHWXViMmZJdXBOKzlnNzYwOXNadk81a2NMb3pNaFdQTTZGL2FLM0FWMHpad3VlK1FaQnNxT2lDbnBVa0dPOU9ibjl6c3BxZWs1NHUwWWgvRTdCM0VLUjNFSUQvVUdjVHNCbTR5MGVHdCtWMmZLQngwbE1XU3FOVFQ1R2hQNlF2dklmaDdaWVVQZjRZVGVBbUczR255WVo3Y3h6NEp5WDdhYTBGQzAyRmVGZVpoNWROeFhpRTN2QldwUTEzWlpiaHo0cE0vSTN2MzBGL2V6ZFQrZDIwQjNleklZcjdoZDdMQkh5dlhvVXZ5VTdIWnFmZ05qaU1aYzRLZkp6aHhKdjZJdHdUYThCRFBJNjcxVlk4elBQMVlvNkxZQzNEeTRLWmpia01kMno0VE1BYmFocWxpd0s5VzhheHlzbEd4N1IvYTE0NWJySVU0aW1HcTRYT0tyeHJMY0hySml1K3BRY1hUMlBjbGxORGoyckhxN3BzdkdNdEpHaEw4R1k0ZzA1T0ZiNk5WdVB0bzZINHlpZGNtbkNpc2VkTDk4MVY2dFhTckRacmpoRkYrUmFNOXJWaHNLY05YVjFOS0s5eElVYWVqQ1Bob1FoU3BjT2JnTjFCRCtvdFQ0V3ZRbzRvY3laQzZTZjNSRVpqaTJEU0dQcFNocUlOb1ZGWUtmcHRxYTc3U1dEN3FMYjdVK1VTTUxlUmtjVkU3S1ZpMWh1M1BhaFd3NTJBOXpWbndjT2d4LzYwVkxpck5GSjMxaW8yaksrT2UyRUhQeHRSV2dGOS81QjBDY3NiUjRQd3FtOE1TVWlGTjNJTGNhZVpZQldkOVI5NCtPTWRkMjhzQ29uR2NaNkFwSTQrQkZQZXZLc2JjS3l3RXY3RjlkeFJLNnF1QW83elFGelBIRFlYMUdGMWFRcyt0cnJvSzVVU21QNU5zUDJkWHZWUG9jbFM5OUxOU1dtNExVVWhkVlhkVG9hN0t6RmQ4cFNQSzAwTVgxcThSNi80SEZsWUpPYXRyU040bTE1U3pINFh0d2N2cHhmYzcrakFiZUVwVWgvcTNTS05HNXlVMFhMY0xqUGpmOGpZLzJESy96dGwvZDVFRTE0alVEYzFqdUhObkFyOE01cnNieXpFMnBaUnZGYmNnTnNJNnI4bTg5Z1VPYmdwSXcrLzFSckprbGw0SnJjQVM1eTEyTmN4UVJ1anh0MXAyYmdsTFI4M3BlWGdOcE1kZDJRVlVQcUw4RzlqRWU2aVo3MkRWdUlmNlFROHJjbk5sTHAvS1ZMeGJLWUpHd2FIOEhwK3NXUTM3bFBsNFNGakNRTlpJWjZreDN3NnB4SXY1WmJqRTJjOTFqVDI0ZERZUEh6UFhzSWVBbng3WXpzT1YzWktEK3lOSFA0QnkycEc4VHVlZzV2czVmU3JOcnhnTGNaOWVqWmdjZi9VdVhQUWtiM1ZwNEdBdnBONE1FMUxxMlBHMHdsYXZCb3F4MDVUR1ZZUXJPKzYrV0ZWY0NTVStWYmtGbGpoS0hHaWY2QWJ4Y1g1MEtwUzBGQlRncUgrTm5RU3FCT3pZNmhzcVlQTXJJUENZWlB1bzd2ZVA0QUJLZ3p1Wk5VRE1WSHdwVFVJWVNnU2M0SEZsUVhlZXFNMDlmS2JZOTRTV0RlRU04MVR4WVIzUGNBZzVjVnRnL050MktNZ3lIYVRDTW5FNHNxQmxjRWgySit1UUF3RG5waVVIcEtYajJNR0V4YTZIY1U2Tm9CVjNPWUlGV2NYNitZam54Qjh5WkQ5Vm5neVhxZkZmTnlVaTN2eW5GaXdpMytXS1hUNEtqRU5TOVBWMkpDUmhZQ0dWdWtoRUtxeGt6aklFTFF4blFtT2Z1NTRRUzM4YTN1eDBzaVFFSy9HcS9KTVBNVUVmMzg4dlNwQjh4RDk1Qk1LSnVoNFdnQ3lvYWpVdTJrUDdwYlRqL0wvZjhtWTdsblpUek80UE1FMC9qR0JLVVo5SG9wbU9BcFB3eE54V3J6RWZiNlRhc0hLTkFlK1VUcncxM0FaN21ieS96Y0R5VXVsVFhqVjBZZ255U0ovWlNML3ZZYmdva3cvYWF2RXJkekhuVEk5YmxmUlAxTnE3MUtaOEFTOTVIMHNmMVp4TzNrT2JsVVRDR1RHWC9HazMyUXlNdERrWW1OWk83SVlrRDQxVitFUmhZM3B2NHdlMVlFN0tNVjNtd3R3dDlHQis4bVl6MmVSL2NuMEIvclBJZUlNcER1Y2ZGMWNnMGZrV3J4Si8zcS9KaFAvVmxqd2dxVWFUeHRjZURHRElMWFU0b1dDZXJ4STVkamNmQUpSMDljUk1qQ1BVQUoyWlVVTlZybHFJSi85QWRsbkFmMDBzS051RG5lSUorbnA4L0EzSHZmZnMybEZXSjR0THNQNzFiVjRuNkQ5SXE4VXo5TGZQODV3K1h4V0lWNWo0M2dwVElIbjNJTHcybjR2Zk12d3U0Y1M3YXh5b2JHcEJsT1RvK2pzYklSY25nQzFXb2JXMW1yWUhGbkl6RGZDNHN5RjNKSUJXVllHakpVVkNOTHBzTUxEQzN2SmpqdkR3N0RCenhlYjZWSDNNR2lKSVZYZkRLTTBjZjA3RDErc0RnaWxCVWpHU2lyeG11QndxYzkwWTBRTURwQWhCU2kvWUNEL2poWnlFLzNzaXVDd255ZTRNLzJMK2NWdUJMSzVxdy9wRGMzU0pTOWlTcUM0Z1BEYnFEaDg0QldBdDMxRDhVbUNBbThrRS9EOC9VOVNDUitrd2l4SW56MlBaVG96ZlJ0VFhVNCtkaGVYd25UcEttdzA4YW05WTloRG55Ym1VK2FkK3dHcjFWbllZYXZBaHJ3eVBFV1ArUUlCKzB5aURpOHFjM0FmQThvYjVqSXNkTFNTNlRKd0Q2M0JQMWlSWWtqMFpzci9yUW5LLy9oVE5lNklZUUFMWThybmRoNnMrTlhOSS9oSGtFeXlBMjh3dFl0eDlXTzFvOUQrQUx4YzRNS2ZkUm40azhhRU93bll2eVFaOEREWjh6WTJtTjh4NVl2dzgwK0duNmZ6SzZXKzBuOFRqQThYbHVQZS9DSldQTitqUE45S2RyeUw4dngzVnV5ZmNwejRMNU1KZnlJajNwYW13SXI4R3BTUnNjSUpsc2NFcXlyeUpIYjdxNEUyZzcvOTM1bE9QSmhSaU1jMERyeXNLOGJuT1hWWVh0d3VQUUx5Q1RiVTV5MTJiSnc4aTAxelY4aW9SZml5WVJ6ZnRKM0VFOFpxdkZuV2l5LzZUK0pwcXM4SDJlWFMwNkMvWnFQZlVkMkNyeHpGT0R3MkEvbDE0SGpiTER6YXp1Q2JrZ0dwb2Z6T1VZMEZWSTMveXVVeGt5d0VxN3hhMzRCL3FuVjRoaXJ6S2tINkdJL3hJUWJHQjRQbGVERW9EVjlTYVQ3MERNQmF2eUI0eDhiU2grcGdObXNJemxvVUZWbWhWQ2ZCa3F0SGEzYzlhbG9xWWJTWmNTelVEd2NDZmFWTGdBSnBUUVRJdHhGWS9neFR3ZlNZb25OL3BTY2JnTHM3TmxDdXR6QmtDNUF1OHduQUlSS2JYMllPMW9aRVNDQTlLRmRKREx1WERDc3ViL2t1S0F6ckUyUTRwRE5nSzVjckNmcVZaTm1WdmdGU0grdGh1UnBCT1haRUZwVlR0YXV4MTJEQlJ3VHBxMGU4OERJYjNOUGhNWGhSYmNDTE5nZGVxYXpEdjFpSEMzWTVTcEV5TlkrQXRtNnNOR1RpU0dVTjR2cUdvUnFlUWxoTkM2SmJlNkNhUEFYUDZrYXNZN0wyYXVxQ1Qycy9WdEIvaWVsNHI4UXdSZnZHNDhVVUM5Nm5SQytsaEQvUHloV0ovbzUwQTYyQUJqY3hVUDB4SWxVcXR5WG9wYTZzbXlsWnoxdGMwaFBwWHNtdFlDakwrcitPK2tlVERmaVVZQlFqUGZlb1RmaTdLUXUvejhqRWYvSGcvNnpLd24yVTFidVlzbitYYktLY093bkNiTHppYXNHOTlMRmlJc28vMmFqK3JoQlNiOE1mS2MyL0phai9tcDZIdnloejhWOXNtQUtzZjhnMjQ2ODA5ZTh4dVBtMFRtTnRZUWY5Y3k1K201S0ozOUFDL0psSi9FL21YS21qL3Q4Q0dEbzdBVmlFUjBXdkFGbnRWc3JUUDNRV1BKanR4R3NWTFhpL3JoOWI1b0hYeS9xa2g1TDlpYW4rejdrbHVMdWdFbzg1S3BqdWkvaDdiWGlWaFBDR3RRQWZsSmJqcS9vVy92NTZQRTFnL3B2ZStHWTJ2TjhhN2ZnZmtzRUNaeDBXMEUvL2x1ZFNVaEdsQVg5VDZ2RXczeGRBZmM1VWhQdWp0YmpmTXc2UEh3M0R4OUZKV0MwU2VXQ0FkSnNsY2NjYXJUNFYrUVdaVU92RWpVRmlVZG5vd3ZEY01DcklydUlLWWZmd1FCd01Eb1JmY2hMOENiWURaTFpBRlZtMnBnRXB4U1ZZNCtlSGI0OGNsYWI5N1pjeFFERmtMZmNPa01EcW9jK1U3cnl5T2lRS2k0NzVTS0FWM2xWNFdIRnA5bGRlZnRqSmZSNWlBOXZPSUw0dEpnNDdJbU94UDA0R1AwcTlwOHFBRUNwbWNrMFRqdk84aUlzQ1h6M2lnN2Q4dy9DTVh3aGVZckI3bzdRVVR4WVZrM1R5OEVlcThZS2pKZFdVOWxhcCtGUTFJS1NoRGJySmVhUjBEeU8rclE5SGlYelJFN0RMWG95NGtRbXBXNmFTeGNWaVl4SFBuZjg0TFJjdk1LVy9RS2w5UEQwWGQ4c1lnaWhWLzFSbTByUFNKcEJOUkRmUXJTbG0zRXhmZXhzRDBFMEpHYmc5TFVzS0lYZnl2ZHNaZnY2dHpzRWpKb2MwVXZRZUswL01WSHBXalBtbnF2Qlhvd1gvbzJXRkVZQy9sWnZ4WjM3MmIvU1FmMkNxRjkxTHR6QjVpeGxYb3NOZnBPNlhpK3BZdVJiOG1XQVZYVkgzV1dzWWxFcHdTMllCZnEvTndDMVpabG9GTlY1VG1MRzl2QXYrRTFlbFJ2Wm5IWStudkFGL3liTFR0K2JqSG9MakRscVR1eFhaOU0wNStGZW1IYmRuV3ZFSGJTYitRRGE0aFd4L08xdjlQN1BFaVczRlAvVEZQTEZreC93Sy9MbW9CcmRhUzhueXBYaXVwQXJQMm92d0JNSDZhbEVKVmc5UDREV2UrMytaODNBclBkbWZHS0wrbE8zQTM1anlmMjBtaStqbzBZemwrTFdpQUg5VEYrRHYvRzFpME9KK051WkhGRlk4bzdIandUQ1Z4S3F2ZUVmaXRXTmVXQllhQksvRWFNaTFjcVFUcU01eU8vS0xjeUVqcXlickNOenlBbGdyblloUnA4QWpPaFQ3QW4xd2pMNDBrQkx2SHB1SVhZRmhPQmdSRCs4MEpUWlRydGNGQkdCTlFLQlVOb1pIWW4xWUJKWWM5OFlYN3NjbFh5ektjdjlRZkVQcDNoaVZnRjFVWjJFTGx2b0Y0cnZBVUt5a254V1hFNjNpNjNWQi9MNVkrbUNXeldUbmZiSEoyQktaZ0kweFNmZ3VMRTVpMVplTytqRlVFYXhzQUUrVGtlOHhHSEJ2SGdNdmxVV1F6Z0paU3g4UzZydmdsVnNNMDlDTTlLaHU0L0FzNGx1N3BRZWxiYy9KbzVkVk1nVFVRa0VRSzBabm9aczRBLzNZZWFsUFVZQTJldVNTMVBYeUdKbnVOcVp3d1hEL0lsQWVKRk04a0ZHQUIrajc3dEpZOFVmNjJyL0t5WEtzK0wrUjVmNUFnTjVFS2J0VjlKbXk1ZHd0UnBHTVpGYStmcGRzdVk0VkhqTjdIZS9UR3Z5ZUxlOS9rcFc0TGFjUS81MnN4Vy9vYjIvWDVPTzNvZzgzd3lxTmpuMVEzSVNWbFYwNE1IQWEzekZjaWZSL2s5NksvMld5dnpYRElRV2xUeHNIc1dwd0JvK1RxVi9qYi91QVlCRTNrdkNkdXlZeDFxOTBaR1U3dmE2dUFNOFlTdkIwUmhIdUp0cytxTFZKY3dqRWJ4RTlFWC9qZC83VjRzVGZIQVFVUGRWditQbzMvSzEvemlqR1RReFlDK2pmLzJRcHdUOXl5NlR4L3Zlck8vQktYZ250UktZMHN2VXB6L2s5ckFCeDdJOFUxK0Z4cXNqenRkMTRwcXdWZnljUS82Z3V3Wi9WTHR5Y1ZveC9wQmJnRHBVVDkya0w4WUxlaFEremEvRzgzSW9IL0pMd2RuQXEzdmNLeGN1Nzl0QTNoa0xqeUVaZWFiNGs4NVZrVUVPK0NWRUtjYU5tR1NJVlNZaFNweUZTazQ3WURCMEJHb1V3alE2aEdnTU9VSGIzQkVkZ3EwOHcxbm40U01sZmRPS3Y4dk9YTElBWTR4ZmU5RnRQZnl6MjhNTVhsT3Z2eUlBckJHaERvN0NUQ1Y1Y1c3V0U3eStsakMvanRtdkkxSHRwdFhhU1RkZjVCK05nWENLQ2RVYnBDdG1OQk93YU5vNHZqdnZpdldPK2VJV3MrcEpYSUY0T2pNRHJNZ1hldE9UakNkYk5ZOVlpM0U3UytLTWhId3NTcXBwZ0hUK0p2SkU1YU5zR1VjMjBMNnZyUWxMSEFId1lBcnlxNnFWblQ2M1JteERhM28yRWdURjRWelpoQjlua1VHRTkzS3Q2c2E5dUVFK1JUUjhpWTBwajdDeWlqL0ZoVnE2WTFYUUxBWFVyMy9zMWc5amZ0UG40SDVrQnZ5WTdpdVh2dWJ4Sm1ZVS9wMUxpVTdTNFZVNkdUZEZoWjFNZmp0WDNvSWpoeDZkNVVocWxFbmJpRHpJdGJoTlQrZ3lGZU1oY2pGdjUraWFHdHIvSTFIaWFMTGd3MTRWdkM1dndrcG1WSGF2Qlhka2wrQ08zK1EwWitOY3hTanpBaHZKR1RnbWVwUlM5d3VUNkhtM0JrYTVSQkF5ZHhldGFzcGpXZ3RzSXZFZkpqcStaS3NpMnhYakdXSXhYeFYxTktqcnhncjJHZ0MzRWJXd290MlJTb2luWnY2Y24vUTJEendJMmpEOWFHT2hvYjI0aGs5K2VWeVhabFVmekt2QktZUjJleStHK0xNVjRyNklWcjlHL1BtYXZ4U1BPQm5yc0JqeFVVSWNYS2p2eFZrMFBudUpuMzZ1YndHMUpkdHlYVW95bjlReHlER3dQS0F2eFRtWTlYbGM0OFRoWjllR2o0WGpQT3dwZmVBUmg0WkhET0p3YUI3WGRqR1I5R21RWjZWRG02Qkd0U2taNm5oSHlIQk1PQlB0Z2YzQUFRdFRwQ0ZHcHNKc0ozWjMrY1MvWmJ5dkJkRWgwUy9tR1lDM0J1TTR2QUJ1Q2dyQ01ubFYwL3EveUQ4SG5oOXdsTUlxcGhoOGZQSXJGWkZRQjJHOThnckNHWUY5TzhDMTBPeTVkbUxtS1BsWThQa3JNcmhLQmFwKzROSnVKL3dDRDJEWXk3U0ZabW5TSjl2ZmM3a1BmSUx4STBMNFdFbzBYdytQd1pyb09yNUM0M3VNNUU0OTlGMFIzQzNHMG9JVWh4blgyTXBvSWlvaXlCcHJkSmhTY1ptb2wyeHdrWXh3cnFvTHAvRlZzWUdMN2tpMWlFVnZoWWxNbWxsa2QrRkNmaGJkMXVYaU9ZTHM1TEJtM0pqSDlzd1dJMFo4SE5YblNPUHpOc1NyOEppd0Z2Mld3K25XU1hnTHBnc2cwL0MvQi9DdVczN0Q4bXAvN1ZiUWNONGtCQkxLZzZERjRSYUhGSnpJTi9KenQ5R0s1ZURQV2dBOHQ1WGhhYThjRHRCdlBNdXc4cHFWL0pFRC9vcUNzMDJ2ZGxhNG5HMllUWUhtNGk3NzM3eWttZWt1cjlCMi9vaVg1c3paYm1rNzRFSDN3NDVTWU55MlpXSnBYZ0l6VFA2TDZBckEvcXhFUHhlaG9YWXdTc3o2YlZ5MDkyZmt0WnlQZUlhaVd0bzNoM2RJMmFmMERHU1c0MzF4T2xpM0dYVGsxK0h0V09YNVBZUDdLVW9UL0ZYTU1DcXB4azZFQWoyUlg0RzFYSjE0cGJjRDlWSVZiZUd5L1kvajhteGpZTUxwd2w3RU1mK0xyMzFKeGJpYXpQOHpHOWFxakZsL1VEZUNSbER3c2NuUmpUOThWUEtGejRXR3k2K3ZHS3R6My95dnNyZU9ydXRMdThZdHJjWGNweFNudTd1N0ZyY1hqN3U0SklVaUFRSWk3dTd1VGhFQUl3WjFTYUV0dDJ1bDAyckgxVzg4T1laaDUzL2Y3KytQNW5IdlB0ZVNjdGRlejFwWm51d1pob3BNZlpsaDRZckdCSGRZWW1CTXd0bkNLQ1VROHpWUlVhaXd1UkFiQzlxd1hMTDA5RUppV0NML0VPSnh3dE1WUlcxdFY3TVBPUHhCYUhsNDR5ZlI4d05ZQko4aXFwcGV1WXArdEUvWllPK0NnazR0YUliekh3Um03SFoyeG5lZjIwcnlkdk9DUExYYk9CS1VkTmhIVVd3all0WmIyNnJHdzVGb3JPeHlrTnQxTm5idFRWZ3BURWtndndFbEtpQy80UFljWkpyNlhjQ1l6UnkzYjJlWjFHb3NkWFRHZE9uZ3VHOHVjeXdGWWxaU0pGY3lxRzNuZER0TlB6RSsvanI0a0owMDRSYjVQVmhGQzYrNGl0UDRKTHJKMXA3MzZCUm5mL0liczcvOEdwN3hyY0NtcHhWNEM1eEJUMlA2WUpLYm5mS3dnT0xia0ZHTnpjVFZUWlJwR2hOR1pNeFVQSW5OTzVBL3B2LzBiTmxiZlI4OXp3UmdvUUNHNzlxVWViVTh3dHVWNzJ6UFZkNHBNUmJlSU5IUUxUcVNXamFGbVRjRlk2ZnozajhDVTRCQVkxckRoMExTWWhCZGpTMEE2TmlTVVlHbHlCUWJSV0l6MnA4d0lwV09QU2xGeldIc0hSV0F3WXpSakhNM1ZrS0I0Z2lrUGZmajl3dDZ0UWhQUUtTeGU5VWlNdWhDSWVkRnhPRnBUQTYzQ2N0VWxsM2YvcnppWC9SaHJJd293TjdNU281T0xNU0huR3NhVEZXZmwxbUFjZGZmaW9odVlsMU9MNmFtVm1KNVdRMk4wSGVNVCtGcGFuUUpzMzZ3YWF0VlNkTXdwUi9lTWNuU2xLUk9XbEswaFpRQ2pUUURsQzdWcGEwb2RUV0FLdXZLMytrZVZZVWg4RmJWWkZRWWxGV0lrRGRzQ2F1WVZlUlZZUmRZK1V2c0NMajhESTBOb3pySnZZSDVNR1liWitXR2M3V25NdC9IQWNoMFRiTkl6eEdFM0I3aFFpOGJsWjZyNnRKNEJsNVY1Y3J4NEFXZWpJbUR0NjZ1QWV0eVI3SHJtUEN4b2hMUUpsS01FcElCU0RKVEVOa3NiYkRhelZPY08wOEh2SkpBM21KcGpnNGtsOWhIWXNvcDRPMDNXR29KMXZiV2oydTVKVmhQTDh3MDBXcHZzbmRVUzlnME9qbGhuYTBmRzUrZmNYS0YzL2p5T1VQdks5TUl6cVdsd0lGa2NPbnNlQ3l5dHlLcjJtTXJmbW4zcE10YW5aVUQ3d1hNY2ZmZ04xcGZleGFIYmI3SGgyblAwSWpGcE1taWlaQXNaMlgrLy9LdS9JcUQ0TGk0Vk5NQW4veWFpR3Q4Z29QSWg4bC8raXRvZmdOZ2JyNkIzTlFrV3FXV3dLS25IWGhxWnBkU2xuL0pHZkpwSWswRW1IVUdOTjdmNEZyUmYvMG9OZVYwTnEvYTRGRVptRFZVZCtSb2VOVmVqMFNJd2xpd2JqMjRFYm04eTh3Q20vNUV5UVRxQVFEdnJ6KzhNd1lHU1lxVC9DS1M4K1JjTWl4c3g5blFneHRGVVRhQ0dWWWFIWnFoN2FCdytvZ0hyZXlrUUV3TmpNSm0vTmVwTUFPWmxWYXBHSXowRjdZTDRXM1R2TXZWUGFrVmRlZm9MTHZCaTVEQ2JoSHozTTA1ZmY0RFNWMERSZDhDTzdGb01vK0diWEhBZHd3bVdVZGtWR0VFOTM0L3lZQXdaYzBGeFBXWmxVRE1tVldGeVFqVVdGRDdDbU9RNkRFeXBRamN5Zit1a2ZIU21xV3JIUnRlUGJuNVd5VzBzcUx4TGM1ZVBkcEZKYUoyV2k5YTVGV29YdmJaUmxBeUIrUmdZVm9KaFVjVVl4QWJSSnlrZFE1S1NzUHZHRFJ5NldZOGwrU1ZZVVhrTEk5blFsNWZmdzFUL2RBeTI5TUVnTTFseFlZOE52Tms2QklPMWp6Y2N6L2tva05yN25vTytzeFBCNm9GTDhRazRTMmR0NWtOZHlWUi9oTXlwU3oycFE1MHBETHJMemxHdC9kZWowejl5OWh4Mk9EbGlzNVVsTmhpYjRKQ3pLMldBRTFZYkdLbGVnQlBVblB2Y3FWdXBTWmNiVzJLRkdhVUFKY0VHTXUweWdsbVd2NitqMFZ0cmJhKzJQbDF1Ym9HdFRrNHdEdytqODArQmhmOFZOZzZhTVU5UEhPVGZ0dHJHQ25QNVc5UHNiVEdidjcyY0FENTQvUWIwWHI3Qll0bjJuYkpzWUhRTytqQTZCS1ZCSTdzbTMyY0tsSDJQYnYwRUJKYzBJcno2TWE1UU8rVzgrUTNYMmFyckNGUUI5SzIzUUZMRDE3akZ6MVR6dVU3dWRTeWlRVnFWS3AzZytSaDhtYzZmYVhkNmVnWEcwMndNSXB2S0pKYnVseUl4TUM2SFFBMURKeHF2MWt6UmJhNVFFdmhIb1ROWlVOSjRWMnJPZnY3UkdFTVF5b0s5c1lHQkJONWxIRXNwUkM2bGl2dWp0MWhBMS85eFlCU0dVaWIwdXhUUk5ERW1LQWE5cjBaZ0RkT3MwWk8zY0dKRzBMcjNDdk16eXRSeWxjRjB6NThRdEdQeXl6R0tZSFYrOUFQOG4veUNuTDhDWnhxZVl4c2J6ckhJREZ3b2ZhRFdQY2xHWkZOcHNHWlYzRVR2bURRTXpTNURyNlFjREtVcEdwOVhqYTM4TzVaVHAwOU51VVptcmNIbWV6OWpiT1l0RE1tb1F6dWFUQTJ6UmR2RUxQU2pqaDJZV29JQjhRWG9UYUIxVDZSSlRNaEdoOFJjZE9INS9uazNhY2FLMFMrbUJHTVN5cW0zUzdHbzRDWi85d2FHRW1BNzZ1cGc5TlZYV0ZsVm83b0FSMUFpOUQ4ZmlaN0dwekRlNFFMR09YcGdpcVVGMXB1Wnd2U1VKNXpQbklIWHBRdTRIQjhMcjVBZ1dKejJnUlVaVkphaldGRTc2bE1uR3AyaUdXS2ExanQxRHM0UnNUaEcwQ3FYN2grZ091MjMydGxqbTZNOVZoa2JZYTh6MDNWQWdCcXQya3J3UmQrNm8zYWU4WkNzYW1LRjlRUzloS3crMkVQZ0MxQzNNSlZ2WmtxWGRYWWI3SnYyN2RVT3VBTFA3RXkxekVYbjRqbm8wTlRwWGI2Z05xNWVabWVCaFc1T21PVGlpRVhoNGRoR2o3Uy84U2tXVUt2T29PeGFjdk1GQmhGTFBSS0xNZXZtSzJoa1VWcit5eDl4ODNmZzJwLy9vVlpWeGo5NWhRQXlidVNqRjdoQm9NUTAwbmg5LzFmYy9CVm9KRkRMYWNJOEsrNVJGbVJqYTNnV2pwZmR3UmRWOTlURTRwR3lBalZCbG9qa29WOW9CZ0ZUaUFFaHVVeUJ5V2dUbElJTy9wUUVWeEl3UENKTGpUeDlSUGZkT2p3YVhlTFQwQ0V3R3IzNDJzZUJTVmhPRmp0UjI0aDEwV253K1BJNytQL3lENnhsQ3QxUVVva05USlBMeUZSNkQ3L0RPdGxqaWVadUhrM1B0dExiMkZoeEN4dXFHckM5OWg1VDZYV01ERWhsNnE3RFozZS94SENaSDN2dUNxYjQ4bWJlZllNZ050TFQ5NzVGK0ZlL3diM3NOb0svK3gzYks2OWpmbG1saW9sNXBlaWVsSTNlWk5lZWxBT0RNcTloS0RYc3hLeHFqS1NSVWx2bTVOUmphT1lOTW1JbFBxSVI2NWlVcHdZZXV2RWE5S1doNmhDZmc2Nzh2SWFOdFdOOG9XSlF1OThBVjdLNlRQb2VGSitLVVVrWmFqR2pHMG5oOEoydjJHQ1RzTHEwRnZ2dVA4Y3lTbytSdkhaaktJTkduWTdDWU5QVG1HQjVHbE5OSERCSHp3Z0h5Rnk2YnM3UWQzTEFtZUFBRkRYVTQ0cFVPZ3dNVm4ybkFsQmRUMjhjb2ZZOFFoMTZ6TmtkOWpROXpsTFIydmNpRGxOWEhuQnpVM09XMTVsU1VsaFk0VE03QjFWT1NWYWticlMyVTMybEJkLytpSWpHaDZxTStrcXA0VURuTHZVYjluajdZcTJ0STFZTG01S2x0MUNqYmlQUTE1b1lZYis3SzJ6aVlsU1pwWk9CVjdEbnRBYytvMXpaNm1vRDQvZ1FSSC8zRERzU1FqSCt2QStteHlWaFBnMzdyTUlIR0pWMkU1OVFBb3hnaHY0b2hvMDlzUUlMYjMvUGpGeGVqL2k3TDVIeDRsdjRVTDlkcmJzRnk0Umt1R1RuSWYzTnQycUZaY3JURjhqOTZpMFNDZDdvZXkvZ2YvTXh0TWxZQjhQU29VV1hIRW1nWC9qaDcxaEZPWEN3OEJxMkZGUmhBcGwyWm1FanhpVlVvY3VsRkhRTXpVSWZ1dVFCL1BGK3dYUjZaWGN4blRkSVJwbDZwV2VqVTJJYXVoS1lIOGZUdUZ4SlZET29qcGZmVnN1cFYxT1QyamM4d1JlNVpaaDQ0UW9PMXQ3R1hycm40MVdQc0pwcGU0UmZEUHA3WEVXZlV3SG9RWm5SKzNJWTlYSWpBZnVBR2pZRE0yaUU5dHg0anBFOHY2cTBBclBUc2dud2FHd3Vxb2ZOblcvZ2RmOWJOWm5hOXRZRGZGNTdDMHR5aXJDcXZCSnpTeXN4Skw4QzNkTEwwSTZHcW1kU0JZYWxWbUVNUVRxYzU0YVNzUWRsMUtCL2FqVXZhQ1c2VTFOM3BneVFYWnhIWkpXcERjcmFVcCsySjh1M0lKdjJvaTZkazFtUHcvWGY0ZkR0MTFoSnZiL3QrVFBNS0N6RW9xUmM3TWlyaFY3ajE3RDg2bmRNaUVySDZxbzcySG5yRlZaazEyUDh4V1FNc1BMRk1DTXZ6TEQweGtKeko2d2h3KzIydG9MeGFTOTRod1hUOFNjakpEMFZScFFGaDZrWFRlbStEYnpQS0pCKzRlQUVMUm9kblZNMFVqS0RpaHBSbkw0S3B1eXRWbGJZWkU2alJ2MjRtKy9meG5NN0NPSjExclpxUmFwVmJMS3FRN1daakw3TXhCcXJMYWxsN1Z5eDJja1RxNjBjc1lxTUxSSmdzYUVwTnRyWVlMOHJHd2IvTHBtUWZmamNHZlZkdTd6Y3NjUGRFWHQ5WEhHbUlnOG5vb013eDhNSlc5SXpzRFM3RkNPakM5QW5yaHF0UTB2UU5yNFluZE5vV25uc0VKbVBydkZsME5qUy9LVGNlWUdhbjM1SC9KMUhDS0dwU2J6M0FLa1BINlB5dXgvVk5vN0o5eCtpK3VlL0lQdXJieEZ4N3prdTNIeUljNDB2Y2Y3UnQ5REx2NEY5ZE1GN2t3cXdLVHdKWVdUZml6LzlEWjlmZTRyRk5CNVRrcXN3ampkSkpvZTB2QmlON2dSNHY4Z3NkRG9iaXFIaGFSZ2VtNGsrQktOMGpFOHZxMU11V0ticjdVa3VWekxqSUUzSGJqTDJ4UWZmNE9MVDd6RFBseTczOGRmWUdsZWtCaUpHWFk1cldrOUYrU0VtU0diMzl5UkR5N3FwVlpXTm1KbGRoNkVCYWRoYWRnOUdyMzdHY1RhNkViR0oxS0Y1bU1IZmsvVlNSMnZ2d092bE53ajUweDh3cldoVWs2dDNsdFdxaVM1OUVuUFFucTYrZlhRaGV2S0NmWkpSaTFIVTdNUFMyUERvM0hzbmxLcnpmUklxeWE3bDZNWnp2Wmp1RjdHaEhYLzdEOHlzZjRwT1pGZ050WFBYdUFMTUtibERSczNGSnpHWm1KU2VnNFVWbGVoRnVUTTdQUS9MQ0dxWlEyRHc4RWNjdlA4MTFsKzdoK1g1OVpnWlFZbmw3SStobHVjdzJjYVhyT3FDNlNlTXlZQk8rTnpSQVNZK3ArQjg1UktjL1M0cW5YcUNRTldtY3plL2NGbDFGUjJpN2p6dTVxa21UaDl4ZHNOK2UwZnNKckRFUE8xMWRGRnVmNHVsTmJaWTJXQVhId3RZQlhEckNlQU5CSzlNUmxsbFlZc0Zlc1lLcEtzWUd4MDh5YW9YRmNOS2JLYW1sVHBpQzNRTmFjQmNjUGkwdDlvUlhWWUN1TVhFcWZCS1RGWTdwQXZqeXRSQWs5QUluT1oxanFDUjMxdlVnUDQwelFMS2JybTMwQ1dsRXAxSVdLMlRpdEdLMFk3WFhCUEN0Smx5K3dtZU1DMDlZSW9Qcjc2SjFEc1BrTkZ3RitYUHYwVDV5MWQ0Um5ZVmhvM2crVk5sTmJET0sxZjdPa1ZTenliOW5aTGd3ZGM0LytJSHVEUThodmZkWjdqeStoY1kxVHlsWUM1Vzh6aW4wVjJQSTJOS3Y2aG95SDQwSCtPbzZUN05MbWRyU3NlSWFKcW16RUpNcFpHUjRyZWVMLytxbG9xRTgyYWY0WGRmZmZFVFlyLytEUUhQZjhJVzZrNHBYT0g1NW5jY3FubUNEZGNmWWRuMWg5UTROWmhLVFRtdC9LWUMvZHlTR3F5OTlSaUw2NTVpY200ZHhpY1hZZGVUYnpDN3ZCckRNcGlhRXpMUkx5VWZFOUx5c2JtOEZsOFVsc0dUY3NmcitsTkVNQjJIOHZlMzM3aUg4YmxrZjZiL3dXUzNQZ2tWK0NTdEJzUFpPRWRtVm1Bd0RXWS9YdFIrMUsrRFU2OWpTR1l0K3RQWURVbWpWSWpLcGttZzNxUUJsUkcwd1dJMjQzTFZkTU91VjJPWS90T3g4ZUVUSEhuOUZtTmk0akdHbVdWRVdEeTJVRklkdVA0Y2g5ZzROeENzU3pPck1kay9CWU5zem1PRXVUZW1XWGxqaG9HZFlyZDlMaTQ0NUdDdndHcDUvZ3lzenZyZ0pIV24xQVBUOCtKajZ0RXZDSnlkZFBmQ3FPTDhEeEdJZTVpMkJhUXlIMVZXZzJ3bklOZlQ4VGRMZ0MwRSszb0xhNnd3TWxXem9qYXlVU3cyTk1OOGZZS1ZMTHBhT3ZKTjdiRFd4bFV0Y1JJNXNNWEJRL1c1YnJSMlZITURaQWFXRE5OSzQ5Q1Z2OFhOQzhkYytSNDJpb1A4Kyt4cGpKUHVmYW0yQ2IzR3NIandJeWJHbDZKbFdCcmFFcGp0S0trK1NxdEVPMTcvbGpubGFKTkpzRDdtR3h2L1FwUDFCOVFtdDdKTDg5MWZma005V2ZUKzJ4OVIvL1czdVBQTHI0aHZ2SXR6WlZVSWxvMGNlQk5OU200Z2dCb3Y5RS9BZnQ0TVhScVJpRzkrVnVWdzNLazEvV25PRHViVVlnYWQvaFFhbU9QVWhrZVlja2NGSldOZWNSMzZNTDEvUW9CK25FamRGa3dtakVsUmhTbjJVRXpiWFh1RXd3VDJsc0I0N0tTMDhMNzNFdEhmL2hWSjFIcm05UStoZmZzeERKKyt4WnJ5V3hqSGh0TXZyWUFBTE1Iby9HdHFhcC8wRUl4THljWGlta1lNSWdQS0JyY3Q0bExSTGlVZG5haU4yb1hHb2dPWnJqY1pzL3VWU0V5ajB6ZW00Nzc4NkExczZmWWpmdmdYVHIvNUZldHlxekNXNW5GUWFpV0JXWWYrU1ZXWVZud1BNOHZ2NEJNMkROa29kMWpPRFVZOTAvNHRETStxd3lCS201RnBKUmpIREhMazd0Zll4ZWhKVTlrMk9oV3RvcExWQkprK3Nlbm9IY2NHbWwrTU9UbkZHQk9kUk1iT3dmVFNhdXg1K0kzcXo1MVAwQy9LcU1UMDBFeU04Z3JDSjNibk1aRkFuV25xZ2dXR05saExBTzZremp6bTRnUkxtaFpkZHhmVksvQUZ0ZU14Z3VGekIxZnNwMHZmWWM3M2FodmdnSDBUU0lWUnQxdmFxNEoyVzhpV3N1QnpuWWtGVmhLSThwMHlsTHJheEJ5cmpDeXdUTThFeXd4TXNWeGU1L2NzTnlPNzh2eGlQbDVxYnMvSFZncTBLMDF0c2NuYUJSc0kybDBFN1E1Yk5oRHB4akl5VThDVVB0dWRaTzBOQmliUTlibUlvSkphM1AwYlVNa3NMR3ZHenI3NEEzYmYvQXZyYUtpNk1lTzBwZDV2UVdQYUxyc0ttc3hTYU5JTDBKRUdXU09qVmlIVnQrRlhXSVc0K3Z2SWUvb0t1ZmNlNGNGM1ArR2J2LzBMci83K1R6VDg2YytJYTd5UHpHKytSd0hCYkVhdGRUeXJIQWQ1VXd6S0cyQmNWZyt6a3V2d2ZmQWNmbmNlcWprRlJreHBDMDVkeG95TG9kaVdYd1hYNy80R3d3ZmZxaUhaZVdTbG5VKy93UmltdmpGa21HVUZsZW85aC9JcTRWRHpRS1dGd3dUL3dad1NhQlZYd1pFQWpYanpDK0orL0x2YWEzUXg5ZVowLzFoTWlzckFoQUl5SDkxN2Yyck9RV1JyY2Q3amNpb3drdkptVkhRbU9oRTBMUWhLVFVZK05HbFpORURaYXB4WkdMRXZwY1FJeWd5cE1YRHMyZzA0MzZNdUpydkxKSjNWTkRtemc1UHdhVW81UmhPUUFzYlJCWGV3K0NZZCt0M1hiQVFsZFB3bDZKdkJCcEpXamI2SlZVMlNJSUdhUEM0Yk0xSktzTGF3SHVzb1Avb0dKS0pyU2g2NlpqWE5UWmhTY1JOVHF1b3dLYjhNUy9LcnNlbjZmWXdyck1Db29nck1xbXhnWTc2Snhjd1VjK1B6TWNqNUFucm9PMktpM1Jrc2NQVEJQQk5iMVcwa1duT1hoVGxPdURyRGdGcHduNlc1V3VDNW40QTU3T0NtT3ZkUGVwL0ZFUmw1SWtnMkc1dXIvdE9OL093Nm82WiswL1dtZkc1dXJVQzZraXdxeDNWbUJLVStIOHY3cUlrRnRJdjVYTmh6Q1YrYmZsSWZDL2paeFRSWkF0WlZsazVZYlM3ekJaeXgzc1FPKzUxOXNJbC80MjVyVjZ3enNNQWVBblVMZGZWNi9tMXIrUDJ5Y1hIK2QzOGc4YzBmTU1pK2dSV0JtWmdaa29VRkpMYUpKSlpCMVBnREtDblZJRXNxalNsbFZhdWNVZ3lwYVlEbWREa1praHIwTkUyUkJ4SHNscHlKeU9vNlBLQkdKZWhWVkgzN0E0THJHaEQyOEFYaTN2NEtJd0prTzRHeUo2VlliV1I3Z3MvM3hXWEFzcXdhWWErK1J0elgzNk9RTEJqejVzL3crL3BQTUwvN0ZQc3JiMEtMNXN5UWFYMUhhUVBXRWVUelNPMVNHR0p6VGlWT2tLa2NhKzdEcExRR0I3THlNQ2M4SENzb3ZEL0x6Y2V4M0ZMNFAzaU43Ty8vaFlCYmJ4RDU4ZytjZmZSbjdNMXZWUE5iaHlVWG94OUJOekNkSm9acFYvNXByY1kzV0pGUmphRnBWZWpNZjdwbmJnMWEwN1IwaWM3R0VqYWFWYy8vaXE2UmhSaFBVek9sb0JRVE14S2g5ZlZ6R0x4NGlWVk15UWZJbWx2Smt0T3B0NGNuVjZKSGxNeHpMVUhQaUZ4MERVOWxTaWZ3NHpQUmdUcTBRd3hUZTNReFdZSEgrRHowb0c3dXk0eXl0UFEyVG43NUY5WHYzSmNaWUdSZEk4WVUxMklzNWMrVVVrb1ROckQxQmJldzY5WkxETThyUXhjYVRablEwaU1zVVMwWGw1VVRvejJ1WUl6ZGFjeXdQWVhaUmsxQWxUbWhqdUZoaWxVUDJSS2dWaGJROHZDQXZnL0I2ZVNGdlRiTzJHdEhnM1BxSFBZVHVGS0ZVVUFxbzFCYkNMcWRORVpicVRzM1dkaFJwOUlvOFNpZ1hHbHNvVXFHcmpJaWlNM0l1TWJXaWkzbE4wVjJDRmhuNlJoaG9ha1Y1aEh3cThpZVN3bk1wWWJTaytDSXpSWk9PT0RrUThaM3gzWUxOMzZIQTdZNXUyT05yVFhtR2hsaWtvNDJwcEhOVjF3TXdxTGdaRXdJVE1hb21Ed01aUllkbVZxTTRjelFLNGlMdlhlK1ptT3Z4OEJJNmxkZS96NUYxekU0aThEOWdxbEpPellENXFrRnNFekpSdVQ5WjdqKyt6L3hnSktnNXZzbWd4Vno1ejc4cXV2aFZYa0RWOGlJUG8rK2dVNXhBL2FsVjhDVW12QUFuYSs0OWROUFhzTHIzajM0UG53SU8xNThIeG9YMDZKS3B2WjB6Sk1pWWNFeFpNdHFMQTlOeDFKcXQ3WDVOZGhDZzNPQWt1THk4NStSTHFzUW5uOEZqNjllWVgxeEFmYmZiWVEyelozZDR4YzBjMi9nMi9BQzhYVEtSZjhBNHBoR2RoZmZwWUdxVlNsNU1KMzVDQjQvb1Q1ZVJoTmovZXd2TUhyeUMzcEc1UkVFVmVoUEFTL2o5WU1KM3FISlpNTVkwWloxYXE1QzMzaGV1SUowN0hweEI1TmpvckNsb0V6TnlqZWhnWlFWclFMUW5yRmwvSTA2OUlvdFZHdWtPaVZrdlJ1TnlrTjc2dkVlU1dScWZ2OEFwcTVCWlBZeEJmeGIyR2hXVkQvQnpMSkdkRW5OUTNkbUNtRi9tYy9RT3pwRGRlOXR5NytIRGZsM0NQSnN0Q1JSU0UvQ0lHWUhtY3crek9VQ1J0cDRZN0tkRjJhWk9tQ2Vyb21hRStvZG53aTdxMWVnZDhxZGVwQXNTckRxZXZ2Z21JY1g5bGdUTURRL3g3M1A0NURyS2F6V05YN1BwSkwyWldoV0pxTnNwaFJZYjBwV1phd21HQmRTS2l6U01WUmovZ0xRRFV6dFMwNGFrbWx0c1lwZ1g2aHZ4cFJ2Zy9tRzVwaFBVTXVXUUZiOGUzZDcrbUk5V1hTdENjRnY2b1FOaHBRWHBzNXNFS2V4emNrYjY2aDM1NXVaWTVUV2NVeW12cDU2emxkTlVwbk9helNCOHF4WFJnVTZ4T1ppR01FNGxtUno3UGxiWE9XMTEzOE5tdEJxdEEzTnByOG94SUJvWnNjOWRLNEh5QkM2V2NXSS9lRTNSSHoxQXp5cnJzT3RzQVRuSzZ1Uis5UFB5UGp1VDJvTGNlL2F1N0F2dTYzcTNPK244ejFFUS9GRjNrMFkxRDFXKzRwcWxWL0Q0ZndDbU5mVndLYnVPdGI3K2NPTFJ1ME0wNnREMVUzS2hLK1I4ZGVtaVNrTGFiSm1rUVhIaDhiaklFRWQrTzBmU1A3NW43ank2ZzB1Ly93VDFtVG5ZSHR0TFJ4KytRVkhHeHF3TTc4UUYzLzVBMWYvL0U5VkZWQW1vNHpQS09JL2tvNmVPVVhvbTErQlhremZFd21ZMWFYM3NJcWdYRVhXR3BsVGg3WTBlWnFVUW9LaEVLc2YvNFJ0RDM5Rm42c0Y2QjlSaWpaWDR3akdXRXhNVE1EODVBUnNJS3RmcGRHVURkVmtxYzN3c0V3Q09oYzlhSzY2SmREMUo1ZWlMeG14SzdOUWg3UmN1dFFTZkpSUmhaN3BOZWpKWXkvS283NDVaZWpMOU5XWFJxeExhQ282a1lsN1pwTDFlYjRIZ2RnakxnZnRLVE0rSmhQcjFmMEoxcytCWHVydnkySjJLTVhna0RUMGMvUERjRnR2VExUeHhBeW0ydm1HWkRjZEF4anhaaHQ1bjZMYmQ0RDUrZFBROFhURkNUYzM2SkJWUlk5dUp2Q09uZkxGTnJMbFJqTGdhbjBUck5RMXdscERDd1ZRWVZKaDFJM1VyTkwxdFlMZ1hVUFduSE5NUjRGeUxjOExzNjdRTlZYc092KzRIcGFLRENDcnp1ZjNhQWVGcVZxcW02aEZWMWpZWUp2TEtTVUJOakgyT25wanM0a1RVNzhQOW5oZHhrb3JkOHpSTThNMEEyTk1zTERBQ0NkSDlMdHdIajJqbzlHZWdOVVFlekpudDAxTUxqcVRhWWVFcDJGMTJRM29mZnM3dGovL1RSRkVkOHExOXNFMG41UUtHaE02WnIycVc5Q2pnN2F2ZndERGttdHdaTXAzcUtxR2ZYa0ZMdDEvak1BbnIyQ1dXUVNEbEFKWTVOY2hrSHJqMU1PZnNKdUFQVnJTaUZVUm1ZbzFsNFJIWVgxU0lyYW5wY0x5OWkzNHZIaUdwTi8vUUl4c29mUGo3L0JyZUk2enRjOFErdmFmMkpON0hWTkRrckU2cHdxYnlJcUdwSCtUMHVzNFNCTjBwS2lJSnVvKzlNblVjNkppTVMwMERPdHo4dkI1N1Ezc3BiWldSZHVvUGNlWFZHRmdVVGw2RkpWUkR4Ymc0NkpxaktOQlc1WjFIZHNMYjJNdWdTVk1xTG85NlB3MVVTa1luRktHb1pFbEdCbFRnMzVoVE4zaDZSaWNrSUVERHg3aXlDMm1iWnBEbjdkL2hYSERVeHErSEF3TVNVVzM2RHg4UktEMnBLd1lTSWMvdExBYVBTaE5PbWJ6dTZuTjI2V1Zvd00xVmdjeVFMdEVYbmpxVXhsMTZSYWJqNDVraEk4Uzg5R1o0TzVFMXZ5SUROcGI1ci9tVm1OWVRCRldSRjdIMXF4SDZNSnIyT1ZkWTVzUXdMK1RHdlZqYzFkTXMzVEdYTEtjc041dWF4dG91VGhEeDhrZWhqUlVKNTNzOElXOXJWcCtJa3VrOXp1NHZEZFBtOHpJbUFUcUtqMWo5WGdyWGZvR0FtNE4wNzNvMFkxOG44UmFzdVY2Nms5eDhmdTl6cW9aVk12Sm9rdko0cnNkUGJHWlRDMU1LeURleTlkRGI5MUQ1cHZ2Vk9Iak5WYjJXRWhRTDlJMndVNm5VOUQzQzhYeE0xZWhleVVLUzgyY01Zc3NPMW5IRE9QSXhpUFprQWFlOGtabi82dG9FUmtGVFd3cWcyQ2xqR29YVTRBdUJHVFB5OUVZNEIrSklXRkpOS0dGNkJCWmdPRWxkMmxzeXpBc0lBT2F3elJYc3YvU09qclU5VkZKMk0rYkx2dmVHMVJVNFVSMlBweHZOc0x2MlZkcXMxamI0aHN3eTYxRjJMZi9oQTRkOFBvZzN1U3NXbXdubGUrbkZ0dVdXNFRkcFdYWW1wRU9vK29hQlAzNEU2Sisrd3ZPUFg0QzcycCtQcmNjRGhVTnFnZmg4Nko2YktKNU9WSDJDR3ZEY3JBOGtDQlB6Y0ZuMlZsWWw1d0l3eHNQc0pjcGRVc3EyVEF4RTF2NTNZYjNuOERweWRmUXFuMkEyWlF0RTdOTDBUOHRCOTNTc3FsSDR6RXdUWlpUWitGby9XdWMrdzdZbkZ1UGJxRlphTTNXcTZFeGF4T2RwdGIvRCtTRjZCRXMwL3lLTVNTK0VJTWlrekUzTHgrejQrS3hLaklWT25UN3hvM1BzWWFtYjBicExReW0rSmRCZ1kvNDkzYWpjZXFlVm9BMlNaa3FiUXRidHlGeml4bjRLSjJ2NTFlaWYwa05wdDU0cVFZTEJLeWRrdk1KYWdJMnV3Z0Rjc294a0FDWFhvUEJOSGdyMGhwaCt1eGZXRkh6RFAyRFVqSGlUQlRHdXdkaExOUC9CRE5IekRHbHNXRWEzMmhvckdaTDZUczdxcVVvVWdQM3VJTXRqTTZlVld1a3hHM0xKSlFEanE2S1ZXVkIzeW9hcXpWMDVMdDRiZysxb3hpcWxXUkpBYTJrZnRHcXpZWktKbER2OS9EQmRuczNMTkV4VmdEZFNsY3ZXclk1Wko2cVRMS1dDZGRhZmdIVXQ5YlV1WlpxVHVzcFp1YkFtdHZRSTloV0U2Z3p0Q3d3V2M4YVl3eXRNTlRDQVFQY3ZkSDNjaUE2eTRiQm9iSFFNTnRvSW5QUUxqd1BIWUt6MFMwb0RYMURVakFnUEZGTit1bko5UDlST0J0NFhERTZobWRpSElsUk01K3VlVFVOZ1ZIakU3VXo4NXFZSkd4UFRzTWVPdWVqVEsrWFhyL0ZLYVp4Mi9McitDSXFGYnV1eHNPMHNBNFhYL3dab2RTWVc2anBGZ2NtWUUwODMzLzlGa3lmdnNEaGF6Vll3WFN4WHdyZXBxV3JQVXdqbnI5V2MyUS9wODdiUkliVHZma001MzRGcnZJN1hHbDJaR094RGZ3OTdmdjNZWER2QWN4dlBzY21ha1dkbWdkWVJSYWQ2QitNZlhUc0YvNzBUN1V0dVJUL2xUWDh2YUtUMFQyQnFUWW1rZnFVN2owdUZ3WVB2OGZabjRDTitiZlFpeGVrWTBJK1dvWWtvRTlTUHZwSFo2SlBXRG9tRmQyalRyMmp6TmtrZ241ZGRTMk1xSmVkSDc1VkF4dVhmZ2MyVmRialk2YmxkalJscmRqNkI1WGV3WkFpNnF6TVluUWkrRHF3WVhlZzF1cVFVWWtPQkhKSEFya2pYK3RPQXlXU29XdDBFWWJrM3NCQWtvRW1MaG1haUJqMDVIWHF4KzhibUVRWncwWXdKYTRTQzFPdVkyWmNLYVlFcFdQaHBTUk10RHlMbVZMSjI5eEJhVVJ4N05xZXNxNC9HTzUrRjNEcTZtV2NwR25SY1hOV2xhaWxWdXBtWTFPc3A2T1hiaUlCclBTZnl2elR0Y2JtYW5hL0RDQklGNVV3cTdEc1NuNnZnSFU5R1hQK2NWMEZXZ0d3TUszSUFBazVKeUdTWVJtTmxSaTB6ZVkyU3YvS2R4Mm1MallPaWlCNHZaV0UyR0FqeFZFY3lhcU9tS0Z2alluRzloaG15ZFR2ZkFvOXpsMUd0K0JvZEl4SVF0dUlGR3JSVEhRTVl4WUt6VVdIcTJub0ZKQ01mcngzRTR2ck1QL1dNN1RqdGVnYVIySmdwdW5PYXp0SUpyVFBraVhSNGNuWXl0UzFOallaUnl1cXNTVWhHUWN5QzNDY0p1bk1zOWZ3ZWZoY2JVbnVUSk4xak1iaU1GTlowTnZmRWZURFAzQXdzd0plcjM2R2JzMGRiSWhQeDI0Q3pwVGdkdjNtQjZ3aDI4bTJqNW0vL1FQUkQ3OUVZT05UMk5mZHhxNnNJbXpqRGR4My9SaytLN29EclR0dnNiZitHYlpUamh5b3FjY0p0dEJkTkN3Ym80b3dnNXB5RGpYMWxOUU1MQzBxZ1hiak0weVdlYk5YUWpFNkpVZE5EK3hNemRrL1EyYm5KR0FKZ2JJK2o0MGwvNXBhcjlRektndTlhT2E2UktXckdmdFRVb3JWZXFwZEwzL0Y0b2F2TUpMc09UNnZCT3RMcTJGKy94WHNhcitFMjUzdnNJSnUvOU80TkV5cGJNQ29hL2ZRbFJLZ2Exb2x1aWNWbzFkYUlicGxNSEpMMElVTTJaRmdsZUhCMW1JQ3lONmFLTWFWWkxSbTZ1cVhLbXhjQUUxd0dGckVKbUJDVnFtYUl6dUYrbmF5bU1QNEFveU40Ry81eG1HTTFYbk1zcnVBeFk2K21HZnBvaW95U2ovbkZ5NnU4QTRMVVdQL1Z5SkQ0UnNXakdOV2xqaEJEU2c3MCt5eEpRdGFXS3IxVWlJVmRsbFpxOWxVbTh3dHNacU1MQ0VNMjh5MEF2N05scllxTmxGM0x0WFdWMlpyaVphQkFyR3NxZHBFWmhZd3l6NE84cDU1aDQ1aHVaWXVsaC9YeGxZeTlBNGJleHc3ZlY3dE1DakxXM2FRYldVaTlUb3k5SFF5OVRSalczeHNZb3ZlZkM1QTdSUVVpZGFoY1doTjZkZUpQdUNqd0hjUmtrSEFacUlkV2JWRFdCb3paUm5HVk41RGU1cFQwYk10cWZ0YjBZQzFEQ1FUYTFmY3hoZDA1WWRMQ0ZLbU5sMnBUWFRuQWZZbDVjS1lHdkxzbzFjSW8rYjBicmdIMjdKcjBNdk1oVTNsZGJXUHZrNUJKYlFMYTJCODdUYTJ4V1ZnWjFJTzlNdHY0R1I1SFJZVFJNc2k0bUZmM1lERXIzOUI4SjBuOEwxMUYxYjF0K0h6Mng5WW5sV2lscUY4UmcwcjJ6Zk9ZaW9kSDVHTWVkR3BxdGl1KzF2Z0dOUDVxQ3N4bUVwNU1Dd3VBZk1LaTNIcytuMDFDY1g4OVM4NCtPQVZqVkVPVTBjOHhoZVU0dVBrREJ4LzhnWmFEMTZyY3V2anFBRmxzc21vZklJaXB4S3orZi9JN1BQNTFMRHpLQkVtWlZaaktnVzk5UGN1Wkt5aTN0eVNXSVpOMUVocitmZko3L2JsZGVoQVpoWm1iUnRiZ0c2VURlTGMyOFdsMHlSa00vMlhVcTh5WW92NWVoNEJTVzFGc0haTHJrQWJtb0pXUVNrRXFtemVFSXRQYTIvaWl5ZmZxUkdxNmRUQlcrdGZZdXVqTjVnUVRhUHBkZ1V6Yk01aXJya1hKcDh3eDF3RGNlQW1haGpVM1BjQy9PS2lWQm45Y3dHWDRYVE9CNGZOemZDRnpKSXlOY2M2UXhPQzAxNU5hdGxERU85aWJESTFVL05RQmFqTGRmV3hRczlJZ1hXMUljMlM5THRLa1QwK2xzRUFlUzdzdVVMUFJFa0NZZHYxbG5aWW9LV1BCU2QxVkcrQ2RQRHZ0TERGTmo3ZWJteWhCaGwyV3RtcEhvWk4xanpTY0cxeDg4SjZ4bkpYVDR3aEF3OGdnL2M2ZFE2OVE2TFJKU1lOTFpqZU5UU1A3U0t5Q1ZoZVEycnpka0hKK0NncWczS0oxNHIrb1pXY2p5dEVXMG9xVFFRYnZVZzRYdGVXekpDYTNYU24yNWthMXhMMXUraEd0U3VyY0pLbTVTamQ5b25FQW1pUmNjL2VmWUtMRDU4ZytQVnJ4UHpwSjBULy9Bdjh2L2tlT3lManNDT0tMTXdidXA4MzhBQ1p6TGl3Rmp0ak0xWDlwcDNwSmZCLytBMnUxRCtHZFVFSlhPL2V3YUhLVW13cUxjVU0zdXdaeVVXWW0zMGRBeThuWWRqVlJDek1xc0pPTXZSaXB0SUQ5Ny9CblB6citKUU9lbDdWZFl4T28yNjlUdjM4K3U4b3AxTTNMTHhMVnEvRHpxdzZIS0prMkhIdk9TWm41RkpuVm1KWlloN1cwYlJ0S3J1RG1jVU5tRlRhZ0dsc1FES3FKUld4bDVKZEZ5WlZZQW9GL0lLc2E1aEs1cHVSbVVOd3AyRjRkQXI2WEkzQVRBSnhjZWsxTlNUYkppWWJMYUlJeExBc21xTVN1dmxzZEtaMDZweE1QVXFtbGE0cm1UdlFOanEzaVZVcFVUU0JQQVpub0QwLzN6azlGMzNZa0paVTNZQUIveS9UVzYraGUvc04xdVR3LzB2T1F6ZlA4eGpsNklQcE5sN1VxQTUwMGE2WVIzQXRvNHVXcFNYdUlZSHdDZlJYKzliYWlGNjF0OEVYNWhZNFNKQnNZNnJmWkdxQm5iWjIyRWZBN3JFd3cxN3BoRGN5eGpwS2c3VkdCS2lCa1FwNXZJYXhpbytGWVlWUmwyanBxWlF1Z0pWWXJtdUlaZnBHYXRScW9md05mQ3k5Q2F2NTNyVUU3ZzdLaXAwTWJROXZISFIweGpaclcxWHRmSldWTFdZYUdHSzZvUkVtV1ZsaGlKTURlbnQ3S1owcW81VUN5SmIwRTVwSU1WVzhUaklCbmJLeVJVUWlXdE16ZEtEWmtqN3JOa3o5TFdrOFcxRmV0cUJjNms2cHBJa2lVTVA1L3ZtbkxtTk5ZRFEya0FVUDBGQnRpVXRTbmZLeUovNWhtZ2NaUm5XNjBZaXpsQUl1Tit0eCt2NGpIR2RLMWlQNGpNbTBuZytlSSt4UGY4TzVaOTlBTzdNRW5yY2Z3NW1wZW5kV0pmYlQ4VjUrL0QwY3krdGhWRjRGcTBjUHNDZ3hEbU9EZy9GcFRDcG0wbWpJTXVkSjZXVVlSY0c5dnZJV2pGNTloNlhwK1ZoR2M3V2s0RG9tWnhaaE5FRTBQVWRLcmVmQzc4dS93cnZ5UytnblZFTW5yUTU2NVE5d3RPWWhsdVdVWWg3QktDTmhPL2w5ZG8xZjQvaTFweGdWbFk4ZVV0ZUFibHpxcmU2NitRQjJQL3dMODJMTE1JTUdhejYxNVpMc1NveUpUbFFOUXZSdlZ6clZrY3d5OHlsSFBxTEcxSVFtbzBWTUhscEY1U29ab0FtSVJTdHFMekZzcmNrSTB1cmJFTXp0NHNqQWZIK0w2SFRWZDlnNklrUE5iZTJlbGtmdG00OVZwVGR4c3U0NXRLODlnVUhqRzZ3a0s4OU56a1YvRngrTXRYYkhESE5uVERwcHFNYmdseE9vQWppekN4ZmdFeDBCMjlOZXNQYzVCUjFyQ3h5em9GNGtPRDh6YVdJOEdabmFhbUdOejJSczM1UXNxYWVyRE5rYWtRQjZobGhEd0VrbzBKS3QxeHBTRXNpa0ZENFdkdDFDaGx4OFV2Yzk2d3BBbDhybnBCRTROTTBoa01xQlVxM0YrSnl2bXNVbFlKVzVCanZzSE5UOGdibjhXeWZxNm1LQ2tSR0dXcHFqRjRIYXpkOGZ2WUtqOEZGd1FsT0dZZnJYaUZTU1hvQ1lkR2dTQ0dDU2xvWmcxb1R6V3NhUlFlTkxDTTU4eXFvaUphdmFKL0w1bFhoMG9BVFRyQW9JeGFxUUNNeS9Fc1QwbDRiUFN5cXdPVFViaDRxcThWbDZJUTd5NXJzLy94Yk85MS9DbU96a2NlY2xwY0ZyaEx6OUM5TC9DVng1OVQxTXkycGhYbEdMWGRTTXpyZnY0ZHhYYitINThnZXNKYTBmb1B2ZGtWR2craS9uSnlSaFhSRnZFTDkvZFVVZFZ0UTJZR0krRFU0dWRWdGlNdFpYWFNNalp1SlFZWVVhMGJwTWszU2s0UUVXeWpwN21wbWRSZGV3TjdVRVd1bFZDSG41Vi9pLytnMkhTMjlnTm1YQUV2N2pld3F1WVd0a09td3I3cW45L2ZNWXF3c2FWWWV5VkZpUkpTUFRrZ3JWNUpxWktkVVlGWlNMNlRFRWJISVp0bGZmeFVSbUIxbTEya1ltVUpNaFcxS1dhR1JWcFZ6Y1NLYjMyQnlDa1JlYkJrR2lkUUpURmpOUWEzNW5TNEpURTB0Zzh6dEVDc2puWlpSTDVyUU81WHRtVVlwOHhnencrZTJ2c0xXOGtZMnJESXZKdXArY3VraXQ2b2JaZE5BenRjd3hRODhVYzNUMFZUVnhtMHNYMWNJK0UyOXZITE96d3hFYk1xcU50VXIvZStuK1A2TW0zVWpBYmpBMlUrd3FJY09xR3dtNmRXVEZOZm9HV0V1bVhLTWpSenA4QStwVkEwdXNOMnlLbGRyR1dFSG5MK0FWSXlaeVlhbWV2bUxmTlpRRW4wbC9yQmtaM05NRGUxeWNzTStONGV4QXVlR2dpbDlJRDRRMGdPWFVzSk8wZGZBSm1YV29zVEVHdTd1alQwZzROV2djMm9jbEtFUFZNa0pBS2NHTUUvSHVtaXJRZmhDOHZwTHlOV3owa3Y1YkpCU2lSVHd6bWhoYzZuck4rdEFJTEtPajNCeWZoSU5GWlRoVVhJN3RtZms0VUZ6Rll3RzJrYzFFejJwVGl4NHJ2QVpqR2c3N200OWhWWDJIUnVRRjdHL2NoOTJOT3pqejRpc2NwUHMva3BNSHE1cWJzS01wT1VKem9TVWx5VXNJNVBMcjJFWkE3MkVxMzFQL0FNc0xxekEvdndMVHNzbVlaUlZZWGxDSW5lV1Y4UDc2TFU0LytoS1hIbndEMXh0UGFQeHlNRHNpR3ZzcWE3QWp0eGd1MUtsU3J5RDR4Uys0OHVYUE1LTVdYcGFRZ28yWmVUaDVyUjZ1YkV3NWZ3ZEsvZ0EvL3dyanBZT2RGMmRpUVMzR1o1YXAxUXV5ZG10VWJJbnE1eHdXbXFWcWRDM0tMTVc2YTQyWVZuWWJuV0p5MFRhQnJad0FiTVhXTGlFWFROYnp0MDhxb09BblNLWHZOSzBFSDZWVHJ6SUR0WTVyQXJJS3lxQU8xUERkR0lNSjFqRVo1V3JtMlpLQ09pd3Z1cUZXTVN3a0VVeW5PeDVwN1lwSlprNnE5TS8wWS9xWVFaTXpuK24ydUxNTGJIM1BxZTArOWR6YzFFcFUzVk9uOExtREUzYlFUTzIyc1ZPR1NvMzNDOFBTalRjTnExb1RpT1pZU2NBTFdLV0hRR0lkd2JkRzJ3UXJ0SmphVHhqeVNLMnFJeXhyb2R5OUFIU1pqaDVXR3VnVG9HWlllVndINjdVTkNIQWo3TENWcVlPMjFMWEdmR3lsdG9aYVF4WmRvYTJIZVNlME1WUFhBR1A1dnRHVUJDTmRYVEQwb2g4NjgzOXJFWnFJbG1FcGFCV1p4cXhFZ0ZJS2FHaDROYnlXR2lVSjNnVU5yMFplaitGakFhMnNLcUcwMVBBNnRwRDVIUVJ1VDJIY3pjRVJXT2wzRmJ0a1BKenNwN3FzQ2t1eEx6a1R4d2dPMGEvU00zQW91NGhHckJRN0NKNXRpWm5ZemJTMmg0eDVJTHNZUi9MTDRIanZLVDdQS2xTZjhibjNKVzRKczMwUE9KYmR3eUZxMHoyVUZjZXUzOFZtTXUzYWpGSzFtNG1rd2UxRk43RWdOQVZhNVEzd2UvTm42RlBuN3JzYWg1Mys4UWo0OWc5Yy9nMllGeGFOMmFHUmJFaVZDSG56Q3k0MXZNUUNtMU00bnB5UG9MLzhRMVh4VzBnRHRvNE1mTExxSm93cWJzR2s3Q1ptWHdoVkZRMmxMc0dNd3V1WW5sV0JvWDdSR012VTNmNUtuRnFMM29XNlNaeXE3RmN3TTVlTVc5YUE0ZGwwL2t6N0hYZ1JtNk5kR0Ywck5ha1lyRTdVVUIveGRabWYyaVUyWHoxdlQrYm9RUGFWYU0vNFNKYXZrRmtIVXZlUFRpbWg2ODlUS3dQRVRFM2hEWndYbklRSmJ1Y3d6TWdXbjFyWVk0cVJCU1lUSURMY0tWMVBEdjVYNFhZMVFJRlZ6YVlpbSs0MnAxTW5LRFl6NVRhRFZkaFV3Q2pzdU1iQUZLdDFhWnEwRFJYamlXYVZBUUhwYmxvdjFjcjF6YkJjbTJEVklsakpxUEpjQmdpRVZmK3RiY25DWk1nOWxqYjQzTjVSbGJuY2JVbERaVWR6Wld6VWRLUjVreEw5SWh0bWs3bEhzWEVONDNjTUp0dU9vaGtjR2h5R2prRXhORk1KQkt3VUoyR0s1Ly9lcEZsemxLUlMybFZBS2tmVmk4S2plSU9ZSEVxRFRMUkpvQkdMUzhVZ2VvL3AxeDdUQ0QrRlprZHdKSmFmdVlqbDUveXc5TndsdFgvU3Z0aGs2T1hrNDFCY1BMUm9QSTRTQkZLTGRIYzZVeTJaVSs5V0l3NldWT0ZJNVhVNFBIOE5zOGJITUxsNW55Qy9obU41RmJDc3ZJMms3LzZGOEtjLzR5UnY2QmRrSTVsRjVmTGlPK3pNcmNDYzRFVE1KVUEzWkZSaVZVSVI5dVhYdy9MV0t6ZzFmSWtUTkQ4TzFmZWhuWGNkeHJXUGNaUk12aTR0bHpJaUY3clZOK0JWMlFoSDN2d0xkUTl4TWpaZDZXbXora2JNREFuQm5xcHFHTmJmeDdLQUNDeTlHb3JKRndNeEk3MFlZd2lZUllWMVdGOXhCeXY0bTlQNGZNM1Q3ekNvdUpvWEpKbGdpOEdBaUNoSXFmZFBxWGVuRlRXZ0Y0SFptUmRTb2hOVGtIUzN5RWhXNzRSaWRaUWh3STZoR2VwODUvQU1kT0dONk1hTDNvMXNMSk5aWk5pMVcxS2Vxc2sxU0FxOWhhV3BrdXV5VjRJVW41dHhLZ0RqelYweHprVEFhb2ZSWktycFRNRXkrY1NieHRYYTl5TE16NXlCb2Fjbmpqc3k1WnFTSVhXMHNVVVc4cm00WUJkWmJKc2xtWlNzS3IwQnpjT3F3cHhMVHhKd0JNOHF2bGVtKzhsc0twa0RJTU9yMHBjcUlaMzhvb3ZGVUszVU44Um02bDB4YVo5WjIyQ3ppUWwybUpsU216cmhrQTEvUjFjUCsybm9kTjA5MUtadGh1ZjlWQU9ZUTNreFhzY0lBMmkraGptNlkrZ1pYMHhOU3NGc2tzcEhsRkN5YUxJTlpWbGJzbWtiTm1oSjVTMGlCS0FFcDRRWXB3K0RnRzFKc0xhV2trLzBEU0loZWhEQUg5T0VEOCtzaDJibjVTQnN1MFM5ZXVFcTFwMzF3OHBUNTdITTR6UzJYdkNGU1ZZR2ZCL2VoMGx4UG81bVpzRDd5NWR3ZmY0Q3V3bllMZWxaV0VzMjFyOUZrRmJWVTVjVzRVUkZ2U3FPNi9ibER6aFlWZzJqdTQrZ1hWMFBpNGFIMkVZaHJWTnhFenV6eTdFNnBWQ1ZPNS9GbXlwN1U4M2hEUjEvSlFxelErS3hqVnJPK3VrM1dFWnpNanNnSGdzaVU3Q2Fibm85RzgwaG1peWJsQ0s0a2QzOHltOGgvUDZYcXBTUmZlMHRiS0FlUHZYelh4REo1L3N6Q2huNTJKMVhxdnBkeDRTbVlSMGJoTTNydnlHQXIxdDgvYnRpMEU0MFFwM2lVdENmaG5FZTVjL2srSFFzNW9WWlVmVUVQWG54T2hLb0VoMTRrWVU1WmZKMEQrcFRPYlpoWTJ0SC9kV1pGMU1XQS9hbUx1M0xyTkNmVWtNbVlBOG9xRUV2cG5zcGhOR1hOMHRHWno3bSsyY1EyQXRwR0dSdnE4bEdEcGhpWm91SlpNQXhXaWV3eE1KVXpldy9IeGxQb0o1VHk2WVBFcEFDbVAwRTUwN3FSNW04dkplbTVqTUxHMnd4YjVwTkpWMUx6Y3dxRTFXRU1WY1F3SXVabm1XWWRqbGZXMmxtcFVKYy9qSUNXU1pXUzIrREdDbGgxTStzN2RSU0Z5a2JkSlNwL0pDZGpkbzJhcWVCTHJhZE9Ja05oNDVnRnh1RDlBVEk1Smo1dWliNCtLZzJCbE1IOTdkeHdzaExnUmdZRUlaeHZGZFQ2RWU2VVNxSm5CS2oyWkgzVjJwMmlRbHRGVWw1RlUxTkdrRndTb1FUdk9MMHhYekprZGVuQmJPWWpGcTFDVWlGNWlwOVF6RGxnN3h2dWIycjJvUjJxODhsN09RUDdyc2NnczJuejJPbGl5UFdlTG5nZUZ3NFRQSXpZWkNmRGVQU1Vwek1LOFQyMkFRMUxMczZNa0hwUkYzcTBFMTA0aEk3NmNyWFUrZnV2RmFOdGZtNVdNNzBmTHlpQnRzVDA1bWliK0R6cWx0WVF5bXdyZVl1MXBUV1kzdmRFOFUyTTJoTVppZmxZRkpNb2lwVUlYdERMYUlXM0VTQWk3bGFHcHVFQXpSbTBZKy93YU4vVVpOKzlRdUt2dmtWK1QvOURTY1NNM0NJbW5WZlZoSDBLdXRoV25OSFZTQzg5TmQvWVJPWmVTeUJQNUVYWURHTjFLSGFSNWhKc1BVT1NsS2xoWWJrRUdBMGxqTUxpakVpS0VwMW9mVzRSUGNaTFAyanZGQUVtWWFNcUdFMkVKYVFMaFk1U3JRbkEwaTY3MDMyN2t2TjJ6ZXpCUDJ5eWpBZ3B3SjlzeXZWRXBmdXZGRTlxTlg2QkNWZ1ZHQWlwbCtNd2t6M3k1aGpmUW96REcwd2pVRDdWRWRYYlFVcUt6NjF4WEdUd2ZSa3JKOUEzV05tam9PMkJDdlR2bXhHc3RXVXdHU2FWanFVZ0d3Q2FKTU1XRzlzZ1kybVRTTk9BbGJaTkUrV21RZzRwVkQwTWdKMUVkMytRbjFqTERFMHhrb2FzM1VtVGYyeFczamNSY04wbE01Zmo0WXV0Q2dQRWNWNThFOUpVbnNNK0ZDR0diaWZ4bnFDZE9aeFBZeWoxQmpJM3gzbzVJa2h6R0N5MTBPWGdDaDBDbzVWOVNDazMxUVlWYUlkMDM1YkFsUjZVMXBHTVBoWXVnSTFrYklhbUVIUUN1TTJCZVVDZ2RrK0xBOGRJNHJRUHFvWWJhSUxta3lYekV1Y3kzOTBObHVqMUJ6YWRlWVM5dnBkeG03L0M5U041N0RPeHgyYnpwM0czc0FBN0E4TmcyRkdIanh2M1lOZFRUMjBja3VnVjE0TG5jb2IyRVEzdnB6Z1hjNjB1aUtlRVJ1UFZVeXZ1ek95WVgzdklmYms1cE1seVo0MGNsUEp5SitFeG1JaE5hVHNpNy8vK2hNWUUzeWZCTWZnazRSa0RHYzZscnBUVTVtdXA1TWxKMFVuWTN0K0NVSi8renN5Zi8wbndtOC9RZWJkcjFEeCtsZUUzbjJCWFpmRGNJRHVXemYzR3JTenI4RzY5aUVPMHNCOGxsZW15c1BMdWl3cHpqdVVMQzM5bWdNRDR6QWt2b0FwaHVtSkFHMTdOUmd6U3lzd21iOGh3N0Z0QTJnTXFDazF3UW5RaFBJWVJ0RHkySnI2dGoyL3F4Vy9wMU5panVwbjdaWmVnTjVaSldvSVZycW9lcWMzamYvM1NTdEZSLzRQYmNtbU12OVZxaWNPOVFyQUJEdW1Tbk4zekxad0lWZ3RNWXVnbWNmMHY1MU1wdTNqaGFQU2gycHRnZDNVaFRzSW9IMEUwRDVKK1FUVU5qS3JwSDhacmZxd0swcENBQ3NNSzJDVldWVXlUTHFDenhWUXlhZ3JHTEtZVDJJRjNic3dxMGdFR2VXU3Z0cXRCUGNXUFNNY0pHUHJ1TG5ENUl3WHJDNmVoYVBmUlp3T2k0VHRKWDgxL1hBQjAvN0h4M1hSaDZEdDVlaUdudWV2b0U5NEhDVlFpdExvOHYrMkNFMVYzWGJTQTlDU0RObUsybFNBcWhFSklBekp4eTJrSC9XRGtINVZDUmxZa2NHWE5yRmxsQVBsdk9iRi9DNHlzd0IybFUzVHZ2eXlsRlpXS01xMHIrVk1PMnM5blBGRlpJQUM3ZkhJTU9qR3htS3ByU01XbWpOZDhBYnZENGlFRG0rV0tiV3JoUXpERnBWaFcxSXFWa1RIWUUxTUhEYkhKbUxsbFVEc1lrbzcvZWdGZkY2K3hyNDgyZGMwR1o5R1JtTjhXSnphRm1nT1Uremh1dWZZVFQwNWcrNTVXa2F1V284MG5PQ1lTR1lkRVpPS0tXblpXTXh6RjM3NkZZNjM3c0FvTlFzbGIzL0RBNmIwdEovL2huT1BYc0dpckI2aFAvNExXamwxL04xWXVEMzlHc2R1M0ZHYnVBMUtvWGFrTWV6T2xEOHdMZzJEcUhYN1VHUDJZTXJwR0JDTFQ5am8xang2aXNtVk5hck1VSHVDdUZPOHBEQ21NaDZGUFRzbjhQTjA5cjB5U3RTcy96NHlpWVk2ZkZCZTB3cll3ZktjcG5NdzJmVmpXYjJRVm9JT0lhbXFSRkpQQWwrMldCcHM0NE54eG02WWJ1eWtOcmFiUVpaYlRIYVRmVzFsOHJUTnhmTmtWcWYzMC82azNJNkVESit1MWFWTE56RlZtbkk5TmFXcWtzSVFOcFVRb0RZenEyeDNMMU1CUmFldW90T1hTZFd5TGVsOGFzeWxSbVpxQng0QnFvQmMyUGt6bXJBOVpON2RCUEVSYTBmb2VYaXFSblBTelVudDNMUG0rRWtzK3VJWXh1ODVoTEVFYS9lVHV1anA3STUrQVNIb0doR25wSlFtSWdsZEtIdGtrWjhDR3lXQTlFRkxYNmthTHFYT1Y3cFVhVlVDdHpua1BQMkJBRlg2V2FXdnVnMTlUTXVrTXJLcDlMa1dFTEQ1Tks1azFqMm56NnB5TDVzY1hMREJ6Z2tiN1oyeGltbG5nU1VGT2kvY25rc1hjSWpPZE8vNWk5aC9ucXg3K2dMV1dMdFFYOWxqcGFNbmxqdDdZYW03dDVxN3VwTkEzWjBVajczSnlkakMxdmdGMDdrZGpVYk90MytGclBVcS9UdGdkYTBCaTJpQVB2VUx3MklDWUcxR0JSYnpINXB3TGx5Wkx0T3Zmc0pudFhmVVptcVQwb3JWMXBaVGFmYW1zZ0dzVGt2RE5tcm5TOTkvaDVRLy80R0VuLzZDa0QvL0ZWYlV4dXZKZXAvVFJNMW5xbDNEaStQOTFZOXcrdnBuRENZNzlpS3J0bzVPNGdWTXhFQm1obzh6aWpFMnE1Wkc2cTR5VXgrbkZkRlFKZEh0SjZqYXJHMEkwTzVrOWI1c0xCTGRDZHF1WkZ5WmRDMnJFWWJ3ZnhxVlg0T1IxTU1qcVZFL0xhN0Y4T1I4aktQZUhwOWRvVllDOUkzTlFXL2VyTjc4bi9yNWhtT1FveStHbTdoaG9vRWpaaGpiWWJhcEZhWnA2MkFSUXdEcHhPdG43TzRHaTR2bllPQjd1bWw4WDFoVUFFbjNMNjVmd0NrT2Z5UFpVR1pReVNpVU9ISTV5Z1NWMVlhOFozcGtUanI5VGFZa0htMFprVEpXdzZneUYzYmhjVzFWa2xJbXRVZ3ZnWXp4UzFXVy9UYU8yRVZncXlVeFZrN1lUZUR2czdJaW01dGdyWjRlUDNjU2t3NGZ4OUNqeDlHWG9PL2k0SWdCb1JINEtEb1dyWmdwTlFucDBQQ2FTYXB1RlZPazBuYWJ1RUkxMiszZlVZaVdDWVZvUllQYU1wR3BuYUNXeDdMV3FuMGF6V2gyRGRvbUZoS2NXV2hGRDZCSjV2ZFJWc284Wk9uZUVxMnIwUW9JaEdWOEhHekplQ2N1WDhZT2FxVTkzcWV4eFozcDM5V1Y0WTZ0cmg3NHpNTmJiYWU0MTlzWEd4M2NWYXh6Y3NkYUZ6ZXNkSGJCSW50N0xHUXJYT3J1Z3BYZVhnajg2aHMxQjNhTDR4a0VsTjlHMGF1L3dMZm9wbkx6QVc5K3hocUNhRmRtQlhWdmxpcm9POHN2V3RWalhVd21uUm9VZzNreWk1NXN1N2ZoS2VZbVoyRmRkcDZTRmhzVEVyQW5KUlVHUlNVd0p4T2ExemZpWkhXVGNUTysvd2Fya29xeGtTblk5UG9ETlVsN0RiOWphRklSdXNSbllCaGQ2c0NVYkl5bUhoNFZYNEh4cVhVWWwwcG1wSWFWR1Z0ZDJMZzYwUFNKR2VqSXY2a2IwN2hNaE9sR3pTbjFVUWNTdUIvblZLbUZpYU1wWWFSZTZqQUNlSFJxQVVhUmZTZVJkVDlOTFZhYkZjdDVLUkE4NUhJMCtqcWV3MkFUVjB3d2RWSEZLYWJvbW1LeWxoNFdFNFRiQ1R4ZEFzalMreXkwQ1FLZFUxSzl6MFU1OHMzVXErc01qYkJLWDc5cDZKUWgvYUd5RWxYY2Z2UFlmbE1RcEFKS0xVUFZHN0JLaDgrMWpMRGttSjR5UkdMRTVMaVpvRnhOdmFuV1pGSCtDYXZ1STJCMzhQVTF4M1N3aFVBLzR1eEJzRk1XNnV0aEZvRTZuaUFkUnFEMzQrLzFJVDU2WHZGSFowcThGbkdKMENUU0JDWFJHQ1VRVEFScnkyaUNOS29RWFRPdW9WTmFHZG9rRjZtT2ZYbE5nQ2xBYlpWRXhpUjRaVks4V21wTlJsV0RLdlFCRWkwVEtSVmtjclo4dDh4NzVibDI4aG1Ea0JEWUpTZmdUR0VoTEtJaWNOVFhGMFk4cDM4MUNIcFhnbkdFR2xhVzJHNGhNRGM2dW1JZEdYaTlzeHMydTN0aHBWMVRUU01COWpwN1cyeHd0Q2Z6ZXVQZ3hZdFk2M29LVzczOXNNN1dBeGJScVFpc3VRZmY4bnFZOFVidXVSeUpmVFE0aDZoaGppU1c0REJibG13dHVZMW1aMTVpRWxiVExIMlJlUTJCci8rcDlxbXlxcm9IODJ1M3Nac3NhNXhkQWdPbVc4T2NJaGdXbEtuMVlBZllFbzNybjhEOW05K3hwL0FXMWpLdGVEMzlEaWZMYnVGUS9TdE1TNzJHY1hUbzQzTXJNWWtHYUJUVHo5aW9Nb3lObFdxQUpXcDVlRjlxTGlrZTNDdStpUHFyZ0VlcEJKS0hYbkhVcFRHWnF2cDA3NFJzU29vQ0RFa2pPSm51UjZibXEyMHNoOGFrcVoyMEp5VGxZM0pTQWNiRXBLdnROSWRlalZaTFU0WVp1MkswdmgwK0phTithbVJGUTZXUFJkU01PeDJjMUZKcEhhbEI1ZUJNQjI2SGcvWjJxaXk2Nk5LdDFLdnJxVnRsTW9vYXY2ZGtrTzRtV2R3bmorVzRnbTVjSnArczRsRUF1NUphVXBoMTJRa0RiS0hVa0JHcmpXVGM1VWQxc096SVNXeG02dDh0azAvMGpMR0ZETHFKV2xkaW00bTFXbVd3bnQreGdZL0ZoRTA2b1lVUlpOU0JUUHNEK1psQmJGQURnOFBSaDU2a1hRSVpOWVV1blkxZlRXeG5RMjdCOU4yTzE3TTkyVlhtOW5aSUpjc21FS0FDUk1vQ0ZjMGpWTlN4YlFsY1lWd045YTBDS1gxSHEraDB5Z0dDUHlJWmJYaDltMHVKeWtDTVJ2YUQxL0gzZzFsRUdFekRRMkFURXcydmpIUjRKNmZqYkhvdW5NazJKb0hoMExrU1JGWTlpN1c4d0d1ZG5CVlFGNXBSMUJPazIxeGQ2R1FkQ0hCL2hGUmZROWJ6bHpBblFEYzUrR0NudXk4Mk8zamgrS1VRT05QMFhLUlRUM3oxRTh6SlFETk5uTEdRckRQZDdwVGFTSFp0Wkp3cXpyVXlJZ3JIMkJvRDc3MUY1dmZBMmV1UFlWZDJIUmFGRldxYkl4bEtQWDN2Q1l6SWxQYlhHbUZZWEFlWHIvNkU3UVUxV0VpOUtjeHFXSDFiYlltNU5mK1dxc2dpazJMR0VVelQwOHN3am1BZUYxV0MwZEZsR0VaOXBlYTRzZ1VMV1B2R0ZLSm5aQUVCbW9XdXNaa0txQkpxRVNETjJSQm1pNCtaN2ovSktzYW9EQUtUd0pVdDVEK0pTc2VvOEdSTTRvVWVHNTdFMUg4VnZSeThNY1RRa1FCMXhuUWplMHpTTXNFRUhiS1ZzVEgybnpxRjQxTDNsRjVCT3Q5bFhIK3ZvNU5pV2huWGJ5NDZzWUdtYWpXMTZqcHpLelZXTHk1ZlhQd1NQVElvVFpZQVZaWk1DMWhGQ3F3enNsU2pVcHRNWk9remdVNldGVkN1UGFtSGd6Wk8xS0d5azdrbkRwTjhkbG5hS1haZG9VVXR5OWRGNDI2d3NtZERNc05ZTXYvQVk5cm9jVndMdmZuYjBvYzZQSXhaZ2xLcVEwd1NXc2Fua2ZtRS9RZ2laaEhGcXJ5V2Jha3htNXkvOUpsbXFYNVRDZEdsVFpxVjc1ZWhVeEtWT2svZm9BbWp0aWNnMnpLRHlTQ0NSSHZSc241eGFCR1Vxcm9QSmN0cFRsN3loWDZBSCtNS3JLTERjTEc0RUg3RlJiaVVrNGNyMUlxbms5TGhsWktPYzRVbGNNbkl3akdtZ0cyZW5vcFJOL0xpN3ZUMFVMV050dGphd0Q0MkJwWFVrMUxFN2U0L2diMnVGN0dEZ0QzZ2NRRXUxQjlldWFVSXVmMFF3ZmVld2tLS245bTZZbzZiRHlaWU9tSXloZjFjZXpmTXBqbVlaK1dJbFo1bjhEbkZ1MlZPTWR5dVhZZFZSU1ZadEJDdVZiVndyYW1ENjkxNzBDb3N4ZEhNQXV4S3pjWGVxanJNWXRxUW5vWlZlY1hZbXBHTjR6ejNlZDBUdGJQMFRPcE1xZXMva0JKRDlnVVlFWjZMWVV4Wk11RlhqRmVuMkRoMFpscnJUcDNaUFNwUEZTQ1dmbGlaMmliYkVYVVhJTDhENjZqY2Nvek5MY1B3cEd5Q1BWMlZLNUplQjltTjV1UEFHQXcrNDQrZTFtN29hMmlEMFRyV21HbG9qem42MXBoeVFoY3pkUFd3Z241QUtwWWNvRmFWRFp0bFdiVVVSZHROdVNYcGVnTkJwNmJ1dldOU0NlbllsNlhNcTZTVG4rQ1JCWDVMeUk0QzFDVTBQYUpOUmJNMmcxVytRK1lIeUZTK0UvUVVrdUwzMGtSSlRRRXhVcC94ZFFHcW5pL3ZlM2kwMmdOZ3lqRXRURHA2QWtNT0hrWXZwdjF1YkFqZGFicjdlcDFCUDJiWlh1SHhsRWZ4MElURUVXVEpCQnhUdEJydlo0UzlpOURtb09rS1MxWTlBcTBpbTJaY1NiZVU5S0hLNnkxREJaajhmR0FTV29XUXFjUEpxZ0Z4YUhsVk5qdkpSSnVyR1doL0pRdDlBdlBReFRzU282K3ljWmlGQk1BakxRbHV5ZkZ3UzBsQVFHVXB6dWRtd1pNNjlseHFpcXFsZVQ0ckMxZkx5K0ZmWGdtbmxCUUNPeGo3VDUvQkhqTERiZ0ozdXhNWmdXRVVGSWdMSmNWcXl4ano4QlNzdGFEZWRmTEJKa2NQN0NZcmIzSHhnQzFUeDBwYko4eGdhNS9Ob3hTUm5VbmRLNCtYMmp0aENTLzJrWXRYc05MZEdYTWRyYkhJd1FZTDdhMnhtTXk5eXRNZCt2RUoySHVaaGk4b0FwOUxyVmhxVWQzQ0txeFB6TUNLdEd3c3ljN0hzc3dzbU4yN2kvQi9BY2ZxSHFtaWJaK1NQY2RGcGVDVHNEaFZVK0RqMEV5TWlLUmhvdm5xbVNCTHE2UHhFVTJjbUNJcFhOc3JPaHM5bVhyRW5FbjBsakpIY1JrWVNzQ096aXpHMUlJcURJOU1WUlVOaC9sSFk3aGZPRWI2aG1MNG1TRDB0dlJBZjMwYmpHWGFuMnBraDJrNjVrM3I3UW1lMVdabXFxVGtOc1phUXdOc01EZkRUbXArS2RIem1YZ0FwbTB4UndJOGNld0NWR0ZRQWFuRWNzcUNWV1JmbVpRdExsOUdvZ1N3SDRKVnVyRmtOdFFScjlNcVEzcEV4MkVuWmNRaEd3ZFluTHNFYzE4L0hMSjF4ajZhYVprOGZleVNQeHVTTmdidTJvdFJ4MDVnQU5OK1Y5NmZucFIvQTVnaCtsd0pSVWRHeXl0aGFCRVlwOENsQ2FCZURlQlJPdTBsNUxHY0M1SWdvSU1UeVlwOFREQytmNjlFWUFyUDgzaUY3d21JSnpqalZZRnBxVXplNmtxMDZ1WWJKU3NvU2granc0VlVkRDJmaEFHWGtsUk5YbzFiY2l4T1o2WGdkRVl5QVJ0TG9HYkFOU0VhMXVGWDRaNGNqWE01NmJpUVF3ZWVsNE9RaWdvRWxaYkRKelVUcHRTME9oY3VxUTBPWko4ak1XVTdmVTVSeTlKZ2tTVTJlWnpEQ3NkVFdPVGtnVlduVDJPVDczbHNQMzhPenJuNTJIV0tySGtwQUNmQ1k3R1FRSjNwWUkvWmpFWFV2Q3ZvZ09VN0Z0b2FZWmFsTGxhNVdmTzdITEhEeFFtbW9XSEllZjBXNFRmdllwZU5GMHl1eENMb3hsTmsvUGdQNk5CRUxUc1hoRzBwT2RpWFd3THJtaHU0K3MyUFdNZld2b0FYUi9aMG5SZ2NpNlZrNGs5REV6QTlJa2Z0cVNxckNZWVRyQU1TNHRFL1BsNVY3aDRSUzhabDZ4OFFua2s5bW9NUmRMTWpxRjJsT1BIa2pISzFFZHhjbXNOeFlXbVlRYjI3aEZwdDNKbFFqUGE0aXJGdWx6SEMyQTJUZE9uNGpXd3hnL3B2c3E0Qlp1bnFreDNOMVFpVUdvbXl0aVFJZGJES2txbmFoaHFWalhZVDAvUXFNdkE2WTJwS1pwZU5ORDZyVGEzVUNKUjBRVW1mcVhSQnlWRkdvdFpZMnFydDgyVjJ2K2hWS1VxaGxsY3I4MFZUeFlZaFVtT1BqUjJaMUV6cFlrTXZIeGlRT0VTN2JyZXl4VllTeEVJMmdFK09IY1B3NHpSU09qcm9ycTJEWHZRY1BTLzRvM2RRRkxvRVJxTEY1VkJvTGtjb2dMVUpURU1idnlTMEpZamFNK1RZNm5JQ1FVdkdaV1pSd2NjdC9HVnIvdGltRUhBeVd2Z25xR2g1SlFHdHJ3cEE0OUNhNWxwMjNwSE5UUHBFWmxKZVZVRDJMT3ZJMTNyeUdzc1VRNDF2SURRQ1RzZllVRGpFaE1BMk1wQUFqWUpkVkNDZjgzRmlHTTVsSmVGQ2RpcUNpdktSMmRpQVhLYmYwT0pTWE03T3hZV3NiSGdtcHlpZHF4UG9qNTJuM0xIQnhSNWJ2VHg1OU1ScVozY3NkWGJGY2c5M0xLQzJYV0pMSGViaXJxb2pTNkV2bVZtK2pLOHZkbkhHWWxjbnpMRzB3RjZDZXBHRkVaWTZtbUdldFM1V09QUEcrbmhndFpHaDJqOHA5ZEVMQkpiWDRRelpNcjdxSVVxLytRTnVtWlhZNFg0Wit5L0g0Tkt6dC9nOElRMjdtTFlPaGtSaE4vWFBRYnJPei9PcnNEa3BCNnZwK2xlVFlWVXZCTlBObk1oa1RJMUp3TVNZS0l5TmpNU0VzQVJNSWxCbDV4YlpISGhXY2dsbXNpRkkwWW54a1dtWUZwK3JabWpKTW5JcGpiU1I0RDFVZUJPVDNmMHh4dEliVSt6T1k3cTVCK1liMkdHT3RnbW02Qmd3aTVBZHFVazNXbGxqQjQrN3lJekh6NXpoTlRERlVvSjFKZ0VpMitPdk0zZkFjajByTXFXNTJtQkN3S3BBK281RlB3VHJFanJ6VlV6cnNtaFBYaGQybGJGL0dReG8wclpHbEJhMnFwemxrdU1uc0k2TlpZUE14Q0tEYmlSUWx4N1h4WHpxMUZIN1BzZkFmWWN3akxLaTEwa2Q5R0RER2s1QXkwYlBuZWt6MmwwTVJvdUxBdFJJbGFKRlIyckljbTB2a0ExOUU5RGVONDVIc3UwbEF2UnlGSUg1TGk1SEU1eXhUTzBKYUVNejNUWTRGVzNKcXEydk5nRzdLK1hBUnlGTS9SZkltR2RDME9GeUxCdEZJanJ4MlBaaU9GcGZDa2YzR1BvSWtrK3JFSDdYVmY0TnRoSEJaRkYvT01jRzRWdzJVMzkyREZ4anI4SW5LUnplY1dId3owbEJiRlVwZ1ZHSzlKczFxSHp4R05kZmY0bjhCM2VRLytndThoanBEeG9RZStzNkFxdEtjSzRnRTZjeVU5a0FZbFFwYnJPd1VKeTRkQUVIdkwyeGl4ZE9PcVJsWkdVZGpjVUNTWEdXTmxoRjdidk8xUTBMek1rV2ZMekl5b0xNYW9yVjd0U3ZGb2JZNE9HQ3RiWjB5ZTZuc0lMR1liT05PN1I5Zy9tYnp4Rno1eVhUV0JoMmVQaENpMXJxV0dnc2poS2tYMXdKd2Q3elZ6RFB6QTQ3MlNyMytJZGpkMEFFZEpLellVTG1QVTV6Y0NBNkNmdmlVN0F4TEFMckl5S3hrWC92a3FzQjhQenlMUXhxSG1JVHdTcVZRNVpSR2l5bStKL0I3NThaSG9lRnNjbFl6TTh1Q292QnZJdUJtTzUraGliUkUzUEo5Z3R0VG1HSkpRRkNKNzZZS1hreDllRXlNcGdNdUt5eXNGRWJSTWcxK016VlUvVnR5d3o3cFFTWHJHQmRTb1pjWm1SRllGcVNMYWxiR2JLdVg1Wkdyelp1V3RNdnM3S1c4MzBDWW1GZEdZMFM0RFlEZWpVYnd4cXk5Mm8yakJXbVBHOG9NLzhOc0ZMUEFDc0kyTVhIZFREbmlCYW1IOVhCSjUrZlJQK0R4OUhybUNINm16dGlpTnM1REtiUjdYTTJFSjNQaGFqdDlGdjdocVBsQllZdldaV1BOYjRFRjZQRmVRRnNETm9TdkJLdExoR2dsL2lhQUpicFhFQXFLVjdZVlk3Q291MG9DVG9FTkVXckM5SHFjNTM5azFSMEpJRGIrOFVvMExhVHo0U3dZWkRWTllGUmFCWEk3L1BuZCs5eXNzUHg4NTZ3anJ3SzM4SmtSRFdVSVAxaExiTHUza0R4bzBiVXYzMkZodTlmby9USlhlVGZxMGY1cy91b2V2bElQUzk1ZkFmRlQrK2k5TVVEVkx4K2htdmZ2TVExdnIrR2NmZlhuOUQ0ODArb2Zmc3R5cjU2aGJJM2IxRDAxV3NrM0xsSFhWc092YXNoMkVNNXNNbkpGUnVZbnRiYU9xalJuR1c4MEV2SXNJdXN6TENTbW5XNWpTVTJFK1Q3ei9xcWt1QUhmUzdoWEVrdFVwNThqWmg3cjJCTkhibmR4UWYycVhud2tqVmhCT3J4Z0RCVkxTVHMvbE9ZeGFkaXVhVTk1b3BydHJERE5wcUZJL3p0RldUM1BkVEdSME1pNEg2dEJqb0pTZGgrMFE5R3pCYXlRNDFPYWduMjBLbHVEMG5CVGpyUkxUUmE2Nk9Tc1NvaUhzdENJckdBT20vdW1RdVlTV2M5MDVxcDFNcUZFc1lWSzgyY3NGaWZJTlUzeHlLeW5RQlFDa1NzSnRCV0VtZ1M4bGpxNzBzdGZ0azhRdXJ4TndOeGhXaFFjZkg4bklUcVArVnpTZStiYVVLMzJEZ3J4aFZHYlZvS3pXdEZNeVpMVUFTMG9tbVhVMjZzWWVNUVFsak5CaUt2VGYzaUdDWWVPSXhKaDArUzdZMHc0cWd1Qm1vWjBnUmFvWStOQi9xd3NmYzZHNEF1NTRQUjRYd1kyaEY4YlM1RnY0L1dGNk5VQ0NnbFdsNk1WT203TlZPOGhPeTgwNUpzS3NkV3dzQThTdnB2d2RUZW1velpsa0J0USszYWpoS2dMZVZBNjRzeEtnUzB6Y0Q5U0xZc2pjNUQvOVJpQlZKTkdLWERWYkxxeFRCMERhRVptM1hpS0JZWjZHQ0RuUVdPWERvTnovd1V4RDI2aVJ5Q3NQakZmUUx2SmE2Ly9STGxYejVTd014N2NBdHBONnFRU1NiTmFieEp3TjVEN2RkZjR1NHZQK0RoYnovalBrRjY1K2Z2Y2UzbE05eisvbHVlL3hNYWZ2b0pEWC82QmZXLy9JcVNOOThpNGU1OWhOMXNRQ2pEdjdaT2hSZWR2a2xVTkE2ZU80LzlaM3pJbEs3WWQ5cUxnUGFnWG5XaFlZdFNhOVpQcGVmajF1K2dLU3lDWTN3MmRPbkFOOWk0OFgzbnNjL25JdmJ5UFNmQ29yRHI0bVhZNVJmQk1Da1ZxNmdIVjVMRmx0azZrdVVJRGdjMkVDY3ZySGYweEg2bU8vMklCR3ozUEtlTzdnVVZPTWpVcDhjMHJ4dVRCNzM0UW1nbkZ1SklYQllPeFdSZ0Ixdjh5bk4rbUVNdFBzZk9GWE1zN0RHUHVuUVpkYWFVMEZsclFGQnFFV3hNNVRMN1NReVBHdjdrK3phWjJUWk5OR0hJZVpsaktvK2w3dFJuQktGVTM1UGpOdXJWTHp4OTFIWStzaytxckM2VjZpcXlLclY1emI5ME00bGVGWVpkeXJRdVBRTk5ZQ1ViazIwWG5qVEN6RU02bUxEM0tNYnZQNFlKUi9Vd2p1ZUduVFJBYno3dXo3K2xuNzBiK3ZHNjlia1loSjY4anAydVJxblMrUzJ1dkdOSmd2US9nbUI5SDhLa0JLc0t5aThGenVZUWpTcUFEU1N6MG1RcG8wV3RLenEySlhWb0srclRqcUZwYWpoYVFDelA1WHp6YThMS21pREtDNXAwQWJqVTllMHRjd3JtYUd0aG5xNE81dXFjeEh3OWJheWo4Lzc4dkRkY3FGMHZsMlFpOFc0ZHNwL2VSZzVaTlA5SkkxUC9IZVRjdllXeXAyVFQ1NDlRKy9vRkduLzhGZy8rL0NQdS92Z1d0YStlbytUaFhaUTlmb0JiMzc3QjNaOStKSmhmbytKTEFmeFh5SHp3Q0dIVjF4RnhveDV4OXg0aTZ2WmRSRFhlZy8rMVdseWlnZlBNeWtWUUxWK3Z1NDYwaC9lUTkrd1pvbXBya1g3dkVjNW41dU5zV2o1Q1pkV0MxeVVhQkZkODV1Q3B5dGRJbmRCamw0TnhNaWlDc3NJVk95LzRZYldIRjdiNG5NTnlzdWh5T3ljc0p5T3R0WGRWeFhEWEUrQjd2UzdnNklVZ2VPZVVRK3NTNWNxRllEYWlod2h2ZUlabEpzNVliZTFOWFgySkd0d1BtMDVkd2lZZlA2ejFQSThGQk5ROHBuUFpTWHdsMlc0RmI3eWs2cFU2cHRoQVZ0MXFZcWRtN0V2bittWlRLU3RKTUZvNVlUc1plTHVsb3dLam5GZkE1ZnNVWU0wcERXUWlFUUcweDlGRDFVbVY3aXpaNEVMNldkL1BTMlhJNDBWYUJsaXNhNFJGWk1sNUovUXdseHBVanZOUDZtUCtDVVBNL053UU00NVFNeDh6dzVoanhoaHl6QWg5VGhpanA2RTF1c2hhL2pOKzZIVWhFTjBEd3RXcy9yWkJrbmFibzhrc1NRcFhKa21NMDM4SEdmTS9RajRUVEZDK0R6NFA1Vkc2c09ReGRhdjBJc2hFOW01U3h5RXdXYkZ1QzBxQzVxTUNOQUdyb1JSb0pmTXFxR2s3QkdXZ2MxQW11b2ZtRXF4YS9BZHBBdVpwNjJNdUgwdktXR3BraE9YRzJqaDQya21CTnJyaEdxcCtmSU43Zi95Q0JySm05ZGN2VWZ6a1BtWENYUlRkYjFUZ0xIL3lBSlVFYURrQlZuejNOc29lM0VYRm8vc292TmVJckZ2MXlMbERHZkh3TWVKdjNLUmh5OFZacGx1ZnJCeTRKYVdvZmVnbHpoY1ZVaUtVSXZQcEU5Uis4d1pQZnZzemZnQlV2R0hjKytsWHlwRFhTTDBwSnE4R1RoR0oxTnBwOEtFRzNlTjVSbTNFc0pXNmRwT2JKd0hyakVYV050amtlUW9yS1RGa3dzNTZnbmFubS9lN2dyY1h5ZFJYOExtbkx3ejl3dUNiVzRIRXhtZndUaXVHVVVBTTJhbXBXTU1hV3crYXhWTllTd0N0ZmhmUzliYkVnaEtGcGtqU3JSZ2Q2YXlYNFUrWmxMekwzb1VnRTMxS1oyOU8weU1GZVpudU4vTnpXMjJkMVQ1U2FwYythVHdFcXFSKzBhYWlWYVZZaE15U21xT3JqYmw2SkJKOWJSVUxEZlN4bEtCZFptcW1KcU1zMUpVdUxWTXMwVFhEQWpMbTNDTUdtSE5ZSDdNKzE4ZVVnM3FZK0lVSnhoNnp4S2lUTmhpaWE0ZGVoZzdveG5UZmc0MnV4K1Z3ZEF1SlI0ZFF1bkdHSnBRZ1VjQWlZQ1JrU3FRQVVCaE9vaG1RSDRiTVNwTXVyUDhyYUd5bDZvcnFXNVcrVnBrVEhKZUxickpKZEc2MW1vMGxnd0VhdFZSZHZpdE52VThtdnFnbDdXRlphQkdTaVhaaE9mZ29QQitkZ2duV1djZDAyQUsxVk10Y1FvM1ZkTUhZaXEzSkV2WW0yRWlqczhmRERqYVJ3UWlxS2tMQjg0Y0tzT1V2bmpBZW8venBJeVVGaWduT3dudTNDZFJHQlZhSm9qc055S3F2UTFKMUpSSnJxNUZVVjRlSXFtdnd5OCtIVjBxcU1tQVN0blRoVGdueDFNd0ZPSk9iUXlhdEppdS94ajNHYzhxSWIvL3hOelM4L2dxMXo1NmpxUEVCTXE0M0lQc1dHOHJqbDRpNzBRai8waXFjTHl4SCtvdlhDTC96QUtHMzd5SHc1bTM0bGwrRGNYZzBkc3RPemxLVm1ZQ1JhaVNmZTV5QmZXUVM3djBEY0NIWVB5TXpmMmJ0QWlQZXhQaUdKN2hZVWtNejU4UC8zMDBCZkFNbGhNeEdXeXd1bk5kR0RKRzRkOUdHeTR4cGJNek1zTUdhTEdwbmc4OWtvTVRWRlpzZG5QaDVndEdHV2xSbVRWRS9pcUdTM1V4a3NwQk1HbHJ6YnNiYk1vSnpDVE9ER0xLRkJPMDhtU0ZsYm9xRmxxWkt1eSt3YUhvdTFmam1VcFBPWXFPUXNwT3FSaXJseHl4ZFMwdzlib3JKUjQwSlVpT01aZ3c2YW9ZK0o2M1IxOGdGQTUzT1lSaE5rcXhVa0gzQlpMNnBqQmpKTUtaYSt4VE5rT0hNR0FiTnBCcitsSkdsOExTbTRHY0VTRElrMm54c0tSMzlsRXBxN1JrL0sydWw1THlLZDJ1dFpJbUt6TGlTRUJCS3lHd3NtVm5WTkJXd2FaYVZ6TFpTSzF2NXZxYUZsM2xxa2t2YnhCSUN2Qmp0b2dyUVBxSVFtdmNqSVhTVG9uMFdheHRpdnBZV1pwODhpblcySnRqdUxPN1ZsSHJNQUd1TWRIRFEyUjUyb1lGSXVrbk5ldjgyQVV0ajlkVUxWTHg4VHJaOWdLSUg5eGwzVWZuc0VWbndvWHFjVm44ZDBaWGxDQ0p6WHNySlZZTU1yZ1NuZVhBUVhIZzBDd2xTNFpxY2lMTjVPWWk5VVlQcWw0L3g0TnVYK1ByM1gvQ3JzT3MvLzRhWFAvOEp0eWduYnJ6OEV0ZGZ2RUpDWlEzOHMvTVJYRnFPR09yZjgza0ZpcGx2L3ZVUFBQZzdxSlAvZ3R3SFQxSDMzWjlROS9ZWEpGNXZSRkJ4RmFLdTNjU2QzNEJIQk92NTdHTG9Yd3JFRjZmT3FUSTQrd2hTMlloTWdMWGEybzZBc3NkNmFsMXgyQkt5ZTRuVTIxOXRJZHBRdW8vTStWNWJndHNGT3oxY2xOYmU2ZW1HN2U0ZTJFYUczK0RzcW9hbzE1SHBaVkxRQmhkM2FtWktESHZLRWdKV2RQUlNnbllwSllMSWlrWFV0Z3ZZTU9ieGV4ZGEwVHl4RVN5d2x2MmlyRENidnorRGpEMkZ4dW9USFJOOFRGWWRRWDA4Z0dtK1A0RTY0SVFwQm12Uk1PblpvSys5TndhZkQ4Qlk2ajdwUzViOVpqdUhwYWlsSmdJTVRVdytnOGRZSG1NTDBDcXVVTTJVa2lKcFV2K2dRM0x4djBQS0lqR2FqMUxZUTQ1ZE1pdlJJN2NHM1hPcTBUbTlITzM1WGdsNVhjYjlaYXFmZktkTS8xTlRBMlUxUUFqQkhNd0dJRWVla3lYWDdaUDVmcG5Va2x5aTlnL1FwREF5eXRFaXV4S3RaQW0yVkx1UjZZSXpqeEdZSjhpc1dqcVVBM3FxcTJPTkZWT1NPUUZNZ002bEFWdWdkUnpyVEkyeDFsZ2ZLNmh0TnhvWllObnhvMnFuRU5tVC9teDZNc0lxeXBIU1dJL1NseTl3L2J0dmNPM05TeFE5dlkvc2UyUkJnanJuOFgxa1BMaUhXRXFDMEpwcWVHV2tLWENHa1htOXNqTmdFUmtHeTZod25NckpSUFROR21UZnJzR3RyeDdpd2Zjdjhlclh0L2dGZjhjUC8vb2R6My82SHM5Ky9vSG52OE8xRjA5cDVMNkVmMDRPTG1aa3dTMHVEZ0hsWlVpNTNVak4vQndGRGZlUWU3TVJMLy80SjY1LytRMHkrVGlIekN0YmxDZldFZHpwT2JDTGlJWlhhcGJhUi9RNGRlNE9adzlzcEY1Y1F3blIzQTBrYVZ5Tno1UFZaTWFUckZtU0dWQWJMQzNVNk5NQmJ5L3M5em1sZGlPUjJIdm1OSFo0ZWpOT1k3T3JKNDJjR0RvM2JIVDFVRFBWQktEcktDMVd5K1puOXU1WVl1dUt4VFl1QktaSUYxZDFsQkcrbWNabWFpWEJSR2E4VDdTYnpGSC9FL3JvZVV3UFBiU04wVTNISEoxMExkQld4d0x0RE8zUTFkb2R2WjNQb3ZlcGkraDFOUlJkcWQ5RmozYWdLV3pEOUs0cW9qUXZIeUVvTmRGRkRObUJ1MERONEc4VklZWFN5SHd5T1pycFc2MUViUTVaMFBkQkNHdTJTMnFhc0tKbVY4WEw1QlNwbVpDdG1GU3ExQWdRQmFneWw3VTFReDVMdFJYVktNaWNVaE5BanEzaStEZThtK1FpWUcyVldRNU5LdjgybW1pTjlBeXdZYWo1cmJOT2FxSEpaR2xoZ2I0T0ZwQTlGeG5wMHJBUWtJYjZXS0xQeDNxNmFvbnVLa01ETlYxdEpaK3YwdGZEV2lORGJKQTVqd1R4YXI2KzNkWVNCdjZYY1RvckRkRjFsY2k0MzREQ2wwK1JUWWFOYTdpSnlKdTFTSDU0SDNsZmY0V29PN2R4cnJnUTlpbUpLbHpTa3VHYW5vS3pSVFJRL0d6aWpSSWsxK1lqckRBSkRkOCt4b3ZmM3VMUm43N0N3eDlmbytITlU4WkxWTEV4aUpHcmVQYVlwcStSTXFNV3hjK2Y0ZmsvLzRtcXg4OVEybmdmQmZXTnlMdlJnTFRLNjRqS0wwRmdaaTRDR0pGbFZZaXVxa0ZZNVRXbG5YVXUraW5HRkFra081U3NGODBwZXBQdVdxMnJwejZVMlVzeU0ya3JuYmhVbHQ3bjVJcURsQmlmeTRRVXIxTnFjc29lNzFQWWU1cE8vclF2NHlKTjNIbDg1bllhVzUyOHNkbnBGRFk0ZW1PTnZTZVdXYnFTU1YyeDBNSUZjNlZhb0lrVFpwbzQ0bE5kRzJXSUptaVpZL3hKTTR4aWVoOUdjOVR2aUNGNkhqZENGeTFUZEtTSmEyL3VnQTc4bnZidVo5SHU5Q1YwdUJSTUhScUQ3bEZTL1NRQnJjUHA2aU9qbWE1cGt2aThCVk8vU3M5cUtRbUJ4YlRha3RFcXNnQ3RJd3JRSm9JcG1VQnRTeUMzZnJjV3FtbE5GRU5tK1A5WHRDQ2dtMEVvajF2SWViNVhDbjZvYy9LZUQwS1dxcWpIMUtMcU84bXV6V0RXMEd6SnZBS3BFNkNZTlprcFgyWmJaVExrbUZLRUZuSit5cEhqbUhyc0NHYWRQSWI1K2xyVVpHUlBNeG9zRXhOS0ErT21kVHhhdWxqSVdLSkxBT3NiWUxtQm9XSWEyWWxPQlZsM09kbDJzYUdlQXZscU0yUHNkckxCVVI4UEdBZjV3U1lxREE2Sk1mQWtnL3BWVnlDQ2VqYVFqSHFtdEFoT1dSbHd6RXlGYzJZYVhMTFQ0RldZQXo5cTQ2dWxhWWk5bm9mUXNsVEtqV3NvZlZxUHNpZjFxSHZ6RUpWUGJxT2c4VHFTS29zUlYxNk1ySVk2TlVpUnhxTUFOcTMrQm1wZTBnVFMxS1hXMUNDK3ZCelJ4YVVJenMyRFgyb2F6c1Fud0NVc0F0b0VsVXh1WHFtbnA5aFNWb091WWZwZFF6YVYva25aTkZkcVBxbHFlckltMzl4V09mYTlUcDdZNWVpdVNqOUtVVExaVjMrL2p5LzJuRDJQM1dkNVBIY0J1MzB1WVorUEgzWjUrMkdiKzNsc2REbUxOVTZubWZxOXFFTTlNSTFNT01YQUhwTU03RERKMkFtZm1qaGpQSTh5bFhDRU50TTRuWHkvNDJib3AwM2RxV2VQM2tiTzZHSGhocTYyWHVqbzdJTytOSVd5aFZJWG1xUDJORXR0d21tV29zbWMwYnp4Qkt3bWpxWkpJcGFQWStTYzZNNm05VTJ0YUZwYWhoQnNqRmFoWkRNK2x4cFRZbnBrdDVRV29sTkRDVlpoNGZjTCtUNElPU2V2ODNFekdQOUhpZytWOS96ZjBUbXhGUDN5YjZKblZrM1RLb0pJZms5OGdRcE5Ba09ZVllDcW1MVklGV2pUU0kzNCticUdXS1NyaTBWazJJVW5DTnBqUjV0R1IzaURwRk5iTmtBUVhTdWFWa2FmcEc5dnNRRS9SOWt3VjBlWGpDd1RpUTJ4a0lDZGI2RFg1R0Mxam1DeDdna3NOOVpWNEYxcmJZNk4xSGJiM0tucFRubmlrTjhGSEx6a2k4LzkvSEF5SkJER2NkR3d6VWlHWnlFMWJXVVJRbTZXSXVWeExWSWYxU0xuV1QxeW50eEVja001U2w3UXdEMXRSTUg5bXloN2VrOTFuVldRdlFXZ1lTVkYxTWFWeUx4N0I4bTNieUwxTGcwZU5YVEd2YnVJdjFHSHkzbTVzQXNKaFpiM2FXajduRlhsSWFXbXFjUU9PbldaUVM5bEl0V0lFTmwxRmZYbGVxYno5ZTVNMlk0ZTFKcnVUT1hlMkg3cVBQYjQrbVAzaGFiWTduc1pHODljeEtyVFo3RE15MGV0RHA0djZkM3hGQlk3ZTJPQm94Zm1rQVZuMkxualUwc1hqREZ6d2tnamV3eld0OFVBQTFzTU5uUEJFSE5YOUNOZ3hiVjNOM0pDWDZienZoNlhNTUFuRUVNdWhLbEozSU1ENDlTdTRWSy90RGROajh5eGxkb0g3WGlVL1JLVXlSSFRGRWx3eGpJRXBBcW95VW9DQ0JCYkI2ZWpiVkFtZ3d3YXpNK0ZFSEF5RTByTktSVXpSUWFXK1A4QnF6Q2tBRjlDQVpEZnE1SDlWWnREVnFSK0VPTHNQd3haVTlVcnN3WTkwcThwSmxac1RRMHQ4MXRsUXJhQVUxVVFmQmN5TDFZelFkdEVsYXhab0crbVJrS0VQY1YwU2YzNmVRWVdha2VPWnBjcWRlVVg4U2g3SWtuSUJPS0ZobnlmbnFHYXFER0xnSjlIZGxwQ2RscG1hcVEwcjdEdFFnTmRCZUk1UE00bWk4M1ExY0Zzc3ZNQ1NvaGxvZzBkN0xIUmpTQSs0NjFBZk5UL0F0eHlVM0M2T0IyQk4wb1I5K0FHMGduUWtPcGlaRHhzUU5ITFI2aDg4eHpscjU2aGlCSWc0MDREb3FxdklZQmd2VnBjckhUcjZieHNlR1NuS2kyOGo0Wm5qYkVobG1pZnhHS3RwcEM1b3B2NDI5TEZwR1kzOGYrUk1YZTFYSmttYWdxWmRSWk4wc29MbDdFcE1CVGJneU93SXpRS2V5TGpjWUJBT0phYWphTnBPVGlTbm9mRGpFUHB1VGhBRGJ3M1BWc1ZDdG1UbUluOUtUazRrSnFMUGFsNTJNbkhueVhuWUdOQ0ZsYktYdm94R1pnYmxveVpZVW1ZemNjemVXNENnVGhHMW9SSjVlZWdPUFFNNXpFcVZlMGgyek02SGQyaTA5U0szQzU4djJqUTFxRXBxdktlTUtHd1lsTTNFWUdqSERrQkYwbW1sVkpINFRKSE5GWFZtNUl0U1ZzSHBLSWRBZFFtaEk1ZXB1b3BmU3FmSWNqNFcwb3VTTmZTTzNBMnMrZDdGdVc1MXBRVG9uSC9CMUQ1bmUvUHllTVBnTnBTQ2p1emNjaFJjem1SY29PTUx0OGhiQ3gvQitXRTZGZlJzbEpDVkhvQzVDaHlRVUl6VE44R3cwK2E0bVBxb29rblRUQ2RnbjIyb1JXbTYxUGdFNmhTSW55K3VUM21tOXFwZXFFTGphMnh5TVFHTXludzV4bVk4Ym1sNm1xWnFhMlA2VFJwY3B6RGxDcjlnZ0pTWVYwQjZuektoN2xrNHptR1JwaHRaSXpwZWdicU9JZEdaUVpmazNtZXMvbVplVFI0Y3dud1JXWUVsNmtoTmp2YllkOXBUNXp3TzRmZGJvNDRjZDRIK3BjdnFEaHg5Z3crOS9SZ2VPSUlXZTF6cHZYdGROb2lZVVNITHpVendTcVozY1RqUXY3dVlqYWs1ZFNoSzJpWXBQaVpqTnV2a0FyUmRuVG5aRTVaM1NDbVo3NmpHK2FjdjRSNWdVRUVWancycDJWaVoyNEJkdWNYWVU5K0tYYm5sYWdTUzl1eThyRTl1MUJWL042V1Y0eHRCVHhmV0twaVoxRTVkaFZYOEZpSnpmek11cHhpck1ncVVxVTFaeEc0TXpMeU1UNHBDMk9Tc3RVRWJxbkQxUzhtRmIwaUV0RTlMazF0cnRHU2dHK1J3QnZPNXdwOFVudExLaFF5cEJ5UG1pZEtVTFVpMDdXUklEaUVPVnVyRk0xNDF3VWx6S2xZTlZTWWxhQ1ZEbmRxUkpscnFycWloSTFqQ0NCaFpqSzFNbEdSNzFoVXdDa2hicjc1OFR2QXZtZGUrVDBCNW9mQjM5SElFR21JQUZqQXlOOTVONDlWUW5PVmhrOFlYVjZUS1lQOE81c25hcmVPSldCalN0QWh0cFNBTFNXck52VXNhSWE2WDBCL2F3LzBOWFpBZjBPbUpFT0NsekhaMGduVHpPd1k5cGh1WXF0V1l3cDQ1eENvc2hmVFRCMHp6TklSa0JvekRERmIxeGdMcEgrUUxEMlhza0xrd1R3Q2NBNlBzN1gxTU8ya05xWWVaNXpVd1JSdFhVemplMllRMUJKVEtTZW1VUk1yd0JMRUF2WlpCTEFBZTc0UmdhZWtoZ0daWDUvYW1LQ1RSV3c2T3FyblFzYkNsL0k5c2d4anJrekYwekZRRFVZK3Q0QU5RV0krOWZVQ3N1Y0NjMHZNcFdHU1ZhVUxyUjJ3ME40WmMyejRmMXJ3LzdGM3hjcHpsN0ExT0JKYm94TVVFR1hkMTlxc1hIV1VxdHpyQ2NxMTJRVllRWU8yc2JBQzYvUExzQzZ2SEd2em0yS2RWQTR2YUhxOGl1OWZuVXVBRXFTTENNdzVhWG1ZeWZpVU1ZNnNQQ290SDBPVHN6RXdPUmNEMHZQUmkrd3JPOEMwajJXYVRpU2JrWVUxQkxDS0pENVdNL0xKYkluVW1rbDVhQ21qUU5Jdnlac3JmWmRTOFVTTWtVVGJ5S1ppRW1LZTFKR00xWnFhVUVyNGlGeFFra0VaTGdLbHViOVZnWlcvdys5cnFqM0ZrRm45TXJ1L2VWWHFoeUZTZ0tDVkZDNnJXWlhMcDFsU0JrcEF5b2FoWVFOcENnTDEzY1JzQVdoenFHSnJBbUsrMXR3ZnEzb1RwTmNndGt3dHgyNFRYODVHVzlwa3NMcFRxSGVuayt4K0lRZzl6bDlGajNQK0dIRDZBc2E3ZUdNYUhlOFVLMmRNSWJOT0lVQ25rSEduR0ZoaXFpNDFMTTh2TVhYQVhEMUx6RHhCY0owVTdTdkxmYzB3K3lSbEJFRWpXbGdrZ3RRYWxacElBdWc1QmdRelUrNDhTZ3Q1UEl0YWVBWk4zQXd0UFV3L3FkdkV6SHovVEg3WEhMcmVXYnBrZUdrUUp3aFUwZEZtMW1wNm9jeGlXa3BtRkhhZlRTMDlpL0prSnZYMWRFb1hxYndzRTFmbWFodXgwUmlyVXVlTHpDUkQyR0lXajlOb21DYno4Y0pUNTdBK0lCenJtZDdYTTcxdlM4bkVydXg4N0NBbzEyWGtZUVVaY0RFQnRJUkFXWkdhajVXWlJRUnFDWlpuU0tuTUhNeUx6MWF4SURrUGkya0VwRERIcXV4S1JqbVdwaFdxdWJPTCtaa0Y2WVdZazE2RUdmenM1S3hTak1zb3dwQ2tYQVhVZnJLeWx1L3R6dGU3a0dFNzhkZ3B2YVNwY3p5T055K2V6dnBkQ0VCYjAyeTBFZE1oaGN2VWJpZTg0ZkpZSXBFZ1lvaWpiaDFYcHFKVnJIUU4wVjN6dTFTVnd6Z0NVNWhhRnVMSlVaN3p2SFJGaVdaVTFWSkVROFpLOFB2a2M0em1SWDBmaHZUWFNwZFZ1OFJDdEU5aXFxYXVsSTcvSnYxTHhsWFNndkZ1c0VCWVhFSUdGR1N3UVk3Tmd3d3l1Q0NERE5KdzFFcll1QXIrYjVYOGZ4akowcFZWQ28yTUNhdENENEZScWordVUxZ3Mrb1pFWVdaUU5CWmZDY1ZDdjJETXZ4aUl1UVR4RE8rTG1PemlnL0YyYmhoT0lJMGwyMDR5b1pzbGlEK2xmSmloVCtiVnQ4WnNIWE8xdVplQWNEcjFyN0NvQ2owVEZWTUZYRVlXQkwweEpwT1ZaYzduVk1ZVUFsV09NNm1OWnhxeVVmQjdKbXNSZFB5ZGFTY0Y2QVFrUWJ6UzFxVnA5SWJBbThlR0pFdGhKbE9lak9QbnhoSzg0L25aVC9uM1RkS3pVSC9iWkRNSFRESjN3RGh6UjB5dzg4UTBMMThzRG96RW1yaFVyQ1c3TGVOeFFVd1NsaVNsTTFLcElST3dQRFVIUzhsb0N3Z0lpWVVFd3lLQ1VvQXBOVlhuSmtuNW94eE1aOXFjeGdzOFBTWWJNM2h6NVNnbGtUNk5TTUxrcUJSTW9rTWZTOFB6TVZQNFVMSlpYeHFkYnRTcTBrSC9rWlF2aXFYWjRFMXFSOEMwWndPUXJTRGx4aldQN2dnQUpBUVVVcUZRQUN0TGxkdWtGcEo5aFhVSkpqWWtGV3I1TWtHVlJvQW1NSDBLSzhXWE5EbHN0VlNhWUNCemEyS3BZOWtJSldRbGFlc0VNak8vWC9vLzI4YlE0TVFXS2xQVE1vbmdTeExEOCsrUTVkSVMwdm4vZmpFZzJWQ2xjQUd4TUxNOGw4ZHhQREpraEV1aXFZNUFVNGhPbGlMTnphbGZHb01DT0lFdVhWaWFoRElDbFlCTklsaFQzb0cxRFVWODY3QjR0QTFQVURYZjIvQnhIN3JIY1pHSm1NNlFldjRMbUxJV1pSWmpOdFBWWkdvbzJXdFU2dTEvd2hzK3pQc1NoanA2NDJOclY0dzFkU0k0SE1uQVpHR0NjUklOMkVRYXNMRk02Nk5wd01ib0dtRUNXWFVTR1hHU3NRVW1Tb2MzWXdKVDlnUURZNHpYNStzRXRjUjRnbHBpRWhseU1rRTRoVUNkUVJDS0ZKbEZZRTRqTTg4a08wNDJ0Y0U0NnViUkpsWVl3ZThlUkRrd2hPZjZVV3YzdDNiRENQZHpxa2JCVERyYzJYR1ptRUtBakNOd0p0Q2tmRXBXbkVwQVR1Y05uODdVTzVNYWNYWnlKdWFsa0RHVE1yR1FRRjdBeC9PVHN3alNYSFVkcEZTbFZNK2VrMHl3TWlWUFQ4akRqTVI4ekVndVVER0ZEQ2piZEU2aUdScFBnL01KRFk1c2xkTTdPQTZkNk9iYjAwUzFJMmhiaXVQbVl3MkJxNXg2TU84RG43Y1BUVVpMV1JZaXI3MGZaeWU0MUpvbTBhdnZqbW9ORkVOTWxJUm9XdjZtS3RMTEJ0VEV4Z1RwTzJiVUVEVHZnL2RVQU4rQ0RVU0FLbVU4cFZhQ05BcGhTUVVnQWthdDgvL0FrVGVmazJqdVptcU81cm9BeXMxTHd5TDRoSG1iaDFwVlZSYW1mUWsxTDBCMHEwZ0QwYit5bUpBTlUwQXFQUUFxNVl1aGFnNXFWZzMvTGswM3RraloxYTVIU3I2S2ZreFRZMHRxTUltcGJpcHZ6bFJaYjVSVGlvbDVGUmlkWFlMQmZIOGYzdGhPSWRIb2ZEVmNTWWdCdmdFWWZ1b3lSdHI3WUlTeEM0YnFXV01ZbVd5MGt6dW1ucm1BdVg0Qm1PMTNGWlBQK0dLVWl3ZUcyRHErajJHMlRoaE9nek9TOGJHOUMwWlJla2lNc0hWUU1aS2FjcFNOczRveFpOU3h0dTRZWitlQlQ5M09ZT29wWDB6d1BJZlJIbWN3aGlsOXBOY1pEUE04ZytFKy9CMi9VSXk0R29GUFF1SXhqc0FjVHlDTkpzQ0c4R2IxSlZqNlVhOE5raVVzWkxGUHlEampDT1JKVElsVEZXQ3pNVGN4UXdGMUlSbFdqczFnblU5dEtUVzVacEdScHBGeFZmREdONE4xS20vK3B3VEJSSUpuc253bkdWaHFDZ3drZzNhVmRDZEFrMWxJVWk5Zm5ndlQ4TEVVZXBNVnRiTDB1Nk1BVW1ZdXllUVNCV2grUmlhWWZIaVU4ODJUVDhUdHkraVVLdHFiMnFSSFJZZStUOFB5Vys5Q2ZsZk84VGNrN1hhaXBKRDZzazJ6b3hLVmNSUGdLcjJxTkN3Zml5UWdtUDRqNVB5SG9XVER2K005WThvcVY1bzExVnVodENvWlhjeVpBaXRCSzc4am41ZFJMQUpkUTdDcUVNQXlCTGpOb1duUGk5cVdMYlFkVzZjODdrSHhManVZZkV4UWZzSWJOSklhYUJodnppQmVkTmw3WDFaN3RvOU1VdVVJMndmSDRLT3JrV3AxNThCemdSanE2WWVSenI0WTZ1cUx3WmREMEpkNnNGOWdoSXErUVR6U3ZQU254QmdRR3YzK09KQ2dIMHpwTVRRc0RzUEM0ekdTRFA4eEhmRm9NcmZFMk5nMGpLRkxsaGpIeHhKeWJqaXp3UENJQkF6aXNULy9EdGtFbzE5NEhIcFN5c2l4ZjFBa0JwRDVCNFhHWUJBenhFRCszZjNJT2oxNE03dnlCc3QybFAxak14UjRQeVpZUnd2QUVqSVZ5ODVsS2hWbVhaUkN2WnBHM1VwRHRJajZWWUFyTER1Ym9KNUhzTTVtekdJcUZZWlZUTXZHUHAzWGFDcDFwREQ0RkI0bmtYbmwrL3NUS04wSUZKbWpLVXVOaFRGRnM3VmxLcFRucmNpc1V2bEZOa3FXM1FmVkhGQmhWU2tPSjBDU0FuRWZIdVg4QjY5TDE1VHF3cUtoVVZXbWxVNThCMDdaYzZvNVpLYVRuTHNhUjZtUmc0RkZOekMwckFIZDBrcFZ3Mm5ERU1DcUdxckNkbVROLzJaWWlmOEIxdVpvQnV5SFE3V1MzdFdJMkR1QU5vZUFWc3lidkYrQUtzSGZrbWlkU3IyZFVxcWlaVEkxUEVQVGd1bEo1akRLc1VXZ2pDRW5xalh5M2RoS3U0VW5vZ3RiY1dkS2hjNjh5ZTBaVGN3UWp3NWtDZ0Y0QnpKWFovOElkTDhZaW43bmd6SENOeHdqcjhhalN3QXZSa2dDMnZDOUVxMFlyZm04TFQvZmprd2d6eVhrTlhsZk83S05SUHVnQkhSZ0MrL0VHOWlSS2JJamI5eUgwWHhlTnFGUUcxSHdwc2gyN0dySER6SkdHMzUzQjlsd2dVRHR4a2JTalEya2UyZ3N1bE0zTnZWVE5vVVVaZXRERUEwaWt3M2o5NHppL3pPZTRKcEcwTTBoZ3k1SUlsREpxRXNKME1VRXFFZ0NpZmxrM2psc1JBTFd1UUxVNWlCZ1oxSnZUdWQzVGlXVFR5WnpUeUFveHZGM1JsTnJDb3QzSmFqYThYK1F5U1FDR2dHWEttQkdvTXFxVWRrMjh5T0d6TFJ2S1dBVklDcFF2Z1BwaC9IQmVRR3FnRlR0ZGlMQlJxQjBZVFJCeDFBenBENElBV016TUdXUE1MVlBtQmdmaGpRZTFidVE4RzlnU2llOXFwenk3cm1BOS84RlZBVjA2bFp4OWhJZkFsZjEwemJIZjZUL2Qrd3BEVUYrOHgxWUJhVHZ6eXZBRUtBZG1EcmE4ZGlLZ0JYd1NBaTRwUE5aUUNvbEROdnpwc28vcVZxdDBrd3B2TmdwNk1pUUZZamQvTW15VjZMUU96QVJiZnlUMENxSUZ5MGtpd0NsWVdESVkwMFFQeHRBTm45M1R1WXJ5bWF5N1VPYVFuYWJrMlBUS0V0VHRBdm1oWlh2NGZ2YU1ZM0krSFg3eUJ4MGlLTE9DbTNxWC93b01nOWRvdkxacUhJSnhrejBqQ09MeGhHZ3NVbjRTQW96UkZFUFNrWmc5cEQvdFF2ZjA1MXMycGN4Z09BYVFuQjlMSEtCd0pwR2RoUUdYYVIwYXlZQm1vNTUxT29DVkdIY09RbnBtRVdqSWpHZExOOFU2WmhHOXA0U3pmVFA3NUp0a2tiejJrMWdZNWlaZHcwVHN5dkk2Z1FTZ2FocXU4cE5WRUJMVnBYM1JLL0trbVJwcksxbC9ieWFZYy8wem1nWkxKcjJQK1BEODlKdktuMm8wbmNxSVExQUZlOFZuZmlCVm13TzFZMGw2VGVJTEJ0SXdFdjRzM0h3ZVJ1Q1NONGpIZlFDSmdIZWg2RUE5bi9FaCs4VHpkb2N6YjBIRW1waVMyeFRDR3VyQmlDTklibUpSVFhDb05Jdy9odW8wa0JhQnBFQnlYWlNmVVRtT1FwWU5RRXh2SWo4NDhNSVhyWjBxWlFoRTJlbERwUUladFZLbEViaVA4dlhwRkt4c0dXN2R5YWlzekJnVko3cTcydEpnRFdOWURRTnowbjVRaWtxcXdsbUdnaG1XdUN4bFFwZVJCN2JFS3dTYlVNSVlva3dBcEloRXkzays2VGFoMHhqaysvb0lQMXh2S2lkZU95VFZJNkJhZGRVRE11dXh1RHNZZ3pJTGtDZnpIeDBUYzFDQjdKaEc3cno1czB0dXBBRmV6SkY5NlU1a3MweFJBNk1wT0VhUXhra1pUSEZiSWx1bmMyWUplQ2tSSmlUbEkwNWxBT2lhV2ZRcEVoTTQvbXA4ZFM2WkdXVi90L0ZaSDdmV0lKelBLL2I5TnhxdGErQU1HdEwveGorUDh4UzB1bk9SaTB6N0tYV3E1Q0NGSGxvUzNQVmh1ZlUybnF5cHpvUzFBTEtENC8vL2JvQXRybmpYNDFxeWFqVSs5UkxnbmpYS2QvYzE2bVJtZmxCYkRTOGZoMWpaU0lMUWNyVXJDYXh5UHVFK1NSRnZ3T2hnRXRHbDVxakdYQWZudnN3VkQrd2RMWFJiSDBZSHpLMkdrNFZZRExlcC9wMzhUL0FLaUVNMm9GQTY4YjAxWmszVVZLeGdGZWpacEMvMDAyOHVLckRtYTFSWFFUcDZGWDB6bjlLZEpFNDBRZ1prV2o2ckRDWE1JYUlmdW1JVnQweXZHbHQyQ0JVdjVwOHIrZ3JnbDFWN0dDRFVOdnc4RnhiWHR4MjBxM3hqaVdhMDVwS1hXd1Vzcm1FMUVKU3BieVpmanZLMzgzb1E1TXdRS29PcHBkaWhKU2h6Q25Eb1B4U0RNd3RVN1ZUeFVSMklJZzYwaEIxb2lHU1VwWmRtYnBsMDk5K0RLbjlQNVRBSFpsY2hQR3BoWmhFRXptZG9KeE9jRXBJaC82Y3pFSkdNV1puRkdGNmVvR0thWlFNVTFKb3FnaHcyVUN1S1FUd0JSaWp6QnMxTVJ2RkFNb0JhY1R0S0hIYTh6ckwvNnlNRmhsVk5va1FhZFdDSVF3cjY0K2FKQURmSSt3bm96eHFnc2dIUnprdnI2dWh5cWFSSWRYUlRzQ3BDU25TY2QrY2JnV0FINFNrWXZXNmVpL3ZxWmllQVBrYmVNMkZaS1RZTCsrdk1ramk1c21PMHJYVjNJMG0wZHlKM3h6eW51WlEzVkR2ZXlIKzNWZmNCR0NwaWRYaytwWHpGOFlVcDYrTzcwQkpnQXBJL3dPb0VyTEd1OFhWNkNaZFNWWnQ2Uit0MHIrdzZudlh5WllyTFZhQUpPQlJJcDFnbEc0WEJWWWFqaFpNaFMyWVp0V0tSQWthSlFuWmxLdGxWRExCUldER012aFlROE9qNGZuMzBmeGVncjA1V3ZLM0pWcFFMMHREVUorSjVsRW1aa2cvWVZROHY0L2FWNDRSc1dTcUJIU2k0Zm9vSWw1SkFDbjVJenNCZGlFNE85Sll5WGRwcUsvRlBVc2phazYvbldpMHVoSklVamFvRjQ5U1RtZ3dQemVhSm1zU3dUZzVxNmszWkhwZU9XWVZWcXVZenNZd09iZGNiU2czTWFzRVk5T2FxZ2lxZ3NVMGJjUFlrRVl3NU53bktZV3FFVWdKVEtsRzJGRWFKdjhXMlJSQ0dxc2NsWlBuM3laYkdZbXMwakE3S1pKUXc1VnlyUVdRL3hYQ2xoTHYyRk5JUkZ4M2MrcVhJVXZGY3UvU3Jody9ESGxkZ0N3alVHclRPVVlIbVowdjV3WDRRa29mYU0zM0lXYnBYWC9vL3hyTnIxUDd2Zy8rN3lwVVgyOCtqMlJlZ2s4QmxZMUFvOEQ5cnBlQnJ6V2JyUDhSd3F3Q1VsblJLS3dxWUJYZ0NtRFViaHNDWWhxQXRtenBzcittaE95L3FkYnBxTTIybW9DbW9adFhRWGV1Q2FlVW9OUC9qd2lMNFhsRzgxSGVJeUhQbTRQTy9UOUN2WmZ2SVJnMWtmeU9xQThpK2wxRXliek5LREovRk5wR1JCTU1NUXpxYnBwRzBZQ3RBMlcxSlA4bVdZejJib1dsUnA3ek5lbXFFZGN0bXhBTG95bDlUaEIzNEZITXBVd2lrZkpDVWpKb1dIb2hSbVNVNHVPc2NyVzE1dGo4YW5XVWMwTUl5SUZrMDM2VUZ2M0lvdjJwZStVencxTUxNSXhzUHpTZGtpU2xDRDM0ZW9kb3lSWUVKYk9TNm1JU2NFcVFiV1d6dDVaczlDMEpkRFdacFBuR0V5VE5UTmRzV3BxN2h2NjNVRHVlTkd0Q0FyYjUySnk2bGZZVXpTclJ6TDcvRmMyMXFkN0xpUDlxR1A5eC9yOGJrUkNhZUJzMi9uL1BPZUJSbHM2SUNSTndrbzNWVWNDcUFQdWZZRzJSSlAydFRlemJITy9CS2hVMzJraUxsc29iMUt4TjVvckdoQmRXZWdKa1gzNnBROVNackNvM3N4V0JyWGJaSTJPcWVaVENrQUpVQVZrNGoxSkY0Ny9qUTJBMkExWGVMNjhGdjR1Z2FEWVFPZmN1M29NMjZuK0pDTDdHQ0EybkpvNmc1ZzJuM290UW8zSHRDRktwbnlRaDFhZGw3YnBhUlNtTDNRUzAxSTVxdWJCYU1pemc1Vkgxak1TcEJ0cjh2Kzc0a1ZFQUFBTUNTVVJCVkl1T2w1RW10UTBSVTNvMzZsdlo4RUtlZjNpdUZ3RXJtMThNenFkbUxxaEJMekw2QUlKVkttRVBrT0ZVc3JYYWNJTXlSbFhTVHNwWEkxWlN2TGc5ZFhMSGxLYWgxbTVrOGQ1a2IrbXNiKzVjbDJqV2ZQOXRXUDZ2K0YvZHVvVDBuYW9oVVlMbi93cEtoZjhBNndjaDUvN0grZjhDczJKWXlyYjNBQlZHWlNOV1J3Vk1QbWJxVjJCTWxuVC9RYXBuU1BwdmxTSzZ0V21aeTN1d0NvdTJsaHRFS1NDOUFmSzg2VndNWFhtODJpS21CMXQ5Yi80QlBhbXR4Q1IwbEZXUkJIZzdBclFUbVVETVN5dW00R2F3dFNUWXhORTJoekNiaExEYy80am05NzBybGlEVk9OcVEvVDc4ckhUcnFPRGYxUlIweS96YnBDZWpxZWNpVG1XRmRnUmNlNzYvSFFIWVhncCtCZEJoTTZRYWlLcXJGUEFPckJKazFhYU9kMllJa1FnRTVudVdrMURuZWU2RGFOTGcxSFdVRHMzUlBERkVOTFNFNkhMUjZDSTl1aEdNdlFqQzN0VEFQUWhPMldwSWRzanVrVVpRRXNBZGszSVlUVUFWd0FxanluYWFIZmxhYTc1ZlJwbGFFclFmUmd1eXRocUY0bS84UDBPWVRiRWIzOXNjOGx4QUpQRmg2djVmb3JrWFFlbmZkeDM2elk4L1BQOWhOUGMweUdlVlpLQ2traUZibWN2UUprM0ExOFNXTXJtNmRXcXBpalpwWmVvb0JZYWwrNnE1MlBCNzR5WGdGUWtnakN0QWxSQTJGYkMyNTQxVFlBMlF0VHZ4Wk5OazlLU3Vrc20rQXRZdVRKZWRoWTJ2TXZXU1NkdFJwMHEwNHVNV0JLb21vSW1aMnhBY3pkRU1GaWxZMEJ6TjUxcjc4N2NZVXFWRG90M2xwcU9jazRJSHpTQ1RFSFpzanFiNlNVM1NwSDBvM2ZXN2tGMldwWERDKys5L0Y4M2Y4UjlnVlhwY0FNc1F3SDRZVE1PcWo1THMwQnhxZkp1bVNYWWZsQjBHWlppeU9kclJVTFVsd0ZRUXBGMVM4dEdkVWtBbXFjaStBeU5MYjJCVWVUMkdGdGFnZjNZNWh2UDVrS0phREMyOWlSRVZEUmpBeHdKYStXd0hNckthQjBCUXlwQ29SUE00dXp4V3c2bnZ6ditmb2FRQXdmSkJORTFXRVdadGtoTC9yMUNyVVFWNEh3QlRIcjhINUx2SEg1NlQ3akpaYktqMkU1Qk1rRlNvdG1MdmtGbXVvaTNOcndCVDJGUllzeG13aWwxbENtQTgyVGF1S1JRNEpacmxRV3dlL2orZWxGMWNJUmRSTXdBQUFBQkpSVTVFcmtKZ2dnPT0iIHN0eWxlPSJ3aWR0aDogMC44MjIzMzE2aW47IGhlaWdodDogMC42MzQ3ODI0aW4iIGFsdD0iUGljdHVyZSAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgLz48L2E+PC9zcGFuPjwvcD48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwMS1EaWdpdHMtRGVsZXRlZC1QYXJhZ3JhcGguZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAwMS1EaWdpdHMtRGVsZXRlZC1QYXJhZ3JhcGguZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmUxOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDAxLURpZ2l0cy1EZWxldGVkLVBhcmFncmFwaC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwMS1EaWdpdHMtTW9kLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMDEtRGlnaXRzLU1vZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3N2E0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMDEtRGlnaXRzLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwMS1EaWdpdHMuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAwMS1EaWdpdHMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTE0NmYzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDAxLURpZ2l0cy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwMi1EZWxldGVBdEJlZ2lubmluZy5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDAyLURlbGV0ZUF0QmVnaW5uaW5nLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlM2FjMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAwMi1EZWxldGVBdEJlZ2lubmluZy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwMi1EZWxldGVBdEVuZC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDAyLURlbGV0ZUF0RW5kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5NWI2MQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAwMi1EZWxldGVBdEVuZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwMi1EZWxldGVJbk1pZGRsZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDAyLURlbGV0ZUluTWlkZGxlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiMzNhMwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAwMi1EZWxldGVJbk1pZGRsZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwMi1EaWZmQXRCZWdpbm5pbmcuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAwMi1EaWZmQXRCZWdpbm5pbmcuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzcxYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDAyLURpZmZBdEJlZ2lubmluZy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwMi1EaWZmSW5NaWRkbGUuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAwMi1EaWZmSW5NaWRkbGUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGM3MjhhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDAyLURpZmZJbk1pZGRsZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwMi1JbnNlcnRBdEJlZ2lubmluZy5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDAyLUluc2VydEF0QmVnaW5uaW5nLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkNzIxMgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAwMi1JbnNlcnRBdEJlZ2lubmluZy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwMi1JbnNlcnRBdEVuZC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDAyLUluc2VydEF0RW5kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwYmFlNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAwMi1JbnNlcnRBdEVuZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwMi1JbnNlcnRJbk1pZGRsZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDAyLUluc2VydEluTWlkZGxlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFhZTU0ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAwMi1JbnNlcnRJbk1pZGRsZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwMi1Vbm1vZGlmaWVkLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMDItVW5tb2RpZmllZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YzRjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMDItVW5tb2RpZmllZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwNC1MYXJnZS1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAwNC1MYXJnZS1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzBhZDcxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDA0LUxhcmdlLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwNC1MYXJnZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDA0LUxhcmdlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4NDk1ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAwNC1MYXJnZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwNi1UYWJsZS1EZWxldGUtQ29udGVzdHMtb2YtUm93LmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMDYtVGFibGUtRGVsZXRlLUNvbnRlc3RzLW9mLVJvdy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZmQ1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMDYtVGFibGUtRGVsZXRlLUNvbnRlc3RzLW9mLVJvdy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwNi1UYWJsZS1EZWxldGUtUm93LmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMDYtVGFibGUtRGVsZXRlLVJvdy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZWI5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMDYtVGFibGUtRGVsZXRlLVJvdy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwNi1UYWJsZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDA2LVRhYmxlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3Zjg2NAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAwNi1UYWJsZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwNy1EZWxldGVkLWF0LUJlZ2lubmluZy1vZi1QYXJhLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMDctRGVsZXRlZC1hdC1CZWdpbm5pbmctb2YtUGFyYS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YjE3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMDctRGVsZXRlZC1hdC1CZWdpbm5pbmctb2YtUGFyYS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwNy1Mb25nZXN0LUF0LUVuZC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDA3LUxvbmdlc3QtQXQtRW5kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxZGYxMAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAwNy1Mb25nZXN0LUF0LUVuZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwNy1Nb3ZlZC1pbnRvLVRhYmxlLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMDctTW92ZWQtaW50by1UYWJsZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNWIzOWEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMDctTW92ZWQtaW50by1UYWJsZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwNy1Vbm1vZGlmaWVkLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMDctVW5tb2RpZmllZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxODEwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMDctVW5tb2RpZmllZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwOS1UYWJsZS1DZWxsLTEtMS1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAwOS1UYWJsZS1DZWxsLTEtMS1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmQ4OTFlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDA5LVRhYmxlLUNlbGwtMS0xLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAwOS1UYWJsZS1Vbm1vZGlmaWVkLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMDktVGFibGUtVW5tb2RpZmllZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNThhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMDktVGFibGUtVW5tb2RpZmllZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxMC1QYXJhLUJlZm9yZS1UYWJsZS1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAxMC1QYXJhLUJlZm9yZS1UYWJsZS1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWM5ODZiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDEwLVBhcmEtQmVmb3JlLVRhYmxlLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxMC1QYXJhLUJlZm9yZS1UYWJsZS1Vbm1vZGlmaWVkLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMTAtUGFyYS1CZWZvcmUtVGFibGUtVW5tb2RpZmllZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3M2FkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMTAtUGFyYS1CZWZvcmUtVGFibGUtVW5tb2RpZmllZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxMS1BZnRlci5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDExLUFmdGVyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY4Yjc2ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAxMS1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxMS1CZWZvcmUuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAxMS1CZWZvcmUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjlhOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDExLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxMi1NYXRoLUFmdGVyLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMTItTWF0aC1BZnRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZGVlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMTItTWF0aC1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxMi1NYXRoLUJlZm9yZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDEyLU1hdGgtQmVmb3JlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzNTU5YgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAxMi1NYXRoLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxMy1JbWFnZS1BZnRlci5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDEzLUltYWdlLUFmdGVyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlZjYyNwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAxMy1JbWFnZS1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxMy1JbWFnZS1BZnRlcjIuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAxMy1JbWFnZS1BZnRlcjIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTc2YjYzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDEzLUltYWdlLUFmdGVyMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxMy1JbWFnZS1CZWZvcmUuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAxMy1JbWFnZS1CZWZvcmUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzkxN2FmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDEzLUltYWdlLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxMy1JbWFnZS1CZWZvcmUyLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMTMtSW1hZ2UtQmVmb3JlMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZGEyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMTMtSW1hZ2UtQmVmb3JlMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxNC1TbWFydEFydC1BZnRlci5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDE0LVNtYXJ0QXJ0LUFmdGVyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0OGExOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAxNC1TbWFydEFydC1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxNC1TbWFydEFydC1CZWZvcmUuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAxNC1TbWFydEFydC1CZWZvcmUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTg4YzVkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDE0LVNtYXJ0QXJ0LUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLUFmdGVyLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1BZnRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDlkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLUJlZm9yZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDE0LVNtYXJ0QXJ0LVdpdGgtSW1hZ2UtQmVmb3JlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNhNTA3OAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLURlbGV0ZWQtQWZ0ZXIuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLURlbGV0ZWQtQWZ0ZXIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzE4ZTJiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDE0LVNtYXJ0QXJ0LVdpdGgtSW1hZ2UtRGVsZXRlZC1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxNC1TbWFydEFydC1XaXRoLUltYWdlLURlbGV0ZWQtQWZ0ZXIyLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1EZWxldGVkLUFmdGVyMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYzhhNmMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMTQtU21hcnRBcnQtV2l0aC1JbWFnZS1EZWxldGVkLUFmdGVyMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxNS1UaHJlZS1QYXJhZ3JhcGhzLUFmdGVyLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMTUtVGhyZWUtUGFyYWdyYXBocy1BZnRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NTkyZTkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMTUtVGhyZWUtUGFyYWdyYXBocy1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxNS1UaHJlZS1QYXJhZ3JhcGhzLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMTUtVGhyZWUtUGFyYWdyYXBocy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MDllNjQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMTUtVGhyZWUtUGFyYWdyYXBocy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxNi1QYXJhLUltYWdlLVBhcmEtdy1EZWxldGVkLUltYWdlLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMTYtUGFyYS1JbWFnZS1QYXJhLXctRGVsZXRlZC1JbWFnZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NGRlNzgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMTYtUGFyYS1JbWFnZS1QYXJhLXctRGVsZXRlZC1JbWFnZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxNi1QYXJhLUltYWdlLVBhcmEuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAxNi1QYXJhLUltYWdlLVBhcmEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWZjYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDE2LVBhcmEtSW1hZ2UtUGFyYS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxNy1JbWFnZS1BZnRlci5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDE3LUltYWdlLUFmdGVyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiY2ZkMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAxNy1JbWFnZS1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxNy1JbWFnZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDE3LUltYWdlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxMDRlYwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAxNy1JbWFnZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxOC1GaWVsZC1TaW1wbGUtQWZ0ZXItMS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDE4LUZpZWxkLVNpbXBsZS1BZnRlci0xLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEyOTc5MQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAxOC1GaWVsZC1TaW1wbGUtQWZ0ZXItMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxOC1GaWVsZC1TaW1wbGUtQWZ0ZXItMi5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDE4LUZpZWxkLVNpbXBsZS1BZnRlci0yLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwZTBiOAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAxOC1GaWVsZC1TaW1wbGUtQWZ0ZXItMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxOC1GaWVsZC1TaW1wbGUtQmVmb3JlLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMTgtRmllbGQtU2ltcGxlLUJlZm9yZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwN2Q5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMTgtRmllbGQtU2ltcGxlLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxOS1IeXBlcmxpbmstQWZ0ZXItMS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDE5LUh5cGVybGluay1BZnRlci0xLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlYTk1NgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAxOS1IeXBlcmxpbmstQWZ0ZXItMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxOS1IeXBlcmxpbmstQWZ0ZXItMi5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDE5LUh5cGVybGluay1BZnRlci0yLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5NjZjOAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAxOS1IeXBlcmxpbmstQWZ0ZXItMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAxOS1IeXBlcmxpbmstQmVmb3JlLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMTktSHlwZXJsaW5rLUJlZm9yZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTY2YTkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMTktSHlwZXJsaW5rLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyMC1Gb290Tm90ZS1BZnRlci0xLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMjAtRm9vdE5vdGUtQWZ0ZXItMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYmE0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMjAtRm9vdE5vdGUtQWZ0ZXItMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyMC1Gb290Tm90ZS1BZnRlci0yLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMjAtRm9vdE5vdGUtQWZ0ZXItMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlY2IzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMjAtRm9vdE5vdGUtQWZ0ZXItMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyMC1Gb290Tm90ZS1CZWZvcmUuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAyMC1Gb290Tm90ZS1CZWZvcmUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTRkMzhmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDIwLUZvb3ROb3RlLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyMS1NYXRoLUFmdGVyLTEuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAyMS1NYXRoLUFmdGVyLTEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODc5MWY3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDIxLU1hdGgtQWZ0ZXItMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyMS1NYXRoLUFmdGVyLTIuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAyMS1NYXRoLUFmdGVyLTIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzE1MTY2Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDIxLU1hdGgtQWZ0ZXItMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyMS1NYXRoLUJlZm9yZS0xLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMjEtTWF0aC1CZWZvcmUtMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNDQwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMjEtTWF0aC1CZWZvcmUtMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyMS1NYXRoLUJlZm9yZS0yLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMjEtTWF0aC1CZWZvcmUtMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5Mjk0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMjEtTWF0aC1CZWZvcmUtMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyMi1JbWFnZS1NYXRoLVBhcmEtQWZ0ZXIuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAyMi1JbWFnZS1NYXRoLVBhcmEtQWZ0ZXIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjFhNzAzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDIyLUltYWdlLU1hdGgtUGFyYS1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyMi1JbWFnZS1NYXRoLVBhcmEtQmVmb3JlLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMjItSW1hZ2UtTWF0aC1QYXJhLUJlZm9yZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOTM4YjgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMjItSW1hZ2UtTWF0aC1QYXJhLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyMy1UYWJsZS00LVJvdy1JbWFnZS1BZnRlci1EZWxldGUtMS1Sb3cuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAyMy1UYWJsZS00LVJvdy1JbWFnZS1BZnRlci1EZWxldGUtMS1Sb3cuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWIyZjQxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDIzLVRhYmxlLTQtUm93LUltYWdlLUFmdGVyLURlbGV0ZS0xLVJvdy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyMy1UYWJsZS00LVJvdy1JbWFnZS1CZWZvcmUuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAyMy1UYWJsZS00LVJvdy1JbWFnZS1CZWZvcmUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzUzYjI3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDIzLVRhYmxlLTQtUm93LUltYWdlLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyNC1UYWJsZS1BZnRlci5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDI0LVRhYmxlLUFmdGVyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5MTQ2MAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAyNC1UYWJsZS1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyNC1UYWJsZS1BZnRlcjIuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAyNC1UYWJsZS1BZnRlcjIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzMwMTZiCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDI0LVRhYmxlLUFmdGVyMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyNC1UYWJsZS1CZWZvcmUuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAyNC1UYWJsZS1CZWZvcmUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTU4OTUxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDI0LVRhYmxlLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyNS1TaW1wbGUtVGFibGUtQWZ0ZXIuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAyNS1TaW1wbGUtVGFibGUtQWZ0ZXIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTgzYjIxCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDI1LVNpbXBsZS1UYWJsZS1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyNS1TaW1wbGUtVGFibGUtQmVmb3JlLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMjUtU2ltcGxlLVRhYmxlLUJlZm9yZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzEzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMjUtU2ltcGxlLVRhYmxlLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyNi1Mb25nLVRhYmxlLUFmdGVyLTEuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAyNi1Mb25nLVRhYmxlLUFmdGVyLTEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njc0ZmVmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDI2LUxvbmctVGFibGUtQWZ0ZXItMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyNi1Mb25nLVRhYmxlLUJlZm9yZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDI2LUxvbmctVGFibGUtQmVmb3JlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc0NmRiNgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAyNi1Mb25nLVRhYmxlLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyNy1Ud2VudHktUGFyYXMtQWZ0ZXItMS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDI3LVR3ZW50eS1QYXJhcy1BZnRlci0xLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhZjc5ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAyNy1Ud2VudHktUGFyYXMtQWZ0ZXItMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyNy1Ud2VudHktUGFyYXMtQWZ0ZXItMi5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDI3LVR3ZW50eS1QYXJhcy1BZnRlci0yLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3YzVhMAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAyNy1Ud2VudHktUGFyYXMtQWZ0ZXItMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyNy1Ud2VudHktUGFyYXMtQWZ0ZXItMy5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDI3LVR3ZW50eS1QYXJhcy1BZnRlci0zLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyYWQ4NQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAyNy1Ud2VudHktUGFyYXMtQWZ0ZXItMy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAyNy1Ud2VudHktUGFyYXMtQmVmb3JlLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMjctVHdlbnR5LVBhcmFzLUJlZm9yZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTUzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMjctVHdlbnR5LVBhcmFzLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzMC1JbWFnZS1NYXRoLUFmdGVyLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMzAtSW1hZ2UtTWF0aC1BZnRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZDI0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMzAtSW1hZ2UtTWF0aC1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzMC1JbWFnZS1NYXRoLUJlZm9yZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDMwLUltYWdlLU1hdGgtQmVmb3JlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3MDI0NwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAzMC1JbWFnZS1NYXRoLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzMS1Ud28tTWF0aHMtQWZ0ZXIuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAzMS1Ud28tTWF0aHMtQWZ0ZXIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzc1YzZjCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDMxLVR3by1NYXRocy1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzMS1Ud28tTWF0aHMtQmVmb3JlLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMzEtVHdvLU1hdGhzLUJlZm9yZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTEyYjEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMzEtVHdvLU1hdGhzLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzMi1QYXJhLXdpdGgtUGFyYS1Qcm9wcy1BZnRlci5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDMyLVBhcmEtd2l0aC1QYXJhLVByb3BzLUFmdGVyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzMGQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAzMi1QYXJhLXdpdGgtUGFyYS1Qcm9wcy1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzMi1QYXJhLXdpdGgtUGFyYS1Qcm9wcy5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDMyLVBhcmEtd2l0aC1QYXJhLVByb3BzLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3YmFkNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAzMi1QYXJhLXdpdGgtUGFyYS1Qcm9wcy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzMy1NZXJnZWQtQ2VsbHMtQWZ0ZXIxLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMzMtTWVyZ2VkLUNlbGxzLUFmdGVyMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZDBjOWQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMzMtTWVyZ2VkLUNlbGxzLUFmdGVyMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzMy1NZXJnZWQtQ2VsbHMtQWZ0ZXIyLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMzMtTWVyZ2VkLUNlbGxzLUFmdGVyMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ODMzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMzMtTWVyZ2VkLUNlbGxzLUFmdGVyMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzMy1NZXJnZWQtQ2VsbHMtQmVmb3JlLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMzMtTWVyZ2VkLUNlbGxzLUJlZm9yZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDY5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMzMtTWVyZ2VkLUNlbGxzLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNC1FbmRub3Rlcy1BZnRlcjEuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAzNC1FbmRub3Rlcy1BZnRlcjEuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzUxYmE3Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDM0LUVuZG5vdGVzLUFmdGVyMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNC1FbmRub3Rlcy1BZnRlcjIuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAzNC1FbmRub3Rlcy1BZnRlcjIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGJhZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDM0LUVuZG5vdGVzLUFmdGVyMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNC1FbmRub3Rlcy1BZnRlcjMuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAzNC1FbmRub3Rlcy1BZnRlcjMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmY2YWMyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDM0LUVuZG5vdGVzLUFmdGVyMy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNC1FbmRub3Rlcy1CZWZvcmUuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAzNC1FbmRub3Rlcy1CZWZvcmUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmY1MTY5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDM0LUVuZG5vdGVzLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNC1Gb290bm90ZXMtQWZ0ZXIxLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMzQtRm9vdG5vdGVzLUFmdGVyMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODIyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMzQtRm9vdG5vdGVzLUFmdGVyMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNC1Gb290bm90ZXMtQWZ0ZXIyLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMzQtRm9vdG5vdGVzLUFmdGVyMi5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYmVjNmQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMzQtRm9vdG5vdGVzLUFmdGVyMi5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNC1Gb290bm90ZXMtQWZ0ZXIzLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMzQtRm9vdG5vdGVzLUFmdGVyMy5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOWUwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMzQtRm9vdG5vdGVzLUFmdGVyMy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNC1Gb290bm90ZXMtQmVmb3JlLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMzQtRm9vdG5vdGVzLUJlZm9yZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZWJiZmEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMzQtRm9vdG5vdGVzLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNS1FbmRub3RlLUFmdGVyLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMzUtRW5kbm90ZS1BZnRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1Y2Y3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMzUtRW5kbm90ZS1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNS1FbmRub3RlLUJlZm9yZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDM1LUVuZG5vdGUtQmVmb3JlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkYmRmMwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAzNS1FbmRub3RlLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNS1Gb290bm90ZS1BZnRlci5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDM1LUZvb3Rub3RlLUFmdGVyLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3OTBhMAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAzNS1Gb290bm90ZS1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNS1Gb290bm90ZS1CZWZvcmUuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAzNS1Gb290bm90ZS1CZWZvcmUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmRiZGYzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDM1LUZvb3Rub3RlLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNi1FbmRub3RlLVdpdGgtVGFibGUtQWZ0ZXIuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAzNi1FbmRub3RlLVdpdGgtVGFibGUtQWZ0ZXIuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmRjYzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDM2LUVuZG5vdGUtV2l0aC1UYWJsZS1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNi1FbmRub3RlLVdpdGgtVGFibGUtQmVmb3JlLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMzYtRW5kbm90ZS1XaXRoLVRhYmxlLUJlZm9yZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZGM0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMzYtRW5kbm90ZS1XaXRoLVRhYmxlLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNi1Gb290bm90ZS1XaXRoLVRhYmxlLUFmdGVyLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMzYtRm9vdG5vdGUtV2l0aC1UYWJsZS1BZnRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMTVmODMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMzYtRm9vdG5vdGUtV2l0aC1UYWJsZS1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNi1Gb290bm90ZS1XaXRoLVRhYmxlLUJlZm9yZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDM2LUZvb3Rub3RlLVdpdGgtVGFibGUtQmVmb3JlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5OTY1ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAzNi1Gb290bm90ZS1XaXRoLVRhYmxlLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNy1UZXh0Ym94LUFmdGVyMS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDM3LVRleHRib3gtQWZ0ZXIxLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjYmZjYgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAzNy1UZXh0Ym94LUFmdGVyMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzNy1UZXh0Ym94LUJlZm9yZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDM3LVRleHRib3gtQmVmb3JlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzMDViOAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAzNy1UZXh0Ym94LUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzOC1Eb2N1bWVudC1XaXRoLUJSLUFmdGVyLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMzgtRG9jdW1lbnQtV2l0aC1CUi1BZnRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZmEzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMzgtRG9jdW1lbnQtV2l0aC1CUi1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzOC1Eb2N1bWVudC1XaXRoLUJSLUJlZm9yZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDM4LURvY3VtZW50LVdpdGgtQlItQmVmb3JlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzMTc1ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzAzOC1Eb2N1bWVudC1XaXRoLUJSLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzOS1CcmVhay1Jbi1Sb3ctQWZ0ZXIxLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwMzktQnJlYWstSW4tUm93LUFmdGVyMS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODE0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwMzktQnJlYWstSW4tUm93LUFmdGVyMS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzAzOS1CcmVhay1Jbi1Sb3cuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzAzOS1CcmVhay1Jbi1Sb3cuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWVjZGQzCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDM5LUJyZWFrLUluLVJvdy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0MC1DYXNlLUFmdGVyLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNDAtQ2FzZS1BZnRlci5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTE0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNDAtQ2FzZS1BZnRlci5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0MC1DYXNlLUJlZm9yZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDQwLUNhc2UtQmVmb3JlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmMzZlNwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA0MC1DYXNlLUJlZm9yZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0MS1UYWJsZS01LU1vZC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDQxLVRhYmxlLTUtTW9kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmMTFkNAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA0MS1UYWJsZS01LU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0MS1UYWJsZS01LmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNDEtVGFibGUtNS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTBmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNDEtVGFibGUtNS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0Mi1UYWJsZS01LU1vZC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDQyLVRhYmxlLTUtTW9kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0Zjk3MgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA0Mi1UYWJsZS01LU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0Mi1UYWJsZS01LmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNDItVGFibGUtNS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkM2Y4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNDItVGFibGUtNS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0My1OZXN0ZWQtVGFibGUtTW9kLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNDMtTmVzdGVkLVRhYmxlLU1vZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MGQ3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNDMtTmVzdGVkLVRhYmxlLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0My1OZXN0ZWQtVGFibGUuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA0My1OZXN0ZWQtVGFibGUuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTgyNTNlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDQzLU5lc3RlZC1UYWJsZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0NC1UZXh0LUJveC1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA0NC1UZXh0LUJveC1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGYyMTkwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDQ0LVRleHQtQm94LU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0NC1UZXh0LUJveC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDQ0LVRleHQtQm94LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyZWNiOQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA0NC1UZXh0LUJveC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0NS1UZXh0LUJveC1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA0NS1UZXh0LUJveC1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDk0YTBhCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDQ1LVRleHQtQm94LU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0NS1UZXh0LUJveC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDQ1LVRleHQtQm94LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhMDljMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA0NS1UZXh0LUJveC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0Ni1Ud28tVGV4dC1Cb3gtTW9kLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNDYtVHdvLVRleHQtQm94LU1vZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMGQwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNDYtVHdvLVRleHQtQm94LU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0Ni1Ud28tVGV4dC1Cb3guZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA0Ni1Ud28tVGV4dC1Cb3guZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTAwYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDQ2LVR3by1UZXh0LUJveC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0Ny1Ud28tVGV4dC1Cb3gtTW9kLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNDctVHdvLVRleHQtQm94LU1vZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTExMmYKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNDctVHdvLVRleHQtQm94LU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0Ny1Ud28tVGV4dC1Cb3guZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA0Ny1Ud28tVGV4dC1Cb3guZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDA1NjFkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDQ3LVR3by1UZXh0LUJveC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0OC1UZXh0LUJveC1pbi1DZWxsLU1vZC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDQ4LVRleHQtQm94LWluLUNlbGwtTW9kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3ZGI5NwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA0OC1UZXh0LUJveC1pbi1DZWxsLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0OC1UZXh0LUJveC1pbi1DZWxsLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNDgtVGV4dC1Cb3gtaW4tQ2VsbC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOWFjN2EKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNDgtVGV4dC1Cb3gtaW4tQ2VsbC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0OS1UZXh0LUJveC1pbi1DZWxsLU1vZC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDQ5LVRleHQtQm94LWluLUNlbGwtTW9kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmNzM2YgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA0OS1UZXh0LUJveC1pbi1DZWxsLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA0OS1UZXh0LUJveC1pbi1DZWxsLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNDktVGV4dC1Cb3gtaW4tQ2VsbC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjAwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNDktVGV4dC1Cb3gtaW4tQ2VsbC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1MC1UYWJsZS1pbi1UZXh0LUJveC1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA1MC1UYWJsZS1pbi1UZXh0LUJveC1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBiNGFkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDUwLVRhYmxlLWluLVRleHQtQm94LU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1MC1UYWJsZS1pbi1UZXh0LUJveC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDUwLVRhYmxlLWluLVRleHQtQm94LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwZTI5MwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA1MC1UYWJsZS1pbi1UZXh0LUJveC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1MS1UYWJsZS1pbi1UZXh0LUJveC1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA1MS1UYWJsZS1pbi1UZXh0LUJveC1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjU5YWEyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDUxLVRhYmxlLWluLVRleHQtQm94LU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1MS1UYWJsZS1pbi1UZXh0LUJveC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDUxLVRhYmxlLWluLVRleHQtQm94LmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3MmJiYgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA1MS1UYWJsZS1pbi1UZXh0LUJveC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1Mi1TbWFydEFydC1TYW1lLU1vZC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDUyLVNtYXJ0QXJ0LVNhbWUtTW9kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5ZmUyMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA1Mi1TbWFydEFydC1TYW1lLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1Mi1TbWFydEFydC1TYW1lLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNTItU21hcnRBcnQtU2FtZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDlkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNTItU21hcnRBcnQtU2FtZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1My1UZXh0LWluLUNlbGwtTW9kLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNTMtVGV4dC1pbi1DZWxsLU1vZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YjZlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNTMtVGV4dC1pbi1DZWxsLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1My1UZXh0LWluLUNlbGwuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA1My1UZXh0LWluLUNlbGwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjAxZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDUzLVRleHQtaW4tQ2VsbC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1NC1UZXh0LWluLUNlbGwtTW9kLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNTQtVGV4dC1pbi1DZWxsLU1vZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YjZlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNTQtVGV4dC1pbi1DZWxsLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1NC1UZXh0LWluLUNlbGwuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA1NC1UZXh0LWluLUNlbGwuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDkzM2RmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDU0LVRleHQtaW4tQ2VsbC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1NS1GcmVuY2gtTW9kLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNTUtRnJlbmNoLU1vZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTY4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNTUtRnJlbmNoLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1NS1GcmVuY2guZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA1NS1GcmVuY2guZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2VlYzQwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDU1LUZyZW5jaC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1Ni1GcmVuY2gtTW9kLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNTYtRnJlbmNoLU1vZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOGQ2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNTYtRnJlbmNoLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1Ni1GcmVuY2guZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA1Ni1GcmVuY2guZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM5ZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDU2LUZyZW5jaC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1Ny1UYWJsZS1NZXJnZWQtQ2VsbC1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA1Ny1UYWJsZS1NZXJnZWQtQ2VsbC1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2VlNmIwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDU3LVRhYmxlLU1lcmdlZC1DZWxsLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1Ny1UYWJsZS1NZXJnZWQtQ2VsbC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDU3LVRhYmxlLU1lcmdlZC1DZWxsLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkNjg1MwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA1Ny1UYWJsZS1NZXJnZWQtQ2VsbC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1OC1UYWJsZS1NZXJnZWQtQ2VsbC1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA1OC1UYWJsZS1NZXJnZWQtQ2VsbC1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGNkMWNmCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDU4LVRhYmxlLU1lcmdlZC1DZWxsLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1OC1UYWJsZS1NZXJnZWQtQ2VsbC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDU4LVRhYmxlLU1lcmdlZC1DZWxsLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkNjg1MwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA1OC1UYWJsZS1NZXJnZWQtQ2VsbC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1OS1Gb290bm90ZS1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA1OS1Gb290bm90ZS1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzNhZjUyCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDU5LUZvb3Rub3RlLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA1OS1Gb290bm90ZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDU5LUZvb3Rub3RlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyOTRmMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA1OS1Gb290bm90ZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2MC1FbmRub3RlLU1vZC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDYwLUVuZG5vdGUtTW9kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmZmE2YgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA2MC1FbmRub3RlLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2MC1FbmRub3RlLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNjAtRW5kbm90ZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5Mjk0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNjAtRW5kbm90ZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2MS1TdHlsZS1BZGRlZC1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA2MS1TdHlsZS1BZGRlZC1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzM3YWRlCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDYxLVN0eWxlLUFkZGVkLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2MS1TdHlsZS1BZGRlZC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDYxLVN0eWxlLUFkZGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MjM5NQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA2MS1TdHlsZS1BZGRlZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2Mi1OZXctQ2hhci1TdHlsZS1BZGRlZC1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA2Mi1OZXctQ2hhci1TdHlsZS1BZGRlZC1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTU5Yzc4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDYyLU5ldy1DaGFyLVN0eWxlLUFkZGVkLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2Mi1OZXctQ2hhci1TdHlsZS1BZGRlZC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDYyLU5ldy1DaGFyLVN0eWxlLUFkZGVkLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzOGMyYgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA2Mi1OZXctQ2hhci1TdHlsZS1BZGRlZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2My1Gb290bm90ZS1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA2My1Gb290bm90ZS1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDMzYTU1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDYzLUZvb3Rub3RlLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2My1Gb290bm90ZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDYzLUZvb3Rub3RlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjliNzQxNwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA2My1Gb290bm90ZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2NC1Gb290bm90ZS1Nb2QuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA2NC1Gb290bm90ZS1Nb2QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTgyNzM5Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDY0LUZvb3Rub3RlLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2NC1Gb290bm90ZS5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDY0LUZvb3Rub3RlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxMjgzYgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA2NC1Gb290bm90ZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2NS1UZXh0Ym94LURlbGV0ZWQuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA2NS1UZXh0Ym94LURlbGV0ZWQuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmFlMWVkCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDY1LVRleHRib3gtRGVsZXRlZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2NS1UZXh0Ym94LU1vZC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDY1LVRleHRib3gtTW9kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyZjMzMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA2NS1UZXh0Ym94LU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2NS1UZXh0Ym94LmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNjUtVGV4dGJveC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NTIzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNjUtVGV4dGJveC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2Ni1UZXh0Ym94LUJlZm9yZS1JbnMtTW9kLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNjYtVGV4dGJveC1CZWZvcmUtSW5zLU1vZC5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTU3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNjYtVGV4dGJveC1CZWZvcmUtSW5zLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2Ni1UZXh0Ym94LUJlZm9yZS1JbnMuZG9jeCBiL1Rlc3RGaWxlcy9XQy9XQzA2Ni1UZXh0Ym94LUJlZm9yZS1JbnMuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTdjODU4Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL1dDL1dDMDY2LVRleHRib3gtQmVmb3JlLUlucy5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2Ny1UZXh0Ym94LUltYWdlLU1vZC5kb2N4IGIvVGVzdEZpbGVzL1dDL1dDMDY3LVRleHRib3gtSW1hZ2UtTW9kLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5YjBkYwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9XQy9XQzA2Ny1UZXh0Ym94LUltYWdlLU1vZC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9XQy9XQzA2Ny1UZXh0Ym94LUltYWdlLmRvY3ggYi9UZXN0RmlsZXMvV0MvV0MwNjctVGV4dGJveC1JbWFnZS5kb2N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MTQxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0RmlsZXMvV0MvV0MwNjctVGV4dGJveC1JbWFnZS5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9pbWcucG5nIGIvVGVzdEZpbGVzL2ltZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwMTg1MgotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RGaWxlcy9pbWcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Rlc3RGaWxlcy9pbWcyLnBuZyBiL1Rlc3RGaWxlcy9pbWcyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGFlZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvVGVzdEZpbGVzL2ltZzIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwcHZleW9yLnltbCBiL2FwcHZleW9yLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzY0NWYwCi0tLSAvZGV2L251bGwKKysrIGIvYXBwdmV5b3IueW1sCkBAIC0wLDAgKzEsMTIgQEAKK29zOiBWaXN1YWwgU3R1ZGlvIDIwMTcKKworZW52aXJvbm1lbnQ6CisgIGltYWdlOiBWaXN1YWwgU3R1ZGlvIDIwMTcKKyAgQ29uZmlndXJhdGlvbjogUmVsZWFzZQorCitidWlsZF9zY3JpcHQ6CisgIC0gY21kOiBkb3RuZXQgcmVzdG9yZQorICAtIGNtZDogZG90bmV0IGJ1aWxkCisKK3Rlc3Rfc2NyaXB0OgorICAtIGNtZDogZG90bmV0IHRlc3QgLlxPcGVuWG1sUG93ZXJUb29scy5UZXN0cwo=